I need to assemble a double-indirect jump. I solved it with self-modifying code:
Code: Select all
;SWITCH:
;A:X (lo:hi) = adr, OFS:OFS+1 (lo:hi) = ofs
;jump to address stored in MEM[adr+ofs]:MEM[adr+ofs+1]
SWITCH CLC
ADC OFS ;A <- lo(adr + ofs)
STA @jmp + 1 ;save it as JMP() arg, lo
TXA
ADC OFS + 1 ;A <- hi(adr + ofs)
STA @jmp + 2 ;save it as JMP() arg, hi
@jmp JMP ($FFFF) ;SMC: JMP (adr + ofs)
Code: Select all
;SWITCH:
;A:X (lo:hi) = adr, OFS:OFS+1 (lo:hi) = ofs
;jump to address stored in MEM[adr+ofs]:MEM[adr+ofs+1]
SWITCH CLC
ADC OFS ;A <- lo(adr + ofs)
STA TMP ;TMP <- lo(adr + ofs)
TXA
ADC OFS + 1 ;A <- hi(adr + ofs)
STA TMP + 1 ;TMP + 1 <- hi(adr + ofs)
LDY # 1
LDA (TMP),Y
TAX ;X <- MEM[adr+ofs+1]
DEY
LDA (TMP),Y ;A <- MEM[adr+ofs]
STA TMP ;TMP <- MEM[adr+ofs]
STX TMP + 1 ;TMP + 1 <- MEM[adr+ofs+1]
JMP (TMP)