Obsah
1. Od grafické karty VGA k vyšším rozlišením i většímu množství barev (2. část)
2. Rozdělení obrazové paměti na bitové roviny
3. Typická organizace grafické paměti u grafických karet SVGA podporovaných VBE
4. Přístup do grafické paměti přesahující velikost jednoho segmentu
5. První demonstrační příklad: zjištění informací o okně pro zápis do obrazové paměti
6. Druhý demonstrační příklad: nastavení grafického režimu
7. Zápis barev pixelů do video paměti v reálném režimu
8. Třetí demonstrační příklad: vyplnění jednoho okna video paměti přes segment A000
9. Změna pozice okna pro zápis do jiné oblasti video paměti
10. Čtvrtý demonstrační příklad: vyplnění obsahu lichých oken přes segment A000
11. Uložení pixelů v grafických režimech se šestnácti miliony barev
12. Uložení pixelů v grafických režimech s bitovou hloubkou 15 a 16
13. Informace o uložení pixelů
14. Pátý demonstrační příklad: formát uložení pixelů v režimech s bitovou hloubkou 15 a 16 bitů
15. Šestý demonstrační příklad: formát uložení pixelů v režimu s 24 nebo 32bitovou hloubkou
16. Ověření, že formát uložení pixelů odpovídá zjištěným informacím
17. Univerzální rutina pro vykreslení pixelu?
18. 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 (2. část)
Na předchozí článek, ve kterém jsme si řekli základní informace o standardu VESA i o rozšíření původního BIOSu o VBE (VESA BIOS Extension) dnes navážeme. Ukážeme si, jakým způsobem je možné přepnutí do zvoleného grafického režimu a jak se do obrazové paměti zapisují jednotlivé pixely. Na platformě IBM PC nebyl způsob zápisu jednotlivých pixelů nikdy jednoduchý (CGA měla prokládaný režim, EGA zavedla bitové roviny, VGA navíc zřetězení rovin v 256barevných režimech). Tyto problémy přetrvaly i do doby SVGA karet a standardu VESA, protože bylo nutné zpřístupnit celou obrazovou paměť i v reálném režimu a navíc nebylo přesně stanoveno, jakým způsobem jsou uloženy barvové složky v režimech s 15bitovou, 16bitovou nebo 24/32 bitovou hloubkou.
Připomeňme si, že ve standardu VESA se do jisté míry standardizovala čísla některých grafických režimů. Ta jsou vypsána v následující tabulce. Ovšem je nutné poznamenat, že například režimy s rozlišením 320×200 pixelů nejsou vždy podporovány. V demonstračních příkladech budeme používat režim 0×103 s rozlišením 800×600 pixelů a s 256 barvami. A posléze otestujeme i režimy s větší bitovou hloubkou:
Čí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 |
2. Rozdělení obrazové paměti na bitové roviny
Ve standardu VESA (a tím pádem i VBE) bylo definováno poměrně velké množství možností, jakým způsobem může být organizována grafická paměť (resp. přesněji řečeno video paměť neboli VideoRAM či VRAM). Některé grafické karty mohou podporovat původní organizaci paměti zavedenou již u grafických karet EGA a VGA, tj. rozdělení bitů tvořících jednotlivé pixely do bitových rovin. Ovšem v praxi se s touto organizací paměti setkáme většinou pouze u grafického režimu s rozlišením 800×600 pixelů a se šestnácti barvami. Tento režim je poměrně specifický, protože při jeho využití je v každé bitové rovině uloženo přesně 800×600/8=60000 bajtů, což je kapacita, která se (dokonce s malou rezervou) vejde do jednoho segmentu (ten obsáhne 65536 bajtů). Je tedy možné používat „staré dobré“ rozdělení na čtyři bitové roviny a vlastně tak být prakticky 100% kompatibilní s oběma staršími standardy.
Problém ovšem spočívá v tom, že u vyšších rozlišení již není možné bitovou rovinu uložit do jednoho segmentu, takže toto dělení postrádá smysl. A naopak pro větší bitovou hloubku (větší počet barev) by již bylo nutné použít větší počet bitových rovin, což je problematické s ohledem na zpětnou kompatibilitu. A opět – stejně není možné tímto způsobem překročit rozlišení 800×600 pixelů, protože i kdybychom měli k dispozici například osm či patnáct bitových rovin, jejich velikost by přesáhla velikost jednoho segmentu.
3. Typická organizace grafické paměti u grafických karet SVGA podporovaných VBE
V praxi se proto u karet SVGA mnohem častěji setkáme spíše s odlišným přístupem, který je založen na tom, že barvy pixelů jsou uloženy pěti různými způsoby:
- Barvy dvou pixelů v jednom bajtu (platí pro 16barevné režimy)
- Barva jednoho pixelu v jednom bajtu (platí pro 256barevné režimy)
- Barva jednoho pixelu ve dvou po sobě jdoucích bajtech (režimy s 15bitovou a 16bitovou hloubkou)
- Barva jednoho pixelu ve třech po sobě jdoucích bajtech (režimy s 16 miliony barev)
- Barva jednoho pixelu ve čtyřech po sobě jdoucích bajtech (taktéž režimy s 16 miliony barev)
Ovšem tím reálné problémy teprve začínají. Grafické karty, resp. přesněji řečeno grafické režimy, se od sebe totiž odlišují i dalšími vlastnostmi:
- Obrazové řádky na sebe nemusí přímo navazovat. Mezi řádky se totiž mohou nacházet „neviditelné“ bajty používané pro různé účely popř. pouze kvůli zarovnání.
- Není pevně stanoveno, jakým způsobem jsou uloženy barvové složky RGB v grafických režimech s 15bitovou, 16bitovou, 24bitovou nebo 32bitovou hloubkou. Způsob uložení se může lišit nejenom pro různé výrobce, ale i pro jednoho výrobce s různými čipy.
- Pochopitelně není zaručeno, že grafický režim bude podporován monitorem. Zjištění parametrů monitoru přes DDC bylo v době vydání první verze standardu VESA spíše v plenkách a nedalo se na něj plně spolehnout (o této technologii se ještě později zmíníme).
- Může se lišit i obnovovací (obrazová) frekvence. Může se přitom stát, že například režimy s rozlišením 640×480 pixelů budou podporovat různé obrazové frekvence pro různé bitové hloubky, protože se zde již projevuje pomalost přístupu do video paměti při obnovování obrazu.
Všemi těmito problémy se postupně budeme zabývat v navazujícím textu.
4. Přístup do grafické paměti přesahující velikost jednoho segmentu
I ve chvíli, kdy je vybrán korektní grafický režim kompatibilní s monitorem a nějakým způsobem (popsaným dále) zjistíme i formát uložení pixelů, stále není vyhráno. Nyní totiž záleží na tom, zda námi vyvíjená aplikace bude pracovat v reálném režimu (real mode) nebo v režimu chráněném (protected mode). V případě, že aplikace poběží v chráněném režimu, je možné v nových verzích VBE získat přístup k celé obrazové paměti, což je problematika, ke které se ještě vrátíme.
Ovšem komplikovanější je situace v případě, že vyvíjená aplikace má běžet v režimu reálném. Připomeňme si, že v tomto případě je přímo dostupný pouze paměťový prostor nepatrně přesahující kapacitu 1MB. V rámci tohoto paměťového prostoru jsou pro obrazovou paměť vyhrazeny dva segmenty, které začínají na adresách A000:0000 a B000:0000. Typicky se však v grafickým režimech využívá pouze první segment, což konkrétně znamená adresy v rozsahu A000:0000 až A000:FFFF (tedy přesně 64kB). Druhý segment se využívá v textových režimech a jen některé karty umožňují použít celý rozsah 128kB (i když to podporovala i VGA).
Do tohoto velmi stísněného adresního rozsahu je nutné nějakým způsobem namapovat celou obrazovou paměť. A ta již může být celkem velká. Poměrně dobrým příkladem je grafický režim s rozlišením 1024×768 pixelů s bitovou hloubkou 15 bitů nebo 16 bitů. V obou případech je potřebná kapacita video paměti rovna 1024×768×2=1536 kB, což je o mnoho více, než dostupný paměťový rozsah 64 kB. Standard VESA v tomto případě nabídl řešení založené na rozdělení obrazové paměti na takzvané banky, které se zde ovšem nazývají okna (windows). Toto označení může být poněkud matoucí, protože tato okna tvoří v obrazové paměti spíše pruhy. V jeden okamžik je typicky možné pracovat s jedním nebo oběma okny, a podle nastavení lze z obrazové paměti číst (obecně velmi pomalá operace) nebo zapisovat.
5. První demonstrační příklad: zjištění informací o okně pro zápis do obrazové paměti
V dnešním prvním demonstračním příkladu využijeme již popsanou službu číslo 01h pro získání informací o zvoleném grafickém režimu. Nyní si ovšem necháme vypsat informace o okně/oknech, zejména to, zda je vůbec práce s okny podporována a taktéž to, do jakého segmentu je okno nebo okna namapována. Samotnou službu jsme si již popsali minule:
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
Číst budeme prvních několik informací o oknech, které se nazývají okno A a okno B:
;----------------------------------------------------------------------------- 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_16 xor eax, eax mov ax, [WinSize] print_dec_16 xor eax, eax mov ax, [WinASegment] print_hex eax xor eax, eax mov ax, [WinBSegment] print_hex 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, "$" 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
Na počítači s kartou S3 Trio (nebo v DOSBoxu s emulací této karty) se vypíšou tyto řádky:
Success 00000007 00000000 0000000064 0000000064 0000A000 00000000
Ty lze dekódovat takto:
Success - volání služby bez chyby 00000007 - okno A je podporováno pro čtení i pro zápis 00000000 - okno B není podporováno 0000000064 - velikost okna je 64kB (jeden segment) 0000000064 - granularita okna B je 64kB (jeden segment) 0000A000 - segment pro okno A je A000, tedy standard EGA/VGA 00000000 - segment pro okno B není nastaven (stejně není podporováno)
6. Druhý demonstrační příklad: nastavení grafického režimu
V dnešním druhém demonstračním příkladu je ukázán způsob nastavení grafického režimu. Ve skutečnosti se nejedná o nic těžkého. Pouze musíme zavolat službu 02 a v registru BX jí předat číslo požadovaného režimu. Opět platí, že v případě úspěšného provedení (režim je podporován atd.) se v registru AX vrátí hodnota 0×004f. Nastavení grafického režimu 0×103 tedy může vypadat 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 mov bx, 0x103 ; cislo rezimu mov ax, 0x4f02 ; nastaveni grafickeho rezimu int 0x10 cmp ax, 0x004f ; test, zda bylo volani funkce BIOSu uspesne jne failed jmp finish failed: print_string failed_msg finish: wait_key ; cekani na klavesu exit ; navrat do DOSu ; datova cast section .data failed_msg: db "Failed", 0x0a, 0x0d, "$"
7. Zápis barev pixelů do video paměti v reálném režimu
Ve chvíli, kdy jsme provedli přepnutí do zvoleného grafického režimu, již lze modifikovat barvy jednotlivých pixelů. Postup je zdánlivě snadný: do okna A je namapována nějaká oblast obrazové paměti (typicky její začátek) a máme tak k dispozici 64 kB video RAM, ke které se přistupuje přes segment A000 (teoreticky se může jednat i o segment B000, ale většinou ne). Musíme tedy zjistit, jaký je formát uložení pixelů a provést zápisy. Pokud je nutné přistoupit do jiné oblasti obrazové paměti, musí se okno A posunout nad tuto oblast (a opět platí – granularita bývá 64 kB, ale může být i 16 kB nebo dokonce jen 4 kB). V dalších demonstračních příkladech si tyto možnosti postupně ukážeme a budeme si budovat (tak, jako generace programátorů před námi) jednoduchou knihovnu, která nás do jisté míry od rozdílů SVGA karet odstíní.
8. Třetí demonstrační příklad: vyplnění jednoho okna video paměti přes segment A000
V dnešním třetím demonstračním příkladu nejprve provedeme přepnutí do grafického režimu s rozlišením 800×600 pixelů s 256 barvami. V mém konkrétním případě má tento režim číslo 0×103 (ovšem může být i odlišný). Následně – bez jakékoli manipulace s oknem, se provede změna všech bajtů v segmentu A000, tj. v celém rozsahu 64 kB. Program by tedy měl modifikovat celkem 65536 pixelů, což zhruba odpovídá 65536/800=81 obrazovým řádkům. Výsledek může vypadat takto:
Obrázek 1: Prvních 81 obrazových řádků vykreslených v grafickém režimu 800×600×256.
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 mov bx, 0x103 ; cislo rezimu mov ax, 0x4f02 ; nastaveni grafickeho rezimu int 0x10 cmp ax, 0x004f ; test, zda bylo volani funkce BIOSu uspesne jne failed success: mov ax, 0xa000 ; video RAM v grafickem rezimu mov es, ax mov di, 0 ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 0 ; pocet zapisovanych pixelu = 65536 mov al, 0 ; kod pixelu opak: stosb ; zapis barvy pixelu inc al ; dalsi pixel loop opak ; opakujeme CX-krat 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
9. Změna pozice okna pro zápis do jiné oblasti video paměti
Samotný zápis do segmentu A000 pro nás není žádnou novinkou, ovšem ještě musíme mít možnost provádět další operaci – posun okna (okna A) nad jinou část obrazové paměti, aby se tato část namapovala právě do segmentu A000 (64 kB). Oknem nelze posunovat libovolně po jednotlivých bajtech, ale po celých sekcích (bank). Krok posunu záleží na granularitě jejíž hodnotu jsme přečetli. Typická hodnota granularity je 64kB, takže okno může nad celou obrazovou pamětí „poskakovat“ právě po celých 64 kB. Ovšem granularita může být i nižší (vím o kartách s granularitou 4kB).
Pro posun okna se používá služba VBE číslo 0×05. Její volání vypadá takto:
Vstup: AH = 4Fh Služby SVGA AL = 05h Změna okna BH = 00h Nastavení okna BH = 01h Přečtení, které okno bylo nastaveno BL = 00h Pro okno A BL = 01h Pro okno B DX = ... Hodnota banku, který se má nastavit pro vybrané okno 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
Zkráceně: pokud potřebujeme posunout okno A, bude volání vypadat následovně:
mov ax, 0x4f05 ; sluzba pro nastaveni okna mov bx, 0x0000 ; okno A + jeho nastaveni int 0x10 ; volani VBE
Což si můžeme přepsat do podoby subrutiny:
set_video_window: ; ocekava se, ze DL je nastaven korektne! mov ax, 0x4f05 ; nastaveni okna mov bx, 0x0000 ; okno A int 0x10 ; volani VBE ret ; navrat ze subrutiny
10. Čtvrtý demonstrační příklad: vyplnění obsahu lichých oken přes segment A000
V dnešním čtvrtém demonstračním příkladu se nejprve přepneme do režimu s rozlišením 800×600 pixelů a poté vyplníme liché banky obrazové paměti. Pokud je granularita posunu okna nastavená na 64 kB, bude to znamenat, že se vykreslí prvních zhruba 82 řádků (to známe), dalším 82/83 řádků zůstane nezměněno, provede se vykreslení až následujících 82/83 obrazových řádků atd. (optimisticky přitom počítáme s tím, že mezi řádky není žádná „výplň“). Výsledek by mohl vypadat následovně:
Obrázek 2: Výsledek po vyplnění každého lichého banku obrazové paměti.
Úplný zdrojový kód tohoto demonstračního příkladu vypadá následovně:
;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: jmp main ; skok na zacatek kodu %include "io.asm" ; nacist symboly, makra a podprogramy %include "print.asm" ; nacist symboly, makra a podprogramy main: push ds pop es ; nastaveni CS=DS=ES mov bx, 0x103 ; cislo rezimu mov ax, 0x4f02 ; nastaveni grafickeho rezimu int 0x10 cmp ax, 0x004f ; test, zda bylo volani funkce BIOSu uspesne jne failed success: call fill_video_segment mov dx, 2 call set_video_window call fill_video_segment mov dx, 4 call set_video_window call fill_video_segment mov dx, 6 call set_video_window call fill_video_segment jmp finish failed: print_string failed_msg finish: wait_key ; cekani na klavesu exit ; navrat do DOSu fill_video_segment: mov ax, 0xa000 ; video RAM v grafickem rezimu mov es, ax mov di, 0 ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 0 ; pocet zapisovanych pixelu = 65536 mov al, 0 ; kod pixelu opak: stosb ; zapis barvy pixelu inc al ; dalsi pixel loop opak ; opakujeme CX-krat ret ; navrat ze subrutiny set_video_window: ; ocekava se, ze DL je nastaven korektne! mov ax, 0x4f05 ; nastaveni okna mov bx, 0x0000 ; okno A int 0x10 ; volani VBE ret ; navrat ze subrutiny ; datova cast section .data success_msg: db "Success", 0x0a, 0x0d, "$" failed_msg: db "Failed", 0x0a, 0x0d, "$" section .bss
11. Uložení pixelů v grafických režimech se šestnácti miliony barev
V režimech s 256 barvami je každý pixel uložen v jednom bajtu. A barva pixelu je přečtena z barvové palety naprosto stejným způsobem, jako u karet VGA (s tím, že DAC je již osmibitový a nikoli jen šestibitový). Ovšem jak je tomu v grafických režimech s vyšším počtem barev? Tam je situace komplikovanější. Začneme „plnobarevnými“ režimy, tj. režimy se šestnácti miliony barev. V těchto režimech může být pixel uložen ve třech nebo ve čtyřech bajtech (jeden bajt je výplňový), ovšem navíc není zřejmé, v jakém pořadí jsou uloženy barvové složky RGB. Může se například jednat o pořadí RGB, BGR popř. i jiné. A pokud přidáme existenci výplňového bajtu, lze se v praxi setkat s uložením:
RGB BGR RGBx xRGB BGRx xBGR
12. Uložení pixelů v grafických režimech s bitovou hloubkou 15 a 16
V grafických režimech s bitovou hloubkou 15 nebo 16 bitů je situace obdobná, ovšem s tím rozdílem, že se v tomto případě nevyužívají výplňové bajty. Typický způsob uložení RGB hodnoty v bitovém vyjádření vypadá takto: rrrrrgggggbbbbbx, popř. naopak bbbbbgggggrrrrrx. V případě, že je využito celých 16 bitů, bývá pro zelenou barvovou složku vyhrazeno šest bitů, protože právě v této oblasti spektra je lidský vizuální systém nejcitlivější: rrrrrggggggbbbbb. Ovšem i v tomto režimu mohou být barvové složky prohozeny – neexistuje zde jediný standard.
13. Informace o uložení pixelů
V případě, že si necháme zobrazit pouze základní informace o vybraném grafickém režimu, vyčteme z nich pouze rozlišení, počet bajtů na obrazové řádce (+ případné výplně), počet bitů na pixel a počet bitových rovin:
Success 0000000640 XResolution 0000000480 YResolution 0000001280 BytesPerScanLine 0000000015 BitsPerPixel 0000000001 NumberOfPlanes
Ovšem informace o počtu bitů na pixel (v tomto případě 15) ještě neurčuje formát uložení barvových složek pixelu. Abychom zjistili tyto informace, je nutné ze struktury popisující grafický režim přečíst dalších sedm atributů (každý má velikost jediného bajtu):
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
Povšimněte si, že informace jsou dvojího druhu: velikost barvové složky nebo výplně (v bitech) a pozice barvové složky (offset), taktéž uvedená v bitech. Tím, že pozice může být jakákoli, lze popsat barvové formáty RGB, BGR, RGBx, BGRx, nebo i xRGB, popř. dokonce RxBG a další „šílenosti“.
14. Pátý demonstrační příklad: formát uložení pixelů v režimech s bitovou hloubkou 15 a 16 bitů
V pátém demonstračním příkladu si necháme zobrazit formát uložení pixelů ve vybraném grafickém režimu s bitovou hloubkou 15 bitů a 16 bitů. Konkrétně v mém případě vypadá informace o grafickém režimu s bitovou hloubkou 15 bitů následovně:
Success 0000000005 RedMaskSize 0000000010 RedFieldPosition 0000000005 GreenMaskSize 0000000005 GreenFieldPosition 0000000005 BlueMaskSize 0000000000 BlueFieldPosition 0000000001 RsvdMaskSize
To tedy znamená, že pixel je uložen následovně (povšimněte si indexů bitů, na kterých jednotlivé barvové složky začínají):
10 5 0 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |? r r r r r g g g g g b b b b b| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Pro režim se šestnáctibitovou hloubkou jsem získal odlišné hodnoty:
Success 0000000005 RedMaskSize 0000000011 RedFieldPosition 0000000006 GreenMaskSize 0000000005 GreenFieldPosition 0000000005 BlueMaskSize 0000000000 BlueFieldPosition 0000000000 RsvdMaskSize
Formát uložení se tedy změní, protože pro zelenou složku je použito šest bitů:
11 5 0 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |r r r r r g g g g g g b b b b b| +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Pro úplnost si ukažme zdrojový kód příkladu, který tyto informace získá a zobrazí:
;----------------------------------------------------------------------------- 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, 0x110 ; cislo rezimu: 640x480x15 bitu 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, [RedMaskSize] print_dec_8 xor eax, eax mov al, [RedFieldPosition] print_dec_8 xor eax, eax mov al, [GreenMaskSize] print_dec_8 xor eax, eax mov al, [GreenFieldPosition] print_dec_8 xor eax, eax mov al, [BlueMaskSize] print_dec_8 xor eax, eax mov al, [BlueFieldPosition] print_dec_8 xor eax, eax mov al, [RsvdMaskSize] 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
15. Šestý demonstrační příklad: formát uložení pixelů v režimu s 24 nebo 32bitovou hloubkou
Podívejme se, jak může vypadat informace o grafickém režimu se šestnácti miliony barev. Zde se můžeme setkat s 24 bity na pixel nebo 32 bity na pixel. Opět v mém konkrétním případě platí, že jsem přes VBE dostal tyto hodnoty:
Success 0000000008 RedMaskSize 0000000016 RedFieldPosition 0000000008 GreenMaskSize 0000000008 GreenFieldPosition 0000000008 BlueMaskSize 0000000000 BlueFieldPosition 0000000008 RsvdMaskSize
Z těchto hodnot lze vyčíst, že se používá 32 bitů na pixel (rezervovaných bitů je osm) a na nejnižších bitech je uložena modrá barvová složka (B), následuje zelená složka (G) a poté složka červená ®. A následuje horních osm bitů, které zaplňují rezervované bity.
Opět se podívejme na to, jak by mohl vypadat demonstrační příklad, který tyto informace získá (přes VBE) a následně je zobrazí:
;----------------------------------------------------------------------------- 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, 0x112 ; cislo rezimu: 640x480x15 bitu 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, [RedMaskSize] print_dec_8 xor eax, eax mov al, [RedFieldPosition] print_dec_8 xor eax, eax mov al, [GreenMaskSize] print_dec_8 xor eax, eax mov al, [GreenFieldPosition] print_dec_8 xor eax, eax mov al, [BlueMaskSize] print_dec_8 xor eax, eax mov al, [BlueFieldPosition] print_dec_8 xor eax, eax mov al, [RsvdMaskSize] 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
16. Ověření, že formát uložení pixelů odpovídá zjištěným informacím
V předchozí kapitole jsme zjistili formát pixelů použitý v grafickém režimu se šestnácti miliony barev. Připomeňme si, že v tomto konkrétním formátu je v nejnižším bajtu uložena modrá složka (B) následovaná složkou zelenou (G), červenou ® a výplňovým bajtem. Jak si to ovšem můžeme ověřit? Poměrně snadno, protože provedeme následující operace:
- Do prvního paměťového banku (64 kB) zapíšeme pouze modré složky
- Druhý bank bude přeskočen
- Do třetího paměťového banku (64 kB) zapíšeme pouze zelené složky
- Čtvrtý bank bude přeskočen
- Do pátého paměťového banku (64 kB) zapíšeme pouze modré složky
- Šestý bank bude přeskočen
- Do sedmého paměťového banku (64 kB) zapíšeme pouze výplňové bajty (neměly by být vidět)
Výsledek by měl vypadat následovně:
Obrázek 3: Výsledek po vyplnění každého lichého banku obrazové paměti; v každém banku je nastavena jen jedna barvová složka.
Trik, který nám umožní vyplnit jen jedinou barvovou složku spočívá v tom, že v sousední čtveřici bajtů vyplníme (zapíšeme) jen jeden z těchto bajtů a zbytek přeskočíme. Subrutina pro vyplnění celého banku se změní následovně:
fill_video_segment: mov ax, 0xa000 ; video RAM v grafickem rezimu mov es, ax ;mov di, 0 ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 65536/4 ; pocet zapisovanych slozek mov al, 0 ; kod pixelu opak: stosb ; zapis barvove slozky add di, 3 inc al ; dalsi barva (intenzita) loop opak ; opakujeme CX-krat ret ; navrat ze subrutiny
přičemž před vstupem do subrutiny musíme nastavit registr DI na hodnotu 0, 1, 2 nebo 3, podle toho, jaký má být offset prvního zapisovaného bajtu. To znamená, že vyplnění čtyř pruhů na obrazovce bude realizováno takto:
mov di, 0 ; posun v ramci segmentu A000 call fill_video_segment mov dx, 2 call set_video_window mov di, 1 ; posun v ramci segmentu A000 call fill_video_segment mov dx, 4 call set_video_window mov di, 2 ; posun v ramci segmentu A000 call fill_video_segment mov dx, 6 call set_video_window mov di, 3 ; posun v ramci segmentu A000 call fill_video_segment
Úplný zdrojový kód tohoto demonstračního příkladu vypadá následovně:
org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: jmp main ; skok na zacatek kodu %include "io.asm" ; nacist symboly, makra a podprogramy %include "print.asm" ; nacist symboly, makra a podprogramy main: push ds pop es ; nastaveni CS=DS=ES mov bx, 0x112 ; cislo rezimu mov ax, 0x4f02 ; nastaveni grafickeho rezimu int 0x10 cmp ax, 0x004f ; test, zda bylo volani funkce BIOSu uspesne jne failed success: mov di, 0 ; posun v ramci segmentu A000 call fill_video_segment mov dx, 2 call set_video_window mov di, 1 ; posun v ramci segmentu A000 call fill_video_segment mov dx, 4 call set_video_window mov di, 2 ; posun v ramci segmentu A000 call fill_video_segment mov dx, 6 call set_video_window mov di, 3 ; posun v ramci segmentu A000 call fill_video_segment jmp finish failed: print_string failed_msg finish: wait_key ; cekani na klavesu exit ; navrat do DOSu fill_video_segment: mov ax, 0xa000 ; video RAM v grafickem rezimu mov es, ax ;mov di, 0 ; nyni ES:DI obsahuje adresu prvniho pixelu ve video RAM mov cx, 65536/4 ; pocet zapisovanych slozek mov al, 0 ; kod pixelu opak: stosb ; zapis barvove slozky add di, 3 inc al ; dalsi barva (intenzita) loop opak ; opakujeme CX-krat ret ; navrat ze subrutiny set_video_window: ; ocekava se, ze DL je nastaven korektne! mov ax, 0x4f05 ; nastaveni okna mov bx, 0x0000 ; okno A int 0x10 ; volani VBE ret ; navrat ze subrutiny ; datova cast section .data success_msg: db "Success", 0x0a, 0x0d, "$" failed_msg: db "Failed", 0x0a, 0x0d, "$" section .bss
17. Univerzální rutina pro vykreslení pixelu?
Z předchozího textu je zřejmé, že i přesto, že existoval standard VESA (a navíc i rozšíření BIOSu nazvané VBE, které umožňovalo přečíst všechny potřebné informace o grafické kartě i jejích grafických režimech), nebyla práce se SVGA kartami vůbec jednoduchá a i ty aplikace, které pracovaly v jediném grafickém režimu (řekněme, že se jednalo o režim 800×600×16 bitů), musely řešit různou granularitu oken, odlišné formáty uložení pixelů atd. I z tohoto důvodu se většinou v profesionálních aplikacích nesetkáme s univerzální subrutinou určenou pro vykreslování pixelů, která by byla dostatečně rychlá pro praktické použití. Většinou byly tyto subrutiny připravovány pro jednotlivé varianty rozlišení/formátu pixelů, což poněkud zvětšovalo grafické knihovny používané různými softwarovými balíčky. Příště budeme postupovat podobným způsobem a pokusíme se vytvořit subrutinu pro vykreslení pixelu v několika různých grafických režimech.
18. 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ý (v současnosti 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 |
212 | svga_info7.asm | informace o oknech podporovaných grafickým režimem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/svga_info7.asm |
213 | svga_mode0.asm | přepnutí do zvoleného grafického režimu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/svga_mode0.asm |
214 | svga_mode1.asm | vyplnění jediného okna barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/svga_mode1.asm |
215 | svga_mode2.asm | vyplnění čtyř banků barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/svga_mode2.asm |
216 | svga_mode3.asm | otestování, jakým způsobem jsou uloženy pixely v režimu s bitovou hloubkou 24/32 bitů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/svga_mode3.asm |
217 | svga_pixel_formats1.asm | zjištění formátu uložení pixelů v grafickém režimu s bitovou hloubkou 15 bitů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/svga_pixel_formats1.asm |
218 | svga_pixel_formats2.asm | zjištění formátu uložení pixelů v grafickém režimu s bitovou hloubkou 16 bitů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/svga_pixel_formats2.asm |
219 | svga_pixel_formats3.asm | zjištění formátu uložení pixelů v grafickém režimu s bitovou hloubkou 24 nebo 32 bitů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/svga_pixel_formats3.asm |
19. 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