Kapitel 1: Der Pointer
So funktioniert ein Pointer:
Ein Pointer funktioniert so:
Als erstes wird eine Variable(oder ein Array oder ein Hash) komplett eingelesen. Das Ganze befindet
sich nun an einer bestimmten Stelle im Arbeitsspeicher, die über den Variablennamen angesteuert
werden kann. Es gibt aber noch eine zweite Möglichkeit: Man kann die Speicheradresse nehmen
und diese aufrufen. Damit ist es auch möglich, nur einen Teil der Variable abzurufen. Und damit
sind wir beim Pointer, denn diese zweite Art ist ein Pointer.
Ein Pointer lässt sich aber auch mit dem goto Befehl in vielen Programmiersprachen vergleichen.
(ist aber etwas ganz anderes!!!)
Ich mache hier ein Beispiel aus C64-Basis (funktioniert auch mit Q-Basic) und C++(ich weiss, kein
sauberer Programmierstill in C++, ist aber auch egal für das Beispiel):
Basic:
10 Print "Hallo"
20 GOTO 10
C++:
#include <iostream.h>
int main()
{
ziel:
cout << "Hallo" << endl;
goto ziel;
return 0;
}
Nachdem ihr jetzt wisst, wie Pointer funktionieren, werde ich ich erklären, wie man sie verwendet. Aber zuerst
werde ich euch erklären, wozu man diese Pointer verwendet.
Die Verwendung der Pointer
"Pointer, wozu dienen sie überhaupt und warum sollte ich etwas darüber lernen?" werden sicher einige von euch denken.
Oben habe ich ja schon erklärt, wir ein Pointer funktioniert. In Roms - wie sollte es anders sein - werden die Pointer
auch sehr oft verwendet, um z.B. zu sagen, wo der Zeichensatz sich befindet oder wo Textstellen beginnen. Und genau dass
ist der Punkt, bei dem sie uns Romhackern nützlich sind: Mit ihnen ist es ein leichtes, die Textlängen zu
verändern, und es ist sogar möglich, mehr Platz zum übersetzen zu gewinnen! Na, Interesse an ihnen
gefunden?
Die Pointer Berechnung:
Die Pointer Berechnung ist nicht schwer: Als erstes schreibt ihr euch die Hexadezimale Position auf, für die ihr
den Poiner berechnen wollt. Zum Beispiel beginnt der Text an der Stelle:
4F 3E 65
Als nächstes müsst ihr die letzten 4 Zahlen davon abtrennen und weiter verwenden.
3E 65
Danach zieht ihr die Größsse des Headers ab.
Kleiner Exkurs: Was ist ein Header und wozu dient er?
Ein Header wird von den Leuten, die Roms dumpen, dem Spiel hinzugefügt. Diese Daten werden von den Emulatoren
benötigt, da Daten drin stehen die sie zum emulieren brauchen. In den Original-Spielen, die man im Laden
kaufen kann, sind keine Header enthalten, die Konsolen brauchen das nicht. Die Pointer beziehen sich auf die
Positionsangabe des Spiels ohne Header, und da sich der Header am Anfang des Roms befindet, muss seine Größe
abgezogen werden. Die meistens neueren Emulatoren brauchen die Header nicht mehr, aber denoch werden diese
an den Roms zur Erkennung gelassen.
OK, zuruück zu der Pointerberechnung. Ihr zieht die Größe des Headers ab. Die Berechnung der mir
bekannten Pointer werden im nächsten Kapitel aufgelistet. Bei diesem Beispiel nehme ich 2 00 für einen
SNES Header. Die das nicht im Kopf machen wollen oder sich nicht mit Hexadezimalen Zahlen auskennen, können den
Taschenrechner verwenden.
3E 65
-2 00
________
3C 65
Als letzten Schritt müsst ihr nur noch die beiden Zahlen vertauschen, und ihr habt euren ersten Pointer berechnet.
65 3C
Tipp: Ihr solltet das Ganze ein bisschen üben!
Wie finde ich die Pointer-Tabelle?
Jetzt kommt es zu der Anwendung der Pointer Berechnung. In jedem Rom gibt es (zu 99%) eine oder mehrere Listen, in denen die Pointer
eingetragen sind. Als erstes schreibt ihr euch von dem ersten Buchstaben eines Textblocks die Position heraus und berechnet den
Pointer. Wenn ihr ihn habt könnt ihr die Pointer Tabelle suchen. Ihr sucht einfach diesen Hexadezimalen Wert im Rom.
Wenn ihr den Wert gefunden habt, dann addiert eins (bei unserem Beispiel auf 66 3C) und dann seht ihr im Spiel,
ob ihr die Pointer Tabelle gefunden habt. Am besten nehmt ihr dazu eine Stelle, die ihr von Anfang an (beim Spielen) erreichen
könnt. Sollte jetzt der erste Buchstabe fehlen, habt ihr die Pointer Tabelle gefunden. Wenn nicht, macht die Änderung
rüchgängig und sucht weiter, bis ihr sie gefunden habt!
Häufig gibt es nach einem Text-String eine Ende Zeichen, dass der Anzeigeroutine sagt, dass der Text nicht mehr weiter geht.
Damit lässt sich jetzt die Textlänge im Rom variieren: Je nachdem, ob ihr weniger oder mehr Platz braucht verschiebt
ihr das Zeichen in der Textbank vor oder zurück (Achtung: Es darf nur anderer Text gekürzt oder leerer Speicherplatz
verwendet werden!) und berechnet alle Pointer neu. Sie zeigen immer auf das erste Zeichen nach diesem "Ende-Tag". Pointer
können übrigens nur innerhalb einer Textbank verschoben werden, sollen sie weiter zeigen, dann müsst ihr sie
mit einem ASM-Hack verändern.
Jetzt lest das ganze noch 2 oder 3 mal, und ihr habt es kapiert, versprochen. ;-)
Tipp: Wenn ihr für ein paar Buchstaben nach unbekannten Zeichen die Pointer berechnet, dann
lässt sich die Pointer-Tabelle leichter finden. Ihr sucht wie oben beschrieben nach den ersten Pointer, schaut nach, ob
der nächste im Rom in eurer Liste steht. Wenn ja, dann überprüft ihr das an noch ein paar. Wenn das ganze die
Tabelle nach euren Vergleich sein kann, ist die Wahrscheinlichkeit eine falsche gefunden zu haben relativ gering. Sollte dagen
schon der zweite Pointer nicht in euer Liste auftauchen, dann solltet ihr den Pointer erneut suchen, und wieder vergleichen.
Zurück
Weiter