From 668412cc170d291e2c280aa7475e1d6c67b340b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Wed, 23 Aug 2017 17:05:29 +0200 Subject: [PATCH] Kernel 0.9.1 : Code reorganization & move to CSTR --- .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes .Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes INC/A2osX.I.txt | 2 +- SBIN/SHELL.S.CMD.txt | 10 +- SYS/KERNEL.S.CIO.txt | 54 ------ SYS/KERNEL.S.ENV.txt | 28 +-- SYS/KERNEL.S.FIO.txt | 6 +- SYS/KERNEL.S.JMP.txt | 2 +- SYS/KERNEL.S.PS.txt | 80 +++++++- SYS/KERNEL.S.STDIO.txt | 239 +++++++++++++++++++++++ SYS/KERNEL.S.STDLIB.txt | 63 ++++++ SYS/KERNEL.S.STR.txt | 343 +++------------------------------ SYS/KERNEL.S.STRING.txt | 405 +++++++++++++++++++++++++++++++++++++++ 13 files changed, 844 insertions(+), 388 deletions(-) create mode 100644 SYS/KERNEL.S.STDIO.txt create mode 100644 SYS/KERNEL.S.STDLIB.txt create mode 100644 SYS/KERNEL.S.STRING.txt diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index f3f14ed04280d036934825130e224fba68cc20c0..f806e85dde723a1f77e8faf0c6d4b03d265eb8da 100644 GIT binary patch delta 69 zcmZo@FluNp+R(tIF*6Xe05K~NvjH(X5OV-AClGUO K4_L>&;UWNy6&nEn delta 69 zcmZo@FluNp+R(tIF*6Xe05K~NvjH(X5OV-AClGUO K4_L>&;UWNzWg7QOon5?R* z@9i4o=jx*utQQ;-?qtTM?Gh)rUof^YakMdUwlQ(F LF>x%E;}8o+4Sg8I=k{v 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 diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index bb316818..bec3ad66 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -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 diff --git a/SBIN/SHELL.S.CMD.txt b/SBIN/SHELL.S.CMD.txt index e7127fe3..9100a433 100644 --- a/SBIN/SHELL.S.CMD.txt +++ b/SBIN/SHELL.S.CMD.txt @@ -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 diff --git a/SYS/KERNEL.S.CIO.txt b/SYS/KERNEL.S.CIO.txt index e6f66062..6c848835 100644 --- a/SYS/KERNEL.S.CIO.txt +++ b/SYS/KERNEL.S.CIO.txt @@ -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 diff --git a/SYS/KERNEL.S.ENV.txt b/SYS/KERNEL.S.ENV.txt index 996be6e4..ef860906 100644 --- a/SYS/KERNEL.S.ENV.txt +++ b/SYS/KERNEL.S.ENV.txt @@ -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 diff --git a/SYS/KERNEL.S.FIO.txt b/SYS/KERNEL.S.FIO.txt index 91f0652e..d4f0a6eb 100644 --- a/SYS/KERNEL.S.FIO.txt +++ b/SYS/KERNEL.S.FIO.txt @@ -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 diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt index 8078940b..ca9c1e51 100644 --- a/SYS/KERNEL.S.JMP.txt +++ b/SYS/KERNEL.S.JMP.txt @@ -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 diff --git a/SYS/KERNEL.S.PS.txt b/SYS/KERNEL.S.PS.txt index 0c31e04d..5a8244dc 100644 --- a/SYS/KERNEL.S.PS.txt +++ b/SYS/KERNEL.S.PS.txt @@ -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 diff --git a/SYS/KERNEL.S.STDIO.txt b/SYS/KERNEL.S.STDIO.txt new file mode 100644 index 00000000..bcfcfb1f --- /dev/null +++ b/SYS/KERNEL.S.STDIO.txt @@ -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 diff --git a/SYS/KERNEL.S.STDLIB.txt b/SYS/KERNEL.S.STDLIB.txt new file mode 100644 index 00000000..aa9aabe0 --- /dev/null +++ b/SYS/KERNEL.S.STDLIB.txt @@ -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 diff --git a/SYS/KERNEL.S.STR.txt b/SYS/KERNEL.S.STR.txt index 8b0e015a..cdd22372 100644 --- a/SYS/KERNEL.S.STR.txt +++ b/SYS/KERNEL.S.STR.txt @@ -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 diff --git a/SYS/KERNEL.S.STRING.txt b/SYS/KERNEL.S.STRING.txt new file mode 100644 index 00000000..250544d1 --- /dev/null +++ b/SYS/KERNEL.S.STRING.txt @@ -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