1
0
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:
David Schmenk 2018-02-06 09:49:48 -08:00
parent b56b57fa4d
commit 9b7ecaf8e6

View File

@ -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.