Yello!
Mam pewną procedurkę w VBL'u, która rysuje co ramkę coś na ekranie, tyle że podczas wyświetlania pojawiają się pewne drobne niepożądane efekty.
Korzystam z trybu GTIA - 80x59, 16 odcieni i po cztery linie o tym samym adresie. W pewnych miejscach (okolice środka ekranu) szwankuje synchronizacja i domyślam się że przyczyną jest moje (niewłaściwe?) podejście do VBL'a. Ustawienie adresu procedury wygląda tak:
lda 20
cmp 20
beq *-2
sei
lda #0
sta $d40e ;wyłączamy nmi
lda #$fe
sta $d301 ;wyłączamy OS
lda #<nmi
sta $fffa
lda #>nmi
sta $fffb ;adres przerwania
lda #$40
sta $d40e ;zezwalamy tylko na vbl
I po tym następuje już tylko:
loop jmp loop
I odtąd praktycznie działa już tylko przerwanie. Wygląda tak:
_day ldy #0
jsr efekt
inc _day+1
rti
Efekt jest więc liczony podczas powrotu pionowego, podczas którego jeśli dobrze rozumiem, Antic czeka aż VBL zakończy działanie. VBL się kończy, Antic przystępuje do wyświetlania linii, a w tym czasie program nie modyfikuje zawartości ekranu, dlaczego więc w pewnych miejscach niektórych linii pojawia się coś np. takiego:
01 43 [>]12 21 23[<] 13 ... etc, aż do czterdziestego bajtu \
01 43 [>]34 44 51[<] 13 ... etc >4 linie o tym samym adresie
01 43 [>]86 00 64[<] 13 ... etc /
01 43 [>]11 21 23[<] 13 ... etc /
hm?
I jeszcze jedno: kiedy obciążę tą procedurkę graficzną trochę bardziej, to przez kilka(-naście,-dziesiąt,-set, zależnie od obciążenia) pierwszych ramek norma jest wyrabiana, a potem procedura przerwania zdaje się nie móc dobrnąć do końca.
Co należy zrobić żeby wyeliminować usterki?