Grafika na osmibitovém počítači Enterprise: IS-BASIC

Enterprise 128 je proslulá tím, že umí zobrazit až 256 barev současně, což málokterý osmibit umí (MSX 2 a vyšší, nebo při použití jistých triků osmibitové Atari).

Podívejme se, jaké grafické módy počítač nabízí, a pak se postupně podíváme, jak je řešena obsluha grafiky z IS-Basicu, pomocí služeb operačního systému EXOS a nakonec i jak přistupovat k registrům čipu Nick, který grafiku generuje.

Způsob generování grafiky na Enterprise je poměrně komplexní, protože VideoRAM neobsahuje jen jednoduchou bitmapu obsahu obrazovky, ale je možné rozdělit obraz do několika stránek, z kterých se zobrazují výřezy (podobně, jako když na Amize “odsouváte” jednotlivé překrávající se obrazovky).
Pokud můžu prozrazovat předem, je Nick celkem jednoduchý, zato velmi flexibilně programovatelný, vzdáleně podobně grafickým čipům osmibitového Atari.

Podívejme se tedy na grafické příkazy IS-BASICu:

Vzhledem ke komplexnosti čipu a jeho ovládání nemá IS-Basic samozřejmě přímý přístup ke všem jeho možnostem, ale i tak zvládne kouzla, která jsou na jiných počítačích nemyslitelná.

Příkazem GRAPHICS bez parametrů vytvoříte novou prázdnou “stránku” pro grafiku.
Příkaz PLOT slouží ke kreslení bodů nebo čar (při zadání více bodů je propojí čárou):
PLOT 640,360;1000,700
Lze zadat i takto:
PLOT 640,360;
PLOT 1000,700
Pokud by nebyl za prvním příkazem středník, místo čáry by se nakreslily dva body.
Pokud se za souřadnicemi objeví čárka, přesune se kreslení na zadané souřadnice, ale bod nenakreslí.
Souřadnice jsou X a Y, měřeno z levého dolního rohu (odpovídá pravému hornímu kvadrantu kartézských souřadnic).
Zajímavé je, že rozsah souřadnic je ve všech grafických režimech 0..1279, 0..719, tedy odpovídá rozlišení 1280×720 bodů. To je dvakrát víc, než nejjemnější rozlišení, které Enterprise zvládne. Zavedeno to tak bylo z několika důvodů – jednak aby bylo možno rozlišení v budoucnu rozšiřovat až na dvojnásobek původního bez výrazných změn v programech, dále proto, aby programátorovi mohlo být jedno, jak velké rozlišení zrovna používá – vektorová kresba bude na obrazovce umístěna stále stejně bez ohledu na aktuální rozlišení obrazovky.

Pro mazání stránek se používají příkazy CLEAR GRAPHICS.
Mazání textových “stránek” provádí příkaz CLEAR TEXT, mazání obého provádí příkaz CLEAR SCREEN.

Pro zobrazení textu na celou obbrazovku se použije příkaz DISPLAY TEXT, pro zobrazení grafické stránky zase DISPLAY GRAPHICS.
Použití samotného TEXT nebo GRAPHICS sice provede zobrazení, ale nové, prázdné stránky (pokud na ní něco je, tak obsah smaže).
Při vytvoření nové stránky jsou souřadnice nastaveny na 0,0. Prostředek obrazovky je na souřadnicích 640, 360.

Basic podporuje i “zvednutí” a “položení” pera pomocí příkazu SET BEAM ON a SET BEAM OFF.
Podporovány jsou i další “želví” příkazy podobné jazyku Logo:
PLOT ANGLE 0; nasměřuje kreslení doprava, PLOT ANGLE 90; nahoru – pokud zadáváme ve stupních, což lze zapnout pomocí OPTION ANGLE DEGREES; defaultně jsou ovšem použity radiány.
PLOT RIGHT a PLOT LEFT pprovede otožení o zadaný úhel – PLOT ANGLE tedy obsahuje absolutní hodnotu úhlu, PLOT RIGHT a PLOT LEFT pak relativní.
PLOT FORWARD 100; popojede o 100 pozic (znovu upozorňuji, že kvůli rozsahu souřadnic a měnlivému měřítku to neodpovídá přesně bodům) dopředu.
PLOT BACK 100; provede totéž směrem dozadu.
 Opět je nutno upozornit, že pro kreslení je potřeba za příkazem nechat středník, jinak dojde jen k posunu bez kreslení.

Ke kreslení kružnic a elips slouží povel
PLOT ELLIPSE r1,r2,
Pokud jsou oba poloměry stejné, nakreslí se kružnice. R1 je poloměr horizontální a R2 vertikální.
Všimněte si čárky za příkazem. Pokud bude chybět, bude střed elipsy nebo kružnice označen bodem. Čárka způsobí, že se tento bod nenakreslí.
Střed kružnice nebo elipsy se bere z aktuální pozice, kterou je možno změnit například povelem
PLOT x,y,
kde si opět všimněte čárky, která zabrání vykreslení bodu ve středu elipsy.

PLOT PAINT provede vyplnění plochy na aktuálních souřadnicích barvou.
Například:
110 GRAPHICS HIRES 4
120 PLOT 400,400
130 PLOT ELLIPSE 200,200,
140 PLOT ELLIPSE 80,80,
150 SET INK 3
160 PLOT PAINT
170 PLOT 400,250,
180 SET INK 2
190 PLOT PAINT
200 END
Všimněte si opět čárek na konci souřadnic 130, 140 a 170. Pokud by chyběly, příkaz PLOT PAINT by vybarvil jen bod, který by tam byl nakreslený.

Styly a režimy kreslení se definují pomocí SET LINE STYLE v rozsahu 0-14 a obsahují různé plné, přerušované, čerchované a další čáry.
SET LINE MODE může nabývat tří parametrů:
MODE 0 překresluje to, co na obrazovce bylo.
MODE 1 kreslí pomocí OR s předchozím obsahem obrazovky
MODE 2 kreslí pomocí AND
MODE 3 kreslí pomocí XOR

Podívejme se teď na barvy, kterých Enterprise, jak víme umí 256 současně.
110 GRAPHICS 256
140 LET Z=0
150 FOR Y=0 to 560 STEP 80
160  FOR X=32 TO 1052 STEP 32
170   SET INK Z
180   PLOT X,Y;X,Y+70
190   LET Z=Z+1
200  NEXT X
210 NEXT Y
220 END
Pro volbu barvy je možné, jak vidíme, použít rovnou její číslo (0..255), pokud není pozměněno paletou. Případně  ji lze namíchat pomocí funkce RGB z jednotlivých složek.

Krom SET INK je možné provést ještě SET PAPER, což se projeví hlavně při smazání obrazovky (CLEAR GRAPHICS) a dále SET BORDER, který obarví okraj a pozadí.
Zatímco barvy INK a PAPER je možno ovlivnit paletou, barvy pro BORDER nejsou paletou ovlivněny a vždy jsou použity tak, jak jsou standardně předdefinovány.
Border může mít jakoukoli z 256 barev bez ohledu na zvolený grafický mód.

Do funkce RGB vstupuje podíl každé ze složek na výsledné barvě v rozsahu 0-1, v pořadí červená (R), zelená (G), modrá (B).
SET INK RGB (1,.5,.5)
tak nastaví  růžovou (plná červená, zeelená a modrá v poloviční intenzitě).
Základní barvy je možno zadat i jejich názvem: BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE (například SET INK CYAN).

Zjistit barvu bodu lze takto:
LOOK #<kanál stránky> AT x,y:v
Pokud se vynechá AT x,y, použije se aktuální pozice kreslícího kurzoru. Barva se uloží do proměnné v.
Pozor na to, že se jendá o příkaz, ne o funkci.

Jednotlivé režimy se oznařují HIRES a LORES. HIRES režim barevností a vertikálním rozlišením svému LORES protějšku, který má poloviční horizontální rozlišení (dvojnásobnou šířku bodu) a stačí mu tak pro framebuffer polovina paměťového prostoru.

Režimy jsou:
GRAPHICS HIRES 2 – 2 barvy z palety 256, 640 bodů na řádek
GRAPHICS LORES 2 – 2 barvy z palety 256, 320 bodů na řádek
GRAPHICS HIRES 4 – 4 barvy z palety 246, 320 bodů na řádek
GRAPHICS LORES 4 – 4 barvy z palety 256, 160 bodů na řádek
GRAPHICS HIRES 16 – 16 barev (8 s volným výběrem a 8 sousedících odstínů z palety 256), 160 bodů na řádek
GRAPHICS LORES 16 – 16 barev (8 s volným výběrem a 8 sousedících odstínů z palety 256), 80 bodů na řádek
GRAPHICS HIRES 256 – 256 barev, 80 bodů na řádek
GRAPHICS LORES 256 – 256 barev, 40 bodů na řádek
Vetikální rozlišení je vždy stejné, pro standardní velikost stránky (to je se čtyřmi řádky textu na dolním okraji obrazovky) je 180 bodů.
Pak je ještě jeden grafický mód, a sice GRAPHICS ATTTRIBUTE.
Ten využívá atributy podobně, jako ZX Spectrum, MSX 1 nebo některé módy SAM Coupé, a nabízí 16 barev pro popředí a 16 pro pozadí.

Parametry nastavení GRAPHICS ATTRIBUTE jsou určeny osmi flagy, které se nastavují jako celý bajt.
Možnosti jsou:
SET ATTRIBUTES 1 – kreslení nulovými pixely (barvou papíru)
SET ATTRIBUTES 2 – kreslení bez ovlivnění bitmapy (pixelových dat)
SET ATTRIBUTES 4 – kreslení bez ovlivnění atributů inkoustu
SET ATTRIBUTES 8 – kreslení bez ovlivnění atributů papíru
SET ATTRIBUTES 16 – výpis textu nulovými pixely
SET ATTRIBUTES 32 – výpis textu bez ovlivnění bitmapy (pixelových dat)
SET ATTRIBUTES 64 – výpis textu bez ovlivnění atributů inkoustu
SET ATTRIBUTES 128 – výpis textu bez ovlivnění atributů papíru.
Dají se spolu kombinovat sečtením hodnot.

Technické detaily nejsou záležitostí Basicu, ale jím ovládaného hardware. Podstatné je, že tento režim umožňuje například emulovat ZX Spectrum a portovat hry z něj, případně je “mírně” graficky vylepšovat.
Blíže o ATTRIBUTE módu si tedy povíme až v příštích částech.

Po zapnutí počítače se při zadání povelu GRAPHICS bez parametrů aktivuje režim HIRES 4.

V režimu GRAPHICS HIRES 16 je možnost volby barev z palety (přesněji prvních 8 se volí z palety a dalších 8 biasem).
Paleta se definuje jako seznam až osmi barev – například:
SET PALLETTE 67,31,WHITE,4,RGB(0,.3,.8),RGB(.7,.7,.1),187,190
Tímto příkazem nastavené barvy jsou pak přístupné jako barvy 0-7.
Výýběr zbylých osmi barev z šestnácti je více omezen – příkazem SET BIAS se nastaví posloupnost osmi barev.
Například SET BIAS 67 – toto číslo ukazuje do skupiny osmi barev 64-71. Barvy v paletě se pak přiřadí tak, že barva 8 je 64 (první ze skupiny), barva 9 je 65 (druhá ze skupiny) a tak dál. Barvy 8-15 tedy ponesou sousedící odstíny ze skupiny 64-71, do které bylo ukázáno povelem SET BIAS 64.
Změněit definici jedné barvy v paletě lze příkazem SET COLOUR 3,110 (v tomto případě nastaví barvě číslo 3, tedy třetí v paletě, odstín 110).
V IS-Basicu lze použít jak podobu COLOUR, tak COLOR. Význam obou slov je stejný.

Za pozornost stojí, že každá stránka (grafická nebo textová) či obrazovkové okno má vlastní paletu, ale všechny mají společný BIAS.

Nastavení barvy nebo paletové barvy pro text lze třeba takto (pro kanál #102, což je standardní textový kanál):
SET #102: COLOUR 1,MAGENTA
SET  #102: INK 3

V režimu HIRES 4 a HIRES 2 se v paletě definují jen 2 nebo 4 barvy a BIAS není použit.

Podívejme se teď na práci se stránkami a kanály, která je na Enterprise dosti specifická.

Byl už zmíněn  povel GRAPHICS a TEXT pro vytvoření prázdné “stránky” grafiky nebo textu.
Pro výstup na ně se obvykle používají kanály 1-100.
Standardní přiřazení ostatních kanálů je toto:
0 – vstup příkazů a výstup textu (LIST, PRINT), napojený při zapnutí na zařízení EDITOR:, KEYBOARD: a VIDEO: v módu 0 o rozměrech 24×40 znaků.
101- grafika, při použití povelu GRAPHICS připojí zařízení VIDEO: v módu 1, video colour 1, o rozměrech 20×40 znaků.
102 – standardní textová stránka 24×40 znaků
103 – připojen k zařízení “SOUND:”
104 – připojen k zařízení “PRINTER:”
105 – připojen k zařízení “KEYBOARD:”
106 – otevírá se při souborových operacích, buď na zařízení “DISK-1:” nebo “TAPE:”
107 – používá se pro síť.

V paměti počítače je uloženo několik stránek textu a grafiky, z nichž může být jedna zobrazena přes celou obrazovku. Nebo může být zobrazena jen přes část obrazovky, a v dalších částech se zobrazují další stránky.
Kreslit i psát lze samozřejmě i do stránky nebo její části, která momentálně není zobrazená a je skrytá.

Před otevřením kanálu se může nastavit několik dodatečných parametrů, v tomto případě to mohou být tyto:
SET VIDEO MODE 0 – 40 znaků na řádek  (ve dvou barvách)
SET VIDEO MODE 1 – hi-res grafika
SET VIDEO MODE 2 – 80 znaků na řádek (4 barvy)
SET VIDEO MODE 5 – lo-res grafika
SET VIDEO MODE 15 – atrrirbutová grafika
Dále se nastavuje barevnost stránky, textové okno by mělo být v módu 0:
SET VIDEO COLOUR 0 – dvoubarevný mód
SET VIDEO COLOUR 1 – čtyřbarevný mód
SET VIDEO  COLOUR 2 – šestnáctibarevný mód
SET VIDEO COLOUR 3 – dvěstěpadesátišestibarevný mód
Výška a šířka stránky se nastavuje takto:
SET VIDEO X <počet znaků na šířku>, ovladač se postará, aby při okně užším, než šířka obrazovky, bylo okno vycentrováno na prostředek (okraje budou dobarveny barvou BORDERu).
SET VIDEO Y <počet znaků na výšku>, přičemž výška může být až 255 znaků, tedy více, než je výška obrazovky.

Je možno ovlivnit i tvar a barvu kurzoru:
SET CURSOR CHARACTER <kód znaku>
SET CURSOR COLOUR <kód barvy>
(Vlastní znaky lze definovat pomocí SET CHARACTER <kód znaku>,<bajt>,<bajt>,<bajt>,<bajt>,<bajt>,<bajt>,<bajt>,<bajt>,<bajt>.)
Nastavit lze i automatické scrollování: SET SCROLL ON nebo SET SCROLL OFF.
Odscrollování se provede povelem SET SCROLL UP/DOWN n,m – proveden se odscrollování z řádku (n-32) na řádek (m-32).

Na závěr podotknu, že info řádek na horním okraji obrazovky je vlastně taky samostatným oknem, které se může zobrazit nebo vypnout – Basic do něj ovšem přístup přes kanály nemá.
Používá ho ovladač kazeťáku, kde změnou barvy v paletě ukazuje stav příchozího signálu, a mohou ho využívat i další programy ve strojovém kódu pomocí služeb EXOS.
Zobrazování lze z Basicu zapnout a zase vypnout povelem SET STATUS ON/OFF, při vypnutí se místo informačního řádku zobrazuje barva borderu.

Upozorním ještě na jeden parametr, který se může objevovat u povelu DISPLAY, a to rozsah.
DISPLAY #<číslo kanálu>: AT <řádek na obrazovce, kde má být horní hrana zobrazované stránky> FROM <horní řádek segmentu stránky> TO <dolní řádek segmentu stránky>

Několik příkladů práce se stránkami:
100 SET VIDEO MODE 0
110 SET VIDEO COLOUR 0
120 SET VIDEO X 20
130 SET VIDEO Y 10
140 OPEN #1:”VIDEO:”
150 DISPLAY #1:AT 7 FROM 1 TO 10
160 PRINT #1:”Kratky text… “
170 END
Tento program nastaví malé okno textové stránky a vypíše text.

100 SET VIDEO MODE 1
110 SET VIDEO COLOUR 2
120 SET VIDEO X 8
130 SET VIDEO Y 30
140 OPEN #1:”VIDEO:”
150 PLOT #1:128,540,
160 PLOT #`:ELLIPSE 115,500,
170 DISPLAY #1:AT 10 FROM 21 TO 30
180 FOR X=1 to 1500
190 NEXT X
200 DISPLAY #1:AT 10 FROM 1 TO 10
210 END
Tento program zobrazí v okně nejprve jeden a pak druhý výřez grafické stránky s nakreslenou elipsou.

100 SET VIDEO MODE 0
110 SET VIDEO COLOUR 0
120 SET VIDEO X 42
130 SET VIDEO Y 8
150 OPEN #1:”VIDEO:”
160 !
170 SET VIDEO MODE 1
180 SET VIDEO COLOUR 3
200 OPEN #2:”VIDEO:”
210 !
220 SET VIDEO COLOUR 1
240 OPEN #3:”VIDEO:”
250 !
260 DISLAY #1:AT 9 FROM 1 TO 8
270 DISPLAY #2:AT 1 FROM 1 TO 8
280 DISPLAY #3:AT 17 FROM 1 TO 8
290 PRINT #1:”Text…”
300 SET #2:BEAM ON
310 PLOT #2:100,100;
320 SET #3:BEAM ON
330 PLOT #3:100,100;
340 END
Tento program zobrazí na obrazovce ve třech oknech tři stránky, textovou a dvě grafické.
Po spuštění tohoto programu je standardní stránka kanálu 0 překryta vykreslenými stránkami, takže neuvidíte, co píšete. Zobrazit ji zpět můžete jednoduše příkazem TEXT nebo DISPLAY TEXT.
Ještě bych měl zmínit, že i do grafických stránek se dá psát text, a to na pozici grafického kurzoru (a samozřejmě i do  právě nezobrazované části stránky).
Například v tomto posledním programu, kde je #3 otevřen jako grafická stránka, se dá vypsat text pomocí
PLOT #3:640,50
PRINT #3:”Text…”

Přístup z Basicu vypadá možná komplikovaně a nechává ještě nějaké nejasnosti – je to tím, že jsme si ještě nepopsali samotný hardware, z jehož možností rutiny služeb operačního systému EXOS a od nich odvozené příkazy IS-Basicu vycházejí.
Na oboje se podíváme zase příště.