Number Conversions Lecture L 3 4 Number Conversions
Number Conversions Lecture L 3. 4
Number Conversions • ASCII Number String to Binary Conversion • Binary Number to ASCII String Conversion
Number: Clear binary number buffer (dnum) Loop: get next digit While: digit is valid multiply dnum by base and add digit value store result in dnum Repeat: base dnum
; ; ; digit dgt 1 fail input: A = ascii code of char output: if carry=0 A=valid hex value of char if carry=1 A=invalid char in current base pshb psha suba blo cmpa bls cmpa blo suba cmpa bhs andcc pulb rts pula pulb orcc rts #$30 fail #9 dgt 1 #17 fail #7 base+1 fail #$FE #$01 ; ascii codes < 30 ; are invalid ; char between ; 9 and A ; are invalid ; fill gap ; between 9&A ; digit must be ; < base ; clear carry (valid) ; pop old A ; restore B ; restore A ; restore B ; set carry (invalid)
; Y -> ascii number string (kbuf) number pshx base pshy ldx #base ; x -> base dnum ldd #0 std 2, x ; clear dnum std 4, x ldy #kbuf ; y -> kbuf num 1 ldaa 1, y+ ; get next digit Number: jsr digit ; conv to value Clear binary number buffer (dnum) bcs num 2 Loop: get next digit jsr dumul ; mult dnum by base While: digit is valid adda 5, x ; add digit value multiply dnum by base and staa 5, x add digit value ldaa 4, x store result in dnum adca #0 Repeat: staa 4, x ldaa 3, x adca #0 31 kbuf Y staa 3, x 32 ldaa 2, x 33 adca #0 34 staa 2, x 35 bra num 1 ; do until invalid digit 36 num 2 puly pulx rts
Number Conversions • ASCII Number String to Binary Conversion • Binary Number to ASCII String Conversion
ddiv = 32 / 16 = 32 quot, 16 rem num. H: num. L denom 0: num. H denom = quot. H: quot. L = quot. H rem. H: num. L quot. L = denom rem. H rem. L
; ; ddiv dd 1 double division 32 / 16 = 32 16 rem num. H: num. L / denom = quot. H: qout. L rem. L Y: D / X = Y: D rem X use EDIV twice Y: D / X = Y rem D pshd tfr ldy ediv bcc puld ldd tfr rts sty tfr ldd ediv tfr puly leas rts y, d #0 dd 1 ; save num. L ; d = num. H ; 0: num. L / denom ; y = quot. H, d = rem. H ; if div by 0 #$FFFF ; quot = $FFFF d, y d, x ; rem = $FFFF 2, -sp ; save quot. H on stack d, y ; y = rem. H 2, sp ; d = num. L ; rem. H: quot. L/denom Y = quot. L d, x ; x = rem. L y, d ; d = quot. L ; y = quot. H 2, sp ; fix stack D = rem. L
; sharp shp 1 x -> ascii buffer pshd pshy pshx ldy ldd ldx jsr sty std tfr cmpb bls addb pulx stab puly puld rts ; save regs ; save ptr dnum+2 base ddiv dnum+2 x, d #9 shp 1 #7 #$30 1, -x ; dnum/base rem in X ; => dnum ; b = rem ; if rem > 9 ; add 7 ; conv to ascii ; restore ptr ; store digit ; restore regs base dnum
; input: x -> pad (ascii buffer) ; output: x -> first char in ascii string sharps bsr sharp ; do next digit ldd dnum ; repeat until bne sharps ; quot = 0 ldd dnum+2 bne sharps rts base dnum
; ; ; numconv. asm convert ascii string to 32 -bit number at dnum then convert back to ascii string org outa out 1 byt outcrlf inchar equ kbuf rmb bufend db span db base dw dnum rmb buff rmb pad db $800 equ $FF 4 F ; output ascii char in A equ $FF 52 ; display hex value of byte at X equ $FF 5 B ; carriage return, line feed to term $FF 64 ; wait for and input a char from term 16 0 base 0 10 dnum 4 12 0
org $4000 jsr ldx ldab jsr decb bne ldx jsr ldaa jsr cpx blo jsr swi query number #dnum #4 out 1 byt main mn 1 mn 2 mn 1 #pad sharps outcrlf 1, x+ outa #pad mn 2 outcrlf ; enter a number string ; convert it to binary ; display the hex value ; convert back to ascii string ; display the ascii string
- Slides: 16