X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libsrc%2Fcommon%2Fltoa.s;h=5dc215bd181fee3455e89e120f59d875a9e3d820;hb=934a78731fe1b7fc8d08814fa2321534c20fbc62;hp=c0a342056b6542fbbb3e613253f3a08edae63d5f;hpb=53dd513176425872128ef26031d00952ef7a0628;p=cc65 diff --git a/libsrc/common/ltoa.s b/libsrc/common/ltoa.s index c0a342056..5dc215bd1 100644 --- a/libsrc/common/ltoa.s +++ b/libsrc/common/ltoa.s @@ -5,145 +5,142 @@ ; char* ultoa (unsigned long value, char* s, int radix); ; - .export _ltoa, _ultoa - .import popax - .import __hextab - .importzp sreg, ptr1, ptr2, ptr3, tmp1 + .export _ltoa, _ultoa + .import popax + .import __hextab, __longminstr + .importzp sreg, ptr1, ptr2, ptr3, tmp1 -.rodata -specval: - .byte '-', '2', '1', '4', '7', '4', '8', '3', '6', '4', '8', 0 .code ; ; Common subroutine to pop the parameters and put them into core ; - -dopop: sta tmp1 ; will loose high byte - jsr popax ; get s - sta ptr1 - stx ptr1+1 - sta sreg ; save for return - stx sreg+1 - jsr popax ; get low word of value - sta ptr2 - stx ptr2+1 - jsr popax ; get high word of value - sta ptr3 - stx ptr3+1 - rts + +dopop: sta tmp1 ; will loose high byte + jsr popax ; get s + sta ptr1 + stx ptr1+1 + sta sreg ; save for return + stx sreg+1 + jsr popax ; get low word of value + sta ptr2 + stx ptr2+1 + jsr popax ; get high word of value + sta ptr3 + stx ptr3+1 + rts ; ; ltoa ; -_ltoa: jsr dopop ; pop the arguments +_ltoa: jsr dopop ; pop the arguments ; We must handle $80000000 in a special way, since it is the only negative ; number that has no positive 32-bit counterpart - ldx ptr3+1 ; get high byte - ldy tmp1 ; get radix - cpy #10 - bne ultoa - lda ptr3 - ora ptr2+1 - ora ptr2 - bne L2 - cpx #$80 - bne L2 - - ldy #11 -L1: lda specval,y ; copy -2147483648 - sta (ptr1),y - dey - bpl L1 - jmp L10 - + ldx ptr3+1 ; get high byte + ldy tmp1 ; get radix + cpy #10 + bne ultoa + lda ptr3 + ora ptr2+1 + ora ptr2 + bne L2 + cpx #$80 + bne L2 + + ldy #11 +L1: lda __longminstr,y ; copy -2147483648 + sta (ptr1),y + dey + bpl L1 + jmp L10 + ; Check if the value is negative. If so, write a - sign and negate the ; number. -L2: txa ; get high byte - bpl ultoa - lda #'-' - ldy #0 - sta (ptr1),y ; store sign - inc ptr1 - bne L3 - inc ptr1+1 - -L3: lda ptr2 ; negate val - eor #$FF - clc - adc #$01 - sta ptr2 - lda ptr2+1 - eor #$FF - adc #$00 - sta ptr2+1 - lda ptr3 - eor #$FF - adc #$00 - sta ptr3 - lda ptr3+1 - eor #$FF - adc #$00 - sta ptr3+1 - jmp ultoa +L2: txa ; get high byte + bpl ultoa + lda #'-' + ldy #0 + sta (ptr1),y ; store sign + inc ptr1 + bne L3 + inc ptr1+1 + +L3: lda ptr2 ; negate val + eor #$FF + clc + adc #$01 + sta ptr2 + lda ptr2+1 + eor #$FF + adc #$00 + sta ptr2+1 + lda ptr3 + eor #$FF + adc #$00 + sta ptr3 + lda ptr3+1 + eor #$FF + adc #$00 + sta ptr3+1 + jmp ultoa ; ; utoa ; -_ultoa: jsr dopop ; pop the arguments +_ultoa: jsr dopop ; pop the arguments ; Convert to string by dividing and push the result onto the stack -ultoa: lda #$00 - pha ; sentinel +ultoa: lda #$00 + pha ; sentinel ; Divide val/tmp1 -> val, remainder in a -L5: ldy #32 ; 32 bit - lda #0 ; remainder -L6: asl ptr2 - rol ptr2+1 - rol ptr3 - rol ptr3+1 - rol a - cmp tmp1 - bcc L7 - sbc tmp1 - inc ptr2 -L7: dey - bne L6 - - tay ; get remainder into y - lda __hextab,y ; get hex character - pha ; save char value on stack - - lda ptr2 - ora ptr2+1 - ora ptr3 - ora ptr3+1 - bne L5 +L5: ldy #32 ; 32 bit + lda #0 ; remainder +L6: asl ptr2 + rol ptr2+1 + rol ptr3 + rol ptr3+1 + rol a + cmp tmp1 + bcc L7 + sbc tmp1 + inc ptr2 +L7: dey + bne L6 + + tay ; get remainder into y + lda __hextab,y ; get hex character + pha ; save char value on stack + + lda ptr2 + ora ptr2+1 + ora ptr3 + ora ptr3+1 + bne L5 ; Get the characters from the stack into the string - ldy #0 -L9: pla - sta (ptr1),y - beq L10 ; jump if sentinel - iny - bne L9 ; jump always + ldy #0 +L9: pla + sta (ptr1),y + beq L10 ; jump if sentinel + iny + bne L9 ; jump always ; Done! Return the target string -L10: lda sreg - ldx sreg+1 - rts +L10: lda sreg + ldx sreg+1 + rts