From ea86f48bc7873eaa299833cf91694333ff250248 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Fri, 8 Sep 2017 16:49:23 +0200 Subject: [PATCH] Kernel 0.9.1 : Code reorganization & move to CSTR (SHELL) --- .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes .Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes INC/A2osX.I.txt | 2 +- INC/MACROS.I.txt | 28 ++++++- SBIN/SHELL.S.CMD.txt | 131 +++++++++++++++++--------------- SBIN/SHELL.S.CSH.txt | 159 ++++++++++++++------------------------- SBIN/SHELL.S.HIS.txt | 84 ++++++++------------- SBIN/SHELL.S.txt | 57 +++++++------- SYS/KERNEL.S.BIN.txt | 2 +- SYS/KERNEL.S.CORE.txt | 98 ++++++++++++++++++++---- SYS/KERNEL.S.ENV.txt | 9 ++- SYS/KERNEL.S.FIO.txt | 8 +- SYS/KERNEL.S.JMP.txt | 2 +- SYS/KERNEL.S.PS.txt | 86 +-------------------- 14 files changed, 309 insertions(+), 357 deletions(-) diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 244588dd1b8f8407c9bf2dc3640fd6e45cc89dfb..8e0356035a58e627f0cdbe0fa0dd0845359ebda2 100644 GIT binary patch delta 8815 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 I-00!|0}TYTl>h($ delta 8767 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

myw*PO}!% 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 P6vfNZ2Wk(8T)qDfF;z0= delta 40024 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 atMiI!%bd>QStDv*4A3RiHh&i>LDYAI CmdLine.MAX+1 >SYSCALL GetMem.YA bcs .9 txa - >SETG.A hCmdBuf + >STA.G hCmdBuf .9 rts *-------------------------------------- * ZPCMDBuf : Remove extra SPACE & comment @@ -68,19 +68,29 @@ Cmd.Parse.NextC lda (ZPPtr1) Cmd.Exec stz bStartProc >LDYA ZPCMDBuf + >SYSCALL PrintF.YA + jsr Cmd.Exec.ECHO.CR + + >LDYA ZPCMDBuf + Cmd.ExecYA >SYSCALL ExpandStr.YA >STYA ZPPtr1 Ptr to CMD txa - >SETG.A CMD.hCmdLine + >STA.G CMD.hCmdLine + >LDYA ZPPtr1 + >SYSCALL PrintF.YA + jsr Cmd.Exec.ECHO.CR + >DEBUG + ldy #$ff CMD Len .1 iny lda (ZPPtr1),y Get CMD char... beq .2 - cmp #" " we reached blank between CMD ARGS + cmp #' ' we reached blank between CMD ARGS bne .1 .2 phy Y=CMD len @@ -97,7 +107,7 @@ Cmd.ExecYA >SYSCALL ExpandStr.YA pha cmp (ZPPtr2) Same Len ? - beq .5 + beq .51 .4 inx inx @@ -110,8 +120,9 @@ Cmd.ExecYA >SYSCALL ExpandStr.YA inc ZPPtr2+1 bra .3 -.5 tay - dey +.51 tay + +.5 dey lda (ZPPtr1),y cmp #'a' To Uppercase @@ -128,9 +139,11 @@ Cmd.ExecYA >SYSCALL ExpandStr.YA bne .5 ply get back Cmd Len + lda (ZPPtr1),y beq .7 ARGS = "" iny skip " " + .7 tya clc adc ZPPtr1 @@ -150,7 +163,7 @@ Cmd.ExecYA >SYSCALL ExpandStr.YA Cmd.Exec.Done php pha - >GETG.A CMD.hCmdLine + >LDA.G CMD.hCmdLine >SYSCALL FreeMem.A pla plp @@ -237,7 +250,7 @@ Cmd.Exec.EXT.BIN >PUSHWI UsrBuf256 >SYSCALL StrCat - lda ARGS + lda (ZPPTR2) beq .1 inc UsrBuf256 Add a space.... @@ -245,7 +258,7 @@ Cmd.Exec.EXT.BIN lda #' ' sta UsrBuf256,y - >PUSHW L.ARGS + >PUSHW ZPPTR2 >PUSHWI UsrBuf256 >SYSCALL StrCat @@ -261,7 +274,7 @@ Cmd.Exec.EXT.BIN *-------------------------------------- * Internal Commands *-------------------------------------- -Cmd.Exec.CD lda ARGS +Cmd.Exec.CD lda (ZPPTR2) bne Cmd.Exec.CD1 Cmd.Exec.PWD ldy #S.PS.hPREFIX @@ -273,7 +286,7 @@ Cmd.Exec.PWD ldy #S.PS.hPREFIX rts Cmd.Exec.CD1 stz UsrBuf256 - lda ARGS+1 + cmp #'/' Full Path? beq .1 @@ -284,7 +297,7 @@ Cmd.Exec.CD1 stz UsrBuf256 >PUSHWI UsrBuf256 >SYSCALL StrCpy -.1 >PUSHW L.ARGS Append ARG to buffer +.1 >PUSHW ZPPTR2 Append ARG to buffer >PUSHWI UsrBuf256 >SYSCALL StrCat @@ -381,15 +394,15 @@ Cmd.Exec.ERRSYN lda #SYSMGR.ERRSYN rts *-------------------------------------- Cmd.Exec.STARTPROC - lda ARGS + lda (ZPPTR2) beq Cmd.Exec.ERRSYN sec ror bStartProc - >LDYA L.ARGS + >LDYA ZPPTR2 jmp Cmd.ExecYA *-------------------------------------- -Cmd.Exec.SET lda ARGS +Cmd.Exec.SET lda (ZPPTR2) bne Cmd.Exec.SETVAR ldy #S.PS.hENV @@ -432,38 +445,41 @@ Cmd.Exec.SET lda ARGS .8 clc .9 rts -Cmd.Exec.SETVAR tax - lda ARGS,x - cmp #'=' ARGS ends with =, UnsetEnv - beq .2 +Cmd.Exec.SETVAR ldy #0 + + lda (ZPPTR2),y + iny + cmp #'=' string is '=value' ? + beq .99 syntax error -.1 dex +.1 lda (ZPPTR2),y + iny beq .3 no =, GetEnv - lda ARGS,x cmp #'=' ARGS contains =, PutEnv bne .1 - cpx #1 string is '=value' ? - beq .99 syntax error + lda (ZPPTR2),y + beq .2 "VAR=" go UnsetEnv - >LDYA L.ARGS String is VAR=VALUE... + >LDYA ZPPTR2 String is VAR=VALUE... >SYSCALL PutEnv.YA rts -.2 dec ARGS String is "VAR=", Remove endig '=' - >LDYA L.ARGS String is "VAR"... +.2 dey String is "VAR=", Remove endig '=' + sta (ZPPTR2),y + >LDYA ZPPTR2 String is "VAR"... >SYSCALL UnsetEnv.YA rts * Print requested VAR -.3 >LDYA L.ARGS +.3 >LDYA ZPPTR2 >SYSCALL GetEnv.YA bcs .8 >PUSHYA push value - >PUSHW L.ARGS push name + >PUSHW ZPPTR2 push name >LDYA L.MSG.PRINTENV >SYSCALL PrintF.YA @@ -495,10 +511,10 @@ Cmd.Exec.TIME clc bcs Cmd.Exec.ECHO.RTS bra Cmd.Exec.ECHO.CR *-------------------------------------- -Cmd.Exec.ECHO lda ARGS +Cmd.Exec.ECHO lda (ZPPtr2) beq Cmd.Exec.ECHO.CR - >PUSHW L.ARGS + >PUSHW ZPPtr2 >LDYA L.MSG.PSTRCR >SYSCALL PrintF.YA rts @@ -514,11 +530,11 @@ Cmd.Exec.ECHO.CR Cmd.Exec.ECHO.RTS rts *-------------------------------------- -Cmd.Exec.READ lda ARGS +Cmd.Exec.READ lda (ZPPtr2) beq .9 lda #0 - >SETG.A bSecureRead + >STA.G bSecureRead lda pData clc @@ -528,63 +544,56 @@ Cmd.Exec.READ lda ARGS adc #0 sta ZPPTR1+1 - ldx #0 + ldy #0 -.1 cpx ARGS +.1 lda (ZPPtr2),y beq .8 - inx - lda ARGS,x + iny cmp #' ' beq .1 cmp #'-' bne .7 - cpx ARGS + lda (ZPPtr2),y beq .9 - inx - lda ARGS,x + iny cmp #'S' bne .2 lda #$80 - >SETG.A bSecureRead + >STA.G bSecureRead bra .1 .2 cmp #'P' bne .9 - cpx ARGS + lda (ZPPtr2),y beq .9 - inx - lda ARGS,x + iny cmp #' ' bne .9 - cpx ARGS + lda (ZPPtr2),y beq .9 - - inx - lda ARGS,x + iny cmp #'"' bne .9 -.3 cpx ARGS +.3 lda (ZPPtr2),y beq .9 - - inx - lda ARGS,x + iny cmp #'"' beq .1 - phx + + phy >SYSCALL PutChar.A - plx + ply bcs .99 bra .3 .9 jmp Cmd.Exec.ERRSYN -.70 inx - lda ARGS,x +.70 lda (ZPPtr2),y cmp #' ' beq .1 @@ -594,9 +603,9 @@ Cmd.Exec.READ lda ARGS inc sta (ZPPTR1) tay - lda ARGS,x + lda (ZPPtr2),y sta (ZPPTR1),y - cpx ARGS + bne .70 .8 lda (ZPPTR1) No var name ? SYNERR @@ -605,7 +614,7 @@ Cmd.Exec.READ lda ARGS clc .99 rts *-------------------------------------- -Cmd.Exec.SLEEP lda ARGS +Cmd.Exec.SLEEP lda (ZPPtr2) beq .9 lda #Sleep @@ -615,7 +624,7 @@ Cmd.Exec.SLEEP lda ARGS lda /Sleep adc pData+1 >PUSHYA - >PUSHW L.ARGS + >PUSHW ZPPtr2 >SYSCALL AToI.YA bcs .9 @@ -624,12 +633,12 @@ Cmd.Exec.SLEEP lda ARGS .9 jmp Cmd.Exec.ERRSYN *-------------------------------------- Cmd.Exec.PAUSE lda #$FF - >SETG.A bPause + >STA.G bPause clc rts *-------------------------------------- Cmd.Exec.EXIT lda #$FF - >SETG.A bExit + >STA.G bExit clc rts *-------------------------------------- diff --git a/SBIN/SHELL.S.CSH.txt b/SBIN/SHELL.S.CSH.txt index 8b8edc5f..f3f302f6 100644 --- a/SBIN/SHELL.S.CSH.txt +++ b/SBIN/SHELL.S.CSH.txt @@ -5,8 +5,6 @@ INC 1 AUTO 6 .LIST OFF *-------------------------------------- - -*-------------------------------------- CSH.TYPE.CHAR .EQ 1 CSH.TYPE.INT .EQ 2 CSH.TYPE.LONG .EQ 3 @@ -21,46 +19,40 @@ CSH.Init >PUSHWI 0 Aux type >PUSHYA >SYSCALL LoadFile bcs .9 - >SETG.YA CSH.BufLen + >STYA.G CSH.BufLen txa - >SETG.A CSH.hBuf + >STA.G CSH.hBuf lda #$FF - >SETG.A bExitOnEOF + >STA.G bExitOnEOF >LDYAI 256 >SYSCALL GetMem0.YA bcs .9 txa - ldy #CSH.hSymbols - sta (pData),y + >STA.G CSH.hSymbols lda #0 - ldy #CSH.SymbolsPtr - sta (pData),y + >STA.G CSH.SymbolsPtr >LDYAI 256 >SYSCALL GetMem.YA bcs .9 txa - ldy #CSH.hData - sta (pData),y + >STA.G CSH.hData lda #0 - ldy #CSH.DataPtr - sta (pData),y + >STA.G CSH.DataPtr >LDYAI 256 >SYSCALL GetMem.YA bcs .9 txa - ldy #CSH.hStack - sta (pData),y + >STA.G CSH.hStack lda #0 - ldy #CSH.StackPtr - sta (pData),y + >STA.G CSH.StackPtr * clc .9 rts @@ -70,7 +62,7 @@ CSH.Run jsr CSH.GetBuf jsr CSH.GetPtrs lda #0 - >SETG.A CmdBuflen Reset Cmdline + >STA.G CmdBuflen Reset Cmdline jsr CSH.GetCharNB bcs .9 @@ -142,7 +134,7 @@ CSH.Run jsr CSH.GetBuf jsr CSH.RestorePtr Restore ptr to get full cmd line to execute - >GETG.A hCmdBuf Get the buffer + >LDA.G hCmdBuf Get the buffer >SYSCALL GetMemPtr.A >STYA ZPCMDBuf @@ -166,12 +158,11 @@ CSH.Run jsr CSH.GetBuf .8 lda #0 sta (ZPCMDBuf),y tya - >SETG.A CmdBuflen + >STA.G CmdBuflen lda #$ff - >SETG.A bCmdBufexec + >STA.G bCmdBufexec - ldy #bEcho - lda (pData),y + >LDA.G bEcho beq .80 >PUSHW ZPCMDBuf @@ -181,35 +172,29 @@ CSH.Run jsr CSH.GetBuf .80 clc rts *-------------------------------------- -CSH.Quit ldy #CSH.hBuf - lda (pData),y +CSH.Quit >LDA.G CSH.hBuf beq .1 >SYSCALL FreeMem.A -.1 ldy #CSH.hStack - lda (pData),y +.1 >LDA.G CSH.hStack beq .2 >SYSCALL FreeMem.A -.2 ldy #CSH.hData - lda (pData),y +.2 >LDA.G CSH.hData beq .3 >SYSCALL FreeMem.A -.3 ldy #CSH.hSymbols - lda (pData),y +.3 >LDA.G CSH.hSymbols beq .8 >SYSCALL FreeMem.A .8 rts *-------------------------------------- -CSH.GetBuf ldy #CSH.hBuf - lda (pData),y +CSH.GetBuf >LDA.G CSH.hBuf >SYSCALL GetMemPtr.A >STYA ZPCSHBufBase - ldy #CSH.BufLen - lda (pData),y + >LDA.G CSH.BufLen clc adc ZPCSHBufBase sta CSH.GetChar.LO+1 @@ -219,8 +204,7 @@ CSH.GetBuf ldy #CSH.hBuf adc ZPCSHBufBase+1 sta CSH.GetChar.HI+1 -CSH.SetBufPtr ldy #CSH.BufPtr - lda (pData),y +CSH.SetBufPtr >LDA.G CSH.BufPtr clc adc ZPCSHBufBase sta ZPCSHBufPtr @@ -231,25 +215,21 @@ CSH.SetBufPtr ldy #CSH.BufPtr sta ZPCSHBufPtr+1 rts *-------------------------------------- -CSH.GetPtrs ldy #CSH.hSymbols - lda (pData),y +CSH.GetPtrs >LDA.G CSH.hSymbols >SYSCALL GetMemPtr.A >STYA ZPCSHSymbols - ldy #CSH.hData - lda (pData),y + >LDA.G CSH.hData >SYSCALL GetMemPtr.A >STYA ZPCSHData - ldy #CSH.hStack - lda (pData),y + >LDA.G CSH.hStack >SYSCALL GetMemPtr.A >STYA ZPCSHStack rts *-------------------------------------- CSH.SavePtr phy - ldy #CSH.BufPtr - lda (pData),y + >LDA.G CSH.BufPtr sta CSH.BufPtrSave iny @@ -259,9 +239,8 @@ CSH.SavePtr phy rts *-------------------------------------- CSH.RestorePtr phy - ldy #CSH.BufPtr lda CSH.BufPtrSave - sta (pData),y + >STA.G CSH.BufPtr clc adc ZPCSHBufBase sta ZPCSHBufPtr @@ -399,11 +378,9 @@ CSH.IF.END jsr CSH.GetNextChar just skip ending '}' rts *-------------------------------------- CSH.WHILE.END jsr CSH.Pop - ldy #CSH.BufPtr - sta (pData),y + >STA.G CSH.BufPtr jsr CSH.Pop - ldy #CSH.BufPtr+1 - sta (pData),y + >STA.G CSH.BufPtr+1 clc rts *-------------------------------------- @@ -468,11 +445,6 @@ CSH.TYPE sta CSH.ACCT .9 lda #CSH.E.SYNTAX sec .99 rts -*-------------------------------------- - - lda #CSH.E.SYNTAX - sec - rts *-------------------------------------- CSH.ExpEval jsr CSH.ZeroACC @@ -528,25 +500,27 @@ CSH.GetName ldy #0 sec rts *-------------------------------------- -CSH.GetNumInACC ldy #0 +CSH.GetNumInACC -.1 iny - cpy #10 - beq .9 +* ldy #0 +* +*.1 iny +* cpy #10 +* beq .9 - sta ARGS,y - jsr CSH.GetNextChar - bcs .8 - jsr CSH.IsDigit10 - bcc .1 +* sta ARGS,y +* jsr CSH.GetNextChar +* bcs .8 +* jsr CSH.IsDigit10 +* bcc .1 -.8 sty ARGS +*.8 sty ARGS - >PUSHW L.CSH.ACC - >PUSHW L.ARGS - >SYSCALL AToL - bcs .9 - rts +* >PUSHW L.CSH.ACC +* >PUSHW L.ARGS +* >SYSCALL AToL +* bcs .9 +* rts .9 lda #CSH.E.SYNTAX sec @@ -563,8 +537,7 @@ CSH.ZeroACC stz CSH.ACC CSH.AddVar jsr CSH.FindVar bcc .97 - ldy #CSH.SymbolsPtr - lda (pData),y + >LDA.G CSH.SymbolsPtr sec adc CSH.Name @@ -573,8 +546,7 @@ CSH.AddVar jsr CSH.FindVar adc #2 TYPE + OFS bcs .99 - ldy #CSH.DataPtr - lda (pData),y + >LDA.G CSH.DataPtr pha ldx CSH.ACCT @@ -584,8 +556,7 @@ CSH.AddVar jsr CSH.FindVar ldx #$ff - ldy #CSH.SymbolsPtr - lda (pData),y + >LDA.G CSH.SymbolsPtr tay .10 inx @@ -605,8 +576,7 @@ CSH.AddVar jsr CSH.FindVar iny tya - ldy #CSH.SymbolsPtr - sta (pData),y + >STA.G CSH.SymbolsPtr ply Get Back Data OFS again @@ -625,8 +595,7 @@ CSH.AddVar jsr CSH.FindVar bne .1 tya - ldy #CSH.DataPtr - sta (pData),y + >STA.G CSH.DataPtr clc rts @@ -704,8 +673,7 @@ CSH.FindVar >LDYA ZPCSHSymbols * Stack *-------------------------------------- CSH.Push pha - ldy #CSH.StackPtr - lda (pData),y + >LDA.G CSH.StackPtr tay pla @@ -713,7 +681,7 @@ CSH.Push pha iny beq .9 tya - ldy #CSH.StackPtr + >STA.G CSH.StackPtr sta (pData),y clc rts @@ -722,8 +690,7 @@ CSH.Push pha sec rts *-------------------------------------- -CSH.Pop ldy #CSH.StackPtr - lda (pData),y +CSH.Pop >LDA.G CSH.StackPtr beq .9 dec tay @@ -737,8 +704,7 @@ CSH.Pop ldy #CSH.StackPtr rts *-------------------------------------- CSH.CheckStack pha - ldy #CSH.StackPtr - lda (pData),y + >LDA.G CSH.StackPtr beq .9 dec tay @@ -747,8 +713,7 @@ CSH.CheckStack pha bne .9 tya - ldy #CSH.StackPtr - sta (pData),y + >STA.G CSH.StackPtr clc rts @@ -784,18 +749,8 @@ CSH.CheckCharNB cmp #32 SPACE .9 rts *-------------------------------------- CSH.GetNextChar phy - ldy #CSH.BufPtr - lda (pData),y - inc - sta (pData),y - bne .1 - - iny - lda (pData),y - inc - sta (pData),y - -.1 ply + >INCW.G CSH.BufPtr + ply inc ZPCSHBufPtr bne CSH.GetChar diff --git a/SBIN/SHELL.S.HIS.txt b/SBIN/SHELL.S.HIS.txt index fd78bb23..1018d05f 100644 --- a/SBIN/SHELL.S.HIS.txt +++ b/SBIN/SHELL.S.HIS.txt @@ -10,28 +10,23 @@ HIS.Init >LDYAI 256 Get a buffer for History bcs .9 txa - ldy #HIS.hBuf - sta (pData),y + >STA.G HIS.hBuf lda #0 - ldy #HIS.BufIndex - sta (pData),y - ldy #HIS.BufEnd - sta (pData),y + >STA.G HIS.BufIndex + >STA.G HIS.BufEnd .9 rts *-------------------------------------- -HIS.Add ldy #HIS.hBuf - lda (pData),y +HIS.Add >LDA.G HIS.hBuf beq .9 >SYSCALL GetMemPtr.A >STYA ZPPTR1 -.10 ldy #HIS.BufEnd - lda (pData),y +.10 >LDA.G HIS.BufEnd .11 sec add len+1 - adc (pData) CmdBuffer length + adc CmdBuflen CmdBuffer length bcc .2 enough room lda (ZPPTR1) get len of oldest string @@ -51,8 +46,7 @@ HIS.Add ldy #HIS.hBuf tya - ldy #HIS.BufEnd mark new end of history - sta (pData),y + >STA.G HIS.BufEnd mark new end of history bra .11 retry.... .2 tax keep new HIS.BufEnd @@ -61,17 +55,13 @@ HIS.Add ldy #HIS.hBuf lda #0 sta (ZPPTR1),y set ending 0 - ldy #HIS.BufEnd save old END - lda (pData),y + >LDA.G HIS.BufEnd save old END pha txa get back new END - ldy #HIS.BufIndex set it as new IDX - sta (pData),y - - ldy #HIS.BufEnd - sta (pData),y set new HIS.BufEnd + >STA.G HIS.BufIndex set it as new IDX + >STA.G HIS.BufEnd set new HIS.BufEnd pla get back old END clc @@ -80,26 +70,28 @@ HIS.Add ldy #HIS.hBuf bcc .3 inc ZPPTR1+1 -.3 lda (pData) - tay +.3 ldy #0 -.4 lda (pData),y +.4 lda (ZPCMDBuf),y + beq .5 + + iny sta (ZPPTR1),y - dey - bpl .4 + iny + bra .4 + +.5 tya + sta (ZPPTR1) .9 rts *-------------------------------------- -HIS.GetPrev ldy #HIS.hBuf - lda (pData),y +HIS.GetPrev >LDA.G HIS.hBuf beq HISTORY.RTS tax - ldy #HIS.BufEnd - lda (pData),y + >LDA.G HIS.BufEnd beq HISTORY.RTS empty history,nothing to do - ldy #HIS.BufIndex - lda (pData),y + >LDA.G HIS.BufIndex beq HISTORY.RTS already oldest,nothing to do txa @@ -120,22 +112,18 @@ HIS.GetPrev ldy #HIS.hBuf bne .1 reached current index .2 txa - ldy #HIS.BufIndex set new index - sta (pData),y + >STA.G HIS.BufIndex set new index bra HIS.SetBuf History.RTS rts *-------------------------------------- -HIS.GetNext ldy #HIS.hBuf - lda (pData),y +HIS.GetNext >LDA.G HIS.hBuf beq HISTORY.RTS tax - ldy #HIS.BufEnd - lda (pData),y + >LDA.G HIS.BufEnd beq HISTORY.RTS empty history,nothing to do - ldy #HIS.BufIndex - cmp (pData),y + >CMP.G HIS.BufIndex beq HISTORY.RTS already oldest,nothing to do txa @@ -143,24 +131,19 @@ HIS.GetNext ldy #HIS.hBuf >SYSCALL GetMemPtr.A >STYA ZPPTR1 - ldy #HIS.BufIndex - lda (pData),y - phy + >LDA.G HIS.BufIndex tay sec adc (ZPPTR1),y add length+1 of current line in history - ply - sta (pData),y + >STA.G HIS.BufIndex - ldy #HIS.BufEnd - cmp (pData),y + >CMP.G HIS.BufEnd bne HIS.SetBuf jmp CmdLine.CLR end of history, just blank buffer *-------------------------------------- HIS.SetBuf jsr CmdLine.CLR - ldy #HIS.BufIndex - lda (pData),y + >LDA.G HIS.BufIndex tay keep length of string clc @@ -170,13 +153,12 @@ HIS.SetBuf jsr CmdLine.CLR inc ZPPTR1+1 .1 lda (ZPPTR1),y - sta (pData),y + sta (ZPCMDBuf),y dey bpl .1 jmp CmdLine.SET *-------------------------------------- -HIS.Quit ldy #HIS.hBuf - lda (pData),y +HIS.Quit >LDA.G HIS.hBuf beq .9 >SYSCALL FreeMem.A .9 rts diff --git a/SBIN/SHELL.S.txt b/SBIN/SHELL.S.txt index e396d3f2..a500c627 100644 --- a/SBIN/SHELL.S.txt +++ b/SBIN/SHELL.S.txt @@ -67,7 +67,6 @@ L.ENV.PATH .DA ENV.PATH L.ENV.PWD .DA ENV.PWD L.ENV.PS1 .DA ENV.PS1 L.CMD .DA CMD -L.ARGS .DA ARGS L.TIME .DA TIME L.STAT .DA STAT L.FMT.DATE .DA FMT.DATE @@ -124,7 +123,7 @@ CS.INIT jsr SetPWD .9 rts *-------------------------------------- -CS.RUN >GETG.A bReadMode READ Command ? +CS.RUN >LDA.G bReadMode READ Command ? bne CS.RUN.READ ldy #S.PS.RC @@ -134,32 +133,30 @@ CS.RUN >GETG.A bReadMode READ Command ? jsr IO.PrintErrMsg bcs CS.RUN.EXIT.RTS -.11 >GETG.A bPause +.11 >LDA.G bPause bpl .13 >SYSCALL GetChar bcs .8 -.13 >DEBUG - - jsr CheckSleep +.13 jsr CheckSleep bne .8 - >GETG.A CSH.hBuf batch mode ? + >LDA.G CSH.hBuf batch mode ? beq .10 jmp CS.RUN.BATCH * Interactive Mode -.10 >GETG.A hCmdBuf Get the buffer +.10 >LDA.G hCmdBuf Get the buffer >SYSCALL GetMemPtr.A >STYA ZPCMDBuf lda #0 reset it sta (ZPCMDBuf) - >SETG.A bSecureRead Clear password mode + >STA.G bSecureRead Clear password mode .12 jsr PrintPrompt bcs CS.RUN.EXIT.RTS @@ -170,12 +167,12 @@ CS.RUN >GETG.A bReadMode READ Command ? jsr CS.CHARIN - >GETG.A bCmdBufexec Something to execute ? + >LDA.G bCmdBufexec Something to execute ? bpl .1 jsr Cmd.Parse - >GETG.A CmdBuflen + >LDA.G CmdBuflen beq .12 Empty line jsr HIS.Add @@ -185,7 +182,7 @@ CS.RUN >GETG.A bReadMode READ Command ? ldy #S.PS.RC sta (pPs),y - >GETG.A bExit + >LDA.G bExit bne CS.RUN.EXIT .8 clc @@ -195,7 +192,7 @@ CS.RUN.EXIT lda #0 CS.RUN.EXIT.ERR sec CS.RUN.EXIT.RTS rts *-------------------------------------- -CS.RUN.READ >GETG.A hCmdBuf Get the buffer +CS.RUN.READ >LDA.G hCmdBuf Get the buffer >SYSCALL GetMemPtr.A >STYA ZPCMDBuf @@ -208,7 +205,7 @@ CS.RUN.READ >GETG.A hCmdBuf Get the buffer jsr CS.CHARIN - >GETG.A bCmdBufexec + >LDA.G bCmdBufexec bpl .1 >PUSHW ZPCMDBuf @@ -223,16 +220,15 @@ CS.RUN.READ >GETG.A hCmdBuf Get the buffer >SYSCALL SetEnv rts *-------------------------------------- -CS.RUN.BATCH >DEBUG - - jsr CSH.Run +CS.RUN.BATCH jsr CSH.Run bcs .9 - >GETG.A bCmdBufexec + >LDA.G bCmdBufexec bpl .8 Empty line....nothing to do.... jsr Cmd.Parse - >GETG.A CmdBuflen + + lda (ZPCMDBuf) beq .8 jsr Cmd.Exec @@ -308,14 +304,14 @@ CS.DOEVENT lda (pEvent) rts *-------------------------------------- CS.CHARIN tax Save Char - >GETG.A CSH.hBuf Batch mode ? + >LDA.G CSH.hBuf Batch mode ? beq .10 * Batch Mode cpx #3 test Ctrl-c bne .12 - >GETG.A bExitOnEOF - >SETG.A bExit + >LDA.G bExitOnEOF + >STA.G bExit clc rts @@ -323,16 +319,16 @@ CS.CHARIN tax Save Char bne .8 lda #$80 - >SETG.A bPause + >STA.G bPause clc rts * interactive mode -.10 >GETG.A hCmdBuf +.10 >LDA.G hCmdBuf >SYSCALL GetMemPtr.A >STYA ZPCMDBuf - >GETG.A bEscMode + >LDA.G bEscMode beq .13 cpx #'[' @@ -364,7 +360,7 @@ CS.CHARIN tax Save Char clc rts -.2 >GETG.A CmdBuflen +.2 >LDA.G CmdBuflen cmp #CmdLine.MAX beq .8 @@ -377,7 +373,7 @@ CS.CHARIN tax Save Char ply sta (ZPCMDBuf),y - >GETG.A bSecureRead + >LDA.G bSecureRead bne .8 txa @@ -394,7 +390,7 @@ CS.CHARIN.CTRL cpx #13 CR >SYSCALL PutChar.A lda #$ff - >SETG.A bCmdBufexec + >STA.G bCmdBufexec clc rts @@ -402,7 +398,7 @@ CS.CHARIN.CTRL cpx #13 CR bne .11 lda #$ff - >SETG.A bEscMode + >STA.G bEscMode clc rts @@ -501,7 +497,7 @@ CmdLine.CLR ldy #0 .9 rts *-------------------------------------- -CmdLine.DEL >GETG.A CmdBuflen +CmdLine.DEL >LDA.G CmdBuflen beq .9 dec sta (pData),y @@ -567,7 +563,6 @@ FMT.TIME >CSTR "%H:%M:%S (%I:%M:%S%p)" EscChars >PSTR "DBAC" EscAscii .HS 04080A0B15 CMD .BS 256 -ARGS .BS 256 TIME .BS S.TIME STAT .BS S.STAT bStartProc .BS 1 diff --git a/SYS/KERNEL.S.BIN.txt b/SYS/KERNEL.S.BIN.txt index a16bc80a..7f026a1b 100644 --- a/SYS/KERNEL.S.BIN.txt +++ b/SYS/KERNEL.S.BIN.txt @@ -214,7 +214,7 @@ BIN.Load.YA.1 >PUSHWI K.S.STAT jsr BIN.RelocateEXE >LDYA BIN.CmdLine get back bin path - jsr K.NewCStr.YA make a copy of this string + jsr K.NewStr.YA make a copy of this string bcs .98 lda BIN.hMem Keep X=hMem diff --git a/SYS/KERNEL.S.CORE.txt b/SYS/KERNEL.S.CORE.txt index 7c9c0e2e..941b0ab4 100644 --- a/SYS/KERNEL.S.CORE.txt +++ b/SYS/KERNEL.S.CORE.txt @@ -42,15 +42,15 @@ CORE.Run jsr CORE.TskMgrRun cmp #2 is SYS active? bne .6 - ldx SYS.CPULOADI - lda SYS.CPULOADC,x + ldx CORE.CPULOADI + lda CORE.CPULOADC,x sta SYS.BASL0+38 dex bpl .5 ldx #3 -.5 stx SYS.CPULOADI +.5 stx CORE.CPULOADI .6 bit OPENAPPLE bpl CORE.Run @@ -102,8 +102,8 @@ CORE.ScreenSelect .8 rts *-------------------------------------- -SYS.CPULOADI .BS 1 -SYS.CPULOADC .AS '\|/-' +CORE.CPULOADI .BS 1 +CORE.CPULOADC .AS -"/-\|" *-------------------------------------- CORE.TskMgrRun >LDYAI TskMgr.Table+S.PS skip PS 0 >STYA pPs @@ -126,7 +126,7 @@ CORE.TskMgrRun >LDYAI TskMgr.Table+S.PS skip PS 0 ldy #S.PS.CPID lda (pPs),y - jsr K.GetPSByID.A + jsr CORE.GetPSByID.A bcc .7 yes, running.... lda (pPs) get S.PS.F @@ -159,7 +159,7 @@ CORE.TskMgrRun >LDYAI TskMgr.Table+S.PS skip PS 0 pha save RC ldy #S.PS.PPID Notify Parent Process for exit code... lda (pPs),y - jsr K.GetPSByID.A will set ZPPtr1 if success + jsr CORE.GetPSByID.A will set ZPPtr1 if success bcs .5 parent is dead.....skipping... lda (ZPPtr1) Parent PS is HOLD? @@ -181,7 +181,7 @@ CORE.TskMgrRun >LDYAI TskMgr.Table+S.PS skip PS 0 ldy #S.PS.PID lda (pPs),y - jsr PS.Free.A + jsr CORE.PSFree.A .7 lda pPs clc @@ -194,6 +194,43 @@ CORE.TskMgrRun >LDYAI TskMgr.Table+S.PS skip PS 0 .8 clc rts *-------------------------------------- +CORE.GetPSByID.A + pha + >LDYAI TskMgr.Table + >STYA ZPPtr1 + + pla + beq .8 + sta .20+1 + ldx #0 + +.1 inx + lda ZPPtr1 + clc + adc #S.PS + sta ZPPtr1 + bcc .2 + inc ZPPtr1+1 + +.2 lda (ZPPtr1) + bpl .3 + + ldy #S.PS.PID + lda (ZPPtr1),y +.20 cmp #$ff Self Modified + beq .8 + +.3 cpx TskMgr.Count + bne .1 + +.9 lda #TSKMGR.ERRNSP + sec + rts + +.8 >LDYA ZPPtr1 + clc + rts +*-------------------------------------- CORE.PSSelect0 >LDYAI TskMgr.Table Select PS0 >STYA pPs @@ -207,22 +244,19 @@ CORE.PSSelect ldy #S.PS.hCS jsr K.GetMemPtr.A >STYA pCode - iny -* ldy #S.PS.hDS + ldy #S.PS.hDS lda (pPs),y beq .1 jsr K.GetMemPtr.A >STYA pData -.1 iny -* ldy #S.PS.hSS +.1 ldy #S.PS.hSS lda (pPs),y jsr K.GetMemPtr.A >STYA pStack - iny -* ldy #S.PS.SP + ldy #S.PS.SP lda pStack clc adc (pPs),y @@ -243,6 +277,42 @@ CORE.PSLeave ldy #S.PS.hSS rts *-------------------------------------- +* PS.Free.A +* In : A = PID to free +*-------------------------------------- +CORE.PSFree.A jsr CORE.GetPSByID.A PS in ZPPtr1 + + ldy #S.PS.hARGS + jsr .2 + + lda (ZPPtr1) get S.PS.F + and #S.PS.F.ENV do we have to discard duplicated env & prefix ? + beq .1 + + ldy #S.PS.hENV + jsr .2 + + ldy #S.PS.hPREFIX + jsr .2 + +.1 ldy #S.PS.hSS + jsr .2 + + ldy #S.PS.hDS + jsr .2 + + ldy #S.PS.hCS + jsr .2 + + lda #0 + sta (ZPPtr1) Mark TSKSLOT as free + clc +.9 rts + +.2 lda (ZPPtr1),y + beq .9 + jmp K.FreeMem.A +*-------------------------------------- * CORE.GetEvents : * IN : * OUT : diff --git a/SYS/KERNEL.S.ENV.txt b/SYS/KERNEL.S.ENV.txt index 6e60d91a..0e7182aa 100644 --- a/SYS/KERNEL.S.ENV.txt +++ b/SYS/KERNEL.S.ENV.txt @@ -108,8 +108,11 @@ K.ExpandStr.YA stz K.ExpandStr.hPStr Reset Intermediate string... jsr K.FreeMem.A yes, discard.... -.81 >LDYAI K.Buf256 - jsr K.NewCStr.YA +.81 ldx K.ExpandStr.Len + stz K.Buf256,x + + >LDYAI K.Buf256 + jsr K.NewStr.YA bcs .9 stx K.ExpandStr.hPStr save this as temp string, in case of recurse ldx K.ExpandStr.bFound Did we expand something ? @@ -117,7 +120,7 @@ K.ExpandStr.YA stz K.ExpandStr.hPStr Reset Intermediate string... jmp .1 Yes, start over with hPStr .82 ldx K.ExpandStr.hPStr -* or exit with Y,A from K.NewPStrYA +* or exit with Y,A from K.NewStrYA .9 rts *-------------------------------------- diff --git a/SYS/KERNEL.S.FIO.txt b/SYS/KERNEL.S.FIO.txt index f0f3ee78..b2cd5666 100644 --- a/SYS/KERNEL.S.FIO.txt +++ b/SYS/KERNEL.S.FIO.txt @@ -104,15 +104,11 @@ K.FileSearch.I >PULLW ZPPtr4 ZPPtr1 trashed by ExpandStr.YA *\-------------------------------------- K.GetFullPath.YA >STYA ZPPtr1 - stz K.Buf256 + ldx #0 lda (ZPPtr1) beq .8 - - ldx #0 - - lda (ZPPtr1) cmp #'/' full path starting with '/'? beq .2 yes, do not append to current prefix @@ -141,7 +137,7 @@ K.GetFullPath.YA .8 stz K.Buf256,x >LDYAI K.Buf256 - jsr K.NewPStr.YA + jsr K.NewStr.YA rts */-------------------------------------- * # LoadFile diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt index e9ec622b..ff21c8d8 100644 --- a/SYS/KERNEL.S.JMP.txt +++ b/SYS/KERNEL.S.JMP.txt @@ -104,7 +104,7 @@ K.SYSCALL.JMP .DA 0 $00 .DA K.ExecProcess.YA .DA K.CreateProcessNewEnv.YA .DA K.CreateProcess.YA - .DA K.GetPSByID.A + .DA 0 .DA 0 .DA K.Sleep .DA 0 diff --git a/SYS/KERNEL.S.PS.txt b/SYS/KERNEL.S.PS.txt index 4dedf173..1cde0c89 100644 --- a/SYS/KERNEL.S.PS.txt +++ b/SYS/KERNEL.S.PS.txt @@ -4,48 +4,6 @@ LOMEM $A00 INC 1 AUTO 6 */-------------------------------------- -* # GetPSByID.A -* ## In : -* A = PID -* ## Out : -* Y,A = PTR to TSKSLOT -*\-------------------------------------- -K.GetPSByID.A pha - >LDYAI TskMgr.Table - >STYA ZPPtr1 - - pla - beq .8 - sta .20+1 - ldx #0 - -.1 inx - lda ZPPtr1 - clc - adc #S.PS - sta ZPPtr1 - bcc .2 - inc ZPPtr1+1 - -.2 lda (ZPPtr1) - bpl .3 - - ldy #S.PS.PID - lda (ZPPtr1),y -.20 cmp #$ff Self Modified - beq .8 - -.3 cpx TskMgr.Count - bne .1 - -.9 lda #TSKMGR.ERRNSP - sec - rts - -.8 >LDYA ZPPtr1 - clc - rts -*/-------------------------------------- * # Sleep * Make current process suspend until next RUN * ## In : @@ -106,7 +64,7 @@ K.CreateProcess.YA pha save error code lda .8+1 - jsr PS.Free.A + jsr CORE.PSFree.A pla get back error code sec rts @@ -122,7 +80,7 @@ K.CreateProcess.CmdLine .BS 2 * out : * A = PSID * we cannot use ZPPtrs1 & 2 -* because of calling K.NewPStrYA & S.DupEnvA +* because of calling K.NewStrY.A & S.DupEnv.A *-------------------------------------- PS.CreateChild >LDYAI TskMgr.Table+S.PS >STYA ZPPtr3 @@ -156,7 +114,7 @@ PS.CreateChild >LDYAI TskMgr.Table+S.PS .4 inc TSKMGR.LASTID Get a PSID not alredy running beq .4 not = 0 lda TSKMGR.LASTID - jsr K.GetPSByID.A + jsr CORE.GetPSByID.A bcc .4 ldy #S.PS.PID @@ -180,7 +138,7 @@ PS.CreateChild >LDYAI TskMgr.Table+S.PS ldy #S.PS.hPREFIX copy hPREFIX... lda (pPs),y jsr K.GetMemPtr.A - jsr K.NewCStr.YA + jsr K.NewStr.YA bcs .9 txa @@ -365,42 +323,6 @@ PS.Init jsr BIN.Load.YA Y,A=filename full path clc .9 rts *-------------------------------------- -* PS.Free.A -* In : A = PID to free -*-------------------------------------- -PS.Free.A jsr K.GetPSByID.A PS in ZPPtr1 - - ldy #S.PS.hARGS - jsr PS.Free.A.PsY - - lda (ZPPtr1) get S.PS.F - and #S.PS.F.ENV do we have to discard duplicated env & prefix ? - beq .1 - - ldy #S.PS.hENV - jsr PS.Free.A.PsY - - ldy #S.PS.hPREFIX - jsr PS.Free.A.PsY - -.1 ldy #S.PS.hSS - jsr PS.Free.A.PsY - - ldy #S.PS.hDS - jsr PS.Free.A.PsY - - ldy #S.PS.hCS - jsr PS.Free.A.PsY - - lda #0 - sta (ZPPtr1) Mark TSKSLOT as free - clc -PS.Free.A.RTS rts -*-------------------------------------- -PS.Free.A.PsY lda (ZPPtr1),y - beq PS.Free.A.RTS - jmp K.FreeMem.A -*-------------------------------------- * PS.DupEnv.A * In: * A = ENV hMem To Duplicate