640K by mělo stačit každému: skutečně?

10. 12. 2024
Doba čtení: 56 minut

Sdílet

Autor: Depositphotos
Billu Gatesovi se připisuje výrok „640K ought to be enough for anybody“, který ovšem pravděpodobně nikdy neřekl. Na počítačích IBM PC se skutečně dlouhou dobu bojovalo s omezenými možnostmi adresování většího paměťového rozsahu.

Obsah

1. 640K by mělo stačit každému: skutečně?

2. Maximální rozsah paměti IBM PC s mikroprocesorem 8086 či 8088

3. Adresa uložená jako dvojice segment:offset

4. Paměťový rozsah mikroprocesorů Intel 80286

5. Limit 1MB v reálném režimu – jde ale skutečně o jeden megabajt?

6. A20 Gate: hack, který byl podporován více než čtvrtstoletí

7. HMA (High Memory Area)

8. Využití větší kapacity RAM v reálném režimu

9. EMS – Expanded Memory Specification

10. XMS – Extended Memory Specification

11. Chráněný režim na mikroprocesorech 80286

12. Segmenty vs. deskriptory

13. Vliv chráněného režimu na rychlost instrukcí

14. Praktická část: základní funkce pamětí typu EMS a XMS

15. Zjištění stavu (emulace) paměti typu EMS

16. Detekce, kolik je k dispozici stránek paměti EMS

17. Detekce počtu volných stránek paměti typu EMS

18. Zjištění počtu volných paměťových bloků dostupných přes standard XMS

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

20. Odkazy na Internetu

1. 640K by mělo stačit každému: skutečně?

Jak již bylo napsáno v perexu, Billu Gatesovi (pro někoho se jedná o vizionáře a dokonce „otce Internetu“, pro další je to ten zlý muž v IT) se často připisuje výrok „640K ought to be enough for anybody“. Bill Gates to pravděpodobně nikdy neřekl, ovšem už samotná existence této legendy napovídá, že na hodnotě 640K bude v kontextu platformy IBM PC něco pravdivého. A skutečně, samotná platforma IBM PC pochopitelně měla mnoho problémů, ostatně jako jakákoli pokročilejší technologie, které se překonávaly jen postupně a s vynaložením velkých prostředků.

Připomeňme si, že IBM PC se začal prodávat v srpnu roku 1981, tedy před 43 lety. Z dnešního pohledu se sice jednalo o velmi málo výkonný stroj, ovšem v době vzniku IBM PC patřil tento mikropočítač v oblasti osobních mikropočítačů mezi špičku, alespoň co se týká hrubého výpočetního výkonu. Obsahoval šestnáctibitový mikroprocesor Intel 8088 (s vnější sběrnicí zúženou na osm bitů) taktovaný na 4,77 MHz. Kapacita operační paměti se pohybovala od 16 kB do 256 kB, takže se tehdy ani zdaleka nedotýkala teoretické hranice 640 kB, na kterou se narazilo sice později, ale o to tvrději.

A skutečně – o pár let později se jedním z největších problémů stalo omezení maximální velikosti operační paměti (zde nazývané konvenční paměť, conventional memory) na 640kB. Jakmile se tohoto limitu dosáhlo, začali vývojáři i tvůrci HW pracovat na tom, jak tento limit obejít.

V cestě jim přitom stálo mnoho překážek: hardwarová omezení mikroprocesoru (původně malý počet adresových vodičů), omezení instrukční sady, snaha o zpětnou kompatibilitu, omezení samotného DOSu atd. A právě cesty, které postupně vedly k dostupnosti větší kapacity paměti více či méně standardním způsobem pro uživatelské aplikace, si popíšeme v dnešním článku.

2. Maximální rozsah paměti IBM PC s mikroprocesorem 8086 či 8088

Nejprve se zaměřme na ústřední čip, na kterém byla celá platforma IBM postavena. Pochopitelně se jedná o mikroprocesor Intel 8086, resp. přesněji řečeno Intel 8088 (což je ořezaná varianta původního 8086, jak ostatně hned uvidíme). Na následující dvojici obrázků jsou zobrazeny piny obou těchto mikroprocesorů:

Obrázek 1: Piny mikroprocesoru Intel 8086.

Obrázek 1: Piny mikroprocesoru Intel 8088.

U čipu Intel 8086 nalezneme mj. i piny AD0AD15 a taktéž piny A16A19. Naproti tomu u čipu Intel 8088 se jedná o piny AD0AD7 následované piny A8A19. Žádné jiné rozdíly mezi oběma čipy z externího HW pohledu neexistují. Piny začínající znaky AD se přitom používají pro adresovou i datovou sběrnici (data jsou multiplexována, což byl velmi často používaný způsob), zatímco piny začínající jen znakem A značí vodiče pouze adresové sběrnice. Co to znamená? Intel 8086 má externí datovou sběrnici se šestnácti vodiči a adresovou sběrnici s dvaceti vodiči. Naproti tomu Intel 8088 má pouze osmibitovou externí datovou sběrnici (zlevnění celého systému na úkor rychlosti), ovšem adresová sběrnice má pořád dvacet vodičů.

Oba tyto mikroprocesory tedy mají vyvedeno dvacet adresových vodičů a dokážou tak obsáhnout 220 adres. Vzhledem k tomu, že je umožněno adresovat jednotlivé bajty (a nikoli 16bitová slova), je tedy celkový rozsah adres roven přesně jednomu megabajtu. Mohlo by se zdát, že to umožňuje použití 1MB bloku operační paměti, v IBM PC tomu tak ovšem nebylo, protože společnost IBM se rozhodla, že kapacita operační paměti bude pouze maximálně 640kB, protože do zbývajících 384kB se bude mapovat obrazová paměť (64kB, resp. 128kB), BIOS, VideoBIOS, paměťové buffery síťových karet atd. atd. A přesně na těchto limitech byl navržen systém DOS, u nějž je zajímavé, že nikdy tyto limity nepřekročil.

3. Adresa uložená jako dvojice segment:offset

Nyní již víme, že na úrovni HW je adresovatelný rozsah čipů Intel 8086/Intel 8088 omezen na 1MB. Jak je tomu však z pohledu programátora?

Programátorský model mikroprocesoru Intel 8086 do určité míry vychází z jeho předchůdců, tedy konkrétně z čipů 8080 a 8085. Došlo ovšem k rozšíření sady registrů, k určité unifikaci jejich role (což zjednodušilo instrukční sadu) a k rozšíření pracovních registrů na šířku šestnácti bitů. Navíc se rozšířily adresovací režimy a při adresování se kromě základní 16bitové adresy počítá i adresa segmentu získaná z registrů CS, DS, ES či SS, což umožňuje adresovat 1MB paměti + necelých 64kB nad tímto limitem (k tomu se ještě vrátíme). Oproti 8080 je zde tedy výrazný skok vpřed, ovšem v porovnání s dalšími mikroprocesory této éry patří 8086 spíše mezi jednodušší mikroprocesory (což ovšem nemusí být vždy špatně).

Adresa buňky v paměti je uložena ve dvojici šestnáctibitových hodnot. První hodnota se nazývá segmentová část (neboli zkráceně segment), druhá hodnota je offset. Skutečná adresa se vypočítá takto:

adresa = segment×16 + offset

Přičemž pochopitelně interně se namísto násobení šestnácti používá bitový posun doleva. Zkusme si několik příkladů:

Segment (16b) Offset (16b) Fyzická adresa (20b)
0000 0000 00000
0000 ffff 0ffff
1000 ffff 1ffff
923f e2ff a06ef
ffff 0000 ffff0
ffff 000f fffff
f000 ffff fffff
Poznámka: možná už nyní jste přišli na to, kde spočívá určitá past tohoto způsobu výpočtu adresy. K této problematice se hned dostaneme.

4. Paměťový rozsah mikroprocesorů Intel 80286

Mikroprocesor Intel 80286, který představuje druhou generaci čipů z rodiny 80×86, má oproti mikroprocesorům Intel 8086/8088 odlišně koncipované piny, což je dobře patrné z následujícího obrázku:

Obrázek 3: Piny mikroprocesoru Intel 80286.

Vidíme zde dva důležité rozdíly. Prvním rozdílem je oddělení datové sběrnice (která je mimochodem stále šestnáctibitová) od sběrnice adresové. To znamená, že jsou vyvedeny samostatné vodiče D0D15 pro obousměrné přenosy dat a není zapotřebí řešit multiplexing dat a adres. Pro nás je ovšem dnes důležitější fakt, že adresových vodičů je nyní více; konkrétně se jedná o piny A0A23. To tedy znamená, že lze adresovat 224 bajtů, protože lze opět pracovat s jednotlivými bajty a nikoli jen s celými šestnáctibitovými slovy. Fyzický paměťový rozsah mikroprocesorů Intel 80286 je tedy 16MB – o mnoho více, než tomu bylo v případě původní první generace čipů z rodiny 80×86.

Aby bylo možné využít celý paměťový rozsah, podporují mikroprocesory 80286 takzvaný chráněný režim, v němž lze navíc (jak již jeho název napovídá) na HW úrovni zajistit například to, že se nepřekročí nastavená velikost zásobníku, že se nebude (například virem) modifikovat programový kód atd. Ke konceptu chráněného režimu se ještě vrátíme. Jednalo se o důležitou technologii, která však v případě 80286 nebyla plně využívána (a to hned  několika důvodů).

5. Limit 1MB v reálném režimu – jde ale skutečně o jeden megabajt?

V reálném režimu mikroprocesorů 80286, což je mimochodem výchozí režim používaný v DOSu, se stále používá adresace s využitím segmentového registru a offsetu. Vraťme se nyní ještě jednou k výpočtu fyzické adresy, který je realizován tímto zdánlivě jednoduchým výpočtem:

adresa = segment×16 + offset

Ve třetí kapitole jsme si uvedli tabulku s příklady výpočtu fyzické adresy. Co se však stane na počítači vybaveném mikroprocesorem 80286 (s adresovým rozsahem 224 bajtů) v případě, že výpočet přesáhne přes hranici jednoho megabajtu? To je totiž docela dobře možné, což naznačuje i další tabulka:

Segment (16b) Offset (16b) Fyzická adresa (24b) Poznámka
ffff 0000 ffff0 jsme stále v rozsahu 1MB
ffff 000f fffff jsme stále v rozsahu 1MB
f000 ffff fffff jsme stále v rozsahu 1MB
ffff 0010 100000 první adresa, která se již nevejde do rozsahu 1MB
f001 fff0 100000 odlišná reprezentace stejné adresy
ffff ffff 10ffef přesáhli jsme rozsah 1MB – nejvyšší možná adresa

Z této tabulky je patrné, že fyzická adresa skutečně může přesáhnout rozsah 1MB, což na původních čipech 8086/8088 nebylo možné, už jen z toho důvodu, že neexistoval adresový vodič A20 (tedy dvacátý první vodič, protože je indexujeme od nuly).

O kolik bajtů (či adres) přesáhneme onu mýtickou hranici jednoho megabajtu si můžeme snadno vypočítat:

0xffff0 + 0xffff - 0xfffff = 65520 bajtů/adres

K dispozici tedy máme prakticky celých 64kB navíc (kromě šestnácti bajtů na konci). Dnes se to sice může zdát jako zanedbatelná hodnota, ale právě kvůli oněm šedesáti čtyřem kilobajtů se komplikoval návrh PC i BIOSu až do cca roku 2009.

6. A20 Gate: hack, který byl podporován více než čtvrtstoletí

Mikroprocesory 80286 byly navrženy takovým způsobem, aby byly zpětně kompatibilní s původními čipy 8086/8088. Že tato zpětná kompatibilita není stoprocentní, jsme mohli vidět již minule, konkrétně na příkladu instrukce POP CS, která dostala již na mikroprocesoru 80186 (poněkud pozapomenutý čip) odlišný význam – její operační kód je totiž nově použit jako instrukční prefix. Konkrétně v případě této instrukce to však nebyla kritická nekompatibilita, protože je těžké si představit její praktické použití.

Ovšem právě rozdíl v počtu adresovacích vodičů je další nekompatibilitou, protože adresy nad 1MB jsou na čipech 8086/8088 ořezány na dvacet bitů a tedy namísto adresy 0×100000 se ve skutečnosti vrátíme zpět do nulté stránky paměti na adresu 0×00000. Totéž platí i pro dalších „přebývajících“ 65519 bajtů. To by se nemuselo zdát jako velký problém, ostatně jaký „šílenec“ by na 8086/8088 adresoval prvních 64kB paměti přes segment 0×ffff? Jenže právě tato vlastnost čipů 8086/8088 byla ve skutečnosti využita při automatické portaci programů ze systému CP/M do DOSu. Tento trik pěkně zmiňuje například Peter Norton (tvůrce slavného Norton Commanderu):

„By a process too bizarre and complicated to explain, the segmented address is set so that it serves two purposes. Not only does it point to the DOS function dispatcher, but the offset part also indicates how much of the code segment we can use (up to hex FFF0, 16 bytes short of 64K). The offset part of the address, the part we are interested in, is located at offset 6 within the PSP, following the instruction's op-code at offset 5. The upshot of this is that if DOS has less than 64K to give our programs, we can use this field to learn how many bytes are available — a technique that should work with most or all windowing and multitasking systems.“

A právě z toho důvodu, aby se zachovalo zdání zpětné kompatibility s 8086/8088 se tvůrci IBM PC (resp. přesněji řečeno PC AT) rozhodli, že do PC bude zabudováno logické hradlo, které bude (na základě konfigurace) nulovat adresový vodič A20 a tím umožní, aby se emulovalo původní chování 8086/8088. Přes port pro ovládání klávesnice (kdo by to čekal) je tedy možné povolit či naopak zakázat takzvané A20 GATE, což je ono hradlo. Pokud hradlo nuluje hodnotu na vodiči A20, máme zaručenu zpětnou kompatibilitu (a hodně divné chování při přístupu k ještě vyšším adresám v chráněném režimu – to ovšem nikdo nedělá). Pokud naopak hradlo „propouští“ hodnotu na pinu A20, můžeme adresovat celých 16MB.

Poznámka: toto chování je tedy zcela nezávislé na mikroprocesoru a ten ho nemůže přímo ovlivnit.

7. HMA (High Memory Area)

V případě, že operační systém zakázal blokování adresového vodiče A20, bylo na počítači pracujícího v reálném režimu k dispozici výše zmíněných 65520 bajtů paměti „navíc“ nad očekávaných 640kB. Tato oblast paměti se nazývá HMA neboli High Memory Area. Důležitá je z toho důvodu, že do ní bylo možné nahrát jak část samotného operačního systému, tak i například některé ovladače (myši, CD-ROM atd.). Jelikož se jednalo o běžnou paměť (možná jen s trochu „divným“ segmentem), tak většinou s využitím této paměti nebyl žádný problém a navíc to umožnilo nahrávat do zbytku operační paměti (cca 640kB) například paměťově náročné hry.

Poznámka: zajímavé je, že první program od Microsoftu, který tuto paměť využíval, nebyl DOS, ale Windows 2.0 ve variantě nazývané Windows/286.

8. Využití větší kapacity RAM v reálném režimu

V dobách PC AT se začaly objevovat aplikace vyžadující poměrně velká množství paměti. Jednalo se například o tabulkové procesory, databáze, ale samozřejmě nesmíme zapomenout ani na hry. Operační systém DOS však podporoval jen již výše zmíněných 640kB, ke kterým můžeme připočítat i HMA, tedy necelých 64kB navíc. V případě, že tato kapacita paměti nebyla dostačující, muselo se přistoupit k využití dalších více či méně nestandardních technik, z nichž některé byly později standardizovány. Mezi dva standardy, o nichž se v dnešním článku musíme zmínit, patří EMS neboli Expanded Memory Specification a XMS neboli Extended Memory Specification (pak se nemají tyto zkratky plést). A později se u některých aplikací prosadilo přepínání do chráněného režimu, který již umožňoval paměť využít skutečně jako operační paměť. Všechny tyto tři techniky rozšíření paměti budou v dnešním článku ve stručnosti popsány.

9. EMS – Expanded Memory Specification

Prvním standardem, který se snažil na platformě IBM PC zajistit aplikacím větší množství dostupné paměti, byl standard LIM-EMS nebo zkráceně pouze EMS (Expanded Memory Specification). Zajímavé je, že zkratka LIM znamená „Lotus, Intel, Microsoft“, což ukazuje, jak byla společnost Lotus tehdy důležitá (viz tabulkový procesor Lotus 1–2–3 atd.). Standard EMS původně sloužil k unifikovanému přístupu k paměti, která byla instalována na ISA kartách, jež byly do počítače instalovány jako jiné ISA karty (grafické, karty s porty, zvukové karty, síťové karty atd.). Taková paměť mohla být přes příslušný ovladač kompatibilní s EMS mapována do dostupného adresního prostoru jednoho megabajtu, konkrétně do oblasti nad 640kB. Tato oblast je, jak víme, rezervována právě pro přídavné karty.

Pro EMS se typicky v adresním prostoru mikroprocesoru (1MB) rezervovala oblast o velikosti 64kB, do které se mapovaly čtyři stránky (page) z paměti EMS. To tedy znamenalo, že pokud bylo na kartě dostupných 512kB, jednalo se o celkem 512/16=32 stránek, a libovolné čtyři vybrané stránky (nemusely ležet za sebou) mohly být v jeden okamžik namapovány do paměťového rozsahu mikroprocesoru. Jedná se tedy o techniku, kterou již známe z doby osmibitových mikropočítačů. Samozřejmě takto přístupná paměť není „plnohodnotná“, protože není v jeden okamžik přístupná jako celek, ale aplikace sama si musí řídit, ke kterým stránkám potřebuje mít v daný okamžik přístup.

Později byla EMS emulována, například ovladači EMM286 (s pomocí čipsetu základní desky) nebo známějším EMM386. EMM286 byl složitější, ale u EMM386 se používal virtuální režim 8086 (k němuž se ještě vrátíme) s tak vhodně nastavenými selektory, aby se namísto fyzické EMS stránky používal libovolný blok operační paměti nad 1MB.

Existovalo větší množství verzí standardu EMS, které se lišily mj. i maximálním počtem stránek a tím pádem i maximální kapacitou EMS. Typické hodnoty pro verzi 3.2 jsou 8MB a pro verzi 4.0 pak neuvěřitelných 32MB.

10. XMS – Extended Memory Specification

Druhý standard, jehož cílem bylo zpřístupnit větší množství paměti DOSovým aplikacím, se jmenoval XMS neboli Extended Memory Specification. A opět i tento standard existoval ve více verzích, viz například verzi 2.0 a verzi 3.0. Tento standard řešil situaci, kdy je v počítači nainstalována větší kapacita operační paměti RAM (tj. běžné paměti) než 1MB. Samotný mikroprocesor 80286 a samozřejmě i 80386 atd. dokáže fyzicky k této paměti přistupovat, ale DOSové aplikace v reálném režimu jsou stále omezeny na 1MB+65520 bajtů navíc. Ovladač XMS zbývající paměť zpřístupňuje takovým způsobem, že se přepne do chráněného režimu, překopíruje zvolenou oblast do oblasti pod jedním megabajtem a následně z chráněného režimu přejde zpět do režimu reálného (či naopak). Tyto operace pochopitelně nějakou dobu trvají, ovšem XMS bloky mohou být v případě potřeby i poměrně malé (menší než 16kB bloky EMS), takže zdržení nemusí být obrovské.

Opět se tedy nejedná striktně řečeno o „plnohodnotnou“ paměť, protože si sama aplikace musí řídit, které bloky XMS bude v daný okamžik používat, nicméně to umožnilo, aby i aplikace psané v reálném režimu dokázaly využít celou nainstalovanou RAM, i když neefektivně.

11. Chráněný režim na mikroprocesorech 80286

Oba výše zmíněné standardy sice do určité míry pomáhaly aplikacím psaným v reálném režimu využívat paměť přesahující rozsah jednoho megabajtu, ale jak jsme mohli vidět, jednalo se o řešení, která tuto rozšířenou paměť zpřístupňovala po stránkách nebo po blocích (a to ve druhém případě dokonce s nutností kopií těchto bloků). Existovalo pochopitelně ještě jedno řešení založené na prakticky jediné nové technologii, která byla do mikroprocesorů 80286 přidána. Jedná se o možnost přepnutí mikroprocesoru do takzvaného chráněného režimu (protected mode), v němž se dosti podstatným způsobem změní možnosti adresace paměti, ovšem současně se zpřístupní celý fyzicky dostupný paměťový rozsah – teoreticky tedy až 16MB RAM. To však není vše, protože jednotlivé části operační paměti mohly být různým způsobem chráněny – proti přepisu, proti možnosti spuštění kódu v této oblasti (skok do ní) atd. Navíc mohl být omezen (řízen) přístup k I/O portům a tím pádem i přístup k hardware (časovače, zvukové karty, klávesnice atd.)

Chráněný režim byl navržen takovým způsobem, aby umožnil vznik operačních systémů s multitaskingem a ochrannými prvky mezi jednotlivými aplikacemi resp. mezi aplikací a operačním systémem. Problém byl jediný – DOSovské aplikace obecně tuto ochranu porušovaly (a musely porušovat): přistupovaly přímo k HW, zapisovaly do kódových segmentů, spouštěly kód z nekódových segmentů, používaly segmenty, které se překrývaly a dokonce si takové aplikace dovolovaly volat služby DOSu a BIOSu (oba tyto systémy jsou totiž psány pro reálný režim). Chráněný režim tedy bylo možné používat (a mnohé aplikace ho i používaly), ale potřebovaly se buď přepínat zpět do reálného režimu (na 286 složité a zdlouhavé) nebo využívaly takzvaných extenderů, které se snažily zpřístupnit služby DOSu i z chráněného režimu (mnohdy taktéž přepnutím do reálného režimu).

12. Segmenty vs. deskriptory

Z pohledu programátora v assembleru se i v chráněném režimu mikroprocesoru 80286 pracuje s adresou, která je reprezentována dvojicí segment+offset. Ovšem změnila se jak funkce segmentu, tak i způsob výpočtu fyzické adresy. Nyní totiž hodnota uložená v segmentovém registru nespecifikuje přímou adresu (resp. její část), ale (poněkud zjednodušeně řečeno) index to tabulky deskriptorů (descriptor table). Tato tabulka obsahuje takzvané deskriptory, přičemž pro každý deskriptor je vyhrazeno osm bajtů, z nichž je ovšem na 80286 využito jen šest bajtů. Prozatím nás nebudou zajímat podrobnosti, jak přesně jsou hodnoty v tabulce deskriptorů uloženy, ale alespoň si řekněme, jaké informace každý deskriptor obsahuje:

Označení Počet bitů Stručný popis
Base 24 adresa začátku segmentu kdekoli v prostoru 16MB
Limits 16 velikost segmentu (lze mít menší segment než 64kB)
Control bits 6 řízení práv k segmentu
DPL 2 úroveň oprávnění 0–3 (tzv. ring)

Z pohledu využití operační paměti je nejdůležitější první položka Base, která nám umožňuje umístit segment kamkoli v celém rozsahu 16MB operační paměti dosažitelné mikroprocesorem 80286. Fyzická adresa se tedy již nepočítá jako součet posunuté hodnoty segmentu + offsetu, ale jako součet bázové adresy segmentu (bez posunu) a offsetu. To mj. znamená, že přestává platit „segmentová aritmetika“, která byla někdy zneužívána (jedna stejná fyzická adresa lze zapsat jako více kombinací segment+offset).

Důležité taktéž je, že velikost takového segmentu lze omezit, přičemž při překročení limitu dojde k výpadku, který může ošetřit například operační systém. Můžeme tak v případě potřeby omezit například segment pro zásobník (u driverů) atd.

Dvojice bitů DPL určuje oprávnění, které musí proces mít pro přístup do segmentu. Existují čtyři úrovně oprávnění, od hodnoty 0 (jádro systému) pro hodnotu 3 (uživatelské aplikace). S podrobnostmi se seznámíme příště.

Zbývá nám šest řídicích bitů, kterými se mj. určuje, zda je segment systémový nebo datový (bit S), jestli segment obsahuje spustitelný kód nebo data (bit X), jestli je povoleno čtení dat ze segmentu (bit R) atd. Tyto bity jsou kontrolovány při každém přístupu do segmentu a například aplikaci zakážou modifikovat kód za běhu (ochrana před viry atd.), spouštět kód z datového segmentu atd.

13. Vliv chráněného režimu na rychlost instrukcí

Poměrně dlouho se tradovalo, že běh procesoru v chráněném režimu je zásadně pomalejší, než je tomu v režimu reálném. Ve skutečnosti u naprosté většiny instrukcí nezáleží na tom, zda probíhá v chráněném nebo reálném režimu (pravděpodobně se prochází naprosto stejnými cestami). Výjimku tvoří instrukce pro změnu segmentových registrů, protože ve skutečnosti se interně musí načíst i výše zmíněná šestice bajtů do interních registrů mikroprocesoru. V praxi to znamená, že se zpomalí zejména instrukce INT (mění CS), INTO (dtto), MOV segment, xxx, OUT, POP segment a „dlouhé“ skoky resp. volání podprogramů.

Nejdůležitější je v praxi zpomalení načtení hodnoty do segmentového registru:

Instrukce Cyklů (real) Cyklů (protected)
mov seg, r16 2 17
mov seg, m16 5 19

Zde je tedy zpomalení značné. Musíme si totiž uvědomit, že 80286 má stále omezení na 16bitové segmenty, takže například součet dvou polí (matic), které mají velikost do 64kB a kde každé z těchto polí leží v jiném segmentu znamená, že i v interní programové smyčce budeme stále manipulovat s obsahem segmentového registru DS a/nebo ES, což může v praxi znamenat i zpomalení na 50%.

14. Praktická část: základní funkce pamětí typu EMS a XMS

Ve druhé části dnešního článku si ukážeme čtveřici velmi jednoduchých demonstračních příkladů, které ukazují to, jakým způsobem lze zjistit základní údaje o pamětech typu XMS a EMS, resp. přesněji řečeno o jakékoli „nekonvenční“ paměti, která je pro programátora dostupná přes standardní rozhraní XMS nebo EMS. Prozatím tedy v demonstračních příkladech nebudeme tyto paměti aktivně používat a taktéž se (prozatím) vyhýbáme chráněnému režimu.

Jednodušší je (možná překvapivě) použití paměti dostupné přes standard EMS, a to nezávisle na tom, o jakou paměť se jedná. Na XT to mohou být ISA karty osazené paměťovými čipy, na některých PC AT a na počítačích s mikroprocesorem 80386 to většinou bude paměť nad 640kB, která je přes EMM386 či jiný ovladač dostupná i DOSovým programům.

Funkce, které se týkají paměti EMS, jsou dostupné přes služby vyvolávané přerušením číslo 0×67. Tyto služby se volají stejně, jako služby standardního BIOSu či VideoBIOSu – do registru AH se vloží číslo služby, do dalších registrů případné další parametry a zavolá se INT 0×67. Při návratu z přerušení bude v AH kód chyby (0=bez chyby) a v závislosti na konkrétní funkci se naplní i další registry.

Paměť XMS se ovládá složitějším způsobem. K tomuto účelu slouží přerušení číslo 0×15, které obsahuje i množství dalších služeb (je to takové odložiště funkcí, které se jinam nevešly, například funkce pro zastavení motoru magnetofonu na straně jedné a funkce pro přechod do chráněného režimu na straně druhé). Co se týká XMS, jsou zde dvě důležité funkce. První zjišťuje počet volných bloků XMS a druhá dokáže přesunout vybraný blok do adresovatelné paměti pod 1MB. To však (kupodivu) vyžaduje základní znalosti o chráněném režimu, protože se zde přímo pracuje s tabulkou deskriptorů.

Poznámka: z důvodu co největší jednoduchosti obsahují všechny dnes popsané demonstrační příklady makro určené pro tisk osmibitové hexadecimální hodnoty (i když by se nám spíše hodila šestnáctibitová dekadická hodnota). Prozatím si s tímto omezením vystačíme; navíc napsat podprogram či makro pro tisk dekadické hodnoty není při existenci instrukce DIV (vracející podíl i zbytek po dělení) ve skutečnosti příliš složité.

15. Zjištění stavu (emulace) paměti typu EMS

Dnešní první demonstrační příklad je velmi jednoduchý. Je zde využita služba číslo 0×40 dostupná přes přerušení číslo 0×67 (takže ji lze zavolat instrukcí INT), která zjistí, v jakém stavu se v počítači nachází paměť EMS, ať již ve formě fyzické karty, nebo v emulované podobě (což podporoval DOS na čipech 80386 a některé počítače i s 80286). Výsledkem volání této služby je hodnota uložená do osmibitového registru AH, kterou si v hexadecimální hodnotě vypíšeme. V případě, že je paměť dostupná, měla by se vrátit hodnota 0, v opačném případě se vrátí hodnota vyšší než 0×80. Následně je možné přes službu 0×46 (a ne 0×40) zjistit verzi EMS atd.

Zdrojový kód tohoto demonstračního příkladu vypadá následovně:

; Funkce EMS - zjisteni stavu EMS
;
;-----------------------------------------------------------------------------
 
BITS 16         ; 16bitovy vystup pro DOS
CPU 386         ; specifikace pouziteho instrukcniho souboru
 
; ukonceni procesu a navrat do DOSu
%macro exit 0
        ret
%endmacro
 
; vyprazdneni bufferu klavesnice a cekani na klavesu
%macro wait_key 0
        xor     ax, ax
        int     0x16
%endmacro
 
; tisk retezce na obrazovku
%macro print 1
        mov     dx, %1
        mov     ah, 9
        int     0x21
%endmacro
 
; tisk hexadecimalni hodnoty
%macro print_hex 1
        mov     bx, hex_digits
        mov     cl, %1                ; zapamatovat si predanou hodnotu
 
        mov     al, cl                ; do AL se vlozi horni hexa cifra
        and     al, 0xf0
        shr     al, 1
        shr     al, 1
        shr     al, 1
        shr     al, 1
 
        xlat                          ; prevod hodnoty 0-15 na ASCII znak
        mov     [message], al         ; zapis ASCII znaku do retezce
 
        mov     al, cl                ; do BL se vlozi dolni hexa cifra
        and     al, 0x0f
        xlat                          ; prevod hodnoty 0-15 na ASCII znak
        mov     [message + 1], al     ; zapis ASCII znaku do retezce
 
        print   message
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        mov  ah, 0x40  ; cislo sluzby -> stav EMS
    int  0x67      ; zavolani sluzby EMS
 
        mov  al, ah    ; stav sluzby
        print_hex al
 
        wait_key
        exit
 
        ; retezec ukonceny znakem $
        ; (tato data jsou soucasti vysledneho souboru typu COM)
message db 0x01, 0x01, 0x0d, 0x0a, "$"
 
        ; prevodni tabulka hodnoty 0-15 na ASCII znak
hex_digits db "0123456789abcdef"

16. Detekce, kolik je k dispozici stránek paměti EMS

Ve druhém demonstračním příkladu, který si dnes ukážeme, se provádí zjištění, kolik stránek paměti EMS je k dispozici. K tomuto účelu se používá služba číslo 0×42 dostupná (opět) přes přerušení 0×67. V registru AH se opět vrátí stav EMS a další hodnoty jsou platné jen v případě, že je v tomto registru nulová hodnota. V registru DX se vrátí celkový počet stránek EMS, přičemž každá stránka má velikost 16kB. Teoreticky by tedy mohla kapacita EMS dosahovat 1GB (!), ve skutečnosti ovšem specifikace EMS povoluje pouze 32MB (a i to bylo v době uvedení normy EMS téměř nepředstavitelné množství).

V mém případě (emulace PC) tento program vypíše trojici hexadecimálních hodnot:

00
04
00

První hodnotou je stav EMS (0=OK) a druhé dvě hodnoty tvoří hexadecimální číslo 0×400 neboli decimálně 1024. K dispozici má tedy můj počítač 1024 stránek o velikosti 16kB, tedy celkem 16MB EMS, což odpovídá i výstupu příkazu mem.

Úplný zdrojový kód tohoto demonstračního příkladu vypadá následovně:

; Funkce EMS - zjisteni alokovane EMS
;
;-----------------------------------------------------------------------------
 
BITS 16         ; 16bitovy vystup pro DOS
CPU 386         ; specifikace pouziteho instrukcniho souboru
 
; ukonceni procesu a navrat do DOSu
%macro exit 0
        ret
%endmacro
 
; vyprazdneni bufferu klavesnice a cekani na klavesu
%macro wait_key 0
        xor     ax, ax
        int     0x16
%endmacro
 
; tisk retezce na obrazovku
%macro print 1
        mov     dx, %1
        mov     ah, 9
        int     0x21
%endmacro
 
; tisk hexadecimalni hodnoty
%macro print_hex 1
        mov     bx, hex_digits
        mov     cl, %1                ; zapamatovat si predanou hodnotu
 
        mov     al, cl                ; do AL se vlozi horni hexa cifra
        and     al, 0xf0
        shr     al, 1
        shr     al, 1
        shr     al, 1
        shr     al, 1
 
        xlat                          ; prevod hodnoty 0-15 na ASCII znak
        mov     [message], al         ; zapis ASCII znaku do retezce
 
        mov     al, cl                ; do BL se vlozi dolni hexa cifra
        and     al, 0x0f
        xlat                          ; prevod hodnoty 0-15 na ASCII znak
        mov     [message + 1], al     ; zapis ASCII znaku do retezce
 
        print   message
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        mov  ah, 0x42  ; cislo sluzby -> pocet stranek pameti
    int  0x67      ; zavolani sluzby EMS
 
        push dx
    mov  al, ah
        print_hex al   ; stav EMS
 
    pop  dx
        push dx
    mov  al, dh    ; celkem stranek (vyssi bajt)
        print_hex al
 
    pop  dx
    mov  al, dl    ; celkem stranek (nizsi bajt)
        print_hex al
 
        wait_key
        exit
 
        ; retezec ukonceny znakem $
        ; (tato data jsou soucasti vysledneho souboru typu COM)
message db 0x01, 0x01, 0x0d, 0x0a, "$"
 
        ; prevodni tabulka hodnoty 0-15 na ASCII znak
hex_digits db "0123456789abcdef"

17. Detekce počtu volných stránek paměti typu EMS

Stejná služba, jaká byla použita v předchozím demonstračním příkladu navíc ještě vrátí i počet volných stránek paměti typu EMS, což bude (podle očekávání) hodnota stejná nebo menší, než celkový počet stránek. Tento údaj nalezneme v registru BX, takže se podívejme, jak bude vypadat situace na mém počítači. Tento program po svém překladu a spuštění vypíše:

00
01
7F

První hodnota 00 opět ukazuje stav EMS (ok) a druhé dvě hodnoty tvoří hexadecimální číslo 0×17f neboli 383. Z celkově dostupné kapacity 1024 stránek je tedy pouze 383 stránek volných, což při velikosti stránky 16kB odpovídá 6MB EMS.

Opět si pochopitelně uvedeme úplný zdrojový kód tohoto demonstračního příkladu, který je vlastně prakticky stejný, jako příklad předchozí, ovšem došlo k prohození registru DX za BX:

; Funkce EMS - zjisteni volne EMS
;
;-----------------------------------------------------------------------------
 
BITS 16         ; 16bitovy vystup pro DOS
CPU 386         ; specifikace pouziteho instrukcniho souboru
 
; ukonceni procesu a navrat do DOSu
%macro exit 0
        ret
%endmacro
 
; vyprazdneni bufferu klavesnice a cekani na klavesu
%macro wait_key 0
        xor     ax, ax
        int     0x16
%endmacro
 
; tisk retezce na obrazovku
%macro print 1
        mov     dx, %1
        mov     ah, 9
        int     0x21
%endmacro
 
; tisk hexadecimalni hodnoty
%macro print_hex 1
        mov     bx, hex_digits
        mov     cl, %1                ; zapamatovat si predanou hodnotu
 
        mov     al, cl                ; do AL se vlozi horni hexa cifra
        and     al, 0xf0
        shr     al, 1
        shr     al, 1
        shr     al, 1
        shr     al, 1
 
        xlat                          ; prevod hodnoty 0-15 na ASCII znak
        mov     [message], al         ; zapis ASCII znaku do retezce
 
        mov     al, cl                ; do BL se vlozi dolni hexa cifra
        and     al, 0x0f
        xlat                          ; prevod hodnoty 0-15 na ASCII znak
        mov     [message + 1], al     ; zapis ASCII znaku do retezce
 
        print   message
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        mov  ah, 0x42  ; cislo sluzby -> pocet stranek pameti
    int  0x67      ; zavolani sluzby EMS
 
        push bx
    mov  al, ah
        print_hex al   ; stav EMS
 
    pop  bx
        push bx
    mov  al, dh    ; volnych stranek (vyssi bajt)
        print_hex al
 
    pop  bx
    mov  al, dl    ; volnych stranek (nizsi bajt)
        print_hex al
 
        wait_key
        exit
 
        ; retezec ukonceny znakem $
        ; (tato data jsou soucasti vysledneho souboru typu COM)
message db 0x01, 0x01, 0x0d, 0x0a, "$"
 
        ; prevodni tabulka hodnoty 0-15 na ASCII znak
hex_digits db "0123456789abcdef"

18. Zjištění počtu volných paměťových bloků dostupných přes standard XMS

V úvodním textu praktické části dnešního článku jsme si řekli, že přes služby vyvolávané přerušením číslo 0×15 (tedy instrukcí INT 0×15) můžeme mj. zjistit i počet volných paměťových bloků, které lze využívat přes standard XMS. Použití této služby je ve skutečnosti velmi jednoduché, protože postačuje do registru AH vložit číslo služby 0×88 a vyvolat INT 0×15. V registru AX se vrátí počet dostupných bloků paměti XMS, přičemž každý blok má velikost 1kB. To teoreticky znamená, že maximální dostupná kapacita XMS je rovna 64MB. To přesahuje možnosti čipu 80286 a jedná se spíše o teoretický limit; v praxi byla kapacita XMS menší než 8MB – v dobách dostupnosti více než 8MB RAM se již operační systém DOS na takových strojích nepoužíval (mimochodem: na 486DX2 s 8MB RAM již zcela bezproblémově běžel Linux i se systémem X).

Poznámka: prakticky se ovšem začaly používat odlišné služby, jejichž adresu je však nutné zjistit přes službu 0×43 na INT 0×23. S podrobnostmi se seznámíme později.

Podívejme se však na úplný zdrojový kód příkladu, který získá počet volných bloků XMS a vypíše ho (v hexadecimální podobě!) na terminál:

; Funkce XMS - zjisteni volnych bloku.
;
;-----------------------------------------------------------------------------
 
BITS 16         ; 16bitovy vystup pro DOS
CPU 386         ; specifikace pouziteho instrukcniho souboru
 
; ukonceni procesu a navrat do DOSu
%macro exit 0
        ret
%endmacro
 
; vyprazdneni bufferu klavesnice a cekani na klavesu
%macro wait_key 0
        xor     ax, ax
        int     0x16
%endmacro
 
; tisk retezce na obrazovku
%macro print 1
        mov     dx, %1
        mov     ah, 9
        int     0x21
%endmacro
 
; tisk hexadecimalni hodnoty
%macro print_hex 1
        mov     bx, hex_digits
        mov     cl, %1                ; zapamatovat si predanou hodnotu
 
        mov     al, cl                ; do AL se vlozi horni hexa cifra
        and     al, 0xf0
        shr     al, 1
        shr     al, 1
        shr     al, 1
        shr     al, 1
 
        xlat                          ; prevod hodnoty 0-15 na ASCII znak
        mov     [message], al         ; zapis ASCII znaku do retezce
 
        mov     al, cl                ; do BL se vlozi dolni hexa cifra
        and     al, 0x0f
        xlat                          ; prevod hodnoty 0-15 na ASCII znak
        mov     [message + 1], al     ; zapis ASCII znaku do retezce
 
        print   message
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        mov  ah, 0x88  ; cislo sluzby -> pocet volnych bloku
    int  0x15      ; zavolani sluzby XMS
 
        push ax
    mov  al, ah    ; zobrazit obsah vyssiho bajtu
        print_hex al   ; pocet bloku (vyssi bajt)
 
    pop  ax        ; obnovit (mj.) i AL
        print_hex al   ; pocet bloku (nizsi bajt)
 
        wait_key
        exit
 
        ; retezec ukonceny znakem $
        ; (tato data jsou soucasti vysledneho souboru typu COM)
message db 0x01, 0x01, 0x0d, 0x0a, "$"
 
        ; prevodni tabulka hodnoty 0-15 na ASCII znak
hex_digits db "0123456789abcdef"

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

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