Programowanie: Czekanie na vblank przy wyłączonym systemie: Różnice pomiędzy wersjami

Z Atariki
Przejdź do nawigacji Przejdź do wyszukiwania
Nie podano opisu zmian
Mono (dyskusja | edycje)
m e
 
(Nie pokazano 3 wersji utworzonych przez 2 użytkowników)
Linia 1: Linia 1:
{{SDU}}
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.
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.
 
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
  bpl *-3
  bne *-3
</pre>
</pre>


Ma ono tę zaletę, że można je wpleść w główną pętlę kodu tak, aby wyeliminować aktywne czekanie.
Jeśli nie zależy nam na precyzji i nie musi to być początek pierwszej linii skanningowej, wtedy można zastosować uproszczoną wersję:


Można użyć wersji bez użycia akumulatora:
<pre>
lda VCOUNT
bne *-3
</pre>
 
Przykład bez użycia akumulatora:


<pre>
<pre>
bit VCOUNT
bpl *-3
  bit VCOUNT
  bit VCOUNT
  bmi *-3
  bmi *-3
bit VCOUNT
bpl *-3
</pre>
</pre>
Początek VBLANK w ośmiobitowym Atari zachodzi zawsze w 248 linii skanningowej 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>
Ta metoda zadziała tylko kiedy obsługa przerwania VBLK jest zablokowana w rejestrze NMIEN.
[[Kategoria: Niezbędnik kodera]]

Aktualna wersja z 28 lut 2025, 06:36

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 skanningowej 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.