Textové režimy grafické karty CGA a řadič displeje Motorola 6845

16. 7. 2024
Doba čtení: 32 minut

Sdílet

 Autor: Pavel Tišnovský
Grafické režimy karty CGA pravděpodobně nikoho neohromí. Zajímavější jsou z pohledu programátora režimy textové, protože ty je možné konfigurací čipu Motorola 6845 přeprogramovat tak, že vznikne pseudografický režim 160×100.

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ů

14. Změna výšky znaků

15. Ukázka změny výšky znaků

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

20. Odkazy na Internetu

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
Poznámka: vidíme, že grafická karta CGA zobrazuje znaky o výšce osmi obrazových řádků, přičemž kurzor je (na vybraném znaku) zobrazen na obrazových řádcích 6 a 7. Počet viditelných textových řádků je roven 25, což znamená, že se zobrazuje 25×8=200 obrazových řádků z celkem 31×8=248 obrazových řádků (zbylých (28–25)×8=24 obrazových řádků tvoří okraj, zbytek je vyhrazen pro vertikální synchronizaci.

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

Poznámka: můžeme zde do jisté míry vidět podobný koncept, jaký známe například ze ZX Spectra (i když tam se jednalo o plnohodnotný grafický režim).

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

Poznámka: stále zobrazujeme pouze 40×25 znaků, takže je vyplněna pouze polovina textové obrazovky.

Ú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
Poznámka: povšimněte si některých omezení vyplývajících ze skutečné bitové šířky registrů, která je mnohdy menší, než by odpovídalo maximální osmibitové šířce:
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.

Poznámka: blikání kurzoru, pokud je podporováno, je taktéž řízeno další logikou.

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.

Poznámka: originální karta CGA skutečně kromě konektoru pro připojení digitálního monitoru obsahovala i RCA konektor.

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 EGAVGA. 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:

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

bitcoin_skoleni

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

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

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

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

Autor článku

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