Organizace videopaměti počítačů Oric-1, Oric Atmos a Pravetz 8D

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

Zkoumal jsem podrobněji způsob kódování barev Oricu, 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.

Všiml jsem si totiž zvláštního skládání barev v novějších hrách, zvlášť střídání barev na lichých a sudých řádcích ve hře 1337 (a nebyl jsem sám).

Zajímalo mne proto, zda a jaká atributová omezení Oric má.
Protože do té doby mi počítač připadal asi jako ZX Spectrum s procesorem 6502 místo Z80.

Možná za to mohl i obrázek z knihy Encyclopedia of Gaming Machines.
Pochází ze hry „le Mystere de la derniere Visu„.

Není z něj nijak nápadné, že by na zobrazování strojů Oric mělo být něco zvláštního.

Ale co jsem zjistil?
Že je div, že autoři programů vůbec barvy používají!
Opravdu se divím, že těch monochromatických her je tak málo.

A vidíte ten screenshot z BBC Basicu na ZX Spectru?
Dokážete zobrazit totéž na Oricu?
I kdybyste si přepsali a pro Oric upravili onen Basicový program, který ten barevný text vypisuje, tak tohle ne-zob-ra-zí-te.
I kdybyste se nastrouhali na struhadle.

A přesto pro Oric vznikly tak barevné hry, jako třeba Manic Miner nebo Stromlord!

Převyprávím vám teď to, co považuji za nejzajímavější z článku na OSDK.org.

Oric má v podstatě dva režimy.
Textový režim (TEXT) 40×28 znaků…
… a už se zasekávám.
Zapněte si počítač nebo emulátor a začněte vkládat dlouhý řádek v Basicu. A pak si spočítejte, kolik máte znaků na obrazovce.
38.
Má tedy Oric 40 znaků na řádek?

Má i nemá. Má, ale nepoužívá je.
Povíme si potom proč.

Pak má Oric ještě grafický režim (HIRES).
240×200 pixelů.

Je odvozen od textového režimu, ale nějak to nesedí.
Pokud je výška řádku 8 bodů, a je 28 řádek, má být výška obrazu 224 pixelů.

A ona je, ale připomíná to mixed režim na Apple II: dole na obrazovce jsou tři řádky natvrdo v textovém režimu.
Na grafiku tak zbývá těch 200 pixelů na výšku.

A když si spočítáte šířku, taky to nesedí.

40 znaků po 8 pixelech je přece 320 bodů.
Oric má ale 240, tedy 60 pixelů chybí.
Znaky jsou tedy široké 6 bodů (jako v textovém režimu na počítačích s videoprocesorem TMS 9929A nebo PMD 85).

Pojďme dál.

TEXT režim potřebuje pro zobrazení 28 řádek po 40 znacích 1120 oktetů (BB80-BFDF), pro znakovou sadu 1920 oktetů (B400-B7FF) a pro alternativní znakovou sadu kupodivu 896 oktetů (B800-BB7F).
Celkem 3040 oktetů.

Funguje to jako obvykle u textových režimů. Každý oktet videoRAM obsahuje ASCII kód znaku, který se má zobrazovat.
Pokud první oktet v obrazovce (BB80) obsahuje hodnotu 65 (odpovídá písmenu A), vykreslí se do tohoto prostoru (6×8 pixelů) znak podle grafické předlohy na adrese B400+(8*65).

Mimochodem, tento režim používá většina starších her pro Oric.
V textovém režimu zobrazují rychlé animované prvky tak, že grafickou reprezentaci znaků nahradí grafickou podobou zdí, autíček nebo třeba PacManem.

V Basicu rozeznává Oric tři podobné režimy – TEXT, LORES 0 a LORES 1, což jsou ale ve skutečnosti vše jen různé způsoby využití textového režimu.

Na obrázku jsou režimy TEXT (modrý okraj), LORES 0 (červený), LORES 1 (zelený).

Odlišný je čtvrtý grafický režim, HIRES.
(Na obrázku má žlutý okraj, ale není vidět, co vlastně umí.)

HIRES je stavbou podobný textovému režimu. Se 40 oktety na řádek, každý oktet reprezentuje 6 vedle sebe ležících pixelů (z celkové šířky 240 pixelů).

Hlavní rozdíl je ten, že každý kódovaný řádek je vysoký jen jeden mikrořádek místo osmi.

Jak jsem uváděl, mikrořádků v grafice je 200, celkové grafické rozlišení je sice 240×200, ale obrazovka obsahuje na spodním okraji 3 řádky v textovém režimu.

Paměťové nároky HIRES režimu jsou vyšší než textového: 8000 oktetů pro grafickou plochu (A000-BF3F), 120 oktetů pro textovou část obrazovky (BF68-BFDF), 42 oktetů mezi oběma částmi obrazu je nevyužitých (BF40-BF67).
Základní znaková sada zabírá 1024 oktetů (9800-9BFF), alternativní znaková sada rovněž 1024 oktetů (9C00-9FFF), celkem 10210 oktetů.

Z každého oktetu se v grafice zobrazuje 6 bitů (jako na PMD-85).
Jedničkové bity se zobrazí jako barva popředí, nulové jako barva pozadí.
Oric ovšem na začátku každého mikrořádku resetuje PAPER na 0 (černá) a INK na 7 (bílá)!

Navíc běžným způsobem nelze zobrazit libovolnou kombinaci pixelů.
Kódy 0-31 jsou interpretovány jako řídící, „sériové atributy„.
Pokud daných 6 bitů obsahuje sériový atribut, vykoná se sice jako příkaz pro videoobvod, ale nezobrazuje se v něm nic, jen barva pozadí.
Oktet tedy může obsahovat atribut, nebo data k vykreslení, ale ne oboje, je to buď a nebo.

Nejvyšší bit (tedy pro kódy s hodnotou větší než 127) je využit k aktivaci inverzního režimu (což není to, co si myslíte, ale k tomu se dostaneme).

Tak tedy víme, jak zobrazit monochromatickou grafiku.

Mimochodem, zdá se vám, že v obrázku nacházíte „zakázané“ hodnoty 0-31?
Bajt předlohy ale obsahoval nastavený šestý bit (ten se jinak k ničemu nepoužívá) a tak v předloze nikde hodnoty 0-31 nejsou (jsou nahrazeny 64-95, výsledek na obrazovce je pak stejný).

Monochromatickou grafiku tedy umíme.
Další problém ovšem nastává, když chceme použít barvy.

Můžou za to „sériové atributy“.
Podívejme se na významy jejich kódů:

Vidíme, že jsou rozděleny do skupin:
* změna barvy popředí (INK)
* změna znakové sady (základní, alternativní, dvojitá velikost, blikání, …)
* změna barvy pozadí (PAPER)
* režim zobrazování (TEXT / HIRES, 50 / 60 Hz).

Přepnutí 50/60 Hz je jediný atribut, který se neprojeví hned, ale až s novým snímkem.
A jediným výsledkem přepnutí frekvence to, že vám obraz na monitoru začne plavat.
To upozorňuji předem.

Jak tedy vidíte, v jednom atributu můžete změnit barvu popředí nebo pozadí, ale nikdy obě naráz!

Navíc se sám atribut zobrazí jako prázdné místo.

To platí v textovém i grafickém režimu!

Nemůžete tedy například obarvovat různá písmena ve slově, ale jen celá slova (a atributy použít místo mezer).

Navíc atributy (kromě přepnutí frekvence) platí jen do konce řádku! S přechodem na nový řádek se zase barvy resetují (PAPER na černou a INK na bílou).

Změny barev se tedy provádí tím, že místo zobrazovaných dat vložíme hodnoty 0-7 (změní INK) nebo 16-23 (změní PAPER).

Opakuji, že je možno v jednom oktetu měnit jen jednu barvu a při změně barvy se nezobrazuje grafika!

Víme, že na začátku každého řádku se resetuje nastavení barev na bílou na černé. Editor Basicu na Oricu má ale černé písmo na bílém pozadí.

Kvůli tomu nejsou první dva znakové sloupce v editoru využité!

V prvním sloupci je atribut pro nastavení barvy pozadí (změna se projeví hned), v druhém sloupci se mění inkoust.
Editor Basicu tak používá jen 38 sloupců ze 40!

Tím přichází o 12 pixelů i grafika v Basicu a je omezena na 228×200 pixelů.

Protože se místo atributu zobrazuje barva pozadí, chcete-li se vyhnout náhlým změnám barev v obrazu, nastavte nejprve INK (změna nebude vidět, jen prázdné místo v původní barvě pozadí) a až pak PAPER (výsledek bude vypadat, jako by jen jeden sloupec vypadal nepoužitě, místo dvou).

Jenže, my tu máme barevné hry, které potřebují obarvit postavičky (l’Aigle d’or, Zorgons Revenge, Manic Miner, …).

Ne, je to tak, i když to tak nevypadá.

Kolem postaviček je šestibodový prázdný prostor, kde se mění barva, a to je jakýsi „attribute clash“, který se projeví v hrách na Oricu.
Pokud se k vaší postavičce přiblíží nějaká potvora dostatečně blízko, nebude kvůli změně barvy vašeho hrdiny v příslušném sloupci vidět!

Ona stejně většina her je v textovém režimu a skutečný grafický režim používá her méně.
On ten pohyb znakovými předlohami je totiž rychlejší.
Vzpomeňte si jen na rozdíl v paměťové náročnosti obou režimů a je vám to jasné.

Podívejme se proto, ještě než se pustíme dál, na použití znakových sad.

Znakové sady se tedy přepínají a modifikují sériovými atributy, kódy 8-15.

Alternativní znaková sada je něco, co můžeme vidět i jako semigrafiku na počítači TRS-80 (nebo Video Genie).
Tedy semigrafika v rastru 2×3 „pixely“ v jednom znaku.
(Jeden „pixel“ má velikost 3×3 skutečné pixely, kromě prostřední řady, která je na výšku omezena na 2 pixely, aby se znak vešel do 8 mikrořádek.)
Semigrafika na Oricu tvoří jakýsi pseudografický režim (LORES 1) v rastru 80×75.

Kód semigrafiky se dá odvodit od toho, jak má vypadat. Každý pixel má přiřazeno číslo, stačí sečíst hodnoty pixelů, které se nají rozsvítit, a přidat 32.

Pixely jsou organizované takto:
01 02
04 08
16 64

(Vidíme trochu nepravidelnost, tam, kde bychom čekali 32, je 64, a bit s hodnotou 32 musí být nastaven vždy.)

V režimu dvojité výšky textu se vypisuje jen polovina znaku – horní nebo dolní, o tom, která to bude rozhoduje ULA, respektive to, zda se jedná o lichý nebo sudý textový řádek.

Pokud se má scrollovat obraz s textem dvojnásobné výšky, musí se scrollovat po dvou řádcích – jinak se na lichých pozicích bude při pohybu text rozhazovat.

Blikání taky není to, co známe třeba ze ZX Spectra.
Ovlivňuje jen INK, nikoli pozadí. Barva INKu se střídá s barvou pozadí a písmo se tak v pravidelných intervalech (které se nedají měnit) objevuje a mizí.

Ještě je potřeba vysvětlit velmi zvláštní fenomén inverzního režimu, který bude pro pochopení dalších zvláštností důležitý.

Inverzní režim dělá nastavený nejvyšší (sedmý) bit v oktetu grafických dat.

Neprohazuje ale barvu popředí a pozadí, jako na Spectru, ale dosadí do popředí a do pozadí jejich doplňkové barvy.

BLACK WHITE
RED CYAN
GREEN MAGENTA
YELLOW BLUE
BLUE YELLOW
MAGENTA GREEN
CYAN RED
WHITE BLACK

Inverzní režim nám tedy dává jakousi alternativní paletu barev, které je možné prohazovat bez toho šestibodového zdržení, které by působily atributy.

Hry tak mohou být v zásadě čtyřbarevné už jen tím, že v některých blocích nastavíme inverzi.

Například Ghost Gobbler vymění zelené pozadí a modrý inkoust (kterým kreslí okolí a zdi) za fialové pozadí se žlutým inkoustem (pro vnitřek bludiště).
A třeba Magnetix zas mění černé pozadí se žlutým inkoustem za bílé s modrým popředím.

Lze textový a grafický režim kombinovat mezi sebou?

Technicky to vyloučeno není, ale jsou tu jistá úskalí.
Využít se to dá ale i pro nečekané efekty.
Jak to tedy je?

Udělejte si pokus.
Zapněte Oric a zadejte tento řádek:
HIRES:DRAW 239,199,1:TEXT
Potom stiskněte klávesovou kombinaci ESC + ] (plus se mačká se shiftem).
Kombinace znaků ESC + ] vloží na pozici kurzoru atribut pro zapnutí grafického režimu v 50 Hz.

Uvidíte na obrazovce toto:

ULA na označeném místě začala vykreslovat grafiku místo textu, a někde v polovině obrazovky narazila na hodnotu, kterou interpretovala jako atribut pro přepnutí zpět do textového režimu.

ULA bere data pro text a pro grafiku z různých (i když překrývajících se!) oblastí paměti.
HIRES bere data z adresy #A000+(Y*40)+(X/6)
TEXT bere data z adresy #BB80+((Y/8)*40)+(X/6))

Dobrá.
Teď zkuste zobrazit multicolorový text.
Tedy text, kde každý mikrořádek bude mít jinou barvu.

… máte hotovo?
Ne?
Jak to tedy provést?

Přepnout na HIRES, změnit barvu a přepnout zpět na TEXT.

Napište si na to tento malý program:
FOR Y=0 TO 40
: POKE #BB80+(Y*40)+0,30 ' HIRES
NEXT Y
FOR Y=0 TO 199
: POKE #A000+(Y*40)+1,Y AND 7 ' INK
: POKE #A000+(Y*40)+2,26 ' TEXT
NEXT Y

Fór je v tom, že při změně režimu se následující data vyčítají z jiného místa v paměti.

Pokud se vše podařilo, vidíte něco takového:

Můžete si všimnout toho, že některé znaky jsou poškozené.
Je to tím, že oblast grafického displeje, kam se zapisovaly atributy, koliduje s oblastí fontu pro textový režim.

Adresy B400 pro základní a B800 pro alternativní znakovou sadu jsou zhruba uprostřed paměti použité pro grafiku.

Kolik HIRES mikrořádek lze tedy zobrazit bez poškození textové znakové sady?

B400 (počátek znakové sady) – A000 (začátek HIRES oblasti) = 5120 oktetů.
5120 / 40 (délka mikrořádku v oktetech) = 128 řádků.
A po 128. řádku je oblast, kde dojde k poškození znakové sady.

Hodí se asi vědět, které znaky se poškodí.
Pokud tedy víte, které oktety na grafické obrazovce budete plnit atributy, můžete odvodit, které znaky se poškodí.

V příkladu se zapisovalo na každém mikrořádku do offsetu 1 a 2, tedy se změní dva mikrořádky každého pátého znaku (A, F, K, P, U, Z, …) z 96 znaků, 76 zůstává normálně použitelných.

Další příklad ukazuje, že je možné vkládat HIRES okno do textového režimu:

Když se nad tím zamyslíte, troufli byste si na Oricu, po přečtení toho všeho, vytvářet barevnou hru?

A tím se dostáváme k AIC:

ALTERNATE INVERTED COLORS

Což je vlastně z toho všeho, co jste si právě přečetli, odvozená technika, kterou používají moderní hry pro Oric.

Dlouhou dobu ty nejlepší hry pro Oric zůstávaly u jednoduché grafiky, byly monochromatické, nebo při pohybu objektů silně trpěly atributovými a barevnými kolizemi.

Například Super Advanced Breakout: hra se dobře hraje, je plynulá a rychlá, ale ne moc hezká.

V prvních dvou sloupečcích se nastaví červený INK a žlutý PAPER, který se pak pomocí inverzního režimu převrací na modré a modrozelené cihličky.

Když Jonathan Bristow (Twilighte) pracoval na portu hry Pulsoids, chtěl docílit vzhledu více podobného originálu na Commodore 64.
Vymyslel metodu Alternate Inverted Colors, a výsledkem byla takováhle hra (z roku 2002):

Evidentně se na obrazovce objevuje víc barev a vzorů, než u Breakoutu.

Použita je podobná metoda, jako u Breakoutu, ale jsou použity dvě sady barev, které se ob řádek střídají:

BLACK PAPER YELLOW INK WHITE PAPER BLUE INK
BLACK PAPER CYAN INK WHITE PAPER RED INK
BLACK PAPER YELLOW INK WHITE PAPER BLUE INK
BLACK PAPER CYAN INK WHITE PAPER RED INK

Použití ve hře Pulsoids pak dává takovéhle výsledky:

Správným použitím inverze na některých segmentech bylo možné dosáhnout mnohem většho počtu různých druhů cihliček!

Od té doby tuto metodu použilo více her za použití stejných nebo jiných barevných kombinací, podle okolností.

V zásadě to znamená, že se na obrazovce při pravidelném střídání ob řádek používá sada šesti vzájemně doplňkových barev, při použití černého pozadí jsou dvě z nich černá a bílá a čtyři další se odvozují ze střídajících se dvou barev inkoustu.
(Použití černého pozadí má i tu výhodu, že se nemusí nastavovat a obraz je pak okrojen jen o jeden sloupeček s nastavováním barvy inkoustu.)

Stormlord (z roku 2010) je jedna z nejbarevnějších Oric her, a dobře hratelná.
Používá velké (softwarové) sprity, spoustu grafiky, intenzivně využívá střídání barevných kombinací pomocí inverze, a podobně jako Pulsoids používá všude černé pozadí.

Impossible Mission (z roku 2010) pracuje s menší a detailnější grafikou a složitými animacemi.

SkoolDaze (port z roku 2012) ukazuje, že s AIC lze rollovat herní oblast, pokud se tak děje po šesti pixelech. AIC v zásadě nepracuje s atributy a je jen nutno dát pozor, aby se atributy neodscrollovaly pryč spolu s grafikou.

Gamejam 2015 (dle názvu jde o hru z roku 2015) byla soutěžní hra na The Global Game Jam 2015 v Oslu (Game Jam se koná též v Praze), ale nenašel jsem ji nikde ke stažení.
Screenshot zobrazuje stanici metra v norském Oslu, s animovanými reklamnimi bannery, kde reklamy scrollují nahoru a dolů.

Blake’s 7 (rok 2017) je grafická adventure s ovládaním systémem point-and-click, jako u Sierry.

Obrázek ze zatím nehotové hry Wurlde ukazuje, že při vhodně zvolených barvách může AIC vypadat i velmi dobře, jinak než nazelenalé barevné kombinace převzaté ze Stromlorda.