Osmibitové počítače Atari: herní stroje nebo plnohodnotné domácí mikropočítače
Co se dozvíte v článku
- Osmibitové počítače Atari: herní stroje nebo plnohodnotné domácí mikropočítače
- Revoluce v IT: vznik konceptu domácích počítačů
- Trnitá cesta k návrhu SIO
- Krátká odbočka: koncept externích sběrnic a portů v informatice
- Externí sběrnice vs. port
- Sériový vs. paralelní přenos dat
- Jednosměrná vs. obousměrná komunikace
- Způsob řízení sběrnice
- SIO na osmibitových Atari z pohledu „teorie“ sběrnic a portů
- Konektor sériové sběrnice SIO
- Přenosový protokol: asynchronní režim
- Volba přenosové rychlosti
- Přenosový protokol: vyšší úroveň
- ID zařízení
- Posílané příkazy
- Řídicí a stavové registry čipu POKEY používané pro sériovou komunikaci
- Stav sériového portu
- Nastavení režimu sériového portu
- Repositář s demonstračními příklady
- Odkazy na Internetu
O domácích osmibitových mikropočítačích Atari se většinou v současnosti mluví jako o počítačích určených především pro provoz her. Ve skutečnosti tomu však bylo poněkud jinak. Firma Atari po úspěšném uvedení herní konzole Atari 2600 reálně uvažovala o vývoji modernější herní konzole (konkrétně u Atari 2600 se plánovalo, že na trhu „vydrží“ pouhé tři roky, nakonec to však bylo neuvěřitelných patnáct let, což je na tak primitivní zařízení až neuvěřitelné).
V rámci vývoje nové herní konzole byly vyvinuty čipy CTIA (později upraveno na GTIA) a POKEY, které nahradily původní čip TIA (realizoval pohyblivé grafické objekty + zvuky). Jako mikroprocesor měla být použita plnohodnotná verze MOS 6502 a nikoli ořezaná varianta MOS 6507.
Obrázek 1: Původní model osmibitové herní konzole Atari 2600.
Nová herní konzole, která byla interně pojmenována „Candy“, neměla mít (logicky) plnohodnotnou klávesnici; pouze několik tlačítek (z nich se posléze vyvinuly Start, Select a Option) a možnost připojení ovladačů, tedy primárně joysticků a taktéž paddle popř. světelného pera. A grafický subsystém měl být optimalizován na tehdejší herní žánry – tedy orientace na pohyblivé objekty, scrolling, s menší prioritou textových režimů.
Revoluce v IT: vznik konceptu domácích počítačů
Jenže v průběhu návrhu nové herní konzole „Candy“ došlo k velké revoluci v oblasti IT – v roce 1977 totiž doba „uzrála“ a vznikl zcela nový segment domácích počítačů. V první generaci těchto strojů, které zcela změnily náhled na IT (už žádné sterilní klimatizované sály a obrovské tajemné bedny opečovávané muži v oblecích), najdeme TRS-80, Commodore PET a Apple II (nazývané společně „trinity“).
Obrázek 2: Apple II s monitorem a dvojicí disketových jednotek.
Na vznik zcela nového segmentu trhu společnost Atari zareagovala tím, že nad původním designem herní konzole navrhla vlastní architekturu domácích mikropočítačů. Změn, které musely být provedeny, bylo více – přidání textového a grafického režimu s vysokým horizontálním rozlišením (320 pixelů, tedy 40 znaků na řádku), přidání klávesnice, což si vyžádalo úpravu čipu POKEY, přidání dalších 8kB ROM s interpretrem programovacího jazyka Atari BASIC a rozšíření ROM s operačním systémem, který se tak stal plnohodnotným operačním systémem s podporou konfigurovatelných zařízení apod. Speciální „konzolová“ tlačítka však zůstala, čímž se Atari odlišuje od prakticky všech ostatních dobových počítačů).
Obrázek 3: TRS-80 s dobovým monitorem.
Trnitá cesta k návrhu SIO
Navíc v době návrhu osmibitových mikropočítačů Atari začala být zaváděna poměrně striktní pravidla FCC (Federal Communications Commission), která určovala maximální úroveň rušení (tedy vlastně vysílání) televizního signálu (resp. signálu ve stejných frekvenčních pásmech, jaké měly televizory v USA). Tato pravidla platila pro všechna zařízení s vysokofrekvenčním modulátorem a tedy i pro nově vznikající počítače Atari (naproti tomu Apple II měl přesně z tohoto důvodu modulátor externí a tudíž tato pravidla dokázal obejít). Jak odstínit rušivé vysílání je problém se známým řešením – použít Faradayovu klec. To ovšem znamená nutnost uzavření celého plošného spoje do plechové „krabice“ s co nejmenšími otvory (což není zcela přesné tvrzení, protože je to závislé na vlnové délce, o čemž se ostatně můžeme přesvědčit pohledem na každou mikrovlnku).
Kvůli tomuto omezení vlastně vznikl koncept SIO (Serial Input/Output), tedy sériového portu s jen minimem vodičů, které bylo možné snadno (a bez porušení normy FCC) vyvést mimo Faradayovu klec. Díky SIO bylo možné počítač rozšiřovat o další zařízení, a to bez nutnosti využití konceptu zásuvných karet (ten byl použit u Apple II a později i u IBM PC, ovšem známe ho i z IQ-151 apod.).
Obrázek 4: Kabel SIO s třinácti vodiči.
Obrázek 5: Paralelní sběrnice, v tomto případě ISA, jsou sice skvělé pro rozšiřování PC, ovšem vyžadují zcela jiné uspořádání počítače, než mají osmibitová Atari (vše integrované v klávesnici).
Krátká odbočka: koncept externích sběrnic a portů v informatice
V minulosti bylo navrženo i implementováno poměrně mnoho technologií umožňujících komunikaci mezi počítačem na jedné straně a externími zařízeními na straně druhé. Některé technologie byly proprietární a objevily se například jen na jednom typu počítače, další technologie byly standardizovány a dočkaly se celosvětového rozšíření. Všechny technologie, které slouží pro připojení externích zařízení k počítačům, je možné rozdělit na základě několika vlastností, jež budou popsány v následujícím textu:
- Externí sběrnice vs. port
- Sériový vs. paralelní přenos dat
- Jednosměrná vs. obousměrná komunikace
- Způsob řízení sběrnice (u portu není vlastně co řídit)
Obrázek 6: Dobové terminály se připojovaly s využitím sériového portu. Teoreticky tedy mohly být připojeny i k osmibitovým počítačům Atari (postačuje upravit napěťové úrovně).
Externí sběrnice vs. port
V praxi je od sebe většinou nutné odlišit sběrnice a porty. Mezi základní vlastnosti sběrnic patří fakt, že umožňují s počítačem propojit několik zařízení, přičemž řízení sběrnice (takzvanou arbitráž) obstarává buď jedno předem zvolené zařízení (používalo se pro ně označení master, a vzhledem k tomu, že je tento článek o historických počítačích, použiji historické jméno) nebo zařízení libovolné (master-select). Fyzická topologie externí sběrnice může být založena například na hvězdě/stromu (USB, ta má mimochodem pouze centrální řízení) nebo mohou být všechna zařízení připojena na společné vodiče (což je případ dnes popisované sběrnice SIO nebo například I2C).
Naproti tomu port slouží pro připojení pouze jednoho zařízení, které jednosměrně či obousměrně komunikuje s počítačem resp. s čipem, který v počítači ke komunikaci slouží. Typickým zástupcem portů, se kterým se ještě i dnes můžeme u některých počítačů setkat, je sériový port RS-232 (označován jako COM) a port paralelní (na osobních počítačích bývá resp. spíše býval označen jako LPT). I původní způsob připojení klávesnice u počítačů IBM PC přes konektor DIN i modernější (technicky však hůře navržený) konektor PS/2 je ve své podstatě založen na jednoúčelovém sériovém obousměrném portu.
Obrázek 7: Konektor typu A určený pro externí sběrnici USB. Tento konektor se připojuje vždy do počítače (přesněji řečeno do zařízení typu master), na druhé straně propojovacího kabelu je umístěn konektor typu B, protože na USB není možné připojit dvě zařízení typu master. To mj. znamená, že přes USB nelze přímo (bez nějakého mezičlánku) propojit dva počítače.
Sériový vs. paralelní přenos dat
U externích sběrnic i portů se také rozlišuje, zda jsou data přenášena sériově či paralelně. Při sériovém přenosu dat jsou jednotlivé byty či delší bloky rozděleny na sekvence bitů, které jsou postupně přeneseny sériovým způsobem, tj. bit po bitu (pro přenos dat tímto způsobem teoreticky postačují pouze dva vodiče, popř. jeden vodič a společná zem). Naproti tomu u paralelního přenosu je použito větší množství vodičů pro přenos dat, další vodiče jsou použity k řídicím účelům. Například u výše zmíněného paralelního portu (LPT) se přenos provádí po celých bytech, tj. tento port obsahuje osm datových vodičů, které jsou doplněny o vodiče řídicí a signální.
Nejvíce datových vodičů bylo možné možné najít v některých verzích externího rozhraní SCSI, dnes se ovšem toto rozhraní pro připojení externích zařízení již příliš nepoužívá, protože je postupně nahrazováno sběrnicí USB či rozhraním FireWire (SCSI má i svoji interní podobu). Do nákladů, které je nutné vynaložit na implementaci externí sběrnice či portu, je nutné započítat cenu konektorů i vlastních vodičů, mechanickou odolnost atd. a proto je v této oblasti patrný příklon k sériovému způsobu přenosu dat – zmenšuje se počet vodičů (levnější kabely) a i konektory mohou být jednodušší a levnější.
Jednosměrná vs. obousměrná komunikace
Některé porty (u sběrnic se s touto vlastností v naprosté většině případů nesetkáme) také slouží pouze pro jednosměrný přenos dat. Například již dvakrát zmíněný původní paralelní port LPT byl původně určen pouze pro jednosměrný přenos dat z počítače do tiskárny. Zpět se přenášely po speciálních vodičích pouze stavové informace typu „tiskárna připravena“ či „došel papír“. Teprve pozdější rozšíření paralelního portu (technologie ECP a další) umožnily obousměrný přenos dat a posléze i přenos vyšší rychlostí, čehož bylo možné využít v programu LapLink, Norton Commander apod. pro propojení dvou počítačů v dobách před masivním rozšířením Ethernetu.
Prakticky všechna moderní zařízení vyžadují obousměrnou komunikaci, proto i externí sběrnice a porty bývají koncipovány pro přenos dat v obou směrech. I klávesnice, která je z hlediska operačního systému považována za typické vstupní (jednosměrné) zařízení, ve skutečnosti vyžaduje alespoň minimální obousměrnou komunikaci – počítač například může měnit rychlost automatického opakování stlačené klávesy, nebo je možné programově blikat světelnými diodami na klávesnici.
Způsob řízení sběrnice
Důležité je taktéž rozlišit způsob řízení sběrnice. V podstatě jsou možné dva způsoby řízení: řízení centrální, přičemž oním centrálním uzlem nejčastěji bývá počítač (přesněji řečeno řadič externí sběrnice umístěný v počítači, což je v případě Atari čip POKEY a PIA s dopomocí operačního systému) a řízení decentralizované, při kterém se jakékoli zařízení připojené na sběrnici může stát masterem, který provoz na sběrnici řídí.
U externích sběrnic se většinou můžeme setkat s centrálním řízením. Centrální řízení bývá v tomto případě vhodnější, protože externí zařízení nebývají konstruována tak, aby mohla komunikovat přímo sama mezi sebou, tudíž jsou všechny komunikace směrovány na centrální uzel představovaný počítačem. Naproti tomu je u některých počítačových architektur možné, aby interní zařízení spolu komunikovala přímo bez nutnosti jakýchkoli zásahů ze strany mikroprocesoru (to se však již pohybujeme ve zcela jiných cenových hladinách, než by bylo pro domácí osmibitové počítače vhodné).
Centrální řízení se také jednodušeji implementuje, protože není nutné navrhovat složitý přenosový protokol, řešit kolize více zařízení, které by chtěly sběrnici obsluhovat atd. Typickým příkladem externí sběrnice s centrálním řízením je USB. Zde je dokonce zařízení typu master vybaveno konektory odlišnými od zařízení typu slave. Tato sběrnice má fyzickou topologii hvězdy/stromu, přičemž uzlem stromu je vždy zařízení typu master, ostatní zařízení jsou typu slave. Na úrovni logické jsou všechna zařízení typu slave rovnocenná, i když mohou být zapojena v navzájem odlišných úrovních (patrech) stromové struktury. I u průmyslové sběrnice I2C je jedno zařízení typu master, na fyzické úrovni jsou však všechna zařízení (master i slave) připojena na společné vodiče.
SIO na osmibitových Atari z pohledu „teorie“ sběrnic a portů
SIO na osmibitových Atari můžeme charakterizovat následovně:
- Jedná se o externí sběrnici, na kterou lze připojit více inteligentních zařízení a na konci „hloupý“ kazetový magnetofon. Zařízení jsou vybavena vždy dvěma SIO konektory, což umožňuje jejich propojení.
- Je použit sériový přenos dat po jedné vstupní a jedné výstupní lince. Přenos je asynchronní, ale je doplněn o hodinové signály, takže se jedná o hybridní režim.
- Přenos je střídavý obousměrný (teoreticky však plně obousměrný).
- Sběrnice je řízena počítačem. Všechna ostatní zařízení jsou v režimu „poslouchání příkazů“. Tím, že vše řídí počítač, je vyřešená i arbitráž – žádné zařízení si nemůže vynutit o přístup na sběrnici.
Navíc, kromě nízkoúrovňového protokolu pro posílání bajtů (asynchronně), existuje i vysokoúrovňový protokol zajištující přenos příkazů i datových rámců do/z zvoleného zařízení. Výjimkou je „hloupý“ magnetofon, který příkazy ignoruje a je navíc řízen dalšími signály.
Obrázek 8: Vpravo dole je konektor SIO v počítači Atari. Vlevo nahoře pak dobastlený sériový port RS-232, který je interně připojen taktéž k SIO.
Konektor sériové sběrnice SIO
Pro sériovou sběrnici SIO byl navržen nový (proprietární) konektor se třinácti piny. Ty lze rozdělit do tří kategorií: napájení (a zem), sériový přenos (vstup, výstup, hodiny), řízení sběrnice a konečně několik pinů je určených pouze pro připojení kazetového magnetofonu. Všech třináct pinů SIO je vypsáno v následující tabulce:
| Pin | Název signálu | Stručný popis |
|---|---|---|
| 1 | Clock In | obousměrný hodinový signál pro synchronní přenosy dat |
| 2 | Clock Out | výstup hodinového signálu z počítače |
| 3 | Data In | asynchronní sériový přenos dat z periferního zařízení do počítače |
| 4 | GND | zem |
| 5 | Data Out | asynchronní sériový přenos dat z počítače do periferního zařízení |
| 6 | GND | zem |
| 7 | Command | nastaveno na nízkou úroveň při posílání příkazu počítačem |
| 8 | Motor Control | řízení motoru kazetového magnetofonu |
| 9 | Proceed | žádost o přerušení od periferního zařízení (u standardního zapojení nevyužito) |
| 10 | +5V / Ready | +5V pro zařízení bez vlastního napájení (kazetový magnetofon) + informace o tom, že je počítač připraven |
| 11 | Audio In | audio signál z kazetového magnetofonu |
| 12 | +12V | +12V (dostupné jen u starších modelů počítačů) |
| 13 | Interrupt | žádost o přerušení od periferního zařízení (u standardního zapojení nevyužito) |
Interní zapojení signálů je ukázáno na následujících dvou obrázcích. Na obrázku prvním vidíme zapojení čtyř pinů k čipu POKEY. Jedná se o hodinové signály a taktéž o vstup i výstup sériových dat:
Obrázek 9: Propojení čipu POKEY s některými piny SIO.
Další piny jsou připojeny na čip PIA, kterému se budeme podrobněji věnovat v samostatném článku (jedná se o poslední „velký“ čip, který v počítačích Atari najdeme):
Obrázek 10: Propojení čipu PIA s některými piny SIO.
Přenosový protokol: asynchronní režim
U sběrnice SIO se typicky používá asynchronní přenos dat, při kterém jsou (stále nezbytné) synchronizační značky vkládány na začátek a konec většího celku bitů. V případě RS-232C atd. se může přenášet 5, 6, 7, nejčastěji však 8 bitů, tedy celý bajt. U SIO se naproti tomu přenáší vždy osm bitů – nelze tedy nastavit odlišnou hodnotu. K těmto osmi bitům se přidává start bit a stop bit. Jak takový „asynchronní“ přenos vypadá? Obě zařízení, tedy jak přijímací, tak i vysílací strana, se nejprve musí vhodným způsobem nakonfigurovat, aby přijímač věděl, jaká je přenosová rychlost (viz další kapitolu).
Datový vodič (tedy SEROUT nebo SERIN podle směru přenosu) se před vlastním přenosem nachází v klidovém stavu, což znamená vysokou úroveň napětí. Tato úroveň může trvat libovolně dlouhou dobu. Před začátkem odeslání osmi bitů je nejprve poslán takzvaný start bit, který má vždy nulovou hodnotu, tj. je zaručeno, že se klidový stav linky (vysoká úroveň) vždy změní. Na straně přijímacího zařízení se musí co nejpřesněji rozeznat změna stavu linky, tj. sestupná hrana, která reprezentuje začátek start bitu. Od této chvíle přijímací strana ví, že se přijme osm bitů s předem nastavenou bitovou rychlostí. Přijímací strana tedy vzorkuje stav linky a podle svých vlastních hodin rozeznává hodnoty jednotlivých bitů. Na konci přenášené sekvence následuje takzvaný stop bit. Ten má vždy hodnotu logické jedničky, což znamená vysokou úroveň napětí. Délka stop bitu je v případě SIO vždy rovna délce běžného bitu (u RS-232C to může být 1,5 bitu nebo i 2 bity).
Synchronizace na úrovni jednotlivých bitů je navíc realizována i signálem CLOCK OUT. Ten má vyšší úroveň (logickou jedničku) na začátku přenosu bitu, sestupná hrana nastává v půlce bitu. Zařízení tedy může snímání posílaného bitu synchronizovat se sestupnou hranou (takže přenos je sice asynchronní, ale vlastně i současně synchronní, alespoň v jednom směru).
Signály používané v SIO jsou kompatibilní s TTL (na rozdíl od RS-232C). Logická jednička je na výstupu ≥3,0 V, logická nula ≤0,4 V. Na vstupu se za logickou jedničku považuje úroveň ≥2,0 V a za logickou nulu ≤0,8 V (hodnoty mezi těmito limity můžou způsobit „překlopení“ na libovolnou hodnotu).
Volba přenosové rychlosti
Standardní přenosová rychlost SIO je specifikována na 19200 bitů za sekundu (a jedná se i o rychlost nastavenou operačním systémem při provádění I/O operací), ovšem tato rychlost je plně konfigurovatelná. Například některé disketové jednotky (popř. nověji čtečky SD karet) dokážou v „turbo“ režimu přenášet data rychlostí 72000 bitů za sekundu, popř. i vyšší (nejvyšší rychlost dosahuje zhruba 127000 bitů za sekundu). Na druhou stranu ovšem například standardní tiskárny takové vysoké rychlosti nepodporují, takže musí být odpojeny. Hodinový signál, od něhož se odvozuje přenosová rychlost, je řízen čipem POKEY, konkrétně zvukovými kanály (no proč je nevyužít – prostě se při tisku nebude přehrávat hudba).
Podívejme se nyní, jak je nastavena výše uvedená standardní rychlost 19200 bitů za sekundu. Nejdříve nastavíme POKEY takovým způsobem, že budou spojeny kanály 1+2 a 2+3 do dvojice 16bitových kanálů se 16bitovými děliči. A vstupní frekvence do těchto kanálů bude přímo hodinový signál CPU 1,77 nebo 1,79 MHz.
Dále vypočteme hodnotu děliče frekvence. Vstupní frekvence je rovna 17734470 Hz (pro PAL) a výpočet děliče vypadá takto:
N=f_cpu/(2*baudrate)-7
Po dosazení požadované rychlosti 19200:
N=17734470/(2*19200)-7=39
Hodnota děliče tedy bude rovna 39 (popř. 40 na NTSC).
Celé nastavení čipu POKEY tedy může vypadat takto (získáno z OS ROM):
LDA #$27 ; nastavení děliče STA AUDF3 ; uložení pro kanál číslo 3 LDA #$00 ; dělení 1 STA AUDF4 ; uložení pro kanál číslo 4 LDA #$78 ; standard pro SIO: vstupem je f_CPU, spojení kanálů 1+2 a 3+4 STA AUDCTL ; změna nastavení POKEY LDA #$03 ; standardní nastavení SIO a klávesnice STA SKCTL ; změna nastavení POKEY ; nyní je možné zahájit přenos LDA date STA SEROUT ; už vysíláme
N=f_cpu/(2*baudrate)-7 ... baudrate=f_cpu/(2*N+7)
Tedy například:
| N | baudrate | Poznámka |
|---|---|---|
| 0 | 126674 | teoretické maximum (některé SW nedokážou nastavit) |
| 1 | 110840 | praktické maximum |
| 5 | 73893 | cca SIO×4, použito v IndustGT Syncromesh (ovšem to jsem nikdy neviděl) |
| 9 | 55420 | cca SIO×3, použito v US-Doubleru |
| 10 | 38553 | použito jednotkou XF551 v režimu High Speed (má být 39000) |
| 39 | 19276 | standard SIO |
| 85 | 9638 | blízko std. modemové rychlosti |
Přenosový protokol: vyšší úroveň
SIO ovšem neprovádí pouze „hloupý“ sériový přenos libovolných bloků dat. Protože se nejedná o port, ale o sběrnici, je nutné nějakým způsobem informovat připojená zařízení, jaká operace se bude provádět. K tomu slouží signál/pin command (je negovaný). Počítač zařízení ovládá tak, že jim pošle pět bajtů (nazývaných datový rámec), současně s nimi nastavuje právě signál command, takže všechna zařízení ví, že mají naslouchat a vybrané zařízení má vhodným způsobem zareagovat. Pokud je signál command aktivní (je v logické nule), vyšle počítač pět bajtů s následujícím obsahem:
| Bajt (pořadí) | Jméno | Stručný popis |
|---|---|---|
| 1 | DDEVIC | ID zařízení (viz další kapitolu) |
| 2 | DCOMND | příkaz (bude popsáno o dvě kapitoly dále) |
| 3 | DAUX1 | aux bajt (záleží na příkazu) |
| 4 | DAUX2 | aux bajt (záleží na příkazu) |
| 5 | × | kontrolní součet předchozích čtyř bajtů |
Následně počítač čeká na odpověď vybraného zařízení. Odpověď se skládá ze dvou bajtů: vlastní odpovědi a kontrolního součtu. Odpověď může být $41 nebo $4E, což v ATASCII znamená znaky A (acknowledge) a N (negative). Po odpovědi A se příkaz provede (bude popsáno níže), při odpovědi N je přenos ukončen. Samotný blok (datový rámec) za odpovědí A může mít prakticky libovolnou délku a končí bajtem $43 nebo $45. Asi už sami tušíte význam. $43 v ATASCII znamená znak C (complete) a $45 znak E (error).
Tímto způsobem je vyřešena i arbitráž sběrnice. Všechna zařízení (kromě počítače) jsou totiž vždy v režimu slave a jen počítač „nařizuje“, jaké příkazy má které zařízení vykonat. Neexistuje zde tedy koncept aktivních zařízení, které by například mohla dát najevo „konečně mám připravena data, posílám“. To pochopitelně do jisté míry zpomaluje komunikaci, protože například příkaz čti sektor znamená, že všechna ostatní zařízení musí počkat na disketovou jednotku, až celý sektor načte a pošle. Totéž platí pro příkaz tiskni řádek apod.
ID zařízení
Zařízení, kterému je příkaz posílán, je identifikováno jedním bajtem. Identifikátor zařízení určuje i jeho typ, protože zařízení jsou rozdělena do skupin. Teoreticky (ovšem skutečně jen teoreticky) je možné k Atari připojit devět disketových jednotek, devět tiskáren, čtyři zařízení realizující sériový port RS-232C a na konec ještě připojit „hloupý“ kazetový magnetofon. Praxe bude odlišná – počítat můžeme s maximálně dvěma disketovými jednotkami, jednou tiskárnou a samozřejmě s kazetovým magnetofonem:
| ID | Typ | Jméno zařízení |
|---|---|---|
| $31 | disketová jednotka | D1: |
| $32 | disketová jednotka | D2: |
| $33 | disketová jednotka | D3: |
| $34 | disketová jednotka | D4: |
| $35 | disketová jednotka | D5: |
| $36 | disketová jednotka | D6: |
| $37 | disketová jednotka | D7: |
| $38 | disketová jednotka | D8: |
| $39 | disketová jednotka | D9: |
| $40 | tiskárna | P1: |
| $41 | tiskárna | P2: |
| $42 | tiskárna | P3: |
| $43 | tiskárna | P4: |
| $44 | tiskárna | P5: |
| $45 | tiskárna | P6: |
| $46 | tiskárna | P7: |
| $47 | tiskárna | P8: |
| $48 | tiskárna | P9: |
| $50 | RS-232 (modem atd.) | R1: |
| $51 | RS-232 (modem atd.) | R2: |
| $52 | RS-232 (modem atd.) | R3: |
| $53 | RS-232 (modem atd.) | R4: |
| $60 | kazetový magnetofon (nepoužíváno) | C: |
Posílané příkazy
Zajímavé bude zjistit, jaké příkazy vlastně může počítač zařízením poslat. ID příkazu je uloženo v jednom bajtu, takže se teoreticky rozeznává 256 možných příkazů. Dostupných je jich však méně – několik desítek. To ovšem neznamená, že by všechna zařízení musela rozpoznávat všechny příkazy (to ani není možné). Pouze zařízení, kterému je příkaz poslán, ho musí rozpoznat a reagovat na něj (klidně i odpovědí N – negative). Příkazy mohou mít parametry předávané v bajtech aux1 a aux2 (viz popis pětibajtového příkazového rámce). Podívejme se na některé základní příkazy i s jejich stručnými vysvětlivkami:
| ID příkazu | Jméno příkazu | aux1 | aux2 | Stručný popis |
|---|---|---|---|---|
| $21 | format drive | × | × | naformátování celé diskety |
| $22 | format medium density | × | × | naformátování celé diskety (Atari 1050) |
| $3f | get speed index | × | × | zjistí dělič frekvence pro POKEY |
| $50 | write sector | sektor (nižší bajt) | sektor (vyšší bajt) | zápis do sektoru (následuje datový rámec, typicky délky 128 bajtů) |
| $51 | quit | × | × | dokončí zápis a zastaví motor (tedy vlastně flush) |
| $52 | read sector | sektor (nižší bajt) | sektor (vyšší bajt) | čtení sektoru (zařízení pošle datový rámec, typicky délky 128 bajtů) |
| $53 | get status | × | × | vrátí čtyři bajty s informacemi o stavu zařízení |
| $54 | read memory | adresa (nižší bajt) | adresa (vyšší bajt) | čtení 256bajtového bloku paměti |
| $57 | write sector with verify | sektor (nižší bajt) | sektor (vyšší bajt) | zápis do sektoru (následuje datový rámec) + verifikace čtením |
| $56 | print line | × | počet znaků | tisk celé řádky (následuje datový rámec) |
Řídicí a stavové registry čipu POKEY používané pro sériovou komunikaci
Samotný sériový přenos bajtů je řízen čipem POKEY ve spolupráci se subrutinami operačního systému (ty ovšem nejsou příliš rychlé, protože jsou založeny na reakci na přerušení). Pro sériovou komunikaci se používá pětice řídicích a stavových registrů tohoto čipu:
| Jméno | Stínový registr | Čtení/zápis | Adresa | Stručný popis |
|---|---|---|---|---|
| SERIN | čtení | $d20d | buffer pro data posílaná po sériovém portu (čtení-příjem) | |
| SKSTAT | čtení | $d20f | stavový registr sériového portu | |
| SEROUT | zápis | $d20d | buffer pro data posílaná po sériovém portu (zápis-vysílání) | |
| SKCTL | SSKCLT | zápis | $d20f | řízení sériového portu, režimu čtení klávesnice a rychlého čtení paddle |
| SKRES | zápis | $d20a | zápis jakékoli hodnoty provede vynulování bitů 5 až 7 registru SKSTAT |
Ovšem jak při posílání, tak i při čtení dat po sériové lince jsou generována přerušení, takže se v praxi navíc pracuje i s dalšími dvěma registry čipu POKEY:
| Jméno | Stínový registr | Čtení/zápis | Adresa | Stručný popis |
|---|---|---|---|---|
| IRQST | čtení | $d20e | stav jednotlivých přerušení (IRQ) | |
| IRQEN | POKMSK | zápis | $d20e | povolení či zákaz jednotlivých přerušení |
Stav sériového portu
Stav sériového portu, ale i dalších subsystémů čipu POKEY, lze zjistit přečtením stavového registru SKSTAT. Význam jednotlivých bitů tohoto registru je vypsán v tabulce:
| Bit | Stručný popis |
|---|---|
| 7 | chyba při přenosu rámce (jak příkazového, tak i datového) |
| 6 | přichází další data přes SIO, původní bajt ale nebyl přečten |
| 5 | byla stlačena další klávesa, původní kód však nebyl přečten |
| 4 | data (bajt) je přečten |
| 3 | je stlačena klávesa Shift |
| 2 | poslední stlačená klávesa je stále stlačena |
| 1 | právě se provádí čtení bajtu přes SIO (busy) |
| 0 | nepoužito |
Nejvyšší tři bity registru SKSTAT jsou určeny pro záznam chybových stavů, ať již při čtení dat přes SIO, tak i při čtení stavu klávesnice. Tyto bity je možné nastavit na výchozí hodnotu zápisem libovolného bajtu do řídicího registru SKREST, což lze typicky provést na začátku subrutiny pro přenos dat (přímý zápis do registru SKSTAT totiž není možný).
Nastavení režimu sériového portu
Nastavení režimu sériového portu (ale i dalších subsystémů čipu POKEY) se provádí zápisem bajtu do registru SKCTL. Zejména je možné nastavit takzvanou dvoutónovou modulaci použitou při práci s kazetovým magnetofonem, což je téma, kterému se budeme podrobněji věnovat příště. Samotné nastavení sériového portu spočívá v určení, jakým způsobem bude generovaný hodinový výstup a jak se bude číst hodinový vstup. To je ve skutečnosti zvláštní (možná až nadbytečné), protože SIO se typicky používá v jediném režimu – asynchronním s případnou „dopomocí“ zařízením existencí signálu Clock Out:
| Bit | Stručný popis |
|---|---|
| 7 | použito pro řízení dvoutónové modulace |
| 6 | řízení režimu sériového portu (viz níže) |
| 5 | řízení režimu sériového portu (viz níže) |
| 4 | řízení režimu sériového portu (viz níže) |
| 3 | povolení dvoutónové modulace (bude popsáno příště) |
| 2 | rychlé čtení stavů potenciometrů |
| 1 | povolení čtení klávesnice |
| 0 | povolení logiky eliminující zákmity při stisku klávesy |
Pomocí bitů 7, 6 a 5 se určuje způsob generování hodinového signálu (označením kanál máme na mysli signál získaný děličem zvoleného zvukového kanálu):
| Bity 7, 6 a 5 | Vstupní hodiny | Výstupní hodiny | Obousměrné hodiny |
|---|---|---|---|
| 0 0 0 | externí signál | externí signál | vstup |
| 0 0 1 | kanál 3+4 | externí signál | vstup |
| 0 1 0 | kanál 4 | kanál 4 | výstup, kanál 4 |
| 0 1 1 | kanál 3+4 | kanál 4 (async) | vstup |
| 1 0 0 | externí signál | kanál 4 | vstup |
| 1 0 1 | kanál 3+4 | kanál 4 (async) | vstup |
| 1 1 0 | kanál 4 | kanál 2 | výstup, kanál 4 |
| 1 1 1 | kanál 3+4 | kanál 2 | vstup |
Repositář s demonstračními příklady
Všechny demonstrační příklady, s nimiž jsme se v předchozích článcích i v článku dnešním seznámili a které jsou určeny pro překlad s využitím assembleru ca65, jsou dostupné, jak je zvykem, na GitHubu. V tabulce níže jsou uvedeny odkazy na jednotlivé zdrojové kódy příkladů psané v assembleru i „listingy“ vygenerované samotným assemblerem, ze kterých je patrné, jakým způsobem se jednotlivé příklady přeložily do výsledného XEX souboru:
Odkazy na Internetu
- MOS 6502 instruction set
http://www.6502.org/users/obelisk/6502/instructions.html - EXE File Format Description
https://gury.atari8.info/refs/file_formats_exe.php - XEX Filter – A toolkit to analyze and manipulate Atari binary files
https://www.vitoco.cl/atari/xex-filter/index.html - chkxex.py
https://raw.githubusercontent.com/seban-slt/tcx_tools/refs/heads/master/chkxex.py - ca65 Users Guide
https://cc65.github.io/doc/ca65.html - cc65 Users Guide
https://cc65.github.io/doc/cc65.html - ld65 Users Guide
https://cc65.github.io/doc/ld65.html - da65 Users Guide
https://cc65.github.io/doc/da65.html - Překladače jazyka C pro historické osmibitové mikroprocesory
https://www.root.cz/clanky/prekladace-jazyka-c-pro-historicke-osmibitove-mikroprocesory/ - Překladače programovacího jazyka C pro historické osmibitové mikroprocesory (2)
https://www.root.cz/clanky/prekladace-programovaciho-jazyka-c-pro-historicke-osmibitove-mikroprocesory-2/ - Getting Started Programming in C: Coding a Retro Game with C Part 2
https://retrogamecoders.com/getting-started-with-c-cc65/ - NES game development in 6502 assembly – Part 1
https://kibrit.tech/en/blog/nes-game-development-part-1 - NES 6502 Programming Tutorial – Part 1: Getting Started
https://dev.xenforo.relay.cool/index.php?threads/nes-6502-programming-tutorial-part-1-getting-started.858389/ - Minimal NES example using ca65
https://github.com/bbbradsmith/NES-ca65-example - List of 6502-based Computers and Consoles
https://www.retrocompute.co.uk/list-of-6502-based-computers-and-consoles/ - 6502 – the first RISC µP
http://ericclever.com/6500/ - 3 Generations of Game Machine Architecture
http://www.atariarchives.org/dev/CGEXPO99.html - “Hello, world” from scratch on a 6502 — Part 1
https://www.youtube.com/watch?v=LnzuMJLZRdU - A Tour of 6502 Cross-Assemblers
https://bumbershootsoft.wordpress.com/2016/01/31/a-tour-of-6502-cross-assemblers/ - Adventures with ca65
https://atariage.com/forums/topic/312451-adventures-with-ca65/ - example ca65 startup code
https://atariage.com/forums/topic/209776-example-ca65-startup-code/ - 6502 PRIMER: Building your own 6502 computer
http://wilsonminesco.com/6502primer/ - 6502 Instruction Set
https://www.masswerk.at/6502/6502_instruction_set.html - Chip Hall of Fame: MOS Technology 6502 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-mos-technology-6502-microprocessor - Single-board computer
https://en.wikipedia.org/wiki/Single-board_computer - www.6502.org
http://www.6502.org/ - 6502 PRIMER: Building your own 6502 computer – clock generator
http://wilsonminesco.com/6502primer/ClkGen.html - Great Microprocessors of the Past and Present (V 13.4.0)
http://www.cpushack.com/CPU/cpu.html - Jak se zrodil procesor?
https://www.root.cz/clanky/jak-se-zrodil-procesor/ - Osmibitové mikroprocesory a mikrořadiče firmy Motorola (1)
https://www.root.cz/clanky/osmibitove-mikroprocesory-a-mikroradice-firmy-motorola-1/ - Mikrořadiče a jejich použití v jednoduchých mikropočítačích
https://www.root.cz/clanky/mikroradice-a-jejich-pouziti-v-jednoduchych-mikropocitacich/ - Mikrořadiče a jejich aplikace v jednoduchých mikropočítačích (2)
https://www.root.cz/clanky/mikroradice-a-jejich-aplikace-v-jednoduchych-mikropocitacich-2/ - 25 Microchips That Shook the World
https://spectrum.ieee.org/tech-history/silicon-revolution/25-microchips-that-shook-the-world - Comparison of instruction set architectures
https://en.wikipedia.org/wiki/Comparison_of_instruction_set_architectures - How To Start Learning Atari 8 Bit Assembly For Free
https://forums.atariage.com/topic/300732-how-to-start-learning-atari-8-bit-assembly-for-free/ - WUDSN (Demo Group)
https://www.wudsn.com/ - Machine Language For Beginners
https://www.atariarchives.org/mlb/ - Assembly language: all about I/O
https://www.atarimagazines.com/v3n8/AllAbout_IO.html - Sedmdesátiny assemblerů: lidsky čitelný strojový kód
https://www.root.cz/clanky/sedmdesatiny-assembleru-lidsky-citelny-strojovy-kod/ - Color names
https://atariwiki.org/wiki/Wiki.jsp?page=Color%20names - ATASCII
https://en.wikipedia.org/wiki/ATASCII - Put characters in display ram isn't ATASCII?
https://forums.atariage.com/topic/359973-put-characters-in-display-ram-isnt-atascii/ - ATASCII And Internal Character Code Values
https://www.atariarchives.org/mapping/appendix10.php - Reading ATASCII from the keyboard in assembly
https://forums.atariage.com/topic/361733-reading-atascii-from-the-keyboard-in-assembly/ - Why does the 6502 JSR instruction only increment the return address by 2 bytes?
https://retrocomputing.stackexchange.com/questions/19543/why-does-the-6502-jsr-instruction-only-increment-the-return-address-by-2-bytes - Pushing return address to stack off by 1 byte
https://forums.atariage.com/topic/378206-pushing-return-address-to-stack-off-by-1-byte/ - Intel x86 documentation has more pages than the 6502 has transistors
https://www.righto.com/2013/09/intel-x86-documentation-has-more-pages.html - Clearing a Section of Memory
http://www.6502.org/source/general/clearmem.htm - Practical Memory Move Routines by Bruce Clark
http://www.6502.org/source/general/memory_move.html - 6502 Assembly Programming Guide
https://neumont-gamedev.github.io/posts/retrogamedev-6502-guide/ - Off-by-one error
https://en.wikipedia.org/wiki/Off-by-one_error - 6502 cycle times
https://www.nesdev.org/wiki/6502_cycle_times - Atari TIA
http://www.atarihq.com/danb/tia.shtml - TIA Playfield
http://www.atarihq.com/danb/TIA/Playfield.shtml - Atari Inc.:
ANTIC C012296 (NTSC) Revision D
Atari Incorporated, Sunnyvale CA, 1982 - Atari Inc.:
GTIA C014805 (NTSC) Revision A
Atari Incorporated, Sunnyvale CA, 1982 - Atari 5200
http://www.atariage.com/software_search.html?SystemID=5200 - Atari 5200 Hardware and Accessories
http://www.atariage.com/5200/archives/hardware.html - Atari 5200 Screenshots
http://www.atariage.com/system_items.html?SystemID=5200&ItemTypeID=SCREENSHOT - History of video game consoles (second generation): Wikipedia
http://en.wikipedia.org/wiki/History_of_video_game_consoles_(second_generation) - Atari 5200: Wikipedia
http://en.wikipedia.org/wiki/Atari_5200 - Player-Missile Graphics
https://www.atariarchives.org/agagd/chapter5.php - Sprite (computer graphics)
https://en.wikipedia.org/wiki/Sprite_(computer_graphics) - Atari Graphics Demonstrations by Underground Software, 1985 | Atari 8 bit Demo
https://www.youtube.com/watch?v=h7N9EYSyCkw - Atari 8-bit Display List Interrupts: A Complete(ish) Tutorial
https://playermissile.com/dli_tutorial/ - Atari Assembler Editor manual
https://atariwiki.org/wiki/attach/Atari%20Assembler%20Editor/ATARI%20Assembler%20Editor%20User-s%20Manual-OCR.pdf - Atari 8-bit Fine Scrolling: A Complete(ish) Tutorial
https://playermissile.com/scrolling_tutorial/index.html - Atari Fine Scrolling
https://www.atarimagazines.com/compute/issue67/338_1_Atari_Fine_Scrolling.php - CTIA / GTIA Pinout Diagram
https://user.xmission.com/~trevin/atari/gtia_pinout.html - GTIA Modes
https://page6.org/archive/issue02/page10.htm - 56 graphic modes
https://www.atari800×l.eu/docs/kb/kb-hardware-0005-atari-8bit-56-graphic-modes.html - UNLOCKING THE 56 GRAPHIC MODES
https://www.atarimagazines.com/v3n5/allmodes.html - GTIA Modes 9, 10 & 11 + ANTIC data and color clocks
https://forums.atariage.com/topic/366256-gtia-modes-9–10–11-antic-data-and-color-clocks/ - ANTIC, GTIA and timing info
https://atarimax.com/jindroush.atari.org/atanttim.html - 6.10 Cycle timing
https://github.com/AnimaInCorpore/A8E/blob/main/AHRM/6.%20CTIA-GTIA/10.%20Cycle%20timing.md - Doug Neubauer
https://en.wikipedia.org/wiki/Doug_Neubauer - POKEY
https://en.wikipedia.org/wiki/POKEY - Inside the Atari 800XL
https://www.goto10retro.com/p/800×l-inside - Grayscale Project – „Jam Session“ – Chiptune Visualization / Atari SAP
https://www.youtube.com/watch?v=Qx-AHgvwrHo&list=PL92E73FD91764173B - POKEY MUSIC ( ATARI XL / XE ) =+ MUSIC FROM POLAND += DEMO
https://www.youtube.com/watch?v=5PswfMjMop4&list=RD5PswfMjMop4&start_radio=1 - Atari.org
http://www.atari.org/ - Atari POKEY
http://www.absoluteastronomy.com/topics/Atari_POKEY - Chiptune
http://www.absoluteastronomy.com/topics/Chiptune - ASAP – Another Slight Atari Player
http://asap.sourceforge.net/ - Atari SAP music archive
http://asma.atari.org/ - RASTER Music Tracker (RMT)
http://raster.infos.cz/atari/rmt/rmt.htm - POKEY explorer
https://github.com/ivop/pokey-explorer - POKEY C012294 Documentation
https://7800.8bitdev.org/index.php/POKEY_C012294_Documentation - Pokey Registers
https://user.xmission.com/~trevin/atari/pokey_regs.html - POKEY CO12294
http://krap.pl/mirrorz/atari/homepage.ntlworld.com/kryten_droid/Atari/800XL/atari_hw/pokey.htm - De Re Atari: SOUND
https://www.atariarchives.org/dere/chapt07.php#H7_3_5 - Paddle (game controller)
https://en.wikipedia.org/wiki/Paddle_(game_controller) - Interfacing Your Atari
https://www.atariarchives.org/creativeatari/Interfacing_Your_Atari.php - Atari SIO
https://en.wikipedia.org/wiki/Atari_SIO - Atari Chips
https://atarimax.com/jindroush.atari.org/achip.html - Table 4: Keyboard Code Index, KEYCODE: ATASCII
https://www.atariarchives.org/c3ba/kcindex.php
