Romhacking (Leicht) - Wie verschiebe ich Daten von einer Rombank in eine andere (SNES)

  • Da das Thema Final Fantasy 2 im Forum aufkam dachte ich mir ich schreibe ein kleines Tutorial wie man Daten in eine andere Rombank schieben und von dort laden kann, besser gesagt einige Sachen manipuliert, was hilfreich ist wenn zum Beispiel nach Text gleich andere Daten kommen, weil wir mit unserer Sprache meist mehr Platz brauchen wie die Japaner/Amerikaner.


    Unser Testobjekt:
    Final Fantasy II (USA) <- "NoIntro" Dump, ohne Header


    Schwierigkeit:
    Sehr einfach


    Was wir verschieben:
    Die Rombank in der der erste Text ist (Zur Erinnerung: "Crew: Captain Cecil, we are about to arrive!.......")


    Was wir brauchen:
    Die ROM "Final Fantasy II (USA)", wo man sie bekommt: Selbst rausfinden ;)
    "Geiger's Snes9x Debugger" http://www.romhacking.net sollte das haben.
    "Lunar Adress und Lunar Expand", gibt's hier
    "SnesEdit", fragt mich nicht woher, ich benutze eine uralte Version die SinaP mir geschrieben hat.
    Etwas Zeit.


    Was ich möchte:
    Das es jeder versteht, das heißt kein Fachchinesisch, sondern in eigenen Worten erklärt.



    Also, hier ist unser Text, ich gehe mal davon aus das jeder weiß wie man ihn findet und eine TBL erstellt!


    Unser Text beginnt an Offset: 0x80690, damit kann der Debugger aber nichts anfangen, wir wandeln diese Adresse in eine "verwertbare" Rombank Adresse um, dazu benutzen wir "Lunar Adress", einfach die ROM laden und das Programm sollte den korrekten ROM Typ von alleine erkennen, unsere Adresse in die linke Textbox eingeben und in der rechten sollte unsere neue Adresse erscheinen -> $10:8690


    Jetzt starten wir den Snes9x Debugger, laden die ROM, die "Debug Console" sollte jetzt erscheinen: Was wir nun machen ist einen "Breakpoint" setzen, das heißt wir füttern den Debugger mit einer Adresse, sobald diese Adresse von IRGENDWO "angesprochen" wird macht der Emulator einen "Break", das heißt er friert das Spiel ein, pausiert es sozusagen.
    Also: Auf "Breakpoints" klicken, in die erste Textbox unsere Adresse eingeben ($10:8690), Häkchen bei "Exec" und "Read" machen, das heißt wenn von unserer Adresse gelesen oder etwas ausgeführt wird, wird das Programm angehalten.
    "Write" benötigen wir wenn wir etwas suchen was in den RAM geschrieben wird, dazu aber etwas in einem anderen Tutorial.


    Jezt auf "Run" klicken und spielen, normalerweise sollte das Spiel NACH der Flugsequenz und BEVOR sich die Texbox öffnet, anhalten:


    Und siehe da: "$00/B2D0 BF 00 84 10 LDA $108400,x[$10:8690] A:0001 X:0290 Y:0000" ist das was für uns interessant ist.


    Zerlegen wir den ganzen Kram mal (Nur Sachen die wir brauchen):
    $00/B2D0<- Unsere Adresse in der ROM von der der Aufruf kam, wenn wir diese Adresse in eine PC-Adresse umwandeln erhalten wir: 0x32D0
    BF 00 84 10 <- Wie diese Funktion als Zahlen in der ROM aussieht


    LDA $108400,x[$10:8690] <- Was diese Funktion bewirkt
    X:0290 <- Uhm *kopf-kratz*


    Auf Deutsch umschrieben heißt das: LaDe $108400 UND X in den Akkumulator, macht $10:8690 als ROM Adresse,
    wandeln wir die ROM Adresse $10:8690" um, erhalten wir die PC Adresse 0x80690
    0x80400 + X = 0x80690


    Damit haben wir unsere Routine die den Text in dieser Rombank lädt gefunden, in der ROM an Adresse: 0x32D0



    Lasst uns jetzt die ROM von 8Mbit auf 12Mbit mit "Lunar Expand" erweitern, wir brauchen ja schließlich Platz :)


    Unsere 4 neuen Rombanks beginnen bei der Adresse 0x100000, die ROM Adresse ist "$20:8000"


    Ihr solltet als erstes eure Daten die ihr wollt dorthin verschieben, das heißt den Textblock von 0x80400 - 0x87FFF (31744 Bytes insgesamt), nach 0x100000


    Jetzt müssen wir dem Spiel sagen von wo es den neuen Text laden soll, erinnert ihr euch? Adresse 0x32D0 in der ROM


    Ändern wir doch mal "BF 00 84 10" zu "BF 00 80 20" ($20:8000 = 0x100000), editieren den Satz "Crew: Captain Cecil, we....... blah, blah" zu irgendetwas anderem.


    Nun schauen uns das Spiel erneut im Emulator an.



    Scheint als wäre dieser kleine Hack erfolgreich gewesen, das Spiel lädt jetzt den Text von unserer neuen Rombank, als kleine Aufgabe könntet ihr ja versuchen die Pointer von diesem Textblock auch zu verschieben.



    Falls es Fragen gibt, etwas nicht verstanden wurde, oder etwas ausführlicher erklärt werden soll editiere ich den Beitrag natürlich gerne: Viel Spa beim ausprobieren

  • manako, du bist der Größte! :D :D :D


    Damit hast du unaufgefordert die Antwort auf mein Problem (siehe Beitrag im Vorstellungsforum) geliefert! Danke sehr, auch wenn du wahrscheinlich gar nicht wusstest, dass ich an diesem Punkt nicht weiter gekommen bin ;) .

    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)

  • Eine Frage habe ich doch noch, auch auf die Gefahr hin, dass es eine blöde Frage ist...


    Wenn ich das ROM vergrößere und den gesamten Text ans Ende stelle, muss ich dann die von dir so ausführlich und gut erkläre Aktion nur einmal ganz am Anfang machen, also an der Stelle wo der gesamte Text beginnt (bei FF4 die Szene auf dem Schiff) oder muss ich diese Aktion für jeden Textblock neu machen (also praktisch nach jeder Sprechblase, wenn ein neuer Text-Dialog folgt)?

    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)

  • Also, erstmal: Blöde Fragen gibt es nicht, nur dumme Antworten (So wie die ^^)


    Nein, nein, dieser kleine Hack funktioniert mit der ganzen Bank, allerdings müsste man das für jeden Textblock der in einer anderen Bank liegt neu suchen, in FF2 wären das dann glaub ich 3 Textblöcke, also auch 3 Hacks.


    Mit "Textblock" meine ich übrigens nicht nur einen Satz, sondern den gesamten Text us der Bank.

    • Offizieller Beitrag

    Eine interessante Sache wäre eventuell, wie es sich verhält wenn ich einen Textstring suche wo ich nicht weiß im Rom wo es steht.
    Ich habe immer das Problem in solchen Situationen, dass ich nicht weiss, was von dem ich mitloge via Trace dann im Endeffekt auch der Textblock ist.


    Gruß


    red

  • Ich verstehe die Frage leider nicht ganz :/
    Wie willst du denn etwas Tracen wenn du nichtmal weißt wo du anfangen sollst?


    Ich weiß nicht ob das hilft: Manchmal Trace ich zwischen 2 Buchtsaben, das heißt ich setzte einen Breakpoint auf den ersten Buchstaben, wen der auslöst setze ich den Breakpoint einen Offset höher und logge das Ganze, was du dann hast ist leider nicht nur die Textsache, sondern auch alles was die CPU noch nebenbei macht, wobei wir wieder bei deinem Problem wären ^^

  • Eine interessante Sache wäre eventuell, wie es sich verhält wenn ich einen Textstring suche wo ich nicht weiß im Rom wo es steht.
    Ich habe immer das Problem in solchen Situationen, dass ich nicht weiss, was von dem ich mitloge via Trace dann im Endeffekt auch der Textblock ist.


    Man könnte doch so die rom vergrößern, den Text nach hinten schieben und so auf eine Komprimierung komplett verzichten, oder? (ist jetzt laienhaft ausgedrückt^^)

  • Außerdem wäre es Platzverschwendung, wenn der alte Platz dann ungenutzt bleibt. Das ist ja im Grunde genommen kein Problem, aber denk mal an Cartmods ;) Außerdem könnte man mit einer besseren Kompressionsmethode in dem alten Platz vielleicht sowieso viel mehr Text unterbringen, was das Erweitern unnötig machen würde.

  • Ja, im Beispiel FF2 ist es denke ich mal auch unnötig, das Spiel benutzt ja schon eine Art Kompression, die müsste ich halt nur optimieren (Natürlich denke ich an die Cartmodder, für euch kommt eine Erweiterung glaube ich wie ein Pfählung vor^^)

  • (Natürlich denke ich an die Cartmodder, für euch kommt eine Erweiterung glaube ich wie ein Pfählung vor^^)


    Hehe, ne ganz so tragisch ist das nicht, wenn es sich in Grenzen hält. Eine Erweiterung von 24Mbit auf 48Mbit halte ich aber sehr übertrieben und unnötig! Im Beispiel von FF5 ist es so das die rom von 16Mbit auf 20Mbit erweitert wurde. Bei 16Mbit währe man mit 2 eproms ausgekommen, bei 20Mbit brauche ich dann 3 eproms (24Mbit Speicher). Das ist von den Kosten absolut zu verkraften, aber der Aufwand beim bau einer Repro steigert sich enorm bei mehr als 2 eproms. Aber letztendlich sehe ich das so, wenn hinterher etwas gescheites bei herrauskommt ist auch das ok ;)

  • Kann es sein, dass der im Tutorial beschriebene Vorgang nur bei ROMs ohne Header funktioniert? Mein Test-ROM hat einen Header und der Debugger läd sie mit dieser Begründung nicht. Oder mach ich irgendwas falsch...

    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)

  • "Unser Testobjekt:
    Final Fantasy II (USA) <- "NoIntro" Dump"


    No-Intro ist immer ohne Header, werde das noch im ersten Beitrag mit reinschreiben, also kein header


    hm OK, danke! Gibts auch ne Möglichkeit, Text in Roms mit Header in eine andere Bank zu verschieben? Oder kann ich den Header einfach löschen, so wie es mir der Debugger vor dem Laden anbietet, ohne die ROM unbrauchbar zu machen? Weil die für mich interessanten ROMs haben irgendwie alle einen Header.


    Wenn das jetzt zu sehr off-topic geht, dann antworte einfach nicht und ich lösche meinen Beitrag hier wieder. ;)

    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)