mirror of
https://github.com/mgcaret/of816.git
synced 2025-01-03 19:30:36 +00:00
159 lines
3.8 KiB
ArmAsm
159 lines
3.8 KiB
ArmAsm
|
; Compiler helpers & primitives
|
||
|
|
||
|
; Compile a byte to the dictionary
|
||
|
; preserves registers
|
||
|
.proc _cbytea
|
||
|
phy
|
||
|
ldy #$0000
|
||
|
sep #SHORT_A
|
||
|
sta [DHERE],y
|
||
|
rep #SHORT_A
|
||
|
inc DHERE
|
||
|
bne :+
|
||
|
inc DHERE+2
|
||
|
: ply
|
||
|
rts
|
||
|
.endproc
|
||
|
|
||
|
; Compile a 16-bit word
|
||
|
.proc _cworda
|
||
|
jsr _cbytea
|
||
|
xba
|
||
|
jsr _cbytea
|
||
|
xba
|
||
|
rts
|
||
|
.endproc
|
||
|
|
||
|
; Compile a 32-bit cell
|
||
|
.proc _ccellay
|
||
|
pha
|
||
|
tya
|
||
|
jsr _cworda
|
||
|
pla
|
||
|
jsr _cworda
|
||
|
rts
|
||
|
.endproc
|
||
|
|
||
|
; Make a word link in the dictionary, stores a link to the previous word into the
|
||
|
; dictionary, and sets LAST to this link
|
||
|
.proc _w_link
|
||
|
ldy #SV_CURRENT+2
|
||
|
lda [SYSVARS],y ; get CURRENT (compiler) wordlist address
|
||
|
sta YR+2
|
||
|
dey
|
||
|
dey
|
||
|
lda [SYSVARS],y
|
||
|
sta YR
|
||
|
ldy #$0002
|
||
|
lda [YR],y ; get LAST entry for the compiler word list
|
||
|
pha ; save on stack
|
||
|
dey
|
||
|
dey
|
||
|
lda [YR],y
|
||
|
pha
|
||
|
lda DHERE ; get HERE
|
||
|
sta [YR],y ; and put into CURRENT wordlist
|
||
|
iny
|
||
|
iny
|
||
|
lda DHERE+2
|
||
|
sta [YR],y
|
||
|
ply ; get the old LAST for the compiler word list
|
||
|
pla
|
||
|
jsr _ccellay ; and compile the link
|
||
|
rts
|
||
|
.endproc
|
||
|
|
||
|
; make a dictionary entry, return with flags/XT address in AY
|
||
|
.proc _mkentry
|
||
|
jsr _2parm
|
||
|
jsr _popxr ; name length
|
||
|
jsr _popwr ; name address
|
||
|
lda XR
|
||
|
cmp #NAMEMSK
|
||
|
bcs badword
|
||
|
clc ; see if we are in danger of putting the new
|
||
|
adc DHERE ; word's first several bytes across a bank boundary
|
||
|
bcs nextbank ; yes we it will
|
||
|
clc
|
||
|
adc #(4+1+1+4) ; (link size + name len byte + flag byte + jsl )
|
||
|
bcc :+ ; it won't, just go make the entry
|
||
|
nextbank: stz DHERE ; move dictionary pointer to next bank
|
||
|
inc DHERE+2
|
||
|
: jsr _w_link ; make link, sets LAST to HERE
|
||
|
lda XR
|
||
|
ora #$80
|
||
|
jsr _cbytea ; compile name length
|
||
|
ldy #$0000
|
||
|
: cpy XR
|
||
|
bcs done
|
||
|
lda [WR],y
|
||
|
and #$7F ; normalize
|
||
|
jsr _cupper ; and convert to upper case
|
||
|
jsr _cbytea
|
||
|
iny
|
||
|
bne :-
|
||
|
done: lda DHERE+2
|
||
|
ldy DHERE
|
||
|
pha
|
||
|
phy
|
||
|
lda #$00
|
||
|
jsr _cbytea ; default flags
|
||
|
ply
|
||
|
pla
|
||
|
rts
|
||
|
badword: ldy #<-19
|
||
|
lda #>-19
|
||
|
jmp _throway
|
||
|
.endproc
|
||
|
|
||
|
.proc _lmkentry
|
||
|
jsr _mkentry
|
||
|
rtl
|
||
|
.endproc
|
||
|
|
||
|
.if 0
|
||
|
; Compile data pointed at [WR], length in XR to dictionary
|
||
|
.proc _cdata
|
||
|
ldy #.loword(func)
|
||
|
lda #.hiword(func)
|
||
|
jmp _str_op_ay
|
||
|
func: jsr _cbytea
|
||
|
clc
|
||
|
rts
|
||
|
.endproc
|
||
|
|
||
|
; Compile (c-addr u) at top of stack into dictionary
|
||
|
.proc _csdata
|
||
|
ldy #.loword(_cdata::func)
|
||
|
lda #.hiword(_cdata::func)
|
||
|
jmp _str_op_ays
|
||
|
.endproc
|
||
|
.endif
|
||
|
|
||
|
; Compile a JSL to the dictionary
|
||
|
; with target in AY
|
||
|
.proc _cjsl
|
||
|
pha
|
||
|
phy
|
||
|
lda #opJSL
|
||
|
doit: jsr _cbytea
|
||
|
pla
|
||
|
jsr _cworda
|
||
|
pla
|
||
|
jsr _cbytea
|
||
|
rts
|
||
|
.endproc
|
||
|
|
||
|
; Compile a JSL to the dictionary
|
||
|
; with target in AY
|
||
|
.proc _cjml
|
||
|
pha
|
||
|
phy
|
||
|
lda #opJML
|
||
|
bra _cjsl::doit
|
||
|
.endproc
|
||
|
|
||
|
|
||
|
|
||
|
|