base:32_bit_hexadecimal_to_decimal_conversion
no way to compare when less than two revisions
Differences
This shows you the differences between two versions of the page.
Previous revisionLast revision | |||
— | base:32_bit_hexadecimal_to_decimal_conversion [2023-04-20 08:54] – tww | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== 32 bit hexadecimal to decimal conversion ====== | ||
+ | By Graham. | ||
+ | |||
+ | In cases you need to print decimal values, you can use this routine to convert any unsigned 32 bit value to decimal. It doesn' | ||
+ | |||
+ | < | ||
+ | printdec | ||
+ | jsr hex2dec | ||
+ | |||
+ | ldx #9 | ||
+ | l1 lda result,x | ||
+ | bne l2 | ||
+ | dex ; skip leading zeros | ||
+ | bne l1 | ||
+ | |||
+ | l2 lda result,x | ||
+ | ora #$30 | ||
+ | jsr $ffd2 | ||
+ | dex | ||
+ | bpl l2 | ||
+ | rts | ||
+ | |||
+ | ; converts 10 digits (32 bit values have max. 10 decimal digits) | ||
+ | hex2dec | ||
+ | ldx #0 | ||
+ | l3 jsr div10 | ||
+ | sta result,x | ||
+ | inx | ||
+ | cpx #10 | ||
+ | bne l3 | ||
+ | rts | ||
+ | |||
+ | ; divides a 32 bit value by 10 | ||
+ | ; remainder is returned in akku | ||
+ | div10 | ||
+ | ldy #32 ; 32 bits | ||
+ | lda #0 | ||
+ | clc | ||
+ | l4 rol | ||
+ | cmp #10 | ||
+ | bcc skip | ||
+ | sbc #10 | ||
+ | skip rol value | ||
+ | rol value+1 | ||
+ | rol value+2 | ||
+ | rol value+3 | ||
+ | dey | ||
+ | bpl l4 | ||
+ | rts | ||
+ | |||
+ | value .byte $ff, | ||
+ | |||
+ | result | ||
+ | </ | ||
+ | |||
+ | |||
+ | 16-bit version with tightened up loops and routine structure: | ||
+ | < | ||
+ | // Converts 16 bit values to 5 decimal digits. | ||
+ | ldx #-5 | ||
+ | !Loop: | ||
+ | ldy #16 // Divides a 16 bit value by 10 (Remainder in A) | ||
+ | lda #0 | ||
+ | clc | ||
+ | !: rol | ||
+ | cmp #10 | ||
+ | bcc !+ | ||
+ | sbc #10 | ||
+ | !: rol value | ||
+ | rol value+1 | ||
+ | dey | ||
+ | bpl !-- | ||
+ | sta result-[255-4], | ||
+ | inx | ||
+ | bne !Loop- | ||
+ | // Print result, skip leading zeros | ||
+ | ldx #4 | ||
+ | !: lda result,x | ||
+ | beq !Skip+ | ||
+ | ora #$30 | ||
+ | jsr $ffd2 | ||
+ | !Skip: | ||
+ | dex | ||
+ | bpl !- | ||
+ | rts | ||
+ | |||
+ | value: | ||
+ | result: .byte 0,0,0,0,0 | ||
+ | </ | ||
+ | NB! If you're only looking to convert, not print; Replace jsr $ffd2 with sta result,x. | ||
+ | |||
+ | NB!! If you want to maintain digit positioning, | ||
+ | |||
+ | NB!!! If you wish to extend to 24, 32 or whatever size, adjust the following values: | ||
+ | < | ||
+ | ldx #-5 // How many digits as a negative number | ||
+ | ldy #16 // How many bits as a positive number | ||
+ | sta result-[255-4], | ||
+ | ldx #4 // How many digits-1 as a positive number | ||
+ | value: | ||
+ | result: .byte 0, | ||
+ | </ |
base/32_bit_hexadecimal_to_decimal_conversion.txt · Last modified: 2023-04-20 09:02 by tww