Obsah
1. Od EGA ke grafickým kartám MCGA a VGA
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
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, EGA i Hercules, 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).
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.
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).
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ů.
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).
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ů MCGA i VGA 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ů.
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ů.
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í.
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.
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ů.
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
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 |
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ě:
- Přečíst obsah řídicího registru (to je na VGA možné, na CGA ovšem ne)
- Modifikovat pouze konkrétní bit jeho maskováním operací AND nebo OR
- 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:
and al,(~(1<<3)) ; vymaskovani ctvrteho bitu dec dx out dx,al ; poslat do VGA
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
- The Intel 8088 Architecture and Instruction Set
https://people.ece.ubc.ca/~edc/464/lectures/lec4.pdf - x86 Opcode Structure and Instruction Overview
https://pnx.tf/files/x86_opcode_structure_and_instruction_overview.pdf - x86 instruction listings (Wikipedia)
https://en.wikipedia.org/wiki/X86_instruction_listings - x86 assembly language (Wikipedia)
https://en.wikipedia.org/wiki/X86_assembly_language - Intel Assembler (Cheat sheet)
http://www.jegerlehner.ch/intel/IntelCodeTable.pdf - 25 Microchips That Shook the World
https://spectrum.ieee.org/tech-history/silicon-revolution/25-microchips-that-shook-the-world - Chip Hall of Fame: MOS Technology 6502 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-mos-technology-6502-microprocessor - Chip Hall of Fame: Intel 8088 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-intel-8088-microprocessor - Jak se zrodil procesor?
https://www.root.cz/clanky/jak-se-zrodil-procesor/ - Apple II History Home
http://apple2history.org/ - The 8086/8088 Primer
https://www.stevemorse.org/8086/index.html - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - INT 21 – DOS Function Dispatcher (DOS)
https://www.stanislavs.org/helppc/int21.html - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - Bit banging
https://en.wikipedia.org/wiki/Bit_banging - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Bootloaders
https://en.wikibooks.org/wiki/X86_Assembly/Bootloaders - Počátky grafiky na PC: grafické karty CGA a Hercules
https://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/ - Co mají společného Commodore PET/4000, BBC Micro, Amstrad CPC i grafické karty MDA, CGA a Hercules?
https://www.root.cz/clanky/co-maji-spolecneho-commodore-pet-4000-bbc-micro-amstrad-cpc-i-graficke-karty-mda-cga-a-hercules/ - Karta EGA: první použitelná barevná grafika na PC
https://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/ - RGB Classic Games
https://www.classicdosgames.com/ - Turbo Assembler (Wikipedia)
https://en.wikipedia.org/wiki/Turbo_Assembler - Microsoft Macro Assembler
https://en.wikipedia.org/wiki/Microsoft_Macro_Assembler - IBM Personal Computer (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Personal_Computer - Intel 8251
https://en.wikipedia.org/wiki/Intel_8251 - Intel 8253
https://en.wikipedia.org/wiki/Intel_8253 - Intel 8255
https://en.wikipedia.org/wiki/Intel_8255 - Intel 8257
https://en.wikipedia.org/wiki/Intel_8257 - Intel 8259
https://en.wikipedia.org/wiki/Intel_8259 - Support/peripheral/other chips – 6800 family
http://www.cpu-world.com/Support/6800.html - Motorola 6845
http://en.wikipedia.org/wiki/Motorola_6845 - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - CRTC operation
http://www.6502.org/users/andre/hwinfo/crtc/crtc.html - 6845 – Motorola CRT Controller
https://stanislavs.org/helppc/6845.html - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - Motorola 6845 and bitwise graphics
https://retrocomputing.stackexchange.com/questions/10996/motorola-6845-and-bitwise-graphics - IBM Monochrome Display Adapter
http://en.wikipedia.org/wiki/Monochrome_Display_Adapter - Color Graphics Adapter
http://en.wikipedia.org/wiki/Color_Graphics_Adapter - Color Graphics Adapter and the Brown color in IBM 5153 Color Display
https://www.aceinnova.com/en/electronics/cga-and-the-brown-color-in-ibm-5153-color-display/ - The Modern Retrocomputer: An Arduino Driven 6845 CRT Controller
https://hackaday.com/2017/05/14/the-modern-retrocomputer-an-arduino-driven-6845-crt-controller/ - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - INT 21 – DOS Function Dispatcher (DOS)
https://www.stanislavs.org/helppc/int21.html - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Arithmetic
https://en.wikibooks.org/wiki/X86_Assembly/Arithmetic - Art of Assembly – Arithmetic Instructions
http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter6/CH06–2.html - ASM Flags
http://www.cavestory.org/guides/csasm/guide/asm_flags.html - Status Register
https://en.wikipedia.org/wiki/Status_register - Linux assemblers: A comparison of GAS and NASM
http://www.ibm.com/developerworks/library/l-gas-nasm/index.html - Programovani v assembleru na OS Linux
http://www.cs.vsb.cz/grygarek/asm/asmlinux.html - Is it worthwhile to learn x86 assembly language today?
https://www.quora.com/Is-it-worthwhile-to-learn-x86-assembly-language-today?share=1 - Why Learn Assembly Language?
http://www.codeproject.com/Articles/89460/Why-Learn-Assembly-Language - Is Assembly still relevant?
http://programmers.stackexchange.com/questions/95836/is-assembly-still-relevant - Why Learning Assembly Language Is Still a Good Idea
http://www.onlamp.com/pub/a/onlamp/2004/05/06/writegreatcode.html - Assembly language today
http://beust.com/weblog/2004/06/23/assembly-language-today/ - Assembler: Význam assembleru dnes
http://www.builder.cz/rubriky/assembler/vyznam-assembleru-dnes-155960cz - Programming from the Ground Up Book – Summary
http://savannah.nongnu.org/projects/pgubook/ - DOSBox
https://www.dosbox.com/ - The C Programming Language
https://en.wikipedia.org/wiki/The_C_Programming_Language - Hercules Graphics Card (HCG)
https://en.wikipedia.org/wiki/Hercules_Graphics_Card - Complete 8086 instruction set
https://content.ctcd.edu/courses/cosc2325/m22/docs/emu8086ins.pdf - Complete 8086 instruction set
https://yassinebridi.github.io/asm-docs/8086_instruction_set.html - 8088 MPH by Hornet + CRTC + DESiRE (final version)
https://www.youtube.com/watch?v=hNRO7lno_DM - Area 5150 by CRTC & Hornet (Party Version) / IBM PC+CGA Demo, Hardware Capture
https://www.youtube.com/watch?v=fWDxdoRTZPc - 80×86 Integer Instruction Set Timings (8088 – Pentium)
http://aturing.umcs.maine.edu/~meadow/courses/cos335/80×86-Integer-Instruction-Set-Clocks.pdf - Colour Graphics Adapter: Notes
https://www.seasip.info/VintagePC/cga.html - Restoring A Vintage CGA Card With Homebrew HASL
https://hackaday.com/2024/06/12/restoring-a-vintage-cga-card-with-homebrew-hasl/ - Demoing An 8088
https://hackaday.com/2015/04/10/demoing-an-8088/ - Video Memory Layouts
http://www.techhelpmanual.com/89-video_memory_layouts.html - Screen Attributes
http://www.techhelpmanual.com/87-screen_attributes.html - IBM PC Family – BIOS Video Modes
https://www.minuszerodegrees.net/video/bios_video_modes.htm - EGA Functions
https://cosmodoc.org/topics/ega-functions/#the-hierarchy-of-the-ega - 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/ - How 16 colors saved PC gaming – the story of EGA graphics
https://www.custompc.com/retro-tech/ega-graphics - List of 16-bit computer color palettes
https://en.wikipedia.org/wiki/List_of16-bit_computer_color_palettes - Why were those colors chosen to be the default palette for 256-color VGA?
https://retrocomputing.stackexchange.com/questions/27994/why-were-those-colors-chosen-to-be-the-default-palette-for-256-color-vga - VGA Color Palettes
https://www.fountainware.com/EXPL/vga_color_palettes.htm - Hardware Level VGA and SVGA Video Programming Information Page
http://www.osdever.net/FreeVGA/vga/vga.htm - Hardware Level VGA and SVGA Video Programming Information Page – sequencer
http://www.osdever.net/FreeVGA/vga/seqreg.htm - VGA Basics
http://www.brackeen.com/vga/basics.html