Nové vlastnosti čipů 80386: stránkování a virtuální režim 8086

7. 1. 2025
Doba čtení: 57 minut

Sdílet

Autor: Depositphotos
Seznámíme se s dvěma technologiemi, které byly součástí mikroprocesoru Intel 80386. Tento v několika ohledech přelomový čip totiž kromě dalších vylepšení nabízel možnost stránkování (paging) a nový virtuální režim.

Obsah

1. Nové vlastnosti čipů 80386: stránkování a virtuální režim 8086

2. Obejití šestnáctibitového limitu při adresaci paměti

3. Logická adresa, lineární adresa a fyzická adresa

4. Výpočet fyzické adresy na mikroprocesorech Intel 80386

5. Stránkování

6. Praktický význam stránkování

7. Výpočet fyzické adresy při povolení stránkování

8. Povolení stránkování

9. Formát záznamů v tabulkách stránek

10. Význam bitů A a D v tabulkách stránek

11. Realizace virtuální paměti

12. Rozsah logické adresy

13. Krátká odbočka – PAE (Physical Address Extension)

14. Virtuální režim 8086 (V86)

15. Spuštění procesu ve virtuálním režimu

16. Adresování ve virtuálním režimu

17. Virtuální režim 8086 neemuluje čip 8086

18. Shrnutí: co skutečně přinesl Intel 80386

19. Repositář s demonstračními příklady

20. Odkazy na Internetu

1. Nové vlastnosti čipů 80386: stránkování a virtuální režim 8086

V dnešní části seriálu o vývoji aplikací pro milovanou i nenáviděnou platformu IBM PC se seznámíme s dvojicí technologií, které byly představeny společně s mikroprocesorem Intel 80386. Tento čip, který byl v mnoha ohledech přelomový, totiž kromě rozšíření všech pracovních registrů na šířku třiceti dvou bitů, přidání nových dvou segmentových registrů, rozšíření adres na plných 32 bitů a možnosti přepnutí zpět z chráněného režimu do režimu reálného, navíc nabízel možnost zapnutí stránkování (paging) a taktéž programátorům poskytoval nový virtuální režim (virtual mode), který je známý i pod zkratkami V86, resp. VM86. Jak stránkování, tak i virtuální režim 86 se používaly po velmi dlouhou dobu (ve Windows pro spouštění DOSových aplikací, podobně pracuje i DOSEMU pro Linux). Navíc se s příchodem Pentia možnosti virtuálního režimu rozšířily (Virtual-8086 mode extensions: VME).

2. Obejití šestnáctibitového limitu při adresaci paměti

V dřívějším seriálu o vývoji aplikací pro slavné ZX Spectrum jsme se mj. zmiňovali i o tom, jakým způsobem je adresována operační paměť, ROM a VideoRAM. V případě mikroprocesoru Zilog Z80, který tvoří srdce ZX Spectra, se vlastně jednalo o relativně triviální technologii – adresa byla vypočtena na základě předané konstanty nebo registru a přímo tato adresa byla poslána na fyzickou adresovou sběrnici mikroprocesoru. Jinými slovy to znamenalo, že například logická adresa 0×1234 byla rovna fyzické adrese 0×1234. Rozsah logických a fyzických adres byl shodný: přesně 64kB.

Společně s rostoucí dostupnou kapacitou RAM se ovšem hledaly způsoby, jak i na osmibitových či šestnáctibitových mikroprocesorech adresovat RAM větší než oněch 64kB. Například do mikroprocesoru WDC 65c816 (následovník slavného MOS 6502) byly přidány dva nové osmibitové registry nazvané DB (Data Bank register) a PB (Program Bank register). Obsahy těchto registrů byly jednoduše připojeny k vypočtené šestnáctibitové adrese, takže vznikla adresa 24bitová, jejíž rozsah je 16MB, tedy 16× více, než u 8086 kombinující segment+offset (obsahy zmíněných registrů tvořily bity 16 až 23, zatímco bity 0 až 15 byly vypočteny běžným způsobem). A pokud se hodnota PB odlišovala od DB, došlo k oddělení kódu od dat. Výpočet fyzické adresy se sice zkomplikoval, ale jen minimálně (dokonce ani nebylo nutné použít sčítačku).

Poznámka: obdobu registrů PB/DB bylo možné realizovat i přímo v počítači. Poměrně velké množství osmibitových počítačů dokázalo díky přepínání bank (ať již implementovaných přímo výrobcem, nebo „dobastlených“ později) adresovat více než 64kB. Paměťové banky se vybíraly například přes obvod typu 8255 (či jeho obdobu) a v daný okamžik bylo k dispozici vždy jen maximálně oněch 64kB. Nebylo tedy možné například provádět skoky mezi bankami nebo (jednoduše) adresovat velká pole přesahující hranici banku.

3. Logická adresa, lineární adresa a fyzická adresa

Mikroprocesory Motorola 68000 (1979) a ARM (1985) dokázaly díky širším adresovým registrům limit 64kB bez problémů obejít. Například zmíněná Motorola 68000 měla 32bitové adresové registry a 24bitovou externí sběrnici, takže bylo možné adresovat 16MB RAM (v době uvedení tohoto čipu až neskutečná kapacita) a horních osm bitů adresových registrů mohlo nést tag atd. První čipy ARM měly limity nastaveny ještě výše – adresová sběrnice měla 26 bitů a paměťový rozsah 64MB.

Ovšem s příchodem platformy 80×86 se vše změnilo. Již u prvních mikroprocesorů Intel 8086/8088 se používalo adresování systémem segment+offset (to již dobře známe) a u mikroprocesoru Intel 80286 bylo navíc přidáno adresování na základě bázové adresy segmentu (taktéž známe z popisu deskriptorů). Jakoby to nestačilo, došlo u čipů Intel 80386 k dalšímu rozšíření adresovacího subsystému; tentokrát se jednalo o takzvané stránkování (paging). Všechna tato vylepšení vedla k tomu, že se na platformě 80×86 setkáme se třemi typy adres: logickou adresou, lineární adresou a fyzickou adresou.

Logická adresa je tvořena dvojicí segment+offset (resp. v chráněném režimu selektor+offset) a právě s těmito adresami pracují programátoři. V případě, že není povoleno stránkování, bude výsledkem součtu segmentu a offsetu či báze a offsetu přímo 32bitová fyzická adresa. Ovšem pokud je stránkování povoleno, bude z logické adresy segment+offset nebo selektor+offset nejprve vypočtena lineární 32bitová adresa. Teprve z této adresy se pomocí výpočtu nazývaného page translation (bude popsán dále) vypočte skutečná fyzická adresa. Hodnoty adres použitých v programu se tedy budou zcela odlišovat od hodnot, které zjistíme logickým analyzátorem při jeho připojení na adresovou sběrnici.

4. Výpočet lineární adresy na mikroprocesorech Intel 80386

Nejprve si ukažme, jakým způsobem se vypočítá lineární adresa z adresy logické. Logická adresa je tvořena dvojicí hodnot. První z těchto hodnot je uložena ve zvoleném segmentovém registru. Jedná se o šestnáctibitovou hodnotu, která v reálném režimu obsahuje přímo adresu (posunutou doleva o čtyři bity) a v chráněném režimu obsahuje index do tabulky deskriptorů. Druhá část logické adresy je specifikována konstantou, registrem, registrem s bází, dvojicí registrů atd. Součtem jednotlivých částí vznikne offset, který je na čipu 80386 obecně 32bitový. V reálném režimu je hodnota segmentového registru posunuta o zmíněné čtyři bity doleva a k výsledku je přičten ofset. Vznikne (obecně) 32bitová lineární adresa, v praxi však bude mít jen 21 bitů. V chráněném režimu je z příslušného deskriptoru získána báze a ta je přičtena k offsetu. Díky tomu, že báze je 32bitová, je výsledkem tohoto výpočtu 32bitová lineární adresa:

Poznámka: ve skutečnosti může mít logická adresa šířku 48 bitů. Tuto vlastnost si popíšeme ve dvanácté kapitole.

Obrázek 1: V deskriptorech je mj. uložena i 32bitová bázová adresa, ke které je připočten offset.
Zdroj: Intel 80386 Reference Programmer's Manual

Poznámka: povšimněte si, že i zde máme „přípravu“ na problém typu GATE A20, protože součtem dvou 32bitových hodnot obecně vznikne hodnota 33bitová. Ovšem při výpočtu lineární adresy je horní bit ignorován.

Celý výpočet lineární adresy z adresy logické (v chráněném režimu) je ukázán na druhém obrázku:

Obrázek 2: Schéma výpočtu adresy na mikroprocesorech Intel 80386.
Zdroj: Intel 80386 Reference Programmer's Manual

Poznámka: povšimněte si, že lineární adresa je rozdělena na tři bitová pole. Tato pole si popíšeme v dalších kapitolách.

5. Stránkování

Celý paměťový rozsah mikroprocesoru Intel 80386 (32bitů adresy = 4GB) je rozdělen do stránek o velikosti 4kB. Těchto stránek je celkem 1024×1024 = 1048576, přičemž u každé stránky lze nastavit, zda je určena pro čtení a/nebo zápis, zda je stránka dostupná, dále určit přístupová práva (user/supervisor) a navíc samotný HW nastavuje bit dirty v případě, že byla stránka modifikována, tj. pokud se změnil alespoň jeden její bit.

Informace o stránkách nejsou uloženy v jediném bloku s 1048576 záznamy (to by totiž znamenalo, že by se muselo alokovat 4MB jen pro tyto účely). Namísto toho je použit koncept dvou úrovní tabulek. První tabulka má maximálně 1024 záznamů a obsahuje adresy tabulek na druhé úrovni (těch může být maximálně 1024, ale typicky jich bývá méně). A až v těchto tabulkách druhé úrovně jsou uloženy informace o jednotlivých stránkách. V praxi mají tedy tabulky stránek dohromady menší velikost, než ony 4MB.

Poznámka: to, že je velikost stránky rovna 4kB, není náhoda. Je to praktická hodnota, protože stránky nejsou ani příliš malé (bylo by jich mnoho), ale ani příliš velké (potom by byla granularita pro některé účely příliš velká). Navíc 4kB znamenají dvanáct bitů offsetu, což poměrně elegantně umožňuje rozdělit lineární adresu na trojici bitových polí.

6. Praktický význam stránkování

Podpora stránkování je jednou z nejlepších technologií, které byly do čipů Intel 80386 přidány. Díky stránkování je totiž možné relativně snadno implementovat systém podporující větší množství úloh (v86), mezi kterými se lze přepínat. Navíc je možné realizovat (typicky na úrovni operačního systému nebo i jedné monolitické aplikace) virtuální paměť, přičemž vlastní RAM vlastně slouží jako rychlá cache ke stránkám ukládaným na pevný disk (swap). Systém (či monolitická aplikace) si v případě potřeby stránku, ke které se přistupuje, „dotáhne“ z disku, popř. naopak uloží na disk v případě, že dojde ke změně jejího obsahu (je nastaven bit dirty).

Poznámka: stránkování lze kombinovat se systémem selektor+deskriptor (chráněný režim), nebo se chráněný režim použije bez podpory stránkování – vše závisí na volbě vývojáře operačního systému nebo aplikace, která si sama systém spravuje.

7. Výpočet fyzické adresy při povolení stránkování

V případě, že je povoleno stránkování bitem ve speciálním registru CR0 (viz osmou kapitolu), bude se provádět výpočet fyzické adresy z adresy logické. Lineární 32bitová adresa je v tomto případě chápána jako trojice bitových polí:

Bity Význam/jméno
31..22 DIR
21..12 TABLE
11..00 offset

Nejvyšších deset bitů 31..22 lineární adresy obsahuje index do tabulky nazvané page directory. Bázová adresa této tabulky je uložena ve speciálním registru CR3 a každý záznam v této tabulce obsahuje 32bitovou hodnotu. Index má deset bitů, což znamená, že počet záznamů v této tabulce dosahuje maximálně hodnoty 1024. A vzhledem k tomu, že jsou zde uloženy 32bitové hodnoty (4 bajty), má celá tabulka maximální velikost 4kB – tedy přesně jednu stránku (adresa v registru CR3 musí začínat na začátku stránky; používají se bity 12–31).

Hodnota přečtená z tabulky page directory je opět chápána jako adresa, tentokrát konkrétně jako bázová adresa jedné z tabulek pojmenovaných page table. V praxi je tedy možné mít celkem 1024 tabulek stránek. A vzhledem k tomu, že každá page table může opět obsahovat 1024 záznamů, je možné mít teoreticky údaje o 210×210=220 stránek (tedy přes milion stránek). Víme již, že každá stránka má velikost 4kB (212 bajtů), takže tímto způsobem lze popsat celý paměťový rozsah mikroprocesoru Intel 80386: 220×212=232 bajtů. Ovšem díky tomu, že se používá dvojí mapování, tabulky mohou být v praxi menší (resp. přesněji řečeno může být méně page tables).

Index do vybrané page table je uložen ve druhém bitovém poli lineární adresy, tj. konkrétně v bitech 21..12. Z vybrané page table tedy přečteme adresu (a další údaje) o konkrétní stránce (4kB blok). K adrese této stránky již postačí pouze přidat offset uložený v bitech 11..00 bázové adresy a výsledkem bude fyzická adresa.

Celý výpočet fyzické adresy si můžeme i vizualizovat:

Obrázek 3: Stránkování a výpočet fyzické adresy z adresy logické.
Zdroj: Intel 80386 Reference Programmer's Manual

8. Povolení stránkování

V případě, že budeme chtít použít stránkování, je nutné nastavit tabulky s adresami, dále uložit počáteční adresu tabulky page directory do speciálního registru CR3 a posléze stránkování povolit, a to konkrétně přes jeden bit speciálního registru CR0. Tento registr již do jisté míry známe, protože jsme ho používali pro přepnutí do chráněného režimu a zpět do režimu reálného. Výpočet adresy s povolením stránkování resp. při jeho zákazu, je naznačen na dalším diagramu:

Obrázek 4: Stránkování musí být povoleno, jinak se fyzická adresa získá přímo z lineární adresy.
Zdroj: Intel 80386 Reference Programmer's Manual

Ukažme si nyní, jak se stránkování povoluje. Není to nic těžkého. Připomeňme si, že mikroprocesory Intel 80386 se v mnohém odlišují od původních dvou generací čipů 80×86. Došlo i k rozšíření původního šestnáctibitového registru MSW na 32bitový registr nazvaný CR0 (Control Register 0). I když se jedná o 32bitový registr, má význam opět pouze několik bitů, konkrétně sedm bitů. Přitom pět bitů má naprosto stejný význam, jako u MSW (interně se totiž jedná o shodný registr), jenže nás bude zajímat nejvyšší bit PG, kterým se stránkování povoluje či zakazuje:

Bit Označení Význam
0 PE povolení chráněného režimu (to nás dnes zajímá)
1 MP příznak, že je dostupný matematický koprocesor, na který je nutné čekat (ovlivňuje význam instrukce WAIT)
2 EM příznak emulace matematického koprocesoru (FP instrukce způsobí výjimku, na kterou lze reagovat)
3 TS nastaveno při přepnutí úlohy (v reálném režimu nemá význam)
4 ET rozlišení mezi koprocesorem 80287 a 80387 (popravdě netuším, k čemu je to dobré, prostě Intel)
5 NE řízení způsobu detekce výjimek matematického koprocesoru: buď se zpracují jako přerušení nebo jako výjimky
6–30   rezervováno
31 PG stránkování (paging) povoleno či zakázáno

Pro povolení stránkování by tedy měl postačovat tento kód, který ovšem předpokládá, že jsou korektně vyplněny adresy stránek (jinak dojde k výjimce v chráněném režimu nebo k zatuhnutí systému v režimu reálném):

    mov eax, cr0
    or  eax, 0x80000000 ; nastaveni priznaku chraneneho rezimu
    mov cr0, eax

9. Formát záznamů v tabulkách stránek

V předchozím textu jsme si řekli, jakým způsobem se z lineární adresy vypočte adresa fyzická. Připomeňme si, že adresa stránky (page) se získá dvojím mapováním – nejprve přes tabulku page directory a poté s využitím vybrané tabulky stránek (page table). K takto získané adrese stránky se přidá dvanáctibitový offset. Ovšem neprovádí se zde součet – pouze se vezme dvacet bitů s indexem stránky a k těmto dvaceti bitům se přidá onen dvanáctibitový offset, takže výsledkem bude 32bitová fyzická adresa. To ovšem znamená, že v tabulkách stránek jsou sice uloženy 32bitové hodnoty, ovšem spodních dvanáct bitů může být použito nějakým jiným způsobem, než pro uložení indexu stránky. Skutečně je tomu tak, protože spodních dvanáct bitů v každé page table má odlišný význam:

Bit Označení Stručný popis
0 P stránka je přítomná v paměti
1 R/W příznak pro čtení (pro uživatele)
2 U/S uživatelská nebo systémová stránka
3 0 rezervováno
4 0 rezervováno
5 A ke stránce se přistoupilo
6 D do stránky se zapisovalo
7 0 rezervováno
8 0 rezervováno
9 OS pro potřeby operačního systému
10 OS pro potřeby operačního systému
11 OS pro potřeby operačního systému

Můžeme zde vidět, že stránky jsou rozděleny do dvou skupin – systémové stránky a stránky pro „uživatele“, tedy pro aplikaci, kterou operační systém spustil (ring 3, supervisor/system odpovídá ringům 0 až 2). Taktéž je možné řídit, zda je stránka určena jen pro čtení nebo pro čtení i zápis. A konečně tři bity jsou vyhrazeny pro operační systém. Ten může tyto bity použít například pro implementaci algoritmu LRU – Least Recently Used (bude zde čítač počtu použití stránky). V případě, že je nutné nějakou stránku z paměti odstranit (aby se načetla stránka jiná), odstraní se ta stránka, která se používala nejméně často.

10. Význam bitů A a D v tabulkách stránek

V praxi jsou pro implementaci virtuální paměti velmi důležité bity A a D uložené v tabulkách stránek (pro každou stránku zvlášť). Před každým čtením libovolného bajtu ze stránky nastaví mikroprocesor (tedy hardware) bit A na jedničku. A taktéž před každým zápisem libovolného bajtu do stránky nastaví mikroprocesor bit D na jedničku. Označení těchto bitů jsou tedy odvozena od slov „accessed“ a „dirty“.

V případě, že dojde k situaci, kdy je nutné z disku načíst jinou stránku (viz další kapitolu), může systém na základě těchto dvou bitů zjistit, které stránky se používaly (a například modifikovat nejnižší tři bity, pokud se používá algoritmus LRU). Stránka, do které se nezapisovalo (D=0), se může bez problémů odstranit, zatímco stránka, do které byl proveden zápis, se musí celá uložit na disk (a proto může systém preferovat nahradit odlišnou stránku, aby se minimalizoval počet diskových operací).

11. Realizace virtuální paměti

S využitím stránkování lze realizovat jednoduchý systém s virtuální pamětí. Implementovat ho může buď operační systém, nebo i nějaká aplikace spouštěná přímo z DOSu (příkladem mohou být CAD systémy atd.). V tom nejjednodušším případě bude k dispozici adresový prostor o velikosti 4GB, což znamená 1024×1024=1048576 stránek, každá o velikosti 4kB. Naprostá většina počítačů vybavených čipem Intel 80386 samozřejmě neměla nainstalováno 4GB RAM (dokonce si dovolím tvrdit, že počítač s 386 a 4GB ani neexistoval, minimálně ne v oblasti PC), takže mnoho stránek bylo odloženo na disku v nějaké formě swap souboru.

Operační systém nebo aplikace si udržovaly informaci o tom, kde je stránka uložena (v RAM/na disku) na základě bitu P v tabulkách stránek. Například pro počítač s 4MB RAM bylo v paměti uloženo „jen“ 1024 stránek, přičemž při pokusu o čtení či zápis do stránky, která nebyla v RAM dostupná, došlo k výpadku – page fault. Informace o lineární adrese, která výpadek způsobila, se uložila do registru CR2, odkud ji mohl operační systém přečíst a příslušnou stránku následně z disku přenést do RAM. Zde musela načítaná stránka nahradit nějakou existující stránku. O kterou stránku se bude jednat, rozhodl operační systém, typicky na základě obsahu bitů A a D, o nichž jsme se již zmínili. Sofistikovanější schéma využívala tři volné bity pro čítače algoritmu LRU atd.

Poznámka: i samotné tabulky stránek (page tables) mohly být „odswapovány“ (ostatně zcela naplněné tabulky stránek by zabraly celé 4MB). Jediná tabulka, která byla vždy uložena v paměti, je primární tabulka page directory.

12. Rozsah logické adresy

Vraťme se ještě na chvíli k logickým adresám a ke konceptu selektor+offset. Připomeňme si, že selektor má šířku šestnácti bitů a offset má na 386 obecně šířku 32 bitů. V reálném režimu, kde se namísto selektoru přímo používá číslo segmentu, se obě adresy částečně překrývají, ovšem v chráněném režimu tomu tak být nemusí – systém totiž může být teoreticky nakonfigurován takovým způsobem, že se čtrnáct (nikoli šestnáct) bitů selektoru připojí k třiceti dvěma bitům offsetu a vznikne tak logická 46bitová adresa.

Proto se můžeme v některých materiálech dočíst, že mikroprocesory Intel 386 podporují 246=64 TB virtuální paměti, ovšem pouze teoreticky. V praxi jsme stále omezeni stránkováním na 32bitový rozsah, ovšem lze namítnout, že stránkování lze vypnout a realizovat virtuální paměť čistě softwarově jen v chráněném režimu. V takovém případě jsou omezení daná tím, jaké údaje lze uložit do deskriptorů (index deskriptoru je vybírán selektorem):

  • Bázová adresa je 32bitová
  • Limit velikosti segmentu je dvacetibitový (1MB), ovšem přepnutím granularity může být nastaven až na 4GB.

Z toho plyne, že z pohledu HW mikroprocesoru Intel 80386 jsme stále omezeni na 4GB virtuální paměti, i když softwarově by bylo možné realizovat i vyšší kapacity (ovšem například by se musely programově realizovat techniky nastavování bitů A a D atd.).

13. Krátká odbočka – PAE (Physical Address Extension)

Výše uvedený způsob práce s fyzickou i virtuální pamětí byl realizován, jak již dobře víme, na mikroprocesorech Intel 80386. Tyto mikroprocesory začaly být nabízeny v roce 1985, kdy omezení na 4GB vůbec nebylo chápáno jako reálné omezení, ale jako rozumně vzdálená hranice. Schéma stránkování realizované v 80386 vydrželo celých deset let, konkrétně do roku 1995, kdy se již začalo jednat o reálné omezení (ostatně se podívejte sami, kolik máte operační paměti a jak velký je virtuální prostor se swapem). Právě v roce 1995 totiž začal být nabízen mikroprocesor Pentium Pro s technologií nazvanou PAE neboli Physical Address Extension. Pokud bylo PAE povoleno, byly adresy stránek opět hierarchické, ovšem namísto hierarchie založené na dvou úrovních se používaly tři úrovně. Ovšem důležitější bylo, že adresy uložené v tabulkách stránek měly namísto dvaceti bitů šířku 24 bitů.

Díky tomu se rozšířil adresní rozsah mikroprocesorů (pro virtuální paměť). Už zde neexistovala hranice 4GB, protože 24 bitů s indexem stránky se spojilo s dvanácti bity offsetu a výsledkem byla adresa o šířce 224+12=236 neboli 64GB. Ovšem každý proces stále mohl použít pouze 4GB, protože lineární adresa měla stále šířku jen 32 bitů (tedy například javovský JVM byl omezen na 4GB, reálně vlastně jen na 2GB). Změna přišla až s čipy, které podporovaly 64bitové adresy. To je již však téma na samostatný článek.

14. Virtuální režim 8086 (V86)

Kromě stránkování nabízel mikroprocesor Intel 80386 programátorům další často používanou technologii. Jednalo se o podporu takzvaného virtuálního režimu 8086, který byl označován zkratkou V86. Společnost Intel tak reagovala na to, v jakých oblastech se její čipy řady 80×86 používaly. Předchozí čip 80286 byl evidentně navržen pro počítače s pokročilejšími operačními systémy, které by dokázaly využít chráněný režim (a tímto způsobem by byly psány i aplikace) a vůbec se ani nepředpokládalo, že by se z chráněného režimu vracelo zpět do režimu reálného (ten totiž sloužil, resp. měl sloužit, jen pro inicializaci operačního systému).

Skutečnost však byla prozaičtější, protože prakticky všechny vyrobené 80286 byly zakomponovány do „běžných PC“, na nichž byl provozován systém DOS běžící v reálném režimu. A na tento systém/režim byly naprogramovány tisíce aplikací, které nikdo pro chráněný režim nepřepisoval. I přes možnosti 80286 se tedy mikroprocesor stále používal jako „trošku lepší a rychlejší“ 8086.

Nový virtuální režim 8086 tento stav akceptoval a nabízel zajímavou možnost – na počítači s čipem Intel 80386 mohlo být spuštěno více úloh (procesů), přičemž bylo možné provádět přepínání mezi těmito procesy. Navíc tyto procesy běžely ve (virtualizovaném) prostředí, které se chovalo tak, jakoby proces běžel na čipu 8086 v reálném režimu. Tento proces měl navíc (z pohledu programátora) přístup k celému 1MB RAM, ale například i ke vstupně-výstupním portům. Reálně však byl přístup realizován takovým způsobem, že se o vstupně-výstupní porty procesy dělily a přístup byl řízen operačním systémem.

15. Spuštění procesu ve virtuálním režimu

Otestování, zda se procesor nachází ve virtuálním režimu, lze provést přečtením bitu číslo 17 z registru EFLAGS. Jedná se o rozšíření původního šestnáctibitového registru FLAGS (8086) o dalších šestnáct bitů. EFLAGS obsahuje tyto důležité bity (postupně se přidávaly další bity, jak je na platformě 80×86 zvykem):

Index bitu Označení Význam
0 CF Carry flag
2 PF Parity flag
4 AF Auxiliary flag
6 ZF Zero flag
7 SF Sign flag
8 TF Trap flag
9 IF Interrupt enable flag
10 DF Direction flag
11 OF Overflow flag
12–13 IOPL I/O privilege level (ne pro reálný režim)
14 NT Nested task flag
16 RF Resume flag
17 VM Virtual 8086 mode flag
18 AC Alignment check
19 VIF Virtual interrupt flag
20 VIP Virtual interrupt pending
21 ID Able to use CPUID instruction

Stejný bit (tedy bit nazvaný VM) se používá pro přechod do virtuálního režimu. Otázkou ovšem zůstává, jak se vlastně provádí zápis do tohoto registru. Přímý přístup není možný, protože instrukce LAHF a SAHF pracují jen se spodními šestnácti bity), takže nám teoreticky zbývají instrukce PUSHFD a POPFD. První z těchto instrukcí uloží EFLAGS na zásobník a druhá instrukce naopak načte hodnotu umístěnou na vrcholu zásobníku a uloží ji do EFLAGS. Teoreticky tedy můžeme uložit EFLAGS na zásobník, načíst ho do registru EAX, nastavit bit číslo 17 na jedničku, uložit zpět na zásobník a zavolat POPFD. Příslušný kód by mohl vypadat následovně:

enable_vm86:
        pushfd                        ; uložit EFLAGS na zásobník
        pop  eax                      ; přečíst ho do EAX
        or   eax, 0b10000000000000000 ; nastavit bit číslo 17
        push eax                      ; uložit modifikovanou hodnotu zpět na zásobník
        popfd                         ; obnovit EFLAGS ze zásobníku

Ovšem zrovna bit číslo 17 nelze tímto způsobem v běžných uživatelských úlohách (ring 3) změnit, takže se používá trik – zavolá se instrukce IRET, která kromě dalších operací obnovuje i obsah registru EFLAGS (ve skutečnosti je to poněkud složitější: zrovna instrukce IRET se totiž chová různě v odlišných režimech). Postačuje tedy vhodným způsobem modifikovat hodnoty uložené na zásobníku a zavolat IRET pro přechod do virtuálního režimu.

Ovšem ještě před přechodem do virtuálního režimu je nutné provést přípravné operace. Ty se týkají chování procesoru v těch případech, v nichž by jedna VM86 úloha mohla ovlivnit jinou úlohu. Konkrétně se to týká přístupu na I/O porty a taktéž o obsluhu výjimek, protože ty by měl zpracovávat monitor (tj. součást systému, která virtuální úlohy řídí). Dále je nutné korektně zpracovat „citlivé“ instrukce, tj. instrukce, které pracují se systémem přerušení, popř. které zamykají sběrnici. Jedná se o tyto instrukce:

  1. CLI – změna příznaku povolení přerušení
  2. STI – změna příznaku povolení přerušení
  3. LOCK – uzamčení sběrnice
  4. PUSHF/PUSHFD – manipulace s FLAGS/EFLAGS, kde je umístěn i příznak povolení přerušení
  5. POPF/POPFD – manipulace s FLAGS/EFLAGS, kde je umístěn i příznak povolení přerušení
  6. INT – vyvolání softwarového přerušení
  7. IRET – návrat z přerušení (opět se zde pracuje s FLAGS nebo EFLAGS)

Pravděpodobně nejdůležitější je instrukce INT používaná mj. pro volání služeb BIOSu a DOSu. Zavolání této instrukce dokáže procesor detekovat a předat řízení zpět monitoru (procesor tedy přejde z virtuálního režimu zpět do režimu chráněného). Monitor, pokud je korektně napsaný, bude emulovat příslušné služby BIOSu/DOSu (nebo je přímo zavolá).

Všechny manipulace s příznakem přerušení taktéž musejí být hlídány, protože úloha běžící v reálném režimu může přerušení zakázat (ostatně je to jediný běžící proces). Ovšem v režimu VM86 se obecně souběžně provozuje více úloh a není tedy možné například zakázat přerušení od časovače, který slouží pro jejich přepínání (task switching).

Poznámka: teoreticky lze tyto „limity“ obejít instrukcí LOADALL, která tak představuje Intelovská zadní vrátka.

16. Adresování ve virtuálním režimu

Pokud proces běží ve virtuálním režimu, nepoužívá se pro adresování systém založený na selektorech a offsetech. Namísto toho je adresa vypočtena podobně, jako v režimu reálném – hodnota segmentového registru se posune doleva o čtyři bity a přičte se k offsetu. Výsledkem je obecně 32bitová adresa, ovšem reálně má tato adresa šířku jen 21 bitů (tedy známý limit 1MB + necelých 64kB, stejně jako v reálném režimu). Ovšem z předchozího textu již víme, že může být souběžně spuštěno větší množství úloh (procesů) ve virtuálním režimu, takže se nabízí otázka, jak se vlastně tyto procesy dělí o stejný adresový prostor. Je to jednoduché (a vlastně i elegantní) – ona 21bitová lineární adresa je převedena na fyzickou adresu s využitím stránkování. Tj. v praxi se dokáže programátor systému (monitoru), ale i aplikací psaných pro virtuální režim prakticky zcela obejít bez selektorů, deskriptorů atd. (interně se používají, ale většinu práce odvede jednotka pro mapování stránek do fyzické paměti).

Poznámka: to ovšem také znamená, že bylo možné spustit větší množství úloh ve virtuálním režimu, jejichž celkové paměťové nároky přesáhnou kapacitu RAM. Řekněme, že lepší počítač s mikroprocesorem Intel 80386 měl 4MB RAM. Na tomto počítači bylo možné spustit například šest aplikací ve virtuálním režimu (takže 6×1MB + desítky kilobajtů pro monitor), ovšem stránkování a realizace swapu dokázala zajistit i tuto funkcionalitu (v praxi by to samozřejmě bylo velmi pomalé, pokud by se úlohy přepínaly s větší frekvencí; toto řešení se hodilo spíše pro odkládání úloh na pozadí).

17. Virtuální režim 8086 neemuluje čip 8086

Mohlo by se zdát, že virtuální režim 8086 umožňuje běh většího množství úloh v prostředí, které odpovídá starším PC s čipy 8086 a 8088. Ve skutečnosti tomu tak není, protože ve virtuálním režimu lze používat některé nové vlastnosti čipů 80386 a navíc se chování liší i v jiných oblastech. Ona emulace 8086 tedy není dokonalá, což ale pro naprostou většinu aplikací nevadí:

  • Instrukce jsou obecně prováděny v menším počtu cyklů, což je většinou vítaná vlastnost, ale některý starší SW nemusel správně fungovat kvůli zpožďovacím smyčkám, které počítaly s konkrétními počty cyklů u některých instrukcí.
  • Rozdílné chování u výjimky při dělení instrukcí DIV. U 386 je v CS:IP adresa instrukce, která výjimku způsobila, u 8086 je to následující instrukce (což musí řešit například debuggery).
  • Všechny neznámé instrukce způsobí výjimku 6; procesor se je tedy nebude snažit interpretovat.
  • Instrukce delší než 15 bajtů způsobí výjimku 13; u 8086 se teoreticky mohou například opakovat prefixy a operační kód instrukce může být delší.
  • Bitové posuny a rotace jsou omezeny na 31 bitů (u rotací je to v praxi asi jedno, ale u posunů se liší výsledky).
  • Instrukce PUSH SP ukládá původní obsah SP, kdežto u 8086 je to již snížená hodnota.
  • Obsah registru FLAGS se při ukládání na zásobník modifikuje, což se týká bitů 12–15.
  • Nově není možné překročit velikost segmentu u 16bitových operací (například pokus o čtení/zápis slova na offset 65535, nebo uložení 16bitového slova do zásobníku, když je SP=1). Tyto operace způsobí výjimku 13, zatímco u původních čipů offset přetekl/podtekl v rámci jednoho segmentu.
  • Totéž platí u blokových a řetězcových instrukcí, pokud překročí velikost segmentu (na původních čipech se přeteklo na začátek segmentu nebo na jeho konec – podle nastavení bitu direction).
  • Rozdílné chování instrukce IDIV pro zbytky 0×80 a 0×8000. Toto je zajímavá vlastnost, protože čipy 8086/8088 vrací v tomto případě nulový zbytek, zatímco u 80386 je to největší možné záporné číslo.
  • Liší se i chování matematického koprocesoru, to je však problematika, které se budeme podrobněji věnovat příště.
Poznámka: v případě, že aplikace počítá s výše uvedeným chováním čipů 8086/8088, nebude ve virtuálním režimu pracovat korektně (například rychlý běh hry kvůli odlišné délce instrukcí, špatná reakce na přerušení, obecně nebudou pracovat starší debuggery atd.) nebo dojde k jejímu pádu. Takové aplikace obecně není možné spustit jako „úlohy DOS“ ve Windows.

18. Shrnutí: co skutečně přinesl Intel 80386

Mikroprocesor Intel 80386 díky podpoře 32bitových operací (a 32bitových pracovních registrů), technologii stránkování i virtuálního režimu 8086 dokázal zajistit vývoj pokročilejších operačních systémů, které ovšem navíc stále umožňovaly (nebo mohly umožňovat) provoz starších aplikací určených pro běh v reálném režimu v systému DOS (ještě nedávno jsem například viděl aplikace psané ve FoxPro, tedy pro DOS). To se ukázala být velmi dobrá strategie, zejména v oblasti „Wintel“, tedy PCček, v nichž existuje (a prakticky vždy existovala) snaha o zachování zpětné kompatibility, a to až na úroveň strojového kódu.

Není ostatně bez zajímavosti, že následník čipu 80386, tedy mikroprocesory 80486, sice byly rychlejší a měly integrovanou cache (popř. i matematický koprocesor, pokud se jednalo o variantu DX), ale již nepřinesly žádný nový režim práce mikroprocesoru a jejich instrukční soubor byl prakticky totožný s předchůdcem 80386 (až na několik nových instrukcí CMPXCHG, INVD, INVLPG, WBINVD a XADD). A ostatně i první generace Pentií (P5), která přinesla superskalární architekturu, se vlastně z pohledu možností nabízených programátorům příliš nelišila od v té době již zastaralého modelu 80386 (bylo přidáno jen několik instrukcí CPUID, CMPXCHG8B, RDTSC, RDMSR, WRMSR, RSM a většina ostatních instrukcí se zde prováděla mnohem rychleji a popř. v páru s jinou instrukcí).

Mikroprocesory postavené na původní architektuře Intel 80386 se stále používají, a to například v oblasti vestavěných systémů (specializované varianty, například 80376 bez reálného režimu nebo známější 80386EX, který lze najít v družicích atd.) a taktéž v průmyslových PC, kde se provozuje buď stále DOS nebo QNX. Mimochodem: čipy odvozené od 286, 386 i 486 se používají i v Airbusech (fly by wire): https://cqr2016.ieee-cqr.org/06-ETR-RT16_Yeh.pdf. Z těchto pohledů se tedy jednalo o velmi úspěšný čip, na rozdíl řady 286, jejíž ambice byly „zabity“ tím, že se tento čip používal primárně v PC s DOSovými aplikacemi.

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_mov­sb_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_mov­sb_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_mov­sb_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_mo­de286.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_mo­de386.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

20. Odkazy na Internetu

  1. The Intel 8088 Architecture and Instruction Set
    https://people.ece.ubc.ca/~ed­c/464/lectures/lec4.pdf
  2. x86 Opcode Structure and Instruction Overview
    https://pnx.tf/files/x86_op­code_structure_and_instruc­tion_overview.pdf
  3. x86 instruction listings (Wikipedia)
    https://en.wikipedia.org/wi­ki/X86_instruction_listin­gs
  4. x86 assembly language (Wikipedia)
    https://en.wikipedia.org/wi­ki/X86_assembly_language
  5. Intel Assembler (Cheat sheet)
    http://www.jegerlehner.ch/in­tel/IntelCodeTable.pdf
  6. 25 Microchips That Shook the World
    https://spectrum.ieee.org/tech-history/silicon-revolution/25-microchips-that-shook-the-world
  7. Chip Hall of Fame: MOS Technology 6502 Microprocessor
    https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-mos-technology-6502-microprocessor
  8. Chip Hall of Fame: Intel 8088 Microprocessor
    https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-intel-8088-microprocessor
  9. Jak se zrodil procesor?
    https://www.root.cz/clanky/jak-se-zrodil-procesor/
  10. Apple II History Home
    http://apple2history.org/
  11. The 8086/8088 Primer
    https://www.stevemorse.or­g/8086/index.html
  12. flat assembler: Assembly language resources
    https://flatassembler.net/
  13. FASM na Wikipedii
    https://en.wikipedia.org/wiki/FASM
  14. Fresh IDE FASM inside
    https://fresh.flatassembler.net/
  15. MS-DOS Version 4.0 Programmer's Reference
    https://www.pcjs.org/docu­ments/books/mspl13/msdos/dos­ref40/
  16. DOS API (Wikipedia)
    https://en.wikipedia.org/wiki/DOS_API
  17. Bit banging
    https://en.wikipedia.org/wi­ki/Bit_banging
  18. IBM Basic assembly language and successors (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Basic_assembly_lan­guage_and_successors
  19. X86 Assembly/Bootloaders
    https://en.wikibooks.org/wi­ki/X86_Assembly/Bootloaders
  20. Počátky grafiky na PC: grafické karty CGA a Hercules
    https://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/
  21. 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/
  22. Karta EGA: první použitelná barevná grafika na PC
    https://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/
  23. RGB Classic Games
    https://www.classicdosgames.com/
  24. Turbo Assembler (Wikipedia)
    https://en.wikipedia.org/wi­ki/Turbo_Assembler
  25. Microsoft Macro Assembler
    https://en.wikipedia.org/wi­ki/Microsoft_Macro_Assembler
  26. IBM Personal Computer (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Personal_Computer
  27. Intel 8251
    https://en.wikipedia.org/wi­ki/Intel_8251
  28. Intel 8253
    https://en.wikipedia.org/wi­ki/Intel_8253
  29. Intel 8255
    https://en.wikipedia.org/wi­ki/Intel_8255
  30. Intel 8257
    https://en.wikipedia.org/wi­ki/Intel_8257
  31. Intel 8259
    https://en.wikipedia.org/wi­ki/Intel_8259
  32. Support/peripheral/other chips – 6800 family
    http://www.cpu-world.com/Support/6800.html
  33. Motorola 6845
    http://en.wikipedia.org/wi­ki/Motorola_6845
  34. The 6845 Cathode Ray Tube Controller (CRTC)
    http://www.tinyvga.com/6845
  35. CRTC operation
    http://www.6502.org/users/an­dre/hwinfo/crtc/crtc.html
  36. The 6845 Cathode Ray Tube Controller (CRTC)
    http://www.tinyvga.com/6845
  37. Motorola 6845 and bitwise graphics
    https://retrocomputing.stac­kexchange.com/questions/10996/mo­torola-6845-and-bitwise-graphics
  38. IBM Monochrome Display Adapter
    http://en.wikipedia.org/wi­ki/Monochrome_Display_Adap­ter
  39. Color Graphics Adapter
    http://en.wikipedia.org/wi­ki/Color_Graphics_Adapter
  40. Color Graphics Adapter and the Brown color in IBM 5153 Color Display
    https://www.aceinnova.com/en/e­lectronics/cga-and-the-brown-color-in-ibm-5153-color-display/
  41. The Modern Retrocomputer: An Arduino Driven 6845 CRT Controller
    https://hackaday.com/2017/05/14/the-modern-retrocomputer-an-arduino-driven-6845-crt-controller/
  42. flat assembler: Assembly language resources
    https://flatassembler.net/
  43. FASM na Wikipedii
    https://en.wikipedia.org/wiki/FASM
  44. Fresh IDE FASM inside
    https://fresh.flatassembler.net/
  45. MS-DOS Version 4.0 Programmer's Reference
    https://www.pcjs.org/docu­ments/books/mspl13/msdos/dos­ref40/
  46. DOS API (Wikipedia)
    https://en.wikipedia.org/wiki/DOS_API
  47. IBM Basic assembly language and successors (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Basic_assembly_lan­guage_and_successors
  48. X86 Assembly/Arithmetic
    https://en.wikibooks.org/wi­ki/X86_Assembly/Arithmetic
  49. Art of Assembly – Arithmetic Instructions
    http://oopweb.com/Assembly/Do­cuments/ArtOfAssembly/Volu­me/Chapter6/CH06–2.html
  50. ASM Flags
    http://www.cavestory.org/gu­ides/csasm/guide/asm_flag­s.html
  51. Status Register
    https://en.wikipedia.org/wi­ki/Status_register
  52. Linux assemblers: A comparison of GAS and NASM
    http://www.ibm.com/develo­perworks/library/l-gas-nasm/index.html
  53. Programovani v assembleru na OS Linux
    http://www.cs.vsb.cz/gryga­rek/asm/asmlinux.html
  54. Is it worthwhile to learn x86 assembly language today?
    https://www.quora.com/Is-it-worthwhile-to-learn-x86-assembly-language-today?share=1
  55. Why Learn Assembly Language?
    http://www.codeproject.com/Ar­ticles/89460/Why-Learn-Assembly-Language
  56. Is Assembly still relevant?
    http://programmers.stackex­change.com/questions/95836/is-assembly-still-relevant
  57. Why Learning Assembly Language Is Still a Good Idea
    http://www.onlamp.com/pub/a/on­lamp/2004/05/06/writegreat­code.html
  58. Assembly language today
    http://beust.com/weblog/2004/06/23/as­sembly-language-today/
  59. Assembler: Význam assembleru dnes
    http://www.builder.cz/rubri­ky/assembler/vyznam-assembleru-dnes-155960cz
  60. Programming from the Ground Up Book – Summary
    http://savannah.nongnu.or­g/projects/pgubook/
  61. DOSBox
    https://www.dosbox.com/
  62. The C Programming Language
    https://en.wikipedia.org/wi­ki/The_C_Programming_Langu­age
  63. Hercules Graphics Card (HCG)
    https://en.wikipedia.org/wi­ki/Hercules_Graphics_Card
  64. Complete 8086 instruction set
    https://content.ctcd.edu/cou­rses/cosc2325/m22/docs/emu8086in­s.pdf
  65. Complete 8086 instruction set
    https://yassinebridi.github.io/asm-docs/8086_instruction_set.html
  66. 8088 MPH by Hornet + CRTC + DESiRE (final version)
    https://www.youtube.com/wat­ch?v=hNRO7lno_DM
  67. Area 5150 by CRTC & Hornet (Party Version) / IBM PC+CGA Demo, Hardware Capture
    https://www.youtube.com/wat­ch?v=fWDxdoRTZPc
  68. 80×86 Integer Instruction Set Timings (8088 – Pentium)
    http://aturing.umcs.maine­.edu/~meadow/courses/cos335/80×86-Integer-Instruction-Set-Clocks.pdf
  69. Colour Graphics Adapter: Notes
    https://www.seasip.info/Vin­tagePC/cga.html
  70. Restoring A Vintage CGA Card With Homebrew HASL
    https://hackaday.com/2024/06/12/res­toring-a-vintage-cga-card-with-homebrew-hasl/
  71. Demoing An 8088
    https://hackaday.com/2015/04/10/de­moing-an-8088/
  72. Video Memory Layouts
    http://www.techhelpmanual.com/89-video_memory_layouts.html
  73. Screen Attributes
    http://www.techhelpmanual.com/87-screen_attributes.html
  74. IBM PC Family – BIOS Video Modes
    https://www.minuszerodegre­es.net/video/bios_video_mo­des.htm
  75. EGA Functions
    https://cosmodoc.org/topics/ega-functions/#the-hierarchy-of-the-ega
  76. 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/
  77. How 16 colors saved PC gaming – the story of EGA graphics
    https://www.custompc.com/retro-tech/ega-graphics
  78. List of 16-bit computer color palettes
    https://en.wikipedia.org/wi­ki/List_of16-bit_computer_color_palettes
  79. Why were those colors chosen to be the default palette for 256-color VGA?
    https://retrocomputing.stac­kexchange.com/questions/27994/why-were-those-colors-chosen-to-be-the-default-palette-for-256-color-vga
  80. VGA Color Palettes
    https://www.fountainware.com/EX­PL/vga_color_palettes.htm
  81. Hardware Level VGA and SVGA Video Programming Information Page
    http://www.osdever.net/Fre­eVGA/vga/vga.htm
  82. Hardware Level VGA and SVGA Video Programming Information Page – sequencer
    http://www.osdever.net/Fre­eVGA/vga/seqreg.htm
  83. VGA Basics
    http://www.brackeen.com/vga/ba­sics.html
  84. Introduction to VGA Mode ‚X‘
    https://web.archive.org/web/20160414072210/htt­p://fly.srk.fer.hr/GDM/ar­ticles/vgamodex/vgamx1.html
  85. VGA Mode-X
    https://web.archive.org/web/20070123192523/htt­p://www.gamedev.net/referen­ce/articles/article356.asp
  86. Mode-X: 256-Color VGA Magic
    https://downloads.gamedev­.net/pdf/gpbb/gpbb47.pdf
  87. Instruction Format in 8086 Microprocessor
    https://www.includehelp.com/embedded-system/instruction-format-in-8086-microprocessor.aspx
  88. How to use „AND,“ „OR,“ and „XOR“ modes for VGA Drawing
    https://retrocomputing.stac­kexchange.com/questions/21936/how-to-use-and-or-and-xor-modes-for-vga-drawing
  89. VGA Hardware
    https://wiki.osdev.org/VGA_Hardware
  90. Programmer's Guide to Yamaha YMF 262/OPL3 FM Music Synthesizer
    https://moddingwiki.shika­di.net/wiki/OPL_chip
  91. Does anybody understand how OPL2 percussion mode works?
    https://forum.vcfed.org/in­dex.php?threads/does-anybody-understand-how-opl2-percussion-mode-works.60925/
  92. Yamaha YMF262 OPL3 music – MoonDriver for OPL3 DEMO [Oscilloscope View]
    https://www.youtube.com/watch?v=a7I-QmrkAak
  93. Yamaha OPL vs OPL2 vs OPL3 comparison
    https://www.youtube.com/wat­ch?v=5knetge5Gs0
  94. OPL3 Music Crockett's Theme
    https://www.youtube.com/wat­ch?v=HXS008pkgSQ
  95. Bad Apple (Adlib Tracker – OPL3)
    https://www.youtube.com/wat­ch?v=2lEPH6Y3Luo
  96. FM Synthesis Chips, Codecs and DACs
    https://www.dosdays.co.uk/to­pics/fm_synthesizers.php
  97. The Zen Challenge – YMF262 OPL3 Original (For an upcoming game)
    https://www.youtube.com/wat­ch?v=6JlFIFz1CFY
  98. [adlib tracker II techno music – opl3] orbit around alpha andromedae I
    https://www.youtube.com/wat­ch?v=YqxJCu_WFuA
  99. [adlib tracker 2 music – opl3 techno] hybridisation process on procyon-ii
    https://www.youtube.com/wat­ch?v=daSV5mN0sJ4
  100. Hyper Duel – Black Rain (YMF262 OPL3 Cover)
    https://www.youtube.com/wat­ch?v=pu_mzRRq8Ho
  101. IBM 5155–5160 Technical Reference
    https://www.minuszerodegre­es.net/manuals/IBM/IBM_5155_5160_Techni­cal_Reference_6280089_MAR86­.pdf
  102. a ymf262/opl3+pc speaker thing i made
    https://www.youtube.com/watch?v=E-Mx0lEmnZ0
  103. [OPL3] Like a Thunder
    https://www.youtube.com/wat­ch?v=MHf06AGr8SU
  104. (PC SPEAKER) bad apple
    https://www.youtube.com/wat­ch?v=LezmKIIHyUg
  105. Powering devices from PC parallel port
    http://www.epanorama.net/cir­cuits/lptpower.html
  106. Magic Mushroom (demo pro PC s DOSem)
    http://www.crossfire-designs.de/download/articles/sou­ndcards//mushroom.rar
  107. Píseň Magic Mushroom – originál
    http://www.crossfire-designs.de/download/articles/sou­ndcards/speaker_mushroom_con­verted.mp3
  108. Píseň Magic Mushroom – hráno na PC Speakeru
    http://www.crossfire-designs.de/download/articles/sou­ndcards/speaker_mushroom_spe­aker.mp3
  109. Pulse Width Modulation (PWM) Simulation Example
    http://decibel.ni.com/content/docs/DOC-4599
  110. Resistor/Pulse Width Modulation DAC
    http://www.k9spud.com/trax­mod/pwmdac.php
  111. Class D Amplifier
    http://en.wikipedia.org/wi­ki/Electronic_amplifier#Clas­s_D
  112. Covox Speech Thing / Disney Sound Source (1986)
    http://www.crossfire-designs.de/index.php?lang=en&what=ar­ticles&name=showarticle.htm&ar­ticle=soundcards/&page=5
  113. Covox Digital-Analog Converter (Rusky, obsahuje schémata)
    http://phantom.sannata.ru/kon­kurs/netskater002.shtml
  114. PC-GPE on the Web
    http://bespin.org/~qz/pc-gpe/
  115. Keyboard Synthesizer
    http://www.solarnavigator­.net/music/instruments/ke­yboards.htm
  116. FMS – Fully Modular Synthesizer
    http://fmsynth.sourceforge.net/
  117. Javasynth
    http://javasynth.sourceforge.net/
  118. Software Sound Synthesis & Music Composition Packages
    http://www.linux-sound.org/swss.html
  119. Mx44.1 Download Page (software synthesizer for linux)
    http://hem.passagen.se/ja_linux/
  120. Software synthesizer
    http://en.wikipedia.org/wi­ki/Software_synthesizer
  121. Frequency modulation synthesis
    http://en.wikipedia.org/wi­ki/Frequency_modulation_syn­thesis
  122. Yamaha DX7
    http://en.wikipedia.org/wi­ki/Yamaha_DX7
  123. Wave of the Future
    http://www.wired.com/wired/ar­chive/2.03/waveguides_pr.html
  124. Analog synthesizer
    http://en.wikipedia.org/wi­ki/Analog_synthesizer
  125. Minimoog
    http://en.wikipedia.org/wiki/Minimoog
  126. Moog synthesizer
    http://en.wikipedia.org/wi­ki/Moog_synthesizer
  127. Tutorial for Frequency Modulation Synthesis
    http://www.sfu.ca/~truax/fmtut.html
  128. An Introduction To FM
    http://ccrma.stanford.edu/sof­tware/snd/snd/fm.html
  129. John Chowning
    http://en.wikipedia.org/wi­ki/John_Chowning
  130. I'm Impressed, Adlib Music is AMAZING!
    https://www.youtube.com/wat­ch?v=PJNjQYp1ras
  131. Milinda- Diode Milliampere ( OPL3 )
    https://www.youtube.com/wat­ch?v=oNhazT5HG0E
  132. Dune 2 – Roland MT-32 Soundtrack
    https://www.youtube.com/wat­ch?v=kQADZeB-z8M
  133. Interrupts
    https://wiki.osdev.org/In­terrupts#Types_of_Interrup­ts
  134. Assembly8086SoundBlasterDma­SingleCycleMode
    https://github.com/leonardo-ono/Assembly8086SoundBlas­terDmaSingleCycleMode/blob/mas­ter/sbsc.asm
  135. Interrupts in 8086 microprocessor
    https://www.geeksforgeeks­.org/interrupts-in-8086-microprocessor/
  136. Interrupt Structure of 8086
    https://www.eeeguide.com/interrupt-structure-of-8086/
  137. A20 line
    https://en.wikipedia.org/wi­ki/A20_line
  138. Extended memory
    https://en.wikipedia.org/wi­ki/Extended_memory#eXtended_Me­mory_Specification_(XMS)
  139. Expanded memory
    https://en.wikipedia.org/wi­ki/Expanded_memory
  140. Protected mode
    https://en.wikipedia.org/wi­ki/Protected_mode
  141. Virtual 8086 mode
    https://en.wikipedia.org/wi­ki/Virtual_8086_mode
  142. Unreal mode
    https://en.wikipedia.org/wi­ki/Unreal_mode
  143. DOS memory management
    https://en.wikipedia.org/wi­ki/DOS_memory_management
  144. Upper memory area
    https://en.wikipedia.org/wi­ki/Upper_memory_area
  145. Removing the Mystery from SEGMENT : OFFSET Addressing
    https://thestarman.pcminis­try.com/asm/debug/Segments­.html
  146. Segment descriptor
    https://en.wikipedia.org/wi­ki/Segment_descriptor
  147. 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/qu­estions/45094696/when-using-a-32-bit-register-to-address-memory-in-the-real-mode-contents-of-the
  148. A Brief History of Unreal Mode
    https://www.os2museum.com/wp/a-brief-history-of-unreal-mode/
  149. Segment Limits
    https://wiki.osdev.org/Segment_Limits
  150. How do 32 bit addresses in real mode work?
    https://forum.osdev.org/vi­ewtopic.php?t=30642
  151. The LOADALL Instruction by Robert Collins
    https://www.rcollins.org/ar­ticles/loadall/tspec_a3_doc­.html
  152. How do you put a 286 in Protected Mode?
    https://retrocomputing.stac­kexchange.com/questions/7683/how-do-you-put-a-286-in-protected-mode
  153. Control register
    https://en.wikipedia.org/wi­ki/Control_register
  154. CPU Registers x86
    https://wiki.osdev.org/CPU_Re­gisters_x86
  155. x86 Assembly/Protected Mode
    https://en.wikibooks.org/wi­ki/X86_Assembly/Protected_Mo­de
  156. MSW: Machine Status Word
    https://web.itu.edu.tr/kes­gin/mul06/intel/intel_msw­.html
  157. 80×87 Floating Point Opcodes
    http://www.techhelpmanual.com/876–80×87_floating_point_opcodes.html
  158. Page Translation
    https://pdos.csail.mit.edu/6­.828/2005/readings/i386/s05_02­.htm
  159. 80386 Paging and Segmenation
    https://stackoverflow.com/qu­estions/38229741/80386-paging-and-segmenation
  160. 80386 Memory Management
    https://tldp.org/LDP/khg/Hy­perNews/get/memory/80386mm­.html
  161. DOSEMU
    http://www.dosemu.org/
  162. Intel 80386, a revolutionary CPU
    https://www.xtof.info/intel80386.html
  163. PAI Unit 3 Paging in 80386 Microporcessor
    https://www.slideshare.net/Kan­chanPatil34/pai-unit-3-paging-in-80386-microporcessor
  164. 64 Terabytes of virtual memory for 32-bit x86 using segmentation: how?
    https://stackoverflow.com/qu­estions/5444984/64-terabytes-of-virtual-memory-for-32-bit-x86-using-segmentation-how
Neutrální ikona do widgetu na odběr článků ze seriálů

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

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


Autor článku

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