Stunde 78
Disassembled: 159.548 / 1.048.576 Bytes (15,216%)
Gehört: unununium88 - Shadowrun Revamp / Washed Out - Within and Without
Diesmal mach ich es komplett anders, nämlich so, wie es mir vor Wochen schon empfohlen wird: Ich nehme den Geiger und logge. Jetzt werde ich das mal abgleichen und hoffen, dass ich sehen kann, wie das Programm verfährt, ob es wirklich sich auf dem Jump Table in einer Endlosschleife verfängt.
~~~
Memo an mich selbst:
Der letzte Punkt vor dem großen Fragezeichen ist $00/EFEC, der erste Punkt danach $0A/9EE4.
Hm. Das ist auf der Sound-Bank.
~~~
Okay, das hilft mir nicht.
Zur Erklärung: Der Geiger-Debugger hat "disassembled mitgeschrieben", was er gemacht hat. Er hat in der Reihenfolge, in der er bestimmte Punkte des Programms absolviert hat, alles in eine Textdatei geschrieben. Dabei schreibt er nur die "erste Begegnung" auf, ansonsten würde er jeden Durchlauf einer Schleife separat erfassen, und das würde diese Datei noch mehr ins unleserliche aufblähen.
Der Teil, der hier erschienen ist, ist nur deshalb hier erschienen, weil beim wiederholten Aufruf einer bereits bekannten Funktion mal die Werte anders waren und dann eben nicht sofort gebrancht wurde, sondern noch ein nach-dem-ersten-Branchen-erfolgender Teil ausgeführt wurde. Das hilft nicht weiter, ich würde gern zumindest wissen, bei welcher Subroutine er dann weitermacht, um am Ende mir zusammenreimen zu können, weshalb das funktioniert.
~~~
Und die Lösung lautet: EDF0.
~~~
BÄÄÄM! Und da steht "F0 ED" in der Jump Table! Bei $43A! BÄÄÄM!
~~~
Öh...
die Differenz von $43A und $38E, dem Anfang der Jumptable, sind $AC. Geteilt durch zwei ist das $56. Häää?
Also:
Jump-Table-Eintrag $54 ist noch okay. Da wird hochgezählt um eins, das heißt, Eintrag $55 wird aufgerufen. Eintrag $55 ist aber vom Inhalt identisch mit $17. Also muss ich noch einmal in Eintrag $17 gucken, ob dort ein fester Wert in den Jump-Table-Pointer eingetragen wird, oder einfach nur inkrementiert wird.
Zu meiner Verteidigung: Anfangs hatte ich mir
wirklich sowas gedacht, weil es ideal ist, so Subroutinen recyclen zu können. Aber leider hatte ich da dann in Eintrag $17 gesehen (geglaubt), dass dort ein fester Eintrag gemacht wird. Ich... muss nachschauen...
~~~
Um es ein- für allemal deutlich zu machen:
Der Split, ob Button pressed oder nicht, findet in JT17 statt. JT18 ist, wenn nichts gedrückt wird, JT19 ist, wenn gedrückt wird.
~~~
Sprach ich davon, dass sich die Logs "unleserlich aufblähen" würden, wenn man nicht bloß die erste Begegnung mitloggt? Ich habe das gerade gemacht. Fünf Sekunden Intro resultieren in 41 Textdateien mit je 5 MB Größe. Holla, die Waldfee.
~~~
Derselbe Abschnitt mit nur-erste-Begegnung-Loggen resultiert in einer Datei mit 50 KB. Noch Fragen?
~~~
Liebe Kinder, es geht vorwärts! Hah!
Mir ist nämlich einer meiner Fehler aufgefallen!
Im VBLANK selbst ist eine eigenständige Jump Table eingebaut, die ich bisher missachtet habe! Vielleicht liegt darin die Lösung.
Es ist eine... interessante Jump Table. Sie ist 9 Byte groß und enthält vier Einträge, wobei es einen Eintrag 0 gibt und denselben Eintrag für 1 bis 3. Der letzte Byte ist ein einfaches "RTS", was... an dieser Stelle keinen Sinn macht, aber egal, es ist da. Mir kommt sogar schon eine Idee, wofür das Ding gut ist... (*guck*)... Nein, schade, so funktioniert das nicht. Es wird die Variable $0100 genutzt.
Okay, und das ist auch seltsam:
Code: Alles auswählen
LDA $0100.b
BMI TakeALongerStayAtVBlank
STZ $0103.w
OneExitOfVBlank:
REP #$38.b
PLD
PLB
PLY
PLX
PLA
RTI
TakeALongerStayAtVBlank:
ASL a
TAX
LDA #$80.b
STA $0100.w
JSR (VeryQuestionableMark, X)
(Wobei die letzte Zeile der Jumptable bezug ist)
Wenn $0100 nicht negativ ist, wird das Ganze beendet ($0103 ist ein Flag für Ende-vom-VBLANK, wenn es $00 ist). Ist $0100 negativ (= $80 bis $FF), wird es ge-ASL-t und in X verschoben, dann wird der Wert in $0100 auf einen negativen Wert gesetzt und schlussendlich die Jump Table benutzt.
Wenn das ge-ASL-t wird, kann ja quasi nur Jump-Table-Eintrag 0 und 2 benutzt werden. Hm. Das würde erklären, weshalb 1 und 3 dasselbe sind: Sie sind wurscht.
Stunde rum, Resümee:
Es gibt einen Ausweg aus der Misere! Vielleicht findet sich so endlich eine Möglichkeit, hier durchzukommen. Klasse!
