Log inRegister an accountBrowse CSDbHelp & documentationFacts & StatisticsThe forumsAvailable RSS-feeds on CSDbSupport CSDb Commodore 64 Scene Database
You are not logged in - nap
CSDb User Forums


Forums > C64 Coding > 32bit Decimal convertion
2018-10-05 07:02
JackAsser

Registered: Jun 2002
Posts: 2014
32bit Decimal convertion

Anybody got this shitz for 32-bit numbers? http://codebase64.org/doku.php?id=base:hexadecimal_to_decimal_c..
 
... 17 posts hidden. Click here to view all posts....
 
2018-10-05 10:41
Krill

Registered: Apr 2002
Posts: 2980
You have shitloads of spare memory for lookup tables, right? :) That allows for a very simple and fast approach with 4 8-bit lookups and 3 adds, both times decimal places, or something, i think.
2018-10-05 10:42
JackAsser

Registered: Jun 2002
Posts: 2014
Quote: Quoting JackAsser
nope, same there as on Codebase.
Indeed, Codebase has a straight 1:1 rip of the original 6502.org page, without giving proper credit. Not cool, Codebase, not cool.

Quoting JackAsser
Thinking of some simple shift+add with the 1/10 since that is a very simple bitpattern 110011001100110011...
Please elaborate. :)


Basically you want to do:

int value = 0xdeadbeef;

int digit0 = value%10; value/=10;
int digit1 = value%10; value/=10;
int digit2 = value%10; value/=10;
int digit3 = value%10; value/=10;
int digit4 = value%10; value/=10;
int digit5 = value%10; value/=10;
.
.
.

When rolling your own division the remainder will pop out automatically. Doing a /10 is the same as doing a multiply by 1/10. Multiply by 1/10 is simply a shift+add multiplication with a %110011001100... bitpattern.
2018-10-05 10:43
JackAsser

Registered: Jun 2002
Posts: 2014
Quote: You have shitloads of spare memory for lookup tables, right? :) That allows for a very simple and fast approach with 4 8-bit lookups and 3 adds, both times decimal places, or something, i think.

I actually don't have shitloads of memory left and this code can be dead slow so I'd rather have it tight.
2018-10-05 10:45
Krill

Registered: Apr 2002
Posts: 2980
Then i'd go with the first algorithm, bitwise conversion without any tables or div/mul.
2018-10-05 10:47
JackAsser

Registered: Jun 2002
Posts: 2014
Quote: Then i'd go with the first algorithm, bitwise conversion without any tables or div/mul.

Need to digest it. Don't understand at all how it works atm. :D
2018-10-05 10:52
JackAsser

Registered: Jun 2002
Posts: 2014
Quote: Need to digest it. Don't understand at all how it works atm. :D

Or I just substract billions, and when underflowing, roll back one step and start substracting 100-millions, and then 10-millions etc.. down to ones. Should be resonably fast.

ldx #<-1
:
sec
lda TMP+0
sbc #<(1000000000>>0)
sta TMP+0
lda TMP+1
sbc #<(1000000000>>8)
sta TMP+1
lda TMP+2
sbc #<(1000000000>>16)
sta TMP+2
lda TMP+1
sbc #<(1000000000>>24)
sta TMP+1
inx
bvc :-

etc..
2018-10-05 11:12
JackAsser

Registered: Jun 2002
Posts: 2014
Enjoy:

.export htd32
.proc htd32
		HTD_IN = ARGS+0		; 32-bit input
		HTD_OUT = RESULT	; 10-digit output, one digit per ZP-loc

		ldy #0 ;digit position
		:
			; Count digits on position y
			ldx #<-1 ;digit value
			:
				inx
				sec
				lda HTD_IN+0
				sbc table0,y
				sta HTD_IN+0
				lda HTD_IN+1
				sbc table1,y
				sta HTD_IN+1
				lda HTD_IN+2
				sbc table2,y
				sta HTD_IN+2
				lda HTD_IN+3
				sbc table3,y
				sta HTD_IN+3
			bcs :-

			; Rollback underflowed result
			clc
			lda HTD_IN+0
			adc table0,y
			sta HTD_IN+0
			lda HTD_IN+1
			adc table1,y
			sta HTD_IN+1
			lda HTD_IN+2
			adc table2,y
			sta HTD_IN+2
			lda HTD_IN+3
			adc table3,y
			sta HTD_IN+3

			txa
			sta HTD_OUT,y
			iny
			cpy #10
		bne :--

		rts

table0:	.byte <(1000000000>> 0),<(100000000>> 0),<(10000000>> 0),<(1000000>> 0),<(100000>> 0),<(10000>> 0),<(1000>> 0),<(100>> 0),<(10>> 0),<(1>> 0)
table1:	.byte <(1000000000>> 8),<(100000000>> 8),<(10000000>> 8),<(1000000>> 8),<(100000>> 8),<(10000>> 8),<(1000>> 8),<(100>> 8),<(10>> 8),<(1>> 8)
table2:	.byte <(1000000000>>16),<(100000000>>16),<(10000000>>16),<(1000000>>16),<(100000>>16), <(10000>>16),<(1000>>16),<(100>>16),<(10>>16),<(1>>16)
table3:	.byte <(1000000000>>24),<(100000000>>24),<(10000000>>24),<(1000000>>24),<(100000>>24), <(10000>>24),<(1000>>24),<(100>>24),<(10>>24),<(1>>24)
.endproc
2018-10-05 11:12
Perplex

Registered: Feb 2009
Posts: 255
Storing and adding XP as base-10 strings is not an option?
2018-10-05 11:13
JackAsser

Registered: Jun 2002
Posts: 2014
Quote: Storing and adding XP as base-10 strings is not an option?

Brr no! :D
2018-10-05 12:09
ChristopherJam

Registered: Aug 2004
Posts: 1409
Alternately, here's my double dabble variant. No tables, 37 bytes of code including the RTS, assuming input and output in zero page. Might be able to save bytes by keeping the intermediate results in petscii rather than 0..9, but this is more readable.
.DEFINE blt bcc

scratch=$f0 ; input in scratch+10..scratch+13, output in scratch+0..scratch+9, most significant first


    jmp test


convert:
    lda#0

    ldx#9
initlp:
    sta scratch,x
    dex
    bpl initlp

    ldy#31
bitlp:

    ldx#9
correctionlp:
    lda scratch,x
    cmp#5
    blt noover
    ;carry now set
    adc#128-5-1
    ;carry now clear
    sta scratch,x
noover:
    dex
    bpl correctionlp

    ldx#13
shiftlp:
    rol scratch,x
    dex
    bpl shiftlp

    dey
    bpl bitlp

    rts


test:
    lda#13
    sta $d021
    jsr $e536
    lda#13
    jsr $ffd2
    lda#0
    sta $d021

    ldx#3
cpl:
    lda testv,x
    sta scratch+10,x
    dex 
    bpl cpl
    jsr convert

    ldx#9
codelp:
    lda#48
    ora scratch,x
    sta $040f,x
    dex
    bpl codelp
    rts


testv:
    .byte $49, $96, $02, $d2 ; 1234567890 = 0x499602d2
Previous - 1 | 2 | 3 - Next
RefreshSubscribe to this thread:

You need to be logged in to post in the forum.

Search the forum:
Search   for   in  
All times are CET.
Search CSDb
Advanced
Users Online
E$G/HF ⭐ 7
Mason/Unicess
Smasher/F4CG
algorithm
acrouzet/G★P
Guests online: 105
Top Demos
1 Next Level  (9.7)
2 13:37  (9.7)
3 Mojo  (9.7)
4 Coma Light 13  (9.6)
5 Edge of Disgrace  (9.6)
6 What Is The Matrix 2  (9.6)
7 The Demo Coder  (9.6)
8 Uncensored  (9.6)
9 Comaland 100%  (9.6)
10 Wonderland XIV  (9.6)
Top onefile Demos
1 Layers  (9.6)
2 No Listen  (9.6)
3 Cubic Dream  (9.6)
4 Party Elk 2  (9.6)
5 Copper Booze  (9.6)
6 Dawnfall V1.1  (9.5)
7 Rainbow Connection  (9.5)
8 Onscreen 5k  (9.5)
9 Morph  (9.5)
10 Libertongo  (9.5)
Top Groups
1 Performers  (9.3)
2 Booze Design  (9.3)
3 Oxyron  (9.3)
4 Triad  (9.3)
5 Censor Design  (9.3)
Top Graphicians
1 Mirage  (9.8)
2 Archmage  (9.7)
3 Pal  (9.6)
4 Carrion  (9.6)
5 Sulevi  (9.6)

Home - Disclaimer
Copyright © No Name 2001-2024
Page generated in: 0.138 sec.