A2osX/BIN/SHELL.S.CORE.txt

614 lines
11 KiB
Plaintext
Raw Normal View History

2019-01-28 16:33:30 +00:00
NEW
PREFIX
AUTO 4,1
.LIST OFF
*--------------------------------------
2019-02-01 16:32:29 +00:00
CORE.Init >LDYAI 256
2019-01-31 16:34:02 +00:00
>SYSCALL GetMem
bcs .9
>STYA ZPArgVBuf
txa
>STA.G CORE.hArgVBuf
.9 rts
*--------------------------------------
2019-02-01 16:32:29 +00:00
CORE.Quit >LDA.G CORE.hArgVBuf
beq .9
2019-01-28 16:33:30 +00:00
>SYSCALL FreeMem
2019-02-01 16:32:29 +00:00
.9 rts
2019-01-28 16:33:30 +00:00
*--------------------------------------
2019-02-04 14:29:52 +00:00
* Input : ZPCLBuf/ZPFileBuf
2019-02-01 16:32:29 +00:00
* Get Line from buf until ;, CR, \0 (EOL / EOF) -> ZPArgVBuf
2019-01-28 16:33:30 +00:00
*--------------------------------------
2019-02-06 16:20:51 +00:00
CORE.GetCmd >LDYA ZPInputBufPtr Save Actual cmd for looping
>STYA ZPInputCmdPtr
2019-02-03 21:58:26 +00:00
2019-02-04 14:29:52 +00:00
lda (ZPInputBufPtr)
2019-01-28 16:33:30 +00:00
beq .9
2019-02-04 14:29:52 +00:00
ldx #0 reset "" flag
2019-02-01 16:32:29 +00:00
ldy #0
2019-01-28 16:33:30 +00:00
2019-02-04 14:29:52 +00:00
.1 lda (ZPInputBufPtr),y
2019-02-01 16:32:29 +00:00
beq .7
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
cmp #C.CR
beq .6
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
cmp #'"'
bne .2
2019-01-28 16:33:30 +00:00
txa
2019-02-04 14:29:52 +00:00
eor #$80 toggle "" flag
2019-01-28 16:33:30 +00:00
tax
2019-02-01 16:32:29 +00:00
lda #'"'
bra .5
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
.2 cmp #';'
bne .5
2019-01-28 16:33:30 +00:00
txa
2019-02-04 14:29:52 +00:00
beq .6 not between ""
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
lda #';'
2019-01-28 16:33:30 +00:00
2019-02-03 21:58:26 +00:00
.5 sta (ZPArgVBuf),y
2019-02-01 16:32:29 +00:00
iny
bne .1
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
lda #E.SYN Line Too long !!!
2019-02-05 13:45:15 +00:00
.9 sec
2019-02-01 16:32:29 +00:00
rts
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
.6 sec skip CR or ;
.HS 90 BCC
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
.7 clc
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
tya
2019-02-04 14:29:52 +00:00
adc ZPInputBufPtr
sta ZPInputBufPtr
2019-02-01 16:32:29 +00:00
bcc .8
2019-02-04 14:29:52 +00:00
inc ZPInputBufPtr+1
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
.8 lda #0
2019-02-03 21:58:26 +00:00
sta (ZPArgVBuf),y
2019-01-28 16:33:30 +00:00
clc
rts
*--------------------------------------
2019-02-03 21:58:26 +00:00
* Input : ZPArgVBuf (String)
* Tokenize ZPArgVBuf
2019-02-01 16:32:29 +00:00
* :LOOP
* if CmdSep=| :
* set hStdIn = hStdOut
* set hStdOut = Std
* GetCmd from line until | or EOL
* if CmdSep=| :
* create PIPE
* set hStdOut -> PIPE
* CORE.Exec &
* :LOOP
* else CORE.Exec
*--------------------------------------
* SET VAR = `cmd args`, FOR VAR IN `cmd args`
* create PIPE
* set hStdOut -> PIPE
* CORE.Exec `cmd args` &
* set READMODE
* set hStdIn = hStdOut
* set hStdOut = Std
*--------------------------------------
2019-02-03 21:58:26 +00:00
CORE.Exec >PUSHW ZPArgVBuf
>LDYA ZPArgVBuf
>STYA ZPArgVBufPtr
2019-01-28 16:33:30 +00:00
2019-02-03 21:58:26 +00:00
>SYSCALL Args2ArgV TOKENIZE CL in ZPArgVBuf
2019-01-28 16:33:30 +00:00
2019-02-04 14:29:52 +00:00
>STZ.G CL.CmdSep
2019-02-03 21:58:26 +00:00
lda (ZPArgVBufPtr) empty line ?
2019-02-01 16:32:29 +00:00
beq .80
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
cmp #'#' comment ?
beq .80
*************** LOOP Cmd Arg
2019-02-03 21:58:26 +00:00
.10 lda #S.PS.F.HOLD+S.PS.F.DUPENV
2019-02-01 16:32:29 +00:00
>STA.G CORE.PSFlags
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
>LDA.G CL.CmdSep
cmp #'|'
bne .1
2019-01-28 16:33:30 +00:00
2019-02-04 14:29:52 +00:00
jsr IO.Pipe.In
bcs .90
2019-02-01 16:32:29 +00:00
*************** LOOP Token
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
.1 cmp #'#' comment ?
beq .80 yes, ignore remaining
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
ldy #1
2019-02-03 21:58:26 +00:00
lda (ZPArgVBufPtr),y only one char ?
2019-02-01 16:32:29 +00:00
bne .2
2019-01-28 16:33:30 +00:00
2019-02-03 21:58:26 +00:00
lda (ZPArgVBufPtr)
2019-02-01 16:32:29 +00:00
cmp #'.' leading dot ?
bne .2
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
>LDA.G CORE.PSFlags yes, child process will run in same ENV
and #$ff^S.PS.F.DUPENV
sta (pData),y
2019-02-03 21:58:26 +00:00
jsr CORE.ShiftArgVToken and skip this token
2019-02-01 16:32:29 +00:00
.2 jsr CORE.IO.Check
bcc .7 IO token & related args processed
tay an error ?
bne .90 yes...I/O error...
2019-01-28 16:33:30 +00:00
2019-02-03 21:58:26 +00:00
jsr CORE.NextArgVToken no...keep as cmd or arg
2019-02-01 16:32:29 +00:00
2019-02-03 21:58:26 +00:00
.7 lda (ZPArgVBufPtr)
2019-02-01 16:32:29 +00:00
beq .71 EOL...
cmp #';'
bne .70
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
>STA.G CL.CmdSep
2019-02-03 21:58:26 +00:00
jsr CORE.ShiftArgVToken Skip ;
2019-02-01 16:32:29 +00:00
bra .72 exec
.70 cmp #'|'
bne .1 another token...
>STA.G CL.CmdSep
2019-01-28 16:33:30 +00:00
2019-02-04 14:29:52 +00:00
jsr IO.Pipe.Out
bcs .90
2019-02-01 16:32:29 +00:00
2019-02-03 21:58:26 +00:00
jsr CORE.ShiftArgVToken Skip |
2019-02-01 16:32:29 +00:00
bra .72 and exec
2019-02-03 21:58:26 +00:00
jsr CORE.ShiftArgVToken Skip ;
2019-02-01 16:32:29 +00:00
lda #0
.71 >STA.G CL.CmdSep
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
.72 jsr CORE.ExecCmd
bcs .90
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
>LDA.G CL.CmdSep
bne .10 if sep is ; or |...loop
.80 clc
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
.90 rts
*--------------------------------------
* Input : ZPArgVBuf
*--------------------------------------
CORE.ExecCmd ldy #$ff
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
.1 iny
lda (ZPArgVBuf),y
beq .11
cmp #'/'
bne .1
bra .12
.11 >PUSHW ZPArgVBuf
2019-02-07 16:52:25 +00:00
>LDYA L.CORE.CMD
2019-02-01 16:32:29 +00:00
jsr Lookup no / found, search internal...
bcc .13 not internal
.12 ldx #$ff found a / in Arg0 .. external
.13 txa
>STA.G CORE.IntCmd
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
.10 jsr CORE.StkGet IF,WHILE,FOR ?
bcs .3 no particular context, exec...
tax
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
>LDA.G CORE.IntCmd
bmi .2 external ...
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
and #$3F
cmp #C.FOR
bcs .3 FOR...FI : always execute
.2 txa
bpl .8 context is FALSE, skip line
asl
bpl .8 parent context is FALSE, skip line
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
.3 >LDA.G CORE.IntCmd
2019-02-03 21:58:26 +00:00
bmi CORE.ExecExtCmd
tax
2019-02-07 16:52:25 +00:00
jmp (J.CORE.CMD,x)
2019-02-03 21:58:26 +00:00
.8 clc
.9 rts
*--------------------------------------
2019-02-07 16:52:25 +00:00
CORE.Run >LDYA ZPInputBufPtr Save Actual cmd for looping
>STYA ZPInputCmdPtr
jsr CORE.GetCharNB
bcs CORE.Run.RTS Ending 0, CS,A=0
cmp #'#' commented line?
bne .2
.1 jsr CORE.GetNextCharNB
bcs CORE.Run.RTS A=0, CS
eor #C.CR
bne .1
rts EOL, CC,A=0
.2 cmp #'.'
bne .3
ldy #1
lda (ZPInputBufPtr),y
cmp #C.SPACE
bne .1
>LDA.G CORE.PSFlags yes, child process will run in same ENV
and #$ff^S.PS.F.DUPENV
sta (pData),y
jsr CORE.GetNextCharNB skip ". "
bcs CORE.Run.RTS nothing to execute...
.3 >LDYA L.CORE.CMD internal command ?
jsr CORE.Lookup
bcs .4
jmp (J.CORE.CMD,x)
.4
.8 clc
CORE.Run.RTS rts
*--------------------------------------
2019-02-03 21:58:26 +00:00
CORE.ExecExtCmd >PUSHB.G CORE.PSFlags
2019-02-01 16:32:29 +00:00
>LDYA ZPArgVBuf
>SYSCALL execv
2019-01-28 16:33:30 +00:00
bcs .9
2019-02-01 16:32:29 +00:00
tax CPID
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
>LDA.G CORE.PSFlags
and #S.PS.F.HOLD
bne .4
txa
>PUSHA
>PUSHBI 1
>LDYA L.MSG.PID
>SYSCALL printf
rts
.4 >SLEEP Suspend this PID
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
sec
ldy #S.PS.RC CPID will update S.PS.RC
lda (pPs),y
bne .9
2019-01-28 16:33:30 +00:00
2019-02-01 16:32:29 +00:00
.8 clc
.9 rts
*--------------------------------------
2019-02-03 21:58:26 +00:00
CORE.NextArgVToken
lda (ZPArgVBufPtr)
inc ZPArgVBufPtr
2019-02-01 16:32:29 +00:00
bne .1
2019-02-03 21:58:26 +00:00
inc ZPArgVBufPtr+1
2019-02-01 16:32:29 +00:00
.1 tax
2019-02-03 21:58:26 +00:00
bne CORE.NextArgVToken
2019-01-28 16:33:30 +00:00
rts
2019-02-01 16:32:29 +00:00
*--------------------------------------
2019-02-03 21:58:26 +00:00
CORE.ShiftArgVToken
>LDYA ZPArgVBufPtr
jmp RemoveStrFromArgV
2019-01-28 16:33:30 +00:00
*--------------------------------------
2019-01-30 16:23:00 +00:00
CORE.GetArgX >LDYA ZPArgVBuf
2019-01-28 16:33:30 +00:00
dex
bmi .8
>STYA ZPPtr1
.1 lda (ZPPtr1)
beq .9
.2 inc ZPPtr1
bne .3
inc ZPPtr1+1
.3 lda (ZPPtr1)
bne .2
inc ZPPtr1
bne .4
inc ZPPtr1+1
.4 lda (ZPPtr1)
beq .9
dex
bpl .1
>LDYA ZPPtr1
.8 clc
rts
2019-02-07 16:52:25 +00:00
.9 sec
rts
*--------------------------------------
* search ZPInputBufPtr in Y,A table
*
*--------------------------------------
CORE.Lookup >STYA ZPPtr1
ldx #0
.1 phx
ldy #$ff
.2 iny
lda (ZPInputBufPtr),y
beq .3 Src Keyword end
jsr CORE.IsSep
bcc .3 Src Keyword end
lda (ZPPtr1),y
beq .4 Table Keyword end
cmp (ZPInputBufPtr),y
beq .2
bra .4
.3 lda (ZPPtr1),y
bne .4
plx
tya
sec
adc ZPInputBufPtr
sta ZPInputBufPtr
bcc .8
clc
inc ZPInputBufPtr+1
.8 rts
.4 inc ZPPtr1
bne .5
inc ZPPtr1+1
.5 lda (ZPPtr1)
bne .4
inc ZPPtr1
bne .6
inc ZPPtr1+1
.6 plx
inx
inx
lda (ZPPtr1) Array Ending 0, must be an external Cmd....
bne .1
lda #E.CSYN
sec
rts
*--------------------------------------
CORE.IsSep cmp #C.SPACE
beq .8
cmp #';'
beq .8
cmp #'|'
beq .8
sec
rts
.8 clc
rts
*--------------------------------------
CORE.GetCharNB jsr CORE.GetChar
bcs CORE.GetNextCharNB.RTS
jsr CORE.CheckCharNB
bcc CORE.GetNextCharNB.RTS
*--------------------------------------
CORE.GetNextCharNB
jsr CORE.GetNextChar
bcs CORE.GetNextCharNB.RTS
jsr CORE.CheckCharNB
bcs CORE.GetNextCharNB
CORE.GetNextCharNB.RTS
rts
*--------------------------------------
CORE.CheckCharNB
cmp #C.SPACE
beq .9
cmp #C.LF
beq .9
cmp #C.TAB
beq .9
clc
.9 rts
*--------------------------------------
CORE.GetNextChar
inc ZPInputBufPtr
bne CORE.GetChar
inc ZPInputBufPtr+1
*--------------------------------------
CORE.GetChar lda (ZPInputBufPtr)
beq .9
clc
rts
2019-01-28 16:33:30 +00:00
.9 sec
rts
*--------------------------------------
2019-02-06 16:20:51 +00:00
CORE.StkPushPtr lda ZPInputCmdPtr
2019-01-28 16:33:30 +00:00
jsr CORE.StkPush
bcs CORE.StkPullPtr.9
2019-02-06 16:20:51 +00:00
lda ZPInputCmdPtr+1
2019-01-28 16:33:30 +00:00
bra CORE.StkPush
.9 rts
*--------------------------------------
CORE.StkPullPtr jsr CORE.StkPull
bcs CORE.StkPullPtr.9
2019-02-04 14:29:52 +00:00
sta ZPInputBufPtr+1
2019-01-28 16:33:30 +00:00
jsr CORE.StkPull
bcs CORE.StkPullPtr.9
2019-02-04 14:29:52 +00:00
sta ZPInputBufPtr
2019-01-28 16:33:30 +00:00
CORE.StkPullPtr.9
rts
*--------------------------------------
CORE.StkGetPtr lda (pData) StackPtr
beq .9
dec
beq .9
tay
lda (pData),y
2019-02-04 14:29:52 +00:00
sta ZPInputBufPtr
2019-01-28 16:33:30 +00:00
iny
lda (pData),y
2019-02-04 14:29:52 +00:00
sta ZPInputBufPtr+1
2019-01-28 16:33:30 +00:00
clc
rts
.9 lda #E.SSYN
sec
rts
*--------------------------------------
2019-01-31 16:34:02 +00:00
CORE.StkPush pha
2019-01-28 16:33:30 +00:00
lda (pData) StackPtr
inc
cmp #CORE.STACK.MAX
beq .9
sta (pData) StackPtr
tay
pla
sta (pData),y
* clc
rts
.9 pla
lda #E.STKOVERFLOW
* sec
rts
*--------------------------------------
2019-01-31 16:34:02 +00:00
CORE.StkPull jsr CORE.StkGet
2019-01-28 16:33:30 +00:00
bcs .9
dey
pha
tya
sta (pData) StackPtr
pla
.9 rts
*--------------------------------------
CORE.StkGet lda (pData) StackPtr
beq .9
tay
lda (pData),y
clc
rts
.9 lda #E.SSYN
sec
rts
*--------------------------------------
2019-02-03 21:58:26 +00:00
CORE.IO.Check >PUSHW ZPArgVBufPtr
2019-02-01 16:32:29 +00:00
>LDYA L.CORE.IO
jsr Lookup
bcs .9 not a IO token...should be an arg....
phx
2019-02-03 21:58:26 +00:00
jsr CORE.ShiftArgVToken skip this IO token
2019-02-01 16:32:29 +00:00
plx
jmp (J.CORE.IO,x)
.9 lda #0
rts
*--------------------------------------
CORE.IO.AMP >LDA.G CORE.PSFlags
and #$ff^S.PS.F.HOLD
sta (pData),y
clc
rts
CORE.IO.IN lda #O.RDONLY+O.TEXT
jsr CORE.IO.Open
bcs .9
jsr IO.Set.In
2019-02-03 21:58:26 +00:00
jsr CORE.ShiftArgVToken skip arg
2019-02-01 16:32:29 +00:00
clc
.9 rts
CORE.IO.OUTA
CORE.IO.1OUTA lda #O.WRONLY+O.APPEND+O.CREATE+O.TEXT
bra CORE.IO.OUT.1
CORE.IO.OUT
CORE.IO.1OUT lda #O.WRONLY+O.TRUNC+O.CREATE+O.TEXT
CORE.IO.OUT.1 jsr CORE.IO.Open
bcs .9
jsr IO.Set.Out
2019-02-03 21:58:26 +00:00
jsr CORE.ShiftArgVToken skip arg
2019-02-01 16:32:29 +00:00
clc
.9 rts
CORE.IO.2OUTA lda #O.WRONLY+O.APPEND+O.CREATE+O.TEXT
bra CORE.IO.2OUT.1
CORE.IO.2OUT lda #O.WRONLY+O.TRUNC+O.CREATE+O.TEXT
CORE.IO.2OUT.1 jsr CORE.IO.Open
bcs .9
jsr IO.Set.Err
2019-02-03 21:58:26 +00:00
jsr CORE.ShiftArgVToken skip arg
2019-02-01 16:32:29 +00:00
clc
.9 rts
*--------------------------------------
CORE.IO.Open pha
2019-02-03 21:58:26 +00:00
lda (ZPArgVBufPtr)
2019-02-01 16:32:29 +00:00
beq .9 no arg left....
>PUSHWI 0 Aux type
>PUSHBI S.FI.T.TXT ftype
pla
>PUSHA flags
2019-02-03 21:58:26 +00:00
>LDYA ZPArgVBufPtr
2019-02-01 16:32:29 +00:00
>SYSCALL fopen
rts
.9 pla
lda #E.CSYN
sec
rts
*--------------------------------------
2019-01-28 16:33:30 +00:00
MAN
SAVE USR/SRC/BIN/SHELL.S.CORE
LOAD USR/SRC/BIN/SHELL.S
ASM