From 65e347ad36f595b13d2febfabeba5040794d683d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Mon, 17 Dec 2018 16:21:32 +0100 Subject: [PATCH] Kernel 0.92 --- .Docs/KERNEL.md | 21 +- .Floppies/A2OSX.BUILD.po | Bin 33553920 -> 33553920 bytes BIN/CHTYP.S.txt | 4 +- BIN/LS.S.txt | 4 +- BIN/X.CPMVRM.S.txt | 6 +- BIN/X.FILEENUM.S.txt | 69 +++ DRV/CONSOLE.DRV.S.txt | 1165 -------------------------------------- INC/A2osX.I.txt | 2 +- SYS/KERNEL.S.JMP.txt | 2 +- SYS/KERNEL.S.STDLIB.txt | 78 --- SYS/KERNEL.S.txt | 6 +- 11 files changed, 83 insertions(+), 1274 deletions(-) delete mode 100644 DRV/CONSOLE.DRV.S.txt diff --git a/.Docs/KERNEL.md b/.Docs/KERNEL.md index 4a5818f7..f2f3e05a 100644 --- a/.Docs/KERNEL.md +++ b/.Docs/KERNEL.md @@ -82,10 +82,11 @@ X = DevID Create a hDEV ## C -`hDEV mkdev (S.FD * fd)` +`hDEV mkdev (S.FD * fd, const char *devname)` ## ASM -`>LDYA FD.DEV` +`>PUSHW devname` +`>LDYA fd` `>SYSCALL mkdev ## RETURN VALUE @@ -1122,22 +1123,6 @@ CC : success X = hMem of Full Path CS : A = Error Code -# StrMatch -Compare a String against pattern (e.g. '*test?.txt') - -## C -`int * strmatch ( char * s, const char * pattern );` - -## ASM -**In:** -`>PUSHWI pattern` -`>LDYAI s` -`>SYSCALL strmatch` - -## RETURN VALUE -CC : match -CS : no match - # StrLen Returns Length of C-String diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 2d38f3a26640650ff24fb09a81370199b0e2ac51..7a8e0a858626b41b2cf9f1203fcbb157ad26082a 100644 GIT binary patch delta 36606 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 GetChar .11 pla >SYSCALL GetMemPtr -.12 >PUSHYA - >LDYA ZPFileName - >SYSCALL StrMatch +.12 jsr StrMatch bcs .8 no match, skip.... .4 ldy #S.STAT.P.DRIVE diff --git a/BIN/LS.S.txt b/BIN/LS.S.txt index cb0294a6..5ccd2a43 100644 --- a/BIN/LS.S.txt +++ b/BIN/LS.S.txt @@ -131,9 +131,7 @@ CS.RUN >SYSCALL GetChar .11 pla >SYSCALL GetMemPtr -.12 >PUSHYA - >LDYA ZPFileName - >SYSCALL StrMatch +.12 jsr StrMatch bcs .8 no match, skip.... .4 ldy #S.STAT.P.DRIVE diff --git a/BIN/X.CPMVRM.S.txt b/BIN/X.CPMVRM.S.txt index 4a18e934..a8b3ddc9 100644 --- a/BIN/X.CPMVRM.S.txt +++ b/BIN/X.CPMVRM.S.txt @@ -232,9 +232,7 @@ CS.RUN >SYSCALL GetChar .11 pla >SYSCALL GetMemPtr -.12 >PUSHYA - >LDYA ZPFileName - >SYSCALL StrMatch +.12 jsr StrMatch bcs CS.RUN.NEXT no match, skip.... .4 ldy #S.STAT.P.DRIVE @@ -431,7 +429,7 @@ CS.RUN.FILE jsr CS.RUN.FILE.MSG ldy #hDstBasePath jsr CS.RUN.GetPathY - >SYSCALL StrMatch + >SYSCALL StrCaseCmp bcs .3 not same dir, go copy/delete jsr CS.RUN.Rename diff --git a/BIN/X.FILEENUM.S.txt b/BIN/X.FILEENUM.S.txt index 5a1410f2..939d98c6 100644 --- a/BIN/X.FILEENUM.S.txt +++ b/BIN/X.FILEENUM.S.txt @@ -13,6 +13,75 @@ X.MAX.RECURSE .EQ 8 * hDstBasePath .BS 1 (optional) * STAT .BS S.STAT *-------------------------------------- +* Compare a ZPFileName against pattern in Y,A (e.g. '*test?.txt') +* CC : match +* CS : no match +*-------------------------------------- +StrMatch >STYA ZPPtr2 + + lda (ZPPtr2) Get pattern 1st byte + beq .8 Match always if empty + + ldy #0 + + bra .21 + +.1 inc ZPPtr2 Make PTR2 (pattern) advance to next char + bne .2 + inc ZPPtr2+1 + +.2 lda (ZPPtr2) get pattern char + beq .41 end of pattern... + +.21 cmp #'*' + beq .5 + +.3 lda (ZPFileName) 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 (ZPFileName),y Regular Char, compare with string at Y + bne .9 no match, exit + +.4 iny advance to next char to compare + bra .1 continue if remaining char in pattern + +.41 lda (ZPFileName),y end of pattern, but end of string ? + + beq .8 yes, string matched entirely +* no, remaining char in string, no match +.9 sec + rts + +.5 inc ZPPtr2 Make PTR2 advance to next char + bne .6 + inc ZPPtr2+1 + +.6 lda (ZPPtr2) we have '*', last char of pattern ? + beq .8 yes, match everything, including empty string + + 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 (ZPFileName),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 (ZPFileName),y compare with char in string + bne .7 not equal to next non wildcard in pattern + + iny + bra .1 go check remaining char in pattern... + +.8 clc + rts +*-------------------------------------- InitSrcDirYA >SYSCALL RealPath bcc .10 rts diff --git a/DRV/CONSOLE.DRV.S.txt b/DRV/CONSOLE.DRV.S.txt deleted file mode 100644 index 3d8a7c5a..00000000 --- a/DRV/CONSOLE.DRV.S.txt +++ /dev/null @@ -1,1165 +0,0 @@ -NEW -PREFIX -AUTO 4,1 - .LIST OFF - .OP 65C02 - .OR $2000 - .TF DRV/CONSOLE.DRV -*-------------------------------------- - .INB INC/MACROS.I - .INB INC/A2OSX.I - .INB INC/MLI.E.I - .INB INC/IO.I - .INB INC/NET.TELNET.I -*-------------------------------------- -* File Header (16 Bytes) -*-------------------------------------- -CS.START cld - jmp Dev.Detect cld,jmp abs=DRV - .DA #$61 6502,Level 1 (65c02) - .DA #1 DRV Layout Version 1 - .DA 0 - .DA CS.END-CS.START Code Length To Relocate - .DA 0 - .DA 0 - .DA 0 -*-------------------------------------- -* Relocation Table -*-------------------------------------- -L.MSG.DETECT .DA MSG.DETECT -L.DRV.CS.START .DA DRV.CS.START -L.FD.DEV .DA FD.DEV -L.FD.DEV.NAME .DA FD.DEV.NAME - .DA 0 End Of Reloc Table -*-------------------------------------- -Dev.Detect >LDYA L.MSG.DETECT - >SYSCALL puts - - >PUSHWI DRV.END - >PUSHWI DRV.CS.END - >PUSHWI DRV.CS.START - >LDYA L.DRV.CS.START - >SYSCALL InsDrv - bcs .9 - >STYA FD.DEV+S.FD.DEV.DRVPTR - - >PUSHW L.FD.DEV.NAME - >LDYA L.FD.DEV - >SYSCALL MKDEV - -.9 rts -*-------------------------------------- -CS.END -MSG.DETECT .AZ "Apple IIe/IIc 80 Col Driver." -FD.DEV .DA #S.FD.T.CDEV - .DA #0 HANDLER - .DA #0 BUSID - .DA #0 DEVID - .DA 0 BUSPTR - .BS 2 DRVPTR - .DA 0 BUFPTR -FD.DEV.NAME .AZ "CON" NAME -*-------------------------------------- -* Driver Code -*-------------------------------------- -CURSOR.BLINK.SPEED .EQ 2 -ESCSEQ.MAXLEN .EQ 16 -OUTBUF.MAXLEN .EQ 32 -IACBUF.MAXLEN .EQ 32 -*-------------------------------------- -ZPBaseL1 .EQ ZPDRV -ZPBaseL2 .EQ ZPDRV+2 -ZPTmpWord .EQ ZPDRV+4 -ZPTmpBool .EQ ZPDRV+6 -ZPIOCTL .EQ ZPDRV+8 -ZPBufPtr .EQ ZPDRV+10 -ZPCount .EQ ZPDRV+12 -*-------------------------------------- -DRV.CS.START cld - jmp (.1,x) -.1 .DA STATUS - .DA A2osX.BADCALL - .DA A2osX.BADCALL - .DA A2osX.BADCALL - .DA CONTROL - .DA A2osX.BADCALL - .DA OPEN - .DA CLOSE - .DA READ - .DA WRITE - .DA A2osX.BADCALL IRQ -*-------------------------------------- -J.CtrlChars .DA ENQ 5 - .DA BS 8 - .DA LF 10 - .DA CLRSCR 12 - .DA CROUT 13 - .DA FS 21 - .DA ESC 27 -*-------------------------------------- -J.EscCodes .DA Scroll.Dn M - .DA Scroll.Up D - .DA RESET c -*-------------------------------------- -J.EscSequences .DA Esc.LWEnable h - .DA Esc.LWDisable l - .DA Esc.DispAttr m - .DA Esc.Query n - .DA Esc.Scroll r - .DA Esc.Erase K - .DA Esc.Home H -*-------------------------------------- -J.COUT.IAC.CMDS .DA COUT.IAC.SB - .DA COUT.IAC.WILL - .DA COUT.IAC.WONT - .DA COUT.IAC.DO - .DA COUT.IAC.DONT - .DA 0 end of relocation -*-------------------------------------- -STATUS >STYA ZPIOCTL - - ldy #S.IOCTL.STATCODE - lda (ZPIOCTL),y - beq .1 - - cmp #S.IOCTL.STATCODE.GETDIB - bne .9 - - ldx #S.DIB-1 - .HS 2C bit abs -.1 ldx #3 - - ldy #S.IOCTL.BUFPTR - lda (ZPIOCTL),y - sta .3+1 - iny - lda (ZPIOCTL),y - sta .3+2 - -.2 lda DIB,x -.3 sta $ffff,x SELF MODIFIED - dex - bpl .2 - - clc - rts - -.9 lda #MLI.E.BADCTL - sec - rts -*-------------------------------------- -OPEN ldx #0 - -.1 ldy A2osX.SCRNDEVS,x - beq .2 - - inx - cpx #K.SCR.MAX - bne .1 - - lda #E.OOH - sec - rts - -.2 sta A2osX.SCRNDEVS,x DEV.ID in A - sta DEVID - lda #S.DIB.S.OPENED - tsb DIB+S.DIB.S - - stz OutPtr - stz OutCnt - - jsr RESET -*-------------------------------------- -CONTROL sta SETTEXT - sta SETALTCHAR - sta SET80DISP - sta CLR80STORE - sta CLRPAGE2 - lda DEVID - sta A2osX.ASCREEN - - clc - rts -*-------------------------------------- -CLOSE lda #S.DIB.S.OPENED - trb DIB+S.DIB.S - - stz A2osX.SCRNDEVS - clc - rts -*-------------------------------------- -READ >STYA ZPIOCTL - - lda A2osX.ASCREEN - cmp DEVID is screen active? - bne .6 no....go check flush... - - lda A2osX.TIMER16 - and #CURSOR.BLINK.SPEED - eor CURON - beq .1 - jsr CURBLNK - -.1 lda OPENAPPLE - bmi .6 Open apple key, not for us... - - lda KBD - bpl .6 - sta KBDSTROBE - - and #$7F - - ldx KeyRemapped -.2 cmp KeyRemapped,x - beq .3 - dex - bne .2 - jsr Char.Out.Put no remap....send char.... - bra .7 and flush - -.3 lda KeyRemappedIdx,x - tay - -.4 lda KeyRemappedTbl,y - beq .7 end of remap....flush - jsr Char.Out.Put - iny - bra .4 - -.6 lda OutCnt - beq .9 no char in output buffer... - -.7 stz .8+1 - jsr GetPtrsAndCnt - -.70 inc ZPCount - bne .71 - inc ZPCount+1 - beq .8 - -.71 jsr Char.Out.Get - bcs .8 - - ldy .8+1 - sta (ZPBufPtr),y - iny - sty .8+1 - bra .70 - -.8 lda #$ff SELF MODIFIED - ldy #S.IOCTL.BYTECNT - sta (ZPIOCTL),y - iny - lda #0 - sta (ZPIOCTL),y - - clc - rts - -.9 lda #0 Error = char - sec - rts -*-------------------------------------- -WRITE >STYA ZPIOCTL - - jsr GetPtrsAndCnt - -.2 inc ZPCount - bne .3 - inc ZPCount+1 - beq .8 - -.3 lda (ZPBufPtr) - inc ZPBufPtr - bne .4 - inc ZPBufPtr+1 - -.4 jsr WRITE.COUT - - bra .2 - -.8 clc - rts -*-------------------------------------- -WRITE.COUT bit bEscMode - bmi COUT.EscMode - bit bIACMode - bpl .10 - - jmp COUT.IAC - -.10 cmp #IAC - bne .1 - sta bIACMode - stz IACBuf - clc - rts - -.1 pha - jsr CUROFF - pla - cmp #C.DEL - beq DEL - cmp #C.SPACE - bcc COUT.Ctrl - - ora INVFLG - jsr SetCharAtCurPos -*-------------------------------------- -FS ldx CH - cpx #79 - bne .1 - - bit LWFLG - bpl FS.8 - - stz CH - jmp LF - -.1 inc CH - -FS.8 clc - rts -*-------------------------------------- -DEL ldx CH - beq .1 - dec CH - bra .3 - -.1 ldy CV - beq FS.8 - - lda #79 - sta CH - dec CV - -.3 lda #$20 - ora INVFLG - jmp SetCharAtCurPos -*-------------------------------------- -COUT.Ctrl ldx #CtrlChars.Cnt-1 - -.1 cmp CtrlChars,x - beq .2 - dex - bpl .1 - clc - rts - -.2 txa - asl - tax - jmp (J.CtrlChars,x) -*-------------------------------------- -COUT.EscMode bit bEscModeCSI - bmi COUT.EscModeCSI - cmp #'[' - bne .1 - - dec bEscModeCSI - stz EscSeq - clc - rts - -.1 stz bEscMode - - ldx #EscCodes.Cnt-1 - -.2 cmp EscCodes,x - beq .3 - dex - bpl .2 - - clc - rts - -.3 txa - asl - tax - jmp (J.EscCodes,x) -*-------------------------------------- -COUT.EscModeCSI inc EscSeq - ldx EscSeq - sta EscSeq,x - cmp #64 End of Seq ? - bcs COUT.ExecEscSeq - cpx #ESCSEQ.MAXLEN too long? - bne .1 - stz bEscModeCSI - stz bEscMode -.1 clc - rts - -COUT.ExecEscSeq stz EscSeqParamCnt - stz bEscSeqInNum - - ldx #0 EscSeq Ptr - -.10 stz ZPTmpWord - stz ZPTmpWord+1 - -.1 inx - lda EscSeq,x - - cmp #'0' - bcc .2 - cmp #'9'+1 - bcs .2 - - dec bEscSeqInNum - and #$0F - pha - lda ZPTmpWord - ldy ZPTmpWord+1 - asl ZPTmpWord param=param*10 - rol ZPTmpWord+1 - asl ZPTmpWord - rol ZPTmpWord+1 - clc - adc ZPTmpWord - sta ZPTmpWord - tya - adc ZPTmpWord+1 - sta ZPTmpWord+1 - asl ZPTmpWord - rol ZPTmpWord+1 - - pla - clc - adc ZPTmpWord - sta ZPTmpWord - bcc .1 - inc ZPTmpWord+1 - bra .1 - -.2 bit bEscSeqInNum - bpl .3 - - stz bEscSeqInNum - lda #255 - ldy ZPTmpWord+1 - bne .21 - - lda ZPTmpWord -.21 ldy EscSeqParamCnt - sta EscSeqParam,y - inc EscSeqParamCnt - -.3 lda EscSeq,x - cmp #';' - beq .10 - - stz bEscModeCSI - stz bEscMode - - ldx #EscSeqCmds.Cnt-1 - -.4 cmp EscSeqCmds,x - beq .5 - dex - bne .4 - - clc - rts - -.5 txa - asl - tax - jmp (J.EscSequences,x) -*-------------------------------------- -COUT.IAC inc IACBuf - ldx IACBuf - cpx #IACBUF.MAXLEN - beq * - sta IACBuf,x - - cpx #1 CMD ? - beq .8 yes, wait for additional bytes - - ldy IACBuf+1 get back CMD - cpy #SB - bne .1 not a SB/SE....stop with CMD/SUBCMD - - cmp #SE - bne .8 wait for ending SE....keep bIACMode - -.1 cpy #IAC - beq .9 - - tya - sec - sbc #SB - bcc .9 - asl - tax - lda IACBuf+2 Get SUBCMD in A - - cpx #10 - bcs * - jmp (J.COUT.IAC.CMDS,x) - -.9 stz bIACMode - -.8 clc - rts -*-------------------------------------- -COUT.IAC.SB cmp #TELOPT.TTYPE - bne .9 - - lda IACBuf+3 - cmp #SB.SEND - bne .9 - - ldy #0 - -.1 lda SB.IS.TTYPE,y - jsr Char.Out.Put - iny - cpy #SB.IS.TTYPE.LEN - bne .1 - -.9 stz bIACMode - - clc - rts -*-------------------------------------- -COUT.IAC.WILL ldx #WILLDO.CNT-1 - -.1 cmp WILLDO,x - beq .7 - dex - bpl .1 - - ldx #WILLDONT.CNT-1 - -.2 cmp WILLDONT,x - beq .8 - dex - bpl .2 - - bra .9 - -.7 ldx #DO - .HS 2C BIT ABS - -.8 ldx #DONT - - bra COUT.IAC.SendAX - -.9 stz bIACMode - - clc - rts -*-------------------------------------- -COUT.IAC.WONT -.9 stz bIACMode - - clc - rts -*-------------------------------------- -COUT.IAC.DO ldx #DOWILL.CNT-1 - -.1 cmp DOWILL,x - beq .7 - dex - bpl .1 - - ldx #DOWONT.CNT-1 - -.2 cmp DOWONT,x - beq .8 - dex - bpl .2 - - bra COUT.IAC.SendAX.9 - -.7 ldx #WILL - .HS 2C BIT ABS - -.8 ldx #WONT -*-------------------------------------- -COUT.IAC.SendAX - pha push CMD - phx - lda #IAC - jsr Char.Out.Put - pla - jsr Char.Out.Put - pla - jsr Char.Out.Put - -COUT.IAC.SendAX.9 - stz bIACMode - - clc - rts -*-------------------------------------- -COUT.IAC.DONT -.9 stz bIACMode - - clc - rts -*-------------------------------------- -RESET stz CURON - - stz bEscMode - stz bEscModeCSI - - jsr CLRSCR - - lda #23 - sta SCROLLBOT - lda #0 - sta SCROLLTOP - dec - sta LWFLG -*-------------------------------------- -RESETATTR lda #$80 - sta INVFLG - clc - rts -*-------------------------------------- -ESC lda #$80 - sta bEscMode - clc - rts -*-------------------------------------- -ENQ ldy #0 - -.1 lda ENQ.String,y - beq .8 - jsr Char.Out.Put - iny - bne .1 - -.8 clc - rts -*-------------------------------------- -BS ldx CH - beq .1 - dec CH - bra .3 - -.1 ldy CV - bne .2 - clc - rts - -.2 lda #79 - sta CH - dec CV - -.3 clc - rts -*-------------------------------------- -ClrScr ldx #23 - -.1 jsr SETUP.L1X - - lda #" " - - sta SETWRITEAUX - - ldy #39 - -.2 sta (ZPBaseL1),y - dey - bpl .2 - - sta CLRWRITEAUX - - ldy #39 - -.3 sta (ZPBaseL1),y - dey - bpl .3 - - dex - bpl .1 - - stz CV -*-------------------------------------- -CROUT stz CH - clc - rts -*-------------------------------------- -LF ldy CV - cpy SCROLLBOT - beq SCROLL.UP - inc CV - clc - rts -*-------------------------------------- -SCROLL.UP ldx SCROLLTOP - -.1 jsr SETUP.L1X - - inx - - jsr COPY.XtoL1 - - cpx SCROLLBOT - bne .1 -*-------------------------------------- -CLREOL ldy CH Start - ldx #80 End - bra CLR - -CLRLINE ldy #0 Start - ldx #80 End - bra CLR - -CLRSOL ldy #0 Start - ldx CH End - -CLR stx .2+1 - - ldx CV - -.1 lda #" " - - phy - jsr SetCharAtYX X unmodified - ply - iny -.2 cpy #$ff Self Modified - bne .1 - - clc - rts -*-------------------------------------- -SCROLL.DN ldx SCROLLBOT - -.1 jsr SETUP.L1X - - dex - - jsr COPY.XtoL1 - - cpx SCROLLTOP - bne .1 - - clc - rts -*-------------------------------------- -Esc.LWEnable sec - .HS 90 BCC -*-------------------------------------- -Esc.LWDisable clc - ldx EscSeqParamCnt - beq .8 - dex - bne .8 - - lda EscSeqParam - eor #7 - bne .8 - - ror LWFLG - -.8 clc - rts -*-------------------------------------- -Esc.DispAttr ldx EscSeqParamCnt - beq .8 - -.1 lda EscSeqParam-1,x - bne .2 - jsr RESETATTR - bra .7 - -.2 cmp #7 - bne .8 - stz INVFLG - -.7 dex - bne .1 - -.8 clc - rts -*-------------------------------------- -Esc.Query ldx EscSeqParamCnt - beq .8 - dex - bne .8 - - lda EscSeqParam - cmp #6 - bne .8 - - lda #C.ESC - jsr Char.Out.Put - lda #'[' - jsr Char.Out.Put - lda CV - inc - jsr Decimal.Out - lda #';' - jsr Char.Out.Put - lda CH - inc - jsr Decimal.Out - lda #'R' - jsr Char.Out.Put - -.8 clc - rts -*-------------------------------------- -Esc.Scroll ldx EscSeqParamCnt - bne .1 - - lda #0 - ldy #23 - bra .8 - -.1 cpx #2 - bne .9 - - lda EscSeqParam - dec - ldy EscSeqParam+1 - dey - -.8 sta SCROLLTOP - sty SCROLLBOT -.9 clc - rts -*-------------------------------------- -Esc.Erase ldx EscSeqParamCnt - - bne .1 - jmp CLREOL - -.1 lda EscSeqParam - cmp #1 - bne .2 - jmp CLRSOL - -.2 cmp #2 - bne .9 - jmp CLRLINE - -.9 clc - rts -*-------------------------------------- -Esc.Home ldx EscSeqParamCnt - bne .1 - stz CH - stz CV - clc - rts - -.1 ldx #1 - lda EscSeqParam - beq .2 - - ldx #24 - cmp #24 - bcs .2 - - tax - -.2 dex - stx CV - - dec EscSeqParamCnt - beq .8 - - ldx #1 - lda EscSeqParam+1 - beq .3 - - ldx #80 - cmp #80 - - bcs .3 - - tax - -.3 dex - stx CH - -.8 clc - rts -*-------------------------------------- -CUROFF lda CURON - beq CUREXIT.RTS - -CURBLNK lda A2osX.ASCREEN - cmp DEVID - beq CURBLNK1 - - lda CURON - bne CURBLNK.OFF - rts do not Light if screen is not active - -CURBLNK1 lda CURON - bne CURBLNK.OFF - - jsr GetCharAtCurPos - sta CURCHAR - and #$80 - eor #" " - bra CUREXIT - -CURBLNK.OFF lda CURCHAR - -CUREXIT jsr SetCharAtCurPos - - lda CURON - eor #CURSOR.BLINK.SPEED - sta CURON -CUREXIT.RTS rts -*-------------------------------------- -SetCharAtCurPos ldy CH - ldx CV -*-------------------------------------- -SetCharAtYX cmp #$40 - bcc .10 - cmp #$5F - bcs .10 - and #$3F - -.10 pha - - jsr SETUP.L1X - - tya - lsr - tay - - pla - bcs .1 - -* php -* sei - sta SETWRITEAUX -.1 sta (ZPBaseL1),y - sta CLRWRITEAUX -* plp - rts - -*.1 sta (ZPBaseL1),y -* rts -*-------------------------------------- -GetCharAtCurPos ldy CH - ldx CV -*-------------------------------------- -GetCharAtYX jsr SETUP.L1X - - tya - lsr - tay - - bcs .1 - -* php -* sei - sta SETREADAUX -.1 lda (ZPBaseL1),y - sta CLRREADAUX -* plp - rts - -*.1 lda (ZPBaseL1),y -* rts -*-------------------------------------- -SETUP.L1X lda BASEL,x - sta ZPBaseL1 - lda BASEH,x - sta ZPBaseL1+1 - rts -*-------------------------------------- -COPY.XtoL1 lda BASEL,x - sta ZPBaseL2 - lda BASEH,x - sta ZPBaseL2+1 - -* php -* sei - sta SETWRITEAUX - sta SETREADAUX - - jsr .1 - - sta CLRWRITEAUX - sta CLRREADAUX -* plp - -.1 ldy #39 - -.2 lda (ZPBaseL2),y - sta (ZPBaseL1),y - dey - bpl .2 - rts -*-------------------------------------- -Decimal.Out stz ZPTmpWord - stz ZPTmpWord+1 - - ldx #8 - sed - - tay - -.1 tya - asl - tay - lda ZPTmpWord - adc ZPTmpWord - sta ZPTmpWord - lda ZPTmpWord+1 - adc ZPTmpWord+1 - sta ZPTmpWord+1 - dex - bne .1 - - cld - - stz ZPTmpBool No leading 0 - - lda ZPTmpWord+1 - and #$0f - beq .2 - - dec ZPTmpBool non zero, print everything - - jsr Char.Out.Put30 - -.2 lda ZPTmpWord - lsr - lsr - lsr - lsr - bne .3 - - bit ZPTmpBool Print this digit ? - bpl .4 - -.3 jsr Char.Out.Put30 - -.4 lda ZPTmpWord - and #$0f -*-------------------------------------- -Char.Out.Put30 ora #$30 -Char.Out.Put pha - lda OutPtr - clc - adc OutCnt - and #OUTBUF.MAXLEN-1 - tax - pla - sta OutBuffer,x - inc OutCnt - rts -*-------------------------------------- -Char.Out.Get sec - lda OutCnt - beq .9 - dec OutCnt - ldx OutPtr - lda OutBuffer,x - pha - txa - inc - and #OUTBUF.MAXLEN-1 - sta OutPtr - pla - clc -.9 rts -*-------------------------------------- -GetPtrsAndCnt ldy #S.IOCTL.BUFPTR - lda (ZPIOCTL),y - sta ZPBufPtr - iny - lda (ZPIOCTL),y - sta ZPBufPtr+1 - -* ldy #S.IOCTL.BYTECNT - iny - - lda (ZPIOCTL),y - eor #$ff - sta ZPCount - iny - lda (ZPIOCTL),y - eor #$ff - sta ZPCount+1 - rts -*-------------------------------------- -DRV.CS.END -*-------------------------------------- -BASEL .HS 00.80.00.80.00.80.00.80.28.A8.28.A8.28.A8.28.A8.50.D0.50.D0.50.D0.50.D0 -BASEH .HS 04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07.04.04.05.05.06.06.07.07 -*-------------------------------------- -CtrlChars .HS 05080A0C0D151B -CtrlChars.Cnt .EQ *-CtrlChars -*-------------------------------------- -EscCodes .AZ "MDc" -EscCodes.Cnt .EQ *-EscCodes -EscSeqCmds .AS "hlmnrKH" -EscSeqCmds.Cnt .EQ *-EscSeqCmds -ENQ.String .AZ "XTERM" -*-------------------------------------- -KeyRemapped .HS 05080A0B0D15 L,D,U,CR,R -KeyRemappedIdx .HS 050004080C0F -KeyRemappedTbl .EQ * -KeyRemappedLEFT .HS 1B5B4400 esc[D -KeyRemappedDOWN .HS 1B5B4200 esc[B -KeyRemappedUP .HS 1B5B4100 esc[A -KeyRemappedCR .HS 0D0A00 crlf -KeyRemappedRGHT .HS 1B5B4300 esc[C -*-------------------------------------- -TELOPS.STATUS -*-------------------------------------- -WILLDO .DA #TELOPT.BINARY,#TELOPT.SGA -WILLDO.CNT .EQ *-WILLDO -WILLDONT .DA #TELOPT.TSPEED,#TELOPT.LINEMODE,#TELOPT.STATUS -WILLDONT.CNT .EQ *-WILLDONT -DOWILL .DA #TELOPT.BINARY,#TELOPT.SGA,#TELOPT.TTYPE,#TELOPT.NAWS -DOWILL.CNT .EQ *-DOWILL -DOWONT .DA #TELOPT.ECHO,#TELOPT.NEWENVIRON,#TELOPT.XDISPLOC,#TELOPT.TSPEED,#TELOPT.LFLOW -DOWONT.CNT .EQ *-DOWONT -SB.IS.TTYPE .DA #IAC,#SB,#TELOPT.TTYPE,#SB.IS - .AS 'XTERM' - .DA #IAC,#SE -SB.IS.TTYPE.LEN .EQ *-SB.IS.TTYPE -SB.IS.NAWS .DA #IAC,#SB,#TELOPT.NAWS,#SB.IS - .DA 80 - .DA 24 - .DA #IAC,#SE -SB.IS.NAWS.LEN .EQ *-SB.IS.NAWS -*-------------------------------------- -DEVID .BS 1 -CH .BS 1 -CV .BS 1 -LWFLG .BS 1 -INVFLG .BS 1 -SCROLLTOP .BS 1 -SCROLLBOT .BS 1 -CURON .BS 1 -CURCHAR .BS 1 -OutBuffer .BS OUTBUF.MAXLEN -OutPtr .BS 1 -OutCnt .BS 1 -bIACMode .BS 1 -IACBuf .BS OUTBUF.MAXLEN+1 -bEscMode .BS 1 -bEscModeCSI .BS 1 -bEscSeqInNum .BS 1 -EscSeq .BS ESCSEQ.MAXLEN+1 -EscSeqParamCnt .BS 1 -EscSeqParam .BS 4 -*-------------------------------------- -DIB .DA #S.DIB.S.WRITE+S.DIB.S.READ - .DA #0,#0,#0 - >PSTR "ANSI 80c Console" - .DA #S.DIB.T.CHAR - .DA #0 - .DA K.VER -*-------------------------------------- -DRV.END -MAN -SAVE USR/SRC/DRV/CONSOLE.DRV.S -ASM diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index 8b1c3dc6..e4b495a0 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -201,7 +201,7 @@ SYS.StrToF .EQ $76 SYS.StrToL .EQ $78 * .EQ $7A SYS.RealPath .EQ $7C -SYS.StrMatch .EQ $7E +* .EQ $7E *-------------------------------------- SYS.StrLen .EQ $80 SYS.StrCpy .EQ $82 diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt index 57e0bb9e..d257dacd 100644 --- a/SYS/KERNEL.S.JMP.txt +++ b/SYS/KERNEL.S.JMP.txt @@ -76,7 +76,7 @@ K.SYSCALL.JMP .DA 0 $00 .DA K.StrToL .DA 0 .DA K.RealPath - .DA K.StrMatch + .DA 0 *-------------------------------------- * Bank 2 *-------------------------------------- diff --git a/SYS/KERNEL.S.STDLIB.txt b/SYS/KERNEL.S.STDLIB.txt index dc7ea8d8..28601b20 100644 --- a/SYS/KERNEL.S.STDLIB.txt +++ b/SYS/KERNEL.S.STDLIB.txt @@ -448,84 +448,6 @@ K.RealPath.RemoveAtX .8 plx rts -*/-------------------------------------- -* # StrMatch -* Compare a String against pattern (e.g. '*test?.txt') -* ## C -* `int * strmatch ( char * s, const char * pattern );` -* ## ASM -* **In:** -* `>PUSHWI pattern` -* `>LDYAI s` -* `>SYSCALL strmatch` -* ## RETURN VALUE -* CC : match -* CS : no match -*\-------------------------------------- -K.StrMatch jsr MEM.SPtr1PPtr2 - - lda (ZPPtr2) Get pattern 1st byte - beq .8 Match always if empty - - ldy #0 - - bra .21 - -.1 inc ZPPtr2 Make PTR2 (pattern) advance to next char - bne .2 - inc ZPPtr2+1 - -.2 lda (ZPPtr2) get pattern char - beq .41 end of pattern... - -.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 - -.4 iny advance to next char to compare - bra .1 continue if remaining char in pattern - -.41 lda (ZPPtr1),y end of pattern, but end of string ? - - beq .8 yes, string matched entirely -* no, remaining char in string, no match -.9 sec - rts - -.5 inc ZPPtr2 Make PTR2 advance to next char - bne .6 - inc ZPPtr2+1 - -.6 lda (ZPPtr2) we have '*', last char of pattern ? - beq .8 yes, match everything, including empty string - - 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 - - iny - bra .1 go check remaining char in pattern... - -.8 clc - rts *-------------------------------------- MAN SAVE USR/SRC/SYS/KERNEL.S.STDLIB diff --git a/SYS/KERNEL.S.txt b/SYS/KERNEL.S.txt index 0536771a..cb92de5a 100644 --- a/SYS/KERNEL.S.txt +++ b/SYS/KERNEL.S.txt @@ -25,12 +25,16 @@ A2osX.MAIN .PH $1480 .INB USR/SRC/SYS/KERNEL.S.CORE .INB USR/SRC/SYS/KERNEL.S.DRV .INB USR/SRC/SYS/KERNEL.S.TERM + .LIST ON Mem.MLoMem .EQ * + .LIST OFF .EP A2osX.AUX .PH $1000 .INB USR/SRC/SYS/KERNEL.S.OSD .INB USR/SRC/SYS/KERNEL.S.SLIST + .LIST ON Mem.XLoMem .EQ * + .LIST OFF .EP A2osX.GP .PH $BD00 .INB USR/SRC/SYS/KERNEL.S.GP @@ -42,6 +46,7 @@ A2osX.D1 .PH $D000 .INB USR/SRC/SYS/KERNEL.S.STDIO .INB USR/SRC/SYS/KERNEL.S.STDLIB .INB USR/SRC/SYS/KERNEL.S.DEV + .INB USR/SRC/SYS/KERNEL.S.FIO .EP A2osX.D2 .PH $D000 .DA #RRAMWRAMBNK2 @@ -59,7 +64,6 @@ A2osX.E0 .PH $E000 .INB USR/SRC/SYS/KERNEL.S.TERMLC ********* TMP ***** go to A2osX.D1 .INB USR/SRC/SYS/KERNEL.S.PFT - .INB USR/SRC/SYS/KERNEL.S.FIO .INB USR/SRC/SYS/KERNEL.S.IO ********* TMP ***** go to A2osX.D2 .INB USR/SRC/SYS/KERNEL.S.MATH