Sodele, jetzt hab' ich wieder Zeit und inzwischen dein Programm auch verstanden.
Zuerst einmal zu den Badlines: Das sind immer die obersten Zeilen eines 8er-Blocks. Der VIC muss ja wissen, welche Zeichen in dieser Textzeile dargestellt werden sollen, und die normalen Zugriffszeiten reichen dafür nicht aus, weshalb er den Prozessor kurzerhand abschaltet und sich die Zeichen aus dem Speicher holt, wenn eigentlich der Prozessor dran wäre.
Was dich (und wohl auch ogd oben) vermutlich hierbei verwirrt hat, sind die Sprites: Die werden nämlich eine Zeile weiter unten dargestellt. Ein Sprite mit Y-Position 226 beginnt also erst in Rasterzeile 227.
Jetzt zum Timing deines Programms. Ich hab' das mal schematisch dargestellt:
Bitte melde dich an, um diesen Anhang zu sehen.
Am Anfang von Rasterzeile 126 wird ein IRQ ausgelöst (möglicherweise auch schon einen Taktzyklus vorher, bei den IRQs bin ich mir immer nicht so ganz sicher...) Es dauert aber noch mindestens einen Taktzyklus, bis der Prozessor das bemerkt, also in Taktzyklus 1 in Zeile 126. Dann wird erst noch der aktuell bearbeitete Befehl abgearbeitet. Im Diagramm bin ich davon ausgegangen, dass da gerade in Taktzyklus 1 ein Befehl geendet hat. Das muss aber nicht so sein, im blödsten Fall muss man (ich glaube) noch 8 Taktzyklen warten. Das Maximum erreicht man aber nur mit illegalen Opcodes. Soweit ich weiß kann man in der Praxis davon ausgehen, dass es maximal 6 sind.
Dann wird ein spezieller Prozessorbefehl ausgeführt, der den IRQ startet (im wesentlichen ist das der BRK-Befehl). Der dauert 7 Taktzyklen und der Prozessor macht dann mit der IRQ-Routine weiter. Wo man die findet, steht in $FFFE und $FFFF. Normalerweise ist das $FF48. Dort werden erst mal die Register auf den Stack gerettet (PHA TXA PHA TYA PHA) und dann geprüft, ob das ein BRK-Befehl war oder ein IRQ (TSX LDA $0104,X AND #$10 BEQ $FF58). Am Ende folgt dann noch ein indirekter Spung an die Stelle, die in $0314 und $0315 steht.
Erst dann beginnt deine `RasterIRQ`-Routine. In der Grafik habe ich noch markiert, wo die relevanten Speicherzugriffe stattfinden (BG=Hintergrund, MC=Multicolor, CH=Zeichensatz). Wie man sehen kann, wird die Hintergrundfarbe im rechten Rahmen von Zeile 126 geändert und Multicolor im linken Rahmen von Zeile 127.
Der Wechsel des Zeichensatz erfolgt an einer ganz kritischen Position (Taktzyklus 14). Das ist nämlich der Bereich, wo der Prozessor abgeschaltet wird (Badline). Ich bin mir da nicht ganz sicher, aber ich glaube, das ist gerade schon ein Taktzyklus zu spät und der tatsächliche Schreibzugriff erfolgt erst in Taktzyklus 54 im rechten Rahmen von Zeile 127.
Wie schon geschrieben, das ist der Idealfall, wenn die IRQ-Bearbeitung frühestmöglich beginnt. Das ganze Diagramm kann aber um einige Taktzyklen nach rechts verschoben sein, dann bist du mit dem letzten Schreibzugriff definitiv in der Badline drin.