Stunde 30
Disassembled: 3.668 / 1.048.576 Bytes (0,350%)
Gehört: I am Spartacus - Forward!
Diese Stunde nur mal gucken. Und verstehen.
~~~
Huch, habe ich doch glatt einen JSL-Befehl übersehen. Glücklicherweise ist die Subroutine schon disassembled.
~~~
Wir erinnern uns an mein "$0440 + $6FE"? Ich Dulli, ich! Es ist vielmehr ein $0440 + [$6FE], und [$6FE] = $0000, zu Beginn. So, äh, wünscht man sich das...
...?
~~~
Streicht den nachfolgenden Punkt, siehe unten.
Jetzt fällt mir gerade erst auf, wie geschickt das hier ist:
Code: Alles auswählen
REP #$20.b
LDA $00.b
STA $0441.w, X
LDA $02.b
STA $0443.w, X
LDA $05.b
STA $0446.w, X
LDA #$0000.w
SEP #$20.b
Auch wenn A = 16 bit ist, werden immer nur Bytewerte hineingelesen. Zur Info: Es wird jedes mal vor einem SEP #$20 eine 16-Bit-Null in den Akkumulator geladen, damit so kein Tinneff passieren kann. Aber so werden jetzt mindestens eins, zwo, drei Cycles gespart. Pro Aufruf, versteht sich.
~~~
Hah, kultig, wie alles in einandergreift. Offenkundig ist die Variable $06FE der "Pointer" für den nächsten freien DMA-Slot in der "DMA-Pipeline" ab $0440. Das muss ich jetzt alles nur irgendwie in der File vermerken. Auf Englisch. :-/

~~~
Okay. Das hier ist, was ich mal zur Diskussion stellen möchte (erst der Code, dann meine Interpretation):
Code: Alles auswählen
StatChanger:
LDX #$6800.w
LDY #$3000.w
STZ $4200.w ; Disable Interrupts
STZ $212C.w ; No BGs or Sprites on Mainscreen
LDA #$80.b
STX $00.b ;
STY $05.b
STA $2100.w
LDX #$2FFF.w
LDA #$00.b
ClearPartOfWRAM:
STA $7FB000.l, X
DEX
BPL ClearPartOfWRAM
LDX #$B000.w
STX $02.b
LDA #$7F.b
STA $04.b
JSL Shiftling.l ; $008956 = $0000:0956
JSL VRAM_DMA.l ; $008AA2 = $0000:0AA2
RTL
; ROM: $0000:0956
Shiftling:
SEP #$20.b
LDX $06FE.w
LDA #$FF.b
STA $0440.w, X
LDA $04.b
STA $0445.w, X
REP #$20.b
LDA $00.b
STA $0441.w, X
LDA $02.b
STA $0443.w, X
LDA $05.b
STA $0446.w, X
LDA #$0000.w
SEP #$20.b
INX
INX
INX
INX
INX
INX
INX
INX
STZ $0440.w, X
STX $06FE.w
RTL
VRAM_DMA:
LDX #$0000.w
CheckForNextVRAMDMA:
LDA $0440.w, X
BEQ NoMoreVRAMDMA ;$0000:0AE0
LDA #$80.b
STA $2115.w ; VRAM transfer increment after writing to $2119
LDY $0441.w, x
STY $2116.w
LDA #$01.b
STA $4370.w
LDA #$18.b
STA $4371.w ; DMA to $2118.w (VRAM)
LDY $0443.w, X
STY $4372.w
LDA $0445.w, X
STA $4374.w
LDY $0446.w, X
STY $4375.w
LDA #$80.b
STA $420B.w
INX
INX
INX
INX
INX
INX
INX
INX
BRA CheckForNextVRAMDMA
; Next is $0000:0AE0
NoMoreVRAMDMA:
STZ $0440.w
LDX #$0000.w
STX $06FE.w
STX $13FE.w
RTL
These: "StatChanger" transferiert die komplette Bank $7F (minus zwei Bytes) in den VRAM.falsch
StatChanger macht zwischendrin noch irgendwas mit den DP-Registern $00-$07, was aber hier nicht genutzt wird (außer $04).
falsch
StatChanger macht die Lichter aus (STZ $4200, STZ $212C, FBLANK mittels #$80 --> $2100) und cleart den Teil vom RAM von $7FB000 bis $7FFFFF. Vielleicht wird der von anderen Subroutinen als Zwischenspeicher benutzt, keine Ahnung.
Danach wird die Variable $04 mit #$7F gefüllt und es geht zum "Shiftling".
"Shiftling" dient der Vorbereitung der Register für VRAM_DMA. Es wird $06FE in X geladen, um als variabler Teil des Offsets (oder wie man das nennen will) zu dienen. Dann werden die Register der Pipeline für VRAM_DMA befüllt. $0440 ist ein Byte-großer Bit, der Ein/Aus-Schalter für VRAM_DMA (ungleich $00 bedeutet "ein"). Variable $04 kommt in $0445, das ist die Source Data Bank. Das ist auch der einz-
-Oh, shit.
Da ist ja gar keine Raute vor dem $02.
Ich...
... muss nachdenken.
~~~
Gut, ich bin wieder da, ich habe mich wieder gefangen.
These: "StatChanger" transferiert $7F:B000 bis $7F:FFFF in den VRAM (von $6800 bis $97FF).
...
Ich schaue gerade in den Init-Teil, und stelle Fest, das wird sogar genutzt, ey! Ab $6800 liegt BG1 Tilemap und die anderen beiden in $800er-Schritten (wie ich den vorigen Begriff sinnhaft verbal aussprechen sollte, ist mir schleierhaft). Ich schätze, da die Tilemaps auch mal größer sein könnten, wird deshalb prophylaktisch $3000 statt der hier nur benötigten $1800 transferiert / gecleart.
Da ich den Dingens hier verstanden habe, werde ich das jetzt nicht so detailliert erklären, wie ich es vorhatte.
StatChanger bereitet die Variablen $00 bis $06 vor ($07 kommt gar nicht vor), Shiftling schmiert das in die VRAM_DMA-Pipeline $0440 bis $0447 (der letzte Teil deaktiviert nur einen etwaig nachfolgenden DMA im zweiten Pipeline-"Slot" ab $0448), und VRAM_DMA macht einen VRAM-DMA.
Dementsprechend werde ich jetzt einiges kommentieren können. Und ein bisschen was auch umbenennen.
Stunde rum, Resümee:
Ich habe Kopfschmerzen.
Das Arbeiten mit so vielen Fenstern macht mich ein wenig irre. Außerdem hatte ich ein wenig an "StatChanger" zu knacken, bis da bei mir der Groschen auf die richtige Art und Weise gefallen ist. Ferner glaube ich, werde ich jetzt gut eine Stunde damit beschäftigt sein, allein die ganzen Variablennamen richtig zu setzen...
... aber ich will meine mentalen Kapazitäten nicht hierrauf verwenden, sondern auf das Projekt selbst. Horrido.