Hlavní navigace

Grafická karta EGA: pouze mírný pokrok v mezích zákona

23. 7. 2024
Doba čtení: 39 minut

Sdílet

 Autor: Pavel Tišnovský
V roce 1984 začala být pro platformu PC nabízena karta EGA. Byla zpětně kompatibilní s MDA i CGA a byla navržena s ohledem na dopřednou kompatibilitu. Měla neohrabaný design, ovšem umožňovala tvorbu pokročilejších her.

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ů

10. Grafické režimy karty EGA

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

20. Odkazy na Internetu

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ů.

pc85

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ý.

pc85

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).

pc85

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).

pc85

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 MDACGA, 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).

pc85

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.

pc85

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
pc85

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 MDACGA, 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ů).

Poznámka: obrazové řádky se nazývají scanlines, aby se dobře odlišily od text lines.

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.

pc85

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).

pc85

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
Poznámka: tento příklad se tedy nijak zásadně neodlišuje od příkladů pro MDA či CGA.

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:

  1. 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).
  2. 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.).
  3. 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).
  4. 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.
  5. 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.
  6. 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.
pc85

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
Poznámka: režim 0×0f dokáže „vykouzlit“ grafiku i na původních MDA monitorech, podobně jako karta Hecules. Zde se akorát používají 3 stupně šedi.

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í.

Poznámka: CGA monitor nedokázal zobrazit libovolnou barvu z palety a navíc nedokázal pracovat se 350 obrazovými řádky.

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:

  1. Obrazová paměť rozdělená na sudé a liché řádky (CGA)
  2. Obrazová paměť rozdělená způsobem 1, 5, 9, … 2, 6, 10, … řádek (Hercules)
  3. Lineární obrazová paměť rozdělená na bitové roviny (EGA, VGA)
  4. Lineární obrazová paměť, kde každý bajt odpovídá jednomu pixelu (jediný možný režim VGA, slavný 13h)
  5. Obrazová paměť rozdělená na banky (SVGA)
pc85

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

  1. The Intel 8088 Architecture and Instruction Set
    https://people.ece.ubc.ca/~ed­c/464/lectures/lec4.pdf
  2. x86 Opcode Structure and Instruction Overview
    https://pnx.tf/files/x86_op­code_structure_and_instruc­tion_overview.pdf
  3. x86 instruction listings (Wikipedia)
    https://en.wikipedia.org/wi­ki/X86_instruction_listin­gs
  4. x86 assembly language (Wikipedia)
    https://en.wikipedia.org/wi­ki/X86_assembly_language
  5. Intel Assembler (Cheat sheet)
    http://www.jegerlehner.ch/in­tel/IntelCodeTable.pdf
  6. 25 Microchips That Shook the World
    https://spectrum.ieee.org/tech-history/silicon-revolution/25-microchips-that-shook-the-world
  7. Chip Hall of Fame: MOS Technology 6502 Microprocessor
    https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-mos-technology-6502-microprocessor
  8. Chip Hall of Fame: Intel 8088 Microprocessor
    https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-intel-8088-microprocessor
  9. Jak se zrodil procesor?
    https://www.root.cz/clanky/jak-se-zrodil-procesor/
  10. Apple II History Home
    http://apple2history.org/
  11. The 8086/8088 Primer
    https://www.stevemorse.or­g/8086/index.html
  12. flat assembler: Assembly language resources
    https://flatassembler.net/
  13. FASM na Wikipedii
    https://en.wikipedia.org/wiki/FASM
  14. Fresh IDE FASM inside
    https://fresh.flatassembler.net/
  15. MS-DOS Version 4.0 Programmer's Reference
    https://www.pcjs.org/docu­ments/books/mspl13/msdos/dos­ref40/
  16. INT 21 – DOS Function Dispatcher (DOS)
    https://www.stanislavs.or­g/helppc/int21.html
  17. DOS API (Wikipedia)
    https://en.wikipedia.org/wiki/DOS_API
  18. Bit banging
    https://en.wikipedia.org/wi­ki/Bit_banging
  19. IBM Basic assembly language and successors (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Basic_assembly_lan­guage_and_successors
  20. X86 Assembly/Bootloaders
    https://en.wikibooks.org/wi­ki/X86_Assembly/Bootloaders
  21. Počátky grafiky na PC: grafické karty CGA a Hercules
    https://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/
  22. 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/
  23. Karta EGA: první použitelná barevná grafika na PC
    https://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/
  24. RGB Classic Games
    https://www.classicdosgames.com/
  25. Turbo Assembler (Wikipedia)
    https://en.wikipedia.org/wi­ki/Turbo_Assembler
  26. Microsoft Macro Assembler
    https://en.wikipedia.org/wi­ki/Microsoft_Macro_Assembler
  27. IBM Personal Computer (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Personal_Computer
  28. Intel 8251
    https://en.wikipedia.org/wi­ki/Intel_8251
  29. Intel 8253
    https://en.wikipedia.org/wi­ki/Intel_8253
  30. Intel 8255
    https://en.wikipedia.org/wi­ki/Intel_8255
  31. Intel 8257
    https://en.wikipedia.org/wi­ki/Intel_8257
  32. Intel 8259
    https://en.wikipedia.org/wi­ki/Intel_8259
  33. Support/peripheral/other chips – 6800 family
    http://www.cpu-world.com/Support/6800.html
  34. Motorola 6845
    http://en.wikipedia.org/wi­ki/Motorola_6845
  35. The 6845 Cathode Ray Tube Controller (CRTC)
    http://www.tinyvga.com/6845
  36. CRTC operation
    http://www.6502.org/users/an­dre/hwinfo/crtc/crtc.html
  37. 6845 – Motorola CRT Controller
    https://stanislavs.org/hel­ppc/6845.html
  38. The 6845 Cathode Ray Tube Controller (CRTC)
    http://www.tinyvga.com/6845
  39. Motorola 6845 and bitwise graphics
    https://retrocomputing.stac­kexchange.com/questions/10996/mo­torola-6845-and-bitwise-graphics
  40. IBM Monochrome Display Adapter
    http://en.wikipedia.org/wi­ki/Monochrome_Display_Adap­ter
  41. Color Graphics Adapter
    http://en.wikipedia.org/wi­ki/Color_Graphics_Adapter
  42. Color Graphics Adapter and the Brown color in IBM 5153 Color Display
    https://www.aceinnova.com/en/e­lectronics/cga-and-the-brown-color-in-ibm-5153-color-display/
  43. The Modern Retrocomputer: An Arduino Driven 6845 CRT Controller
    https://hackaday.com/2017/05/14/the-modern-retrocomputer-an-arduino-driven-6845-crt-controller/
  44. flat assembler: Assembly language resources
    https://flatassembler.net/
  45. FASM na Wikipedii
    https://en.wikipedia.org/wiki/FASM
  46. Fresh IDE FASM inside
    https://fresh.flatassembler.net/
  47. MS-DOS Version 4.0 Programmer's Reference
    https://www.pcjs.org/docu­ments/books/mspl13/msdos/dos­ref40/
  48. INT 21 – DOS Function Dispatcher (DOS)
    https://www.stanislavs.or­g/helppc/int21.html
  49. DOS API (Wikipedia)
    https://en.wikipedia.org/wiki/DOS_API
  50. IBM Basic assembly language and successors (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Basic_assembly_lan­guage_and_successors
  51. X86 Assembly/Arithmetic
    https://en.wikibooks.org/wi­ki/X86_Assembly/Arithmetic
  52. Art of Assembly – Arithmetic Instructions
    http://oopweb.com/Assembly/Do­cuments/ArtOfAssembly/Volu­me/Chapter6/CH06–2.html
  53. ASM Flags
    http://www.cavestory.org/gu­ides/csasm/guide/asm_flag­s.html
  54. Status Register
    https://en.wikipedia.org/wi­ki/Status_register
  55. Linux assemblers: A comparison of GAS and NASM
    http://www.ibm.com/develo­perworks/library/l-gas-nasm/index.html
  56. Programovani v assembleru na OS Linux
    http://www.cs.vsb.cz/gryga­rek/asm/asmlinux.html
  57. Is it worthwhile to learn x86 assembly language today?
    https://www.quora.com/Is-it-worthwhile-to-learn-x86-assembly-language-today?share=1
  58. Why Learn Assembly Language?
    http://www.codeproject.com/Ar­ticles/89460/Why-Learn-Assembly-Language
  59. Is Assembly still relevant?
    http://programmers.stackex­change.com/questions/95836/is-assembly-still-relevant
  60. Why Learning Assembly Language Is Still a Good Idea
    http://www.onlamp.com/pub/a/on­lamp/2004/05/06/writegreat­code.html
  61. Assembly language today
    http://beust.com/weblog/2004/06/23/as­sembly-language-today/
  62. Assembler: Význam assembleru dnes
    http://www.builder.cz/rubri­ky/assembler/vyznam-assembleru-dnes-155960cz
  63. Programming from the Ground Up Book – Summary
    http://savannah.nongnu.or­g/projects/pgubook/
  64. DOSBox
    https://www.dosbox.com/
  65. The C Programming Language
    https://en.wikipedia.org/wi­ki/The_C_Programming_Langu­age
  66. Hercules Graphics Card (HCG)
    https://en.wikipedia.org/wi­ki/Hercules_Graphics_Card
  67. Complete 8086 instruction set
    https://content.ctcd.edu/cou­rses/cosc2325/m22/docs/emu8086in­s.pdf
  68. Complete 8086 instruction set
    https://yassinebridi.github.io/asm-docs/8086_instruction_set.html
  69. 8088 MPH by Hornet + CRTC + DESiRE (final version)
    https://www.youtube.com/wat­ch?v=hNRO7lno_DM
  70. Area 5150 by CRTC & Hornet (Party Version) / IBM PC+CGA Demo, Hardware Capture
    https://www.youtube.com/wat­ch?v=fWDxdoRTZPc
  71. 80×86 Integer Instruction Set Timings (8088 – Pentium)
    http://aturing.umcs.maine­.edu/~meadow/courses/cos335/80×86-Integer-Instruction-Set-Clocks.pdf
  72. Colour Graphics Adapter: Notes
    https://www.seasip.info/Vin­tagePC/cga.html
  73. Restoring A Vintage CGA Card With Homebrew HASL
    https://hackaday.com/2024/06/12/res­toring-a-vintage-cga-card-with-homebrew-hasl/
  74. Demoing An 8088
    https://hackaday.com/2015/04/10/de­moing-an-8088/
  75. Video Memory Layouts
    http://www.techhelpmanual.com/89-video_memory_layouts.html
  76. Screen Attributes
    http://www.techhelpmanual.com/87-screen_attributes.html
  77. IBM PC Family – BIOS Video Modes
    https://www.minuszerodegre­es.net/video/bios_video_mo­des.htm
  78. EGA Functions
    https://cosmodoc.org/topics/ega-functions/#the-hierarchy-of-the-ega
ikonka

Zajímá vás toto téma? Chcete se o něm dozvědět víc?

Objednejte si upozornění na nově vydané články do vašeho mailu. Žádný článek vám tak neuteče.

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.