NEW PREFIX /A2OSX.BUILD AUTO 4,1 .LIST OFF .OP 65C02 .OR $2000 .TF SBIN/SHELL *-------------------------------------- CSH .EQ 0 *-------------------------------------- CL.MAX .EQ 127 History.MAX .EQ 256 CMD.STACK.MAX .EQ 8 *-------------------------------------- C.STARTPROC .EQ 0 C.CD .EQ 2 C.DATE .EQ 4 C.ECHO .EQ 6 C.EXIT .EQ 8 C.IF .EQ 10 C.MD .EQ 12 C.PAUSE .EQ 14 C.PWD .EQ 16 C.RD .EQ 18 C.READ .EQ 20 C.REN .EQ 22 C.SET .EQ 24 C.SLEEP .EQ 26 C.TIME .EQ 28 *-------------------------------------- C.ELSE .EQ 30 C.FI .EQ 32 *-------------------------------------- .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 ZPCLBuf .EQ ZPBIN+6 ZPArgVBuf .EQ ZPBIN+8 ZPFileBufPtr .EQ ZPBIN+10 ZPCLBufPtr .EQ ZPBIN+12 .DO CSH=1 ZPCSHSymbols .EQ ZPBIN+14 ZPCSHData .EQ ZPBIN+16 ZPCSHValue .EQ ZPBIN+18 ZPCSHStack .EQ ZPBIN+20 .FIN *-------------------------------------- * 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 .DO CSH=1 .DA #22 ZP .ELSE .DA #14 ZP .FIN .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.TRACE .DA MSG.TRACE L.MSG.ECHOCRLF .DA MSG.ECHOCRLF L.MSG.BATCHERR .DA MSG.BATCHERR L.MSG.ERROR .DA MSG.ERROR L.MSG.PRINTENV .DA MSG.PRINTENV L.MSG.PID .DA MSG.PID 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.CL.IO .DA CL.IO J.CL.IO .DA CL.IO.AMP .DA CL.IO.PIPE .DA CL.IO.IN .DA CL.IO.OUTA .DA CL.IO.OUT .DA CL.IO.1OUTA .DA CL.IO.1OUT .DA CL.IO.2OUTA .DA CL.IO.2OUT 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.MD .DA Cmd.INT.PAUSE .DA Cmd.INT.PWD .DA Cmd.INT.RD .DA Cmd.INT.READ .DA Cmd.INT.REN .DA Cmd.INT.SET .DA Cmd.INT.SLEEP .DA Cmd.INT.TIME .DA Cmd.INT.ELSE .DA Cmd.INT.FI L.CMD.IF.TOKEN1 .DA CMD.IF.TOKEN1 L.CMD.IF.TOKEN2 .DA CMD.IF.TOKEN2 J.CMD.IF.TOKEN2 .DA CMD.IF.D .DA CMD.IF.E .DA CMD.IF.F L.CMD.IF.TOKEN3 .DA CMD.IF.TOKEN3 L.ERR.Codes .DA ERR.Codes L.ERR.Messages .DA ERR.Messages .DO CSH=1 .INB /A2OSX.SRC/SBIN/SHELL.R.CSH .FIN .DA 0 *-------------------------------------- CS.INIT clc CS.INIT.RTS rts *-------------------------------------- CS.RUN jsr SetPWD jsr CMD.Init bcs CS.INIT.RTS lda #1 >SYSCALL ArgV bcs .1 no arg, continue starting interactive >SYSCALL LoadTxtFile bcs CS.INIT.RTS txa >STA.G hFileBuf >SYSCALL GetMemPtr >STYA ZPFileBufPtr .DO CSH=1 jsr CSH.Init .FIN bra CS.RUN.LOOP .1 jsr HIS.Init bcs CS.INIT.RTS >PUSHWI K.VER >PUSHBI 2 >LDYA L.MSG.GREETINGS >SYSCALL printf bcs CS.INIT.RTS *-------------------------------------- CS.RUN.LOOP jsr CL.Reset jsr IO.Reset .1 jsr CheckSleep beq .3 >SLEEP >SYSCALL GetChar bcs .2 cmp #3 Ctrl-C bne .1 >LDA.G hFileBuf batch mode ? bne .8 bra .1 .2 tay beq .1 rts I/O err .3 >LDA.G bPause bpl .6 .4 >SLEEP >SYSCALL GetChar bcc .5 got one tay beq .4 no char rts I/O err .5 cmp #3 Ctrl-C bne .60 >LDA.G hFileBuf batch mode ? bne .8 bra .61 .60 cmp #C.CR bne .4 .61 >STZ.G bPause bra .62 .6 >LDA.G hVarName read mode ? bne .7 .62 >LDA.G hFileBuf batch mode ? beq CS.RUN.INTERCATIVE jmp CS.RUN.BATCH .7 jmp CS.RUN.READ .8 lda #3 User Interrupt .9 sec rts *-------------------------------------- CS.RUN.INTERCATIVE jsr CL.PrintPrompt bcs .9 .1 >SLEEP >SYSCALL GetChar bcc .2 tay beq .1 no char .9 rts I/O error .2 cmp #C.EOF ....or Ctrl-D beq .9 CS jsr CL.CHARIN >LDA.G CL.bExec Something to execute ? bpl .1 lda (ZPCLBuf) beq .8 Empty line jsr HIS.Add jmp CS.RUN.Exec .8 jmp CS.RUN.LOOP *-------------------------------------- CS.RUN.READ .1 >SLEEP >SYSCALL GetChar bcs .1 no char jsr CL.CHARIN >LDA.G CL.bExec bpl .1 lda (ZPCLBuf) bne .2 >LDA.G hVarName >SYSCALL GetMemPtr >SYSCALL UnSetEnv bra .7 .2 >PUSHW ZPCLBuf >LDA.G hVarName >SYSCALL GetMemPtr >SYSCALL SetEnv .7 php pha >LDA.G hVarName >SYSCALL freemem >STZ.G hVarName >STA.G bREAD.S pla plp .8 jmp CS.RUN.LOOP.END *-------------------------------------- CS.RUN.BATCH >SYSCALL GetChar bcs .2 cmp #3 test Ctrl-c bne .1 * sec .9 rts .1 cmp #19 test Ctrl-s bne .2 lda #$80 >STA.G bPause jmp CS.RUN.LOOP.END .2 .DO CSH=1 jsr CSH.Run .ELSE jsr CL.GetLine .FIN bcc .7 cmp #C.EOF bne .3 lda #$ff >STA.G bExit inc clc bra CS.RUN.LOOP.END .3 sec bra CS.RUN.LOOP.END .7 >LDA.G CL.bExec bpl CS.RUN.LOOP.80 lda (ZPCLBuf) beq CS.RUN.LOOP.80 >LDA.G bSET.X beq CS.RUN.Exec >PUSHW ZPCLBuf >PUSHBI 2 >LDYA L.MSG.TRACE >SYSCALL printf bcs .9 *-------------------------------------- CS.RUN.Exec jsr CL.Parse bcs CS.RUN.LOOP.END lda (ZPArgVBuf) beq CS.RUN.LOOP.8 jsr CMD.Exec *-------------------------------------- CS.RUN.LOOP.END ldy #S.PS.RC sta (pPs),y bcc CS.RUN.LOOP.8 >LDA.G hFileBuf batch mode ? beq .1 jsr IO.PrintBatchErrMsg bcs CS.RUN.LOOP.RTS .1 ldy #S.PS.RC lda (pPs),y jsr IO.PrintErrMsg bcs CS.RUN.LOOP.RTS CS.RUN.LOOP.8 >LDA.G bExit beq CS.RUN.LOOP.80 lda #0 sec CS.RUN.LOOP.RTS rts CS.RUN.LOOP.80 jmp CS.RUN.LOOP *-------------------------------------- CS.DOEVENT lda (pEvent) bpl .9 jsr CheckSleep beq .9 * ldy #Sleep already set by CheckSleep ldx #4 clc .1 lda (pData),y sbc #0 sta (pData),y iny dex bne .1 .9 sec rts *-------------------------------------- CS.QUIT .DO CSH=1 jsr CSH.Quit .FIN jsr HIS.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 SetPWD.I >SYSCALL GetMemPtr >PUSHYA >LDYA L.ENV.PWD >SYSCALL SetEnv rts *-------------------------------------- Lookup >STYA ZPPtr2 >PULLW ZPPtr1 ldx #0 .1 phx >PUSHW ZPPtr2 >LDYA ZPPtr1 >SYSCALL StrCaseCmp bcs .2 plx >LDYA ZPPtr2 clc rts .2 inc ZPPtr2 bne .3 inc ZPPtr2+1 .3 lda (ZPPtr2) bne .2 inc ZPPtr2 bne .4 inc ZPPtr2+1 .4 plx inx inx lda (ZPPtr2) Array Ending 0, must be an external Cmd.... bne .1 sec rts *-------------------------------------- .INB /A2OSX.SRC/SBIN/SHELL.S.CL .INB /A2OSX.SRC/SBIN/SHELL.S.CMD .INB /A2OSX.SRC/SBIN/SHELL.S.IO .INB /A2OSX.SRC/SBIN/SHELL.S.HIS .DO CSH=1 .INB /A2OSX.SRC/SBIN/SHELL.S.CSH .FIN *-------------------------------------- CS.END *-------------------------------------- MSG.GREETINGS .AZ "\r\nA2osX-Shell %d.%d\r\n\r\n" MSG.PROMPT .AZ "\e[7h$ " MSG.TRACE .AS ">%s" MSG.ECHOCRLF .AZ "\r\n" MSG.BATCHERR .AZ "^\r\nLine #%D:" MSG.ERROR .AZ "[$%h]:%S.\r\n" MSG.PRINTENV .AZ "%s=%s\r\n" MSG.PID .AZ "PID=%d\r\n" 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 *-------------------------------------- CL.IO .AZ "&" .AZ "|" .AZ "<" .AZ ">>" .AZ ">" .AZ "1>>" .AZ "1>" .AZ "2>>" .AZ "2>" .HS 00 *-------------------------------------- CMD.INT .AZ "STARTPROC" .AZ "CD" .AZ "DATE" .AZ "ECHO" .AZ "EXIT" .AZ "IF" .AZ "MD" .AZ "PAUSE" .AZ "PWD" .AZ "RD" .AZ "READ" .AZ "REN" .AZ "SET" .AZ "SLEEP" .AZ "TIME" .AZ "ELSE" .AZ "FI" .HS 00 *-------------------------------------- CMD.IF.TOKEN1 .AZ "![" .AZ "[" .HS 00 CMD.IF.TOKEN2 .AZ "-d" .AZ "-e" .AZ "-f" .HS 00 CMD.IF.TOKEN3 .AZ "=" .AZ "!=" .AZ "-eq" .AZ "-ne" .AZ "-lt" .AZ "-le" .AZ "-gt" .AZ "-ge" .HS 00 CMD.IF.TOKEN3.BITS .DA #%000 .DA #%000 .DA #%001 .DA #%110 .DA #%100 .DA #%101 .DA #%010 .DA #%011 *-------------------------------------- .DO CSH=1 .INB /A2OSX.SRC/SBIN/SHELL.C.CSH .FIN .INB /A2OSX.SRC/X.ERRORS.S *-------------------------------------- EscChars .AS 'DBAC' EscChars.Cnt .EQ *-EscChars *-------------------------------------- .DUMMY .OR 0 DS.START hFileBuf .BS 1 batch mode hVarName .BS 1 read mode bEscMode .BS 1 bPause .BS 1 bExit .BS 1 bSET.X .BS 1 bECHO.N .BS 1 bREAD.S .BS 1 Sleep .BS 4 CL.Ptr .BS 1 CL.Len .BS 1 CL.bExec .BS 1 CMD.hCLBuf .BS 1 CMD.IntCmd .BS 1 CMD.hCmdLine .BS 1 CMD.hArgVBuf .BS 1 CMD.ArgIndex .BS 1 CMD.Operator .BS 1 CMD.NumArg1 .BS 4 CMD.NumArg2 .BS 4 CMD.PSFlags .BS 1 CMD.Stat .BS S.STAT CMD.Time .BS S.TIME CMD.STACK.PTR .BS 1 CMD.STACK .BS CMD.STACK.MAX HIS.hBuf .BS 1 HIS.Count .BS 1 HIS.Index .BS 1 IO.hIn .BS 1 IO.hOut .BS 1 IO.hErr .BS 1 .DO CSH=1 .INB /A2OSX.SRC/SBIN/SHELL.G.CSH .FIN DS.END .ED *-------------------------------------- MAN SAVE /A2OSX.SRC/SBIN/SHELL.S ASM