home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
program
/
compiler
/
nasm20b
/
nasm_src
/
lib
/
src
/
utoa.s65
< prev
next >
Wrap
Text File
|
1993-01-19
|
3KB
|
136 lines
.include #macros
.include #16bit
.if .not .def TEST
.zext _string1
.zext _value
.zext _tmp1
.zext _tmp2
.zext _tmp3
.else
.include #cio
_string1 = $F0
_value = $F2
_tmp1 = $F4
_tmp2 = $F6
_tmp3 = $F8
main:
dpoke _value,2456
dpoke _string1,buffer
jsr utoa
poke buffer+5,155
print 0,header,255,@p1+@p2+@p3
dpoke _value,40001
dpoke _string1,buffer
jsr utoa
poke buffer+5,155
print 0,header,255,@p1+@p2+@p3
brk
header:
.byte "Value = "
buffer:
.ds 6
.endif
;; -------------------------------------------------------------
;; utoa:
;; Convert a unsigned word into ASCII.
;; Parameters via zeropage STRING1 and VALUE. Needs also
;; 6 bytes of temporary zeropage storage. String will end
;; with a (char *) 0. (That's a binary 0 not a '0')
;; returns:
;; _STRING1 contains the converted string (always 5 digits)
;; Y contains last index (usually 6)
;; -------------------------------------------------------------
:digits.wl
.byte <10,<100,<1000,<10000
:digits.wm
.byte >10,>100,>1000,>10000
:table.wl
.byte <50,<500,<5000,<30000
:table.wm
.byte >50,>500,>5000,>30000
:table.b
.byte 5,5,5,3
:table2.b
.byte 9,9,9,6
utoa:
ldy #0
_utoa:
sty _tmp3
ldy #3
:loop
lda :digits.wl,y ; fill _tmp2 with 10000 1000 100 or 10
sta _tmp2
lda :digits.wm,y
sta _tmp2+1
lda :table.wl,y ; fill _tmp1 with 30000 5000 500 or 50
sta _tmp1
lda :table.wm,y
sta _tmp1+1
lda :table.b,y
tax
:justadded
poke _tmp3+1,0 ; last time we added ...
:next
cmp.w _tmp1,_value,0 ; if the user _value is larger than
bcs :more ; _tmp1 then add 10000 1000 100 or 10 to it
:less
sbc.w _tmp2,_tmp1,0 ; else subtract 10000 1000 100 or 10 from it
dex ; did we add the last time around ??
stx _tmp3+1 ; set _tmp3 + 1, to remember we just subbed
bne :next ; if 0 it's much too low apparently
beq :xdone
:more
lda _tmp3+1 ; did we subtract last time ?
bne :done ; Yup! than we found it.
txa
cmp :table2.b,y ; if we have been @ end
bcs :done ; then leave ->
inx
adc.w _tmp2,_tmp1,@special ; else add 10000 1000 100 or 10
bcc :justadded ; can't overflow
:done
sbc.w _tmp1,_value,@special; now strip that off _value
:xdone
tya ; save Y register
pha
txa ; get result in A
clc
adc #'0 ; add ASCII '0 to it
ldy _tmp3
sta (_string1),y
inc _tmp3
pla
tay
dey
bpl :loop
lda _value
adc #'0
ldy _tmp3
sta (_string1),y
iny
lda #0
sta (_string1),y
iny
rts