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
BNE ---
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
//
@ -857,44 +945,28 @@ end
def lookupextern(esd, index)#1
word sym, addr
byte str[16]
while ^esd
sym = esd
esd = sym + dcitos(sym, @str)
if esd->0 & $10 and esd->1 == index
addr = lookuptbl(sym, symtbl)
if !addr
perr = $81
cout('?'); prstr(@str); crout
fin
return addr
sym = lookupidx(esd, index)
if sym
addr = lookuptbl(sym, symtbl)
if !addr
perr = $81
dcitos(sym, @str)
cout('?'); prstr(@str); crout
fin
esd = esd + 3
loop
return addr
fin
return 0
end
def adddef(bank, addr, deflast)#1
word defentry
defentry = *deflast
*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=>1 = bank ?? $03DC :: $03D6 // JSR $03DC (AUX MEM INTERP) or $03D6 (MAIN MEM INTERP)
defentry=>3 = addr
defentry->5 = 0 // NULL out next entry
return defentry
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
word rdlen, modsize, bytecode, codefix, defofst, defcnt, init, fixup
word addr, defaddr, modaddr, modfix, modofst, modend

View File

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

View File

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