1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2024-10-18 22:24:28 +00:00

Speed up modload, fix oops on FIXUP_IP

This commit is contained in:
David Schmenk 2018-01-20 09:15:26 -08:00
parent f24bb421ec
commit 82516bfe31
3 changed files with 119 additions and 47 deletions

View File

@ -686,6 +686,94 @@ asm lookuptbl(dci, tbl)#1
+ INC DSTH + INC DSTH
BNE --- BNE ---
end end
// def lookupidx(esd, index)
// word sym
// while ^esd
// sym = esd
// esd = sym + dcitos(sym, @str)
// if esd->0 & $10 and esd->1 == index
// return sym
// fin
// esd = esd + 3
// loop
//end
asm lookupidx(esd, index)#1
LDA ESTKL,X
STA TMPL
INX
--- LDA ESTKH,X
STA SRCH
LDA ESTKL,X
-- STA SRCL
LDY #$00
- LDA (SRC),Y
BPL +
INY
BNE -
+ BEQ ++ ; END OF ESD
INY
LDA (SRC),Y
INY
AND #$10 ; EXTERN FLAG?
BEQ +
LDA (SRC),Y
CMP TMPL
BEQ +++ ; MATCH
+ INY
TYA
SEC
ADC SRCL
STA ESTKL,X ; SYM PTRL
BCC --
INC ESTKH,X ; SYM PTRH
BNE ---
++ STA ESTKL,X ; END OF ESD
STA ESTKH,X
+++ RTS
end
//def lookupdef(addr, deftbl)#1
// while deftbl->0 == $20
// if deftbl=>3 == addr
// return deftbl
// fin
// deftbl = deftbl + 5
// loop
// return 0
//end
asm lookupdef(addr, deftbl)#1
LDA ESTKH,X
STA SRCH
LDA ESTKL,X
STA SRCL
INX
- LDY #$00
LDA (SRC),Y
CMP #$20 ; JSR OPCODE?
BNE ++
LDY #$03
LDA (SRC),Y
CMP ESTKL,X
BNE +
INY
LDA (SRC),Y
CMP ESTKH,X
BNE +
LDA SRCL ; MATCH
STA ESTKL,X
LDA SRCH
STA ESTKH,X
RTS
+ LDA #$05
CLC
ADC SRCL
STA SRCL
BCC -
INC SRCH
BNE -
++ STY ESTKL,X
STY ESTKH,X
RTS
end
// //
// Cheap and dirty print integer // Cheap and dirty print integer
// //
@ -857,44 +945,28 @@ end
def lookupextern(esd, index)#1 def lookupextern(esd, index)#1
word sym, addr word sym, addr
byte str[16] byte str[16]
while ^esd sym = lookupidx(esd, index)
sym = esd if sym
esd = sym + dcitos(sym, @str) addr = lookuptbl(sym, symtbl)
if esd->0 & $10 and esd->1 == index if !addr
addr = lookuptbl(sym, symtbl) perr = $81
if !addr dcitos(sym, @str)
perr = $81 cout('?'); prstr(@str); crout
cout('?'); prstr(@str); crout
fin
return addr
fin fin
esd = esd + 3 return addr
loop fin
return 0 return 0
end end
def adddef(bank, addr, deflast)#1 def adddef(bank, addr, deflast)#1
word defentry word defentry
defentry = *deflast defentry = *deflast
*deflast = defentry + 5 *deflast = defentry + 5
if bank
defentry=>1 = $03DC // JSR $03DC (AUX MEM INTERP)
else
defentry=>1 = $03D6 // JSR $03D6 (MAIN MEM INTERP)
fin
defentry->0 = $20 defentry->0 = $20
defentry=>1 = bank ?? $03DC :: $03D6 // JSR $03DC (AUX MEM INTERP) or $03D6 (MAIN MEM INTERP)
defentry=>3 = addr defentry=>3 = addr
defentry->5 = 0 // NULL out next entry defentry->5 = 0 // NULL out next entry
return defentry return defentry
end end
def lookupdef(addr, deftbl)#1
while deftbl->0 == $20
if deftbl=>3 == addr
return deftbl
fin
deftbl = deftbl + 5
loop
return 0
end
def loadmod(mod)#1 def loadmod(mod)#1
word rdlen, modsize, bytecode, codefix, defofst, defcnt, init, fixup word rdlen, modsize, bytecode, codefix, defofst, defcnt, init, fixup
word addr, defaddr, modaddr, modfix, modofst, modend word addr, defaddr, modaddr, modfix, modofst, modend

View File

@ -65,18 +65,24 @@ INTERP = $03D0
;+ ;+
; } ; }
!MACRO FIX_IP { !MACRO FIX_IP {
INC IPH
TYA TYA
AND #$7F CLC
TAY ADC IPL
STA IPL
BCC +
INC IPH
+ LDY #$00
} }
!MACRO FIXJMP_IP .TARGET { !MACRO FIXJMP_IP .TARGET {
BMI + BMI +
JMP .TARGET JMP .TARGET
+ INC IPH + TYA
TYA CLC
AND #$7F ADC IPL
TAY STA IPL
BCC +
INC IPH
+ LDY #$00
JMP .TARGET JMP .TARGET
} }
;****************************** ;******************************

View File

@ -88,26 +88,20 @@ NOS = $03 ; TOS-1
;+ ;+
; } ; }
!MACRO FIX_IP { !MACRO FIX_IP {
SEP #$20 ; 8 BIT A/M
!AS
INC IPH
TYA TYA
AND #$7F CLC
TAY ADC IP
REP #$20 ; 16 BIT A/M STA IP
!AL LDY #$00
} }
!MACRO FIXJMP_IP .TARGET { !MACRO FIXJMP_IP .TARGET {
BMI + BMI +
JMP .TARGET JMP .TARGET
+ SEP #$20 ; 8 BIT A/M
!AS
INC IPH
TYA TYA
AND #$7F CLC
TAY ADC IP
REP #$20 ; 16 BIT A/M STA IP
!AL LDY #$00
JMP .TARGET JMP .TARGET
} }
;* ;*