Präambel
Ich finde die Art und Weise, wie Beckenrand-schwimmer mein Netzteil auseinandernimmt und es hier dokumentiert beispielhaft. Ich dachte, ich gebe auch mal etwas zurück und dokumentiere hier den Weg, den ich für mich gefunden habe, eine Reproduktion eines SNES-Games zu erstellen. Sensible Teile spare ich dabei aus. Ich weiss, es tangiert den Hauptzweck des Boards nur peripher (man riecht auch hier Lötdämpfe), aber vielleicht interessiert es den einen oder anderen, bzw. gibt einen Jumpstart. Verbesserungen oder Detailfragen diskutiere ich gerne.
Zweck des Dokumentes
Ich versuche anhand eines Beispieles den Weg vom ROM-File zum fertigen SNES-Cartridge zu beschreiben, wie ich ihn mir aus diversen Quellen im Netz konsolidiert und vereinfacht habe. Ich hoffe, das ist für den einen oder anderen interessant, und entzaubert den Vorgang ein bisschen.
Warum
Ich bin ein Retro Gamer. Und was könnte mehr Retro sein, als physikalische Konsolen und physikalische Medien wie Cartridges? Leider sind die Preise für SNES-Spiele in den letzten Jahren in so astronomische Höhen geschnellt, dass der Start oder die Erweiterung einer Sammlung unverhältnismässig kostspielig ist.
Ich erstelle mir eigene Repros, mit Platine, Plastikhülle und passendem Aufkleber. Soweit die Vorgeschichte.
ROM finden
Ogott, es geht schon los mit einem Kapitel, wo ich nebulös bleibe, aus Gründen. Wie ihr das ROM-File aufspürt ist eurer Kreativität überlassen.
Ihr sucht ein File, das *.sfc oder *.smc heisst. Meines heisst jetzt mal tutorial_rnh.smc
ROM identifizieren
Ich versuche zu identifizieren, wie es aufgebaut ist, dabei hilft mir das Internet. Ich finde über das Modul heraus: LoRom, 32MBit, keine Spezialchips, es hat eine Batterie und SRAM um Spielstände zu speichern. Gut, kann ich. Je nach Bauart des Moduls nehme ich ein anderes PCB als Grundlage bzw. setzte die Jumper anders.
Hat es einen Spezialchip, ist es für mich aussen vor - andere können dies, Stichwort Spender-Modul.
ROM testen
Ich besitze ein Super-NT, ein in einen FPGA gegossenes SNES. Nach einem Firmware-Flash kann ich via SD-Karte Games zocken. Ich bin kein Fan davon (100 Fantastilliarden Games im direkten Zugriff überfordern mich), aber zum Testen ist es super. Variante B wäre ein SNES-Emulator um herauszufinden, ob das File was ihr da habt binärer Unsinn oder ein ROM-Abbild des Spieles ist, das ihr gerne physikalisch hättet. Emulation ist für diesen Post aber out of scope.
ROM aufbereiten
Hat man sich die Images für die Spiele, die man in ein physikalisches Cartridge verwandeln will erst einmal beschafft, beginnt der Spiessrutenlauf, unzählige Windows-Tools von dubiosen Seiten herunterzuladen, die die Images nach und nach in einen Zustand versetzen, den ein EEPrommer tatsächlich versteht.
Die Schritte sind:
- Überprüfen der Checksumme
- Entfernen unnützer Header
- Etwaiges Padden auf ein Vielfaches von 8MBit
- Anpassen der Checksumme
- Splitten in 4MBit Häppchen
Einen jedem dieser Tools ist gemein, dass sie teils uralt, teils buggy, aber immer umständlich bedienbar sind.
Ich habe das ganze jetzt auf ein Tool reduziert, ergänzt um Linux Hausmittel, alles als Alias in meine Shellconfig verpackt und kann jetzt via snes_go32 tutorial_rnh.smc alles mundgerecht für meinen EEPrommer aufbereiten.
# SNES ROM hacking
# brew install ucon64
# brew install coreutils
alias snes_check="ucon64"
alias snes_pad16="ucon64 --nbak --padn=2097152"
alias snes_pad32="ucon64 --nbak --padn=4194304"
alias snes_fix="ucon64 --nbak --chk"
alias snes_transfer="cp *.sfc_00* /Volumes/FVGT/__TRANSFER"
alias snes_clean="rm -f *.sfc_00*"
function snes_split() {
prefix="$1_";
gsplit -a3 -d -b 512k $1 $prefix;
}
function snes_go16() {
snes_pad16 $1 > /dev/null;
snes_fix $1 > /dev/null;
snes_split $1;
}
function snes_go32() {
snes_pad32 $1 > /dev/null;
snes_fix $1 > /dev/null;
snes_split $1;
}
Alles anzeigen
Ich erspare mir nervtötende Minuten und den Wechsel auf eine Windows Maschine.
Und einen weiteren Vorteil hat das ganze auch noch: es werden Segmente mit einem Zähler als Suffix generiert. Dieser bei 0 startende Zähler hilft mir bei der richtigen Konfiguration meines Flashers. Dort sind 3 Dipschalter zu setzen, das erste Segment flasht man in der Stellung 0-0-0.
Das Zwischenergebnis stellt sich jetzt so dar.