A2osX/BIN/CSH.S.CORE.txt

1270 lines
23 KiB
Plaintext
Raw Normal View History

NEW
2019-06-28 15:15:58 +00:00
AUTO 3,1
2016-08-17 06:25:58 +00:00
.LIST OFF
*--------------------------------------
2019-08-26 06:29:18 +00:00
CSH.Init >SYSCALL SListNew
bcs .9
2020-01-23 14:48:22 +00:00
>STA.G CSH.hSymbols
2020-01-23 14:48:22 +00:00
>LDYAI 256
2018-07-13 14:38:24 +00:00
>SYSCALL GetMem
bcs .9
2020-01-23 14:48:22 +00:00
2019-02-13 16:20:44 +00:00
>STYA ZPCSHConst
txa
2019-02-13 16:20:44 +00:00
>STA.G CSH.hConst
>LDYAI 256
2018-07-13 14:38:24 +00:00
>SYSCALL GetMem
bcs .9
2020-01-23 14:48:22 +00:00
2019-02-13 16:20:44 +00:00
>STYA ZPCSHStack
txa
>STA.G CSH.hStack
2020-01-23 14:48:22 +00:00
2019-02-13 16:20:44 +00:00
lda #$0
>STA.G CSH.ConstPtr
>STA.G CSH.StackPtr
sta (ZPCSHConst)
sta (ZPCSHStack)
* clc
.9 rts
*--------------------------------------
2019-08-26 06:29:18 +00:00
CSH.Quit >LDA.G CSH.hSymbols
2020-01-23 14:48:22 +00:00
beq .1
2019-08-26 06:29:18 +00:00
>SYSCALL SListFree
2018-10-16 15:48:03 +00:00
2020-01-23 14:48:22 +00:00
.1 >LDA.G hFileBuf
2019-08-26 06:29:18 +00:00
jsr .7
>LDA.G CSH.hStack
jsr .7
2020-01-23 14:48:22 +00:00
2019-08-26 06:29:18 +00:00
>LDA.G CSH.hConst
2020-01-23 14:48:22 +00:00
2019-08-26 06:29:18 +00:00
.7 beq CSH.Quit.RTS
2018-10-16 15:48:03 +00:00
>SYSCALL FreeMem
2019-02-13 16:20:44 +00:00
CSH.Quit.RTS rts
2018-10-16 15:48:03 +00:00
*--------------------------------------
2018-11-10 14:30:09 +00:00
CSH.Run jsr CSH.GetCharNB
2019-02-13 16:20:44 +00:00
bcs CSH.Quit.RTS
2019-10-03 06:25:27 +00:00
2019-08-28 15:21:42 +00:00
CSH.Run.1 cmp #'#'
bne .3 comments ...
.1 jsr CSH.GetNextChar
bcs .2
cmp #C.CR
bne .1
2019-08-28 15:21:42 +00:00
.2 jmp CSH.GetNextChar Skip CR and exit
.3 cmp #C.CR
beq .2
cmp #'}' End of block ?
bne .4
jsr CSH.CheckStack must be something on stack....
bcs .9
2019-09-05 15:49:05 +00:00
jsr CSH.GetNextCharNB Skip '}'
jsr CSH.Pop was expected....
jsr CSH.Pop get stacked Cmd...
tax
jmp (J.CSH.KW.END,x)
2019-09-05 06:43:09 +00:00
.4 jsr CSH.IsLetter
2019-08-28 15:21:42 +00:00
bcc .5
bra .99 error, todo : PREOPS ++ --.....
2019-09-05 06:43:09 +00:00
.5 jsr CSH.SavePtr Save Ptr, in case of while,for....
>LDYA L.CSH.KW
jsr CSH.LookupID
2019-08-28 15:21:42 +00:00
bcs .6 not an internal CSH keyword....
2019-08-27 15:13:00 +00:00
jsr CSH.KW.JMP
bcs .9
2019-08-28 15:21:42 +00:00
bra .8
2019-08-28 15:21:42 +00:00
.6 jsr CSH.GetVar
bcs .7
2019-02-13 16:20:44 +00:00
2019-09-03 15:35:13 +00:00
>STYA ZPVarID
jsr CSH.GetCharNB
bcs .9
2019-09-06 12:50:27 +00:00
cmp #'=' TODO: all AOPS
bne .99
2019-08-27 15:13:00 +00:00
jsr CSH.GetNextChar Skip =
bcs .99
2019-08-29 15:49:03 +00:00
lda #0 Any Type
jsr CSH.ExpEval
bcs .9
2019-09-06 12:50:27 +00:00
2019-09-03 15:35:13 +00:00
>LDYA ZPVarID X = Exp Type
2019-09-04 15:35:50 +00:00
jsr CSH.SetVarValueFromStack
bcs .9
jsr CSH.GetChar
cmp #';'
bne .99
2019-08-28 15:21:42 +00:00
bra .8
2020-01-23 14:48:22 +00:00
2019-08-28 15:21:42 +00:00
.7 lda #0 no return value type check required
2019-09-02 06:09:28 +00:00
jsr CSH.fCall
2019-02-13 16:20:44 +00:00
bcs .9
2019-08-26 06:29:18 +00:00
2020-01-23 14:48:22 +00:00
jsr CSH.SIZEOF X = returned value type
clc A = Sizeof
adc pStack
sta pStack Discard value on stack
2019-08-28 15:21:42 +00:00
.8 jsr CSH.GetNextCharNB Skip ;
2019-08-27 15:13:00 +00:00
bcs .9
cmp #C.CR
2019-09-03 15:35:13 +00:00
beq .80
jmp CSH.Run.1
.80 jmp CSH.GetNextChar Skip CR
.99 lda #CSH.E.SYNTAX
sec
.9 rts
2016-08-17 06:25:58 +00:00
*--------------------------------------
2019-08-26 06:29:18 +00:00
* Built in Keywords
*--------------------------------------
2019-08-29 15:49:03 +00:00
CSH.KW.JMP txa
2019-09-05 15:49:05 +00:00
>STA.G CSH.CmdSave
2019-08-29 15:49:03 +00:00
jmp (J.CSH.KW,x)
2019-09-05 15:49:05 +00:00
*--------------------------------------
CSH.WHILE
CSH.IF jsr CSH.GetCharNB
bcs .9
cmp #'('
bne .9
jsr CSH.GetNextCharNB
bcs .9
2019-08-29 15:49:03 +00:00
lda #0 Any var type
jsr CSH.ExpEval
bcs .99
jsr CSH.GetCharNB
bcs .99
cmp #')'
bne .9
2019-09-06 12:50:27 +00:00
jsr CSH.GetNextCharNB skip ')'
bcs .99
cmp #'{'
bne .9
jsr CSH.GetNextCharNB Skip '{'
bcs .99
2019-09-05 15:49:05 +00:00
2019-09-05 06:43:09 +00:00
jsr CSH.IsValue0 X = var type from ExpEval
bcc .6 Value=0, skip {{....}}
2019-09-05 15:49:05 +00:00
>LDA.G CSH.CmdSave
beq .1 IF
2019-09-05 06:43:09 +00:00
2019-09-05 15:49:05 +00:00
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
2019-09-05 15:49:05 +00:00
.6 jsr CSH.SkipBlock
bcc .99
.9 lda #CSH.E.SYNTAX
sec
.99 rts
2019-08-29 15:49:03 +00:00
*--------------------------------------
2019-09-05 15:49:05 +00:00
*CSH.Keyword.Start
* >LDA.G CSH.CmdSave get back Token ("IF" or "WHILE")
* tax
* jmp (J.CSH.KW.START,x)
*--------------------------------------
2019-09-05 15:49:05 +00:00
*CSH.IF.START jmp CSH.Push Push "IF" Token
*--------------------------------------
2019-09-05 15:49:05 +00:00
*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
*--------------------------------------
2019-09-05 15:49:05 +00:00
CSH.IF.END clc
rts
*--------------------------------------
CSH.WHILE.END jsr CSH.Pop
2018-11-10 14:30:09 +00:00
sta ZPFileBufPtr
jsr CSH.Pop
2018-11-10 14:30:09 +00:00
sta ZPFileBufPtr+1
clc
rts
*--------------------------------------
CSH.ELSE
2019-09-05 06:43:09 +00:00
*--------------------------------------
CSH.DO
CSH.FOR
CSH.SWITCH
CSH.CASE
CSH.BREAK
CSH.CONTINUE
lda #CSH.E.SYNTAX
sec
rts
*--------------------------------------
2019-08-26 06:29:18 +00:00
* Built in Types
*--------------------------------------
CSH.SIGNED jsr CSH.GetChar
bcs .9
2019-08-26 06:29:18 +00:00
cmp #C.SPACE
bne .9
jsr CSH.GetNextCharNB
bcs .9
>LDYA L.CSH.STYPES
jsr CSH.LookupID
bcs .9
jmp (J.CSH.STYPES,x)
.9 lda #CSH.E.SYNTAX
sec
2019-10-03 06:25:27 +00:00
rts
*--------------------------------------
CSH.UNSIGNED jsr CSH.GetChar
bcs .9
2019-08-26 06:29:18 +00:00
cmp #C.SPACE
bne .9
jsr CSH.GetNextCharNB
bcs .9
>LDYA L.CSH.STYPES
jsr CSH.LookupID
bcs .9
jmp (J.CSH.UTYPES,x)
.9 lda #CSH.E.SYNTAX
sec
rts
*--------------------------------------
2020-01-22 16:31:48 +00:00
CSH.VOID ldx #CSH.T.VOID
bra CSH.TYPE
2019-08-26 06:29:18 +00:00
CSH.CHAR ldx #CSH.T.CHAR
bra CSH.TYPE
2019-08-26 06:29:18 +00:00
CSH.UCHAR ldx #CSH.T.UCHAR
bra CSH.TYPE
2019-08-26 06:29:18 +00:00
CSH.INT ldx #CSH.T.INT
bra CSH.TYPE
2019-08-26 06:29:18 +00:00
CSH.UINT ldx #CSH.T.UINT
bra CSH.TYPE
2019-08-26 06:29:18 +00:00
CSH.LONG ldx #CSH.T.LONG
bra CSH.TYPE
2019-08-26 06:29:18 +00:00
CSH.ULONG ldx #CSH.T.ULONG
bra CSH.TYPE
2019-08-26 06:29:18 +00:00
CSH.FLOAT ldx #CSH.T.FLOAT
2019-08-26 06:29:18 +00:00
CSH.TYPE stx ZPVarType
jsr CSH.GetChar
bcs .9
2019-08-26 06:29:18 +00:00
cmp #C.SPACE
bne .9
2020-01-22 16:31:48 +00:00
.11 jsr CSH.GetNextCharNB
bcs .9
2020-01-22 16:31:48 +00:00
cmp #'*'
bne .10
lda #CSH.Q.POINTER
tsb ZPVarType
bra .11
.10 jsr CSH.IsLetter
bcs .9
2019-09-03 15:35:13 +00:00
jsr CSH.AddVar add with no value...
2019-08-26 06:29:18 +00:00
bcs .99 OOM or DUP
2019-09-03 15:35:13 +00:00
2019-08-26 06:29:18 +00:00
>STYA ZPVarID
jsr CSH.GetCharNB
bcs .9
cmp #';'
2019-09-03 15:35:13 +00:00
bne .2
ldx ZPVarType
2020-01-23 14:48:22 +00:00
2019-09-03 15:35:13 +00:00
jsr CSH.SIZEOF
2020-01-23 14:48:22 +00:00
2019-09-03 15:35:13 +00:00
.1 dec pStack
dec
bne .1
2020-01-23 14:48:22 +00:00
2019-09-03 15:35:13 +00:00
ldx ZPVarType
bra .7
.2 cmp #'='
bne .9
2019-08-27 15:13:00 +00:00
jsr CSH.GetNextCharNB Skip =
bcs .9
2019-08-26 06:29:18 +00:00
lda ZPVarType
jsr CSH.ExpEval
bcs .99
2019-09-03 15:35:13 +00:00
.7 >LDYA ZPVarID
2019-09-04 15:35:50 +00:00
jsr CSH.AddVarValueFromStack X= Type, Add value to this var
2019-08-28 15:21:42 +00:00
bcs .99
jsr CSH.GetChar
bcs .9
cmp #';'
bne .9
2019-08-27 15:13:00 +00:00
.8 clc
rts
.90 lda #CSH.E.DUP
sec
rts
2019-10-03 06:25:27 +00:00
.9 lda #CSH.E.SYNTAX
sec
.99 rts
*--------------------------------------
2019-08-26 06:29:18 +00:00
* Input:
* ZPFileBufPtr, A = Expected type
* Output:
* CS, A = EC
2019-09-02 06:09:28 +00:00
* CC, Result on Stack, X = Type
2019-08-26 06:29:18 +00:00
*--------------------------------------
2019-08-29 15:49:03 +00:00
CSH.fCall ldx ZPPtr1
2019-08-26 06:29:18 +00:00
phx
ldx ZPPtr1+1
phx
2019-08-29 15:49:03 +00:00
ldx ZPPtr2 local : type
phx
ldx ZPPtr2+1 local : variadic size
2019-08-26 06:29:18 +00:00
phx
2020-01-24 14:21:08 +00:00
2019-08-26 06:29:18 +00:00
sta ZPPtr2 save Type
2019-08-29 15:49:03 +00:00
stz ZPPtr2+1 Reset VARIADIC byte count
2019-08-26 06:29:18 +00:00
>LDYA L.CSH.FN
jsr CSH.LookupFn
phx X = function index
2019-08-29 15:49:03 +00:00
bcs .10
2019-08-26 06:29:18 +00:00
>STYA ZPPtr1 f() definition, starting at returned type
jsr CSH.GetCharNB
2019-09-02 06:09:28 +00:00
bcs .10
2019-08-26 06:29:18 +00:00
cmp #'('
2019-09-06 12:50:27 +00:00
bne .52
2019-08-26 06:29:18 +00:00
jsr CSH.GetNextCharNB skip '('
2019-08-29 15:49:03 +00:00
.10 bcs .90
2019-08-26 06:29:18 +00:00
2019-09-02 06:09:28 +00:00
lda ZPPtr2
bne .11
2020-01-23 14:48:22 +00:00
2019-09-02 06:09:28 +00:00
lda (ZPPtr1)
sta ZPPtr2
bra .1 expected type is 0, no check
2020-01-23 14:48:22 +00:00
2019-09-02 06:09:28 +00:00
.11 cmp (ZPPtr1) Get Return value Type
2019-08-26 06:29:18 +00:00
bne .91
2020-01-23 14:48:22 +00:00
2020-01-24 14:21:08 +00:00
.1 jsr CSH.ZPPtr1Next advance to arg list type
2019-08-26 06:29:18 +00:00
2020-01-24 14:21:08 +00:00
lda (ZPPtr1) get type of first arg
2019-08-26 06:29:18 +00:00
beq .7 end of list, go check ending ')'
2019-09-02 06:09:28 +00:00
*--------------------------------------
2019-08-26 06:29:18 +00:00
.3 eor #CSH.T.VARIADIC if VARIADIC, don't advance to next arg and assume type = 0
beq .4
2019-09-02 06:09:28 +00:00
eor #CSH.T.VARIADIC restore type...
2019-08-29 15:49:03 +00:00
.4 jsr CSH.ExpEval A=0 if VARIADIC
bcs .9 X = Var Type
2019-08-26 06:29:18 +00:00
2019-09-02 06:09:28 +00:00
lda (ZPPtr1) get current arg type
2019-08-29 15:49:03 +00:00
eor #CSH.T.VARIADIC
bne .5
2019-09-02 06:09:28 +00:00
jsr CSH.SIZEOF X = Var Type
2019-08-29 15:49:03 +00:00
* clc
2019-09-02 06:09:28 +00:00
2019-08-29 15:49:03 +00:00
adc ZPPtr2+1
sta ZPPtr2+1 Add to byte count
2019-09-02 06:09:28 +00:00
bra .51
2020-01-24 14:21:08 +00:00
.5 jsr CSH.ZPPtr1Next
2019-09-02 06:09:28 +00:00
.51 jsr CSH.GetCharNB
2019-08-29 15:49:03 +00:00
bcs .90
2020-01-24 14:21:08 +00:00
2019-08-26 06:29:18 +00:00
cmp #','
2019-08-28 15:21:42 +00:00
bne .6
2019-08-26 06:29:18 +00:00
jsr CSH.GetNextCharNB Skip ,
lda (ZPPtr1)
bne .3 Another ARG....
2019-09-06 12:50:27 +00:00
.52 bra .90 extra args....error
2020-01-24 14:21:08 +00:00
2019-08-28 15:21:42 +00:00
.6 cmp #')'
bne .90
lda (ZPPtr1)
2019-09-02 06:09:28 +00:00
beq .8 no more arg after ')', exit
2019-08-28 15:21:42 +00:00
eor #CSH.T.VARIADIC
2019-08-29 15:49:03 +00:00
bne .90 missing arg
2019-08-26 06:29:18 +00:00
2019-08-29 15:49:03 +00:00
>PUSHB ZPPtr2+1 push VARIADIC byte count
bra .8
2019-08-26 06:29:18 +00:00
.7 jsr CSH.GetCharNB
bcs .90
cmp #')'
bne .90
2019-08-28 15:21:42 +00:00
.8 jsr CSH.GetNextCharNB Skip )
2019-08-27 15:13:00 +00:00
plx restore X = function index
2019-09-06 12:50:27 +00:00
ldy ZPPtr2 get type in Y
2019-08-29 15:49:03 +00:00
pla
sta ZPPtr2+1
2019-08-27 15:13:00 +00:00
pla
sta ZPPtr2
pla
sta ZPPtr1+1
pla
sta ZPPtr1
2019-09-06 12:50:27 +00:00
phy
jsr .80
plx
rts
2019-08-26 06:29:18 +00:00
.90 lda #CSH.E.SYNTAX
.HS 2C BIT ABS
.91 lda #CSH.E.TMISMATCH
sec
2019-08-28 15:21:42 +00:00
.9 plx Discard function index
2019-08-29 15:49:03 +00:00
plx
stx ZPPtr2+1
2019-08-28 15:21:42 +00:00
plx
2019-08-26 06:29:18 +00:00
stx ZPPtr2
plx
stx ZPPtr1+1
plx
stx ZPPtr1
2019-08-28 15:21:42 +00:00
2019-08-26 06:29:18 +00:00
.99 rts
2019-09-06 12:50:27 +00:00
2019-10-03 06:25:27 +00:00
.80 jmp (J.CSH.EXEC,x)
2019-08-26 06:29:18 +00:00
*--------------------------------------
* Input:
* ZPFileBufPtr, A = Expected type
* Output:
* CS, A = EC
2019-08-29 15:49:03 +00:00
* CC, X = Var Type, Value on Stack
2019-08-26 06:29:18 +00:00
*--------------------------------------
2019-08-27 15:13:00 +00:00
CSH.ExpEval ldx ZPPtr1
phx
ldx ZPPtr1+1
phx
2019-08-28 15:21:42 +00:00
ldx ZPPtr2 local : VarType
2019-08-26 06:29:18 +00:00
phx
2019-08-28 15:21:42 +00:00
ldx ZPPtr2+1 local : BOP1
2019-08-26 06:29:18 +00:00
phx
2019-08-28 15:21:42 +00:00
2020-01-23 14:48:22 +00:00
sta ZPPtr2 local : expected type
2019-02-08 16:13:43 +00:00
.10 lda #$ff
2019-08-26 06:29:18 +00:00
sta ZPPtr2+1 Reset BOP1
2019-02-08 16:13:43 +00:00
jsr CSH.GetCharNB
2019-08-27 15:13:00 +00:00
bcs .33
2019-08-26 06:29:18 +00:00
.20 jsr CSH.IsLetter Fnc or Var ?
bcs .2
2019-09-03 15:35:13 +00:00
jsr CSH.GetVar
bcs .1
2019-09-02 06:09:28 +00:00
2020-01-23 14:48:22 +00:00
ldx ZPPtr2 expected var type (could be 0=any)
2019-09-04 15:35:50 +00:00
jsr CSH.GetVarValueOnStack Y,A = VarID, Get value on stack
2019-09-06 12:50:27 +00:00
bcs .29
2019-09-02 06:09:28 +00:00
stx ZPPtr2 store real var type
2019-10-03 06:25:27 +00:00
bra .11
2019-08-28 15:21:42 +00:00
.1 lda ZPPtr2 var type
2019-08-29 15:49:03 +00:00
jsr CSH.fCall X = function index
bcs .99
2019-09-06 12:50:27 +00:00
stx ZPPtr2 store real var type
bra .11
.2 jsr CSH.IsDigit10 number ?
2019-02-13 16:20:44 +00:00
bcs .3
2019-09-04 15:35:50 +00:00
ldx ZPPtr2
2019-09-06 12:50:27 +00:00
bne .22
ldx #CSH.T.INT
stx ZPPtr2
.22 jsr CSH.GetNumOnStack
.29 bcs .99
.11 jsr CSH.GetCharNB
2019-08-27 15:13:00 +00:00
bcs .90
2019-08-26 06:29:18 +00:00
cmp #','
beq .8
cmp #')'
beq .8
cmp #';'
beq .8
jsr CSH.IsOPChar
2019-08-27 15:13:00 +00:00
.33 bcs .90
>LDYA L.CSH.BOPS
jsr CSH.LookupOP
2019-08-27 15:13:00 +00:00
bcs .90
2019-08-26 06:29:18 +00:00
lda ZPPtr2+1 previous OP...
bpl .5 go check precedence
2019-08-26 06:29:18 +00:00
stx ZPPtr2+1
jsr CSH.GetCharNB
2019-08-26 06:29:18 +00:00
bcc .20 go check for an ARG
2019-08-27 15:13:00 +00:00
bra .90
2019-08-26 06:29:18 +00:00
.3 cmp #'"' String literal
2019-08-27 15:13:00 +00:00
bne .90
2019-02-13 16:20:44 +00:00
jsr CSH.AddContCharP
bcs .99
jmp .11
2019-08-26 06:29:18 +00:00
.5 cpx ZPPtr2+1
2019-10-03 06:25:27 +00:00
bcs .6
* new OP has precedence, stack ACC
2019-02-13 16:20:44 +00:00
jmp .10
2019-10-03 06:25:27 +00:00
* Old OP has precedence, compute ACC=ARG <BOP> ACC
2019-09-04 15:35:50 +00:00
.6 lda ZPPtr2 Var Type
ldx ZPPtr2+1 BOP
2019-09-05 15:49:05 +00:00
jsr CSH.BOPExec
2019-08-27 15:13:00 +00:00
bcs .99
jsr CSH.GetCharNB
2019-08-27 15:13:00 +00:00
bcs .90
2019-02-08 16:13:43 +00:00
jmp .10
2019-09-03 15:35:13 +00:00
.8 ldx ZPPtr2+1
bmi .80
2019-09-04 15:35:50 +00:00
lda ZPPtr2 Var Type
2019-09-05 15:49:05 +00:00
jsr CSH.BOPExec
2019-08-27 15:13:00 +00:00
bcc .80
bcs .99
.90 lda #CSH.E.SYNTAX
.99 sec
.HS 90 BCC
.80 clc
2019-08-29 15:49:03 +00:00
ldx ZPPtr2 X = Var Type
2019-09-03 15:35:13 +00:00
ply
sty ZPPtr2+1
ply
sty ZPPtr2
ply
sty ZPPtr1+1
ply
sty ZPPtr1
rts
*--------------------------------------
2019-02-13 16:20:44 +00:00
CSH.AddContCharP
ldy #0
.1 jsr CSH.GetNextChar
bcs .9
cmp #C.CR
beq .9
cmp #'"'
beq .2
sta (ZPCSHConst),y
iny
bra .1
2019-08-27 15:13:00 +00:00
.2 lda #0
2019-02-13 16:20:44 +00:00
sta (ZPCSHConst),y
2019-08-27 15:13:00 +00:00
>PUSHW ZPCSHConst Push PTR on stack
2019-08-26 06:29:18 +00:00
2019-08-27 15:13:00 +00:00
tya
2019-02-13 16:20:44 +00:00
sec
adc ZPCSHConst
sta ZPCSHConst
bcc .3
inc ZPCSHConst+1
2019-08-27 15:13:00 +00:00
.3 jsr CSH.GetNextChar Skip "
2019-02-13 16:20:44 +00:00
clc
rts
.9 lda #CSH.E.SYNTAX
sec
rts
*--------------------------------------
2018-11-10 14:30:09 +00:00
CSH.SavePtr >LDYA ZPFileBufPtr
>STYA.G CSH.BufPtrSave
rts
*--------------------------------------
CSH.RestorePtr >LDYA.G CSH.BufPtrSave
2018-11-10 14:30:09 +00:00
>STYA ZPFileBufPtr
rts
*--------------------------------------
CSH.LookupFN sec
.HS 90 BCC
CSH.LookupID clc
>STYA ZPPtr1
ror
>STA.G CSH.LookupOpt
jsr CSH.GetIDLen
bra CSH.Lookup
CSH.LookupOP >STYA ZPPtr1
>STZ.G CSH.LookupOpt
jsr CSH.GetOPLen
CSH.Lookup phy Y = len
ldx #0
.1 lda (ZPPtr1)
beq .9 Ending 0, not found....
pla
pha Get Back Len
cmp (ZPPtr1) Same Len ?
bne .4
tay
.2 lda (ZPPtr1),y
.3 dey
2018-11-10 14:30:09 +00:00
cmp (ZPFileBufPtr),y
bne .4
tya
bne .2
pla Found keyword...
clc
2018-11-10 14:30:09 +00:00
adc ZPFileBufPtr ..advance Ptr to char after it..
sta ZPFileBufPtr
bcc .31
2018-11-10 14:30:09 +00:00
inc ZPFileBufPtr+1
.31 lda ZPPtr1
sec
adc (ZPPtr1)
2019-08-26 06:29:18 +00:00
tay
2019-02-13 16:20:44 +00:00
lda ZPPtr1+1
adc #0
2019-08-26 06:29:18 +00:00
clc Y,A = F() def, X = F() index
.8 rts
.4 inx
inx
2019-08-26 06:29:18 +00:00
lda (ZPPtr1)
jsr CSH.ZPPtr1AddAp1
>LDA.G CSH.LookupOpt
bpl .1
2020-01-24 14:21:08 +00:00
ldy #$0 Start at Y=1 for VOID func()
.6 iny
lda (ZPPtr1),y
bne .6
2020-01-24 14:21:08 +00:00
tya
2019-08-26 06:29:18 +00:00
jsr CSH.ZPPtr1AddAp1
bra .1
2020-01-24 14:21:08 +00:00
.9 pla
sec
rts
*--------------------------------------
2020-01-24 14:21:08 +00:00
CSH.ZPPtr1Next inc ZPPtr1
bne .8
inc ZPPtr1+1
.8 rts
*--------------------------------------
2019-02-13 16:20:44 +00:00
CSH.ZPPtr1AddAp1
sec
adc ZPPtr1
sta ZPPtr1
bcc .1
inc ZPPtr1+1
.1 rts
*--------------------------------------
2019-08-26 15:27:28 +00:00
CSH.GetNumOnStack
2019-09-06 12:50:27 +00:00
txa
beq .99
2019-02-07 16:52:25 +00:00
2019-09-06 12:50:27 +00:00
.10 cpx #CSH.T.FLOAT
bcc .1
bne .99
2018-11-10 14:30:09 +00:00
>PUSHWI ZPFileBufPtr
>LDYA ZPFileBufPtr
>SYSCALL StrToF
2019-08-27 15:13:00 +00:00
clc
rts
.1 >PUSHBI 10
2018-11-10 14:30:09 +00:00
>PUSHWI ZPFileBufPtr
>LDYA ZPFileBufPtr
2019-09-04 15:35:50 +00:00
phx
2019-09-02 15:34:10 +00:00
cpx #CSH.T.UCHAR
bcc .2
>SYSCALL StrToUL
bra .3
.2 >SYSCALL StrToL
2019-09-04 15:35:50 +00:00
.3 plx
bcs .9
lda CSH.TYPESIZE,x
2019-09-02 15:34:10 +00:00
cmp #4
beq .8
cmp #2
bne .4
ldy #1
>PULLA
sta (pStack),y
>PULLA
sta (pStack),y
clc
rts
2020-01-23 14:48:22 +00:00
2019-09-02 15:34:10 +00:00
.4 >PULLA
inc pStack
inc pStack
sta (pStack)
.8 clc
2019-09-06 12:50:27 +00:00
.9 rts
.99 lda #CSH.E.TMISMATCH
sec
rts
*--------------------------------------
2019-09-04 15:35:50 +00:00
* Input : ZPFileBufPtr
2019-08-26 06:29:18 +00:00
* Output : Y,A = ZPVarID
*--------------------------------------
2019-09-03 15:35:13 +00:00
CSH.AddVar >PUSHW ZPFileBufPtr
2019-08-26 06:29:18 +00:00
>LDA.G CSH.hSymbols
>SYSCALL SListNewKey
bcs .9
2019-09-03 15:35:13 +00:00
pha
2019-08-26 06:29:18 +00:00
txa
* clc
adc ZPFileBufPtr
sta ZPFileBufPtr
bcc .1
2019-08-26 06:29:18 +00:00
inc ZPFileBufPtr+1
2019-09-03 15:35:13 +00:00
clc
.1 pla
.9 rts
*--------------------------------------
* Y,A = VarID, X=Type
*--------------------------------------
2019-09-04 15:35:50 +00:00
CSH.AddVarValueFromStack
sec
2019-09-03 15:35:13 +00:00
.HS 90 BCC
*--------------------------------------
2019-09-04 15:35:50 +00:00
CSH.SetVarValueFromStack
clc
2019-09-03 15:35:13 +00:00
php
pha
phy
stx ZPVarData X = type
2019-09-03 15:35:13 +00:00
jsr CSH.SIZEOF
pha Size....
2019-08-26 06:29:18 +00:00
tax
2019-09-03 15:35:13 +00:00
ldy #1
.1 >PULLA
sta ZPVarData,y
iny
dex
bne .1
>PUSHBI 0 Datalen HI
pla
inc
>PUSHA Datalen LO
>PUSHWI ZPVarData DataPtr
ply
pla
>PUSHYA Y,A = VarID
2019-08-26 06:29:18 +00:00
>LDA.G CSH.hSymbols
2019-09-03 15:35:13 +00:00
plp
bcc .2
2019-08-26 06:29:18 +00:00
>SYSCALL SListAddData
2019-09-03 15:35:13 +00:00
rts
.2 >SYSCALL SListSetData
2019-10-03 06:25:27 +00:00
rts
*--------------------------------------
2019-08-28 15:21:42 +00:00
CSH.GetVar >PUSHW ZPFileBufPtr
2019-08-26 06:29:18 +00:00
>LDA.G CSH.hSymbols
>SYSCALL SListLookup
bcs .9
2019-09-03 15:35:13 +00:00
pha
2019-08-26 06:29:18 +00:00
txa
* clc
adc ZPFileBufPtr
sta ZPFileBufPtr
bcc .1
inc ZPFileBufPtr+1
2019-08-26 15:27:28 +00:00
clc
2019-09-03 15:35:13 +00:00
.1 pla Y,A = VarID
.9 rts
2019-08-26 15:27:28 +00:00
*--------------------------------------
2019-09-03 15:35:13 +00:00
* Input : Y,A = VarID, X = Var Type (or 0)
2019-08-28 15:21:42 +00:00
* Output : Value on Stack, X = Var Type
2019-08-26 15:27:28 +00:00
*--------------------------------------
2019-09-04 15:35:50 +00:00
CSH.GetVarValueOnStack
stx ZPVarType
2019-09-03 15:35:13 +00:00
pha
>PUSHWI 0 From Start
>PUSHWI 6 6 bytes
2019-08-26 15:27:28 +00:00
>PUSHWI ZPVarData
2019-09-03 15:35:13 +00:00
pla
>PUSHYA KeyID
2019-08-26 15:27:28 +00:00
>LDA.G CSH.hSymbols
>SYSCALL SListGetData
2019-09-03 15:35:13 +00:00
bcs .9
2019-08-28 15:21:42 +00:00
2019-08-26 15:27:28 +00:00
ldx ZPVarType
2020-01-23 14:48:22 +00:00
beq .1 any type
2019-08-26 15:27:28 +00:00
cpx ZPVarData
2020-01-23 14:48:22 +00:00
beq .2
txa
and #CSH.Q.PPPOINTER
beq .99 not pointer....mismatch
eor ZPVarData
and #CSH.Q.PPPOINTER
bne .99 compare only pointer depth
2019-08-29 15:49:03 +00:00
.1 ldx ZPVarData
2019-09-03 15:35:13 +00:00
beq *
2020-01-23 14:48:22 +00:00
.2 jsr CSH.SIZEOF
2019-09-03 15:35:13 +00:00
tay
2020-01-23 14:48:22 +00:00
.3 lda ZPVarData,y
2019-08-26 15:27:28 +00:00
>PUSHA
dey
2020-01-23 14:48:22 +00:00
bne .3
2019-09-02 06:09:28 +00:00
clc X = Var Type
2019-09-05 15:49:05 +00:00
.9 rts
2019-08-28 15:21:42 +00:00
2019-09-05 15:49:05 +00:00
.99
2020-01-23 14:48:22 +00:00
CSH.TMISMATCH lda #CSH.E.TMISMATCH
2019-08-26 15:27:28 +00:00
sec
2019-09-05 15:49:05 +00:00
rts
*--------------------------------------
2019-08-29 15:49:03 +00:00
* Input : Value on Stack, X = Var Type
* Output : CC = true, CS = false
*--------------------------------------
2019-09-05 15:49:05 +00:00
CSH.IsValue0 cpx #CSH.T.FLOAT
2019-08-29 15:49:03 +00:00
bcc .1 char,int,long
2019-09-02 06:09:28 +00:00
ldy CSH.TYPESIZE,x
2019-08-26 15:27:28 +00:00
lda ZPVarData,y
bne .9
.8 clc
rts
2019-09-05 06:43:09 +00:00
.1 jsr CSH.SIZEOF
tax
2019-09-05 06:43:09 +00:00
lda #0
2019-09-05 06:43:09 +00:00
.2 ora (pStack)
inc pStack
dex
bne .2
tax
beq .8
.9 sec
rts
*--------------------------------------
2019-09-05 15:49:05 +00:00
* A = Type, X = OP
*--------------------------------------
2019-09-05 15:49:05 +00:00
CSH.BOPExec jmp (J.CSH.BOPS,x)
*--------------------------------------
CSH.BOPS.ADD asl
tax
jmp (J.CSH.BOPS.ADDt,x)
CSH.BOPS.ADDi8
CSH.BOPS.ADDu8 clc
>PULLA
adc (pStack)
sta (pStack)
clc
rts
2019-09-03 15:35:13 +00:00
2019-09-05 15:49:05 +00:00
CSH.BOPS.ADDi16
CSH.BOPS.ADDu16 clc
ldy #1
>PULLA
adc (pStack),y
sta (pStack),y
>PULLA
adc (pStack),y
sta (pStack),y
clc
rts
CSH.BOPS.ADDi32
CSH.BOPS.ADDu32 >FPU ADD32
clc
rts
2019-09-05 15:49:05 +00:00
CSH.BOPS.ADDf >FPU FADD
2019-09-04 15:35:50 +00:00
clc
2019-09-03 15:35:13 +00:00
rts
2019-09-05 15:49:05 +00:00
*--------------------------------------
CSH.BOPS.SUB asl
tax
jmp (J.CSH.BOPS.SUBt,x)
2019-09-03 15:35:13 +00:00
2019-09-05 15:49:05 +00:00
CSH.BOPS.SUBi8
CSH.BOPS.SUBu8 sec
ldy #1
lda (pStack),y
sbc (pStack)
sta (pStack),y
inc pStack
clc
rts
2019-09-05 15:49:05 +00:00
CSH.BOPS.SUBi16
CSH.BOPS.SUBu16 sec
ldy #2
lda (pStack),y
sbc (pStack)
sta (pStack),y
iny
lda (pStack),y
ldy #1
sbc (pStack),y
inc pStack
inc pStack
sta (pStack),y
clc
rts
CSH.BOPS.SUBi32
CSH.BOPS.SUBu32 >FPU SUB32
clc
rts
2019-09-05 15:49:05 +00:00
CSH.BOPS.SUBf >FPU FSUB
2019-09-04 15:35:50 +00:00
clc
2019-09-05 15:49:05 +00:00
rts
*--------------------------------------
2019-09-04 15:35:50 +00:00
CSH.BOPS.MUL cmp #CSH.T.FLOAT
2019-09-03 15:35:13 +00:00
beq .8
2017-11-14 16:57:34 +00:00
clc
rts
2019-09-03 15:35:13 +00:00
.8 >FPU FMULT
2019-09-04 15:35:50 +00:00
clc
2019-09-03 15:35:13 +00:00
rts
2019-09-05 15:49:05 +00:00
*--------------------------------------
2019-09-04 15:35:50 +00:00
CSH.BOPS.DIV cmp #CSH.T.FLOAT
2017-11-14 16:57:34 +00:00
beq .8
clc
rts
2019-09-03 15:35:13 +00:00
.8 >FPU FDIV
2019-09-04 15:35:50 +00:00
clc
2017-11-14 16:57:34 +00:00
rts
2019-09-05 15:49:05 +00:00
*--------------------------------------
CSH.BOPS.MOD
CSH.BOPS.SHL
CSH.BOPS.SHR
CSH.BOPS.L
CSH.BOPS.G
CSH.BOPS.LE
CSH.BOPS.GE
CSH.BOPS.EQ
CSH.BOPS.NE
CSH.BOPS.AND
CSH.BOPS.OR
CSH.BOPS.EOR
CSH.BOPS.LAND
CSH.BOPS.LOR
clc
rts
*--------------------------------------
* Stack
*--------------------------------------
2019-09-05 06:43:09 +00:00
CSH.CheckStack tax
>LDA.G CSH.StackPtr
beq .9
2020-01-23 14:48:22 +00:00
2019-09-05 06:43:09 +00:00
tay
txa
cmp (ZPCSHStack),y
bne .9
2020-01-23 14:48:22 +00:00
2019-09-05 06:43:09 +00:00
clc
rts
2020-01-23 14:48:22 +00:00
2019-09-05 06:43:09 +00:00
.9 lda #CSH.E.SYNTAX
sec
rts
*--------------------------------------
CSH.Push pha
>LDA.G CSH.StackPtr
2020-01-23 14:48:22 +00:00
dec
beq .9
sta (pData),y
tay
pla
sta (ZPCSHStack),y
clc
rts
.9 pla
lda #CSH.E.SOVERFLW
sec
rts
*--------------------------------------
CSH.Pop >LDA.G CSH.StackPtr
beq .9
2020-01-23 14:48:22 +00:00
pha
inc
sta (pData),y
2020-01-23 14:48:22 +00:00
ply
lda (ZPCSHStack),y
clc
rts
2020-01-23 14:48:22 +00:00
.9 lda #CSH.E.STACKERR
sec
2019-10-03 06:25:27 +00:00
rts
*--------------------------------------
* CHAR related Subs.....
*--------------------------------------
CSH.GetOPLen ldy #0
.1 iny
2018-11-10 14:30:09 +00:00
lda (ZPFileBufPtr),y
beq .8
jsr CSH.IsOPChar
bcc .1
.8 tya
rts
*--------------------------------------
CSH.GetIDLen ldy #0
.1 iny
2018-11-10 14:30:09 +00:00
lda (ZPFileBufPtr),y
beq .8
jsr CSH.IsLetterOrDigit
bcc .1
.8 tya
rts
*--------------------------------------
2019-09-05 15:49:05 +00:00
CSH.SkipStatement
clc
rts
*--------------------------------------
CSH.SkipBlock ldy #0 not in "", TOTO:skip comments
ldx #1 starting with 1 '{' for now....
2019-09-05 06:43:09 +00:00
.1 jsr CSH.GetNextCharNB
bcs .9
cmp #'{'
bne .2
2019-09-05 15:49:05 +00:00
tya
bmi .1
2019-09-05 06:43:09 +00:00
inx
bra .1
.2 cmp #'}'
2019-09-05 15:49:05 +00:00
bne .3
tya
bmi .1
2019-09-05 06:43:09 +00:00
dex
bne .1
2019-09-06 12:50:27 +00:00
clc
rts
2019-09-05 15:49:05 +00:00
.3 cmp #'"'
bne .1
tya
eor #$ff
tay
bra .1
2019-09-05 06:43:09 +00:00
jmp CSH.GetNextCharNB skip '}'
2019-10-03 06:25:27 +00:00
.9 rts
2019-09-05 06:43:09 +00:00
*--------------------------------------
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
*--------------------------------------
2018-11-10 14:30:09 +00:00
CSH.CheckCharNB cmp #C.SPACE
beq .9
2018-11-10 14:30:09 +00:00
cmp #C.LF
beq .9
2018-11-10 14:30:09 +00:00
cmp #C.TAB
beq .9
clc
2019-10-03 06:25:27 +00:00
.9 rts
*--------------------------------------
2018-11-10 14:30:09 +00:00
CSH.GetNextChar inc ZPFileBufPtr
bne CSH.GetChar
2018-11-10 14:30:09 +00:00
inc ZPFileBufPtr+1
*--------------------------------------
2018-11-10 14:30:09 +00:00
CSH.GetChar lda (ZPFileBufPtr)
beq .9
clc
rts
.9 lda #MLI.E.EOF
sec
rts
*---------------------------------------
2019-02-07 16:52:25 +00:00
CSH.IsOPChar ldx #CSH.OPChars.Cnt-1
.1 cmp CSH.OPChars,x
beq .8
dex
bpl .1
sec
rts
.8 clc
2019-10-03 06:25:27 +00:00
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
2019-10-03 06:25:27 +00:00
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
*--------------------------------------
2019-09-03 15:35:13 +00:00
* in : X = type, out : X = type, A = size
*--------------------------------------
2019-09-02 06:09:28 +00:00
CSH.SIZEOF txa
and #CSH.Q.PPPOINTER
bne .2
2020-01-23 14:48:22 +00:00
2019-09-02 06:09:28 +00:00
txa
and #$f
2019-09-03 15:35:13 +00:00
phx
tax
lda CSH.TYPESIZE,x
plx
2019-09-02 06:09:28 +00:00
rts
2020-01-23 14:48:22 +00:00
2019-09-02 06:09:28 +00:00
.2 lda #2
rts
*--------------------------------------
2019-08-26 06:29:18 +00:00
* EXEC
*--------------------------------------
2020-01-22 21:52:00 +00:00
EXEC.log >FPU LOG
clc
2019-10-03 06:25:27 +00:00
rts
2019-08-26 06:29:18 +00:00
*--------------------------------------
2020-01-22 21:52:00 +00:00
EXEC.sqr >FPU SQR
clc
rts
*--------------------------------------
EXEC.exp >FPU EXP
clc
2019-09-02 06:09:28 +00:00
rts
2019-08-26 06:29:18 +00:00
*--------------------------------------
EXEC.cos >FPU COS
2019-09-04 15:35:50 +00:00
clc
2019-08-26 06:29:18 +00:00
rts
*--------------------------------------
2020-01-22 21:52:00 +00:00
EXEC.sin >FPU SIN
clc
rts
*--------------------------------------
EXEC.tan >FPU TAN
clc
rts
*--------------------------------------
EXEC.atan >FPU ATAN
clc
rts
*--------------------------------------
2019-08-26 06:29:18 +00:00
EXEC.getchar >SYSCALL getchar
2019-09-02 15:34:10 +00:00
>PUSHA
2019-08-26 06:29:18 +00:00
rts
*--------------------------------------
2020-01-22 21:52:00 +00:00
EXEC.puts >PULLYA
>SYSCALL puts
2020-01-23 14:48:22 +00:00
>PUSHYA
2020-01-22 21:52:00 +00:00
rts
*--------------------------------------
EXEC.printf >SYSCALL printf2
2020-01-23 14:48:22 +00:00
>PUSHYA
2020-01-22 21:52:00 +00:00
rts
*--------------------------------------
2020-01-24 14:21:08 +00:00
EXEC.execl >SYSCALL execl
>PUSHYA
rts
*--------------------------------------
2020-01-23 14:48:22 +00:00
EXEC.putenv >SYSCALL putenv
2020-01-22 21:52:00 +00:00
>PUSHYA
rts
*--------------------------------------
2020-01-23 14:48:22 +00:00
EXEC.setenv >SYSCALL setenv
2020-01-22 21:52:00 +00:00
>PUSHYA
rts
*--------------------------------------
EXEC.getenv >SYSCALL getenv
>PUSHYA
rts
*--------------------------------------
2020-01-23 14:48:22 +00:00
EXEC.unsetenv >SYSCALL unsetenv
2020-01-22 21:52:00 +00:00
>PUSHYA
rts
*--------------------------------------
2020-01-24 14:21:08 +00:00
EXEC.MD5 >SYSCALL MD5
rts
*--------------------------------------
2020-01-22 16:31:48 +00:00
EXEC.malloc >PULLYA
>SYSCALL getmem
>PUSHYA
rts
*--------------------------------------
2016-08-17 06:25:58 +00:00
MAN
2019-01-26 16:33:03 +00:00
SAVE USR/SRC/BIN/CSH.S.CORE
LOAD USR/SRC/BIN/CSH.S
2016-08-17 06:25:58 +00:00
ASM