Kernel 0.9.1 : Code reorganization & move to CSTR

This commit is contained in:
Rémy GIBERT 2017-08-23 17:05:29 +02:00
parent f8697c333a
commit 668412cc17
13 changed files with 844 additions and 388 deletions

Binary file not shown.

Binary file not shown.

View File

@ -221,7 +221,7 @@ SYS.PStrMatch .EQ $56
SYS.PStrUprYA .EQ $58
SYS.PStrLwrYA .EQ $5A
SYS.StrFTime .EQ $5C
SYS.PStr2StrArrayYA .EQ $5E
*SYS.PStr2StrArrayYA .EQ $5E
*--------------------------------------
SYS.ExecProcessNewEnvYA .EQ $60
SYS.ExecProcessYA .EQ $62

View File

@ -151,7 +151,9 @@ Cmd.Exec.INT jmp (J.INTCMDS,x)
Cmd.Exec.EXT ldy #1
lda (ZPPtr1),y
cmp #'/' Command line is already full path, no search
beq .3
bne .10
>LDYA L.ENV.PATH push ENVNAME=PATH for search
>SYSCALL GetEnvYA get value for ENV=PATH
@ -159,7 +161,9 @@ Cmd.Exec.EXT ldy #1
>PUSHYA push search list
>PUSHW ZPPtr1
>PUSHW ZPPtr1 push filename
>PUSHWI UsrBuf256
>PUSHW L.STAT
>SYSCALL FileSearch
bcc .2
@ -168,6 +172,8 @@ Cmd.Exec.EXT ldy #1
>SYSCALL GetMemPtrA
>PUSHYA push search list
>PUSHW ZPPtr1
>PUSHWI UsrBuf256
>PUSHW L.STAT
>SYSCALL FileSearch
bcs .99

View File

@ -500,60 +500,6 @@ PrintF.SS ldy #$00 PSTR
Printf.Cout jmp K.PutCharA
Printf.Cout.Ptr sta $ffff Self modified
*/--------------------------------------
* # 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
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SYS/KERNEL.S.CIO

View File

@ -123,20 +123,6 @@ K.ExpandPStrYA stz K.ExpandPStr.hPStr Reset Intermediate string...
.9 rts
*--------------------------------------
K.ExpandPStrGetValue
jsr ENV.ExpandSysVar
bcc .9
>LDYAI K.ExpandPStr.Name
jsr K.GetEnvYA
bcs .9
>STYA ZPPtr3
jsr ENV.AppendPtr3ToBuf
.9 rts
*--------------------------------------
K.ExpandPStrValidChar
cmp #'0'
bcc .9
@ -156,6 +142,20 @@ K.ExpandPStrValidChar
.9 sec
rts
*--------------------------------------
K.ExpandPStrGetValue
jsr ENV.ExpandSysVar
bcc .9
>LDYAI K.ExpandPStr.Name
jsr K.GetEnvYA
bcs .9
>STYA ZPPtr3
jsr ENV.AppendPtr3ToBuf
.9 rts
*--------------------------------------
K.ExpandPStr.bNoExp .BS 1
K.ExpandPStr.bInVar .BS 1
K.ExpandPStr.bFound .BS 1

View File

@ -8,12 +8,14 @@ AUTO 6
* Search a file in the provided PATH list
* And return, if found, the full path to it.
* ## In:
* PUSHW = Ptr to Search Path (PSTR) %LIB%;/SYS/SLIB
* PUSHW = Ptr to File Name (PSTR)
* PUSHW = Ptr to Search Path (CSTR) %LIB%;/SYS/SLIB
* PUSHW = Ptr to File Name (CSTR)
* PUSHW = Ptr to DstBuf
* PUSHW = Ptr to DstStat
* ## Out:
* CC : success
* DstBuf = FilePath
* DstStat = S.STAT
* CS : not found
*\--------------------------------------
K.FileSearch >PULLW ZPPtr2 DstBuf

View File

@ -62,7 +62,7 @@ K.SYSCALL.JMP .DA K.FileSearch $00
.DA K.PStrUprYA
.DA K.PStrLwrYA
.DA K.StrFTime
.DA K.PStr2StrArrayYA
.DA 0 K.PStr2StrArrayYA
*--------------------------------------
.DA K.ExecProcessNewEnvYA $60
.DA K.ExecProcessYA

View File

@ -232,7 +232,7 @@ PS.CreateChild >LDYAI TskMgr.Table+S.PS
.9 rts
*--------------------------------------
PS.Init >LDYA K.CreateProcess.CmdLine
jsr K.PStr2StrArrayYA
jsr PS.PStr2StrArrayYA
bcs .9
phy save PTR to StrArray...
@ -352,6 +352,84 @@ PS.DupEnvA jsr K.GetMemPtrA
.8 txa
clc
.9 rts
*/--------------------------------------
* # PStr2StrArrayYA
* Convert a PSTR (e.g. : command Line) to a Array of PSTRs (Args[])
* ## In:
* Y,A = PTR to String
* ## Out:
* CC : success
* Y,A = PTR to StrArray
* X = hMem
* CS : error
* A = SYS error code
*\--------------------------------------
PS.PStr2StrArrayYA
>STYA ZPPtr1
lda (ZPPtr1) Get mem size STRLEN+1
inc
tay
lda #0
jsr K.GetMemYA
bcs .9
phx save hMem
phy save PTR.LO
pha save PTR.HI
>STYA ZPPtr2
lda (ZPPtr1)
tax count in src string
beq .8
ldy #0 reset index in dst token
.3 inc ZPPtr1 get...
bne .4
inc ZPPtr1+1
.4 lda (ZPPtr1) ...next char
cmp #' ' found a space ?
bne .6
tya in a token ?
beq .7 no, skip & go to next char
sta (ZPPtr2) yes, set this token len
sec
adc ZPPtr2 advance to next token
sta ZPPtr2
bcc .5
inc ZPPtr2+1
.5 ldy #0 reset index in dst token
bra .7
.6 iny add char to token
sta (ZPPtr2),y
.7 dex end of src string?
bne .3 no...next char...
tya yes, are we in a token ?
beq .8
sta (ZPPtr2) yes, set last token len
sec
adc ZPPtr2 advance to next token
sta ZPPtr2
bcc .8
inc ZPPtr2+1
.8 lda #0
sta (ZPPtr2) set Array Ending 0
pla get back PTR.HI
ply get back PTR.LO
plx get back hMem
clc
.9 rts
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SYS/KERNEL.S.PS

239
SYS/KERNEL.S.STDIO.txt Normal file
View File

@ -0,0 +1,239 @@
PR#3
PREFIX /A2OSX.BUILD
LOMEM $A00
INC 1
AUTO 6
*/--------------------------------------
* # FPutCAY
* Print A (char) to File
* ## In:
* A : char to print
* Y = hFILE
* ## Out:
* CC = success
*\--------------------------------------
K.FPutCAY sta K.PutC.Char
sty K.PutC.Node
tya
phy
bne K.PutCharA.1
K.PutCharA.8 ply
clc
rts
*/--------------------------------------
* # PutCharA
* Print A (char) to StdOut
* ## In:
* A : char to print
* ## Out:
* CC = success
*\--------------------------------------
K.PutCharA sta K.PutC.Char
phy
ldy #S.PS.hStdOut
lda (pPs),y
beq K.PutCharA.8 NUL
phx
K.PutCharA.1 sta K.PutC.Node
jsr K.GetMemPtrA
>STYA pDev
ldy #S.NODE.T
lda (pDev),y
asl
tax
jsr K.PutCharA.Jmp
plx
ply
rts
*--------------------------------------
K.PutCharA.Jmp jmp (.1,x)
.1 .DA K.PutCharA.REG
.DA K.CHR.IOERR DIR
.DA K.PutCharA.CDEV
.DA K.CHR.IOERR BDEV
.DA K.CHR.IOERR LNK
.DA K.CHR.IOERR DSOCK
.DA K.PutCharA.SSOCK
.DA K.PutCharA.FIFO
*--------------------------------------
K.PutCharA.REG lda K.PutC.Node
ldy K.PutC.Char
jmp K.FWriteAY
*--------------------------------------
K.PutCharA.CDEV ldy #S.NODE.DEV.JMP
lda (pDev),y
sta .1+1
iny
lda (pDev),y
sta .1+2
lda K.PutC.Char
ldx #DEVMGR.WRITE
.1 jmp $ffff
*--------------------------------------
K.PutCharA.SSOCK
lda (pDev) #S.NODE.HANDLER
jsr K.GetMemPtrA
>STYA .1
ldy #S.NODE.SSOCK.HSKT
>PUSHB (pDev),y
>PUSHB K.PutC.Char
ldy #S.NODE.SSOCK.WRITE
lda (pDev),y
tax Function Offset for write
.1 jmp $ffff
*--------------------------------------
K.PutCharA.FIFO ldy #S.NODE.FIFO.S
lda (pDev),y
beq .9 Remote PS did not opened yet the pipe
cmp #S.NODE.FIFO.S.Closed
beq .99 Remote PS closed the Pipe
ldy #S.NODE.FIFO.hMem
lda (pDev),y
jsr K.GetMemPtrA
>STYA .1+2
ldy #S.NODE.FIFO.Head
lda (pDev),y
inc
dey #S.NODE.FIFO.Tail
cmp (pDev),y
beq .9 FIFO is full
iny
sta (pDev),y
tay
lda K.PutC.Char
.1 sta $ffff,y
clc
rts
.9 lda #MLI.ERR.VOLFULL
sec
rts
.99 lda #MLI.ERR.EOF
sec
rts
*--------------------------------------
K.PutC.Char .BS 1
K.PutC.Node .BS 1
*/--------------------------------------
* # GetChar
* Get char from StdIn
* ## In:
* none.
* ## Out:
* CC = success
* A = char
*\--------------------------------------
K.GetChar ldy #S.PS.hStdIn
lda (pPs),y
*/--------------------------------------
* # GetCA
* Get char from File
* ## In:
* A = hFILE
* ## Out:
* CC = success
* A = char
*\--------------------------------------
K.GetCA sta K.PutC.Node
jsr K.GetMemPtrA
>STYA pDev
ldy #S.NODE.T
lda (pDev),y
asl
tax
jmp (.1,x)
.1 .DA K.GetC.REG
.DA K.CHR.IOERR DIR
.DA K.GetC.CDEV
.DA K.CHR.IOERR BDEV
.DA K.CHR.IOERR LNK
.DA K.CHR.IOERR DSOCK
.DA K.GetC.SSOCK
.DA K.GetC.FIFO
*--------------------------------------
K.GetC.REG lda K.PutC.Node
jmp K.FReadA
*--------------------------------------
K.GetC.CDEV ldx #DEVMGR.READ
ldy #S.NODE.DEV.JMP
lda (pDev),y
sta .1+1
iny
lda (pDev),y
sta .1+2
.1 jmp $ffff
*--------------------------------------
K.GetC.SSOCK lda (pDev) #S.NODE.HANDLER
jsr K.GetMemPtrA
>STYA .1
ldy #S.NODE.SSOCK.READ
lda (pDev),y
tax Function Offset for READ
ldy #S.NODE.SSOCK.HSKT
lda (pDev),y
.1 jmp $ffff
*--------------------------------------
K.GetC.FIFO
*/--------------------------------------
* # FPutS
* Write String to FILE
* ## In:
* PUSHW : CPtr
* PUSHB : hFILE
* ## Out:
* CC = success
*\--------------------------------------
K.FPutS
*/--------------------------------------
* # PutSYA
* Write String to StdOut
* ## In:
* Y,A : CPtr
* ## Out:
* CC = success
*\--------------------------------------
K.PutSYA
*/--------------------------------------
* # FGetS
* Read String From FILE
* ## In:
* PUSHW : CPtr
* PUSHB : hFILE
* ## Out:
* CC = success
*\--------------------------------------
K.FGetS
*/--------------------------------------
* # GetSYA
* Read String From StdIn
* ## In:
* Y,A : CPtr
* ## Out:
* CC = success
*\--------------------------------------
K.GetSYA
bra *
*--------------------------------------
K.CHR.IOERR lda #MLI.ERR.IO
sec
rts
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SYS/KERNEL.S.STDIO
LOAD /A2OSX.SRC/SYS/KERNEL.S
ASM

63
SYS/KERNEL.S.STDLIB.txt Normal file
View File

@ -0,0 +1,63 @@
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
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SYS/KERNEL.S.STDLIB
LOAD /A2OSX.SRC/SYS/KERNEL.S
ASM

View File

@ -199,326 +199,43 @@ K.PStrLwrYA ldx #2
rts
*--------------------------------------
K.PStrUprLwr .AS "azAZ"
*/--------------------------------------
* # StrFTime
* Convert S.TIME struct to CSTR
* ## In:
* PUSHW = Dst PTR To CSTR Buf
* PUSHW = Src PTR To Format String
* %a : Abbreviated weekday name : Thu
* %A : Full weekday name : Thursday
* %b : Abbreviated month name : Aug
* %B : Full month name : August
* %d : Day of the month, zero-padded (01-31)
* %H : Hour in 24h format (00-23) 14
* %I : Hour in 12h format (01-12) 02
* %m : Month as a decimal number (01-12) 08
* %M : Minute (00-59) 55
* %p : AM or PM designation PM
* %S : Second (00-61) 02
* %w : Weekday as a decimal number with Sunday as 0 (0-6)
* %y : Year, last two digits (00-99)
* %Y : Year four digits 2001
* PUSHW = Src PTR To S.Time
* ## Out:
* none. always succeed.
*\--------------------------------------
K.StrFTime jsr PullPtr1Ptr2Ptr3
*--------------------------------------
K.PStr2CStrYA >STYA ZPPtr1
lda (ZPPtr1)
beq .8
pha
tay
.1 lda (ZPPtr1),y
dey
sta (ZPPtr1),y
tya
bne .1
ply
sta (ZPPtr1),y Ending 0
.8 rts
*--------------------------------------
K.CStr2PStrYA >STYA ZPPtr1
ldy #0
.1 lda (ZPPtr2),y
beq .8
.1 lda (ZPPtr1),y
beq .9
.2 pha
iny
cmp #'%'
beq .2
jsr K.StrFTime.addChar
bra .1
.2 ldx #K.StrFTime.JMPL-K.StrFTime.Tbl-1
lda (ZPPtr2),y
beq .8
iny
.3 cmp K.StrFTime.Tbl,x
beq .4
dex
bpl .3
bra .1
.4 lda K.StrFTime.JMPL,x
sta .5+1
lda K.StrFTime.JMPH,x
sta .5+2
phy
.5 jsr $ffff
ply
bra .1
.8 lda #0 Terminate C string
sta (ZPPtr3)
rts
*--------------------------------------
K.StrFTime.TBL .AS "aAbBdHImMpSwyY"
K.StrFTime.JMPL .DA #K.StrFTime.A
.DA #K.StrFTime.AA
.DA #K.StrFTime.B
.DA #K.StrFTime.BB
.DA #K.StrFTime.D
.DA #K.StrFTime.HH
.DA #K.StrFTime.II
.DA #K.StrFTime.M
.DA #K.StrFTime.MM
.DA #K.StrFTime.P
.DA #K.StrFTime.SS
.DA #K.StrFTime.W
.DA #K.StrFTime.Y
.DA #K.StrFTime.YY
*--------------------------------------
K.StrFTime.JMPH .DA /K.StrFTime.A
.DA /K.StrFTime.AA
.DA /K.StrFTime.B
.DA /K.StrFTime.BB
.DA /K.StrFTime.D
.DA /K.StrFTime.HH
.DA /K.StrFTime.II
.DA /K.StrFTime.M
.DA /K.StrFTime.MM
.DA /K.StrFTime.P
.DA /K.StrFTime.SS
.DA /K.StrFTime.W
.DA /K.StrFTime.Y
.DA /K.StrFTime.YY
*--------------------------------------
K.StrFTime.A ldx #3 Short day of week, 3 chars...
.HS 2C Bit abs
K.StrFTime.AA ldx #15 full DoW
>LDYAI K.StrFTime.DAY
>STYA ZPPtr4
ldy #S.Time.WDAY
bra K.StrFTime.STR
K.StrFTime.B ldx #3 Short Month, 3 chars....
.HS 2C Bit abs
K.StrFTime.BB ldx #15 full Month....
>LDYAI K.StrFTime.MON
>STYA ZPPtr4
ldy #S.Time.MONTH
K.StrFTime.STR lda (ZPPtr1),y get required S.Time field value
tay
beq .9 Illegal value
.1 dey range 0..x
beq .2
lda (ZPPtr4)
sec
adc ZPPtr4
sta ZPPtr4
bcc .1
inc ZPPtr4+1
bra .1
.2 ldy #0
.3 iny
lda (ZPPtr4),y
phy
jsr K.StrFTime.addChar
lda (ZPPtr1),y
tax
pla
cmp (ZPPtr4)
beq .8
sta (ZPPtr1),y
txa
bne .2
tay
dex
bne .3
.8 rts
.9 ldx #3
lda #'?'
.99 jsr K.StrFTime.addChar
dex
bne .99
rts
*--------------------------------------
K.StrFTime.D ldy #S.Time.DAY
bra K.StrFTime.addDecPtr1Y
K.StrFTime.HH ldy #S.Time.HOUR
bra K.StrFTime.addDecPtr1Y
K.StrFTime.II ldy #S.Time.HOUR
lda (ZPPtr1),y
cmp #12
bcc .1
sbc #12
.1 bra K.StrFTime.addDecA
K.StrFTime.M ldy #S.Time.MONTH
bra K.StrFTime.addDecPtr1Y
K.StrFTime.MM ldy #S.Time.MINUTE
bra K.StrFTime.addDecPtr1Y
K.StrFTime.P ldy #S.Time.HOUR
lda (ZPPtr1),y
cmp #12
bcc .1
lda #'p'
.HS 2C bit abs
.1 lda #'a'
jsr K.StrFTime.addChar
lda #'m'
bra K.StrFTime.addChar
K.StrFTime.SS ldy #S.Time.SECOND
bra K.StrFTime.addDecPtr1Y
K.StrFTime.W ldy #S.Time.WDAY
bra K.StrFTime.addDecPtr1Y
K.StrFTime.YY ldy #S.Time.CENTURY
jsr K.StrFTime.addDecPtr1Y
K.StrFTime.Y ldy #S.Time.YEAR
*--------------------------------------
K.StrFTime.addDecPtr1Y
lda (ZPPtr1),y
K.StrFTime.addDecA
sta K.StrFTime.BIN
stz K.StrFTime.DEC
sed
ldx #8
.1 asl K.StrFTime.BIN
lda K.StrFTime.DEC
adc K.StrFTime.DEC
sta K.StrFTime.DEC
dex
bne .1
cld
* lda K.StrFTime.DEC already in A
pha
lsr
lsr
lsr
lsr
ora #$30
jsr K.StrFTime.addChar
pla
and #$0f
ora #$30
*--------------------------------------
K.StrFTime.addChar
sta (ZPPtr3)
inc ZPPtr3
bne .8
inc ZPPtr3+1
.8 rts
*--------------------------------------
K.StrFTime.DAY >PSTR "Monday"
>PSTR "Tuesday"
>PSTR "Wednesday"
>PSTR "Thursday"
>PSTR "Friday"
>PSTR "Saturday"
>PSTR "Sunday"
*--------------------------------------
K.StrFTime.MON >PSTR "January"
>PSTR "February"
>PSTR "March"
>PSTR "April"
>PSTR "May"
>PSTR "June"
>PSTR "July"
>PSTR "August"
>PSTR "September"
>PSTR "October"
>PSTR "November"
>PSTR "December"
*--------------------------------------
K.StrFTime.BIN .BS 1
K.StrFTime.DEC .BS 1 always < 100
*/--------------------------------------
* # PStr2StrArrayYA
* Convert a PSTR (e.g. : command Line) to a Array of PSTRs (Args[])
* ## In:
* Y,A = PTR to String
* ## Out:
* CC : success
* Y,A = PTR to StrArray
* X = hMem
* CS : error
* A = SYS error code
*\--------------------------------------
K.PStr2StrArrayYA
>STYA ZPPtr1
lda (ZPPtr1) Get mem size STRLEN+1
inc
tay
lda #0
jsr K.GetMemYA
bcs .9
phx save hMem
phy save PTR.LO
pha save PTR.HI
>STYA ZPPtr2
lda (ZPPtr1)
tax count in src string
beq .8
ldy #0 reset index in dst token
.3 inc ZPPtr1 get...
bne .4
inc ZPPtr1+1
.4 lda (ZPPtr1) ...next char
cmp #' ' found a space ?
bne .6
tya in a token ?
beq .7 no, skip & go to next char
sta (ZPPtr2) yes, set this token len
sec
adc ZPPtr2 advance to next token
sta ZPPtr2
bcc .5
inc ZPPtr2+1
.5 ldy #0 reset index in dst token
bra .7
.6 iny add char to token
sta (ZPPtr2),y
.7 dex end of src string?
bne .3 no...next char...
tya yes, are we in a token ?
beq .8
sta (ZPPtr2) yes, set last token len
sec
adc ZPPtr2 advance to next token
sta ZPPtr2
bcc .8
inc ZPPtr2+1
.8 lda #0
sta (ZPPtr2) set Array Ending 0
pla get back PTR.HI
ply get back PTR.LO
plx get back hMem
clc
.9 rts
.8 tya
sta (ZPPtr1)
.9 rts
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SYS/KERNEL.S.STR

405
SYS/KERNEL.S.STRING.txt Normal file
View File

@ -0,0 +1,405 @@
PR#3
PREFIX /A2OSX.BUILD
LOMEM $A00
INC 1
AUTO 6
*/--------------------------------------
* # StrCat
* Append SRC to DST
* ## In:
* PUSHW = Ptr to SRC (CSTR)
* PUSHW = Ptr to DST (CSTR)
* ## Out:
* DST = DST+SRC
*\--------------------------------------
K.StrCat jsr PullPtr1Ptr2
.1 lda (ZPPtr1)
beq K.StrCpy.I
inc ZPPtr1
bne .1
inc ZPPtr1+1
bra .1
*/--------------------------------------
* # StrCpy
* Copy string
* ## In:
* PUSHW = Ptr to SRC (CSTR)
* PUSHW = Ptr to DST (CSTR)
* ## Out:
* DST = SRC
*\--------------------------------------
K.StrCpy jsr PullPtr1Ptr2
K.StrCpy.I ldy #0
.1 lda (ZPPtr2),y
sta (ZPPtr1),y
beq .8
iny
bne .1
inc ZPPtr2+1
inc ZPPtr1+1
bra .1
.8 rts
*/--------------------------------------
* # StrMatch
* Compare a String against pattern
* ## In:
* PUSHW = PTR to Pattern (e.g. '*test?.txt')
* PUSHW = PTR to Src String
* ## Out:
* CC : match
* CS : no match
*\--------------------------------------
K.StrMatch jsr PullPtr1Ptr2
lda (ZPPtr2) Get pattern 1st byte
beq .8 Match always if empty
ldy #0
bra .21
.1 inc ZPPtr2 Make PTR2 advance to next char
bne .2
inc ZPPtr2+1
.2 lda (ZPPtr2) get pattern char
beq .41
.21 cmp #'*'
beq .5
.3 lda (ZPPtr1) we must match ? or regular char, check if at end of string
beq .9 no char left, exit with error
lda (ZPPtr2) get back pattern char
cmp #'?'
beq .4 no need to compare, any char will match
cmp (ZPPtr1),y Regular Char, compare with string at Y
bne .9 no match, exit
iny advance to next char to compare
.4 dex char matched, check if end of pattern
bne .1 continue if remaining char in pattern
.41 lda (ZPPtr1),y end of pattern, but end of string ?
beq .8 yes, string matched entirely
bra .9 no, remaining char in string, no match
.5 inc ZPPtr2 Make PTR2 advance to next char
bne .6
inc ZPPtr2+1
lda (ZPPtr2) we have '*', last char of pattern ?
beq .8 yes, match everything, including empty string
.6 lda (ZPPtr2) get next char of pattern
cmp #'*' another '*' ?
beq .5 yes, '**' = '*', go next char
cmp #'?' '*?' ??? we must match a least one char
beq .3
.7 lda (ZPPtr1),y we need at least one remaining char in string, check if at end of string
beq .9 no chance to match ? or regular char
iny
lda (ZPPtr2) get again char in pattern
cmp (ZPPtr1),y compare with char in string
bne .7 not equal to next non wildcard in pattern
bra .4 go check remaining char in pattern...
.8 clc
rts
.9 sec
rts
*/--------------------------------------
* # StrUprYA/StrLwrYA
* Convert string to UPPERCASE/lowercase
* ## In:
* Y,A = PTR to String (CSTR)
* ## Out:
* Uppercased/lowercased String in Buffer
*\--------------------------------------
K.StrUprYA ldx #0
.HS 2C bit abs
K.StrLwrYA ldx #2
>STYA ZPPtr1
pha save Y,A to restore them at exit
phy
ldy #0
.1 lda (ZPPtr1),y
beq .8
cmp K.PStrUprLwr,x
bcc .2
cmp K.PStrUprLwr+1,x
bcs .2
eor #$20
sta (ZPPtr1),y
.2 iny
bne .1
inc ZPPtr1+1
bra .1
.8 ply
pla
rts
*--------------------------------------
K.PStrUprLwr .AS "azAZ"
*/--------------------------------------
* # StrFTime
* Convert S.TIME struct to CSTR
* ## In:
* PUSHW = Dst PTR To CSTR Buf
* PUSHW = Src PTR To Format String
* %a : Abbreviated weekday name : Thu
* %A : Full weekday name : Thursday
* %b : Abbreviated month name : Aug
* %B : Full month name : August
* %d : Day of the month, zero-padded (01-31)
* %H : Hour in 24h format (00-23) 14
* %I : Hour in 12h format (01-12) 02
* %m : Month as a decimal number (01-12) 08
* %M : Minute (00-59) 55
* %p : AM or PM designation PM
* %S : Second (00-61) 02
* %w : Weekday as a decimal number with Sunday as 0 (0-6)
* %y : Year, last two digits (00-99)
* %Y : Year four digits 2001
* PUSHW = Src PTR To S.Time
* ## Out:
* none. always succeed.
*\--------------------------------------
K.StrFTime jsr PullPtr1Ptr2Ptr3
ldy #0
.1 lda (ZPPtr2),y
beq .8
iny
cmp #'%'
beq .2
jsr K.StrFTime.addChar
bra .1
.2 ldx #K.StrFTime.JMPL-K.StrFTime.Tbl-1
lda (ZPPtr2),y
beq .8
iny
.3 cmp K.StrFTime.Tbl,x
beq .4
dex
bpl .3
bra .1
.4 lda K.StrFTime.JMPL,x
sta .5+1
lda K.StrFTime.JMPH,x
sta .5+2
phy
.5 jsr $ffff
ply
bra .1
.8 lda #0 Terminate C string
sta (ZPPtr3)
rts
*--------------------------------------
K.StrFTime.TBL .AS "aAbBdHImMpSwyY"
K.StrFTime.JMPL .DA #K.StrFTime.A
.DA #K.StrFTime.AA
.DA #K.StrFTime.B
.DA #K.StrFTime.BB
.DA #K.StrFTime.D
.DA #K.StrFTime.HH
.DA #K.StrFTime.II
.DA #K.StrFTime.M
.DA #K.StrFTime.MM
.DA #K.StrFTime.P
.DA #K.StrFTime.SS
.DA #K.StrFTime.W
.DA #K.StrFTime.Y
.DA #K.StrFTime.YY
*--------------------------------------
K.StrFTime.JMPH .DA /K.StrFTime.A
.DA /K.StrFTime.AA
.DA /K.StrFTime.B
.DA /K.StrFTime.BB
.DA /K.StrFTime.D
.DA /K.StrFTime.HH
.DA /K.StrFTime.II
.DA /K.StrFTime.M
.DA /K.StrFTime.MM
.DA /K.StrFTime.P
.DA /K.StrFTime.SS
.DA /K.StrFTime.W
.DA /K.StrFTime.Y
.DA /K.StrFTime.YY
*--------------------------------------
K.StrFTime.A ldx #3 Short day of week, 3 chars...
.HS 2C Bit abs
K.StrFTime.AA ldx #15 full DoW
>LDYAI K.StrFTime.DAY
>STYA ZPPtr4
ldy #S.Time.WDAY
bra K.StrFTime.STR
K.StrFTime.B ldx #3 Short Month, 3 chars....
.HS 2C Bit abs
K.StrFTime.BB ldx #15 full Month....
>LDYAI K.StrFTime.MON
>STYA ZPPtr4
ldy #S.Time.MONTH
K.StrFTime.STR lda (ZPPtr1),y get required S.Time field value
tay
beq .9 Illegal value
.1 dey range 0..x
beq .2
lda (ZPPtr4)
sec
adc ZPPtr4
sta ZPPtr4
bcc .1
inc ZPPtr4+1
bra .1
.2 ldy #0
.3 iny
lda (ZPPtr4),y
phy
jsr K.StrFTime.addChar
pla
cmp (ZPPtr4)
beq .8
tay
dex
bne .3
.8 rts
.9 ldx #3
lda #'?'
.99 jsr K.StrFTime.addChar
dex
bne .99
rts
*--------------------------------------
K.StrFTime.D ldy #S.Time.DAY
bra K.StrFTime.addDecPtr1Y
K.StrFTime.HH ldy #S.Time.HOUR
bra K.StrFTime.addDecPtr1Y
K.StrFTime.II ldy #S.Time.HOUR
lda (ZPPtr1),y
cmp #12
bcc .1
sbc #12
.1 bra K.StrFTime.addDecA
K.StrFTime.M ldy #S.Time.MONTH
bra K.StrFTime.addDecPtr1Y
K.StrFTime.MM ldy #S.Time.MINUTE
bra K.StrFTime.addDecPtr1Y
K.StrFTime.P ldy #S.Time.HOUR
lda (ZPPtr1),y
cmp #12
bcc .1
lda #'p'
.HS 2C bit abs
.1 lda #'a'
jsr K.StrFTime.addChar
lda #'m'
bra K.StrFTime.addChar
K.StrFTime.SS ldy #S.Time.SECOND
bra K.StrFTime.addDecPtr1Y
K.StrFTime.W ldy #S.Time.WDAY
bra K.StrFTime.addDecPtr1Y
K.StrFTime.YY ldy #S.Time.CENTURY
jsr K.StrFTime.addDecPtr1Y
K.StrFTime.Y ldy #S.Time.YEAR
*--------------------------------------
K.StrFTime.addDecPtr1Y
lda (ZPPtr1),y
K.StrFTime.addDecA
sta K.StrFTime.BIN
stz K.StrFTime.DEC
sed
ldx #8
.1 asl K.StrFTime.BIN
lda K.StrFTime.DEC
adc K.StrFTime.DEC
sta K.StrFTime.DEC
dex
bne .1
cld
* lda K.StrFTime.DEC already in A
pha
lsr
lsr
lsr
lsr
ora #$30
jsr K.StrFTime.addChar
pla
and #$0f
ora #$30
*--------------------------------------
K.StrFTime.addChar
sta (ZPPtr3)
inc ZPPtr3
bne .8
inc ZPPtr3+1
.8 rts
*--------------------------------------
K.StrFTime.DAY >PSTR "Monday"
>PSTR "Tuesday"
>PSTR "Wednesday"
>PSTR "Thursday"
>PSTR "Friday"
>PSTR "Saturday"
>PSTR "Sunday"
*--------------------------------------
K.StrFTime.MON >PSTR "January"
>PSTR "February"
>PSTR "March"
>PSTR "April"
>PSTR "May"
>PSTR "June"
>PSTR "July"
>PSTR "August"
>PSTR "September"
>PSTR "October"
>PSTR "November"
>PSTR "December"
*--------------------------------------
K.StrFTime.BIN .BS 1
K.StrFTime.DEC .BS 1 always < 100
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SYS/KERNEL.S.STRING
LOAD /A2OSX.SRC/SYS/KERNEL.S
ASM