A2osX/BIN/CC.S.CORE.txt
2022-01-30 22:47:08 +01:00

766 lines
12 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
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
sty ScopePtr
>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 256
>SYSCALL GetMem
bcs .9
>STYA ZPCCStack
txa
>STA.G CC.hStack
* clc
.9 rts
*--------------------------------------
CC.Quit ldy ScopePtr
beq .1
.10 lda (pData),y
>SYSCALL SListFree
ldy ScopePtr
cpy #CC.hSymbols
beq .1
dec ScopePtr
dey
bra .10
.1 >LDA.G CC.hTags
beq .2
>SYSCALL SListFree
.2 >LDA.G CC.hDefines
beq .4
>SYSCALL SListFree
.4 lda hDefineBuf
jsr .7
.5 jsr CS.RUN.FClose
bne .5
lda hSymBuf
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.CompileFile >SLEEP
ldy #S.PS.hStdIn
lda (pPS),y
>SYSCALL FEOF
bcs .9
tay
bne .1
>SYSCALL GetChar
bcs .9 I/O err
cmp #3 Ctrl-C
beq .9
.1 jsr CS.RUN.FGetS
bcs .9
jsr CC.CompileLine
bcs .9
>LDA.G bDebug
bpl CC.CompileFile
jsr PrintDebugMsg
bra CC.CompileFile
.9 rts
*--------------------------------------
CC.CompileLine jsr CC.GetCharNB
bcs CC.Quit.RTS
CC.CompileLine.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 CPStmt ?
bne .10
jsr CC.GetNextCharNB Skip '}'
jmp CC.STMT.CPStmt.END
*--------------------------------------
.10 jsr CC.IsLetter
bcc .20
* TODO: PREOPS ++ --.....
bcs .29
*--------------------------------------
.20 >LDYA L.CC.TYPEQUAL
jsr CC.LookupID
bcs .50
jsr CC.TYPE.Decl
bcs .59
ldx #SYM.SC.STATIC Y,A = Type/Qual
bit ScopenCnt
bpl .25
bit #SYM.Q.FUNC someone wants to add a local f() ?
sec
bne .29
ldx #SYM.SC.AUTO
.25 jsr CC.SYM.New Y,A=T/Q, add with undef value...
bcs .29 OOM or DUP
jsr CC.GetCharNB
bcs .69
cmp #';'
beq .28
cmp #'{'
bne .26
jsr CC.GetNextCharNB skip '{'
bcs .69
jsr CC.SYM.Store
bcs .29
jmp CC.SYM.FreeBuf
*--------------------------------------
* TODO: AOPS
*--------------------------------------
.26 cmp #'='
sec
bne .69
*--------------------------------------
jsr CC.GetNextCharNB skip '='
bcs .69
jsr CC.SYM.GetTypeInYA expected T/Q
jsr CC.EXP.Eval
bcs .59
jsr CC.SYM.PopValue Y,A = T/Q, Set value to this var
.29 bcs .9
.28 jsr CC.SYM.Store
bcs .9
jsr CC.SYM.FreeBuf
bra .68
*--------------------------------------
.21 jsr CC.GetCharNB
bcs .99
cmp #';'
beq .8
cmp #'{'
bne .99
jsr CC.GetNextCharNB skip '{'
bcs .99
jmp CC.CompileLine.1
*--------------------------------------
.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.SYM.Lookup var= or func() ?
.69 bcs .99
ldy #SYM.Q
lda (ZPSymBufPtr),y
bit #SYM.Q.FUNC
beq .60
ldy #0 func( ... );
lda #0
jsr CC.F.CallNoRetV
bcs .9
jsr CC.SYM.FreeBufPop
bra .8
*--------------------------------------
.60 jsr CC.GetCharNB var = ?
bcs .99
cmp #'=' TODO: all AOPS
bne .99
jsr CC.GetNextChar Skip =
bcs .99
jsr CC.SYM.GetTypeInYA
jsr CC.EXP.Eval
bcs .9
jsr CC.SYM.PopValue
bcs .9
jsr CC.SYM.FreeBufPop
*--------------------------------------
.68 jsr CC.GetCharNB
cmp #';'
beq .8
.99 lda #E.CSYN
sec
.9 rts
*--------------------------------------
.8 jsr CC.GetNextCharNB Skip ;
bcs .9
cmp #C.CR
beq .80
jmp CC.CompileLine.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 ZPLookupPtr
jsr CC.GetIDLen
bra CC.Lookup
CC.LookupOP >STYA ZPLookupPtr
jsr CC.GetOPLen
CC.Lookup phy Y = len
ldx #0
.1 lda (ZPLookupPtr)
beq .9 Ending 0, not found....
pla
pha Get Back Len
cmp (ZPLookupPtr) Same Len ?
bne .4
tay
.2 lda (ZPLookupPtr),y
.3 dey
cmp (ZPLineBufPtr),y
bne .4
tya
bne .2
pla Found keyword...
jsr CC.SkipA ..advance Ptr to char after it..
lda ZPLookupPtr
sec
adc (ZPLookupPtr)
tay
lda ZPLookupPtr+1
adc #0
clc Y,A = F() def, X = F() index
.8 rts
.4 inx
inx
lda (ZPLookupPtr)
jsr CC.ZPLookupPtrAddAp1
bra .1
.9 pla
sec
rts
*--------------------------------------
CC.SListLookup >PUSHA hSList
>PUSHA ...for SListGetData
>PUSHW ZPLineBufPtr
>SYSCALL SListLookup
bcs .99
pha save KeyID
phy
>PUSHA KeyID.HI
tya
>PUSHA KeyID.LO
jsr CC.SkipX
.1 >PUSHWZ allocate
>PUSHWI 65535 all
>PUSHWZ From Start
>SYSCALL SListGetData
bcs .9
ply
pla X = hSymScope, Y,A = SymID
* clc
rts
.9 plx
plx
rts
.99 inc pStack
rts
*--------------------------------------
* int main(int argc, char *argv[]) ;
*--------------------------------------
CC.MainExec lda #$EEEE
>PUSHA
>PUSHA int ret value
lda #0
>PUSHA
ldy #S.PS.ARGC
lda (pPS),y
>PUSHA push int ARGC (int)
>PUSHW ZPCCConst push int ARGV *char[]
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 >PUSHB.G CC.hSymbols
>PUSHW L.CC.MAIN
>SYSCALL SListLookup
bcs .9
phy
pha
>PUSHB.G CC.hSymbols
pla
>PUSHA
pla
>PUSHA KeyID
>PUSHWZ allocate
>PUSHWI 65535 all
>PUSHWZ From Start
>SYSCALL SListGetData
bcs .9
stx hSymBuf
txa
>SYSCALL GetMemPtr
>STYA ZPSymBufPtr
ldy #SYM.Addr
lda (ZPSymBufPtr),y
sta ZPCCCode
iny
lda (ZPSymBufPtr),y
sta ZPCCCode+1
jsr .7
clc
.9 rts
.7 jmp (ZPCCCode)
*--------------------------------------
CC.ZPLookupPtrAddAp1
sec
adc ZPLookupPtr
sta ZPLookupPtr
bcc .1
inc ZPLookupPtr+1
.1 rts
*--------------------------------------
CC.GetDefine >LDA.G CC.hDefines
jsr CC.SListLookup
bcs .9
stx hDefineBuf
>LDYA ZPLineBufPtr
>STYA.G CC.SaveDefine
txa
>SYSCALL GetMemPtr
>STYA ZPLineBufPtr
.9 rts
*--------------------------------------
* CT Stack
*--------------------------------------
CC.PushTQ ldy #SYM.Q
lda (ZPSymBufPtr),y
jsr CC.Push
bcs CC.Push.RTS
lda (ZPSymBufPtr) SYM.T
bra CC.Push
*--------------------------------------
CC.PushCS lda ZPCCCode+1
jsr CC.Push
bcs CC.Push.RTS
lda ZPCCCode
*--------------------------------------
CC.Push ldy CStackPtr
dey
beq .9
sty CStackPtr
sta (ZPCCStack),y
clc
rts
.9 lda #E.STKOVERFLOW
sec
CC.Push.RTS rts
*--------------------------------------
CC.PopYA ldy CStackPtr
beq .9
lda (ZPCCStack),y
pha
iny
beq .90
lda (ZPCCStack),y
iny
sty CStackPtr
ply
clc
rts
.90 pla
.9 lda #E.STACKERROR
sec
rts
*--------------------------------------
CC.Pop ldy CStackPtr
beq .9
lda (ZPCCStack),y
inc CStackPtr
clc
rts
.9 lda #E.STACKERROR
sec
rts
*--------------------------------------
* ZPLineBufPtr related Subs.....
*--------------------------------------
CC.SkipX txa
CC.SkipA clc
adc ZPLineBufPtr
sta ZPLineBufPtr
bcc .8
inc ZPLineBufPtr+1
.8 rts
*--------------------------------------
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 hDefineBuf
beq .1
stz hDefineBuf
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 cmp #']'
beq .8
cmp #';'
beq .8
cmp #','
beq .8
cmp #')'
beq .8
sec
rts
.8 clc
rts
*---------------------------------------
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
*--------------------------------------
MAN
SAVE usr/src/bin/cc.s.core
LOAD usr/src/bin/cc.s
ASM