Rejestry ANTIC-a
From Atariki
Wersja z dnia 18:04, 20 gru 2005 KMK (Dyskusja | wkład) (→Lista rejestrów) ← Previous diff |
Aktualna wersja Mono (Dyskusja | wkład) (zamienione rozdzieelczości dwuliniowa i jednoliniowa przy opisie pmbase) |
||
Linia 1: | Linia 1: | ||
- | Układ [[ANTIC]], 15 rejestrów. | + | Układ [[ANTIC (układ)|ANTIC]], 15 rejestrów. |
- | ===Lista rejestrów=== | + | ==Lista rejestrów== |
<table border = 1 cellpadding = 5> | <table border = 1 cellpadding = 5> | ||
Linia 7: | Linia 7: | ||
<tr><td id="DMACTL">$D400 (W)</td><td>DMACTL</td><td> | <tr><td id="DMACTL">$D400 (W)</td><td>DMACTL</td><td> | ||
- | <p>Rejestr kontroli dostępu do pamięci (DMA Control register). Ma cień DMACTLS pod adresem $022F, skąd procedura [[SYSVBL]] przepisuje stan rejestru za każdym wystąpieniem [[przerwania]] [[VBL]].</p> | + | <p>Rejestr kontroli dostępu do pamięci (DMA Control register). Ma cień DMACTLS (SDMCTL) pod adresem $022F, skąd procedura [[SYSVBL]] przepisuje stan rejestru za każdym wystąpieniem [[przerwania]] [[VBL]].</p> |
<p>Znaczenie bitów:</p> | <p>Znaczenie bitów:</p> | ||
* bit 7: niewykorzystany | * bit 7: niewykorzystany | ||
* bit 6: niewykorzystany | * bit 6: niewykorzystany | ||
* bit 5: DMA dla [[ANTIC Display List|Display List]] (1 = włączone) | * bit 5: DMA dla [[ANTIC Display List|Display List]] (1 = włączone) | ||
- | * bit 4: rozdzielcznść [[Player/Missile Graphics|graczy i pocisków]] (0 = dwuliniowa, 1 = jednoliniowa) | + | * bit 4: rozdzielczość [[Player/Missile Graphics|graczy i pocisków]] (0 = dwuliniowa, 1 = jednoliniowa) |
* bit 3: DMA dla graczy (1 = włączone) | * bit 3: DMA dla graczy (1 = włączone) | ||
* bit 2: DMA dla pocisków (1 = włączone) | * bit 2: DMA dla pocisków (1 = włączone) | ||
- | + | <p>Przy rozdzielczości jednoliniowej graczy i pocisków jeden piksel P/MG ma wysokość jednej linii skaningowej. Przy rozdzielczości dwuliniowej -- dwóch linii. W obu przypadkach DMA następuje w każdej linii skaningowej (przy rozdzielczości dwuliniowej z jednakowymi adresami w każdej parze linii).</p> | |
<p>Bity 0 i 1 wybierają szerokość obrazu jak następuje:</p> | <p>Bity 0 i 1 wybierają szerokość obrazu jak następuje:</p> | ||
<table border = 1 cellpadding = 5> | <table border = 1 cellpadding = 5> | ||
Linia 24: | Linia 24: | ||
<tr><td>1</td><td>1</td><td>Szeroki obraz (48 kolumn, 384 piksele).</td></tr> | <tr><td>1</td><td>1</td><td>Szeroki obraz (48 kolumn, 384 piksele).</td></tr> | ||
</table> | </table> | ||
- | <p>Normalnie ustawianą tu przez system operacyjny wartością jest $22 (34).</p> | + | <p>Normalnie ustawianą tu przez system operacyjny wartością jest $22 (34).</p> |
+ | <p>Wyłączenie obrazu i DMA powoduje, że ANTIC przestaje pobierać dane z pamięci i tym samym zabierać procesorowi dostęp do magistrali danych i adresowej. Powoduje to wzrost szybkości obliczeń wykonywanych przez CPU nawet o 30%.</p> | ||
</td></tr> | </td></tr> | ||
- | <tr><td id="CHRCTL">$D401 (W)</td><td>CHRCTL</td><td> | + | <tr><td id="CHRCTL">$D401 (W)</td><td>CHRCTL, CHACTL</td><td> |
<p>Rejestr kontroli wyświetlania znaków (Character control register). Ma cień CHACT pod adresem $02F3, skąd procedura [[SYSVBL]] przepisuje stan rejestru za każdym wystąpieniem [[przerwania]] [[VBL]].</p> | <p>Rejestr kontroli wyświetlania znaków (Character control register). Ma cień CHACT pod adresem $02F3, skąd procedura [[SYSVBL]] przepisuje stan rejestru za każdym wystąpieniem [[przerwania]] [[VBL]].</p> | ||
<p>Znaczenie bitów:</p> | <p>Znaczenie bitów:</p> | ||
* bit 2: lustrzane odbicie znaków w pionie (1 = włączone) | * bit 2: lustrzane odbicie znaków w pionie (1 = włączone) | ||
- | * bit 1: interpretacja drugiej połówki generatora znaków (0 = znaki normalne, 1 = inverse video) | + | * bit 1: interpretacja drugiej połówki generatora znaków w trybach tekstowych [[ANTIC_Display_List#Tryby_znakowe|ANTIC 2 i 3]] (0 = znaki normalne, 1 = [[inverse video]]) |
- | * bit 0: tłumienie znaków w inverse video (1 = niewidoczne) | + | * bit 0: tłumienie znaków drugiej połówki generatora znaków w trybach tekstowych ANTIC 2 i 3 (1 = niewidoczne) |
<p>Pozostałe bity są niewykorzystane. Normalną wartością CHRCTL jest $02.</p> | <p>Pozostałe bity są niewykorzystane. Normalną wartością CHRCTL jest $02.</p> | ||
</td></tr> | </td></tr> | ||
- | <tr><td id="DLPTR">$D402 (W)</td><td rowspan = 2>DLPTR</td><td rowspan = 2> | + | <tr><td id="DLPTR">$D402 (W)</td><td rowspan = 2>DLPTR, DLISTL/DLISTH</td><td rowspan = 2> |
- | <p>Wskaźnik pierwszego rozkazu [[ANTIC Display List|Display List]]. Ma cień DLPTRS pod adresem $0230-$0231, skąd procedura [[SYSVBL]] przepisuje stan rejestru za każdym wystąpieniem [[przerwania]] [[VBL]]. DIsplay List jest zazwyczaj ulokowana bezpośrednio przed pamięcią obrazu.</p> | + | <p>Wskaźnik rozkazu [[ANTIC Display List|Display List]] (Display List Pointer). Ma cień DLPTRS (SDLSTL/SDLSTH) pod adresem $0230-$0231, skąd procedura [[SYSVBL]] przepisuje stan rejestru za każdym wystąpieniem [[przerwania]] [[VBL]]. System operacyjny umieszcza Display List bezpośrednio przed pamięcią obrazu.</p> |
</td></tr> | </td></tr> | ||
<tr><td>$D403 (W)</td></tr> | <tr><td>$D403 (W)</td></tr> | ||
- | <tr><td id="HSCROL">$D404 (W)</td><td>HSCROL</td><td> </td></tr> | + | <tr><td id="HSCROL">$D404 (W)</td><td>HSCROL</td><td>Rejestr poziomego przesuwu obrazu. |
+ | * Bity 0..3: Przesuwają treść obrazu w lewo o 16-n cykli koloru. | ||
+ | Pozostałe bity są niewykorzystane. | ||
- | <tr><td id="VSCROL">$D405 (W)</td><td>VSCROL</td><td> </td></tr> | + | Treść obrazu jest przesuwana tylko w liniach [[ANTIC Display List|Display List]] z uaktywnionym [[ANTIC Display List#HSCRL|przesuwem poziomym]].</td></tr> |
+ | |||
+ | <tr><td id="VSCROL">$D405 (W)</td><td>VSCROL</td><td>Rejestr pionowego przesuwu obrazu. | ||
+ | * Bity 0..3: Przesuwają treść obrazu w górę o n linii skanningowych. | ||
+ | Pozostałe bity są niewykorzystane. | ||
+ | |||
+ | Treść obrazu, analogicznie jak przy [[ANTIC Display List#HSCRL|przesuwie poziomym]], jest przesuwana tylko w liniach [[ANTIC Display List|Display List]] z uaktywnionym [[ANTIC Display List#VSCRL|przesuwem pionowym]] (wyjątkiem jest pierwsza linia Display List nieruchomej sekcji następująca po ostatniej linii Display List z uaktywnionym [[ANTIC Display List#VSCRL|przesuwem pionowym]]).</td></tr> | ||
<tr><td>$D406</td><td>-</td><td> </td></tr> | <tr><td>$D406</td><td>-</td><td> </td></tr> | ||
- | <tr><td id="PMBASE">$D407 (W)</td><td>PMBASE</td><td> </td></tr> | + | <tr><td id="PMBASE">$D407 (W)</td><td>PMBASE</td><td> |
+ | <p>Player/Missile Base, wskaźnik obszaru pamięci przeznaczonego na [[Player/Missile Graphics|grafikę graczy i pocisków]]. Przy rozdzielczości jednoliniowej graczy i pocisków (zob. [[Rejestry ANTIC-a#DMACTL|DMACTL $D400]]) zawiera pięć, a przy dwuliniowej sześć najstarszych bitów adresu. Wynika z tego, że obszar danych dla grafiki graczy i pocisków musi zaczynać się odpowiednio na granicy dwóch lub jednego kilobajta.</p> | ||
+ | <p>Wewnątrz tego obszaru [[ANTIC (układ)|ANTIC]] przeznacza dla jednego gracza 120 bajtów w rozdzielczości dwuliniowej i 240 w rozdzielczości jednoliniowej. Taki sam obszar, jak dla jednego gracza, zarezerwowany jest też dla czterech pocisków.</p> | ||
+ | <p> | ||
+ | <table border = 1 cellpadding = 5> | ||
+ | <tr><td rowspan = 2><b>Obiekt</b></td><td colspan = 2><b>Offset względem PMBASE w rozdzielczości</b></td></tr> | ||
+ | <tr> <td><b>Dwuliniowej</b></td><td><b>Jednoliniowej</b></td></tr> | ||
+ | <tr><td>pociski</td><td>$0184</td><td>$0308</td></tr> | ||
+ | <tr><td>gracz 0</td><td>$0204</td><td>$0408</td></tr> | ||
+ | <tr><td>gracz 1</td><td>$0284</td><td>$0508</td></tr> | ||
+ | <tr><td>gracz 2</td><td>$0304</td><td>$0608</td></tr> | ||
+ | <tr><td>gracz 3</td><td>$0384</td><td>$0708</td></tr> | ||
+ | </table> | ||
+ | </p> | ||
+ | <p>Matryca pojedynczego gracza ma 8 bitów szerokości, a pocisku 2 bity.</p> | ||
+ | </td></tr> | ||
<tr><td>$D408</td><td>-</td><td> </td></tr> | <tr><td>$D408</td><td>-</td><td> </td></tr> | ||
- | <tr><td id="CHBASE">$D409 (W)</td><td>CHBASE</td><td> </td></tr> | + | <tr><td id="CHBASE">$D409 (W)</td><td>CHBASE</td><td><p>Wskaźnik adresu [[Generator znaków|zestawu znaków]], ma cień CHBAS pod adresem $02F4 (756).</p> |
+ | * w trybach ANTIC-a 2, 3, 4 i 5 bity 7-2 odpowiadają bitom 15-10 adresu zestawu znaków definiującego 128 znaków. | ||
+ | * w trybach ANTIC-a 6 i 7 bity 7-1 odpowiadają bitom 15-9 adresu zestawu znaków definiującego 64 znaki. | ||
+ | <p>Wynika z tego, że w trybach 2-5 zestaw znaków musi się znajdować na granicy 1k, a w trybach 6-7 na granicy 512 bajtów.</p> | ||
+ | <p>OS ma jeszcze dodatkowy adres międzynarodowego zestawu znaków CHSPTR w rejestrze $026B (619). Zawartości CHBAS i CHSPTR są zamieniane miejscami po wciśnięciu kombinacji klawiszy CTRL+F4 w 1200XL. Na VBLKD przepisywana jest do rejestru sprzętowego zawsze tylko zawartość CHBAS.</p> | ||
+ | </td></tr> | ||
- | <tr><td id="WSYNC">$D40A (W)</td><td>WSYNC</td><td> </td></tr> | + | <tr><td id="WSYNC">$D40A (W)</td><td>WSYNC</td><td> |
+ | <p>Wait for horizontal synchronization. Zapis dowolnej wartości do tego rejestru powoduje uaktywnienie przez [[ANTIC (układ)|ANTIC]] sygnału RDY, czym zatrzymuje on [[6502]] do chwili wystąpienia impulsu synchronizacji poziomej.</p> | ||
+ | </td></tr> | ||
- | <tr><td id="VCOUNT">$D40B (R)</td><td>VCOUNT</td><td> </td></tr> | + | <tr><td id="VCOUNT">$D40B (R)</td><td>VCOUNT</td><td> |
+ | <p>Licznik generowanych przez ANTIC linii skaningowych (Vertical line counter). Licznik ten jest dziewięciobitowy, z czego w rejestrze VCOUNT widać osiem najstarszych bitów. Zlicza on więc co drugą wyświetlaną linię, w systemie PAL teoretycznie znajdują się tu wartości od 0 do 155, natomiast w systemie [http://pl.wikipedia.org/wiki/NTSC NTSC] - od 0 do 130. Przez jeden cykl w każdej ramce jest tu wartość 156 (PAL) lub 131 (NTSC). Wartość 0 utrzymuje się przez 227 cykli, a nie 228.</p> | ||
+ | </td></tr> | ||
- | <tr><td id="LPENH">$D40C (R)</td><td>LPENH</td><td> </td></tr> | + | <tr><td id="LPENH">$D40C (R)</td><td>LPENH, PENH</td><td> |
+ | <p>Współrzędna X pozycji [[Pióro świetlne|pióra świetlnego]] (Light Pen Horizontal position) lub [[XG-1|pistoletu świetlnego]]. Wskazuje cykl koloru w linii, w którym wykryto obecność elementu światłoczułego.</p> | ||
+ | <p>Rejestr cień LPENHS pod adresem $0234.</p> | ||
+ | </td></tr> | ||
- | <tr><td id="LPENV">$D40D (R)</td><td>LPENV</td><td> </td></tr> | + | <tr><td id="LPENV">$D40D (R)</td><td>LPENV, PENV</td><td> |
+ | <p>Współrzędna Y pozycji pióra świetlnego (Light Pen Vertical position) lub pistoletu świetlnego. Wskazuje numer linii ekranowej podzielony przez 2 (analogicznie, jak VCOUNT), w której wykryto obecność elementu światłoczułego.</p> | ||
+ | <p>Rejestr cień LPENVS pod adresem $0235.</p> | ||
+ | </td></tr> | ||
<tr><td id="NMIEN">$D40E (W)</td><td>NMIEN</td><td> | <tr><td id="NMIEN">$D40E (W)</td><td>NMIEN</td><td> | ||
Linia 65: | Linia 104: | ||
* bit 7 = 1, [[DLI]] włączone | * bit 7 = 1, [[DLI]] włączone | ||
* bit 6 = 1, [[VBL]] włączone | * bit 6 = 1, [[VBL]] włączone | ||
- | * bit 5 = 1, NMI RESET włączone (to przerwanie nie jest używane w serii XL/XE) | + | <p>Pozostałe bity są niewykorzystane.</p> |
- | <p>System operacyjny normalnie ustawia tu wartość $40 (DLI wyłączone, VBL włączone). Pozostałe bity są niewykorzystane.</p> | + | <p>System operacyjny normalnie ustawia tu wartość $40 (DLI wyłączone, VBL włączone). Przerwania [[NMI RESET]] (które jest trzecim z przerwań generowanych przez ANTIC) nie można wyłączyć.</p> |
</td></tr> | </td></tr> | ||
Linia 73: | Linia 112: | ||
* bit 7 = 1, [[DLI]] wystąpiło | * bit 7 = 1, [[DLI]] wystąpiło | ||
* bit 6 = 1, [[VBL]] wystąpiło | * bit 6 = 1, [[VBL]] wystąpiło | ||
- | * bit 5 = 1, NMI RESET wystąpiło (tylko seria 400/800) | + | * bit 5 = 1, [[NMI RESET]] wystąpiło (tylko seria [[400/800]]) |
- | <p>Pozostałe bity sa niewykorzystane.</p> | + | <p>Pozostałe bity są niewykorzystane i ustawione na 1.</p> |
- | <p>Skasowania bitów NMIST dokonuje się przez zapis rejestru [[Rejestry ANTIC-a#NMIRES|NMIRES $D40F]]. Ponadto bit [[DLI]] jest kasowany w momencie wystąpienia przerwania [[VBL]].</p> | + | <p>Skasowanie bitu DLI następuje automatycznie w momencie wystąpienia przerwania VBL (te przerwania nie mogą wystąpić jednocześnie). Do skasowania wszystkich bitów służy rejestr [[Rejestry ANTIC-a#NMIRES|NMIRES $D40F]].</p> |
</td></tr> | </td></tr> | ||
Linia 83: | Linia 122: | ||
</table> | </table> | ||
- | |||
- | {{stub}} | ||
[[Kategoria:Programowanie Atari 8-bit]] | [[Kategoria:Programowanie Atari 8-bit]] |
Aktualna wersja
Układ ANTIC, 15 rejestrów.
Lista rejestrów
Adres | Etykieta | Opis | ||||||||||||||||||||
$D400 (W) | DMACTL |
Rejestr kontroli dostępu do pamięci (DMA Control register). Ma cień DMACTLS (SDMCTL) pod adresem $022F, skąd procedura SYSVBL przepisuje stan rejestru za każdym wystąpieniem przerwania VBL. Znaczenie bitów:
Przy rozdzielczości jednoliniowej graczy i pocisków jeden piksel P/MG ma wysokość jednej linii skaningowej. Przy rozdzielczości dwuliniowej -- dwóch linii. W obu przypadkach DMA następuje w każdej linii skaningowej (przy rozdzielczości dwuliniowej z jednakowymi adresami w każdej parze linii). Bity 0 i 1 wybierają szerokość obrazu jak następuje:
Normalnie ustawianą tu przez system operacyjny wartością jest $22 (34). Wyłączenie obrazu i DMA powoduje, że ANTIC przestaje pobierać dane z pamięci i tym samym zabierać procesorowi dostęp do magistrali danych i adresowej. Powoduje to wzrost szybkości obliczeń wykonywanych przez CPU nawet o 30%. | ||||||||||||||||||||
$D401 (W) | CHRCTL, CHACTL |
Rejestr kontroli wyświetlania znaków (Character control register). Ma cień CHACT pod adresem $02F3, skąd procedura SYSVBL przepisuje stan rejestru za każdym wystąpieniem przerwania VBL. Znaczenie bitów:
Pozostałe bity są niewykorzystane. Normalną wartością CHRCTL jest $02. | ||||||||||||||||||||
$D402 (W) | DLPTR, DLISTL/DLISTH |
Wskaźnik rozkazu Display List (Display List Pointer). Ma cień DLPTRS (SDLSTL/SDLSTH) pod adresem $0230-$0231, skąd procedura SYSVBL przepisuje stan rejestru za każdym wystąpieniem przerwania VBL. System operacyjny umieszcza Display List bezpośrednio przed pamięcią obrazu. | ||||||||||||||||||||
$D403 (W) | ||||||||||||||||||||||
$D404 (W) | HSCROL | Rejestr poziomego przesuwu obrazu.
Pozostałe bity są niewykorzystane. Treść obrazu jest przesuwana tylko w liniach Display List z uaktywnionym przesuwem poziomym. | ||||||||||||||||||||
$D405 (W) | VSCROL | Rejestr pionowego przesuwu obrazu.
Pozostałe bity są niewykorzystane. Treść obrazu, analogicznie jak przy przesuwie poziomym, jest przesuwana tylko w liniach Display List z uaktywnionym przesuwem pionowym (wyjątkiem jest pierwsza linia Display List nieruchomej sekcji następująca po ostatniej linii Display List z uaktywnionym przesuwem pionowym). | ||||||||||||||||||||
$D406 | - | |||||||||||||||||||||
$D407 (W) | PMBASE |
Player/Missile Base, wskaźnik obszaru pamięci przeznaczonego na grafikę graczy i pocisków. Przy rozdzielczości jednoliniowej graczy i pocisków (zob. DMACTL $D400) zawiera pięć, a przy dwuliniowej sześć najstarszych bitów adresu. Wynika z tego, że obszar danych dla grafiki graczy i pocisków musi zaczynać się odpowiednio na granicy dwóch lub jednego kilobajta. Wewnątrz tego obszaru ANTIC przeznacza dla jednego gracza 120 bajtów w rozdzielczości dwuliniowej i 240 w rozdzielczości jednoliniowej. Taki sam obszar, jak dla jednego gracza, zarezerwowany jest też dla czterech pocisków.
Matryca pojedynczego gracza ma 8 bitów szerokości, a pocisku 2 bity. | ||||||||||||||||||||
$D408 | - | |||||||||||||||||||||
$D409 (W) | CHBASE | Wskaźnik adresu zestawu znaków, ma cień CHBAS pod adresem $02F4 (756).
Wynika z tego, że w trybach 2-5 zestaw znaków musi się znajdować na granicy 1k, a w trybach 6-7 na granicy 512 bajtów. OS ma jeszcze dodatkowy adres międzynarodowego zestawu znaków CHSPTR w rejestrze $026B (619). Zawartości CHBAS i CHSPTR są zamieniane miejscami po wciśnięciu kombinacji klawiszy CTRL+F4 w 1200XL. Na VBLKD przepisywana jest do rejestru sprzętowego zawsze tylko zawartość CHBAS. | ||||||||||||||||||||
$D40A (W) | WSYNC |
Wait for horizontal synchronization. Zapis dowolnej wartości do tego rejestru powoduje uaktywnienie przez ANTIC sygnału RDY, czym zatrzymuje on 6502 do chwili wystąpienia impulsu synchronizacji poziomej. | ||||||||||||||||||||
$D40B (R) | VCOUNT |
Licznik generowanych przez ANTIC linii skaningowych (Vertical line counter). Licznik ten jest dziewięciobitowy, z czego w rejestrze VCOUNT widać osiem najstarszych bitów. Zlicza on więc co drugą wyświetlaną linię, w systemie PAL teoretycznie znajdują się tu wartości od 0 do 155, natomiast w systemie NTSC - od 0 do 130. Przez jeden cykl w każdej ramce jest tu wartość 156 (PAL) lub 131 (NTSC). Wartość 0 utrzymuje się przez 227 cykli, a nie 228. | ||||||||||||||||||||
$D40C (R) | LPENH, PENH |
Współrzędna X pozycji pióra świetlnego (Light Pen Horizontal position) lub pistoletu świetlnego. Wskazuje cykl koloru w linii, w którym wykryto obecność elementu światłoczułego. Rejestr cień LPENHS pod adresem $0234. | ||||||||||||||||||||
$D40D (R) | LPENV, PENV |
Współrzędna Y pozycji pióra świetlnego (Light Pen Vertical position) lub pistoletu świetlnego. Wskazuje numer linii ekranowej podzielony przez 2 (analogicznie, jak VCOUNT), w której wykryto obecność elementu światłoczułego. Rejestr cień LPENVS pod adresem $0235. | ||||||||||||||||||||
$D40E (W) | NMIEN |
Rejestr kontrolujący występowanie przerwań NMI (NMI enable register). Znaczenie bitów: Pozostałe bity są niewykorzystane. System operacyjny normalnie ustawia tu wartość $40 (DLI wyłączone, VBL włączone). Przerwania NMI RESET (które jest trzecim z przerwań generowanych przez ANTIC) nie można wyłączyć. | ||||||||||||||||||||
$D40F (R) | NMIST |
Rejestr statusu przerwań NMI (NMI status register). Znaczenie bitów:
Pozostałe bity są niewykorzystane i ustawione na 1. Skasowanie bitu DLI następuje automatycznie w momencie wystąpienia przerwania VBL (te przerwania nie mogą wystąpić jednocześnie). Do skasowania wszystkich bitów służy rejestr NMIRES $D40F. | ||||||||||||||||||||
$D40F (W) | NMIRES |
Zapis tego rejestru (dowolną wartością) powoduje skasowanie bitów statusu NMI w rejestrze NMIST $D40F. |