A2osX/BIN/SHELL.S.txt
2018-12-03 14:56:52 +01:00

707 lines
13 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
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
.DO CSH=1
.INB USR/SRC/BIN/SHELL.R.CSH
.FIN
.DA 0
*--------------------------------------
CS.INIT clc
CS.INIT.RTS rts
*--------------------------------------
CS.RUN jsr CMD.Init
bcs CS.INIT.RTS
ldy #S.PS.ARGC
lda (pPS),y
beq .1 no arg, continue starting interactive
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 #$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
*--------------------------------------
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"
*--------------------------------------
* 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