mirror of
https://github.com/dschmenk/PLASMA.git
synced 2025-01-07 15:31:49 +00:00
Synch Apple 1 CMD to A2 and A3
This commit is contained in:
parent
b56b57fa4d
commit
9b7ecaf8e6
@ -550,6 +550,176 @@ 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
|
||||||
|
//
|
||||||
|
// Reloc internal data
|
||||||
|
//
|
||||||
|
//def reloc(modfix, modofst, bytecode, rld)#3
|
||||||
|
// word addr, fixup
|
||||||
|
// while ^rld
|
||||||
|
// if ^rld & $10 // EXTERN reference.
|
||||||
|
// return rld, addr, fixup
|
||||||
|
// fin
|
||||||
|
// addr = rld=>1 + modfix
|
||||||
|
// fixup = *addr + modofst
|
||||||
|
// if uword_isge(fixup, bytecode) // Bytecode address.
|
||||||
|
// return rld, addr, fixup
|
||||||
|
// fin
|
||||||
|
// *addr = fixup
|
||||||
|
// rld = rld + 4
|
||||||
|
// loop
|
||||||
|
// return rld, addr, fixup
|
||||||
|
//end
|
||||||
|
asm reloc(modfix, modofst, bytecode, rld)#3
|
||||||
|
LDA ESTKL,X
|
||||||
|
STA SRCL
|
||||||
|
LDA ESTKH,X
|
||||||
|
STA SRCH
|
||||||
|
LDY #$00
|
||||||
|
- LDA (SRC),Y
|
||||||
|
BEQ RLDEX ; END OF RLD
|
||||||
|
PHA
|
||||||
|
INY
|
||||||
|
LDA (SRC),Y
|
||||||
|
INY
|
||||||
|
CLC
|
||||||
|
ADC ESTKL+3,X ; ADDR=ENTRY=>1+MODFIX
|
||||||
|
STA DSTL
|
||||||
|
LDA (SRC),Y
|
||||||
|
ADC ESTKH+3,X
|
||||||
|
STA DSTH
|
||||||
|
PLA
|
||||||
|
AND #$10 ; EXTERN REF - EXIT
|
||||||
|
BNE RLDEX
|
||||||
|
TAY ; FIXUP=*ADDR+MODOFST
|
||||||
|
LDA (DST),Y
|
||||||
|
INY
|
||||||
|
CLC
|
||||||
|
ADC ESTKL+2,X
|
||||||
|
STA TMPL
|
||||||
|
LDA (DST),Y
|
||||||
|
ADC ESTKH+2,X
|
||||||
|
CMP ESTKH+1,X ; FIXUP >= BYTECODE?
|
||||||
|
BCC +
|
||||||
|
STA TMPH
|
||||||
|
BNE RLDEX ; YEP, EXIT
|
||||||
|
LDA TMPL
|
||||||
|
CMP ESTKL+1,X
|
||||||
|
BCS RLDEX ; YEP, EXIT
|
||||||
|
LDA TMPH
|
||||||
|
+ STA (DST),Y ; *ADDR=FIXUP
|
||||||
|
DEY
|
||||||
|
LDA TMPL
|
||||||
|
STA (DST),Y
|
||||||
|
LDA SRCL ; NEXT ENTRY
|
||||||
|
; CLC
|
||||||
|
ADC #$04
|
||||||
|
STA SRCL
|
||||||
|
BCC -
|
||||||
|
INC SRCH
|
||||||
|
BNE -
|
||||||
|
RLDEX INX
|
||||||
|
LDA TMPL
|
||||||
|
STA ESTKL,X
|
||||||
|
LDA TMPH
|
||||||
|
STA ESTKH,X
|
||||||
|
LDA DSTL
|
||||||
|
STA ESTKL+1,X
|
||||||
|
LDA DSTH
|
||||||
|
STA ESTKH+1,X
|
||||||
|
LDA SRCL
|
||||||
|
STA ESTKL+2,X
|
||||||
|
LDA SRCH
|
||||||
|
STA ESTKH+2,X
|
||||||
|
RTS
|
||||||
|
end
|
||||||
//
|
//
|
||||||
// CONSOLE I/O
|
// CONSOLE I/O
|
||||||
//
|
//
|
||||||
@ -769,15 +939,6 @@ def adddef(addr, deflast)#1
|
|||||||
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, defofst, defcnt, init, fixup
|
word rdlen, modsize, bytecode, defofst, defcnt, init, fixup
|
||||||
word addr, modaddr, modfix, modofst, modend
|
word addr, modaddr, modfix, modofst, modend
|
||||||
@ -871,31 +1032,36 @@ def loadmod(mod)#1
|
|||||||
// Run through the Re-Location Dictionary.
|
// Run through the Re-Location Dictionary.
|
||||||
//
|
//
|
||||||
while ^rld
|
while ^rld
|
||||||
addr = rld=>1 + modfix
|
rld, addr, fixup = reloc(modfix, modofst, bytecode, rld)
|
||||||
|
if ^rld
|
||||||
|
*addr = ^rld & $10 ?? *addr + lookupextern(esd, rld->3) :: lookupdef(fixup + defofst, deftbl)
|
||||||
|
rld = rld + 4
|
||||||
|
fin
|
||||||
|
//addr = rld=>1 + modfix
|
||||||
//if uword_isge(addr, modaddr) // Skip fixups to header
|
//if uword_isge(addr, modaddr) // Skip fixups to header
|
||||||
//if type & $80 // WORD sized fixup.
|
// if type & $80 // WORD sized fixup.
|
||||||
fixup = *addr
|
// fixup = *addr
|
||||||
//else // BYTE sized fixup.
|
// else // BYTE sized fixup.
|
||||||
// fixup = ^addr
|
// fixup = ^addr
|
||||||
//fin
|
// fin
|
||||||
if ^rld & $10 // EXTERN reference.
|
// if ^rld & $10 // EXTERN reference.
|
||||||
fixup = fixup + lookupextern(esd, rld->3)
|
// fixup = fixup + lookupextern(esd, rld->3)
|
||||||
else // INTERN fixup.
|
// else // INTERN fixup.
|
||||||
fixup = fixup + modofst
|
// fixup = fixup + modofst
|
||||||
if uword_isge(fixup, bytecode)
|
// if uword_isge(fixup, bytecode)
|
||||||
//
|
// //
|
||||||
// Bytecode address - replace with call def directory.
|
// // Bytecode address - replace with call def directory.
|
||||||
//
|
// //
|
||||||
fixup = lookupdef(fixup + defofst, deftbl)
|
// fixup = lookupdef(fixup + defofst, deftbl)
|
||||||
fin
|
// fin
|
||||||
fin
|
// fin
|
||||||
//if type & $80 // WORD sized fixup.
|
// if type & $80 // WORD sized fixup.
|
||||||
*addr = fixup
|
// *addr = fixup
|
||||||
//else // BYTE sized fixup.
|
// else // BYTE sized fixup.
|
||||||
// ^addr = fixup
|
// ^addr = fixup
|
||||||
//fin
|
// fin
|
||||||
//fin
|
//fin
|
||||||
rld = rld + 4
|
//rld = rld + 4
|
||||||
loop
|
loop
|
||||||
//
|
//
|
||||||
// Run through the External/Entry Symbol Directory.
|
// Run through the External/Entry Symbol Directory.
|
||||||
|
Loading…
Reference in New Issue
Block a user