25.11.2010, 17:17
(25.11.2010, 16:06)thEClaw schrieb: Du beginnst das ganze also von unten aufzurollen, richtig (bis du irgendwann in der int main ankommst )?
Genau so!
(25.11.2010, 16:06)thEClaw schrieb: Wie funktioniert das mit den übergebenen und/oder zurückgegebenen Variablen?
Das Übergeben der Werte passiert über den Stack.
Die Werte werden mit CPU_Pop() vom Stack geholt. Bei C-Programmen, wie der NLT, müssen wir sie mit CPU_Push() wieder zurücktun. Diese werden an die Ersatzfunktion übergeben und evtl. umgewandelt (Zeiger).
Wenn die Funktion einen Rückgabewert hat, so kommt dieser ins Register AX (8/16Bit Wert) oder in Registerpaar DX:AX.
Dann kann die Kontrolle an die DOSBox-CPU zurückgegeben werden.
Für diese sah es dann aus als wäre nur ein einziger (etwas umfangreicherer) Befehl ausgeführt worden.
(25.11.2010, 16:06)thEClaw schrieb: Musst du die gezielt in den Speicher schreiben bzw. auslesen? Das würde ein späteres Code-Puzzlespiel vermutlich erschweren.
Kurze Antwort: Ja.
Lange Antwort:
Die globalen Variablen liegen in einem besonderen Bereich, dem Datensegment.
Die Ersatzfunktionen müssen Werte in diesem Datensegment lesen und ändern, da das Spiel, sonst durcheinander kommt.
z.B. ein
char c = 'a';
ist dann soetwas wie
ds_writeb(0x1234, 'a');
Das sieht zwar nicht schön aus, ist aber so.
Wenn der ganze Code rekonstruiert ist (~100%), kann ich dann die Variablen interpretieren und char von struct foo[20].c trennen.
Aber das ist erst der nächste große Schritt.
(25.11.2010, 16:06)thEClaw schrieb: EDIT: Meinst du 9,74% aller Funktionen die Codemenge (in Zeilen) oder die Anzahl der Funktionen?
Damit meine ich die Anzahl der Funktionen. Es gibt Einige die nur eine andere Funktion aufrufen oder Andere die sehr, sehr lang sind.
Dungeonhandler zu Beispiel, die eine riesengroße switch-Anweisung sind.
Damit habe ich mir ein Maß geschaffen um meinen Fortschritt zu messen, wenn auch ein ungenaues.