SML2-Maps
aus RHWiki, der freien Romhacking-Enzyklopädie
| Inhaltsverzeichnis |
Die Blockdaten
Die Blockdaten befinden sich alle in ROM-Bank 8. Das Offset innerhalb der Bank wird durch das 13. und das 12. Byte des Mapheaders bestimmt.
Die Blöcke sind 2*2 Tiles groß und sind zunächst horizontal und dann vertikal angeordnet.
00010203 wäre zum Beispiel:
00 01 02 03
Jede Map hat maximal 128 Blöcke.
Die Maps
Jede Map ist 256*48 Blöcke groß, was 4096 * 768 Pixeln entspricht. Die Blöcke sind zeilenweise und komprimiert gespeichert.
In jeder Mapbank(Mapheader, A80Dh) gibt es bei 42F0h eine Pointertabelle, die auf die einzelnen Maps innerhalb der Mapbank zeigt. Welcher Pointer ausgewählt wird, wird durch die Mapnummer2(Mapheader, A812h) bestimmt.
Die Map-Kompression
Die Kompression der Maps ist sehr simpel.
Zunächst wird ein Byte aus dem ROM geladen, ich nenne es mal C.
Wenn das höchste Bit von C rückgesetzt (C AND 80h = 0) ist, dann wird C ausgegeben (und wieder von vorne gestartet).
Falls das höchste Bit von C jedoch gesetzt (C AND 80h = 1) ist, wird noch ein Byte, genannt D, aus dem ROM geladen. Jetzt wird (C AND 7Fh) D-mal ausgegeben (und wieder von vorne gestartet). Falls D = 0 dann wird (C AND 7Fh) 256-mal ausgegeben (und wieder von vorne gestartet). Falls während dieser Ausgabe jedoch ein Zeilenumbruch kommt, wird wieder von vorne gestartet.
Dies wiederholt sich so oft, bis 3000h Bytes ausgegeben wurden.
Autoscrolling
Je nach ROM-Version ist entweder bei 0x1F74(V1.2) oder 0x1F71(V1.0) eine Tabelle, bei der für jede Map ein Byte vorhanden ist, dessen niedrigstes Bit angibt, ob Autoscrolling für diese Map aktiviert ist.
Autoscrolling = [Offset + MapId] And 1h
Mapheader | Maps | Levelgrafiken | Gegner | Overworld | Bereiche | Titelscreen | Auswahl des Savestates | Musik | Credits | Saves | Engine | Warps

