From 399bdc0caee209c5e058371d0a712ff68b133cea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Thu, 28 Sep 2017 17:39:12 +0200 Subject: [PATCH] Kernel 0.9.1 : Code reorganization & move to CSTR, new RealPath.YA API --- .Docs/KERNEL.md | 21 +++--- .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes .Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes BIN/LS.S.txt | 24 ++----- BIN/MD.S.txt | 15 +++-- BIN/X.FILEENUM.S.txt | 9 +++ INC/A2osX.I.txt | 2 +- SBIN/SHELL.S.CMD.txt | 135 ++++++++++----------------------------- SBIN/SHELL.S.CSH.txt | 4 -- SBIN/SHELL.S.txt | 16 ++--- SYS/KERNEL.S.ARG.txt | 5 +- SYS/KERNEL.S.JMP.txt | 2 +- SYS/KERNEL.S.STDLIB.txt | 101 +++++++++++++++++++++++++++++ 13 files changed, 181 insertions(+), 153 deletions(-) diff --git a/.Docs/KERNEL.md b/.Docs/KERNEL.md index 14f767bb..26fbf626 100644 --- a/.Docs/KERNEL.md +++ b/.Docs/KERNEL.md @@ -1,14 +1,5 @@ *** Auto generated by docgen.cmd *** -# GetArgC -Returns argument count in the process command line. - -## In: -+ none. - -## Out: -+ A = Command line Arg Count (Including /path/cmd) - # GetArg.A ## In: @@ -613,6 +604,18 @@ Convert String to 32 bits int ## Out: +# RealPath.YA +Return the canonicalized absolute pathname + +## In : ++ Y,A = Ptr to Relative Filename (C-String) + +## Out : ++ CC : success + + Y,A = Ptr to Full Path (C-String) + + X = hMem of Full Path ++ CS : A = Error Code + # StrLen.YA Returns Length of C-String diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 228f53be6661f1c535fdc7696f59654b6ab4f45e..77687b28113e4a57e2a8c0831ee504b8fb316820 100644 GIT binary patch delta 4021 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�@+O1 zOg~2Fjux$;{|z0}AkVv1^rPPy-PJ|+(@e`QNvd4C>A}q#AKtR*Q9Rg9qtTor^dD)6 znlpHmJ~rynAT6R_VE$2u4${Wa6~*WhI%Y+l_D>Ee@D7@ymMD6twF-*bgWteo>bEpb z^GWkt=AW9+nE%DR#H=vqnlG3?F_&t4D_bg8YL({g`c);~lEbC@OP|tzP_p0fKF_ZjyYUof^B4;x=GK52Z)c(3KAdC?4$@(T@~(Q-whywsH5JXR6R6WS#W zzEV76;+6#R@sJXGAIH>~olOm@_&sbo7|3wHiLNW5Qw%|4PkDpvNCr1XeMetP`0ln6AW+=s4u3*mO@Gn-o+%#v@oy zl-15sL6!HH;G(m*L+7V@b$`>}`9fbYS)M*!Z=pY1*`#{gSI|t6MRuILygw(|4fCJN+S_Jl&i?b!_0f7Xq7xS?;d5os-Q@B zt&c{x2B#3M_ER3!5w9dxY7u1PiUp+6TXVw8?LtVfCH0fL~H5SnXN`-%gE6x z?Mgddti%gt_%6d5(M!?~wG9(YVFmirvIlj7CW3|eh*nT}bYTo~b_DZtBF~hVkWE^P zhiaHzCiH-`yY!HidB=nbPH%A=h_FU{e}lHS z13dlT9@wm)N={6;6fXe%X@V!4LIwZ zWlYeBa+$-GXh}O60852~I{vPgg3g)UL0vdfDb)Ha0WW9njD|-uT3|t!95L~~oppYC zMELbpBqWdX2fDkRk?!tpVK4N85VxIYNq}>-u=;-wMd?#DYyRhIB8!bVJC0JesHO~9+EhATp2g|vno;K=G zBgVZITnTZYfe{p7qlwGI9~-$`vg$-kTZw8*wpCnEJeB$ zL`sFF&@GF2Le8Qz>^5=9_?`-m9G;LGY>@uL6v;mw?>8~_8l-H$*D_FL8K|}l)L87e zzrwwZeJQB2K6{wrwlpK|5w>VS!$-}#& z!Uwz|(k8U)aBb9`0SZ2Uwr6+L)e?2)fpk?Ncu%xMiOSjE4GJOUWJ`1#emL6N(ES;a zlRySB&>R&cP~$+%lT-#2gc&$}mdogAjt)DZrQyJ5!_859#O%(FtaPVE?sv;0-*rnP z-y?S$ted3`F}H$k@kg;S#wCl@<5s7--_W@X4;0@+RNjd6nDjyKG`X$ zoq&cxBf%TvN;}Dy=8FR@(MY8`H?opblxE`k&l3I`#$rmlR~B=|#M{X#-cDVyGVPkR zI(2W1k6n)aI`(NS8iSG%`e;ZFA*rCkV=)K^oMKi;_v3az6aWRS^EyOqin5F2;n|=R z)cia&*ja^&V8JsioYr`#Tq@+l89_}*`P5WOkc9a!p`j}dKj*a7PEhGg z?nn|f%&V)=iw{jQlfFsy<&~FzaQWrSr0&d}Dw%4UBHS5Ke)P)fD~(r(ybjPQim#8q z7(Wm{7_W$uKcXiO^H2k-QNHjQMIDR|MUAo5vG^C2*KS_Bdrdi$Gs8Sli?mtfOvAM% zH#w)EoUJu6?pky|a+{dTwMbX66L;a^UARllQWIE^h0kU2^8p9$#DQiedo_BJ{+!vn z8u`j{wCo-@K0dEJu55xY4KO>|H0yF{^ZC{bSENCjWW(m_1z z(Z@V`ay>7=MQQ&9qxU;KDrdG&eG22KmRnA)iIpA|KMK|=UaWPJ6U9!HX&pz!w2ooN zQQfj1svEM@4QU$o^`Ocu!_R0r1vcp60DVr6N0?jVXuJGOF^C7Xc96GUKo2Ev*1C;$ z{01|00oBN%Ll(Kq@tMJo5X$|=RHw9yF4gA?k6lE{)XiEv0y^lXzKCk*0Q2}oq{}BN zI5)SVPx?!9zx_sz+lBJXa?eyppl! z>Q3CYjw|K|=Kr>BN{`m&yL;-6(jNFW9@>CmxG$aDw{o1nqh#Lyl|DDr#@ z%I1{L1z5_r;ZRuc2;GX?kpCI0J)p7iQvZ99{o4jF#iorF+xqD`K{^}e=fZvp_^=s-yYqYj&2?%Hh|Xt53Ku?;-?gbhx!zc1!C z!}v5dahRJEqy0{TP<5hm(F$Y#mMNgM33@Qq{{NAJF^$^VFQTk!+=Vj=Td@hZ@1@LXfLyrM`3EFwP zV*$o7Z3`_3YFOb5-Zx0^KX=~kxD%S2yu+ux9h{rE!^^t)ym`1u0o=3%xEH5w`~?8D gYf{oRDean+bxkI9O(u6urgTlFc1_9$CzlNW7f(m>qyPW_ diff --git a/.Floppies/A2OSX.SRC.po b/.Floppies/A2OSX.SRC.po index f82cc21e5053e6acf5f211f6d3e1775fa9a871fc..f51b24e94076d7f48d37980feded4229332c8b39 100644 GIT binary patch delta 31851 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.G ArgCount - -.1 >SYSCALL GetArg.A +CS.INIT +.1 >INC.G ArgCount + >SYSCALL GetArg.A + bcs .6 >STYA ZPPtr1 - - >SYSCALL PrintF.YA - lda #'|' - >SYSCALL PutChar.A - + lda (ZPPtr1) cmp #'-' bne .4 @@ -84,16 +77,13 @@ CS.INIT ldy #S.PS.ARGC .3 ldy OptionVars-1,x lda #$80 sta (pData),y - bra .6 + bra .1 .4 >LDYA ZPPtr1 jsr InitSrcDirYA bcs .9 - >LDA.G ArgCount - dec - sta (pData),y - bne .1 scan for any other args + bra .1 scan for any other args .6 >LDA.G index do we have a Source dir ? bne .8 diff --git a/BIN/MD.S.txt b/BIN/MD.S.txt index a096d4a5..4fafc328 100644 --- a/BIN/MD.S.txt +++ b/BIN/MD.S.txt @@ -21,7 +21,7 @@ CS.START cld .DA CS.END-CS.START CS .DA DS.END-DS.START DS .DA #16 SS - .DA 0 ZP + .DA #0 ZP .DA 0 *-------------------------------------- * Relocation Table @@ -35,17 +35,18 @@ CS.START cld CS.INIT clc rts *-------------------------------------- -CS.RUN >SYSCALL GetArgC - cmp #1 - beq .99 - - lda #1 +CS.RUN lda #1 >SYSCALL GetArg.A + bcs .99 + >SYSCALL GetFullPath.YA bcs .9 - + phy + pha txa >STA.G hFullPath + pla + ply >SYSCALL MKDir.YA bcs .9 diff --git a/BIN/X.FILEENUM.S.txt b/BIN/X.FILEENUM.S.txt index 66691e89..1f67ab8c 100644 --- a/BIN/X.FILEENUM.S.txt +++ b/BIN/X.FILEENUM.S.txt @@ -23,6 +23,15 @@ InitSrcDirYA >SYSCALL GetFullPath.YA txa >STA.G hFullPath + >LDYA ZPPtr1 + >SYSCALL PrintF.YA + lda #'|' + >SYSCALL PutChar.A + lda #13 + >SYSCALL PutChar.A + lda #10 + >SYSCALL PutChar.A + ldy #1 lda (ZPPtr1),y beq .5 we have '/' diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index f692a00b..2b5f25be 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -163,7 +163,7 @@ SYS.AToL .EQ $74 * .EQ $76 * .EQ $78 * .EQ $7A -* .EQ $7C +SYS.RealPath.YA .EQ $7C * .EQ $7E *-------------------------------------- SYS.StrLen.YA .EQ $80 diff --git a/SBIN/SHELL.S.CMD.txt b/SBIN/SHELL.S.CMD.txt index 694a9063..8dbf54bb 100644 --- a/SBIN/SHELL.S.CMD.txt +++ b/SBIN/SHELL.S.CMD.txt @@ -211,15 +211,6 @@ Cmd.Exec.EXT.TXT >PUSHYA >PUSHW ZPCMDBuf >SYSCALL StrCat - - >LDYA ZPCMDBuf - >SYSCALL PrintF.YA - lda #'!' - >SYSCALL PutChar.A - lda #13 - >SYSCALL PutChar.A - lda #10 - >SYSCALL PutChar.A *-------------------------------------- * BIN : Launch "/PATH/CMD ARGS" *-------------------------------------- @@ -232,16 +223,7 @@ Cmd.Exec.EXT.BIN >PUSHW ZPPTR2 >PUSHW ZPCMDBuf >SYSCALL StrCat - - >LDYA ZPCMDBuf - >SYSCALL PrintF.YA - lda #'!' - >SYSCALL PutChar.A - lda #13 - >SYSCALL PutChar.A - lda #10 - >SYSCALL PutChar.A - + .1 >LDA.G CMD.bStartProc asl >LDYA ZPCMDBuf @@ -276,103 +258,54 @@ Cmd.Exec.EXT.SEP *-------------------------------------- * Internal Commands *-------------------------------------- -Cmd.Exec.CD lda (ZPPTR2) - bne Cmd.Exec.CD1 - Cmd.Exec.PWD ldy #S.PS.hPREFIX lda (pPs),y >SYSCALL GetMemPtr.A >SYSCALL PrintF.YA jmp Cmd.Exec.ECHO.CR +*-------------------------------------- +Cmd.Exec.CD lda (ZPPTR2) + bne .1 -Cmd.Exec.CD1 lda (ZPPTR2) Get ARG - cmp #'/' Full Path? - bne .20 + >LDYA L.ENV.HOME + >SYSCALL GetEnv.YA + bcs Cmd.Exec.PWD - sta (ZPCMDBuf) + >SYSCALL ExpandStr.YA + bcs .9 + + bra .4 + +.1 ldy #0 - ldy #1 strlen = 1 - lda #0 - sta (ZPCMDBuf),y - bra .1 - -.20 ldy #S.PS.hPREFIX no, init target prefix with actual prefix - lda (pPs),y - >SYSCALL GetMemPtr.A - >PUSHYA - >PUSHW ZPCMDBuf - >SYSCALL StrCpy - - ldy #0 - -.10 iny - lda (ZPCMDBuf),y - bne .10 get strlen ... - -.1 ldx #0 dot counter for /./ & /../ detection - -.12 lda (ZPPTR2) - bne .21 last char... - - dey - lda (ZPCMDBuf),y +.2 lda (ZPPTR2),y + tax iny - cmp #'/' - beq .8 + lda (ZPPTR2),y + bne .2 + cpx #'/' + beq .3 + lda #'/' - sta (ZPCMDBuf),y + sta (ZPPTR2),y iny - bra .13 + lda #0 + sta (ZPPTR2),y -.21 inc ZPPTR2 - bne .11 - inc ZPPTR2+1 +.3 >LDYA ZPPTR2 Get ARG + >SYSCALL RealPath.YA + bcs .9 -.11 sta (ZPCMDBuf),y - iny - cmp #'/' - beq .13 +.4 >STYA ZPPTR2 + txa + >STA.G CMD.hFullpath - cmp #'.' a dot ? - bne .1 no, reset counter... - inx - bra .12 - -.13 txa counting dot ? - beq .12 - cpx #2 /../ ? - beq .14 - - dex /./ ? - bne Cmd.Exec.ERRSYN - dey - dey remove "./" at the end of path.... - bra .1 - -.14 dey remove "../" at the end of path : "/dir1/../" - dey - dey - beq Cmd.Exec.ERRSYN path was "/../".....error.... - -.16 dey path is something like : /dir1/, skip ending '/' - lda (ZPCMDBuf),y path is something like : /dir1 - cmp #'/' - bne .16 - - bra .1 Start over... - -.8 lda #0 - sta (ZPCMDBuf),y - cpy #1 - beq .80 we have '/' go change prefix - - >LDYA ZPCMDBuf - >SYSCALL PrintF.YA - lda #'!' - >SYSCALL PutChar.A + ldy #1 + lda (ZPPTR2),y + beq .8 we have '/' >PUSHEA.G CMD.Stat - >PUSHW ZPCMDBuf + >PUSHW ZPPTR2 >SYSCALL STAT bcs .9 @@ -381,7 +314,7 @@ Cmd.Exec.CD1 lda (ZPPTR2) Get ARG cmp #$0F Directory ? bne Cmd.Exec.ERRSYN -.80 >LDYA ZPCMDBuf +.8 >LDYA ZPPTR2 >SYSCALL NewStr.YA bcs .9 phx diff --git a/SBIN/SHELL.S.CSH.txt b/SBIN/SHELL.S.CSH.txt index f3f302f6..9923e18a 100644 --- a/SBIN/SHELL.S.CSH.txt +++ b/SBIN/SHELL.S.CSH.txt @@ -134,10 +134,6 @@ CSH.Run jsr CSH.GetBuf jsr CSH.RestorePtr Restore ptr to get full cmd line to execute - >LDA.G hCmdBuf Get the buffer - >SYSCALL GetMemPtr.A - >STYA ZPCMDBuf - jsr CSH.GetCharNB ldy #0 diff --git a/SBIN/SHELL.S.txt b/SBIN/SHELL.S.txt index 89f145a3..40fec7fb 100644 --- a/SBIN/SHELL.S.txt +++ b/SBIN/SHELL.S.txt @@ -64,6 +64,7 @@ L.MSG.CSHERR .DA MSG.CSHERR L.ENV.PATH .DA ENV.PATH L.ENV.PWD .DA ENV.PWD L.ENV.PS1 .DA ENV.PS1 +L.ENV.HOME .DA ENV.HOME L.FMT.DATE .DA FMT.DATE L.FMT.TIME .DA FMT.TIME J.ESC .DA CmdLine.BS left arrow @@ -187,11 +188,7 @@ CS.RUN.EXIT lda #0 CS.RUN.EXIT.ERR sec CS.RUN.EXIT.RTS rts *-------------------------------------- -CS.RUN.READ >LDA.G hCmdBuf Get the buffer - >SYSCALL GetMemPtr.A - >STYA ZPCMDBuf - - lda #0 reset it +CS.RUN.READ lda #0 reset Buffer sta (ZPCMDBuf) .1 >SYSCALL Sleep @@ -205,13 +202,7 @@ CS.RUN.READ >LDA.G hCmdBuf Get the buffer >PUSHW ZPCMDBuf - lda #CMD.VarName - clc - adc pData - tay - lda pData+1 - adc #0 - >PUSHYA + >PUSHEA.G CMD.VarName >SYSCALL SetEnv rts *-------------------------------------- @@ -480,6 +471,7 @@ CS.END ENV.PATH >CSTR "PATH" ENV.PWD >CSTR "PWD" ENV.PS1 >CSTR "PS1" +ENV.HOME >CSTR "HOME" *-------------------------------------- INTCMDS >CSTR "CD" >CSTR "DATE" diff --git a/SYS/KERNEL.S.ARG.txt b/SYS/KERNEL.S.ARG.txt index e1ae2f9f..dd17af2f 100644 --- a/SYS/KERNEL.S.ARG.txt +++ b/SYS/KERNEL.S.ARG.txt @@ -39,7 +39,10 @@ K.GetArg.A pha save requested arg# inc ZPPtr1+1 .5 dex - bne .1 + bne .1 stop here.... + + lda (ZPPtr1) at end of ARGS[] ? + beq .9 .8 >LDYA ZPPtr1 .80 clc diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt index 5096a07f..61f8ba47 100644 --- a/SYS/KERNEL.S.JMP.txt +++ b/SYS/KERNEL.S.JMP.txt @@ -77,7 +77,7 @@ K.SYSCALL.JMP .DA 0 $00 .DA 0 .DA 0 .DA 0 - .DA 0 + .DA K.RealPath.YA .DA 0 *-------------------------------------- * Bank 2 diff --git a/SYS/KERNEL.S.STDLIB.txt b/SYS/KERNEL.S.STDLIB.txt index 38dad09c..a310b4f3 100644 --- a/SYS/KERNEL.S.STDLIB.txt +++ b/SYS/KERNEL.S.STDLIB.txt @@ -201,6 +201,107 @@ HEXBUF.ROL asl HEXBUF HEXBUF .BS 4 32 bits max BCDBUF .BS 5 5, enough to handle 10 digits (32bits) ASCBUF .BS 12 LEN + sign + 10 digits ($FFFFFFFF=4.294.967.295) +*/-------------------------------------- +* # RealPath.YA +* Return the canonicalized absolute pathname +* ## In : +* Y,A = Ptr to Relative Filename (C-String) +* ## Out : +* CC : success +* Y,A = Ptr to Full Path (C-String) +* X = hMem of Full Path +* CS : A = Error Code +*\-------------------------------------- +K.RealPath.YA >STYA ZPPtr1 + + ldx #$ff + + lda (ZPPtr1) + beq .10 + + cmp #'/' full path starting with '/'? + beq .2 yes, do not append to current prefix + +.10 ldy #S.PS.hPREFIX + lda (pPs),y + jsr K.GetMemPtr.A + >STYA ZPPtr2 + + ldy #$ff + +.1 iny + lda (ZPPtr2),y + beq .2 + inx + sta K.Buf256,x + bra .1 + +.2 ldy #$ff + +.3 iny + inx + lda (ZPPtr1),y + sta K.Buf256,x + bne .3 X=LEN, K.Buf256 = /dir1..../file(/) /x0 +*\-------------------------------------- +.4 dex + beq .89 we have '/'....nothing to do... + lda K.Buf256,x + cmp #'/' + bne .5 + + dex + +.5 ldy #0 dot counter=0 + +.6 lda K.Buf256,x + cmp #'/' + beq .8 + cmp #'.' + bne .7 + iny + .HS 2C BIT ABS + ldy #0 + +.7 dex + bra .6 always, should end with a '/' + +.8 dey we found "/." ? + bmi .80 + bne .9 + + + bra .80 + +.9 dey we found "/.." ? + bne .90 "/......" ...mmm...syntax error + + + + + +.80 txa + beq .89 + dex + bra .5 + +.89 >LDYAI K.Buf256 + >SYSCALL PrintF.YA + lda #'@' + >SYSCALL PutChar.A + lda #13 + >SYSCALL PutChar.A + lda #10 + >SYSCALL PutChar.A + + >DEBUG + + >LDYAI K.Buf256 + jmp K.NewStr.YA + +.90 lda #SYSMGR.ERRSYN + sec + rts *-------------------------------------- MAN SAVE /A2OSX.SRC/SYS/KERNEL.S.STDLIB