A2osX/SBIN/SHELL.S.txt
2018-11-10 18:43:20 +01:00

522 lines
9.7 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
PREFIX /A2OSX.BUILD
AUTO 4,1
.LIST OFF
.OP 65C02
.OR $2000
.TF SBIN/SHELL
*--------------------------------------
CSH .EQ 0
*--------------------------------------
.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
ZPFileBufPtr .EQ ZPBIN+10
.DO CSH=1
ZPCSHSymbols .EQ ZPBIN+12
ZPCSHData .EQ ZPBIN+14
ZPCSHValue .EQ ZPBIN+16
ZPCSHStack .EQ ZPBIN+18
.FIN
*--------------------------------------
CmdLine.MAX .EQ 127
VarLen.MAX .EQ 15
History.MAX .EQ 256
CMD.IF.STACK.MAX .EQ 4
*--------------------------------------
* 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 #20 ZP
.ELSE
.DA #12 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.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.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.ELSE
.DA Cmd.INT.EXIT
.DA Cmd.INT.FI
.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.SET
.DA Cmd.INT.SLEEP
.DA Cmd.INT.TIME
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
lda #CMD.IF.PTR
tay
sta (pData),y
.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
>LDA.G bReadMode READ Command ?
bne .7
>LDA.G bPause
bpl .4
.2 >SLEEP
>SYSCALL GetChar
bcc .3
tay
beq .2 no char
rts
.3 cmp #3 Ctrl-C
beq .9
bra .6
>STZ.G bPause
.4 jsr CheckSleep
bne .2
.6 >LDA.G hFileBuf batch mode ?
beq CS.RUN.INTERCATIVE
jmp CS.RUN.BATCH
.7 jmp CS.RUN.READ
.9 sec
rts
*--------------------------------------
CS.RUN.INTERCATIVE
>STZ.G bSecureRead Clear password mode
jsr CL.PrintPrompt
bcs .9
.1 >SLEEP
>SYSCALL GetChar
bcc .21
tay
beq .1 no char
rts I/O error
.21 cmp #C.EOF
beq .9
jsr CL.CHARIN
>LDA.G CL.bExec Something to execute ?
bpl .1
lda (ZPCMDBuf)
beq CS.RUN.LOOP Empty line
jsr HIS.Add
jmp CS.RUN.Exec
.9 rts
*--------------------------------------
CS.RUN.READ
.1 >SLEEP
>SYSCALL GetChar
bcs .1 no char
jsr CL.CHARIN
>LDA.G CL.bExec
bpl .1
>STZ.G bReadMode
lda (ZPCMDBuf)
beq .8
>PUSHW ZPCMDBuf
>LEA.G CMD.VarName
>SYSCALL SetEnv
.8 jmp CS.RUN.LOOP.END
*--------------------------------------
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 .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 (ZPCMDBuf)
beq CS.RUN.LOOP.80
jsr CL.Trace
*--------------------------------------
CS.RUN.Exec jsr CL.Parse
bcs CS.RUN.LOOP.8
lda (ZPArgVBuf)
beq CS.RUN.LOOP.8
jsr CMD.Exec
>SLEEP if S.PS.HOLD
*--------------------------------------
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
clc
.1 lda (pData),y
sbc #0
sta (pData),y
iny
cpy #Sleep+4
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"
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 "ELSE"
.AZ "EXIT"
.AZ "FI"
.AZ "IF"
.AZ "MD"
.AZ "PAUSE"
.AZ "PWD"
.AZ "RD"
.AZ "READ"
.AZ "SET"
.AZ "SLEEP"
.AZ "TIME"
.HS 00
*--------------------------------------
CMD.IF.TOKEN1 .AZ "["
.AZ "!["
.HS 00
CMD.IF.TOKEN2 .AZ "-d"
.AZ "-e"
.AZ "-f"
.HS 00
CMD.IF.TOKEN3 .AZ "-eq"
.AZ "-ne"
.HS 00
*--------------------------------------
.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
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
CL.Ptr .BS 1
CL.Len .BS 1
CL.bExec .BS 1
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.IF.PTR .BS 1
CMD.IF.STACK .BS CMD.IF.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