Kernel 0.9.1 : STDLIB : AToF, StrToF (wip), MACROS CLeanup, code Reorg STDIO/STDLIB

This commit is contained in:
Rémy GIBERT 2017-10-12 17:28:59 +02:00
parent 3022b08c89
commit e2f8f7cb0e
15 changed files with 353 additions and 277 deletions

View File

@ -568,12 +568,53 @@ FPrintF.YA :
+ %011s : 'ABCDEFGH000'
+ %2f : '3.14'
# StrToF
Convert String to 40 bits Float
## In:
+ PUSHW PTR to EndPtr
+ PUSHW Source String (C-Sring)
+ PUSHW PTR to target buffer (5 bytes)
## Out:
# AToF
Convert String to 40 bits Float
## In:
+ PUSHW PTR to target buffer (5 Bytes)
+ PUSHW Source String (C-Sring)
+ PUSHW PTR to target buffer (5 Bytes)
## Out:
# StrToL
Convert String to 32 bits int
## In:
+ PUSHB Base
+ PUSHW PTR to EndPtr
+ PUSHW Source String (C-Sring)
+ PUSHW PTR to target buffer DWORD
## Out:
# StrToUL
Convert String to 32 bits unsigned int
## In:
+ PUSHB Base
+ PUSHW PTR to EndPtr
+ PUSHW Source String (C-Sring)
+ PUSHW PTR to target buffer DWORD
## Out:
# AToL
Convert String to 32 bits int
## In:
+ PUSHW Source String (C-Sring)
+ PUSHW PTR to target buffer DWORD
## Out:
@ -586,47 +627,6 @@ Convert String to 16 bits int
## Out:
+ Y,A = Int
# AToL
Convert String to 32 bits int
## In:
+ PUSHW PTR to target buffer DWORD
+ PUSHW Source String (C-Sring)
## Out:
# StrToF
Convert String to 40 bits Float
## In:
+ PUSHW PTR to target buffer FLOAT (5 bytes)
+ PUSHW PTR to EndPtr
+ PUSHW Source String (C-Sring)
## Out:
# StrToL
Convert String to 32 bits int
## In:
+ PUSHB Base
+ PUSHW PTR to target buffer DWORD
+ PUSHW PTR to EndPtr
+ PUSHW Source String (C-Sring)
## Out:
# StrToUL
Convert String to 32 bits unsigned int
## In:
+ PUSHB Base
+ PUSHW PTR to target buffer DWORD
+ PUSHW PTR to EndPtr
+ PUSHW Source String (C-Sring)
## Out:
# RealPath.YA
Return the canonicalized absolute pathname

Binary file not shown.

Binary file not shown.

View File

@ -127,7 +127,8 @@ A2osX.QC.KLoad >LDAXI MSG.KLOAD
.9 rts
*--------------------------------------
A2osX.QC.PrintAX
>STAX TmpPtr1
sta TmpPtr1
stx TmpPtr1+1
lda (TmpPtr1)
tax
beq .9

View File

@ -366,7 +366,8 @@ BUF.GetLine ldy #FileY+1
dey
lda (pData),y
BUF.GetLineAX >STAX BUF.TmpLine1
BUF.GetLineAX sta BUF.TmpLine1
stx BUF.TmpLine1+1
stz BUF.LOffset
stz BUF.LOffset+1

View File

@ -76,7 +76,8 @@ SCRN.UpdateMain ldy #ScreenY
lda (pData),y
sta TmpCount
.1 >LDAX TmpIndex
.1 lda TmpIndex
ldx TmpIndex+1
jsr BUF.GetLineAX Y = line length
bcs .5

View File

@ -219,83 +219,61 @@ AUTO 6
.EM
*--------------------------------------
.MA PUSHYA
dec pStack
sta (pStack)
>PUSHA
tya
dec pStack
sta (pStack)
>PUSHA
.EM
*--------------------------------------
.MA PULLYA
lda (pStack)
inc pStack
>PULLA
tay
lda (pStack)
inc pStack
>PULLA
.EM
*--------------------------------------
.MA PUSHBI
dec pStack
lda #]1
sta (pStack)
>PUSHA
.EM
*--------------------------------------
.MA PUSHB
.DO ]#=2
dec pStack
lda ]1,]2
sta (pStack)
>PUSHA
.ELSE
dec pStack
lda ]1
sta (pStack)
>PUSHA
.FIN
.EM
*--------------------------------------
.MA PULLB
.DO ]#=2
lda (pStack)
>PULLA
sta ]1,]2
inc pStack
.ELSE
lda (pStack)
>PULLA
sta ]1
inc pStack
.FIN
.EM
*--------------------------------------
.MA PUSHWI
dec pStack
lda /]1
sta (pStack)
dec pStack
>PUSHA
lda #]1
sta (pStack)
>PUSHA
.EM
*--------------------------------------
.MA PUSHW
dec pStack
lda ]1+1
sta (pStack)
dec pStack
>PUSHA
lda ]1
sta (pStack)
>PUSHA
.EM
*--------------------------------------
.MA PULLW
lda (pStack)
>PULLA
sta ]1
inc pStack
lda (pStack)
>PULLA
sta ]1+1
inc pStack
.EM
*--------------------------------------
.MA POP
lda pStack
clc
adc ]1
sta pStack
.EM
*--------------------------------------
* General WORD Manipulation Macros
@ -319,16 +297,6 @@ AUTO 6
ldy ]1
.FIN
.EM
*--------------------------------------
.MA LDAX
.DO ]#=2
ldx ]1+1,]2
lda ]1,]2
.ELSE
ldx ]1+1
lda ]1
.FIN
.EM
*--------------------------------------
.MA STYA
.DO ]#=2
@ -340,17 +308,6 @@ AUTO 6
sty ]1
.FIN
.EM
*--------------------------------------
.MA STAX
.DO ]#=2
sta ]1+1,]2
txa
sta ]1,]2
.ELSE
stx ]1+1
sta ]1
.FIN
.EM
*--------------------------------------
* General Strings Macros
*--------------------------------------

View File

@ -214,7 +214,8 @@ BuildProDOSCat >PULLW ZPPtr1 DstBuf
* BitMap Blocks : 0=Used 1=free
>LDAX VolDirHdr.TB
lda VolDirHdr.TB
ldx VolDirHdr.TB+1
jsr GetProDOSCatSizeAX X=blk used for boot/dir/bitmap
lda VolDirHdr.TB

View File

@ -196,10 +196,12 @@ GetDynPort inc DYNPORT.LAST
bcs .1
>LDAXI K.DYNPORT.START
>STAX DYNPORT.LAST
sta DYNPORT.LAST
stx DYNPORT.LAST+1
rts CC
.1 >LDAX DYNPORT.LAST
.1 lda DYNPORT.LAST
ldx DYNPORT.LAST+1
clc
rts
*--------------------------------------

View File

@ -567,8 +567,8 @@ Cmd.Exec.READ lda (ZPPtr2)
Cmd.Exec.SLEEP lda (ZPPtr2)
beq .9
>PUSHEA.G Sleep
>PUSHW ZPPtr2
>PUSHEA.G Sleep
>SYSCALL AToL
bcs .9

View File

@ -126,7 +126,10 @@ K.SaveFile jsr K.FOpen
rts
.9 pha
>POP 4 Discard SrcPtr & SrcLen
lda pStack Discard SrcPtr & SrcLen
clc
adc #4
sta pStack
pla
sec
rts

View File

@ -722,7 +722,7 @@ K.SScanF.IncPtr1
* ## Out:
* CC : success
* CS : error code from Output
* Specifiers :
* Specifiers :
* %b : pull 1 byte to Print BIN
* %B : pull 2 bytes to Print BIN
* %d : pull 1 byte unsigned DEC 0..255
@ -746,7 +746,7 @@ K.SScanF.IncPtr1
* \r : Print 'CR' ($0D,13)
* \\\\ : Print \
* \% : Print %
* Modifiers for len and padding :
* Modifiers for len and padding :
* %d : '9' '12'
* %2d : ' 9' '12'
* %02d : '09' '12'
@ -754,10 +754,12 @@ K.SScanF.IncPtr1
* %011s : 'ABCDEFGH000'
* %2f : '3.14'
*\--------------------------------------
K.SPrintF.YA >STYA ZPPtr1
K.SPrintF.YA
* >STYA ZPPtr1
* >PULLW Printf.Cout.Ptr+1
K.FPrintF.YA >STYA ZPPtr1
K.FPrintF.YA
* >STYA ZPPtr1
K.PrintF.YA >STYA ZPPtr1
@ -897,8 +899,9 @@ PrintF.U.1 stz SIGN
jsr HEX2DEC
jmp PrintDEC
*--------------------------------------
PrintF.E >PULLW ZPPtr2
rts
PrintF.E
* >PULLW ZPPtr2
* rts
*--------------------------------------
PrintF.F >PULLW ZPPtr2
rts
@ -1123,6 +1126,62 @@ 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 asl HEXBUF
rol HEXBUF+1
rol HEXBUF+2
rol HEXBUF+3
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
*--------------------------------------
HEXBUF .BS 4
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.STDIO
LOAD /A2OSX.SRC/SYS/KERNEL.S

View File

@ -4,14 +4,158 @@ LOMEM $A00
INC 1
AUTO 6
*/--------------------------------------
* # StrToF
* Convert String to 40 bits Float
* ## In:
* PUSHW PTR to EndPtr
* PUSHW Source String (C-Sring)
* PUSHW PTR to target buffer (5 bytes)
* ## Out:
*\--------------------------------------
K.StrToF jsr PullPtr1Ptr2Ptr3
jsr K.AToF.I
bcc K.StrToUL.Exit
.9 rts
*/--------------------------------------
* # AToF
* Convert String to 40 bits Float
* ## In:
* PUSHW PTR to target buffer (5 Bytes)
* PUSHW Source String (C-Sring)
* PUSHW PTR to target buffer (5 Bytes)
* ## Out:
*\--------------------------------------
K.AToF
K.AToF jsr PullPtr1Ptr2 C-String in Ptr2, Dst buffer in Ptr1
K.AToF.I jsr MANTISSA.Clear
ldy #$ff
.1 iny
lda (ZPPtr2),y
beq .8
cmp #' '
beq .1
.2 iny
lda (ZPPtr2),y
beq .8
jsr STDIO.IsDigit
bcc .7
cmp #'+'
beq .3
cmp #'-'
bne .4
.3 jsr K.AToF.CheckSign
bcs .9
bra .1
.4 cmp #'.'
bne .5
ldx INEXP Decimal point not allowed in EXP
bne .9
ldx bDECPOINT ....and only one!
bne .9
inc bDECPOINT
bra .1
.5 cmp #'E'
beq .6
cmp #'e'
bne .8
.6
.7
.8 clc
.9 lda #SYSMGR.ERRSYN
sec
rts
*--------------------------------------
K.AToF.CheckSign
ldy INEXP Get MANTSIGN or EXPSIGN
ldx MANTSIGN,y
bne .9 Already set, error
cmp #'-'
bne .1
lda #$ff
.1 sta MANTSIGN,y set '+' of $ff to test with BIT
clc
rts
.9 sec
rts
*/--------------------------------------
* # StrToL
* Convert String to 32 bits int
* ## In:
* PUSHB Base
* PUSHW PTR to EndPtr
* PUSHW Source String (C-Sring)
* PUSHW PTR to target buffer DWORD
* ## Out:
*\--------------------------------------
K.StrToL sec Signed
.HS 90 BCC
*/--------------------------------------
* # StrToUL
* Convert String to 32 bits unsigned int
* ## In:
* PUSHB Base
* PUSHW PTR to EndPtr
* PUSHW Source String (C-Sring)
* PUSHW PTR to target buffer DWORD
* ## Out:
*\--------------------------------------
K.StrToUL clc Unsigned
jsr PullPtr1Ptr2Ptr3
>PULLA Base
jsr K.AToL.I
bcs K.StrToUL.rts
* clc
K.StrToUL.Exit adc ZPPtr2
sta ZPPtr3
lda #0
adc ZPPtr2+1
sta ZPPtr3+1
K.StrToUL.rts rts
*/--------------------------------------
* # AToL
* Convert String to 32 bits int
* ## In:
* PUSHW Source String (C-Sring)
* PUSHW PTR to target buffer DWORD
* ## Out:
*\--------------------------------------
K.AToL jsr PullPtr1Ptr2 C-String in Ptr2, Dst buffer in Ptr1
lda #10 base 10
sec signed
K.AToL.I jsr STDLIB.Dec2Hex
bcs .9
phy Save Count processed
ldy #3
.3 lda MANTISSA,y
sta (ZPPtr1),y
dey
bpl .3
pla
* clc
.9 rts
*/--------------------------------------
* # AToI.YA
* Convert String to 16 bits int
@ -20,201 +164,104 @@ K.AToF
* ## Out:
* Y,A = Int
*\--------------------------------------
K.AToI.YA >STYA ZPPtr1
K.AToI.YA >STYA ZPPtr2
lda #10 base 10
sec signed
jsr STDLIB.Dec2Hex
bcs .9
>LDYA HEXBUF
>LDYA MANTISSA
.9 rts
*/--------------------------------------
* # AToL
* Convert String to 32 bits int
* ## In:
* PUSHW PTR to target buffer DWORD
* PUSHW Source String (C-Sring)
* ## Out:
*\--------------------------------------
K.AToL jsr PullPtr1Ptr2 C-String in Ptr1, Dst buffer in Ptr2
lda #10 base 10
sec signed
jsr STDLIB.Dec2Hex
bcs .9
ldy #3
.3 lda HEXBUF,y
sta (ZPPtr2),y
dey
bpl .3
.9 rts
*/--------------------------------------
* # StrToF
* Convert String to 40 bits Float
* ## In:
* PUSHW PTR to target buffer FLOAT (5 bytes)
* PUSHW PTR to EndPtr
* PUSHW Source String (C-Sring)
* ## Out:
*\--------------------------------------
K.StrToF
*/--------------------------------------
* # StrToL
* Convert String to 32 bits int
* ## In:
* PUSHB Base
* PUSHW PTR to target buffer DWORD
* PUSHW PTR to EndPtr
* PUSHW Source String (C-Sring)
* ## Out:
*\--------------------------------------
K.StrToL
*/--------------------------------------
* # StrToUL
* Convert String to 32 bits unsigned int
* ## In:
* PUSHB Base
* PUSHW PTR to target buffer DWORD
* PUSHW PTR to EndPtr
* PUSHW Source String (C-Sring)
* ## Out:
*\--------------------------------------
K.StrToUL
*--------------------------------------
* Convert ZPPtr1 to HEXBUF
* Convert ZPPtr1 to MANTISSA
*--------------------------------------
STDLIB.Dec2Hex stz HEXBUF
stz HEXBUF+1
stz HEXBUF+2
stz HEXBUF+3
STDLIB.Dec2Hex jsr MANTISSA.Clear
ldy #$ff
.1 iny
lda (ZPPtr1),y
lda (ZPPtr2),y
beq .8
jsr STDIO.IsDigit
bcs .8
lda HEXBUF+3 save HEXBUF for 4+1
pha
lda HEXBUF+2
pha
lda HEXBUF+1
pha
lda HEXBUF
pha
jsr MANTISSA.T10
bcs .9
jsr HEXBUF.ROL HEXBUF * 2 -> HEXBUF
bcs .9 overflow!!!
jsr HEXBUF.ROL HEXBUF * 4 -> HEXBUF
bcs .9 overflow!!!
* clc
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!!!
lda (ZPPtr1),y
lda (ZPPtr2),y
and #$0F
adc HEXBUF
sta HEXBUF
adc MANTISSA
sta MANTISSA
bcc .1
inc HEXBUF+1
inc MANTISSA+1
bne .1
inc HEXBUF+2
inc MANTISSA+2
bne .1
inc HEXBUF+3
inc MANTISSA+3
bne .1 overflow!!!
* sec
rts
.9 pla discard saved HEXBUF
.8 clc
.9 rts
*--------------------------------------
MANTISSA.T10 ldx #3
.1 lda MANTISSA,x save MANTISSA for 4+1
pha
dex
bpl .1
jsr MANTISSA.ROL MANTISSA * 2 -> MANTISSA
bcs .9 overflow!!!
jsr MANTISSA.ROL MANTISSA * 4 -> MANTISSA
bcs .9 overflow!!!
ldx #0
ldy #4
* clc
.2 pla MANTISSA * 4 + MANTISSA -> MANTISSA
adc MANTISSA,x
sta MANTISSA,x
inx
dey
bne .2
bcs .99 overflow!!!
jsr MANTISSA.ROL MANTISSA * 10 -> MANTISSA
bcs .99 overflow!!!
.9 pla discard saved MANTISSA
pla
pla
pla
.99 rts
.8 clc
rts
*--------------------------------------
HEXBUF.ROL asl HEXBUF
rol HEXBUF+1
rol HEXBUF+2
rol HEXBUF+3
MANTISSA.ROL asl MANTISSA
rol MANTISSA+1
rol MANTISSA+2
rol MANTISSA+3
rts
*--------------------------------------
* Convert HEXBUF to ASCBUF decimal padded with 0
*--------------------------------------
HEX2DEC ldx #4
.1 stz BCDBUF,x Clear all 5 bytes
MANTISSA.Clear ldx #8
.1 stz EXPSIGN,x
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
*--------------------------------------
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)
bDECPOINT .BS 1
INEXP .BS 1
MANTSIGN .BS 1
EXPSIGN .BS 1
EXP .BS 1
MANTISSA .BS 4 32 bits max
*/--------------------------------------
* # RealPath.YA
* Return the canonicalized absolute pathname

View File

@ -183,7 +183,8 @@ NSCDRV.RELOC .DA NSCDRV.R1+1
.DA NSCDRV.R9+1
.DA 0
*--------------------------------------
NSC.Print >STAX TmpPtr1
NSC.Print sta TmpPtr1
stx TmpPtr1+1
ldy #0
.1 lda (TmpPtr1),y

View File

@ -5,7 +5,8 @@ INC 1
AUTO 6
.LIST OFF
*--------------------------------------
PrintFAX >STAX PrintFAX.Next+1
PrintFAX sta PrintFAX.Next+1
stx PrintFAX.Next+2
pla
sta PrintFAX.99+1
pla
@ -109,7 +110,9 @@ PrintFAX.D ldx #0
.HS D0 bne
PrintFAX.DD plx
pla
>STAX X.HexBuffer
sta X.HexBuffer
stx X.HexBuffer+1
stz X.BCDBuffer
stz X.BCDBuffer+1
stz X.BCDBuffer+2