A2osX/SBIN/SHELL.S.CL.txt

639 lines
11 KiB
Plaintext
Raw Normal View History

NEW
2018-11-17 17:17:13 +00:00
PREFIX
AUTO 4,1
.LIST OFF
*--------------------------------------
2018-09-13 15:29:02 +00:00
CL.PrintPrompt >LDYA L.ENV.PS1
2018-07-13 14:38:24 +00:00
>SYSCALL GetEnv
2018-09-13 15:29:02 +00:00
bcs .1
2018-07-13 14:38:24 +00:00
>SYSCALL ExpandStr
2018-09-13 15:29:02 +00:00
bcs .9
phx
2018-09-13 15:29:02 +00:00
pha
>PUSHBI 0
pla
2018-06-21 15:12:10 +00:00
>SYSCALL printf
2018-09-13 15:29:02 +00:00
pla
>SYSCALL FreeMem
2018-08-22 15:23:27 +00:00
2018-09-13 15:29:02 +00:00
.1 >PUSHBI 0
>LDYA L.MSG.PROMPT
2018-06-21 15:12:10 +00:00
>SYSCALL printf
2018-09-13 15:29:02 +00:00
.9 rts
*--------------------------------------
CL.CHARIN tax
>LDA.G bEscMode
beq .13
cpx #'['
beq .9
lda #0
sta (pData),y Y=bEscMode
txa
2018-09-14 13:08:30 +00:00
ldx #EscChars.Cnt-1
.17 cmp EscChars,x
beq .18
dex
bpl .17
clc
rts
.18 txa
asl
tax
jmp (J.ESC,x)
*--------------------------------------
.13 cpx #$20
bcc CL.CHARIN.CTRL
.1 cpx #$7f
bne .2
jmp CL.DEL
.2 jmp CL.Insert
.9 clc
rts
*--------------------------------------
2018-09-09 08:11:42 +00:00
CL.CHARIN.CTRL cpx #C.CR
bne .10
2018-09-09 08:11:42 +00:00
>PUSHBI 0
>LDYA L.MSG.ECHOCRLF
>SYSCALL printf
2018-11-10 14:30:09 +00:00
>LDA.G CL.Ptr
tay
lda #0
sta (ZPCLBuf),y
tya
2018-11-10 14:30:09 +00:00
>STA.G CL.Len
lda #$ff
2018-11-10 14:30:09 +00:00
>STA.G CL.bExec
clc
rts
2018-09-09 08:11:42 +00:00
.10 cpx #C.ESC
bne .11
lda #$ff
>STA.G bEscMode
clc
rts
.11 cpx #3 Ctrl-C
bne .12
jmp CL.CLR
.12 cpx #24 Ctrl-X
bne .13
jmp CL.SUPPR
.13 clc
rts
*--------------------------------------
2018-11-10 14:30:09 +00:00
CL.Insert >LDA.G CL.Len
cmp #CL.MAX
beq .9 Buffer full, discard...
inc
sta (pData),y
pha
.1 ply
dey
lda (ZPCLBuf),y Move from Ptr To end of buffer forward...
iny
sta (ZPCLBuf),y
dey
phy
tya
2018-11-10 14:30:09 +00:00
>CMP.G CL.Ptr
bne .1
2018-11-10 14:30:09 +00:00
ply Y=CL.Ptr
2018-11-10 14:30:09 +00:00
* >LDA.G CL.Ptr
txa
sta (ZPCLBuf),y
>LDA.G bREAD.S
2018-09-17 06:16:45 +00:00
bpl .2
ldx #'*'
.2 txa
2018-07-13 14:38:24 +00:00
>SYSCALL PutChar
2018-11-10 14:30:09 +00:00
>INC.G CL.Ptr
jmp CL.PrintEOL
.9 clc
rts
*--------------------------------------
CL.CLR lda (ZPCLBuf)
beq CL.RESET.1
ldy #0
.1 lda #$7F
sta (ZPCLBuf),y
iny
lda (ZPCLBuf),y
bne .1
2018-11-10 14:30:09 +00:00
jsr CL.PrintCmdBuf
*--------------------------------------
CL.RESET lda #0
sta (ZPCLBuf)
CL.RESET.1 >STA.G CL.bExec
2018-11-10 14:30:09 +00:00
>STA.G CL.Ptr
>STA.G CL.Len
rts
*--------------------------------------
2018-11-10 14:30:09 +00:00
CL.BS >LDA.G CL.Ptr
beq .9
dec
sta (pData),y
2018-09-09 08:11:42 +00:00
lda #C.BS
2018-07-13 14:38:24 +00:00
>SYSCALL PutChar
.9 rts
*--------------------------------------
2018-11-10 14:30:09 +00:00
CL.NAK >LDA.G CL.Ptr
>CMP.G CL.Len
beq .9
inc
2018-11-10 14:30:09 +00:00
>STA.G CL.Ptr
2018-09-09 08:11:42 +00:00
lda #C.FS
2018-07-13 14:38:24 +00:00
>SYSCALL PutChar
.9 rts
*--------------------------------------
* Erase char UNDER cursor
*--------------------------------------
2018-11-10 14:30:09 +00:00
CL.SUPPR >LDA.G CL.Len
beq CL.PrintEOL.8
2018-11-10 14:30:09 +00:00
>LDA.G CL.Ptr
bra CL.DEL.1
*--------------------------------------
* Erase char BEFORE cursor
*--------------------------------------
2018-11-10 14:30:09 +00:00
CL.DEL >LDA.G CL.Len
beq CL.PrintEOL.8
2018-11-10 14:30:09 +00:00
>LDA.G CL.Ptr
beq CL.PrintEOL.8
2018-09-09 08:11:42 +00:00
lda #C.BS
2018-07-13 14:38:24 +00:00
>SYSCALL PutChar
2018-11-10 14:30:09 +00:00
>DEC.G CL.Ptr
CL.DEL.1 pha
.1 ply
iny
lda (ZPCLBuf),y
dey
sta (ZPCLBuf),y
iny
phy
tya
2018-11-10 14:30:09 +00:00
>CMP.G CL.Len
bne .1
pla
2018-11-10 14:30:09 +00:00
>DEC.G CL.Len
*--------------------------------------
2018-11-10 14:30:09 +00:00
CL.PrintEOL >LDA.G CL.Ptr
2018-11-10 14:30:09 +00:00
.1 >CMP.G CL.Len
beq .2
pha
tay
lda (ZPCLBuf),y
2018-07-13 14:38:24 +00:00
>SYSCALL PutChar
pla
inc
bra .1
.2 lda #' '
2018-07-13 14:38:24 +00:00
>SYSCALL PutChar
2018-11-10 14:30:09 +00:00
>LDA.G CL.Ptr
2018-11-10 14:30:09 +00:00
.3 >CMP.G CL.Len
beq .4
pha
2018-09-09 08:11:42 +00:00
lda #C.BS
2018-07-13 14:38:24 +00:00
>SYSCALL PutChar
pla
inc
bra .3
2018-09-09 08:11:42 +00:00
.4 lda #C.BS
2018-07-13 14:38:24 +00:00
>SYSCALL PutChar
CL.PrintEOL.8 clc
rts
*--------------------------------------
CL.PrintCmdBuf >LDYA ZPCLBuf
>PUSHYA
ldy #S.PS.hStdOut
lda (pPs),y
>SYSCALL fputs
rts
*--------------------------------------
2018-11-19 16:15:16 +00:00
CL.GetLine >LDYA ZPFileBufPtr
>STYA.G CMD.FileBufPtr
lda (ZPFileBufPtr)
2018-11-10 14:30:09 +00:00
beq .9
2018-11-10 14:30:09 +00:00
ldy #0
.1 lda (ZPFileBufPtr),y
beq .7
cmp #C.CR
beq .6
2018-11-17 17:42:20 +00:00
cmp #';'
beq .6
2018-11-10 17:43:20 +00:00
sta (ZPCLBuf),y
2018-11-10 14:30:09 +00:00
iny
cpy #CL.MAX
2018-11-10 14:30:09 +00:00
bne .1
lda #E.SYN Line Too long !!!
* sec
rts
2018-11-10 17:43:20 +00:00
.6 sec skip CR or ;
2018-11-10 14:30:09 +00:00
.HS 90 BCC
.7 clc
tya
adc ZPFileBufPtr
sta ZPFileBufPtr
bcc .8
inc ZPFileBufPtr+1
.8 lda #0
sta (ZPCLBuf),y
2018-11-10 14:30:09 +00:00
tya
>STA.G CL.Len
lda #$ff
>STA.G CL.bExec
clc
rts
.9 lda #C.EOF
sec
rts
*--------------------------------------
* in:
* ZPCLBuf : CString command line
2018-11-10 14:30:09 +00:00
* out:
* ZPArgVBuf :
* /path/excmd\0 arg1\0 arg2\0 ... \0
* - or -
* intcmd\0 arg1\0 arg2\0 ... \0
*--------------------------------------
CL.Parse >STZ.G CMD.IntCmd
lda #S.PS.F.HOLD+S.PS.F.DUPENV
>STA.G CMD.PSFlags
>PUSHW ZPCLBuf
>LDYA ZPCLBuf
>STYA ZPCLBufPtr
2018-11-10 14:30:09 +00:00
>SYSCALL Args2ArgV
lda #0
sta (ZPArgVBuf)
lda (ZPCLBufPtr)
2018-11-10 14:30:09 +00:00
beq .8
.1 cmp #'#' comment ?
beq .8 yes, ignore remaining
>LDA.G CMD.IntCmd
bne .3 we already have Cmd, go check args
2018-11-10 14:30:09 +00:00
ldy #1
lda (ZPCLBufPtr),y only one char ?
2018-11-10 14:30:09 +00:00
bne .2
lda (ZPCLBufPtr)
2018-11-10 14:30:09 +00:00
cmp #'.' leading dot ?
bne .2
>LDA.G CMD.PSFlags yes, child process will run in same ENV
and #$ff^S.PS.F.DUPENV
sta (pData),y
bra .6 and skip this token
2018-11-10 14:30:09 +00:00
.2 jsr CL.CheckCmd
bcc .6 success, skip token, already added by CheckCmd
2018-11-10 14:30:09 +00:00
rts
.3 jsr CL.CheckIO
bcc .7 IO token & related args processed
tay an error ?
bne .9 yes...I/O error...
2018-11-10 14:30:09 +00:00
jsr CL.AddCLBufPtrToArgV no...add as an arg
2018-11-10 14:30:09 +00:00
bcs .9
.6 jsr CL.NextCLToken
.7 lda (ZPCLBufPtr)
2018-11-10 14:30:09 +00:00
bne .1
.8 clc
.9 rts
*--------------------------------------
* ZPCLBuf-> argv[] (formatted & not empty)
2018-11-10 14:30:09 +00:00
*--------------------------------------
CL.CheckCmd ldy #$ff
.1 iny
lda (ZPCLBufPtr),y
2018-11-10 14:30:09 +00:00
beq .2
cmp #'/'
bne .1
>LDYA ZPCLBufPtr found /, some path specified, External, no search
2018-11-10 14:30:09 +00:00
>SYSCALL realpath
bcs .9
txa
>STA.G CMD.hCmdLine
bra .6 go check type...
.2 >PUSHW ZPCLBufPtr
2018-11-10 14:30:09 +00:00
>LDYA L.CMD.INT
jsr Lookup no / found, search internal...
bcs .4 not internal, search PATH
phx
plx
bne .3
>LDA.G CMD.PSFlags if STARTPROC, skip keyword...
and #$ff^S.PS.F.HOLD
sta (pData),y ...and toggle S.PS.F.HOLD flag
clc
.9 rts
.3 jsr CL.AddYAToArgV X unmodified
bcs .9
txa
>STA.G CMD.IntCmd
clc
rts
.4 >LDYAI 256 Get a buffer for found path
>SYSCALL GetMem
bcs .9
txa
>STA.G CMD.hCmdLine
>LDYA L.ENV.PATH push ENVNAME=PATH for search
>SYSCALL GetEnv get value for ENV=PATH
bcs .5 no PATH, try workdir
jsr CL.SearchExt
bcc .6 found in PATH, go check Type
.5 ldy #S.PS.hPREFIX not found, try in CD
lda (pPs),y
>SYSCALL GetMemPtr
jsr CL.SearchExt
2018-11-11 22:05:04 +00:00
2018-11-10 14:30:09 +00:00
bcs CL.CheckCmd.90
.6 >PUSHEA.G CMD.Stat
>LDA.G CMD.hCmdLine
>SYSCALL GetMemPtr
>SYSCALL STAT
bcs CL.CheckCmd.90
lda #$ff
>STA.G CMD.IntCmd
ldy #CMD.Stat+S.STAT.P.TYPE
lda (pData),y
cmp #S.FI.T.TXT
beq CL.CheckCmd.TXT
cmp #S.FI.T.BIN
beq CL.CheckCmd.BIN
cmp #S.FI.T.SYS
beq CL.CheckCmd.SYS
lda #E.SYN
sec
CL.CheckCmd.90 php
pha
>LDA.G CMD.hCmdLine
>SYSCALL FreeMem
pla
plp
CL.CheckCmd.RTS
rts
*--------------------------------------
* TXT : add "/PATH/SHELL" "/PATH/CMD"
*--------------------------------------
CL.CheckCmd.TXT lda #0
>SYSCALL ArgV
jsr CL.AddYAToArgV
bcs CL.CheckCmd.90
*--------------------------------------
* BIN : add "/PATH/CMD"
*--------------------------------------
CL.CheckCmd.BIN >LDA.G CMD.hCmdLine
>SYSCALL GetMemPtr
jsr CL.AddYAToArgV
bra CL.CheckCmd.90
*--------------------------------------
CL.CheckCmd.SYS bra *
*--------------------------------------
CL.SearchExt pha
phy
>PUSHEA.G CMD.Stat
>LDA.G CMD.hCmdLine
>SYSCALL GetMemPtr
>PUSHYA push dest full path
ply
pla
>PUSHYA push search list
>LDYA ZPCLBufPtr push CMD
2018-11-10 14:30:09 +00:00
>SYSCALL FileSearch
rts
*--------------------------------------
CL.CheckIO >PUSHW ZPCLBufPtr
2018-11-10 14:30:09 +00:00
>LDYA L.CL.IO
jsr Lookup
bcs .9 not a IO token...should be an arg....
phx
jsr CL.NextCLToken skip this IO token
2018-11-10 14:30:09 +00:00
plx
jmp (J.CL.IO,x)
.9 lda #0
rts
*--------------------------------------
CL.IO.AMP >LDA.G CMD.PSFlags
and #$ff^S.PS.F.HOLD
sta (pData),y
clc
rts
CL.IO.PIPE
clc
rts
CL.IO.IN lda #O.RDONLY+O.TEXT
jsr CL.IO.Open
bcs .9
jsr IO.Set.In
jsr CL.NextCLToken skip arg
2018-11-10 14:30:09 +00:00
clc
.9 rts
CL.IO.OUTA
CL.IO.1OUTA lda #O.WRONLY+O.APPEND+O.CREATE+O.TEXT
bra CL.IO.OUT.1
CL.IO.OUT
CL.IO.1OUT lda #O.WRONLY+O.TRUNC+O.CREATE+O.TEXT
CL.IO.OUT.1 jsr CL.IO.Open
bcs .9
jsr IO.Set.Out
jsr CL.NextCLToken skip arg
clc
2018-11-10 14:30:09 +00:00
.9 rts
CL.IO.2OUTA lda #O.WRONLY+O.APPEND+O.CREATE+O.TEXT
bra CL.IO.2OUT.1
CL.IO.2OUT lda #O.WRONLY+O.TRUNC+O.CREATE+O.TEXT
CL.IO.2OUT.1 jsr CL.IO.Open
bcs .9
jsr IO.Set.Err
jsr CL.NextCLToken skip arg
2018-11-10 14:30:09 +00:00
clc
.9 rts
*--------------------------------------
CL.IO.Open pha
lda (ZPCLBufPtr)
2018-11-10 14:30:09 +00:00
beq .9 no arg left....
>PUSHWI 0 Aux type
>PUSHBI S.FI.T.TXT ftype
pla
>PUSHA flags
>LDYA ZPCLBufPtr
2018-11-10 14:30:09 +00:00
>SYSCALL fopen
rts
.9 pla
lda #E.SYN
sec
rts
*--------------------------------------
CL.NextCLToken
lda (ZPCLBufPtr)
inc ZPCLBufPtr
2018-11-10 14:30:09 +00:00
bne .1
inc ZPCLBufPtr+1
2018-11-10 14:30:09 +00:00
.1 tax
bne CL.NextCLToken
2018-11-10 14:30:09 +00:00
rts
*--------------------------------------
CL.AddCLBufPtrToArgV
>LDYA ZPCLBufPtr
2018-11-10 14:30:09 +00:00
CL.AddYAToArgV >STYA ZPPtr1
>LDYA ZPArgVBuf
>STYA ZPPtr2
.1 lda (ZPPtr2) scan to end of argV
beq .6
.2 inc ZPPtr2
bne .3
inc ZPPtr2+1
.3 lda (ZPPtr2)
bne .2
inc ZPPtr2
bne .4
inc ZPPtr2+1
.4 lda (ZPPtr2)
bne .2
.6 ldy #$ff
.7 iny
* beq .9
lda (ZPPtr1),y
sta (ZPPtr2),y
bne .7 including str ending \0
iny
* beq .9
sta (ZPPtr2),y arg[] ending \0
clc
rts
.9 lda #E.BUF
sec
rts
*--------------------------------------
MAN
2018-11-17 17:17:13 +00:00
SAVE USR/SRC/SBIN/SHELL.S.CL
LOAD USR/SRC/SBIN/SHELL.S
ASM