User Tools

Site Tools


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 revision
Last 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't use the BCD mode. The conversion is done by repeatedly dividing the 32 bit value by 10 and storing the remainder of each division as decimal digits.
 +
 +<code>        ; prints a 32 bit value to the screen
 +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,$ff,$ff,$ff
 +
 +result  .byte 0,0,0,0,0,0,0,0,0,0
 +</code>
 +
 +
 +16-bit version with tightened up loops and routine structure:
 +<code>
 +    // 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],x
 +    inx
 +    bne !Loop-
 +    // Print result, skip leading zeros
 +    ldx #4
 +!:  lda result,x
 +    beq !Skip+
 +    ora #$30
 +    jsr $ffd2
 +!Skip:
 +    dex
 +    bpl !-
 +    rts
 +
 +value:  .word 65535
 +result: .byte 0,0,0,0,0
 +</code>
 +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, replacing proceeding zero's with #$20.
 +
 +NB!!! If you wish to extend to 24, 32 or whatever size, adjust the following values:
 +<code>
 +    ldx #-5               // How many digits as a negative number
 +    ldy #16               // How many bits as a positive number
 +    sta result-[255-4], // Change the "-4" to the negative quantity of digits-1 (i.e. 24 bit => [255-23]
 +    ldx #4                // How many digits-1 as a positive number
 +value:  .word 65535       // Adjust to quantity of bits needed
 +result: .byte 0,0,0,0,  // Adjust to quantity of digits needed
 +</code>
base/32_bit_hexadecimal_to_decimal_conversion.txt · Last modified: 2023-04-20 09:02 by tww