Obsah
1. Aritmetické a logické posuny prvků vektorů
2. První demonstrační příklad: logické posuny doleva
3. Druhý demonstrační příklad: logické posuny doprava
4. Třetí demonstrační příklad: aritmetické posuny doprava
6. Čtvrtý demonstrační příklad: porovnání prvků na rovnost
7. Pátý demonstrační příklad: porovnání prvků na relaci „větší než“
8. Transformace mezi různými typy vektorů
9. Šestý demonstrační příklad: rozbalení bajtů z vektorů
10. Sedmý demonstrační příklad: rozbalení slov z vektorů
11. Osmý demonstrační příklad: rozbalení dvojslov z vektorů
12. Devátý demonstrační příklad: zabalení vektorů slov do vektoru bajtů
13. Desátý demonstrační příklad: řešení přetečení při zabalování vektorů
14. Instrukční sada MMX: shrnutí
15. Seznam všech popsaných instrukcí MMX
16. Instrukční sada 3DNow! aneb odpověď firmy AMD na instrukční sadu MMX
17. Datové typy instrukcí 3DNow!
18. Vektorové instrukce definované v rozšíření 3DNow!
19. Repositář s demonstračními příklady
1. Aritmetické a logické posuny prvků vektorů
Na články [1] a [2] dnes navážeme. Popíšeme si zbytek instrukcí ze sady MMX a většinu instrukcí použijeme v demonstračních příkladech. Taktéž si – ovšem už bez příkladů – popíšeme instrukční sadu 3DNow! společnosti AMD. Tato sada nebyla přímou konkurencí MMX, ale spíše první vlaštovkou, která vedla k SSE a posléze i k rozšířením AVX.
Začneme popisem MMX instrukcí určených pro provádění aritmetických a logických posunů prvků vektorů. Tyto instrukce se od sebe pochopitelně odlišují typem posunu (doleva, doprava s doplněním nuly či doprava s kopií nejvyššího bitu) i tím, jak široké jsou prvky vektorů. Je možné použít 16bitová slova, 32bitová slova a 64bitová slova (nikoli jednotlivé bajty). Žádná z těchto instrukcí nemění příznakové bity:
# | Instrukce | Stručný popis instrukce |
---|---|---|
1 | PSLLW | logický posun doleva vektorů s prvky typu 16bitové slovo |
2 | PSLLD | logický posun doleva vektorů s prvky typu 32bitové slovo |
3 | PSLLQ | logický posun doleva 64bitové hodnoty |
4 | PSRLW | logický posun doprava vektorů s prvky typu 16bitové slovo |
5 | PSRLD | logický posun doprava vektorů s prvky typu 32bitové slovo |
6 | PSRLQ | logický posun doprava 64bitové hodnoty |
7 | PSRAW | aritmetický posun doprava vektorů s prvky typu 16bitové slovo |
8 | PSRAD | aritmetický posun doprava vektorů s prvky typu 32bitové slovo |
2. První demonstrační příklad: logické posuny doleva
V dnešním prvním demonstračním příkladu je ukázáno použití MMX instrukcí, které provádí logické posuny doleva, což odpovídá násobení mocninou 2. Jak již víme, jedná se o instrukce nazvané PSLLW, PSLLD a PSLLQ. Všechny tři zmíněné instrukce použijeme pro posun prvků ve vektoru, který bude mít fyzicky totožný obsah (a lišit se tedy bude jen tím, jaký formát instrukce pro posuny zpracují):
mmx_val db 0, 1, 2, 0xff, 0x00, 0xff, 0xff, 0x00
Tento demonstrační příklad po svém překladu a spuštění nejprve vypíše obsah původního vektoru a posléze i výsledky všech tří typů logických posunů. Mezerami jsou naznačeny hranice mezi jednotlivými prvky vektorů; posun nikdy nepřesáhne přes hranice prvků. První hodnoty jsou vstupní, druhé pak zobrazují výsledky operace (ruční editace):
psllw: před posunem: 00FF FF00 FF02 0100 po posunu: 01FE FE00 FE04 0200 pslld: před posunem: 00FFFF00 FF020100 po posunu: 01FFFE00 FE040200 psllq: před posunem: 00FFFF00FF020100 po posunu: 01FFFE01FE040200
Následuje výpis zdrojového kódu tohoto příkladu:
[bits 32] %include "linux_macros.asm" ;----------------------------------------------------------------------------- section .data hex_message: times 8 db '?' db ' ' hex_message_length equ $ - hex_message psllw_message: db 0x0a, "psllw:", 0x0a psllw_message_length equ $ - psllw_message pslld_message: db 0x0a, "pslld:", 0x0a pslld_message_length equ $ - pslld_message psllq_message: db 0x0a, "psllq:", 0x0a psllq_message_length equ $ - psllq_message mmx_val db 0, 1, 2, 0xff, 0x00, 0xff, 0xff, 0x00 ;----------------------------------------------------------------------------- section .bss mmx_tmp resb 8 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: emms ; inicializace MMX mov ebx, mmx_val movq mm1, [ebx] ; nacteni prvni hodnoty do registru MM1 print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 movq mm2, mm1 ; zapamatovat si hodnotu pro další použití psllw mm1, 1 ; logicky posun doleva o jeden bit print_string psllw_message, psllw_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 movq mm1, mm2 ; obnovit hodnotu registru mm1 pslld mm1, 1 ; logicky posun doleva o jeden bit print_string pslld_message, pslld_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 movq mm1, mm2 ; obnovit hodnotu registru mm1 psllq mm1, 1 ; logicky posun doleva o jeden bit print_string psllq_message, psllq_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 exit ; ukonceni procesu %include "hex2string.asm"
3. Druhý demonstrační příklad: logické posuny doprava
Druhá sada MMX instrukcí nazvaných PSRLW, PSRLD a PSRLQ taktéž provádí logické posuny, tentokrát však doprava, což odpovídá dělení mocninou 2. Do nejvyšších bitů prvků vektorů se v tomto případě dosadí nuly. Tyto instrukce si ukážeme na vektoru, který má nastaveny jen vybrané nejnižší bity jednotlivých bajtů:
mmx_val db 0, 1, 1, 1, 1, 0, 0, 0
Výsledky by měly vypadat následovně:
psrlw: před posunem: 0000 0001 0101 0100 po posunu: 0000 0000 0080 0080 psrld: před posunem: 00000001 01010100 po posunu: 00000000 00808080 psrlq: před posunem: 0000000101010100 po posunu: 0000000080808080
Opět následuje úplný výpis zdrojového kódu tohoto demonstračního příkladu:
[bits 32] %include "linux_macros.asm" ;----------------------------------------------------------------------------- section .data hex_message: times 8 db '?' db ' ' hex_message_length equ $ - hex_message psrlw_message: db 0x0a, "psrlw:", 0x0a psrlw_message_length equ $ - psrlw_message psrld_message: db 0x0a, "psrld:", 0x0a psrld_message_length equ $ - psrld_message psrlq_message: db 0x0a, "psrlq:", 0x0a psrlq_message_length equ $ - psrlq_message mmx_val db 0, 1, 1, 1, 1, 0, 0, 0 ;----------------------------------------------------------------------------- section .bss mmx_tmp resb 8 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: emms ; inicializace MMX mov ebx, mmx_val movq mm1, [ebx] ; nacteni prvni hodnoty do registru MM1 print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 movq mm2, mm1 ; zapamatovat si hodnotu pro další použití psrlw mm1, 1 ; logicky posun doprava o jeden bit print_string psrlw_message, psrlw_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 movq mm1, mm2 ; obnovit hodnotu registru mm1 psrld mm1, 1 ; logicky posun doprava o jeden bit print_string psrld_message, psrld_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 movq mm1, mm2 ; obnovit hodnotu registru mm1 psrlq mm1, 1 ; logicky posun doprava o jeden bit print_string psrlq_message, psrlq_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 exit ; ukonceni procesu %include "hex2string.asm"
4. Třetí demonstrační příklad: aritmetické posuny doprava
A konečně se podívejme na praktické použití instrukcí PSRAW a PSRAD, které provádí aritmetický posun doprava. To znamená, že původní nejvyšší bit je zachován (jeho hodnota je zkopírována do nového nejvyššího bitu). To opět odpovídá dělení mocninou 2, ovšem pro hodnoty se znaménkem. Tento příklad je kratší, protože v MMX nemáme k dispozici funkci pro posun 64bitové hodnoty (ta byla přidána později).
Výsledky vypsané tímto demonstračním příkladem (po nepatrné ruční editaci):
psraw: před posunem: FF01 0000 FF01 0000 po posunu: FF80 0000 FF80 0000 psrad: před posunem: FF010000 FF010000 po posunu: FF808000 FF808000
Opět se podívejme na jeho úplný zdrojový kód:
[bits 32] %include "linux_macros.asm" ;----------------------------------------------------------------------------- section .data hex_message: times 8 db '?' db ' ' hex_message_length equ $ - hex_message psraw_message: db 0x0a, "psraw:", 0x0a psraw_message_length equ $ - psraw_message psrad_message: db 0x0a, "psrad:", 0x0a psrad_message_length equ $ - psrad_message mmx_val db 0, 0, 1, 0xff, 0, 0, 1, 0xff ;----------------------------------------------------------------------------- section .bss mmx_tmp resb 8 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: emms ; inicializace MMX mov ebx, mmx_val movq mm1, [ebx] ; nacteni prvni hodnoty do registru MM1 print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 movq mm2, mm1 ; zapamatovat si hodnotu pro další použití psraw mm1, 1 ; aritmeticky posun doprava o jeden bit print_string psraw_message, psraw_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 movq mm1, mm2 ; obnovit hodnotu registru mm1 psrad mm1, 1 ; aritmeticky posun doprava o jeden bit print_string psrad_message, psrad_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 exit ; ukonceni procesu %include "hex2string.asm"
5. Porovnání prvků vektorů
V instrukční sadě MMX nalezneme i šestici instrukcí určených pro porovnání prvků dvou vektorů. Porovnávat lze prvky typu bajt, slovo a dvojslovo, a to na relace „je rovno“ a „je větší než“. Testy na ostatní relace získáme snadno negací či spojením (AND/OR) dvou porovnání. Výsledkem porovnání je nový vektor, který obsahuje v daném místě (například sedmý prvek) buď samé nulové bity (relace naplatí) nebo naopak jedničkové bity (relace platí):
# | Instrukce | Stručný popis instrukce |
---|---|---|
1 | PCMPEQB | porovnání vektorů s prvky typu 8bitové slovo na relaci „je rovno“ |
2 | PCMPEQW | porovnání vektorů s prvky typu 16bitové slovo na relaci „je rovno“ |
3 | PCMPEQD | porovnání vektorů s prvky typu 32bitové slovo na relaci „je rovno“ |
4 | PCMPGTB | porovnání vektorů s prvky typu 8bitové slovo na relaci „větší než“ |
5 | PCMPGTW | porovnání vektorů s prvky typu 16bitové slovo na relaci „větší než“ |
6 | PCMPGTD | porovnání vektorů s prvky typu 32bitové slovo na relaci „větší než“ |
6. Čtvrtý demonstrační příklad: porovnání prvků na rovnost
V dnešním čtvrtém demonstračním příkladu je realizováno porovnání prvků dvou vektorů na rovnost. Vektory (resp. přesněji řečeno dvojice registrů MMX) je porovnávána postupně po bajtech, 16bitových slovech a 32bitových slovech. Výsledkem jsou hodnoty obsahující jedničkové bity u shodných prvků a nulové bity u prvků, které se od sebe liší. Podívejme se na výsledky porovnání:
pcmpeqb: první vektor: 03 02 01 00 03 02 01 00 druhý vektor: 09 02 09 00 09 02 01 00 porovnání: 00 FF 00 FF 00 FF FF FF pcmpeqw: první vektor: 0302 0100 0302 0100 druhý vektor: 0902 0900 0902 0100 porovnání: 0000 0000 0000 FFFF pcmpeqd: první vektor: 03020100 03020100 druhý vektor: 09020900 09020100 porovnání: 00000000 00000000
Výše uvedené výsledky byly spočteny a vypsány tímto příkladem:
[bits 32] %include "linux_macros.asm" ;----------------------------------------------------------------------------- section .data hex_message: times 8 db '?' db ' ' hex_message_length equ $ - hex_message pcmpeqb_message: db 0x0a, "pcmpeqb:", 0x0a pcmpeqb_message_length equ $ - pcmpeqb_message pcmpeqw_message: db 0x0a, "pcmpeqw:", 0x0a pcmpeqw_message_length equ $ - pcmpeqw_message pcmpeqd_message: db 0x0a, "pcmpeqd:", 0x0a pcmpeqd_message_length equ $ - pcmpeqd_message mmx_val_1 db 0, 1, 2, 3, 0, 1, 2, 3 mmx_val_2 db 0, 1, 2, 9, 0, 9, 2, 9 ;----------------------------------------------------------------------------- section .bss mmx_tmp resb 8 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: emms ; inicializace MMX mov ebx, mmx_val_1 movq mm1, [ebx] ; nacteni prvni hodnoty do registru MM1 print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 mov ebx, mmx_val_2 movq mm2, [ebx] ; nacteni druhe hodnoty do registru MM2 print_mmx_reg_as_hex mm2 ; tisk hodnoty registru MM2 movq mm3, mm1 ; zapamatovat si hodnotu pro další použití movq mm4, mm2 ; zapamatovat si hodnotu pro další použití pcmpeqb mm1, mm2 ; porovnani prvku vektoru na rovnost print_string pcmpeqb_message, pcmpeqb_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 movq mm1, mm3 ; obnovit hodnotu registru mm1 movq mm2, mm4 ; obnovit hodnotu registru mm2 pcmpeqw mm1, mm2 ; porovnani prvku vektoru na rovnost print_string pcmpeqw_message, pcmpeqw_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 movq mm1, mm3 ; obnovit hodnotu registru mm1 movq mm2, mm4 ; obnovit hodnotu registru mm2 pcmpeqd mm1, mm2 ; porovnani prvku vektoru na rovnost print_string pcmpeqd_message, pcmpeqd_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 exit ; ukonceni procesu %include "hex2string.asm"
7. Pátý demonstrační příklad: porovnání prvků na relaci „větší než“
Prozatím jsme si ukázali způsob porovnání prvků vektorů na relaci „je rovno“. Druhá sada MMX instrukcí dokáže provést porovnání na relaci „větší než“ (a zbylé čtyři možnosti získáme negacemi a operacemi AND/OR, které již známe). Podívejme se tedy na výsledky získané porovnáním dvojice vektorů instrukcemi PCMPGTB, PCMPGTW a PCMPGTD:
pcmpgtb: první vektor: 03 02 01 00 03 02 01 00 druhý vektor: 00 03 00 01 00 03 02 01 porovnání: FF 00 FF 00 FF 00 00 00 pcmpgtw: první vektor: 0302 0100 030 20100 druhý vektor: 0003 0001 000 30201 porovnání: FFFF FFFF FFF F0000 pcmpgtd: první vektor: 03020100 03020100 druhý vektor: 00030001 00030201 porovnání: FFFFFFFF FFFFFFFF
Tyto výsledky byly získány s využitím následujícího demonstračního příkladu:
[bits 32] %include "linux_macros.asm" ;----------------------------------------------------------------------------- section .data hex_message: times 8 db '?' db ' ' hex_message_length equ $ - hex_message pcmpgtb_message: db 0x0a, "pcmpgtb:", 0x0a pcmpgtb_message_length equ $ - pcmpgtb_message pcmpgtw_message: db 0x0a, "pcmpgtw:", 0x0a pcmpgtw_message_length equ $ - pcmpgtw_message pcmpgtd_message: db 0x0a, "pcmpgtd:", 0x0a pcmpgtd_message_length equ $ - pcmpgtd_message mmx_val_1 db 0, 1, 2, 3, 0, 1, 2, 3 mmx_val_2 db 1, 2, 3, 0, 1, 0, 3, 0 ;----------------------------------------------------------------------------- section .bss mmx_tmp resb 8 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: emms ; inicializace MMX mov ebx, mmx_val_1 movq mm1, [ebx] ; nacteni prvni hodnoty do registru MM1 print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 mov ebx, mmx_val_2 movq mm2, [ebx] ; nacteni druhe hodnoty do registru MM2 print_mmx_reg_as_hex mm2 ; tisk hodnoty registru MM2 movq mm3, mm1 ; zapamatovat si hodnotu pro další použití movq mm4, mm2 ; zapamatovat si hodnotu pro další použití pcmpgtb mm1, mm2 ; porovnani prvku vektoru na rovnost print_string pcmpgtb_message, pcmpgtb_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 movq mm1, mm3 ; obnovit hodnotu registru mm1 movq mm2, mm4 ; obnovit hodnotu registru mm2 pcmpgtw mm1, mm2 ; porovnani prvku vektoru na rovnost print_string pcmpgtw_message, pcmpgtw_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 movq mm1, mm3 ; obnovit hodnotu registru mm1 movq mm2, mm4 ; obnovit hodnotu registru mm2 pcmpgtd mm1, mm2 ; porovnani prvku vektoru na rovnost print_string pcmpgtd_message, pcmpgtd_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 exit ; ukonceni procesu %include "hex2string.asm"
8. Transformace mezi různými typy vektorů
V instrukční sadě MMX nalezneme i devět instrukcí, které slouží pro „zabalení“ či naopak „rozbalení“ prvků vektorů. Ty se používají například tehdy, pokud se zpracovávají multimediální data s rozdílným způsobem proložení hodnot v datovém toku (streamu).
Operace zabalení pracují tak, že na vstupu jsou dva vektory s prvky určité velikosti (16bitů, 32bitů) a tyto prvky jsou zkonvertovány do bajtů, popř. 16bitových slov. Těchto nových prvků je sice dvojnásobné množství (na vstupu jsou dva vektory), ale s poloviční bitovou šířkou, takže se všechny vejdou do cílového vektoru. Při snižování počtu bitů (tedy rozsahu) se používá aritmetika se saturací, a to buď se znaménkovou saturací (hodnoty –128 až 127, pro 16bitový rozsah pak –32768 až 32767) nebo se saturací bez znaménka (hodnoty 0 až 255, pro 16bitový rozsah pak 0 až 65535).
Naopak operace rozbalení mají na vstupu dvojici vektorů s prvky šířky 8 bitů, 16 bitů nebo 32 bitů. Polovina těchto prvků (vyšší či nižší) je spojena s prvky z druhého vektoru na prvky s vyšší bitovou šířkou (16 bitů, 32 bitů či 64 bitů), tedy tak, jakoby jeden z vektorů obsahovat vyšší bity prvků a druhý naopak prvky nižší (alternativně se na tyto operace můžeme dívat jako na proložení dvou vektorů – interleave). Podrobnosti si ukážeme na demonstračních příkladech, z nichž bude funkce těchto instrukcí patrná.
# | Instrukce | Stručný popis instrukce |
---|---|---|
1 | PACKSSWB | „zabalení“ slov do bajtů se saturací (se znaménkem) |
2 | PACKUSWB | „zabalení“ slov do bajtů se saturací (bez znaménka) |
3 | PACKSSDW | „zabalení“ dvojslov do slov se saturací (se znaménkem) |
4 | PUNPCKLBW | „rozbalení“ nižších bajtů do slov |
5 | PUNPCKHBW | „rozbalení“ vyšších bajtů do slov |
6 | PUNPCKLWD | „rozbalení“ nižších slov do dvojslov |
7 | PUNPCKHWD | „rozbalení“ vyšších slov do dvojslov |
8 | PUNPCKLDQ | „rozbalení“ nižších dvojslov do dvojice 64bitových skalárů |
9 | PUNPCKHDQ | „rozbalení“ vyšších dvojslov do dvojice 64bitových skalárů |
9. Šestý demonstrační příklad: rozbalení bajtů z vektorů
Podívejme se nejprve na instrukci PUNPCKLBW, která zpracovává vektory bajtů. Z každého vektoru získá spodní čtyři bajty a ty následně proloží do výsledného vektoru:
77 66 55 44 33 22 11 00 FF EE DD CC BB AA 99 88 .. .. .. .. 33 22 11 00 .. .. .. .. BB AA 99 88 punpcklbw: BB 33 AA 22 99 11 88 00
Instrukce PUNPCKHBW pracuje podobným způsobem, ale používá vyšší bajty, nikoli bajty nižší:
77 66 55 44 33 22 11 00 FF EE DD CC BB AA 99 88 77 66 55 44 .. .. .. .. FF EE DD CC .. .. .. .. punpckhbw: FF 77 EE 66 DD 55 CC 44
Tyto výsledky byly získány následujícím demonstračním příkladem:
[bits 32] %include "linux_macros.asm" ;----------------------------------------------------------------------------- section .data hex_message: times 8 db '?' db ' ' hex_message_length equ $ - hex_message punpcklbw_message: db 0x0a, "punpcklbw:", 0x0a punpcklbw_message_length equ $ - punpcklbw_message punpckhbw_message: db 0x0a, "punpckhbw:", 0x0a punpckhbw_message_length equ $ - punpckhbw_message mmx_val_1 db 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 mmx_val_2 db 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff ;----------------------------------------------------------------------------- section .bss mmx_tmp resb 8 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: emms ; inicializace MMX mov ebx, mmx_val_1 movq mm1, [ebx] ; nacteni prvni hodnoty do registru MM1 print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 mov ebx, mmx_val_2 movq mm2, [ebx] ; nacteni druhe hodnoty do registru MM2 print_mmx_reg_as_hex mm2 ; tisk hodnoty registru MM2 movq mm3, mm1 ; zapamatovat si hodnotu pro další použití movq mm4, mm2 ; zapamatovat si hodnotu pro další použití punpcklbw mm1, mm2 ; zkombinovani obsahu dvou vektoru print_string punpcklbw_message, punpcklbw_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 movq mm1, mm3 ; obnovit hodnotu registru mm1 movq mm2, mm4 ; obnovit hodnotu registru mm2 punpckhbw mm1, mm2 ; zkombinovani obsahu dvou vektoru print_string punpckhbw_message, punpckhbw_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 exit ; ukonceni procesu %include "hex2string.asm"
10. Sedmý demonstrační příklad: rozbalení slov z vektorů
Instrukce PUNPCKLWD a PUNPCKHWD pracují podobně, jako výše ukázané instrukce PUNPCKLBW a PUNPCKHBW, ovšem namísto vektorů bajtů pracují s vektory 16bitových slov. Ukažme si nejdříve výsledné efekty obou instrukcí:
3333 2222 1111 0000 7777 6666 5555 4444 .... .... 1111 0000 .... .... 5555 4444 punpcklwd: 5555 1111 4444 0000
a:
3333 2222 1111 0000 7777 6666 5555 4444 3333 2222 .... .... 7777 6666 .... .... punpckhwd: 7777 3333 6666 2222
Tyto výsledky byly získány následujícím demonstračním příkladem:
[bits 32] %include "linux_macros.asm" ;----------------------------------------------------------------------------- section .data hex_message: times 8 db '?' db ' ' hex_message_length equ $ - hex_message punpcklwd_message: db 0x0a, "punpcklwd:", 0x0a punpcklwd_message_length equ $ - punpcklwd_message punpckhwd_message: db 0x0a, "punpckhwd:", 0x0a punpckhwd_message_length equ $ - punpckhwd_message mmx_val_1 dw 0x0000, 0x1111, 0x2222, 0x3333 mmx_val_2 dw 0x4444, 0x5555, 0x6666, 0x7777 ;----------------------------------------------------------------------------- section .bss mmx_tmp resb 8 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: emms ; inicializace MMX mov ebx, mmx_val_1 movq mm1, [ebx] ; nacteni prvni hodnoty do registru MM1 print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 mov ebx, mmx_val_2 movq mm2, [ebx] ; nacteni druhe hodnoty do registru MM2 print_mmx_reg_as_hex mm2 ; tisk hodnoty registru MM2 movq mm3, mm1 ; zapamatovat si hodnotu pro další použití movq mm4, mm2 ; zapamatovat si hodnotu pro další použití punpcklwd mm1, mm2 ; zkombinovani obsahu dvou vektoru print_string punpcklwd_message, punpcklwd_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 movq mm1, mm3 ; obnovit hodnotu registru mm1 movq mm2, mm4 ; obnovit hodnotu registru mm2 punpckhwd mm1, mm2 ; zkombinovani obsahu dvou vektoru print_string punpckhwd_message, punpckhwd_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 exit ; ukonceni procesu %include "hex2string.asm"
11. Osmý demonstrační příklad: rozbalení dvojslov z vektorů
A konečně si ukažme použití dvojice instrukcí PUNPCKLDQ a PUNPCKHDQ. Tyto instrukce kombinují prvky typu dvojslovo (32 bitů) z dvojice vektorů a vytvoří jedinou 64bitovou skalární hodnotu. První z těchto instrukcí zpracovává spodní dvojslova vektorů, druhá pak horní dvojslova:
11111111 00000000 33333333 22222222 punpckldq: 22222222 00000000 punpckhdq: 33333333 11111111
A opět si ukažme, jak vypadá zdrojový kód příkladu, který tyto hodnoty spočetl a vypsal:
[bits 32] %include "linux_macros.asm" ;----------------------------------------------------------------------------- section .data hex_message: times 8 db '?' db ' ' hex_message_length equ $ - hex_message punpckldq_message: db 0x0a, "punpckldq:", 0x0a punpckldq_message_length equ $ - punpckldq_message punpckhdq_message: db 0x0a, "punpckhdq:", 0x0a punpckhdq_message_length equ $ - punpckhdq_message mmx_val_1 dd 0x00000000, 0x11111111 mmx_val_2 dd 0x22222222, 0x33333333 ;----------------------------------------------------------------------------- section .bss mmx_tmp resb 8 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: emms ; inicializace MMX mov ebx, mmx_val_1 movq mm1, [ebx] ; nacteni prvni hodnoty do registru MM1 print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 mov ebx, mmx_val_2 movq mm2, [ebx] ; nacteni druhe hodnoty do registru MM2 print_mmx_reg_as_hex mm2 ; tisk hodnoty registru MM2 movq mm3, mm1 ; zapamatovat si hodnotu pro další použití movq mm4, mm2 ; zapamatovat si hodnotu pro další použití punpckldq mm1, mm2 ; zkombinovani obsahu dvou vektoru print_string punpckldq_message, punpckldq_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 movq mm1, mm3 ; obnovit hodnotu registru mm1 movq mm2, mm4 ; obnovit hodnotu registru mm2 punpckhdq mm1, mm2 ; zkombinovani obsahu dvou vektoru print_string punpckhdq_message, punpckhdq_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 exit ; ukonceni procesu %include "hex2string.asm"
12. Devátý demonstrační příklad: zabalení vektorů slov do vektoru bajtů
V dnešním předposledním demonstračním příkladu je ukázána instrukce PACKSSWB, která z dvojice vektorů obsahujících 16bitová slova vytvoří jediný vektor s osmibitovými prvky. Budeme přitom konvertovat prvky, které jsou sice uloženy v šestnácti bitech, ale jejich hodnoty nepřesáhnou 127 a tudíž nebude docházet k saturaci. Oba vstupní vektory i vypočtený výstupní vektor vypadají následovně:
0033 0022 0011 0000 0077 0066 0055 0044 packsswb: 77 66 55 44 33 22 11 00
Tento výpočet byl proveden následujícím příkladem:
[bits 32] %include "linux_macros.asm" ;----------------------------------------------------------------------------- section .data hex_message: times 8 db '?' db ' ' hex_message_length equ $ - hex_message packswb_message: db 0x0a, "packsswb:", 0x0a packswb_message_length equ $ - packswb_message mmx_val_1 dw 0x00, 0x11, 0x22, 0x33 mmx_val_2 dw 0x44, 0x55, 0x66, 0x77 ;----------------------------------------------------------------------------- section .bss mmx_tmp resb 8 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: emms ; inicializace MMX mov ebx, mmx_val_1 movq mm1, [ebx] ; nacteni prvni hodnoty do registru MM1 print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 mov ebx, mmx_val_2 movq mm2, [ebx] ; nacteni druhe hodnoty do registru MM2 print_mmx_reg_as_hex mm2 ; tisk hodnoty registru MM2 packsswb mm1, mm2 ; zkombinovani obsahu dvou vektoru print_string packswb_message, packswb_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 exit ; ukonceni procesu %include "hex2string.asm"
13. Desátý demonstrační příklad: řešení přetečení při zabalování vektorů
Zajímavé bude zjistit, jak se totožná instrukce PACKSSWB bude chovat ve chvíli, kdy vstupní vektory obsahují hodnoty větší než 127. V takovém případě by se totiž měla projevit saturace – vyšší či nižší hodnoty nikdy nepřesáhnou rozsah –128 až 127 (127 odpovídá 0×7F). To si snadno ověříme:
0300 0200 0100 0000 0700 0600 0500 0400 packsswb: 7F 7F 7F 7F 7F 7F 7F 00
Zdrojový kód dnešního posledního demonstračního příkladu vypadá následovně:
[bits 32] %include "linux_macros.asm" ;----------------------------------------------------------------------------- section .data hex_message: times 8 db '?' db ' ' hex_message_length equ $ - hex_message packswb_message: db 0x0a, "packsswb:", 0x0a packswb_message_length equ $ - packswb_message mmx_val_1 dw 0x0000, 0x0100, 0x0200, 0x0300 mmx_val_2 dw 0x0400, 0x0500, 0x0600, 0x0700 ;----------------------------------------------------------------------------- section .bss mmx_tmp resb 8 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: emms ; inicializace MMX mov ebx, mmx_val_1 movq mm1, [ebx] ; nacteni prvni hodnoty do registru MM1 print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 mov ebx, mmx_val_2 movq mm2, [ebx] ; nacteni druhe hodnoty do registru MM2 print_mmx_reg_as_hex mm2 ; tisk hodnoty registru MM2 packsswb mm1, mm2 ; zkombinovani obsahu dvou vektoru print_string packswb_message, packswb_message_length print_mmx_reg_as_hex mm1 ; tisk hodnoty registru MM1 exit ; ukonceni procesu %include "hex2string.asm"
14. Instrukční sada MMX: shrnutí
V tomto seriálu jsme si popsali a ukázali prakticky všechny instrukce MMX. Tato instrukční sada znamenala v době svého uvedení poměrně zásadní vylepšení celé platformy 80×86, a to zejména v multimediální oblasti (zvuky, grafika, video), popř. v oblasti zpracování signálů (softwarové modemy, o nichž se diskutovalo pod předchozími články). Zavedení MMX navíc nevyžadovalo zásadní zásahy do operačních systémů ani aplikací, protože se vlastně znovupoužily registry matematického koprocesoru. A navíc dokázala jednotka MMX pracovat z velké části nezávisle na hlavním CPU – a to dokonce do takové míry, že MMX instrukce nedokázaly pracovat ani s pracovními registry CPU, ale ani s příznakovým registrem (což některé operace naopak komplikovalo).
S postupným nasazováním platformy 80×86 do oblastí, v nichž se dříve používaly (grafické) pracovní stanice, ovšem znamenalo i potřebu urychlení operací s hodnotami uloženými v systému plovoucí řádové čárky. Zde MMX nebyla vůbec užitečná; spíše naopak, protože koexistence výpočtů s MMX a FPU vyžadovala přepínání a inicializace obou subsystémů. Částečné řešení přinesla teprve instrukční sada 3DNow!, o níž se krátce zmíníme níže. Ovšem zásadně se situace změnila s příchodem technologie SSE (Streaming SIMD Extensions), které se budeme věnovat příště. Právě tato technologie totiž rozšířila šířky vektorových registrů na 128 bitů, doplnila chybějící celočíselné instrukce a zavedla operace pro provádění operací s hodnotami typu single (jednoduchá přesnost). Právě technologií SSE (prozatím bez uvedení rozlišující verze) se budeme zabývat v navazujícím článku.
15. Seznam všech popsaných instrukcí MMX
Všechny popsané MMX instrukce jsou shrnuty v následující tabulce:
# | Instrukce | Stručný popis instrukce |
---|---|---|
1 | EMMS | inicializace subsystému MMX |
2 | MOVQ | přesun 64bitového vektoru z paměti do registru MMX či naopak |
3 | PADDB | součet dvou osmiprvkových vektorů, každý prvek má šířku osmi bitů |
4 | PADDW | součet dvou čtyřprvkových vektorů, každý prvek má šířku šestnácti bitů |
5 | PADDD | součet dvou dvouprvkových vektorů, každý prvek má šířku 32 bitů |
6 | PADDQ | součet dvou 64bitových celých čísel |
7 | PADDSB | součet dvou osmiprvkových vektorů se saturací, každý prvek má šířku osmi bitů se znaménkem |
8 | PADDUSB | součet dvou osmiprvkových vektorů se saturací, každý prvek má šířku osmi bitů bez znaménka |
9 | PADDSW | součet dvou čtyřprvkových vektorů se saturací, každý prvek má šířku šestnácti bitů se znaménkem |
10 | PADDUSW | součet dvou čtyřprvkových vektorů se saturací, každý prvek má šířku šestnácti bitů bez znaménka |
11 | PSUBB | rozdíl dvou osmiprvkových vektorů, každý prvek má šířku osmi bitů |
12 | PSUBW | rozdíl dvou čtyřprvkových vektorů, každý prvek má šířku šestnácti bitů |
13 | PSUBD | rozdíl dvou dvouprvkových vektorů, každý prvek má šířku 32 bitů |
14 | PSUBSB | rozdíl dvou osmiprvkových vektorů se saturací, každý prvek má šířku osmi bitů se znaménkem |
15 | PSUBUSB | rozdíl dvou osmiprvkových vektorů se saturací, každý prvek má šířku osmi bitů bez znaménka |
16 | PSUBSW | rozdíl dvou čtyřprvkových vektorů se saturací, každý prvek má šířku šestnácti bitů se znaménkem |
17 | PSUBUSW | rozdíl dvou čtyřprvkových vektorů se saturací, každý prvek má šířku šestnácti bitů bez znaménka |
18 | PMULLW | součin dvou čtyřprvkových vektorů, každý prvek má šířku šestnácti bitů, uloží se spodních 16 bitů výsledků |
19 | PMULHW | součin dvou čtyřprvkových vektorů, každý prvek má šířku šestnácti bitů, uloží se horních 16 bitů výsledků |
20 | PMADDWD | kombinace součinu prvků vektorů se součtem mezivýsledků |
21 | PAND | logická operace AND s 64bitovými hodnotami |
22 | POR | logická operace OR s 64bitovými hodnotami |
23 | PXOR | logická operace XOR s 64bitovými hodnotami |
24 | PANDN | logická operace AND NOT s 64bitovými hodnotami |
25 | PSLLW | logický posun doleva vektorů s prvky typu 16bitové slovo |
26 | PSLLD | logický posun doleva vektorů s prvky typu 32bitové slovo |
27 | PSLLQ | logický posun doleva 64bitové hodnoty |
28 | PSRLW | logický posun doprava vektorů s prvky typu 16bitové slovo |
29 | PSRLD | logický posun doprava vektorů s prvky typu 32bitové slovo |
30 | PSRLQ | logický posun doprava 64bitové hodnoty |
31 | PSRAW | aritmetický posun doprava vektorů s prvky typu 16bitové slovo |
32 | PSRAD | aritmetický posun doprava vektorů s prvky typu 32bitové slovo |
33 | PCMPEQB | porovnání vektorů s prvky typu 8bitové slovo na relaci „je rovno“ |
34 | PCMPEQW | porovnání vektorů s prvky typu 16bitové slovo na relaci „je rovno“ |
35 | PCMPEQD | porovnání vektorů s prvky typu 32bitové slovo na relaci „je rovno“ |
36 | PCMPGTB | porovnání vektorů s prvky typu 8bitové slovo na relaci „větší než“ |
37 | PCMPGTW | porovnání vektorů s prvky typu 16bitové slovo na relaci „větší než“ |
38 | PCMPGTD | porovnání vektorů s prvky typu 32bitové slovo na relaci „větší než“ |
39 | PACKSSWB | „zabalení“ slov do bajtů se saturací (se znaménkem) |
40 | PACKUSWB | „zabalení“ slov do bajtů se saturací (bez znaménka) |
41 | PACKSSDW | „zabalení“ dvojslov do slov se saturací (se znaménkem) |
42 | PUNPCKLBW | „rozbalení“ nižších bajtů do slov |
43 | PUNPCKHBW | „rozbalení“ vyšších bajtů do slov |
44 | PUNPCKLWD | „rozbalení“ nižších slov do dvojslov |
45 | PUNPCKHWD | „rozbalení“ vyšších slov do dvojslov |
46 | PUNPCKLDQ | „rozbalení“ nižších dvojslov do dvojice 64bitových skalárů |
47 | PUNPCKHDQ | „rozbalení“ vyšších dvojslov do dvojice 64bitových skalárů |
16. Instrukční sada 3DNow! aneb odpověď firmy AMD na instrukční sadu MMX
Rozšíření instrukční sady procesorů z rodiny x86 o instrukce MMX bylo v době jejího uvedení poměrně razantní – jednalo se v podstatě o největší změnu této architektury od vzniku procesoru 80386, tj. od zavedení virtuálního režimu, 32bitových registrů a plnohodnotných operací s 32 bitovými hodnotami. Z hlediska společnosti Intel se samozřejmě jednalo o nemalou konkurenční výhodu získanou nad firmami AMD, Cyrix či IDT, zejména poté, co se podpora MMX operací zařadila do některých programových produktů (například do zásuvných modulů Photoshopu, ale například i do přehrávačů MP3, ovladačů SW modemů atd.). Ovšem tehdejší druhý největší výrobce čipů x86 – společnost AMD – o necelé dva roky později představila vlastní rozšíření instrukční sady, které bylo označeno poměrně nabubřelým názvem 3DNow! (včetně onoho vykřičníku na konci). Toto rozšíření instrukční sady bylo poprvé implementováno v mikroprocesoru AMD K6–2 a později též v AMD K6–3 a Athlon.

Obrázek 1: Mikroprocesor AMD K6–2 implementující mj. i instrukční sadu 3DNow!
Inženýři z firmy AMD použili a současně i rozšířili instrukční sadu MMX o několik nových celočíselných instrukcí, ovšem hlavní konkurenční výhodou (a to poměrně podstatnou) byly nové instrukce pro práci s čísly reprezentovanými 32bitovými hodnotami s plovoucí řádovou čárkou. Kromě toho bylo do instrukční sady 3DNow! přidáno několik operací sloužících pro přečtení bloku dat do vyrovnávací paměti (cache). U některých typů procesorů (Athlon) bylo navíc možné určit, zda je blok dat načtených do vyrovnávací paměti určený pro čtení nebo i pro zápis (pokud se jednalo o blok určený pro zápis, byl mu nastaven atribut modified).

Obrázek 2: Další pohled na mikroprocesor AMD K6–2 s implementací instrukční sady 3DNow!.
17. Datové typy instrukcí 3DNow!
Již v předchozí kapitole jsme se zmínili o tom, že instrukční sada 3DNow! byla vlastně v první řadě rozšířením instrukční sady MMX. To mj. znamená, že byly podporovány všechny datové typy MMX, tj. osmiprvkové vektory s osmibitovými hodnotami, čtyřprvkové vektory se 16bitovými hodnotami, dvouprvkové vektory s 32bitovými hodnotami a konečně i 64bitové skalární hodnoty.
Navíc však bylo možné – a do jisté míry přelomové – do 64bitových registrů MMX uložit dvojici 32bitových čísel s plovoucí řádovou čárkou odpovídající formátu single precision definovaném v normě IEEE 754. Zavedení tohoto nového typu dvouprvkového vektoru s sebou přinášelo dvě výhody: mnohé FP operace se mohly provádět paralelně (součet prvků vektorů atd.) a navíc bylo velmi snadné kombinovat původní celočíselné MMX operace s operacemi nad reálnými čísly. To nebylo u původní implementace MMX snadné, protože se muselo provádět přepínání mezi činností matematického koprocesoru a jednotkou MMX.

Obrázek 3: Mikroprocesor Intel Atom sice implementuje instrukční sadu MMX, ale nikoli 3Dnow!, což je ovšem kompenzováno podporou SSE a SSE2.
V případě instrukční sady 3DNow! se toto přepínání provádět nemuselo (pokud tedy nebylo nutné pracovat s hodnotami s dvojitou či rozšířenou přesností, tj. s datovými typy double a extended), navíc měli programátoři k dispozici konverzní instrukce PI2FD a PF2ID pro převod celočíselných 32bitových hodnot na hodnoty s plovoucí řádovou čárkou (se zaokrouhlením) a naopak. Mimochodem: pro přepnutí kontextu mezi FPU operacemi a MMX/3DNow! operacemi bylo možné použít instrukci FEMMS pro rychlé přepnutí kontextu. Tato operace je rychlejší, než původní instrukce EMMS ze sady MMX (tu jsme použili), ovšem po přepnutí je obsah pracovních registrů nedefinovaný (což většinou nevadí).

Obrázek 4: Uložení dvou 32bitových čísel s plovoucí řádovou čárkou v 64bitovém registru.
(Zdroj: 3Dnow! Technology Manual, AMD Inc.)
18. Vektorové instrukce definované v rozšíření 3DNow!
Všechny vektorové instrukce provádějící operace s 32bitovými numerickými hodnotami s plovoucí řádovou čárkou, které jsou implementovány v instrukční sadě 3DNow!, jsou vypsány v následující tabulce:
# | Instrukce | Popis |
---|---|---|
1 | PI2FD | převod 32bitových celočíselných hodnot na FP hodnoty |
2 | PF2ID | převod 32bitových FP hodnot na celočíselné hodnoty |
3 | PFCMPGE | porovnání na relaci „větší nebo rovno“ |
4 | PFCMPGT | porovnání na relaci „větší než“ |
5 | PFCMPEQ | porovnání na relaci „rovnost“ |
6 | PFACC | součet obou prvků zdrojového registru i obou prvků cílového registru |
7 | PFADD | součet dvou dvouprvkových vektorů |
8 | PFSUB | rozdíl dvou dvouprvkových vektorů |
9 | PFSUBR | rozdíl dvou dvouprvkových vektorů s prohozením operandů |
10 | PFMIN | výpočet minima (vždy mezi příslušnými prvky vektorů) |
11 | PFMAX | výpočet maxima (vždy mezi příslušnými prvky vektorů) |
12 | PFMUL | součin dvou dvouprvkových vektorů |
13 | PFRCP | výpočet aproximace převrácené hodnoty |
14 | PFRSQRT | výpočet aproximace druhé odmocniny |
15 | PFRCPIT1 | první krok přesného výpočtu převrácené hodnoty |
16 | PFRSQIT1 | první krok přesného výpočtu druhé odmocniny |
17 | PFRCPIT2 | další krok výpočtu převrácené hodnoty či druhé odmocniny |

Obrázek 5: Formát 32bitových čísel s plovoucí řádovou čárkou podporovaný instrukcemi 3Dnow!)
(Zdroj: 3Dnow! Technology Manual, AMD Inc.)
Při provádění porovnání prvků dvou vektorů, tj. při provádění instrukcí PFCMPGE, PFCMPGT a PFCMPEQ, je výsledkem této operace nový dvouprvkový vektor obsahující pouze hodnoty 0×0000_0000 a 0×FFFF_FFFF. U porovnávání se navíc nerozlišuje kladná a záporná nula.
Pravděpodobně nejzajímavější je poslední pětice instrukcí PFRCP, PFRSQRT, PFRCPIT1, PFRSQIT1 a PFRCPIT2. Instrukce PFRCP slouží k rychlému výpočtu převrácené hodnoty, ovšem pouze s přesností na 14 bitů. Pokud tato přesnost není dostatečná (pro mnoho účelů však stačí), musí být použita následující sekvence:
PFRCP ; první přiblížení k výsledku s přesností 14 bitů PFCPIT1 ; první krok přesného výpočtu převrácené hodnoty PFRCPIT2 ; druhý krok přesného výpočtu převrácené hodnoty
Důležité je, že první přiblížení se k výsledku je provedeno velmi rychle, konkrétně pouze ve dvou taktech, protože se využívá tabulky výsledků umístěné v paměti ROM. Teprve další dvojice instrukcí využívá pomalejší iterační výpočet. Podobný princip platí i pro rychlý vs. přesný výpočet druhé odmocniny (a opět – mnohdy nám postačuje jen první přiblížení, nikoli přesný výsledek).

Obrázek 6: Subrutina pro operaci dělení s 24 bitovou přesností implementovanou pomocí instrukcí 3Dnow!.
(Zdroj: 3Dnow! Technology Manual, AMD Inc.)
19. Repositář s demonstračními příklady
Demonstrační příklady napsané v assembleru, které jsou určené pro překlad s využitím assembleru NASM, byly uloženy do Git repositáře, který je dostupný na adrese https://github.com/tisnik/8bit-fame. Jednotlivé demonstrační příklady si můžete v případě potřeby stáhnout i jednotlivě bez nutnosti klonovat celý (dnes již poměrně rozsáhlý) repositář:
# | Příklad | Stručný popis | Adresa |
---|---|---|---|
1 | hello.asm | program typu „Hello world“ naprogramovaný v assembleru pro systém DOS | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello.asm |
2 | hello_shorter.asm | kratší varianta výskoku z procesu zpět do DOSu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_shorter.asm |
3 | hello_wait.asm | čekání na stisk klávesy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_wait.asm |
4 | hello_macros.asm | realizace jednotlivých částí programu makrem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_macros.asm |
5 | gfx4_putpixel.asm | vykreslení pixelu v grafickém režimu 4 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_putpixel.asm |
6 | gfx6_putpixel.asm | vykreslení pixelu v grafickém režimu 6 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel.asm |
7 | gfx4_line.asm | vykreslení úsečky v grafickém režimu 4 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_line.asm |
8 | gfx6_line.asm | vykreslení úsečky v grafickém režimu 6 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_line.asm |
9 | gfx6_fill1.asm | vyplnění obrazovky v grafickém režimu, základní varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill1.asm |
10 | gfx6_fill2.asm | vyplnění obrazovky v grafickém režimu, varianta s instrukcí LOOP | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill2.asm |
11 | gfx6_fill3.asm | vyplnění obrazovky instrukcí REP STOSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill3.asm |
12 | gfx6_fill4.asm | vyplnění obrazovky, synchronizace vykreslování s paprskem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill4.asm |
13 | gfx4_image1.asm | vykreslení rastrového obrázku získaného z binárních dat, základní varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image1.asm |
14 | gfx4_image2.asm | varianta vykreslení rastrového obrázku s využitím instrukce REP MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image2.asm |
15 | gfx4_image3.asm | varianta vykreslení rastrového obrázku s využitím instrukce REP MOVSW | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image3.asm |
16 | gfx4_image4.asm | korektní vykreslení všech sudých řádků bitmapy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image4.asm |
17 | gfx4_image5.asm | korektní vykreslení všech sudých i lichých řádků bitmapy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image5.asm |
18 | gfx4_image6.asm | nastavení barvové palety před vykreslením obrázku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image6.asm |
19 | gfx4_image7.asm | nastavení barvové palety před vykreslením obrázku, snížená intenzita barev | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image7.asm |
20 | gfx4_image8.asm | postupná změna barvy pozadí | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image8.asm |
21 | gfx6_putpixel1.asm | vykreslení pixelu, základní varianta se 16bitovým násobením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel1.asm |
22 | gfx6_putpixel2.asm | vykreslení pixelu, varianta s osmibitovým násobením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel2.asm |
23 | gfx6_putpixel3.asm | vykreslení pixelu, varianta bez násobení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel3.asm |
24 | gfx6_putpixel4.asm | vykreslení pixelu přes obrázek, nekorektní chování (přepis obrázku) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel4.asm |
25 | gfx6_putpixel5.asm | vykreslení pixelu přes obrázek, korektní varianta pro bílé pixely | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel5.asm |
26 | cga_text_mode1.asm | standardní textový režim s rozlišením 40×25 znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode1.asm |
27 | cga_text_mode3.asm | standardní textový režim s rozlišením 80×25 znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode3.asm |
28 | cga_text_mode_intensity.asm | změna významu nejvyššího bitu atributového bajtu: vyšší intenzita namísto blikání | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_intensity.asm |
29 | cga_text_mode_cursor.asm | změna tvaru textového kurzoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_cursor.asm |
30 | cga_text_gfx1.asm | zobrazení „rastrové mřížky“: pseudografický režim 160×25 pixelů (interně textový režim) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_gfx1.asm |
31 | cga_text_mode_char_height.asm | změna výšky znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_char_height.asm |
32 | cga_text_160×100.asm | grafický režim 160×100 se šestnácti barvami (interně upravený textový režim) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_160×100.asm |
33 | hercules_text_mode1.asm | využití standardního textového režimu společně s kartou Hercules | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_text_mode1.asm |
34 | hercules_text_mode2.asm | zákaz blikání v textových režimech | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_text_mode2.asm |
35 | hercules_turn_off.asm | vypnutí generování video signálu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_turn_off.asm |
36 | hercules_gfx_mode1.asm | přepnutí karty Hercules do grafického režimu (základní varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_gfx_mode1.asm |
37 | hercules_gfx_mode2.asm | přepnutí karty Hercules do grafického režimu (vylepšená varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_gfx_mode2.asm |
38 | hercules_putpixel.asm | subrutina pro vykreslení jediného pixelu na kartě Hercules | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_putpixel.asm |
39 | ega_text_mode_80×25.asm | standardní textový režim 80×25 znaků na kartě EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_text_mode_80×25.asm |
40 | ega_text_mode_80×43.asm | zobrazení 43 textových řádků na kartě EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_text_mode_80×43.asm |
41 | ega_gfx_mode_320×200.asm | přepnutí do grafického režimu 320×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_320×200.asm |
42 | ega_gfx_mode_640×200.asm | přepnutí do grafického režimu 640×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_640×200.asm |
43 | ega_gfx_mode_640×350.asm | přepnutí do grafického režimu 640×350 pixelů se čtyřmi nebo šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_640×350.asm |
44 | ega_gfx_mode_bitplanes1.asm | ovládání zápisu do bitových rovin v planárních grafických režimech (základní způsob) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_bitplanes1.asm |
45 | ega_gfx_mode_bitplanes2.asm | ovládání zápisu do bitových rovin v planárních grafických režimech (rychlejší způsob) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_bitplanes2.asm |
46 | ega_320×200_putpixel.asm | vykreslení pixelu v grafickém režimu 320×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_320×200_putpixel.asm |
47 | ega_640×350_putpixel.asm | vykreslení pixelu v grafickém režimu 640×350 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_640×350_putpixel.asm |
48 | ega_standard_font.asm | použití standardního fontu grafické karty EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_standard_font.asm |
49 | ega_custom_font.asm | načtení vlastního fontu s jeho zobrazením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_custom_font.asm |
50 | ega_palette1.asm | změna barvové palety (všech 16 barev) v grafickém režimu 320×200 se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette1.asm |
51 | ega_palette2.asm | změna barvové palety (všech 16 barev) v grafickém režimu 640×350 se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette2.asm |
52 | ega_palette3.asm | změna všech barev v barvové paletě s využitím programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette3.asm |
53 | ega_palette4.asm | změna všech barev, včetně barvy okraje, v barvové paletě voláním funkce BIOSu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette4.asm |
54 | vga_text_mode_80×25.asm | standardní textový režim 80×25 znaků na kartě VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_80×25.asm |
55 | vga_text_mode_80×50.asm | zobrazení 50 a taktéž 28 textových řádků na kartě VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_80×50.asm |
56 | vga_text_mode_intensity1.asm | změna chování atributového bitu pro blikání (nebezpečná varianta změny registrů) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_intensity1.asm |
57 | vga_text_mode_intensity2.asm | změna chování atributového bitu pro blikání (bezpečnější varianta změny registrů) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_intensity2.asm |
58 | vga_text_mode_9th_column.asm | modifikace způsobu zobrazení devátého sloupce ve znakových režimech (720 pixelů na řádku) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_9th_column.asm |
59 | vga_text_mode_cursor_shape.asm | změna tvaru textového kurzoru na grafické kartě VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_cursor_shape.asm |
60 | vga_text_mode_custom_font.asm | načtení vlastního fontu s jeho zobrazením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_custom_font.asm |
61 | vga_gfx_mode_640×480.asm | přepnutí do grafického režimu 640×480 pixelů se šestnácti barvami, vykreslení vzorků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_640×480.asm |
62 | vga_gfx_mode_320×200.asm | přepnutí do grafického režimu 320×200 pixelů s 256 barvami, vykreslení vzorků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_320×200.asm |
63 | vga_gfx_mode_palette.asm | změna všech barev v barvové paletě grafické karty VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_palette.asm |
64 | vga_gfx_mode_dac1.asm | využití DAC (neočekávané výsledky) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac1.asm |
65 | vga_gfx_mode_dac2.asm | využití DAC (očekávané výsledky) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac2.asm |
66 | vga_640×480_putpixel.asm | realizace algoritmu pro vykreslení pixelu v grafickém režimu 640×480 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_640×480_putpixel.asm |
67 | vga_320×200_putpixel1.asm | realizace algoritmu pro vykreslení pixelu v grafickém režimu 320×200 s 256 barvami (základní varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel1.asm |
68 | vga_320×200_putpixel2.asm | realizace algoritmu pro vykreslení pixelu v grafickém režimu 320×200 s 256 barvami (rychlejší varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel2.asm |
69 | vga_gfx_mode_dac3.asm | přímé využití DAC v grafickém režimu 13h | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac3.asm |
70 | vga_gfx_mode_unchained_step1.asm | zobrazení barevných pruhů v režimu 13h | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step1.asm |
71 | vga_gfx_mode_unchained_step2.asm | vypnutí zřetězení bitových rovin a změna způsobu adresování pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step2.asm |
72 | vga_gfx_mode_unchained_step3.asm | vykreslení barevných pruhů do vybraných bitových rovin | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step3.asm |
73 | vga_gfx_mode_320×400.asm | nestandardní grafický režim s rozlišením 320×400 pixelů a 256 barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_320×400.asm |
74 | vga_320×200_image.asm | zobrazení rastrového obrázku ve standardním grafickém režimu 320×200 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image.asm |
75 | vga_320×200_unchained_image1.asm | zobrazení rastrového obrázku v režimu s nezřetězenými rovinami (nekorektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_unchained_image1.asm |
76 | vga_320×200_unchained_image2.asm | zobrazení rastrového obrázku v režimu s nezřetězenými rovinami (korektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_unchained_image2.asm |
77 | vga_320×400_unchained_image.asm | zobrazení rastrového obrázku v nestandardním režimu 320×400 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_unchained_image.asm |
78 | vga_vertical_scroll1.asm | vertikální scrolling na kartě VGA v režimu s rozlišením 320×200 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_vertical_scroll1.asm |
79 | vga_vertical_scroll2.asm | vertikální scrolling na kartě VGA v režimu s rozlišením 320×400 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_vertical_scroll2.asm |
80 | vga_split_screen1.asm | režim split-screen a scrolling, nefunční varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_split_screen1.asm |
81 | vga_split_screen2.asm | režim split-screen a scrolling, plně funkční varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_split_screen2.asm |
82 | vga_horizontal_scroll1.asm | horizontální scrolling bez rozšíření počtu pixelů na virtuálním řádku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll1.asm |
83 | vga_horizontal_scroll2.asm | horizontální scrolling s rozšířením počtu pixelů na virtuálním řádku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll2.asm |
84 | vga_horizontal_scroll3.asm | jemný horizontální scrolling s rozšířením počtu pixelů na virtuálním řádku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll3.asm |
85 | vga_320×240_image.asm | nastavení grafického režimu Mode-X, načtení a vykreslení obrázku, scrolling | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×240_image.asm |
86 | io.asm | knihovna maker pro I/O operace | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/io.asm |
87 | vga_lib.asm | knihovna maker a podprogramů pro programování karty VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_lib.asm |
88 | vga_320×240_lib.asm | nastavení grafického režimu Mode-X, tentokrát knihovními funkcemi | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×240_lib.asm |
89 | vga_bitblt1.asm | první (naivní) implementace operace BitBLT | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt1.asm |
90 | vga_bitblt2.asm | operace BitBLT s výběrem bitových rovin pro zápis | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt2.asm |
91 | vga_bitblt3.asm | operace BitBLT s výběrem bitových rovin pro čtení i zápis | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt3.asm |
92 | vga_bitblt4.asm | korektní BitBLT pro 16barevný režim, realizace makry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt4.asm |
93 | vga_bitblt5.asm | korektní BitBLT pro 16barevný režim, realizace podprogramem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt5.asm |
94 | vga_bitblt_rotate.asm | zápisový režim s rotací bajtu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt_rotate.asm |
95 | vga_bitblt_fast.asm | rychlá korektní 32bitová operace typu BitBLT | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt_fast.asm |
96 | vga_320×400_bitblt1.asm | přenos obrázku v režimu 320×400 operací BitBLT (neúplná varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_bitblt1.asm |
97 | vga_320×400_bitblt2.asm | přenos obrázku v režimu 320×400 operací BitBLT (úplná varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_bitblt2.asm |
98 | vga_write_modes1.asm | volitelné zápisové režimy grafické karty VGA, zápis bez úpravy latche | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes1.asm |
99 | vga_write_modes2.asm | volitelné zápisové režimy grafické karty VGA, zápis s modifikací latche | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes2.asm |
100 | vga_write_modes3.asm | volitelné zápisové režimy grafické karty VGA, cílená modifikace latche vzorkem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes3.asm |
101 | instruction_jump.asm | použití instrukce JMP | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jump.asm |
102 | instruction_jnz.asm | použití instrukce JNZ pro realizaci programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jnz.asm |
103 | instruction_jz_jmp.asm | použití instrukcí JZ a JMP pro realizaci programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jz_jmp.asm |
104 | instruction_loop.asm | použití instrukce LOOP pro realizaci programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_loop.asm |
105 | instruction_template.asm | šablona všech následujících demonstračních příkladů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_template.asm |
106 | instruction_print_hex.asm | tisk osmibitové hexadecimální hodnoty | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_print_hex.asm |
107 | instruction_xlat.asm | využití instrukce XLAT pro získání tisknutelné hexadecimální cifry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_xlat.asm |
108 | instruction_daa.asm | operace součtu s využitím binární i BCD aritmetiky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_daa.asm |
109 | instruction_daa_sub.asm | instrukce DAA po provedení operace rozdílu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_daa_sub.asm |
110 | instruction_das.asm | instrukce DAS po provedení operace rozdílu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_das.asm |
111 | instruction_aaa.asm | korekce výsledku na jedinou BCD cifru operací AAA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_aaa.asm |
112 | instruction_mul.asm | ukázka výpočtu součinu dvou osmibitových hodnot | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_mul.asm |
113 | instruction_aam.asm | BCD korekce po výpočtu součinu instrukcí AAM | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_aam.asm |
114 | instruction_stosb.asm | blokový zápis dat instrukcí STOSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_stosb.asm |
115 | instruction_rep_stosb.asm | opakované provádění instrukce STOSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_stosb.asm |
116 | instruction_lodsb.asm | čtení dat instrukcí LODSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_lodsb.asm |
117 | instruction_movsb.asm | přenos jednoho bajtu instrukcí MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_movsb.asm |
118 | instruction_rep_movsb.asm | blokový přenos po bajtech instrukcí MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_movsb.asm |
119 | instruction_rep_scas.asm | vyhledávání v řetězci instrukcí SCAS | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_scas.asm |
120 | vga_320×200_image_0B.asm | výsledek blokového přenosu ve chvíli, kdy je CX=0 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_0B.asm |
121 | vga_320×200_image_64kB.asm | výsledek blokového přenosu ve chvíli, kdy je CX=0×ffff | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_64kB.asm |
122 | vga_320×200_image_movsb.asm | blokový přenos v rámci obrazové paměti instrukcí REP MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb.asm |
123 | vga_320×200_image_movsw.asm | blokový přenos v rámci obrazové paměti instrukcí REP MOVSW | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsw.asm |
124 | vga_320×200_image_movsd.asm | blokový přenos v rámci obrazové paměti instrukcí REP MOVSD | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsd.asm |
125 | vga_320×200_image_movsb_forward.asm | blokový přenos překrývajících se bloků paměti (zvyšující se adresy) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_forward.asm |
126 | vga_320×200_image_movsb_backward1.asm | blokový přenos překrývajících se bloků paměti (snižující se adresy, nekorektní nastavení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_backward1.asm |
127 | vga_320×200_image_movsb_backward2.asm | blokový přenos překrývajících se bloků paměti (snižující se adresy, korektní nastavení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_backward2.asm |
128 | sound_bell.asm | přehrání zvuku pomocí tisku ASCII znaku BELL | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_bell.asm |
129 | sound_beep.asm | přehrání zvuku o zadané frekvenci na PC Speakeru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_beep.asm |
130 | sound_play_pitch.asm | přehrání zvuku o zadané frekvenci na PC Speakeru, použití maker | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_play_pitch.asm |
131 | sound_opl2_basic.asm | přehrání komorního A na OPL2 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_basic.asm |
132 | sound_opl2_table.asm | přehrání komorního A na OPL2, použití tabulky s hodnotami registrů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_table.asm |
133 | sound_opl2_table2.asm | přepis tabulky s obsahy registrů pro přehrání komorního A | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_table2.asm |
134 | sound_key_on.asm | přímé ovládání bitu KEY ON mezerníkem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_key_on.asm |
135 | sound_adsr.asm | nastavení obálky pro tón přehrávaný prvním kanálem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_adsr.asm |
136 | sound_modulation.asm | řízení frekvence modulátoru klávesami 1 a 0 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_modulation.asm |
137 | keyboard_basic.asm | přímá práce s klávesnicí IBM PC | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/keyboard_basic.asm |
138 | sound_stereo_opl2.asm | stereo zvuk v konfiguraci DualOPL2 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_stereo_opl2.asm |
139 | sound_opl2_multichannel.asm | vícekanálový zvuk na OPL2 (klávesy), delší varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_multichannel.asm |
140 | sound_opl2_multichannel2.asm | vícekanálový zvuk na OPL2 (klávesy), kratší varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_multichannel2.asm |
141 | sound_opl3_stereo1.asm | stereo výstup na OPL3 (v kompatibilním režimu) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_stereo1.asm |
142 | sound_opl3_stereo2.asm | stereo výstup na OPL3 (v režimu OPL3) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_stereo2.asm |
143 | sound_opl3_multichannel.asm | vícekanálový zvuk na OPL3 (klávesy) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_multichannel.asm |
144 | sound_opl3_waveform1.asm | interaktivní modifikace tvaru vlny u prvního operátoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform1.asm |
145 | sound_opl3_waveform2.asm | oprava chyby: povolení režimu kompatibilního s OPL3 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform2.asm |
146 | sound_opl3_waveform3.asm | vliv tvaru vln na zvukový kanál s FM syntézou | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform3.asm |
147 | sound_opl3_waveform4.asm | modifikace tvaru vlny nosné vlny i modulátoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform4.asm |
148 | sound_opl3_4operators1.asm | výběr AM/FM režimu ve čtyřoperátorovém nastavení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_4operators1.asm |
149 | sound_opl3_4operators2.asm | výběr AM/FM režimu ve čtyřoperátorovém nastavení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_4operators2.asm |
150 | timer_basic.asm | základní obsluha přerušení od časovače/čítače | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_basic.asm |
151 | timer_restore.asm | obnovení původní obsluhy přerušení při ukončování aplikace | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_restore.asm |
152 | timer_restore_better_structure.asm | refaktoring předchozího demonstračního příkladu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_restore_better_structure.asm |
153 | timer_faster_clock.asm | zrychlení čítače na 100 přerušení za sekundu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_faster_clock.asm |
154 | instruction_push_imm.asm | instrukce PUSH s konstantou | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_push_imm.asm |
155 | instruction_imul_imm.asm | instrukce IMUL s konstantou | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_imul_imm.asm |
156 | instruction_into1.asm | instrukce INTO s obsluhou přerušení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_into1.asm |
157 | instruction_into2.asm | instrukce INTO s obsluhou přerušení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_into2.asm |
158 | instruction_bound1.asm | instrukce BOUND s obsluhou přerušení (nekorektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bound1.asm |
159 | instruction_bound2.asm | instrukce BOUND s obsluhou přerušení (korektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bound2.asm |
160 | vga_320×200_putpixel286.asm | instrukce bitového posunu s konstantou větší než 1 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel286.asm |
161 | instruction_push_pop.asm | instrukce PUSH a POP se všemi pracovními registry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_push_pop.asm |
162 | instruction_push_pop_B.asm | instrukce s novými segmentovými registry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_push_pop_B.asm |
163 | instruction_near_jz_jmp.asm | blízké skoky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_near_jz_jmp.asm |
164 | instruction_bsf.asm | nová instrukce BSF | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bsf.asm |
165 | instruction_bsr.asm | nová instrukce BSR | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bsr.asm |
166 | instruction_add_32bit.asm | 32bitový součet | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_add_32bit.asm |
167 | instruction_inc_32bit.asm | 32bitová instrukce INC v šestnáctibitovém režimu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_inc_32bit.asm |
168 | instruction_inc_32bit_B.asm | 32bitová instrukce INC v 32bitovém režimu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_inc_32bit_B.asm |
169 | ems_status.asm | zjištění stavu (emulace) paměti EMS | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ems_status.asm |
170 | ems_total_mem.asm | získání celkové kapacity paměti EMS v blocích | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ems_total_mem.asm |
171 | ems_free_mem.asm | získání volné kapacity paměti EMS v blocích | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ems_free_mem.asm |
172 | xms_free_mem.asm | získání volné kapacity paměti XMS v blocích | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/xms_free_mem.asm |
173 | vga_320×200_short_address1.asm | blokový přenos provedený v rámci prostoru segmentu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address1.asm |
174 | vga_320×200_short_address2.asm | rozepsaný blokový přenos provedený v rámci prostoru segmentu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address2.asm |
175 | vga_320×200_short_address3.asm | přenos nelze provést přes hranici offsetu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address3.asm |
176 | vga_320×200_short_address4.asm | přenos nelze provést přes hranici offsetu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address4.asm |
177 | vga_320×200_long_address1.asm | 32bitový blokový přenos | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address1.asm |
178 | vga_320×200_long_address2.asm | rozepsaný 32bitový blokový přenos provedený v rámci prostoru segmentu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address2.asm |
179 | vga_320×200_long_address3.asm | přístup do obrazové paměti přes segment 0×0000 a 32bitový offset | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address3.asm |
180 | vga_320×200_long_address4.asm | otestování, jak lze přenášet data s využitím 32bitového offsetu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address4.asm |
181 | print_msw.asm | přečtení a zobrazení obsahu speciálního registru MSW | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/print_msw.asm |
182 | print_cr0.asm | přečtení a zobrazení obsahu speciálního registru CR0 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/print_cr0.asm |
183 | prot_mode286.asm | přechod do chráněného režimu na čipech Intel 80286 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode286.asm |
184 | prot_mode386.asm | přechod do chráněného režimu na čipech Intel 80386 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode386.asm |
185 | prot_mode_back_to_real_mode286.asm | přechod mezi reálným režimem a chráněným režimem i zpět na čipech Intel 80286 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode_back_to_real_mode286.asm |
186 | prot_mode_back_to_real_mode386.asm | přechod mezi reálným režimem a chráněným režimem i zpět na čipech Intel 80386 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode_back_to_real_mode386.asm |
187 | prot_mode_check.asm | test, zda se mikroprocesor již nachází v chráněném režimu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode_check.asm |
188 | unreal_mode.asm | nastavení nereálného režimu (platné pro Intel 80386) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/unreal_mode.asm |
189 | float32_constants.asm | vytištění základních FP konstant typu single | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/float32_constants.asm |
190 | float64_constants.asm | vytištění základních FP konstant typu double | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/float64_constants.asm |
191 | fpu_arithmetic.asm | základní aritmetické operace prováděné matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_arithmetic.asm |
192 | fpu_divide_by_zero.asm | dělení nulou matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_by_zero.asm |
193 | fpu_divide_by_neg_zero.asm | dělení záporné hodnoty nulou matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_by_neg_zero.asm |
194 | fpu_divide_by_neg_zero2.asm | dělení hodnoty zápornou nulou matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_by_neg_zero2.asm |
195 | fpu_divide_zero_by_zero.asm | výpočet 0/0 matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_zero_by_zero.asm |
196 | io.asm | pomocná makra pro komunikaci s DOSem a BIOSem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/io.asm |
197 | print.asm | pomocná makra pro tisk FPU hodnot typu single a double v hexadecimálním tvaru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/print.asm |
198 | fpu_divide.asm | operace podílu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide.asm |
199 | fpu_divide_r.asm | operace podílu s prohozenými operandy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_r.asm |
200 | fpu_sqrt.asm | výpočet druhé odmocniny | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_sqrt.asm |
201 | fpu_sqrt_neg_value.asm | výpočet druhé odmocniny ze záporné hodnoty | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_sqrt_neg_value.asm |
202 | fpu_check.asm | detekce typu matematického koprocesoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_check.asm |
203 | fpu_compare.asm | porovnání dvou hodnot s vyhodnocením výsledku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_compare.asm |
204 | fpu_status_word.asm | tisk obsahu stavového slova koprocesoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_status_word.asm |
205 | fpu_status_word_stack.asm | tisk obsahu stavového slova koprocesoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_status_word_stack.asm |
206 | Makefile | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/Makefile | |
207 | hex2string.asm | subrutina pro převod 32bitové hexadecimální hodnoty na řetězec | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/hex2string.asm |
208 | linux_macros.asm | pomocná makra pro tvorbu aplikací psaných v assembleru pro Linux | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/linux_macros.asm |
209 | mmx_init.asm | inicializace subsystému MMX | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_init.asm |
210 | mmx_paddb1.asm | zavolání MMX instrukce pro součet vektorů bajtů (bez přetečení) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddb1.asm |
211 | mmx_paddb2.asm | zavolání MMX instrukce pro součet vektorů bajtů (s přetečením) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddb2.asm |
212 | mmx_paddusb.asm | zavolání MMX instrukce pro součet vektorů bajtů se saturací | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddusb.asm |
213 | mmx_paddw.asm | zavolání MMX instrukce pro součet vektorů šestnáctibitových slov | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddw.asm |
214 | mmx_paddd.asm | zavolání MMX instrukce pro součet vektorů 32bitových slov | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddd.asm |
215 | mmx_paddq.asm | zavolání MMX instrukce pro součet 64bitových slov | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddq.asm |
216 | mmx_paddx.asm | porovnání operací součtu pro vektory s prvky různých typů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddx.asm |
217 | mmx_support.asm | zjištění, zda je MMX podporována | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_support.asm |
218 | mmx_paddx_saturation.asm | součet osmiprvkových a čtyřprvkových vektorů se saturací | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddx_saturation.asm |
219 | mmx_psubx.asm | rozdíl vektorů s různým počtem a šířkou prvků | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_psubx.asm |
220 | mmx_pmullw1.asm | součin vektorů prvek po prvku se získáním spodních 16 bitů výsledků (varianta bez přetečení) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pmullw1.asm |
221 | mmx_pmullw2.asm | součin vektorů prvek po prvku se získáním spodních 16 bitů výsledků (varianta s přetečením) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pmullw2.asm |
222 | mmx_pmulhw.asm | součin vektorů prvek po prvku se získáním horních 16 bitů výsledků (varianta s přetečením) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pmulhw.asm |
223 | mmx_pmaddwd.asm | součin vektorů prvek po prvku, součet mezivýsledků | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pmaddwd.asm |
224 | mmx_logical.asm | logické instrukce MMX | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_logical.asm |
225 | mmx_shift_left.asm | logické posuny prvků vektorů doleva | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_shift_left.asm |
226 | mmx_shift_right.asm | logické posuny prvků vektorů doprava | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_shift_right.asm |
227 | mmx_arithmetic_right.asm | aritmetické posuny prvků vektorů doprava | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_arithmetic_right.asm |
228 | mmx_cmpeq.asm | porovnání prvků vektorů na rovnost | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_cmpeq.asm |
229 | mmx_cmpgt.asm | porovnání prvků vektorů na relaci „větší než“ | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_cmpgt.asm |
230 | mmx_unpack_bytes.asm | rozbalení bajtů z vektorů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_unpack_bytes.asm |
231 | mmx_unpack_words.asm | rozbalení slov z vektorů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_unpack_words.asm |
232 | mmx_unpack_dwords.asm | rozbalení dvojslov z vektorů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_unpack_dwords.asm |
233 | mmx_pack_into_bytes1.asm | zabalení vektorů slov do vektoru bajtů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pack_into_bytes1.asm |
234 | mmx_pack_into_bytes2.asm | řešení přetečení při zabalování vektorů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pack_into_bytes2.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/ - 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 - Bulldozer (microarchitecture)
https://en.wikipedia.org/wiki/Bulldozer_(microarchitecture) - MMX (instruction set)
https://en.wikipedia.org/wiki/MMX_(instruction_set) - Extended MMX
https://en.wikipedia.org/wiki/Extended_MMX - Saturation arithmetic
https://en.wikipedia.org/wiki/Saturation_arithmetic