1 2SECTION code_clib 3SECTION code_l 4 5PUBLIC l_fast_utoa 6PUBLIC l0_fast_utoa, l_utoa_lib 7 8l_fast_utoa: 9 10 ; write unsigned decimal integer to ascii buffer 11 ; 12 ; enter : hl = unsigned integer 13 ; de = char *buffer 14 ; carry set to write leading zeroes 15 ; 16 ; exit : de = char *buffer (one byte past last char written) 17 ; carry reset 18 ; 19 ; uses : af, bc, de, hl 20 21 ld bc,0+256 22 push bc 23 24 ld bc,-10+256 25 push bc 26 27 inc h 28 dec h 29 jr z, eight_bit 30 31; ld bc,-100+256 32 ld c,0xff & (-100+256) 33 push bc 34 35 ld bc,-1000+256 36 push bc 37 38 ld bc,-10000 39 40l_utoa_lib: 41l0_fast_utoa: 42 43 ; hl = unsigned int 44 ; de = char *buffer 45 ; bc = first divisor 46 ; carry set for leading zeroes 47 ; stack = remaining divisors 48 49 jr c, leading_zeroes 50 51 52no_leading_zeroes: 53 54 call divide 55 cp '0' 56 jr nz, write 57 58 pop bc 59 djnz no_leading_zeroes 60 61 jr write1s 62 63 64leading_zeroes: 65 66 call divide 67 68write: 69 70 ld (de),a 71 inc de 72 73 pop bc 74 djnz leading_zeroes 75 76 77write1s: 78 79 ld a,l 80 add a,'0' 81 82 ld (de),a 83 inc de 84 ret 85 86 87divide: 88 89 ld a,'0'-1 90 91divloop: 92 93 inc a 94 add hl,bc 95 jr c, divloop 96 97 sbc hl,bc 98 ret 99 100eight_bit: 101 102 ld bc,-100 103 jr nc, no_leading_zeroes 104 105 ; write two leading zeroes to output string 106 107 ld a,'0' 108 ld (de),a 109 inc de 110 ld (de),a 111 inc de 112 113 jr leading_zeroes 114