A2osX/SBIN/SHELL.S.CSH.txt

801 lines
13 KiB
Plaintext
Raw Normal View History

2016-08-17 06:25:58 +00:00
PR#3
PREFIX /A2OSX.BUILD
2016-08-17 06:25:58 +00:00
NEW
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
CSH.TYPE.CHAR .EQ 1
CSH.TYPE.INT .EQ 2
CSH.TYPE.LONG .EQ 3
CSH.TYPE.FLOAT .EQ 4
*--------------------------------------
CSH.Init >PUSHWI 0 Aux type
>PUSHBI 4 S.FILEINFO.TYPE.TXT
>PUSHBI SYS.FOpen.R
lda #1
>SYSCALL GetArg.A
>PUSHYA
>SYSCALL LoadFile
bcs .9
>STYA.G CSH.BufLen
txa
>STA.G CSH.hBuf
lda #$FF
>STA.G bExitOnEOF
>LDYAI 256
>SYSCALL GetMem0.YA
bcs .9
txa
>STA.G CSH.hSymbols
lda #0
>STA.G CSH.SymbolsPtr
>LDYAI 256
>SYSCALL GetMem.YA
bcs .9
txa
>STA.G CSH.hData
lda #0
>STA.G CSH.DataPtr
>LDYAI 256
>SYSCALL GetMem.YA
bcs .9
txa
>STA.G CSH.hStack
lda #0
>STA.G CSH.StackPtr
* clc
.9 rts
*--------------------------------------
CSH.Run jsr CSH.GetBuf
jsr CSH.GetPtrs
lda #0
>STA.G CmdBuflen Reset Cmdline
jsr CSH.GetCharNB
2016-08-17 06:25:58 +00:00
bcs .9
cmp #'}' End of block ?
bne .1
jsr CSH.CheckStack must be on stack....
bcs .9
jsr CSH.Pop was expected, get stacked Cmd...
tax
jmp (J.CSHCMDS.END,x)
.1 cmp #$0D
bne .2
jmp CSH.GetNextCharNB Skip CR
2016-08-17 06:25:58 +00:00
.2 pha
jsr CSH.SavePtr Save Ptr, in case of while,for....
pla
jsr CSH.IsLetter
bcc .3
cmp #'#'
beq .5 comments : pass line to shell
bra .9 error, todo : PREOPS ++ --.....
.3 jsr CSH.GetName
bcs .9
jsr CSH.IsKeyword
bcs .4 not an internal CSH keyword....
stx CSH.CmdSave
jmp (J.CSHCMDS,x)
.4 jsr CSH.GetVar
bcs .5
jsr CSH.GetCharNB
bcs .9
cmp #'='
bne .99
jsr CSH.GetNextCharNB Skip =
bcs .99
jsr CSH.ExpEval
bcs .9
jsr CSH.GetChar
bcs .9
cmp #';'
bne .99
2016-08-17 06:25:58 +00:00
jsr CSH.SetVar
bcs .9
jmp CSH.GetNextCharNB Skip ;
.99 lda #CSH.E.SYNTAX
sec
.9 rts
.5
jsr CSH.RestorePtr Restore ptr to get full cmd line to execute
jsr CSH.GetCharNB
ldy #0
.6 cmp #13
beq .7
sta (ZPCMDBuf),y
iny
cpy #CmdLine.MAX
beq .8
jsr CSH.GetNextChar
bcc .6
bra .8
.7 jsr CSH.GetNextCharNB Skip CR
.8 lda #0
sta (ZPCMDBuf),y
tya
>STA.G CmdBuflen
lda #$ff
>STA.G bCmdBufexec
>LDA.G bEcho
beq .80
2016-08-17 06:25:58 +00:00
>PUSHW ZPCMDBuf
>LDYA L.MSG.ECHO
>SYSCALL PrintF.YA
.80 clc
rts
2016-08-17 06:25:58 +00:00
*--------------------------------------
CSH.Quit >LDA.G CSH.hBuf
beq .1
>SYSCALL FreeMem.A
.1 >LDA.G CSH.hStack
beq .2
>SYSCALL FreeMem.A
.2 >LDA.G CSH.hData
beq .3
>SYSCALL FreeMem.A
.3 >LDA.G CSH.hSymbols
beq .8
>SYSCALL FreeMem.A
.8 rts
*--------------------------------------
CSH.GetBuf >LDA.G CSH.hBuf
>SYSCALL GetMemPtr.A
>STYA ZPCSHBufBase
>LDA.G CSH.BufLen
clc
adc ZPCSHBufBase
sta CSH.GetChar.LO+1
iny
lda (pData),y
adc ZPCSHBufBase+1
sta CSH.GetChar.HI+1
CSH.SetBufPtr >LDA.G CSH.BufPtr
clc
adc ZPCSHBufBase
sta ZPCSHBufPtr
iny
lda (pData),y
adc ZPCSHBufBase+1
sta ZPCSHBufPtr+1
rts
*--------------------------------------
CSH.GetPtrs >LDA.G CSH.hSymbols
>SYSCALL GetMemPtr.A
>STYA ZPCSHSymbols
>LDA.G CSH.hData
>SYSCALL GetMemPtr.A
>STYA ZPCSHData
>LDA.G CSH.hStack
>SYSCALL GetMemPtr.A
>STYA ZPCSHStack
rts
*--------------------------------------
CSH.SavePtr phy
>LDA.G CSH.BufPtr
sta CSH.BufPtrSave
iny
lda (pData),y
sta CSH.BufPtrSave+1
ply
rts
*--------------------------------------
CSH.RestorePtr phy
lda CSH.BufPtrSave
>STA.G CSH.BufPtr
clc
adc ZPCSHBufBase
sta ZPCSHBufPtr
iny
lda CSH.BufPtrSave+1
sta (pData),y
adc ZPCSHBufBase+1
sta ZPCSHBufPtr+1
ply
rts
*--------------------------------------
CSH.IsKeyword phy
>LDYA L.CSHCMDS
>STYA ZPPtr2
ldx #0
.1 lda (ZPPtr2)
beq .9 Ending 0, not found....
cmp CSH.Name Same Len ?
bne .4
tay
.2 lda CSH.Name,y
cmp #'a' To Uppercase
bcc .3
cmp #'z'+1
bcs .3
eor #$20
.3 cmp (ZPPtr2),y
bne .4
dey
bne .2
ply
clc Found an internal Cmd...
rts
.4 inx
inx
lda ZPPtr2
sec
adc (ZPPtr2)
sta ZPPtr2
bcc .1
inc ZPPtr2+1
bra .1
.9 ply
sec
rts
*--------------------------------------
CSH.WHILE
CSH.IF jsr CSH.GetCharNB
bcs .9
cmp #'('
bne .9
jsr CSH.GetNextCharNB
bcs .9
jsr CSH.ExpEval
bcs .99
jsr CSH.GetCharNB
bcs .99
cmp #')'
bne .9
jsr CSH.GetNextCharNB
bcs .99
cmp #'{'
bne .9
>LDA.G CSH.ACC
iny
ora (pData),y
iny
ora (pData),y
iny
ora (pData),y
beq .6 eval returned false, skip {{....}}
jsr CSH.GetNextCharNB Skip '{'
lda CSH.CmdSave Push "IF" or "WHILE"
beq .1 if "IF", no need to push Saved Ptr
pha
lda CSH.BufPtrSave+1 WHILE : push loop address...
jsr CSH.Push
lda CSH.BufPtrSave
jsr CSH.Push
pla
.1 jsr CSH.Push
bcs .99
lda #'}' Tell '}' is expected at the end of block
jsr CSH.Push
bcs .99
rts
.6 ldx #1 expecting 1 '}' for now....
.7 jsr CSH.GetNextChar
bcs .9
cmp #'{'
bne .71
inx
bra .7
.71 cmp #'}'
bne .7
txa
beq .9
dex
bne .7
jsr CSH.GetNextChar
clc
rts
.9 lda #CSH.E.SYNTAX
sec
.99 rts
*--------------------------------------
CSH.IF.END jsr CSH.GetNextChar just skip ending '}'
clc
rts
*--------------------------------------
CSH.WHILE.END jsr CSH.Pop
>STA.G CSH.BufPtr
jsr CSH.Pop
>STA.G CSH.BufPtr+1
clc
rts
*--------------------------------------
CSH.BREAK
*--------------------------------------
CSH.CONTINUE
lda #CSH.E.SYNTAX
sec
rts
*--------------------------------------
CSH.CHAR lda #CSH.TYPE.CHAR
bra CSH.TYPE
CSH.INT lda #CSH.TYPE.INT
bra CSH.TYPE
CSH.LONG lda #CSH.TYPE.LONG
bra CSH.TYPE
CSH.FLOAT lda #CSH.TYPE.FLOAT
CSH.TYPE >STA.G CSH.ACCT
jsr CSH.GetChar
bcs .9
cmp #' '
bne .9
jsr CSH.GetNextCharNB
bcs .9
jsr CSH.IsLetter
bcs .9
jsr CSH.GetName
bcs .9
jsr CSH.GetCharNB
bcs .9
cmp #';'
beq .8 end of declaration, no value...
cmp #'='
bne .9
jsr CSH.GetNextCharNB
bcs .9
jsr CSH.ExpEval
bcs .9
jsr CSH.GetChar
bcs .9
cmp #';'
bne .9
.8 jsr CSH.AddVar
bcs .99
jsr CSH.GetNextCharNB Skip ;
clc
rts
.9 lda #CSH.E.SYNTAX
sec
.99 rts
*--------------------------------------
CSH.ExpEval jsr CSH.ZeroACC
ldy #0
jsr CSH.GetCharNB
bcs .9
cmp #')'
beq .8
cmp #';'
beq .8
jsr CSH.IsLetter Fnc or Var ?
bcs .1
bra .9
.1 jsr CSH.IsDigit10 number ?
bcs .9
jsr CSH.GetNumInACC
bcs .9
.8 clc
rts
.9 lda #CSH.E.SYNTAX
sec
.99 rts
*--------------------------------------
CSH.GetName ldy #0
.1 iny
sta CSH.Name,y
jsr CSH.GetNextChar
bcs .8
jsr CSH.IsLetterOrDigit
bcs .8
cpy #CSH.Name.MAX
bcc .1
lda #CSH.E.TOOLONG
sec
rts
.8 sty CSH.Name
clc
rts
.9 lda #CSH.E.SYNTAX
sec
rts
*--------------------------------------
CSH.GetNumInACC
>LDA.G CSH.ACCT
* >SYSCALL StrToL
* bcs .9
* rts
.9 lda #CSH.E.SYNTAX
sec
rts
*--------------------------------------
CSH.ZeroACC lda #0
>STA.G CSH.ACC
iny
sta (pData),y
iny
sta (pData),y
iny
sta (pData),y
rts
*--------------------------------------
* Vars...
*--------------------------------------
CSH.AddVar jsr CSH.FindVar
bcc .97
>LDA.G CSH.SymbolsPtr
sec
adc CSH.Name
bcs .99
adc #2 TYPE + OFS
bcs .99
>LDA.G CSH.DataPtr
pha
ldx CSH.ACCT
* clc
adc CSH.TSIZE,x
bcs .98
ldx #$ff
>LDA.G CSH.SymbolsPtr
tay
.10 inx
lda CSH.Name,x
sta (ZPCSHSymbols),y
iny
cpx CSH.Name
bne .10
lda CSH.ACCT
sta (ZPCSHSymbols),y
iny
pla Get Back Data OFS
pha
sta (ZPCSHSymbols),y
iny
tya
>STA.G CSH.SymbolsPtr
ply Get Back Data OFS again
ldx CSH.ACCT
lda CSH.TSIZE,x
ldx #0
.1 pha
lda CSH.ACC,x
sta (ZPCSHData),y
iny
inx
pla
dec
bne .1
tya
>STA.G CSH.DataPtr
clc
rts
.97 lda #CSH.E.DUP
sec
rts
.98 pla
.99 lda #CSH.E.OOM
sec
rts
*--------------------------------------
CSH.SetVar
clc
rts
*--------------------------------------
CSH.GetVar jsr CSH.FindVar
bcs .9
clc
.9 rts
*--------------------------------------
CSH.FindVar >LDYA ZPCSHSymbols
>STYA ZPPTR1
.1 ldy #0
lda (ZPPTR1),y
beq .9
cmp CSH.Name
bne .4
pha Save Name len...
ldx #0
.2 iny
inx
lda (ZPPTR1),y
cmp CSH.Name,x
bne .3
cpx CSH.Name
bne .2
pla
sec
adc ZPPTR1
sta ZPPTR1
bcc .8
inc ZPPTR1+1
clc
.8 rts
.3 pla
.4 sec
adc ZPPTR1
bcc .5
inc ZPPTR1+1
clc
.5 adc #2 Skip Type+OFS
sta ZPPTR1
bcc .1
inc ZPPTR1+1
bra .1
.9 sec
rts
*--------------------------------------
* Stack
*--------------------------------------
CSH.Push pha
>LDA.G CSH.StackPtr
tay
pla
sta (ZPCSHStack),y
iny
beq .9
tya
>STA.G CSH.StackPtr
sta (pData),y
clc
rts
.9 lda #CSH.E.SOVERFLW
sec
rts
*--------------------------------------
CSH.Pop >LDA.G CSH.StackPtr
beq .9
dec
tay
sta (pData),y
lda (ZPCSHStack),y
clc
rts
.9 lda #CSH.E.SYNTAX
sec
rts
*--------------------------------------
CSH.CheckStack pha
>LDA.G CSH.StackPtr
beq .9
dec
tay
pla
cmp (ZPCSHStack),y
bne .9
tya
>STA.G CSH.StackPtr
clc
rts
.9 lda #CSH.E.SYNTAX
sec
rts
*--------------------------------------
* CHAR related Subs.....
*--------------------------------------
CSH.GetCharNB jsr CSH.GetChar
bcs CSH.GetNextCharNB.RTS
jsr CSH.CheckCharNB
bcc CSH.GetNextCharNB.RTS
*--------------------------------------
CSH.GetNextCharNB
jsr CSH.GetNextChar
bcs CSH.GetNextCharNB.RTS
jsr CSH.CheckCharNB
bcs CSH.GetNextCharNB
CSH.GetNextCharNB.RTS
rts
*--------------------------------------
CSH.CheckCharNB cmp #32 SPACE
beq .9
cmp #13 CR
beq .9
cmp #10 LF
beq .9
cmp #8 TAB
beq .9
clc
.9 rts
*--------------------------------------
CSH.GetNextChar phy
>INCW.G CSH.BufPtr
ply
inc ZPCSHBufPtr
bne CSH.GetChar
inc ZPCSHBufPtr+1
*--------------------------------------
CSH.GetChar lda ZPCSHBufPtr
CSH.GetChar.LO eor #$ff Self Modified
bne CSH.GetChar.8
lda ZPCSHBufPtr+1
CSH.GetChar.HI eor #$ff Self Modified
bne CSH.GetChar.8
lda #MLI.ERR.EOF
sec
rts
CSH.GetChar.8 lda (ZPCSHBufPtr)
clc
rts
*---------------------------------------
CSH.IsLetterOrDigit
jsr CSH.IsDigit10
bcc CSH.IsLetterRTS
*---------------------------------------
CSH.IsLetter cmp #'_'
bne .1
clc
rts
.1 cmp #'A'
bcc .9
cmp #'Z'+1
bcc CSH.IsLetterRTS
cmp #'a'
bcc .9
cmp #'z'+1
rts CC if lowercase
.9 sec
CSH.IsLetterRTS rts
*---------------------------------------
CSH.IsDigit10 cmp #'0'
bcc .9
cmp #'9'+1
rts cc if ok, cs if not
.9 sec
rts
2016-08-17 06:25:58 +00:00
*--------------------------------------
MAN
SAVE /A2OSX.SRC/SBIN/SHELL.S.CSH
LOAD /A2OSX.SRC/SBIN/SHELL.S
2016-08-17 06:25:58 +00:00
ASM