base:another_hexadecimal_to_decimal_conversion
Another Hexadecimal to Decimal Conversion
by Mace
Garth Wilson used decimal mode in Hexadecimal to Decimal Conversion and the result was in 3 bytes in decimal mode. I needed plain ASCII, the following routine does just that, using more or less the same method as Garth used:
start: lda #$30 // clear the result buffer ldy #$04 clear: sta result,y dey bcs clear ldx #$4f loop1: clc rol lobyte rol hibyte bcs calculate // when bit drops off, decimal value must be added // if not, go to the next bit txa axs #$05 // ILLEGAL OPCODE, alternatively use lines below // sec // sbc #$05 // tax bpl loop1 END: rts calculate: clc ldy #$04 loop2: lda table,x // get decimal equivalent of bit in ASCII numbers adc #$00 // add carry, is set if the former addition ≥10 beq zero // skip (speed up) when there's nothing to add adc result,y // add to whatever result we already have cmp #$3a // ≥10 with the addition? bcc notten // if not, skip the subtraction sbc #$0a // subtract 10 notten: sta result,y zero: dex dey bpl loop2 // loop until all 5 digits have been jmp loop1 table: // decimal values for every bit in 16-bit figure .byte 0,0,0,0,1 // %0000000000000001 .byte 0,0,0,0,2 // %0000000000000010 .byte 0,0,0,0,4 // %0000000000000100 .byte 0,0,0,0,8 // %0000000000001000 .byte 0,0,0,1,6 // %0000000000010000 .byte 0,0,0,3,2 // %0000000000100000 .byte 0,0,0,6,4 // %0000000001000000 .byte 0,0,1,2,8 // %0000000010000000 .byte 0,0,2,5,6 // %0000000100000000 .byte 0,0,5,1,2 // %0000001000000000 .byte 0,1,0,2,4 // %0000010000000000 .byte 0,2,0,4,8 // %0000100000000000 .byte 0,4,0,9,6 // %0001000000000000 .byte 0,8,1,9,2 // %0010000000000000 .byte 1,6,3,8,4 // %0100000000000000 .byte 3,2,7,6,8 // %1000000000000000 result: .byte 0,0,0,0,0 // this is where the result will be lobyte: .byte $b3 // demonstration value hibyte: .byte $a9 // demonstration value
base/another_hexadecimal_to_decimal_conversion.txt · Last modified: 2020-11-14 23:05 by mace