diff options
author | B. Watson <yalhcru@gmail.com> | 2016-01-08 06:47:29 -0500 |
---|---|---|
committer | B. Watson <yalhcru@gmail.com> | 2016-01-08 06:47:29 -0500 |
commit | 63dc8498642b9bd088910a923ed953108f98d207 (patch) | |
tree | f50efa4b8bc90fe04924555e58e377d8b0e49487 | |
parent | 7012ad570a2739a51f9f1f5605a9efa44416869c (diff) | |
download | taipan-63dc8498642b9bd088910a923ed953108f98d207.tar.gz |
use custom long-to-ascii routine
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | taipan.c | 4 | ||||
-rw-r--r-- | ultostr.s | 79 |
3 files changed, 84 insertions, 1 deletions
@@ -63,7 +63,7 @@ XEX=taipan.xex # All the C and asm sources for taimain.xex: TAIMAIN_HDRS=sounds.h TAIMAIN_C_SRC=taipan.c sounds.c -TAIMAIN_ASM_SRC=rand.s draw_lorcha.s timed_getch.s jsleep.s portstat.s clrtobot.s +TAIMAIN_ASM_SRC=rand.s draw_lorcha.s timed_getch.s jsleep.s portstat.s clrtobot.s ultostr.s # Default rule for plain 'make' command is to build the binary. all: $(XEX) @@ -177,6 +177,10 @@ unsigned char get_item(unsigned char allow_all) { } } +/* modified ultoa() with hardcoded radix */ +extern char *ultostr(unsigned long value, char* s); +#define ultoa(x, y, z) ultostr(x, y) + /* taipan functions (modified as little as possible) */ #define GENERIC 1 #define LI_YUEN 2 diff --git a/ultostr.s b/ultostr.s new file mode 100644 index 0000000..29420e4 --- /dev/null +++ b/ultostr.s @@ -0,0 +1,79 @@ +; +; Modified from cc65's libsrc/common/ltoa.s +; Originally by Ullrich von Bassewitz, 11.06.1998 + +; modified version by B. Watson + +; - rename ultoa => ultostr +; - got rid of ltoa (don't need it) +; - hardcode radix to 10 +; - don't need __hextab since we don't do hex (saves 16 bytes) +; - inline dopop subroutine + +; char* ultostr (unsigned long value, char* s); + + .export _ultostr + .import popax + .importzp sreg, ptr1, ptr2, ptr3 + +radix = 10 + +.code + +_ultostr: + ; pop the arguments + 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 + +; Convert to string by dividing and push the result onto the stack + +ultostr: lda #$00 + pha ; sentinel + +; Divide val/radix -> 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 #radix + bcc L7 + sbc #radix + inc ptr2 +L7: dey + bne L6 + + ora #'0' ; get ascii 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 + +; Done! Return the target string + +L10: lda sreg + ldx sreg+1 + rts |