mirror of https://github.com/A2osX/A2osX.git
1288 lines
19 KiB
Plaintext
1288 lines
19 KiB
Plaintext
NEW
|
||
AUTO 3,1
|
||
.LIST OFF
|
||
*--------------------------------------
|
||
CC.Init >SYSCALL SListNew
|
||
bcs .99
|
||
|
||
>STA.G CC.hDefines
|
||
|
||
>SYSCALL SListNew
|
||
bcs .99
|
||
|
||
>STA.G CC.hTags
|
||
|
||
>SYSCALL SListNew
|
||
bcs .9
|
||
|
||
>STA.G CC.hSymbols
|
||
|
||
>LDYAI 4096
|
||
>SYSCALL GetMem
|
||
.99 bcs .9
|
||
|
||
>STYA ZPCCCode
|
||
txa
|
||
>STA.G CC.hCode
|
||
|
||
>LDYAI 1024
|
||
>SYSCALL GetMem
|
||
bcs .9
|
||
|
||
>STYA ZPCCConst
|
||
txa
|
||
>STA.G CC.hConst
|
||
|
||
>LDYAI 1024
|
||
>SYSCALL GetMem
|
||
bcs .9
|
||
|
||
>STYA ZPCCData
|
||
txa
|
||
>STA.G CC.hData
|
||
|
||
>LDYAI 1024
|
||
>SYSCALL GetMem
|
||
bcs .9
|
||
|
||
>STYA ZPCCStack
|
||
txa
|
||
>STA.G CC.hStack
|
||
|
||
>LDYAI 1024
|
||
>SYSCALL GetMem
|
||
bcs .9
|
||
|
||
>STYA ZPCCfDecl
|
||
txa
|
||
>STA.G CC.hfDecl
|
||
|
||
* clc
|
||
.9 rts
|
||
*--------------------------------------
|
||
CC.Quit >LDA.G CC.hSymbols
|
||
beq .1
|
||
|
||
>SYSCALL SListFree
|
||
|
||
.1 >LDA.G CC.hTags
|
||
beq .2
|
||
|
||
>SYSCALL SListFree
|
||
|
||
.2 >LDA.G CC.hDefines
|
||
beq .4
|
||
|
||
>SYSCALL SListFree
|
||
|
||
.4 lda hDefine
|
||
jsr .7
|
||
|
||
.5 jsr CS.RUN.FClose
|
||
bne .5
|
||
|
||
>LDA.G CC.hfDecl
|
||
jsr .7
|
||
|
||
>LDA.G CC.hStack
|
||
jsr .7
|
||
|
||
>LDA.G CC.hData
|
||
jsr .7
|
||
|
||
>LDA.G CC.hConst
|
||
jsr .7
|
||
|
||
>LDA.G CC.hCode
|
||
|
||
.7 beq CC.Quit.RTS
|
||
>SYSCALL FreeMem
|
||
CC.Quit.RTS rts
|
||
*--------------------------------------
|
||
CC.Run jsr CC.GetCharNB
|
||
bcs CC.Quit.RTS
|
||
|
||
CC.Run.1 cmp #C.CR empty line....
|
||
beq .2
|
||
|
||
cmp #'/'
|
||
bne .3 comments ...
|
||
|
||
jmp CC.comments
|
||
|
||
.2 clc
|
||
rts
|
||
|
||
.3 cmp #'#' directive ?
|
||
bne .4
|
||
|
||
jmp CC.DIR
|
||
|
||
.4 cmp #'}' End of block ?
|
||
bne .10
|
||
|
||
jsr CC.CheckStack must be something on stack....
|
||
bcs CC.Quit.RTS
|
||
|
||
jsr CC.GetNextCharNB Skip '}'
|
||
|
||
jsr CC.Pop was expected....
|
||
jsr CC.Pop get stacked Cmd...
|
||
tax
|
||
jmp (J.CC.KW.END,x)
|
||
*--------------------------------------
|
||
.10 jsr CC.IsLetter
|
||
bcc .20
|
||
|
||
* TODO: PREOPS ++ --.....
|
||
|
||
bcs .29
|
||
*--------------------------------------
|
||
.20 >LDYA L.CC.TMODS
|
||
jsr CC.LookupID
|
||
bcs .50
|
||
|
||
jsr CC.tDecl
|
||
bcs .59
|
||
|
||
>STYA ZPSymType Type/Qual
|
||
|
||
jsr CC.AddSymbol add with undef value...
|
||
bcs .29 OOM or DUP
|
||
|
||
lda ZPSymQual
|
||
bit #CC.Q.FUNC
|
||
bne .21
|
||
|
||
jsr CC.GetCharNB
|
||
bcs .27
|
||
|
||
cmp #';'
|
||
beq .69
|
||
|
||
cmp #'='
|
||
bne .99
|
||
|
||
jsr CC.GetNextCharNB skip '='
|
||
.27 bcs .99
|
||
|
||
>LDYA ZPSymType expected T/Q
|
||
jsr CC.ExpEval
|
||
bcs .9
|
||
|
||
jsr CC.SetValue Y,A = T/Q, Set value to this var
|
||
.29 bcs .9
|
||
|
||
bra .68
|
||
|
||
.21 jsr CC.fDecl
|
||
bcs .9
|
||
|
||
bra .68
|
||
*--------------------------------------
|
||
.50 >LDYA L.CC.KW
|
||
jsr CC.LookupID
|
||
bcs .6 not an internal CC keyword....
|
||
|
||
jsr CC.KW.JMP
|
||
.59 bcs .9
|
||
|
||
bra .8
|
||
*--------------------------------------
|
||
.6 jsr CC.GetVar var= or func() ?
|
||
bcs .99
|
||
|
||
>STYA ZPSymID
|
||
jsr CC.GetSymDef Get Type & qual...
|
||
bcs .9
|
||
|
||
lda ZPSymQual
|
||
bit #CC.Q.FUNC
|
||
beq .60
|
||
|
||
ldy #0 func( ... );
|
||
lda #0
|
||
jsr CC.fExecNoRetV
|
||
bcs .9
|
||
|
||
bra .8
|
||
*--------------------------------------
|
||
.60 jsr CC.GetCharNB
|
||
bcs .9
|
||
|
||
cmp #'=' TODO: all AOPS
|
||
bne .99
|
||
|
||
jsr CC.GetNextChar Skip =
|
||
bcs .99
|
||
|
||
>LDYA ZPSymType T/Q
|
||
jsr CC.ExpEval
|
||
bcs .9
|
||
|
||
jsr CC.SetValue
|
||
bcs .9
|
||
|
||
.68 jsr CC.GetCharNB
|
||
cmp #';'
|
||
.69 beq .8
|
||
|
||
.99 lda #E.CSYN
|
||
sec
|
||
.9 rts
|
||
*--------------------------------------
|
||
.8 jsr CC.GetNextCharNB Skip ;
|
||
bcs .9
|
||
|
||
cmp #C.CR
|
||
beq .80
|
||
|
||
jmp CC.Run.1
|
||
|
||
.80 clc
|
||
rts
|
||
*--------------------------------------
|
||
CC.comments jsr CC.GetNextChar
|
||
cmp #'/'
|
||
bne .90
|
||
|
||
jmp CC.SkipLine skip line.....
|
||
|
||
.90 lda #E.CSYN
|
||
sec
|
||
rts
|
||
*--------------------------------------
|
||
CC.SkipLine jsr CC.GetNextChar
|
||
bcs .9
|
||
|
||
cmp #C.CR
|
||
bne CC.SkipLine
|
||
|
||
clc
|
||
|
||
.9 rts
|
||
*--------------------------------------
|
||
CC.LookupID >STYA ZPPtr1
|
||
|
||
jsr CC.GetIDLen
|
||
bra CC.Lookup
|
||
|
||
CC.LookupOP >STYA ZPPtr1
|
||
jsr CC.GetOPLen
|
||
|
||
CC.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
|
||
cmp (ZPLineBufPtr),y
|
||
bne .4
|
||
|
||
tya
|
||
bne .2
|
||
|
||
pla Found keyword...
|
||
clc
|
||
adc ZPLineBufPtr ..advance Ptr to char after it..
|
||
sta ZPLineBufPtr
|
||
bcc .31
|
||
|
||
inc ZPLineBufPtr+1
|
||
|
||
.31 lda ZPPtr1
|
||
sec
|
||
adc (ZPPtr1)
|
||
tay
|
||
lda ZPPtr1+1
|
||
adc #0
|
||
clc Y,A = F() def, X = F() index
|
||
.8 rts
|
||
|
||
.4 inx
|
||
inx
|
||
lda (ZPPtr1)
|
||
jsr CC.ZPPtr1AddAp1
|
||
bra .1
|
||
|
||
.9 pla
|
||
sec
|
||
rts
|
||
*--------------------------------------
|
||
* int main(int argc, char *argv[]) ;
|
||
*--------------------------------------
|
||
CC.MainExec lda #0
|
||
>PUSHA
|
||
|
||
ldy #S.PS.ARGC
|
||
lda (pPS),y
|
||
|
||
>PUSHA push int ARGC
|
||
|
||
>PUSHW ZPCCConst push int ARGV
|
||
|
||
stz ArgIndex
|
||
|
||
.1 lda ArgIndex
|
||
>SYSCALL ArgV
|
||
bcs .2
|
||
|
||
inc ArgIndex
|
||
|
||
pha
|
||
tya
|
||
|
||
sta (ZPCCConst)
|
||
pla
|
||
|
||
ldy #1
|
||
sta (ZPCCConst),y
|
||
|
||
lda ZPCCConst
|
||
* clc
|
||
adc #2
|
||
sta ZPCCConst
|
||
bcc .1
|
||
|
||
inc ZPCCConst+1
|
||
bra .1
|
||
|
||
.2
|
||
|
||
|
||
clc
|
||
rts
|
||
*--------------------------------------
|
||
CC.ZPPtr1GetNextW
|
||
jsr CC.ZPPtr1NextW
|
||
*--------------------------------------
|
||
CC.ZPPtr1GetW lda (ZPPtr1)
|
||
beq .8
|
||
|
||
pha
|
||
|
||
ldy #1
|
||
lda (ZPPtr1),y
|
||
ply
|
||
|
||
.8 rts
|
||
*--------------------------------------
|
||
CC.ZPPtr1NextW jsr .1
|
||
|
||
.1 inc ZPPtr1
|
||
bne .8
|
||
|
||
inc ZPPtr1+1
|
||
|
||
.8 rts
|
||
*--------------------------------------
|
||
CC.ZPPtr1AddAp1
|
||
sec
|
||
adc ZPPtr1
|
||
sta ZPPtr1
|
||
bcc .1
|
||
|
||
inc ZPPtr1+1
|
||
.1 rts
|
||
*--------------------------------------
|
||
* Input : ZPLineBufPtr
|
||
* Output : Y,A = VarID
|
||
*--------------------------------------
|
||
CC.AddSymbol >PUSHB.G CC.hSymbols
|
||
>PUSHW ZPLineBufPtr
|
||
>SYSCALL SListNewKey
|
||
bcs .9
|
||
|
||
>STYA ZPSymID Y,A = KeyID, X = KeyLen
|
||
stx ZPPtr2
|
||
|
||
lda ZPLineBufPtr
|
||
sta ZPPtr1
|
||
* clc
|
||
adc ZPPtr2
|
||
sta ZPLineBufPtr
|
||
|
||
lda ZPLineBufPtr+1
|
||
sta ZPPtr1+1
|
||
adc #0
|
||
sta ZPLineBufPtr+1
|
||
|
||
jsr CC.GetCharNB
|
||
bcs .6
|
||
|
||
cmp #'('
|
||
bne .6
|
||
|
||
.7 lda #CC.Q.FUNC
|
||
tsb ZPSymQual
|
||
|
||
lda ZPCCfDecl
|
||
sta ZPSymDefPtr
|
||
|
||
lda ZPCCfDecl+1
|
||
sta ZPSymDefPtr+1
|
||
|
||
>LDYA ZPPtr1
|
||
jsr CC.Link
|
||
bra .8
|
||
|
||
* lda #E.FUNDEF
|
||
* sec
|
||
.9 rts
|
||
*--------------------------------------
|
||
.6 >LDYA ZPSymType
|
||
jsr CC.GetVarSize CS if pointer
|
||
stx ZPSymSizeOf
|
||
|
||
* clc / sec
|
||
|
||
lda ZPCCData
|
||
sta ZPSymDataPtr
|
||
adc ZPSymSizeOf
|
||
sta ZPCCData
|
||
|
||
lda ZPCCData+1
|
||
sta ZPSymDataPtr+1
|
||
adc ZPSymSizeOf+1
|
||
sta ZPCCData+1
|
||
|
||
>LDA.G CC.DataSize
|
||
clc
|
||
adc ZPSymSizeOf
|
||
sta (pData),y
|
||
bcs .99
|
||
|
||
lda ZPSymQual
|
||
and #CC.Q.FUNC
|
||
bne .98
|
||
|
||
.8 >PUSHB.G CC.hSymbols
|
||
>PUSHW ZPSymID
|
||
>PUSHWI ZPSymDef
|
||
>PUSHWI SYMDEFSIZE
|
||
>SYSCALL SListAddData
|
||
rts
|
||
|
||
.98 lda #E.CSYN
|
||
sec
|
||
rts
|
||
|
||
.99 lda #E.OOM
|
||
* sec
|
||
rts
|
||
*--------------------------------------
|
||
* ZPSymDataPtr = fDef
|
||
*--------------------------------------
|
||
CC.fExecNoRetV clc
|
||
.HS B0 BCS
|
||
CC.fExecRetV sec
|
||
|
||
ldx ZPPtr1
|
||
phx
|
||
ldx ZPPtr1+1 local : fdef Ptr
|
||
phx
|
||
ldx ZPPtr2 local : type
|
||
phx
|
||
ldx ZPPtr2+1 local : qual
|
||
phx
|
||
ldx ZPPtr3 local : variadic size
|
||
phx
|
||
ldx ZPPtr3+1 local : bRetV
|
||
phx
|
||
|
||
>STYA ZPPtr2 save expected Type/qual
|
||
|
||
>LDYA ZPSymDefPtr
|
||
bcc .11
|
||
|
||
>LDYA.G CC.VarDefPtr
|
||
|
||
.11 >STYA ZPPtr1
|
||
|
||
ror ZPPtr3+1 bRetV
|
||
|
||
stz ZPPtr3 Reset VARIADIC byte count
|
||
|
||
jsr CC.GetNextCharNB skip '('
|
||
bcs .10
|
||
|
||
jsr CC.ZPPtr1GetW Y,A = f() Return value T/Q
|
||
|
||
ldx ZPPtr2 expected T
|
||
beq .1 no check required
|
||
|
||
cpy ZPPtr2
|
||
bne .91
|
||
|
||
tax save full Q
|
||
|
||
and #$fC ignore CC.Q.FUNC,CC.Q.FASTCALL
|
||
cmp ZPPtr2+1
|
||
bne .91
|
||
|
||
txa
|
||
|
||
.1 >STYA ZPPtr2 save full T/Q for later
|
||
|
||
jsr CC.ZPPtr1GetNextW advance to arg list type
|
||
beq .7 end of list, go check ending ')'
|
||
*--------------------------------------
|
||
.3 cpy #CC.T.VARIADIC if VARIADIC, don't advance to next arg and assume type = 0
|
||
bne .4
|
||
|
||
ldy #0
|
||
lda #0
|
||
|
||
.4 jsr CC.ExpEval Y,A = 0 if VARIADIC
|
||
bcs .93
|
||
|
||
jsr CC.GetVarSize Y,A = Var Type/Qual
|
||
|
||
lda (ZPPtr1)
|
||
cmp #CC.T.VARIADIC
|
||
bne .50
|
||
|
||
txa X=VarSize
|
||
|
||
clc make sure pointer only 2 bytes
|
||
adc ZPPtr3
|
||
sta ZPPtr3 Add to byte count
|
||
bra .5
|
||
|
||
.50 jsr CC.ZPPtr1NextW
|
||
|
||
.5 jsr CC.GetCharNB
|
||
|
||
.10 bcs .90
|
||
|
||
cmp #','
|
||
bne .6
|
||
|
||
jsr CC.GetNextCharNB Skip ','
|
||
|
||
jsr CC.ZPPtr1GetW
|
||
bne .3 Another ARG....
|
||
|
||
bra .90 extra args....error
|
||
|
||
.6 cmp #')'
|
||
bne .90
|
||
|
||
jsr CC.ZPPtr1GetW
|
||
beq .8 no more arg after ')', exit
|
||
|
||
cpy #CC.T.VARIADIC
|
||
bne .90 missing arg
|
||
|
||
lda ZPPtr3 push VARIADIC byte count
|
||
|
||
jsr CODE.PUSHI
|
||
|
||
.7 jsr CC.GetCharNB
|
||
bcs .90
|
||
|
||
cmp #')'
|
||
bne .90
|
||
|
||
.8 jsr CC.GetNextCharNB Skip )
|
||
|
||
jsr CC.fExec2 X = LASTVAR sizeof (fastcall)
|
||
bra .93
|
||
|
||
.90 lda #E.CSYN
|
||
bra .92
|
||
|
||
.91 lda #E.TMISMATCH
|
||
|
||
.92 sec
|
||
|
||
.93 plx
|
||
stx ZPPtr3+1
|
||
plx
|
||
stx ZPPtr3
|
||
|
||
plx
|
||
stx ZPPtr2+1
|
||
plx
|
||
stx ZPPtr2
|
||
|
||
plx
|
||
stx ZPPtr1+1
|
||
plx
|
||
stx ZPPtr1
|
||
|
||
.99 rts
|
||
*--------------------------------------
|
||
* X = last var size
|
||
*--------------------------------------
|
||
CC.fExec2
|
||
* >LDYA ZPPtr2 function T/Q
|
||
* jsr CC.GetVarSize
|
||
* stx ZPPtr1 last var size
|
||
|
||
bit ZPPtr3+1 bRetV
|
||
bmi .5
|
||
|
||
* NO Return Value : call & discard stack if not in Y,A
|
||
|
||
lda ZPPtr2+1
|
||
bit #CC.Q.FASTCALL
|
||
beq .1
|
||
|
||
* ldx ZPPtr1 var size
|
||
dex
|
||
bne .19
|
||
|
||
jsr CODE.PULLA
|
||
bra .1
|
||
|
||
.19 jsr CODE.PULLYA
|
||
|
||
.1 lda ZPSymDataPtr+1
|
||
beq .9
|
||
|
||
ldy ZPSymDataPtr
|
||
>STYA ZPPtr3
|
||
|
||
jsr CC.fExec3
|
||
|
||
>LDYA ZPPtr2 function T/Q
|
||
jsr CC.GetVarSize
|
||
txa
|
||
beq .11 void
|
||
|
||
cpx #3 A or Y,A
|
||
bcc .11
|
||
|
||
.10 jsr CODE.INCPSTACK
|
||
dex
|
||
bne .10
|
||
|
||
.11 clc
|
||
rts
|
||
|
||
.9 lda #E.FUNDEF
|
||
sec
|
||
rts
|
||
|
||
* Return Value : call & put result on stack if in Y,A
|
||
|
||
.5 lda ZPPtr2+1
|
||
bit #CC.Q.FASTCALL
|
||
beq .6
|
||
|
||
* ldx ZPPtr1
|
||
dex
|
||
bne .64
|
||
|
||
jsr CODE.PULLA
|
||
bra .6
|
||
|
||
.64 jsr CODE.PULLYA
|
||
|
||
.6 >LDA.G CC.VarDataPtr+1
|
||
beq .9
|
||
|
||
sta ZPPtr3+1
|
||
dey
|
||
lda (pData),y
|
||
sta ZPPtr3
|
||
|
||
jsr CC.fExec3
|
||
|
||
>LDYA ZPPtr2 function T/Q
|
||
jsr CC.GetVarSize
|
||
cpx #3
|
||
bcs .8 leave on stack
|
||
|
||
dex
|
||
bne .60
|
||
|
||
jsr CODE.PUSHA push ONE byte one stack
|
||
bra .8
|
||
|
||
.60 jsr CODE.PUSHYA push TWO bytes one stack
|
||
|
||
.8 >LDYA ZPPtr2 T/Q
|
||
and #$FC ignore CC.Q.FUNC+CC.Q.FASTCALL
|
||
clc
|
||
rts
|
||
*--------------------------------------
|
||
CC.fExec3 lda (ZPPtr3)
|
||
bne .1
|
||
|
||
ldy #1
|
||
lda (ZPPtr3),y
|
||
tax
|
||
|
||
* cpx #SYS.FClose
|
||
* bne .57
|
||
* >DEBUG
|
||
* ldy #0
|
||
*.56 lda PCC.DEBUG,y
|
||
* jsr CODE.EmitByte
|
||
* iny
|
||
* cpy #PCC.DEBUG.L
|
||
* bne .56
|
||
*.57
|
||
jsr CODE.SYSCALL
|
||
rts
|
||
|
||
.1 ldy #1
|
||
lda (ZPPtr3),y
|
||
tax
|
||
jsr CODE.FPUCALL
|
||
|
||
rts
|
||
*--------------------------------------
|
||
CC.fDecl >ENTER 2
|
||
|
||
lda #0
|
||
sta (pStack) hLocal
|
||
|
||
lda ZPSymType
|
||
jsr CC.fDeclAddA
|
||
lda ZPSymQual
|
||
jsr CC.fDeclAddA
|
||
|
||
jsr CC.GetNextCharNB Skip (
|
||
bcs .9
|
||
|
||
.1 cmp #')'
|
||
beq .6
|
||
|
||
.2 jsr CC.fDeclGetArg
|
||
bcs .99
|
||
|
||
pha
|
||
|
||
tya
|
||
jsr CC.fDeclAddA
|
||
|
||
pla
|
||
jsr CC.fDeclAddA
|
||
|
||
jsr CC.GetCharNB
|
||
bcs .9
|
||
|
||
jsr CC.IsLetter
|
||
bcs .5
|
||
|
||
* TODO: AddLocal
|
||
|
||
.3 jsr CC.GetNextCharNB
|
||
bcs .9
|
||
|
||
jsr CC.IsLetterOrDigit
|
||
bcc .3
|
||
|
||
|
||
|
||
.5 cmp #')'
|
||
beq .6
|
||
|
||
cmp #','
|
||
bne .9
|
||
|
||
jsr CC.GetNextCharNB Skip ,
|
||
bcs .9
|
||
|
||
bra .2
|
||
|
||
.6 jsr CC.GetNextCharNB Skip )
|
||
bcs .9
|
||
|
||
cmp #';'
|
||
beq .7
|
||
|
||
|
||
* TODO: f() body
|
||
|
||
bra .9
|
||
*--------------------------------------
|
||
.7
|
||
|
||
.8 lda #0
|
||
jsr CC.fDeclAddA
|
||
|
||
>LDYA ZPSymType T/Q
|
||
clc
|
||
bra .99
|
||
|
||
.9 lda #E.CSYN
|
||
sec
|
||
|
||
.99 >LEAVE
|
||
rts
|
||
*--------------------------------------
|
||
CC.fDeclGetArg lda (ZPLineBufPtr)
|
||
cmp #'.'
|
||
bne .5
|
||
|
||
ldx #2
|
||
|
||
.1 jsr CC.GetNextChar
|
||
bcs .9
|
||
|
||
cmp #'.'
|
||
bne .9
|
||
|
||
dex
|
||
bne .1
|
||
|
||
jsr CC.GetNextCharNB
|
||
bcs .9
|
||
|
||
eor #')'
|
||
bne .9
|
||
|
||
ldy #CC.T.VARIADIC Type
|
||
* lda #0 Qual
|
||
* clc
|
||
rts
|
||
|
||
.5 >LDYA L.CC.TMODS
|
||
jsr CC.LookupID
|
||
bcs .9
|
||
|
||
jsr CC.tDecl
|
||
bcs .9
|
||
|
||
* Y,A = Type/Qual
|
||
|
||
bra .8
|
||
|
||
.9 lda #E.CSYN
|
||
sec
|
||
|
||
.8 rts
|
||
*--------------------------------------
|
||
CC.fDeclAddA sta (ZPCCfDecl)
|
||
inc ZPCCfDecl
|
||
bne .8
|
||
|
||
inc ZPCCfDecl+1
|
||
|
||
.8 rts
|
||
*--------------------------------------
|
||
CC.Link >STYA ZPPtr2
|
||
|
||
>LDYA L.CC.LIBC
|
||
>STYA ZPPtr1
|
||
|
||
stz ZPSymDataPtr
|
||
stz ZPSymDataPtr+1
|
||
|
||
ldy #0
|
||
|
||
.11 iny
|
||
lda (ZPPtr2),y
|
||
beq .12
|
||
|
||
jsr CC.IsLetterOrDigit
|
||
bcc .11
|
||
|
||
.12 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
|
||
|
||
dey
|
||
cmp (ZPPtr2),y
|
||
bne .4
|
||
|
||
tya
|
||
bne .2
|
||
|
||
pla Found keyword...
|
||
|
||
lda (ZPPtr1)
|
||
jsr CC.ZPPtr1AddAp1 Skip LEN\Symbol
|
||
|
||
>LDYA ZPPtr1
|
||
iny
|
||
bne .5
|
||
|
||
inc Skip LEN
|
||
|
||
.5 >STYA ZPSymDataPtr
|
||
|
||
clc
|
||
rts
|
||
|
||
.4 inx
|
||
inx
|
||
lda (ZPPtr1)
|
||
jsr CC.ZPPtr1AddAp1 Skip LEN\Symbol
|
||
lda (ZPPtr1)
|
||
jsr CC.ZPPtr1AddAp1 Skip LEN\definition
|
||
bra .1
|
||
|
||
.9 pla
|
||
sec
|
||
rts
|
||
*--------------------------------------
|
||
CC.tDecl >ENTER 2
|
||
lda #0
|
||
sta (pStack) Type
|
||
ldy #1
|
||
sta (pStack),y Qual
|
||
|
||
jsr .7
|
||
bcs .99
|
||
|
||
ldy #1
|
||
lda (pStack),y
|
||
pha
|
||
lda (pStack)
|
||
tay Y = Type
|
||
pla A = Qual
|
||
|
||
clc
|
||
|
||
.99 >LEAVE
|
||
rts
|
||
|
||
.7 jmp (J.CC.TMODS,x)
|
||
*--------------------------------------
|
||
CC.NewKey >PUSHA
|
||
>PUSHW ZPLineBufPtr
|
||
>SYSCALL SListNewKey
|
||
bcs .9
|
||
|
||
pha
|
||
|
||
txa
|
||
* clc
|
||
adc ZPLineBufPtr
|
||
sta ZPLineBufPtr
|
||
bcc .8
|
||
|
||
inc ZPLineBufPtr+1
|
||
clc
|
||
|
||
.8 pla Y,A = KeyID, X = KeyLen
|
||
|
||
.9 rts
|
||
*--------------------------------------
|
||
* Y,A = Type/Qual
|
||
*--------------------------------------
|
||
CC.SetValue cpy ZPSymType
|
||
bne .99
|
||
|
||
cmp ZPSymQual
|
||
bne .99
|
||
|
||
ldx ZPSymSizeOf
|
||
>LDYA ZPSymDataPtr
|
||
jsr CODE.PopXToYA
|
||
|
||
clc
|
||
rts
|
||
|
||
.99 lda #E.TMISMATCH
|
||
sec
|
||
rts
|
||
*--------------------------------------
|
||
CC.GetDefine >PUSHB.G CC.hDefines
|
||
|
||
jsr CC.Get
|
||
bcs .9
|
||
|
||
pha
|
||
phy
|
||
>PUSHB.G CC.hDefines
|
||
ply
|
||
pla
|
||
>PUSHYA KeyID
|
||
|
||
>PUSHWZ Allocate..
|
||
>PUSHWZ len = 0 (string mode)
|
||
>PUSHWZ From Start
|
||
>SYSCALL SListGetData
|
||
bcs .9
|
||
|
||
stx hDefine
|
||
|
||
>LDYA ZPLineBufPtr
|
||
>STYA.G CC.SaveDefine
|
||
|
||
txa
|
||
>SYSCALL GetMemPtr
|
||
>STYA ZPLineBufPtr
|
||
|
||
.9 rts
|
||
*--------------------------------------
|
||
CC.GetVar >PUSHB.G CC.hSymbols
|
||
|
||
CC.Get >PUSHW ZPLineBufPtr
|
||
>SYSCALL SListLookup
|
||
bcs .9
|
||
|
||
pha
|
||
|
||
txa
|
||
* clc
|
||
adc ZPLineBufPtr
|
||
sta ZPLineBufPtr
|
||
bcc .1
|
||
|
||
inc ZPLineBufPtr+1
|
||
clc
|
||
|
||
.1 pla Y,A = VarID
|
||
|
||
.9 rts
|
||
*--------------------------------------
|
||
CC.GetSymDef phy
|
||
pha
|
||
>PUSHB.G CC.hSymbols
|
||
|
||
pla
|
||
>PUSHA
|
||
pla
|
||
>PUSHA KeyID
|
||
|
||
>PUSHWI ZPSymDef
|
||
>PUSHWI 8 8 bytes
|
||
>PUSHWZ From Start
|
||
>SYSCALL SListGetData
|
||
rts
|
||
*--------------------------------------
|
||
* Stack
|
||
*--------------------------------------
|
||
CC.CheckStack ldy StackPtr
|
||
beq .9
|
||
|
||
cmp (ZPCCStack),y
|
||
bne .9
|
||
|
||
clc
|
||
rts
|
||
|
||
.9 lda #E.CSYN
|
||
sec
|
||
rts
|
||
*--------------------------------------
|
||
CC.PushCS lda ZPCCCode+1
|
||
jsr CC.Push
|
||
bcs CC.Push.RTS
|
||
|
||
lda ZPCCCode
|
||
*--------------------------------------
|
||
CC.Push ldy StackPtr
|
||
dey
|
||
beq .9
|
||
|
||
sty StackPtr
|
||
|
||
sta (ZPCCStack),y
|
||
clc
|
||
rts
|
||
|
||
.9 lda #E.STKOVERFLOW
|
||
sec
|
||
CC.Push.RTS rts
|
||
*--------------------------------------
|
||
CC.Pop ldy StackPtr
|
||
beq .9
|
||
|
||
lda (ZPCCStack),y
|
||
|
||
inc StackPtr
|
||
|
||
clc
|
||
rts
|
||
|
||
.9 lda #E.STACKERROR
|
||
sec
|
||
rts
|
||
*--------------------------------------
|
||
* CHAR related Subs.....
|
||
*--------------------------------------
|
||
CC.GetOPLen ldy #0
|
||
|
||
.1 iny
|
||
lda (ZPLineBufPtr),y
|
||
beq .8
|
||
|
||
jsr CC.IsOPChar
|
||
bcc .1
|
||
|
||
.8 tya
|
||
rts
|
||
*--------------------------------------
|
||
CC.GetIDLen ldy #0
|
||
|
||
.1 iny
|
||
lda (ZPLineBufPtr),y
|
||
beq .8
|
||
|
||
jsr CC.IsLetterOrDigit
|
||
bcc .1
|
||
|
||
.8 tya
|
||
rts
|
||
*--------------------------------------
|
||
CC.GetCharNB jsr CC.GetChar
|
||
bcs CC.GetNextCharNB.RTS
|
||
|
||
jsr CC.CheckCharNB
|
||
bcc CC.GetNextCharNB.RTS
|
||
*--------------------------------------
|
||
CC.GetNextCharNB
|
||
jsr CC.GetNextChar
|
||
bcs CC.GetNextCharNB.RTS
|
||
|
||
jsr CC.CheckCharNB
|
||
bcs CC.GetNextCharNB
|
||
|
||
CC.GetNextCharNB.RTS
|
||
rts
|
||
*--------------------------------------
|
||
CC.CheckSpace jsr CC.GetChar
|
||
bcs .90
|
||
|
||
cmp #C.SPACE
|
||
bne .90
|
||
|
||
jsr CC.GetNextCharNB
|
||
bcc .99
|
||
|
||
.90 lda #E.CSYN
|
||
sec
|
||
.99 rts
|
||
*--------------------------------------
|
||
CC.CheckCharNB cmp #C.SPACE
|
||
beq .9
|
||
|
||
cmp #C.TAB
|
||
beq .9
|
||
|
||
clc
|
||
.9 rts
|
||
*--------------------------------------
|
||
CC.GetNextChar inc ZPLineBufPtr
|
||
bne CC.GetChar
|
||
|
||
inc ZPLineBufPtr+1
|
||
*--------------------------------------
|
||
CC.GetChar lda (ZPLineBufPtr)
|
||
bne .8
|
||
|
||
lda hDefine
|
||
beq .1
|
||
|
||
stz hDefine
|
||
|
||
phx
|
||
phy
|
||
>SYSCALL FreeMem
|
||
|
||
>LDYA.G CC.SaveDefine
|
||
>STYA ZPLineBufPtr
|
||
|
||
ply
|
||
plx
|
||
bra CC.GetChar
|
||
|
||
.1 lda #C.CR
|
||
|
||
.8 clc
|
||
rts
|
||
|
||
.9 lda #MLI.E.EOF
|
||
sec
|
||
.99 rts
|
||
*---------------------------------------
|
||
CC.IsEndArg
|
||
*---------------------------------------
|
||
CC.IsOPChar ldx #CC.OPChars.Cnt-1
|
||
|
||
.1 cmp CC.OPChars,x
|
||
beq .8
|
||
|
||
dex
|
||
bpl .1
|
||
|
||
sec
|
||
rts
|
||
|
||
.8 clc
|
||
rts
|
||
*---------------------------------------
|
||
CC.IsLetterOrDigit
|
||
jsr CC.IsDigit10
|
||
bcc CC.IsLetterRTS
|
||
*---------------------------------------
|
||
CC.IsLetter cmp #'_'
|
||
bne .1
|
||
|
||
clc
|
||
rts
|
||
|
||
.1 cmp #'A'
|
||
bcc .9
|
||
|
||
cmp #'Z'+1
|
||
bcc CC.IsLetterRTS
|
||
|
||
cmp #'a'
|
||
bcc .9
|
||
|
||
cmp #'z'+1
|
||
|
||
rts CC if lowercase
|
||
|
||
.9 sec
|
||
CC.IsLetterRTS rts
|
||
*---------------------------------------
|
||
CC.IsDigit10 cmp #'0'
|
||
bcc .9
|
||
|
||
cmp #'9'+1
|
||
rts cc if ok, cs if not
|
||
|
||
.9 sec
|
||
rts
|
||
*--------------------------------------
|
||
* in : Y,A = type/qual
|
||
* out : X = size
|
||
*--------------------------------------
|
||
CC.GetVarSize and #CC.Q.PPPOINTER
|
||
bne .2
|
||
|
||
ldx CC.TYPESIZE-1,y
|
||
|
||
clc
|
||
rts
|
||
|
||
.2 ldx #2 pointer
|
||
sec +1 for hMem Storage
|
||
rts
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE usr/src/bin/cc.s.core
|
||
LOAD usr/src/bin/cc.s
|
||
ASM
|