Udało mi się usunąć problem i zmieniam HSCROL na przerwaniach bez zwisu :)
Zła wiadomosc jest taka, ze mimo przeprowadzenia 23 testów wciąż nie wiem jednoznacznie co było przyczyną problemu.
XXL zasugerował ze moze to byc miejsce w pamieci gdzie są procedury przerwan. Jakub sugeruje zbyt długie albo zle skonstruowane przerwania. Seban - problem Antica z obsluga zapisu do HSCROL w przerwaniach.
A mi wychodzi z testów ze to musi byc splot kilku z tych czynnikow, a do tego jeszcze jeden najważniejszy: konstrukcja DL (tryb, zmiany trybow, przerwania, scrolle).
Krótko: problem ustąpił kiedy dodalem dodatkowe przerwania linii specjalnie do wykonania w nich zmiany HSCROL, oraz usunąłem w DL z linii w której wywołuję przerwanie znacznika scrolla poziomego ($10).
Akurat moglem sobie pozwolic na te zmiany. I muszą byc obie zeby nie bylo smieci na real Atari.
A teraz wyjasniam, czemu pisalem, ze dalej nie wiem co bylo przyczyną.
Używam trybów tekstowych (mieszanka $02 i $04).
Mam kilka przerwań linii. Kazda linia ma swoja procedurę do obsługi. Wewnątrz procedury przerwania nastepuje przekierowanie wektora VDSLST na kolejną procedurę i tak w kółko. Nie są długie. Najdłuższa wyglądała mniej więcej tak:
dli_3
php
sta dli_uni2
lda HSCROL_2
sta WSYNC ;wait__line
sta HSCROL
lda #KOL_1_tlo
sta COLPF1
lda #KOL_2
sta COLPF2
lda #>dli_1
sta VDSLST+1
lda #<dli_1
sta VDSLST
lda dli_uni2
plp
rti
W mojej grze muszę 2x zmienić HSCROL w czasie rysowania obrazu.
Jak powiedzialem dodalem dwa specjalne przerwania linii tylko dla tych zmian.
I z ostatniego testu wyszło mi coś dziwnego.
Jeśli fragment DL wygląda tak, to program działa poprawnie:
dta $44+$10, a(pamiec_ekranu+40+88*3)
dta $44+$80,a(pamiec_ekranu+40+88*4) ;na tym przerwaniu jest tylko zapis do HSCROL
dta $44+$10,a(pamiec_ekranu+40+88*5)
a jesli ten fragment wygląda tak, to juz grafika na ekranie się chrzani dokumentnie:
dta $44+$10, a(pamiec_ekranu+40+88*3)
dta $44+$10+$80,a(pamiec_ekranu+40+88*4) ;na tym przerwaniu jest wylacznie zapis do HSCROL
dta $44+$10,a(pamiec_ekranu+40+88*5)
Czyli jedyne co sie zmienilo to to czy w linii w ktorej jest przerwanie jest włączony scroll czy nie. Nie zmieniły sie ani procedury przerwań, ani ich położenie w pamięci, nic kompletnie oprocz jednego bitu :)
Ta procedura przerwania wywolywana w tej linii wyglada tak:
dli_11
php
sta dli_uni2
lda HSCROL_1
;wait__line
sta WSYNC
sta HSCROL
mwa #dli_2 VDSLST
lda dli_uni2
plp
rti
Trudno o cos prostszego.
A czemu napisalem ze to dziwne i niejednoznaczne? Bo drugie miejsce w DL gdzie zmieniam na przerwaniach HSCROL wygląda tak:
dta $02+$10+$40+$80, dta a(linia_3) ;na tym przerwaniu jest tylko zapis do HSCROL
dta $42+$10+$80,a(pamiec_ekranu+40+88*8) ;a na tym tylko zmiana 2 kolorow
I w tym wypadku zadne zmiany nie byly potrzebne! Ten kawałek działa niezaleznie czy w pierwszej linii jest włączony scroll (+$10) czy nie.
I dlatego wlasnie dalej nie wiem od czego dokladnie zalezy ze moj program na real Atari dziala :P