NEW PREFIX AUTO 4,1 .LIST OFF .OP 65C02 .OR $2000 .TF BIN/SHELL *-------------------------------------- CSH .EQ 0 *-------------------------------------- CL.MAX .EQ 127 History.MAX .EQ 256 CMD.STACK.MAX .EQ 64 PUSHD.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.MD .EQ 10 C.PAUSE .EQ 12 C.PWD .EQ 14 C.RD .EQ 16 C.READ .EQ 18 C.REN .EQ 20 C.SET .EQ 22 C.SLEEP .EQ 24 C.SHIFT .EQ 26 C.TIME .EQ 28 C.PUSHD .EQ 30 C.POPD .EQ 32 C.BREAK .EQ 34 C.CONTINUE .EQ 36 *-------------------------------------- C.FOR .EQ 38 C.NEXT .EQ 40 C.WHILE .EQ 42 C.LOOP .EQ 44 C.IF .EQ 46 C.ELSE .EQ 48 C.FI .EQ 50 *-------------------------------------- E.CSYN .EQ $C0 E.SSYN .EQ $C1 E.ESYN .EQ $C1 E.STKOVERFLOW .EQ $C3 E.NOWHILE .EQ $C4 E.NOFOR .EQ $C5 E.NOIF .EQ $C6 E.BADEXP .EQ $C7 E.BADFTYPE .EQ $C8 *-------------------------------------- .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.ROOT .DA ENV.ROOT 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.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.SHIFT .DA Cmd.INT.TIME .DA Cmd.INT.PUSHD .DA Cmd.INT.POPD .DA Cmd.INT.BREAK .DA Cmd.INT.CONTINUE .DA Cmd.INT.FOR .DA Cmd.INT.NEXT .DA Cmd.INT.WHILE .DA Cmd.INT.LOOP .DA Cmd.INT.IF .DA Cmd.INT.ELSE .DA Cmd.INT.FI L.CMD.Eval.TOKEN1 .DA CMD.Eval.TOKEN1 L.CMD.Eval.TOKEN2 .DA CMD.Eval.TOKEN2 J.CMD.Eval.TOKEN2 .DA CMD.Eval.D .DA CMD.Eval.E .DA CMD.Eval.F L.CMD.Eval.TOKEN3 .DA CMD.Eval.TOKEN3 L.CMD.Eval.TOKEN4 .DA CMD.Eval.TOKEN4 J.CMD.Eval.TOKEN4 .DA M32.Add .DA M32.Sub .DA M32.Mul .DA M32.Div .DA M32.Mod L.M32.Printf .DA M32.Printf L.ERR.Codes .DA ERR.Codes L.ERR.Messages .DA ERR.Messages L.MSG.DEBUG .DA MSG.DEBUG .DO CSH=1 .INB USR/SRC/BIN/SHELL.R.CSH .FIN .DA 0 *-------------------------------------- CS.DEBUG >PUSHWI K.VER >PUSHBI 2 >LDYA L.MSG.GREETINGS >SYSCALL printf lda #0 >SYSCALL ArgV >PUSHYA >PUSHBI 2 >LDYA L.MSG.DEBUG >SYSCALL printf lda #1 >SYSCALL ArgV >PUSHYA >PUSHBI 2 >LDYA L.MSG.DEBUG >SYSCALL printf rts *-------------------------------------- CS.INIT clc CS.INIT.RTS rts *-------------------------------------- CS.RUN lda #"I" sta $819 sta $817 jsr CMD.Init bcs CS.INIT.RTS ldy #S.PS.ARGC lda (pPS),y beq .1 no arg, continue starting interactive jsr CS.DEBUG lda #1 >SYSCALL ArgV >SYSCALL LoadTxtFile bcs CS.INIT.RTS txa >STA.G hFileBuf >SYSCALL GetMemPtr >STYA ZPFileBufPtr lda #0 jsr ShiftA Remove $0=/bin/shell .DO CSH=1 jsr CSH.Init .FIN bra CS.RUN.LOOP .1 jsr Cmd.INT.CD.HOME 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.INTERACTIVE jmp CS.RUN.BATCH .7 jmp CS.RUN.READ .8 lda #3 User Interrupt .9 sec rts *-------------------------------------- CS.RUN.INTERACTIVE 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 clc 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 #"\" sta $819 lda #$ff >STA.G bExit inc clc bra CS.RUN.LOOP.END .3 sec bra CS.RUN.LOOP.END .7 inc $817 >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 *-------------------------------------- ShiftA >SYSCALL ArgV bcs .8 >STYA ZPPtr1 >STYA ZPPtr2 .10 ldy #$ff .1 iny Compute ArgX len lda (ZPPtr1),y bne .1 .2 tya sec adc ZPPtr1 sta ZPPtr1 bcc .3 inc ZPPtr1+1 .3 ldy #$ff .4 iny lda (ZPPtr1),y sta (ZPPtr2),y bne .4 tya beq .7 sec adc ZPPtr2 sta ZPPtr2 bcc .2 inc ZPPtr2+1 bra .2 .7 ldy #S.PS.ARGC lda (pPS),y dec sta (pPS),y .8 clc 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 USR/SRC/BIN/SHELL.S.CL .INB USR/SRC/BIN/SHELL.S.CMD .INB USR/SRC/BIN/SHELL.S.IO .INB USR/SRC/BIN/SHELL.S.HIS .DO CSH=1 .INB USR/SRC/BIN/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.BATCHERR .AZ "^\r\nLine #%D:" MSG.ERROR .AS "[$%h]:%S." MSG.ECHOCRLF .AZ "\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.ROOT .AZ "ROOT" ENV.PATH .AZ "PATH" ENV.PWD .AZ "PWD" ENV.PS1 .AZ "PS1" ENV.HOME .AZ "HOME" MSG.DEBUG .AZ "{%s}\r\n" *-------------------------------------- * 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 "MD" .AZ "PAUSE" .AZ "PWD" .AZ "RD" .AZ "READ" .AZ "REN" .AZ "SET" .AZ "SLEEP" .AZ "SHIFT" .AZ "TIME" .AZ "PUSHD" .AZ "POPD" .AZ "BREAK" .AZ "CONTINUE" .AZ "FOR" .AZ "NEXT" .AZ "WHILE" .AZ "LOOP" .AZ "IF" .AZ "ELSE" .AZ "FI" .HS 00 *-------------------------------------- CMD.Eval.TOKEN1 .AZ "![" .AZ "[" .HS 00 CMD.Eval.TOKEN2 .AZ "-d" .AZ "-e" .AZ "-f" .HS 00 CMD.Eval.TOKEN3 .AZ "=" .AZ "!=" .AZ "-eq" .AZ "-ne" .AZ "-lt" .AZ "-le" .AZ "-gt" .AZ "-ge" .HS 00 CMD.Eval.TOKEN3.BITS .DA #%000 .DA #%000 .DA #%010 .DA #%101 .DA #%100 .DA #%110 .DA #%001 .DA #%011 CMD.Eval.TOKEN4 .AZ "+" .AZ "-" .AZ "*" .AZ "div" .AZ "mod" .HS 00 *-------------------------------------- .DO CSH=1 .INB USR/SRC/BIN/SHELL.C.CSH .FIN .INB USR/SRC/X.M32.S .INB USR/SRC/X.ERRORS.S *-------------------------------------- EscChars .AS 'DBAC' EscChars.Cnt .EQ *-EscChars M32.Printf .AZ "%L" *-------------------------------------- .DUMMY .OR 0 DS.START CMD.STACK .BS CMD.STACK.MAX+1 pData (0 = Stack Ptr) PUSHD.STACK .BS PUSHD.STACK.MAX+1 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.FileBufPtr .BS 2 CMD.IntCmd .BS 1 CMD.hCmdLine .BS 1 CMD.hArgVBuf .BS 1 CMD.ArgIndex .BS 1 CMD.Varname .BS 1 CMD.Test .BS 1 CMD.Operator .BS 1 CMD.PSFlags .BS 1 CMD.Stat .BS S.STAT CMD.Time .BS S.TIME 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 USR/SRC/BIN/SHELL.G.CSH .FIN M32.BUF .BS 12 -1234567890\0 M32.ACC .BS 4 M32.ARG .BS 4 M32.TMP .BS 4 DS.END .ED *-------------------------------------- MAN SAVE USR/SRC/BIN/SHELL.S ASM