Grafika na osmibitovém počítači Enterprise: čip Nick

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, a na samotný hardware.
Slíbené pořadí ale nedodržím.
Možnosti software vycházejí ze schopností hardware, který ovládají, a v tomto případě uvidíte, že třeba IS-Basic, i když nabízí provádění neuvěřitelných věcí a grafických kouzel, je vlastně jen zlomkem toho, co čip Nick skutečně umí.
Začneme tedy popisem hardware a pak teprve k tomu doplníme v další části přehled služeb EXOSu, které s grafikou souvisí.

Nick podle slov původní dokumentace umožňuje: Kombinování zobrazovacích režimů. Textové a semigrafikcé režimy s fonty s definovatelnými znaky v počtu 64, 128 nebo 256. Osmibitový barevný výstup (256 barev). 2, 4, 16 a 256 barev na řádek s výběrem z 256. Nejvyšší rozlišení 672×512 (interlace). Buňkovou grafiku, textový mód, bitmapy a znaky. Znaky výšky od jednoho do 256 mikrořádků. 256 barev borderu. Možnost definovat výšku a šířku obrazu. Externí barevný vstup (TV kamera nebo externí generátor neomezeného počtu spritů). Efektivní využívání RAM (k práci mu stačí pod 1 kB RAM).. 4 barevné páry v 84 sloupcovém režimu. Mapování paměti pomocí pointerů ke zvýšení flexibility a rychlosti.

Zní to bombasticky, ale co se pod tím tedy skrývá?

Kouzlo.

Nick je programovatelný čip.
Kromě několika základních pravidel nic neumí. Nemá nijakou organizaci VideoRAM, šířku okrajů obrazu, skoro nic. Dokonce je potřeba mu říct, jak má generovat synchronizační pulzy.

Zato má přístup k 64 kB RAM. přistupuje do paměťových stránek FF, FE, FD a FC.
To znamená, že v případě Enterprise 64 se může Nick prohánět po celé dostupné RAM a čarpat z ní grafické informace pro zobrazování!
Na Enterprise 128 je mu dostupná celá polovina paměti.
Těch 64 kilo RAM může být napchaných grafickými informacemi, které se mohou různě zobrazovat, nebo i nezobrazovat, a samozřejmě se k nim mohou vejít ještě data negrafická a program pro samotný procesor počítače.
Vše, co chcete mít na obrazovce, je tedy omezeno jen těmi 64 kily.

Nick obsahuje čtyři registry, kterými se nastavuje jeho činnost. Ty krom jiného ukazují do paměti, kde začíná “line parameter table”.
Tato tabulka by se dala přirovnat k VDL (video display listu) pro grafické čipy osmibitového Atari. V zásadě definuje, a to klidně pro každý mikrořádek zvlášť, nejen, v jakém má být grafickém nebo textovém módu, ale i to, kde v paměti (v těch 64 kilech) se má nacházet jeho předloha, a zda používá atributy (a případně, kde se nachází jejich předloha).
Tedy každý mikrořádek na obrazovce může být v jiném režimu, mít svou vlastní paletu, být jinak posunut od okraje obrazovky, a bitmapová předloha VideoRAM (framebuffer) může být organizován téměř libovolně.
Klidně můžeme Nicka naučit, že mikrořádky jsou organizovány napřeskáčku jako na ZX Spectru – a Nick začne zobrazovat jako spectrácká ULA.
Mikrořádky lze sdružovat do bloků, a proto může tabulka obsahovat (krom generování synchronizačních pulzů) jen jeden jediný záznam pro až 256 mikrořádek se stejnou paletou.

Všimněte si, že IS-Basic umožňoval sice zobrazování různých částí grafických informací v oknech, ale byl omezen výškou řádku (9 mikrořádků).
Přímým přístupem na hardware je ale možné ovládat opravdu jednotlivé mikrořádky!

Registry čipu Nick jsou tyto (a všechny jsou pouze pro zápis):

#80 /FIXBIAS – tento registr slouží k povolování externího zdroje barev a určuje, které barvy se mají nahradit obrazem z externího zdroje (je tak možné míchat interní a externí obraz, například dělat titulky a efekty do televizního obrazu nebo čip Nick rozšířit o další zobrazovací čipy, jako třeba podporu hardwarových spritů).
 d7 – výstup VC1 použitý k vypínání externího zdroj barev
 d6, d5 – PRIOR1, PRIOR0 – priorita externího zdroje – pracuje se 4 bity (16 barev) na vstupu EC0-EC3.
       =00 – EC0-EC3 odpovídá barvě palety při shozeném / EXTC a aktivním interním zobrazování.
       =01 – EC0-EC3 odpovídá barvě palety při shozeném /EXTC a při interním zobrazování barvy v rozsahu COL8-COL15 (BIAS).
       =10 – EC0-EC3 odpovídá barvě palety při shozeném /EXTC a při interním zobrazování barvy v rozsahu COL8-COL15 nebo externí barva odpovídá COL0-COL7 (EC3 v nule).
       =11 – EC0-EC3 odpovídá barvě palety při shozeném /EXTC a při interním zobrazování barvy v rozsahu COL8-COL15 nebo externí barva odpovídá COL0-COL3 či COL8-COL11 (EC2 v nule)
 d4-d0 – bias pro paletové barvy COL8-COL15 (psal jsem o BIASu už při popisu IS-basicu).

#81 /BORDER – tento registr slouží k nastavení barvy borderu.
 d7-d0 – osmibitová barva borderu.

#82 /LPL – dolní část pointeru na “line parameter table”.
 d7-d0 – a11-a4 pointeru na “line parameter table”. Záznamy jsou šestnáctibajtové, pointer ukazuje na začátek záznamu (a3-a0 si Nick při čtení záznamu z tabulky generuje sám).

#83 /LPH – horní část pointeru na “line parameter table”.
 d7 – normálně 1 (/load line parameter base)
 d6 – (/clock in line parameter base)
 d3-d0 – a15-a12 pointeru na “line parameter table”.

Z “line parameter table” se na začátku každého bloku (obsahujícího jeden nebo více mikrořádků) vyčítá následujících 16 bajtů:
 SC – scanlines, počet mikrořádek v bloku (dvojkový komplement, tedy #FF je jeden mikrořádek)
 MB – MODEBYTE (definuje grafický režim)
 LM – left margin, levý okraj
 RM – right margin, pravý okraj
 LD1L – a7-a0 pointeru LD1
 LD1H – a8-a15 pointeru LD1
 LD2L – a7-a0 pointeru LD2
 LD2H – a8-a15 pointeru LD2
 COL0 – osmibitová barva paletové barvy 0
 COL1 – osmibitová barva paletové barvy 1
 COL2 – osmibitová barva paletové barvy 2
 COL3 – osmibitová barva paletové barvy 3
 COL4 – osmibitová barva paletové barvy 4
 COL5 – osmibitová barva paletové barvy 5
 COL6 – osmibitová barva paletové barvy 6
 COL7 – osmibitová barva paletové barvy 7

Modebyte definuje videorežim takto:
d7 – v jedničce generuje (přes čip Dave) přerušení (na začátku tohoto bloku mikrořádek) shozením signálu VIRQ.
d6, d5 – nastavuje barvový režim:
  00= dvojbarevný režim, nulový bit odpovídá paletové barvě 0 a jedničkový paletové barvě 1.
  01=čtyřbarevný režim, dva bity v bajtu definují barvu 0-3 jednoho bodu (čtyři body na bajt).
  10= šestnáctibarevný režim, skupina čtyř bitů v bajtu definuje barvu 0-15 jednoho bodu (dva body na bajt). Paletová barva 0-7 se čerpá z “line parameter table” COL0-COL7, barvy 8-15 jsou za sebou jdoucí odvozené od dolních 5 bitů /FIXBIAS registru
  11=256barevný mód. jeden bajt předlohy odpovídá jednomu bodu. Barvy jsou odvozeny takto:
       RED=b0*(4/7)+b3*(2/7)+b6*(1/7)
       GREEN=b1*(4/7)+b4*(2/7)+b7*(1/7)
       BLUE=b2*(2/3)+b5*(1/3)
d4 – v nule /VRES (při VRES se LD1 a LD2 resetuje na zařátku každého mikrořádku, a tak mikrořádky jdoucí za sebou v bloku zobrazují tu samou bitmapu).
d3, d2, d1 – definuje videorežim:
       000=VSYNC
       001=PIXEL
       010=ATTR
       011=CH256
       100=CH128
       101=CH64
       110=nepoužito
       111=LPIXEL
d0 – v jedničce generuje načtení parametrů, normálně se objevuje na konci snímku.

Podporované videorežimy jsou:
 VSYNC – nezobrazuje barvu borderu a používá LM a RM ke generování vertikálního synchronizačního pulzu (využitelné pro interlace).
 PIXEL – pointer LD1 ukazuje na bitmapovou grafickou předlohu.
 LPIXEL – pointer LD1 ukazuje na bitmapovou grafickou předlohu, ale zobrazuje s polovičním horizontálním rozlišením.
 ATTR – pointer LD2 ukazuje na dvoubarevnou bitmapovou grafickou předlohu a LD1 ukazuje na atributová data (dvě šestnáctibitové barvy pro papír a inkoust, bajt atributů pro bajt předlohy).
 CH256 – textový režim s 256 znaky ve fontu, LD1 ukazuje na textová data, která se zobrazí pomocí fontu odkazovaného pointerem LD2 (s libovolnou výškou znaku, až 256 mikrořádek).
 CH128 – textový režim se 128 znaky ve fontu, LD1 ukazuje na textová data, která se zobrazí pomocí fontu odkazovaného pointerem LD2 (s libovolnou výškou znaku, až 256 mikrořádek).
 CH64 – textový režim s 64 znaky ve fontu, LD1 ukazuje na textová data, která se zobrazí pomocí fontu odkazovaného pointerem LD2 (s libovolnou výškou znaku, až 256 mikrořádek).

PIXEL, LPIXEL, CH256, CH128 a CH64 mohou být ve dvou, čtyřech, šestnácti nebo 256 barvách.

Fonty jsou v paměti uloženy tak, že nejprve jsou první mikrořádky všech znaků (podle délky fontu 256, 128 nebo 64 bajtů), pak druhé mikrořádky všech znaků, …
Vertikálního scrollingu v textovém režimu je pak možno dosáhnout změnami offsetů.

Parametry LM a RM pracují takto:
LM:
 d7 – v jedničce zapíná MSBALT (může posloužit k barevnému odlišování částí textů v dvoubarevném textovém módu při emulaci 80 znaků na řádek):
       Pokud je MSB (nejvyšší bit) zobrazovaných dat 1, zobrazí v dvoubarevném režimu paletové barvy 2 a 3 místo barev 0 a 1 (MSB zobrazovaných dat zobrazuje jako nulový, v případě textu se zde předpokládá mezera mezi znaky).
 d6 – v jedničce zapíná LSBALT:
       Pokus je LSB (nejnižší bit) zobrazovaných dat 1, zobrazí v dvoubarevném režimu paletové barvy 4 a 5 místo 0 a 1 (LSB zobrazuje jako nulový, v případě textu se zde předpokládá mezera mezi znaky).
 d5-d0 – levý okraj obrazu – normálně na CRT monitorech více než 10. Ve VSYNC režimu definuje začátek vertikálního synchronizačního pulzu.

RM:
 d7 – ALTIND1, ve dvoubarevném znakovém módu pro znaky s kódem nad #80 použije paletovou barvu 3 pro inkoust a 2 pro papír místo 1 a 0.
 d6 – ALTIND0, ve dvoubarevném znakovém módu pro znaky s nastaveným druhým nejvyšším bitem prohodí paletové barvy: 4 místo 0, 5 místo 1, 6 místo 2, 7 místo 3.
 d5-d0 – pravý okraj obrazu – normálně na CRT monitorech 54. Ve VSYNC reýimu definuje konec vertikálního synchronizačního pulzu.

LD1 – skládá se ze dvou bajtů, LD1L a LD1H.
V režimu PIXEL a LPIXEL ukazuje na obrazová data. Ve znakových režimech CH256, CH128 a CH64 ukazuje na textová data (indexy znaků ve fontu). v ATTR reýimu ukazuje na atributová data.

LD2 – skládá se ze dvou bajtů, LD2L a LD2H.
V ATTR režimu ukazuje na bitmapová data. Ukazuje na grafickou předlohu fontu ve znakových režimech CH256, CH128 a CH64. V režimech PIXEL a LPIXEL je nepoužit.

Pohled na služby EXOSu je pak už 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ší funkce, i skrývání oken.
“Line parameter table” je systémem ří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.
To si pak ale podrobněji popíšeme příště.