MAPA PAMIĘCI
$0200,$0201 |
00512,00513 |
VDSLST |
Wektor przerwania NMI Display List (DLI). Gdy odpowiedni bit recepty dla układu wyświetlającego obraz (DL) jest ustawiony, to może być wywołane przerwanie. Aby uaktywnić ten rodzaj przerwania, należy ustawić 7 bit komórki NMIEN (lokacja 54286 $d40e). System operacyjny nie korzysta z tego przerwania, lecz ustawia ten wektor przy inicjalizacji systemu, aby wskazywał instrukcję RTI. Tak też powinna się kończyć procedura obsługi przerwania DL napisana przez użytkownika. Oto przykładowy przepis instalacji i uruchomienia programu:
1. Ustawić 7 bit w DL, w linii, która ma uaktywniać przerwanie
2. Ustawić wektor VDSLST: 00512 ($0300) na adres początku procedury
3. Upewnić się, że procedura przerwania nie zmienia wartości rejestrów S, A, X i Y, rejestru flag oraz że kończy się ona instrukcją RTI
4. Zezwolić na przerwanie DL poprzez ustawienie komórki NMIEN: wpisujemy tam wartość 192 ($c0).
Przerwanie jest wykonywane przed wyświetleniem linii wywołującej je. Przerwanie Display List Interrupt nie jest blokowane ustawieniem komórki CRITIC (lokacja 00066 $0042), nawet komunikacja z urządzeniami zewnętrznymi nie jest w stanie go zdezaktywować. Zwykle DLI używa się do przełączenia generatora znaków (dzięki czemu na ekranie mamy jednocześnie kilka krojów znaków), do zmiany kolorów, itd. Naciśnięcie klawisza RESET powoduje przywrócenie systemowej wartości wektora VDSLST. Program powodujący wyświetlanie tła ekranu w 2 kolorach (wywoływany z poziomu asemblera):
ORG $600
* Instalacja przerwania
LDA $230 ; Krok pierwszy
STA $CB
LDA $231
STA $CC
LDY #8
LDA ($CB),Y
ORA #$80
STA ($CB),Y
LDA PROC
STA $201
LDA #$CO ; Krok czwarty
STA $D40E
RTS
* Procedura przerwania
PROC PHP
PHA
LDA #0
STA $D018
PLA
PLP
RTI
Program wywoływany z poziomu języka Basic:
10 FOR Q=1536 TO 1580
20 READ A:POKE Q,A
30 NEXT Q
40 I=USR(1536)
50 DATA 173,48,2,133,203,173,49,2,133
60 DATA 204,160,8,177,203,9,128,145
70 DATA 203,169,35,141,0,2,169,6,141
80 DATA 1,2,169,192,141,14,212,104,96
90 DATA 8,72,169,0,141,24,208,104,40,64
Kolejne dwa przerwania wywoływane są przez układ PIA i normalnie nie są wykorzystywane przez system operacyjny (standardowo ich wektory przerwań są ustawiane na adres, pod którym znajduje się rozkaz powrotu z przerwania).
$0202,$0203 |
00514,00515 |
VPRCED |
Wektor przerwania wywołanego przez port A.
$0204,$0205 |
00516,00517 |
VINTER |
Wektor przerwania wywołanego przez port B.
$0206,$0207 |
00518,00519 |
VBREAK |
Wektor przerwania wywołanego przez instrukcję BRK mikroprocesora 6502. Nie jest to wektor obsługi przerwania klawisza BREAK, jak sugeruje to nazwa. System operacyjny ustawia standardowo wektor na adres, pod którym znajdują się instrukcje PLA RTI, czyli rozkazy powrotu z przerwania. Najczęściej tego rodzaju przerwanie wykorzystywane jest do poszukiwania błędów występujących w programie maszynowym. Praktycznie dzieje się to w następujący sposób:
programista tworzy procedurę obsługi przerwania, w której zwykle sprawdza stan rejestrów procesora oraz zawartość niektórych komórek pamięci, następnie ustawia wektor VBREAK wskazujący na tę procedurę, a na końcu wstawia w swoim programie pułapkę BRK. Należy pamiętać, że przerwanie powinno kończyć się rozkazami PLA RTI. Uwaga: Niektóre programy użytkowe, nn. Quick Assembler posiadają własną obsługę przerwania BRK.
$0208,$0209 |
00530,00521 |
VKEYBD |
Wektor przerwania klawiatury. Przerwanie takie jest wywoływane po naciśnięciu dowolnego klawisza za wyjątkiem klawisza BREAK. Również klawisze konsoli nie powodują wywołania tego przerwania. Przerwanie klawiatury może być używane np. do obsługi pewnej kombinacji klawiszy, której system operacyjny nie obsługuje. Przykładowo z przerwania tego korzysta wspaniały program XLFriend, którego programy są wywoływane kombinacją klawiszy Shift/Option/1-4.
Kolejne trzy wektory przerwań kontrolują transmisję danych poprzez port szeregowy. Wektory te są wykorzystywane przez SIO, przerwania są wywoływane przez układ POKEY.
$020a,$020b |
00522,00523 |
VSERIN |
Wektor przerwania szeregowego portu wejścia/wyjścia. Przerwanie to jest wywoływane podczas transmisji danych z urządzenia zewnętrznego do bufora komputera. System operacyjny ma wbudowaną obsługę tego przerwania, ale ze względu na jej małą efektywność (stosunkowo wolna transmisja) programy współpracujące z urządzeniami zewnętrznymi, np. DOS 2.5 firmy Atari Corporation, używają własnych procedur obsługi przerwania VSERIN.
$020c,$020d |
00524,00525 |
VSEROR |
Wektor przerwania szeregowego portu wejścia/wyjścia. Jest ono wywoływane podczas transmisji danych z bufora komputera do urządzenia zewnętrznego. Wektor ten jest najczęściej zmieniany przez Dyskowe Systemy Operacyjne.
$020e,$020f |
00526,00527 |
VSEROC |
Wektor przerwania końca transmisji szeregowej. Jeżeli komórka CHKSNT (lokacja 00059 $003b) jest równa 0, to systemowa procedura tego przerwania jest kończona (suma kontrolna nie została wysłana). Jeżeli komórka ta ma wartość różną od zera (transmisja szeregowa została zakończona), to procedura przerwania informuje system operacyjny o zakończonej operacji poprzez skasowanie 3 bitu komórki IRQEN (lokacja 53774 ($d20e) odpowiedzialnego za zezwolenie na przerwanie końca transmisji.
$0210,$0211 |
00528,00529 |
VTIMR1 |
Wektor przerwania zegara pierwszego. Przerwanie jest wywoływane przez układ POKEY. System operacyjny ustawia ten wektor na adres, pod którym znajdują się rozkazy powrotu z przerwania. Jeżeli zawartość komórki AUDF1 (lokacja 53760 $d300) odliczy się do zera, to następuje przerwanie zegara numer 1.
$0212,$0213 |
00530,00531 |
VTIMR2 |
Wektor przerwania zegara drugiego, wywołane jest, gdy komórka AUDF2 (lokacja 53762 $d202) osiągnie wartość zero.
$0214,$02l5 |
00532,00533 |
VTIMR4 |
Wektor przerwania czwartego zegara, wywołane jest, gdy komórka AUDF4 (lokacja 53766 $d206) osiągnie wartość równą 0.
$0216,$0217 |
00534,00535 |
VIMIRQ |
Globalny wektor przerwania IRQ. Jeżeli wystąpi przerwanie IRQ, to jest wywoływana procedura przerwania (przez wektor zapisany w VIMIRQ), która wywołuje właściwe przerwanie. Jest to przerwanie kontrolujące i uaktywniające inne przerwania IRQ, np. klawiatury, transmisji danych, itp.
VTIMR1-4 (lokacje od 00528 do 00533 ($0810-$0815)) są zegarami sprzętowymi, obsługiwane są przez układ POKEY i rejestry AUDF. Natomiast lokacje pamięci od 00536 do 00558 ($02l8-$02ae) są używane przez zegary programowe, obsługuje je przerwanie VBLANK Ich zawartość jest zmniejszana co 1/50 sekundy (dla pierwszej fazy przerwania VBLANK). Odliczanie czasu przez te zegary nie jest wykonywane, gdy ich wartość osiągnie 0 lub przerwanie VBLANK zostanie zablokowane. Zwykle przerwania zegarowe wykorzystywane są przez programy wymagające wykonania pewnych operacji co pewien określony okres, np. migotanie kursora, wydawanie dźwięku.
$0218,$219 |
00536,00537 |
CDTMV1 |
Wartość pierwszego zegara, zmniejszana jest o jeden po każdym przerwaniu wywołanym przez pierwszą fazę VBLANK. W chwili, gdy osiągnie wartość 0 jest wykonywane przerwanie, którego wektor znajduje się pod adresem 00550 ($0226). Ponieważ wystąpienie operacji czasowo krytycznej (patrz lokacja 00066 ($0042), komórka CRITIC) nie powoduje wstrzymania realizacji pierwszej części przerwania VBLANK, zegar numer 1 jest nadal aktywny. Należy z tego powodu umiejętnie korzystać z przerwania pierwszego zegara, gdyż może to doprowadzić do zakłóceń pracy systemu operacyjnego, z jego "zawieszeniem" włącznie.
$021a,$021b |
00538,00539 |
CDTMV2 |
Wartość drugiego zegara, zmniejszana jest o jeden przez drugą część przerwania VBLANK. Po osiągnięciu zerowej zawartości jest wykonywane przerwanie tego zegara, system wykonuje skok przez lokacje 00552,00553 ($0228, $0229). Wystąpienie operacji czasowo krytycznej (patrz CRITIC) wstrzymuje działanie zegara numer 2.
$021C,$021d |
00540,00541 |
CDTMV3 |
Wartość trzeciego zegara, który obsługiwany jest przez drugą część przerwania VBLANK Konsekwencje:
patrz CDTMV2 powyżej. Gdy CDTMV3 osiągnie wartość 0 to jest ustawiana flaga w komórce 00554 ($022a).
$02le,$021f |
00542,00543 |
CDTMV4 |
Wartość czwartego zegara, patrz lokacja 00538 ($021a). Gdy CDTMV4 zostanie odliczona do 0 to ustawiana jest flaga w komórce 00556 ($022c).
$0220,$0221 |
00544,00545 |
CDTMV5 |
Wartość piątego zegara, patrz lokacja 00538 ($021a). Gdy CDTMV5 osiągnie wartość 0 to jest ustawiana flaga w komórce 00558 ($22e).
Krótka uwaga dotycząca działania zegarów 3-5:
flagi odpowiadające poszczególnym zegarom są ustawione aż do czasu, gdy przerwanie VBLANK rozpozna, że wartość któregoś z tych zegarów jest różna od zera. Wtedy odpowiednia flaga jest kasowana.
opracował: Leon
|