Programowanie: Czekanie na vblank przy wyłączonym systemie
From Atariki
Wersja z dnia 11:28, 26 lis 2021 Jhusak (Dyskusja | wkład) (Dodano nowy artykuł) ← Previous diff |
Aktualna wersja Mono (Dyskusja | wkład) (poprawki i nmist) |
||
Linia 1: | Linia 1: | ||
- | Oczekiwanie na vblank przy wyłączonym systemie nie jest takie trywialne. Systemowe przerwania są wyłączane, aby np. nie przeszkadzały np. w odgrywaniu sampli, lub innych zadań o nadzwyczajnym rygorze czasowym. | + | Gdy przerwania systemowe lub system są wyłączone, oczekiwanie na VBLANK nie może polegać na odczytywaniu najmłodszego bajtu RTCLOK ($14), gdyż ten nie jest wtedy aktualizowany. |
- | Zaradzić może poniższe rozwiązanie składającie się z dwóch pętli i używa licznika linii obrazu VCOUNT ($D40B). | + | |
+ | W takim przypadku można użyć rejestru VCOUNT który bez względu na obecność systemu zawiera wartość wskazującą na aktualnie kreśloną linię ekranu (podzieloną przez 2). | ||
+ | Kiedy linia ta wynosi 0, oznacza to że jesteśmy na górze ekranu, zaraz po 'powrocie plamki', ale jeszcze przed wykonaniem przez ANTIC pierwszego rozkazu [[Display List]]. | ||
+ | |||
+ | Przykład: | ||
<pre> | <pre> | ||
lda VCOUNT | lda VCOUNT | ||
- | bmi *-3 | + | beq *-3 |
lda VCOUNT | lda VCOUNT | ||
+ | bne *-3 | ||
+ | </pre> | ||
+ | |||
+ | Jeśli nie zależy nam na precyzji i nie musi to być początek pierwszej linii skanningowej, wtedy można zastosować uproszczoną wersję: | ||
+ | |||
+ | <pre> | ||
+ | lda VCOUNT | ||
+ | bne *-3 | ||
+ | </pre> | ||
+ | |||
+ | Przykład bez użycia akumulatora: | ||
+ | |||
+ | <pre> | ||
+ | bit VCOUNT | ||
bpl *-3 | bpl *-3 | ||
+ | bit VCOUNT | ||
+ | bmi *-3 | ||
+ | </pre> | ||
+ | |||
+ | Początek VBLANK w ośmiobitowym Atari zachodzi zawsze w 248 linii skanningowj ekranu niezależnie od systemu TV, więc można poczekać na właściwą linię: | ||
+ | |||
+ | <pre> | ||
+ | lda #[248/2] | ||
+ | cmp VCOUNT | ||
+ | bcc *-3 | ||
+ | cmp VCOUNT | ||
+ | bcs *-3 | ||
+ | </pre> | ||
+ | |||
+ | albo skorzystać z flagi wystąpienia przerwania VBLK: | ||
+ | |||
+ | <pre> | ||
+ | sta NMIRES | ||
+ | bit NMIST | ||
+ | bvc *-3 | ||
</pre> | </pre> | ||
- | Ma ono tę zaletę, że można je wpleść w główną pętlę kodu tak, aby wyeliminować aktywne czekanie. | + | Ta metoda zadziała tylko kiedy obsługa przerwania VBLK jest zablokowana w rejestrze NMIEN. |
+ | |||
+ | [[Kategoria: Niezbędnik kodera]] |
Aktualna wersja
Gdy przerwania systemowe lub system są wyłączone, oczekiwanie na VBLANK nie może polegać na odczytywaniu najmłodszego bajtu RTCLOK ($14), gdyż ten nie jest wtedy aktualizowany.
W takim przypadku można użyć rejestru VCOUNT który bez względu na obecność systemu zawiera wartość wskazującą na aktualnie kreśloną linię ekranu (podzieloną przez 2). Kiedy linia ta wynosi 0, oznacza to że jesteśmy na górze ekranu, zaraz po 'powrocie plamki', ale jeszcze przed wykonaniem przez ANTIC pierwszego rozkazu Display List.
Przykład:
lda VCOUNT beq *-3 lda VCOUNT bne *-3
Jeśli nie zależy nam na precyzji i nie musi to być początek pierwszej linii skanningowej, wtedy można zastosować uproszczoną wersję:
lda VCOUNT bne *-3
Przykład bez użycia akumulatora:
bit VCOUNT bpl *-3 bit VCOUNT bmi *-3
Początek VBLANK w ośmiobitowym Atari zachodzi zawsze w 248 linii skanningowj ekranu niezależnie od systemu TV, więc można poczekać na właściwą linię:
lda #[248/2] cmp VCOUNT bcc *-3 cmp VCOUNT bcs *-3
albo skorzystać z flagi wystąpienia przerwania VBLK:
sta NMIRES bit NMIST bvc *-3
Ta metoda zadziała tylko kiedy obsługa przerwania VBLK jest zablokowana w rejestrze NMIEN.