Obsah
1. 1984 a 1985: přelomové roky v oblasti vývoje osobních počítačů
2. Grafická karta Enhanced Graphics Adapter (EGA)
3. Základní technické parametry grafické karty EGA
4. Bloková struktura grafické karty EGA a její řídicí porty
5. Textové režimy grafické karty EGA
6. Podpora textových režimů BIOSem
7. První demonstrační příklad: použití textového režimu 80×25 znaků
8. Přepnutí do textového režimu 80×43 znaků
9. Druhý demonstrační příklad: použití textového režimu 80×43 znaků
11. Podpora grafických režimů karty EGA BIOSem
12. Třetí demonstrační příklad: grafický režim 320×200 se šestnácti barvami
13. Čtvrtý demonstrační příklad: grafický režim 640×200 se šestnácti barvami
14. Pátý demonstrační příklad: grafický režim 640×350 pixelů (4 či 16 barev)
15. Barvová paleta, úpravy zapojení monitoru
16. Struktura obrazové paměti v grafických režimech EGA
17. Výběr bitové roviny pro zobrazení většího množství barev
18. Šestý demonstrační příklad – vykreslení barevných obrazců
19. Repositář s demonstračními příklady
1. 1984 a 1985: přelomové roky v oblasti vývoje osobních počítačů
V předchozích částech letního seriálu o tvorbě grafických dem a her pro počítače IBM PC jsme si popsali první generaci grafických karet MDA a CGA navržených firmou IBM, které začaly být spolu s IBM PC prodávány již od roku 1981. Tyto karty byly určené k instalaci do originálních počítačů IBM PC, ovšem s příchodem PC XT se začaly používat i v legálně či ilegálně vyráběných klonech těchto strojů. Kromě toho jsme se zabývali i „alternativními“ grafickými kartami Hercules, ve kterých jsou umně spojeny přednosti karty MDA (práce v textovém režimu s čitelnými znaky v relativně vysokém rozlišení) s možností práce v monochromatickém grafickém režimu s rozlišením 720×348 pixelů.
Obrázek 1: Verze hry Pacman pro počítače vybavené grafickou kartou CGA. Kvůli podpoře pouze dvou fixních barvových palet (maximálně 4 barvy) a neexistenci spritů je tato verze Pacmana paradoxně horší než její konverze určené pro výkonově slabší a mnohem levnější osmibitové domácí počítače.
V perexu dnešního článku je napsáno, že jedním z mezníků v historii vývoje osobních počítačů jsou roky 1984 a 1985. V průběhu těchto dvou let se totiž na trhu objevily nové typy osobních počítačů; shodou okolností se ve všech případech jedná o počítače postavené na mikroprocesoru Motorola M68000. Tyto počítače měly velký vliv mj. i na další vývoj počítačové grafiky a grafických uživatelských rozhraní. A o jakých strojích to vlastně mluvíme? Jedná se v první řadě o originální Macintosh 128K (1984) a dále o Atari ST a Amigu (shodně 1985). Zejména Atari ST a ještě více Amiga pak redefinovaly to, co si pod pojmem „počítačová grafika“ představovala laická veřejnost. A v tomto srovnání vycházelo IBM PC (tedy zejména PC XT a první verze PC AT) jako chudý příbuzný.
Obrázek 2: Textový režim grafické karty CGA se znaky uloženými v rastru 8×8 pixelů sice nabízel možnost definovat pro každý znak šestnáct barev popředí a osm barev pozadí, ale čitelnost textu byla v porovnání s MDA či Herculesem horší (a samozřejmě horší i v porovnání s Macintoshem, Atari ST či Amigou).
Ovšem ani firma IBM nezahálela, protože její inženýři navrhli nový typ grafické karty určený pro počítače IBM PC. Tato karta byla na trh uvedena (taktéž) v roce 1984. Jedná se o poněkud kontroverzní grafickou kartu EGA neboli Enhanced Graphics Adapter, jejíž technické parametry i způsob použití budou popsány v navazujících kapitolách. A samozřejmě si ukážeme i jednoduché prográmky, kterými tuto grafickou kartu prověříme – tedy alespoň její základní vlastnosti, protože EGA nabízí větší množství čtecích a zápisových režimů, možnost rotace barev atd.
Obrázek 3: Screenshot ze hry King's Quest I (šestnáctibarevná verze s rozlišením 320×200 pixelů).
2. Grafická karta Enhanced Graphics Adapter (EGA)
Na grafickou kartu EGA se můžeme dívat z několika hledisek. Z pohledu společnosti IBM se nepochybně jednalo o výrobek, který přesně zapadal do její vývojové koncepce – tato karta totiž zaručovala zpětnou kompatibilitu jak s kartou MDA, tak i CGA (a to včetně velmi dobré podpory původních monitorů, na rozdíl od příště popsaného grafického adaptéru VGA, u kterého došlo ke změně rozhraní) a její nové vlastnosti i programové rozhraní představované EGA BIOSem odpovídalo spíše potřebám kancelářských aplikací a nikoli hrám (IBM PC a posléze i PC XT bylo koncipováno především jako kancelářský počítač; právě až do přelomu 1984/1985).
Obrázek 3: Po uvedení grafické karty EGA začaly vznikat nové hry, které využívaly její nové grafické režimy. Zde je zobrazen snímek ze hry „Ski or Die“, která pracovala v grafickém režimu s rozlišením 320×200 pixelů s využitím standardní šestnáctibarevné palety.
Z hlediska mnohých uživatelů se však jednalo spíše o zklamání, protože grafická karta EGA neměla některé jimi očekávané vlastnosti, například rozsáhlejší barvovou paletu, existenci spritů (použitelných jak ve hrách, tak i pro zobrazení kurzoru myši v graficky orientovaných aplikacích) či podporu pro větší rozlišení v textových i grafických režimech, nehledě na určité rozčarování při porovnání karty EGA s grafickými vlastnostmi již výše zmíněných osobních počítačů Atari ST a především Amig (jinými slovy – uživatelé i programátoři celkem právem očekávali po třech letech vývoje poněkud více).
Obrázek 4: Další snímek ze hry „Ski or Die“.
Ovšem z historického hlediska nelze grafické kartě EGA upřít to, že poměrně významným způsobem přispěla ke změně chápání funkce PCček. Z poněkud „lepších psacích strojů“ a tabulkových kalkulátorů (nejdříve se jednalo o VisiCalc, později o slavný Lotus 1–2–3 – oba mimochodem pracující v textovém režimu, samozřejmě až na vykreslení grafů) se i díky této grafické kartě z IBM PC staly univerzální počítače, pro něž začaly vznikat i hry s mnohem lepší grafickou kvalitou než v dobách kralování CGA.
Obrázek 5: Některé hry, zde konkrétně slavná Balance of Power, pracovaly v monochromatických Windows 1.0.
Také aplikace s grafickým uživatelským rozhraním začaly být teprve na této kartě skutečně použitelné. Z těch přelomových se jedná například o první CADy pro počítače PC, aplikace pro sazbu textu (Ventura Publisher) ale i grafická nadstavba nad MS-DOSem – systém Microsoft Windows. První verze MS Windows sice dokázala pracovat i s grafickou kartou CGA, ovšem rozlišení a barevná hloubka nabízená touto grafickou kartou byla nedostačující; například i počítač Apple Macintosh zobrazoval na monitoru větší množství pixelů než karta CGA ve svém „hi-res“ režimu.
Obrázek 6: Tabulkový procesor VisiCalc.
Obrázek 7: Slavný tabulkový kalkulátor Lotus 1–2–3 s charakteristickým řádkovým menu.
3. Základní technické parametry grafické karty EGA
Grafická karta EGA byla ve firmě IBM navržena takovým způsobem, aby byla v co největší míře kompatibilní se svými předchůdkyněmi, tj. kartami MDA i CGA, a to jak na programové úrovni (volání služeb BIOSu, emulace grafického řadiče Motorola MC6845, včetně prakticky všech jeho řídicích registrů), tak i z hlediska použitelných monitorů, protože ke kartě EGA bylo možné po správném nastavení přepínačů na zadní straně karty připojit monochromatický monitor určený pro MDA/Hercules, kompozitní CGA monitor nebo nový typ monitoru navržený právě pro potřeby karty EGA (ten měl sice stejný konektor, jako monitor MDA, ovšem význam pinů se v nových grafických režimech lišil, více v dalším textu).
Obrázek 8: Jedna z nejznámějších her určených pro grafickou kartu EGA je hra Sim City. Využívá se zde režim nejvyššího možného rozlišení.
V případě použití monochromatického (TTL) či kompozitního monitoru však došlo (logicky) k degradaci možností této grafické karty, neboť její nové režimy byly využitelné pouze na novém typu monitoru. Starší monitory postrádaly buď možnost barevného zobrazení, nebo schopnost synchronizace obrazu s více než 200 obrazovými řádky a z toho vyplývající vyšší řádkovou frekvencí. A navíc i zapojení pinů původního „digitálního“ monitoru CGA umožňovalo pouze zobrazení osmi základních barev, které mohly mít buď nízkou či vyšší intenzitu (celkově se tedy jednalo o neměnnou 16barevnou paletu). Ani v režimu kompatibilním s tímto monitorem tedy nebylo možné použít 64 barev karty EGA. Programová kompatibilita s Herculesem nebyla (podle očekávání!) zajištěna, protože firma IBM tuto konkurenční kartu ve své podstatě ignorovala.
Obrázek 9: Grafický režim s rozlišením 640×350 pixelů v šestnácti barvách použitý ve hře Sim City.
Kromě textových a grafických režimů převzatých z předchozích karet se na EGA objevují i již zmíněné nové grafické režimy; plně osazená karta umožňovala poměrně slušné rozlišení 640×350 pixelů v šestnácti barvách vybíraných z palety 64 barev (u IBM objevili plnohodnotnou barvovou paletu v době, kdy Amiga nabízela 4096 barev). Kapacita obrazové paměti umístěné na této grafické kartě se pohybovala v rozmezí 64 kB až 256 kB (konkrétně bylo možné použít kapacity 64, 128, 192 a 256 kB), přičemž pozdější verze byly osazeny téměř vždy plnou kapacitou 256 kB, ovšem starší programy se mohly spolehnout pouze na zmíněnou základní kapacitu 64 kB, z čehož také vycházely při nastavování grafických režimů.
Obrázek 10: Úvodní obrazovka hry King's Quest II: Romancing the Throne.
Vzhledem k tomu, že musely být podporovány režimy s různým počtem skenovacích (obrazových) řádků, byla řádková frekvence rovna 15,75 kHz (původní monitory pro CGA), 18,432 (monitory pro MDA/Hercules) nebo 21,8 kHz (nové „enhanced“ monitory) – na EGA tak můžeme nalézt několik krystalů. Snímková frekvence se u nových grafických režimů nastavovala na 60Hz (to sice není mnoho, ale VGA v tomto případě na tom nebyla lépe).
Obrázek 11: I s pouhými šestnácti barvami se dají dělat různá grafická kouzla.
4. Bloková struktura grafické karty EGA a její řídicí porty
Na grafické kartě EGA jsou integrovány obvody řadiče obrazovky (CRTC neboli Cathode Ray Tube Controller), dále obvod ovládající přístup do video paměti při generování obrazu (sekvencér, anglicky sequencer), řadič přístupu mikroprocesoru k jednotlivým bitovým rovinám (GDC, neboli Graphics Controller), řadiče barvových atributů (ATC neboli Attribute Controller) a konečně obvod pro přemapování barev (LUT což je známá zkratka vycházející z Look-Up Table).Z hlediska programátorů je důležité, že tyto obvody jsou plně konfigurovatelné, protože jsou jejich řídicí registry mapovány do oblasti I/O portů mikroprocesoru počítače.
I/O port | Blok |
---|---|
3B2h, 3BAh, 3C2h, 3D2h, 3DAh | různé |
3B4h, 3B5h, 3D4h, 3D5h | CRT Controller (CRTC) |
3C0h | Attribute Controller |
3C4h, 3C5h | Sequencer |
3CCh, 3CAh, 3CEh, 3CFh | Graphics Controllers |
Obrázek 12: Tento screenshot jsme si již ukázali v předchozích částech tohto seriálu: jedná se o hru Golden Axe spuštěnou v režimu kompatibility s grafickou kartou EGA. Vzhledem k omezenému počtu barev (maximálně 16) i barvového prostoru, ze kterého se barvy vybírají (celkem 64 odstínů) je při vykreslování použit dithering, který je dobře patrný při zvětšení obrázku.
Vzhledem k tomu, že musela být dodržena zpětná kompatibilita s grafickými kartami MDA i CGA, je grafická karta EGA velmi komplikovaná a její programování není v žádném případě jednoduché (především když si uvědomíme, že tento grafický adaptér ve skutečnosti programátorům nenabízí žádné speciální grafické prostředky jako je podpora pro sprity, blokové přenosy dat atd.). Například pouze přístup k bitovým rovinám je možné řešit čtyřmi různými způsoby (většina knihoven používá první režim). V dalších kapitolách si popíšeme podporované textové a grafické režimy, které je možné s kartou EGA používat.
Obrázek 13: I s pouhými šestnácti barvami se dají dělat různá grafická kouzla.
5. Textové režimy grafické karty EGA
Grafická karta EGA podporuje tři textové režimy, ve kterých mohou jednotlivé znaky i jejich pozadí nabývat jedné ze šestnácti volitelných barev (u karty CGA se naproti tomu jednalo o šestnáct pevně nastavených barev, více nebylo možné zobrazit už kvůli omezení rozhraní k monitoru). První textový režim zobrazuje 40 znaků na 25 textových řádcích, jedná se tedy o částečnou emulaci textového režimu karty CGA, ovšem s tím rozdílem, že každý znak je vytvořen v rastru 8×14 pixelů, což je mnohem více čitelnější, než původních 8×8 pixelů:
Obrázek 14: Textový režim 40×25 karty EGA.
Ve druhém textovém režimu je možné zobrazit 80 znaků na 25 textových řádcích; maska znaků má v tomto případě opět velikost 8×14 pixelů. Třetí textový režim je zcela nový a je v něm možné zobrazit 80 znaků na 43 textových řádcích. Každý znak je v tomto případě vytvořen v rastru pouhých 8×8 pixelů. Na první pohled poněkud „podivný“ počet textových řádků byl zvolen z toho důvodu, že 43×8=344, což zhruba odpovídá počtu maximálně zobrazitelných skenovacích (obrazových) řádků, který je roven 350 (v prvních dvou režimech se používá právě 25××14=350 obrazových řádků).
Obrázek 15: Textový režim 80×25 karty EGA.
Grafická karta EGA zavedla v textových režimech důležitou a užitečnou novinku. Znaková sada totiž není uložena v paměti EPROM, ale přímo v obrazové paměti, takže implementace národních znaků (Husova nabodeníčka a jejich nesčetné varianty) je velmi jednoduchá (přesněji řečeno, karta samozřejmě obsahuje základní znakovou sadu v paměti ROM, dokonce v několika variantách, tato sada se však při nastavení textového režimu zkopíruje do obrazové paměti). S tím souvisí i možnost programové změny počtu obrazových řádků použitých pro vykreslení jednoho řádku textového. V předchozím odstavci jsme si popsali režimy používající 8 a 14 obrazových řádků na jeden textový řádek, ovšem tuto hodnotu lze snadno změnit v rozmezí 1–32. Čím vyšší jsou znaky (a tím i textové řádky), tím méně textových řádků je možné (logicky) na obrazovce zobrazit.
Obrázek 16: Textový režim 80×43 karty EGA.
Při nastavení textových režimů je obrazová paměť většinou mapována od adresy b800:0000 do adresy b800:7fff (opět zde používám adresování typu segment:offset, protože v době největšího rozmachu grafické karty EGA většina aplikací pracovala v reálném režimu procesoru). Pokud je pomocí DIPů (malých přepínačů umístěných vedle konektorů) karta přepnuta takovým způsobem, aby emulovala MDA (a vlastně i Hercules), je obrazová paměť mapována od adresy b000:0000 do adresy b000:7fff. V obou případech je obrazová mapa rozdělena do čtyř (bitových) rovin. V první rovině se nachází vlastní text, ve druhé rovině atributy znaků, třetí rovina je rezervována pro znakovou sadu a čtvrtá rovina neobsahuje žádné relevantní informace.
Obrázek 17: Úvodní obrazovka známé síťové hry Netwars, která využívá šestnáctibarevný grafický režim karty EGA s rozlišením 640×350 pixelů.
Při nastavení textového režimu pomocí služeb BIOSu je adaptér nakonfigurován tak, že první dvě roviny jsou zřetězeny a aplikacím se tak jeví, jakoby byl každý znak uložen na dvou sousedních bytech ve formátu ASCII kód+barvový atribut. Samozřejmě je možné provést přeprogramování tak, aby bylo možné měnit znakovou sadu (třetí bitovou rovinu) či pouze text. Adresu prvního vykreslovaného znaku (i atributu) lze změnit a provádět tak vertikální scrolling – programátorům je k dispozici celkem 65536/80=819 textových řádků, tj. cca 32 obrazovek textu při použití režimu 80×25 znaků (ovšem při zřetězení dvou bitových rovin pouze 16 obrazovek).
Obrázek 18: Hra Netwars zobrazovala objekty buď jako drátové (wireframe) modely nebo s využitím vyplněných trojúhelníků. Volba závisela především na výkonnosti počítače, protože vykreslování 3D scény bylo samozřejmě prováděno programově.
6. Podpora textových režimů BIOSem
BIOS grafické karty EGA podporuje textové režimy s čísly 0 až 3, což jsou naprosto stejné režimy, jaké najdeme u starších karet, ovšem až na ten „nepatrný“ rozdíl, že vertikální rozlišení je vyšší a tudíž i výška znaků (měřená v počtu obrazových řádků) se zvýšila, což vedlo k lepší čitelnosti:
Číslo (AL) | Typ | Rozlišení | Segment |
---|---|---|---|
00 | text, mono | 40×25 | 0×b800 |
01 | text, barvy | 40×25 | 0×b800 |
02 | text, mono | 80×25 | 0×b800 |
03 | text, barvy | 80×25 | 0×b800 |
Připomeňme si, že jak textové, tak i grafické režimy se nastavují přes SW přerušení číslo 0×10, přičemž v registru AH je nula (číslo služby) a v registru AL musí být číslo požadovaného textového nebo grafického režimu. Můžeme tedy využít naše staré dobré makro:
; nastaveni grafickeho rezimu %macro gfx_mode 1 mov ah, 0 mov al, %1 int 0x10 %endmacro
7. První demonstrační příklad: použití textového režimu 80×25 znaků
V dnešním prvním demonstračním příkladu si necháme zobrazit text i s barvovými atributy ve standardním grafickém režimu s 25 textovými řádky a osmdesáti znaky na každém řádku. Výsledek získaný po spuštění tohoto příkladu by měl vypadat následovně:
Obrázek 19: Standardní textový režim karty EGA s rozlišením 80×25 znaků.
Úplný zdrojový kód dnešního prvního demonstračního příkladu vypadá takto:
; Textovy rezim karty EGA s rozlisenim 80x25 znaku. ; ; preklad pomoci: ; nasm -f bin -o ega.com ega_text_mode_80x25.asm ; ; nebo pouze: ; nasm -o ega.com ega_text_mode_80x25.asm ;----------------------------------------------------------------------------- ; ukonceni procesu a navrat do DOSu %macro exit 0 mov ah, 0x4c int 0x21 %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ; nastaveni grafickeho rezimu %macro gfx_mode 1 mov ah, 0 mov al, %1 int 0x10 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: gfx_mode 3 ; nastaveni standardniho textoveho rezimu 80x25 znaku mov ax, 0xb800 ; video RAM v textovem rezimu mov es, ax mov di, 0 ; nyni ES:DI obsahuje adresu prvniho znaku ve video RAM mov cx, 80*25 ; pocet zapisovanych znaku mov al, 0 ; kod zapisovaneho znaku opak: stosb ; zapis znaku + atributu stosb inc al ; dalsi znak/atribut loop opak ; opakujeme CX-krat wait_key ; cekani na klavesu exit ; navrat do DOSu
8. Přepnutí do textového režimu 80×43 znaků
V úvodních kapitolách jsme si řekli, že karta EGA dokáže zobrazit text v mřížce 80×43 znaků. Jedná se vlastně o variantu standardního textového režimu s 25 řádky, kde je ovšem výška znaků snížena na osm obrazových řádků. Výsledkem bude, že se na obrazovku vejde:
floor(350/8)=43
textových řádků, kde 350 je nejvyšší počet obrazových řádků, které zvládají standardní EGA monitory. Pro změnu fontu můžeme použít buď řídicí registry EGA nebo funkci BIOSu. V tomto případě se spolehneme na BIOS, což je snazší a dopředně kompatibilní řešení.
Použijeme video služby BIOSu, které se volají přes SW přerušení 0×10. To již známe, protože služba číslo 0 (AH=0×00) je použita pro přepínání textových a grafických režimů. My ovšem použijeme službu číslo 0×11 (AH=0×11), která slouží pro modifikaci použité znakové sady. Konkrétně budeme muset registry nastavit takto:
Registr | Hodnota | Význam |
---|---|---|
AH | 0×11 | číslo služby video BIOSu: změna znakové sady |
AL | 0×01 | zavedení fontu 8×14 pixelů (tedy 25 textových řádků) |
AL | 0×02 | zavedení fontu 8×8 pixelů (tedy 43 textových řádků) |
AL | 0×11 | zavedení fontu 8×14 pixelů (tedy 25 textových řádků) a přeprogramování CRTC |
AL | 0×12 | zavedení fontu 8×8 pixelů (tedy 43 textových řádků) a přeprogramování CRTC |
BL | 0×00 | znaková sada 0–4 (k ní se ještě vrátíme) |
Pro přepnutí znakové sady na font 8×8 pixelů a současné přeprogramování CRTC použijeme makro:
; nastaveni fontu 8x8 pixelu %macro set_font_8x8 0 mov ax, 0x1112 xor bl, bl int 0x10 %endmacro
Pro návrat zpět na standardní font 8×14 pixelů naopak použijeme jiné makro:
; nastaveni fontu 8x14 pixelu %macro set_font_8x14 0 mov ax, 0x1111 xor bl, bl int 0x10 %endmacro
9. Druhý demonstrační příklad: použití textového režimu 80×43 znaků
Ve druhém demonstračním příkladu, který si dnes ukážeme, se nejprve nastaví standardní textový režim 80×25 znaků a posléze se přepne znaková sada tak, aby se používaly fonty 8×8 pixelů. Ve výsledku tedy získáme textový režim s osmdesáti sloupci a floor(350/8)=43 textovými řádky:
Obrázek 20: Standardní textový režim karty EGA s rozlišením 80×25 znaků, ovšem díky jiné výšce znaků nastavený tak, aby zobrazoval 43 textových řádků.
Úplný zdrojový kód dnešního druhého demonstračního příkladu vypadá takto:
; Textovy rezim karty EGA s rozlisenim 80x43 znaku. ; ; preklad pomoci: ; nasm -f bin -o ega.com ega_text_mode_80x43.asm ; ; nebo pouze: ; nasm -o ega.com ega_text_mode_80x43.asm ;----------------------------------------------------------------------------- ; ukonceni procesu a navrat do DOSu %macro exit 0 mov ah, 0x4c int 0x21 %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ; nastaveni grafickeho rezimu %macro gfx_mode 1 mov ah, 0 mov al, %1 int 0x10 %endmacro ; nastaveni fontu 8x8 pixelu %macro set_font_8x8 0 mov ax, 0x1112 xor bl, bl int 0x10 %endmacro ; nastaveni fontu 8x14 pixelu %macro set_font_8x14 0 mov ax, 0x1111 xor bl, bl int 0x10 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 436) start: gfx_mode 3 ; nastaveni standardniho textoveho rezimu 80x25 znaku mov ax, 0xb800 ; video RAM v textovem rezimu mov es, ax mov di, 0 ; nyni ES:DI obsahuje adresu prvniho znaku ve video RAM mov cx, 80*43 ; pocet zapisovanych znaku mov al, 0 ; kod zapisovaneho znaku opak: stosb ; zapis znaku + atributu stosb inc al ; dalsi znak/atribut loop opak ; opakujeme CX-krat wait_key ; cekani na klavesu set_font_8x8 ; nastaveni fontu 8x8 pixelu wait_key ; cekani na klavesu set_font_8x14 ; nastaveni fontu 8x14 pixelu wait_key ; cekani na klavesu exit ; navrat do DOSu
10. Grafické režimy karty EGA
Grafická karta EGA podporuje poměrně velké množství nových grafických režimů i režimů určených pro zachování kompatibility se staršími programy, které využívaly možnosti karty CGA. Pokus se (prozatím) budeme držet standardních (resp. standardizovaných) režimů, dostaneme tento seznam:
- Režim s rozlišením 320×200 pixelů ve čtyřech barvách. Jedná se o emulaci vícebarevného režimu grafické karty CGA, v němž je dokonce emulováno i omezení barvové palety (pouze dvě, resp. tři dostupné palety atd.). Pouze pro účely zpětné kompatibility, žádný software vytvořený přímo pro EGA tento režim primárně nepoužíval (logicky).
- Režim s rozlišením 640×200 pixelů ve dvou barvách. Opět se jedná o emulaci, tentokrát však „hi-res“ režimu grafické kartyCGA (prokládání obrazových řádků atd.).
- Režim s rozlišením 320×200 pixelů v šestnácti barvách. V tomto případě se již jedná o nový režim, který byl s úspěchem použit zejména u her (připomeňme Gobliins, Lemmings, Dungeon Master, Civilizace, Golden Axe apod.). Je použitelný jak na starých CGA monitorech (ovšem s omezením barev na základní 16barevnou paletu), tak i na EGA monitorech (zde již bez omezení barev).
- Režim s rozlišením 640×200 pixelů v šestnácti barvách. Pro tento režim je zapotřebí alokovat pouze cca 64kB paměti, je tedy podporován na všech kartách EGA. Platí pro něj prakticky totéž, jako o předchozím režimu – na starých CGA monitorech je ho možné použít, ale omezují se barvy, které mohou být použity.
- Režim s rozlišením 640×350 pixelů ve čtyřech barvách. Pro tento režim je zapotřebí alokovat pouze cca 56kB paměti, běží tedy na všech kartáchEGA, ale vyžaduje EGA monitor.
- Režim s rozlišením 640×350 pixelů v šestnácti barvách. Pro tento režim je zapotřebí alokovat cca 112kB paměti, což ovšem znamená, že vyžaduje plnohodnotnou kartu EGA (minimálně 128kB RAM). Na kartách s menší kapacitou obrazové paměti není tento režim dostupný. Použití – jak grafické uživatelské rozhraní mnohých aplikací (T602), tak i některé hry, například Simcity apod. A pochopitelně tento režim vyžaduje EGA monitor.
Obrázek 19: Netwars v režimu zobrazení vyplňovaných (solid) objektů.
11. Podpora grafických režimů karty EGA BIOSem
Nyní si již můžeme doplnit tabulky se standardními textovými a grafickými režimy podporovanými BIOSem o další režimy karty EGA:
Číslo (AL) | Karty | Monitory | Typ | Rozlišení | Barvy | Segment | |
---|---|---|---|---|---|---|---|
00 | CGA, EGA | kompozitní | text | 40×25 | mono, 16 barev | 0×b800 | |
01 | CGA, EGA | kompozitní, RGBI, EGA | text | 40×25 | mono, 16 barev | 0×b800 | |
02 | CGA, EGA | kompozitní | text | 80×25 | mono, 16 barev | 0×b800 | |
03 | CGA, EGA | kompozitní, RGBI, EGA | text | 80×25 | mono, 16 barev | 0×b800 | |
04 | CGA, EGA | kompozitní, RGBI, EGA | grafika | 320×200 | 4 | 0×b800 | |
05 | CGA, EGA | kompozitní | grafika | 320×200 | 4 | 0×b800 | |
06 | CGA, EGA | kompozitní, RGBI, EGA | grafika | 640×200 | 2 | 0×b800 | |
07 | MDA, EGA | TTL mono (MDA) | text | 80×25 | mono+intenzita | 0×b000 | |
N/A | Hercules | TTL mono (MDA) | grafika | 720×348 | mono | 0×b000 nebo 0×b800 | |
0d | EGA | EGA | grafika | 320×200 | 16 | 0×a000 | |
0e | EGA | EGA | grafika | 640×200 | 16 | 0×a000 | |
0f | EGA | TTL mono (MDA), EGA | grafika | 640×350 | 3 (BW) | 0×a000 | |
1d | EGA | EGA | grafika | 640×350 | 4 nebo 16 | 0×a000 |
Obrázek 20: Space Quest v režimu 320×200 se šestnácti barvami.
12. Třetí demonstrační příklad: grafický režim 320×200 se šestnácti barvami
V dnešním třetím demonstračním příkladu je provedeno přepnutí do grafického režimu s rozlišením 320×200 pixelů a se šestnácti barvami:
; nastaveni grafickeho rezimu %macro gfx_mode 1 mov ah, 0 mov al, %1 int 0x10 %endmacro
gfx_mode 0x0d ; nastaveni rezimu 320x200 se sestnacti barvami
Následně je vyplněna část segmentu 0×a000 (tedy video RAM) různými bitovými vzorky:
mov cx, 320*200/8 ; pocet zapisovanych pixelu (ovsem pocitano v bajtech) mov al, 0 ; kod pixelu opak: stosb inc al ; dalsi znak/atribut loop opak ; opakujeme CX-krat
Výsledek bude monochromatický (prozatím) a bude vypadat následovně:
Obrázek 21: Obrazovka vykreslená dnešním třetím demonstračním příkladem.
Následuje výpis úplného zdrojového kódu tohoto příkladu:
; Graficky rezim karty EGA s rozlisenim 320x200 pixelu. ; ; preklad pomoci: ; nasm -f bin -o ega.com ega_gfx_mode_320x200.asm ; ; nebo pouze: ; nasm -o ega.com ega_gfx_mode_320x200.asm ;----------------------------------------------------------------------------- ; ukonceni procesu a navrat do DOSu %macro exit 0 mov ah, 0x4c int 0x21 %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ; nastaveni grafickeho rezimu %macro gfx_mode 1 mov ah, 0 mov al, %1 int 0x10 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 436) start: gfx_mode 0x0d ; nastaveni rezimu 320x200 se sestnacti barvami mov ax, 0xa000 ; video RAM v textovem rezimu mov es, ax mov di, 0 ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 320*200/8 ; pocet zapisovanych pixelu (ovsem pocitano v bajtech) mov al, 0 ; kod pixelu opak: stosb inc al ; dalsi znak/atribut loop opak ; opakujeme CX-krat wait_key ; cekani na klavesu exit ; navrat do DOSu
13. Čtvrtý demonstrační příklad: grafický režim 640×200 se šestnácti barvami
Naprosto stejným způsobem zobrazíme bitový vzorek (opět prozatím jen monochromatický) v grafickém režimu s rozlišením 640×200 pixelů, který na kartě EGA dokáže využít šestnáct konfigurovatelných barev:
Obrázek 22: Obrazovka vykreslená dnešním čtvrtým demonstračním příkladem.
; Graficky rezim karty EGA s rozlisenim 640x200 pixelu. ; ; preklad pomoci: ; nasm -f bin -o ega.com ega_gfx_mode_640x200.asm ; ; nebo pouze: ; nasm -o ega.com ega_gfx_mode_640x200.asm ;----------------------------------------------------------------------------- ; ukonceni procesu a navrat do DOSu %macro exit 0 mov ah, 0x4c int 0x21 %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ; nastaveni grafickeho rezimu %macro gfx_mode 1 mov ah, 0 mov al, %1 int 0x10 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 436) start: gfx_mode 0x0e ; nastaveni rezimu 640x200 se sestnacti barvami mov ax, 0xa000 ; video RAM v textovem rezimu mov es, ax mov di, 0 ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 640*200/8 ; pocet zapisovanych pixelu (ovsem pocitano v bajtech) mov al, 0 ; kod pixelu opak: stosb inc al ; dalsi znak/atribut loop opak ; opakujeme CX-krat wait_key ; cekani na klavesu exit ; navrat do DOSu
14. Pátý demonstrační příklad: grafický režim 640×350 pixelů (4 či 16 barev)
A konečně si vyzkoušejme prakticky totožný kód, tentokrát ovšem upravený tak, aby se využil grafický režim s rozlišením 640×350 pixelů se čtyřmi nebo šestnácti barvami:
Obrázek 23: Obrazovka vykreslená dnešním pátým demonstračním příkladem.
; Graficky rezim karty EGA s rozlisenim 640x350 pixelu. ; ; preklad pomoci: ; nasm -f bin -o ega.com ega_gfx_mode_640x350.asm ; ; nebo pouze: ; nasm -o ega.com ega_gfx_mode_640x350.asm ;----------------------------------------------------------------------------- ; ukonceni procesu a navrat do DOSu %macro exit 0 mov ah, 0x4c int 0x21 %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ; nastaveni grafickeho rezimu %macro gfx_mode 1 mov ah, 0 mov al, %1 int 0x10 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 436) start: gfx_mode 0x10 ; nastaveni rezimu 640x350 se ctyrmi nebo sestnacti barvami mov ax, 0xa000 ; video RAM v textovem rezimu mov es, ax mov di, 0 ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 640*350/8 ; pocet zapisovanych pixelu (ovsem pocitano v bajtech) mov al, 0 ; kod pixelu opak: stosb inc al ; dalsi znak/atribut loop opak ; opakujeme CX-krat wait_key ; cekani na klavesu exit ; navrat do DOSu
15. Barvová paleta, úpravy zapojení monitoru
V nových grafických režimech karty EGA je možné vybrat paletu šestnácti barev z celkových 26=64 barev. Z toho vyplývá, že pro každou barvovou složku byly k dispozici dva bity a tím pádem čtyři hodnoty intenzity; konkrétně nulová intenzita, 1/3 maximální intenzity, 2/3 maximální intenzity a maximální intenzita. Rozhraní k monitoru zůstalo stále digitální (TTL signály, na rozdíl od analogových barvonosných signálů použitých u pozdější karty VGA), pouze se zvýšil počet použitých signálových vodičů nesoucích informace o barvách pixelů.
Původní CGA monitor (TTL) se nazýval RGBI, protože barvy byly kódovány jako trojice R+G+B+celková intenzita. U monitorů EGA byly pro každou barvu vyvedeny dva vodiče pro volbu intenzita=0, intenzita=1/3, intenzita=2/3 a intenzita=1/3+2/3=1. Jedná se o fyzicky totožný konektor DE-9:
Pin | CGA | EGA |
---|---|---|
1 | GND | GND |
2 | GND | 2/3 Red |
3 | Red | 1/3 Red |
4 | Green | 1/3 Green |
5 | Blue | 1/3 Blue |
6 | Intenzita | 2/3 Green |
7 | Rezervováno | 2/3 Blue |
8 | H-sync | H-sync |
9 | V-sync | V-sync |
Můžeme zde vidět dva problémy. Prvním je, že EGA monitor musí být fyzicky přepnut do režimu CGA, aby korektně zobrazil původní aplikace vytvořené právě pro CGA. V opačném případě budou barvy interpretovány nekorektně (namísto vyšší intenzity se zvýší jen intenzita zelené složky atd.). Druhý problém je ovšem horší – pokud je ke kartě EGA připojen CGA monitor, měl by bez problémů zobrazit původní režimy. Ovšem pokud se SW přepne do nějakého EGA režimu, bude na pin číslo 2 posílána červená barvová složka. A pokud má monitor tento pin uzemněn (což může, ale nemusí), dojde k poškození výstupních zesilovačů EGA. Máme zde tedy poučení: pro zajištění dopředné kompatibility je lepší piny spíše vůbec neobsazovat (jen je rezervovat a nechat „vlát“), než jim původně přidat zbytečný význam (na co dvě země) a po několika letech význam měnit takovým způsobem, že může dojít k poškození zařízení.
16. Struktura obrazové paměti v grafických režimech EGA
Zajímavý byl v grafických režimech přístup do obrazové paměti, která byla (z pohledu procesoru a tím i programátora) mapována v adresovém rozsahu a000:0000-a000:ffff. Obrazové (skenovací) řádky jsou sice konečně (!) uloženy v lineární sekvenci (na rozdíl od grafických karet CGA a Herculesu), ale nebyla by to IBM, aby si nevymyslela další vlastnost, která programátorům znepříjemňovala život – takzvané bitové roviny (bitplanes).
Barvy jednotlivých pixelů jsou totiž rozmístěny v jedné, dvou či čtyř bitových rovinách, které jsou mapovány na stejné adresy. Jedná se tudíž o poněkud jiný přístup než byl použitý například v počítačích Amiga, u nichž se všechny bitové roviny mapovaly do adresního prostoru procesoru současně (Amiga ovšem byla vybavena skutečným 32bitovým procesorem :-). Pro přístup k jednotlivým bitovým rovinám se u karty EGA (a později VGA) musely naprogramovat registry řídicího bloku GDC, což je poměrně pomalá činnost.
Patrně nejprimitivnější grafická operace – putpixel – se tak velmi podstatným způsobem zkomplikovala a zpomalila (v nejhorším případě bylo nutné provést čtyři čtení a čtyři zápisy do obrazové paměti). Na druhou stranu některé jiné grafické operace bylo možné urychlit. Například bylo možné v jedné rovině zobrazovat skrolující text, v rovině druhé a třetí animovat obrázek a čtvrtou rovinu ponechat pro zobrazení nehybného pozadí. Vše záviselo pouze na nastavení vhodné barvové palety, protože výsledná barva pixelů byla získána na základě hodnot uložených ve všech rovinách „pod sebou“.
Důvod, proč nebylo možné všechny bitové roviny namapovat současně do adresního prostoru procesoru, je jednoduchý. V reálném režimu mohl procesor adresovat pouze 1 MB paměti (+necelých 64 kB nad tímto limitem, když se zadařilo a bůh Wintel tomu byl nakloněn), přičemž 640 kB bylo rezervováno pro potřeby operačního systému a aplikací (protože 640 kB přece stačí každému, že) a do zbylých 384 kB se mapoval samotný BIOS, obrazová paměť grafické karty, buffery síťových karet, NetBIOS, stránky paměti EMS atd. Z těchto důvodů mohly grafické karty využívat pouze 128 kB adresního prostoru, přičemž ve všech standardních grafických režimech se používalo maximálně 64 kB a bylo tedy nutné do tohoto rozsahu mapovat celou video paměť, která mohla mít u karty EGA velikost až 256 kB.
A proč to nebylo v žádném případě dokonalé řešení? Postačovalo totiž jen pro EGA a VGA režimy, postačovalo i pro SVGA režim 800×600 (obsazeno 60000 bajtů z dostupných 65536), ale výše už se jít nedalo, protože se celý segment zaplnil i pouze bitovými maskami, bez ohledu na počet barev. Navíc VGA zavedlo „zřetězený režim“ a u SVGA pak přístup přes paměťové banky, takže se za několik málo let na platformě PC nastřádaly prakticky všechny možné způsoby, jak obrazovou paměť organizovat:
- Obrazová paměť rozdělená na sudé a liché řádky (CGA)
- Obrazová paměť rozdělená způsobem 1, 5, 9, … 2, 6, 10, … řádek (Hercules)
- Lineární obrazová paměť rozdělená na bitové roviny (EGA, VGA)
- Lineární obrazová paměť, kde každý bajt odpovídá jednomu pixelu (jediný možný režim VGA, slavný 13h)
- Obrazová paměť rozdělená na banky (SVGA)
Obrázek 24: Poměrně velká část aplikací podporujících grafickou kartu EGA neprováděla přenastavení barev v barvové paletě. Jednou z výjimek je například známý textový editor T602, který pro svoje účely (pozadí textu a barvu písma) barevnou paletu modifikoval.
17. Výběr bitové roviny pro zobrazení většího množství barev
V případě, že se mají zobrazit pixely v různých barvách, je zapotřebí provést zápisy nikoli do všech bitových rovin (potom bude výsledkem černá nebo bílá barva), ale jen do vybraných bitových rovin. Pokusme se vykreslit následující obrázek obsahující všech šestnáct barev standardní barvové palety (ovšem později si ukážeme, jak lze barvy do palety vybrat):
Obrázek 25: Několik barevných obrazců vykreslených v planárním grafickém režimu.
Nejprve si pojmenujeme adresu I/O portu ovládajícího řadič karty EGA. Druhý symbol obsahuje index registru s bitovými rovinami, který se bude měnit:
; registry karty EGA/VGA ega_controller equ 0x3c4 bitplane_selector equ 0x02
Důležitý bude podprogram nazvaný select_bitplane, který na základě požadované barvy předané v registru AL vybere libovolnou kombinaci bitových rovin pro zápis. Tato konfigurace se provádí přes port 0×3c4 změnou registru číslo 0×02 (vliv mají spodní čtyři bity tohoto registru):
select_bitplane: mov dx, ega_controller push ax mov al, bitplane_selector out dx, al ; vyber registru sekvenceru pop ax inc dx out dx, al ; zapis masky bitovych rovin ret ; hotovo
Dále si můžeme připravit podprogram, který na obrazovku vykreslí blok (několik vyplněných obrazových řádků), ovšem ještě předtím vybere kombinaci bitových rovin a tím i požadovanou barvu. Změní se i obsah registru DI, který bude ukazovat na adresu začátku dalšího bloku na obrazovce:
draw_block_into_bitplanes: push ax push cx call select_bitplane; maska bitovych rovin call draw_block add di, 320*3/8 ; posun o nekolik radku nize pop cx pop ax inc al ; zmena masky ret ; hotovo draw_block: mov cx, 320*9/8 ; pocet zapisovanych pixelu (ovsem pocitano v bajtech) mov al, 0xff ; kod pixelu rep stosb ret
A konečně si necháme vykreslit šestnáct bloků, každý odlišnou barvou:
xor al, al ; maska bitovych rovin mov cl, 16 ; pocitadlo barevnych pruhu opak: call draw_block_into_bitplanes loop opak
18. Šestý demonstrační příklad – vykreslení barevných obrazců
Úplný zdrojový kód demonstračního příkladu popsaného v předchozí kapitole vypadá následovně:
; Graficky rezim karty EGA s rozlisenim 320x200 pixelu. ; Zmena barvovych rovin, do kterych se zapisuje. ; ; preklad pomoci: ; nasm -f bin -o ega.com ega_gfx_mode_bitplanes_1.asm ; ; nebo pouze: ; nasm -o ega.com ega_gfx_mode_bitplanes_1.asm ;----------------------------------------------------------------------------- ; registry karty EGA/VGA ega_controller equ 0x3c4 bitplane_selector equ 0x02 ; ukonceni procesu a navrat do DOSu %macro exit 0 mov ah, 0x4c int 0x21 %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ; nastaveni grafickeho rezimu %macro gfx_mode 1 mov ah, 0 mov al, %1 int 0x10 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 436) start: gfx_mode 0x0d ; nastaveni rezimu 320x200 se sestnacti barvami mov ax, 0xa000 ; video RAM v textovem rezimu mov es, ax xor di, di ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM xor al, al ; maska bitovych rovin mov cl, 16 ; pocitadlo barevnych pruhu opak: call draw_block_into_bitplanes loop opak wait_key ; cekani na klavesu exit ; navrat do DOSu select_bitplane: mov dx, ega_controller push ax mov al, bitplane_selector out dx, al ; vyber registru sekvenceru pop ax inc dx out dx, al ; zapis masky bitovych rovin ret ; hotovo draw_block_into_bitplanes: push ax push cx call select_bitplane; maska bitovych rovin call draw_block add di, 320*3/8 ; posun o nekoli radku nize pop cx pop ax inc al ; zmena masky ret ; hotovo draw_block: mov cx, 320*9/8 ; pocet zapisovanych pixelu (ovsem pocitano v bajtech) mov al, 0xff ; kod pixelu rep stosb ret
19. Repositář s demonstračními příklady
Demonstrační příklady napsané v assembleru, které jsou určené pro překlad pomocí assembleru NASM, byly uložen do Git repositáře, který je dostupný na adrese https://github.com/tisnik/8bit-fame. Jednotlivé demonstrační příklady si můžete v případě potřeby stáhnout i jednotlivě bez nutnosti klonovat celý (dnes již poměrně rozsáhlý) repositář:
# | Příklad | Stručný popis | Adresa |
---|---|---|---|
1 | hello.asm | program typu „Hello world“ naprogramovaný v assembleru pro systém DOS | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello.asm |
2 | hello_shorter.asm | kratší varianta výskoku z procesu zpět do DOSu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_shorter.asm |
3 | hello_wait.asm | čekání na stisk klávesy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_wait.asm |
4 | hello_macros.asm | realizace jednotlivých částí programu makrem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_macros.asm |
5 | gfx4_putpixel.asm | vykreslení pixelu v grafickém režimu 4 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_putpixel.asm |
6 | gfx6_putpixel.asm | vykreslení pixelu v grafickém režimu 6 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel.asm |
7 | gfx4_line.asm | vykreslení úsečky v grafickém režimu 4 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_line.asm |
8 | gfx6_line.asm | vykreslení úsečky v grafickém režimu 6 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_line.asm |
9 | gfx6_fill1.asm | vyplnění obrazovky v grafickém režimu, základní varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill1.asm |
10 | gfx6_fill2.asm | vyplnění obrazovky v grafickém režimu, varianta s instrukcí LOOP | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill2.asm |
11 | gfx6_fill3.asm | vyplnění obrazovky instrukcí REP STOSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill3.asm |
12 | gfx6_fill4.asm | vyplnění obrazovky, synchronizace vykreslování s paprskem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill4.asm |
13 | gfx4_image1.asm | vykreslení rastrového obrázku získaného z binárních dat, základní varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image1.asm |
14 | gfx4_image2.asm | varianta vykreslení rastrového obrázku s využitím instrukce REP MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image2.asm |
15 | gfx4_image3.asm | varianta vykreslení rastrového obrázku s využitím instrukce REP MOVSW | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image3.asm |
16 | gfx4_image4.asm | korektní vykreslení všech sudých řádků bitmapy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image4.asm |
17 | gfx4_image5.asm | korektní vykreslení všech sudých i lichých řádků bitmapy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image5.asm |
18 | gfx4_image6.asm | nastavení barvové palety před vykreslením obrázku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image6.asm |
19 | gfx4_image7.asm | nastavení barvové palety před vykreslením obrázku, snížená intenzita barev | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image7.asm |
20 | gfx4_image8.asm | postupná změna barvy pozadí | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image8.asm |
21 | gfx6_putpixel1.asm | vykreslení pixelu, základní varianta se 16bitovým násobením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel1.asm |
22 | gfx6_putpixel2.asm | vykreslení pixelu, varianta s osmibitovým násobením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel2.asm |
23 | gfx6_putpixel3.asm | vykreslení pixelu, varianta bez násobení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel3.asm |
24 | gfx6_putpixel4.asm | vykreslení pixelu přes obrázek, nekorektní chování (přepis obrázku) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel4.asm |
25 | gfx6_putpixel5.asm | vykreslení pixelu přes obrázek, korektní varianta pro bílé pixely | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel5.asm |
26 | cga_text_mode1.asm | standardní textový režim s rozlišením 40×25 znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode1.asm |
27 | cga_text_mode3.asm | standardní textový režim s rozlišením 80×25 znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode3.asm |
28 | cga_text_mode_intensity.asm | změna významu nejvyššího bitu atributového bajtu: vyšší intenzita namísto blikání | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_intensity.asm |
29 | cga_text_mode_cursor.asm | změna tvaru textového kurzoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_cursor.asm |
30 | cga_text_gfx1.asm | zobrazení „rastrové mřížky“: pseudografický režim 160×25 pixelů (interně textový režim) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_gfx1.asm |
31 | cga_text_mode_char_height.asm | změna výšky znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_char_height.asm |
32 | cga_text_160×100.asm | grafický režim 160×100 se šestnácti barvami (interně upravený textový režim) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_160×100.asm |
33 | hercules_text_mode1.asm | využití standardního textového režimu společně s kartou Hercules | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_text_mode1.asm |
34 | hercules_text_mode2.asm | zákaz blikání v textových režimech | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_text_mode2.asm |
35 | hercules_turn_off.asm | vypnutí generování video signálu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_turn_off.asm |
36 | hercules_gfx_mode1.asm | přepnutí karty Hercules do grafického režimu (základní varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_gfx_mode1.asm |
37 | hercules_gfx_mode2.asm | přepnutí karty Hercules do grafického režimu (vylepšená varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_gfx_mode2.asm |
38 | hercules_putpixel.asm | subrutina pro vykreslení jediného pixelu na kartě Hercules | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_putpixel.asm |
39 | ega_text_mode_80×25.asm | standardní textový režim 80×25 znaků na kartě EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_text_mode_80×25.asm |
40 | ega_text_mode_80×43.asm | zobrazení 43 textových řádků na kartě EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_text_mode_80×43.asm |
41 | ega_gfx_mode_320×200.asm | přepnutí do grafického režimu 320×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_320×200.asm |
42 | ega_gfx_mode_640×200.asm | přepnutí do grafického režimu 640×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_640×200.asm |
43 | ega_gfx_mode_640×350.asm | přepnutí do grafického režimu 640×350 pixelů se čtyřmi nebo šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_640×350.asm |
44 | ega_gfx_mode_bitplanes1.asm | ovládání zápisu do bitových rovin v planárních grafických režimech (základní způsob) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_bitplanes1.asm |
45 | ega_gfx_mode_bitplanes2.asm | ovládání zápisu do bitových rovin v planárních grafických režimech (rychlejší způsob) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_bitplanes2.asm |
20. Odkazy na Internetu
- The Intel 8088 Architecture and Instruction Set
https://people.ece.ubc.ca/~edc/464/lectures/lec4.pdf - x86 Opcode Structure and Instruction Overview
https://pnx.tf/files/x86_opcode_structure_and_instruction_overview.pdf - x86 instruction listings (Wikipedia)
https://en.wikipedia.org/wiki/X86_instruction_listings - x86 assembly language (Wikipedia)
https://en.wikipedia.org/wiki/X86_assembly_language - Intel Assembler (Cheat sheet)
http://www.jegerlehner.ch/intel/IntelCodeTable.pdf - 25 Microchips That Shook the World
https://spectrum.ieee.org/tech-history/silicon-revolution/25-microchips-that-shook-the-world - Chip Hall of Fame: MOS Technology 6502 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-mos-technology-6502-microprocessor - Chip Hall of Fame: Intel 8088 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-intel-8088-microprocessor - Jak se zrodil procesor?
https://www.root.cz/clanky/jak-se-zrodil-procesor/ - Apple II History Home
http://apple2history.org/ - The 8086/8088 Primer
https://www.stevemorse.org/8086/index.html - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - INT 21 – DOS Function Dispatcher (DOS)
https://www.stanislavs.org/helppc/int21.html - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - Bit banging
https://en.wikipedia.org/wiki/Bit_banging - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Bootloaders
https://en.wikibooks.org/wiki/X86_Assembly/Bootloaders - Počátky grafiky na PC: grafické karty CGA a Hercules
https://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/ - Co mají společného Commodore PET/4000, BBC Micro, Amstrad CPC i grafické karty MDA, CGA a Hercules?
https://www.root.cz/clanky/co-maji-spolecneho-commodore-pet-4000-bbc-micro-amstrad-cpc-i-graficke-karty-mda-cga-a-hercules/ - Karta EGA: první použitelná barevná grafika na PC
https://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/ - RGB Classic Games
https://www.classicdosgames.com/ - Turbo Assembler (Wikipedia)
https://en.wikipedia.org/wiki/Turbo_Assembler - Microsoft Macro Assembler
https://en.wikipedia.org/wiki/Microsoft_Macro_Assembler - IBM Personal Computer (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Personal_Computer - Intel 8251
https://en.wikipedia.org/wiki/Intel_8251 - Intel 8253
https://en.wikipedia.org/wiki/Intel_8253 - Intel 8255
https://en.wikipedia.org/wiki/Intel_8255 - Intel 8257
https://en.wikipedia.org/wiki/Intel_8257 - Intel 8259
https://en.wikipedia.org/wiki/Intel_8259 - Support/peripheral/other chips – 6800 family
http://www.cpu-world.com/Support/6800.html - Motorola 6845
http://en.wikipedia.org/wiki/Motorola_6845 - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - CRTC operation
http://www.6502.org/users/andre/hwinfo/crtc/crtc.html - 6845 – Motorola CRT Controller
https://stanislavs.org/helppc/6845.html - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - Motorola 6845 and bitwise graphics
https://retrocomputing.stackexchange.com/questions/10996/motorola-6845-and-bitwise-graphics - IBM Monochrome Display Adapter
http://en.wikipedia.org/wiki/Monochrome_Display_Adapter - Color Graphics Adapter
http://en.wikipedia.org/wiki/Color_Graphics_Adapter - Color Graphics Adapter and the Brown color in IBM 5153 Color Display
https://www.aceinnova.com/en/electronics/cga-and-the-brown-color-in-ibm-5153-color-display/ - The Modern Retrocomputer: An Arduino Driven 6845 CRT Controller
https://hackaday.com/2017/05/14/the-modern-retrocomputer-an-arduino-driven-6845-crt-controller/ - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - INT 21 – DOS Function Dispatcher (DOS)
https://www.stanislavs.org/helppc/int21.html - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Arithmetic
https://en.wikibooks.org/wiki/X86_Assembly/Arithmetic - Art of Assembly – Arithmetic Instructions
http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter6/CH06–2.html - ASM Flags
http://www.cavestory.org/guides/csasm/guide/asm_flags.html - Status Register
https://en.wikipedia.org/wiki/Status_register - Linux assemblers: A comparison of GAS and NASM
http://www.ibm.com/developerworks/library/l-gas-nasm/index.html - Programovani v assembleru na OS Linux
http://www.cs.vsb.cz/grygarek/asm/asmlinux.html - Is it worthwhile to learn x86 assembly language today?
https://www.quora.com/Is-it-worthwhile-to-learn-x86-assembly-language-today?share=1 - Why Learn Assembly Language?
http://www.codeproject.com/Articles/89460/Why-Learn-Assembly-Language - Is Assembly still relevant?
http://programmers.stackexchange.com/questions/95836/is-assembly-still-relevant - Why Learning Assembly Language Is Still a Good Idea
http://www.onlamp.com/pub/a/onlamp/2004/05/06/writegreatcode.html - Assembly language today
http://beust.com/weblog/2004/06/23/assembly-language-today/ - Assembler: Význam assembleru dnes
http://www.builder.cz/rubriky/assembler/vyznam-assembleru-dnes-155960cz - Programming from the Ground Up Book – Summary
http://savannah.nongnu.org/projects/pgubook/ - DOSBox
https://www.dosbox.com/ - The C Programming Language
https://en.wikipedia.org/wiki/The_C_Programming_Language - Hercules Graphics Card (HCG)
https://en.wikipedia.org/wiki/Hercules_Graphics_Card - Complete 8086 instruction set
https://content.ctcd.edu/courses/cosc2325/m22/docs/emu8086ins.pdf - Complete 8086 instruction set
https://yassinebridi.github.io/asm-docs/8086_instruction_set.html - 8088 MPH by Hornet + CRTC + DESiRE (final version)
https://www.youtube.com/watch?v=hNRO7lno_DM - Area 5150 by CRTC & Hornet (Party Version) / IBM PC+CGA Demo, Hardware Capture
https://www.youtube.com/watch?v=fWDxdoRTZPc - 80×86 Integer Instruction Set Timings (8088 – Pentium)
http://aturing.umcs.maine.edu/~meadow/courses/cos335/80×86-Integer-Instruction-Set-Clocks.pdf - Colour Graphics Adapter: Notes
https://www.seasip.info/VintagePC/cga.html - Restoring A Vintage CGA Card With Homebrew HASL
https://hackaday.com/2024/06/12/restoring-a-vintage-cga-card-with-homebrew-hasl/ - Demoing An 8088
https://hackaday.com/2015/04/10/demoing-an-8088/ - Video Memory Layouts
http://www.techhelpmanual.com/89-video_memory_layouts.html - Screen Attributes
http://www.techhelpmanual.com/87-screen_attributes.html - IBM PC Family – BIOS Video Modes
https://www.minuszerodegrees.net/video/bios_video_modes.htm - EGA Functions
https://cosmodoc.org/topics/ega-functions/#the-hierarchy-of-the-ega