A2osX/BIN/SH.S.CORE.txt
2019-02-19 11:30:45 +00:00

564 lines
10 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
AUTO 4,1
.LIST OFF
*--------------------------------------
CORE.Init >LDYAI 256
>SYSCALL GetMem
bcs .9
>STYA ZPArgVBuf
txa
>STA.G CORE.hArgVBuf
.9 rts
*--------------------------------------
CORE.Quit >LDA.G CORE.hArgVBuf
beq .9
>SYSCALL FreeMem
.9 rts
*--------------------------------------
* http://heirloom.sourceforge.net/sh/sh.1.html
*--------------------------------------
* Input : ZPArgVBuf (String)
* Tokenize ZPArgVBuf
* :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
*--------------------------------------
CORE.Run.CSYN lda #E.CSYN
sec
rts
CORE.Run >LDYA ZPInputBufPtr Save Actual cmd for looping
>STYA ZPInputCmdPtr
>LDYA ZPArgVBuf
>STYA ZPArgVBufPtr
lda #0 Reset ArgV Buffer
sta (ZPArgVBuf)
lda #S.PS.F.HOLD+S.PS.F.DUPENV
>STA.G CORE.PSFlags
lda #$ff
>STA.G CORE.IntCmd assume external
jsr CORE.GetCharNB
bcc .11
jsr IO.Reset
lda #0
sec
rts Ending 0, CS,A=0
.11 cmp #'|'
bne .21
jsr IO.Pipe.In
bcs .9
jsr CORE.GetNextCharNB Skip |
bcs CORE.Run.CSYN
bra .3
.21 pha
jsr IO.Reset
pla
.3 cmp #C.CR
beq .80 empty line ?
.10 cmp #'#' commented line?
bne .2
.12 jsr CORE.GetNextCharNB
bcs .8 EOF
cmp #C.CR
bne .12 EOL
.80 jsr CORE.GetNextChar skip CR...
.8 jsr IO.Reset
lda #0
clc
.9 rts EOL, CS,A=0
.2 cmp #'.'
bne .4
ldy #1
lda (ZPInputBufPtr),y
cmp #C.SPACE
bne .4
>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...
.4 >LDYA L.CMD internal command ?
jsr CORE.LookupInputBuf
bcs .6 no...assume external...no IO token Expected
jsr CORE.SkipCharsA
txa
>STA.G CORE.IntCmd
bra .7 internal, do not add token
.5 >LDYA L.CORE.IO
jsr CORE.LookupInputBuf
bcs .6
jsr CORE.SkipCharsA
jsr CORE.IO.JMP
bcs CORE.Run.RTS
bra .7
.6 jsr CORE.ArgV.Add
.7 jsr CORE.GetCharNB
bcs CORE.ExecCmd.1 Nothing to skip
jsr CORE.IsEndCmd
bcs .5
cmp #'|'
bne CORE.ExecCmd skip CR, ;
jsr IO.Pipe.Out
bcs CORE.Run.RTS
jsr CORE.IO.AMP run in background
bra CORE.ExecCmd.1 Do not skip |
CORE.Run.RTS rts
*--------------------------------------
* Input : ZPArgVBuf
*--------------------------------------
CORE.ExecCmd jsr CORE.GetNextCharNB Skip EoL char
CORE.ExecCmd.1 lda #0
sta (ZPArgVBufPtr)
jsr CORE.StkGet IF,WHILE,FOR ?
bcs .3 no particular context, exec...
tax
>LDA.G CORE.IntCmd
bmi .2 external ...
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
.3 >LDYA ZPArgVBuf
>STYA ZPArgVBufPtr
>LDA.G CORE.IntCmd
bmi CORE.ExecExtCmd
tax
jmp (J.CMD,x)
.8 clc
rts
CORE.ExecExtCmd >PUSHB.G CORE.PSFlags
>LDYA ZPArgVBuf
>SYSCALL execv
CORE.ExecExtCmd.Exit
bcs .9
tax CPID
>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
sec
ldy #S.PS.RC CPID will update S.PS.RC
lda (pPs),y
bne .9
.8 clc
.9 rts
*--------------------------------------
* search ZPInputBufPtr/ZPArgVBufPtr in Y,A table
*--------------------------------------
CORE.LookupInputBuf
>STYA ZPPtr1
>LDYA ZPInputBufPtr
bra CORE.Lookup
CORE.LookupArgVBuf
>STYA ZPPtr1
>LDYA ZPArgVBufPtr
CORE.Lookup >STYA ZPPtr2
ldx #0
.1 ldy #$ff
.2 iny
lda (ZPPtr2),y
beq .3 Src Keyword end
jsr CORE.IsSpaceOrEndCmd
bcc .3 Src Keyword end
lda (ZPPtr1),y
beq .4 Table Keyword end
lda (ZPPtr2),y
cmp #'a'
bcc .21
cmp #'z'+1
bcs .21
eor #$20
.21 cmp (ZPPtr1),y
beq .2
bra .4
.3 lda (ZPPtr1),y
bne .4
tya Keyword Len
clc
.8 rts
.4 inc ZPPtr1
bne .5
inc ZPPtr1+1
.5 lda (ZPPtr1)
bne .4
inc ZPPtr1
bne .6
inc ZPPtr1+1
.6 inx
inx
lda (ZPPtr1) Array Ending 0, must be an external Cmd....
bne .1
lda #E.CSYN
sec
rts
*--------------------------------------
* ArgV
*--------------------------------------
CORE.ArgV.Add >LDYA ZPArgVBufPtr
>STYA ZPArgVBufPrev Save String start of Expand
lda #C.SPACE
sta TmpByte
jsr CORE.GetCharNB
bcs .9
cmp #'"'
bne .10
sta TmpByte
bra .1
.10 cmp #'`'
bne .11
sta TmpByte
.11 jsr CORE.ArgV.PutChar
.1 jsr CORE.GetNextChar
bcs .5
.2 jsr CORE.IsEndCmd
bcc .5
cmp TmpByte
bne .3
jsr CORE.GetNextChar
bra .5
.3 jsr CORE.ArgV.PutChar
.4 jsr CORE.GetNextChar
bcc .2
.5 lda #0
jsr CORE.ArgV.PutChar
>LDYA ZPArgVBufPrev
>SYSCALL ExpandStr
bcs .9
phx
>STYA ZPPtr1
>LDYA ZPArgVBufPrev
>STYA ZPArgVBufPtr
ldy #$ff
.7 iny
lda (ZPPtr1),y
jsr CORE.ArgV.PutChar
lda (ZPPtr1),y
bne .7
pla
>SYSCALL freemem
.9 rts
*--------------------------------------
CORE.ArgV.PutChar
sta (ZPArgVBufPtr)
CORE.ArgV.NextChar
inc ZPArgVBufPtr
bne .8
inc ZPArgVBufPtr+1
.8 rts
*--------------------------------------
CORE.ArgV.Next lda (ZPArgVBufPtr)
beq .8
>LDYA ZPArgVBufPtr
>STYA ZPArgVBufPrev
.1 jsr CORE.ArgV.NextChar
lda (ZPArgVBufPtr)
bne .1
jsr CORE.ArgV.NextChar
lda (ZPArgVBufPtr)
.8 rts
*--------------------------------------
* IO
*--------------------------------------
CORE.IO.JMP jmp (J.CORE.IO,x)
CORE.IO.AMP >LDA.G CORE.PSFlags
and #$ff^S.PS.F.HOLD
sta (pData),y
clc
CORE.IO.RTS rts
CORE.IO.IN lda #O.RDONLY+O.TEXT
jsr CORE.IO.Open
bcs CORE.IO.RTS
jmp IO.Set.In
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 CORE.IO.RTS
jmp IO.Set.Out
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 CORE.IO.RTS
jmp IO.Set.Err
*--------------------------------------
CORE.IO.Open pha Open Mode
jsr CORE.GetCharNB
bcs .9 no arg left....
jsr CORE.ArgV.Add Get Filename
>PUSHWI 0 Aux type
>PUSHBI S.FI.T.TXT ftype
pla
>PUSHA flags
>LDYA ZPArgVBufPrev
>STYA ZPArgVBufPtr Discard filename
>SYSCALL fopen
rts
.9 pla
lda #E.CSYN
sec
rts
*--------------------------------------
* Input Buffer
*--------------------------------------
CORE.IsSpaceOrEndCmd
cmp #C.SPACE
beq CORE.IsEndCmd.8
CORE.IsEndCmd cmp #C.CR
beq CORE.IsEndCmd.8
cmp #';'
beq CORE.IsEndCmd.8
cmp #'|'
beq CORE.IsEndCmd.8
sec
rts
CORE.IsEndCmd.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
.9 sec
rts
*--------------------------------------
CORE.SkipCharsA clc
adc ZPInputBufPtr
sta ZPInputBufPtr
bcc .8
inc ZPInputBufPtr+1
.8 rts
*--------------------------------------
* Stack
*--------------------------------------
CORE.StkPushPtr lda ZPInputCmdPtr
jsr CORE.StkPush
bcs CORE.StkPullPtr.9
lda ZPInputCmdPtr+1
bra CORE.StkPush
*--------------------------------------
CORE.StkPullPtr jsr CORE.StkPull
bcs CORE.StkPullPtr.9
sta ZPInputBufPtr+1
jsr CORE.StkPull
bcs CORE.StkPullPtr.9
sta ZPInputBufPtr
CORE.StkPullPtr.9
rts
*--------------------------------------
CORE.StkGetPtr lda (pData) StackPtr
beq CORE.StkErr
dec
beq CORE.StkErr
tay
lda (pData),y
sta ZPInputBufPtr
iny
lda (pData),y
sta ZPInputBufPtr+1
clc
rts
CORE.StkErr lda #E.STACKERROR
sec
rts
*--------------------------------------
CORE.StkPush pha
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
*--------------------------------------
CORE.StkPull jsr CORE.StkGet
bcs .9
dey
pha
tya
sta (pData) StackPtr
pla
.9 rts
*--------------------------------------
CORE.StkGet lda (pData) StackPtr
beq CORE.StkErr
tay
lda (pData),y
clc
rts
*--------------------------------------
MAN
SAVE USR/SRC/BIN/SH.S.CORE
LOAD USR/SRC/BIN/SH.S
ASM