mirror of
https://github.com/A2osX/A2osX.git
synced 2024-11-29 17:50:18 +00:00
356 lines
6.6 KiB
Plaintext
356 lines
6.6 KiB
Plaintext
|
NEW
|
|||
|
AUTO 3,1
|
|||
|
.LIST OFF
|
|||
|
*--------------------------------------
|
|||
|
* Built in Keywords
|
|||
|
*--------------------------------------
|
|||
|
CSH.KW.JMP txa
|
|||
|
>STA.G CSH.CmdSave
|
|||
|
jmp (J.CSH.KW,x)
|
|||
|
*--------------------------------------
|
|||
|
CSH.WHILE
|
|||
|
CSH.IF jsr CSH.GetCharNB
|
|||
|
bcs .9
|
|||
|
cmp #'('
|
|||
|
bne .9
|
|||
|
jsr CSH.GetNextCharNB
|
|||
|
bcs .9
|
|||
|
|
|||
|
lda #0 Any var type
|
|||
|
jsr CSH.ExpEval
|
|||
|
bcs .99
|
|||
|
jsr CSH.GetCharNB
|
|||
|
bcs .99
|
|||
|
cmp #')'
|
|||
|
bne .9
|
|||
|
jsr CSH.GetNextCharNB skip ')'
|
|||
|
bcs .99
|
|||
|
cmp #'{'
|
|||
|
bne .9
|
|||
|
jsr CSH.GetNextCharNB Skip '{'
|
|||
|
bcs .99
|
|||
|
|
|||
|
jsr CSH.IsValue0 X = var type from ExpEval
|
|||
|
bcc .6 Value=0, skip {{....}}
|
|||
|
|
|||
|
>LDA.G CSH.CmdSave
|
|||
|
beq .1 IF
|
|||
|
|
|||
|
pha
|
|||
|
>LDA.G CSH.BufPtrSave+1 WHILE : push loop address...
|
|||
|
jsr CSH.Push
|
|||
|
>LDA.G 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 jsr CSH.SkipBlock
|
|||
|
|
|||
|
bcc .99
|
|||
|
.9 lda #CSH.E.SYNTAX
|
|||
|
sec
|
|||
|
.99 rts
|
|||
|
*--------------------------------------
|
|||
|
*CSH.Keyword.Start
|
|||
|
* >LDA.G CSH.CmdSave get back Token ("IF" or "WHILE")
|
|||
|
* tax
|
|||
|
* jmp (J.CSH.KW.START,x)
|
|||
|
*--------------------------------------
|
|||
|
*CSH.IF.START jmp CSH.Push Push "IF" Token
|
|||
|
*--------------------------------------
|
|||
|
*CSH.WHILE.START pha
|
|||
|
* >LDA.G CSH.BufPtrSave+1 WHILE : push loop address...
|
|||
|
* jsr CSH.Push
|
|||
|
* >LDA.G CSH.BufPtrSave
|
|||
|
* jsr CSH.Push
|
|||
|
* pla
|
|||
|
* jmp CSH.Push Push "WHILE" Token
|
|||
|
*--------------------------------------
|
|||
|
CSH.IF.END clc
|
|||
|
rts
|
|||
|
*--------------------------------------
|
|||
|
CSH.WHILE.END jsr CSH.Pop
|
|||
|
sta ZPFileBufPtr
|
|||
|
jsr CSH.Pop
|
|||
|
sta ZPFileBufPtr+1
|
|||
|
clc
|
|||
|
rts
|
|||
|
*--------------------------------------
|
|||
|
CSH.ELSE
|
|||
|
*--------------------------------------
|
|||
|
CSH.DO
|
|||
|
CSH.FOR
|
|||
|
CSH.SWITCH
|
|||
|
CSH.CASE
|
|||
|
CSH.BREAK
|
|||
|
CSH.CONTINUE
|
|||
|
CSH.TYPEDEF
|
|||
|
CSH.SIZEOF
|
|||
|
lda #CSH.E.SYNTAX
|
|||
|
sec
|
|||
|
rts
|
|||
|
*--------------------------------------
|
|||
|
CSH.STRUCT >ENTER 4
|
|||
|
|
|||
|
jsr CSH.GetCharNB
|
|||
|
bcs .99
|
|||
|
|
|||
|
>LDA.G CSH.hTags
|
|||
|
jsr CSH.NewKey
|
|||
|
bcs .99
|
|||
|
|
|||
|
sta (pStack)
|
|||
|
|
|||
|
|
|||
|
jsr CSH.GetNextCharNB
|
|||
|
bcs .99
|
|||
|
cmp #'{'
|
|||
|
bne .99
|
|||
|
|
|||
|
.1 jsr CSH.GetNextCharNB
|
|||
|
bcs .99
|
|||
|
cmp #'}'
|
|||
|
bne .1
|
|||
|
|
|||
|
jsr CSH.GetNextCharNB skip }
|
|||
|
|
|||
|
clc
|
|||
|
.99 >LEAVE
|
|||
|
rts
|
|||
|
*--------------------------------------
|
|||
|
* Built in Types
|
|||
|
*--------------------------------------
|
|||
|
CSH.SIGNED sec
|
|||
|
.HS 90 BCC
|
|||
|
*--------------------------------------
|
|||
|
CSH.UNSIGNED clc
|
|||
|
php
|
|||
|
|
|||
|
jsr CSH.CheckSpace
|
|||
|
bcs .9
|
|||
|
|
|||
|
>LDYA L.CSH.STYPES
|
|||
|
jsr CSH.LookupID
|
|||
|
|
|||
|
bcs .9
|
|||
|
|
|||
|
plp
|
|||
|
bcs .8
|
|||
|
jmp (J.CSH.UTYPES,x)
|
|||
|
|
|||
|
.8 jmp (J.CSH.STYPES,x)
|
|||
|
|
|||
|
.9 plp
|
|||
|
lda #CSH.E.SYNTAX
|
|||
|
sec
|
|||
|
rts
|
|||
|
*--------------------------------------
|
|||
|
CSH.VOID ldx #CSH.T.VOID
|
|||
|
bra CSH.TYPE
|
|||
|
CSH.CHAR ldx #CSH.T.CHAR
|
|||
|
bra CSH.TYPE
|
|||
|
CSH.UCHAR ldx #CSH.T.UCHAR
|
|||
|
bra CSH.TYPE
|
|||
|
CSH.INT ldx #CSH.T.INT
|
|||
|
bra CSH.TYPE
|
|||
|
CSH.UINT ldx #CSH.T.UINT
|
|||
|
bra CSH.TYPE
|
|||
|
CSH.LONG ldx #CSH.T.LONG
|
|||
|
bra CSH.TYPE
|
|||
|
CSH.ULONG ldx #CSH.T.ULONG
|
|||
|
bra CSH.TYPE
|
|||
|
|
|||
|
CSH.FLOAT ldx #CSH.T.FLOAT
|
|||
|
|
|||
|
CSH.TYPE stx ZPVarType
|
|||
|
jsr CSH.CheckSpace
|
|||
|
bcs .9
|
|||
|
|
|||
|
.11 cmp #'*'
|
|||
|
bne .10
|
|||
|
|
|||
|
lda #CSH.Q.POINTER
|
|||
|
tsb ZPVarType
|
|||
|
jsr CSH.GetNextCharNB Skip *
|
|||
|
bra .11
|
|||
|
|
|||
|
.10 jsr CSH.IsLetter
|
|||
|
bcs .9
|
|||
|
|
|||
|
jsr CSH.AddSymbol add with undef value...
|
|||
|
bcs .99 OOM or DUP
|
|||
|
|
|||
|
jsr CSH.GetCharNB
|
|||
|
bcs .9
|
|||
|
cmp #';'
|
|||
|
beq .8
|
|||
|
|
|||
|
cmp #'='
|
|||
|
beq .2
|
|||
|
|
|||
|
cmp #'('
|
|||
|
bne .9
|
|||
|
|
|||
|
jmp CSH.AddFunction
|
|||
|
|
|||
|
.2 jsr CSH.GetNextCharNB Skip =
|
|||
|
bcs .9
|
|||
|
|
|||
|
lda ZPVarType
|
|||
|
jsr CSH.ExpEval
|
|||
|
bcs .99
|
|||
|
|
|||
|
.7 jsr CSH.SetVarValueFromStack X= Type, Set value to this var
|
|||
|
bcs .99
|
|||
|
|
|||
|
jsr CSH.GetChar
|
|||
|
bcs .9
|
|||
|
|
|||
|
cmp #';'
|
|||
|
bne .9
|
|||
|
|
|||
|
.8 clc
|
|||
|
rts
|
|||
|
|
|||
|
.9 lda #CSH.E.SYNTAX
|
|||
|
sec
|
|||
|
.99 rts
|
|||
|
*--------------------------------------
|
|||
|
* Input:
|
|||
|
* ZPFileBufPtr, A = Expected type
|
|||
|
* Output:
|
|||
|
* CS, A = EC
|
|||
|
* CC, Result on Stack, X = Type
|
|||
|
*--------------------------------------
|
|||
|
CSH.fCall ldx ZPPtr1
|
|||
|
phx
|
|||
|
ldx ZPPtr1+1 local : fdef
|
|||
|
phx
|
|||
|
ldx ZPPtr2 local : type
|
|||
|
phx
|
|||
|
ldx ZPPtr2+1 local : variadic size
|
|||
|
phx
|
|||
|
|
|||
|
sta ZPPtr2 save Type
|
|||
|
stz ZPPtr2+1 Reset VARIADIC byte count
|
|||
|
>LDYA L.CSH.FN
|
|||
|
jsr CSH.LookupFN
|
|||
|
phx X = function index
|
|||
|
bcs .10
|
|||
|
|
|||
|
>STYA ZPPtr1 f() definition, starting at returned type
|
|||
|
|
|||
|
jsr CSH.GetCharNB
|
|||
|
bcs .10
|
|||
|
|
|||
|
cmp #'('
|
|||
|
bne .52
|
|||
|
jsr CSH.GetNextCharNB skip '('
|
|||
|
.10 bcs .90
|
|||
|
|
|||
|
lda ZPPtr2
|
|||
|
bne .11
|
|||
|
|
|||
|
lda (ZPPtr1)
|
|||
|
sta ZPPtr2
|
|||
|
bra .1 expected type is 0, no check
|
|||
|
|
|||
|
.11 cmp (ZPPtr1) Get Return value Type
|
|||
|
bne .91
|
|||
|
|
|||
|
.1 jsr CSH.ZPPtr1Next advance to arg list type
|
|||
|
|
|||
|
lda (ZPPtr1) get type of first arg
|
|||
|
beq .7 end of list, go check ending ')'
|
|||
|
*--------------------------------------
|
|||
|
.3 eor #CSH.T.VARIADIC if VARIADIC, don't advance to next arg and assume type = 0
|
|||
|
beq .4
|
|||
|
eor #CSH.T.VARIADIC restore type...
|
|||
|
.4 jsr CSH.ExpEval A=0 if VARIADIC
|
|||
|
bcs .9 X = Var Type
|
|||
|
|
|||
|
lda (ZPPtr1) get current arg type
|
|||
|
eor #CSH.T.VARIADIC
|
|||
|
bne .5
|
|||
|
jsr CSH.GetVarSize X = Var Type
|
|||
|
|
|||
|
clc make sure pointer only 2 bytes
|
|||
|
adc ZPPtr2+1
|
|||
|
sta ZPPtr2+1 Add to byte count
|
|||
|
bra .51
|
|||
|
|
|||
|
.5 jsr CSH.ZPPtr1Next
|
|||
|
|
|||
|
.51 jsr CSH.GetCharNB
|
|||
|
bcs .90
|
|||
|
|
|||
|
cmp #','
|
|||
|
bne .6
|
|||
|
|
|||
|
jsr CSH.GetNextCharNB Skip ,
|
|||
|
lda (ZPPtr1)
|
|||
|
bne .3 Another ARG....
|
|||
|
|
|||
|
.52 bra .90 extra args....error
|
|||
|
|
|||
|
.6 cmp #')'
|
|||
|
bne .90
|
|||
|
lda (ZPPtr1)
|
|||
|
beq .8 no more arg after ')', exit
|
|||
|
eor #CSH.T.VARIADIC
|
|||
|
bne .90 missing arg
|
|||
|
|
|||
|
>PUSHB ZPPtr2+1 push VARIADIC byte count
|
|||
|
bra .8
|
|||
|
.7 jsr CSH.GetCharNB
|
|||
|
bcs .90
|
|||
|
cmp #')'
|
|||
|
bne .90
|
|||
|
|
|||
|
.8 jsr CSH.GetNextCharNB Skip )
|
|||
|
|
|||
|
plx restore X = function index
|
|||
|
ldy ZPPtr2 get type in Y
|
|||
|
pla
|
|||
|
sta ZPPtr2+1
|
|||
|
pla
|
|||
|
sta ZPPtr2
|
|||
|
pla
|
|||
|
sta ZPPtr1+1
|
|||
|
pla
|
|||
|
sta ZPPtr1
|
|||
|
phy
|
|||
|
jsr CSH.fCall.Exec
|
|||
|
plx restore returned type
|
|||
|
rts
|
|||
|
|
|||
|
.90 lda #CSH.E.SYNTAX
|
|||
|
.HS 2C BIT ABS
|
|||
|
.91 lda #CSH.E.TMISMATCH
|
|||
|
sec
|
|||
|
|
|||
|
.9 plx Discard function index
|
|||
|
|
|||
|
plx
|
|||
|
stx ZPPtr2+1
|
|||
|
plx
|
|||
|
stx ZPPtr2
|
|||
|
plx
|
|||
|
stx ZPPtr1+1
|
|||
|
plx
|
|||
|
stx ZPPtr1
|
|||
|
|
|||
|
.99 rts
|
|||
|
*--------------------------------------
|
|||
|
CSH.fCall.Exec jmp (J.CSH.EXEC,x)
|
|||
|
*--------------------------------------
|
|||
|
MAN
|
|||
|
SAVE usr/src/bin/csh.s.kw
|
|||
|
LOAD usr/src/bin/csh.s
|
|||
|
ASM
|