From 4e7d011929c547a5550b9d87db73e95ffc21bd05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Tue, 17 Apr 2018 16:25:45 +0100 Subject: [PATCH] Kernel 0.9.1 : KERNEL, Preemtive mode, KERNEL & LIB Cleaning --- .Docs/LIBCRYPT.md | 35 ++++++ .Floppies/A2OSX.BOOT.po | Bin 143360 -> 143360 bytes .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes .Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes .Tools/docgen.cmd | 5 + BIN/MD5.S.txt | 172 +++++++++++++++++++++++++++ INC/A2osX.I.txt | 2 +- INC/LIBCRYPT.I.txt | 4 +- LIB/LIBCRYPT.S.txt | 243 ++++++++++++++++++++------------------- SYS/KERNEL.S.ENV.txt | 59 +++------- SYS/KERNEL.S.MEM.txt | 42 +++---- SYS/KERNEL.S.STDIO.txt | 13 +-- SYS/KERNEL.S.STDLIB.txt | 2 +- 13 files changed, 381 insertions(+), 196 deletions(-) create mode 100644 .Docs/LIBCRYPT.md create mode 100644 BIN/MD5.S.txt diff --git a/.Docs/LIBCRYPT.md b/.Docs/LIBCRYPT.md new file mode 100644 index 00000000..4dfa8a0f --- /dev/null +++ b/.Docs/LIBCRYPT.md @@ -0,0 +1,35 @@ +*** Auto generated by docgen.cmd *** + +# MD5 ++ Return MD5 Hash for input String + +## In : + + PUSHW = PTR to Src String + + PUSHW = PTR to Dst MessageDigest Buffer + +## Out : + + CC + +# MD5Init + +## In : + +## Out : + + A = hMem To S.MD5 + +# MD5Update (Append "$80" & Padding & original size) + +## In: +* PUSHW DATA LEN +* PUSHW DATA PTR +* PUSHB MD5 Context hMem + +## Out : + +# MD5Finalize + +## In : + + PUSHW = MessageDigest (PSTR, 16 Bytes, 32 Chars) +Ending 0 + + PUSHB = hMem To S.MD5 + +## Out: diff --git a/.Floppies/A2OSX.BOOT.po b/.Floppies/A2OSX.BOOT.po index d3036873dc7461cebd7fd15e47ec2b34b121634f..81dcfa6cb5ca977c5c9860eb4c6ea24072964bdd 100644 GIT binary patch delta 5595 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 delta 5383 zcmZu#4OA0XzP~e>3=mPmhZqHQa6tT^Dcx!}&#he$(4awhLhaVw9_PK+zM`+Tr+t0( z6O+22$R-#W3gjKIX?CHFYuo@^eV!xd*e@kf+419q2$=~jh*(#eTC3EmdHQ+# z`@i@8fB&!hpZ~oxhQ3HcU!*gckeO5Gvh#`5Xy{{U)Q^xjQAi{`J2p`)5;(e&yI~`m z^owB-h7c~YOE{5@ZF&-SwRlzj`pLMDe*t%kNZK@6kf<-OBxe!~#mvB-&HdO0^koSF%tc6)VNucXci++m^l;R?_%Tg5`nWAzP*iHK(eOaMzGq=@$E|d zORQ~1^6F4nN>XB0t{#U-q6$kUA|p=3E

|6{y!2PZ&$Sh-B#36OoZ{O(jXo$2=Ux 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 diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index c38a7c451f532d3b8d6637b44bac26487350dbe9..569aa9c7db8e1de35397cb82f82eee1225db5bad 100644 GIT binary patch delta 4351 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 diff --git a/.Floppies/A2OSX.SRC.po b/.Floppies/A2OSX.SRC.po index bea9b21f3b961662f71a6dc0ce8ab27709b3881e..f15f6084642fc9d758ddf8966643fbd6d74cb51c 100644 GIT binary patch delta 20056 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 diff --git a/.Tools/docgen.cmd b/.Tools/docgen.cmd index 2b0046f5..47fed748 100644 --- a/.Tools/docgen.cmd +++ b/.Tools/docgen.cmd @@ -30,6 +30,11 @@ set SRCDIR=%~dp0..\LIB set FILTER=LIBBLKDEV.S*.txt Call :SCAN +set DOCFILE=%~dp0..\.Docs\LIBCRYPT.md +set SRCDIR=%~dp0..\LIB +set FILTER=LIBCRYPT.S*.txt +Call :SCAN + echo. echo All done : !c! Files scanned. echo. diff --git a/BIN/MD5.S.txt b/BIN/MD5.S.txt new file mode 100644 index 00000000..d4eb19d9 --- /dev/null +++ b/BIN/MD5.S.txt @@ -0,0 +1,172 @@ +NEW +PREFIX /A2OSX.BUILD +AUTO 4,1 + .LIST OFF + .OP 65C02 + .OR $2000 + .TF /A2OSX.BUILD/BIN/MD5 +*-------------------------------------- + .INB /A2OSX.BUILD/INC/MACROS.I + .INB /A2OSX.BUILD/INC/A2OSX.I + .INB /A2OSX.BUILD/INC/LIBCRYPT.I +*-------------------------------------- +ZPPtr1 .EQ ZPBIN +ZPPtr2 .EQ ZPBIN+2 +*-------------------------------------- +* File Header (16 Bytes) +*-------------------------------------- +CS.START cld + jmp (.1,x) + .DA #$61 6502,Level 1 (65c02) + .DA #1 BIN Layout Version 1 + .DA 0 + .DA CS.END-CS.START CS + .DA DS.END-DS.START DS + .DA #16 SS + .DA #4 ZP + .DA 0 +*-------------------------------------- +* Relocation Table +*-------------------------------------- +.1 .DA CS.INIT + .DA CS.RUN + .DA CS.DOEVENT + .DA CS.QUIT +L.LIBCRYPT .DA LIBCRYPT +L.MSG.USAGE .DA MSG.USAGE +L.MSG.INIT .DA MSG.INIT +L.MSG.OK .DA MSG.OK +L.MSG.ERR .DA MSG.ERR + .DA 0 +*-------------------------------------- +CS.INIT ldy #S.PS.ARGC + lda (pPs),y + beq .99 + +.1 >INC.G ArgIndex + + >SYSCALL GetArg.A + bcs .7 + + >STYA ZPPtr1 + + lda (ZPPtr1) + cmp #'-' + bne .4 + + ldy #1 + lda (ZPPtr1),y + beq .99 + + ldx OptionList + +.2 cmp OptionList,x + beq .3 + dex + bne .2 + +.99 >LDYA L.MSG.USAGE + >SYSCALL PrintF.YA + lda #K.E.SYN + sec + rts + +.3 ldy OptionVars-1,x + lda #$80 + sta (pData),y + bra .1 + +.4 >LDA.G hFullPath + bne .99 + +.7 >LDA.G bText + +.8 >LDYA L.LIBCRYPT + >SYSCALL LoadLib.YA + sta hLIBCRYPT + +* lda (pPs) +* ora #S.PS.F.EVENT Now accept events +* sta (pPs) + + clc + rts +*-------------------------------------- +CS.RUN + + + + >LDYA L.MSG.OK + >SYSCALL PrintF.YA + lda #0 + sec + rts + +.9 pha + >PUSHA + >LDYA L.MSG.ERR + >SYSCALL PrintF.YA + pla + sec + rts +*-------------------------------------- +CS.DOEVENT sec + rts +*-------------------------------------- +CS.QUIT >LDA.G hDataBuf + beq .1 + >SYSCALL FreeMem.A + +.1 lda hLIBCRYPT + beq .8 + + >SYSCALL UnloadLib.A + +.8 clc + rts +*-------------------------------------- +A2CharAX pha + lsr + lsr + lsr + lsr + and #$0F + ora #$30 + cmp #'9'+1 + bcc .1 + adc #6 +.1 tax + pla + and #$0F + ora #$30 + cmp #'9'+1 + bcc .8 + adc #6 +.8 rts +*-------------------------------------- +CS.END +*-------------------------------------- +OptionList >PSTR "Dd" +OptionVars .DA #bText,#bText +*-------------------------------------- +MSG.USAGE .AZ "Usage : MD5 [ -d input_text | infile… ] \r\n" +MSG.OK .AZ "[OK]\r\n" +MSG.ERR .AZ "[%h]\r\n" +MSG.INIT .AZ "Computing %s ..." +*-------------------------------------- +LIBCRYPT .AZ "libcrypt.o" +hLIBCRYPT .BS 1 +*-------------------------------------- + .DUMMY + .OR 0 +DS.START +ArgIndex .BS 1 +bText .BS 1 +hFullPath .BS 1 +hDataBuf .BS 1 +hMD5CtxBuf .BS 1 +DS.END .ED +*-------------------------------------- +MAN +SAVE /A2OSX.SRC/BIN/MD5.S +ASM diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index 18bc72b7..d9d30060 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -431,7 +431,7 @@ S.EVT.W2 .EQ 6 S.EVT .EQ 8 *-------------------------------------- S.TIME.CENTURY .EQ 0 19,20,21.... -S.TIME.YEAR .EQ 1 0.99 +S.TIME.YEAR .EQ 1 0..99 S.TIME.MONTH .EQ 2 1..12 S.TIME.DAY .EQ 3 1..31 S.TIME.HOUR .EQ 4 0..23 diff --git a/INC/LIBCRYPT.I.txt b/INC/LIBCRYPT.I.txt index f30e6477..09a0ff64 100644 --- a/INC/LIBCRYPT.I.txt +++ b/INC/LIBCRYPT.I.txt @@ -6,10 +6,10 @@ AUTO 6 .LIST OFF .OP 65C02 *-------------------------------------- -LIBCRYPT.MD5PStrA .EQ 4 +LIBCRYPT.MD5 .EQ 4 LIBCRYPT.MD5Init .EQ 6 LIBCRYPT.MD5Update .EQ 8 -LIBCRYPT.MD5FinalizeA .EQ 10 +LIBCRYPT.MD5Finalize .EQ 10 *-------------------------------------- * S.MD5 STRUCT *-------------------------------------- diff --git a/LIB/LIBCRYPT.S.txt b/LIB/LIBCRYPT.S.txt index e84f0845..c589bc29 100644 --- a/LIB/LIBCRYPT.S.txt +++ b/LIB/LIBCRYPT.S.txt @@ -10,13 +10,11 @@ AUTO 4,1 .INB /A2OSX.BUILD/INC/A2OSX.I .INB /A2OSX.BUILD/INC/LIBCRYPT.I *-------------------------------------- -ZPTmpPtr1 .EQ ZPLIB -ZPTmpPtr2 .EQ ZPLIB+2 -ZPTmpPtr3 .EQ ZPLIB+4 -ZPTmpPtr4 .EQ ZPLIB+6 -ZPDataPtr .EQ ZPLIB+8 -ZPDataLen .EQ ZPLIB+10 -ZPChunkLen .EQ ZPLIB+12 +ZPCtxPtr .EQ ZPLIB +ZPDataPtr .EQ ZPLIB+2 +ZPDataLen .EQ ZPLIB+4 +ZPChunkLen .EQ ZPLIB+6 +ZPHashPtr .EQ ZPLIB+8 *-------------------------------------- * DWORD Macros : Do NOT disturb carry with cpx, cpy... *-------------------------------------- @@ -103,88 +101,90 @@ CS.START cld *-------------------------------------- .1 .DA LIB.LOAD .DA LIB.UNLOAD - .DA MD5PStrA + .DA MD5 .DA MD5Init .DA MD5Update - .DA MD5FinalizeA + .DA MD5Finalize .DA 0 *-------------------------------------- LIB.LOAD LIB.UNLOAD clc rts -*-------------------------------------- -* MD5PStrA -* in : -* A = hMem To PSTR -* out : -* A = hMem To MessageDigest -*-------------------------------------- -MD5PStrA >SYSCALL GetMemPtr.A - >STYA ZPTmpPtr3 1 and 2 used by other MD5 functions - ldy #0 - lda (ZPTmpPtr3),y get PStr len - sta ZPTmpPtr4 ZPTmpPtr4 = str len - stz ZPTmpPtr4+1 0,PSTR len <= 255 - inc ZPTmpPtr3 - bne .1 - inc ZPTmpPtr3+1 Make DATA skip PSTR Len Byte +*/-------------------------------------- +* # MD5 +* Return MD5 Hash for input String +* ## In : +* PUSHW = PTR to Src String +* PUSHW = PTR to Dst MessageDigest Buffer +* ## Out : +* CC +*\-------------------------------------- +MD5 >PULLW ZPHashPtr + >PULLYA + >STYA ZPDataPtr + + >SYSCALL StrLen.YA + >STYA ZPDataLen + .1 jsr MD5Init bcs .9 + pha save MD5 Context hMem - >PUSHW ZPTmpPtr4 Push LEN - >PUSHW ZPTmpPtr3 Push DATA + + jsr MD5Update.I + jsr MD5Finalize + pla - pha - >PUSHA Push MD5 Context - jsr MD5Update - pla get back MD5 Context - pha - jsr MD5FinalizeA - plx get back MD5 Context hMem - pha save MessageDigest hMem - txa - >SYSCALL FreeMem.A Free MD5 Context - pla get back MessageDigest hMem + >SYSCALL FreeMem.A Free MD5 Context + clc .9 rts -*-------------------------------------- -* MD5Init -* In : -* Out : +*/-------------------------------------- +* # MD5Init +* ## In : +* ## Out : * A = hMem To S.MD5 -*-------------------------------------- +*\-------------------------------------- MD5Init >LDYAI S.MD5.SIZE >SYSCALL GetMem.YA bcs .9 - >STYA ZPTmpPtr1 + + >STYA ZPCtxPtr + ldy #0 + .1 lda MD5.ABCDINIT,y - sta (ZPTmpPtr1),y + sta (ZPCtxPtr),y iny cpy #16 bne .1 + lda #0 -.2 sta (ZPTmpPtr1),y + +.2 sta (ZPCtxPtr),y iny cpy #S.MD5.SIZE Includes S.MD5.FINALIZED Flag bne .2 + txa clc .9 rts -*-------------------------------------- -* MD5Update (Append "$80" & Padding & original size) -* In: -* PULLB MD5 Context hMem -* PULLW DATA PTR -* PULLW DATA LEN -*-------------------------------------- +*/-------------------------------------- +* # MD5Update (Append "$80" & Padding & original size) +* ## In: +* PUSHW DATA LEN +* PUSHW DATA PTR +* PUSHB MD5 Context hMem +* ## Out : +*\-------------------------------------- MD5Update >PULLA get MD5 Context >SYSCALL GetMemPtr.A - >STYA ZPTmpPtr1 get MD5 Context + >STYA ZPCtxPtr get MD5 Context >PULLW ZPDataPtr get DATA >PULLW ZPDataLen get LEN - ldy #S.MD5.FINALIZED - lda (ZPTmpPtr1),y + +MD5Update.I ldy #S.MD5.FINALIZED + lda (ZPCtxPtr),y beq .1 sec rts @@ -218,7 +218,7 @@ MD5Update >PULLA get MD5 Context bra .52 .53 ldy #S.MD5.EXTRABIT Mark MD5 Context as Appended lda #$80 - sta (ZPTmpPtr1),y + sta (ZPCtxPtr),y lda ZPChunkLen cmp #56 Enough room for BITCOUNT ? bcs .58 no @@ -238,53 +238,58 @@ MD5Update >PULLA get MD5 Context bcc .82 inc ZPDataPtr+1 .82 bra .1 -*-------------------------------------- -* MD5FinalizeA -* In : -* A = hMem To S.MD5 -* Out: -* A = MessageDigest (PSTR, 16 Bytes, 32 Chars) -*-------------------------------------- -MD5FinalizeA >SYSCALL GetMemPtr.A - >STYA ZPTmpPtr1 get MD5 Context - ldy #S.MD5.FINALIZED - lda (ZPTmpPtr1),y +*/-------------------------------------- +* # MD5Finalize +* ## In : +* PUSHW = MessageDigest (PSTR, 16 Bytes, 32 Chars) +Ending 0 +* PUSHB = hMem To S.MD5 +* ## Out: +*\-------------------------------------- +MD5Finalize >PULLA + >SYSCALL GetMemPtr.A + >STYA ZPCtxPtr get MD5 Context + + >PULLW ZPHashPtr + +MD5Finalize.I ldy #S.MD5.FINALIZED + + lda (ZPCtxPtr),y bne .11 + jsr MD5ExtraChunk -.11 >LDYAI 33 Len + 32 Digits - >SYSCALL GetMem.YA - bcs .9 - >STYA ZPTmpPtr2 - phx save hMem for return - lda #32 - sta (ZPTmpPtr2) - inc ZPTmpPtr2 - bne .10 - inc ZPTmpPtr2+1 -.10 ldy #S.MD5.ABCD0 -.1 lda (ZPTmpPtr1),y + +.11 ldy #S.MD5.ABCD0 + +.1 lda (ZPCtxPtr),y lsr lsr lsr lsr tax lda MD5.DIGITS,x - sta (ZPTmpPtr2) - inc ZPTmpPtr2 + sta (ZPHashPtr) + inc ZPHashPtr bne .2 - inc ZPTmpPtr2+1 -.2 lda (ZPTmpPtr1),y + + inc ZPHashPtr+1 + +.2 lda (ZPCtxPtr),y and #$0F tax lda MD5.DIGITS,x - sta (ZPTmpPtr2) - inc ZPTmpPtr2 + sta (ZPHashPtr) + inc ZPHashPtr bne .3 - inc ZPTmpPtr2+1 + + inc ZPHashPtr+1 + .3 iny cpy #S.MD5.ABCD0+16 bne .1 - pla get back hMem + + lda #0 + sta (ZPHashPtr) + clc .9 rts *-------------------------------------- @@ -292,12 +297,12 @@ MD5FinalizeA >SYSCALL GetMemPtr.A *-------------------------------------- * MD5AppendBitCount * In : -* ZPTmpPtr1 = MD5 Context +* ZPCtxPtr = MD5 Context *-------------------------------------- MD5AppendBitCount ldx #56 ldy #S.MD5.BITCOUNT Append 8 Bytes of BITCOUNT -.1 lda (ZPTmpPtr1),y +.1 lda (ZPCtxPtr),y sta MD5.BUFFER64,x inx iny @@ -305,13 +310,13 @@ MD5AppendBitCount bne .1 ldy #S.MD5.FINALIZED Mark MD5 Context as Finalized lda #$80 - sta (ZPTmpPtr1),y + sta (ZPCtxPtr),y rts *-------------------------------------- * MD5UpdateBitCount * In : * CL = Size (in bytes) to add to MD5 context -* ZPTmpPtr1 = MD5 Context +* ZPCtxPtr = MD5 Context *-------------------------------------- MD5UpdateBitCount stz ZPChunkLen+1 @@ -324,17 +329,17 @@ MD5UpdateBitCount rol ZPChunkLen+1 clc ldy #S.MD5.BITCOUNT - adc (ZPTmpPtr1),y - sta (ZPTmpPtr1),y + adc (ZPCtxPtr),y + sta (ZPCtxPtr),y iny lda ZPChunkLen+1 - adc (ZPTmpPtr1),y - sta (ZPTmpPtr1),y + adc (ZPCtxPtr),y + sta (ZPCtxPtr),y bcc .8 .1 iny - lda (ZPTmpPtr1),y + lda (ZPCtxPtr),y inc - sta (ZPTmpPtr1),y + sta (ZPCtxPtr),y bne .8 cpy #7 bne .1 @@ -342,18 +347,18 @@ MD5UpdateBitCount *-------------------------------------- * MD5ExtraChunk * In : -* ZPTmpPtr1 = MD5 Context +* ZPCtxPtr = MD5 Context *-------------------------------------- MD5ExtraChunk ldy #S.MD5.FINALIZED lda #$80 - sta (ZPTmpPtr1),y Mark MD5 Context as "finalized" + sta (ZPCtxPtr),y Mark MD5 Context as "finalized" ldx #0 ldy #S.MD5.EXTRABIT Extra Bit already appended ? - lda (ZPTmpPtr1),y + lda (ZPCtxPtr),y bne .1 lda #$80 sta MD5.BUFFER64 Add extra bit to buffer - sta (ZPTmpPtr1),y Mark Extrabit added + sta (ZPCtxPtr),y Mark Extrabit added inx .1 stz MD5.BUFFER64,x pad with "0"... inx @@ -364,13 +369,13 @@ MD5ExtraChunk ldy #S.MD5.FINALIZED *-------------------------------------- * MD5UpdateABCD0 * In: -* ZPTmpPtr1 = MD5 Context +* ZPCtxPtr = MD5 Context *-------------------------------------- MD5UpdateABCD0 ldy #0 .1 clc ADC32 A+A0->A0, B, C, D.... .2 lda MD5.ABCD,y - adc (ZPTmpPtr1),y - sta (ZPTmpPtr1),y + adc (ZPCtxPtr),y + sta (ZPCtxPtr),y iny tya and #3 @@ -381,13 +386,13 @@ MD5UpdateABCD0 ldy #0 *-------------------------------------- * MD5Transform * In: -* ZPTmpPtr1 = MD5 Context +* ZPCtxPtr = MD5 Context * 512 Bits Padded chunk in MD5.BUFFER64 * Out: * Updated MD5.ABCD *-------------------------------------- MD5Transform ldy #15 init ABCD Chunk with Context ABCD0 -.1 lda (ZPTmpPtr1),y +.1 lda (ZPCtxPtr),y sta MD5.ABCD,y dey bpl .1 @@ -466,18 +471,6 @@ MD5.NEXTi >MOV32 MD5.D,MD5.DTemp jmp MD5.0015 *-------------------------------------- CS.END -MD5.ABCD -MD5.A .BS 4 Chunk Level,A,B,C,D -MD5.B .BS 4 -MD5.C .BS 4 -MD5.D .BS 4 -MD5.DTemp .BS 4 -MD5.F .BS 4 -MD5.F1 .BS 4 -MD5.F2 .BS 4 -MD5.i .BS 1 -MD5.BUFFER64 .BS 64 -*-------------------------------------- MD5.ABCDINIT .HS 01234567.89ABCDEF.FEDCBA98.76543210 *-------------------------------------- MD5.s .DA #7,#12,#17,#22,#7,#12,#17,#22,#7,#12,#17,#22,#7,#12,#17,#22 @@ -509,6 +502,18 @@ MD5.K .HS 78A46AD7.56B7C7E8.DB702024.EECEBDC1 *-------------------------------------- MD5.DIGITS .AS "0123456789ABCDEF" *-------------------------------------- +MD5.ABCD +MD5.A .BS 4 Chunk Level,A,B,C,D +MD5.B .BS 4 +MD5.C .BS 4 +MD5.D .BS 4 +MD5.DTemp .BS 4 +MD5.F .BS 4 +MD5.F1 .BS 4 +MD5.F2 .BS 4 +MD5.i .BS 1 +MD5.BUFFER64 .BS 64 +*-------------------------------------- MAN SAVE /A2OSX.SRC/LIB/LIBCRYPT.S ASM diff --git a/SYS/KERNEL.S.ENV.txt b/SYS/KERNEL.S.ENV.txt index f29235f5..5c1964af 100644 --- a/SYS/KERNEL.S.ENV.txt +++ b/SYS/KERNEL.S.ENV.txt @@ -9,13 +9,13 @@ AUTO 4,1 * X = hMem to Expanded String (C-String) * Y,A = PTR to Expanded String *\-------------------------------------- -K.ExpandStr.YA stz ENV.hStr Reset Intermediate string... +K.ExpandStr.YA stz ENV.hStr Reset Intermediate string... .1 >STYA ZPPtr2 - stz ENV.BufLen init Expanded String len=0 - stz ENV.bFound No var found yet + stz ENV.BufLen init Expanded String len=0 + stz ENV.bFound No var found yet - stz ENV.bNoExp Reset no expand flag + stz ENV.bNoExp Reset no expand flag ldy #0 @@ -32,7 +32,7 @@ K.ExpandStr.YA stz ENV.hStr Reset Intermediate string... lda ENV.bNoExp eor #$ff - sta ENV.bNoExp toggle flag + sta ENV.bNoExp toggle flag bra .11 .21 bit ENV.bNoExp @@ -44,20 +44,20 @@ K.ExpandStr.YA stz ENV.hStr Reset Intermediate string... stx ENV.BufLen bra .11 -.23 ldx ENV.bInVar already in a var? +.23 ldx ENV.bInVar already in a var? bne .3 yes... cmp #'$' no, found one ? bne .22 no, store... - sta ENV.bFound Toggle flag + sta ENV.bFound Toggle flag sta ENV.bInVar bra .11 skip this char .3 cmp #'{' we are in var, "{" after "$"? bne .31 - ldx ENV.VarLen No char in var yet ? + ldx ENV.VarLen No char in var yet ? beq .11 normal, "${" syntax is ok,skip bne .5 not allowed char in varname, end of var @@ -65,7 +65,7 @@ K.ExpandStr.YA stz ENV.hStr Reset Intermediate string... .31 cmp #'}' end of var? beq .50 - jsr ENV.IsVarChar + jsr MEM.IsIDValid _,.,a-z,A-Z,0-9 ? bcc .32 yes, add to varname ldx ENV.VarLen @@ -95,13 +95,13 @@ K.ExpandStr.YA stz ENV.hStr Reset Intermediate string... ply restore index in string... .52 jmp .10 reset start flag and continue -.8 ldx ENV.VarLen end of STR,are we in a var? +.8 ldx ENV.VarLen end of STR,are we in a var? beq .80 no...exit... stz ENV.VarName,x - jsr ENV.GetValue yes, expand and add to STR + jsr ENV.GetValue yes, expand and add to STR -.80 lda ENV.hStr working from our temp string ? +.80 lda ENV.hStr working from our temp string ? beq .81 no... jsr K.FreeMem.A yes, discard.... @@ -122,27 +122,6 @@ K.ExpandStr.YA stz ENV.hStr Reset Intermediate string... .9 rts *-------------------------------------- -ENV.IsVarChar cmp #'_' - beq .8 - - cmp #'0' - bcc .9 - cmp #'9'+1 - bcc .8 - - cmp #'A' - bcc .9 - cmp #'Z'+1 - -* bcc .8 - rts - -.8 clc - rts - -.9 sec - rts -*-------------------------------------- ENV.GetValue jsr ENV.ExpandSysVar bcc .9 @@ -327,11 +306,11 @@ K.GetEnv.YA >STYA ZPPtr1 *\-------------------------------------- K.UnsetEnv.YA >STYA ZPPtr1 Store VAR Name K.UnsetEnv.I jsr ENV.FindVarP1 - bcs .8 not found, quit + bcs K.UnsetEnv.I.8 not found, quit jsr ENV.DelVarP3 Ptr3 -> ENVNAME -.8 clc +K.UnsetEnv.I.8 clc rts *-------------------------------------- * PRIVATE @@ -350,21 +329,17 @@ ENV.ExpandSysVar bne .9 lda ENV.VarName - cmp #'0'-1 $0...$9 ?? - bcc .1 - cmp #'9'+1 + jsr MEM.IsDigit $0...$9 ?? bcs .1 + and #$0F jsr K.GetArg.A - bcs .8 Arg# is undefined, do not append anything + bcs K.UnsetEnv.I.8 Arg# is undefined, do not append anything >STYA ZPPtr3 jmp ENV.AddP3ToBuf -.8 clc - rts - .1 ldx #ENV.SysVarsJmp-ENV.SysVars-1 .2 cmp ENV.SysVars,x diff --git a/SYS/KERNEL.S.MEM.txt b/SYS/KERNEL.S.MEM.txt index 768579ad..08f0f8a3 100644 --- a/SYS/KERNEL.S.MEM.txt +++ b/SYS/KERNEL.S.MEM.txt @@ -561,34 +561,36 @@ K.SListFree.A MEM.GetKeyCharY sta CLRREADAUX lda (ZPSListKeyPtr),y sta SETREADAUX - beq .9 + beq MEM.IsDigit.9 - cmp #'.' - beq .8 +MEM.IsIDValid cmp #'.' + beq MEM.IsDigit.8 cmp #'_' - beq .8 + beq MEM.IsDigit.8 - cmp #'0' - bcc .9 - cmp #'9'+1 - bcc .8 - - cmp #'A' - bcc .9 - cmp #'Z'+1 - bcc .8 - +MEM.IsDigitOrL cmp #'z'+1 + bcs MEM.IsDigit.RTS cmp #'a' - bcc .9 - cmp #'z'+1 - bcs .9 + bcs MEM.IsDigit.8 -.8 clc +MEM.IsDigitOrUC cmp #'Z'+1 + bcs MEM.IsDigit.RTS + cmp #'A' + bcs MEM.IsDigit.8 + +MEM.IsDigit cmp #'9'+1 + bcs MEM.IsDigit.RTS + cmp #'0' + bcs MEM.IsDigit.8 + +MEM.IsDigit.9 sec + +MEM.IsDigit.RTS rts + +MEM.IsDigit.8 clc rts -.9 sec - rts *-------------------------------------- MEM.SetKeyCharY sta CLRWRITEAUX sta (ZPSListKeyPtr),y diff --git a/SYS/KERNEL.S.STDIO.txt b/SYS/KERNEL.S.STDIO.txt index a4554abe..ca3249dc 100644 --- a/SYS/KERNEL.S.STDIO.txt +++ b/SYS/KERNEL.S.STDIO.txt @@ -666,7 +666,7 @@ K.SScanF jsr PullP1P2P3 * stz ASCBUF .20 lda (ZPPtr1) - jsr STDIO.IsDigit + jsr MEM.IsDigit bcs .21 phx * inc ASCBUF @@ -802,7 +802,7 @@ K.PrintF.YA >STYA ZPPtr1 sta PADCHAR no, this is the first 0, so make it PADCHAR bra .2 -.4 jsr STDIO.IsDigit +.4 jsr MEM.IsDigit bcs .99 .5 and #$0F we have a digit @@ -1090,15 +1090,6 @@ STDIO.IOERR lda #MLI.E.IO sec rts *-------------------------------------- -STDIO.IsDigit cmp #'0' - bcc .1 - cmp #'9'+1 - rts -.1 sec - rts -*-------------------------------------- -STDIO.AT10 -*-------------------------------------- PADLEN .BS 1 PADCHAR .BS 1 *-------------------------------------- diff --git a/SYS/KERNEL.S.STDLIB.txt b/SYS/KERNEL.S.STDLIB.txt index e6650280..04f36f63 100644 --- a/SYS/KERNEL.S.STDLIB.txt +++ b/SYS/KERNEL.S.STDLIB.txt @@ -129,7 +129,7 @@ STDLIB.Dec2Hex jsr STDLIB.32.Clear lda (ZPPtr2),y beq .8 - jsr STDIO.IsDigit + jsr MEM.IsDigit bcs .8 phy Save Y, pointing to next char