Obsah
1. Matematické koprocesory na platformě 80×86
2. Rozdíl mezi celočíselnými operacemi a operacemi s hodnotami s plovoucí řádovou čárkou
3. Norma IEEE 754 a její varianty
4. Způsob interní reprezentace hodnot s plovoucí řádovou čárkou
5. Formát single – hodnoty s jednoduchou přesností
6. Uložení znaménka, mantisy a exponentu ve formátu single
7. Speciální hodnoty s exponenty 0 a 255
8. Formát double – hodnoty s dvojnásobnou přesností
9. Rozšířený formát extended/temporary
10. Pracovní registry matematických koprocesorů 80×87
11. Řídicí registr matematického koprocesoru
12. Stavový registr matematického koprocesoru
13. Základní instrukce pro načítání dat do registrů matematického koprocesoru
14. Základní aritmetické operace
15. Pomocné podprogramy a makra pro tisk FPU hodnot v hexadecimální podobě
16. Načtení a vytištění konstant 0.0, 1.0 a Pi v hexadecimálním tvaru
17. Úprava příkladu pro hodnoty typu double/float64
18. Jak přečíst a dekódovat vytištěné výsledky?
19. Repositář s demonstračními příklady
1. Matematické koprocesory na platformě 80×86
Původní mikroprocesory řady Intel 8086/8088, ale i jejich následující dvě generace (80286, 80386) obsahovaly aritmeticko-logickou jednotku umožňující provádění výpočtů s celými čísly. Ovšem v některých typech aplikací (typicky CADy a výpočetní software) se intenzivně pracuje s hodnotami s plovoucí řádovou čárkou. V angličtině se používá označení floating point, protože při zápisu desetinných čísel se zde používá tečka a nikoli čárka.
Tyto výpočty je možné buď realizovat softwarově, což může být dosti pomalé, nebo bylo možné využít specializované čipy, které se z historických důvodů nazývají „matematický koprocesor“. Toto označení vzniklo proto, že v minulosti se skutečně jednalo o samostatný čip, který bylo možné na základní desku počítače nainstalovat až ve chvíli, kdy to bylo vzhledem k provozovaným úlohám nezbytné (typicky se jednalo o osobní mikropočítače, na nichž se provozoval CAD, popř. se na něm v tabulkovém procesoru zpracovávaly rozsáhlejší tabulky s mnoha výpočty).
Až mnohem později (konkrétně u Pentia) se matematický koprocesor stal nedílnou součástí mikroprocesoru, což znamená, že dnes již není nutné testovat jeho přítomnost, provádění všech operací s plovoucí řádovou čárkou je rychlejší (sdílí se společná interní sběrnice) a taktéž není nutné explicitně čekat na dokončení výpočtů. V dnešním článku se seznámíme především s instrukcemi i s principem práce s hodnotami s plovoucí řádovou čárkou, který je použit na mikroprocesorech s architekturou 80×86.
2. Rozdíl mezi celočíselnými operacemi a operacemi s hodnotami s plovoucí řádovou čárkou
Již v úvodu dnešního článku je nutné upozornit na fakt, že zpracování hodnot s plovoucí řádovou čárkou se v mnoha ohledech odlišuje od zpracování celočíselných hodnot – mnohem více, než by se mohlo na první pohled zdát. Je tomu tak hned z několika důvodů. U celočíselných hodnot je u všech současných mikroprocesorových architektur totiž předem zřejmé, jaké hodnoty lze uložit do zvoleného n-bitového slova.
Například u osmibitových slov je při použití čísel bez znaménka (unsigned) možné reprezentovat hodnoty od 0 do 255 (včetně), zatímco u čísel se znaménkem (konkrétně s dvojkovým doplňkem, signed) jsou to hodnoty od –128 do 127. Navíc je při provádění základních aritmetických operací nutné sledovat pouze několik výjimečných stavů:
- Přenos u čísel bez znaménka (carry)
- Přetečení u čísel se znaménkem (overflow)
- Dělení nulou
Povšimněte si, že vůbec není nutné řešit například práci s nekonečnými hodnotami (kladné a záporné nekonečno), protože takové hodnoty stejně nelze nijak reprezentovat, čímž se detekce potenciálně neplatných výpočtů zjednodušuje. Není ale například nutné řešit ani to, co se stane v případě pokusu o výpočet ∞-∞ nebo 0×∞, vlastně jedinou potenciálně problematickou operací je výpočet x/0 a speciálně též 0/0 (setkáme se dokonce s ALU, kde je výsledek tohoto výpočtu jednička).
Naproti tomu u hodnot reprezentovaných v systému plovoucí řádové čárky může výjimečných stavů nastat mnohem více, a to i ve chvíli, kdy uvažujeme pouze čtyři základní aritmetické operace a ne speciality typu druhá odmocnina ze záporného čísla atd.:
- Přetečení
- Podtečení
- Práce s takzvanými denormalizovanými čísly
- Operace s nekonečny (navíc se rozlišuje kladné a záporné nekonečno)
- Neplatné operace typu 0/0, ∞-∞ nebo 0×∞
- Operace s hodnotami, které nejsou skutečná čísla (NaN)
Navíc se zde objevuje další problém, který u celých čísel nebylo nutné řešit – totiž to, jakým způsobem se má provádět zaokrouhlení výsledků tak, aby je bylo možné uložit zpět do pracovních registrů.
3. Norma IEEE 754 a její varianty
Před popisem jednotlivých strojových instrukcí určených pro provádění operací s hodnotami s plovoucí řádovou čárkou je nutné se seznámit s tím, jakým způsobem jsou vlastně taková čísla interně reprezentována (tj. uložena v pracovních registrech či v operační paměti), protože způsob jejich reprezentace do značné míry určuje i přesnost, rozsah podporovaných hodnot, některá specifika (způsob porovnávání) apod.
Na platformě 80×86, a později taktéž u naprosté většiny polovodičových čipů vyrobených v posledním čtvrtstoletí, se pro reprezentaci numerických hodnot s plovoucí řádovou čárkou dodržují vybrané formáty (někdy i všechny formáty!) specifikované v normě IEEE 754, která sama je postupně rozšiřována a upřesňována. V normě IEEE 754, jejíž první verze je mimochodem v platnosti již od roku 1985 (samotný koprocesor 8087 je o pět let starší!), jsou specifikovány nejenom vlastní formáty uložení numerických hodnot v systému pohyblivé řádové čárky (FP formátu), ale i pravidla implementace základních aritmetických operací s těmito hodnotami, aplikace zaokrouhlovacích režimů, způsoby některých konverzí apod. Konkrétně je v této normě popsáno:
- Základní (basic) a rozšířený (extended) formát uložení numerických hodnot.
- Způsob provádění základních matematických operací:
- součet
- rozdíl
- součin
- podíl
- zbytek po dělení
- druhá odmocnina
- porovnání
- Režimy zaokrouhlování.
- Způsob práce s denormalizovanými hodnotami.
- Pravidla konverze mezi celočíselnými formáty (integer bez a se znaménkem) a formáty s plovoucí řádovou čárkou.
- Způsob konverze mezi různými formáty s plovoucí řádovou čárkou (single → double atd.).
- Způsob konverze základního formátu s plovoucí řádovou čárkou na řetězec číslic (včetně nekonečen a nečíselných hodnot).
- Práce s hodnotami NaN (not a number) a výjimkami, které mohou při výpočtech za určitých předpokladů vzniknout.
4. Způsob interní reprezentace hodnot s plovoucí řádovou čárkou
Dobrý programátor by měl taktéž znát základní vlastnosti interní reprezentace hodnot s plovoucí řádovou čárkou. Jednotlivé platformy se sice mohou odlišovat (IBM 360, Cray, IBM PC, Motorola 68881/68882), ale základ zůstává stále stejný. Zaměřme se na IEEE 754, v níž je použita báze o základu 2. Vybraná podmnožina racionálních čísel může být vyjádřena vztahem:
XFP=(-1)s × 2exp-bias × m
přičemž význam jednotlivých symbolů ve vztahu je následující:
- XFP značí reprezentovanou numerickou hodnotu z podmnožiny racionálních čísel (ta je zase podmnožinou čísel reálných). Díky vyhrazeným (speciálním) hodnotám je možné rozlišit kladnou a zápornou nulu i kladné a záporné nekonečno, což je jeden z důležitých rozdílů oproti způsobu reprezentace celých čísel. Také se může uložit nečíselná hodnota: NaN – (Not a Number), která je výsledkem některých matematicky nedefinovaných operací, například 0/0 nebo 00.
- 2 je báze, někdy také nazývaná radix. U numerických formátů odpovídajících normě IEEE 754 je to vždy dvojka, protože výpočty s bází dvě jsou pro číslicové obvody nejjednodušší. V minulosti se používaly i jiné báze, například 8, 16 nebo i 10, s nimi se však již dnes prakticky nesetkáme. A vzhledem k tomu, že matematické koprocesory 80×87 odpovídají normě IEEE 754, i my budeme používat radix=2.
- exp je vždy kladná hodnota exponentu posunutého o hodnotu bias
- bias je hodnota, díky které je uložený exponent vždy kladný. Tato hodnota se většinou volí dle vztahu: bias=2eb-1-1, kde eb je počet bitů vyhrazených pro exponent. Pro specifické účely je však možné zvolit i jinou hodnotu (ovšem nikoli u formátů odpovídajících IEEE 754, takže se touto variantou nemusíme zabývat).
- m je mantisa, která je u formátů dle normy IEEE 754 vždy kladná, protože znaménko je uloženo zvlášť (některé FP formáty však například používají dvojkový doplněk atd.).
- s je znaménkový bit nabývající hodnoty 0 nebo 1. V případě, že je tento bit nulový, je reprezentovaná hodnota XFP kladná, v opačném případě se jedná o zápornou hodnotu. Vzhledem k tomu, že je jeden bit vyhrazen na uložení znaménka, je možné rozlišit kladnou a zápornou nulu, ale například i kladné a záporné nekonečno.
5. Formát single – hodnoty s jednoduchou přesností
Podle bitové šířky výše zmíněných parametrů exp, bias a m se rozlišují základní (basic) a rozšířené (extended) formáty FP čísel. Norma IEEE 754 přitom v tomto kontextu explicitně zmiňuje dva základní formáty: jednoduchá přesnost (single) a dvojitá přesnost (double).
Začneme typem single. Tento formát, který je v programovacích jazycích označován buď jako single či float, je charakteristický tím, že se pro uložení numerické hodnoty používá celkem třiceti dvou bitů (tedy 4 byty), což pro mnoho aplikací představuje velmi dobrý poměr mezi rozsahem hodnot, přesností a nároky na úložný prostor, nehledě na to, že mnoho architektur stále používá 32 bitové sběrnice (přesněji řečeno, původní PC mělo sběrnici dokonce jen osmibitovou, 32bitová sběrnice je doménou čipů 80386). Oněch 32 bitů je rozděleno do třech částí. V první části (představované nejvyšším bitem) je uloženo znaménko, následuje osm bitů pro uložení posunutého exponentu a za nimi je zbývajících 23 bitů, které slouží pro uložení mantisy. Celé třiceti dvoubitové slovo s FP hodnotou tedy vypadá následovně:
| bit | 31 | 30 29 … 24 23 | 22 21 … 3 2 1 0 |
|---|---|---|---|
| význam | s | exponent (8 bitů) | mantisa (23 bitů) |
Exponent je v tomto případě posunutý o hodnotu bias, která je nastavena na 127, protože je použit výše uvedený vztah:
bias=2eb-1-1
a po dosazení eb=8 (bitů) do tohoto vztahu dostaneme:
bias=28–1-1=27-1=128–1=127
Vzorec pro vyjádření reálné hodnoty vypadá následovně:
Xsingle=(-1)s × 2exp-127 × m
6. Uložení znaménka, mantisy a exponentu ve formátu single
Uložení znaménka číselné hodnoty je jednoduché: v případě, že je znaménkový bit nastavený na jedničku, jedná se o zápornou hodnotu, v opačném případě jde o hodnotu kladnou. Exponent je uložený v takzvané posunuté formě, tj. jako binárně zakódované celé číslo v rozsahu 0..255. Po vyjádření neposunutého exponentu dostáváme rozsah –127..128. Obě krajní hodnoty jsou však použity pro speciální účely, proto dostáváme rozsah exponentů –126..127 pro normalizovaná čísla (krajními hodnotami jsou takové exponenty, které mají všechny bity buď jedničkové nebo naopak nulové).
Ještě si však musíme říci, jakým způsobem je uložena mantisa. Ta je totiž většinou (až na velmi malá čísla) normalizovaná, což znamená, že se do mantisy ukládají pouze hodnoty v rozsahu <1,0;2,0-ε>. Vzhledem k tomu, že první bit umístěný před binární tečkou je u tohoto rozsahu vždy nastavený na jedničku, není ho zapotřebí explicitně ukládat, což znamená, že ušetříme jeden bit z třiceti dvoubitového slova. Pro normalizované hodnoty platí následující vztah:
Xsingle=(-1)s × 2exp-127(1.M)2
kde M je hodnota bitového vektoru mantisy, tj.:
M=m22-1+m21-2+m20-3+…+m1-22+m0-23
Rozsah hodnot, jež je možné reprezentovat pomocí formátu s jednoduchou přesností v normalizovaném tvaru je –3,4×1038 až 3,4×1038. Nejnižší reprezentovatelná (normalizovaná) hodnota je rovna 1,17549×10-38, denormalizovaná pak 1,40129×10-45. Jak jsme k těmto hodnotám došli? Zkuste se podívat na následující vztahy:
| hexadecimální hodnota | výpočet FP | dekadický výsledek | normalizováno |
|---|---|---|---|
| 0×00000001 | 2-126×2-23 | 1,40129×10-45 | ne |
| 0×00800000 | 2-126 | 1,17549×10-38 | ano |
| 0×7F7FFFFF | (2–2-23)×2127 | 3,4×1038 | ano |
7. Speciální hodnoty s exponenty 0 a 255
Ještě si musíme vysvětlit význam těch exponentů, které mají nastavenou minimální a maximální hodnotu, tj. jsou buď nulové, nebo mají hodnotu 255 (obě samozřejmě před posunem o bias). Vše je přehledně uvedeno v následující tabulce:
| s-bit | exponent | mantisa | význam | šestnáctkově |
|---|---|---|---|---|
| 0 | 0<e<255 | >0 | normalizované kladné číslo | |
| 1 | 0<e<255 | >0 | normalizované záporné číslo | |
| 0 | 0 | >0 | denormalizované kladné číslo | |
| 1 | 0 | >0 | denormalizované záporné číslo | |
| 0 | 0 | 0 | kladná nula | 0×00000000 |
| 1 | 0 | 0 | záporná nula | 0×80000000 |
| 0 | 255 | 0 | kladné nekonečno | 0×7F800000 |
| 1 | 255 | 0 | záporné nekonečno | 0×FF800000 |
| 0 | 255 | >0 | NaN – not a number | |
| 1 | 255 | >0 | NaN – not a number |
Pojmem denormalizovaná čísla označujeme takové hodnoty, u kterých není první (explicitně nevyjádřený) bit mantisy roven jedničce, ale naopak nule. Výpočty s těmito velmi malými hodnotami nejsou přesné, zejména při násobení a dělení (a samozřejmě i všech odvozených operacích). Při ukládání denormalizovaných čísel je exponent vždy nastaven na nejnižší hodnotu, tj. na –126 po posunu a nejvyšší (explicitně neukládaný) bit mantisy je v tomto případě vždy nulový, nikoli jedničkový, jak je tomu u normalizovaných hodnot. Jedná se o výsledek snahy „vyždímat“ z FP formátu i poslední volné kombinace bitů.
Hodnota typu NaN vznikne v případě, že je použita operace s nejasným výsledkem, například 0/0, 00 nebo, a to v praxi snad nejčastěji, při odmocňování záporných čísel. Nekonečná hodnota vzniká typicky při dělení nulou (zde je možné zjistit znaménko), nebo při vyjádření funkcí typu log(0) atd.
8. Formát double – hodnoty s dvojnásobnou přesností
Formát s dvojitou přesností (double, někdy též float64), který je definovaný taktéž normou IEEE 754, se v mnoha ohledech podobá formátu s jednoduchou přesností (single), protože jeho vnitřní struktura bitových polí je prakticky stejná. Pouze se zdvojnásobil celkový počet bitů, ve kterých je hodnota uložena, tj. místo 32 bitů se používá 64 bitů. Právě to je hlavní příčinou toho, proč se tento formát nazývá double, ve skutečnosti je totiž přesnost více než dvojnásobná. 64 bitů alokovaných pro FP hodnotu je v tomto případě rozděleno následujícím způsobem:
- 1 bit pro znaménko
- 11 bitů pro exponent
- 52 bitů pro mantisu
Bitově vypadá rozdělení následovně:
| bit | 63 | 62 … 52 | 51 … 0 |
|---|---|---|---|
| význam | s | exponent (11 bitů) | mantisa 52( bitů) |
Exponent je v tomto případě posunutý o hodnotu bias=1023 a vzorec pro výpočet reálné hodnoty vypadá takto:
Xdouble=(-1)s × 2exp-1023 × m
Přičemž hodnotu mantisy je možné pro normalizované hodnoty získat pomocí vztahu:
m=1+m51-1+m50-2+m49-3+…+m0-52
(mx představuje x-tý bit mantisy)
Rozsah hodnot ukládaných ve dvojité přesnosti je –1,7×10308..1,7×10308, nejmenší možná nenulová hodnota je rovna 2,2×10-308. Minimální a maximální hodnota exponentu má opět speciální význam, který je vysvětlen (spolu s normalizovanými čísly) v následující tabulce:
| s-bit | exponent | mantisa | význam |
|---|---|---|---|
| 0 | 0<e<2047 | >0 | normalizované kladné číslo |
| 1 | 0<e<2047 | >0 | normalizované záporné číslo |
| 0 | 0 | >0 | denormalizované kladné číslo |
| 1 | 0 | >0 | denormalizované záporné číslo |
| 0 | 0 | 0 | kladná nula |
| 1 | 0 | 0 | záporná nula |
| 0 | 2047 | 0 | kladné nekonečno |
| 1 | 2047 | 0 | záporné nekonečno |
| 0 | 2047 | >0 | NaN – not a number |
| 1 | 2047 | >0 | NaN – not a number |
9. Rozšířený formát extended/temporary
Kromě obou základních formátů (tj. jednoduché i dvojité přesnosti) je v normě IEEE 754 povoleno používat i rozšířené formáty. Na platformě 80×86 je při výpočtech prováděných v matematickém koprocesoru používán rozšířený formát nazývaný extended či temporary. Tento formát je zajímavý tím, že pro uložení FP hodnot používá 80 bitů a je do něho možné beze ztráty přesnosti uložit 64bitové hodnoty typu integer (což je v mnoha oblastech velmi důležité). Osmdesátibitový vektor je v tomto případě rozdělený do třech částí (bitových polí) následujícím způsobem:
- 1 bit pro znaménko
- 15 bitů pro exponent (BIAS je roven 16383)
- 64 bitů pro mantisu (maximální hodnota přesahuje 104932)
U tohoto formátu je zajímavá funkce bitu s indexem 63. Podle hodnoty tohoto bitu se rozlišují čísla normalizovaná a nenormalizovaná (tento bit ve skutečnosti nahrazuje implicitně nastavovaný nejvyšší bit mantisy, jak ho známe z předchozích formátů). Matematické koprocesory řady 80×87 sice dokážou pracovat s čísly nenormalizovanými, výsledkem jeho aritmetických operací jsou však vždy hodnoty normalizované. Všechny možnosti, které mohou při ukládání extended FP formátu nastat, jsou přehledně vypsány v následující tabulce:
| s-bit | exponent | mantisa | m63 | význam |
|---|---|---|---|---|
| 0 | 0<e<32767 | >0 | 1 | normalizované kladné číslo |
| 1 | 0<e<32767 | >0 | 1 | normalizované záporné číslo |
| 0 | 0<e<32767 | >0 | 0 | nenormalizované kladné číslo |
| 1 | 0<e<32767 | >0 | 0 | nenormalizované záporné číslo |
| 0 | 0 | >0 | 0 | denormalizované kladné číslo |
| 1 | 0 | >0 | 0 | denormalizované záporné číslo |
| 0 | 0 | 0 | x | kladná nula |
| 1 | 0 | 0 | x | záporná nula |
| 0 | 32767 | 0 | x | kladné nekonečno |
| 1 | 32767 | 0 | x | záporné nekonečno |
| 0 | 32767 | >0 | x | NaN – not a number |
| 1 | 32767 | >0 | x | NaN – not a number |
Pro normalizované i nenormalizované hodnoty je možné uloženou hodnotu vyjádřit pomocí vzorce (všimněte si, že bit 63 je umístěn před binární tečkou):
Xextended=(-1)s × 2exp-16383 × m
m=m630+m62-1+m61-2+…+m0-63
10. Pracovní registry matematických koprocesorů 80×87
Po poněkud teoretickém úvodu se vraťme k počítačům IBM PC a k matematickým koprocesorům 80×87, tj. k čipům 8087, 80287 a 80387. Tyto koprocesory měly vlastní instrukční sadu, vlastní pracovní registry i řídicí a stavové registry. Instrukční sada byla navržena takovým způsobem, že jak hlavní procesor, tak i matematický koprocesor mohly spolupracovat a zpracovávat stejnou sekvenci operačních kódů (zjednodušeně řečeno – každý čip si z této sekvence vybral „to svoje“, ovšem řízení toku programu samozřejmě prováděl hlavní procesor).
Matematický koprocesor má už od původního čipu 8087 k dispozici celkem osm pracovních registrů, přičemž každý registr má šířku osmdesáti bitů. To znamená, že je možné provádět operace s hodnotami s rozšířenou (extended) přesností a samozřejmě taktéž provádět konverze na hodnoty s přesností jednoduchou (single) a dvojitou (double). Zajímavé a dnes již poněkud neobvyklé je, že zmíněných osm registrů tvoří zásobník (stack), takže například instrukce pro načítání hodnot ve skutečnosti provádí uložení na vrchol zásobníku, aritmetické operace pracují se dvěma registry na vrcholu zásobníku atd. U mnoha instrukcí je však možné toto pravidlo porušit a zvolit si registry explicitně, popř. zakázat odstranění původních operandů ze zásobníku – k registrům tak můžeme přistupovat i přímo. Zápis jmen registrů vypadá takto: ST(0), ST(1) atd. (pořadí registru v zásobníku se průběžně mění).
11. Řídicí registr matematického koprocesoru
Kromě pracovních registrů obsahuje matematický koprocesor i řídicí registr (control register). Ten má šířku pouze šestnáct bitů a obsahuje masky výjimek (exception), které mohou nastat při provádění různých operací, dále pak dva bity pro volbu zaokrouhlovacího režimu (rounding mode) a taktéž dva bity pro volbu přesnosti jednotlivých výpočtů:
| # | 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 | × |
Bity RC2 a RC1 se používají pro volbu zaokrouhlení (rounding mode):
| RC2 | RC1 | |
|---|---|---|
| 0 | 0 | zaokrouhlení na nejbližší sudé číslo (mantisa) |
| 0 | 1 | zaokrouhlení směrem k -∞ |
| 1 | 0 | zaokrouhlení směrem k +∞ |
| 1 | 1 | zaokrouhlení směrem k nule |
Bity PC2 a PC1 určují, zda se mají výpočty provádět s jednoduchou přesností, dvojitou přesností či s rozšířenou přesností (tedy single, double či extended):
| PC2 | PC1 | |
|---|---|---|
| 0 | 0 | 32 bitů |
| 0 | 1 | |
| 1 | 0 | 64 bitů |
| 1 | 1 | 80 bitů (výchozí) |
Většinou není nutné obsah tohoto registru v průběhu výpočtů měnit – nastavuje se na začátku výpočtů.
12. Stavový registr matematického koprocesoru
Jednotlivé matematické operace prováděné matematickým koprocesorem nastavují bity v takzvaném stavovém registru (status register). Tento registru má taktéž šíř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) |
Nejzajímavější jsou bity pojmenované C0, C1, C2 a C3, protože do těchto bitů se ukládá například výsledek porovnání dvou hodnot atd. Tyto bity jsou ve stavovém registru umístěny tak, aby přesně odpovídaly umístění standardních příznaků v registru EFLAGS:
| FPU | EFLAGS |
|---|---|
| C0 | carry flag |
| C1 | undefined |
| C2 | parity flag |
| C3 | zero flag |
Obsah tohoto registru se využívá tehdy, pokud je nutné provést test na hodnotu, relační operaci atd. To si pochopitelně ukážeme v demonstračních příkladech.
13. Základní instrukce pro načítání dat do registrů matematického koprocesoru
V této kapitole si prozatím bez demonstračního příkladu vypíšeme základní instrukce určené pro načtení dat do registrů FPU. Jedná se o následujících osm instrukcí:
| # | Instrukce | Význam |
|---|---|---|
| 1 | FLD | načtení hodnoty typu single, double či extended z operační paměti či z jiného registru |
| 2 | FLD1 | načtení konstanty +1,0 |
| 3 | FLDL2T | načtení konstanty log210 |
| 4 | FLDL2E | načtení konstanty log2e |
| 5 | FLDPI | načtení konstanty π |
| 6 | FLDLG2 | načtení konstanty log102 |
| 7 | FLDLN2 | načtení konstanty loge2 |
| 8 | FLDZ | načtení konstanty +0,0 (tj. kladná nula) |
Hodnoty logaritmů se využijí v mnoha instrukcích, které si popíšeme příště.
14. Základní aritmetické operace
Mezi základní aritmetické operace patří především:
| # | Instrukce | Význam |
|---|---|---|
| 1 | FADD | součet |
| 2 | FSUB | rozdíl |
| 3 | FSUBR | rozdíl, ale operandy jsou prohozeny (má význam, pokud se používá zásobník) |
| 4 | FMUL | součin |
| 5 | FDIV | podíl |
| 6 | FDIVR | podíl, ale operandy jsou prohozeny (má význam, pokud se používá zásobník) |
| 7 | FCHS | změna znaménka |
| 8 | FABS | výpočet absolutní hodnoty |
| 9 | FSQRT | výpočet druhé odmocniny |
15. Pomocné podprogramy a makra pro tisk FPU hodnot v hexadecimální podobě
V závěrečné části dnešního článku (a v celém článku navazujícím) si představíme celou řadu demonstračních příkladů, v nichž se pracuje s FPU hodnotami. Budeme taktéž potřebovat získat hodnoty vypočtené matematickým koprocesorem a ty následně nějakým způsobem zobrazit. Aby se stále neopakoval ten samý kód, budeme ve všech demonstračních příkladech používat tento pomocný soubor s makry a podprogramy, který postačuje připojit (include) k překládanému kódu:
;-----------------------------------------------------------------------------
; Symboly, makra a subrutiny pro tisk hodnot na standardni vystup
;-----------------------------------------------------------------------------
%ifndef PRINT_LIB
%define PRINT_LIB
;-----------------------------------------------------------------------------
; makra
;-----------------------------------------------------------------------------
; makro pro tisk retezce na obrazovku
%macro print_string 1
mov dx, %1
mov ah, 9
int 0x21
%endmacro
; makro pro tisk 32bitove hexadecimalni hodnoty
; na standardni vystup
%macro print_hex 1
pusha ; uchovat vsechny registry
mov edx, %1 ; zapamatovat si hodnotu pro tisk
mov ebx, hex_message ; buffer, ktery se zaplni hexa cislicemi
call hex2string ; zavolani prislusne subrutiny
print_string hex_message ; tisk hexadecimalni hodnoty
popa ; obnovit vsechny registry
%endmacro
; makro pro vypis 32bitove desitkove hodnoty na standardni vystup
%macro print_dec 1
pusha ; uschovat vsechny registry na zasobnik
mov eax, %1 ; hodnotu pro tisk ulozit do registru EAX
mov ebx, dec_message ; buffer, ktery se zaplni desitkovymi cisticemi
call decimal2string ; zavolani prislusne subrutiny pro prevod na string
print_string dec_message ; tisk hexadecimalni hodnoty
popa ; obnovit vsechny registry
%endmacro
; makro pro vypis obsahu FP hodnoty z vrcholu zasobniku ve forme hexadecimalniho cisla
%macro print_float32_as_hex 0
fstp dword [float32] ; ulozeni do pameti (4 bajty)
mov eax, [float32] ; nacteni FP hodnoty do celociselneho registru
print_hex eax ; zobrazeni obsahu tohoto registru v hexadecimalnim tvaru
%endmacro
; makro pro vypis obsahu FP hodnoty z vrcholu zasobniku ve forme hexadecimalniho cisla
%macro print_float64_as_hex 0
fstp qword [float64] ; ulozeni do pameti (8 bajtu)
mov eax, [float64+4]; nacteni FP hodnoty do celociselneho registru
print_hex eax ; zobrazeni obsahu tohoto registru v hexadecimalnim tvaru
mov eax, [float64] ; nacteni FP hodnoty do celociselneho registru
print_hex eax ; zobrazeni obsahu tohoto registru v hexadecimalnim tvaru
%endmacro
;-----------------------------------------------------------------------------
; subrutiny
;-----------------------------------------------------------------------------
; subrutina urcena pro prevod 32bitove hexadecimalni hodnoty na retezec
; Vstup: EDX - hodnota, ktera se ma prevest na retezec
; EBX - adresa jiz drive alokovaneho retezce (resp. osmice bajtu)
hex2string:
mov cl, 8 ; pocet opakovani smycky
.print_one_digit: rol edx, 4 ; rotace doleva znamena, ze se do spodnich 4 bitu nasune dalsi cifra
mov al, dl ; nechceme porusit obsah vstupni hodnoty v EDX, proto pouzijeme AL
and al, 0x0f ; maskovani, potrebujeme pracovat jen s jednou cifrou
cmp al, 10 ; je cifra vetsi nebo rovna 10?
jl .store_digit ; neni, pouze prevest 0..9 na ASCII hodnotu '0'..'9'
.alpha_digit: add al, 'A'-10-'0' ; prevod hodnoty 10..15 na znaky 'A'..'F'
.store_digit: add al, '0'
mov [ebx], al ; ulozeni cifry do retezce
inc ebx ; dalsi ulozeni v retezci o znak dale
dec cl ; snizeni pocitadla smycky
jnz .print_one_digit ; a opakovani smycky, dokud se nedosahlo nuly
ret ; navrat ze subrutiny
; subrutina urcena pro prevod 32bitove desitkove hodnoty na retezec
; Vstup: EDX - hodnota, ktera se ma prevest na retezec
; EBX - adresa jiz drive alokovaneho retezce (resp. minimalne deseti bajtu)
decimal2string:
mov ecx, 10 ; celkovy pocet zapisovanych cifer/znaku
mov edi, ecx ; instrukce DIV vyzaduje deleni registrem, pouzijme tedy EDI
.next_digit:
xor edx, edx ; delenec je dvojice EDX:EAX, vynulujeme tedy horni registr EDX
div edi ; deleni hodnoty ulozene v EDX:EAX deseti (delitelem je EDI)
; vysledek se ulozi do EAX, zbytek do EDX
; pri deleni deseti je jistota, ze zbytek je jen cislo 0..9
add dl, '0' ; prevod hodnoty 0..9 na znak '0'-'9'
mov [ebx+ecx-1], dl ; zapis retezce (od posledniho znaku)
dec ecx ; presun na predchozi znak v retezci a soucasne snizeni hodnoty pocitadla
jnz .next_digit ; uz jsme dosli k poslednimu cislu?
ret ; navrat ze subrutiny
;-----------------------------------------------------------------------------
; buffery
;-----------------------------------------------------------------------------
; retezec ukonceny znakem $
; (tato data jsou soucasti vysledneho souboru typu COM)
hex_message:
times 8 db '?',
db 0x0d, 0x0a, "$"
; retezec ukonceny znakem $
; (tato data jsou soucasti vysledneho souboru typu COM)
dec_message:
times 10 db '?',
db 0x0d, 0x0a, "$"
float32: dd 0
float64: dq 0
%endif
16. Načtení a vytištění konstant 0.0, 1.0 a Pi v hexadecimálním tvaru
Podívejme se nyní, jakým způsobem lze načíst konstanty 0.0, 1.0 a Pi (resp π) do registrů matematického koprocesoru a následně je vytisknout. Již ve třinácté kapitole jsme si řekli, že pro načtení oněch tří konstant existují samostatné instrukce nazvané FLD1, FLDZ a FLDPI, takže samotná realizace je poměrně snadná (a to i díky existenci pomocných souborů io.asm a print.asm):
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
print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
fld1 ; nacteni FP konstanty 1.0
print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
fldpi ; nacteni FP konstanty Pi
print_float32_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
wait_key ; cekani na klavesu
exit ; navrat do DOSu
Po překladu se podívejme, jak jsou ony tři instrukce přeloženy do strojového kódu. Navíc si podíváme i na instrukci FSTP ve variantě ukládající 32bitovou hodnotu typu single do operační paměti:
13 main:
14 0000005E D9EE fldz ; nacteni FP konstanty 0.0
43 00000060 D91E[5200] <1> fstp dword [float32]
16
17 0000007D D9E8 fld1 ; nacteni FP konstanty 1.0
43 0000007F D91E[5200] <1> fstp dword [float32]
19
20 0000009C D9EB fldpi ; nacteni FP konstanty Pi
43 0000009E D91E[5200] <1> fstp dword [float32]
17. Úprava příkladu pro hodnoty typu double/float64
A jak bude vypadat úprava demonstračního příkladu z předchozí kapitoly do podoby, v níž budeme chtít z registrů matematického koprocesoru získat hodnoty typu double a ty následně vytisknout? Z pohledu programátora postačuje pouze zavolání jiného makra, interně se však použije jiná forma instrukce FSTP:
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
print_float64_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
fld1 ; nacteni FP konstanty 1.0
print_float64_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
fldpi ; nacteni FP konstanty Pi
print_float64_as_hex ; zobrazeni FP hodnoty v hexadecimalnim tvaru
wait_key ; cekani na klavesu
exit ; navrat do DOSu
Nyní se pro instrukci FSTP použije odlišný prefix 0×DD a nikoli 0×D9. Tímto způsobem lze rozlišit odlišnou velikost ukládaných dat:
13 main:
14 0000005E D9EE fldz ; nacteni FP konstanty 0.0
50 00000060 DD1E[5600] <1> fstp qword [float64]
16
17 00000096 D9E8 fld1 ; nacteni FP konstanty 1.0
50 00000098 DD1E[5600] <1> fstp qword [float64]
19
20 000000CE D9EB fldpi ; nacteni FP konstanty Pi
50 000000D0 DD1E[5600] <1> fstp qword [float64]
18. Jak přečíst a dekódovat vytištěné výsledky?
Pokud přeložený program ze šestnácté kapitoly spustíme, měly by se na standardní výstup vypsat následující tři řádky (prefixy jsem přidal ručně):
0.0: 0x00000000 1.0: 0x3F800000 Pi: 0x40490FDB
Vidíme, že jsme pro každou hodnotu reprezentovanou v systému plovoucí řádové čárky dostali hexadeciální 32bitové číslo, které reprezentuje binární „otisk“ 32bitové hodnoty typu single. Exponent je posunutý o bias nastavený na hodnotu 127. Mantisa u normalizovaných čísel obsahuje jen čísla za (binární) řádovou čárkou, tudíž je k hodnotě mantisy nutné přičíst jedničku. Získané hodnoty tedy můžeme dekódovat:
| Hexa | Binárně | s | Exponent | Mantisa |
|---|---|---|---|---|
| 0×00000000 | 00000000000000000000000000000000 | + | 0 (spec) | 0 |
| 0×3F800000 | 00111111100000000000000000000000 | + | 127–127=0 | 1,0 + 0,0 |
| 0×40490FDB | 01000000010010010000111111011011 | + | 128–127=1 | 1,0 + 0,57079637050628662109375 |
První hodnota je zcela jednoznačně kladná nula, druhá hodnota je rovna 1,0×20=1, třetí hodnota je pak rovna 1,57079637050628662109375×21=π (zde konkrétně přibližná hodnota 3.14159274101257324218750). Vidíme, že jak způsob uložení hodnot, tak i jejich zpětné ruční dekódování pracuje (relativně) spolehlivě.
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ápornou nulou matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_by_neg_zero.asm |
| 194 | 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 |
| 195 | io.asm | pomocná makra pro komunikaci s DOSem a BIOSem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/io.asm |
| 196 | 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 |
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