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