Hallo, ich lese hier schon sehr lange mit.
Jetzt habe ich mich entschlossen, mal etwas zu schreiben.
Wer SWEET16 von "THE WOZ" kennt, weiß, dass er sich dort, um zu den Opcode-Handlern zu springen, den rts-Trick verwenden.
https://en.wikipedia.org/wiki/SWEET16
http://www.6502.org/source/interpreters/sweet16.htm
Leider dürfte beim Übertragen auf html die Raute "#" für die immediate-Adressierung verlorengegangen sein. Gebt mehrere solcher Fehler, wenn ich mich erinnern kann, sind aber recht leicht zu finden.
Egal, darum geht es nicht.
Woz springt seine Handlerroutinen mit dem rts-Trick an:
- ; er verwendet ein gemeinsames Hi-Byte, alle seine Routinen müssen auf einer Page sein
- SW16D LDA >#SET ;COMMON HIGH BYTE FOR ALL ROUTINES
- PHA ;PUSH ON STACK FOR RTS
- ; .... anderer Code dazwischen für SW16-Register herausfinden usw.
- TAY ;TO Y REG FOR INDEXING (in Y-Register ist jetzt der Opcode)
- LDA OPTBL-2,Y ;LOW ORDER ADR BYTE
- PHA ;ONTO STACK
- RTS ;GOTO REG-OP ROUTINE
- ; mit dem "rts" springt er jetzt die Opcode-Handler-Routine an
- ; die Addresse-1 hat er auf den Stack geworfen (HB als Erstes)
- ; "rts" holt das vom Stack, addiert 1 und springt.
Das geht auch mit einem branch-Befehl. Die 128-Byte-Grenze ist gleich wie Woz's Pagegrenze, wenn man den Dispatcher irgendwo ca. in die Mitte zwischen die eine Hälfte und die andere Hälfte der Opcode-Handler legt.
Eine Version mit "bne", mittels Poke testbar (Format CBM prg Studio):
Edit: irgendwie schaffe ich es hier nicht, Code reinzugeben, ich liefere ihn im nächsten Post.
Die Veränderung zu Woz ist die branch-Methode zwischen den beiden Linien.
Viel Spaß
Dieser Post soll anregen, über Code-Beispiele passend zum Thread-Titel zu diskutieren und Ideen (auch verrrückte) auszutauschen: z.B. Selbsmodifizierender Code, indirekte Sprünge, Sprungtabellen, Handler-Routinen anspringen usw.