Organizace videopaměti počítačů Apple II a počítačů Apple //e a //c

Aneb když tvůrci počítačů hulej fakt vostrej matroš.

Zkoumal jsem podrobněji způsob kódování barev u jedné platformy, která se objevila na letošním Bytefestu, a nějak jsem nevěřil vlastním očím, že něco takového se vůbec někdo odvážil vymyslet, zkonstruovat a vyrábět.
A ještě víc jsem přestával věřit tomu, že někdo našel odvahu to vůbec používat.

Myslel jsem si předtím, že si Wozniak při vymýšlení způsobu kódování barev v režimu hi-res na Apple II půjčil nějakej fakt vostrej matroš od svého zhuleného kámoše, taky Steva.
Ale ne.
To, co se mu podařilo pro Apple II vytvořit, to byla proti tomuhle jen taková selanka (to slovo mimochodem pochází z polštiny, Wozniak byl potomek polských emigrantů).
Tak se tedy podívejme nejprve na tu Wozniakovu selanku, než se pustíme do opravdové šílenosti.

Apple II LO-RES

Lo-res na Apple II je ještě celkem normální.

V lo-resu zobrazuje Apple II 15 barev, jeden “pixel” je ale velký jak půlka znaku v textovém režimu.

Použitý je stejný úsek paměti, jako v textovém režimu, který je u původního Apple II (ne u Apple II GS) černobílý.
Tedy 0400-07FF.
Ve skutečnosti má ale Apple II dvě videoRAM, druhá je v prostoru 0800-0BFF, to je ale prostor, kam se běžně ukládá program v Applesoft Basicu. Druhá VideoRAM se připíná na adrese C055, první na C054.

V bloku 128 oktetů za sebou následujících jsou kódovány tři řádky po 40 znacích, tedy 120 oktetů (zbylých 8 používá OS pro svoje účely, podobně jako “zápisník” u VideoRAM PMD-85).
Každý bajt kóduje dva pixely umístěné ve znaku nad sebou, takže textový režim 40×24 nahrazuje grafikou 40×48 pixelů. Znaky jsou v rastru 6×8 pixelů, “pixely” grafického módu pak mají 6×4 mikropixely.

“Pixely” 6×4 mikropixely mají každý svou barvu nezávisle na ostatních.
Použití 4 bitů pro jeden “pixel” by znamenalo 16 barev – ve skutečnosti ale jen 15, protože v souboru je 2x obsažena šedá (0101 a 1010).
(Výjimkou je Apple II GS, které zobrazuje barev opravdu 16).

Samotné zobrazení je provedeno tak, že vlastně zobrazuje kód barvy jako 4 sousedící pixely, které kombinuje s barvonosným signálem, který je proti nosnému signálu otočen o 90° a má čtvrtinovou frekvenci (při dekódování barvy jednoho “pixelu” na obrazovce se čtyřikrát změní amplituda nosného signálu).
Na monochromatickém monitoru jsou pak “barvy” vidět jako různé mikropixelové rastry.

Kvůli generování barev posunem barvonosného signálu proti nosnému zobrazují původní modely Apple ][ a Apple ][+ barevně jen v NTSC režimu.
Evropská a japonská verze Apple ][+ (Apple ][ Europlus) zobrazují jen monochromatickou grafiku!
Terpve evropská verze Apple //e a //c generuje barevný PAL signál (a některé asijské klony Apple ][+/Europlus).

K lo-res režimu existuje ještě “mixed” režim, ve kterém jsou na spodním okraji obrazovky zobrazovány 4 řádky v textovém režimu.

LO-RES si jako zobrazovací režim vybral autor (nedokončené) konverze hry Another World pro Apple ][.

Apple II HI-RES

Hi-res je už větší haluz.

Kvůli většímu rozlišení 280×192 pixelů zabírá více paměti.
VideoRAM jsou opět dvě, jedna v prostoru 2000-3FFF, druhá v prostoru 4000-5FFF.

Grafika se zapíná na adrese C050, hi-res na C057, fullscreen bez hardwarového textového módu na spodních 4 řádcích na adrese C052.
Přepínání VRAM je stejné jako v lo-res režimu. Druhá VideoRAM se připíná na adrese C055, první na C054.

K tvorbě barvy je opět použito posunutí barvonosného signálu.
Barva by pak měla odpovídat kombinaci dvou sousedících bitů, tedy by na obrazovce měly být 4 barvy.
Wozniak jich tam ale dostal 6.
Tedy 6 na barevném monitoru – protože na monochromu vidíte jen černou, bílou a rastrování.


Nemůže být navíc každá barva na každé pozici.

Jak je to uděláno?

Opět je vše organizováno v blocích 128 oktetů za sebou následujících, kde jsou kódovány tři mikrořádky po 40 sedmipixelových blocích, tedy 280 pixelech (a opět zbylých 8 oktetů je “volných” a občas je někdo na něco použije).

Barvu tvoří vždy dva sousední pixely.

Nejvyšší bit v oktetu je použit pro něco jako “přepínání palety” – shozený dává barevnou kombinaci černá, bílá, fialová, zelená, nahozený zas kombinaci černá, bílá, světlemodrá, oranžová.
Ve skutečnosti nahozený nejvyšší vit způsobí zpoždění zobrazování o půl pixelu, čímž dojde k jinému nakombinování nosného a barvonosného signálu a tím tvorbě jiných barev.

Bity v oktetu, kódující pixely, jsou organizovány převráceně – zleva doprava od nejnižšího k vyššímu.
(Se traduje, že na mezerách mezi třířádkovými bloky ušetřil Wozniak nějaké čipy a převrácením pořadí pixelů ušetřil další dva čipy.)

Jestliže pak jakékoli dva za sebou následující pixely (i třeba když je každý v jiném oktetu) jsou oba shozené, dávají černou, jestliže jsou nahozené, dávají bílou.

Pokud je mikropixel osamocený, t.j. má sousedy v nule, obarví se podle své pozice na obrazovce (sudý / lichý) a “palety” (nastavené nejvyšším bitem v oktetu).
Na lichých pozicích jsou tedy pixely zelené nebo oranžové, na sudých fialové nebo světlemodré.

Plocha, která má být vyplněna barvou, která není bílá nebo černá, musí být tedy rastrovaná (jakmile by totiž byly dva nastavené pixely vedle sebe, zbělají).

Dále z toho vyplývá, že v jednom oktetu (7 pixelů) nemůžou být dvě barvy z různých “palet” vedle sebe (třeba zelená s oranžovou).

Dále z toho vyplývá, že při vykreslení textu (s čárami jeden pixel širokými) jsou horizontální čáry bílé, ale svislé nebo šikmé jsou – podle pozice pixelu (sudý / lichý) zbarvené podle palety (obvykle zelená nebo fialová).
Těmto artefaktům se dá vyhnout tím, že svislé čáry ve fontu budou dvoupixelové.

Dobrá šílenost?

A teď zkuste nakreslit šikmou oranžovou čáru.
Je jasné, že nemůžete kreslit čáru normálně v pixelech, protože v závislosti na úhlu by ty, které by spolu horizontálně sousedily, zbělaly, a z těch, co by nesousedily, by ty sudé zmodraly.
Takže čára se bude kreslit jen v lichých pixelech, má-li být oranžová.

A teď nakreslete oranžový objekt na zeleném pozadí.
Nepůjde to, obě barvy musí být kódovány v různých oktetech (tedy musí být v jiné sedmipixelové skupině).

Skoro si člověk říká – “zlaté atributové kolize”.

A to šest barev je dodatečný hack – původní nejstarší verze Apple ][ uměla jen čtyři barvy (černá, bílá, zelená, fialová). Přepnutí palety (oranžová a modrá) je trik dodatečně Wozniakem doplněný až po zahájení výroby do Apple ][+.
Stejně tak dodatečně vznikl “color killer“, tranzistor, který po přepnutí do textového režimu vypíná barvonosný signál, aby nedocházelo k barevným artefaktům.

Pro úplnost bych měl zmínit grafické režimy, které přišly se zavedením karet zobrazujících 80 znaků na řádek.
Někoho napadlo, že nově vyráběný počítač, Apple //e s revizí desky A, má dost paměti (128 KiO v základu) i dostatečnou frekvenci obrazového signálu (díky 80 znakům na řádek dvojnásobnou proti 40 znakům), že by mohl zobrazovat v lepších grafických režimech.

Nápad bohužel, stejně jako dříve nápad s přepnutím palety, přišel až po zahájení výroby, takže nové režimy umí až Apple //e revize B a pozdější (Apple //e Enhanced, Apple //c, Apple II GS).
Ze stejného důvodu se na Apple //e nedají nové režimy použít z Basicu, to umí až Apple //c a II GS.

Nové režimy jsou odvozeny z těch původních.

Apple //e double LO-RES

Double lo-res vznikl zdvojnásobením původní lo-res grafiky v horizontálním směru, měl by mít rozlišení 80×48 (80×40 v mixed režimu) bodů, z nichž každý může nabývat některé z oněch 15 barev.
Rozlišení je už dostatečné na to, aby grafika vypadala jako jednoduchý obrázek, a barevnost umožňuje i slušnou konverzi fotografií.
Paměťová náročnost proti původnímu lo-res je logicky dvojnásobná.
Vyčítání dat k zobrazení se provádí v původním prostoru VideoRAM, ale data se berou souběžně ze dvou bank. Jako první se vyčítá oktet z AUX paměti, druhý z MAIN paměti.


Apple //e double HI-RES

Double hi-res sedí opět ve stejném prostoru jako hi-res, stejně jako double lo-res se vyčítá ze dvou bank (první oktet z AUX, druhý oktet z MAIN), ale přináší trochu změny.

Jeho připnutí provede přístup na tyto adresy: C057 (hi-res), C050 (grafika), C05E (anunciator 3), C053 (fullscreen nebo mixed), C00D (80 znaků).
Dále existuje přepínač 80STORE na adrese C000 (off) a C001 (on), který přepne funkci přepínání VideoRAM (dolní / horní) nebo přepínání bank VRAM (AUX / MAIN). Zda se přitom stránkuje textová (lo-res) nebo grafická (hi-res), určuje kombinace s přepínačem HIRES na adrese C057.
Podrobnější vysvětlení můžete najít v pěkném dokumentu na http://www.appleoldies.ca/graphics/dhgr/dhgrtechnote.txt

Autorem double režimů není nejspíš přímo Wozniak, který tou dobou v Apple nebyl, ale někdo, kdo se podílel na videoobvodech Apple ///, protože s ním sdílí podobné principy.
Apple tou dobou používal VLSI čipy, takže návrh už neovlivňoval počet brouků na desce, ale jen velikost obsazeného místa ve VLSI čipech.

Mikropixely jsou v oktetech organizovány stejně, jako v hi-res, tedy převráceně, nejnižší bit je zobrazen nejvíce vlevo a vyšší bity vpravo.
Z oktetu se použije jen 7 bitů, nejvyšší se ignoruje.

Režim obsahuje 560×192 pixelů. Obarvování pixelů určuje kombinace 4 bitů za sebou jdoucích.
Dva barevné pixely tedy kóduje 8 bitů, ale ty vždy leží v různých oktetech, protože těch 8 bitů se do 7 použitých bitů prostě nevejde.

Pěkná tabulka barev pro double hi-res režim je ZDE.

Samozřejmě, stejně jako u hi-res režimu, neplatí, že máme pixely široké 4 mikropixely, které jsou kódované 4 bity, a sousední pixel může mít další libovolnou barvu.
Pokud například posadíme oranžovou vedle modré:
0000000 |0110011 | 11001100
tak dostaneme na jejich rozhraní bílý bod – neb tam máme čtyři jedničkové bity za sebou!

Takže i v double hi-res režimu se musí kombinovat opatrně.
To ale neznamená, že by se s ním nedalo dosáhnout úžasných výsledků, jak předvádí třeba obrázky ze hry Might and Magic II.

No ale to není ta správná halucinogenní haluz.
Tu si nechávám na příště.