Disassemble Blog: Ihatovo Monogatari
Verfasst: 3. Dezember 2012, 20:26
Dieses Board hat zu wenig Thread-Leichen. Also noch eine. Noch ein viel zu enthusiastisches Projekt. Ich nehme mal "Ihatovo Monogatari" komplett auseinander, aber komplett, ey.
Und werde nach jeder Arbeitsstunde einen Bericht schreiben. Einfach so, weil ich so gerne schreibe, und von euch beweihräuchert werde.
Darum starte ich auch ein Projekt, was ich nur machen werde, wenn ich Lust dazu habe. Und wenn ich keine Lust mehr habe, höre ich einfach auf.
Einfach so.
Tja, ja.
Also.
Vorarbeit
Ich habe mir auf superfamicom.org angeschaut, was es für interessante Infos es über das Spiel gibt. Es ist... 8MBit groß, hieß es dort. Also nur zwei Drittel von SoM. Außerdem ist es LoROM. Das ist einmal gut zu wissen, und ein zweites Mal gut, weil ich mit HiROM noch nie gearbeitet habe.
Also bezog ich mir daheim die ROM und war erstaunt: Sie ist nur 600kb groß!
Im Hexeditor angeschaut, sah ich, dass der Letzte Byte bei $000F.FFFF liegt. Das heißt, das Dingens hat 32 Bänke (weil 0 bis F = 16, und 16 mal 2, weil $1.0000 = zwei Bänke).
Meine Güte, das ist ja... ich bin so arrogant zu sagen: Überschaubar.
Desweiteren habe ich schonmal auf den Reset-Vektor geschielt und sehe ein "00 80". Also: Das Spiel fängt am Anfang der ROM an. Okay. Schon. Chic. Fangen wir an.
Stunde 1
Disassembled: 143 / 1.048.576 Bytes (0,013%)
Gehört: Wamdue Project - Resource Toolbox, Volume One
Der erste Byte, den ich nicht verstehe, ist der Dreizehnte. Da steht
Also: Die Direct-Page wird erst mit PLD gesetzt, das heißt, man weiß nicht, wo er das jetzt hinschreibt, weil ja noch sonstwas im Direct Page Register stehen könnte. Deshalb vermute ich mal, das "STY $EF" ist einfach nur, um die Zeit totzuschlagen...?
~~~
Okay, es wird in den Native Mode geswitcht, der Stack Pointer gesetzt, das Direct Page Register gesetzt, Interrupts disabled ($4200), DMA/HDMA ausgeschaltet und in die vier APU-Register geSTZtet. Danach wird eine Subroutine auf Bank 10 ($A) aufgerufen. Interessanterweise geht es nach dem JSL $0A8000 auf Bank 0 gleich weiter mit... "SEI CLC XCE". Komisch. "Alternativer Anfang"?
~~~
Auf Bank $0A werde ich zweimal herumgeschubbst (bzw.: herumgesprungen) und lande schlussendlich vor der SPC-Ini. Ich kann immer noch kein Stück SPC-Programmierung und habe davor immer noch einen Heiden-Respekt, dementsprechend verstehe ihc, worauf es hinausläuft, wenn ich ein "LDX #$BBAA" sehe, und mein Selbstvertrauen in Bezug auf dieses Projekt wechselt dementsprechend sofort den Aggregatzustand.
Glücklicherweise werde ich gleich mit einem "RTS" danach erlöst.
~~~
Puh, this stuff is serious. Reichlich verwirrend, mit vielem gebranche und Gehobse. Und dabei ist das noch die Init!
~~~
Um das Ganze noch komplizierter zu machen, wird jetzt gerade noch ein LDA-Befehl benutzt, den ich vorher nicht kannte. "Indirect Long Indexed, Y". Also... es wird Y als Direct-Page-Offset genutzt, und ein Byte als Adresse auf dieser Direct Page übergeben. Wenn jemand etwas so flexibel schreibt, mag er es entweder unnötig kompliziert, oder wird diese Funktion noch für jeden erdenklichen Mist nutzen. Help.
Stunde um, Resümee:
Ich bin gerade an das Ende einer weiteren Subroutine gekommen, die sich noch um die Initialisierung des SPC kümmert (es werden fleißig die Register $2140 bis $2143 bedient). Bisher verstehe ich das ganze nicht im Detail, und es kommen einige Befehle, die für mich keinen Sinn machen, wo ich nicht weiß, ob mein Disassembler wieder spinnt, oder ob da wirklich Nonsense getrieben wurde, um Prozessor-Cycles vergehen zu lassen (man hätte auch NOP nutzen können, aber es gibt sicherlich andere Befehle, die innerhalb derselben Menge an Speicherplatz, die diese Befehle einnehmen, mehr Cycles verschwendet haben).
Es ist eigentlich egal. Der klare Vorteil, den man hat, wenn man ein Programm disassembled, ist, man kann es beim Neu-Assemblen in der Größe verändern. Dementsprechend ist es auch egal, wenn ich den gesamten SPC-Teil nicht verstehe; Hauptsache, ich tippe ihn richtig ab, dass beim Re-Assemblen alles beim Alten bleibt, und der relevante Teil wird der sein, von dem ich mehr verstehe - die Grafiken.
Mal schauen.
EDIT: Um mich vollends lächerlich zu machen, habe ich mal die Datei nach meinem jetzigen Stand angehängt, sodass alle Super-Programmierer hier sehen können, dass ich so gut wie gar nichts innerhalb einer Stunde disassembled habe!
EDIT 2: Für einen etwaigen Foren-Umzug habe ich hier den Beitrag editiert.
Und werde nach jeder Arbeitsstunde einen Bericht schreiben. Einfach so, weil ich so gerne schreibe, und von euch beweihräuchert werde.
Darum starte ich auch ein Projekt, was ich nur machen werde, wenn ich Lust dazu habe. Und wenn ich keine Lust mehr habe, höre ich einfach auf.
Einfach so.
Tja, ja.
Also.
Vorarbeit
Ich habe mir auf superfamicom.org angeschaut, was es für interessante Infos es über das Spiel gibt. Es ist... 8MBit groß, hieß es dort. Also nur zwei Drittel von SoM. Außerdem ist es LoROM. Das ist einmal gut zu wissen, und ein zweites Mal gut, weil ich mit HiROM noch nie gearbeitet habe.
Also bezog ich mir daheim die ROM und war erstaunt: Sie ist nur 600kb groß!
Im Hexeditor angeschaut, sah ich, dass der Letzte Byte bei $000F.FFFF liegt. Das heißt, das Dingens hat 32 Bänke (weil 0 bis F = 16, und 16 mal 2, weil $1.0000 = zwei Bänke).
Meine Güte, das ist ja... ich bin so arrogant zu sagen: Überschaubar.
Desweiteren habe ich schonmal auf den Reset-Vektor geschielt und sehe ein "00 80". Also: Das Spiel fängt am Anfang der ROM an. Okay. Schon. Chic. Fangen wir an.
Stunde 1
Disassembled: 143 / 1.048.576 Bytes (0,013%)
Gehört: Wamdue Project - Resource Toolbox, Volume One
Der erste Byte, den ich nicht verstehe, ist der Dreizehnte. Da steht
Code: Alles auswählen
LDY #0000.w
PHY
[u][b]STY $EF[/b][/u]
PLD~~~
Okay, es wird in den Native Mode geswitcht, der Stack Pointer gesetzt, das Direct Page Register gesetzt, Interrupts disabled ($4200), DMA/HDMA ausgeschaltet und in die vier APU-Register geSTZtet. Danach wird eine Subroutine auf Bank 10 ($A) aufgerufen. Interessanterweise geht es nach dem JSL $0A8000 auf Bank 0 gleich weiter mit... "SEI CLC XCE". Komisch. "Alternativer Anfang"?
~~~
Auf Bank $0A werde ich zweimal herumgeschubbst (bzw.: herumgesprungen) und lande schlussendlich vor der SPC-Ini. Ich kann immer noch kein Stück SPC-Programmierung und habe davor immer noch einen Heiden-Respekt, dementsprechend verstehe ihc, worauf es hinausläuft, wenn ich ein "LDX #$BBAA" sehe, und mein Selbstvertrauen in Bezug auf dieses Projekt wechselt dementsprechend sofort den Aggregatzustand.
Glücklicherweise werde ich gleich mit einem "RTS" danach erlöst.
~~~
Puh, this stuff is serious. Reichlich verwirrend, mit vielem gebranche und Gehobse. Und dabei ist das noch die Init!
~~~
Um das Ganze noch komplizierter zu machen, wird jetzt gerade noch ein LDA-Befehl benutzt, den ich vorher nicht kannte. "Indirect Long Indexed, Y". Also... es wird Y als Direct-Page-Offset genutzt, und ein Byte als Adresse auf dieser Direct Page übergeben. Wenn jemand etwas so flexibel schreibt, mag er es entweder unnötig kompliziert, oder wird diese Funktion noch für jeden erdenklichen Mist nutzen. Help.
Stunde um, Resümee:
Ich bin gerade an das Ende einer weiteren Subroutine gekommen, die sich noch um die Initialisierung des SPC kümmert (es werden fleißig die Register $2140 bis $2143 bedient). Bisher verstehe ich das ganze nicht im Detail, und es kommen einige Befehle, die für mich keinen Sinn machen, wo ich nicht weiß, ob mein Disassembler wieder spinnt, oder ob da wirklich Nonsense getrieben wurde, um Prozessor-Cycles vergehen zu lassen (man hätte auch NOP nutzen können, aber es gibt sicherlich andere Befehle, die innerhalb derselben Menge an Speicherplatz, die diese Befehle einnehmen, mehr Cycles verschwendet haben).
Es ist eigentlich egal. Der klare Vorteil, den man hat, wenn man ein Programm disassembled, ist, man kann es beim Neu-Assemblen in der Größe verändern. Dementsprechend ist es auch egal, wenn ich den gesamten SPC-Teil nicht verstehe; Hauptsache, ich tippe ihn richtig ab, dass beim Re-Assemblen alles beim Alten bleibt, und der relevante Teil wird der sein, von dem ich mehr verstehe - die Grafiken.
Mal schauen.
EDIT: Um mich vollends lächerlich zu machen, habe ich mal die Datei nach meinem jetzigen Stand angehängt, sodass alle Super-Programmierer hier sehen können, dass ich so gut wie gar nichts innerhalb einer Stunde disassembled habe!
EDIT 2: Für einen etwaigen Foren-Umzug habe ich hier den Beitrag editiert.