Stunde 39
Disassembled: 39.460 / 1.048.576 Bytes (3,763%)
Gehört: Kiddos BS-Youtube-Playlists, weil ich endlich die von ihm erwähnte BS-Ihatovo-Monogatari-Werbung finden will
Es wird wohl nicht viel bringen, sich an dem Kompliziertesten bisher zu versuchen, oder zumindest das, was mich am meisten mit Respekt erfüllt, während ich mich nebenbei auf konstantes englisches Gerede zu konzentrieren versuche.
Hm. Tja.
~~~
Ich habe kurz vor dem Ende der letzten Stunde noch etwas interessantes gefunden. So klein, dass ich es übersehen habe. Geklaut von wiki.superfamicom.org:
$2140 = Status
$2141 = Command / Data
$2142-3 = Address
*bäääm*!
~~~
Gut, gehen wirs anders an.
Code: Alles auswählen
SPCIntro2:
PHP ; Push Status Register
REP #$30.b ; AXY = 16
LDY #$0000.w
LDA #$BBAA.w
SPC_BootLoop: ; When #$BBAA appears in $2140, then the SPC is booted
CMP $2140.w
BNE SPC_BootLoop
SEP #$20.b ; A = 8
LDA #$CC.b
BRA SPCIntro3 ; $0005:1FB1
Soweit ist eigentlich alles klar. Y enthält den Counter für diesen ausgefreakten indirekten Lesebefehl und wird auf null gesetzt. A bekommt diesen Signalwert, dass der SPC-Boot abgeschlossen ist, und dann wird der Prozessor solange in einem Loop gehalten, bis das Signal auftaucht. Oookay, soweit.
Dann hauen wir den Akkumulator mit dem Schrumpfhammer und geben ihm ein #$CC. #$CC ist, laut den SPC-Transfer-Tutorials, der Startbefehl, den man immer hineinschreiben muss, um, na ja, das Ding zum Anlaufen zu bringen. #$CC muss zu $2140, dann gehts los.
Code: Alles auswählen
SPCIntro3:
PHA
REP #$20
LDA [$F0], Y
INY
INY
TAX
LDA [$F0], Y
INY
INY
STA $2142.w
SEP #$20
CPX #$0001.w ; Sets Negative-, Zero-, Carry-Flag
LDA #$00.b ; Sets Negative-, Zero-Flag
ROL a ; Rotates the set Carry-Flag into the Accumulator
STA $2141.w
ADC #$7F.b ; If Carry-Flag was set, A=$01 --- $01 + $7F = $80, Overflow-Flag is set, loop will be left
PLA ; Thanks a lot to ikari_01 for his help on this! Otherwise I would have never understood this. >_<
STA $2140.w
RepeatingLoop1:
CMP $2140.w
BNE RepeatingLoop1
BVS SPCIntro4 ; $0005:1F8B
Wir schieben #$CC auf den Stack.
A wird entschrumpft.
Es kommt die Mutter aller Ladebefehle:
$F0-$F2 bilden die Grund-Ladeadresse: Bank $0A, Adresse: $00E4. Y ist ja noch null, folglich wird $00E4 derselben Bank gelesen. Das ist... $1870.
Y wird um zwei erhöht, A in X verschoben.
A: #$1870, X: #$1870, Y: #$0002
Jetzt wird $0E4 + Y = $00E6 in A geladen: #$0700. Y wird zweimal inkrementiert.
A: #$0700, X: #$1870, Y: #$0004
A wird in $2142 gespeichert. $2142 sollen laut obiger Beschreibung die Adressregister sein, also schätze ich mal, dass damit ab jetzt in den SPC-RAM ab $0700 geschrieben wird, woll?
A wird geschrumpft.
Ab jetzt kommt der Teil, den ikari erklärt hat... jetzt wird sich zeigen, dass ich ihn nicht verstanden habe!

Durch den Compare wird das Carry-Flag gesetzt, da X > #$0001 ist. A wird 0 und der Carryflag wird "reingedreht". #$01 wird in $2141 gespeichert (warum, erkläre ich gleich). ADC #$7F wird addiert, A enthält #$80, deshalb wird, wenn ich ikari richtig verstanden habe, der Overflow-Flag gesetzt.
Jetzt wird #$CC geladen und in $2140 gespeichert.
Dann wird im RepeatingLoop1-Solange gewartet , bis er startklar ist, dann wird zu SPCIntro4 gebrancht, da der Overflow ja gesetzt ist.
Kurzer Einschub. Um das SPC zu starten, muss man
zwei Dinge tun. Bei wiki.superfamicom.org wird es so erklärt:
Code: Alles auswählen
LDA #$1CC
STA $2140 ; Write $CC to 2140 and !0 to 2141
Hier passiert dasselbe, nur in zwei Einzelschritte geteilt - zuerst wird !0 in $2141 gespeichert (man musste mir erklären, dass !0 "irgendwas, nur nicht 0" heißt; ich bin ja schließlich kein Programmierer, ich bin ja nur eine TmS), danach kommt der andere Teil. So, springen wir zu SPCIntro4.
Code: Alles auswählen
SPCIntro4:
LDA [$F0], Y
INY
XBA
LDA #$8000.w
PHD
RepeatingLoop3:
XBA
LDA [$F0], Y
INY
XBA
RepeatingLoop2:
CMP $2140.w
BNE RepeatingLoop2
INC a
REP #$20
STA $2140.w
SEP #$20
DEX
BNE RepeatingLoop3
RepeatingLoop4:
CMP $2140.w
BNE RepeatingLoop4
RepeatingLoop5:
ADC #$03.b
BEQ RepeatingLoop5
Ich sollte erst einmal rekapitulieren, was überhaupt in unseren Registern ist.
A: #$77, X: #$1870, Y: #$0004
Es wird Der nächste Wert aus der ROM geladen, A: #$20, Y wird um eins erhöht.
Und ab jetzt wirds wirklich krank. A und B werden getauscht, A und B werden überschreiben, Direct Page wird weggedrückt, A und B werden tauscht... äh?
Anyhow, X ist offensichtlich die Datenmenge, die übertragen werden soll, da X darüber entscheidet, wann der Cycle verlassen werden soll. Also, hoffe ich mal, dass es damit zusammenhängt. Den Rest... finde ich trotzdem seltsam.
Stunde rum, Resümee:
Ich habe das SPC-Getue in mich nicht zufriedenstellendem Maße grob überschauen können. Ich weiß jetzt (bzw. ... eigentlcih behaupte ich das jetzt nur), dass die SPC-Daten wohl einen "Header" haben, der die Menge der zu übertragenden Bytes enthält. Hoffe ich. Als nächstes werde ich mal versuchen, die Daten der Original-ROM zu entnehmen, einzufügen und schauen, ob meine ROM dann läuft...