A2osX/SBIN/SHELL.S.txt

614 lines
11 KiB
Plaintext
Raw Normal View History

2015-03-14 21:48:35 +00:00
PR#3
PREFIX /A2OSX.BUILD
2015-03-14 21:48:35 +00:00
NEW
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
ZPPTR3 .EQ ZPBIN+4
ZPBufBase .EQ ZPBIN+8
ZPBufPtr .EQ ZPBIN+10
ZPBufEnd .EQ ZPBIN+12
ZPCSHStack .EQ ZPBIN+14
2015-03-14 21:48:35 +00:00
*--------------------------------------
CmdLine.MAX .EQ 127
VarLen.MAX .EQ 15
CSH.Stack.MAX .EQ 15
CSHERR.SYNTAX .EQ $7F
CSHERR.SOVERFLW .EQ $7E
CSHERR.NOVERFLW .EQ $7D
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 Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
.DA 0
.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
2016-08-17 06:25:58 +00:00
L.CMD .DA CMD
L.ARGS .DA ARGS
L.TIME .DA TIME
L.STAT .DA STAT
L.FMT.DATE .DA FMT.DATE
L.FMT.TIME .DA FMT.TIME
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.STARTPROC
.DA Cmd.Exec.TIME
L.CSHCMDS .DA CSHCMDS
J.CSHCMDS .DA CSH.IF
.DA CSH.WHILE
.DA CSH.BREAK
.DA CSH.CONTINUE
J.CSHCMDS.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
* lda (pPs)
* ora #S.PS.F.EVENT Now accept events
* sta (pPs)
>SYSCALL GetArgC
2016-08-17 06:25:58 +00:00
cmp #1
2015-10-19 20:35:00 +00:00
beq .1 no arg, continue starting interactive
2016-08-17 06:25:58 +00:00
>PUSHWI 0 Aux type
>PUSHBI 4 S.FILEINFO.TYPE.TXT
>PUSHBI SYS.FOpen.R
2016-08-17 06:25:58 +00:00
lda #1
>SYSCALL GetArgA
>PUSHYA
>SYSCALL LoadFile
bcs .9
2015-10-19 20:35:00 +00:00
phy
ldy #CSH.BufLen+1
sta (pData),y
dey
pla
sta (pData),y
txa
ldy #CSH.hBuf
sta (pData),y
ldy #bExitOnEOF
lda #$FF
sta (pData),y
jmp CSH.Reset
.1 jsr HIS.Init
2015-10-19 20:35:00 +00:00
bcs .9
>LDYA L.MSG.GREETINGS
>SYSCALL PPrintFYA
2015-03-14 21:48:35 +00:00
* clc
2015-10-19 20:35:00 +00:00
.9 rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
CS.RUN ldy #bPause
lda (pData),y
bmi .8
2015-03-14 21:48:35 +00:00
ldy #VarBuffer READ Command ?
lda (pData),y
bne CS.RUN.READ
ldy #S.PS.RC
lda (pPs),y
beq .11
jsr ERR.Print
bcs CS.RUN.EXIT.RTS
.11 ldy #CSH.hBuf batch mode ?
lda (pData),y
beq .10
jmp CS.RUN.BATCH
.10 lda #0
sta (pData)
ldy #bSecureRead
sta (pData),y
.12 jsr PrintPrompt
bcs CS.RUN.EXIT.RTS
.1 >SYSCALL Sleep
2017-01-12 17:43:45 +00:00
>SYSCALL GetC
bcs .1 no char
jsr CS.CHARIN
2015-06-24 20:41:38 +00:00
lda (pData)
bpl .1
2017-01-12 17:43:45 +00:00
and #$7F
2015-06-03 18:30:57 +00:00
sta (pData)
jsr CmdBuffer.Normalize
2016-08-17 06:25:58 +00:00
lda (pData)
beq .12 Empty line
2016-08-17 06:25:58 +00:00
jsr HIS.Add
>LDYA pData
2016-08-17 06:25:58 +00:00
jsr Cmd.ExecYA
ldy #S.PS.RC
sta (pPs),y
2015-03-14 21:48:35 +00:00
.8 ldy #bEXIT
2015-06-03 18:30:57 +00:00
lda (pData),y
bne CS.RUN.EXIT
2015-06-03 18:30:57 +00:00
2015-03-14 21:48:35 +00:00
clc
rts
CS.RUN.EXIT lda #0
CS.RUN.EXIT.ERR sec
CS.RUN.EXIT.RTS rts
*--------------------------------------
CS.RUN.READ lda #0
sta (pData)
.1 >SYSCALL Sleep
>SYSCALL GetC
bcs .1 no char
jsr CS.CHARIN
lda (pData)
bpl .1
and #$7F
sta (pData)
>PUSHW pData
lda #VarBuffer
clc
adc pData
tay
lda pData+1
adc #0
>PUSHYA
>SYSCALL SetEnv
php
pha
ldy #VarBuffer
lda #0
sta (pData),y
pla
plp
rts
*--------------------------------------
CS.RUN.BATCH jsr CSH.Exec
bcs .9
jsr CmdBuffer.Normalize
lda (pData)
beq .8 Empty line....nothing to do....
>LDYA pData
jsr Cmd.ExecYA
.8 ldy #S.PS.RC
sta (pPs),y
clc
rts
.9 cmp #MLI.ERR.EOF
beq .98
pha
ldy #CSH.BufPtr+1
>PUSHB (pData),y
dey
>PUSHB (pData),y
>LDYA L.MSG.CSHERR
>SYSCALL PPrintFYA
.90 jsr CSH.GetChar
bcs .91
>SYSCALL PutCA
jsr CSH.GetNextChar
bcs .91
cmp #13
beq .91
>SYSCALL PutCA
bra .90
.91 pla
bra .99
.98 lda #0
.99 ldy #S.PS.RC
sta (pPs),y
pha
ldy #bExitOnEOF
lda (pData),y
asl CS if bExitOnEOF
pla
rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
2017-01-12 17:43:45 +00:00
CS.DOEVENT sec
2015-12-13 21:29:51 +00:00
rts
2017-01-12 17:43:45 +00:00
*--------------------------------------
CS.CHARIN tax
ldy #CSH.hBuf Batch mode ?
lda (pData),y
beq .10
2015-12-13 21:29:51 +00:00
* Batch Mode
cpx #3 test Ctrl-c
bne .12
ldy #bExitOnEOF
lda (pData),y
ldy #bExit
sta (pData),y
clc
rts
.12 cpx #19 test Ctrl-s
bne .8
ldy #bPause
lda #$80
sta (pData),y
2015-12-13 21:29:51 +00:00
clc
rts
* interactive mode
.10 ldy #bEscMode
lda (pData),y
beq .13
cpx #'['
beq .8
lda #0
sta (pData),y
txa
ldx EscChars
.17 cmp EscChars,x
beq .18
dex
bne .17
bra .8
2015-12-13 21:29:51 +00:00
.18 lda EscAscii,x
tax
.13 cpx #$20
2015-06-03 18:30:57 +00:00
bcs .1
2017-01-12 17:43:45 +00:00
jsr CS.CHARIN.CTRL
2015-03-14 21:48:35 +00:00
bra .8
2015-06-03 18:30:57 +00:00
.1 cpx #$7f
2015-03-14 21:48:35 +00:00
bne .2
jsr CmdBuffer.DEL
2015-12-13 21:29:51 +00:00
clc
rts
2015-03-14 21:48:35 +00:00
2015-06-03 18:30:57 +00:00
.2 lda (pData) CmdBuffer
cmp #CmdLine.MAX
2015-03-14 21:48:35 +00:00
beq .8
2015-06-03 18:30:57 +00:00
inc
sta (pData)
tay
txa
sta (pData),y
tax
ldy #bSecureRead
lda (pData),y
bne .8
txa
2017-01-12 17:43:45 +00:00
>SYSCALL PutCA
2015-03-14 21:48:35 +00:00
2015-06-03 18:30:57 +00:00
.8 clc
2015-03-14 21:48:35 +00:00
rts
*--------------------------------------
2017-01-12 17:43:45 +00:00
CS.CHARIN.CTRL cpx #13 CR
2015-03-14 21:48:35 +00:00
bne .10
txa
2017-01-12 17:43:45 +00:00
>SYSCALL PutCA
lda #10
>SYSCALL PutCA
2015-06-03 18:30:57 +00:00
lda (pData) CmdBuffer
2015-03-14 21:48:35 +00:00
ora #$80
2015-06-03 18:30:57 +00:00
sta (pData)
2015-03-14 21:48:35 +00:00
clc
rts
2015-12-13 21:29:51 +00:00
.10 cpx #$1B esc
bne .11
ldy #bEscMode
lda #$ff
sta (pData),y
clc
rts
.11 cpx #3 Ctrl-C
2015-03-14 21:48:35 +00:00
bne .1
2015-03-14 21:48:35 +00:00
jsr CmdBuffer.CLR
clc
rts
.1 cpx #8 BS (left arrow)
2015-03-14 21:48:35 +00:00
bne .2
jsr CmdBuffer.DEL
clc
rts
.2 cpx #10 LF (down arrow)
2015-03-14 21:48:35 +00:00
bne .3
2016-09-22 06:19:49 +00:00
jsr HIS.GetNext
2015-03-14 21:48:35 +00:00
clc
rts
.3 cpx #11 VT (up arrow)
2015-03-14 21:48:35 +00:00
bne .4
2016-09-22 06:19:49 +00:00
jsr HIS.GetPrev
2015-03-14 21:48:35 +00:00
clc
rts
.4 cpx #21 NAK (right arrow)
2015-03-14 21:48:35 +00:00
bne .8
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
ldy #CSH.hBuf
lda (pData),y
beq .1
>SYSCALL FreeMemA
.1 ldy #CSH.hStack
lda (pData),y
beq .8
>SYSCALL FreeMemA
2016-08-17 06:25:58 +00:00
.8 clc
2015-03-14 21:48:35 +00:00
rts
*--------------------------------------
* PRIVATE
*--------------------------------------
SetPWD ldy #S.PS.hPREFIX
lda (pPs),y
>SYSCALL GetMemPtrA
>PUSHYA
>PUSHW L.ENV.PWD
>SYSCALL SetEnv
rts
*--------------------------------------
PrintPrompt >LDYA L.ENV.PS1
>SYSCALL GetEnvYA
>SYSCALL ExpandPStrYA
phx
>PUSHYA
>LDYA L.MSG.PROMPT
>SYSCALL PPrintFYA
plx
php
pha
txa
>SYSCALL FreeMemA
pla
plp
.9 rts
*--------------------------------------
2016-08-17 06:25:58 +00:00
* Remove extra SPACE & comment
*--------------------------------------
CmdBuffer.Normalize
>LDYA pData
>STYA ZPPtr1
lda (pData) empty line...quit
beq .9
tax Char count
ldy #0
.1 jsr CmdBuffer.Normalize.Next
beq .8 no more char, exit
cmp #' ' skip leading spaces
beq .1
cmp #'#' Comment ?
beq .8 ignore remaining chars
.3 iny add char to buffer
sta (pData),y
jsr CmdBuffer.Normalize.Next
beq .8
cmp #' '
bne .3
iny add One SPACE to buffer
sta (pData),y
.5 jsr CmdBuffer.Normalize.Next
beq .8
cmp #' '
beq .5 skip additional spaces
bne .3 no more space, add next word...
.8 tya
sta (pData)
.9 rts
2016-08-17 06:25:58 +00:00
CmdBuffer.Normalize.Next
txa
beq .8
dex
inc ZPPtr1
bne .1
inc ZPPtr1+1
.1 lda (ZPPtr1)
.8 rts
*--------------------------------------
2015-03-14 21:48:35 +00:00
CmdBuffer.CLR jsr CmdBuffer.DEL
bne CmdBuffer.CLR
2015-10-19 20:35:00 +00:00
rts
2015-03-14 21:48:35 +00:00
*--------------------------------------
2015-06-03 18:30:57 +00:00
CmdBuffer.DEL lda (pData)
2015-03-14 21:48:35 +00:00
beq .9
lda #8
2017-01-12 17:43:45 +00:00
>SYSCALL PutCA
2015-06-03 18:30:57 +00:00
lda (pData)
dec
sta (pData)
2015-03-14 21:48:35 +00:00
.9 rts
2015-10-19 20:35:00 +00:00
*--------------------------------------
.INB /A2OSX.SRC/SBIN/SHELL.S.CMD
.INB /A2OSX.SRC/SBIN/SHELL.S.CSH
.INB /A2OSX.SRC/SBIN/SHELL.S.ERR
.INB /A2OSX.SRC/SBIN/SHELL.S.HIS
2015-03-14 21:48:35 +00:00
*--------------------------------------
CS.END
*--------------------------------------
ENV.PATH >PSTR "PATH"
ENV.PWD >PSTR "PWD"
ENV.PS1 >PSTR "PS1"
INTCMDS >PSTR "CD"
>PSTR "DATE"
>PSTR "ECHO"
>PSTR "EXIT"
>PSTR "PAUSE"
>PSTR "PWD"
>PSTR "READ"
>PSTR "SET"
>PSTR "STARTPROC"
>PSTR "TIME"
2015-10-19 20:35:00 +00:00
.HS 00
CSHCMDS >PSTR "IF"
>PSTR "WHILE"
>PSTR "BREAK"
>PSTR "CONTINUE"
.HS 00
2015-03-14 21:48:35 +00:00
*--------------------------------------
MSG.GREETINGS >PSTR "\r\nA2osX-Shell\r\n\r\n"
MSG.PROMPT >PSTR "%S$ "
MSG.ECHO >PSTR ">%S\r\n"
MSG.ERROR >PSTR "Err:%S [%h]\r\n"
MSG.PRINTENV >PSTR "%S=%S\r\n"
MSG.CSHERR >PSTR "Pos %D:"
FMT.DATE >PSTR "%A, %B %d %Y"
FMT.TIME >PSTR "%H:%M:%S (%I:%M:%S%p)"
*--------------------------------------
.INB /A2OSX.SRC/X.ERRORS.S
*--------------------------------------
EscChars >PSTR "DBAC"
2015-12-13 21:29:51 +00:00
EscAscii .HS 04080A0B15
2016-08-17 06:25:58 +00:00
CMD .BS 256
ARGS .BS 256
TIME .BS S.TIME
STAT .BS S.STAT
bStartProc .BS 1
CSH.ACC .BS 4
CSH.ARG .BS 4
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
CmdBuffer .BS CmdLine.MAX+1 (pData)
VarBuffer .BS VarLen.MAX+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
bSecureRead .BS 1
2015-12-13 21:29:51 +00:00
bExitOnEOF .BS 1
2015-06-24 20:41:38 +00:00
hCmdHistory .BS 1
2015-10-19 20:35:00 +00:00
CmdHistory.IDX .BS 1
2015-12-13 21:29:51 +00:00
CmdHistory.END .BS 1
CSH.hBuf .BS 1
CSH.BufPtr .BS 2
CSH.BufLen .BS 2
CSH.CmdSave .BS 1
CSH.SepSave .BS 1
CSH.BufPtrSave .BS 2
CSH.hStack .BS 1
CSH.StackPtr .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