NEW PREFIX /A2OSX.BUILD AUTO 4,1 .LIST OFF .OP 65C02 .OR $2000 .TF SBIN/SHELL *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I .INB INC/MLI.I .INB INC/MLI.E.I *-------------------------------------- ZPPtr1 .EQ ZPBIN ZPPtr2 .EQ ZPBIN+2 ZPPtr3 .EQ ZPBIN+4 ZPCMDBuf .EQ ZPBIN+6 ZPArgVBuf .EQ ZPBIN+8 ZPCSHBufPtr .EQ ZPBIN+10 ZPCSHSymbols .EQ ZPBIN+12 ZPCSHData .EQ ZPBIN+14 ZPCSHValue .EQ ZPBIN+16 ZPCSHStack .EQ ZPBIN+18 *-------------------------------------- CmdLine.MAX .EQ 127 VarLen.MAX .EQ 15 History.MAX .EQ 256 *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) .DA #$61 6502,Level 1 (65c02) .DA #1 BIN Layout Version 1 .DA #S.PS.F.EVENT S.PS.F .DA #0 .DA CS.END-CS.START CS .DA DS.END-DS.START DS .DA #64 SS .DA #20 ZP .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT *-------------------------------------- L.MSG.GREETINGS .DA MSG.GREETINGS L.MSG.PROMPT .DA MSG.PROMPT L.MSG.ECHO .DA MSG.ECHO L.MSG.ECHOCRLF .DA MSG.ECHOCRLF L.MSG.ERROR .DA MSG.ERROR L.MSG.PRINTENV .DA MSG.PRINTENV 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 CL.BS left arrow .DA HIS.GetNext .DA HIS.GetPrev .DA CL.NAK right arow L.CMD.INT .DA CMD.INT J.CMD.INT .DA Cmd.INT.STARTPROC .DA Cmd.INT.CD .DA Cmd.INT.DATE .DA Cmd.INT.ECHO .DA Cmd.INT.EXIT .DA Cmd.INT.IF .DA Cmd.INT.PAUSE .DA Cmd.INT.PWD .DA Cmd.INT.READ .DA Cmd.INT.SET .DA Cmd.INT.SLEEP .DA Cmd.INT.TIME L.CMD.IO .DA CMD.IO J.CMD.IO .DA CMD.IO.AMP .DA CMD.IO.PIPE .DA CMD.IO.IN .DA CMD.IO.OUTA .DA CMD.IO.OUT .DA CMD.IO.1OUTA .DA CMD.IO.1OUT .DA CMD.IO.2OUTA .DA CMD.IO.2OUT L.CSH.BOPS .DA CSH.BOPS J.CSH.BOPS .DA CSH.BOPS.ADD .DA CSH.BOPS.SUB .DA CSH.BOPS.MUL .DA CSH.BOPS.DIV .DA CSH.BOPS.MOD .DA CSH.BOPS.SHL .DA CSH.BOPS.SHR .DA CSH.BOPS.L .DA CSH.BOPS.G .DA CSH.BOPS.LE .DA CSH.BOPS.GE .DA CSH.BOPS.EQ .DA CSH.BOPS.NE .DA CSH.BOPS.AND .DA CSH.BOPS.OR .DA CSH.BOPS.EOR .DA CSH.BOPS.LAND .DA CSH.BOPS.LOR L.CSH.FN .DA CSH.FN L.CSH.KW .DA CSH.KW L.CSH.STYPES .DA CSH.STYPES J.CSH.KW .DA CSH.IF .DA CSH.WHILE .DA CSH.ELSE .DA CSH.DO .DA CSH.FOR .DA CSH.SWITCH .DA CSH.CASE .DA CSH.BREAK .DA CSH.CONTINUE .DA CSH.FLOAT .DA CSH.SIGNED .DA CSH.UNSIGNED J.CSH.STYPES .DA CSH.CHAR .DA CSH.INT .DA CSH.LONG J.CSH.UTYPES .DA CSH.UCHAR .DA CSH.UINT .DA CSH.ULONG J.CSH.KW.START .DA CSH.IF.START .DA CSH.WHILE.START J.CSH.KW.END .DA CSH.IF.END .DA CSH.WHILE.END L.ERR.Codes .DA ERR.Codes L.ERR.Messages .DA ERR.Messages .DA 0 *-------------------------------------- CS.INIT jsr SetPWD jsr CMD.Init bcs .9 ldy #S.PS.ARGC lda (pPs),y cmp #1 beq .1 no arg, continue starting interactive jmp CSH.Init .1 jsr HIS.Init bcs .9 >PUSHWI K.VER >PUSHBI 2 >LDYA L.MSG.GREETINGS >SYSCALL printf .9 rts *-------------------------------------- CS.RUN >LDA.G bReadMode READ Command ? beq .22 jmp CS.RUN.READ .22 ldy #S.PS.RC lda (pPs),y beq .11 jsr IO.PrintErrMsg bcs .9 .11 >LDA.G bPause bpl .13 >SYSCALL GetChar bcs .8 >STZ.G bPause .13 jsr CheckSleep bne .8 >LDA.G CSH.hBuf batch mode ? beq .10 jmp CS.RUN.BATCH *-------------------------------------- .10 jsr CL.RESET reset CmdBuf jsr IO.Reset >STZ.G bSecureRead Clear password mode jsr CL.PrintPrompt bcs .9 .1 >SLEEP >SYSCALL GetChar bcc .21 no char tay beq .1 rts .21 cmp #C.EOF beq .9 jsr CL.CHARIN >LDA.G bCmdBufExec Something to execute ? bpl .1 lda (ZPCMDBuf) beq .10 Empty line jsr HIS.Add jsr CMD.Parse bcs .2 lda (ZPArgVBuf) beq .10 Empty line jsr CMD.Exec bcs .2 lda #0 .2 ldy #S.PS.RC sta (pPs),y >LDA.G bExit bne .80 .8 clc rts .80 lda #0 sec .9 rts *-------------------------------------- CS.RUN.READ jsr CL.RESET reset CmdBuf jsr IO.Reset .1 >SLEEP >SYSCALL GetChar bcs .1 no char jsr CL.CHARIN >LDA.G bCmdBufExec bpl .1 >STZ.G bReadMode lda (ZPCMDBuf) beq .8 >PUSHW ZPCMDBuf >LEA.G CMD.VarName >SYSCALL SetEnv rts .8 clc rts *-------------------------------------- CS.RUN.BATCH >SYSCALL GetChar bcs .2 cmp #3 test Ctrl-c bne .1 sec rts .1 cmp #19 test Ctrl-s bne .2 lda #$80 >STA.G bPause clc rts .2 jsr CSH.Run bcc .7 cmp #MLI.E.EOF beq .9 pha jsr CSH.ErrorMsg pla ldy #S.PS.RC sta (pPs),y sec rts .7 >LDA.G bCmdBufExec bpl .8 Empty line....nothing to do.... lda (ZPCMDBuf) beq .8 jsr CMD.Parse bcs .8 lda (ZPArgVBuf) beq .8 jsr CMD.Exec bcs .8 lda #0 .8 ldy #S.PS.RC sta (pPs),y clc rts .9 lda #0 sec rts *-------------------------------------- CS.DOEVENT lda (pEvent) bpl .9 jsr CheckSleep beq .9 * ldy #Sleep already set by CheckSleep clc ldx #4 .1 lda (pData),y sbc #0 sta (pData),y iny dex bne .1 .9 sec rts *-------------------------------------- CS.QUIT jsr HIS.Quit jsr CSH.Quit jsr CMD.Quit clc rts *-------------------------------------- CheckSleep ldy #Sleep+3 lda (pData),y dey ora (pData),y dey ora (pData),y dey ora (pData),y rts *-------------------------------------- SetPWD ldy #S.PS.hPREFIX lda (pPs),y >SYSCALL GetMemPtr >PUSHYA >LDYA L.ENV.PWD >SYSCALL SetEnv rts *-------------------------------------- .INB /A2OSX.SRC/SBIN/SHELL.S.CL .INB /A2OSX.SRC/SBIN/SHELL.S.CMD .INB /A2OSX.SRC/SBIN/SHELL.S.CSH .INB /A2OSX.SRC/SBIN/SHELL.S.IO .INB /A2OSX.SRC/SBIN/SHELL.S.HIS *-------------------------------------- CS.END *-------------------------------------- MSG.GREETINGS .AZ "\r\nA2osX-Shell %d.%d\r\n\r\n" MSG.PROMPT .AZ "\e[7h$ " MSG.ECHO .AS ">%s" MSG.ECHOCRLF .AZ "\r\n" MSG.ERROR .AZ "[$%h]:%S.\r\n" MSG.PRINTENV .AZ "%s=%s\r\n" MSG.CSHERR .AZ "^\r\nLine #%D:" FMT.DATE .AZ "%A (%w), %B %d %Y" FMT.TIME .AZ "%H:%M:%S (%I:%M:%S%p)" *-------------------------------------- ENV.PATH .AZ "PATH" ENV.PWD .AZ "PWD" ENV.PS1 .AZ "PS1" ENV.HOME .AZ "HOME" *-------------------------------------- * https://www.tldp.org/LDP/abs/html/io-redirection.html *-------------------------------------- CMD.INT .AZ "STARTPROC" .AZ "CD" .AZ "DATE" .AZ "ECHO" .AZ "EXIT" .AZ "IF" .AZ "PAUSE" .AZ "PWD" .AZ "READ" .AZ "SET" .AZ "SLEEP" .AZ "TIME" .HS 00 *-------------------------------------- CMD.IO .AZ "&" .AZ "|" .AZ "<" .AZ ">>" .AZ ">" .AZ "1>>" .AZ "1>" .AZ "2>>" .AZ "2>" .HS 00 *-------------------------------------- CMD.IF.Chars .AS "def" CMD.IF.Chars.Cnt .EQ *-CMD.IF.Chars *-------------------------------------- .INB /A2OSX.SRC/SBIN/SHELL.C.CSH .INB /A2OSX.SRC/X.ERRORS.S *-------------------------------------- EscChars .AS 'DBAC' EscChars.Cnt .EQ *-EscChars *-------------------------------------- .DUMMY .OR 0 DS.START CmdBufPtr .BS 1 CmdBuflen .BS 1 bCmdBufexec .BS 1 bEscMode .BS 1 bPause .BS 1 bExit .BS 1 bSET.X .BS 1 bECHO.N .BS 1 bReadMode .BS 1 bSecureRead .BS 1 Sleep .BS 4 CMD.IntCmd .BS 1 CMD.hCmdLine .BS 1 CMD.hCmdBuf .BS 1 CMD.hArgVBuf .BS 1 CMD.PSFlags .BS 1 CMD.VarName.LEN .BS 1 CMD.VarName .BS VarLen.MAX+1 CMD.Stat .BS S.STAT CMD.Time .BS S.TIME CMD.IFNOT .BS 1 HIS.hBuf .BS 1 HIS.Count .BS 1 HIS.Index .BS 1 IO.hIn .BS 1 IO.hOut .BS 1 IO.hErr .BS 1 .INB /A2OSX.SRC/SBIN/SHELL.G.CSH DS.END .ED *-------------------------------------- MAN SAVE /A2OSX.SRC/SBIN/SHELL.S ASM