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:
parent
f24bb421ec
commit
82516bfe31
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
;******************************
|
;******************************
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
;*
|
;*
|
||||||
|
Loading…
Reference in New Issue
Block a user