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

    • Offizieller Beitrag

    Ich glaube das hat damit zu tun, dass es früher verschiede Backup Stationen gab. Es gibt ja zum Beispiel nicht nur smc sondern auch fig roms.


    Nezüglich des findens von Texten, wo ich nicht weiss wo dieser im ROM ist. Nehmen wir mal an ich kann die table nicht herausfinden aber will tracken woher im ROM der Text geladen wird um ihn auf diese art und weise zu finden. Ich geh jetzt mal davon aus, dass das Spie keine Huffman codierung aller som2 oder SO hat. Des Weiteren habe ich auch Probleme sachen zu tracen wie Menüs. Sprich wenn ich Start drücke und sich das Menü bei Zelda öffnet, muss ich das doch auch rausbekommen wo er ansetzt, oder?


    Gruß


    red

    • Offizieller Beitrag

    Red hat da schon recht der Header ist nur dazu da um Informationen zu speichern von der Kopierstation. Da steht drin wann wie und mit was es Kopiert wurde (also: ein Header hat nix mit dem eigentlichem Spiel zu tun, deswegen ist er auch immer entfernt bei: NoIntro zb. Das Problem ist wenn man angefangen hat etwas zu übersetzen mit Header dann brauch man ihn leider auch fürs Patchen ... :(

  • "Das Problem ist wenn man angefangen hat etwas zu übersetzen mit Hader dann brauch man ihn leider auch fürs Patchen ... :("
    Tool schreiben was alle Patch-Offsets - 512 Byte kalkuliert ;P



    "Sprich wenn ich Start drücke und sich das Menü bei Zelda öffnet, muss ich das doch auch rausbekommen wo er ansetzt, oder?"
    Puh, das ist nicht einfach, ich hoffe ich hab's verstanden: Für solche Sachen die du nicht IN der ROM findest, musst du schauen was in den RAM geschrieben wird, zumindest da sollte der derzeitige Screen teilweise/ganz gespeichert sein, der VRAM beginnt glaube ich im ZSNES Savestate bei 0x20C13 (32768 Bytes lang), ich bin mir aber nicht sicher, frag mich jetzt nicht wie du das im VRAM abfangen kannst, $7E:xxxx und $7F:xxxx ist für den RAM, normal sollte man das da abfangen können...


    Was Hufman angeht, Infos sind sehr willkommen, das ist eine Art Kompression die ich garnicht in meinen Kopf bekomme (Noch nicht)


  • Was Hufman angeht, Infos sind sehr willkommen, das ist eine Art Kompression die ich garnicht in meinen Kopf bekomme (Noch nicht)


    Du meinst das Grundprinzip des Huffman-Verfahrens? Das kann ich gerne erklären, wenn du willst. Das ist eigentlich relativ einfach.


    Die Header sind wirklich Relikte von Kopierstationen. Da hat man bei der Hardware-Entwicklung etwas geschlampt. Hätte man dort etwas mehr Aufwand betrieben, hätte man sie gar nicht gebraucht und man müsste sich heutzutage nicht damit rumärgern.

    • Offizieller Beitrag

    Jein, hast es fast verstanden.


    Also Grundsätzlich ist ja jedes Menü im ROM irgendwo mit meistens 2Bytes angegeben. Genau so wie ich es bei Zelda PW doku beschrieben habe.
    Wenn ich nun start drücke, dann läd er mir ja alles aus der ROM in den VRAM. Das klar. Wie ich das heraus bekomme weiss ich auch ;) Zumindest meistens.


    Aber die Routine... wenn ich auf Start drücke und das Menü erscheint muss ja aus dem ROm auch ein LDA kommen oder etwa nicht?


    Gruß



    red

  • ich habe dein Tutorial jetzt Schritt für Schritt nachgemacht und es hat am Ende geklappt, nachdem ich den Header gelöscht hatte.


    Was ich noch nicht ganz verstehe ist, wie du kurz vor dem Ende, hier:


    "Ä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."


    auf die BF 00 80 20 kommst. Ich hab jetzt rumgeknobelt, wenn ich $20:8000 rückwärts lese, dann komme ich ja auf diesen Wert. Ist das des Rätsels Lösung oder muss ich den Wert irgendwie berechnen?


    Denn als ich das mit dem "Rückwärts-Lese-Prinzip" eingesetzt hatte, war beim Abspielen der ROM im Emulator an der entsprechenden Stelle zwar nicht mehr der Ursprungstext, der neu editierte (der in die neue Bank verschobene) aber auch nicht, sondern die Text-Fenster sind gleich wieder zu gesprungen, ohne dass irgendwas angezeigt wurde. Oder liegt das daran, dass die entsprechenden Pointer noch nicht in die neue Bank rüberkopiert wurden...


    Viele Fragen von mir, ich weiß. Wenns dir zu viel wird, dann lass dir ruhig Zeit mit dem Antworten! :)

    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)

  • RedScorpion: Also die Sache mit Zelda muss ich mir mal morgen anschauen, wäre gut zu wissen was du genau machen möchtest.


    x5t: Das "Rückwärts-Lese-Prinzip" ist richtig, das nennt man "Little Endian", dann gibt es noch "Big Endian" wo alles von links nach rechts gelesen wird,
    benutz am besten Lunar Adress 0x100000 in der ROM im Hexeditor/SnesEdit ergibt als Bank Adresse $20:8000


    20 80 00 ist umgedreht 00 80 20


    Mit den Pointern hat das übrigens nichts zu tun, die werden von einer anderen Funktion geladen, wenn es garnichts anzeigt hast du irgendetwas übersehen, vielleicht von der falschen Adresse kopiert?


    Unser neue Rombank bei 0x100000 sollte mit dem Text "Can' carry!" anfangen
    Der Satz "Creq: Captain Cecil....." sollte bei 0x100290 stehen
    Also von 0x80400 nach 0x100000 kopieren

  • Zur Huffman-Codierung:


    Ganz grob geht es darum Zeichen, die sehr häufig vorkommen kurze Codes, also Bitfolgen, zuzuweisen. Dabei ist wichtig, dass jede Bitfolge eindeutig ist. Man merkt also schon, dass die Kompressionsrate sehr stark von der Wahrscheinlichkeitsverteilung der Buchstaben abhängt.
    Um nun herauszufinden welchem Buchstaben welche Bitfolge zugewiesen wird, listet man alle vorkommenden Buchstaben und deren Häufigkeiten auf. Die Häufigkeiten werden die Blätter unseres Baumes, der Buchstabe wird einfach ein Kommentar. Nun fängt man an jeweils 2 Häufigkeiten miteinander zu verbinden und zwar immer die mit den kleinsten Häufigkeiten. So geht man nun rekursiv vor, bis man an der Wurzel angelangt ist. Man hat nun einen Binärbaum konstruiert. Wenn man nun die jeweils linken Kanten mit 0 und die jeweils rechten Kanten mit 1 beschriftet, bekommt man den Bistring heraus zu welchem jeder Buchstabe codiert wird.
    Die Decodierung geht dann so vor, dass man die Zeichenfolge, also den Bitstream, Bit für Bit einliest und je nachdem, ob es eine 0 oder eine 1 ist, biegt man im Baum links oder rechts ab. Ist man bei einem Blatt angekommen, hat man ein Zeichen dekodiert und kann es ausgeben. Man fängt dann wieder bei der Wurzel des Baumes an und wiederholt diesen Prozess, bis die Zeichenfolge komplett dekodiert ist.
    Das ganze kann man zum Beispiel hier interaktiv ausprobieren: http://wwwlehre.dhbw-stuttgart…_arb/huffman/huffman.html
    Diese Seite erklärt die Huffman-Codierung ausführlich und verständlich: http://www.iti.fh-flensburg.de…/code/huffman/huffman.htm
    Das Problem beim Romhacking ist dann, dass man irgenwie die Häufigkeiten der Zeichen herausfinden muss, um einen solchen Baum aufstellen zu können, sodass man dekodieren kann. Da kann man z.B. die Häufigkeiten der Buchstaben der Quellsprache versuchen oder aber schauen, ob man diese Informationen irgendwo im Rom durch Tracing findet.


    NB: Wer aufgepasst hat, hat bemerkt, dass es mehr als einen möglichen Baum geben kann, wenn einige Zeichen gleich häufig sind.


    Ich hoffe das hat etwas weitergeholfen. Ansonsten einfach konkrete Fragen stellen und ich versuche darauf einzugehen.


  • hat funktioniert, danke! Allerdings nur bei FF2, alle meine Versuche, dieses Prinzip auf andere ROMs zu übertragen sind kläglich gescheitert und ich hab irgendwann entnervt aufgegeben ;) . naja, jetzt beschäftige ich mich erstmal mit den Grundlagen von Pointern, da gibt es auch noch viel zu lernen! :)

    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)

  • Löööl ich hab mich damals im Abi die ganze Zeit gefragt wieso wir im Informatik Leistungskurs den unbedingt theoretisch die Huffmann-Kodierung können müssen und unzählig viele Bäumchen auf Papier gemalt haben. Selbst in der Abi Abschlussprüfung kam das vor.


    Und siehe da jetzt ergibt es Sinn ;) Huffmann is ja ne recht einfache Lösung Text platzsparend zu verstauen, man muss nur das Bäumchen zum lesen haben :)


    PS: Step by Step Tuts mit Bildern sind cool, wär echt geil wenn hier quasi für viele Grundlagen schöne Tuts zum nachbauen geben würde, easy going step by step

    • Offizieller Beitrag

    Frage zu Debuggern:
    Wie kann ich die ROM Adresse heraus bekommen, wenn ich weiß dass der VRAM (Adresse: E400) das Ziel ist.



    Das weiß ikari vermutlch am Besten. Ich hab noch nie so wirklich verstanden wie das Tracen funktioniert. Komm einfach mal in snesfreaks irc channel.


    Wenn du oben bei uns in den Chat gehst dann einfach "/j #snesfreaks" und Enter drücken (Ohne die "") :D


    Mfg


    red