Obsah
1. Vývoj mikroprocesorů z rodiny 80×86: 32bitové čipy 80386 a 80486
2. Sada 32bitových pracovních registrů
4. Kódování instrukcí s novými segmentovými registry
5. Instrukce PUSH a POP s novými segmentovými registry
6. Práce s novými 32bitovými pracovními registry
7. Kódování instrukcí v šestnáctibitovém režimu mikroprocesorů
8. Kódování instrukcí v 32bitovém režimu mikroprocesorů
9. Rozšíření možností instrukcí skoku
10. Základní varianta: lokální skoky
11. Rozšířená varianta: „blízké“ skoky
12. Krátké vs. blízké skoky z pohledu kódování instrukcí
14. Nové instrukce pro konverzi dat
15. Rozšíření hodnoty bez znaménka při přenosu dat
16. Rozšíření hodnoty se znaménkem při přenosu dat
18. Nastavení výsledku pravdivostní operace
19. Repositář s demonstračními příklady
1. Vývoj mikroprocesorů z rodiny 80×86: 32bitové čipy 80386 a 80486
Na článek o nových instrukcích podporovaných mikroprocesory Intel 80186 a Intel 80286 dnes navážeme. Zabývat se totiž budeme vybranými instrukcemi, které byly přidány do třetí generace mikroprocesorů rodiny 80×86, tj. konkrétně do čipů Intel 80386 (a posléze i Intel 80486). Prozatím se zaměříme především na reálný režim těchto mikroprocesorů, takže nebudeme odbíhat ani k chráněnému režimu ani k režimu virtuálnímu. Dále popsané instrukce jsou sice (většinou) 32bitové, protože dokážou zpracovávat 32bitové operandy, ovšem kvůli omezením reálného režimu měli programátoři stížené adresování paměti nad první megabajt a navíc byli omezeni i adresováním formou segment:offset. Jak bylo možné toto (dosti zásadní) omezení obejít, je problematika, které se budeme věnovat v samostatném článku.
2. Sada 32bitových pracovních registrů
Mikroprocesory 80386 a 80486 jsou nazývány 32bitovými čipy mj. i z toho důvodu, že se u nich rozšířila aritmeticko-logická jednotka tak, aby bylo možné pracovat s 32bitovými operandy. A tomu se musela přizpůsobit i sada pracovních registrů. Společnost Intel se rozhodla, že namísto „párování“ dvou šestnáctibitových registrů do registrů 32bitových rozšíří původní registry ze šestnácti bitů na plných 32 bitů. Týká se to všech čtyř pracovních registrů AX, BX, CX, DX, indexových registrů SI, DI, bázových registrů SP, BP i ukazatele na instrukci IP. Tyto registry byly rozšířeny o horních šestnáct bitů, přičemž je stále možné adresovat spodních 16 bitů původními jmény registrů a/nebo (pouze u pracovních registrů) použít jejich horních a spodních osm bitů zvlášť (AX=AH+AL atd.). V assembleru se 32bitové registry poznají podle toho, že začínají písmenem E:
32bitový registr | Spodních 16 bitů | Rozdělení horní/dolní bajt | Funkce registru |
---|---|---|---|
EAX | AX | AH/AL | akumulátor |
EBX | BX | BH/BL | bázový registr |
ECX | CX | CH/CL | čítač |
EDX | DX | DH/DL | datový registr |
ESP | SP | ukazatel na vrchol zásobníku | |
EBP | BP | báze zásobníkového rámce | |
ESI | SI | indexový registr pro zdroj dat | |
EDI | DI | indexový registr pro cíl dat | |
EIP | IP | ukazatel na prováděnou instrukci |
3. Nové segmentové registry
Mikroprocesory 80386 mají k dispozici taktéž dva nové segmentové registry pojmenované jednoduše FS a GS. Tyto registry lze použít pro adresování libovolného segmentu operační paměti a nemají žádný další speciální význam, na rozdíl od původní čtveřice segmentových registrů CS (kódový segment), DS (datový segment), SS (segment se zásobníkem) a ES (použit u řetězcových a blokových operací). Ovšem pochopitelně u složitějších aplikací mohou být další dva segmentové registry užitečné a mohou je využívat i překladače vyšších programovacích jazyků. S těmito novými registry se pracuje stejně, jako s původní čtveřicí.
4. Kódování instrukcí s novými segmentovými registry
Zajímavé bude zjistit, jak se přidání nových segmentových registrů projevilo v kódování instrukcí, které s těmito registry pracují. Kupodivu k žádnému přidávání nových prefixových bajtů v případě některých instrukcí nedošlo, což si ostatně můžeme snadno ověřit na instrukci MOV:
;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 386 ; specifikace pouziteho instrukcniho souboru ; ukonceni procesu a navrat do DOSu %macro exit 0 ret %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: mov ax, ds mov ax, es mov ax, fs mov ax, gs mov ax, ss mov ax, cs xor ax, ax mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax mov cs, ax ; toto neni dobry napad!!! wait_key exit
Způsob překladu těchto instrukcí do strojového kódu:
8 ;----------------------------------------------------------------------------- 9 10 BITS 16 ; 16bitovy vystup pro DOS 11 CPU 386 ; specifikace pouziteho instrukcniho souboru 12 13 ; ukonceni procesu a navrat do DOSu 14 %macro exit 0 15 ret 16 %endmacro 17 18 ; vyprazdneni bufferu klavesnice a cekani na klavesu 19 %macro wait_key 0 20 xor ax, ax 21 int 0x16 22 %endmacro 23 24 ;----------------------------------------------------------------------------- 25 org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) 26 27 start: 28 00000000 8CD8 mov ax, ds 29 00000002 8CC0 mov ax, es 30 00000004 8CE0 mov ax, fs 31 00000006 8CE8 mov ax, gs 32 00000008 8CD0 mov ax, ss 33 0000000A 8CC8 mov ax, cs 34 35 0000000C 31C0 xor ax, ax 36 0000000E 8ED8 mov ds, ax 37 00000010 8EC0 mov es, ax 38 00000012 8EE0 mov fs, ax 39 00000014 8EE8 mov gs, ax 40 00000016 8ED0 mov ss, ax 41 00000018 8EC8 mov cs, ax ; toto neni dobry napad!!! 42 43 wait_key 20 0000001A 31C0 xor ax, ax 21 0000001C CD16 int 0x16 44 exit 15 0000001E C3 ret
5. Instrukce PUSH a POP s novými segmentovými registry
Při pohledu na demonstrační příklad uvedený v předchozí kapitole by se mohlo zdát, že přidání nových segmentových registrů FS a GS neznamenalo žádné zásadní změny v kódování instrukcí, protože se kódy těchto registrů „vešly“ do stávajícího schématu kódování. Ve skutečnosti tomu tak není ve všech případech, jelikož například u instrukcí PUSH a POP bylo nutné přidat instrukční prefix 0F (který mimochodem znamená, že instrukce POP CS již není podporována – o tom jsme se ostatně zmínili již minule):
Podívejme se tedy na kódování instrukcí PUSH a POP v případě, že jsou tyto instrukce použity společně se segmentovými registry:
;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 386 ; specifikace pouziteho instrukcniho souboru ; ukonceni procesu a navrat do DOSu %macro exit 0 ret %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: push cs push ds push ss push es push fs push gs pop gs pop fs pop es pop ss pop ds pop cs wait_key exit
Z výsledného výpisu je patrné, že u nových segmentových registrů je použit instrukční prefix 0F, takže už tak složité schéma kódování instrukcí se nyní stává ještě složitějším (a to jsme teprve u třetí generace):
7 ;----------------------------------------------------------------------------- 8 9 BITS 16 ; 16bitovy vystup pro DOS 10 CPU 386 ; specifikace pouziteho instrukcniho souboru 11 12 ; ukonceni procesu a navrat do DOSu 13 %macro exit 0 14 ret 15 %endmacro 16 17 ; vyprazdneni bufferu klavesnice a cekani na klavesu 18 %macro wait_key 0 19 xor ax, ax 20 int 0x16 21 %endmacro 22 23 ;----------------------------------------------------------------------------- 24 org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) 25 26 start: 27 00000000 0E push cs 28 00000001 1E push ds 29 00000002 16 push ss 30 00000003 06 push es 31 00000004 0FA0 push fs 32 00000006 0FA8 push gs 33 34 00000008 0FA9 pop gs 35 0000000A 0FA1 pop fs 36 0000000C 07 pop es 37 0000000D 17 pop ss 38 0000000E 1F pop ds 39 0000000F 0F pop cs 39 ****************** warning: instruction obsolete and removed from the target CPU [-w+obsolete-removed] 40 41 wait_key 19 00000010 31C0 xor ax, ax 20 00000012 CD16 int 0x16 42 exit 14 00000014 C3 ret
6. Práce s novými 32bitovými pracovními registry
V assembleru se s 32bitovými registry pracuje prakticky stejným způsobem, jako s původními registry šestnáctibitovými. To platí pro většinu aritmetických a logických instrukcí, což si ostatně můžeme snadno ukázat na demonstračním příkladu, v němž postupně sečteme dvojici osmibitových hodnot, dále dvojici 16bitových hodnot a konečně dvojici hodnot 32bitových:
; Instrukcni soubor mikroprocesoru Intel 80386. ; ; Tento demonstracni priklad je pouzity v serialu o programovani ; grafickych dem a her na PC v DOSu: ; https://www.root.cz/serialy/vyvoj-her-a-grafickych-dem-pro-platformu-pc/ ; ;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 386 ; specifikace pouziteho instrukcniho souboru ; ukonceni procesu a navrat do DOSu %macro exit 0 ret %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: mov al, 1 mov ah, 1 add ah, al mov ax, 1 mov bx, 1 add ax, bx mov eax, 1 mov ebx, 1 add eax, ebx wait_key exit
Zajímavé bude zjištění, jak se tyto instrukce přeložily do strojového kódu:
1 ; Instrukcni soubor mikroprocesoru Intel 80386. 2 ; 3 ; Tento demonstracni priklad je pouzity v serialu o programovani 4 ; grafickych dem a her na PC v DOSu: 5 ; https://www.root.cz/serialy/vyvoj-her-a-grafickych-dem-pro-platformu-pc/ 6 ; 7 ;----------------------------------------------------------------------------- 8 9 BITS 16 ; 16bitovy vystup pro DOS 10 CPU 386 ; specifikace pouziteho instrukcniho souboru 11 12 ; ukonceni procesu a navrat do DOSu 13 %macro exit 0 14 ret 15 %endmacro 16 17 ; vyprazdneni bufferu klavesnice a cekani na klavesu 18 %macro wait_key 0 19 xor ax, ax 20 int 0x16 21 %endmacro 22 23 ;----------------------------------------------------------------------------- 24 org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) 25 26 start: 27 00000000 B001 mov al, 1 28 00000002 B401 mov ah, 1 29 00000004 00C4 add ah, al 30 31 00000006 B80100 mov ax, 1 32 00000009 BB0100 mov bx, 1 33 0000000C 01D8 add ax, bx 34 35 0000000E 66B801000000 mov eax, 1 36 00000014 66BB01000000 mov ebx, 1 37 0000001A 6601D8 add eax, ebx 38 39 wait_key 19 0000001D 31C0 <1> xor ax, ax 20 0000001F CD16 <1> int 0x16 40 exit 14 00000021 C3 <1> ret
Z výpisu je patrné, že nové 32bitové instrukce obsahují prefix 66H (a jsou tedy poměrně dlouhé, samozřejmě nepočítaje delší konstanty v instrukcích MOV):
B001 mov al, 1 B401 mov ah, 1 00C4 add ah, al B80100 mov ax, 1 BB0100 mov bx, 1 01D8 add ax, bx 66B801000000 mov eax, 1 66BB01000000 mov ebx, 1 6601D8 add eax, ebx
7. Kódování instrukcí v šestnáctibitovém režimu mikroprocesorů
V předchozí kapitole jsme viděli, že se 32bitové instrukce MOV a ADD přeložily takovým způsobem, že samotné instrukční slovo zůstalo stejné jako u 16bitových variant, ovšem před instrukci byl přidán prefix 0×66. Vyzkoušejme si tento koncept ještě na jedné instrukci, která je jednodušší. Jedná se o instrukci INC, která se v kombinaci s registrem AX přeloží do jediného bajtu (optimalizace právě pro akumulátor). Instrukci INC opět použijeme pro osmibitový, šestnáctibitový i 32bitový operand:
; Instrukcni soubor mikroprocesoru Intel 80386. ; ; Tento demonstracni priklad je pouzity v serialu o programovani ; grafickych dem a her na PC v DOSu: ; https://www.root.cz/serialy/vyvoj-her-a-grafickych-dem-pro-platformu-pc/ ; ;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 386 ; specifikace pouziteho instrukcniho souboru ; ukonceni procesu a navrat do DOSu %macro exit 0 ret %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: xor al, al inc al xor ax, ax inc ax xor eax, eax inc eax wait_key exit
Překlad do strojového kódu může na listingu vyprodukovaného assemblerem vypadat následovně:
1 ; Instrukcni soubor mikroprocesoru Intel 80386. 2 ; 3 ; Tento demonstracni priklad je pouzity v serialu o programovani 4 ; grafickych dem a her na PC v DOSu: 5 ; https://www.root.cz/serialy/vyvoj-her-a-grafickych-dem-pro-platformu-pc/ 6 ; 7 ;----------------------------------------------------------------------------- 8 9 BITS 16 ; 16bitovy vystup pro DOS 10 CPU 386 ; specifikace pouziteho instrukcniho souboru 11 12 ; ukonceni procesu a navrat do DOSu 13 %macro exit 0 14 ret 15 %endmacro 16 17 ; vyprazdneni bufferu klavesnice a cekani na klavesu 18 %macro wait_key 0 19 xor ax, ax 20 int 0x16 21 %endmacro 22 23 ;----------------------------------------------------------------------------- 24 org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) 25 26 start: 27 00000000 30C0 xor al, al 28 00000002 FEC0 inc al 29 30 00000004 31C0 xor ax, ax 31 00000006 40 inc ax 32 33 00000007 6631C0 xor eax, eax 34 0000000A 6640 inc eax 35 36 wait_key 19 0000000C 31C0 <1> xor ax, ax 20 0000000E CD16 <1> int 0x16 37 exit 14 00000010 C3 <1> ret
Konkrétně se zaměřme jen na instrukci INC s akumulátorem:
FEC0 inc al 40 inc ax 6640 inc eax
Opět tedy platí, že před 32bitovou variantu byl pouze vložen prefix 0×66.
8. Kódování instrukcí v 32bitovém režimu mikroprocesorů
Mohlo by se zdát, že třetí generace mikroprocesorů sice dokáže provádět 32bitové operace, ale platíme za to dosti vysokou cenu – každá instrukce je o bajt delší, což ovlivňuje využití cache atd. Ve skutečnosti tomu tak je pouze v původním šestnáctibitovém režimu mikroprocesorů. Pokud se mikroprocesor nachází v režimu 32bitovém (čehož ovšem není zcela snadné dosáhnout), bude situace prakticky opačná. Jak by situace vypadala v 32bitovém režimu, si můžeme ověřit překladem následujícího příkladu, v němž jsme pozměnili specifikaci BITS 16 na BITS 32. Výsledný binární soubor sice nebude v DOSu přímo spustitelný, ovšem nás nyní zajímá především způsob zakódování 32bitových instrukcí:
; Instrukcni soubor mikroprocesoru Intel 80386. ; ; Tento demonstracni priklad je pouzity v serialu o programovani ; grafickych dem a her na PC v DOSu: ; https://www.root.cz/serialy/vyvoj-her-a-grafickych-dem-pro-platformu-pc/ ; ;----------------------------------------------------------------------------- BITS 32 ; 16bitovy vystup pro DOS CPU 386 ; specifikace pouziteho instrukcniho souboru ; ukonceni procesu a navrat do DOSu %macro exit 0 ret %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: xor al, al inc al xor ax, ax inc ax xor eax, eax inc eax wait_key exit
Listing vyprodukovaný assemblerem:
1 ; Instrukcni soubor mikroprocesoru Intel 80386. 2 ; 3 ; Tento demonstracni priklad je pouzity v serialu o programovani 4 ; grafickych dem a her na PC v DOSu: 5 ; https://www.root.cz/serialy/vyvoj-her-a-grafickych-dem-pro-platformu-pc/ 6 ; 7 ;----------------------------------------------------------------------------- 8 9 BITS 32 ; 16bitovy vystup pro DOS 10 CPU 386 ; specifikace pouziteho instrukcniho souboru 11 12 ; ukonceni procesu a navrat do DOSu 13 %macro exit 0 14 ret 15 %endmacro 16 17 ; vyprazdneni bufferu klavesnice a cekani na klavesu 18 %macro wait_key 0 19 xor ax, ax 20 int 0x16 21 %endmacro 22 23 ;----------------------------------------------------------------------------- 24 org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) 25 26 start: 27 00000000 30C0 xor al, al 28 00000002 FEC0 inc al 29 30 00000004 6631C0 xor ax, ax 31 00000007 6640 inc ax 32 33 00000009 31C0 xor eax, eax 34 0000000B 40 inc eax 35 36 wait_key 19 0000000C 6631C0 <1> xor ax, ax 20 0000000F CD16 <1> int 0x16 37 exit 14 00000011 C3 <1> ret
Opět se zaměřme pouze na instrukce INC s akumulátorem. Oproti šestnáctibitové variantě se situace otočila – nyní mají prefix 0×66 šestnáctibitové operace (jsou tedy delší) zatímco operace 32bitové tento prefix nemají. Osmibitových variant se přepnutí režimu mikroprocesoru nijak nedotklo:
FEC0 inc al 6640 inc ax 40 inc eax
9. Rozšíření možností instrukcí skoku
V instrukčním souboru mikroprocesorů řady Intel 80386 došlo i k rozšíření instrukcí pro nepodmíněné a podmíněné skoky. Z hlediska relativně malých programů (tedy i programů typu COM) je důležité především rozšíření původně pouze lokálních (krátkých) skoků na takzvané „blízké“ (near) skoky, což se týká především podmíněných skoků. Připomeňme si, že původně byly cílové adresy těchto skoků omezeny na relativní rozsah –128 až 127 od aktuální hodnoty registru IP. To vyhovuje spíše pro malé subrutiny, ovšem zejména při překladu programů z vyšších programovacích jazyků do strojového kódu může být tento rozsah nedostatečný. Blízké skoky tento problém řeší, protože skok je možné provést na libovolnou adresu v aktuálně nastaveném kódovém segmentu (CS). Proto se někdy tyto skoky nazývají intrasegment jump. A konečně je nově možné provést i dlouhé skoky (far jump) mimo aktuální segment. Tyto skoky se z tohoto důvodu nazývají intersegment jump.
10. Základní varianta: lokální skoky
Pro krátké zopakování se podívejme na jednoduchý demonstrační příklad, který po svém spuštění vypíše na terminál desetkrát tu samou zprávu. Interně je v tomto příkladu realizována programová smyčka instrukcí JMP, ze které je možné po dosáhnutí konečné hodnoty čítače vyskočit instrukcí JZ. Tento příklad je plně kompatibilní s původními mikroprocesory řady Intel 8086 a Intel 8088 a pochopitelně je dopředně kompatibilní i s dalšími typy mikroprocesorů:
; Instrukcni soubor mikroprocesoru Intel 8088 a Intel 8086 ; ;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 8086 ; specifikace pouziteho instrukcniho souboru ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: mov cx, 10 ; pocatecni hodnota pocitadla opak: ; tisk retezce na obrazovku mov dx, message mov ah, 9 int 0x21 dec cx ; snizeni pocitadla o jednicku jz konec ; skok, pokus se dosahne nuly jmp opak ; opakujeme smycku konec: ; ukonceni procesu a navrat do DOSu mov ah, 0x4c int 0x21 ; retezec ukonceny znakem $ ; (tato data jsou soucasti vysledneho souboru typu COM) message db "Hello, world!", 0x0d, 0x0a, "$"
Způsob překladu do strojového kódu nám osvětlí listing vygenerovaný assemblerem v průběhu překladu:
1 ; Instrukcni soubor mikroprocesoru Intel 8088 a Intel 8086 2 ; 3 ; Tento demonstracni priklad je pouzity v serialu o programovani 4 ; grafickych dem a her na PC v DOSu: 5 ; https://www.root.cz/serialy/vyvoj-her-a-grafickych-dem-pro-platformu-pc/ 6 ; 7 ;----------------------------------------------------------------------------- 8 9 BITS 16 ; 16bitovy vystup pro DOS 10 CPU 8086 ; specifikace pouziteho instrukcniho souboru 11 12 ;----------------------------------------------------------------------------- 13 org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) 14 15 start: 16 00000000 B90A00 mov cx, 10 ; pocatecni hodnota pocitadla 17 opak: 18 ; tisk retezce na obrazovku 19 00000003 BA[1300] mov dx, message 20 00000006 B409 mov ah, 9 21 00000008 CD21 int 0x21 22 23 0000000A 49 dec cx ; snizeni pocitadla o jednicku 24 0000000B 7402 jz konec ; skok, pokus se dosahne nuly 25 26 0000000D EBF4 jmp opak ; opakujeme smycku 27 konec: 28 ; ukonceni procesu a navrat do DOSu 29 0000000F B44C mov ah, 0x4c 30 00000011 CD21 int 0x21 31 32 33 ; retezec ukonceny znakem $ 34 ; (tato data jsou soucasti vysledneho souboru typu COM) 35 00000013 48656C6C6F2C20776F- message db "Hello, world!", 0x0d, 0x0a, "$" 35 0000001C 726C64210D0A24
Zaměřme se na instrukce skoku. Ty jsou přeloženy do instrukcí s délkou pouhé dva bajty, přičemž v prvním bajtu je uložen operační kód instrukce a v bajtu druhém je relativní osmibitová adresa. Takto zakódované skoky jsou tedy omezeny na lokální rozsah –128 až 127 přičtený k aktuální hodnotě registru IP (Instruction Pointer):
7402 jz konec ; skok, pokus se dosahne nuly EBF4 jmp opak ; opakujeme smycku
11. Rozšířená varianta: „blízké“ skoky
U mikroprocesorů řady 80386 (a vyšších) lze použít i takzvané blízké skoky neboli near jumps, které umožňují provedení skoku na libovolné místo v kódovém segmentu. Adresa takového skoku je pochopitelně šestnáctibitová a díky tomu, že platí v rámci segmentu, není nutné provádět žádné testy, zda skok náhodou neporušuje izolaci programu (což se týká chráněného režimu). Blízké skoky dokáže assembler generovat automaticky ve chvíli, kdy je cíl skoku vzdálenější než relativní offset –128 až 127. Ovšem blízký skok si můžeme i vynutit modifikátorem near. Tento koncept je ukázán v následujícím demonstračním příkladu:
; Instrukcni soubor mikroprocesoru Intel 80386. ; ; Tento demonstracni priklad je pouzity v serialu o programovani ; grafickych dem a her na PC v DOSu: ; https://www.root.cz/serialy/vyvoj-her-a-grafickych-dem-pro-platformu-pc/ ; ;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 386 ; specifikace pouziteho instrukcniho souboru ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: mov cx, 10 ; pocatecni hodnota pocitadla opak: ; tisk retezce na obrazovku mov dx, message mov ah, 9 int 0x21 dec cx ; snizeni pocitadla o jednicku jz near konec ; skok, pokus se dosahne nuly jmp near opak ; opakujeme smycku konec: ; ukonceni procesu a navrat do DOSu mov ah, 0x4c int 0x21 ; retezec ukonceny znakem $ ; (tato data jsou soucasti vysledneho souboru typu COM) message db "Hello, world!", 0x0d, 0x0a, "$"
Způsob překladu do strojového kódu opět zjistíme z listingu:
1 ; Instrukcni soubor mikroprocesoru Intel 80386. 2 ; 3 ; Tento demonstracni priklad je pouzity v serialu o programovani 4 ; grafickych dem a her na PC v DOSu: 5 ; https://www.root.cz/serialy/vyvoj-her-a-grafickych-dem-pro-platformu-pc/ 6 ; 7 ;----------------------------------------------------------------------------- 8 9 BITS 16 ; 16bitovy vystup pro DOS 10 CPU 386 ; specifikace pouziteho instrukcniho souboru 11 12 ;----------------------------------------------------------------------------- 13 org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) 14 15 start: 16 00000000 B90A00 mov cx, 10 ; pocatecni hodnota pocitadla 17 opak: 18 ; tisk retezce na obrazovku 19 00000003 BA[1600] mov dx, message 20 00000006 B409 mov ah, 9 21 00000008 CD21 int 0x21 22 23 0000000A 49 dec cx ; snizeni pocitadla o jednicku 24 0000000B 0F840300 jz near konec ; skok, pokus se dosahne nuly 25 26 0000000F E9F1FF jmp near opak ; opakujeme smycku 27 konec: 28 ; ukonceni procesu a navrat do DOSu 29 00000012 B44C mov ah, 0x4c 30 00000014 CD21 int 0x21 31 32 33 ; retezec ukonceny znakem $ 34 ; (tato data jsou soucasti vysledneho souboru typu COM) 35 00000016 48656C6C6F2C20776F- message db "Hello, world!", 0x0d, 0x0a, "$" 35 0000001F 726C64210D0A24
Povšimněte si, jak jsou nyní instrukce skoku zakódovány. Problematický je především první skok, který má namísto dvou bajtů délku celých čtyř bajtů:
0000000B 0F840300 jz near konec ; skok, pokus se dosahne nuly 0000000F E9F1FF jmp near opak ; opakujeme smycku
12. Krátké vs. blízké skoky z pohledu kódování instrukcí
Zatímco u rozšíření instrukcí zmíněných v předchozím textu většinou došlo pouze k přidání prefixu před operační kód instrukce, je tomu u blízkých skoků jinak, protože se kromě prefixu (ten zde stále existuje a má hodnotu 0F) změní i samotný operační kód instrukce. Tato nepravidelnost je patrná z následující tabulky se základními formami skoků. Pro úplnost uvádím i všechny alternativy jmen instrukcí:
Instrukce | Význam | Testovaná podmínka | Krátký skok | Blízký skok |
---|---|---|---|---|
JO | Jump if Overflow | OF = 1 | 70 | 0F 80 |
JNO | Jump if Not Overflow | OF = 0 | 71 | 0F 81 |
JS | Jump if Sign | SF = 1 | 78 | 0F 88 |
JNS | Jump if Not Sign | SF = 0 | 79 | 0F 89 |
JE | Jump if Equal | ZF = 1 | 74 | 0F 84 |
JZ | Jump if Zero | ZF = 1 | 74 | 0F 84 |
JNE | Jump if Not Equal | ZF = 0 | 75 | 0F 85 |
JNZ | Jump if Not Zero | ZF = 0 | 75 | 0F 85 |
JB | Jump if Below | CF = 1 | 72 | 0F 82 |
JNAE | Jump if Not Above or Equal | CF = 1 | 72 | 0F 82 |
JC | Jump if Carry | CF = 1 | 72 | 0F 82 |
JNB | Jump if Not Below | CF = 0 | 73 | 0F 83 |
JAE | Jump if Above or Equal | CF = 0 | 73 | 0F 83 |
JNC | Jump if Not Carry | CF = 0 | 73 | 0F 83 |
JBE | Jump if Below or Equal | CF = 1 | ZF = 1 | 76 | 0F 86 |
JNA | Jump if Not Above | CF = 1 | ZF = 1 | 76 | 0F 86 |
JA | Jump if Above | CF = 0 & ZF = 0 | 77 | 0F 87 |
JNBE | Jump if Not Below or Equal | CF = 0 & ZF = 0 | 77 | 0F 87 |
JL | Jump if Less | SF <> OF | 7C | 0F 8C |
JNGE | Jump if Not Greater or Equal | SF <> OF | 7C | 0F 8C |
JGE | Jump if Greater or Equal | SF = OF | 7D | 0F 8D |
JNL | Jump if Not Less | SF = OF | 7D | 0F 8D |
JLE | Jump if Less or Equal | ZF = 1 | SF <> OF | 7E | 0F 8E |
JNG | Jump if Not Greater | ZF = 1 | SF <> OF | 7E | 0F 8E |
JG | Jump if Greater | ZF = 0 & SF = OF | 7F | 0F 8F |
JNLE | Jump if Not Less or Equal | ZF = 0 & SF = OF | 7F | 0F 8F |
JP | Jump if Parity | PF = 1 | 7A | 0F 8A |
JPE | Jump if Parity Even | PF = 1 | 7A | 0F 8A |
JNP | Jump if Not Parity | PF = 0 | 7B | 0F 8B |
JPO | Jump if Parity Odd | PF = 0 | 7B | 0F 8B |
13. Dlouhé skoky
Provádět je možné i takzvané dlouhé skoky, tj. skoky, při nichž se mění jak hodnota registru EIP (ano i tento registr je nyní 32bitový), tak i hodnota CS (kódový segment). Adresa cíle skoku nyní musí obsahovat plný ukazatel (tj. segment+16bitový offset nebo dokonce segment+32bitový offset) a může být zadána buď skutečně jako absolutní adresa, nebo jako adresa na ukazatel obsahující vlastní adresu cíle skoku. V prvním případě je pochopitelně adresa součástí instrukčního slova (4 bajty nebo šest bajtů), ve druhém případě se jedná o čtyřbajtovou nebo šestibajtovou adresu ukazatele. S podrobnostmi se seznámíme příště při popisu způsobů adresace paměti, která přesahuje základní 1MB.
14. Nové instrukce pro konverzi dat
Procesory ze třetí generace čipů 80×86 mají rozšířenou sadu instrukcí určenou pro konverze dat. Těmito instrukcemi jsme se prozatím v tomto seriálu podrobněji nezabývali, takže si nyní vypišme všechny dostupné varianty i s jejich stručným popisem. To, zda se jedná o nové instrukce či nikoli, je patrné z obsahu druhého sloupce:
Instrukce | Kompatibilita | Stručný popis instrukce |
---|---|---|
CBW | 8086 | znaménkové rozšíření AL→AX |
CWD | 8086 | znaménkové rozšíření AX→DX:AX |
CWDE | 80386 | znaménkové rozšíření AX→EAX |
CDQ | 80386 | znaménkové rozšíření EAX→EDX:EAX |
Tyto instrukce původní osmibitovou, 16bitovou či 32bitovou hodnotu rozšíří na dvojnásobnou šířku, přičemž berou v úvahu znaménko (nejedná se tedy o pouhé vynulování horních bitů registru či dvojice registrů). V rámci čipů 80386 byly přidány instrukce CWDE a CDQ. Zajímavé je, že tyto instrukce trvají dva cykly, zatímco instrukce původní (jednodušší) trvají cykly tři.
Kódování těchto instrukcí v šestnáctibitovém režimu:
98 cbw 99 cwd 6698 cwde 6699 cdq
Opět zde tedy můžeme vidět prefix 66.
15. Rozšíření hodnoty bez znaménka při přenosu dat
Instrukce uvedené v předchozí kapitole pracují pouze s akumulátorem popř. s dvojicí registrů D:A (DX:AX nebo EDX:EAX). Čipy 80386 jsou ale doplněny i obecnějšími instrukcemi určenými pro rozšíření hodnoty při přenosu dat z/do jiných registrů nebo z operační paměti. Jedná se tedy o variantu obecné přenosové instrukce MOV nazvanou MOVZX, ovšem s tím, že se horních osm bitů resp. šestnáct bitů vynuluje:
Instrukce | Operandy | Stručný popis instrukce |
---|---|---|
MOVZX | reg16, reg8 | přenos z osmibitového registru do registru 16bitového s vynulováním horních osmi bitů |
MOVZX | reg32, reg16 | přenos z 16bitového registru do registru 32bitového s vynulováním horních šestnácti bitů |
MOVZX | reg16, mem | přenos osmi bitů z operační paměti s vynulováním horních osmi bitů |
MOVZX | reg32, mem | přenos šestnácti bitů z operační paměti s vynulováním horních šestnácti bitů |
16. Rozšíření hodnoty z šestnáctibitového registru do registru 32bitového
K dispozici je i instrukce nazvaná MOVSX umožňující přenosy dat se znaménkovým rozšířením. Pro kladné hodnoty (nejvyšší bit je nulový) je tato instrukce totožná s výše uvedenou MOVZX, pro hodnoty záporné (nejvyšší bit nastaven na jedničku) se pak vyšší polovina cílového registru taktéž nastaví na jedničku:
Instrukce | Operandy | Stručný popis instrukce |
---|---|---|
MOVSX | reg16, reg8 | přenos z osmibitového registru do registru 16bitového se znaménkovým rozšířením do horních osmi bitů |
MOVSX | reg32, reg16 | přenos z 16bitového registru do registru 32bitového se znaménkovým rozšířením do horních šestnácti bitů |
MOVSX | reg16, mem | přenos osmi bitů z operační paměti se znaménkovým rozšířením do horních osmi bitů |
MOVSX | reg32, mem | přenos šestnácti bitů z operační paměti se znaménkovým rozšířením do horních šestnácti bitů |
Pro zajímavost se podívejme na způsob zakódování těchto instrukcí do strojového kódu:
0FB6DB movzx bx, bl 660FB6DB movzx ebx, bl 660FB7DB movzx ebx, bx 0FB61E[0000] movzx bx, byte [data] 660FB71E[0000] movzx ebx, word [data] 0FBEDB movsx bx, bl 660FBEDB movsx ebx, bl 660FBFDB movsx ebx, bx 0FBE1E[0000] movsx bx, byte [data] 660FBF1E[0000] movsx ebx, word [data]
17. Nové bitové operace
Mikroprocesory 80386 mají k dispozici i instrukce pro provádění různých bitových operací. Jedná se velmi užitečné nízkoúrovňové operace a podobné instrukce nalezneme například v mnoha mikrořadičích:
Instrukce | Operandy | Stručný popis instrukce |
---|---|---|
BT | src, n | n-tý bit se zkopíruje do příznaku Carry |
BTC | src, n | negace n-tého bitu se zkopíruje do příznaku Carry |
BTR | src, n | jako instrukce BT, ale bit se poté vynuluje |
BTS | src, n | jako instrukce BT, ale bit se poté nastaví na 1 |
BSF | dest, src | hledá první nenulový bit od bitu nejnižšího |
BSR | dest, src | hledá první nenulový bit od bitu nejvyššího |
Pro zajímavost si uveďme program, který zjistí index prvního nenulového bitu při procházení slovem zprava doleva, tj. od nejnižšího bitu směrem k bitu nejvyššímu. Instrukce, která tuto činnost provádí, se jmenuje BSF neboli celým jménem Bit Scan Forward:
; Instrukcni soubor mikroprocesoru Intel 80386. ; Test instrukce BSF. ; ;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 386 ; specifikace pouziteho instrukcniho souboru ; ukonceni procesu a navrat do DOSu %macro exit 0 ret %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ; tisk retezce na obrazovku %macro print 1 mov dx, %1 mov ah, 9 int 0x21 %endmacro ; tisk hexadecimalni hodnoty %macro print_hex 1 mov bx, hex_digits mov cl, %1 ; zapamatovat si predanou hodnotu mov al, cl ; do AL se vlozi horni hexa cifra and al, 0xf0 shr al, 1 shr al, 1 shr al, 1 shr al, 1 xlat ; prevod hodnoty 0-15 na ASCII znak mov [message], al ; zapis ASCII znaku do retezce mov al, cl ; do BL se vlozi dolni hexa cifra and al, 0x0f xlat ; prevod hodnoty 0-15 na ASCII znak mov [message + 1], al ; zapis ASCII znaku do retezce print message %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: mov ebx, 0x00030000 ; nastavení bitu bsf eax, ebx ; vyhledání prvního nenulového bitu print_hex al ; výsledek je v EAX, ovšem nám stačí jen AL wait_key exit ; retezec ukonceny znakem $ ; (tato data jsou soucasti vysledneho souboru typu COM) message db 0x01, 0x01, 0x0d, 0x0a, "$" ; prevodni tabulka hodnoty 0-15 na ASCII znak hex_digits db "0123456789abcdef"
Tento program po svém spuštění vypíše hexadecimální hodnotu 10, protože první nenulový bit zprava je skutečně na pozici číslo 16 (počítáno od nuly). Ovšem pokud zaměníme instrukci BSF za BSR, vypíše se hexadecimální hodnota 11, jelikož hledáme první nenulový bit zleva (od nejvyššího bitu). Tato varianta příkladu vypadá následovně:
; Instrukcni soubor mikroprocesoru Intel 80386. ; Test instrukce BSR. ; ;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 386 ; specifikace pouziteho instrukcniho souboru ; ukonceni procesu a navrat do DOSu %macro exit 0 ret %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 %endmacro ; tisk retezce na obrazovku %macro print 1 mov dx, %1 mov ah, 9 int 0x21 %endmacro ; tisk hexadecimalni hodnoty %macro print_hex 1 mov bx, hex_digits mov cl, %1 ; zapamatovat si predanou hodnotu mov al, cl ; do AL se vlozi horni hexa cifra and al, 0xf0 shr al, 1 shr al, 1 shr al, 1 shr al, 1 xlat ; prevod hodnoty 0-15 na ASCII znak mov [message], al ; zapis ASCII znaku do retezce mov al, cl ; do BL se vlozi dolni hexa cifra and al, 0x0f xlat ; prevod hodnoty 0-15 na ASCII znak mov [message + 1], al ; zapis ASCII znaku do retezce print message %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: mov ebx, 0x00030000 ; nastavení bitu bsr eax, ebx ; vyhledání prvního nenulového bitu print_hex al ; výsledek je v EAX, ovšem nám stačí jen AL wait_key exit ; retezec ukonceny znakem $ ; (tato data jsou soucasti vysledneho souboru typu COM) message db 0x01, 0x01, 0x0d, 0x0a, "$" ; prevodni tabulka hodnoty 0-15 na ASCII znak hex_digits db "0123456789abcdef"
18. Nastavení výsledku pravdivostní operace
Poslední sada instrukcí, které si dnes popíšeme, slouží pro nastavení hodnoty 0 nebo 1 do zvoleného osmibitového registru nebo do adresy v operační paměti. To, jaká hodnota se zapíše, záleží na vyhodnocení podmínky, přičemž samotné podmínky jsou naprosto stejné, jako u podmíněných skoků. Nastavením 0/1 se vlastně instrukční sada mikroprocesorů řady 80386 přibližuje požadavkům vyšších programovacích jazyků, zejména pak klasického céčka. V následující tabulce jsou uvedeny všechny jmenné aliasy instrukcí (mnohé instrukce mají stejný význam, jen odlišné jméno):
Instrukce | Operandy | Stručný popis instrukce |
---|---|---|
SETO | Set to 1 if Overflow | OF = 1 |
SETNO | Set to 1 if Not Overflow | OF = 0 |
SETS | Set to 1 if Sign | SF = 1 |
SETNS | Set to 1 if Not Sign | SF = 0 |
SETE | Set to 1 if Equal | ZF = 1 |
SETZ | Set to 1 if Zero | ZF = 1 |
SETNE | Set to 1 if Not Equal | ZF = 0 |
SETNZ | Set to 1 if Not Zero | ZF = 0 |
SETB | Set to 1 if Below | CF = 1 |
SETNAE | Set to 1 if Not Above or Equal | CF = 1 |
SETC | Set to 1 if Carry | CF = 1 |
SETNB | Set to 1 if Not Below | CF = 0 |
SETAE | Set to 1 if Above or Equal | CF = 0 |
SETNC | Set to 1 if Not Carry | CF = 0 |
SETBE | Set to 1 if Below or Equal | CF = 1 | ZF = 1 |
SETNA | Set to 1 if Not Above | CF = 1 | ZF = 1 |
SETA | Set to 1 if Above | CF = 0 & ZF = 0 |
SETNBE | Set to 1 if Not Below or Equal | CF = 0 & ZF = 0 |
SETL | Set to 1 if Less | SF <> OF |
SETNGE | Set to 1 if Not Greater or Equal | SF <> OF |
SETGE | Set to 1 if Greater or Equal | SF = OF |
SETNL | Set to 1 if Not Less | SF = OF |
SETLE | Set to 1 if Less or Equal | ZF = 1 | SF <> OF |
SETNG | Set to 1 if Not Greater | ZF = 1 | SF <> OF |
SETG | Set to 1 if Greater | ZF = 0 & SF = OF |
SETNLE | Set to 1 if Not Less or Equal | ZF = 0 & SF = OF |
SETP | Set to 1 if Parity | PF = 1 |
SETPE | Set to 1 if Parity Even | PF = 1 |
SETNP | Set to 1 if Not Parity | PF = 0 |
SETPO | Set to 1 if Parity Odd | PF = 0 |
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 |
20. Odkazy na Internetu
- The Intel 8088 Architecture and Instruction Set
https://people.ece.ubc.ca/~edc/464/lectures/lec4.pdf - x86 Opcode Structure and Instruction Overview
https://pnx.tf/files/x86_opcode_structure_and_instruction_overview.pdf - x86 instruction listings (Wikipedia)
https://en.wikipedia.org/wiki/X86_instruction_listings - x86 assembly language (Wikipedia)
https://en.wikipedia.org/wiki/X86_assembly_language - Intel Assembler (Cheat sheet)
http://www.jegerlehner.ch/intel/IntelCodeTable.pdf - 25 Microchips That Shook the World
https://spectrum.ieee.org/tech-history/silicon-revolution/25-microchips-that-shook-the-world - Chip Hall of Fame: MOS Technology 6502 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-mos-technology-6502-microprocessor - Chip Hall of Fame: Intel 8088 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-intel-8088-microprocessor - Jak se zrodil procesor?
https://www.root.cz/clanky/jak-se-zrodil-procesor/ - Apple II History Home
http://apple2history.org/ - The 8086/8088 Primer
https://www.stevemorse.org/8086/index.html - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - Bit banging
https://en.wikipedia.org/wiki/Bit_banging - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Bootloaders
https://en.wikibooks.org/wiki/X86_Assembly/Bootloaders - Počátky grafiky na PC: grafické karty CGA a Hercules
https://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/ - Co mají společného Commodore PET/4000, BBC Micro, Amstrad CPC i grafické karty MDA, CGA a Hercules?
https://www.root.cz/clanky/co-maji-spolecneho-commodore-pet-4000-bbc-micro-amstrad-cpc-i-graficke-karty-mda-cga-a-hercules/ - Karta EGA: první použitelná barevná grafika na PC
https://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/ - RGB Classic Games
https://www.classicdosgames.com/ - Turbo Assembler (Wikipedia)
https://en.wikipedia.org/wiki/Turbo_Assembler - Microsoft Macro Assembler
https://en.wikipedia.org/wiki/Microsoft_Macro_Assembler - IBM Personal Computer (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Personal_Computer - Intel 8251
https://en.wikipedia.org/wiki/Intel_8251 - Intel 8253
https://en.wikipedia.org/wiki/Intel_8253 - Intel 8255
https://en.wikipedia.org/wiki/Intel_8255 - Intel 8257
https://en.wikipedia.org/wiki/Intel_8257 - Intel 8259
https://en.wikipedia.org/wiki/Intel_8259 - Support/peripheral/other chips – 6800 family
http://www.cpu-world.com/Support/6800.html - Motorola 6845
http://en.wikipedia.org/wiki/Motorola_6845 - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - CRTC operation
http://www.6502.org/users/andre/hwinfo/crtc/crtc.html - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - Motorola 6845 and bitwise graphics
https://retrocomputing.stackexchange.com/questions/10996/motorola-6845-and-bitwise-graphics - IBM Monochrome Display Adapter
http://en.wikipedia.org/wiki/Monochrome_Display_Adapter - Color Graphics Adapter
http://en.wikipedia.org/wiki/Color_Graphics_Adapter - Color Graphics Adapter and the Brown color in IBM 5153 Color Display
https://www.aceinnova.com/en/electronics/cga-and-the-brown-color-in-ibm-5153-color-display/ - The Modern Retrocomputer: An Arduino Driven 6845 CRT Controller
https://hackaday.com/2017/05/14/the-modern-retrocomputer-an-arduino-driven-6845-crt-controller/ - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Arithmetic
https://en.wikibooks.org/wiki/X86_Assembly/Arithmetic - Art of Assembly – Arithmetic Instructions
http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter6/CH06–2.html - ASM Flags
http://www.cavestory.org/guides/csasm/guide/asm_flags.html - Status Register
https://en.wikipedia.org/wiki/Status_register - Linux assemblers: A comparison of GAS and NASM
http://www.ibm.com/developerworks/library/l-gas-nasm/index.html - Programovani v assembleru na OS Linux
http://www.cs.vsb.cz/grygarek/asm/asmlinux.html - Is it worthwhile to learn x86 assembly language today?
https://www.quora.com/Is-it-worthwhile-to-learn-x86-assembly-language-today?share=1 - Why Learn Assembly Language?
http://www.codeproject.com/Articles/89460/Why-Learn-Assembly-Language - Is Assembly still relevant?
http://programmers.stackexchange.com/questions/95836/is-assembly-still-relevant - Why Learning Assembly Language Is Still a Good Idea
http://www.onlamp.com/pub/a/onlamp/2004/05/06/writegreatcode.html - Assembly language today
http://beust.com/weblog/2004/06/23/assembly-language-today/ - Assembler: Význam assembleru dnes
http://www.builder.cz/rubriky/assembler/vyznam-assembleru-dnes-155960cz - Programming from the Ground Up Book – Summary
http://savannah.nongnu.org/projects/pgubook/ - DOSBox
https://www.dosbox.com/ - The C Programming Language
https://en.wikipedia.org/wiki/The_C_Programming_Language - Hercules Graphics Card (HCG)
https://en.wikipedia.org/wiki/Hercules_Graphics_Card - Complete 8086 instruction set
https://content.ctcd.edu/courses/cosc2325/m22/docs/emu8086ins.pdf - Complete 8086 instruction set
https://yassinebridi.github.io/asm-docs/8086_instruction_set.html - 8088 MPH by Hornet + CRTC + DESiRE (final version)
https://www.youtube.com/watch?v=hNRO7lno_DM - Area 5150 by CRTC & Hornet (Party Version) / IBM PC+CGA Demo, Hardware Capture
https://www.youtube.com/watch?v=fWDxdoRTZPc - 80×86 Integer Instruction Set Timings (8088 – Pentium)
http://aturing.umcs.maine.edu/~meadow/courses/cos335/80×86-Integer-Instruction-Set-Clocks.pdf - Colour Graphics Adapter: Notes
https://www.seasip.info/VintagePC/cga.html - Restoring A Vintage CGA Card With Homebrew HASL
https://hackaday.com/2024/06/12/restoring-a-vintage-cga-card-with-homebrew-hasl/ - Demoing An 8088
https://hackaday.com/2015/04/10/demoing-an-8088/ - Video Memory Layouts
http://www.techhelpmanual.com/89-video_memory_layouts.html - Screen Attributes
http://www.techhelpmanual.com/87-screen_attributes.html - IBM PC Family – BIOS Video Modes
https://www.minuszerodegrees.net/video/bios_video_modes.htm - EGA Functions
https://cosmodoc.org/topics/ega-functions/#the-hierarchy-of-the-ega - Why the EGA can only use 16 of its 64 colours in 200-line modes
https://www.reenigne.org/blog/why-the-ega-can-only-use-16-of-its-64-colours-in-200-line-modes/ - How 16 colors saved PC gaming – the story of EGA graphics
https://www.custompc.com/retro-tech/ega-graphics - List of 16-bit computer color palettes
https://en.wikipedia.org/wiki/List_of16-bit_computer_color_palettes - Why were those colors chosen to be the default palette for 256-color VGA?
https://retrocomputing.stackexchange.com/questions/27994/why-were-those-colors-chosen-to-be-the-default-palette-for-256-color-vga - VGA Color Palettes
https://www.fountainware.com/EXPL/vga_color_palettes.htm - Hardware Level VGA and SVGA Video Programming Information Page
http://www.osdever.net/FreeVGA/vga/vga.htm - Hardware Level VGA and SVGA Video Programming Information Page – sequencer
http://www.osdever.net/FreeVGA/vga/seqreg.htm - VGA Basics
http://www.brackeen.com/vga/basics.html - Introduction to VGA Mode ‚X‘
https://web.archive.org/web/20160414072210/http://fly.srk.fer.hr/GDM/articles/vgamodex/vgamx1.html - VGA Mode-X
https://web.archive.org/web/20070123192523/http://www.gamedev.net/reference/articles/article356.asp - Mode-X: 256-Color VGA Magic
https://downloads.gamedev.net/pdf/gpbb/gpbb47.pdf - Instruction Format in 8086 Microprocessor
https://www.includehelp.com/embedded-system/instruction-format-in-8086-microprocessor.aspx - How to use „AND,“ „OR,“ and „XOR“ modes for VGA Drawing
https://retrocomputing.stackexchange.com/questions/21936/how-to-use-and-or-and-xor-modes-for-vga-drawing - VGA Hardware
https://wiki.osdev.org/VGA_Hardware - Programmer's Guide to Yamaha YMF 262/OPL3 FM Music Synthesizer
https://moddingwiki.shikadi.net/wiki/OPL_chip - Does anybody understand how OPL2 percussion mode works?
https://forum.vcfed.org/index.php?threads/does-anybody-understand-how-opl2-percussion-mode-works.60925/ - Yamaha YMF262 OPL3 music – MoonDriver for OPL3 DEMO [Oscilloscope View]
https://www.youtube.com/watch?v=a7I-QmrkAak - Yamaha OPL vs OPL2 vs OPL3 comparison
https://www.youtube.com/watch?v=5knetge5Gs0 - OPL3 Music Crockett's Theme
https://www.youtube.com/watch?v=HXS008pkgSQ - Bad Apple (Adlib Tracker – OPL3)
https://www.youtube.com/watch?v=2lEPH6Y3Luo - FM Synthesis Chips, Codecs and DACs
https://www.dosdays.co.uk/topics/fm_synthesizers.php - The Zen Challenge – YMF262 OPL3 Original (For an upcoming game)
https://www.youtube.com/watch?v=6JlFIFz1CFY - [adlib tracker II techno music – opl3] orbit around alpha andromedae I
https://www.youtube.com/watch?v=YqxJCu_WFuA - [adlib tracker 2 music – opl3 techno] hybridisation process on procyon-ii
https://www.youtube.com/watch?v=daSV5mN0sJ4 - Hyper Duel – Black Rain (YMF262 OPL3 Cover)
https://www.youtube.com/watch?v=pu_mzRRq8Ho - IBM 5155–5160 Technical Reference
https://www.minuszerodegrees.net/manuals/IBM/IBM_5155_5160_Technical_Reference_6280089_MAR86.pdf - a ymf262/opl3+pc speaker thing i made
https://www.youtube.com/watch?v=E-Mx0lEmnZ0 - [OPL3] Like a Thunder
https://www.youtube.com/watch?v=MHf06AGr8SU - (PC SPEAKER) bad apple
https://www.youtube.com/watch?v=LezmKIIHyUg - Powering devices from PC parallel port
http://www.epanorama.net/circuits/lptpower.html - Magic Mushroom (demo pro PC s DOSem)
http://www.crossfire-designs.de/download/articles/soundcards//mushroom.rar - Píseň Magic Mushroom – originál
http://www.crossfire-designs.de/download/articles/soundcards/speaker_mushroom_converted.mp3 - Píseň Magic Mushroom – hráno na PC Speakeru
http://www.crossfire-designs.de/download/articles/soundcards/speaker_mushroom_speaker.mp3 - Pulse Width Modulation (PWM) Simulation Example
http://decibel.ni.com/content/docs/DOC-4599 - Resistor/Pulse Width Modulation DAC
http://www.k9spud.com/traxmod/pwmdac.php - Class D Amplifier
http://en.wikipedia.org/wiki/Electronic_amplifier#Class_D - Covox Speech Thing / Disney Sound Source (1986)
http://www.crossfire-designs.de/index.php?lang=en&what=articles&name=showarticle.htm&article=soundcards/&page=5 - Covox Digital-Analog Converter (Rusky, obsahuje schémata)
http://phantom.sannata.ru/konkurs/netskater002.shtml - PC-GPE on the Web
http://bespin.org/~qz/pc-gpe/ - Keyboard Synthesizer
http://www.solarnavigator.net/music/instruments/keyboards.htm - FMS – Fully Modular Synthesizer
http://fmsynth.sourceforge.net/ - Javasynth
http://javasynth.sourceforge.net/ - Software Sound Synthesis & Music Composition Packages
http://www.linux-sound.org/swss.html - Mx44.1 Download Page (software synthesizer for linux)
http://hem.passagen.se/ja_linux/ - Software synthesizer
http://en.wikipedia.org/wiki/Software_synthesizer - Frequency modulation synthesis
http://en.wikipedia.org/wiki/Frequency_modulation_synthesis - Yamaha DX7
http://en.wikipedia.org/wiki/Yamaha_DX7 - Wave of the Future
http://www.wired.com/wired/archive/2.03/waveguides_pr.html - Analog synthesizer
http://en.wikipedia.org/wiki/Analog_synthesizer - Minimoog
http://en.wikipedia.org/wiki/Minimoog - Moog synthesizer
http://en.wikipedia.org/wiki/Moog_synthesizer - Tutorial for Frequency Modulation Synthesis
http://www.sfu.ca/~truax/fmtut.html - An Introduction To FM
http://ccrma.stanford.edu/software/snd/snd/fm.html - John Chowning
http://en.wikipedia.org/wiki/John_Chowning - I'm Impressed, Adlib Music is AMAZING!
https://www.youtube.com/watch?v=PJNjQYp1ras - Milinda- Diode Milliampere ( OPL3 )
https://www.youtube.com/watch?v=oNhazT5HG0E - Dune 2 – Roland MT-32 Soundtrack
https://www.youtube.com/watch?v=kQADZeB-z8M - Interrupts
https://wiki.osdev.org/Interrupts#Types_of_Interrupts - Assembly8086SoundBlasterDmaSingleCycleMode
https://github.com/leonardo-ono/Assembly8086SoundBlasterDmaSingleCycleMode/blob/master/sbsc.asm - Interrupts in 8086 microprocessor
https://www.geeksforgeeks.org/interrupts-in-8086-microprocessor/ - Interrupt Structure of 8086
https://www.eeeguide.com/interrupt-structure-of-8086/