A2osX/SBIN/SHELL.S.txt

645 lines
12 KiB
Plaintext
Raw Normal View History

2015-03-14 21:48:35 +00:00
PR#3
PREFIX /A2OSX.BUILD
LOMEM $A00
2015-03-14 21:48:35 +00:00
INC 1
AUTO 6
2015-10-19 20:35:00 +00:00
.LIST OFF
2015-03-14 21:48:35 +00:00
.OP 65C02
.OR $2000
.TF /A2OSX.BUILD/SBIN/SHELL
2015-03-14 21:48:35 +00:00
*--------------------------------------
.INB /A2OSX.BUILD/INC/MACROS.I
.INB /A2OSX.BUILD/INC/A2OSX.I
.INB /A2OSX.BUILD/INC/MLI.ERR.I
2015-03-14 21:48:35 +00:00
*--------------------------------------
ZPPtr1 .EQ ZPBIN
ZPPtr2 .EQ ZPBIN+2
ZPCMDBuf .EQ ZPBIN+4
ZPCSHBufPtr .EQ ZPBIN+6
ZPCSHSymbols .EQ ZPBIN+8
ZPCSHData .EQ ZPBIN+10
ZPCSHValue .EQ ZPBIN+12
ZPCSHStack .EQ ZPBIN+14
2015-03-14 21:48:35 +00:00
*--------------------------------------
CmdLine.MAX .EQ 255
VarLen.MAX .EQ 15
History.MAX .EQ 256
CSH.E.SYNTAX .EQ $7F
CSH.E.SOVERFLW .EQ $7E
CSH.E.NOVERFLW .EQ $7D
CSH.E.OOM .EQ $7C
CSH.E.DUP .EQ $7B
CSH.E.UNDEF .EQ $7A
CSH.E.TMISMATCH .EQ $79
2015-03-14 21:48:35 +00:00
*--------------------------------------
2015-06-03 18:30:57 +00:00
* File Header (16 Bytes)
2015-03-14 21:48:35 +00:00
*--------------------------------------
CS.START cld
jmp (.1,x)
2015-06-03 18:30:57 +00:00
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA 0
.DA CS.END-CS.START CS
.DA DS.END-DS.START DS
.DA #64 SS
.DA #16 ZP
2015-06-03 18:30:57 +00:00
.DA 0
*--------------------------------------
* Relocation Table
2015-10-19 20:35:00 +00:00
*--------------------------------------
2015-03-14 21:48:35 +00:00
.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.ERROR .DA MSG.ERROR
L.MSG.PRINTENV .DA MSG.PRINTENV
L.MSG.CSHERR .DA MSG.CSHERR
2015-10-19 20:35:00 +00:00
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 CmdLine.BS left arrow
.DA HIS.GetNext
.DA HIS.GetPrev
.DA CmdLine.NAK right arow
L.INTCMDS .DA INTCMDS
2016-08-17 06:25:58 +00:00
J.INTCMDS .DA Cmd.Exec.CD
.DA Cmd.Exec.DATE
.DA Cmd.Exec.ECHO
.DA Cmd.Exec.EXIT
.DA Cmd.Exec.PAUSE
.DA Cmd.Exec.PWD
2016-08-17 06:25:58 +00:00
.DA Cmd.Exec.READ
.DA Cmd.Exec.SET
.DA Cmd.Exec.SLEEP
2016-08-17 06:25:58 +00:00
.DA Cmd.Exec.STARTPROC
.DA Cmd.Exec.TIME
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.KEYWORDS .DA CSH.KEYWORDS
J.CSH.KEYWORDS .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.CHAR
.DA CSH.INT
.DA CSH.LONG
.DA CSH.FLOAT
J.CSH.KEYWORDS.START
.DA CSH.IF.START
.DA CSH.WHILE.START
J.CSH.KEYWORDS.END
.DA CSH.IF.END
.DA CSH.WHILE.END
L.ERR.Codes .DA ERR.Codes
L.ERR.Messages .DA ERR.Messages
2015-03-14 21:48:35 +00:00
.DA 0
*--------------------------------------
CS.INIT jsr SetPWD
jsr CMD.Init
bcs .9
lda (pPs)
ora #S.PS.F.EVENT Now accept events
sta (pPs)
ldy #S.PS.ARGC
lda (pPs),y
2015-10-19 20:35:00 +00:00
beq .1 no arg, continue starting interactive
jmp CSH.Init
.1 jsr HIS.Init
2015-10-19 20:35:00 +00:00
bcs .9
>LDYA L.MSG.GREETINGS
>SYSCALL PrintF.YA
.9 rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
CS.RUN >LDA.G bReadMode READ Command ?
bne CS.RUN.READ
ldy #S.PS.RC
lda (pPs),y
beq .11
jsr IO.PrintErrMsg
bcs CS.RUN.EXIT.RTS
.11 >LDA.G bPause
bpl .13
>SYSCALL GetChar
bcs .8
.13 jsr CheckSleep
bne .8
>LDA.G CSH.hBuf batch mode ?
beq .10
jmp CS.RUN.BATCH
*--------------------------------------
.10 jsr CmdLine.RESET reset CmdBuf
.12 jsr PrintPrompt
bcs CS.RUN.EXIT.RTS
.1 >SYSCALL Sleep
>SYSCALL GetChar
2017-01-12 17:43:45 +00:00
bcs .1 no char
2017-01-12 17:43:45 +00:00
jsr CS.CHARIN
>LDA.G bCmdBufExec Something to execute ?
2015-06-24 20:41:38 +00:00
bpl .1
>LDA.G CmdBuflen
beq .10 Empty line
jsr CMD.Parse
>LDA.G CmdBuflen
beq .10 Empty line
2016-08-17 06:25:58 +00:00
jsr HIS.Add
jsr CMD.Exec
bcs .2
lda #0
.2 ldy #S.PS.RC
sta (pPs),y
>LDA.G bExit
bne CS.RUN.EXIT
.8 clc
2015-03-14 21:48:35 +00:00
rts
CS.RUN.EXIT lda #0
CS.RUN.EXIT.ERR sec
CS.RUN.EXIT.RTS rts
*--------------------------------------
CS.RUN.READ lda #0 reset Buffer
sta (ZPCMDBuf)
.1 >SYSCALL Sleep
>SYSCALL GetChar
bcs .1 no char
jsr CS.CHARIN
>LDA.G bCmdBufExec
bpl .1
>PUSHW ZPCMDBuf
>PUSHEA.G CMD.VarName
>SYSCALL SetEnv
rts
*--------------------------------------
CS.RUN.BATCH jsr CSH.Run
bcc .7
cmp #MLI.E.EOF
beq .9
pha
jsr CSH.ErrorMsg
pla
ldy #S.PS.RC
sta (pPs),y
pha
ldy #bExitOnEOF
lda (pData),y
asl CS if bExitOnEOF
pla
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
2015-03-14 21:48:35 +00:00
*--------------------------------------
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
2015-12-13 21:29:51 +00:00
rts
2017-01-12 17:43:45 +00:00
*--------------------------------------
CS.CHARIN tax Save Char
>LDA.G CSH.hBuf Batch mode ?
beq .10
* Batch Mode
cpx #3 test Ctrl-c
bne .12
>LDA.G bExitOnEOF
>STA.G bExit
clc
rts
.12 cpx #19 test Ctrl-s
bne .8
lda #$80
>STA.G bPause
2015-12-13 21:29:51 +00:00
clc
rts
*--------------------------------------
* interactive mode
.10 >LDA.G bEscMode
2015-12-13 21:29:51 +00:00
beq .13
2015-12-13 21:29:51 +00:00
cpx #'['
beq .8
2015-12-13 21:29:51 +00:00
lda #0
sta (pData),y Y=bEscMode
2015-12-13 21:29:51 +00:00
txa
ldx #EscChars.count-1
2015-12-13 21:29:51 +00:00
.17 cmp EscChars,x
beq .18
dex
bpl .17
clc
rts
.18 txa
asl
2015-12-13 21:29:51 +00:00
tax
jmp (J.ESC,x)
*--------------------------------------
2015-12-13 21:29:51 +00:00
.13 cpx #$20
bcc CS.CHARIN.CTRL
2015-03-14 21:48:35 +00:00
2015-06-03 18:30:57 +00:00
.1 cpx #$7f
2015-03-14 21:48:35 +00:00
bne .2
jmp CmdLine.DEL
2015-03-14 21:48:35 +00:00
.2 >LDA.G CmdBuflen
cmp #CmdLine.MAX
beq .8 Buffer full, discard...
2015-06-03 18:30:57 +00:00
inc
sta (pData),y
clc Len-1-Ptr !!!!!
>SBC.G CmdBufPtr
beq .30
phx
tax
>LDA.G CmdBuflen
tay
.3 lda (ZPCMDBuf),y Move from Ptr To end of buffer forward...
iny
sta (ZPCMDBuf),y
dey
dey
dex
bne .3
plx
.30 >LDA.G CmdBufPtr Insert char at Ptr
tay
txa
sta (ZPCMDBuf),y
>SYSCALL PutChar.A
>INC.G CmdBufPtr
>CMP.G CmdBuflen
bne .8
tay
lda #0
sta (ZPCMDBuf),y
clc
rts
.8 jmp CmdLine.PRINTPTR
2015-03-14 21:48:35 +00:00
*--------------------------------------
CS.CHARIN.CTRL
cpx #13 CR
2015-03-14 21:48:35 +00:00
bne .10
txa
>SYSCALL PutChar.A
lda #10
>SYSCALL PutChar.A
>LDA.G CmdBufPtr
tay
lda #0
sta (ZPCMDBuf),y
tya
>STA.G CmdBuflen
lda #$ff
>STA.G bCmdBufexec
2015-03-14 21:48:35 +00:00
clc
rts
2015-12-13 21:29:51 +00:00
.10 cpx #$1B esc
bne .11
lda #$ff
>STA.G bEscMode
2015-12-13 21:29:51 +00:00
clc
rts
.11 cpx #3 Ctrl-C
2015-03-14 21:48:35 +00:00
bne .8
jsr CmdLine.CLR
2015-03-14 21:48:35 +00:00
clc
rts
.8 clc
2015-03-14 21:48:35 +00:00
rts
*--------------------------------------
2016-08-17 06:25:58 +00:00
CS.QUIT jsr HIS.Quit
jsr CSH.Quit
jsr CMD.Quit
clc
2015-03-14 21:48:35 +00:00
rts
*--------------------------------------
CheckSleep ldy #Sleep+3
lda (pData),y
dey
ora (pData),y
dey
ora (pData),y
dey
ora (pData),y
rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
SetPWD ldy #S.PS.hPREFIX
lda (pPs),y
>SYSCALL GetMemPtr.A
>PUSHYA
>PUSHW 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
2015-03-14 21:48:35 +00:00
*--------------------------------------
CS.END
*--------------------------------------
ENV.PATH >CSTR "PATH"
ENV.PWD >CSTR "PWD"
ENV.PS1 >CSTR "PS1"
ENV.HOME >CSTR "HOME"
*--------------------------------------
INTCMDS >CSTR "CD"
>CSTR "DATE"
>CSTR "ECHO"
>CSTR "EXIT"
>CSTR "PAUSE"
>CSTR "PWD"
>CSTR "READ"
>CSTR "SET"
>CSTR "SLEEP"
>CSTR "STARTPROC"
>CSTR "TIME"
2015-10-19 20:35:00 +00:00
.HS 00
*--------------------------------------
OPChars.Count .EQ 14
CSH.OPChars >PSTR "!~+-*/%=&|^&<>"
*--------------------------------------
* Pre Operators: + - ! ~ ++ --
*--------------------------------------
CSH.PREOOPS >PSTR "+"
>PSTR "-"
>PSTR "!"
>PSTR "~"
*--------------------------------------
* Post Operators: ++ --
*--------------------------------------
CSH.POSTOPS >PSTR "++"
>PSTR "--"
.HS 00
*--------------------------------------
* Assignment Operators: = += -= *= /= %= <<= >>= &= ^= |=
*--------------------------------------
CSH.AOPS >PSTR "="
>PSTR "+="
>PSTR "-="
>PSTR "*="
>PSTR "/="
>PSTR "%="
>PSTR "<<="
>PSTR ">>="
>PSTR "&="
>PSTR "^="
>PSTR "!="
.HS 00
*-- Binary ---- H to L prececence -----
* Arithmetic Operators: * / %
* Arithmetic Operators: + -
* Shift Operators: << >>
* Relational Operators: < > >= < >= == !=
* Bitwise Operators: & | ^ ~
* Logical Operators: && ||
*--------------------------------------
CSH.BOPS >PSTR "+"
>PSTR "-"
>PSTR "*"
>PSTR "/"
>PSTR "%"
>PSTR "<<"
>PSTR ">>"
>PSTR "<"
>PSTR ">"
>PSTR "<="
>PSTR ">="
>PSTR "=="
>PSTR "!="
>PSTR "&"
>PSTR "|"
>PSTR "^"
>PSTR "&&"
>PSTR "||"
.HS 00
*--------------------------------------
* Reserved Keywords:
*--------------------------------------
CSH.KEYWORDS >PSTR "if"
>PSTR "while"
>PSTR "else"
>PSTR "do"
>PSTR "for"
>PSTR "switch"
>PSTR "case"
>PSTR "break"
>PSTR "continue"
CSH.TYPES >PSTR "char"
>PSTR "int"
>PSTR "long"
>PSTR "float"
.HS 00
*--------------------------------------
* int printf ( const char * format, ... );
CSH.FUNCTIONS >PSTR "printf"
* float cos ( float x );
>PSTR "cos"
*--------------------------------------
MSG.GREETINGS >CSTR "\r\nA2osX-Shell 0.9.1\r\n\r\n"
2017-10-05 19:03:12 +00:00
MSG.PROMPT >CSTR "$ "
MSG.ECHO >CSTR ">%s\r\n"
MSG.ERROR >CSTR "[$%h]:%S.\r\n"
MSG.PRINTENV >CSTR "%s=%s\r\n"
MSG.CSHERR >CSTR "^\r\nLine #%D:"
FMT.DATE >CSTR "%A, %B %d %Y"
FMT.TIME >CSTR "%H:%M:%S (%I:%M:%S%p)"
*--------------------------------------
.INB /A2OSX.SRC/X.ERRORS.S
*--------------------------------------
EscChars.Count .EQ 4
EscChars .AS 'DBAC'
CSH.TSIZE .HS 0001020405 VOID,CHAR,INT,LONG,FLOAT....
2015-03-14 21:48:35 +00:00
*--------------------------------------
2015-06-03 18:30:57 +00:00
.DUMMY
.OR 0
2015-03-14 21:48:35 +00:00
DS.START
hCmdBuf .BS 1
CmdBufPtr .BS 1
CmdBuflen .BS 1
bCmdBufexec .BS 1
2015-12-13 21:29:51 +00:00
bEscMode .BS 1
bPause .BS 1
bExit .BS 1
2016-01-10 22:19:11 +00:00
bEcho .BS 1
2015-12-13 21:29:51 +00:00
bExitOnEOF .BS 1
bReadMode .BS 1
bSecureRead .BS 1
Sleep .BS 4
CMD.hCmdLine .BS 1
CMD.hFullpath .BS 1
CMD.bStartProc .BS 1
CMD.VarName .BS VarLen.MAX+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
CSH.hBuf .BS 1
CSH.BufPtrSave .BS 2
CSH.LineNum .BS 2
CSH.hSymbols .BS 1
CSH.SymbolsPtr .BS 1
CSH.hData .BS 1
CSH.DataPtr .BS 1
CSH.hStack .BS 1
CSH.StackPtr .BS 1
CSH.CmdSave .BS 1
CSH.ACCT .BS 1
CSH.ACC .BS 5
CSH.EXPBOP1 .BS 1
CSH.ARGT .BS 1
CSH.ARG .BS 5
CSH.EXPBOP2 .BS 1
DS.END .ED
2015-03-14 21:48:35 +00:00
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SBIN/SHELL.S
2015-03-14 21:48:35 +00:00
ASM