home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / compiler / nasm20b / nasm_src / lib / src / utoa.s65 < prev    next >
Text File  |  1993-01-19  |  3KB  |  136 lines

  1.    .include #macros
  2.    .include #16bit
  3.  
  4.    .if .not .def TEST
  5.       .zext    _string1
  6.       .zext    _value
  7.       .zext    _tmp1
  8.       .zext    _tmp2
  9.       .zext    _tmp3
  10.    .else
  11.  
  12.       .include #cio
  13.  
  14. _string1 = $F0
  15. _value   = $F2
  16. _tmp1    = $F4
  17. _tmp2    = $F6
  18. _tmp3    = $F8
  19.  
  20.  
  21. main:
  22.       dpoke    _value,2456
  23.       dpoke    _string1,buffer
  24.       jsr      utoa
  25.       poke     buffer+5,155
  26.       print    0,header,255,@p1+@p2+@p3
  27.       dpoke    _value,40001
  28.       dpoke    _string1,buffer
  29.       jsr      utoa
  30.       poke     buffer+5,155
  31.       print    0,header,255,@p1+@p2+@p3
  32.       brk
  33.  
  34.  
  35. header:
  36.       .byte    "Value = "
  37. buffer:
  38.       .ds      6
  39.  
  40.       .endif
  41. ;; -------------------------------------------------------------
  42. ;; utoa:
  43. ;; Convert a unsigned word into ASCII.
  44. ;; Parameters via zeropage STRING1 and VALUE. Needs also
  45. ;; 6 bytes of temporary zeropage storage. String will end
  46. ;; with a (char *) 0. (That's a binary 0 not a '0')
  47. ;; returns:
  48. ;;    _STRING1 contains the converted string (always 5 digits)
  49. ;;    Y        contains last index (usually 6)
  50. ;; -------------------------------------------------------------
  51. :digits.wl
  52.    .byte <10,<100,<1000,<10000
  53. :digits.wm
  54.    .byte >10,>100,>1000,>10000
  55. :table.wl
  56.    .byte <50,<500,<5000,<30000
  57. :table.wm
  58.    .byte >50,>500,>5000,>30000
  59. :table.b
  60.    .byte 5,5,5,3
  61. :table2.b
  62.    .byte 9,9,9,6
  63.  
  64.  
  65. utoa:
  66.    ldy   #0
  67. _utoa:
  68.    sty   _tmp3
  69.    ldy   #3
  70. :loop
  71.    lda   :digits.wl,y         ; fill _tmp2 with 10000 1000 100 or 10
  72.    sta   _tmp2
  73.    lda   :digits.wm,y
  74.    sta   _tmp2+1
  75.  
  76.    lda   :table.wl,y          ; fill _tmp1 with 30000 5000 500 or 50
  77.    sta   _tmp1
  78.    lda   :table.wm,y
  79.    sta   _tmp1+1
  80.  
  81.    lda   :table.b,y
  82.    tax
  83.  
  84. :justadded
  85.    poke  _tmp3+1,0            ; last time we added ...
  86.  
  87. :next
  88.    cmp.w _tmp1,_value,0       ; if the user _value is larger than
  89.    bcs   :more                ; _tmp1 then add 10000 1000 100 or 10 to it
  90.  
  91. :less
  92.    sbc.w _tmp2,_tmp1,0        ; else subtract 10000 1000 100 or 10 from it
  93.    dex                        ; did we add the last time around ??
  94.    stx   _tmp3+1              ; set _tmp3 + 1, to remember we just subbed
  95.    bne   :next                ; if 0 it's much too low apparently
  96.    beq   :xdone
  97.  
  98. :more
  99.    lda   _tmp3+1              ; did we subtract last time ?
  100.    bne   :done                ; Yup! than we found it.
  101.    txa
  102.    cmp   :table2.b,y          ; if we have been @ end
  103.    bcs   :done                ; then leave ->
  104.    inx
  105.    adc.w _tmp2,_tmp1,@special ; else add 10000 1000 100 or 10
  106.    bcc   :justadded           ; can't overflow
  107.  
  108. :done
  109.    sbc.w _tmp1,_value,@special; now strip that off _value
  110.  
  111. :xdone
  112.    tya                        ; save Y register
  113.    pha
  114.    txa                        ; get result in A
  115.    clc
  116.    adc   #'0                  ; add ASCII '0 to it
  117.    ldy   _tmp3
  118.    sta   (_string1),y
  119.    inc   _tmp3
  120.  
  121.    pla
  122.    tay
  123.    dey
  124.    bpl   :loop
  125.  
  126.    lda   _value
  127.    adc   #'0
  128.    ldy   _tmp3
  129.    sta   (_string1),y
  130.    iny
  131.    lda   #0
  132.    sta   (_string1),y
  133.    iny
  134.    rts
  135.  
  136.