Od EGA ke grafickým kartám MCGA a VGA

30. 7. 2024
Doba čtení: 41 minut

Sdílet

 Autor: id software
Mezníkem ve vývoji platformy PC byl rok 1987, protože právě v tomto roce začala být prodávána grafická karta VGA. Umožnila vývoj sofistikovanějších her a později byla kombinace VGA+Intel 80386 použita ve hře Doom.

Obsah

1. Od EGA ke grafickým kartám MCGA a VGA

2. Grafická karta MCGA

3. Textové a grafické režimy karty MCGA

4. Video signály generované kartou MCGA

5. Grafická karta VGA: PC přebírá štafetu coby herní platforma

6. Textové režimy podporované kartou VGA

7. První demonstrační příklad: zobrazení textu se znaky v masce 9×16 pixelů

8. Textové režimy s odlišným počtem textových řádků

9. Druhý demonstrační příklad: textový režim 80×50 znaků a 80×28 znaků

10. Způsob zobrazení devátého sloupce pixelů u každého znaku

11. Třetí demonstrační příklad: změna způsobu zobrazení devátého sloupce pixelů

12. Modifikace tvaru textového kurzoru

13. Čtvrtý demonstrační příklad: modifikace tvaru textového kurzoru

14. Načtení vlastní znakové sady

15. Pátý demonstrační příklad: načtení a zobrazení vlastní znakové sady

16. Zákaz blikání znaků v textových režimech: složitější operace, než kdy dříve

17. Bezpečná změna řídicích registrů karty VGA

18. Šestý demonstrační příklad: zákaz blikání znaků realizovaný na kartě VGA

19. Repositář s demonstračními příklady

20. Odkazy na Internetu

1. Od EGA ke grafickým kartám MCGA a VGA

Platforma PC zpočátku nebyla určena pro tvorbu her ani graficky náročnějších aplikací. Situace se však postupně zlepšovala. Prvního relativního úspěchu bylo dosaženo kartou EGA z roku 1984, ovšem v porovnání například s Amigou (vydanou o necelý rok později) vycházela kombinace PC+EGA jako dražší a méně schopná kombinace (pokud se stále bavíme o hrách a grafických aplikacích). Ovšem vývoj PC šel kupředu, takže v roce 1987 začala být prodávána grafická karta VGA, která velmi zdárně konkurovala ostatním multimediálním typům počítačů. A dá se říci, že právě existence VGA a později i rozšíření PC s procesory 80386 (AMD, Intel) znamenalo pro PC vítězství a tím pádem i postupný úpadech Amigy i Atari ST (to pochopitelně nějakou dobu trvalo, ale zlom lze najít právě v kombinaci VGA+na svou dobu výkonná 80386).

Obrázek 1: Tento screenshot má sice pouze třináct barev, ale pro jeho korektní zobrazení je zapotřebí karta VGA. V případě, že hra běží na kartě EGA (což je podporováno), bude barvová paleta mnohem omezenější a obrázek bude po vizuální stránce horší.

Oproti kartě EGA můžeme vidět velké množství novinek, zejména pak:

  • Čitelnější textové režimy (lepší než v případě MDA i Herculesu)
  • Až osm znakových sad uložených v jednom momentu ve video RAM (lze použít pro různé triky)
  • Vyšší rozlišení 16barevného grafického režimu: 640×480
  • „Herní“ režim 320×200 s 256 barvami (velká výhra)
  • Možnost skrolování (ukážeme si příště)
  • Možnost windowingu (ukážeme si příště)
  • Režim split-screen
  • Jistota 256kB video RAM – není nutné kontrolovat při každé inicializaci aplikace
  • Ještě složitější programování na HW úrovni

Obrázek 2: Tento obrázek používá ještě menší počet barev, než obrázek první. Ovšem pro korektní zobrazení vyžaduje barvovou škálu karty VGA.

2. Grafická karta MCGA

Grafický adaptér označovaný zkratkou MCGA, neboli celým názvem MultiColor Graphics Array, navrhla společnost IBM pro svoji známou řadu počítačů PS/2, konkrétně pro modely PS/2 25 a PS/2 30 (jedná se o nejnižší model z celé řady PS/2, což je zkratka Personal System/2). V podstatě se jedná o značně zjednodušenou (a z tohoto důvodu i na výrobu levnější) variantu grafické karty VGA, která bude popsána v dalším textu. V původním návrhu firmy IBM byl adaptér MCGA integrován přímo na základní desce, což je podstatný rozdíl oproti všem dříve popsaným grafickým kartám MDA, CGA, EGAHercules, u nichž byla striktně dodržena základní idea počítačů IBM PC – velká variabilita spočívající v umístění většiny modulů počítače na přídavné karty a nikoli přímo na základní desku (původně nebyly na základní desce dokonce osazeny ani obvody pro paralelní či sériové porty, které bývaly součástí jiných karet, včetně některých karet grafických – viz například již popsaná grafická karta Hercules či zvuková karta AdLib).

pc86

Obrázek 3: Známý český textový editor T602 spuštěný v dvoubarevném grafickém režimu karty MCGA s rozlišením 640×480. V obrazové paměti se pro tento režim muselo alokovat celkem 640×480/8=38400 bajtů, tj. více než polovina dostupné video RAM.

Firma IBM se snažila, aby grafický adaptér MCGA nahradil v té době již zcela nevyhovující a zastaralou grafickou kartu CGA. Z tohoto důvodu je MCGA s touto kartou slučitelná, ovšem s tím rozdílem, že není možné použít původní typy monitorů, protože je zde použit nový typ rozhraní s analogovými barvonosnými signály (důvody pro tuto změnu si ihned řekneme). MCGA však není, což je trošku zvláštní, zpětně kompatibilní s grafickou kartou EGA, na rozdíl od karty VGA, kde je zpětná kompatibilita s předchozí řadou grafických karet firmy IBM vyřešena lepším způsobem (a to až na úroveň většiny řídicích registrů), ovšem na úkor zvýšené složitosti při nastavování textových či grafických režimů, což bylo částečně odstíněno službami BIOSu. Kapacita obrazové paměti byla v případě grafického adaptéru MCGA rovna 64 kB, což je obecně méně, než u grafické karty EGA, která mohla být osazena až 256 kB video paměti či karty VGA osazené vždy 256 kB. Z poměrně malé kapacity obrazové paměti pak vyplývají i omezené možnosti grafických režimů popsané v dalším textu, ale současně i již zmiňovaná nízká cena.

pc86

Obrázek 4: Úvodní obrazovka populární hry Tank Wars (ideový předchůdce možná známější hry Scorched Earth), která využívala grafický režim adaptéru MCGA s rozlišením 320×200 pixelů s možností zobrazení 256 barev. Tyto barvy se skutečně ve hře využívaly.

3. Textové a grafické režimy karty MCGA

Grafický adaptér MCGA podporoval několik nových grafických režimů, které bylo možné nastavit i s využitím služeb BIOSu (přesněji řečeno – tyto režimy jsou stále součástí BIOSu, takže jsou dostupné i v současnosti). V textových režimech byly znaky ve znakové sadě definovány s využitím masky o velikosti 8×16 pixelů (platí pro textový režim s 25 textovými řádky), resp. 8×8 pixelů (platí pro textový režim s padesáti textovými řádky), což znamená, že se oproti dále popisované grafické kartě VGA (ale i vůči MDA či Herculesu) snížilo horizontální rozlišení ze 720 pixelů na 640 pixelů, takže čitelnost textu byla o poznání horší. Způsob uspořádání video paměti v textových režimech je kompatibilní se všemi předchozími kartami: každý znak je v tomto případě reprezentován dvojicí bajtů, přičemž do prvního bajtu se ukládal kód znaku (rozšířená sada ASCII) a do bajtu druhého barva popředí, barva pozadí a popř. i další atributy, například příznak podtržení či blikání (v závislosti na konfiguraci textového režimu).

Poznámka: interně byla video RAM stále rozdělena na čtyři roviny. V první rovině byly uloženy ASCII kódy znaků, ve druhé rovině atributy a v dalších dvou rovinách pak znakové sady. Karta pracovala v režimu sudá-lichá, kdy přímo dostupné byly první dvě roviny, jejichž obsah se „mixoval“ tak, že to z pohledu programátora vypadalo, jakoby za kódem každého znaku následoval jeho atributový bajt.
pc86

Obrázek 5: Prostředí hry Tank Wars.

Kromě textových režimů byly u tohoto grafického adaptéru zavedeny dva nové rastrové grafické režimy, z nichž jeden byl velmi důležitý pro budoucnost PC jako herní platformy. V prvním režimu bylo možné zobrazit rastrový obraz o rozlišení 640×480 pixelů, ale pouze ve dvou barvách, tj. s využitím jediné bitové roviny. Více bitových rovin nebylo možné v tomto režimu použít z důvodu malé kapacity obrazové paměti, protože pro dvoubarevný rastrový obraz v rozlišení 640×480 pixelů je zapotřebí alokovat 640×480/8=38400 bajtů z dostupných 65536 bajtů.

pc86

Obrázek 6: Hra Tank Wars potřetí – zásah protivníka.

Ve druhém grafickém režimu se zobrazoval rastr o rozlišení 320×200 pixelů v 256 barvách, přičemž obrazová paměť byla využita téměř stoprocentně: 320×200=64000 bajtů z 65536. Tento grafický režim se stal velmi populární, zejména však ve spojitosti s dále popsanou grafickou kartou VGA, kde nabízel mnohem více možností (například scrolling obrazu v libovolném směru, režim rozdělené obrazovky, double či triple buffering atd.). A právě tento režim se používal velmi dlouho pro tvorbu her.

4. Video signály generované kartou MCGA

Časování synchronizačních signálů v obou výše zmíněných grafických režimech adaptéru MCGA je stejné, jako v případě dále popsané grafické karty VGA. Konkrétně to znamená, že v režimu s rozlišením 640×480 pixelů je snímková frekvence nastavena na 60 Hz (dosti málo, ale pořád lepší, než dřívějších 50 Hz), v režimu s rozlišením 320×200 pixelů je frekvence nastavena na 70 Hz (to je již mnohem lepší pro déletrvající práci). Shodné bylo i rozhraní pro připojení monitoru ke grafickému adaptéru. Poprvé se zde namísto konektoru DE-9 objevuje konektor typu DE-15, který je po nepatrných modifikacích funkce některých pinů (rozšíření o DDC a DDC-2) používán vlastně dodnes – viz VGA pinout. Díky tomu, že barvonosné signály (R, G, B) jsou vyvedeny jako analogové signály, není maximální počet barev omezen na šestnáct barev či 64 barev tak, jak je tomu u monitorů pro grafickou kartu CGA nebo EGA, u nichž se každá barvová složka přenášela pomocí dvojice binárních (TTL) signálů. Pro každou složku tedy bylo možné nastavit pouze čtyři intenzity: nulovou, třetinovou, dvoutřetinovou a maximální (a u monitoru CGA dokonce ani to ne, jen globální intenzitu všech barvových složek).

pc86

Obrázek 7: Mnohé hry pro IBM PC, například zde zobrazený slavný krokovací dungeon Lands of Lore, využívaly standardní grafický režim s rozlišením 320×200 pixelů.

V případě grafických adaptérů MCGAVGA je však intenzita každé barvové složky reprezentována šesticí bitů, tj. je nutné rozlišit 64 úrovní každé základní barvy (celkový počet barevných odstínů je tedy roven 643=262144). Právě z tohoto důvodu se informace o barvách pixelů přenáší pomocí analogových signálů, u nichž je počet úrovní omezen především šumem digitálně-analogového převodníku na straně grafické karty a (analogových) obvodů v monitoru (plně digitální přenos by sice byl možný, například s využitím vhodného sériového protokolu, nicméně v dobách monitorů s CRT by to znamenalo zvýšenou složitost monitorů, nehledě na nutnost použití velkého přenosového pásma). Rozšíření počtu úrovní barvových složek je v tomto případě jednoduché, což se ukázalo při přechodu na modernější a výkonnější grafické karty s větší kapacitou obrazové paměti, které umožňovaly rozlišení 256 úrovní každé barvové složky a tím pádem i možnost zobrazení 2563=16777216 barevných odstínů.

pc86

Obrázek 8: První i druhý díl známé plošinovky Prince of Persia taktéž využívaly grafický režim s rozlišením 320×200 pixelů.

Poznámka: ovšem co se týče způsobu zobrazení barev, není vše tak skvělé, jak to může z popisu vypadat. Na jednu stranu se dodržovala kompatibilita s EGA (a tudíž se kódy barev převáděly dvakrát) a navíc se nepočítalo s vyšší barevnou hloubkou v budoucnosti (což je opomenutí, které osobně moc nechápu). Více se dozvíme příště.

5. Grafická karta VGA: PC přebírá štafetu coby herní platforma

Dalším – a nutno dodat, že dosti podstatným – technologickým rozšířením grafických karet CGA a EGA vznikla grafická karta VGA, jejíž název je odvozen ze sousloví Video Graphics Array. Slovo array v tomto kontextu značí, že celá karta byla vytvořena na jednom čipu, samozřejmě kromě nezbytných krystalů a paměťových modulů tvořících obrazovou paměť (to je trošku nadneseně řečeno, protože se stačí podívat na libovolnou VGA kartu a zjistíte, že kromě hlavního čipu a pamětí se zde nachází i další podpůrné integrované obvody). Tato grafická karta byla poprvé použita firmou IBM v počítačích řady IBM PS/2 (kromě dvou nejnižších modelů, ve kterých byl nainstalován výše popsaný grafický adaptér MCGA). V těchto typech počítačů však ještě VGA nebyla realizována jako samostatná grafická karta, ale jednalo se o čipy a pomocné součástky umístěné přímo na základní desce. Teprve později byla VGA nabízena i jako samostatná karta určená pro šestnáctibitovou sběrnici ISA – právě tuto variantu karty VGA (vyráběnou v mnoha obměnách i dalšími firmami, nejenom samotnou IBM) zná většina uživatelů osobních počítačů. Navíc jsou všechny následující grafické karty s VGA kompatibilní.

pc86

Obrázek 9: Hra Scorched Earth (ve své podstatě vylepšená varianta výše zmíněné hry Tank Wars) mohla být spuštěna jak ve standardním grafickém režimu karty VGA s rozlišením 320×200 pixelů, tak i v některém z rozšířených režimů (X-mód, Y-mód atd.), zde například v režimu naprogramovaném pomocí řídicích registrů karty VGA na rozlišení 360×480 pixelů (což je sice neoficiální režim, ovšem plně kompatibilní).

Grafická karta VGA je do značné míry, tj. v některých oblastech až na úroveň řídicích registrů, zpětně kompatibilní s již popsanými grafickými kartami CGA, EGA a MCGA (nikoli však s Herculesem), avšak s tím pochopitelným rozdílem, že není možné použít původní monitory, protože se změnily frekvence synchronizačních signálů i samotné rozhraní pro připojení monitorů. Velikost obrazové paměti je rovna 256 kB, protože v nejvyšším oficiálně podporovaném grafickém režimu se pro framebuffer (obrazovou paměť) alokuje místo o kapacitě 150 kB – viz též navazující text. Vzhledem k omezením daným BIOSem a DOSem (samotné mikroprocesory již dokázaly v době nástupu karty VGA adresovat v chráněném režimu minimálně šestnáctimegabajtový paměťový prostor; stejný adresní rozsah nabízela i sběrnice ISA) se však nedá přímo adresovat celá obrazová paměť, viditelné je vždy jedno či dvě „okna“, každé o velikosti 64 kB, přičemž žádný z oficiálně podporovaných grafických režimů nevyužívá současně obě okna.

pc86

Obrázek 10: Herní prostředí hry Scorched Earth spuštěné v režimu o rozlišení 360×480 pixelů. Aby bylo dosaženo korektního zobrazení na dnešních počítačích, musel být screenshot zvětšen v horizontálním směru na dvojnásobek.

Jedním z důvodů pro toto chování je i to, že v počítači může být kromě grafické karty VGA nainstalována například i karta MDA či Hercules, která s kartou VGA jedno paměťové okno musí sdílet (opět se jedná o důvody dané omezením BIOSu a DOSu, protože pro mapování obrazové paměti do adresního prostoru procesoru byly vyhrazeny pouze dva segmenty začínající na adresách 0×a000:0000 a 0×b000:0000). Prakticky všechny grafické karty, které jsou dnes vyráběné, jsou s grafickou kartou VGA zpětně kompatibilní; její grafické režimy jsou použity například při inicializaci některých graficky orientovaných operačních systémů. Ostatně většina PCček má při startu BIOSu nastaven jeden z grafických režimů karty VGA, typicky se jedná o šestnáctibarevný režim s rozlišením 640×400 pixelů, popř. 720×400 pixelů.

Obrázek 11: V grafickém režimu 320×200 (resp. v od něj odvozených režimech) běžela i slavná hra Doom.

6. Textové režimy podporované kartou VGA

U grafické karty VGA se při práci s textovým režimem většinou používá efektivní rozlišení 720×400 pixelů, což umožňuje v případě standardního textového módu s 25 řádky a 80 sloupci vytvářet znaky v masce o velikosti 9×16 pixelů. Výsledkem je velká čitelnost textu a současně i poměrně ergonomická obnovovací frekvence 70 Hz (všechny režimy karty VGA, které zobrazovaly 200 či 400 řádků měly nastavenu tuto obnovovací frekvenci). Tento textový režim se dodnes používá, a to mnohdy jak během startu počítače (například při zobrazení tabulky s konfigurací zařízení), tak i v BIOSu (původní Award BIOS apod.), DOSu a mnohdy též i pro Linux a BSD běžící v konzolovém režimu (runlevel 3 apod.). Textový režim je možné změnou konfiguračních registrů přeprogramovat. Například je možné zvýšit vertikální rozlišení na 480 obrazových linek (to odpovídá třiceti textovým řádkům při použití masky znaků 9×16 pixelů), ale sníží se tím obnovovací frekvence na pouhých 60 Hz.

Obrázek 12: Textový režim karty VGA je velmi dobře čitelný (nepatrně lepší, než na Herculesu nebo MDA).

Výšku znaků je možné, nezávisle na počtu obrazových řádků, měnit v rozsahu 1–32 obrazových linek; například při výšce znaků rovné 14 obrazovým řádkům a použití efektivního rozlišení 720×400 pixelů se počet textových řádků zvýší z 25 na 28. Pro zajištění co největší programové kompatibility se staršími grafickými kartami se dá zmenšit i šířka znaků z devíti pixelů na pixelů osm, ale tento způsob vede k poměrně značné degradaci čitelnosti. Další vlastnosti textového režimu jsou shodné s minule popsanou kartou EGA – znaková sada je umístěna ve třetí bitové rovině (v první rovině jsou ASCII kódy znaků, v rovině druhé pak barvové atributy) a celkový počet znaků ve znakové sadě je roven buď 256 (standardní nastavení) nebo 512 (využito některými vyspělejšími textovými editory). V případě 512 znaků ve znakové sadě je jeden bit z atributového bajtu použit pro výběr spodní nebo horní poloviny tabulky znaků.

Obrázek 13: Nenechte se zmást kurzorem myši – i toto je normální textový režim karty VGA.

7. První demonstrační příklad: zobrazení textu se znaky v masce 9×16 pixelů

V dnešním prvním demonstračním příkladu si vlastně neukážeme žádné novinky; pouze totiž zapneme standardní textový režim s 25 textovými řádky a 80 znaky na řádku. Ovšem znaky budou zobrazeny v masce 9×16 pixelů, takže efektivní rozlišení obrazovky je rovno 80×9=720 pixelů horizontálně a 25×16=400 obrazových řádků vertikálně:

Obrázek 14: Standardní textový režim 80×25 znaků tak, jak bychom ho viděli na originální grafické kartě VGA.

Úplný zdrojový kód tohoto demonstračního příkladu vypadá následovně:

; Textovy rezim karty VGA s rozlisenim 80x25 znaku.
;
; preklad pomoci:
;     nasm -f bin -o vga.com vga_text_mode_80x25.asm
;
; nebo pouze:
;     nasm -o vga.com vga_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
 
        mov dx, 0x3d8   ; port s rizenim graficke palety
        mov al, 0x18    ; pozadi neblika, meni se intenzita
        out dx, al      ; pres port 0x3d9
 
        wait_key
 
        mov dx, 0x3d8   ; port s rizenim graficke palety
        mov al, 0x38    ; pozadi opet blika, nizka intenzita
        out dx, al      ; pres port 0x3d9
 
        wait_key

        wait_key        ; cekani na klavesu
        exit            ; navrat do DOSu

8. Textové režimy s odlišným počtem textových řádků

V paměti ROM grafické karty VGA je uloženo několik znakových sad, přičemž každá z těchto sad obsahuje znaky s maskou s odlišným počtem řádků (počet sloupců je stále 8). Konkrétně si můžeme vybrat znaky s výškou 8, 14 nebo 16 obrazových řádků. Počet viditelných textových řádků se vypočítá snadno: 400/výška znaků. K dispozici je tak textový režim 80×25 znaků, 80×28 znaků a 80×50 znaků.

Výběr znaků s výškou 16 obrazových řádků společně s přeprogramováním registrů CRTC (to je důležité) zajistí toto makro:

; nastaveni fontu 8x16 pixelu
%macro set_font_8x16 0
        mov ax, 0x1114
        xor bl, bl
        int 0x10
%endmacro

Obrázek 15: Znaky vysoké 16 obrazových řádků, celkově je zobrazeno 25 textových řádků.

Přepnutí znakové sady na znaky výšky 14 obrazových řádků společně s přeprogramováním registrů CRTC:

; nastaveni fontu 8x14 pixelu
%macro set_font_8x14 0
        mov ax, 0x1111
        xor bl, bl
        int 0x10
%endmacro

Obrázek 16: Znaky vysoké 14 obrazových řádků, celkově je zobrazeno 28 textových řádků.

A konečně si můžeme nechat zobrazovat znaky o výšce pouhých osmi obrazových řádků:

; nastaveni fontu 8x8 pixelu
%macro set_font_8x8 0
        mov ax, 0x1112
        xor bl, bl
        int 0x10
%endmacro

Obrázek 17: Znaky vysoké 8 obrazových řádků, celkově je zobrazeno 50 textových řádků.

Poznámka: to ovšem není všechno, protože řídicí registry karty VGA je možné v případě potřeby přeprogramovat takovým způsobem, že se i v textových režimech použije 480 obrazových řádků a nikoli „pouze“ 400. Sníží se tak obrazová frekvence ze 70 Hz na 60 Hz, na druhou stranu však získáme textové režimy 80×30 znaků, 80×24 znaků a 80×60 znaků.

9. Druhý demonstrační příklad: textový režim 80×50 znaků a 80×28 znaků

Ve druhém demonstračním příkladu jsou využita výše zmíněná makra set_font_8×16, set_font_8×14 a set_font_8×8 pro změnu počtu obrazových řádků ve standardním textovém režimu. Vše je přitom zcela kompatibilní se všemi kartami VGA:

; Textovy rezim karty VGA s rozlisenim 80x50 znaku.
;
; preklad pomoci:
;     nasm -f bin -o vga.com vga_text_mode_80x50.asm
;
; nebo pouze:
;     nasm -o vga.com vga_text_mode_80x50.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
 
; nastaveni fontu 8x16 pixelu
%macro set_font_8x16 0
        mov ax, 0x1114
        xor bl, bl
        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*50   ; 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
 
        set_font_8x16   ; nastaveni fontu 8x16 pixelu
        wait_key        ; cekani na klavesu
 
        exit            ; navrat do DOSu

10. Způsob zobrazení devátého sloupce pixelů u každého znaku

Víme již, že standardní textové režimy karty VGA zobrazují 720 pixelů na obrazovém řádku a přitom je na každém textovém řádku možné zapsat 80 znaků. Z toho plyne, že každý znak je vlastně široký 720/80=9 pixelů (9 sloupců). Ovšem ve znakové sadě mají masky znaků vždy šířku jen 8 pixelů (sloupců). Nabízí se tedy otázka, jak mají být vykresleny ony deváté sloupce, pro které nemáme k dispozici žádná data. Mohlo by se zdát, že tyto sloupce prostě budou prázdné, protože znaky stejně potřebujeme mít odděleny, aby se neslévaly, ovšem při pohledu na screenshoty Volkov Commanderu (uvedené například v šesté kapitole) nebo na ASCII tabulku použitou v PC (https://www.ascii-codes.com/), zjistíme, že tabulka obsahuje i znaky pro tvorbu rámečků atd. A tyto rámečky je vhodné nakreslit nepřerušovanou čarou.

Obrázek 18: Devátý sloupec kopíruje obsah osmého sloupce u vybraných znaků.

Grafická karta VGA proto umožňuje dva režimy vykreslování: buď jsou deváté sloupce prázdné nebo pro znaky s hodnotami 0×C0 až 0×DF dochází ke kopii osmého sloupce do sloupce devátého. Povšimněte si, že právě tyto znaky obsahují rámečky, což není náhoda. Samotné přepnutí způsobu zobrazení je nepatrně složitější, protože se používají I/O porty 0×3c0 a 0×3c1, přičemž první z těchto portů je určen jak pro zápis indexu registru, tak i jeho obsahu. Interně se proto používá klopný obvod pro zapamatování, která funkce je právě aktivní. A tento klopný obvod zresetujeme čtením z I/O portu 0×3da (proč tomu tak je, je mi záhadou, když ostatní porty mají odlišné chování, ale IBM je IBM):

        mov dx, 0x3da
        in  al, dx      ; reset interniho klopneho obvodu
 
        mov dx, 0x3c0
        mov al, 0x30    ; cislo ridiciho registru + hodnota 0x20
        out dx, al
 
        inc  dx         ; cteni obsahu ridiciho registru
        in   al,dx
        and  al,(~(1<<2)) ; vymaskovani tretiho bitu
        dec  dx
        out dx,al       ; poslat do VGA

Obrázek 19: Devátý sloupec je u všech znaků prázdný.

11. Třetí demonstrační příklad: změna způsobu zobrazení devátého sloupce pixelů

Podívejme se nyní na úplný zdrojový kód demonstračního příkladu, který mění způsob zobrazení devátého sloupce pixelů. Výsledkem budou obrazovky, které jsme mohli vidět v předchozí kapitole:

; Textovy rezim karty VGA.
; Zmena vyznamu devateho sloupce u znaku.
;
;
; preklad pomoci:
;     nasm -f bin -o vga.com vga_text_mode_9th_column.asm
;
; nebo pouze:
;     nasm -o vga.com vga_text_mode_9th_column.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, 45      ; pocet zapisovanych znaku
        mov al, 179     ; kod zapisovaneho znaku
opak:
        stosb           ; zapis znaku
        inc al          ; dalsi znak
        inc di          ; preskocit atribut
        loop opak       ; opakujeme CX-krat
 
        wait_key
 
        mov dx, 0x3da
        in  al, dx      ; reset interniho klopneho obvodu
 
        mov dx, 0x3c0
        mov al, 0x30    ; cislo registru
        out dx, al
 
        inc  dx         ; cteni obsahu registru
        in   al,dx
        and  al,(~(1<<2)) ; vymaskovani tretiho bitu
        dec  dx
        out dx,al       ; poslat do VGA
 
        wait_key        ; cekani na klavesu
 
        exit            ; navrat do DOSu

12. Modifikace tvaru textového kurzoru

Modifikací řídicích registrů CRTC (grafického řadiče) je možné dosáhnout změny tvaru textového kurzoru. Jedná se o stejnou vlastnost, kterou jsme si vyzkoušeli už na kartě CGA, ovšem s tím, rozdílem, že nyní může být začátek a konec textového kurzoru určen pěti bity a tedy může dosahovat hodnot 0..31 (počítáno v obrazových řádcích, stejně jako výška znaků). To ovšem není vše, protože řídicí registry pro ovládání kurzoru se nepatrně rozšířily: v registru s počátečním obrazovým řádkem kurzoru je nyní nový bit, který kurzor zcela zakáže (v podstatě ho posune na 32 řádek, který nikdy není zobrazen). A registr s poslední linkou kurzoru obsahuje dva nové bity nazvané Cursor Skew, které mají jednu příjemnou vlastnost – na různých VGA kartách se chovají různě :-) Proto je necháme vynulované.

Pro změnu obsahu vybraného registru CRTC slouží toto makro, které již známe, ovšem povšimněte si, že se změnila adresa I/O portu:

%macro set_crtc_register 2
        mov dx, 0x3d4
        mov al, %1      ; vyber registru
        out dx, al
        inc dx
        mov al, %2      ; zapisovana hodnota
        out dx, al
%endmacro
Poznámka: modifikovat je možné pouze počáteční a koncový obrazový řádek kurzoru. Měnit ovšem nelze to, zda má být kurzor například vertikální I, barvu kurzoru, zda má kurzor blikat či nikoli nebo frekvenci blikání. Pokud tedy uvidíte jednu z těchto možností na obrazovce, nejedná se o textový režim, ale o jeho simulaci (příkladem je „textový režim“ konzole Raspberry Pi atd.).

13. Čtvrtý demonstrační příklad: modifikace tvaru textového kurzoru

V dnešním čtvrtém demonstračním příkladu se pokusíme dvakrát změnit tvar textového kurzoru a dosáhnout tak následujících třech způsobů jeho zobrazení:

Obrázek 20: Různé tvary textového kurzoru.

Obrázek 21: Různé tvary textového kurzoru.

Obrázek 22: Různé tvary textového kurzoru.

Tento příklad je ve skutečnosti interně velmi jednoduchý:

; Textovy rezim karty VGA s rozlisenim 80x25 znaku.
; Zmena tvaru textoveho kurzoru.
;
; preklad pomoci:
;     nasm -f bin -o vga.com vga_text_mode_cursor_shape.asm
;
; nebo pouze:
;     nasm -o vga.com vga_text_mode_cursor_shape.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
 
%macro set_crtc_register 2
        mov dx, 0x3d4
        mov al, %1      ; vyber registru
        out dx, al
        inc dx
        mov al, %2      ; zapisovana hodnota
        out dx, al
%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, 95      ; pocet zapisovanych znaku
        mov al, 32      ; kod zapisovaneho znaku
opak:
        stosb           ; zapis znaku
        inc al          ; dalsi znak
        inc di          ; preskocit atribut
        loop opak       ; opakujeme CX-krat
 
        wait_key        ; cekani na klavesu
 
        set_crtc_register 0x0a, 0
        wait_key        ; cekani na klavesu
 
        set_crtc_register 0x0b, 3
        wait_key        ; cekani na klavesu
 
        exit            ; navrat do DOSu

14. Načtení vlastní znakové sady

Vzhledem k tomu, že je grafická karta VGA kompatibilní s kartou EGA, je pochopitelně možné i na VGA načíst vlastní znakovou sadu. Ovšem i zde došlo k rozšíření, protože na EGA mohly být současně načteny a přepínány čtyři znakové sady, zatímco na kartě VGA se jedná o osm znakových sad. Jejich počáteční adresy ve třetí bitové rovině video RAM jsou následující:

Index znakové sady Adresa od Adresa do
0 0×0000 0×1FFF
1 0×4000 0×5FFF
2 0×8000 0×9FFF
3 0×C000 0×DFFF
4 0×2000 0×3FFF
5 0×6000 0×7FFF
6 0×A000 0×BFFF
7 0×E000 0×FFFF
Poznámka: proč jsou adresy takto zpřeházeny? Kvůli zpětné kompatibilitě s kartou EGA.

Samotné načtení fontu, zde konkrétně 95 znaků standardní ASCII s výškou znaků 16 obrazových řádků, vypadá následovně (podobný příklad známe – pro jednoduchost použijeme BIOS, i když je samozřejmě alternativně možné měnit přímo řídicí registry karty VGA):

        mov ax, cs
        mov es, ax
        mov bp, font    ; ES:BP obsabuje adresu fontu
 
        mov ax, 0x1110  ; nacteni + nastaveni uzivatelskeho fontu
        mov cx, 95      ; pocet menenych znaku
        mov dx, 32      ; ASCII kod prvniho meneneho znaku
        mov bl, 0       ; index znakove sady
        mov bh, 16      ; vyska znaku
        int 0x10        ; provest operaci

Výsledek:

Obrázek 23: Vlastní znaková sada se znaky s maskou 8×16 pixelů, ovšem zobrazených v masce 9×16 pixelů.

15. Pátý demonstrační příklad: načtení a zobrazení vlastní znakové sady

Samotný způsob načtení a zobrazení znakové byl popsán v předchozí kapitole, takže se bez dalšího podrobnějšího popisu podívejme na to, jak vypadá ucelený program, který znakovou sadu zobrazí:

; Textovy rezim karty VGA s rozlisenim 80x25 znaku.
; Nastaveni vlastniho fontu.
;
; preklad pomoci:
;     nasm -f bin -o vga.com vga_text_mode_custom_font.asm
;
; nebo pouze:
;     nasm -o vga.com vga_text_mode_custom_font.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, 95      ; pocet zapisovanych znaku
        mov al, 32      ; kod zapisovaneho znaku
opak:
        stosb           ; zapis znaku
        inc al          ; dalsi znak
        inc di          ; preskocit atribut
        loop opak       ; opakujeme CX-krat
 
        mov ax, cs
        mov es, ax
        mov bp, font    ; ES:BP obsabuje adresu fontu
 
        mov ax, 0x1110  ; nacteni + nastaveni uzivatelskeho fontu
        mov cx, 95      ; pocet menenych znaku
        mov dx, 32      ; ASCII kod prvniho meneneho znaku
        mov bl, 0       ; index znakove sady
        mov bh, 16      ; vyska znaku
        int 0x10        ; provest operaci
 
        wait_key        ; cekani na klavesu
        exit            ; navrat do DOSu
 
font:
        incbin "font.bin"

16. Zákaz blikání znaků v textových režimech: složitější operace, než kdy dříve

Již při popisu možností grafické karty CGA jsme si ukázali, jakým způsobem lze vypnout blikání znaků v případě, že je nastaven nejvyšší bit atributového bajtu daného znaku. Namísto blikání se zvýší intenzita pozadí. Připomeňme si, že na kartě CGA se blikání/intenzita nastavovala snadno, konkrétně bitem číslo 5 na portu 0×3d8. Na CGA tedy bylo možné blikání zakázat touto trojicí instrukcí:

        mov dx, 0x3d8   ; port s rizenim graficke palety
        mov al, 0x18    ; pozadi neblika, meni se intenzita
        out dx, al      ; pres port 0x3d9

Na kartě VGA to už tak snadné není, to bychom zase programátory zbytečně hýčkali :-) Používá se zde zápis do řídicích registrů přes port 0×3c0. Jenže ten má dvojí význam: první zápis volí index řídicího registru a druhý zápis teprve zapisovanou hodnotu. Interně se používá (jak jsme si naznačili výše) klopný obvod, který rozhoduje o tom, zda zápis na port 0×3c0 znamená index registru nebo hodnotu. A reset tohoto klopného obvodu (nejsme si nikdy jisti, v jakém stavu je) se provádí čtením portu 0×3da.

Nejprve tedy provedeme reset klopného obvodu:

        mov dx, 0x3da
        in  al, dx      ; reset interniho klopneho obvodu

Dále zapíšeme na port 0×3c0 číslo registru, který se má měnit, ke kterému přičteme 0×20:

        mov dx, 0x3c0
        mov al, 0x30    ; cislo registru
        out dx, al

Nyní již konečně můžeme zapisovat hodnotu kýženého registru – my ji vynulujeme:

        xor al, al      ; zapisovana data
        out dx,al       ; poslat do VGA

A takto by měl vypadat výsledek:

Obrázek 24: Znaky neblikají, ale mohou mít intenzitu pozadí zvýšenou.

Proč jsme však zapsali do řídicího registru nulu? Význam jednotlivých bitů tohoto řídicího registru je totiž následující:

Bit Označení Význam
7 P54S řízení způsobu zobrazení barvové palety (změna není kompatibilní s BIOSem)
6 8BIT nastaveno na 1 jen v režimu 0×13 (vrátíme se k němu příště)
5 PPM použito pro posuny v režimu rozdělené obrazovky (k tomuto bitu se vrátíme)
4 × ×
3 BLINK to je náš bit řídicí blikání
2 LGE to již známe – přepínání způsobu zobrazení devátého sloupce v textových režimech
1 MONO teoreticky emulace monochromatického výstupu – ovšem nefunguje
0 ATGE příznak grafického režimu

17. Bezpečná změna řídicích registrů karty VGA

Vzhledem k tomu, že u mnoha řídicích registrů se nastavují jen jednotlivé bity a ostatní bity nebudeme chtít ovlivnit (viz též tabulku z předchozí kapitoly), je nutné v praxi postupovat následovně:

  1. Přečíst obsah řídicího registru (to je na VGA možné, na CGA ovšem ne)
  2. Modifikovat pouze konkrétní bit jeho maskováním operací AND nebo OR
  3. Zapsat nový obsah do řídicího registru a doufat, že se nic nepoškodilo (například do registru mezitím nic nezapsal TSR apod.)

Konkrétně opět musíme registr nejprve vybrat, tj. provést operaci „reset klopného obvodu“ a poslání indexu registru, který se bude číst nebo modifikovat:

        mov dx, 0x3da
        in  al, dx      ; reset interniho klopneho obvodu
 
        mov dx, 0x3c0
        mov al, 0x30    ; cislo registru
        out dx, al

Nyní již můžeme obsah registru přečíst, ovšem z I/O portu, který je o jedničku vyšší, tj. 0×3c1:

        inc  dx         ; cteni obsahu registru
        in   al,dx

Po modifikaci nový obsah registru zapíšeme na I/O port 0×3c0:

bitcoin školení listopad 24

        and  al,(~(1<<3)) ; vymaskovani ctvrteho bitu
        dec  dx
        out dx,al       ; poslat do VGA
Poznámka: to je poměrně matoucí kombinace operací, takže je vhodné si celou operaci „schovat“ buď do makra nebo do subrutiny.

18. Šestý demonstrační příklad: zákaz blikání znaků realizovaný na kartě VGA

Ukažme si nyní úplný zdrojový kód dnešního šestého a současně i posledního demonstračního příkladu:

; Textovy rezim karty VGA.
; Zmena vyznamu nejvyssiho bitu atributu (bezpecnejsi varianta).
;
;
; preklad pomoci:
;     nasm -f bin -o vga.com vga_text_mode_intensity_2.asm
;
; nebo pouze:
;     nasm -o vga.com vga_text_mode_intensity_2.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
 
        mov dx, 0x3da
        in  al, dx      ; reset interniho klopneho obvodu
 
        mov dx, 0x3c0
        mov al, 0x30    ; cislo registru
        out dx, al
 
        inc  dx         ; cteni obsahu registru
        in   al,dx
        and  al,(~(1<<3)) ; vymaskovani ctvrteho bitu
        dec  dx
        out dx,al       ; poslat do VGA
 
        wait_key        ; cekani na klavesu
 
        exit            ; navrat do DOSu

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
       
46 ega_320×200_putpixel.asm vykreslení pixelu v grafickém režimu 320×200 pixelů se šestnácti barvami https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_320×200_putpixel.asm
47 ega_640×350_putpixel.asm vykreslení pixelu v grafickém režimu 640×350 pixelů se šestnácti barvami https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_640×350_putpixel.asm
       
48 ega_standard_font.asm použití standardního fontu grafické karty EGA https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_standard_font.asm
49 ega_custom_font.asm načtení vlastního fontu s jeho zobrazením https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_custom_font.asm
       
50 ega_palette1.asm změna barvové palety (všech 16 barev) v grafickém režimu 320×200 se šestnácti barvami https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette1.asm
51 ega_palette2.asm změna barvové palety (všech 16 barev) v grafickém režimu 640×350 se šestnácti barvami https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette2.asm
52 ega_palette3.asm změna všech barev v barvové paletě s využitím programové smyčky https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette3.asm
53 ega_palette4.asm změna všech barev, včetně barvy okraje, v barvové paletě voláním funkce BIOSu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette4.asm
       
54 vga_text_mode_80×25.asm standardní textový režim 80×25 znaků na kartě VGA https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_80×25.asm
55 vga_text_mode_80×50.asm zobrazení 50 a taktéž 28 textových řádků na kartě VGA https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_80×50.asm
56 vga_text_mode_intensity1.asm změna chování atributového bitu pro blikání (nebezpečná varianta změny registrů) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_intensity1.asm
57 vga_text_mode_intensity2.asm změna chování atributového bitu pro blikání (bezpečnější varianta změny registrů) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_intensity2.asm
58 vga_text_mode_9th_column.asm modifikace způsobu zobrazení devátého sloupce ve znakových režimech (720 pixelů na řádku) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_9th_column.asm
59 vga_text_mode_cursor_shape.asm změna tvaru textového kurzoru na grafické kartě VGA https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_cursor_shape.asm
60 vga_text_mode_custom_font.asm načtení vlastního fontu s jeho zobrazením https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_custom_font.asm
61 vga_gfx_mode_640×480.asm přepnutí do grafického režimu 640×480 pixelů se šestnácti barvami https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_640×480.asm
62 vga_gfx_mode_palette.asm změna všech barev v barvové paletě grafické karty VGA https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_palette.asm
63 vga_640×480_putpixel.asm vykreslení pixelu v grafickém režimu 640×480 pixelů se šestnácti barvami https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_640×480_putpixel.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
  79. Why the EGA can only use 16 of its 64 colours in 200-line modes
    https://www.reenigne.org/blog/why-the-ega-can-only-use-16-of-its-64-colours-in-200-line-modes/
  80. How 16 colors saved PC gaming – the story of EGA graphics
    https://www.custompc.com/retro-tech/ega-graphics
  81. List of 16-bit computer color palettes
    https://en.wikipedia.org/wi­ki/List_of16-bit_computer_color_palettes
  82. Why were those colors chosen to be the default palette for 256-color VGA?
    https://retrocomputing.stac­kexchange.com/questions/27994/why-were-those-colors-chosen-to-be-the-default-palette-for-256-color-vga
  83. VGA Color Palettes
    https://www.fountainware.com/EX­PL/vga_color_palettes.htm
  84. Hardware Level VGA and SVGA Video Programming Information Page
    http://www.osdever.net/Fre­eVGA/vga/vga.htm
  85. Hardware Level VGA and SVGA Video Programming Information Page – sequencer
    http://www.osdever.net/Fre­eVGA/vga/seqreg.htm
  86. VGA Basics
    http://www.brackeen.com/vga/ba­sics.html
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.

Autor článku

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