Hi,
ich versuche mich gerade daran einen stabilen Rastenzeileninterrupt hinzubekommen. Soweit so gut, nun wollte ich damit eine wirklich komplett durch gezogene einzelne Rasterbar von exakt ganz links nach genau ganz rechts programmieren und bekomme das nicht hin. Immer ragt eine Stückchen in einen andere Zeile. Bei dem Beispiel hier ist sogar ein einzelner Punkt ganz links zu sehen. Ich dachte immer so ein Umschalten der Farbe geht nur Taktweise und ein Takt entspricht 8 Pixel?
Könnte da jemand bitte Licht in mein dunkles kaputtes Hirn bringen?
Code
- ;////////////////////////////////////////////////////////////
- ; Doppelter/Stabiler Rasterzeileninterrupt
- ;////////////////////////////////////////////////////////////
- *=$0801
- !word next
- !word 2020
- !byte $9E
- !text "2061"
- !byte 0
- next
- !word 0
- RASTERLINE = 30
- sei ; IRQs verbieten
- lda #$7f ; Alle IQRs zum Loeschen auswaehlen
- sta $dc0d ; CIA1 Interrupts löschen
- sta $dd0d ; CIA2 Interrupts löschen
- lda $dc0d ; eventuell in der Luft haengende CIA1 IRQs bestaetigen
- lda $dd0d ; eventuell in der Luft haengende CIA2 IRQs bestaetigen
- lda #1
- sta $d01a ; Raster IRQ erlauben
- lda #RASTERLINE ; In dieser Zeile
- sta $d012 ; RasterIRQ scharf schalten
- lda #$1b ; Bit 7 ist das 9.Bit der Rasterstrahlenzeile hier 0
- sta $d011
- lda #$35 ; CPU sieht kein BASIC und KERNAL ROM mehr, sondern nur noch
- sta $01 ; RAM und den IO-Bereich $d000-$dfff für die Custom ICs
- ; Adresse der Interrupt Routine setzen
- lda #<irq1
- sta $fffe
- lda #>irq1
- sta $ffff
- cli ; Interrupts wieder erlauben
- - jmp -
- ; hier sind 9-16 Zyklen vergangen
- irq1
- sta restore+1
- stx restore+3
- sty restore+5
- lda #<irq2
- sta $fffe
- lda #>irq2
- sta $ffff
- lda #RASTERLINE+1
- sta $d012
- asl $d019 ; IRQ bestaetigen
- tsx ; Stackpointer in x sichern, damit der zweite IRQ
- ; die Ruecksprungadresse und das Statusbyte von diesem IRQ bekommt
- cli ; Interrupt im Interrupt erlauben. Bei jedem Eintritt in eine
- ; IRQ Routine werden automatisch weitere IRQs verboten durch
- ; das Setzen des Interrupt Flags im Statusregister. Das wird
- ; hier durch den Befehl cli aufgehoben
- nop
- nop
- nop
- nop
- nop
- nop
- nop ; 63-70 Zykeln vergangen
- irq2
- txs ; Stackpoiter aus IRQ1 setzen, damit wird beim Verlassen
- ; dieses Interrupts die gesicherte Ruecksprungadresse und das Statusbyte
- ; aus IRQ1 benutzt, da ja der Stackpointer auf dieselbe Adresse zeigt wie in
- ; IRQ1
- lda #<irq1
- sta $fffe
- lda #>irq1
- sta $ffff
- lda #RASTERLINE; Wieder in der Zeile von IRQ1 eine Rasterline IRQ ausloesen
- sta $d012
- asl $d019 ; IRQ bestaetigen
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- lda #1
- sta $d020 ; Farbe weiß
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- nop
- dec $d020 ; Farbe schwarz
- nop
- nop
- nop
- restore
- lda #0
- ldx #0
- ldy #0
- rti