Obsah
1. Od grafické karty VGA k vyšším rozlišením i většímu množství barev
3. Typická konfigurace grafické karty IBM 8514/A
4. Klony IBM 8514/A a další vývoj grafických karet na počítačích PC
5. Následníci grafické karty VGA v podobě nestandardu SVGA
6. Organizace video paměti u karet SVGA
7. Standard VESA aneb částečné zmírnění chaosu na trhu s grafickými kartami
8. Standardní grafické režimy představené ve VBE 1.2
10. Přečtení základních informací o grafické kartě
11. První demonstrační příklad: zjištění, zda je VBE dostupný
12. Blok s informacemi o grafické kartě
13. Druhý demonstrační příklad: zobrazení základních informací o grafické kartě
14. Třetí demonstrační příklad: výpis OEM řetězce s další informací o kartě
15. Čtvrtý demonstrační příklad: zjištění a výpis čísel všech podporovaných grafických režimů
16. Přečtení informací o zvoleném grafickém režimu
18. Šestý demonstrační příklad: základní informace o čtecích a zápisových oknech pro reálný režim
19. Repositář s demonstračními příklady
1. Od grafické karty VGA k vyšším rozlišením i většímu množství barev
V seriálu o tvorbě her a grafických dem pro platformu IBM PC (a systém DOS) jsme se již několikrát setkali s problematikou grafického subsystému této platformy. Připomeňme si krátce, že IBM PC byla modulární a konfigurovatelnou platformou, pro niž postupně vznikla celá řada různých grafických karet, které mnohdy byly více či méně zpětně kompatibilní. Základem byla karta MDA s podporou dobře čitelného textu, ovšem bez podpory grafického výstupu. Doplňovala ji karta CGA s (na dnešní dobu) primitivními grafickými režimy 320×200 pixelů se čtyřmi barvami a 640×200 pixelů monochromaticky. Alternativou k MDA+CGA se stala karta Hercules s monochromatickým režimem s vysokým rozlišením 720×348 pixelů, který se i díky podpoře levného monochromatického monitoru stal velmi populární kartou.
Firma IBM na dvojici MDA+CGA navázala kartou EGA, v níž se poprvé mohli vývojáři setkat s takzvanými planárními režimy, které umožnily, aby byla celá video RAM mapována do jediného segmentu (64kB), se všemi z toho plynoucími důsledky. EGA podporovala vyšší rozlišení (640×350 pixelů) i vyšší počet barev. Úspěšná byla navazující karta nazvaná VGA s podporou ještě vyšších rozlišení (oficiálně až do 640×480 pixelů) a možností v některých režimech současně zobrazit 256 barev.
Ovšem vývoj pokračoval dále a vznikaly další typy grafických karet. Některé byly určeny pro profesionální použití (orientace na CAD), jiné postupně (společně se snižující se cenou pamětí atd.) zvyšovaly jak nabízená rozlišení, tak i počet současně zobrazitelných barev. Každý výrobce přitom nabízel různá rozšíření BIOSu pro nastavení nových grafických režimů atd. Lišila se i organizace grafické paměti, takže výsledkem byl – slušně řečeno – chaos. Ten byl částečně zmírněn firmami sloučenými do organizace VESA (Video Electronics Standards Association), která navrhla standard VBE neboli VESA BIOS Extensions. A zejména VBE se budeme zabývat v dnešním článku.
2. Grafická karta IBM 8514/A
Grafická karta IBM 8514/A začala být nabízena v roce 1987 společností IBM jako doplňková grafická karta ke kartě VGA (která o několik let později začala být nepsaným standardem v oblasti grafiky). Ve skutečnosti ji však bylo po malých úpravách možné použít i s dalšími grafickými kartami, zejména s poměrně populárním Herculesem (změny se týkaly zejména úpravy řádkových frekvencí). Současně se jednalo i o první široce dostupný grafický akcelerátor určený pro počítače IBM PC, protože předchozí grafické akcelerátory (například „trojkarta“ PGA či mnohé verze grafických karet typu TARGA a TIGA) byly velmi drahé, a jejich použití tak bylo limitováno pouze pro profesionální účely, čemuž odpovídalo i spektrum aplikací, kterými byly tyto karty podporovány.
Grafická karta IBM 8514/A byla použitelná prakticky na všech počítačích řady IBM PC/AT, které však musely obsahovat poměrně málo úspěšnou sběrnici MCA (Micro Channel Architecture). V pozdějších letech se objevily i klony této grafické karty, které bylo možné zapojit i do rozšířenějších sběrnic ISA či VESA Local Bus, sběrnice MCA se totiž mimo originální počítače od firmy IBM příliš neujala, částečně to bylo zapříčiněno způsobem licencování.
Grafická karta IBM 8514/A patří do skupiny grafických prostředků určených zejména pro aplikace typu CAD, tedy pro aplikace orientované na zpracování a rychlé zobrazování vektorů (i písmo se v CAD systémech vykresluje, resp. přesněji řečeno v minulosti vykreslovalo pomocí vektorů – jen tak je totiž možné zajistit uspokojivé vykreslení na perových plotterech). Při použití tohoto grafického adaptéru bylo pomocí dodávané programové knihovny (ve své podstatě se jednalo o rozsáhlé rozšíření BIOSu) nazvané AI-Adapter Interface (s umělou inteligencí tato knihovna samozřejmě nemá nic společného) podporováno vykreslování základních geometrických tvarů, jakými jsou například úsečka, lomená čára (polyčára), polygon nebo kružnice. Kromě toho obsahoval tento grafický adaptér také podpůrný modul pro rychlé vykreslování rastrových obrazců pomocí operací typu BitBlt – Bit Block Transfer. Byla také dodržena částečná zpětná kompatibilita s grafickými adaptéry typu VGA (viz předchozí díly tohoto seriálu), což bylo důležité pro zaručení funkčnosti adaptéru v mnoha aplikacích, které byly vytvořeny právě pro tento rozšířený typ grafických karet.
3. Typická konfigurace grafické karty IBM 8514/A
Grafický adaptér IBM 8514/A byl do počítačů IBM PC zapojován jako přídavná (tj. ve skutečnosti druhá) grafická karta. Toto řešení, zejména způsob „sériového” napojení karet do jednoho monitoru, bylo nazýváno AVE – Auxiliary Video Extension. Primární kartou nainstalovanou v počítači byl většinou, jak jsme si již ostatně řekli v předchozí kapitole, grafický adaptér VGA, který zajišťoval podporu základních i rozšířených textových a grafických režimů. Přídavná karta IBM 8514/A dokázala generovat rastrový obraz pouze v rozlišení 1024×768 pixelů prokládaně (interlaced) nebo v režimu 640×480 pixelů neprokládaně (non-interlaced). Barevná hloubka dosahovala podle kapacity nainstalované video paměti na tomto adaptéru buď šestnácti nebo 256 současně zobrazitelných barev (což bylo na dobu vzniku velmi dobré).
V grafickém režimu s vyšším rozlišením (tj. konkrétně 1024×768 pixelů) se řádková frekvence rovnala 38 kHz, snímková frekvence však byla rovna pouhým 43,5 Hz (IBM o tomto rozlišení tvrdila, že má obnovovací frekvenci rovnu 88 Hz, ovšem prokládaně; bolesti hlavy byly dodávány zadarmo). V nižším grafickém rozlišení (tj. 640×480 pixelů) byla obrazová frekvence stejná jako na kartě VGA ve stejném grafickém režimu, tj. 60 Hz. Kromě zmíněných dvou grafických režimů neumožňovala tato grafická karta zobrazovat ani textové režimy, ani další grafické režimy – vše ostatní tedy muselo být zobrazováno s využitím primární grafické karty. Tento způsob kooperace dvou grafických karet se ukázal jako výhodný, protože IBM 8514/A mohla být díky tomu poměrně jednoduchá, práce v grafických režimech je totiž o mnoho jednodušší než v režimech textových.
Hardwarová konfigurace této grafické karty je taktéž velmi zajímavá. Pro synchronizaci sériového čtení jednotlivých pixelů z video paměti během zobrazování snímku jsou použity dva krystaly. První z nich má rezonanční frekvenci „vybroušenou” na 44,9 MHz, druhý má frekvenci nastavenou na 25,175 MHz. Vyšší frekvence se používala u rozlišení 1024×768, nižší frekvence je plně kompatibilní s grafickou kartou VGA (viz předchozí díly tohoto seriálu, v nichž je podrobně uvedeno časování v grafických režimech). Kapacita video paměti byla rovna buď 1 MB, nebo 1,5 MB (to je na rok 1987 hodně vysoká hodnota – 1,5 mnohdy převyšovala celkovou kapacitu RAM). Podle instalované kapacity se odvozoval i počet maximálně zobrazitelných barev. Zjednodušené schéma grafického adaptéru IBM 8514/A spolu s jeho připojením do počítače je zobrazeno na následujícím obrázku:
Obrázek 1: Zjednodušené schéma grafického adaptéru IBM 8514/A.
4. Klony IBM 8514/A a další vývoj grafických karet na počítačích PC
Design grafické karty IBM 8514/A byl samozřejmě, jak bylo v té době zvykem, bez okolků kopírován různými dalšími výrobci periferních zařízení. Mezi úspěšné klony této grafické karty, které v ledasčem svůj originál převyšovaly, patří například grafické karty ATI 38800 (Mach 8), ATI 68800 (Mach 32), Chips and Technologies 82c480, Paradise WD95C00 a Paradise WD95C01 (pamětníci si možná na některé tyto názvy vzpomenou). Většina klonů byla připojitelná do sběrnice ISA či VLB, zatímco originální karta IBM 8514/A byla dostupná, jak již ostatně víme z předchozích odstavců, pouze pro sběrnici MCA.
Vzhledem k omezením, která tato grafická karta měla (zejména kvůli závislosti na primární grafické kartě), se však další výrobci grafických karet zaměřili především na rozšiřování funkcionality původní grafické karty VGA. Výsledkem jsou grafické karty označované jako Super VGA, zkráceně SVGA. Nejedná se však o žádný oficiální standard, pouze o označení grafických karet, které nabízejí vyšší rozlišení či počet současně zobrazitelných barev než karta VGA (s níž byly karty SVGA většinou do velké míry kompatibilní).
5. Následníci grafické karty VGA v podobě nestandardu SVGA
Termínem SVGA nebo také Super VGA jsou obecně označovány všechny grafické karty vytvořené pro počítače řady IBM PC, které umožňovaly či umožňují používat rozšířené grafické režimy, tj. režimy s rozlišením vyšším, než je nejvyšší rozlišení karty VGA: 640×480 pixelů. Tyto karty současně mohou podporovat režimy s vyšším počtem současně zobrazitelných barev; v některých případech je dostupná patnáctibitová, šestnáctibitová či dokonce čtyřiadvacetibitová barevná hloubka. Podívejme se nyní blíže na možnosti, které grafické karty typu SVGA nabízejí.
Každá grafická karta typu SVGA by měla být zpětně kompatibilní s kartou VGA, a to jak organizací video paměti do bitových rovin, tak i časováním horizontálních a vertikálních synchronizačních signálů a v neposlední řadě významem řídicích registrů. Ne všechny grafické karty SVGA jsou kompatibilní na sto procent, většina funkcí z původní VGA však typicky zůstává zachována, zejména způsob nastavení základních textových a grafických režimů pomocí funkcí BIOSu a metody přístupu do video paměti při čtení či zápisu barev jednotlivých pixelů (ovšem například režim split-screen, který jsme si popsali, mohl být problematický).
Grafické karty SVGA nabízejí grafické režimy s vyšším rozlišením než 640×480 pixelů. Typicky byla dostupná rozlišení 800×600 pixelů a 1024×768 pixelů. Tyto režimy bylo možné používat s různou barevnou hloubkou a s různou obnovovací frekvencí obrazu i řádkovou frekvencí. Minimálním základem pro všechny rozšířené grafické režimy je zobrazení šestnácti barev. V tomto případě postačuje pro grafický režim 800×600×16 kapacita video paměti 256 kB, což odpovídá původním grafickým kartám typu VGA. Pokud je použit grafický režim s vyšším rozlišením či větší barevná hloubka, musí se patřičně zvýšit i kapacita video paměti, která tak postupně dosahovala hodnot 512 kB, 1 MB, 2 MB atd. (stále bereme v úvahu kapacitu nutnou pro zobrazení pouze jednoho rastrového obrázku, v případě použití předního a zadního bufferu se samozřejmě kapacita video paměti musí dále zvyšovat). Některé používané principy přístupu do obrazové paměti budou popsány v navazující kapitole.
6. Organizace video paměti u karet SVGA
V grafickém režimu 800×600×16 je možné při čtení či zápisu jednotlivých pixelů použít klasický přístup přes bitové roviny, tj. technologii známou z karet EGA i VGA. Je to možné z toho důvodu, že počet pixelů v jedné bitové rovině je při tomto rozlišení roven 480000, což odpovídá 60000 bytům, tj. zhruba kapacitě jedné bitové roviny (připomeňme si, že barvy pixelů jsou rozděleny do všech čtyř barvových bitových rovin). Podobný případ nastává u grafického režimu 640×400×256, který je většinou možné (i když nestandardními postupy) nastavit tak, aby se choval jako již popsaný Mód X, tj. dva sousední pixely jsou vždy uloženy ve dvou nezřetězených bitových rovinách. V tomto režimu se spotřebuje 256000 bajtů obrazové paměti, což prakticky přesně naráží na hranice původní karty VGA (ale ještě je nepřekračuje).
Problémy však nastávají ve všech ostatních rozšířených grafických režimech, například v režimu 1024×768×16, 640×480×256 či 800×600×256, a samozřejmě u všech režimů s větší barvovou hloubkou. Zde se již překračuje adresovatelná kapacita jednotlivých bitových rovin, proto se přístup do obrazové paměti musí řešit odlišným způsobem.
V reálném režimu procesoru (tj. zejména v DOSu) je nutné použít takzvané paměťové banky nebo paměťová okna. Jejich princip spočívá v tom, že se pomocí konfiguračních registrů grafické karty zvolí, do které paměťové banky se mohou zapisovat pixely a ze které paměťové banky se budou pixely číst – čtení a zápis totiž může obecně probíhat v odlišných bankách (přičemž čtení je z praktického hlediska až nepoužitelně pomalé). Celá video paměť je potom rozdělena do pruhů, každý pruh odpovídá jednomu paměťovému banku. Zápis pixelu se touto organizací video paměti podstatným způsobem komplikuje, protože je nejdříve nutné rozhodnout, do kterého banku čtený či zapisovaný pixel padne, tento bank se posléze vybere, a teprve poté je již možné provést čtení/zápis. I při vykreslování spritů může nastat případ, kdy různé části spritu padnou do jiného banku.
Situace se poněkud zlepšuje v chráněném režimu procesoru. Tam je totiž možné celou video paměť „virtuálně“ mapovat do jednoho souvislého paměťového úseku, který se nachází za nejvyšší adresou operační paměti. Paměťové banky jsou sice stále fyzicky přítomné (tj. musí se přepínat), ale aplikace je nemusí ovládat přímo. Ve skutečnosti o jejich přítomnosti nemusí vůbec vědět. Pokud se totiž provede zápis do oblasti video paměti, která neodpovídá aktuálně nastavenému banku, dojde k výjimce (jsme v chráněném režimu, oblasti čtení a zápisu se definují pomocí deskriptorů), kterou odchytí ovladač grafické karty, ten potřebný bank nastaví a zápis posléze provede. Novější grafické karty řady SVGA, zejména ty, které jsou připojeny na sběrnici PCI, nemusí banky používat vůbec, tam je možné celou grafickou paměť mapovat do adresové oblasti procesoru. Konkrétní počáteční adresa se nastaví při inicializaci zařízení typu plug-and-play).
Ovládání banků (a současně i jejich velikost) je však závislá na typu grafické karty, tj. například karta Trident 8900 (ve své době velmi oblíbená) se ovládá jiným způsobem než karta OTI či Chips and Technologies. Chaos v ovládání grafických karet v rozšířených grafických režimech částečně odstranila až norma VESA, která je popsána v navazující kapitole.
7. Standard VESA aneb částečné zmírnění chaosu na trhu s grafickými kartami
V předchozích dvou kapitolách jsme si popsali určitý chaos ve světě SVGA karet. Tyto karty nabízely poměrně mnoho funkcí i grafických režimů, jejich největší nevýhodou však byla vzájemná nekompatibilita. Neexistoval totiž jednotný způsob nastavení rozšířených grafických režimů, lišily se režimy přístupu do video paměti, způsob přepínání paměťových banků apod. IBM se nastálý chaos pokusila vyřešit uvedením grafické karty XGA, ta se však objevila na trhu poměrně pozdě a ostatní výrobci grafických čipů tuto kartu celkem úspěšně ignorovali a navrhovali si vlastní řešení a pseudostandardy. Výsledkem poměrně rychlého vývoje grafických karet tak bylo paradoxně zaostávání aplikací za technickými možnostmi grafických karet, protože softwarové firmy z celkem pochopitelných důvodů reagovaly na nové výrobky se zpožděním. Tento stav začal být evidentní a dosti palčivý v devadesátých letech minulého století.
Kromě pokusu firmy IBM o řešení zmatku v grafických kartách se objevil i standard navržený sdružením VESA (Video Electronics Standards Association). Do tohoto sdružení se dříve či později zapojili prakticky všichni výrobci grafických čipů a taktéž významné softwarové firmy. Výsledkem práce tohoto sdružení bylo několik verzí norem, které byly v počítačové literatuře zkráceně nazývány pouze termínem VESA, například VESA 1.1 či VESA 2.0 (což není úplně přesné). V těchto normách byla uvedena zejména čísla rozšířených grafických režimů tak, aby je bylo možné nastavit pomocí služeb takzvaného VESA BIOSu. Kromě toho byly specifikovány služby pro zjištění parametrů grafických karet, tj. výrobce grafického čipu, typu grafické karty, podporovaných rozlišení a podporovaných obnovovacích frekvencí obrazu (některé grafické režimy bylo možné zobrazovat s odlišnými frekvencemi vertikálních a horizontálních synchronizačních signálů).
Kromě toho bylo specifikováno uspořádání grafických dat v obrazové paměti a způsob přepínání jednotlivých banků v reálném režimu procesoru. Pozdější norma VESA obsahovala i doporučení o (alespoň virtuálně) lineárním uspořádání obrazové paměti v chráněném režimu (což využívaly pozdější hry). Výše zmíněný VESA BIOS (VBE – VESA BIOS Extension) mohl být implementován buď přímo na grafické kartě, nebo přes ovladač grafické karty, který byl typicky dodávaný třetím výrobcem, protože mnoho výrobců grafických čipů tyto ovladače kupodivu přímo nedodávalo.
Standard VESA byl v minulosti použit zejména v operačním systému DOS, v dnešní době má význam pouze jako nejmenší společný prvek, který by (alespoň teoreticky) měly podporovat všechny moderní grafické karty. Nicméně VBE je již zastaralý a byl nahrazen UEFI GOP (Graphics Output Protocol), což je však téma na samostatný článek.
8. Standardní grafické režimy představené ve VBE 1.2
VBE verze 1.2 přinesl určitou standardizaci grafických režimů, protože definoval šestnáct režimů, včetně jejich rozlišení, barevné hloubky a tím pádem i počtu zobrazitelných barev (ovšem například velikost paměťových bank může být odlišná!). Ne všechny režimy musí být kartou (+ monitorem) podporovány, ovšem minimálně některé z nich podporuje prakticky každá karta kompatibilní s VESA (čímž se myslí VBE 1.2 nebo vyšší verze):
| Číslo | Rozlišení | Bitů na pixel | Počet barev |
|---|---|---|---|
| 0×0100 | 640×400 | 8 | 256 |
| 0×0101 | 640×480 | 8 | 256 |
| 0×0102 | 800×600 | 4 | 16 |
| 0×0103 | 800×600 | 8 | 256 |
| 0×010D | 320×200 | 15 | 32768 |
| 0×010E | 320×200 | 16 | 65536 |
| 0×010F | 320×200 | 24/32 | 1677216 |
| 0×0110 | 640×480 | 15 | 32768 |
| 0×0111 | 640×480 | 16 | 65536 |
| 0×0112 | 640×480 | 24/32 | 1677216 |
| 0×0113 | 800×600 | 15 | 32768 |
| 0×0114 | 800×600 | 16 | 65536 |
| 0×0115 | 800×600 | 24/32 | 1677216 |
| 0×0116 | 1024×768 | 15 | 32768 |
| 0×0117 | 1024×768 | 16 | 65536 |
| 0×0118 | 1024×768 | 24/32 | 1677216 |
9. Praktická část
V praktické části dnešního článku si ukážeme základní služby VBE neboli VESA BIOS Extension. Nejdříve zjistíme základní informace o grafické kartě a následně načteme informace o zvoleném grafickém režimu. A jak je již v tomto seriálu zvykem, implementace bude naprogramována v Netwide Assembleru pro operační systém DOS (tedy pro reálný režim se všemi omezeními, které tento režim mikroprocesoru přináší v praxi). Demonstrační příklady by měly být funkční pro všechny počítače s VBE (SW implementace či přímo součást ROM na kartě), nezávisle na verzi VBE. A pochopitelně jsou tyto příklady spustitelné i v DOSBoxu.
10. Přečtení základních informací o grafické kartě
První službou BIOSu grafických karet odpovídajících normě VESA, kterou si ukážeme, je hned první služba s číslem 00. Tato služba otestuje, zda je VBE dostupný a pokud ano, naplní paměťový blok o velikosti 256 resp. 512 bajtů (podle verze VBE) podrobnějšími informacemi o výrobci karty, dostupných grafických režimech atd. Navíc tato služba (i všechny další služby VBE) vrací v registru AL hodnotu 0×4F v případě, že je služba podporována. A v registru AH je vrácen příznak, zda bylo volání úspěšné či nikoli. V praxi nám tedy bude postačovat testovat hodnotu uloženou do registru AX na 0×004F, protože AX vznikne spojením registrů AH a AL (což již velmi dobře známe):
Vstup: AH = 4Fh Služby SVGA
AL = 00h Získání základních informací o SVGA
ES:DI = ukazatel na buffer (256/512 bajtů)
Výstup: AL = 4Fh pokud je služba podporována, jinak odlišná hodnota
AH = 00h pokud je volání úspěšné, jinak hodnota 01h
11. První demonstrační příklad: zjištění, zda je VBE dostupný
Dnešní první demonstrační příklad je velmi jednoduchý. Pouze v něm voláme výše popsanou službu VBE a na základě návratové hodnoty uložené v registru AX zjišťujeme, zda je VBE podporován či nikoli. Na základě tohoto testu se vypíše zpráva „Success“ nebo „Failed“:
;-----------------------------------------------------------------------------
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
push ds
pop es ; nastaveni CS=DS=ES
clc ; ziskani zakladnich informaci o VESA rezimech
mov di, vesa_block_info
mov ax, 0x4f00
int 0x10
cmp ax, 0x004f ; test, zda bylo volani funkce BIOSu uspesne
jne failed
success:
print_string success_msg
jmp finish
failed:
print_string failed_msg
finish:
wait_key ; cekani na klavesu
exit ; navrat do DOSu
; datova cast
section .data
success_msg: db "Success", 0x0a, 0x0d, "$"
failed_msg: db "Failed", 0x0a, 0x0d, "$"
section .bss
vesa_block_info: resb 512
Zajímavé bude zjistit, jaké zprávy se vypíšou. V DOSBoxu, pokud je pochopitelně nakonfigurována karta SVGA (což v originální konfiguraci je), by se měla vypsat pouze zpráva:
Success
12. Blok s informacemi o grafické kartě
Služba VBE, kterou jsme volali v rámci prvního demonstračního příkladu, kromě návratového kódu naplní i paměťový blok o velikosti 256 nebo 512 bajtů (podle verze VBE), na který ukazuje dvojice registrů ES:DI. Struktura první části tohoto bloku je přesně definována, poté následuje 222 rezervovaných bajtů a následně 256 bajtů, které jsou v novějších verzích VBE použity pro účely výrobce grafických karet. Základní strukturu tohoto bloku můžeme v assembleru popsat následovně:
vesa_block_info:
Signature resb 4
Version resw 1
OEMNamePtr resd 1
Capabilities resd 1
VideoModesOffset resw 1
VideoModesSegment resw 1
CountOf64KBlocks resw 1
OEMSoftwareRevision resw 1
OEMVendorNamePtr resd 1
OEMProductNamePtr resd 1
OEMProductRevisionPtr resd 1
Reserved resb 222
OEMData resb 256
Některé důležité hodnoty předané v tomto bloku, si ukážeme v dalších demonstračních příkladech.
13. Druhý demonstrační příklad: zobrazení základních informací o grafické kartě
V dnešním druhém demonstračním příkladu si necháme vypsat základní informace o grafické kartě získané přes VBE. Z celého 256 bajtového nebo 512 bajtového bloku získáme tři důležité údaje:
- Signaturu na začátku paměťového bloku, která by měla obsahovat ASCII kódy znaků „VESA“ (ovšem nejedná se o řetězec)
- Verzi VBE ve formátu vyšší_bajt.nižší_bajt. Pokud se například vrátí hodnota 0×102, jedná se o verzi 1.2 atd.
- Kapacita obrazové paměti (VideoRAM) specifikovaná jako počet paměťových bloků, z nichž každý má velikost 64kB. Ovšem některé karty používají menší okna (zejména u starších karet byl tento údaj zavádějící). Nicméně většinou postačuje zde uloženou hodnotu vynásobit 64kB a získat tak celkovou kapacitu obrazové paměti.
Zdrojový kód tohoto příkladu vypadá následovně:
;-----------------------------------------------------------------------------
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
push ds
pop es ; nastaveni CS=DS=ES
clc ; ziskani zakladnich informaci o VESA rezimech
mov di, vesa_block_info
mov ax, 0x4f00
int 0x10
cmp ax, 0x004f ; test, zda bylo volani funkce BIOSu uspesne
jne failed
success:
print_string success_msg
mov eax, [Signature] ; zkopirovat VESA signaturu do DOSovskeho retezce
mov [signature_msg], eax
print_string signature_msg ; tisk naplneneho retezce
sub eax, eax
mov ax, [Version] ; verze VBE
print_hex eax
sub eax, eax
mov ax, [CountOf64KBlocks] ; pocet 64kB bloku video RAM
print_dec eax
jmp finish
failed:
print_string failed_msg
finish:
wait_key ; cekani na klavesu
exit ; navrat do DOSu
; datova cast
section .data
success_msg: db "Success", 0x0a, 0x0d, "$"
failed_msg: db "Failed", 0x0a, 0x0d, "$"
signature_msg: db "????", 0x0a, 0x0d, "$"
section .bss
vesa_block_info:
Signature resb 4
Version resw 1
OEMNamePtr resd 1
Capabilities resd 1
VideoModesOffset resw 1
VideoModesSegment resw 1
CountOf64KBlocks resw 1
OEMSoftwareRevision resw 1
OEMVendorNamePtr resd 1
OEMProductNamePtr resd 1
OEMProductRevisionPtr resd 1
Reserved resb 222
OEMData resb 256
V mém konkrétním případě se vypíše:
Success VESA 00000200 0000000064
To znamená, že verze VBE je rovna 2.0 a grafická karta má 64 oken, každé o velikosti 64kB. Celkem jsou tedy na kartě nainstalovány 4MB Video RAM.
14. Třetí demonstrační příklad: výpis OEM řetězce s další informací o kartě
Ve třetím příkladu, který si dnes ukážeme, se navíc ještě vypisuje řetězec s označením grafické karty. Tento řetězec je umístěn na adrese, která je uložena jako dvojice segment:offset v prvcích OEMNamePtr+2 a OEMNamePtr. Jedná se o céčkovský řetězec ukončený nulou, který nelze přímo vypsat funkcemi DOSu, takže jsem pro jednoduchost zvolil výpis stylem znak po znaku, což je sice pomalé, ale pro typicky hodně krátké řetězce nám to nemusí příliš vadit:
mov es, [OEMNamePtr+2] ; dlouhy ukazatel na retezec
mov bx, [OEMNamePtr] ; ukonceny nulou
next_char:
mov dl, es:[bx] ; nacteni znaku
cmp dl, 0 ; test na ukoncovaci nulu
jz end_str
mov ah, 02 ; DOS funkce pro tisk znaku
int 0x21
inc bx ; prechod na dalsi znak
jmp next_char ; pokracujeme
end_str:
V mém případě se vypíšou tyto údaje (jméno výrobce a typ grafické karty):
S3 Incorporated. Trio64
Úplný zdrojový kód tohoto příkladu vypadá následovně:
;-----------------------------------------------------------------------------
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
push ds
pop es ; nastaveni CS=DS=ES
clc ; ziskani zakladnich informaci o VESA rezimech
mov di, vesa_block_info
mov ax, 0x4f00
int 0x10
cmp ax, 0x004f ; test, zda bylo volani funkce BIOSu uspesne
jne failed
success:
print_string success_msg
mov eax, [Signature] ; zkopirovat VESA signaturu do DOSovskeho retezce
mov [signature_msg], eax
print_string signature_msg ; tisk naplneneho retezce
sub eax, eax
mov ax, [Version] ; verze VBE
print_hex eax
sub eax, eax
mov ax, [CountOf64KBlocks] ; pocet 64kB bloku video RAM
print_dec eax
mov es, [OEMNamePtr+2] ; dlouhy ukazatel na retezec
mov bx, [OEMNamePtr] ; ukonceny nulou
next_char:
mov dl, es:[bx] ; nacteni znaku
cmp dl, 0 ; test na ukoncovaci nulu
jz end_str
mov ah, 02 ; DOS funkce pro tisk znaku
int 0x21
inc bx ; prechod na dalsi znak
jmp next_char ; pokracujeme
end_str:
jmp finish
failed:
print_string failed_msg
finish:
wait_key ; cekani na klavesu
exit ; navrat do DOSu
; datova cast
section .data
success_msg: db "Success", 0x0a, 0x0d, "$"
failed_msg: db "Failed", 0x0a, 0x0d, "$"
signature_msg: db "????", 0x0a, 0x0d, "$"
section .bss
vesa_block_info:
Signature resb 4
Version resw 1
OEMNamePtr resd 1
Capabilities resd 1
VideoModesOffset resw 1
VideoModesSegment resw 1
CountOf64KBlocks resw 1
OEMSoftwareRevision resw 1
OEMVendorNamePtr resd 1
OEMProductNamePtr resd 1
OEMProductRevisionPtr resd 1
Reserved resb 222
OEMData resb 256
15. Čtvrtý demonstrační příklad: zjištění a výpis čísel všech podporovaných grafických režimů
Dalším důležitým údajem, který o sobě grafická karta přes VBE prozrazuje, je tabulka s čísly grafických ale i textových režimů (ovšem bez dalších podrobností). Adresa (ukazatel) na tuto tabulku je uložena ve dvojici VideoModesSegment a VideoModesOffset, přičemž každé číslo režimu je šestnáctibitové. Na konci tabulky je uložena šestnáctibitová hodnota –1 (tedy 0×ffff), kterou budeme hledat, aby bylo možné ukončit smyčku, která čísla všech grafických režimů vypíše:
mov es, [VideoModesSegment] ; tabulka s cisly grafickych rezimu
mov bx, [VideoModesOffset]
next_mode:
xor eax, eax
mov ax, es:[bx] ; nacteni cisla rezimu
cmp ax, -1 ; jde o posledni zaznam?
je last_mode ; ano -> koncime
print_dec eax ; tisk cisla rezimu
inc bx ; offset pro dalsi rezim
inc bx
jmp next_mode ; pokracujeme
last_mode:
Opět se podívejme, jaká čísla režimů se vypíšou pro grafickou kartu Trio64:
0000000256 0000000257 0000000258 0000000259 0000000260 0000000261 0000000262 0000000263 0000000264 0000000265 0000000266 0000000267 0000000268 0000000272 0000000273 0000000274 0000000275 0000000276 0000000277 0000000278 0000000279 0000000280 0000000281 0000000282 0000000288 0000000289 0000000290 0000000337 0000000341 0000000342 0000000343 0000000344 0000000352 0000000358 0000000359 0000000360 0000000361 0000000362 0000000364 0000000368 0000000375 0000000376 0000000379 0000000380 0000000381 0000000382 0000000383 0000000384 0000000386 0000000387 0000000400 0000000519 0000000521 0000000522 0000000523 0000000530 0000000531 0000000533 0000000534
Celý zdrojový kód takto upraveného demonstračního příkladu vypadá následovně:
;-----------------------------------------------------------------------------
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
push ds
pop es ; nastaveni CS=DS=ES
clc ; ziskani zakladnich informaci o VESA rezimech
mov di, vesa_block_info
mov ax, 0x4f00
int 0x10
cmp ax, 0x004f ; test, zda bylo volani funkce BIOSu uspesne
jne failed
success:
print_string success_msg
mov eax, [Signature] ; zkopirovat VESA signaturu do DOSovskeho retezce
mov [signature_msg], eax
print_string signature_msg ; tisk naplneneho retezce
sub eax, eax ; nacitame jen AX, proto vymazat hornich 32 bitu EAX
mov ax, [Version] ; verze VBE
print_hex eax
mov ax, [CountOf64KBlocks] ; pocet 64kB bloku video RAM
print_dec_16 eax
mov es, [OEMNamePtr+2] ; dlouhy ukazatel na retezec
mov bx, [OEMNamePtr] ; ukonceny nulou
next_char:
mov dl, es:[bx] ; nacteni znaku
cmp dl, 0 ; test na ukoncovaci nulu
jz end_str
mov ah, 02 ; DOS funkce pro tisk znaku
int 0x21
inc bx ; prechod na dalsi znak
jmp next_char ; pokracujeme
end_str:
mov es, [VideoModesSegment] ; tabulka s cisly grafickych rezimu
mov bx, [VideoModesOffset]
next_mode:
xor eax, eax
mov ax, es:[bx] ; nacteni cisla rezimu
cmp ax, -1 ; jde o posledni zaznam?
je last_mode ; ano -> koncime
print_dec eax ; tisk cisla rezimu
inc bx ; offset pro dalsi rezim
inc bx
jmp next_mode ; pokracujeme
last_mode:
jmp finish
failed:
print_string failed_msg
finish:
wait_key ; cekani na klavesu
exit ; navrat do DOSu
; datova cast
section .data
success_msg: db "Success", 0x0a, 0x0d, "$"
failed_msg: db "Failed", 0x0a, 0x0d, "$"
signature_msg: db "????", 0x0a, 0x0d, "$"
section .bss
vesa_block_info:
Signature resb 4
Version resw 1
OEMNamePtr resd 1
Capabilities resd 1
VideoModesOffset resw 1
VideoModesSegment resw 1
CountOf64KBlocks resw 1
OEMSoftwareRevision resw 1
OEMVendorNamePtr resd 1
OEMProductNamePtr resd 1
OEMProductRevisionPtr resd 1
Reserved resb 222
OEMData resb 256
16. Přečtení informací o zvoleném grafickém režimu
Prvním voláním služby VBE jsme získali mj. tabulku s čísly grafických režimů, ovšem vůbec nevíme, jaké jsou vlastnosti jednotlivých režimů (a dokonce ani to, jestli se jedná o režim grafický nebo textový). Podrobné informace o jednom vybraném grafickém režimu musíme zjistit další službou, konkrétně službou číslo 0×4F a podslužbou 1. Do registru CX je nutné zadat číslo režimu, který potřebujeme prozkoumat a v registrovém páru ES:DI musí být předán ukazatel na buffer o délce 256 bajtů, do kterého se uloží podrobné informace o zvoleném režimu:
Vstup: AH = 4Fh Služby SVGA
AL = 01h Získání informací o zvoleném grafickém režimu
CX = číslo režimu
ES:DI = ukazatel na buffer (256 bajtů)
Výstup: AL = 4Fh pokud je služba podporována, jinak odlišná hodnota
AH = 00h pokud je volání úspěšné, jinak hodnota 01h
Blok o délce 256 bajtů, který je vyplněn, má tuto strukturu:
graphics_mode_block_info:
ModeAttributes resw 1 ; mode attributes
WinAAttributes resb 1 ; window A attributes
WinBAttributes resb 1 ; window B attributes
WinGranularity resw 1 ; window granularity
WinSize resw 1 ; window size
WinASegment resw 1 ; window A start segment
WinBSegment resw 1 ; window B start segment
WinFuncPtr resd 1 ; pointer to windor function
BytesPerScanLine resw 1 ; bytes per scan line
XResolution resw 1 ; horizontal resolution
YResolution resw 1 ; vertical resolution
XCharSize resb 1 ; character cell width
YCharSize resb 1 ; character cell height
NumberOfPlanes resb 1 ; number of memory planes
BitsPerPixel resb 1 ; bits per pixel
NumberOfBanks resb 1 ; number of banks
MemoryModel resb 1 ; memory model type
BankSize resb 1 ; bank size in kb
NumberOfImagePages resb 1 ; number of images
Reserved1 resb 1 ; reserved for page function
RedMaskSize resb 1 ; size of direct color red mask in bits
RedFieldPosition resb 1 ; bit position of LSB of red mask
GreenMaskSize resb 1 ; size of direct color green mask in bits
GreenFieldPosition resb 1 ; bit position of LSB of green mask
BlueMaskSize resb 1 ; size of direct color blue mask in bits
BlueFieldPosition resb 1 ; bit position of LSB of blue mask
RsvdMaskSize resb 1 ; size of direct color reserved mask in bits
DirectColorModeInfo resb 1 ; Direct Color mode attributes
Reserved2 resb 216 ; remainder of ModeInfoBlock
17. Pátý demonstrační příklad: získání rozlišení, bitové hloubky a struktury obrazových řádků zvoleného grafického režimu
Jak se tedy postupuje v praxi? Aplikace (nebo přímo uživatel) si vybere požadované rozlišení a počet barev. Následně je nutné projít všemi nabízenými grafickými režimy a vybrat z nich ten, který odpovídá požadavkům. Například aplikace bude vyžadovat rozlišení 800×600 pixelů s 256 barvami – takový režim je typicky podporovaný většinou SVGA karet. Naopak některé režimy s rozlišením přesahujícím 1024×768 pixelů podporovány být nemusí.
V dnešním předposledním demonstračním příkladu si necháme vypsat základní informace o grafickém režimu číslo 0×103. Pokud grafická karta tento režim podporuje, vypíše se jeho rozlišení (pro grafické režimy je přímo uvedeno v pixelech), počet bajtů alokovaných pro každý obrazový řádek, počet bitů pro uložení jednoho pixelu a taktéž počet bitových rovin (což je spíše historická hodnota, protože se typicky vrací jediná bitová rovina):
;-----------------------------------------------------------------------------
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
push ds
pop es ; nastaveni CS=DS=ES
clc ; ziskani zakladnich informaci o grafickem rezimu
mov di, graphics_mode_block_info
mov cx, 0x103 ; cislo rezimu
mov ax, 0x4f01
int 0x10
cmp ax, 0x004f ; test, zda bylo volani funkce BIOSu uspesne
jne failed
success:
print_string success_msg
mov ax, [XResolution]
print_dec_16
mov ax, [YResolution]
print_dec_16
mov ax, [BytesPerScanLine]
print_dec_16
mov al, [BitsPerPixel]
print_dec_8
mov al, [NumberOfPlanes]
print_dec_8
jmp finish
failed:
print_string failed_msg
finish:
wait_key ; cekani na klavesu
exit ; navrat do DOSu
; datova cast
section .data
success_msg: db "Success", 0x0a, 0x0d, "$"
failed_msg: db "Failed", 0x0a, 0x0d, "$"
section .bss
graphics_mode_block_info:
ModeAttributes resw 1 ; mode attributes
WinAAttributes resb 1 ; window A attributes
WinBAttributes resb 1 ; window B attributes
WinGranularity resw 1 ; window granularity
WinSize resw 1 ; window size
WinASegment resw 1 ; window A start segment
WinBSegment resw 1 ; window B start segment
WinFuncPtr resd 1 ; pointer to windor function
BytesPerScanLine resw 1 ; bytes per scan line
XResolution resw 1 ; horizontal resolution
YResolution resw 1 ; vertical resolution
XCharSize resb 1 ; character cell width
YCharSize resb 1 ; character cell height
NumberOfPlanes resb 1 ; number of memory planes
BitsPerPixel resb 1 ; bits per pixel
NumberOfBanks resb 1 ; number of banks
MemoryModel resb 1 ; memory model type
BankSize resb 1 ; bank size in kb
NumberOfImagePages resb 1 ; number of images
Reserved1 resb 1 ; reserved for page function
RedMaskSize resb 1 ; size of direct color red mask in bits
RedFieldPosition resb 1 ; bit position of LSB of red mask
GreenMaskSize resb 1 ; size of direct color green mask in bits
GreenFieldPosition resb 1 ; bit position of LSB of green mask
BlueMaskSize resb 1 ; size of direct color blue mask in bits
BlueFieldPosition resb 1 ; bit position of LSB of blue mask
RsvdMaskSize resb 1 ; size of direct color reserved mask in bits
DirectColorModeInfo resb 1 ; Direct Color mode attributes
Reserved2 resb 216 ; remainder of ModeInfoBlock
Po překladu a spuštění tohoto příkladu se v mém případě (ale i na mnoha dalších počítačích) vypíše:
Success 0000000800 0000000600 0000000800 0000000008 0000000001
Jak se tyto údaje dekódují? První dva řádky naznačují rozlišení grafického režimu 800×600 pixelů. Další řádek uvádí, že délka obrazové řádky je 800 bajtů. Na pátém řádku je uvedeno, že bitová hloubka je osm bitů na pixel a tudíž tento režim podporuje 256 barev. A na posledním řádku je uvedeno, že počet bitových rovin je roven jedné.
18. Šestý demonstrační příklad: základní informace o čtecích a zápisových oknech pro reálný režim
Údaje o rozlišení a počtu barev, které jsme doposud zjistili, poskytují požadované informace z uživatelského pohledu. Uživatel (nebo aplikace) totiž vybírá právě tyto údaje. Ovšem pro čtení a zápis do obrazové paměti je nutné mít k dispozici ještě více informací – zejména to, jak velké jsou paměťové banky (okna), kolik těchto oken je k dispozici atd. Tyto údaje si necháme zjistit a vypsat dnešním posledním demonstračním příkladem, jehož zdrojový kód vypadá následovně:
;-----------------------------------------------------------------------------
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
start:
jmp main ; skok na zacatek kodu
%include "io.asm" ; nacist symboly, makra a podprogramy
%include "print.asm" ; nacist symboly, makra a podprogramy
main:
push ds
pop es ; nastaveni CS=DS=ES
clc ; ziskani zakladnich informaci o grafickem rezimu
mov di, graphics_mode_block_info
mov cx, 0x103 ; cislo rezimu
mov ax, 0x4f01
int 0x10
cmp ax, 0x004f ; test, zda bylo volani funkce BIOSu uspesne
jne failed
success:
print_string success_msg
xor eax, eax
mov al, [WinAAttributes]
print_hex eax
xor eax, eax
mov al, [WinBAttributes]
print_hex eax
xor eax, eax
mov ax, [WinGranularity]
print_dec_8
jmp finish
failed:
print_string failed_msg
finish:
wait_key ; cekani na klavesu
exit ; navrat do DOSu
; datova cast
section .data
success_msg: db "Success", 0x0a, 0x0d, "$"
failed_msg: db "Failed", 0x0a, 0x0d, "$"
section .bss
graphics_mode_block_info:
ModeAttributes resw 1 ; mode attributes
WinAAttributes resb 1 ; window A attributes
WinBAttributes resb 1 ; window B attributes
WinGranularity resw 1 ; window granularity
WinSize resw 1 ; window size
WinASegment resw 1 ; window A start segment
WinBSegment resw 1 ; window B start segment
WinFuncPtr resd 1 ; pointer to windor function
BytesPerScanLine resw 1 ; bytes per scan line
XResolution resw 1 ; horizontal resolution
YResolution resw 1 ; vertical resolution
XCharSize resb 1 ; character cell width
YCharSize resb 1 ; character cell height
NumberOfPlanes resb 1 ; number of memory planes
BitsPerPixel resb 1 ; bits per pixel
NumberOfBanks resb 1 ; number of banks
MemoryModel resb 1 ; memory model type
BankSize resb 1 ; bank size in kb
NumberOfImagePages resb 1 ; number of images
Reserved1 resb 1 ; reserved for page function
RedMaskSize resb 1 ; size of direct color red mask in bits
RedFieldPosition resb 1 ; bit position of LSB of red mask
GreenMaskSize resb 1 ; size of direct color green mask in bits
GreenFieldPosition resb 1 ; bit position of LSB of green mask
BlueMaskSize resb 1 ; size of direct color blue mask in bits
BlueFieldPosition resb 1 ; bit position of LSB of blue mask
RsvdMaskSize resb 1 ; size of direct color reserved mask in bits
DirectColorModeInfo resb 1 ; Direct Color mode attributes
Reserved2 resb 216 ; remainder of ModeInfoBlock
Opět se podívejme na vypsané informace:
Success 00000007 00000000 0000000064
Jak se tyto informace použijí? K dispozici je podpora pro použití jednoho okna (WindowA), které lze použít jak pro čtení z obrazové paměti, tak i pro zápis do ní. Druhé okno podporováno není (dolní tři bity jsou nulové). A tzv. granularita okna A je rovna 64 kilobajtům. To znamená, že okno bude mapováno do „klasického“ segmentu 0×A000, jak je tomu zvykem již od dob grafických karet EGA a VGA. Pozor si musíme dát na to, že některé karty mají granularitu 4 kB nebo 16 kB, nikoli celých 64 kB. To je ovšem téma, kterému se budeme podrobněji věnovat v navazujícím článku.
Jen pro úplnost si uveďme význam bitů určujících vlastnosti okna A a popř. i okna B:
| Bit | Význam |
|---|---|
| 0 | 1=okno je podporováno HW karty |
| 1 | 1=z okna je možné číst data (z obrazové paměti) |
| 2 | 1=do okna je možné zapisovat data (do obrazové paměti) |
| 3–7 | rezervováno |
19. Repositář s demonstračními příklady
Demonstrační příklady napsané v assembleru, které jsou určené pro překlad s využitím assembleru NASM, byly uloženy do Git repositáře, který je dostupný na adrese https://github.com/tisnik/8bit-fame. Jednotlivé demonstrační příklady si můžete v případě potřeby stáhnout i jednotlivě bez nutnosti klonovat celý (dnes již poměrně rozsáhlý) repositář:
| # | Příklad | Stručný popis | Adresa |
|---|---|---|---|
| 1 | hello.asm | program typu „Hello world“ naprogramovaný v assembleru pro systém DOS | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello.asm |
| 2 | hello_shorter.asm | kratší varianta výskoku z procesu zpět do DOSu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_shorter.asm |
| 3 | hello_wait.asm | čekání na stisk klávesy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_wait.asm |
| 4 | hello_macros.asm | realizace jednotlivých částí programu makrem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_macros.asm |
| 5 | gfx4_putpixel.asm | vykreslení pixelu v grafickém režimu 4 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_putpixel.asm |
| 6 | gfx6_putpixel.asm | vykreslení pixelu v grafickém režimu 6 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel.asm |
| 7 | gfx4_line.asm | vykreslení úsečky v grafickém režimu 4 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_line.asm |
| 8 | gfx6_line.asm | vykreslení úsečky v grafickém režimu 6 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_line.asm |
| 9 | gfx6_fill1.asm | vyplnění obrazovky v grafickém režimu, základní varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill1.asm |
| 10 | gfx6_fill2.asm | vyplnění obrazovky v grafickém režimu, varianta s instrukcí LOOP | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill2.asm |
| 11 | gfx6_fill3.asm | vyplnění obrazovky instrukcí REP STOSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill3.asm |
| 12 | gfx6_fill4.asm | vyplnění obrazovky, synchronizace vykreslování s paprskem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill4.asm |
| 13 | gfx4_image1.asm | vykreslení rastrového obrázku získaného z binárních dat, základní varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image1.asm |
| 14 | gfx4_image2.asm | varianta vykreslení rastrového obrázku s využitím instrukce REP MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image2.asm |
| 15 | gfx4_image3.asm | varianta vykreslení rastrového obrázku s využitím instrukce REP MOVSW | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image3.asm |
| 16 | gfx4_image4.asm | korektní vykreslení všech sudých řádků bitmapy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image4.asm |
| 17 | gfx4_image5.asm | korektní vykreslení všech sudých i lichých řádků bitmapy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image5.asm |
| 18 | gfx4_image6.asm | nastavení barvové palety před vykreslením obrázku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image6.asm |
| 19 | gfx4_image7.asm | nastavení barvové palety před vykreslením obrázku, snížená intenzita barev | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image7.asm |
| 20 | gfx4_image8.asm | postupná změna barvy pozadí | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image8.asm |
| 21 | gfx6_putpixel1.asm | vykreslení pixelu, základní varianta se 16bitovým násobením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel1.asm |
| 22 | gfx6_putpixel2.asm | vykreslení pixelu, varianta s osmibitovým násobením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel2.asm |
| 23 | gfx6_putpixel3.asm | vykreslení pixelu, varianta bez násobení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel3.asm |
| 24 | gfx6_putpixel4.asm | vykreslení pixelu přes obrázek, nekorektní chování (přepis obrázku) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel4.asm |
| 25 | gfx6_putpixel5.asm | vykreslení pixelu přes obrázek, korektní varianta pro bílé pixely | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel5.asm |
| 26 | cga_text_mode1.asm | standardní textový režim s rozlišením 40×25 znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode1.asm |
| 27 | cga_text_mode3.asm | standardní textový režim s rozlišením 80×25 znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode3.asm |
| 28 | cga_text_mode_intensity.asm | změna významu nejvyššího bitu atributového bajtu: vyšší intenzita namísto blikání | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_intensity.asm |
| 29 | cga_text_mode_cursor.asm | změna tvaru textového kurzoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_cursor.asm |
| 30 | cga_text_gfx1.asm | zobrazení „rastrové mřížky“: pseudografický režim 160×25 pixelů (interně textový režim) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_gfx1.asm |
| 31 | cga_text_mode_char_height.asm | změna výšky znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_char_height.asm |
| 32 | cga_text_160×100.asm | grafický režim 160×100 se šestnácti barvami (interně upravený textový režim) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_160×100.asm |
| 33 | hercules_text_mode1.asm | využití standardního textového režimu společně s kartou Hercules | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_text_mode1.asm |
| 34 | hercules_text_mode2.asm | zákaz blikání v textových režimech | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_text_mode2.asm |
| 35 | hercules_turn_off.asm | vypnutí generování video signálu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_turn_off.asm |
| 36 | hercules_gfx_mode1.asm | přepnutí karty Hercules do grafického režimu (základní varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_gfx_mode1.asm |
| 37 | hercules_gfx_mode2.asm | přepnutí karty Hercules do grafického režimu (vylepšená varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_gfx_mode2.asm |
| 38 | hercules_putpixel.asm | subrutina pro vykreslení jediného pixelu na kartě Hercules | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_putpixel.asm |
| 39 | ega_text_mode_80×25.asm | standardní textový režim 80×25 znaků na kartě EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_text_mode_80×25.asm |
| 40 | ega_text_mode_80×43.asm | zobrazení 43 textových řádků na kartě EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_text_mode_80×43.asm |
| 41 | ega_gfx_mode_320×200.asm | přepnutí do grafického režimu 320×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_320×200.asm |
| 42 | ega_gfx_mode_640×200.asm | přepnutí do grafického režimu 640×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_640×200.asm |
| 43 | ega_gfx_mode_640×350.asm | přepnutí do grafického režimu 640×350 pixelů se čtyřmi nebo šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_640×350.asm |
| 44 | ega_gfx_mode_bitplanes1.asm | ovládání zápisu do bitových rovin v planárních grafických režimech (základní způsob) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_bitplanes1.asm |
| 45 | ega_gfx_mode_bitplanes2.asm | ovládání zápisu do bitových rovin v planárních grafických režimech (rychlejší způsob) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_bitplanes2.asm |
| 46 | ega_320×200_putpixel.asm | vykreslení pixelu v grafickém režimu 320×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_320×200_putpixel.asm |
| 47 | ega_640×350_putpixel.asm | vykreslení pixelu v grafickém režimu 640×350 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_640×350_putpixel.asm |
| 48 | ega_standard_font.asm | použití standardního fontu grafické karty EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_standard_font.asm |
| 49 | ega_custom_font.asm | načtení vlastního fontu s jeho zobrazením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_custom_font.asm |
| 50 | ega_palette1.asm | změna barvové palety (všech 16 barev) v grafickém režimu 320×200 se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette1.asm |
| 51 | ega_palette2.asm | změna barvové palety (všech 16 barev) v grafickém režimu 640×350 se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette2.asm |
| 52 | ega_palette3.asm | změna všech barev v barvové paletě s využitím programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette3.asm |
| 53 | ega_palette4.asm | změna všech barev, včetně barvy okraje, v barvové paletě voláním funkce BIOSu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette4.asm |
| 54 | vga_text_mode_80×25.asm | standardní textový režim 80×25 znaků na kartě VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_80×25.asm |
| 55 | vga_text_mode_80×50.asm | zobrazení 50 a taktéž 28 textových řádků na kartě VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_80×50.asm |
| 56 | vga_text_mode_intensity1.asm | změna chování atributového bitu pro blikání (nebezpečná varianta změny registrů) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_intensity1.asm |
| 57 | vga_text_mode_intensity2.asm | změna chování atributového bitu pro blikání (bezpečnější varianta změny registrů) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_intensity2.asm |
| 58 | vga_text_mode_9th_column.asm | modifikace způsobu zobrazení devátého sloupce ve znakových režimech (720 pixelů na řádku) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_9th_column.asm |
| 59 | vga_text_mode_cursor_shape.asm | změna tvaru textového kurzoru na grafické kartě VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_cursor_shape.asm |
| 60 | vga_text_mode_custom_font.asm | načtení vlastního fontu s jeho zobrazením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_custom_font.asm |
| 61 | vga_gfx_mode_640×480.asm | přepnutí do grafického režimu 640×480 pixelů se šestnácti barvami, vykreslení vzorků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_640×480.asm |
| 62 | vga_gfx_mode_320×200.asm | přepnutí do grafického režimu 320×200 pixelů s 256 barvami, vykreslení vzorků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_320×200.asm |
| 63 | vga_gfx_mode_palette.asm | změna všech barev v barvové paletě grafické karty VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_palette.asm |
| 64 | vga_gfx_mode_dac1.asm | využití DAC (neočekávané výsledky) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac1.asm |
| 65 | vga_gfx_mode_dac2.asm | využití DAC (očekávané výsledky) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac2.asm |
| 66 | vga_640×480_putpixel.asm | realizace algoritmu pro vykreslení pixelu v grafickém režimu 640×480 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_640×480_putpixel.asm |
| 67 | vga_320×200_putpixel1.asm | realizace algoritmu pro vykreslení pixelu v grafickém režimu 320×200 s 256 barvami (základní varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel1.asm |
| 68 | vga_320×200_putpixel2.asm | realizace algoritmu pro vykreslení pixelu v grafickém režimu 320×200 s 256 barvami (rychlejší varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel2.asm |
| 69 | vga_gfx_mode_dac3.asm | přímé využití DAC v grafickém režimu 13h | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac3.asm |
| 70 | vga_gfx_mode_unchained_step1.asm | zobrazení barevných pruhů v režimu 13h | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step1.asm |
| 71 | vga_gfx_mode_unchained_step2.asm | vypnutí zřetězení bitových rovin a změna způsobu adresování pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step2.asm |
| 72 | vga_gfx_mode_unchained_step3.asm | vykreslení barevných pruhů do vybraných bitových rovin | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step3.asm |
| 73 | vga_gfx_mode_320×400.asm | nestandardní grafický režim s rozlišením 320×400 pixelů a 256 barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_320×400.asm |
| 74 | vga_320×200_image.asm | zobrazení rastrového obrázku ve standardním grafickém režimu 320×200 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image.asm |
| 75 | vga_320×200_unchained_image1.asm | zobrazení rastrového obrázku v režimu s nezřetězenými rovinami (nekorektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_unchained_image1.asm |
| 76 | vga_320×200_unchained_image2.asm | zobrazení rastrového obrázku v režimu s nezřetězenými rovinami (korektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_unchained_image2.asm |
| 77 | vga_320×400_unchained_image.asm | zobrazení rastrového obrázku v nestandardním režimu 320×400 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_unchained_image.asm |
| 78 | vga_vertical_scroll1.asm | vertikální scrolling na kartě VGA v režimu s rozlišením 320×200 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_vertical_scroll1.asm |
| 79 | vga_vertical_scroll2.asm | vertikální scrolling na kartě VGA v režimu s rozlišením 320×400 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_vertical_scroll2.asm |
| 80 | vga_split_screen1.asm | režim split-screen a scrolling, nefunční varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_split_screen1.asm |
| 81 | vga_split_screen2.asm | režim split-screen a scrolling, plně funkční varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_split_screen2.asm |
| 82 | vga_horizontal_scroll1.asm | horizontální scrolling bez rozšíření počtu pixelů na virtuálním řádku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll1.asm |
| 83 | vga_horizontal_scroll2.asm | horizontální scrolling s rozšířením počtu pixelů na virtuálním řádku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll2.asm |
| 84 | vga_horizontal_scroll3.asm | jemný horizontální scrolling s rozšířením počtu pixelů na virtuálním řádku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll3.asm |
| 85 | vga_320×240_image.asm | nastavení grafického režimu Mode-X, načtení a vykreslení obrázku, scrolling | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×240_image.asm |
| 86 | io.asm | knihovna maker pro I/O operace | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/io.asm |
| 87 | vga_lib.asm | knihovna maker a podprogramů pro programování karty VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_lib.asm |
| 88 | vga_320×240_lib.asm | nastavení grafického režimu Mode-X, tentokrát knihovními funkcemi | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×240_lib.asm |
| 89 | vga_bitblt1.asm | první (naivní) implementace operace BitBLT | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt1.asm |
| 90 | vga_bitblt2.asm | operace BitBLT s výběrem bitových rovin pro zápis | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt2.asm |
| 91 | vga_bitblt3.asm | operace BitBLT s výběrem bitových rovin pro čtení i zápis | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt3.asm |
| 92 | vga_bitblt4.asm | korektní BitBLT pro 16barevný režim, realizace makry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt4.asm |
| 93 | vga_bitblt5.asm | korektní BitBLT pro 16barevný režim, realizace podprogramem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt5.asm |
| 94 | vga_bitblt_rotate.asm | zápisový režim s rotací bajtu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt_rotate.asm |
| 95 | vga_bitblt_fast.asm | rychlá korektní 32bitová operace typu BitBLT | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt_fast.asm |
| 96 | vga_320×400_bitblt1.asm | přenos obrázku v režimu 320×400 operací BitBLT (neúplná varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_bitblt1.asm |
| 97 | vga_320×400_bitblt2.asm | přenos obrázku v režimu 320×400 operací BitBLT (úplná varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_bitblt2.asm |
| 98 | vga_write_modes1.asm | volitelné zápisové režimy grafické karty VGA, zápis bez úpravy latche | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes1.asm |
| 99 | vga_write_modes2.asm | volitelné zápisové režimy grafické karty VGA, zápis s modifikací latche | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes2.asm |
| 100 | vga_write_modes3.asm | volitelné zápisové režimy grafické karty VGA, cílená modifikace latche vzorkem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes3.asm |
| 101 | instruction_jump.asm | použití instrukce JMP | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jump.asm |
| 102 | instruction_jnz.asm | použití instrukce JNZ pro realizaci programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jnz.asm |
| 103 | instruction_jz_jmp.asm | použití instrukcí JZ a JMP pro realizaci programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jz_jmp.asm |
| 104 | instruction_loop.asm | použití instrukce LOOP pro realizaci programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_loop.asm |
| 105 | instruction_template.asm | šablona všech následujících demonstračních příkladů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_template.asm |
| 106 | instruction_print_hex.asm | tisk osmibitové hexadecimální hodnoty | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_print_hex.asm |
| 107 | instruction_xlat.asm | využití instrukce XLAT pro získání tisknutelné hexadecimální cifry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_xlat.asm |
| 108 | instruction_daa.asm | operace součtu s využitím binární i BCD aritmetiky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_daa.asm |
| 109 | instruction_daa_sub.asm | instrukce DAA po provedení operace rozdílu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_daa_sub.asm |
| 110 | instruction_das.asm | instrukce DAS po provedení operace rozdílu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_das.asm |
| 111 | instruction_aaa.asm | korekce výsledku na jedinou BCD cifru operací AAA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_aaa.asm |
| 112 | instruction_mul.asm | ukázka výpočtu součinu dvou osmibitových hodnot | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_mul.asm |
| 113 | instruction_aam.asm | BCD korekce po výpočtu součinu instrukcí AAM | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_aam.asm |
| 114 | instruction_stosb.asm | blokový zápis dat instrukcí STOSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_stosb.asm |
| 115 | instruction_rep_stosb.asm | opakované provádění instrukce STOSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_stosb.asm |
| 116 | instruction_lodsb.asm | čtení dat instrukcí LODSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_lodsb.asm |
| 117 | instruction_movsb.asm | přenos jednoho bajtu instrukcí MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_movsb.asm |
| 118 | instruction_rep_movsb.asm | blokový přenos po bajtech instrukcí MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_movsb.asm |
| 119 | instruction_rep_scas.asm | vyhledávání v řetězci instrukcí SCAS | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_scas.asm |
| 120 | vga_320×200_image_0B.asm | výsledek blokového přenosu ve chvíli, kdy je CX=0 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_0B.asm |
| 121 | vga_320×200_image_64kB.asm | výsledek blokového přenosu ve chvíli, kdy je CX=0×ffff | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_64kB.asm |
| 122 | vga_320×200_image_movsb.asm | blokový přenos v rámci obrazové paměti instrukcí REP MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb.asm |
| 123 | vga_320×200_image_movsw.asm | blokový přenos v rámci obrazové paměti instrukcí REP MOVSW | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsw.asm |
| 124 | vga_320×200_image_movsd.asm | blokový přenos v rámci obrazové paměti instrukcí REP MOVSD | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsd.asm |
| 125 | vga_320×200_image_movsb_forward.asm | blokový přenos překrývajících se bloků paměti (zvyšující se adresy) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_forward.asm |
| 126 | vga_320×200_image_movsb_backward1.asm | blokový přenos překrývajících se bloků paměti (snižující se adresy, nekorektní nastavení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_backward1.asm |
| 127 | vga_320×200_image_movsb_backward2.asm | blokový přenos překrývajících se bloků paměti (snižující se adresy, korektní nastavení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_backward2.asm |
| 128 | sound_bell.asm | přehrání zvuku pomocí tisku ASCII znaku BELL | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_bell.asm |
| 129 | sound_beep.asm | přehrání zvuku o zadané frekvenci na PC Speakeru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_beep.asm |
| 130 | sound_play_pitch.asm | přehrání zvuku o zadané frekvenci na PC Speakeru, použití maker | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_play_pitch.asm |
| 131 | sound_opl2_basic.asm | přehrání komorního A na OPL2 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_basic.asm |
| 132 | sound_opl2_table.asm | přehrání komorního A na OPL2, použití tabulky s hodnotami registrů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_table.asm |
| 133 | sound_opl2_table2.asm | přepis tabulky s obsahy registrů pro přehrání komorního A | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_table2.asm |
| 134 | sound_key_on.asm | přímé ovládání bitu KEY ON mezerníkem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_key_on.asm |
| 135 | sound_adsr.asm | nastavení obálky pro tón přehrávaný prvním kanálem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_adsr.asm |
| 136 | sound_modulation.asm | řízení frekvence modulátoru klávesami 1 a 0 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_modulation.asm |
| 137 | keyboard_basic.asm | přímá práce s klávesnicí IBM PC | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/keyboard_basic.asm |
| 138 | sound_stereo_opl2.asm | stereo zvuk v konfiguraci DualOPL2 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_stereo_opl2.asm |
| 139 | sound_opl2_multichannel.asm | vícekanálový zvuk na OPL2 (klávesy), delší varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_multichannel.asm |
| 140 | sound_opl2_multichannel2.asm | vícekanálový zvuk na OPL2 (klávesy), kratší varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_multichannel2.asm |
| 141 | sound_opl3_stereo1.asm | stereo výstup na OPL3 (v kompatibilním režimu) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_stereo1.asm |
| 142 | sound_opl3_stereo2.asm | stereo výstup na OPL3 (v režimu OPL3) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_stereo2.asm |
| 143 | sound_opl3_multichannel.asm | vícekanálový zvuk na OPL3 (klávesy) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_multichannel.asm |
| 144 | sound_opl3_waveform1.asm | interaktivní modifikace tvaru vlny u prvního operátoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform1.asm |
| 145 | sound_opl3_waveform2.asm | oprava chyby: povolení režimu kompatibilního s OPL3 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform2.asm |
| 146 | sound_opl3_waveform3.asm | vliv tvaru vln na zvukový kanál s FM syntézou | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform3.asm |
| 147 | sound_opl3_waveform4.asm | modifikace tvaru vlny nosné vlny i modulátoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform4.asm |
| 148 | sound_opl3_4operators1.asm | výběr AM/FM režimu ve čtyřoperátorovém nastavení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_4operators1.asm |
| 149 | sound_opl3_4operators2.asm | výběr AM/FM režimu ve čtyřoperátorovém nastavení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_4operators2.asm |
| 150 | timer_basic.asm | základní obsluha přerušení od časovače/čítače | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_basic.asm |
| 151 | timer_restore.asm | obnovení původní obsluhy přerušení při ukončování aplikace | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_restore.asm |
| 152 | timer_restore_better_structure.asm | refaktoring předchozího demonstračního příkladu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_restore_better_structure.asm |
| 153 | timer_faster_clock.asm | zrychlení čítače na 100 přerušení za sekundu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_faster_clock.asm |
| 154 | instruction_push_imm.asm | instrukce PUSH s konstantou | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_push_imm.asm |
| 155 | instruction_imul_imm.asm | instrukce IMUL s konstantou | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_imul_imm.asm |
| 156 | instruction_into1.asm | instrukce INTO s obsluhou přerušení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_into1.asm |
| 157 | instruction_into2.asm | instrukce INTO s obsluhou přerušení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_into2.asm |
| 158 | instruction_bound1.asm | instrukce BOUND s obsluhou přerušení (nekorektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bound1.asm |
| 159 | instruction_bound2.asm | instrukce BOUND s obsluhou přerušení (korektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bound2.asm |
| 160 | vga_320×200_putpixel286.asm | instrukce bitového posunu s konstantou větší než 1 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel286.asm |
| 161 | instruction_push_pop.asm | instrukce PUSH a POP se všemi pracovními registry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_push_pop.asm |
| 162 | instruction_push_pop_B.asm | instrukce s novými segmentovými registry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_push_pop_B.asm |
| 163 | instruction_near_jz_jmp.asm | blízké skoky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_near_jz_jmp.asm |
| 164 | instruction_bsf.asm | nová instrukce BSF | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bsf.asm |
| 165 | instruction_bsr.asm | nová instrukce BSR | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bsr.asm |
| 166 | instruction_add_32bit.asm | 32bitový součet | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_add_32bit.asm |
| 167 | instruction_inc_32bit.asm | 32bitová instrukce INC v šestnáctibitovém režimu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_inc_32bit.asm |
| 168 | instruction_inc_32bit_B.asm | 32bitová instrukce INC v 32bitovém režimu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_inc_32bit_B.asm |
| 169 | ems_status.asm | zjištění stavu (emulace) paměti EMS | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ems_status.asm |
| 170 | ems_total_mem.asm | získání celkové kapacity paměti EMS v blocích | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ems_total_mem.asm |
| 171 | ems_free_mem.asm | získání volné kapacity paměti EMS v blocích | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ems_free_mem.asm |
| 172 | xms_free_mem.asm | získání volné kapacity paměti XMS v blocích | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/xms_free_mem.asm |
| 173 | vga_320×200_short_address1.asm | blokový přenos provedený v rámci prostoru segmentu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address1.asm |
| 174 | vga_320×200_short_address2.asm | rozepsaný blokový přenos provedený v rámci prostoru segmentu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address2.asm |
| 175 | vga_320×200_short_address3.asm | přenos nelze provést přes hranici offsetu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address3.asm |
| 176 | vga_320×200_short_address4.asm | přenos nelze provést přes hranici offsetu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address4.asm |
| 177 | vga_320×200_long_address1.asm | 32bitový blokový přenos | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address1.asm |
| 178 | vga_320×200_long_address2.asm | rozepsaný 32bitový blokový přenos provedený v rámci prostoru segmentu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address2.asm |
| 179 | vga_320×200_long_address3.asm | přístup do obrazové paměti přes segment 0×0000 a 32bitový offset | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address3.asm |
| 180 | vga_320×200_long_address4.asm | otestování, jak lze přenášet data s využitím 32bitového offsetu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address4.asm |
| 181 | print_msw.asm | přečtení a zobrazení obsahu speciálního registru MSW | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/print_msw.asm |
| 182 | print_cr0.asm | přečtení a zobrazení obsahu speciálního registru CR0 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/print_cr0.asm |
| 183 | prot_mode286.asm | přechod do chráněného režimu na čipech Intel 80286 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode286.asm |
| 184 | prot_mode386.asm | přechod do chráněného režimu na čipech Intel 80386 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode386.asm |
| 185 | prot_mode_back_to_real_mode286.asm | přechod mezi reálným režimem a chráněným režimem i zpět na čipech Intel 80286 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode_back_to_real_mode286.asm |
| 186 | prot_mode_back_to_real_mode386.asm | přechod mezi reálným režimem a chráněným režimem i zpět na čipech Intel 80386 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode_back_to_real_mode386.asm |
| 187 | prot_mode_check.asm | test, zda se mikroprocesor již nachází v chráněném režimu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode_check.asm |
| 188 | unreal_mode.asm | nastavení nereálného režimu (platné pro Intel 80386) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/unreal_mode.asm |
| 189 | float32_constants.asm | vytištění základních FP konstant typu single | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/float32_constants.asm |
| 190 | float64_constants.asm | vytištění základních FP konstant typu double | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/float64_constants.asm |
| 191 | fpu_arithmetic.asm | základní aritmetické operace prováděné matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_arithmetic.asm |
| 192 | fpu_divide_by_zero.asm | dělení nulou matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_by_zero.asm |
| 193 | fpu_divide_by_neg_zero.asm | dělení záporné hodnoty nulou matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_by_neg_zero.asm |
| 194 | fpu_divide_by_neg_zero2.asm | dělení hodnoty zápornou nulou matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_by_neg_zero2.asm |
| 195 | fpu_divide_zero_by_zero.asm | výpočet 0/0 matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_zero_by_zero.asm |
| 196 | io.asm | pomocná makra pro komunikaci s DOSem a BIOSem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/io.asm |
| 197 | print.asm | pomocná makra pro tisk FPU hodnot typu single a double v hexadecimálním tvaru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/print.asm |
| 198 | fpu_divide.asm | operace podílu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide.asm |
| 199 | fpu_divide_r.asm | operace podílu s prohozenými operandy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_r.asm |
| 200 | fpu_sqrt.asm | výpočet druhé odmocniny | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_sqrt.asm |
| 201 | fpu_sqrt_neg_value.asm | výpočet druhé odmocniny ze záporné hodnoty | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_sqrt_neg_value.asm |
| 202 | fpu_check.asm | detekce typu matematického koprocesoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_check.asm |
| 203 | fpu_compare.asm | porovnání dvou hodnot s vyhodnocením výsledku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_compare.asm |
| 204 | fpu_status_word.asm | tisk obsahu stavového slova koprocesoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_status_word.asm |
| 205 | fpu_status_word_stack.asm | tisk obsahu stavového slova koprocesoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_status_word_stack.asm |
| 206 | svga_info1.asm | zjištění, zda je VBE dostupný | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/svga_info1.asm |
| 207 | svga_info2.asm | zobrazení základních informací o grafické kartě | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/svga_info2.asm |
| 208 | svga_info3.asm | výpis OEM řetězce s další informací o kartě | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/svga_info3.asm |
| 209 | svga_info4.asm | zjištění a výpis čísel všech podporovaných grafických režimů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/svga_info4.asm |
| 210 | svga_info5.asm | získání rozlišení, bitové hloubky a struktury obrazových řádků zvoleného grafického režimu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/svga_info5.asm |
| 211 | svga_info6.asm | základní informace o čtecích a zápisových oknech pro reálný režim | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/svga_info6.asm |
20. Odkazy na Internetu
- VESA BIOS Extensions
https://en.wikipedia.org/wiki/VESA_BIOS_Extensions - Video Electronics Standards Association
https://en.wikipedia.org/wiki/Video_Electronics_Standards_Association - DJGPP (Wikipedia)
https://cs.wikipedia.org/wiki/DJGPP - DJGPP home page
http://www.delorie.com/djgpp/ - DJGPP Zip File Picker
http://www.delorie.com/djgpp/zip-picker.html - The Intel 8088 Architecture and Instruction Set
https://people.ece.ubc.ca/~edc/464/lectures/lec4.pdf - x86 Opcode Structure and Instruction Overview
https://pnx.tf/files/x86_opcode_structure_and_instruction_overview.pdf - x86 instruction listings (Wikipedia)
https://en.wikipedia.org/wiki/X86_instruction_listings - x86 assembly language (Wikipedia)
https://en.wikipedia.org/wiki/X86_assembly_language - Intel Assembler (Cheat sheet)
http://www.jegerlehner.ch/intel/IntelCodeTable.pdf - 25 Microchips That Shook the World
https://spectrum.ieee.org/tech-history/silicon-revolution/25-microchips-that-shook-the-world - Chip Hall of Fame: MOS Technology 6502 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-mos-technology-6502-microprocessor - Chip Hall of Fame: Intel 8088 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-intel-8088-microprocessor - Jak se zrodil procesor?
https://www.root.cz/clanky/jak-se-zrodil-procesor/ - Apple II History Home
http://apple2history.org/ - The 8086/8088 Primer
https://www.stevemorse.org/8086/index.html - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - Bit banging
https://en.wikipedia.org/wiki/Bit_banging - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Bootloaders
https://en.wikibooks.org/wiki/X86_Assembly/Bootloaders - Počátky grafiky na PC: grafické karty CGA a Hercules
https://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/ - Co mají společného Commodore PET/4000, BBC Micro, Amstrad CPC i grafické karty MDA, CGA a Hercules?
https://www.root.cz/clanky/co-maji-spolecneho-commodore-pet-4000-bbc-micro-amstrad-cpc-i-graficke-karty-mda-cga-a-hercules/ - Karta EGA: první použitelná barevná grafika na PC
https://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/ - RGB Classic Games
https://www.classicdosgames.com/ - Turbo Assembler (Wikipedia)
https://en.wikipedia.org/wiki/Turbo_Assembler - Microsoft Macro Assembler
https://en.wikipedia.org/wiki/Microsoft_Macro_Assembler - IBM Personal Computer (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Personal_Computer - Intel 8251
https://en.wikipedia.org/wiki/Intel_8251 - Intel 8253
https://en.wikipedia.org/wiki/Intel_8253 - Intel 8255
https://en.wikipedia.org/wiki/Intel_8255 - Intel 8257
https://en.wikipedia.org/wiki/Intel_8257 - Intel 8259
https://en.wikipedia.org/wiki/Intel_8259 - Support/peripheral/other chips – 6800 family
http://www.cpu-world.com/Support/6800.html - Motorola 6845
http://en.wikipedia.org/wiki/Motorola_6845 - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - CRTC operation
http://www.6502.org/users/andre/hwinfo/crtc/crtc.html - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - Motorola 6845 and bitwise graphics
https://retrocomputing.stackexchange.com/questions/10996/motorola-6845-and-bitwise-graphics - IBM Monochrome Display Adapter
http://en.wikipedia.org/wiki/Monochrome_Display_Adapter - Color Graphics Adapter
http://en.wikipedia.org/wiki/Color_Graphics_Adapter - Color Graphics Adapter and the Brown color in IBM 5153 Color Display
https://www.aceinnova.com/en/electronics/cga-and-the-brown-color-in-ibm-5153-color-display/ - The Modern Retrocomputer: An Arduino Driven 6845 CRT Controller
https://hackaday.com/2017/05/14/the-modern-retrocomputer-an-arduino-driven-6845-crt-controller/ - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Arithmetic
https://en.wikibooks.org/wiki/X86_Assembly/Arithmetic - Art of Assembly – Arithmetic Instructions
http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter6/CH06–2.html - ASM Flags
http://www.cavestory.org/guides/csasm/guide/asm_flags.html - Status Register
https://en.wikipedia.org/wiki/Status_register - Linux assemblers: A comparison of GAS and NASM
http://www.ibm.com/developerworks/library/l-gas-nasm/index.html - Programovani v assembleru na OS Linux
http://www.cs.vsb.cz/grygarek/asm/asmlinux.html - Is it worthwhile to learn x86 assembly language today?
https://www.quora.com/Is-it-worthwhile-to-learn-x86-assembly-language-today?share=1 - Why Learn Assembly Language?
http://www.codeproject.com/Articles/89460/Why-Learn-Assembly-Language - Is Assembly still relevant?
http://programmers.stackexchange.com/questions/95836/is-assembly-still-relevant - Why Learning Assembly Language Is Still a Good Idea
http://www.onlamp.com/pub/a/onlamp/2004/05/06/writegreatcode.html - Assembly language today
http://beust.com/weblog/2004/06/23/assembly-language-today/ - Assembler: Význam assembleru dnes
http://www.builder.cz/rubriky/assembler/vyznam-assembleru-dnes-155960cz - Programming from the Ground Up Book – Summary
http://savannah.nongnu.org/projects/pgubook/ - DOSBox
https://www.dosbox.com/ - The C Programming Language
https://en.wikipedia.org/wiki/The_C_Programming_Language - Hercules Graphics Card (HCG)
https://en.wikipedia.org/wiki/Hercules_Graphics_Card - Complete 8086 instruction set
https://content.ctcd.edu/courses/cosc2325/m22/docs/emu8086ins.pdf - Complete 8086 instruction set
https://yassinebridi.github.io/asm-docs/8086_instruction_set.html - 8088 MPH by Hornet + CRTC + DESiRE (final version)
https://www.youtube.com/watch?v=hNRO7lno_DM - Area 5150 by CRTC & Hornet (Party Version) / IBM PC+CGA Demo, Hardware Capture
https://www.youtube.com/watch?v=fWDxdoRTZPc - 80×86 Integer Instruction Set Timings (8088 – Pentium)
http://aturing.umcs.maine.edu/~meadow/courses/cos335/80×86-Integer-Instruction-Set-Clocks.pdf - Colour Graphics Adapter: Notes
https://www.seasip.info/VintagePC/cga.html - Restoring A Vintage CGA Card With Homebrew HASL
https://hackaday.com/2024/06/12/restoring-a-vintage-cga-card-with-homebrew-hasl/ - Demoing An 8088
https://hackaday.com/2015/04/10/demoing-an-8088/ - Video Memory Layouts
http://www.techhelpmanual.com/89-video_memory_layouts.html - Screen Attributes
http://www.techhelpmanual.com/87-screen_attributes.html - IBM PC Family – BIOS Video Modes
https://www.minuszerodegrees.net/video/bios_video_modes.htm - EGA Functions
https://cosmodoc.org/topics/ega-functions/#the-hierarchy-of-the-ega - Why the EGA can only use 16 of its 64 colours in 200-line modes
https://www.reenigne.org/blog/why-the-ega-can-only-use-16-of-its-64-colours-in-200-line-modes/ - How 16 colors saved PC gaming – the story of EGA graphics
https://www.custompc.com/retro-tech/ega-graphics - List of 16-bit computer color palettes
https://en.wikipedia.org/wiki/List_of16-bit_computer_color_palettes - Why were those colors chosen to be the default palette for 256-color VGA?
https://retrocomputing.stackexchange.com/questions/27994/why-were-those-colors-chosen-to-be-the-default-palette-for-256-color-vga - VGA Color Palettes
https://www.fountainware.com/EXPL/vga_color_palettes.htm - Hardware Level VGA and SVGA Video Programming Information Page
http://www.osdever.net/FreeVGA/vga/vga.htm - Hardware Level VGA and SVGA Video Programming Information Page – sequencer
http://www.osdever.net/FreeVGA/vga/seqreg.htm - VGA Basics
http://www.brackeen.com/vga/basics.html - Introduction to VGA Mode ‚X‘
https://web.archive.org/web/20160414072210/http://fly.srk.fer.hr/GDM/articles/vgamodex/vgamx1.html - VGA Mode-X
https://web.archive.org/web/20070123192523/http://www.gamedev.net/reference/articles/article356.asp - Mode-X: 256-Color VGA Magic
https://downloads.gamedev.net/pdf/gpbb/gpbb47.pdf - Instruction Format in 8086 Microprocessor
https://www.includehelp.com/embedded-system/instruction-format-in-8086-microprocessor.aspx - How to use „AND,“ „OR,“ and „XOR“ modes for VGA Drawing
https://retrocomputing.stackexchange.com/questions/21936/how-to-use-and-or-and-xor-modes-for-vga-drawing - VGA Hardware
https://wiki.osdev.org/VGA_Hardware - Programmer's Guide to Yamaha YMF 262/OPL3 FM Music Synthesizer
https://moddingwiki.shikadi.net/wiki/OPL_chip - Does anybody understand how OPL2 percussion mode works?
https://forum.vcfed.org/index.php?threads/does-anybody-understand-how-opl2-percussion-mode-works.60925/ - Yamaha YMF262 OPL3 music – MoonDriver for OPL3 DEMO [Oscilloscope View]
https://www.youtube.com/watch?v=a7I-QmrkAak - Yamaha OPL vs OPL2 vs OPL3 comparison
https://www.youtube.com/watch?v=5knetge5Gs0 - OPL3 Music Crockett's Theme
https://www.youtube.com/watch?v=HXS008pkgSQ - Bad Apple (Adlib Tracker – OPL3)
https://www.youtube.com/watch?v=2lEPH6Y3Luo - FM Synthesis Chips, Codecs and DACs
https://www.dosdays.co.uk/topics/fm_synthesizers.php - The Zen Challenge – YMF262 OPL3 Original (For an upcoming game)
https://www.youtube.com/watch?v=6JlFIFz1CFY - [adlib tracker II techno music – opl3] orbit around alpha andromedae I
https://www.youtube.com/watch?v=YqxJCu_WFuA - [adlib tracker 2 music – opl3 techno] hybridisation process on procyon-ii
https://www.youtube.com/watch?v=daSV5mN0sJ4 - Hyper Duel – Black Rain (YMF262 OPL3 Cover)
https://www.youtube.com/watch?v=pu_mzRRq8Ho - IBM 5155–5160 Technical Reference
https://www.minuszerodegrees.net/manuals/IBM/IBM_5155_5160_Technical_Reference_6280089_MAR86.pdf - a ymf262/opl3+pc speaker thing i made
https://www.youtube.com/watch?v=E-Mx0lEmnZ0 - [OPL3] Like a Thunder
https://www.youtube.com/watch?v=MHf06AGr8SU - (PC SPEAKER) bad apple
https://www.youtube.com/watch?v=LezmKIIHyUg - Powering devices from PC parallel port
http://www.epanorama.net/circuits/lptpower.html - Magic Mushroom (demo pro PC s DOSem)
http://www.crossfire-designs.de/download/articles/soundcards//mushroom.rar - Píseň Magic Mushroom – originál
http://www.crossfire-designs.de/download/articles/soundcards/speaker_mushroom_converted.mp3 - Píseň Magic Mushroom – hráno na PC Speakeru
http://www.crossfire-designs.de/download/articles/soundcards/speaker_mushroom_speaker.mp3 - Pulse Width Modulation (PWM) Simulation Example
http://decibel.ni.com/content/docs/DOC-4599 - Resistor/Pulse Width Modulation DAC
http://www.k9spud.com/traxmod/pwmdac.php - Class D Amplifier
http://en.wikipedia.org/wiki/Electronic_amplifier#Class_D - Covox Speech Thing / Disney Sound Source (1986)
http://www.crossfire-designs.de/index.php?lang=en&what=articles&name=showarticle.htm&article=soundcards/&page=5 - Covox Digital-Analog Converter (Rusky, obsahuje schémata)
http://phantom.sannata.ru/konkurs/netskater002.shtml - PC-GPE on the Web
http://bespin.org/~qz/pc-gpe/ - Keyboard Synthesizer
http://www.solarnavigator.net/music/instruments/keyboards.htm - FMS – Fully Modular Synthesizer
http://fmsynth.sourceforge.net/ - Javasynth
http://javasynth.sourceforge.net/ - Software Sound Synthesis & Music Composition Packages
http://www.linux-sound.org/swss.html - Mx44.1 Download Page (software synthesizer for linux)
http://hem.passagen.se/ja_linux/ - Software synthesizer
http://en.wikipedia.org/wiki/Software_synthesizer - Frequency modulation synthesis
http://en.wikipedia.org/wiki/Frequency_modulation_synthesis - Yamaha DX7
http://en.wikipedia.org/wiki/Yamaha_DX7 - Wave of the Future
http://www.wired.com/wired/archive/2.03/waveguides_pr.html - Analog synthesizer
http://en.wikipedia.org/wiki/Analog_synthesizer - Minimoog
http://en.wikipedia.org/wiki/Minimoog - Moog synthesizer
http://en.wikipedia.org/wiki/Moog_synthesizer - Tutorial for Frequency Modulation Synthesis
http://www.sfu.ca/~truax/fmtut.html - An Introduction To FM
http://ccrma.stanford.edu/software/snd/snd/fm.html - John Chowning
http://en.wikipedia.org/wiki/John_Chowning - I'm Impressed, Adlib Music is AMAZING!
https://www.youtube.com/watch?v=PJNjQYp1ras - Milinda- Diode Milliampere ( OPL3 )
https://www.youtube.com/watch?v=oNhazT5HG0E - Dune 2 – Roland MT-32 Soundtrack
https://www.youtube.com/watch?v=kQADZeB-z8M - Interrupts
https://wiki.osdev.org/Interrupts#Types_of_Interrupts - Assembly8086SoundBlasterDmaSingleCycleMode
https://github.com/leonardo-ono/Assembly8086SoundBlasterDmaSingleCycleMode/blob/master/sbsc.asm - Interrupts in 8086 microprocessor
https://www.geeksforgeeks.org/interrupts-in-8086-microprocessor/ - Interrupt Structure of 8086
https://www.eeeguide.com/interrupt-structure-of-8086/ - A20 line
https://en.wikipedia.org/wiki/A20_line - Extended memory
https://en.wikipedia.org/wiki/Extended_memory#eXtended_Memory_Specification_(XMS) - Expanded memory
https://en.wikipedia.org/wiki/Expanded_memory - Protected mode
https://en.wikipedia.org/wiki/Protected_mode - Virtual 8086 mode
https://en.wikipedia.org/wiki/Virtual_8086_mode - Unreal mode
https://en.wikipedia.org/wiki/Unreal_mode - DOS memory management
https://en.wikipedia.org/wiki/DOS_memory_management - Upper memory area
https://en.wikipedia.org/wiki/Upper_memory_area - Removing the Mystery from SEGMENT : OFFSET Addressing
https://thestarman.pcministry.com/asm/debug/Segments.html - Segment descriptor
https://en.wikipedia.org/wiki/Segment_descriptor - When using a 32-bit register to address memory in the real mode, contents of the register must never exceed 0000FFFFH. Why?
https://stackoverflow.com/questions/45094696/when-using-a-32-bit-register-to-address-memory-in-the-real-mode-contents-of-the - A Brief History of Unreal Mode
https://www.os2museum.com/wp/a-brief-history-of-unreal-mode/ - Segment Limits
https://wiki.osdev.org/Segment_Limits - How do 32 bit addresses in real mode work?
https://forum.osdev.org/viewtopic.php?t=30642 - The LOADALL Instruction by Robert Collins
https://www.rcollins.org/articles/loadall/tspec_a3_doc.html - How do you put a 286 in Protected Mode?
https://retrocomputing.stackexchange.com/questions/7683/how-do-you-put-a-286-in-protected-mode - Control register
https://en.wikipedia.org/wiki/Control_register - CPU Registers x86
https://wiki.osdev.org/CPU_Registers_x86 - x86 Assembly/Protected Mode
https://en.wikibooks.org/wiki/X86_Assembly/Protected_Mode - MSW: Machine Status Word
https://web.itu.edu.tr/kesgin/mul06/intel/intel_msw.html - 80×87 Floating Point Opcodes
http://www.techhelpmanual.com/876–80×87_floating_point_opcodes.html - Page Translation
https://pdos.csail.mit.edu/6.828/2005/readings/i386/s05_02.htm - 80386 Paging and Segmenation
https://stackoverflow.com/questions/38229741/80386-paging-and-segmenation - 80386 Memory Management
https://tldp.org/LDP/khg/HyperNews/get/memory/80386mm.html - DOSEMU
http://www.dosemu.org/ - Intel 80386, a revolutionary CPU
https://www.xtof.info/intel80386.html - PAI Unit 3 Paging in 80386 Microporcessor
https://www.slideshare.net/KanchanPatil34/pai-unit-3-paging-in-80386-microporcessor - 64 Terabytes of virtual memory for 32-bit x86 using segmentation: how?
https://stackoverflow.com/questions/5444984/64-terabytes-of-virtual-memory-for-32-bit-x86-using-segmentation-how - Pi in the Pentium: reverse-engineering the constants in its floating-point unit
http://www.righto.com/2025/01/pentium-floating-point-ROM.html - Simply FPU
http://www.website.masmforum.com/tutorials/fptute/ - Art of Assembly language programming: The 80×87 Floating Point Coprocessors
https://courses.engr.illinois.edu/ece390/books/artofasm/CH14/CH14–3.html - Art of Assembly language programming: The FPU Instruction Set
https://courses.engr.illinois.edu/ece390/books/artofasm/CH14/CH14–4.html - INTEL 80387 PROGRAMMER'S REFERENCE MANUAL
http://www.ragestorm.net/downloads/387intel.txt - x86 Instruction Set Reference: FLD
http://x86.renejeschke.de/html/file_module_x86_id100.html - x86 Instruction Set Reference: FLD1/FLDL2T/FLDL2E/FLDPI/FLDLG2/FLDLN2/FLDZ
http://x86.renejeschke.de/html/file_module_x86_id101.html - X86 Assembly/Arithmetic
https://en.wikibooks.org/wiki/X86_Assembly/Arithmetic - 8087 Numeric Data Processor
https://www.eeeguide.com/8087-numeric-data-processor/ - Data Types and Instruction Set of 8087 co-processor
https://www.eeeguide.com/data-types-and-instruction-set-of-8087-co-processor/ - 8087 instruction set and examples
https://studylib.net/doc/5625221/8087-instruction-set-and-examples - GCC documentation: Extensions to the C Language Family
https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html#C-Extensions - GCC documentation: Using Vector Instructions through Built-in Functions
https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html - SSE (Streaming SIMD Extentions)
http://www.songho.ca/misc/sse/sse.html - Timothy A. Chagnon: SSE and SSE2
http://www.cs.drexel.edu/~tc365/mpi-wht/sse.pdf - Intel corporation: Extending the Worldr's Most Popular Processor Architecture
http://download.intel.com/technology/architecture/new-instructions-paper.pdf - SIMD architectures:
http://arstechnica.com/old/content/2000/03/simd.ars/ - Tour of the Black Holes of Computing!: Floating Point
http://www.cs.hmc.edu/~geoff/classes/hmc.cs105…/slides/class02_floats.ppt - 3Dnow! Technology Manual
AMD Inc., 2000 - Intel MMXTM Technology Overview
Intel corporation, 1996 - MultiMedia eXtensions
http://softpixel.com/~cwright/programming/simd/mmx.phpi - AMD K5 („K5“ / „5k86“)
http://www.pcguide.com/ref/cpu/fam/g5K5-c.html - Sixth Generation Processors
http://www.pcguide.com/ref/cpu/fam/g6.htm - Great Microprocessors of the Past and Present
http://www.cpushack.com/CPU/cpu1.html - Very long instruction word (Wikipedia)
http://en.wikipedia.org/wiki/Very_long_instruction_word - CPU design (Wikipedia)
http://en.wikipedia.org/wiki/CPU_design - Grafické karty a grafické akcelerátory (14)
https://www.root.cz/clanky/graficke-karty-a-graficke-akceleratory-14/ - Grafické karty a grafické akcelerátory (15)
https://www.root.cz/clanky/graficke-karty-a-graficke-akceleratory-15/ - Grafické karty a grafické akcelerátory (16)
https://www.root.cz/clanky/graficke-karty-a-graficke-akceleratory-16/ - VESA Video Modes
https://wiki.osdev.org/VESA_Video_Modes - Introduction to VESA programming
http://www.monstersoft.com/tutorial1/VESA_intro.html - Guide: VBE 2.0 graphics modes
https://delorie.com/djgpp/doc/ug/graphics/vbe20.html - NASM instruction list
https://userpages.cs.umbc.edu/chang/cs313/nasmdoc/html/nasmdocb.html