Obsah
1. Matematické koprocesory na platformě 80×86 prakticky
2. Rychlost matematického koprocesoru v porovnání se SW výpočty
3. Otestování, zda je matematický koprocesor nainstalován
4. Základní aritmetické operace v praxi
5. První demonstrační příklad: základní aritmetické operace
6. Operace podílu, podíl s prohozenými operandy
8. Demonstrační příklady: dělení kladnou a zápornou nulou
9. Speciální případ: výpočet 0/0
10. Další výpočty, které dokáže matematický koprocesor provádět
11. Demonstrační příklad: výpočet druhé odmocniny
12. Demonstrační příklad: výpočet druhé odmocniny ze záporné hodnoty
13. Řídicí registr matematického koprocesoru
14. Demonstrační příklad: detekce typu matematického koprocesoru
15. Stavový registr matematického koprocesoru
16. Změna ukazatele na vrchol zásobníku při manipulaci s operandy
17. Analýza obsahu stavového registru s ohledem na naplnění zásobníku
18. Pomocný program pro převod FPU hodnot do jejich hexadecimální podoby
19. Repositář s demonstračními příklady
1. Matematické koprocesory na platformě 80×86 prakticky
Na úvodní článek z minulého týdne o matematických koprocesorech na platformě IBM PC dnes navážeme. Ukážeme si totiž několik praktických příkladů, na nichž si ověříme základní funkce poskytované matematickým koprocesorem Intel 8087, včetně jeho dalších vlastností (zásobník operandů atd.). Tento čip je sice dnes již muzeálním kouskem, ovšem navazuje na něj řada čipů 80287 a 80387. Posléze se funkce poskytované těmito matematickými koprocesory staly přímo součástí hlavního mikroprocesoru a podporovány jsou dodnes (zde nemluvíme o SIMD variantách).
Interně se jedná o poměrně složitý čip, ovšem i přesto museli inženýři šetřit jak plochou čipu, tak i velikostí mikrokódu, který byl omezen na přibližně 32kB. To mj. znamenalo, že se pro výpočty transcendentních funkcí použilo relativně malé množství mikroinstrukcí (realizován byl algoritmus CORDIC) a tudíž jsou některé výpočty nepřesné, popř. navíc s omezeným definičním rozsahem. To se týká především výpočtu tangens a arkus tangens a u pozdějších čipů i výpočtu sinů a kosinů. Později byla tato omezení odstraněna a i přesnost výpočtů se zvýšila. Nicméně při použití 8087 je nutné tato omezení mít stále na paměti.
2. Rychlost matematického koprocesoru v porovnání se SW výpočty
Původní matematické koprocesory 8087 byly nabízeny ve třech variantách s frekvencemi 5MHz, 8MHz a 10MHz (a tomu odpovídala cena od zhruba 150 dolarů až 270 dolarů). U původní verze 8087 se uváděla výpočetní rychlost dosahující až 50000 FLOPS, což průměrně odpovídá 20µs pro provedení jedné operace. Ovšem musíme k tomu připočítat i instrukce nutné pro načtení a uložení hodnot do operační paměti atd. Nicméně i za těchto podmínek byla rychlost provádění výpočtů matematickým koprocesorem mnohem rychlejší, než softwarové implementace těchto výpočtů. Podívejme se na tabulku s časy provádění vybraných matematických operací (v µs), přičemž je použita frekvence hodin 5 MHz:
| Operace | Přesnost/rozsah | 8087 (FPU) | Emulace v 8086 |
|---|---|---|---|
| Součet | single i double | 17 | 1600 |
| Porovnání | single i double | 9 | 1300 |
| Součin | single | 19 | 1600 |
| Součin | double | 27 | 2100 |
| Podíl | single | 39 | 3200 |
| Načtení hodnoty (konverze) | single | 9 | 1700 |
| Uložení hodnoty (konverze) | single | 18 | 1200 |
| Druhá odmocnina | temp | 36 | 19600 |
| Tangent | temp | 90 | 13000 |
| Umocnění | 100 | 17100 |
Pro zajímavost se ještě podívejme na tabulku, která uvádí relativní rychlost operace FMUL (součin) na čipech, které následovaly po původní 8087:
| Čip | Frekvence (MHz) | Relativní zrychlení |
|---|---|---|
| 8087 | 5 | 1× |
| 8087 | 10 | 2× |
| 80287 | 12 | 2,4× |
| 80387 | 16 | 10× |
| 80387 | 32 | 20× |
| 80486/7 | 16 | 18× |
| 80486/7 | 50 | 56× |
| Cyrix 6×86 | 66 | 320× |
| Cyrix 6×86 | 300 | 1400× |
| AMD K6 | 166 | 1500× |
| AMD K6 | 550 | 5000× |
| Pentium | 60 | 1100× |
| Pentium | 300 | 5400× |
| Pentium Pro | 150 | 1400× |
| Pentium Pro | 200 | 1800× |
| Pentium II | 233 | 2100× |
| Pentium II | 1400 | 13000× |
| Athlon | 500 | 9000× |
| Athlon | 2300 | 42000× |
| Athlon 64 | 1000 | 18000× |
| Athlon 64 | 3200 | 58000× |
| Pentium 4 | 1300 | 11000× |
| Pentium 4 | 3800 | 34000× |
3. Otestování, zda je matematický koprocesor nainstalován
Jednou z prvních praktických operací je detekce, zda je matematický koprocesor vůbec nainstalován. Tato detekce vlastně není vůbec triviální. U PC XT se musel po instalaci koprocesoru ještě přehodit switch na základní desce, viz například https://www.dosdays.co.uk/topics/xt_dip_switches.php. Hodnotu tohoto přepínače bylo možné přečíst přes čip 8255 (s nímž jsme se seznámili). U PX AT a obecně u počítačů vybavených minimálně mikroprocesorem 80286, již bylo možné matematický koprocesor detekovat přečtením stavového slova MSW (machine status word), konkrétně třetího nejnižšího bitu (ten byl později zkopírován do registru CR0, kde lze ještě rozlišit mezi staršími a novějšími verzemi, později ještě přibyla instrukce CPUID). Detekci koprocesoru z obsahu MSW je možné provést následujícím způsobem:
; Otestovani, jestli je nainstalovan matematicky koprocesor.
; Kompatibilni i s cipem Intel 80286
;-----------------------------------------------------------------------------
BITS 16 ; 16bitovy vystup pro DOS
CPU 286 ; 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:
smsw ax ; prenos MSW do registru AX
test ax, 0x4 ; test tretiho nejnizsiho bitu MSW (EM)
jz fpu_present ; nulovy bit? -> 80287 je nainstalovan
print fpu_not_present_message ; nenulovy bit? -> koprocesor chybi
jmp end
fpu_present:
print fpu_present_message
end:
wait_key ; cekani na stisk klavesy
exit ; navrat do DOSu
; datova cast
fpu_present_message:
db "FP unit is present", 0x0a, 0x0d, "$"
fpu_not_present_message:
db "FP unit is NOT present", 0x0a, 0x0d, "$"
4. Základní aritmetické operace v praxi
V předchozím článku jsme se taktéž seznámili s instrukcemi matematického koprocesoru určenými pro provedení základních aritmetických operací. Tyto operace jsou prováděny s předem zvolenou přesností a vypočtené výsledky jsou zaokrouhleny předem zvoleným zaokrouhlovacím režimem (k tomu se ještě vrátíme). Připomeňme si, že se jedná o následující instrukce:
| # | Instrukce | Význam |
|---|---|---|
| 1 | FADD | součet |
| 2 | FSUB | rozdíl |
| 3 | FSUBR | rozdíl, ale operandy jsou prohozeny |
| 4 | FMUL | součin |
| 5 | FDIV | podíl |
| 6 | FDIVR | podíl, ale operandy jsou prohozeny |
U všech těchto instrukcí lze navíc specifikovat příponu P, podobně jako u FST/FSTP. Pokud je tato přípona uvedena, budou ze zásobníku tvořeném pracovními registry odstraněny oba vstupní operandy, a teprve až poté se na zásobník uloží výsledek aritmetické operace.
Způsob načtení konstant do pracovních registrů (a tím pádem i do zásobníku) matematického koprocesoru již známe, takže si nyní již můžeme ukázat, jakým způsobem se v praxi provádí základní aritmetické operace. Začneme podobně jako žáčci v první třídě – součtem dvou jedniček. To se v assembleru provede velmi jednoduše: nejdříve se na vrchol zásobníku, tj. do pracovního registru st(0), uloží první konstanta 1.0, a ve druhém kroku se na posunutý vrchol zásobníku (tj. do sousedního pracovního registru) uloží druhá konstanta 1.0. V kroku třetím se provede instrukce FADDP, která nejenže obě hodnoty uložené na vrcholu zásobníku a těsně pod ním sečte, ale navíc je ještě ze zásobníku odstraní (odstranění druhého operandu je zajištěno použitím FADDP namísto FADD).
Celý výpočet tedy může vypadat takto:
fld1 ; nacteni FP konstanty 1.0 fld1 ; nacteni FP konstanty 1.0 faddp ; soucet dvou hodnot na zasobniku fstp dword ptr number ; ulozeni do pameti (4 bajty)
Podívejme se nyní na součet tří hodnot, resp. na jednu z možností, jak tento výpočet naprogramovat. Zde můžeme postupovat několika způsoby, z nichž nejjednodušší způsob spočívá v uložení všech tří hodnot na zásobník s následným použitím dvojice instrukcí FADDP. První instrukce sečte poslední dvě hodnoty uložené na zásobníku, takže jeho nový obsah bude [1.0, 2.0], druhá instrukce pak sečte 1.0+2.0 s uložením celkového výsledku zpět:
fld1 ; nacteni FP konstanty 1.0 fld1 ; nacteni FP konstanty 1.0 fld1 ; nacteni FP konstanty 1.0 faddp ; soucet poslednich dvou hodnot, ulozeni vysledku zpet na zasobnik faddp ; soucet vsech tri hodnot (1.0+(1.0+1.0)) fstp dword ptr number ; ulozeni do pameti (4 bajty)
V případě, že budeme chtít vynásobit hodnoty 2.0 a 3.0, můžeme oba výpočty spojit dohromady a díky tomu, že zásobník má kapacitu pro osm hodnot, vyhneme se jakýmkoli přesunům dat mezi zásobníkem a operační pamětí (což jsou poměrně pomalé operace, které navíc vyžadují pozastavení mikroprocesoru 8088/8086):
fld1 ; nacteni FP konstanty 1.0
fld1 ; nacteni FP konstanty 1.0
faddp ; soucet obou hodnot (1.0+1.0)
; nyni je na zasobniku ulozena hodnota 2
fld1 ; nacteni FP konstanty 1.0
fld1 ; nacteni FP konstanty 1.0
fld1 ; nacteni FP konstanty 1.0
faddp ; soucet poslednich dvou hodnot, ulozeni vysledku zpet na zasobnik
faddp ; soucet vsech tri hodnot (1.0+(1.0+1.0))
; vysledek 3.0 je ulozen zpet na zasobnik
fmulp ; nyni jsou na zasobniku ulozeny hodnoty 2 a 3 ktere vynasobime
fstp dword ptr number ; ulozeni do pameti (4 bajty)
5. První demonstrační příklad: základní aritmetické operace
V dnešním prvním demonstračním příkladu je ukázán způsob práce se zásobníkem tvořeným osmi pracovními registry matematického koprocesoru. Nejprve jsou na zásobník uloženy dvě konstanty 1.0 a následně je proveden součet těchto dvou hodnot s vytištěním výsledku této operace. Dále se provádí dvě po sobě jdoucí operace součtu se třemi hodnotami uloženými na zásobníku. A konečně se v poslední části připraví hodnoty 2.0 a 3.0 kombinacemi instrukcí fld1 a faddp. Tyto hodnoty se následně vynásobí operací fmulp a výsledek se opět vytiskne na obrazovku MS DOSu:
1.0+1.0: Hex value: 0x40000000 1.0+1.0+1.0: Hex value: 0x40400000 2.0*3.0: Hex value: 0x40C00000
Zdrojový kód tohoto demonstračního příkladu vypadá následovně:
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
fld1 ; nacteni FP konstanty 1.0
fld1 ; nacteni FP konstanty 1.0
faddp ; soucet dvou hodnot na zasobniku
print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
fld1 ; nacteni FP konstanty 1.0
fld1 ; nacteni FP konstanty 1.0
fld1 ; nacteni FP konstanty 1.0
faddp ; soucet dvou hodnot na zasobniku
faddp ; soucet dvou hodnot na zasobniku
print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
fld1 ; nacteni FP konstanty 1.0
fld1 ; nacteni FP konstanty 1.0
faddp ; soucet dvou hodnot na zasobniku
fld1 ; nacteni FP konstanty 1.0
fld1 ; nacteni FP konstanty 1.0
fld1 ; nacteni FP konstanty 1.0
faddp ; soucet dvou hodnot na zasobniku
faddp ; soucet dvou hodnot na zasobniku
fmulp ; nyni jsou na zasobniku ulozeny hodnoty 2 a 3 ktere vynasobime
print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
wait_key ; cekani na klavesu
exit ; navrat do DOSu
Zajímavé bude zjistit, jak se jednotlivé instrukce matematického koprocesoru přeložily do strojového kódu:
18 main:
19 0000005E D9E8 fld1 ; nacteni FP konstanty 1.0
20 00000060 D9E8 fld1 ; nacteni FP konstanty 1.0
21 00000062 DEC1 faddp ; soucet dvou hodnot na zasobniku
23
24 00000081 D9E8 fld1 ; nacteni FP konstanty 1.0
25 00000083 D9E8 fld1 ; nacteni FP konstanty 1.0
26 00000085 D9E8 fld1 ; nacteni FP konstanty 1.0
27 00000087 DEC1 faddp ; soucet dvou hodnot na zasobniku
28 00000089 DEC1 faddp ; soucet dvou hodnot na zasobniku
30
31 000000A8 D9E8 fld1 ; nacteni FP konstanty 1.0
32 000000AA D9E8 fld1 ; nacteni FP konstanty 1.0
33 000000AC DEC1 faddp ; soucet dvou hodnot na zasobniku
34
35 000000AE D9E8 fld1 ; nacteni FP konstanty 1.0
36 000000B0 D9E8 fld1 ; nacteni FP konstanty 1.0
37 000000B2 D9E8 fld1 ; nacteni FP konstanty 1.0
38 000000B4 DEC1 faddp ; soucet dvou hodnot na zasobniku
39 000000B6 DEC1 faddp ; soucet dvou hodnot na zasobniku
40
41 000000B8 DEC9 fmulp ; nyni jsou na zasobniku ulozeny hodnoty 2 a 3 ktere vynasobime
6. Operace podílu, podíl s prohozenými operandy
V předchozím demonstračním příkladu jsme si mj. ukázali instrukci FMUL, resp. FMULP sloužící k vynásobení obou vstupních operandů. Dá se tedy předpokládat, že bude existovat i opačná instrukce určená pro dělení operandů. Taková instrukce skutečně existuje a její varianty se jmenují FDIV a FDIVP. Samotné dělení je prováděno obvyklým způsobem, jen si musíme dát pozor na pořadí operandů na zásobníku. Nejdříve provedeme dělení ve chvíli, kdy na vrcholu zásobníku je uložena hodnota 2.0 a pod vrcholem hodnota 1.0:
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
fld1 ; nacteni FP konstanty 1.0
fld1 ; nacteni FP konstanty 1.0
fld1 ; nacteni FP konstanty 1.0
faddp ; součet, takže na zásobníku budou konstanty 1.0 a 2.0
fdivp ; vypocet podilu
print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
wait_key ; cekani na klavesu
exit ; navrat do DOSu
Výsledkem bude hodnota 0×3f000000 odpovídající 1/2 neboli 0.5.
Způsob zakódování instrukcí ve strojovém kódu:
18 main:
19 0000005E D9E8 fld1 ; nacteni FP konstanty 1.0
20 00000060 D9E8 fld1 ; nacteni FP konstanty 1.0
21 00000062 D9E8 fld1 ; nacteni FP konstanty 1.0
22 00000064 DEC1 faddp ; součet, takže na zásobníku budou konstanty 1.0 a 2.0
23 00000066 DEF9 fdivp ; vypocet podilu
Instrukce FDIVR resp. FDIVRP taktéž provádí výpočet podílu, ovšem operandy jsou prohozeny. Pokusme se tedy použít tuto instrukci v situaci, kdy zásobník obsahuje naprosto stejné hodnoty, jako příklad předchozí:
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
fld1 ; nacteni FP konstanty 1.0
fld1 ; nacteni FP konstanty 1.0
fld1 ; nacteni FP konstanty 1.0
faddp ; součet, takže na zásobníku budou konstanty 1.0 a 2.0
fdivrp ; vypocet podilu
print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
wait_key ; cekani na klavesu
exit ; navrat do DOSu
Výsledkem bude hodnota 0×40000000, která skutečně odpovídá 2.0.
Způsob zakódování instrukcí ve strojovém kódu:
19 main:
20 0000005E D9E8 fld1 ; nacteni FP konstanty 1.0
21 00000060 D9E8 fld1 ; nacteni FP konstanty 1.0
22 00000062 D9E8 fld1 ; nacteni FP konstanty 1.0
23 00000064 DEC1 faddp ; součet, takže na zásobníku budou konstanty 1.0 a 2.0
24 00000066 DEF1 fdivrp ; vypocet podilu
7. Dělení nulou
Zaměřme se nyní na to, co se stane v případě, že se provádí dělení nulou. Navíc je nutné připomenout, že ve formátech single i double (a pochopitelně i extended) je znaménko reprezentováno samostatným bitem, což mj. znamená, že existuje kladná a záporná nula.
Dělení kladnou nulou je jednoduché a lze ho realizovat například takto:
fld1 ; nacteni FP konstanty 1.0 fldz ; nacteni FP konstanty 0.0 fdivp ; vypocet podilu print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
Nulou pochopitelně můžeme dělit i zápornou hodnotu, například –1.0. To lze opět realizovat velmi snadno, bez nutnosti načítání konstant z operační paměti:
fld1 ; nacteni FP konstanty 1.0 fchs ; zmena znamenka fldz ; nacteni FP konstanty 0.0 fdivp ; vypocet podilu print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
Dělení zápornou nulou (tedy skutečně hodnotou –0.0) vyžaduje taktéž použití instrukce FCHS, která otočí znaménko svého operandu (zde konkrétně oné nuly):
fld1 ; nacteni FP konstanty 1.0 fldz ; nacteni FP konstanty 0.0 fchs ; zmena znamenka fdivp ; vypocet podilu print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
8. Demonstrační příklady: dělení kladnou a zápornou nulou
Různé varianty dělení nulou si nyní otestujeme prakticky. Nejdříve je ukázán demonstrační příklad, který provede výpočet 1.0/0.0:
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
fld1 ; nacteni FP konstanty 1.0
fldz ; nacteni FP konstanty 0.0
fdivp ; vypocet podilu
print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
wait_key ; cekani na klavesu
exit ; navrat do DOSu
Výsledkem je hodnota 0×7f800000, což odpovídá kladnému nekonečnu.
| Hexa | Binárně | s | Exponent | Mantisa |
|---|---|---|---|---|
| 0×7F800000 | 01111111100000000000000000000000 | + | 255 (spec) | 0 |
| 0×FF800000 | 11111111100000000000000000000000 | – | 255 (spec) | 0 |
Ve druhém příkladu je proveden výpočet –1.0/0.0, tj. dělíme zápornou hodnotu kladnou nulou:
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
fld1 ; nacteni FP konstanty 1.0
fchs ; zmena znamenka
fldz ; nacteni FP konstanty 0.0
fdivp ; vypocet podilu
print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
wait_key ; cekani na klavesu
exit ; navrat do DOSu
Výsledkem je v tomto případě hodnota 0×ff800000, což odpovídá zápornému nekonečnu (znaménko je uloženo v nejvyšším bitu).
Oba výsledky se tedy od sebe liší jen nejvyšším bitem, což je znaménko. Dále následuje osm bitů exponentu. Tyto bity jsou v obou případech nastaveny na samé jedničky, samotný exponent je pak nulový. To odpovídá tabulce speciálních hodnot, s níž jsme se seznámili minule:
| s-bit | exponent | mantisa | význam | šestnáctkově |
|---|---|---|---|---|
| 0 | 255 | 0 | kladné nekonečno | 0×7F800000 |
| 1 | 255 | 0 | záporné nekonečno | 0×FF800000 |
A konečně provedeme výpočet 1.0/-0.0, tj. podíl kladné hodnoty a záporné nuly:
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
fld1 ; nacteni FP konstanty 1.0
fldz ; nacteni FP konstanty 0.0
fchs ; zmena znamenka
fdivp ; vypocet podilu
print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
wait_key ; cekani na klavesu
exit ; navrat do DOSu
Výsledek je totožný s předchozím příkladem.
Pro úplnost si ještě ukážeme překlad instrukcí matematického koprocesoru z prvního příkladu do strojového kódu:
18 main:
19 0000005E D9E8 fld1 ; nacteni FP konstanty 1.0
20 00000060 D9EE fldz ; nacteni FP konstanty 0.0
21 00000062 DEF9 fdivp ; vypocet podilu
9. Speciální případ: výpočet 0/0
Ještě jsme si však nevyzkoušeli další speciální případ – dělení 0/0. I to lze realizovat velmi snadno následujícími třemi instrukcemi:
fldz ; nacteni FP konstanty 0.0 fldz ; nacteni FP konstanty 0.0 fdivp ; vypocet 0.0/0.0
Výsledkem bude hodnota:
0/0: Hex value: 0xFFC00000
Po převodu na binární tvar a rozdělení bitových polí:
| Hexa | Binárně | s | Exponent | Mantisa |
|---|---|---|---|---|
| 0×FFC00000 | 11111111110000000000000000000000 | + | 255 (spec) | dva nejvyšší bity jednička |
Opět nahlédněme do tabulky zveřejněné minule, abychom zjistili, co tato hodnota znamená:
| s-bit | exponent | mantisa | význam |
|---|---|---|---|
| 0 | 255 | >0 | NaN – not a number |
| 1 | 255 | >0 | NaN – not a number |
Vidíme, že vydělením nuly nulou (ať již kladnou či zápornou) získáme speciální hodnotu NaN. Většina dalších instrukcí sice NaN může akceptovat, ale výsledkem operace bude opět NaN, na což je zapotřebí dávat při programování (nejenom v assembleru) pozor.
Úplný zdrojový kód příkladu, který toto dělení provede, vypadá následovně:
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
fldz ; nacteni FP konstanty 0.0
fldz ; nacteni FP konstanty 0.0
fdivp ; vypocet podilu
print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
wait_key ; cekani na klavesu
exit ; navrat do DOSu
10. Další výpočty, které dokáže matematický koprocesor provádět
Matematický koprocesor 8087 dokáže kromě aritmetických operací provádět i některé další výpočty. Pokud se zaměříme na výpočty prováděné s hodnotami s plovoucí řádovou čárkou, bude se jednat o následující instrukce:
| # | Instrukce | Význam |
|---|---|---|
| 1 | FABS | výpočet absolutní hodnoty |
| 2 | FSQRT | výpočet druhé odmocniny |
| 3 | FPREM | výpočet modulo |
| 4 | FPTAN | tangens pro úhel v rozmezí ± π/4 |
| 5 | FPATAN | arkus tangens |
| 6 | FSCALE | násobení či dělení mocninou 2 |
| 7 | F2XM1 | 2x-1 |
| 8 | FYL2X | y log2x |
| 9 | FYL2XP1 | y log2(x+1) |
Navíc jsou k dispozici i celočíselné operace, které lze poznat podle toho, že začínají prefixem FI. Jejich praktické použití bude ukázáno příště:
| # | Instrukce | Význam |
|---|---|---|
| 1 | FIADD | součet |
| 2 | FISUB | rozdíl |
| 3 | FISUBR | rozdíl s prohozenými operandy |
| 4 | FIMUL | součin |
| 5 | FIDIV | podíl |
| 6 | FIDIVR | podíl s prohozenými operandy |
| 7 | FRNDINT | převod FP hodnoty na celé číslo |
FPTAN FMUL ST(0) ; druhá mocnina FLD1 FADDP ; přičíst jedničku FSQRT ; výsledek odmocnit FLD1 FDIVP ; převrácená hodnota mezivýsledku
11. Demonstrační příklad: výpočet druhé odmocniny
Pro mnoho praktických algoritmů je důležité umět vypočítat druhou odmocninu nějaké hodnoty. Pro tento účel slouží instrukce nazvaná FSQRT, kterou si nyní otestujeme. V dalším demonstračním příkladu se pokusíme o výpočet druhé odmocniny (kladné) nuly, jedničky a taktéž dvojky:
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
fldz ; nacteni FP konstanty 0.0
fsqrt ; vypocet druhe odmocniny
print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
fld1 ; nacteni FP konstanty 1.0
fsqrt ; vypocet druhe odmocniny
print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
fld1 ; nacteni FP konstanty 1.0
fld1 ; nacteni FP konstanty 1.0
faddp ; soucet -> na zasobnik se ulozi hodnota 2.0
fsqrt ; vypocet druhe odmocniny
print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
wait_key ; cekani na klavesu
exit ; navrat do DOSu
Po překladu a spuštění tohoto příkladu se zobrazí trojice hexadecimálních hodnot, které si převedeme na desítkové hodnoty s desetinnou čárkou:
00000000 = 0,0 3fb00000 = 1,0 3fb504f3 = 1,4142135
A pro úplnost si ukažme, jak se instrukce FSQRT přeložila do strojového kódu společně s dalšími instrukcemi matematického koprocesoru:
13 main:
14 0000005E D9EE fldz ; nacteni FP konstanty 0.0
15 00000060 D9FA fsqrt ; vypocet druhe odmocniny
16 print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
17
18 0000007F D9E8 fld1 ; nacteni FP konstanty 1.0
19 00000081 D9FA fsqrt ; vypocet druhe odmocniny
20 print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
21
22 000000A0 D9E8 fld1 ; nacteni FP konstanty 1.0
23 000000A2 D9E8 fld1 ; nacteni FP konstanty 1.0
24 000000A4 DEC1 faddp ; soucet -> na zasobnik se ulozi hodnota 2.0
25 000000A6 D9FA fsqrt ; vypocet druhe odmocniny
26 print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
27
28 wait_key ; cekani na klavesu
29 exit ; navrat do DOSu
12. Demonstrační příklad: výpočet druhé odmocniny ze záporné hodnoty
V oboru reálných hodnot není možné vypočítat druhou odmocninu ze záporné hodnoty. Jak se tedy zachová matematický koprocesor v případě, že se o takový výpočet pokusíme? Můžeme si to velmi snadno otestovat, a to pokusem a výpočet druhé odmocniny z hodnoty –1 (kterou snadno získáme kombinací instrukcí FLD1 a FCHS:
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
fld1 ; nacteni FP konstanty 1.0
fchs ; zmena znamenka
fsqrt ; vypocet druhe odmocniny
print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
wait_key ; cekani na klavesu
exit ; navrat do DOSu
Výsledkem je hexadecimální 32bitová hodnota ffc00000, což odpovídá speciální hodnotě Not A Number. Jedná se v tomto případě o očekávaný výsledek.
Opět se pro úplnost podívejme na způsob překladu tohoto demonstračního příkladu (resp. jeho FPU instrukcí) do strojového kódu:
13 main:
14 0000005E D9E8 fld1 ; nacteni FP konstanty 1.0
15 00000060 D9E0 fchs ; zmena znamenka
16 00000062 D9FA fsqrt ; vypocet druhe odmocniny
17 print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
18
19 wait_key ; cekani na klavesu
20 exit ; navrat do DOSu
13. Řídicí registr matematického koprocesoru
Mikroprocesor 8087 byl konfigurován přes řídicí registr nazývaný většinou jen CW. Jednalo se o šestnáctibitový registr, který měl následující strukturu:
| # | Označení | Význam |
|---|---|---|
| 0 | IM | maska výjimky Invalid Operation |
| 1 | DM | maska výjimky Denormalized Operand |
| 2 | ZM | maska výjimky Zero Divide |
| 3 | OM | maska výjimky Overflow |
| 4 | UM | maska výjimky Underflow |
| 5 | PM | maska výjimky Precision |
| 6 | × | |
| 7 | IE | povolení přerušení (dnes nevyužito) |
| 8 | PC1 | volba přesnosti výpočtů (viz tabulku níže) |
| 9 | PC2 | -//- |
| 10 | RC1 | volba zaokrouhlovacího režimu (viz tabulku níže) |
| 11 | RC2 | -//- |
| 12 | IC | dnes nepoužito, pro kompatibilitu s 80287 |
| 13 | × | |
| 14 | × | |
| 15 | × |
Pro čtení obsahu tohoto registru se používá instrukce FNSTCW a pro jeho načtení instrukce FLDCW. Obsah registru se přitom ukládá (či načítá) do operační paměti, nikoli do registrů hlavního mikroprocesoru. My tento registr použijeme příště při popisu zaokrouhlovacích režimů.
14. Demonstrační příklad: detekce typu matematického koprocesoru
Řídicí registr matematického koprocesoru lze využít v těch případech, kdy potřebujeme detekovat jeho konkrétní typ. Takový test je většinou nutné provést ještě předtím, než lze zavolat ty instrukce, které byly přidány až do čipu 80387 (SINCOS apod.). K rozlišení typů koprocesorů se využívá faktu, že novější čipy nenastavují ve výchozím stavu bit IE, takže ihned po inicializaci koprocesoru instrukcí FNINIT a po přečtení stavového registru je možné rozlišit hodnoty 0×03ff (původní čipy Intel 8087) od 0×037f (novější čipy). Nejedná se sice o ideální řešení, ale taková je prostě platforma IBM PC bez ústředních „registrů“ s konkrétní konfigurací počítače:
; Otestovani, jestli je k dispozici matematický koprocesor a jakeho je typu.
;-----------------------------------------------------------------------------
BITS 16 ; 16bitovy vystup pro DOS
;-----------------------------------------------------------------------------
; 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:
jmp main ; skok na zacatek kodu
main:
fninit
mov cx, 100 ; nechame koprocesor "vydechnout"
.wait:
loop .wait
fnstcw word [test_word] ; ulozeni ridiciho slova
cmp word [test_word], 0x03FF ; vychozi bitova pole ukladana cipem 8087
je fpu_8087_present
cmp word [test_word], 0x037F ; vychozi bitova pole ukladana cipem 80287 a vyssim
je fpu_present
print fpu_not_present_message
jmp end
fpu_8087_present:
print fpu_8087_present_message
jmp end
fpu_present:
print fpu_present_message
end:
wait_key ; cekani na stisk klavesy
exit ; navrat do DOSu
; datova cast
test_word: dw 0
fpu_8087_present_message:
db "Math coprocessor 8087 is present", 0x0a, 0x0d, "$"
fpu_present_message:
db "Math coprocessor >8087 is present", 0x0a, 0x0d, "$"
fpu_not_present_message:
db "Math coprocessor is NOT present", 0x0a, 0x0d, "$"
15. Stavový registr matematického koprocesoru
Jednotlivé matematické operace prováděné matematickým koprocesorem nastavují bity v takzvaném stavovém registru (status register), o němž jsme se již zmínili minule. Tento registr má šířku šestnácti bitů a jeho struktura vypadá následovně:
| # | Označení | Význam |
|---|---|---|
| 0 | IE | výjimka Invalid Operation |
| 1 | DE | výjimka Denormalized Operand |
| 2 | ZO | výjimka Zero Divide |
| 3 | OE | výjimka Overflow |
| 4 | UE | výjimka Underflow |
| 5 | PE | výjimka Precision |
| 6 | SF | špatná manipulace se zásobníkem operandů |
| 7 | ES | Error summary |
| 8 | C0 | výsledek porovnání (příznakový bit) |
| 9 | C1 | výsledek porovnání (příznakový bit) |
| 10 | C2 | výsledek porovnání (příznakový bit) |
| 11 | ST0 | ukazatel vrcholu zásobníku |
| 12 | ST1 | ukazatel vrcholu zásobníku |
| 13 | ST2 | ukazatel vrcholu zásobníku |
| 14 | C3 | výsledek porovnání (příznakový bit) |
| 15 | B | busy bit (provádí se operace) |
Samotné přečtení a zobrazení stavového slova (registru) matematického koprocesoru je snadné. Opět zde ovšem musíme data mezi koprocesorem a hlavním procesorem přenášet přes operační paměť; v našem ukázkovém příkladu konkrétně přes dvojici bajtů umístěných na adrese test_word:
; Precteni stavoveho slova matematickeho koprocesoru
;-----------------------------------------------------------------------------
BITS 16 ; 16bitovy vystup pro DOS
;-----------------------------------------------------------------------------
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
fninit ; inicializace koprocesoru
fnstsw word [test_word] ; ulozeni stavoveho slova
mov ax, word [test_word]
print_hex_16 ax ; tisk stavoveho slova v hexadecimalnim formatu
wait_key ; cekani na klavesu
exit ; navrat do DOSu
;-----------------------------------------------------------------------------
; datova cast
test_word: dw 0
Ihned po inicializaci matematického koprocesoru by se měla vypsat tato hodnota:
0000
To znamená, že prozatím nedošlo k žádné výjimce, nedošlo k porovnání operandů, zásobník je prázdný a neprovádí se žádná operace.
16. Změna ukazatele na vrchol zásobníku při manipulaci s operandy
Zásobník operandů, který je realizován osmi pracovními registry matematického koprocesoru, má uložen index svého vrcholu (TOS – Top Of Stack) ve stavovém registru matematického koprocesoru. Konkrétně se jedná o bity ST0, ST1 a ST2, které se mění při ukládání operandů na zásobník a samozřejmě i při jejich vyjímání ze zásobníku. Počáteční index TOS je nastaven na nulu a roste směrem dolů (ovšem musíme mít na paměti, že se nehlídá přetečení ani podtečení, jedná se vlastně o kombinaci kruhové fronty a zásobníku – tedy „kruhový zásobník“?).
V následujícím demonstračním příkladu jsou na zásobník ukládány operandy, popř. jsou naopak operandy vyjímány (při operaci součtu). Mezitím si vždy necháme vypsat obsah stavového registru matematického koprocesoru, abychom zjistili, jak se mění obsah registrů ST0, ST1 a ST2:
; Precteni stavoveho slova matematickeho koprocesoru
; Změna obsazení zásobníku: vliv na obsah stavového slova
;-----------------------------------------------------------------------------
BITS 16 ; 16bitovy vystup pro DOS
;-----------------------------------------------------------------------------
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
fninit ; inicializace koprocesoru
call print_status_word ; tisk stavového slova
fldz ; uložení hodnoty na zásobník
call print_status_word ; tisk stavového slova
fldz ; uložení druhé hodnoty na zásobník
call print_status_word ; tisk stavového slova
fldz ; uložení třetí hodnoty na zásobník
call print_status_word ; tisk stavového slova
faddp ; výpočet s odstraněním původní hodnoty
call print_status_word ; tisk stavového slova
faddp ; výpočet s odstraněním původní hodnoty
call print_status_word ; tisk stavového slova
faddp ; výpočet s odstraněním původní hodnoty
call print_status_word ; tisk stavového slova
faddp ; nyní by měl zásobník "podtéct"
call print_status_word ; tisk stavového slova
wait_key ; cekani na klavesu
exit ; navrat do DOSu
;-----------------------------------------------------------------------------
print_status_word:
fnstsw word [test_word] ; ulozeni stavoveho slova
mov ax, word [test_word]
print_hex_16 ax ; tisk stavoveho slova v hexadecimalnim formatu
ret
; datova cast
test_word: dw 0
17. Analýza obsahu stavového registru s ohledem na naplnění zásobníku
Podívejme se nyní na zobrazené hodnoty stavového registru i na jejich význam:
| Stavový registr | ST2 ST1 ST0 | Index vrcholu zásobníku | Stručný popis |
|---|---|---|---|
| 0×0000 | 0 0 0 | 0 | zásobník je prázdný |
| 0×3800 | 1 1 1 | 7 | jedna pozice obsazena |
| 0×3000 | 1 1 0 | 6 | dvě pozice obsazeny |
| 0×2800 | 1 0 1 | 5 | tři pozice obsazeny |
| 0×3000 | 1 1 0 | 6 | po první operaci FADD jsou obsazeny jen dvě pozice |
| 0×3800 | 1 1 1 | 7 | po druhé operaci FADD je obsazena jedna pozice |
| 0×0000 | 0 0 0 | 0 | po třetí operaci FADD je zásobník prázdný |
| 0×0800 | 0 0 1 | 1 | po čtvrté operaci FADD došlo k podtečení zásobníku |
Na index vrcholu zásobníku se můžeme dívat jako na revolver s kapacitou osmi ran. Při nabíjení se otáčí doleva (0–7–6–5-…), při střílení doprava. Současně se „posouvají“ i indexy pracovních registrů, což může být matoucí. Z tohoto důvodu programátoři buď používají matematický koprocesor tak, jakoby se jednalo o čistý zásobník, nebo naopak jakoby se jednalo o čip s osmi nezávislými registry (osobně jsem se to snažil kombinovat, ovšem bez zakreslení přesných stavů registrů je to složité).
18. Pomocný program pro převod FPU hodnot do jejich hexadecimální podoby
Hodnoty s plovoucí řádovou čárkou samozřejmě není nutné převádět do jejich bitové či hexadecimální podoby ručně. Pro zpětný převod FP hodnot, tedy hodnot reprezentovaných v systému plovoucí řádové čárky do hexadecimální 32bitové reprezentace je možné použít i následující jednoduchý program napsaný v céčku. Pokud při spuštění programu specifikujete na příkazové řádce FP hodnotu, například 0.5, vypíše se ihned její obraz v paměti, tj. to, jak je číslo interně reprezentováno (logiku programu lze v případě potřeby jednoduše i obrátit tak, aby převádět hexadecimální reprezentaci na FP hodnotu):
#include <stdio.h>
#include <stdlib.h>
union {
float flt;
int hex;
} float_hex;
int main(int argc, char **argv)
{
if (argc == 2) {
float_hex.flt = atof(argv[1]);
printf("%08x\n", float_hex.hex);
}
return 0;
}
Funkci tohoto prográmku si můžeme jednoduše odzkoušet:
gcc -o fp2hex fp2hex.c ./fp2hex 0 00000000 ./fp2hex 1 3f800000 ./fp2hex -1 bf800000 ./fp2hex 3.14 40490fdb
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 |
| 128 | sound_bell.asm | přehrání zvuku pomocí tisku ASCII znaku BELL | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_bell.asm |
| 129 | sound_beep.asm | přehrání zvuku o zadané frekvenci na PC Speakeru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_beep.asm |
| 130 | sound_play_pitch.asm | přehrání zvuku o zadané frekvenci na PC Speakeru, použití maker | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_play_pitch.asm |
| 131 | sound_opl2_basic.asm | přehrání komorního A na OPL2 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_basic.asm |
| 132 | sound_opl2_table.asm | přehrání komorního A na OPL2, použití tabulky s hodnotami registrů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_table.asm |
| 133 | sound_opl2_table2.asm | přepis tabulky s obsahy registrů pro přehrání komorního A | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_table2.asm |
| 134 | sound_key_on.asm | přímé ovládání bitu KEY ON mezerníkem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_key_on.asm |
| 135 | sound_adsr.asm | nastavení obálky pro tón přehrávaný prvním kanálem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_adsr.asm |
| 136 | sound_modulation.asm | řízení frekvence modulátoru klávesami 1 a 0 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_modulation.asm |
| 137 | keyboard_basic.asm | přímá práce s klávesnicí IBM PC | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/keyboard_basic.asm |
| 138 | sound_stereo_opl2.asm | stereo zvuk v konfiguraci DualOPL2 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_stereo_opl2.asm |
| 139 | sound_opl2_multichannel.asm | vícekanálový zvuk na OPL2 (klávesy), delší varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_multichannel.asm |
| 140 | sound_opl2_multichannel2.asm | vícekanálový zvuk na OPL2 (klávesy), kratší varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_multichannel2.asm |
| 141 | sound_opl3_stereo1.asm | stereo výstup na OPL3 (v kompatibilním režimu) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_stereo1.asm |
| 142 | sound_opl3_stereo2.asm | stereo výstup na OPL3 (v režimu OPL3) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_stereo2.asm |
| 143 | sound_opl3_multichannel.asm | vícekanálový zvuk na OPL3 (klávesy) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_multichannel.asm |
| 144 | sound_opl3_waveform1.asm | interaktivní modifikace tvaru vlny u prvního operátoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform1.asm |
| 145 | sound_opl3_waveform2.asm | oprava chyby: povolení režimu kompatibilního s OPL3 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform2.asm |
| 146 | sound_opl3_waveform3.asm | vliv tvaru vln na zvukový kanál s FM syntézou | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform3.asm |
| 147 | sound_opl3_waveform4.asm | modifikace tvaru vlny nosné vlny i modulátoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform4.asm |
| 148 | sound_opl3_4operators1.asm | výběr AM/FM režimu ve čtyřoperátorovém nastavení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_4operators1.asm |
| 149 | sound_opl3_4operators2.asm | výběr AM/FM režimu ve čtyřoperátorovém nastavení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_4operators2.asm |
| 150 | timer_basic.asm | základní obsluha přerušení od časovače/čítače | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_basic.asm |
| 151 | timer_restore.asm | obnovení původní obsluhy přerušení při ukončování aplikace | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_restore.asm |
| 152 | timer_restore_better_structure.asm | refaktoring předchozího demonstračního příkladu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_restore_better_structure.asm |
| 153 | timer_faster_clock.asm | zrychlení čítače na 100 přerušení za sekundu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_faster_clock.asm |
| 154 | instruction_push_imm.asm | instrukce PUSH s konstantou | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_push_imm.asm |
| 155 | instruction_imul_imm.asm | instrukce IMUL s konstantou | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_imul_imm.asm |
| 156 | instruction_into1.asm | instrukce INTO s obsluhou přerušení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_into1.asm |
| 157 | instruction_into2.asm | instrukce INTO s obsluhou přerušení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_into2.asm |
| 158 | instruction_bound1.asm | instrukce BOUND s obsluhou přerušení (nekorektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bound1.asm |
| 159 | instruction_bound2.asm | instrukce BOUND s obsluhou přerušení (korektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bound2.asm |
| 160 | vga_320×200_putpixel286.asm | instrukce bitového posunu s konstantou větší než 1 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel286.asm |
| 161 | instruction_push_pop.asm | instrukce PUSH a POP se všemi pracovními registry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_push_pop.asm |
| 162 | instruction_push_pop_B.asm | instrukce s novými segmentovými registry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_push_pop_B.asm |
| 163 | instruction_near_jz_jmp.asm | blízké skoky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_near_jz_jmp.asm |
| 164 | instruction_bsf.asm | nová instrukce BSF | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bsf.asm |
| 165 | instruction_bsr.asm | nová instrukce BSR | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bsr.asm |
| 166 | instruction_add_32bit.asm | 32bitový součet | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_add_32bit.asm |
| 167 | instruction_inc_32bit.asm | 32bitová instrukce INC v šestnáctibitovém režimu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_inc_32bit.asm |
| 168 | instruction_inc_32bit_B.asm | 32bitová instrukce INC v 32bitovém režimu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_inc_32bit_B.asm |
| 169 | ems_status.asm | zjištění stavu (emulace) paměti EMS | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ems_status.asm |
| 170 | ems_total_mem.asm | získání celkové kapacity paměti EMS v blocích | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ems_total_mem.asm |
| 171 | ems_free_mem.asm | získání volné kapacity paměti EMS v blocích | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ems_free_mem.asm |
| 172 | xms_free_mem.asm | získání volné kapacity paměti XMS v blocích | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/xms_free_mem.asm |
| 173 | vga_320×200_short_address1.asm | blokový přenos provedený v rámci prostoru segmentu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address1.asm |
| 174 | vga_320×200_short_address2.asm | rozepsaný blokový přenos provedený v rámci prostoru segmentu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address2.asm |
| 175 | vga_320×200_short_address3.asm | přenos nelze provést přes hranici offsetu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address3.asm |
| 176 | vga_320×200_short_address4.asm | přenos nelze provést přes hranici offsetu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address4.asm |
| 177 | vga_320×200_long_address1.asm | 32bitový blokový přenos | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address1.asm |
| 178 | vga_320×200_long_address2.asm | rozepsaný 32bitový blokový přenos provedený v rámci prostoru segmentu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address2.asm |
| 179 | vga_320×200_long_address3.asm | přístup do obrazové paměti přes segment 0×0000 a 32bitový offset | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address3.asm |
| 180 | vga_320×200_long_address4.asm | otestování, jak lze přenášet data s využitím 32bitového offsetu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address4.asm |
| 181 | print_msw.asm | přečtení a zobrazení obsahu speciálního registru MSW | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/print_msw.asm |
| 182 | print_cr0.asm | přečtení a zobrazení obsahu speciálního registru CR0 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/print_cr0.asm |
| 183 | prot_mode286.asm | přechod do chráněného režimu na čipech Intel 80286 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode286.asm |
| 184 | prot_mode386.asm | přechod do chráněného režimu na čipech Intel 80386 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode386.asm |
| 185 | prot_mode_back_to_real_mode286.asm | přechod mezi reálným režimem a chráněným režimem i zpět na čipech Intel 80286 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode_back_to_real_mode286.asm |
| 186 | prot_mode_back_to_real_mode386.asm | přechod mezi reálným režimem a chráněným režimem i zpět na čipech Intel 80386 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode_back_to_real_mode386.asm |
| 187 | prot_mode_check.asm | test, zda se mikroprocesor již nachází v chráněném režimu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode_check.asm |
| 188 | unreal_mode.asm | nastavení nereálného režimu (platné pro Intel 80386) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/unreal_mode.asm |
| 189 | float32_constants.asm | vytištění základních FP konstant typu single | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/float32_constants.asm |
| 190 | float64_constants.asm | vytištění základních FP konstant typu double | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/float64_constants.asm |
| 191 | fpu_arithmetic.asm | základní aritmetické operace prováděné matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_arithmetic.asm |
| 192 | fpu_divide_by_zero.asm | dělení nulou matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_by_zero.asm |
| 193 | fpu_divide_by_neg_zero.asm | dělení záporné hodnoty nulou matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_by_neg_zero.asm |
| 194 | fpu_divide_by_neg_zero2.asm | dělení hodnoty zápornou nulou matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_by_neg_zero2.asm |
| 195 | fpu_divide_zero_by_zero.asm | výpočet 0/0 matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_zero_by_zero.asm |
| 196 | io.asm | pomocná makra pro komunikaci s DOSem a BIOSem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/io.asm |
| 197 | print.asm | pomocná makra pro tisk FPU hodnot typu single a double v hexadecimálním tvaru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/print.asm |
| 198 | fpu_divide.asm | operace podílu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide.asm |
| 199 | fpu_divide_r.asm | operace podílu s prohozenými operandy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_r.asm |
| 200 | fpu_sqrt.asm | výpočet druhé odmocniny | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_sqrt.asm |
| 201 | fpu_sqrt_neg_value.asm | výpočet druhé odmocniny ze záporné hodnoty | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_sqrt_neg_value.asm |
| 202 | fpu_check.asm | detekce typu matematického koprocesoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_check.asm |
| 203 | fpu_compare.asm | porovnání dvou hodnot s vyhodnocením výsledku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_compare.asm |
| 204 | fpu_status_word.asm | tisk obsahu stavového slova koprocesoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_status_word.asm |
| 205 | fpu_status_word_stack.asm | tisk obsahu stavového slova koprocesoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_status_word_stack.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/ - 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 - 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/ - 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 - Hyper Duel – Black Rain (YMF262 OPL3 Cover)
https://www.youtube.com/watch?v=pu_mzRRq8Ho - IBM 5155–5160 Technical Reference
https://www.minuszerodegrees.net/manuals/IBM/IBM_5155_5160_Technical_Reference_6280089_MAR86.pdf - a ymf262/opl3+pc speaker thing i made
https://www.youtube.com/watch?v=E-Mx0lEmnZ0 - [OPL3] Like a Thunder
https://www.youtube.com/watch?v=MHf06AGr8SU - (PC SPEAKER) bad apple
https://www.youtube.com/watch?v=LezmKIIHyUg - Powering devices from PC parallel port
http://www.epanorama.net/circuits/lptpower.html - Magic Mushroom (demo pro PC s DOSem)
http://www.crossfire-designs.de/download/articles/soundcards//mushroom.rar - Píseň Magic Mushroom – originál
http://www.crossfire-designs.de/download/articles/soundcards/speaker_mushroom_converted.mp3 - Píseň Magic Mushroom – hráno na PC Speakeru
http://www.crossfire-designs.de/download/articles/soundcards/speaker_mushroom_speaker.mp3 - Pulse Width Modulation (PWM) Simulation Example
http://decibel.ni.com/content/docs/DOC-4599 - Resistor/Pulse Width Modulation DAC
http://www.k9spud.com/traxmod/pwmdac.php - Class D Amplifier
http://en.wikipedia.org/wiki/Electronic_amplifier#Class_D - Covox Speech Thing / Disney Sound Source (1986)
http://www.crossfire-designs.de/index.php?lang=en&what=articles&name=showarticle.htm&article=soundcards/&page=5 - Covox Digital-Analog Converter (Rusky, obsahuje schémata)
http://phantom.sannata.ru/konkurs/netskater002.shtml - PC-GPE on the Web
http://bespin.org/~qz/pc-gpe/ - Keyboard Synthesizer
http://www.solarnavigator.net/music/instruments/keyboards.htm - FMS – Fully Modular Synthesizer
http://fmsynth.sourceforge.net/ - Javasynth
http://javasynth.sourceforge.net/ - Software Sound Synthesis & Music Composition Packages
http://www.linux-sound.org/swss.html - Mx44.1 Download Page (software synthesizer for linux)
http://hem.passagen.se/ja_linux/ - Software synthesizer
http://en.wikipedia.org/wiki/Software_synthesizer - Frequency modulation synthesis
http://en.wikipedia.org/wiki/Frequency_modulation_synthesis - Yamaha DX7
http://en.wikipedia.org/wiki/Yamaha_DX7 - Wave of the Future
http://www.wired.com/wired/archive/2.03/waveguides_pr.html - Analog synthesizer
http://en.wikipedia.org/wiki/Analog_synthesizer - Minimoog
http://en.wikipedia.org/wiki/Minimoog - Moog synthesizer
http://en.wikipedia.org/wiki/Moog_synthesizer - Tutorial for Frequency Modulation Synthesis
http://www.sfu.ca/~truax/fmtut.html - An Introduction To FM
http://ccrma.stanford.edu/software/snd/snd/fm.html - John Chowning
http://en.wikipedia.org/wiki/John_Chowning - I'm Impressed, Adlib Music is AMAZING!
https://www.youtube.com/watch?v=PJNjQYp1ras - Milinda- Diode Milliampere ( OPL3 )
https://www.youtube.com/watch?v=oNhazT5HG0E - Dune 2 – Roland MT-32 Soundtrack
https://www.youtube.com/watch?v=kQADZeB-z8M - Interrupts
https://wiki.osdev.org/Interrupts#Types_of_Interrupts - Assembly8086SoundBlasterDmaSingleCycleMode
https://github.com/leonardo-ono/Assembly8086SoundBlasterDmaSingleCycleMode/blob/master/sbsc.asm - Interrupts in 8086 microprocessor
https://www.geeksforgeeks.org/interrupts-in-8086-microprocessor/ - Interrupt Structure of 8086
https://www.eeeguide.com/interrupt-structure-of-8086/ - A20 line
https://en.wikipedia.org/wiki/A20_line - Extended memory
https://en.wikipedia.org/wiki/Extended_memory#eXtended_Memory_Specification_(XMS) - Expanded memory
https://en.wikipedia.org/wiki/Expanded_memory - Protected mode
https://en.wikipedia.org/wiki/Protected_mode - Virtual 8086 mode
https://en.wikipedia.org/wiki/Virtual_8086_mode - Unreal mode
https://en.wikipedia.org/wiki/Unreal_mode - DOS memory management
https://en.wikipedia.org/wiki/DOS_memory_management - Upper memory area
https://en.wikipedia.org/wiki/Upper_memory_area - Removing the Mystery from SEGMENT : OFFSET Addressing
https://thestarman.pcministry.com/asm/debug/Segments.html - Segment descriptor
https://en.wikipedia.org/wiki/Segment_descriptor - When using a 32-bit register to address memory in the real mode, contents of the register must never exceed 0000FFFFH. Why?
https://stackoverflow.com/questions/45094696/when-using-a-32-bit-register-to-address-memory-in-the-real-mode-contents-of-the - A Brief History of Unreal Mode
https://www.os2museum.com/wp/a-brief-history-of-unreal-mode/ - Segment Limits
https://wiki.osdev.org/Segment_Limits - How do 32 bit addresses in real mode work?
https://forum.osdev.org/viewtopic.php?t=30642 - The LOADALL Instruction by Robert Collins
https://www.rcollins.org/articles/loadall/tspec_a3_doc.html - How do you put a 286 in Protected Mode?
https://retrocomputing.stackexchange.com/questions/7683/how-do-you-put-a-286-in-protected-mode - Control register
https://en.wikipedia.org/wiki/Control_register - CPU Registers x86
https://wiki.osdev.org/CPU_Registers_x86 - x86 Assembly/Protected Mode
https://en.wikibooks.org/wiki/X86_Assembly/Protected_Mode - MSW: Machine Status Word
https://web.itu.edu.tr/kesgin/mul06/intel/intel_msw.html - 80×87 Floating Point Opcodes
http://www.techhelpmanual.com/876–80×87_floating_point_opcodes.html - Page Translation
https://pdos.csail.mit.edu/6.828/2005/readings/i386/s05_02.htm - 80386 Paging and Segmenation
https://stackoverflow.com/questions/38229741/80386-paging-and-segmenation - 80386 Memory Management
https://tldp.org/LDP/khg/HyperNews/get/memory/80386mm.html - DOSEMU
http://www.dosemu.org/ - Intel 80386, a revolutionary CPU
https://www.xtof.info/intel80386.html - PAI Unit 3 Paging in 80386 Microporcessor
https://www.slideshare.net/KanchanPatil34/pai-unit-3-paging-in-80386-microporcessor - 64 Terabytes of virtual memory for 32-bit x86 using segmentation: how?
https://stackoverflow.com/questions/5444984/64-terabytes-of-virtual-memory-for-32-bit-x86-using-segmentation-how - Pi in the Pentium: reverse-engineering the constants in its floating-point unit
http://www.righto.com/2025/01/pentium-floating-point-ROM.html - Simply FPU
http://www.website.masmforum.com/tutorials/fptute/ - Art of Assembly language programming: The 80×87 Floating Point Coprocessors
https://courses.engr.illinois.edu/ece390/books/artofasm/CH14/CH14–3.html - Art of Assembly language programming: The FPU Instruction Set
https://courses.engr.illinois.edu/ece390/books/artofasm/CH14/CH14–4.html - INTEL 80387 PROGRAMMER'S REFERENCE MANUAL
http://www.ragestorm.net/downloads/387intel.txt - x86 Instruction Set Reference: FLD
http://x86.renejeschke.de/html/file_module_x86_id100.html - x86 Instruction Set Reference: FLD1/FLDL2T/FLDL2E/FLDPI/FLDLG2/FLDLN2/FLDZ
http://x86.renejeschke.de/html/file_module_x86_id101.html - X86 Assembly/Arithmetic
https://en.wikibooks.org/wiki/X86_Assembly/Arithmetic - 8087 Numeric Data Processor
https://www.eeeguide.com/8087-numeric-data-processor/ - Data Types and Instruction Set of 8087 co-processor
https://www.eeeguide.com/data-types-and-instruction-set-of-8087-co-processor/ - 8087 instruction set and examples
https://studylib.net/doc/5625221/8087-instruction-set-and-examples