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' + %011s : 'ABCDEFGH000'
+ %2f : '3.14' + %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 # AToF
Convert String to 40 bits Float Convert String to 40 bits Float
## In: ## In:
+ PUSHW PTR to target buffer (5 Bytes)
+ PUSHW Source String (C-Sring) + 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: ## Out:
@ -586,47 +627,6 @@ Convert String to 16 bits int
## Out: ## Out:
+ Y,A = Int + 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 # RealPath.YA
Return the canonicalized absolute pathname 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 .9 rts
*-------------------------------------- *--------------------------------------
A2osX.QC.PrintAX A2osX.QC.PrintAX
>STAX TmpPtr1 sta TmpPtr1
stx TmpPtr1+1
lda (TmpPtr1) lda (TmpPtr1)
tax tax
beq .9 beq .9

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,14 +4,158 @@ LOMEM $A00
INC 1 INC 1
AUTO 6 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 * # AToF
* Convert String to 40 bits Float * Convert String to 40 bits Float
* ## In: * ## In:
* PUSHW PTR to target buffer (5 Bytes)
* PUSHW Source String (C-Sring) * PUSHW Source String (C-Sring)
* PUSHW PTR to target buffer (5 Bytes)
* ## Out: * ## 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 * # AToI.YA
* Convert String to 16 bits int * Convert String to 16 bits int
@ -20,201 +164,104 @@ K.AToF
* ## Out: * ## Out:
* Y,A = Int * Y,A = Int
*\-------------------------------------- *\--------------------------------------
K.AToI.YA >STYA ZPPtr1 K.AToI.YA >STYA ZPPtr2
lda #10 base 10 lda #10 base 10
sec signed sec signed
jsr STDLIB.Dec2Hex jsr STDLIB.Dec2Hex
bcs .9 bcs .9
>LDYA HEXBUF >LDYA MANTISSA
.9 rts .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 STDLIB.Dec2Hex jsr MANTISSA.Clear
stz HEXBUF+1
stz HEXBUF+2
stz HEXBUF+3
ldy #$ff ldy #$ff
.1 iny .1 iny
lda (ZPPtr1),y lda (ZPPtr2),y
beq .8 beq .8
jsr STDIO.IsDigit jsr STDIO.IsDigit
bcs .8 bcs .8
lda HEXBUF+3 save HEXBUF for 4+1 jsr MANTISSA.T10
pha bcs .9
lda HEXBUF+2
pha
lda HEXBUF+1
pha
lda HEXBUF
pha
jsr HEXBUF.ROL HEXBUF * 2 -> HEXBUF lda (ZPPtr2),y
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
and #$0F and #$0F
adc HEXBUF adc MANTISSA
sta HEXBUF sta MANTISSA
bcc .1 bcc .1
inc HEXBUF+1 inc MANTISSA+1
bne .1 bne .1
inc HEXBUF+2 inc MANTISSA+2
bne .1 bne .1
inc HEXBUF+3 inc MANTISSA+3
bne .1 overflow!!! 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 pla
pla pla
.99 rts .99 rts
.8 clc
rts
*-------------------------------------- *--------------------------------------
HEXBUF.ROL asl HEXBUF MANTISSA.ROL asl MANTISSA
rol HEXBUF+1 rol MANTISSA+1
rol HEXBUF+2 rol MANTISSA+2
rol HEXBUF+3 rol MANTISSA+3
rts rts
*-------------------------------------- *--------------------------------------
* Convert HEXBUF to ASCBUF decimal padded with 0 MANTISSA.Clear ldx #8
*-------------------------------------- .1 stz EXPSIGN,x
HEX2DEC ldx #4
.1 stz BCDBUF,x Clear all 5 bytes
dex dex
bpl .1 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 rts
*-------------------------------------- *--------------------------------------
HEXBUF .BS 4 32 bits max bDECPOINT .BS 1
BCDBUF .BS 5 5, enough to handle 10 digits (32bits) INEXP .BS 1
ASCBUF .BS 12 LEN + sign + 10 digits ($FFFFFFFF=4.294.967.295) MANTSIGN .BS 1
EXPSIGN .BS 1
EXP .BS 1
MANTISSA .BS 4 32 bits max
*/-------------------------------------- */--------------------------------------
* # RealPath.YA * # RealPath.YA
* Return the canonicalized absolute pathname * Return the canonicalized absolute pathname

View File

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

View File

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