Hi!
Ich bin über ein Stück 6502 Maschinencode von einer Art Bytecode
Interpreter gestolpert und erfasse den Sinn einer Funktion nicht.
Vielleicht hat jemand von euch sowas schoneinmal gesehen?
Hier ist, was ich bis jetzt glaube verstanden zu haben:
- Die Funktion greift auf einen Stack von 16 Bit Werten zu. Die Lobytes
liegen ab $A408, die Hibytes ab $A42C. X enthält den 0-basierten Index
des letzten gültigen Stackeintrags.
- Das X Register ist beim Aufruf der Funktion = 1 und beim Verlassen =
0. Sie bekommt also zwei 16 Bit Werte über den Stack rein und gibt einen
16 Bit Wert über den Stack zurück.
- Sie rollt die Bits von stack[2] und stack[1] 16 mal nach rechts. Sieht
mir wie das Rollen eines 32 Bit Wertes um 16 Bit nach rechts aus.
- Jedes mal, wenn Bit 0 von stack[1] (also quasi Bit0 des 32 Bit Wertes)
gesetzt ist, wird der Wert an stack[2] (also quasi das Hiword des 32 Bit
Wertes) um den Wert an stack[0] erhöht. (??)
foobar schrieb:> Sieht nach einer Multiplikation aus ...
Darüber muss ich mal nachdenken...
Der Code ist übrigens aus der C64 Version von Sid Meiers Pirates! und
ist eine der vielen Operationen dieses Bytecode Interpreters. Aber
SWEET16 ist es nicht, denn die Opcodes passen nicht.
Marco W. schrieb:> Hier ist, was ich bis jetzt glaube verstanden zu haben:
Das Verständnis würde steigen, wenn du den Code nicht willkürlich
einrücken würdest
> A54C BD 09 A4 LDA $A409,X // stack[2] += stack[0]
Das ist eine ganz gewöhnliche absolut x-indizierte Adressierung. Damit
da etwas sinnvolles passiert, muss das x-Register vor Einsprung in die
Unterroutine vernünftig belegt werden.
Der Prozessorstack des 6502 liegt zwischen 0x0100 und 0x01FF, nicht bei
0xA4..
Wolfgang schrieb:> Der Prozessorstack des 6502 liegt zwischen 0x0100 und 0x01FF, nicht bei> 0xA4..
Naja, das ist eben nicht der Stack des Prozessors sondern
(ich nenne es mal) eine Arbeits-Page des Programms in der
verschiedene Objekte im Index-Raum 0...255 bearbeitet werden
können.
der Ursprungs-Beitrag ist übrigens ein schönes Beispiel dafür, wie
kniffelig es ist, "reverse engineering" zu betreiben, und aus
disassemblierten Code wieder sogar nur einzelne Codefragmente
"einfacher" Funktionen in einer Hochsprache herzuleiten.
einen vernünftigen komplexen Algorithmus (z.B. Fourier Transformation,
trigonometrische Funktionen, Bresenham, Sortieralgorithmen etc) aus
"einer handvoll arithmetischer oder Zeiger-Operationen" heraus
herzuleiten, ist dann die nächste Weihe-Stufe.