Obsah
1. Specifika instrukční sady mikroprocesorů Intel 8086/8088 (3)
2. Blokový přenos prováděný po bajtech
3. Realizace blokového přenosu instrukcí MOVSx
4. Opakování operace blokového přenosu prefixem REP
5. Porovnání rychlosti jednotlivých realizací blokových přenosů
6. Krátké zopakování: přenos rastrového obrázku z kódového segmentu do obrazové paměti
7. Přenos maximálního počtu bajtů instrukcí REP MOVSB
8. Jak velký blok se přenese při nastavení CX=0?
9. Přenos po bajtech, 16bitových slovech nebo 32bitových slovech
10. Porovnání rychlosti přenosu realizovaného po bajtech, 16bitových či 32bitových slovech
11. Počet cyklů nutných pro přenos bloku o velikosti 64000 bajtů
12. Určení směru přenosu při blokových operacích
13. Blokový přenos ve chvíli, kdy se zdrojový a cílový blok překrývají
14. Realizace zpětného blokového přenosu
15. Korektní realizace zpětného blokového přenosu
16. Úplný zdrojový kód příkladu realizujícího zpětný blokový přenos
17. Vyhledávání znaku v řetězci
18. Seznam již popsaných instrukcí
19. Repositář s demonstračními příklady
1. Specifika instrukční sady mikroprocesorů Intel 8086/8088 (3)
V dnešním článku dokončíme popis blokových a řetězcových instrukcí, které jsou specifickým rysem instrukční sady mikroprocesorů Intel 8086 (a tím pádem i Intel 8088). Ukážeme si například vliv změny směru načítání či ukládání dat, vliv instrukčního prefixu REP, ale například i způsob vyhledání znaku v řetězci atd. Nezapomeneme ani na problematiku rychlosti provádění blokových operací, protože mikroprocesory Intel se v tomto ohledu dosti významným způsobem zlepšovaly.
Připomeňme si, které instrukce řadíme mezi instrukce řetězcové a blokové:
Instrukce | Stručný popis instrukce |
---|---|
CLD | nastaví příznak DF pro určení směru přenosu (nahoru/dolů) |
STD | nastaví příznak DF pro určení směru přenosu (nahoru/dolů) |
LODSB | načtení bajtu do AL z DS : [SI], zvýšení/snížení SI o 1 |
LODSW | načtení slova do AX z DS : [SI], zvýšení/snížení SI o 2 |
STOSB | uložení bajtu z AL do ES : [DI], zvýšení/snížení DI o 1 |
STOSW | uložení slova z AX do ES : [DI], zvýšení/snížení DI o 2 |
MOVSB | kombinace LODSB + STOSB v jediné instrukci (AL se nemodifikuje) |
MOVSW | kombinace LODSW + STOSW v jediné instrukci (AX se nemodifikuje) |
CMPSB | porovnání dvou bajtů z DS : [SI] a ES : [DI], zvýšení/snížení SI a DI |
CMPSW | porovnání dvou slov z DS : [SI] a ES : [DI], zvýšení/snížení SI a DI |
SCASB | nalezení bajtu v AL na adrese DS : [SI] (mění příznaky) |
SCASW | nalezení slova v AX na adrese DS : [SI] (mění příznaky) |
INSB | přečtení bajtu z portu, uložení na ES : [DI], zvýšení/snížení DI |
OUTSB | zápis bajtu na port z DS : [SI], zvýšení/snížení SI |
REP/REPE/REPZ | opakování další operace CX-krát |
REPNE/REPNZ | opakování další operace CX-krát, nebo až bude ZF==1 |
2. Blokový přenos prováděný po bajtech
Instrukce LODSB a STOSB můžeme velmi snadno „spárovat“ a realizovat tak operaci přesunu jednoho bajtu (popř. 16bitového nebo u pozdějších čipů i 32bitového slova). Připomeňme si, že LODSB načítá hodnotu z adresy DS : [SI] a STOSB ukládá hodnotu na adresu ES : [DI], přičemž se korektně zvýší jak registr SI, tak i registr DI. A pochopitelně můžeme mezi LODSB a STOSB vložit další instrukci/instrukce a realizovat tak například negaci obrázku atd. Typicky se tato dvojice instrukcí doplňuj instrukcí LOOP pro snížení registru CX o jedničku a skok ve chvíli, kdy se ještě nedosáhlo nuly:
opak: lodsb ; precteni bajtu a posun adresy ... ; modifikace bajtu v AL stosb ; zapis bajtu a posun adresy loop opak
V dnešním prvním demonstračním příkladu přepíšeme část řetězce na adrese message částí řetězce na adrese replacement. Řetězce nejsou ukončeny nulou, takže použijeme explicitně nastavené počitadlo:
BITS 16 ; 16bitovy vystup pro DOS CPU 8086 ; specifikace pouziteho instrukcniho souboru ; ukonceni procesu a navrat do DOSu %macro exit 0 ret %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ; tisk retezce na obrazovku %macro print 1 mov dx, %1 mov ah, 9 int 0x21 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: print message push cs pop es ; ES:DI obsahuje adresu prvniho znaku ve zprave mov di, message push cs pop ds ; DS:SI obsahuje adresu prvniho znaku ve zprave mov si, replacement mov cx, 12 ; pocet prepisovanych znaku opak: lodsb ; precteni znaku a posun adresy stosb ; zapis znaku a posun adresy loop opak print message wait_key exit ; retezec ukonceny znakem $ ; (tato data jsou soucasti vysledneho souboru typu COM) message db "Hello, world!", 0x0d, 0x0a, "$" replacement db "Zdravim svet"
3. Realizace blokového přenosu instrukcí MOVSx
V praxi se velmi často setkáme s požadavkem na realizaci „čistého“ blokového přenosu, při němž se nijak nemění přenášená data. To znamená, že namísto:
opak: lodsb ; precteni bajtu a posun adresy ... ; modifikace bajtu v AL stosb ; zapis bajtu a posun adresy loop opak
vlastně potřebujeme realizovat pouze:
opak: lodsb ; precteni bajtu a posun adresy stosb ; zapis bajtu a posun adresy loop opak
V instrukčním souboru mikroprocesorů Intel 8086/8088 ovšem existuje i instrukce MOVSx (tedy například MOVSB), která spojuje možnosti LODSB a STOSB do jediné instrukce (což je interně již dosti komplikovaná operace):
opak: movsb ; precteni bajtu a posun adresy, zapis bajtu a posun adresy loop opak
Otestujme si i tuto operaci na nepatrně upraveném demonstračním příkladu:
BITS 16 ; 16bitovy vystup pro DOS CPU 8086 ; specifikace pouziteho instrukcniho souboru ; ukonceni procesu a navrat do DOSu %macro exit 0 ret %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ; tisk retezce na obrazovku %macro print 1 mov dx, %1 mov ah, 9 int 0x21 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: print message push cs pop es ; ES:DI obsahuje adresu prvniho znaku ve zprave mov di, message push cs pop ds ; DS:SI obsahuje adresu prvniho znaku ve zprave mov si, replacement mov cx, 12 ; pocet prepisovanych znaku opak: movsb ; precteni znaku a posun adresy ; zapis znaku a posun adresy loop opak print message wait_key exit ; retezec ukonceny znakem $ ; (tato data jsou soucasti vysledneho souboru typu COM) message db "Hello, world!", 0x0d, 0x0a, "$" replacement db "Zdravim svet"
4. Opakování operace blokového přenosu prefixem REP
Již minule jsme se seznámili s instrukčním prefixem REP, který umožňuje opakovat některou z řetězcových nebo blokových operací (STOSB, LODSB atd.) CX-krát. Tentýž instrukční prefix je možné použít společně s operací MOVSB a realizovat tak skutečný blokový přenos z adresy DS : [SI] do paměťového bloku začínajícího na adrese ES : [DI], přičemž se přenese přesně CX bajtů:
mov cx, 12 ; pocet prepisovanych znaku rep movsb ; precteni znaku a posun adresy ; zapis znaku a posun adresy
Opět si ukažme použití takto modifikované instrukce pro přepis obsahu části řetězce jiným řetězcem. Bude se tedy jednat o zkrácenou verzi předchozích dvou demonstračních příkladů:
BITS 16 ; 16bitovy vystup pro DOS CPU 8086 ; specifikace pouziteho instrukcniho souboru ; ukonceni procesu a navrat do DOSu %macro exit 0 ret %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ; tisk retezce na obrazovku %macro print 1 mov dx, %1 mov ah, 9 int 0x21 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: print message push cs pop es ; ES:DI obsahuje adresu prvniho znaku ve zprave mov di, message push cs pop ds ; DS:SI obsahuje adresu prvniho znaku ve zprave mov si, replacement mov cx, 12 ; pocet prepisovanych znaku rep movsb ; precteni znaku a posun adresy ; zapis znaku a posun adresy print message wait_key exit ; retezec ukonceny znakem $ ; (tato data jsou soucasti vysledneho souboru typu COM) message db "Hello, world!", 0x0d, 0x0a, "$" replacement db "Zdravim svet"
5. Porovnání rychlosti jednotlivých realizací blokových přenosů
Zkusme si nyní porovnat rychlost různých realizací blokových přenosů. Budeme přitom uvažovat přenos z adresy DS : [SI] a na adresu ES : [DI], přičemž se SI a DI budou postupně zvyšovat o jedničku a provede se CX opakování. Takovou operaci lze realizovat mnoha způsoby, například explicitně zapsanou smyčkou:
opak: mov al, ds:[si] ; 12+5+2=19 mov es:[di], al ; 12+5+2=19 inc si ; 3 inc di ; 3 loop opak ; 17 ; celkem ; 3904000
Použití kombinace LODSB a STOSB by mělo vést k rychlejší realizaci:
opak: lodsb ; 16 stosb ; 11 loop opak ; 17 ; celkem ; 2816000
Použití MOVSB s explicitně zapsanou smyčkou je opět o několik desítek procent rychlejší:
opak: movsb ; 18 loop opak ; 17 ; celkem ; 2240000 = (18 + 17) * 64000
A konečně použití MOVSB s opakováním bude na Intelu 8088 či 8086 nejrychlejší možnou realizací blokového přenosu:
rep movsb ; 9 + 17n ; celkem ; 1088009 = 9 + 17*64000
6. Krátké zopakování: přenos rastrového obrázku z kódového segmentu do obrazové paměti
S programovým kódem uvedeným v této kapitole jsme se již setkali. Je zde realizován přenos rastrového obrázku z kódového segmentu do obrazové paměti (Video RAM). Vše se bude odehrávat ve standardním grafickém režimu 13H, takže přenášený obrázek bude mít velikost 320×200 pixelů, tedy přesně 64000 bajtů. Obrázek lze na platformě Intel 8086/8088 přenést buď po bajtech nebo po celých 16bitových slovech. Zvolíme druhou možnost (čímž mimochodem eliminujeme možnost reálného využití latche, což nám však nebude vadit):
; 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 ; paleta ve stupnich sedi %macro grayscale_palette 0 mov ax, 0x1010 ; cislo sluzby a podsluzby VGA BIOSu xor bl, bl ; index barvy next_dac: mov ch, bl ; prvni barvova slozka shr ch, 1 shr ch, 1 mov cl, ch ; druha barvova slozka mov dh, ch ; treti barvova slozka int 0x10 ; modifikace mapovani v DAC inc bl ; zvysit index v DAC jnz next_dac ; nastavit dalsi barvu, dokud nedosahneme hodnoty 256 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: gfx_mode 0x13 ; nastaveni rezimu 320x200 s 256 barvami grayscale_palette ; nastaveni palety se stupni sedi mov ax, cs mov ds, ax mov si, image ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku mov ax, 0xa000 ; video RAM v textovem rezimu mov es, ax xor di, di ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 320*200/2 ; pocet zapisovanych bajtu (=pixelu) rep movsw ; prenos celeho obrazku wait_key ; cekani na klavesu exit ; navrat do DOSu ; pridani binarnich dat s rastrovym obrazkem image: incbin "image_320x200.bin"
Výsledkem by měla být obrazovka s tímto obsahem:
Obrázek 1: Obrazovka po přenosu rastrového obrázku o velikosti 64000 bajtů
7. Přenos maximálního počtu bajtů instrukcí REP MOVSB
Instrukce REP MOVSB dokáže přenést maximálně CX bajtů a vzhledem k tomu, že CX je šestnáctibitovým registrem, je maximální velikost přenášeného bloku rovna 65535 bajtům. Nelze tedy přenést celý segment (jeden bajt chybí), což lze nahradit explicitně provedenou operací MOVSB na konci. Předpokládá se přitom, že SI i DI budou nulové, protože nelze provést přenosy přes hranice segmentů (dojde k přetečení):
rep movsb ; přenos 65535 bajtů movsb ; přenos posledního bajtu
Ukažme si to (zde jen čistě pro opakování) na přenosu obrázku do obrazové paměti. Omezeni jsme na velikost kódového segmentu, tedy na 64kB i na možnost přenosu maximálně 65535 bajtů:
; Graficky rezim karty VGA s rozlisenim 320x200 pixelu. ; Vykresleni rastroveho obrazku: prenos 65535 bajtu/pixelu ;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 8086 ; specifikace pouziteho instrukcniho souboru ;----------------------------------------------------------------------------- ; 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 ; paleta ve stupnich sedi %macro grayscale_palette 0 mov ax, 0x1010 ; cislo sluzby a podsluzby VGA BIOSu xor bl, bl ; index barvy next_dac: mov ch, bl ; prvni barvova slozka shr ch, 1 shr ch, 1 mov cl, ch ; druha barvova slozka mov dh, ch ; treti barvova slozka int 0x10 ; modifikace mapovani v DAC inc bl ; zvysit index v DAC jnz next_dac ; nastavit dalsi barvu, dokud nedosahneme hodnoty 256 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: gfx_mode 0x13 ; nastaveni rezimu 320x200 s 256 barvami grayscale_palette ; nastaveni palety se stupni sedi mov ax, cs mov ds, ax xor si, si ; nyni DS:SI obsahuje adresu prvniho bajtu v kodovem segmentu mov ax, 0xa000 ; video RAM v textovem rezimu mov es, ax xor di, di ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 65535 ; pocet zapisovanych bajtu (=pixelu) rep movsb ; prenos celeho obrazku wait_key ; cekani na klavesu exit ; navrat do DOSu ; pridani binarnich dat s rastrovym obrazkem image: incbin "image_320x200.bin"
Výsledek:
Obrázek 2: Výsledek přenosu celého kódového segmentu do obrazové paměti.
Ještě si ukažme, co se stane, když začneme přenášet data z poloviny kódového segmentu (tedy například od adresy 32000). Mělo by dojít k přetečení obsahu registru SI a tím pádem i k přenosu kódu i začátku obrazu do druhé poloviny obrazovky:
Obrázek 3: Výsledek přenosu celého kódového segmentu do obrazové paměti, ovšem začínáme od SI=32000 a nikoli od nuly.
8. Jak velký blok se přenese při nastavení CX=0?
Následující sekvence instrukcí přenese celých 65536 bajtů, protože LOOP nejdříve sníží obsah CX a posléze ho kontroluje na nulovost před provedením skoku:
xor cx, cx ; pocet zapisovanych bajtu (=pixelu) opak: movsb loop opak
Ovšem co provede přepis této smyčky do následující podoby?
xor cx, cx ; pocet zapisovanych bajtu (=pixelu) rep movsb
Výsledkem bude, že se NEpřenese žádný blok, protože ve skutečnosti REP kontroluje obsah registru CX ještě před přenosem prvního bajtu:
Obrázek 4: Výsledek přenosu bloku o nulové délce.
Úplný zdrojový kód takto upraveného demonstračního příkladu vypadá následovně:
; Graficky rezim karty VGA s rozlisenim 320x200 pixelu. ; Vykresleni rastroveho obrazku, prenos 0 bajtu. ; ; preklad pomoci: ; nasm -f bin -o vga.com vga_320x200_image_0B.asm ; ; nebo pouze: ; nasm -o vga.com vga_320x200_image_0B.asm ;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 8086 ; specifikace pouziteho instrukcniho souboru ;----------------------------------------------------------------------------- ; 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 ; paleta ve stupnich sedi %macro grayscale_palette 0 mov ax, 0x1010 ; cislo sluzby a podsluzby VGA BIOSu xor bl, bl ; index barvy next_dac: mov ch, bl ; prvni barvova slozka shr ch, 1 shr ch, 1 mov cl, ch ; druha barvova slozka mov dh, ch ; treti barvova slozka int 0x10 ; modifikace mapovani v DAC inc bl ; zvysit index v DAC jnz next_dac ; nastavit dalsi barvu, dokud nedosahneme hodnoty 256 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: gfx_mode 0x13 ; nastaveni rezimu 320x200 s 256 barvami grayscale_palette ; nastaveni palety se stupni sedi mov ax, cs mov ds, ax mov si, image ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku mov ax, 0xa000 ; video RAM v textovem rezimu mov es, ax xor di, di ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM xor cx, cx ; pocet zapisovanych bajtu (=pixelu) rep movsb ; prenos celeho obrazku wait_key ; cekani na klavesu exit ; navrat do DOSu ; pridani binarnich dat s rastrovym obrazkem image: incbin "image_320x200.bin"
9. Přenos po bajtech, 16bitových slovech nebo 32bitových slovech
Přenos rastrového obrázku (nebo libovolného jiného bloku) po bajtech již velmi dobře známe:
mov ax, cs mov ds, ax mov si, image ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku mov ax, 0xa000 ; video RAM v textovem rezimu mov es, ax xor di, di ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 320*200 ; pocet zapisovanych bajtu (=pixelu) rep movsb ; prenos celeho obrazku
Víme také, že obrázek má „kulatou“ velikost 64000 bajtů, což je hodnota celočíselně dělitelná dvěma. Můžeme tedy alternativně přenášet i po celých šestnáctibitových slovech:
mov ax, cs mov ds, ax mov si, image ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku mov ax, 0xa000 ; video RAM v textovem rezimu mov es, ax xor di, di ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 320*200/2 ; pocet zapisovanych slov (=dvoupixelu) rep movsw ; prenos celeho obrazku
Současně se jedná o hodnotu dělitelnou i čtyřmi, takže by bylo možné provádět blokový přenos i po 32bitových slovech. Taková možnost na čipech Intel 8086/8088 neexistuje, ovšem na čipech 80386 a vyšších je to možné realizovat pomocí instrukce MOVSD. Nejprve se tedy assembleru povolíme použití instrukčního souboru 80386:
BITS 16 ; 16bitovy vystup pro DOS CPU 386 ; specifikace pouziteho instrukcniho souboru
A přenos provedeme takto:
mov ax, cs mov ds, ax mov si, image ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku mov ax, 0xa000 ; video RAM v textovem rezimu mov es, ax xor di, di ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 320*200/4 ; pocet zapisovanych 32bitovych slov (=ctyrpixelu) rep movsd ; prenos celeho obrazku
Výsledný příklad by mohl vypadat následovně:
; Graficky rezim karty VGA s rozlisenim 320x200 pixelu. ; Vykresleni rastroveho obrazku: prenos po 32bitovych slovech. ; ; preklad pomoci: ; nasm -f bin -o vga.com vga_320x200_image_movsd.asm ; ; nebo pouze: ; nasm -o vga.com vga_320x200_image_movsd.asm ;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 386 ; specifikace pouziteho instrukcniho souboru ;----------------------------------------------------------------------------- ; 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 ; paleta ve stupnich sedi %macro grayscale_palette 0 mov ax, 0x1010 ; cislo sluzby a podsluzby VGA BIOSu xor bl, bl ; index barvy next_dac: mov ch, bl ; prvni barvova slozka shr ch, 1 shr ch, 1 mov cl, ch ; druha barvova slozka mov dh, ch ; treti barvova slozka int 0x10 ; modifikace mapovani v DAC inc bl ; zvysit index v DAC jnz next_dac ; nastavit dalsi barvu, dokud nedosahneme hodnoty 256 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: gfx_mode 0x13 ; nastaveni rezimu 320x200 s 256 barvami grayscale_palette ; nastaveni palety se stupni sedi mov ax, cs mov ds, ax mov si, image ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku mov ax, 0xa000 ; video RAM v textovem rezimu mov es, ax xor di, di ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 320*200/4 ; pocet zapisovanych 32bitovych slov (=ctyrpixelu) rep movsd ; prenos celeho obrazku wait_key ; cekani na klavesu exit ; navrat do DOSu ; pridani binarnich dat s rastrovym obrazkem image: incbin "image_320x200.bin"
10. Porovnání rychlosti přenosu realizovaného po bajtech, 16bitových či 32bitových slovech
Podívejme se, jak rychlý bude přenos bloku při použití různých forem přenosu – po bajtech, šestnáctibitových slovech nebo po slovech 32bitových. Nyní již budeme rozlišovat mezi několika procesorovými architekturami (což je ovšem problematika, ke které se ještě vrátíme):
Operace | 8086 | 186 | 286 | 386 | 486 | Pentium |
---|---|---|---|---|---|---|
rep movsb | 9+17n | 8+8n | 5+4n | 7+4n | 12+3n* | 3+n |
rep movsw | 9+25n | 8+8n | 5+4n | 7+4n | 12+3n* | 3+n |
rep movsd | × | × | × | 7+4n | 12+3n* | 3+n |
Povšimněte si, že rozdíl mezi šířkou přenášených dat nalezneme vlastně jen na čipu 8086.
11. Počet cyklů nutných pro přenos bloku o velikosti 64000 bajtů
Nyní je již snadné zjistit, kolik strojových cyklů se „spálí“ při přenosu bloku o velikosti 64000 bajtů. Přitom porovnáváme čistě jen počet cyklů a nikoli reálný čas, protože ten závisí na frekvenci hodinového signálu a tedy znamená, že dvě totožné sekvence instrukcí se provedou rychleji na mikroprocesoru s vyšší frekvencí hodinového signálu. Nás však nyní bude zajímat čistě rychlost implementace blokových operací:
Operace | Přenosů | 8086 | 186 | 286 | 386 | 486 | Pentium |
---|---|---|---|---|---|---|---|
rep movsb | 64000 | 1088009 | 512008 | 256005 | 256007 | 192012 | 64003 |
rep movsw | 32000 | 800009 | 256008 | 128005 | 128007 | 96012 | 32003 |
rep movsd | 16000 | × | × | × | 64007 | 48012 | 16003 |
12. Určení směru přenosu při blokových operacích
Instrukcemi CLD a STD se mění hodnota příznaku DF uloženého v příznakovém registru FLAGS. Tento příznak ovlivňuje chování těch instrukcí, v nichž se mění zdrojový indexový registr SI a/nebo cílový indexový registr DI. Hodnoty těchto registrů se totiž mohou jak zvyšovat (což jsme si již ukázali), tak i snižovat. Blokový přenos se snižováním adres (a nikoli jejich zvyšováním) se využije ve chvíli, kdy se zdrojový a cílový blok překrývají, což je problém, který je možné si relativně snadno vizualizovat, jak to ostatně uvidíme v navazujících kapitolách.
13. Blokový přenos ve chvíli, kdy se zdrojový a cílový blok překrývají
Nyní se pokusíme o provedení následujících operací:
- Vykreslíme část rastrového obrázku, konkrétně jeho prvních 100 řádků do obrazové paměti.
- Přesuneme blok o velikosti 320×100 bajtů (=stejný počet pixelů) ve video RAM z adresy 0 na adresu 320×10, což znamená, že se pokusíme o přesun (resp. kopii) obrázku o deset obrazových řádků níže.
Realizace těchto dvou operací v assembleru je snadná.
První operace:
mov ax, cs mov ds, ax mov si, image ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku mov ax, 0xa000 ; video RAM v textovem rezimu mov es, ax xor di, di ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 320*100 ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum rep movsb ; prenos celeho obrazku
Výsledek první operace:
Obrázek 5: Obrazovka po provedení první operace.
Druhá operace:
mov ax, 0xa000 ; video RAM v textovem rezimu mov ds, ax xor si, si ; DS:SI ukazuje na zacatek video RAM (source) mov es, ax mov di, 320*10 ; ES:DI ukazuje na zacatek radku cislo 10 ve video RAM (destination) mov cx, 320*100 ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum rep movsb ; prenos celeho obrazku
Obrázek 6: Obrazovka po provedení druhé operace.
Je dobré si uvědomit, proč vypadá výsledek tak, jak vypadá. Přenesení každého řádku znamená, že si přepíšeme část zdrojového bloku, protože zdrojový a cílový blok se překrývají. Konkrétně se prvních 10 obrazových řádků rozkopíruje do dalších 10 řádků atd., takže ve výsledku se prvních 10 řádků několikrát opakuje v cílovém obrázku. Důvod je ten, že kopírujeme od prvního bajtu směrem k bajtu poslednímu a „dopředně“ si zdroj přepisujeme.
Otázka na čtenáře: jaký bude vizuální výsledek následující operace?
mov ax, 0xa000 ; video RAM v textovem rezimu mov ds, ax xor si, si ; DS:SI ukazuje na zacatek video RAM (source) mov es, ax mov di, 1 ; ES:DI ukazuje na zacatek ciloveho bloku (destination) mov cx, 320*100 ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum rep movsb ; prenos celeho obrazku
Úplný zdrojový kód tohoto demonstračního příkladu vypadá následovně:
; Graficky rezim karty VGA s rozlisenim 320x200 pixelu. ; Vykresleni rastroveho obrazku: prenos po bajtech prekryvajici se oblasti. ; ; preklad pomoci: ; nasm -f bin -o vga.com vga_320x200_image_movsb_forward.asm ; ; nebo pouze: ; nasm -o vga.com vga_320x200_image_movsb_forward.asm ;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 8086 ; specifikace pouziteho instrukcniho souboru ;----------------------------------------------------------------------------- ; 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 ; paleta ve stupnich sedi %macro grayscale_palette 0 mov ax, 0x1010 ; cislo sluzby a podsluzby VGA BIOSu xor bl, bl ; index barvy next_dac: mov ch, bl ; prvni barvova slozka shr ch, 1 shr ch, 1 mov cl, ch ; druha barvova slozka mov dh, ch ; treti barvova slozka int 0x10 ; modifikace mapovani v DAC inc bl ; zvysit index v DAC jnz next_dac ; nastavit dalsi barvu, dokud nedosahneme hodnoty 256 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: gfx_mode 0x13 ; nastaveni rezimu 320x200 s 256 barvami grayscale_palette ; nastaveni palety se stupni sedi mov ax, cs mov ds, ax mov si, image ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku mov ax, 0xa000 ; video RAM v textovem rezimu mov es, ax xor di, di ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 320*100 ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum rep movsb ; prenos celeho obrazku wait_key ; cekani na klavesu ; nyni provedeme prenos bloku, kdyz se bude zdroj a cil prekryvat mov ax, 0xa000 ; video RAM v textovem rezimu mov ds, ax xor si, si ; DS:SI ukazuje na zacatek video RAM (source) mov es, ax mov di, 320*10 ; ES:DI ukazuje na zacatek radku cislo 10 ve video RAM (destination) mov cx, 320*100 ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum rep movsb ; prenos celeho obrazku wait_key ; cekani na klavesu exit ; navrat do DOSu ; pridani binarnich dat s rastrovym obrazkem image: incbin "image_320x200.bin"
14. Realizace zpětného blokového přenosu
Výše uvedený problém je možné vyřešit tak, že začneme blokový přenos od posledního bajtu a budeme postupně snižovat obsah indexových registrů SI a DI a nikoli je zvyšovat. Navíc je nutné instrukcí STD změnit směr přenosu. Upravený kód může v první variantě vypadat následovně:
; nyni provedeme prenos bloku, kdyz se bude zdroj a cil prekryvat mov ax, 0xa000 ; video RAM v textovem rezimu mov ds, ax mov si, 320*100 ; konec bloku, ktery se ma prenest ; DS:SI ukazuje na zacatek video RAM (source) mov es, ax mov di, 320*(100+10) ; ES:DI ukazuje na konec bloku, ktery se ma prenest (destination) mov cx, 320*100 ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum std ; zmena smeru prenosu! rep movsb ; prenos celeho obrazku
A takto vypadají výsledky:
Obrázek 7: Obrazovka po provedení první operace.
Obrázek 8: Obrazovka po provedení druhé operace.
Povšimněte si levého horního rohu. Přes provedením přenosu jsme totiž pixel v tomto rohu vyplnili černou barvou:
xor di, di ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov byte es:[di], 0 ; oznacime si levy horni roh cernym pixelem
Při pohledu na obrázek číslo 8 je patrné, že jsme se dopustili klasické „chyby ± 1“, což se pokusíme napravit.
; Graficky rezim karty VGA s rozlisenim 320x200 pixelu. ; Vykresleni rastroveho obrazku: prenos po bajtech prekryvajici se oblasti. ; ; preklad pomoci: ; nasm -f bin -o vga.com vga_320x200_image_movsb_backward_1.asm ; ; nebo pouze: ; nasm -o vga.com vga_320x200_image_movsb_backward_1.asm ;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 8086 ; specifikace pouziteho instrukcniho souboru ;----------------------------------------------------------------------------- ; 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 ; paleta ve stupnich sedi %macro grayscale_palette 0 mov ax, 0x1010 ; cislo sluzby a podsluzby VGA BIOSu xor bl, bl ; index barvy next_dac: mov ch, bl ; prvni barvova slozka shr ch, 1 shr ch, 1 mov cl, ch ; druha barvova slozka mov dh, ch ; treti barvova slozka int 0x10 ; modifikace mapovani v DAC inc bl ; zvysit index v DAC jnz next_dac ; nastavit dalsi barvu, dokud nedosahneme hodnoty 256 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: gfx_mode 0x13 ; nastaveni rezimu 320x200 s 256 barvami grayscale_palette ; nastaveni palety se stupni sedi mov ax, cs mov ds, ax mov si, image ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku mov ax, 0xa000 ; video RAM v textovem rezimu mov es, ax xor di, di ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 320*100 ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum rep movsb ; prenos celeho obrazku xor di, di ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov byte es:[di], 0 ; oznacime si levy horni roh cernym pixelem wait_key ; cekani na klavesu ; nyni provedeme prenos bloku, kdyz se bude zdroj a cil prekryvat mov ax, 0xa000 ; video RAM v textovem rezimu mov ds, ax mov si, 320*100 ; konec bloku, ktery se ma prenest ; DS:SI ukazuje na zacatek video RAM (source) mov es, ax mov di, 320*(100+10) ; ES:DI ukazuje na konec bloku, ktery se ma prenest (destination) mov cx, 320*100 ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum std ; zmena smeru prenosu! rep movsb ; prenos celeho obrazku wait_key ; cekani na klavesu exit ; navrat do DOSu ; pridani binarnich dat s rastrovym obrazkem image: incbin "image_320x200.bin"
15. Korektní realizace zpětného blokového přenosu
Jak by tedy měla vypadat korektní realizace zpětného blokového přenosu? Musíme začít od reálné poslední adresy, což ovšem nejsou offsety 320×100 a 320×(100+10), ale hodnoty 320×100–1 a 320×(100+10)-1. Nepatrně tedy upravíme konstanty, kterými naplníme registry SI (od které adresy se bude provádět přenos) a DI (na kterou adresu se bude přenášet):
; nyni provedeme prenos bloku, kdyz se bude zdroj a cil prekryvat mov ax, 0xa000 ; video RAM v textovem rezimu mov ds, ax mov si, 320*100-1 ; konec bloku, ktery se ma prenest ; DS:SI ukazuje na zacatek video RAM (source) mov es, ax mov di, 320*(100+10)-1 ; ES:DI ukazuje na konec bloku, ktery se ma prenest (destination)
Samotný blokový přenos již bude probíhat naprosto stejným způsobem:
mov cx, 320*100 ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum std ; zmena smeru prenosu! rep movsb ; prenos celeho obrazku
A takto vypadají výsledky:
Obrázek 9: Obrazovka po provedení první operace.
Obrázek 10: Obrazovka po provedení druhé operace.
Z těchto dvou screenshotů je patrné, že nyní by měl být blokový přenos korektní.
16. Úplný zdrojový kód příkladu realizujícího zpětný blokový přenos
Úplný zdrojový kód demonstračního příkladu provádějícího zpětný blokový přenos v obrazové paměti vypadá následovně:
; Graficky rezim karty VGA s rozlisenim 320x200 pixelu. ; Vykresleni rastroveho obrazku: prenos po bajtech prekryvajici se oblasti. ; ; preklad pomoci: ; nasm -f bin -o vga.com vga_320x200_image_movsb_backward_2.asm ; ; nebo pouze: ; nasm -o vga.com vga_320x200_image_movsb_backward_2.asm ;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 8086 ; specifikace pouziteho instrukcniho souboru ;----------------------------------------------------------------------------- ; 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 ; paleta ve stupnich sedi %macro grayscale_palette 0 mov ax, 0x1010 ; cislo sluzby a podsluzby VGA BIOSu xor bl, bl ; index barvy next_dac: mov ch, bl ; prvni barvova slozka shr ch, 1 shr ch, 1 mov cl, ch ; druha barvova slozka mov dh, ch ; treti barvova slozka int 0x10 ; modifikace mapovani v DAC inc bl ; zvysit index v DAC jnz next_dac ; nastavit dalsi barvu, dokud nedosahneme hodnoty 256 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: gfx_mode 0x13 ; nastaveni rezimu 320x200 s 256 barvami grayscale_palette ; nastaveni palety se stupni sedi mov ax, cs mov ds, ax mov si, image ; nyni DS:SI obsahuje adresu prvniho bajtu v obrazku mov ax, 0xa000 ; video RAM v textovem rezimu mov es, ax xor di, di ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 320*100 ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum rep movsb ; prenos celeho obrazku xor di, di ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov byte es:[di], 0 ; oznacime si levy horni roh cernym pixelem wait_key ; cekani na klavesu ; nyni provedeme prenos bloku, kdyz se bude zdroj a cil prekryvat mov ax, 0xa000 ; video RAM v textovem rezimu mov ds, ax mov si, 320*100-1 ; konec bloku, ktery se ma prenest ; DS:SI ukazuje na zacatek video RAM (source) mov es, ax mov di, 320*(100+10)-1 ; ES:DI ukazuje na konec bloku, ktery se ma prenest (destination) mov cx, 320*100 ; pocet zapisovanych bajtu (=pixelu) odpovida 100 radkum std ; zmena smeru prenosu! rep movsb ; prenos celeho obrazku wait_key ; cekani na klavesu exit ; navrat do DOSu ; pridani binarnich dat s rastrovym obrazkem image: incbin "image_320x200.bin"
17. Vyhledávání znaku v řetězci
Některé operace nabízené mikroprocesory Intel 8086/8088 lze použít i pro zpracování řetězců. Ukažme si například, jak by bylo možné realizovat nalezení první mezery v řetězci s následnou záměnou této mezery na hvězdičku:
message db "Hello, world!", 0x0d, 0x0a, "$"
Výsledkem by měl být řetězec:
message db "Hello,*world!", 0x0d, 0x0a, "$"
Samotné nalezení mezery lze realizovat operací REPNE SCASB, která postupně načítá jednotlivé bajty a porovnává je s obsahem registru AL. Po nalezení shody je tato operace ukončena:
pop es ; ES:DI obsahuje adresu prvniho znaku ve zprave mov di, message mov al, " " ; hledani mezery v retezci repne scasb
Nyní nám postačuje upravit obsah indexového registru DI a provést zápis nového znaku:
mov al, "*" ; prepis mezery za hvezdicku dec di stosb
Úplný zdrojový kód dnešního posledního demonstračního příkladu vypadá následovně:
BITS 16 ; 16bitovy vystup pro DOS CPU 8086 ; specifikace pouziteho instrukcniho souboru ; ukonceni procesu a navrat do DOSu %macro exit 0 ret %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ; tisk retezce na obrazovku %macro print 1 mov dx, %1 mov ah, 9 int 0x21 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: print message push cs pop es ; ES:DI obsahuje adresu prvniho znaku ve zprave mov di, message mov al, " " ; hledani mezery v retezci repne scasb mov al, "*" ; prepis mezery za hvezdicku dec di stosb print message ; tisk upravene zpravy wait_key exit ; retezec ukonceny znakem $ ; (tato data jsou soucasti vysledneho souboru typu COM) message db "Hello, world!", 0x0d, 0x0a, "$"
18. Seznam již popsaných instrukcí
Podobně jako v sedmnácté části tohoto seriálu si i dnes uvedeme rozšířenou tabulku se všemi instrukcemi mikroprocesorů Intel 8086/8088, které byly doposud popsány (a doplněny demonstračními příklady):
ADC | Add with carry |
ADD | Add |
AND | Logical AND |
CMP | Compare operands |
DEC | Decrement by 1 |
DIV | Unsigned divide |
IDIV | Signed divide |
IMUL | Signed multiply in One-operand form |
INC | Increment by 1 |
Jcc | Jump if condition |
JMP | Jump |
JCXZ | Jump if CX is zero |
LOOP/LOOPx | Loop control |
MUL | Unsigned multiply |
NEG | Two's complement negation |
NOT | Negate the operand, logical NOT |
OR | Logical OR |
RCL | Rotate left (with carry) |
RCR | Rotate right (with carry) |
ROL | Rotate left |
ROR | Rotate right |
SAL | Shift Arithmetically left (signed shift left) |
SAR | Shift Arithmetically right (signed shift right) |
SBB | Subtraction with borrow |
SHL | Shift left (unsigned shift left) |
SHR | Shift right (unsigned shift right) |
SUB | Subtraction |
TEST | Logical compare (AND) |
XOR | Exclusive OR |
XLAT | Table look-up translation |
DAA | Decimal adjust AL after addition |
DAS | Decimal adjust AL after subtraction |
AAA | ASCII adjust AL after addition |
AAD | ASCII adjust AX before division |
AAM | ASCII adjust AX after multiplication |
AAS | ASCII adjust AL after subtraction |
CLD | Clear direction flag |
STC | Set carry flag |
LODSB | Load string byte |
LODSW | Load string word |
STOSB | Store byte in string |
STOSW | Store word in string |
MOVSB | Move byte from string to string |
MOVSW | Move word from string to string |
CMPSB | Compare bytes in memory |
CMPSW | Compare words |
SCASB | Compare byte string |
SCASW | Compare word string |
REPxx | Repeat MOVS/STOS/CMPS/LODS/SCAS |
19. Repositář s demonstračními příklady
Demonstrační příklady napsané v assembleru, které jsou určené pro překlad s využitím assembleru NASM, byly uloženy do Git repositáře, který je dostupný na adrese https://github.com/tisnik/8bit-fame. Jednotlivé demonstrační příklady si můžete v případě potřeby stáhnout i jednotlivě bez nutnosti klonovat celý (dnes již poměrně rozsáhlý) repositář:
# | Příklad | Stručný popis | Adresa |
---|---|---|---|
1 | hello.asm | program typu „Hello world“ naprogramovaný v assembleru pro systém DOS | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello.asm |
2 | hello_shorter.asm | kratší varianta výskoku z procesu zpět do DOSu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_shorter.asm |
3 | hello_wait.asm | čekání na stisk klávesy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_wait.asm |
4 | hello_macros.asm | realizace jednotlivých částí programu makrem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_macros.asm |
5 | gfx4_putpixel.asm | vykreslení pixelu v grafickém režimu 4 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_putpixel.asm |
6 | gfx6_putpixel.asm | vykreslení pixelu v grafickém režimu 6 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel.asm |
7 | gfx4_line.asm | vykreslení úsečky v grafickém režimu 4 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_line.asm |
8 | gfx6_line.asm | vykreslení úsečky v grafickém režimu 6 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_line.asm |
9 | gfx6_fill1.asm | vyplnění obrazovky v grafickém režimu, základní varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill1.asm |
10 | gfx6_fill2.asm | vyplnění obrazovky v grafickém režimu, varianta s instrukcí LOOP | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill2.asm |
11 | gfx6_fill3.asm | vyplnění obrazovky instrukcí REP STOSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill3.asm |
12 | gfx6_fill4.asm | vyplnění obrazovky, synchronizace vykreslování s paprskem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill4.asm |
13 | gfx4_image1.asm | vykreslení rastrového obrázku získaného z binárních dat, základní varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image1.asm |
14 | gfx4_image2.asm | varianta vykreslení rastrového obrázku s využitím instrukce REP MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image2.asm |
15 | gfx4_image3.asm | varianta vykreslení rastrového obrázku s využitím instrukce REP MOVSW | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image3.asm |
16 | gfx4_image4.asm | korektní vykreslení všech sudých řádků bitmapy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image4.asm |
17 | gfx4_image5.asm | korektní vykreslení všech sudých i lichých řádků bitmapy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image5.asm |
18 | gfx4_image6.asm | nastavení barvové palety před vykreslením obrázku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image6.asm |
19 | gfx4_image7.asm | nastavení barvové palety před vykreslením obrázku, snížená intenzita barev | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image7.asm |
20 | gfx4_image8.asm | postupná změna barvy pozadí | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image8.asm |
21 | gfx6_putpixel1.asm | vykreslení pixelu, základní varianta se 16bitovým násobením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel1.asm |
22 | gfx6_putpixel2.asm | vykreslení pixelu, varianta s osmibitovým násobením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel2.asm |
23 | gfx6_putpixel3.asm | vykreslení pixelu, varianta bez násobení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel3.asm |
24 | gfx6_putpixel4.asm | vykreslení pixelu přes obrázek, nekorektní chování (přepis obrázku) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel4.asm |
25 | gfx6_putpixel5.asm | vykreslení pixelu přes obrázek, korektní varianta pro bílé pixely | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel5.asm |
26 | cga_text_mode1.asm | standardní textový režim s rozlišením 40×25 znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode1.asm |
27 | cga_text_mode3.asm | standardní textový režim s rozlišením 80×25 znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode3.asm |
28 | cga_text_mode_intensity.asm | změna významu nejvyššího bitu atributového bajtu: vyšší intenzita namísto blikání | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_intensity.asm |
29 | cga_text_mode_cursor.asm | změna tvaru textového kurzoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_cursor.asm |
30 | cga_text_gfx1.asm | zobrazení „rastrové mřížky“: pseudografický režim 160×25 pixelů (interně textový režim) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_gfx1.asm |
31 | cga_text_mode_char_height.asm | změna výšky znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_char_height.asm |
32 | cga_text_160×100.asm | grafický režim 160×100 se šestnácti barvami (interně upravený textový režim) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_160×100.asm |
33 | hercules_text_mode1.asm | využití standardního textového režimu společně s kartou Hercules | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_text_mode1.asm |
34 | hercules_text_mode2.asm | zákaz blikání v textových režimech | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_text_mode2.asm |
35 | hercules_turn_off.asm | vypnutí generování video signálu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_turn_off.asm |
36 | hercules_gfx_mode1.asm | přepnutí karty Hercules do grafického režimu (základní varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_gfx_mode1.asm |
37 | hercules_gfx_mode2.asm | přepnutí karty Hercules do grafického režimu (vylepšená varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_gfx_mode2.asm |
38 | hercules_putpixel.asm | subrutina pro vykreslení jediného pixelu na kartě Hercules | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_putpixel.asm |
39 | ega_text_mode_80×25.asm | standardní textový režim 80×25 znaků na kartě EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_text_mode_80×25.asm |
40 | ega_text_mode_80×43.asm | zobrazení 43 textových řádků na kartě EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_text_mode_80×43.asm |
41 | ega_gfx_mode_320×200.asm | přepnutí do grafického režimu 320×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_320×200.asm |
42 | ega_gfx_mode_640×200.asm | přepnutí do grafického režimu 640×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_640×200.asm |
43 | ega_gfx_mode_640×350.asm | přepnutí do grafického režimu 640×350 pixelů se čtyřmi nebo šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_640×350.asm |
44 | ega_gfx_mode_bitplanes1.asm | ovládání zápisu do bitových rovin v planárních grafických režimech (základní způsob) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_bitplanes1.asm |
45 | ega_gfx_mode_bitplanes2.asm | ovládání zápisu do bitových rovin v planárních grafických režimech (rychlejší způsob) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_bitplanes2.asm |
46 | ega_320×200_putpixel.asm | vykreslení pixelu v grafickém režimu 320×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_320×200_putpixel.asm |
47 | ega_640×350_putpixel.asm | vykreslení pixelu v grafickém režimu 640×350 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_640×350_putpixel.asm |
48 | ega_standard_font.asm | použití standardního fontu grafické karty EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_standard_font.asm |
49 | ega_custom_font.asm | načtení vlastního fontu s jeho zobrazením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_custom_font.asm |
50 | ega_palette1.asm | změna barvové palety (všech 16 barev) v grafickém režimu 320×200 se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette1.asm |
51 | ega_palette2.asm | změna barvové palety (všech 16 barev) v grafickém režimu 640×350 se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette2.asm |
52 | ega_palette3.asm | změna všech barev v barvové paletě s využitím programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette3.asm |
53 | ega_palette4.asm | změna všech barev, včetně barvy okraje, v barvové paletě voláním funkce BIOSu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette4.asm |
54 | vga_text_mode_80×25.asm | standardní textový režim 80×25 znaků na kartě VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_80×25.asm |
55 | vga_text_mode_80×50.asm | zobrazení 50 a taktéž 28 textových řádků na kartě VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_80×50.asm |
56 | vga_text_mode_intensity1.asm | změna chování atributového bitu pro blikání (nebezpečná varianta změny registrů) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_intensity1.asm |
57 | vga_text_mode_intensity2.asm | změna chování atributového bitu pro blikání (bezpečnější varianta změny registrů) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_intensity2.asm |
58 | vga_text_mode_9th_column.asm | modifikace způsobu zobrazení devátého sloupce ve znakových režimech (720 pixelů na řádku) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_9th_column.asm |
59 | vga_text_mode_cursor_shape.asm | změna tvaru textového kurzoru na grafické kartě VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_cursor_shape.asm |
60 | vga_text_mode_custom_font.asm | načtení vlastního fontu s jeho zobrazením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_custom_font.asm |
61 | vga_gfx_mode_640×480.asm | přepnutí do grafického režimu 640×480 pixelů se šestnácti barvami, vykreslení vzorků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_640×480.asm |
62 | vga_gfx_mode_320×200.asm | přepnutí do grafického režimu 320×200 pixelů s 256 barvami, vykreslení vzorků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_320×200.asm |
63 | vga_gfx_mode_palette.asm | změna všech barev v barvové paletě grafické karty VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_palette.asm |
64 | vga_gfx_mode_dac1.asm | využití DAC (neočekávané výsledky) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac1.asm |
65 | vga_gfx_mode_dac2.asm | využití DAC (očekávané výsledky) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac2.asm |
66 | vga_640×480_putpixel.asm | realizace algoritmu pro vykreslení pixelu v grafickém režimu 640×480 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_640×480_putpixel.asm |
67 | vga_320×200_putpixel1.asm | realizace algoritmu pro vykreslení pixelu v grafickém režimu 320×200 s 256 barvami (základní varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel1.asm |
68 | vga_320×200_putpixel2.asm | realizace algoritmu pro vykreslení pixelu v grafickém režimu 320×200 s 256 barvami (rychlejší varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel2.asm |
69 | vga_gfx_mode_dac3.asm | přímé využití DAC v grafickém režimu 13h | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac3.asm |
70 | vga_gfx_mode_unchained_step1.asm | zobrazení barevných pruhů v režimu 13h | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step1.asm |
71 | vga_gfx_mode_unchained_step2.asm | vypnutí zřetězení bitových rovin a změna způsobu adresování pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step2.asm |
72 | vga_gfx_mode_unchained_step3.asm | vykreslení barevných pruhů do vybraných bitových rovin | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step3.asm |
73 | vga_gfx_mode_320×400.asm | nestandardní grafický režim s rozlišením 320×400 pixelů a 256 barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_320×400.asm |
74 | vga_320×200_image.asm | zobrazení rastrového obrázku ve standardním grafickém režimu 320×200 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image.asm |
75 | vga_320×200_unchained_image1.asm | zobrazení rastrového obrázku v režimu s nezřetězenými rovinami (nekorektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_unchained_image1.asm |
76 | vga_320×200_unchained_image2.asm | zobrazení rastrového obrázku v režimu s nezřetězenými rovinami (korektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_unchained_image2.asm |
77 | vga_320×400_unchained_image.asm | zobrazení rastrového obrázku v nestandardním režimu 320×400 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_unchained_image.asm |
78 | vga_vertical_scroll1.asm | vertikální scrolling na kartě VGA v režimu s rozlišením 320×200 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_vertical_scroll1.asm |
79 | vga_vertical_scroll2.asm | vertikální scrolling na kartě VGA v režimu s rozlišením 320×400 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_vertical_scroll2.asm |
80 | vga_split_screen1.asm | režim split-screen a scrolling, nefunční varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_split_screen1.asm |
81 | vga_split_screen2.asm | režim split-screen a scrolling, plně funkční varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_split_screen2.asm |
82 | vga_horizontal_scroll1.asm | horizontální scrolling bez rozšíření počtu pixelů na virtuálním řádku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll1.asm |
83 | vga_horizontal_scroll2.asm | horizontální scrolling s rozšířením počtu pixelů na virtuálním řádku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll2.asm |
84 | vga_horizontal_scroll3.asm | jemný horizontální scrolling s rozšířením počtu pixelů na virtuálním řádku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll3.asm |
85 | vga_320×240_image.asm | nastavení grafického režimu Mode-X, načtení a vykreslení obrázku, scrolling | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×240_image.asm |
86 | io.asm | knihovna maker pro I/O operace | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/io.asm |
87 | vga_lib.asm | knihovna maker a podprogramů pro programování karty VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_lib.asm |
88 | vga_320×240_lib.asm | nastavení grafického režimu Mode-X, tentokrát knihovními funkcemi | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×240_lib.asm |
89 | vga_bitblt1.asm | první (naivní) implementace operace BitBLT | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt1.asm |
90 | vga_bitblt2.asm | operace BitBLT s výběrem bitových rovin pro zápis | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt2.asm |
91 | vga_bitblt3.asm | operace BitBLT s výběrem bitových rovin pro čtení i zápis | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt3.asm |
92 | vga_bitblt4.asm | korektní BitBLT pro 16barevný režim, realizace makry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt4.asm |
93 | vga_bitblt5.asm | korektní BitBLT pro 16barevný režim, realizace podprogramem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt5.asm |
94 | vga_bitblt_rotate.asm | zápisový režim s rotací bajtu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt_rotate.asm |
95 | vga_bitblt_fast.asm | rychlá korektní 32bitová operace typu BitBLT | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt_fast.asm |
96 | vga_320×400_bitblt1.asm | přenos obrázku v režimu 320×400 operací BitBLT (neúplná varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_bitblt1.asm |
97 | vga_320×400_bitblt2.asm | přenos obrázku v režimu 320×400 operací BitBLT (úplná varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_bitblt2.asm |
98 | vga_write_modes1.asm | volitelné zápisové režimy grafické karty VGA, zápis bez úpravy latche | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes1.asm |
99 | vga_write_modes2.asm | volitelné zápisové režimy grafické karty VGA, zápis s modifikací latche | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes2.asm |
100 | vga_write_modes3.asm | volitelné zápisové režimy grafické karty VGA, cílená modifikace latche vzorkem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes3.asm |
101 | instruction_jump.asm | použití instrukce JMP | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jump.asm |
102 | instruction_jnz.asm | použití instrukce JNZ pro realizaci programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jnz.asm |
103 | instruction_jz_jmp.asm | použití instrukcí JZ a JMP pro realizaci programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jz_jmp.asm |
104 | instruction_loop.asm | použití instrukce LOOP pro realizaci programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_loop.asm |
105 | instruction_template.asm | šablona všech následujících demonstračních příkladů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_template.asm |
106 | instruction_print_hex.asm | tisk osmibitové hexadecimální hodnoty | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_print_hex.asm |
107 | instruction_xlat.asm | využití instrukce XLAT pro získání tisknutelné hexadecimální cifry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_xlat.asm |
108 | instruction_daa.asm | operace součtu s využitím binární i BCD aritmetiky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_daa.asm |
109 | instruction_daa_sub.asm | instrukce DAA po provedení operace rozdílu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_daa_sub.asm |
110 | instruction_das.asm | instrukce DAS po provedení operace rozdílu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_das.asm |
111 | instruction_aaa.asm | korekce výsledku na jedinou BCD cifru operací AAA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_aaa.asm |
112 | instruction_mul.asm | ukázka výpočtu součinu dvou osmibitových hodnot | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_mul.asm |
113 | instruction_aam.asm | BCD korekce po výpočtu součinu instrukcí AAM | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_aam.asm |
114 | instruction_stosb.asm | blokový zápis dat instrukcí STOSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_stosb.asm |
115 | instruction_rep_stosb.asm | opakované provádění instrukce STOSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_stosb.asm |
116 | instruction_lodsb.asm | čtení dat instrukcí LODSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_lodsb.asm |
117 | instruction_movsb.asm | přenos jednoho bajtu instrukcí MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_movsb.asm |
118 | instruction_rep_movsb.asm | blokový přenos po bajtech instrukcí MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_movsb.asm |
119 | instruction_rep_scas.asm | vyhledávání v řetězci instrukcí SCAS | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_scas.asm |
120 | vga_320×200_image_0B.asm | výsledek blokového přenosu ve chvíli, kdy je CX=0 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_0B.asm |
121 | vga_320×200_image_64kB.asm | výsledek blokového přenosu ve chvíli, kdy je CX=0×ffff | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_64kB.asm |
122 | vga_320×200_image_movsb.asm | blokový přenos v rámci obrazové paměti instrukcí REP MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb.asm |
123 | vga_320×200_image_movsw.asm | blokový přenos v rámci obrazové paměti instrukcí REP MOVSW | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsw.asm |
124 | vga_320×200_image_movsd.asm | blokový přenos v rámci obrazové paměti instrukcí REP MOVSD | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsd.asm |
125 | vga_320×200_image_movsb_forward.asm | blokový přenos překrývajících se bloků paměti (zvyšující se adresy) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_forward.asm |
126 | vga_320×200_image_movsb_backward1.asm | blokový přenos překrývajících se bloků paměti (snižující se adresy, nekorektní nastavení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_backward1.asm |
127 | vga_320×200_image_movsb_backward2.asm | blokový přenos překrývajících se bloků paměti (snižující se adresy, korektní nastavení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_backward2.asm |
20. Odkazy na Internetu
- The Intel 8088 Architecture and Instruction Set
https://people.ece.ubc.ca/~edc/464/lectures/lec4.pdf - x86 Opcode Structure and Instruction Overview
https://pnx.tf/files/x86_opcode_structure_and_instruction_overview.pdf - x86 instruction listings (Wikipedia)
https://en.wikipedia.org/wiki/X86_instruction_listings - x86 assembly language (Wikipedia)
https://en.wikipedia.org/wiki/X86_assembly_language - Intel Assembler (Cheat sheet)
http://www.jegerlehner.ch/intel/IntelCodeTable.pdf - 25 Microchips That Shook the World
https://spectrum.ieee.org/tech-history/silicon-revolution/25-microchips-that-shook-the-world - Chip Hall of Fame: MOS Technology 6502 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-mos-technology-6502-microprocessor - Chip Hall of Fame: Intel 8088 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-intel-8088-microprocessor - Jak se zrodil procesor?
https://www.root.cz/clanky/jak-se-zrodil-procesor/ - Apple II History Home
http://apple2history.org/ - The 8086/8088 Primer
https://www.stevemorse.org/8086/index.html - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - INT 21 – DOS Function Dispatcher (DOS)
https://www.stanislavs.org/helppc/int21.html - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - Bit banging
https://en.wikipedia.org/wiki/Bit_banging - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Bootloaders
https://en.wikibooks.org/wiki/X86_Assembly/Bootloaders - Počátky grafiky na PC: grafické karty CGA a Hercules
https://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/ - Co mají společného Commodore PET/4000, BBC Micro, Amstrad CPC i grafické karty MDA, CGA a Hercules?
https://www.root.cz/clanky/co-maji-spolecneho-commodore-pet-4000-bbc-micro-amstrad-cpc-i-graficke-karty-mda-cga-a-hercules/ - Karta EGA: první použitelná barevná grafika na PC
https://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/ - RGB Classic Games
https://www.classicdosgames.com/ - Turbo Assembler (Wikipedia)
https://en.wikipedia.org/wiki/Turbo_Assembler - Microsoft Macro Assembler
https://en.wikipedia.org/wiki/Microsoft_Macro_Assembler - IBM Personal Computer (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Personal_Computer - Intel 8251
https://en.wikipedia.org/wiki/Intel_8251 - Intel 8253
https://en.wikipedia.org/wiki/Intel_8253 - Intel 8255
https://en.wikipedia.org/wiki/Intel_8255 - Intel 8257
https://en.wikipedia.org/wiki/Intel_8257 - Intel 8259
https://en.wikipedia.org/wiki/Intel_8259 - Support/peripheral/other chips – 6800 family
http://www.cpu-world.com/Support/6800.html - Motorola 6845
http://en.wikipedia.org/wiki/Motorola_6845 - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - CRTC operation
http://www.6502.org/users/andre/hwinfo/crtc/crtc.html - 6845 – Motorola CRT Controller
https://stanislavs.org/helppc/6845.html - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - Motorola 6845 and bitwise graphics
https://retrocomputing.stackexchange.com/questions/10996/motorola-6845-and-bitwise-graphics - IBM Monochrome Display Adapter
http://en.wikipedia.org/wiki/Monochrome_Display_Adapter - Color Graphics Adapter
http://en.wikipedia.org/wiki/Color_Graphics_Adapter - Color Graphics Adapter and the Brown color in IBM 5153 Color Display
https://www.aceinnova.com/en/electronics/cga-and-the-brown-color-in-ibm-5153-color-display/ - The Modern Retrocomputer: An Arduino Driven 6845 CRT Controller
https://hackaday.com/2017/05/14/the-modern-retrocomputer-an-arduino-driven-6845-crt-controller/ - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - INT 21 – DOS Function Dispatcher (DOS)
https://www.stanislavs.org/helppc/int21.html - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Arithmetic
https://en.wikibooks.org/wiki/X86_Assembly/Arithmetic - Art of Assembly – Arithmetic Instructions
http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter6/CH06–2.html - ASM Flags
http://www.cavestory.org/guides/csasm/guide/asm_flags.html - Status Register
https://en.wikipedia.org/wiki/Status_register - Linux assemblers: A comparison of GAS and NASM
http://www.ibm.com/developerworks/library/l-gas-nasm/index.html - Programovani v assembleru na OS Linux
http://www.cs.vsb.cz/grygarek/asm/asmlinux.html - Is it worthwhile to learn x86 assembly language today?
https://www.quora.com/Is-it-worthwhile-to-learn-x86-assembly-language-today?share=1 - Why Learn Assembly Language?
http://www.codeproject.com/Articles/89460/Why-Learn-Assembly-Language - Is Assembly still relevant?
http://programmers.stackexchange.com/questions/95836/is-assembly-still-relevant - Why Learning Assembly Language Is Still a Good Idea
http://www.onlamp.com/pub/a/onlamp/2004/05/06/writegreatcode.html - Assembly language today
http://beust.com/weblog/2004/06/23/assembly-language-today/ - Assembler: Význam assembleru dnes
http://www.builder.cz/rubriky/assembler/vyznam-assembleru-dnes-155960cz - Programming from the Ground Up Book – Summary
http://savannah.nongnu.org/projects/pgubook/ - DOSBox
https://www.dosbox.com/ - The C Programming Language
https://en.wikipedia.org/wiki/The_C_Programming_Language - Hercules Graphics Card (HCG)
https://en.wikipedia.org/wiki/Hercules_Graphics_Card - Complete 8086 instruction set
https://content.ctcd.edu/courses/cosc2325/m22/docs/emu8086ins.pdf - Complete 8086 instruction set
https://yassinebridi.github.io/asm-docs/8086_instruction_set.html - 8088 MPH by Hornet + CRTC + DESiRE (final version)
https://www.youtube.com/watch?v=hNRO7lno_DM - Area 5150 by CRTC & Hornet (Party Version) / IBM PC+CGA Demo, Hardware Capture
https://www.youtube.com/watch?v=fWDxdoRTZPc - 80×86 Integer Instruction Set Timings (8088 – Pentium)
http://aturing.umcs.maine.edu/~meadow/courses/cos335/80×86-Integer-Instruction-Set-Clocks.pdf - Colour Graphics Adapter: Notes
https://www.seasip.info/VintagePC/cga.html - Restoring A Vintage CGA Card With Homebrew HASL
https://hackaday.com/2024/06/12/restoring-a-vintage-cga-card-with-homebrew-hasl/ - Demoing An 8088
https://hackaday.com/2015/04/10/demoing-an-8088/ - Video Memory Layouts
http://www.techhelpmanual.com/89-video_memory_layouts.html - Screen Attributes
http://www.techhelpmanual.com/87-screen_attributes.html - IBM PC Family – BIOS Video Modes
https://www.minuszerodegrees.net/video/bios_video_modes.htm - EGA Functions
https://cosmodoc.org/topics/ega-functions/#the-hierarchy-of-the-ega - Why the EGA can only use 16 of its 64 colours in 200-line modes
https://www.reenigne.org/blog/why-the-ega-can-only-use-16-of-its-64-colours-in-200-line-modes/ - How 16 colors saved PC gaming – the story of EGA graphics
https://www.custompc.com/retro-tech/ega-graphics - List of 16-bit computer color palettes
https://en.wikipedia.org/wiki/List_of16-bit_computer_color_palettes - Why were those colors chosen to be the default palette for 256-color VGA?
https://retrocomputing.stackexchange.com/questions/27994/why-were-those-colors-chosen-to-be-the-default-palette-for-256-color-vga - VGA Color Palettes
https://www.fountainware.com/EXPL/vga_color_palettes.htm - Hardware Level VGA and SVGA Video Programming Information Page
http://www.osdever.net/FreeVGA/vga/vga.htm - Hardware Level VGA and SVGA Video Programming Information Page – sequencer
http://www.osdever.net/FreeVGA/vga/seqreg.htm - VGA Basics
http://www.brackeen.com/vga/basics.html - Introduction to VGA Mode ‚X‘
https://web.archive.org/web/20160414072210/http://fly.srk.fer.hr/GDM/articles/vgamodex/vgamx1.html - VGA Mode-X
https://web.archive.org/web/20070123192523/http://www.gamedev.net/reference/articles/article356.asp - Mode-X: 256-Color VGA Magic
https://downloads.gamedev.net/pdf/gpbb/gpbb47.pdf - Instruction Format in 8086 Microprocessor
https://www.includehelp.com/embedded-system/instruction-format-in-8086-microprocessor.aspx - How to use „AND,“ „OR,“ and „XOR“ modes for VGA Drawing
https://retrocomputing.stackexchange.com/questions/21936/how-to-use-and-or-and-xor-modes-for-vga-drawing - VGA Hardware
https://wiki.osdev.org/VGA_Hardware - Programmer's Guide to Yamaha YMF 262/OPL3 FM Music Synthesizer
https://moddingwiki.shikadi.net/wiki/OPL_chip - Does anybody understand how OPL2 percussion mode works?
https://forum.vcfed.org/index.php?threads/does-anybody-understand-how-opl2-percussion-mode-works.60925/ - Yamaha YMF262 OPL3 music – MoonDriver for OPL3 DEMO [Oscilloscope View]
https://www.youtube.com/watch?v=a7I-QmrkAak - Yamaha OPL vs OPL2 vs OPL3 comparison
https://www.youtube.com/watch?v=5knetge5Gs0 - OPL3 Music Crockett's Theme
https://www.youtube.com/watch?v=HXS008pkgSQ - Bad Apple (Adlib Tracker – OPL3)
https://www.youtube.com/watch?v=2lEPH6Y3Luo - FM Synthesis Chips, Codecs and DACs
https://www.dosdays.co.uk/topics/fm_synthesizers.php - The Zen Challenge – YMF262 OPL3 Original (For an upcoming game)
https://www.youtube.com/watch?v=6JlFIFz1CFY - [adlib tracker II techno music – opl3] orbit around alpha andromedae I
https://www.youtube.com/watch?v=YqxJCu_WFuA - [adlib tracker 2 music – opl3 techno] hybridisation process on procyon-ii
https://www.youtube.com/watch?v=daSV5mN0sJ4