Ecco qua: chiedo scusa per la rozzezza del codice (sarebbe stato meglio mettere tutto in un loop e fare riferimento a una timing table per i delays..) però cosi' è stato piu' facile fare le prove. sono andato avanti finchè non ho incontrato una badline, e ho cambiato il timing value. poi ho disegnato un ulteriore riga "standard".
;prova doppio interrupt nested
*=$0801
include basicline.s
sei
jsr $e544;screen clear
lda #<irqpre
ldx #>irqpre
sta $0314
stx $0315
lda #$01
sta $d01a ; Turn on raster interrupts
lda #$34
sta $d012
lda #$1b
sta $d011
lda #$7f
sta $dc0d
sta $dd0d
LDA $DC0D; Acknowledge CIA IRQ
LDA $DD0D; Acknowledge CIA NMI
LSR $D019; Acknowledge VIC IRQ
cli
hold
jmp hold
;FINO A QUI X + 7 + 29 cicli.
;ricorda che 2<=X<=9 e X è la
;durata dell'ultima istruzione eseguita
;prima dell'interrupt
;quindi lsr $d019 viene seguita dopo 29+X+7
;caso peggiore 45 cicli, ne ho solo 18
irqpre
lda #<irq ;2
sta $0314 ;4
sta $d019;4 rispetto ad una inc scendo di 2 cicli
inc $d012 ;6
cli ;2
;---FINO A QUI MAX 18 CICLI (cosiderato caso peggiore)
;Aggiungo una serie di nop per "non fare nulla" intanto che
;l'altro interrupt viene eseguito
nop
nop
nop
nop
nop;5 nop per totale di 10 cicli, sono sicuro in tutti i casi
;(considerando anche il caso migliore)
brk
align 2
*=*+1;
;la routine verrà eseguita con un ritardo di 2/3+7+29=38/39 cicli.
irq
nop ;41
nop ;43
nop ;45
nop ;47
nop ;49
bit $24;52
asl $d019;6 = 58
lda #$35 ;2 = 60
cmp $d012 ;4 = 64 - siamo a 0 o 1 cicli
beq start ;3 con questo branch allineo l'ultimo
start ;ciclo di insicurezza
;QUI SIAMO SICURAMENTE a 3.
jsr rasterbars;9
;Tolgo i 6 bytes inseriti nello stack
;facendo push nell'accumulatore 6 volte
pla
pla
pla
pla
pla
pla
ldy #<irqpre;Punto di nuovo al primo interrupt
sty $0314
;rimetto apposto anche il registro $d012
lda #$34
sta $d012
jmp $ea31
rasterbars
lda colors;13
;ora devo perdere tempo in modo da esaurire i 63-(13-4) = 46 cicli
ldx #$09;2 2+2+(x-1)*5+2 => 4+8*5+2 = 46
dex ;2
bne *-1;2/3
;Finisco di disegnare la riga proprio al 63°esimo ciclo
sta $d020;(63) Fine riga
sta $d021;4° ciclo riga successiva
;NUOVA LINEA!
;Ora devo aspettare altri 63-4 cicli prima di
;resettare il colore del background
ldx #$0a;51 stessa formula di sopra
dex
bne *-1
; 51+4=55
;e siamo a... 55
lda colors+2;59
sta $d020;(63) fine riga
sta $d021;4° ciclo nuova riga
;NUOVA LINEA! - mancano 59 cicli
ldx #$0a;51 stessa formula di sopra
dex
bne *-1
lda colors+3
sta $d020
sta $d021
;NUOVA LINEA! - mancano 59 cicli
ldx #$0a;51 stessa formula di sopra
dex
bne *-1
lda colors+4;59
sta $d020;(63) fine riga
sta $d021;4° ciclo nuova riga
;NUOVA LINEA! - mancano 59 cicli
ldx #$0a;51 stessa formula di sopra
dex
bne *-1
lda colors+5
sta $d020;
sta $d021;4° ciclo nuova riga BADLINE
;NUOVA LINEA! BADLINE!! siccome l'ultima istruzione eseguita è una STA allora
; ho solo 22 cicli, di cui 4 ne ho gia consumati. ne restano 18
ldx #$01;6
dex
bne *-1
nop
lda colors+6;10
sta $d020;14
sta $d021;22
;NUOVA LINEA! (non badline)
ldx #$0a
dex
bne *-1
lda colors+5
sta $d020
sta $d021
nop;allineo timings!
ldx #$0a;51 stessa formula di sopra
dex
bne *-1
lda #$0
sta $d020
sta $d021
rts
colors
.byte $06,$02,$03,$04,$05,$08
.byte $07,$08,$04,$01,$00,$06
.byte $0e,$03,$03,$0e,$03,$03
.byte $03,$01,$03,$01,$01,$03
.byte $01,$01,$01,$03,$01,$01
.byte $03,$01,$03,$03,$03,$0e
.byte $03,$03,$0e,$03,$0e,$0e
.byte $0e,$06,$0e,$0e,$06,$0e
.byte $06,$06,$06,$06,$06,$06