Ich bring hier gerade mal mein Beispiel aus dem Denial-Forum (jetzt vollständig) an:
Code
.2000 A9 68 LDA #$68 ; PLA Opcode-Byte
.2002 85 69 STA $69
.2004 85 6B STA $6B
.2006 A9 AA LDA #$AA ; TAX Opcode-Byte
.2008 85 6A STA $6A
.200A A9 A8 LDA #$A8 ; TAY Opcode-Byte
.200C 85 6C STA $6C
.200E A9 48 LDA #$48 ; PHA Opcode-Byte
.2010 85 6D STA $6D
.2012 85 6F STA $6F
.2014 A9 8A LDA #$8A ; TXA Opcode-Byte
.2016 85 6E STA $6E
.2018 A9 60 LDA #$60 ; RTS Opcode-Byte
.201A 85 70 STA $70
.201C 20 69 00 JSR $0069
; ** In X/Y steht jetzt die Adresse vor dem nächsten Befehl.
; Benötigt wird jetzt zunächst die Adresse des Operanden-
; felds des Absprung-Trampolins. Diese wird aus X/Y durch
; Addition eines konstanten(!) Offsets gewonnen und steht
; anschließend in $03/$04:
.201F 18 CLC
.2020 8A TXA
.2021 69 2D ADC #$2D ; $002D = $204B - $201E
.2023 85 03 STA $03
.2025 98 TYA
.2026 69 00 ADC #$00
.2028 85 04 STA $04
; ** Nun wird aus dem IRQ-Vektor die vorhandenene Adresse
; (meistens ja $EA31) ausgelesen und in das Trampolin
; geschrieben:
.202A A0 00 LDY #$00
.202C AD 14 03 LDA $0314
.202F 91 03 STA ($03),Y
.2031 C8 INY
.2032 AD 15 03 LDA $0315
.2035 91 03 STA ($03),Y
; ** Der IRQ-Vektor wird jetzt geändert, neue Zieladresse
; ist der Befehl nach dem Trampolin:
.2037 08 PHP
.2038 78 SEI
.2039 18 CLC
.203A A5 03 LDA $03
.203C 69 02 ADC #$02 ; $0002 = $204D - $204B
.203E 8D 14 03 STA $0314
.2041 A5 04 LDA $04
.2043 69 00 ADC #$00
.2045 8D 15 03 STA $0315
.2048 28 PLP
.2049 60 RTS
; ** Trampolin, Absprung in den KERNAL-IRQ
.204A 4C 00 00 JMP $0000
; ** Start der eigenen IRQ-Routine
.204D EE 0F 90 INC $D020
.2050 18 CLC
.2051 90 F7 BCC $204A
Alles anzeigen
Der Code ist jetzt exemplarisch nach $2000 assembliert worden. Es spielt aber keine Rolle, wohin man ihn (in freien Speicher) lädt - er läuft überall! Das darf jeder gerne mit einem Monitor des eigenen Vertrauens und dessen L- und T-Befehle überprüfen.
In ähnlicher Weise, wie hier die zwei Adressen für das Operanden-Feld des Trampolins und die eigentliche Startadresse der IRQ-Routine durch konstante Offsets von der "Ich bin hier!"-Adresse abgeleitet wurden, kann man auch Zugriffe auf Tabellen, Sprünge und Unterprogrammaufrufe synthetisieren. Das geht alles, es ist nur halt super-umständlich.