A2osX/SYS/KERNEL.S.STDLIB.txt
2017-08-24 08:47:31 +02:00

191 lines
3.1 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PR#3
PREFIX /A2OSX.BUILD
LOMEM $A00
INC 1
AUTO 6
*/--------------------------------------
* # AToI
* Convert String to 32 bit int
* ## In:
* PUSHW PTR to target buffer DWORD
* PUSHW Source String (PSTR)
* ## Out:
*\--------------------------------------
K.AToI jsr PullPtr1Ptr2 PSTR in Ptr1,buffer in Ptr2
stz ASCBUF
ldx #0
lda (ZPPtr1)
beq .2
ldy #0
.1 iny
lda (ZPPtr1),y
cmp #'0'
bcc .2
cmp #'9'+1
bcs .2
inx
sta ASCBUF,x
cpx #10
beq .2
tya
cmp (ZPPtr1)
bne .1
.2 stx ASCBUF
jsr DEC2HEX
ldy #3
.3 lda HEXBUF,y
sta (ZPPtr2),y
dey
bpl .3
clc
rts
*--------------------------------------
TYPES .AS "-dbclssp"
ACCESS .AS "rwxrwxrwx"
SIGN .BS 1
PADLEN .BS 1
PADCHAR .BS 1
*--------------------------------------
* Convert HEXBUF to ASCBUF decimal padded with 0
*--------------------------------------
HEX2DEC ldx #4
.1 stz BCDBUF,x Clear all 5 bytes
dex
bpl .1
sed switch to BCD mode
ldx #32 let's roll 32 bits
.2 jsr HEXBUF.ROL
ldy #4
.3 lda BCDBUF,y
adc BCDBUF,y
sta BCDBUF,y
dey
bpl .3
dex
bne .2
cld
ldy #4
ldx #9
.4 lda BCDBUF,y
pha
and #$0F
ora #$30
sta ASCBUF,x
dex
pla
lsr
lsr
lsr
lsr
ora #$30
sta ASCBUF,x
dey
dex
bpl .4
rts
*--------------------------------------
* Convert ASCBUF decimal to HEXBUF
*--------------------------------------
DEC2HEX stz HEXBUF
stz HEXBUF+1
stz HEXBUF+2
stz HEXBUF+3
lda ASCBUF
beq .8
ldx #0
.1 lda HEXBUF+3 save HEXBUF for 4+1
pha
lda HEXBUF+2
pha
lda HEXBUF+1
pha
lda HEXBUF
pha
jsr HEXBUF.ROL HEXBUF * 2 -> HEXBUF
* bcs .9 overflow!!!
jsr HEXBUF.ROL HEXBUF * 4 -> HEXBUF
* bcs .9 overflow!!!
pla HEXBUF * 4 + HEXBUF -> HEXBUF
adc HEXBUF
sta HEXBUF
pla
adc HEXBUF+1
sta HEXBUF+1
pla
adc HEXBUF+2
sta HEXBUF+2
pla
adc HEXBUF+3
sta HEXBUF+3
* bcs .99 overflow!!!
jsr HEXBUF.ROL HEXBUF * 10 -> HEXBUF
* bcs .99 overflow!!!
inx
lda ASCBUF,x
and #$0F
adc HEXBUF
sta HEXBUF
bcc .2
inc HEXBUF+1
bne .2
inc HEXBUF+2
bne .2
inc HEXBUF+3
.2 cpx ASCBUF
bne .1
.8 rts
*.9 pla discard saved HEXBUF
* pla
* pla
* pla
*.99 rts
*--------------------------------------
HEXBUF.ROL asl HEXBUF
rol HEXBUF+1
rol HEXBUF+2
rol HEXBUF+3
rts
*--------------------------------------
HEXBUF .BS 4 32 bits max
BCDBUF .BS 5 5, enough to handle 10 digits (32bits)
ASCBUF .BS 12 LEN + sign + 10 digits ($FFFFFFFF=4.294.967.295)
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SYS/KERNEL.S.STDLIB
LOAD /A2OSX.SRC/SYS/KERNEL.S
ASM