Per chi volesse avere un'idea di cosa succede nella macchina non c'e' niente di
meglio che contare i ciclozzi
Il gestore di interrupt viene eseguito dopo 38-41 cicli (29 cicli per determinare la
sorgente dell'interrupt a $ff48,da sommare a 7 cicli per salvare sulla pila registri
e indirizzo di ritorno e a un numero compreso tra 2 e 5 cicli per terminare
l'esecuzione dell'istruzione prima della generazione dell'IRQ).
irq ;ciclo
dec $d019 ;44-47
nop ;timing 46-49
jsr frame;timing 58-61 <-- 12 cicli (6 x jsr+6 x rts)
jsr frame;timing 7-10
another
ldy #$00 ; 9-12
gc
ldx #$08 ;11-14
gcl
;--- *badline:CPU ferma* ---
lda colors,y ;58
sta $d020 ;62
sta $d021 ; 3 <-- linea 51
iny ; 5
dex ; 7
beq gc ; 9
lda frame;timing 13
jsr frame;timing 25
jsr frame;timing 37
jsr frame;timing 49
cpy #endcolors-colors ;51
bcc gcl ;54
jmp $ea31
Dai commenti si può notare come la prima scanline che viene colorata è la 51,perchè quando la routine viene chiamata il raster si trova ben oltre la metà della scanline 50.
Ogni 63 cicli esatti (la durata di una scanline nel sistema video PAL) si ripete il ciclo
gcl,ma quando il registro x si azzera il raster si trova su una badline,per cui la CPU deve lasciar perdere il delay (le quattro istruzioni dopo
beq gc ) altrimenti,dopo essere rimasta in interdizione per ben 40 cicli,$d020-$d021 verrebbero modificati ben oltre la metà della scanline succesiva (con conseguente spettinamento).
jmp $ea31 forza l'esecuzione dell'IRQ standard;al contempo non disturba in nesun modo la routine perchè viene eseguita fuori dalla zona video manipolata.