A2osX/SBIN/SHELL.S.txt
2018-10-17 17:31:29 +02:00

450 lines
8.4 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
*--------------------------------------
.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
ZPPtr4 .EQ ZPBIN+6
ZPCMDBuf .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 255
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.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.STARTPROC
.DA Cmd.INT.TIME
L.CMD.IOR .DA CMD.IOR
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 ?
bne CS.RUN.READ
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
>STA.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
jsr CMD.Parse
lda (ZPCMDBuf)
beq .10 Empty line
jsr HIS.Add
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
.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....
jsr CMD.Parse
lda (ZPCMDBuf)
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.IOR .AZ "&"
.AZ "|"
.AZ "<"
.AZ ">>"
.AZ ">"
.AZ "1>>"
.AZ "1>"
.AZ "2>>"
.AZ "2>"
.HS 00
*--------------------------------------
CMD.INT .AZ "CD"
.AZ "DATE"
.AZ "ECHO"
.AZ "EXIT"
.AZ "IF"
.AZ "PAUSE"
.AZ "PWD"
.AZ "READ"
.AZ "SET"
.AZ "SLEEP"
.AZ "STARTPROC"
.AZ "TIME"
.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
hCmdBuf .BS 1
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.hCmdLine .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