Obsah
1. Textové režimy grafické karty CGA a řadič displeje Motorola 6845
2. Text a atributy – standard, který přežil až do dnešní doby
3. Standardní textový režim s rozlišením 40×25 znaků
4. Standardní textový režim s rozlišením 80×25 znaků
5. Konfigurace způsobu zobrazení v textových režimech – základ pro příčetné použití karty CGA
6. Změna významu nejvyššího bitu atributového bajtu: vyšší intenzita namísto blikání
7. Řídicí registry čipu MC6845
8. Význam prvních čtyř registrů – vykreslení jediného obrazového řádku
9. Podpora pro zobrazení (hardwarového) textového kurzoru
10. Změna tvaru textového kurzoru
11. Cílená modifikace řídicích registrů karty CGA a nestandardní režimy zobrazování
12. Pseudografický režim 160×100 pixelů se šestnácti barvami
13. Zobrazení „rastrové mřížky“: pseudografický režim 160×25 pixelů
16. Nastavení čítačů přes registry CRTC pro zobrazení režimu 160×100 se šestnácti barvami
17. Výsledný příklad: „plnohodnotný“ režim 160×100×16
18. Proč není možné použít režim 160×200×16?
19. Repositář s demonstračními příklady
1. Textové režimy grafické karty CGA a řadič displeje Motorola 6845
Připomeňme si, že standardní BIOS podporoval (a dodnes podporuje!) následující textové a grafické režimy kompatibilní s grafickou kartou CGA:
Číslo (AL) | Typ | Rozlišení | Segment |
---|---|---|---|
00 | text, mono | 40×25 | 0×b800 |
01 | text, barvy | 40×25 | 0×b800 |
02 | text, mono | 80×25 | 0×b800 |
03 | text, barvy | 80×25 | 0×b800 |
04 | grafika, 4 barvy | 320×200 | 0×b800 |
05 | grafika, 4 mono | 320×200 | 0×b800 |
06 | grafika, B/W | 640×200 | 0×b800 |
Obrázek 1: Dos Navigator spuštěný na kartě CGA ve standardním textovém režimu 80×25 znaků.
Dnes nás budou zajímat první čtyři textové režimy, přičemž režim 0 a 1 se chová stejně (ale záleží na monitoru), podobně jako režimy 2 a 3. V těchto režimech byla stanovena struktura obrazové paměti (tj. jak jsou uloženy kódy zobrazovaných znaků a jejich video atributy), která je používána prakticky dodnes – například u těch PC, které startují v textovém režimu popř. mají „textový“ BIOS. U novějších grafických karet, tedy u EGA, VGA a SVGA, zůstaly tyto režimy zachovány, ale změnilo se jak horizontální rozlišení (ze 640 pixelů na 720 pixelů), tak především vertikální rozlišení (z 200 pixelů na 350 či dokonce na 400 pixelů). A navíc se zvýšila i obnovovací frekvence na 70 Hz. Všechny tyto změny vedly k tomu, že textové režimy byly dobře čitelné a nezatěžovaly oči (na rozdíl od některých grafických režimů s nižší obnovovací frekvencí). A co je důležitější – kartu CGA je možné přeprogramovat tak, aby v textovém režimu de facto zobrazovala grafiku s rozlišením 160×100 „pixelů“, ovšem se šestnácti barvami.
Obrázek 2: Text s atributy zobrazený ve standardním textovém režimu 40×25.
Pro zajímavost se ještě podívejme, jaký je typický obsah řídicích registrů pro textové režimy označované CO40 a CO80, tedy režimy pro grafické karty CGA se čtyřiceti resp. osmdesáti znaky na řádku (o řídicích registrech CRTC se budeme podrobněji bavit od sedmé kapitoly):
Číslo registru | CO40 | CO80 | Význam |
---|---|---|---|
0 | 56 | 113 | celkový počet znaků horizontálně – 1, včetně okrajů (tedy nezobrazených znaků) |
1 | 40 | 80 | počet horizontálně zobrazených znaků |
2 | 45 | 90 | horizontální pozice synchronizačního signálu |
3 | 10 | 10 | šířka horizontálního synchronizačního signálu |
4 | 31 | 31 | celkový počet textových řádků (včetně okrajů) |
5 | 6 | 6 | mikroposun textových řádků po jednotlivých obrazových řádcích |
6 | 25 | 25 | zobrazený počet textových řádků |
7 | 28 | 28 | vertikální pozice synchronizačního signálu |
8 | 2 | 2 | režim prokládání (interlace) a posunutí |
9 | 7 | 7 | počet obrazových řádků pro jeden textový řádek – 1 – výška znaku |
10 | 6 | 6 | začátek hardwarového kurzoru |
11 | 7 | 7 | konec hardwarového kurzoru |
12 | 0 | 0 | počáteční adresa obrazové paměti (vyšší bajt) |
13 | 0 | 0 | počáteční adresa obrazové paměti (nižší bajt) |
14 | 0 | 0 | adresa kurzoru – vyšší bajt |
15 | 0 | 0 | adresa kurzoru – nižší bajt |
16 | 0 | 0 | adresa světelného pera – vyšší bajt |
17 | 0 | 0 | adresa světelného pera – nižší bajt |
2. Text a atributy – standard, který přežil až do dnešní doby
Víme již, že u CGA byl stanoven standard pro to, jak je organizována video paměť v textových režimech. V sudém bajtu (číslujeme od nuly) je uložen ASCII kód zobrazovaného znaku a v bajtu lichém jeho atribut. Struktura video paměti v textových režimech tedy vypadá takto:
0 1 ║ 2 3 ║ 4 5 ║ ... ║158 159 ┌───┼───╫───┼───╫───┼───╫─────╫───┼───╖ 0│chr│atr║chr│atr║chr│atr║ ... ║chr│atr║ řádek 0 ├───┼───╫───┼───╫───┼───╫─────╫───┼───╢ 160│chr│atr║chr│atr║chr│atr║ ... ║chr│atr║ řádek 1 ├───┼───╫───┼───╫───┼───╫─────╫───┼───╢ 320│chr│atr║chr│atr║chr│atr║ ... ║chr│atr║ řádek 2 ├───┼───╫───┼───╫───┼───╫─────╫───┼───╢ 480│chr│atr║chr│atr║chr│atr║ ... ║chr│atr║ ├───┼───╫───┼───╫───┼───╫─────╫───┼───╢ . . ├───┼───╫───┼───╫───┼───╫─────╫───┼───╢ 3840│chr│atr║chr│atr║chr│atr║ ... ║chr│atr║ řádek 24 └───┴───╨───┴───╨───┴───╨─────╨───┴───╜
Obrázek 3: Text s atributy zobrazený ve standardním textovém režimu 80×25.
Samotný atributový bajt (samostatný pro každý znak) má tuto strukturu:
╓7┬6┬5┬4┬3┬2┬1┬0╖ ║ │bkgnd│ frgnd ║ ╙─┴─┴─┴─┴─┴─┴─┴─╜ bity ║ ╚═╦═╝ ╚═════╩═► 0-3: barva popředí 0-15 ║ ╚═══════════► 4-6: barva pozadí 0-7 ╚═══════════════► 7: povolení blikání
Pokud je blikání vypnuto (viz další text), význam se nepatrně změní:
╓7┬6┬5┬4┬3┬2┬1┬0╖ ║ bkgnd │ frgnd ║ ╙─┴─┴─┴─┴─┴─┴─┴─╜ bity ╚══╦══╝ ╚═════╩═► 0-3: barva popředí 0-15 ╚════════════► 4-6: barva pozadí 0-15
Obrázek 4: Kombinace barev popředí a pozadí.
3. Standardní textový režim s rozlišením 40×25 znaků
Ukažme si nyní, jak vypadá obrazovka standardního textového režimu s rozlišením 40×25 znaků v případě, že je ke grafické kartě CGA připojený digitální (RGBI) monitor. Obrazovku vyplníme různými kombinacemi atributů a znaků. Pokud bude atribut pozadí vyšší než hodnota 7, bude text blikat (což známe například ze ZX Spectra atd.):
Obrázek 5: Standardní textový režim 40×25 znaků se šestnácti barvami (blikající text, první snímek).
Obrázek 6: Standardní textový režim 40×25 znaků se šestnácti barvami (blikající text, druhý snímek).
Způsob vyplnění všech 40×25 znaků i 40×25 atributů (ES:DI už jsou nastaveny):
mov cx, 40*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
Úplný zdrojový kód tohoto demonstračního příkladu vypadá následovně:
; Textovy rezim karty CGA s rozlisenim 40x25 znaku. ; ; preklad pomoci: ; nasm -f bin -o gfx_text.com cga_text_mode_1.asm ; ; nebo pouze: ; nasm -o gfx_text.com cga_text_mode_1.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 1 ; nastaveni textoveho rezimu 40x25 znaku mov ax, 0xb800 mov es, ax mov di, 0 ; nyni ES:DI obsahuje adresu prvniho znaku ve video RAM mov cx, 40*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 exit
4. Standardní textový režim s rozlišením 80×25 znaků
Prakticky stejným způsobem si necháme zobrazit text s barvovými atributy ve standardním textovém režimu 80×25 znaků, což byl (a v některých oborech doposud je) naprostý standard. Ostatně limit 80 znaků na řádek se dodržuje i ve zdrojových kódech mnoha projektů:
Obrázek 7: Standardní textový režim 80×25 znaků se šestnácti barvami (blikající text, první snímek).
Obrázek 8: Standardní textový režim 80×25 znaků se šestnácti barvami (blikající text, druhý snímek).
Úplný zdrojový kód tohoto demonstračního příkladu vypadá následovně:
; Textovy rezim karty CGA s rozlisenim 80x25 znaku. ; ; preklad pomoci: ; nasm -f bin -o gfx_text.com cga_text_mode_3.asm ; ; nebo pouze: ; nasm -o gfx_text.com cga_text_mode_3.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 textoveho rezimu 80x25 znaku mov ax, 0xb800 mov es, ax mov di, 0 ; nyni ES:DI obsahuje adresu prvniho znaku ve video RAM mov cx, 40*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 exit
5. Konfigurace způsobu zobrazení v textových režimech – základ pro příčetné použití karty CGA
Způsob zobrazení textu v textových režimech je možné různým způsobem ovlivňovat. K tomu slouží řídicí registry samotné karty CGA dostupné na portu 0×3D8 a 0×3D9 (některé bity již známe). Ale důležitější jsou registry CRTC, tedy řídicí registry čipu Motorola 6845, které si popíšeme v sedmé kapitole.
Na I/O portu 3D8 lze řídit způsob zobrazení:
|7|6|5|4|3|2|1|0| 3D8 Mode Select Register | | | | | | | `---- 1 = 80x25 text, 0 = 40x25 text | | | | | | `----- 1 = 320x200 grafika, 0 = text | | | | | `------ 1 = monochrom, 0 = barevný výstup | | | | `------- 1 = povolení video signálu | | | `-------- 1 = 640x200 B/W grafika | | `--------- 1 = blikání pozadí `------------ nepoužito
Důležitý je zejména pátý bit.
Další port slouží pro modifikaci barvové palety. V případě textových režimů se používají tyto bity:
Text: |7|6|5|4|3|2|1|0| | | | | | `-------- okraj obrazovky (RGB) | | | | `--------- vyšší/nižší intenzita okraje | | | `---------- intenzita pozadí `--------------- nepoužito
6. Změna významu nejvyššího bitu atributového bajtu: vyšší intenzita namísto blikání
Blikání textu v případě, že je nastaven nejvyšší bit barvy pozadí, se sice může v některých případech hodit, ale omezuje počet barev pozadí ze šestnácti na osm, protože není možné nastavit intenzitu barvy. Ovšem toto chování karty CGA lze měnit, a to konkrétně bitem číslo 5 portu 0×3d8. Aby se zakázalo, je nutné tento bit vynulovat (je totiž ve výchozím textovém režimu nastavený na jedničku). Tuto změnu provedeme snadno:
mov dx, 0x3d8 ; port s rizenim graficke palety mov al, 0x18 ; pozadi neblika, meni se intenzita out dx, al ; pres port 0x3d9
V následujícím demonstračním příkladu se po stisku klávesy tento bit nejdříve vynuluje a po dalším stisku zase nastaví. Po vynulování bude obrazovka vypadat následovně:
Obrázek 9: Nyní může mít pozadí libovolnou barvu 0–15.
Po nastavení se vrátíme k původnímu chování:
Obrázek 10: Nyní může mít pozadí barvu 0–7 s možností specifikace blikání.
Úplný zdrojový kód tohoto demonstračního příkladu vypadá následovně:
; Textovy rezim karty CGA. ; Zmena vyznamu nejvyssiho bitu atributu. ; ; preklad pomoci: ; nasm -f bin -o gfx_text.com cga_text_mode_intensity.asm ; ; nebo pouze: ; nasm -o gfx_text.com cga_text_mode_intensity.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 textoveho rezimu 80x25 znaku mov ax, 0xb800 mov es, ax mov di, 0 ; nyni ES:DI obsahuje adresu prvniho znaku ve video RAM mov cx, 40*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, 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 exit
7. Řídicí registry čipu MC6845
Srdcem grafické karty CGA (ale i mnoha dalších grafických video subsystémů té doby) je čip Motorola 6845, zkráceně MC6845. Prozatím jsme se konfiguraci tohoto čipu úspěšně vyhýbali, ale pokud máme skutečně využít všech možností CGA, je nutné se zabývat i touto problematikou (nakonec není složitá).
Nastavení resp. přesněji řečeno konfigurace grafického řadiče MC6845 se provádělo přes celkem osmnáct osmibitových řídicích registrů. Některé z těchto registrů byly určeny pro zápis (například registr s počtem znaků na řádek atd.), jiné zase pro čtení (pozice světelného pera). Číselné hodnoty, které mohly být větší než 28 (což je počáteční adresa obrazové paměti, adresa kurzoru a adresa světelného pera), se musely ukládat do dvou sousedních osmibitových registrů.
Registry byly programátorům přístupné nepřímo, konkrétně přes dvojici adres – zápis do první adresy vybíral příslušný řídicí registr, čtení či zápis do druhé adresy (o jedničku vyšší) již vedl ke čtení či zápisu do příslušného řídicího registru. Díky tomu bylo možné MC6845 použít v prakticky jakémkoli počítačovém systému, a to i v případě, kdy je počet I/O portů zásadně omezen (teoreticky lze tak zkombinovat MC6845 například s osmibitovým mikrořadičem 8051). O které adresy oněch dvou registrů se konkrétně jedná záleželo na zapojení konkrétní grafické karty. Například u grafické karty CGA se jedná o I/O porty na adresách 0×3d4 a 0×3d5 a u grafické karty Hercules (taktéž IBM PC) se naopak jednalo o I/O porty 0×3b4 a 0×3b5.
Význam jednotlivých řídicích registrů čipu 6845 je uveden v následující tabulce. Povšimněte si, že jednotkami při udávání horizontálních velikostí jsou vždy znaky a nikoli pixely – přesné časování je odvozeno od externího hodinového signálu řízeného krystalem:
Číslo registru | Šířka (b) | Význam |
---|---|---|
0 | 8 | celkový počet znaků horizontálně – 1, včetně okrajů (tedy nezobrazených znaků) |
1 | 8 | počet horizontálně zobrazených znaků (typicky 40 či 80) |
2 | 8 | horizontální pozice synchronizačního signálu (lze tedy posouvat obrazem na monitoru, ovšem omezeně) |
3 | 8 | šířka horizontálního synchronizačního signálu (záleží na konkrétním monitoru, řádkové frekvenci atd.) |
4 | 7 | celkový počet textových řádků, včetně okrajů (například 27, maximálně však 128) |
5 | 5 | mikroposun textových řádků po jednotlivých obrazových řádcích |
6 | 7 | zobrazený počet textových řádků (například 25) |
7 | 7 | vertikální pozice synchronizačního signálu (lze posouvat obrazem, opět omezeně) |
8 | 8 | režim prokládání (interlace) a posunutí |
9 | 5 | počet obrazových řádků pro jeden textový řádek – 1 – výška znaku (většinou 8 či 14) |
10 | 5+2 | začátek hardwarového kurzoru (většinou výška_znaku-3) |
11 | 5 | konec hardwarového kurzoru (kurzor může mít například výšku dvou obrazových řádků) |
12 | 6 | počáteční adresa obrazové paměti (vyšší bajt) |
13 | 8 | počáteční adresa obrazové paměti (nižší bajt) |
14 | 6 | adresa kurzoru – vyšší bajt (klasický posun hardwarového kurzoru) |
15 | 8 | adresa kurzoru – nižší bajt |
16 | 6 | adresa světelného pera – vyšší bajt |
17 | 8 | adresa světelného pera – nižší bajt |
Vlastnost | Omezení |
---|---|
celkový počet textových řádků | 128 |
počet obrazových řádků pro řádek textový (výška textu) | 32 |
výška kurzoru | 32 |
adresa obrazové paměti | 214 |
adresa kurzoru | 214 |
adresa světelného pera | 214 |
8. Význam prvních čtyř registrů – vykreslení jediného obrazového řádku
Význam prvních čtyř registrů naznačuje, jak vlastně interně MC6845 pracuje. Jedná se o sadu čítačů a komparátorů, kde čítače běží volně (nelze je programovat), ale komparátory se nastavují právě pomocí řídicích registrů:
1 2 3 4 5 12345678901234567890123456789012345678901234567890123456 ← čítač znaků | | | | | | běžný viditelný textový řádek | -- | sync |-| | | | | | ↑ ↑ ↑ ↑ R1 R2 R2+R3 R0
9. Podpora pro zobrazení (hardwarového) textového kurzoru
Čip 6845, který je srdcem grafické karty MDA, CGA i Herculesu, dokáže posílat signál o tom, že se má zobrazit textový kurzor. Toto je velmi zajímavá a možná i unikátní funkce, která je ovšem interně řešena velmi jednoduše. Adresu znaku, na kterém je textový kurzor, je nutné zapsat do dvou řídicích registrů, konkrétně do registrů R14 a R15. Dále se v registrech R10 a R11 nachází číslo mikrořádku (v rámci textového řádku), kde se má kurzor zobrazit – ten je totiž tvořen obdélníkem, který začíná (v rámci znaku) právě na řádku v R10 a končí na řádku uloženého v R11 (řekneme, že se jedná o hodnoty 12 a 14 pro znaky vysoké šestnáct mikrořádků).
Činnost čipu 6845 je v tomto ohledu poměrně triviální – v případě, že je adresa právě vybíraného znaku totožná s adresou kurzoru, tak se provede porovnání interního počitadla mikrořádků s hodnotami v registrech R10 a R11. V případě, že počitadlo leží mezi těmito hodnotami (včetně obou mezí), je signál CURSOR nastaven na logickou jedničku – a to je prakticky vše. Další operace s tímto signálem může ale nemusí provést další (typicky diskrétní) logika. Ta typicky pro textové režimy provede OR hodnoty pixelu posílaného na monitor se signálem CURSOR a pro grafické režimy je hodnota zcela ignorována.
10. Změna tvaru textového kurzoru
Podívejme se nyní na způsob, jakým lze modifikovat tvar textového kurzoru. Nastavit lze počáteční obrazový řádek (v rámci výšky znaku, takže typicky v rozsahu 0 až 7) a koncový obrazový řádek. Oficiálně platí, že pokud je počáteční řádek větší, než řádek koncový, není kurzor zobrazen, ovšem existují neoficiální klony CGA, které v tomto případě zobrazí rozpůlený kurzor (první polovina začíná na řádku 0, druhá polovina končí na posledním znakovém řádku). Prozatím nepoužijeme makra ani subrutiny, takže nastavení kurzoru bude vypadat následovně (opakující se kód ale obecně není příliš vhodný – zde nepotřebujeme co nejvyšší rychlost):
mov dx, 0x3d4 mov al, 0x0a ; registr s ovladanim tvaru textoveho kurzoru out dx, al mov dx, 0x3d5 mov al, 0 ; scanline, kde kurzor zacina out dx, al mov dx, 0x3d4 mov al, 0x0b ; registr s ovladanim tvaru textoveho kurzoru out dx, al mov dx, 0x3d5 mov al, 5 ; scanline, kde kurzor konci out dx, al
Výsledek by měl vypadat následovně:
Obrázek 11: Výchozí tvar kurzoru (levý horní roh).
Obrázek 12: Nový tvar kurzoru (levý horní roh).
A takto vypadá úplný zdrojový kód tohoto demonstračního příkladu:
; Textovy rezim karty CGA. ; Zmena tvaru textoveho kurzoru. ; ; preklad pomoci: ; nasm -f bin -o gfx_text.com cga_text_mode_cursor.asm ; ; nebo pouze: ; nasm -o gfx_text.com cga_text_mode_cursor.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 textoveho rezimu 80x25 znaku mov ax, 0xb800 mov es, ax mov di, 0 ; nyni ES:DI obsahuje adresu prvniho znaku ve video RAM wait_key mov dx, 0x3d4 mov al, 0x0a ; registr s ovladanim tvaru textoveho kurzoru out dx, al mov dx, 0x3d5 mov al, 0 ; scanline, kde kurzor zacina out dx, al mov dx, 0x3d4 mov al, 0x0b ; registr s ovladanim tvaru textoveho kurzoru out dx, al mov dx, 0x3d5 mov al, 5 ; scanline, kde kurzor konci out dx, al wait_key exit
11. Cílená modifikace řídicích registrů karty CGA a nestandardní režimy zobrazování
Kromě základních (z pohledu programátorů standardních) grafických režimů, které se nastavovaly s využitím služeb BIOSu, byly díky poměrně širokým možnostem čipu MC6845 podporovány i mnohé další grafické módy. První z těchto módů je „legální“ tj. zmiňuje se o něm i oficiální dokumentace firmy IBM (ale například náš SYSMAN již nikoli, což je však pochopitelné – viz další text). V tomto režimu bylo možné zobrazit rastrový obraz o rozměrech 160×200 pixelů, přičemž každý pixel mohl nabývat jedné ze šestnácti barev, podobně jako tomu v textovém režimu (včetně už zmíněných hacků hnědé a světle šedé barvy). Potřebná kapacita video paměti je stejná, jako v případě režimu monochromatického – tedy přesně 16000 bajtů. Tento režim však byl použitelný pouze pro kompozitní video, tj. například pro televizory připojené ke grafické kartě pomocí konektoru RCA.
Obrázek 13: Hra King's Quest na klasickém RGBI monitoru (jinými slovy – to prostě nechcete).
Obrázek 14: Stejná hra, ovšem na kompozitním monitoru s využitím triku s NTSC barvami (ovšem je nutno ručně doladit).
12. Pseudografický režim 160×100 pixelů se šestnácti barvami
Druhý nestandardní mód je již možné použít na jakémkoli monitoru, tedy i na originálním digitálním monitoru IBM i na jeho klonech. V podstatě se jedná o režim textový, u nějž je pomocí řídicích registrů čipu MC6845 upravena výška znaků na pouhé dva skenovací řádky. Z toho vyplývá, že se zobrazuje 80 znaků na 100 textových řádků (u CGA je počet skenovacích řádků vždy roven 200, a to i v textových režimech). Pokud se bude zobrazovat pouze znak ve tvaru polovičního obdélníku (viz rozšířená tabulka ASCII), zvyšuje se rozlišení tohoto pseudografického režimu na 160×100 „pixelů“, přičemž každý pixel může nabývat jedné z šestnácti barev (programátor tedy mění pouze barvové atributy znaků, tj. každý lichý bajt).
Obrázek 15: Použití pseudografického režimu 160×100 ve hrách.
Tento poměrně zajímavý režim, použitý například i v několika hrách, je možné nastavit i u dalších grafických karet, přesněji řečeno u všech karet, které emulují funkce čipu MC6845, tj. například u karty EGA i VGA. Ve většině případů to ale postrádá smysl, protože jejich grafické režimy již nejsou omezeny malým počtem barev tak, jak je tomu u grafické karty CGA.
Obrázek 16: Použití pseudografického režimu 160×100 ve hrách.
Programátoři se v minulosti pokoušeli nastavovat i další grafické režimy. Teoreticky to není problematické, protože čip MC6845 je velmi flexibilní, ale mnohé monitory nedokázaly korektně pracovat v těch případech, kdy se změnilo časování horizontálních a vertikálních synchronizačních signálů – grafická karta CGA měla pouze jeden krystal sloužící ke generování hodinového signálu (vstup do čipu MC6845), takže například při změně horizontálního rozlišení (počtu pixelů na obrazovém řádku) se buď musel snížit počet obrazových řádků, nebo muselo dojít ke změně obrazové frekvence.
Obrázek 17: Sada „obdélníků“ v rozšířené ASCII.
13. Zobrazení „rastrové mřížky“: pseudografický režim 160×25 pixelů
Připomeňme si, že pro pseudografický režim 160×100 pixelů je nutné provést dvě operace:
- Vyplnění celého textového okna znakem, který má podobu obdélníku (v Unicode ▌, stejný znak však má i originální rozšířená ASCII na PC). Tím získáme mřížku s horizontálním rozlišením 160 pseudopixelů.
- Snížení výšky znaků z osmi obrazových řádků na dva obrazové řádky. Tím se zvýší vertikální rozlišení mřížky z 25 pseudopixelů na 100 pseudopixelů.
Nejprve vyplníme textové okno znakem obdélníku, protože se jedná o jednoduchou operaci. Bude se jednat o znak s ASCII kódem 0×de. A pro každý znak zvolíme odlišný barvový atribut:
mov cx, 80*25 ; pocet zapisovanych znaku opak: mov al, 0xde ; kod zapisovaneho znaku stosb ; zapis znaku mov al, cl ; kod zapisovaneho atributu stosb inc al ; dalsi znak/atribut loop opak ; opakujeme CX-krat
Výsledek by měl vypadat následovně:
Obrázek 18: Pseudografický režim s rozlišením 160×25 pixelů.
Úplný zdrojový kód tohoto demonstračního příkladu vypadá následovně:
; Textovy rezim karty CGA emulujici grafiku 160x25 "pixelu" ; ; preklad pomoci: ; nasm -f bin -o gfx_text.com cga_text_gfx_1.asm ; ; nebo pouze: ; nasm -o gfx_text.com cga_text_gfx_1.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 textoveho rezimu 80x25 znaku mov ax, 0xb800 mov es, ax mov di, 0 ; nyni ES:DI obsahuje adresu prvniho znaku ve video RAM mov cx, 80*25 ; pocet zapisovanych znaku opak: mov al, 0xde ; kod zapisovaneho znaku stosb ; zapis znaku mov al, cl ; kod zapisovaneho atributu stosb inc al ; dalsi znak/atribut loop opak ; opakujeme CX-krat wait_key mov dx, 0x3d8 ; port s rizenim graficke palety mov al, 0x18 ; pozadi neblika, meni se intenzita out dx, al ; pres port 0x3d9 wait_key exit
14. Změna výšky znaků
Druhým krokem k pseudografickému režimu 160×100 pixelů je snížení výšky znaků z osmi obrazových řádků na dva obrazové řádky. Tuto operaci provedeme následujícím makrem, které změní obsah řídicího registru 0×09 čipu Motorola 6845. Makro vypadá takto:
; zmena vysky znaku %macro character_height 1 mov dx, 0x3d4 mov al, 0x09 ; ridici registr (CRTC) out dx, al mov dx, 0x3d5 mov al, %1 ; nastavit pozadovanou vysku znaku out dx, al %endmacro
V demonstračním příkladu budeme toto makro volat několikrát, protože postupně snížíme výšku znaků na 6, 2, a dokonce i jeden obrazový řádek. Mezi jednotlivými obrazovkami se lze přepnout stiskem libovolné klávesy:
; Textovy rezim karty CGA. ; ; preklad pomoci: ; nasm -f bin -o gfx_text.com gfx_cga_text_mode_1.asm ; ; nebo pouze: ; nasm -o gfx_text.com gfx_cga_text_mode_1.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 ; zmena vysky znaku %macro character_height 1 mov dx, 0x3d4 mov al, 0x09 ; ridici registr (CRTC) out dx, al mov dx, 0x3d5 mov al, %1 ; nastavit pozadovanou vysku znaku out dx, al %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: gfx_mode 3 ; nastaveni textoveho rezimu 80x25 znaku mov ax, 0xb800 mov es, ax mov di, 0 ; nyni ES:DI obsahuje adresu prvniho znaku ve video RAM mov cx, 40*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, 0x3d8 ; port s rizenim graficke palety mov al, 0x18 ; pozadi neblika, meni se intenzita out dx, al ; pres port 0x3d9 wait_key character_height 6 wait_key character_height 1 wait_key character_height 0 wait_key exit
15. Ukázka změny výšky znaků
Makro character_height můžeme volat s hodnotami, které jsou typicky v rozsahu 0 až 15 (i když reálně na CGA jen v rozsahu 0 až 7):
character_height 6 wait_key character_height 1 wait_key character_height 0 wait_key
Výsledné obrazovky vypadají v DOSBoxu následovně (pravděpodobně kvůli nedokonalosti DOSBoxu se při změně výšky znaků neroztáhne obraz tak, jako na reálném monitoru, ovšem při zvětšení je dobře vidět, jak jsou znaky vysoké):
Obrázek 19: Původní výška znaků 8 obrazových řádků.
Obrázek 20: Modifikovaná výška znaků na 7 obrazových řádků.
Obrázek 21: Modifikovaná výška znaků na dva obrazové řádky.
Obrázek 22: Modifikovaná výška znaků na jeden obrazový řádek.
16. Nastavení čítačů přes registry CRTC pro zobrazení režimu 160×100 se šestnácti barvami
Naším posledním úkolem je nyní nastavit čítače video řadiče Motorola 6845 tak, aby se namísto 25 textových řádků zobrazilo 100 textových řádků (s výškou dva obrazové řádky). Vhodné hodnoty registrů vypadají následovně, i když si například můžeme zkusit „pohrát“ s pozicí vertikálního zatemnění apod. a dosáhnout tak mírně zvýšeného vertikálního rozlišení (které ovšem nemusí být použitelné pro všechny typy monitorů!!!):
Registr CRTC | Hodnota hexa | Hodnota deci | Význam |
---|---|---|---|
0×04 | 0×7f | 127 | celkový počet textových řádků (včetně neviditelných) |
0×06 | 0×64 | 100 | počet zobrazených řádků z celkového počtu |
0×07 | 0×70 | 112 | pozice synchronizačního signálu |
0×09 | 0×01 | 1 | výška znaku-1 (měřeno obrazovými řádky) |
Pro nastavení registru CRTC použijeme toto makro:
; nastaveni jednoho CRTC registru %macro set_crtc 2 mov dx, 0x3d4 mov al, %1 ; ridici registr (CRTC) out dx, al mov dx, 0x3d5 mov al, %2 ; hodnota zapisovana do registru out dx, al %endmacro
Nastavení pseudografického režimu tedy bude vypadat následovně:
set_crtc 0x04, 0x7f ; celkovy pocet textovych radku set_crtc 0x06, 100 ; pocet zobrazenych textovych radku z celkoveho poctu set_crtc 0x07, 0x70 ; pozice synchronizacniho signalu set_crtc 0x09, 1 ; vyska znaku 2 scanline
Výsledek:
Obrázek 23: Pseudobitmapa s rozlišením 160×100 pixelů, která evidentně dokáže zobrazit všech šestnáct barev.
17. Výsledný příklad: „plnohodnotný“ režim 160×100×16
Úplný zdrojový kód příkladu, který inicializuje pseudografický režim s rozlišením 160×100 „pixelů“ s plnou podporou šestnácti barev, vypadá následovně:
; Pseudograficky rezim 160x100x16. ; ; preklad pomoci: ; nasm -f bin -o gfx_text.com gfx_cga_text_mode_1.asm ; ; nebo pouze: ; nasm -o gfx_text.com gfx_cga_text_mode_1.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 jednoho CRTC registru %macro set_crtc 2 mov dx, 0x3d4 mov al, %1 ; ridici registr (CRTC) out dx, al mov dx, 0x3d5 mov al, %2 ; hodnota zapisovana do registru out dx, al %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: gfx_mode 3 ; nastaveni textoveho rezimu 80x25 znaku mov ax, 0xb800 mov es, ax mov di, 0 ; nyni ES:DI obsahuje adresu prvniho znaku ve video RAM mov cx, 80*100 ; pocet zapisovanych znaku opak: mov al, 0xde ; kod zapisovaneho znaku stosb ; zapis znaku mov al, cl ; kod zapisovaneho 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 set_crtc 0x04, 0x7f ; celkovy pocet textovych radku set_crtc 0x06, 100 ; pocet zobrazenych textovych radku z celkoveho poctu set_crtc 0x07, 0x70 ; pozice synchronizacniho signalu set_crtc 0x09, 1 ; vyska znaku 2 scanline wait_key exit
18. Proč není možné použít režim 160×200×16?
Z jakého důvodu se však nemůže zvýšit vertikální rozlišení na plných 200 řádků, tj. snížit výšku znaku na pouhý jeden skenovací řádek? V tomto případě totiž narážíme na neefektivní práci s obrazovou pamětí, protože pro každý znak se musí uložit i jeho barvový atribut (dva bajty). Pro rozlišení 160×100 pixelů je zapotřebí alokovat: 80×100 znaků=8000×2 bytů=16000 bytů, tj. dostáváme se na horní mez kapacity obrazové paměti.
Obrázek 24: Hra Tunneler v režimu 160×100 se šestnácti barvami.
Obrázek 25: Hra Tunneler v režimu 160×100 se šestnácti barvami.
Obrázek 26: Hra Tunneler v režimu 160×100 se šestnácti barvami.
Obrázek 27: Hra Tunneler v režimu 160×100 se šestnácti barvami.
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 |
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