Dom's Advanced SNES ROM Utility

  • Hallo zusammen,


    aus Spaß an der Freude und um meinen eigenen Horizont in Sachen SNES-Technik zu erweitern habe ich die letzten Wochen über an einem kleinen ROM-Tool gearbeitet, welches ich einfach mal frech "Advanced SNES ROM Utility" getauft habe :party: Klar gibt es sicherlich Tools die mehr können, aber diese wurden auch über Jahrzehnte von verschiedenen Leuten entwickelt ;)


    Genug der großen Worte...


    Was kann das Tool bisher?

    • Allgemeine Infos über das ROM anzeigen
    • Header hinzufügen
    • Header entfernen
    • ROM Infos editieren / falsche internal ROM size Angaben fixen
    • SwapBin für 8 Mbit oder durch 8 Mbit teilbare ROMs
    • ROM Expanden bis 32 Mbit (bei 64 Mbit wird das ganze leider etwas komplexer)
    • ROMs splitten
    • Interleaved ROMs deinterleaven
    • Eine defekte Checksum reparieren
    • Region locks entfernen
    • Kommt auch mit BS-X ROMs klar


    Was gibt es derzeit zu beachten / Woran wird noch gearbeitet?


    Wie oben schon erwähnt gibt es noch einige Schwierigkeiten beim Expanden auf 64 Mbit... Aber braucht das überhaupt jemand? :/


    Der Code muss noch strukturiert werden... sieht momentan noch aus wie bei Hempels unterm Sofa X/


    Der Gedanke eine IPS-Patching Funktion zu integrieren kam mir noch in den Sinn... Was meint ihr dazu?

    Falls ja, würde ich soetwas aber ganz hinten anstellen.


    Achja, da alles in C# gecoded wurde braucht ihr mindestens das .NET-Framework 4.5.


    Wie kann ich helfen?


    Ganz einfach: testen und berichten! Ich bin über jeden Verbesserungsvorschlag und konstruktive Kritik froh!


    Das Wort zum Schluss:


    Bei Fragen einfach melden! Ich helfe euch selbstverständlich sehr gerne weiter.


    Passwort zum entpacken: snes-projects.de


    Und natürlich um mich abzusichern: Die Benutzung der Software geschieht natürlich auf eigene Gefahr!


    P.S.: RedScorpion Sobald das Tool die ROM types und den SRAM zuverlässig erkennt darfst du es gerne in die Datenbank aufnehmen, wenn du das magst ;)

  • Dom

    Added the Label [Tools]
  • Nette Sache. Was mich immer nur stört ist, dass SwapBin nur für 27C801 bzw. 8Mbit funktioniert.

    Wenn ein ROM z.B. 1.5MB hat, wird es nicht klappen. Das hatte ich beim anderen SNES Utility auch.

    In diesem Fall wäre sinnvoll das ROM auf die nächste volle MB (in diesem Fall 2MB) automatisch zu expandieren und dann SwapBin anzuwenden.

    Was hälst du von diesem Vorschlag? :)

  • Da fällt mir ein, es gibt auch einen Hirom-> Lorom konverter für Spiele. Hab ich mal auf ultimate console gesehen!

    Müsste ich mir mal ansehen... Sollte aber, ähnlich dem SwapBin, über ein Vertauschen der Banks möglich sein :/

    LoROMs bestehen imho aus 32 kB und HiROMs 64 kb Banks. Werde das die Tage mal prüfen ;)


    Ich fände es schön wenn du bei der Größe diese Infos beachtest:

    https://de.wikipedia.org/wiki/Binärpräfix

    Dachte das hätte ich bereits? Generell schreibe ich die Einheiten gerne aus (bits / Bytes), damit es zu keinen Verständnisproblemen beim User kommt.

    In diesem Fall wäre sinnvoll das ROM auf die nächste volle MB (in diesem Fall 2MB) automatisch zu expandieren und dann SwapBin anzuwenden.

    Was hälst du von diesem Vorschlag? :)

    Das hatte ich bereits so ähnlich drin, glaube aber, dass das bei einigen ROMs zu Problemen mit den Checksums geführt hatte :/

    Du musst erstmal manuell auf die gewünschte Größe Expanden, dann das expandierte ROM nochmal laden, schauen ob die Checksum noch in Ordnung ist (ggf. fixen und das gefixte ROM nochmal laden) und dann den SwapBin durchführen.

  • Was mich immer nur stört ist, dass SwapBin nur für 27C801 bzw. 8Mbit funktioniert.

    Nachtrag, hatte ich übersehen...

    Das SwapBin ist ausschließlich beim 27C801 möglich, da die anderen EPROMs wie 27C4001 etc. einen anderen Aufbau besitzen.

    Es können weniger Banks intern getauscht werden, wodurch immer noch ein nahezu gleichbleibender Aufwand beim Rewiring bestehen würde.

  • Das ist mir bewusst, dass es nur mit dem 27C801 funktioniert, habe mich da etwas falsch ausgedrückt.

    Wollte da eigentlich nur drauf hinaus, dass es mit ungeraden Größen wie z.B: 1.5MB nicht funktioniert und daher expandiert werden muss.


    Habe es bisher eh immer so gehandhabt, dass ich die ROMs expandiert habe, dann Checksum gefixt und ggf. dann SwapBin angewendet, wenn nötigt. ;)


    Ich hatte mal ein Programm von den Franzosen um LoROM <-> HiROM, aber finde es leider nicht mehr.

    Wenn die Spiele kein RAM haben reicht ja es den EPROM wie folgt zu verkabeln:


    HiROM auf LoROM:

    EPROM A15 auf Cart Connector 40 (A15)

    EPROM A16 auf MaskROM Loch A15

    EPROM A17 auf MaskROM Loch A16

    EPROM A18 auf MaskROM Loch A17

    EPROM A19 auf MaskROM Loch A18


    LoROM auf HiROM:

    EPROM A15 auf MaskROM Loch A16

    EPROM A16 auf MaskROM Loch A17

    EPROM A17 auf MaskROM Loch A18

    EPROM A18 auf MaskROM Loch A19

    EPROM A19 auf MaskROM Loch A20


    Demnach müsste eigentlich alle Banks die A15+ betreffen verschoben werden. Wie genau, keine Ahnung. Aber vielleicht hilft es.

  • Habe noch ein Tool, mit dem man Offsets von Lo- in HiROM umrechnen kann und andersrum.

    Deine Tabelle ist schon mal ein guter Anfang würde ich sagen, danke! :*

    Ich nehme an, dass als EPROM hier der 27C801 anzunehmen ist,, oder?


    Generell werde ich jedoch erst zusehen, dass ich alle Region locks hinbekomme und der ROM type / SRAM richtig interpretiert und angezeigt wird.

    Danach kann man dann an die Implentierung der Hi- <-> LoROM Konvertierung gehen, aber ich bin sicher, dass das zu machen ist.

  • Jo, genau. Habe den 27C801 hierfür genommen.


    Hab schon gemerkt, dass ROMs mit Spezialchip nicht richtig dargestellt werden. Hier mal eine Liste an Hexwerten, die dir behilflich sein könnten.


    $00=ROM

    $01=ROM+RAM

    $02=ROM+RAM+Battery


    $03=ROM+DSP1 (Wenn HiROM)

    $03=ROM+DSP4 (Wenn LoROM)


    $04=ROM+DSP1+RAM


    $05=ROM+DSP1+RAM+Battery (Wenn HiROM)

    $05=ROM+DSP2+RAM+Battery (Wenn LoROM)

    $05=ROM+DSP3+RAM+Battery (Nur bei SD Gundam GX)


    $13=ROM+MarioChip1
    $14=ROM+GSU1+RAM
    $15=ROM+GSU2+RAM+Battery

    $1A=ROM+GSU1+RAM+Battery

    $25=ROM+OBC1+RAM+Battery

    $34=ROM+SA1+RAM
    $35=ROM+SA1+RAM+Battery

    $43=ROM+S-DD1
    $45=ROM+S-DD1+RAM+Battery

    $55=ROM+S-RTC+RAM+Battery
    $E3=ROM+SGB
    $E5=ROM+BS-X

    $F3=ROM+CX-4


    $F5=ROM+SPC-7110+RAM+Battery (Wenn HiROM)

    $F5=ROM+ST-018+RAM+Battery (Wenn LoROM)


    $F6=ROM+ST-011

    $F9=ROM+SPC-7110+RTC+RAM+Battery


    Das sind die Werte im ROM Header bei $7FD6 (LoROM) bzw $FFD6 (HiROM)

  • Hab schon gemerkt, dass ROMs mit Spezialchip nicht richtig dargestellt werden. Hier mal eine Liste an Hexwerten, die dir behilflich sein könnten.

    Auf diese Schlampigkeit hatte ich ja hingewiesen: :saint:

    Die Erkennung des ROM types ist noch etwas schlampig ^^

    Aber danke mal für die Auflistung der einzelnen Codes :thumbup:


    Ich versuche das derzeit nicht über eine simple switch case Anweisung, sondern über das Interpretieren und Zusammenfügen des entsprechenden Bytes, weshalb das noch nicht 100%ig funktioniert... Aber wenn deine Tabelle tatsächlich vollständig ist und stimmt würde ich die gerne übernehmen :S

    Derzeit sieht das in etwa so bei mir aus:



    Ist keinesfalls sonderlich schön, noch komplett :rolleyes:

  • Interessantes Thema, vielen Dank dafür!

    Meine Lieblings SNES-RPGs:


    1. Lufia II
    2. Final Fantasy VI
    3. Terranigma, Seiken Densetsu III
    4. Tengai Makyō Zero, Dragon Quest III SNES-Remake
    5. Star Ocean, Shiren the Wanderer
    6. Chrono Trigger
    7. Final Fantasy V, Magical Land of Wozz
    8. Seiken Densetsu II, Zelda: A Link to the Past


    Lieblings-Charaktere: Terra & Shadow (FF 6), Tia & Dekar (Lufia), Carlie (Seiken III), Subaru (TMZ), Schala (CT)

  • Interessantes Thema, vielen Dank dafür!

    Sehr gerne! Danke auch für dein Interesse :)


    Update: Das Tool sollte nun so gut wie alle Reion locks aufspüren und vernichten können :saint:

    Habe das natürlich an einer Hand voll ROMs verifiziert, sollte aber passen.

    Download wurde entsprechend aktualisiert! Ab jetzt mit Versionsnummer ^^

  • Ah bezüglich Region Locks. Ich glaube uCON macht das auch....ABER... es elimiert so ziemlich alles was nach "3F 21" aussieht, leider eben auch nicht Region Locks.


    Wichtig hierbei ist glaube ist, dass man nach "AD 3F 21" bzw "AF 3F 21 00" sucht.

    Hast du das in etwa so gemacht?


    Und ja, die ROM Type Liste ist komplett. ;)

  • Ah bezüglich Region Locks. Ich glaube uCON macht das auch....ABER... es elimiert so ziemlich alles was nach "3F 21" aussieht, leider eben auch nicht Region Locks.


    Wichtig hierbei ist glaube ist, dass man nach "AD 3F 21" bzw "AF 3F 21 00" sucht.

    Hast du das in etwa so gemacht?

    So ähnlich... Ich habe die ganzen Codes aus dem Quelltext vom uCON64 (ab Zeile 1999) gezogen, aber das Verfahren dazu selbst entwickelt. Hierbei pflege jeweils für PAL und NTSC Spiele 3 Listen, welche 1 x den locking Code, 1 x den unlocking Code und 1 x das Pattern zum Ersetzen beinhalten. Die locking Codes werden über das Pattern gesucht und der unlocking Code an der entsprechend variablen Stelle ergänzt und anschließend wird der locking Code mit dem erstellten unlocking Code überbügelt... :wacko:Ich hoffe du kannst das einigermaßen nachvollziehen :saint: Hast du ein Beispiel wo das nicht klappt bzw. wo es Abweichungen zu uCON64 gibt? Würde mir das gerne ansehen.

    P.S.: Bitte beachte, dass es eine neue Version gibt, falls du noch die alte verwendest ;)

    Und ja, die ROM Type Liste ist komplett. ;)

    Super :thumbup:

    Dann würde ich die übernehmen und am Wochenende so implementieren :party:

  • Klar, kannst du gern übernehmen. :)


    Bzgl. des Region Lock:

    Hatte ich mal, aber vergessen welche ROM das war. Gibt ja mehrere mit Region Lock. Ich mach das immer manuell, weil es mehrere Varianten gibt.

    Siehe z.B. Iron Commando (Proto).


    Aber solange es keine Probleme gibt, erstmal belassen. Wenn sich was findet, kann man es nachträglich editieren. ;)

  • Abgesehen davon, dass es ExLoROM offiziell gar nicht gibt, ja. :P Wurde nämlich nur für Hacks/Homebrews eingeführt bei LoROM größer als 4MB.

    Ausschlaggebend ist ja nicht das Mapping des ROM sondern, ob Spezielchips, RAM, etc. vorhanden sind.


    Star Ocean z.B. ist NICHT ExLoROM sondern nur einfach ROM+S-DD1+RAM+Battery (LoROM!)

    Tengai Makyou Zero z.B. ROM+SPC-7110+RTC+RAM+Battery (HiROM!)

  • Abgesehen davon, dass es ExLoROM offiziell gar nicht gibt, ja. :P

    Naja, LoROM und HiROM gibt es ja offiziell auch nicht... das sind nur Szenebegriffe für die verschiedenen ROM layouts :rolleyes:

    Star Ocean z.B. ist NICHT ExLoROM sondern nur einfach ROM+S-DD1+RAM+Battery (LoROM!)

    Den Unterschied hatte ich auch schon festgestellt, aber dennoch befindet sich im Header das Byte, welches es als ExLoROM identifiziert.

    Ich glaub ich gehe da etwas anders vor als die meisten ROM Tools, die einfach nur anhand einer Plausibilitätsprüfung den map mode identifizieren.

    Nach der Plausibilitätsprüfung nehme ich nochmal das entsprechende ROM type Byte, lese das aus und lege dann erst fest, welcher map mode angezeigt werden soll. Wer weiß was nun korrekter ist? :/ Ich halte es jedenfalls für das bessere Vorgehen, da Star Ocean anhand seiner Größe und dem Header Offset ja auch ein ExLoROM ist. Oder sehe ich das falsch?