Kapitel 4: Roms erweitern und den Platz nutzen



Eine Art Einleitung:

Ich war lange am überlegen, ob ich dieses Thema in mein Tutorial mit hineinpacken soll. Das liegt zum einen daran, dass ich dieses Verfahren erst einmal erfolglos in einem Rom intensiv ausprobiert habe, und zum anderen daran, dass es sich nicht immer anwenden lässt. Ich habe mich aber letztendlich doch dazu entschieden. Wenn ihr mit diesem Verfahren Probleme habt, so kann ich euch nicht versprechen, dass ich euch weiterhelfen kann.
Außerdem ist sehr wichtig, dass ihr mit Pointern sehr gut umgehen könnt, viel Freude am Experimentieren habt und nicht davor zurückschreckt, mehrere Stunden Arbeit umsonst zu investitieren.

Das Verfahren:

So, jetzt aber genug der Worte, lasst uns anfangen, ich kenne das Verfahren nur für das SNES, für andere Systeme sollte es aber ähnlich funktionieren:
Findet heraus, ob euer Rom ein High- oder Lowrom ist. Die Pointerberechnung wird sich in beiden Fällen unterscheiden. Benutzt zum Beispiel Naga, es kann anzeigen, ob ihr ein Low- oder Highrom habt. Außerdem können auch Emulatoren und auch andere Tools anzeigen, um welche Sorte Rom es sich handelt. Es steht übrigens auch im Header.
Als nächstes müsst ihr das Rom erweitern, indem ihr am Ende "00" oder "FF" - je nach Rom - anhängt. Entweder ihr schreibt euch ein einfaches Tool, oder sucht im Internet nach einem. Nicht jedes Tool erweitert so, dass es noch funktioniert. Ein Tool das erweitern kann, wäre SNESEdit von Sinap. Beim erweitern solltet ihr darauf achten, dass ihr um in vielfaches von 32Kbyte (80 00 Hex) erweitert. Durch eine Erweiterung um ein Vielfaches von 4Mbit läft das Rom danach am stabilsten.
Nach dem Erweitern müsst ihr euch überlegen, welche Textstelle ihr in den neuen Sektor legen wollt. Dabei bleibt zu beachten, dass 2 Byte Pointer nur innerhalb einer Textbank arbeiten. Danach ermittelt ihr den Beginn der Textstelle, schreibt euch die Position heraus und berechnet den Pointer. Auch bei der Pointertabelle schreibt ihr euch den Beginn heraus - wenn ihr sie denn verschieben wollt.
Als n&aul;chstes kopiert ihr die Textbank (oder die Pointertabelle) und fügt sie an der neuen Position wieder ein. Auch dort schreibt ihr die Startposition heraus.
(12 33 45)
Danach müsst ihr die Pointer neu berechnen. Aber nicht, wie gewohnt, 2 Byte Pointer sondern 3 Byte Pointer. Die werden so berechnet:

Low Rom:

Zieht den Header ab. Danach schaut ihr in dieser Tabelle nach, wie ihr euren Hexeditor wert in einen SNES Wert ändern müsst (also den ersten Byte, das heisst die ersten beiden Stellen entsprechen der Tabelle abändern und meistens 80 00 addieren):
(12 33 45
-      2 00
+    80 00
___________
12 B1 45)
Hexeditor SNES Hexeditor SNES
000000-007FFF 008000-00FFFF 0C8000-0CFFFF 198000-19FFFF
008000-00FFFF 018000-01FFFF 0D0000-0D7FFF 1A8000-1AFFFF
010000-017FFF 028000-02FFFF 0D8000-0DFFFF 1B8000-1BFFFF
018000-01FFFF 038000-03FFFF 0E0000-0E7FFF 1C8000-1CFFFF
020000-027FFF 048000-04FFFF 0E8000-0EFFFF 1D8000-1DFFFF
028000-02FFFF 058000-05FFFF 0F0000-0F7FFF 1E8000-1EFFFF
030000-037FFF 068000-06FFFF 0F8000-0FFFFF 1F8000-1FFFFF
038000-03FFFF 078000-07FFFF 100000-107FFF 208000-20FFFF
040000-047FFF 088000-08FFFF 108000-10FFFF 218000-21FFFF
048000-04FFFF 098000-09FFFF 110000-117FFF 228000-22FFFF
050000-057FFF 0A8000-0AFFFF 118000-11FFFF 238000-23FFFF
058000-05FFFF 0B8000-0BFFFF 120000-127FFF 248000-24FFFF
060000-067FFF 0C8000-0DFFFF 128000-12FFFF 258000-25FFFF
068000-06FFFF 0D8000-0CFFFF 130000-137FFF 268000-26FFFF
070000-077FFF 0E8000-0EFFFF 138000-13FFFF 278000-27FFFF
078000-07FFFF 0F8000-0FFFFF 140000-147FFF 288000-28FFFF
080000-087FFF 108000-10FFFF 148000-14FFFF 298000-29FFFF
088000-08FFFF 118000-11FFFF 150000-157FFF 2A8000-2AFFFF
090000-097FFF 128000-12FFFF 158000-15FFFF 2B8000-2BFFFF
098000-09FFFF 138000-13FFFF 160000-167FFF 2C8000-2CFFFF
0A0000-0A7FFF 148000-14FFFF 168000-16FFFF 2D8000-2DFFFF
0A8000-0AFFFF 158000-15FFFF 170000-177FFF 2E8000-2EFFFF
0B0000-0B7FFF 168000-16FFFF 178000-17FFFF 2F8000-2FFFFF
0B8000-0BFFFF 178000-17FFFF 180000-187FFF 308000-30FFFF
0C0000-0C7FFF 188000-18FFFF

(24 B1 45)
Eventuell müsst ihr einen XX 00 Wert addieren, und ordnet danach die 3 Bytes rückwärts an.
(45 B1 24)
Häufig treten diese Pointer im Rom mit einem "BF" davor auf.
(BF 45 B1 24)
Pointer ist berechnet.

High Rom:


Die 3 Byte Pointer berechnen sich wesentlich angenehmer für ein High Rom: Ihr nehm euren Wert, zieht den Header ab, addiert eventuell XX 00 und addiert danach C0 00 00. Soviel ich weiss "läuft" dieser Pointer über, das heisst, dass sobald der Wert grösser als FF FF FF wird, beginnt er wieder bei 00 00 00, die erste Stelle wird also abgeschnitten.
(12 33 45
-      2 00
+C0 00 00
____________
D2 31 45)
So, jetzt habt ihr euren Pointer berechnet.


Den Pointer berechnet ihr nun für alles: Die Pointer Tabelle, den Textbeginn und für die neuen Stellen. Wenn die Pointertabelle (des Textes) in der gleichen Bank wie der Text liegt, kann es euch passieren, dass ihr sie nach dem Verschieben wieder in der gleichen Bank unterbringen müsst!
Als nächstes müsst ihr die Pointer im Rom suchen. Es kann sein dass sie mehrfach auftreten: Entweder es sind alles Pointer oder manche enthalten Daten, deswegen müsst ihr ausprobieren, welche der Pointer ihr abändern müsst. Es ist natürlich klar, dass der neue Textpointer den alten Textpointer ersetzt, und der Pointer der Pointertabelle den alten Pointer der Pointertabelle ersetzt.
Nach dem verschieben kommt dann die lustige Aufgabe ALLE Pointer neu zu berechnen.
Jetzt wünsche ich euch noch viel Spass mit dem Verfahren und fahre mit dem nächsten Kapitel fort. ;)

Zurück

Vor