SETVBLV

From Atariki

Revision as of 19:25, 26 gru 2006; view current revision
←Older revision | Newer revision→
Jump to: navigation, search

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

Personal tools