Pointertabelle
aus RHWiki, der freien Romhacking-Enzyklopädie
Eine Pointertabelle ist in der Regel ein Array das nur Pointer als Einträge enthält. Manchmal kommen auch noch andere Informationen hinzu, die irgendwie zu den durch die Pointer adressierten Daten im Zusammenhang stehen.
Zweck von Pointertabellen
Pointertabellen werden etwa aus demselben Grund wie Strukturen verwendet und sind eigentlich die einfachste Form von Strukturen in Roms:
Anstatt im Code 1000 Abfragen zu machen, wann welcher Pointer verwendet werden soll, verwendet man einfach eine Tabelle (Array) mit Pointern. Die Pointer können dann einfach über ihren Index im Array geladen werden. Auf diese Weise entsteht kaum Rechenaufwand.
Verwendung von Pointertabellen
Pointertabellen können z.B. Pointer zu Grafiken, Maps und Headern enthalten, aber auch zu anderen Pointertabellen oder Code.
Sie sind überall da gebräuchlich, wo man viele Daten gleichen Typs adressieren will (siehe allgenmeiner Zweck von Arrays) und in dieser Hinsicht ziemlich flexibel.
Außerdem finden Pointertabellen oft bei der Umsetzung von switch-Statements (für VB-Programmierer: Select...Case) Verwendung.
Beispiel:
switch (mode) {
case 0: function1 (); break;
case 1: function2 (); break;
case 2: function3 (); break;
};
wird zu: (ARM-Assembler)
ldr r0, @Table // Adresse von @Table nach r0 laden
ldr r1, Index
lsl r1, #0x02 // Mit 4 Multiplizieren, da Pointer auf GBA 4 Byte groß sind
ldr r0, [r0, r1]
ldr pc, r0 // Zu Funktion springen
@Table:
.dw @function1 // Pointer zu function1
.dw @function2 // usw...
.dw @function3
@function1:
...
@function2:
...
@function3:
...

