Grafika na osmibitovém počítači Enterprise: EXOS a jeho služby

Slíbili jsme si, že se opět podíváme na grafický čip počítače Enterprise, konkrétně na služby operačního systému EXOS, spojené s grafikou.
Pohled na služby EXOSu je jednoduchý. Tím, že se samy starají o uložení grafických předloh jednotlivých “videostránek” do paměti, zajišťují tyto rutiny jejich zobrazování v oknech, scrolling a další složité a komplexní funkce, včetně skrývání oken.
“Line parameter table” je řízena tak, aby obsahovala 28 záznamů pro 28 bloků po 9 mikrořádcích (tedy 28 textových řádek, přesněji jeden informační řádek uložený na pevném místě v paměti a 27 řádek dostupných uživateli).
V každém z těchto devítimikrořádkových bloků se může objevit libovolná část libovolné “videostránky”.
Na začátek “line parameter table” ukazuje systémová proměnná LP_POINTER.

Jak víme, souřadnicový systém pracuje s přesností mnohem převyšující rozlišení obrazu na Enterprise (972×1344, t.j. dvojnásobek horizontálního a čtyřnásobek vertikálního rozlišení).
Znakové a semigrafické režimy používají souřadnice vycházející z levého horního rohu místo z dolního a nejdou po bodech, ale po znacích.
Atributový režim používá jak textový, tak grafický kurzor.

Videostránky

Videostránka se vytvoří při otevření kanálu, její charakterostiku určují systémové proměnné podle toho, jjak jsou při otevření kanálu nastaveny:

Režim zobrazování videostránky je definován systémovou proměnnou MODE_VID:
0 – HW textový režim do 42 znaků na řádek
1 – hi.res grafika
2 – softwarový textový režim do 84 znaků na řádek
5 – lo-res grafika
15 – atributová grafika
Jakákoli jiná hodnota způsobí při pokusu o otevření kanálu chybu.

Barevný režim každé videostránky určuje systémová proměnná COLR_VID:
0 – 2 barvy
1 – 4 barvy
2 – 16 barev
3 – 256 barev
Jiné hodnoty budou redukovány pomocí modulo 4.
Atributová grafiika musí být nastavena do dvoubarevného režimu, i když se ve skutečnosti bude zobrazovat 16 barev (rutiny systému by pak produkovaly nesprávně organizovanou bitmapu – bitmapa pro atributový mód musí být generována stejně jako dvoubarevná).

Velikost stránky nastavují proměnné X_SIZ_VID a Y_SIZ_VID. Výška v řádcích může být 1-255, i když zobrazit z nich jde jen 27 naráz.
Šířka může být až 42 sloupců (měří se v lo-res). Nesprávné hodnoty způsobí při pokusu o otevření kanálu chybu.
Většina služeb pracujících se šířkou okna používá X_SIZ_VID, je proto potřeba pamatovat na to, že při použití textového módu 84 znaků na řádek je hodnota šířky v X_SIZ_VID poloviční, 42.

Pro zjištění aktuální hodnoty výšky a šířky videostránky slouží samostatná služba. Pokud se velikost stránky neměnila, vrací hodnoty odpovídající nastavení X_SIZ_VID a Y_SIZ_VID v okamžiku otevření kanálu pro stránku, u softwarového textového módu samozřejmě vrací šířku dvojnásobnou (odpovídající skutečnému počtu hi-res znaků) než při otevření kanálu.
Parametry: A – číslo kanálu (0..255), B=2 (@@SIZE).
Vrací: A – status. B – počet znaků na řádek. C – počet řádek. D – režim (0, 1, 2, 5 nebo 15).

Vytvořené videostránky se zobrazí na obrazovce až po zavolání další funkce.
Parametry: A – šíslo kanálu (0..255), B=1 (@@DISP), C – první řádek ve stránce k zobrazení (při nule se stránka nezobrazí a okno se vyplní barvou borderu), D – počet řádek k zobrazení (1..27), E – řádek na obrazovce, od kterého se bude videostránka zobrazovat (1..27, nelze vypisovat do řádku 0, kde je zobrazen status).
Vrací: A – status.
při hodnotách mimo meze vrátí chybu .VDISP.
Při zavření kanálu se jeho oblast nahradí barvou borderu (nastavením okrajů zobrazované plochy).

Při otevření kanálu alokuje videodriver paměť pro kanál: 16 bajtů desktiptor kanálu a dále specificky pro zařízení “VIDEO:” 128 bajtů pro systémové proměnné plus dva bajty na ukazatel každé řádky paměť pro grafická data.
Vzhledem k tomu, že vyšší barevnost zvětšuje šířku pixelu, zabírá v jednom videomódu stejná šířka okna vždy stejné množství paměti bez ohledu na barevnost (snížením barevnosti se neušetří paměť, jen zvýší horizontální rozlišení).
Kde leží paměť naalokovaná pro grafická data, lze zjistit službou vracející načtené pointery LD1 a LD2 (jejich význam jsme si už vysvětlovali při popisu hardware, protože v některých módech, konkrétně v ATTR režimu a ve znakových režimech, jsou grafické oblasti alokovány dvě).
Adresy nejsou adresovány z pohledu procesoru Z80, ale z pohledu čipu Nick. Adresy #0000..#3FFF odpovídají stránce #FC, #4000..#7FFF stránce #FD, #8000..#BFFF #FE a #C000..#FFFF stránce #FF.
Parametry: A – číslo kanálu (0..255), B=3 (@@ADDR).
Vrací: A – status, BC – primární pointer (odpovídající většinou LD1), DE – sekundární pointer (vůbec nemusí odpovídat LD2).
Nezapomínejte, že některé služby kernelu mohou adresy ve VideoRAM posouvat, například otevření a zavření jiných kanálů, linkování zařízení, nahrání rezidentního rozšíření systému.

Hardwarový znakový mód (mód 0) zobrazuje znaky paletovou barvou 0 a 1, u znaků s kódem větším než 127 pak barvou 2 a 3.
“Grafická” data jsou reprezentována kódy znaků tak, jak jdou po řádcích za sebou. Díky podpoře scrollingu pouhou změnou pointerů nemusí začátek grafických dat nutně odpovídat začátku první řádky.
Umístění v paměti a velikost:
DE=BC=začátek ASCII textu.
RAM=128+2x výška + šířka x výška

Softwarový znakový mód (mód 2) udržuje znakovou podobu textu jako hardwarový znakový mód, vedle které udržuje odpovídající grafickou bitmapu, kterou vlastně Nick zobrazuje. Textovou podobu používá jen software ovladače videa.
Bitmapa obsahuje za sebou jdoucí mikrořádky ve dvou barvách (jeden bajt na osm bodů), devět za sebou jdoucích mikrořádek tvoří textový řádek.
Vzhledem ke scrollování ne vždy začátek grafických dat odpovídá začátku zobbrazované oblasti.
Při vytváření bitmapy odmaskovává ovladač nultý a sedmý bit a vkládá do něj grafickou informaci:
bit 0  bit 7  barvy palety
    0      0  0 a 1
    0      1  2 a 3
    1      0  4 a 5
    1      1  6 a 7
Paměťové nároky a umístění jsou:
BC – adresa začátku bitmapy, DE – adresa začátku ASCII mapy.
RAM=128+2x výška + 20x šířka x výška

Pixelové grafické módy (módy 1 a 5) v hi-res (mod 1) a lo-res (mód 5) se liší horizontálním rozlišením a velikostí alokované paměti. Jinak zobrazují obsah paměti jako barevně kódovanou bitmapu (ve dvou, čtyř, šestnáctibarevném a 256barevném módu).
Plná šířka obrazovky v lo-res režimu je 42 bajtů a v hi-res režimu 84 bajtů.
Paměťové nároky a umístění jsou:
BC – adresa levého horního rohu grafických dat v RAM, DE – nedefinovatelná hodnota.
RAM [lo-res]=128+2 x výška +9 x šířka x výška
RAM [hi-res]=128+2 x výška +18 x šířka x výška

Atributový grafický mód (mód 15) přistupuje ke grafickým datům jako k dvojbarevné bitmapě, kde vždy osm za sebou jdoucích bodů obarvuje podle infoormací z atributové mapy, kde horní nibble bajtu určuje barvu papíru (0..16) a dolní nibble bajtu určuje barvu inkoustu (0..16).
Paměťové nároky a umístění jsou:
BC – adresa začátku bitmapy pixelů, DE – adresa začátku atributů.
RAM=128+2x výška + 18x šířka x výška

Tisk znaků

Znaky lze tisknout po jednom nebo jako řetězec.
Tisknutelné jsou znaky s kódy vyššími než 31.
Znaky s kódy 128-255 se tisknou jako znaky z dolní poloviny znakové sady, takže znak s kódem 160 se vytiskne jako mezera (znak s kódem 32). Nicméně tisk znaku s kódem 159 (128+31) vytiskne znak podle grafické předlohy pro znak na pozici 31, ale tisk znaku s kódem 31 se interpretuje jako řídící kod (konkrétně 31 neudělá nic a je ignorován) a odpovídající bitmapa se proto nezobrazí.
Defaultní font odpovídá ASCII, znaky jsou 8 bitů široké a 9 bajtů vysoké (a to včetně mezer mez znaky a mezi řádky), znaky lze ovšem předefinovat pomocí ESC sekvence.

Ve znakovém režimu se znaky zobrazují na textových souřadnicích, na konci řádku dojde k přechodu na nový řádek a na poslendím řádku dojde, pokud to není zakázáno, k automatickému odscrollování.

V grafických režimech se tiskne na pixelovou pozici určenou grafickým kurzorem, nemusí být tedy centrován přesně na hranice znaků. Po tisku se grafický kurzor přesune na další znakovou pozici. Pokud by se znak na konec řádky nevešel, dojde k přechodu na nový řádek. Pokud se k dolnímu okraji celý znak nevejde, nevypíše se nic. Automatické scrollování v grafických režimech není.
Ve fontu nastavené bity se vytisknou barvou inkoustu, shozené se netisknou a grafický obsah ležící pod znakem se tak nemění – nedochází k přepisování původního obsahu barvou papíru.
Protože ve vícebarevných módech se zvětšuje horizontální šířka pixelu, a znak by byl hodně roztažen do šířky, tisknou se znaky v 16 a 256barevném módu ve dvojnásobné výšce.

V atributovém režimu udržuje systém zvlášť grafický kurzor a zvlášť kurzor textový, na který vypisuje text podobně jako ve znakových režimech, zarovnaný na pozice.
Po dosažení konce řádky přejde na novou řádku, při dosažení dolního okraje videostránky přejde na její začátek. Automatické scrollování v atributovém režimu není.
To, zda a jak znak přepisuje původní grafická data, ovlivňuje nastavení flagu, který se na úrovni služeb EXOSu ovládá ESC sekvencí (viz přehled ESC sekvencí).

Řídící kódy a ESC sekvence pro libovolné (textové i grafické) videostránky jsou:
#1B – ESC, uvozuje ESC sekvenci
#1A – ctrl+Z – smaže videostránku a vrátí kurzor na výchozí pozici.
#0A – ctrl+J – linefeed. posune kurzor dolů na další řádek (na dolním okraji okna při povoleném scrollování odscrolluje).
#0D – ctrl+M – CR. Vrátí kurzor na začátek aktuální řádky.
#1E – ctrl+^ – kurzor na výchozí pozici (RS).
ESC K<n><r1><r2><r3><r4><r5><r6><r7><r8><r9> – definice znaku (změna fontu se týká všech kanálů a videostránek, už zobrazené znaky se změní jen v hardwarovém znakovém režimu, ne v softwarovém). Bitmapa znaku s kódem <n> se předefinuje devíti bajty, každý je grafickou předlohou jednoho mikrořádku.

ESC C<c><c><c><c><c><c><c><c> – nastavení všech barev palety (osm bajtů, každý definuje barvu COL0..COL7)
ESC c<n><c> – nastavení jedné barvy palety <n> (0..7) na barvu <c>.

ESC I<n> – nastavení inkoustu na barvu <n>
ESC P<n> – nastavení papíru na barvu <n>
Rozsah musí odpovídat barevnému módu (2 barvy, 4, 16, 256). Změna barvy papíru se projeví při smazání videostránky. Změna barev se netýká znakových módů, kde se barvy mění jinak a je potřeba ponechat defaultní hodnoty.

ESC =<y><x> – nastavení kurzoru na pozici y-32, x-32. Při x nebo y rovném 32, tedy řádek/sloupec vychází nula, souřadnice se nezmění.

Řídící kódy a ESC sekvence pro znakové videostránky jsou:
#19 – ctrl+Y – smazání do konce řádku. Nehýbe s kurzorem.
#08 – ctrl+H – kurzor doleva (BS)
#09 – ctrl+I – kurzor doprava (TAB)
#0B – ctrl+K – kurzor nahoru (VT)
#16 – ctrl+V – kurzor dolů (SYN)

ESC ? – načtení textové pozice kurzoru, hodnoty prvních dvou znaků načtených z daného kanálu udávají souřadnice <y><x>.

ESC .<n> – nastavení tvaru kurzoru na znak s kódem <n>
ESC M<n> – nastavení barvy kurzoru na paletovou barvu <n>
ESC O – zobrazování kurzoru zapnuto
ESC o – zobrazování kurzoru vypnuto
ESC S – automatický scroll zapnut
ESC s – automatický scroll vypnut
ESC U<m><n> – scroll nahoru řádek (m-32) až (n-32), m je menší nebo rovno n
ESC D<m><n> – scroll dolů řádek (m-32) až (n-32), m je menší nebo rovno n

Řídící kódy a ESC sekvence pouze pro grafické videostránky jsou:
ESC A<xx><yy> – pozice grafického kurzoru na souřadnice x, y, které jsou 16bitové, nižší bajt první
ESC R<xx><yy> – relativní pohyb grafického kurzoru o x, y pozic
ESC @ – načtení pozice grafického kurzoru, hodnoty prvních čtyř znaků načtených z daného kanálu udávají souřadnice <xx><yy>.
ESC S – zapnutí vykreslování (“pero dolů”)
ESC s – vypnutí vykreslování (“pero nahoru”)
ESC .<n> – nastavení stylu čáry – 1 je plná čára, 2 až 14 jsou různé typy přerušovaných čar.
ESC M<n> – nastavení režimu čáry – 0 kreslení (PUT), 1 – OR, 2 – AND, 3 – XOR
ESC a<n> – nastavení atributových flagů (pouze v atributovém režimu) – osm flagů, které se nastavují jako celý bajt. Dají se spolu kombinovat sečtením hodnot, normální stav je v nule.
          bit 0 – kreslení nulovými pixely (barvou papíru)
          bit 1 – kreslení bez ovlivnění bitmapy (pixelových dat)
          bit 2 – kreslení bez ovlivnění atributů inkoustu
          bit 3 – kreslení bez ovlivnění atributů papíru
          bit 4 – výpis textu nulovými pixely
          bit 5 – výpis textu bez ovlivnění bitmapy (pixelových dat)
          bit 6 – výpis textu bez ovlivnění atributů inkoustu
          bit 7 – výpis textu bez ovlivnění atributů papíru.
ESC F – plnění plochy na aktuální pozici grafického kurzoru
ESC E<xx><yy> – kreslení elipsy na aktuální pozici grafického kurzoru o poloměru na výšku a šířku x, y, které jsou 16bitové, nižší bajt první

Informační řádek leží, jak už víme, mimo běžnou strukturu videostránek a kanálů. Jde o první záznam v “line parameter table”, na který se videostránky a kanály normálně neodkazují. Začátek jeho dat ukazuje systémová proměnná LP_POINTER, používá ji ovladač kazeťáku k zobrazování stavu signálu pomocí změny palety. Ostatní programy mohou stav informačního řádku měnit zapisováním do něj. Jeho textová data jsou ukazována dvojbajtovou proměnnou ST_POINTER, jsou dlouhá 40 bajtů, adresování je pro paměťovou stránku 2 (z pohledu adresování Z80) s nastránkovaným segmentem #FF.
Proměnná ST_FLAG určuje, zda se má informační řádek zobrazovat nebo ne (v tom případě se místo něj zobrazje barva borderu). Stav proměnné ST_FLAG si hlídá ovladač obrazovky při každém přerušení, takže na změny stihne zareagovat rychle, vypnutí zobrazování provádí vhodným nastavením okrajů zobrazovacího okna řádku.
Barvu borderu a bias registr ovládá driver při každém přerušení zápisem hodnoty z proměnných BORD_VID a BIAS_VID (do BIAS registru se do dolních 5 bitů zapíše horních 5 bitů ze systémové proměnné, horní bity registru jsou nastaveny podle proměnné MUTE_SND, vypínající zabudovaný speaker).

Všechny textové výpisy používají společný font, při předefinování znaku zůstává nová definice zachována pro všechny následující výpisy (a pro hardwarové znakové riýimy se změny projeví i u znaků už zapsaných).
Resetovat font zpět na původní znaky lze touto službou:
Parametry: A – číslo kanálu (0..255), B=4 (@@FONT)
Vrací: A – status

Závěrem

Enterprise se pyšní podtitulem “with the obsolence build out”, který měl demonstrovat, že je počítač navržen tak, aby nezastarával.
Je to vidět na snaze neomezovat se příliš velikostí RAM (rozšiřitelné na 4 MB) nebo ROM (Enterprise naadresuje standardně 64 kB ROM různých externích zařízení), nevázat se příliš na jediný operační systém (IS-Basic je umístěn v cartridge a dá se proto snadno vyměnit za Pascal, Forth nebo Lisp). Vnější rozhraní i přes snahu ušetřit (místo konektorů jsou přípojná místa realizovaná přímo deskou jako “přímé konektory”, síť a RS-232 jsou realizovány silnou podporou software a hardwarová zapojení jsou jen velmi jednoduchá) jsou pestrá a je možno připojit kde co přes sériový nebo paralelní port.

V případě grafiky se to projevuje souřadnicovým systémem, který počítá s možnými většími rozlišeními do budoucna, které je možné zavést, aniž by to výrazně negativně ovlivňovalo existující software – vektorová grafika kreslená pomocí systémových služeb nebo Basicu by v novém rozlišení měla vypadat stejně velká, jako ve starém rozlišení, ale být jemnější.
Podpora 256 barev, i když za cenu snížení horizontálního rozlišení, je další známkou této tendence.
Dalším projevem této snahy je vstup pro externí barvy na čipu Nick, který umožňuje jeho rozšíření o generátor hardwarových spritů, doplnění o vstup synchronizovaného televizního obrazu pro titulkování nebo tvorbu efektů, či třeba o 3D kartu, jejíž 3D obraz s polygony, stínováním a potahováním těles bitmapou by bylo možné prolínat s obrazem generovaným původním čipem Nick.

To, že je Enterprise zajímavý a velmi pozoruhodně navržený stroj, který měl být dostatečně výkonný, na budoucnost orientovaný, a přitom dostatečně levný, je neoddiskutovatelné.
A o tom, že za jeho komerčním neúspěchem stojí spíš marketingová rozhodnutí (časté změny názvu projektu, dlouhá příprava projektu, rozhodnutí Amstradu využít napodobeninu zveřejněného designu pro svůj počítač, špatný software portovaný ze ZX Spectra bez využití větší barevnosti a zvukových možnostá Enterprise) než jeho technická stránka, není pochyb.
V podstatě jediné, co bych na Enterprise rád viděl, ale nenalezl jsem to, je multitasking. Hardwarová podpora oken by k jeho implementaci ale určitě vybízela.