Interner Header des Super Nintendo ROMS (SNES)

Aufgrund eines Artikels in englischer Sprache und der Tatsache, dass der interne Header der Super Nintendo-ROMs kaum Informationen in spanischer Sprache enthält, habe ich beschlossen, dieses kleine Dokument zu veröffentlichen. Ich bin kein Guru der SNES, daher sind alle Informationen das Ergebnis mehrerer Monate des Lesens.

Um das Dokument verstehen zu können, müssen Sie über grundlegende Computerkenntnisse verfügen, obwohl ich versuchen werde, jeden Abschnitt so detailliert wie möglich zu erklären. Aufgrund dieses Dokuments und aus praktischen Gründen habe ich in C # ein kleines Tool programmiert, mit dem Sie die Informationen aus den ROM-Headern extrahieren und leserlich darstellen können. Über dieses kleine Hilfsprogramm werden wir am Ende des Artikels sprechen.

Was ist der interne Header eines SNES-ROM?

Jedes Super Nintendo-ROM enthält einen 64-Byte-Header. Dieser Header wird als interner Header bezeichnet. Hier werden Informationen zur Kassette gespeichert. Diesen internen Header dürfen wir nicht mit dem sogenannten SMC-Header verwechseln.

Was ist der SMC-Header?

Der SMC-Header ist ein Header, der von Kassettenkopierern hinzugefügt wird. Die Hardware, die die Kassettendaten in eine Datendatei speichern soll, fügt diesen SMC-Header manchmal mit zusätzlichen Informationen hinzu.

Das Vorhandensein oder Nichtvorhandensein des SMC-Headers in einem SNES-ROM ist wichtig, da abhängig von der einen oder anderen Möglichkeit die Zuordnung des internen Headers unterschiedlich ist (dies werde ich später genauer erläutern) .

Der SMC-Header befindet sich am Anfang des ROM und ist 512 Byte groß. Abhängig davon, ob sie diesen SMC-Header haben oder nicht, werden SNES-ROMs aufgerufen:

  • Headered ROM : hat SMC-Header.
  • Headerless ROM : hat keinen SMC-Header.

Es gibt Programme, die für das Entfernen des SMC-Headers verantwortlich sind, da dieser in den aktuellen SNES-Emulatoren keine Verwendung hat. In diesem Dokument wird der interne Header behandelt, was uns wirklich interessiert. Es muss jedoch bekannt sein, dass wir diesen SMC-Header finden können.

Position des internen Headers im SNES-ROM.

Das erste Ziel besteht darin, den internen Header zu lokalisieren, um ihn lesen und die Informationen interpretieren zu können.

Wie erkennt man, ob ein ROM den SMC-Header hat oder nicht?

In diesem Prozess werden wir feststellen, ob ein ROM mit oder ohne Header versehen ist. Der einfachste Weg herauszufinden, ob ein ROM den SMC-Header hat oder nicht, besteht darin, die Größe des ROM durch 1024 in Bytes zu unterteilen. Abhängig vom Rest dieser Unterteilung können drei Möglichkeiten angegeben werden:

  • Wenn der Rest Null ist, gibt es keinen SMC-Header (haderless ROM).
  • Wenn der Rest 512 ist, gibt es einen SMC-Header (ROM Hadered).
  • Wenn der Rest eine andere Nummer als die beiden vorherigen ist, liegt möglicherweise ein ungültiges ROM vor.
See also  Neue Bibliothek mit klassischen Spielen The Internet Arcade

Lokalisieren des internen Headers des ROM (LoROM und HiROM).

Jetzt, da wir wissen, ob das ROM einen SMC-Header hat oder nicht, können wir versuchen, den internen Header zu lokalisieren. Erinnern Sie sich noch einmal daran, dass der interne Header und der SMC-Header verschiedene Dinge sind.

Dieser interne Header kann sich in zwei verschiedenen Offsets befinden, je nachdem, ob es sich um ein ROM-ROM oder ein HiROM handelt. Bevor wir den Offset des internen Headers bestimmen, müssen wir daher feststellen, ob es sich um ein LoRom-ROM oder ein HiROM handelt.

Die Standardoffsets für den Header sind:

  • LoROM: 0x7FC0
  • HiROM: 0xFFC0

Diese Offsets werden verschoben, wenn das ROM den SMC-Header enthält , da sich am Anfang der Datei 512 Byte befanden. Im Fall eines SMC-Headers sind die Offsets:

  • LoROM: 0x81C0
  • HiROM: 0x101C0

Um festzustellen, ob es sich um HiROM oder LoROM handelt, müssen wir die Checksumme und das ChecksumCompliment berechnen. Wir berechnen die Checksumme und das ChecksumCompliment als wäre es ein LoROM (mit Offset 0x7FC0). Wenn beim Vergleich der beiden Prüfsummen mit dem Operator ^ (bitweises Exklusiv-ODER) das Ergebnis 0xFFFF , liegt ein ROM-ROM vor.

Wenn das Ergebnis des vorherigen Vergleichs nicht 0xFFFF , müssen wir den Vorgang wiederholen, aber diesmal die Checksumme und das ChecksumCompliment so berechnen, als wäre es HiROM (mit Offset 0xFFC0).

Mit diesem Schritt wissen wir bereits, ob es sich bei einem ROM um ein HiROM oder ein LoROM handelt, und daher, wo sich der interne Header befindet.

Extrahieren Sie die Header-Informationen aus einem SNES-ROM.

Nachdem wir den Header gefunden haben, müssen wir die Informationen verarbeiten, um die Daten leserlich zu extrahieren.

Es sind genau die Informationen, die wir aus dem internen Header eines SNES-ROMs extrahieren können. Als nächstes werden wir jeden Abschnitt im Detail sehen, aber wir werden damit beginnen, die verschiedenen Informationsabschnitte aufzulisten, die wir extrahieren können:

  • Kassettenname
  • ROM Makeup Byte (auch ROM Layout genannt) .
  • ROM-Typ (auch ROM-Typ genannt) .
  • ROM-Größe (auch als ROM-Größe bezeichnet) .
  • SRAM-Größe (auch SRAM-Größe genannt) .
  • Ländercode (auch als Ländercode bezeichnet) .
  • Lizenzcode
  • Kassettenversion (auch Versionsnummer genannt) .

Kassettenname

Der Name der Kassette gibt den Namen des Videospiels oder manchmal eine Abkürzung an, da er auf 21 Byte (21 Zeichen) begrenzt ist. Der Name wird in der Regel in Großbuchstaben geschrieben, ist jedoch nicht obligatorisch. Man könnte sagen, dass es der interne Name des ROM ist.

See also  So verwenden Sie die neuen Emoticons für iOS 9.1 auf Android

ROM Makeup Byte (auch ROM Layout genannt).

Es ist ein Byte, das uns sehr interessante Informationen über das ROM zeigt. Ausgehend von der Tatsache, dass ein Byte aus 8 Bits besteht, könnten diese 8 Bits sagen, dass sie dem Muster 001A0BCD folgen, wobei:

  • Wenn D = 0 ist LoROM und wenn D = 1 ist HiROM.
  • Wenn C = 1 ist ExLoROM.
  • Wenn B = 1 ist ExHiROM.
  • Wenn A = 1 FastROM ist und wenn A = 0, kann man sagen, dass es SlowROM ist, obwohl der Name von SlowROM nicht verwendet wird.

ROM-Typ (auch ROM-Typ genannt).

Dieses Byte bestimmt, ob der ROM RAM, SRAM oder Enhancement Chips verwendet. Wir müssen dieses Byte im hexadezimalen Format auswerten und anhand seines Wertes wissen, um welchen ROM-Typ es sich bei der Verwendung von RAM, SRAM oder Chip handelt.

Für Fälle, in denen kein Enhancement Chip verwendet wird , können die folgenden Hexadezimalwerte verwendet werden:

  • 0x00 : Nur ROM
  • 0x01 : ROM + RAM
  • 0x02 : ROM + RAM + SRAM

In Fällen, in denen das ROM einen Erweiterungschip enthält , müssen beide Zeichen des Hexadezimalwerts überprüft werden. Das erste Zeichen gibt den Typ des von der Super Nintendo-Patrone verwendeten Enhancement-Chips an. Folgende Möglichkeiten stehen zur Verfügung:

  • 0x0* : DSP
  • 0x1* : SuperFX
  • 0x2* : OBC1
  • 0x3* : SA-1
  • 0x4* : S-DD1
  • 0xE* : Andere
  • 0xF* : Benutzerdefinierter Chip

Das zweite Zeichen gibt an, ob ROM, RAM oder SRAM verwendet werden sollen. Die Möglichkeiten in diesem Fall sind:

  • 0x*0 : ROM
  • 0x*1 : ROM + RAM
  • 0x*2 : ROM + RAM + SRAM
  • 0x*3 : ROM + Enhancement Chip
  • 0x*4 : ROM + Enhancement Chip + RAM
  • 0x*5 : ROM + Erweiterungschip + RAM + SRAM
  • 0x*6 : ROM + Enhancement Chip + SRAM

Wenn der ROM-Typ beispielsweise 0x14 , sehen wir uns mit ROM + Enhancement Chip (SuperFX) + RAM konfrontiert.

Ein weiteres Beispiel für 0x42 : ROM + Enhancement Chip (S-DD1) + RAM + SRAM.

See also  Chrono Trigger Analyse für Super Nintendo (SNES)

ROM-Größe (auch als ROM-Größe bezeichnet).

Die Bitgröße des ROM. Es ist ein Byte, das wir hexadezimal auswerten müssen, und wir können die interne Größe des ROM anhand der folgenden Werte ermitteln:

  • 0x08 : 2Mbit
  • 0x09 : 4Mbit
  • 0x0A : 8 Mbit
  • 0x0B : 16Mbit
  • 0x0C : 32 Mbit
  • 0x0D : 48Mbit

SRAM-Größe (auch SRAM-Größe genannt).

Die Bitgröße des von der Kassette verwendeten SRAM. Es ist ein Byte, das bei der Auswertung seines Hexadezimalwerts die interne Größe des SRAM ergibt:

  • 0x00 : Die Kassette verwendet kein SRAM
  • 0x01 : 16 Kbit
  • 0x02 : 32 Kbit
  • 0x03 : 64 Kbit
  • 0x04 : 128 Kbit
  • 0x05 : 256 Kbit

Ländercode (auch als Ländercode bezeichnet).

Dieses Byte bestimmt die Region, in der die Kassette vermarktet wird. Es ist keine sehr relevante Tatsache, aber die Regionscodes, die ich gefunden habe, sind:

  • 0x00 : Japan
  • 0x01 : USA
  • 0x02 : Europa
  • 0x03 : Swenden
  • 0x04: Finnland
  • 0x05 : Dänemark
  • 0x06 : Frankreich
  • 0x07 : Niederlande
  • 0x08 : Spanien
  • 0x09 : Deutschland
  • 0x10 : Italien
  • 0x11 : China
  • 0x12 : Indonesien
  • 0x13 : Korea

Lizenzcode

Es ist ein Byte, das uns den Namen der Firma mitteilt, die die Lizenz für das Videospiel besitzt. Diese Lizenzcodes sind nicht relevant und einige können sogar falsch sein, da die Informationen knapp sind.

Dieses Byte wird hexadezimal ausgewertet und beispielsweise entspricht der Wert 0x01 der Firma Nintendo.

Kassettenversion (auch Versionsnummer genannt).

Es ist ein Byte, das die interne Versionsnummer der Kassette angibt. Diese Daten haben keine Bedeutung, da sie in den meisten Fällen nicht verwendet werden.

Anwendung SNES ROM HEADER ANALYSIS.

Es ist eine kleine Anwendung, um alles Gelernte in die Praxis umzusetzen. Es ist vollständig für didaktische Zwecke programmiert und kann nur verwendet werden, wenn die in den internen Headern der SNES-ROMs enthaltenen Daten lesbar dargestellt werden.

Es ist in C # mit .Net Framework 4 programmiert (dieses Framework muss auf Ihrem Windows-Betriebssystem installiert sein, damit das Programm ausgeführt werden kann) . Sie können die Anwendung von diesem Link herunterladen.

Letzte Überlegungen.

Dieses Dokument wurde mit dem Ziel verfasst, die Programmierung für die Super Nintendo- Videokonsole (SNES) den neuen Benutzern zur Verfügung zu stellen. Die meisten Informationen wurden aus verschiedenen Quellen gesammelt und mit der Anwendungsprogrammierung implementiert. Ich hoffe es hilft allen Super Nintendo Fans.

administrator

Leave a Reply

Your email address will not be published. Required fields are marked *