SETVBLV
From Atariki
Wersja z dnia 19:25, 26 gru 2006
Procedura służąca do ustawianie wektorów przerwań, głównie przerwania VBL. Punkt wejścia znajduje się pod $E45C.
Wstęp
Przyczyną, dla której wektorów VBL nie należy ustawiać wprost, to znaczy sekwencją rozkazów LDA/STA/LDA/STA, jest to, że w ten sposób można zmienić tylko pół wektora (jeden bajt) na raz. Jeśli między przestawieniem jednego bajtu a przestawieniem drugiego wystąpi przerwanie, komputer "pójdzie w maliny", na ogół zawieszając się mniej lub bardziej malowniczo.
Z kolei wyłączanie przerwań NMI na czas ingerencji w wektory VBL ma dwie wady:
- rejestr NMIEN jest tylko do zapisu, więc zmieniwszy go nie możemy odtworzyć jego stanu
- "ręczne" przestawienie wektora z wyłączaniem i ponownym włączaniem NMI zajmuje aż 22 bajty, podczas gdy wywołanie SETVBLV tylko 9.
Użycie procedury
SETVBLV przyjmuje parametry w rejestrach procesora. Są to:
- adres procedury, jaką ma wskazywać wektor przerwania (Y/X - młodszy/starszy bajt)
- numer wektora w akumulatorze
Przed wywołaniem, jeśli program po zakończeniu się ma wracać do DOS-u, dobrze jest przechować pierwotną wartość wektora celem przywrócenia jej przed zakończeniem programu.
Wymieniony wyżej "numer wektora" to nie adres, ale jego numer kolejny licząc od wektora VIMIRQ ($0216), albo inaczej mówiąc, liczony od tego wektora offset podzielony przez dwa. Sens mają następujące wartości wpisywane do akumulatora:
- $00 - VIMIRQ ($0216)
- $01 - TIMCNT1 ($0218)
- $02 - TIMCNT2 ($021A)
- $03 - TIMCNT3 ($021C)
- $04 - TIMCNT4 ($021E)
- $05 - TIMCNT5 ($0220)
- $06 - VVBLKI ($0222)
- $07 - VVBLKD ($0224)
- $08 - TIMVEC1 ($0226)
- $09 - TIMVEC2 ($0228)
TIMCNTx to nie wektory, tylko liczniki zliczające wstecz (od zadanej wartości do zera), zamiast adresu należy dla nich podać wartość początkową.