From 9db2372429d300203c9ffbfa1546823aabc932ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Fri, 11 Oct 2019 15:06:33 +0200 Subject: [PATCH] Kernel 0.93+ --- .Floppies/A2OSX.BUILD.po | Bin 33553920 -> 33553920 bytes BIN/USERADD.S.txt | 9 +++ BIN/USERDEL.S.txt | 3 + BIN/X.CPMVRM.S.txt | 13 ++++ INC/A2osX.I.txt | 2 +- INC/LIBPAK.I.txt | 33 +++++---- LIB/LIBPAK.S.txt | 147 ++++++++++++++++++++++++++------------- SYS/KERNEL.S.JMP.txt | 10 +-- SYS/KERNEL.S.PWD.txt | 72 +++++++++++++++++++ SYS/KERNEL.S.PWDX.txt | 84 ++++++---------------- SYS/KERNEL.S.txt | 7 +- 11 files changed, 242 insertions(+), 138 deletions(-) create mode 100644 SYS/KERNEL.S.PWD.txt diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index e68f83830a0fa3b04a7ac84715cf64bdd9dbc7c9..fa5e5ca7fa1856d7048e50457dfe93a43741be25 100644 GIT binary patch delta 38738 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 GUHU)B@FY+G diff --git a/BIN/USERADD.S.txt b/BIN/USERADD.S.txt index 2acc5ed1..6a6f457b 100644 --- a/BIN/USERADD.S.txt +++ b/BIN/USERADD.S.txt @@ -106,6 +106,10 @@ CS.RUN >LDYAI S.PW >LDYA pData >SYSCALL putpw bcs .99 + + >SYSCALL FlushEtcPasswd + bcs .99 + lda #0 sec rts @@ -153,9 +157,14 @@ CS.RUN.ROOT ldy #0 >LEA.G PW+S.PW.PASSWD >SYSCALL strcmp bcs .99 + >LDYA pData >SYSCALL putpw bcs .9 + + >SYSCALL FlushEtcPasswd + bcs .9 + lda #0 sec .9 rts diff --git a/BIN/USERDEL.S.txt b/BIN/USERDEL.S.txt index ac8815a5..bf9ddbca 100644 --- a/BIN/USERDEL.S.txt +++ b/BIN/USERDEL.S.txt @@ -79,6 +79,9 @@ CS.RUN >LDYAI S.PW >SYSCALL putpw bcs .99 + >SYSCALL FlushEtcPasswd + bcs .99 + jsr CS.RUN.RmDir bcs .99 diff --git a/BIN/X.CPMVRM.S.txt b/BIN/X.CPMVRM.S.txt index 3d75df47..4b303826 100644 --- a/BIN/X.CPMVRM.S.txt +++ b/BIN/X.CPMVRM.S.txt @@ -287,6 +287,9 @@ CS.RUN.DIR .DO X.COPY.TO.DEST=1 bcs .1 cmp #3 beq .99 abort + + jsr CS.RUN.ToUpper + cmp #'N' bne .2 jmp CS.RUN.CR.NEXT no overwrite, nothing to do, no recurse @@ -336,6 +339,9 @@ CS.RUN.FILE jsr CS.RUN.FILE.MSG bcs .1 cmp #3 beq .99 abort + + jsr CS.RUN.ToUpper + cmp #'N' bne .11 jmp CS.RUN.CR.NEXT no overwrite exit @@ -619,6 +625,13 @@ CS.RUN.GetPathY lda (pData),y CS.RUN.IncCount >INCW.G Count rts *-------------------------------------- +CS.RUN.ToUpper cmp #'a' + bcc .8 + cmp #'z'+1 + bcs .8 + eor #$20 +.8 rts +*-------------------------------------- CS.DOEVENT sec rts *-------------------------------------- diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index 3aae7970..95c7f1a1 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -284,7 +284,7 @@ SYS.UnsetEnv .EQ $BE SYS.GetPWUID .EQ $D0 SYS.GetPWName .EQ $D2 SYS.PutPW .EQ $D4 -* .EQ $D6 +SYS.FlushEtcPasswd .EQ $D6 * .EQ $D8 * .EQ $DA diff --git a/INC/LIBPAK.I.txt b/INC/LIBPAK.I.txt index c18ef757..44f65266 100644 --- a/INC/LIBPAK.I.txt +++ b/INC/LIBPAK.I.txt @@ -2,23 +2,29 @@ NEW AUTO 3,1 .LIST OFF *-------------------------------------- -BYTE8.MAX .EQ 1+15 -REP.MAX .EQ 1+7 +REP.MAX .EQ 1+1254 BL.MIN .EQ 3 BL.MAX .EQ 3+63 + +STR.MIN .EQ 127 DISABLED +STR.MAX .EQ 3+15 *-------------------------------------- -PAK.B.BYTE8 .EQ %0.0000 -PAK.B.BYTE8.W .EQ 5 -PAK.B.TOP8 .EQ %10.000 +PAK.B.BYTE8.W .EQ 1 +PAK.B.BYTE8 .EQ %0 PAK.B.TOP8.W .EQ 5 -PAK.B.TOP16 .EQ %110.000 +PAK.B.TOP8 .EQ %10.000 PAK.B.TOP16.W .EQ 6 -PAK.B.TOP24 .EQ %1110.000 +PAK.B.TOP16 .EQ %110.000 PAK.B.TOP24.W .EQ 7 -PAK.B.REPn .EQ %11110.000 -PAK.B.REPn.W .EQ 8 -PAK.B.BL .EQ %11111 +PAK.B.TOP24 .EQ %1110.000 + +PAK.B.REP.W .EQ 5 +PAK.B.REP .EQ %11110 PAK.B.BL.W .EQ 5 +PAK.B.BL .EQ %11111 + +PAK.B.STR.W .EQ 6 DISABLED +PAK.B.STR .EQ %01.0000 *-------------------------------------- * Shunk Header : * WORD : Target UNCompressed Length @@ -38,10 +44,11 @@ S.PAKSTAT.TOP8 .EQ 4 S.PAKSTAT.TOP16 .EQ 6 S.PAKSTAT.TOP24 .EQ 8 S.PAKSTAT.BYTE8 .EQ 10 -S.PAKSTAT.REPN .EQ 12 -S.PAKSTAT.BL .EQ 14 +S.PAKSTAT.STR .EQ 12 +S.PAKSTAT.REPN .EQ 14 +S.PAKSTAT.BL .EQ 16 * -S.PAKSTAT .EQ 16 +S.PAKSTAT .EQ 18 *-------------------------------------- LIBPAK.Pak .EQ 4 *-------------------------------------- diff --git a/LIB/LIBPAK.S.txt b/LIB/LIBPAK.S.txt index 011bf5fc..d59ffc3f 100644 --- a/LIB/LIBPAK.S.txt +++ b/LIB/LIBPAK.S.txt @@ -76,7 +76,7 @@ Pak >PULLW Pak.SrcPtr jsr Pak.Run bcs .9 - jsr Pak.ComputeBLBits + jsr Pak.ComputeLenBits jsr Pak.BuildTOPTable jsr Pak.PrintStats @@ -109,7 +109,7 @@ Pak >PULLW Pak.SrcPtr Pak.Run >LDYA Pak.SrcPtr >STYA ZPSrcPtr - stz Pak.Byte8.Longest + stz Pak.Str.Longest stz Pak.Rep.Longest @@ -130,7 +130,7 @@ Pak.Run >LDYA Pak.SrcPtr stz Pak.RepCnt stz Pak.LastByte - stz Pak.Out.ByteCnt + stz Pak.Out.StrLen ldx #S.PAKSTAT.PASS1 bit Pak.bPass2 @@ -150,23 +150,23 @@ Pak.Run.1 inc Pak.SrcCnt inc Pak.SrcCnt+1 beq .8 0 byte left... -.1 jsr Pak.ScanBL +.1 jsr Pak.ScanRep bcs .2 - jsr Pak.PutBL - bcs .9 - - ldy Pak.BestBLLen - bra .6 - -.2 jsr Pak.ScanRep - bcs .20 - jsr Pak.PutRep bcs .9 ldy Pak.RepCnt stz Pak.RepCnt + bra .6 + +.2 jsr Pak.ScanBL + bcs .20 + + jsr Pak.PutBL + bcs .9 + + ldy Pak.BestBLLen .6 tya clc @@ -302,7 +302,19 @@ Pak.ScanBL >LDYA Pak.SrcPtr Start at beginning of Src buf rts *-------------------------------------- -Pak.ComputeBLBits +Pak.ComputeLenBits + ldx #8 + lda Pak.Rep.Longest + + dec + +.14 asl + bcs .15 + dex + bra .14 + +.15 stx Pak.Rep.LenBits + ldx #8 lda Pak.BL.Longest @@ -420,13 +432,16 @@ Pak.PutRep ldx #S.PAKSTAT.REPN Pak.PutRep.2 jsr Pak.Out.Flush bcs .9 + ldy #PAK.B.REP.W + lda #PAK.B.REP + jsr Pak.Out.PutYBits + bcs .9 + lda Pak.RepCnt dec remap 1-8 to 0-7 range - - ldy #PAK.B.REPn.W - ora #PAK.B.REPn + ldy Pak.Rep.LenBits - jmp Pak.Out.PutYBits + jmp Pak.Out.PutYBits .9 rts *-------------------------------------- @@ -518,13 +533,10 @@ Pak.PutByte8.2 ldy Pak.Shnk+S.PAKSHNK.TOPCNT dey bne .1 - ldx #S.PAKSTAT.BYTE8 - jsr Pak.UpdateStats - - inc Pak.Out.ByteCnt - ldy Pak.Out.ByteCnt - sta Pak.Out.ByteBuf,y - cpy #BYTE8.MAX + inc Pak.Out.StrLen + ldy Pak.Out.StrLen + sta Pak.Out.StrBuf,y + cpy #STR.MAX bcc .9 jmp Pak.Out.Flush @@ -579,7 +591,7 @@ Pak.Out.Init lda Pak.Shnk+S.PAKSHNK.BLBITS sta Pak.Out.Mask stz Pak.Out.Byte - stz Pak.Out.ByteCnt + stz Pak.Out.StrLen clc .9 rts @@ -591,37 +603,68 @@ Pak.Out.Close bit Pak.Out.Mask .8 clc rts *-------------------------------------- -Pak.Out.Flush lda Pak.Out.ByteCnt +Pak.Out.Flush lda Pak.Out.StrLen beq .8 - dec - ora #PAK.B.BYTE8 + cmp #STR.MIN + bcs .2 - ldy #PAK.B.BYTE8.W + ldx #0 + +.1 ldy #PAK.B.BYTE8.W + lda PAK.B.BYTE8 + jsr Pak.Out.PutYBits + bcs .9 + + inc Pak.Stat+S.PAKSTAT.BYTE8 + bne .10 + + inc Pak.Stat+S.PAKSTAT.BYTE8+1 + +.10 inx + lda Pak.Out.StrBuf,x + ldy #8 + jsr Pak.Out.PutYBits + bcs .9 + + cpx Pak.Out.StrLen + bne .1 + + bra .7 + +.2 dec + dec + dec + ora #PAK.B.STR + + ldy #PAK.B.STR.W jsr Pak.Out.PutYBits bcs .9 ldx #0 -.1 inx - lda Pak.Out.ByteBuf,x +.3 inx + lda Pak.Out.StrBuf,x ldy #8 jsr Pak.Out.PutYBits bcs .9 - cpx Pak.Out.ByteCnt - bne .1 + cpx Pak.Out.StrLen + bne .3 - cpx Pak.Byte8.Longest - bcc .2 + cpx Pak.Str.Longest + bcc .7 - stx Pak.Byte8.Longest + stx Pak.Str.Longest -.2 stz Pak.Out.ByteCnt + ldx #S.PAKSTAT.STR + jsr Pak.UpdateStats -.8 clc -.9 rts +.7 stz Pak.Out.StrLen + +.8 clc +.9 rts *-------------------------------------- Pak.Out.PutYBits phy @@ -699,20 +742,21 @@ Pak.PrintStats lda Pak.BL.OfsBitsL >PUSHB Pak.BL.Longest >PUSHW Pak.Stat+S.PAKSTAT.BL + >PUSHB Pak.REP.LenBits >PUSHB Pak.REP.Longest >PUSHW Pak.Stat+S.PAKSTAT.REPN - >PUSHB Pak.Byte8.Longest - >PUSHW Pak.Stat+S.PAKSTAT.BYTE8 + >PUSHB Pak.Str.Longest + >PUSHW Pak.Stat+S.PAKSTAT.STR - ldx #S.PAKSTAT.TOP24 + ldx #S.PAKSTAT.BYTE8 .1 >PUSHW Pak.Stat,x dex dex bpl .1 - >PUSHBI 23 + >PUSHBI 26 >LDYA L.MSG.Stats >SYSCALL printf @@ -765,9 +809,10 @@ MSG.Stats .AS "\r\nPass 1 : %5D\r\n" .AS "Top 8 : %5D\r\n" .AS "Top 16 : %5D\r\n" .AS "Top 24 : %5D\r\n" - .AS "Byte 8 : %5D, Longest : %d\r\n" - .AS "Rep N : %5D, Longest : %d\r\n" - .AZ "BLNK : %5D, Longest : %d (%d bits), Farest : %D (%d bits)\r\n" + .AS "Byte 8 : %5D\r\n" + .AS "String : %5D, Longest : %d\r\n" + .AS "Rep : %5D, Longest : %d (%d bits)\r\n" + .AZ "BL : %5D, Longest : %d (%d bits), Farest : %D (%d bits)\r\n" MSG.Top24 .AZ "Top : %5d, %h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h\r\n" TOP.Bits .DA #PAK.B.TOP8,PAK.B.TOP16,PAK.B.TOP24 TOP.BitCnt .DA #PAK.B.TOP8.W,#PAK.B.TOP16.W,#PAK.B.TOP24.W @@ -794,17 +839,19 @@ Pak.BestBL .BS 2 Pak.Cnt .BS 2 Pak.bStop .BS 1 -Pak.Byte8.Longest .BS 1 +Pak.Str.Longest .BS 1 Pak.Rep.Longest .BS 1 +Pak.Rep.LenBits .BS 1 + Pak.RepCnt .BS 1 Pak.LastByte .BS 1 Pak.Out.Byte .BS 1 Pak.Out.Mask .BS 1 -Pak.Out.ByteCnt .BS 1 -Pak.Out.ByteBuf .BS BYTE8.MAX +Pak.Out.StrLen .BS 1 +Pak.Out.StrBuf .BS STR.MAX *-------------------------------------- Pak.CntL .BS 256 Pak.CntH .BS 256 diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt index 928d97a6..e11f76b4 100644 --- a/SYS/KERNEL.S.JMP.txt +++ b/SYS/KERNEL.S.JMP.txt @@ -122,7 +122,7 @@ K.SYSCALL .DA 0 $00 .DA K.GetPWUID $D0 .DA K.GetPWName .DA K.PutPW - .DA 0 + .DA K.FlushEtcPasswd .DA 0 .DA 0 .DA 0 @@ -373,13 +373,13 @@ K.SYSCALL.BANK .DA #RRAMWRAMBNK1 $00 .DA #RRAMWRAMBNK2 .DA #$80 - .DA #$C0 $D0 : PWD + .DA #$C0 $D0 : PWDX .DA #$80 - .DA #$C0 PWD + .DA #$C0 PWDX .DA #$80 - .DA #$C0 PWD + .DA #$C0 PWDX .DA #$80 - .DA #RRAMWRAMBNK2 + .DA #0 PWD .DA #$80 .DA #RRAMWRAMBNK2 .DA #$80 diff --git a/SYS/KERNEL.S.PWD.txt b/SYS/KERNEL.S.PWD.txt new file mode 100644 index 00000000..a0e13d60 --- /dev/null +++ b/SYS/KERNEL.S.PWD.txt @@ -0,0 +1,72 @@ +NEW + AUTO 3,1 +*-------------------------------------- +K.FlushEtcPasswd + lda PWD.DBPtr + sta A1L + clc + adc PWD.DBSize + sta A2L + + lda PWD.DBPtr+1 + sta A1L+1 + adc PWD.DBSize+1 + sta A2L+1 + + >LDYA PWD.DBSize + >SYSCALL2 GetMem + bcs .9 + + stx .8+1 + >STYA A4L Save Destination Address in MAIN + + clc Aux To Main + jsr AuxMove + + >PUSHWZ Aux type + >PUSHBI S.FI.T.TXT + >PUSHBI O.WRONLY+O.CREATE + >LDYAI PWD.FILE + ldx #SYS.FOpen + jsr K.SYSCALL2 + bcc .1 + + pha + jsr .8 + pla + sec +.9 rts + +.1 sta .7+1 + + >PUSHW PWD.DBSize + lda .8+1 + jsr K.getmemptr + >PUSHYA + lda .7+1 + ldx #SYS.FWrite + jsr K.SYSCALL2 + bcc .7 + + pha + jsr .7 + pla + + sec + rts + +.7 lda #$ff SELF MODIFIED + ldx #SYS.fclose + jsr K.SYSCALL2 +.8 lda #$ff + jmp K.freemem SELF MODIFIED +*-------------------------------------- +PWD.hDB .BS 1 +PWD.DBPtr .BS 2 +PWD.DBSize .BS 2 +PWD.FILE .AZ "${ROOT}ETC/PASSWD" +*-------------------------------------- +MAN +SAVE USR/SRC/SYS/KERNEL.S.PWD +LOAD USR/SRC/SYS/KERNEL.S +ASM diff --git a/SYS/KERNEL.S.PWDX.txt b/SYS/KERNEL.S.PWDX.txt index ccc978e6..61d7336c 100644 --- a/SYS/KERNEL.S.PWDX.txt +++ b/SYS/KERNEL.S.PWDX.txt @@ -38,16 +38,19 @@ K.GetPWUID sta ZPPtr1+1 jsr PWD.GetByte get UID cmp ZPPtr1+1 beq PWD.GetPW.8 + jsr PWD.NextLine bra .1 + PWD.GetPW.8 ldx ZPPtr2+1 beq .8 Dry run, no output jmp PWD.Record2PW + .8 clc a = UID rts + PWD.GetPW.9 lda #E.IPWDDB - sec - rts + .HS 2C BIT ABS PWD.GetPW.99 lda #E.IUSR sec @@ -83,16 +86,22 @@ K.GetPWName >STYA TXTPTR .2 iny jsr SHARED.TXTPTR.GetY beq .4 + cmp (ZPPtr3),y beq .2 + .3 jsr PWD.NextLine bra .1 + .4 lda (ZPPtr3),y cmp #':' - bne .3 + bne .3 + ldx ZPPtr2+1 beq .8 + jmp PWD.Record2PW + .8 iny jsr PWD.NextString skip PASSWORD jmp PWD.GetByte get UID @@ -113,9 +122,11 @@ K.PutPW >STYA ZPPtr2 *-------------------------------------- lda PWD.hDB bne .1 + ldy #S.PW.UID jsr SHARED.TXTPTR.GetY bne PWD.GetPW.RTS Must be ROOT user + jsr PWD.GetRecordLen tay lda #0 @@ -127,15 +138,19 @@ K.PutPW >STYA ZPPtr2 >STYA PWD.DBPtr stx PWD.hDB jmp .8 + .1 jsr K.GetmemPtr >STYA PWD.DBPtr ldy #S.PW.PASSWD jsr SHARED.TXTPTR.GetY bne .12 + jsr PWD.DeleteRecord bcc .80 + rts + .12 jsr PWD.DeleteRecord bcc .11 user exits.. jsr PWD.GetUID new user, get UID @@ -180,71 +195,14 @@ K.PutPW >STYA ZPPtr2 jsr K.Freemem .8 jsr PWD.StoreRecord -.80 inc PWD.bDirty - clc + +.80 clc .99 rts + .9 lda #E.IPWDDB sec rts *-------------------------------------- -PWD.Save lda PWD.bDirty - beq .9 - - lda PWD.DBPtr - sta A1L - clc - adc PWD.DBSize - sta A2L - - lda PWD.DBPtr+1 - sta A1L+1 - adc PWD.DBSize+1 - sta A2L+1 - >LDYA PWD.DBSize - >SYSCALL2 GetMem - bcs .9 - - stx .8+1 - >STYA A4L Save Destination Address in MAIN - - clc Aux To Main - jsr AuxMove - >PUSHWZ Aux type - >PUSHBI S.FI.T.TXT - >PUSHBI O.WRONLY+O.CREATE - >LDYAI PWD.FILE - ldx #SYS.FOpen - jsr K.SYSCALL2 - bcc .1 - - pha - jsr .8 - pla - sec -.9 rts -.1 sta .7+1 - >PUSHW PWD.DBSize - lda .8+1 - jsr K.getmemptr - >PUSHYA - lda .7+1 - ldx #SYS.FWrite - jsr K.SYSCALL2 - bcc .2 - pha - jsr .7 - pla - sec - rts - -.2 stz PWD.bDirty - -.7 lda #$ff SELF MODIFIED - ldx #SYS.fclose - jsr K.SYSCALL2 -.8 lda #$ff - jmp K.freemem SELF MODIFIED -*-------------------------------------- * PRIVATE *-------------------------------------- PWD.GetUID >LDYA PWD.DBPtr diff --git a/SYS/KERNEL.S.txt b/SYS/KERNEL.S.txt index 35f8053b..306d34c7 100644 --- a/SYS/KERNEL.S.txt +++ b/SYS/KERNEL.S.txt @@ -69,17 +69,12 @@ A2osX.E0 .PH $E000 .INB USR/SRC/SYS/KERNEL.S.TERMLC .INB USR/SRC/SYS/KERNEL.S.SHARED .INB USR/SRC/SYS/KERNEL.S.STDIO2 + .INB USR/SRC/SYS/KERNEL.S.PWD ********* TMP ***** go to A2osX.D1 .INB USR/SRC/SYS/KERNEL.S.IO .INB USR/SRC/SYS/KERNEL.S.PIPE ********* TMP ***** go to A2osX.D2 *-------------------------------------- -PWD.bDirty .BS 1 -PWD.hDB .BS 1 -PWD.DBPtr .BS 2 -PWD.DBSize .BS 2 -PWD.FILE .AZ "${ROOT}ETC/PASSWD" -*-------------------------------------- DevMgr.Stat .DA DevMgr.FreeMem DevMgr.Free .DA DevMgr.FreeMem .DA DevMgr.HiMem