Obsah
1. Rozšíření instrukční sady AVX a programy v assembleru
2. Od SSE k AVX a posléze k AVX-512
3. Pracovní registry AVX a AVX-512
4. Datové typy podporované v instrukčních sadách AVX a AVX2
5. Tříadresový kód podporovaný instrukcemi ze sady AVX
6. Nový způsob kódování instrukcí
7. Instrukce AVX a assembler NASM
8. Detekce podpory instrukcí AVX
9. První demonstrační příklad: zjištění, zda mikroprocesor podporuje instrukce AVX
10. Instrukce pro přenosy dat mezi novými registry AVX
11. Pomocné makro pro tisk hodnoty YMM registru
12. Druhý demonstrační příklad: zobrazení hodnoty 256bitového vektoru
13. Operace součtu vektorů o délce 256 bitů s celočíselnými prvky
14. Třetí demonstrační příklad: instrukce VPADDB
15. Rozdíl mezi instrukcemi VPADDB, VPADDW, VPADDD a VPADDQ
17. Analýza získaných výsledků
19. Repositář s demonstračními příklady
1. Rozšíření instrukční sady AVX a programy v assembleru
V dnešním článku si ukážeme základy práce s instrukcemi AVX v assembleru, konkrétně v NASMu (Netwide Assembler) běžícího v Linuxu. Samotná zkratka AVX znamená „Advanced Vector Extensions“ a oproti již popsaným rozšířením MMX, SSE a SSE2 se v případě AVX jedná o výrazné vylepšení podpory SIMD operací, které se mj. projevilo prodloužením vektorů a taktéž zcela novými instrukcemi, což znamená, že slovo „advanced“ je zde namístě. Původní technologie AVX byla představena v roce 2008, přičemž první mikroprocesory vybavené tímto rozšířením začaly být ve větších sériích prodávány v roce 2011. Jedná se tedy o (z pohledu vývojáře) relativně dobře zavedenou technologii, která je v samotném hardware dnes již široce podporována a lze ji bez větších problémů začít využívat. Podporu pro původní AVX nabízí například překladač GCC, assembler GAS i NASM, který v tomto seriálu používáme, atd. Pro většinou moderních překladačů jazyka C jsou navíc dostupná i různá rozšíření určená pro podporu vektorových operací (builtins, intrinsic).
Původní rozšíření AVX bylo v roce 2013 doplněno rozšířením nazvaným AVX2 a jen o několik měsíců později byla představena specifikace nazvaná AVX-512. V tomto případě se nejedná o jediné rozšíření instrukční sady, ale o specifikaci hned několika (dopočítal jsem devatenáct, ale uvádí se dvacet) rozšíření (extension), která mohou být (ale nemusí) všechna implementována. Většinou bude implementována jen určitá podmnožina AVX-512. AVX-512 je v mnoha ohledech stejně přelomové jako přechod na AVX, ovšem prozatím stále ho doprovází technické problémy – některé procesory se při vykonávání nových instrukcí AVX-512 zpomalují, a to mnohdy až na 60% svého limitu (to však již poněkud předbíháme). AVX-512 je v současnosti podporováno překladači GCC, ICC i Clang; tyto instrukce jsou podporovány i assemblery NASM (což nás zajímá primárně) a FASM.
Pro zajímavost se podívejme na postupné rozšiřování původní skalární architektury x86 o vektorové instrukce (nejsou uvedena všechna rozšíření AVX-512):
| Technologie | Rok uvedení | Společnost | Poprvé použito v čipu |
|---|---|---|---|
| MMX | 1996 | Intel | Intel Pentium P5 |
| 3DNow! | 1998 | AMD | AMD K6–2 |
| SSE | 1999 | Intel | Intel Pentium III (mikroarchitektura P6) |
| SSE2 | 2001 | Intel | Intel Pentium 4 (mikroarchitektura NetBurst) |
| SSE3 | 2004 | Intel | Intel Pentium 4 (Prescott) |
| SSSE3 | 2006 | Intel | mikroarchitektura Intel Core |
| SSE4 | 2006 | Intel+AMD | AMD K10 (SSE4a) , mikroarchitektura Intel Core |
| SSE5 | 2007 | AMD | (nakonec rozděleno do menších celků), mikroarchitektura Bulldozer |
| AVX | 2008 | Intel | mikroarchitektura Sandy Bridge |
| F16C (CVT16) | 2009 | AMD | Jaguar, Puma, Bulldozer atd. |
| XOP | 2009 | AMD | mikroarchitektura Bulldozer |
| FMA3 | 2012 | AMD | mikroarchitektura Piledriver, Intel: Haswell a Broadwell |
| FMA4 | 2011 | AMD | mikroarchitektura Bulldozer (pozdější architektury po Zen 1 již ne) |
| AVX2 | 2013 | Intel | mikroarchitektura Haswell |
| AVX-512 | 2013 | Intel | Knights Landing |
| AMX | 2020 | Intel | Sapphire Rapids |
| AVX-VNNI | 2021 | Intel | Adler Lake |
| AVX-IFMA | 2023 | Intel | Meteor Lake |
| AVX10 | 2023 | Intel | Granite Rapids |
$ cat /proc/cpuinfo |head -n 27
Důležitý je v tomto případě obsah atributu flags:
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 154
model name : 12th Gen Intel(R) Core(TM) i7-1270P
stepping : 3
microcode : 0x436
cpu MHz : 972.124
cache size : 18432 KB
physical id : 0
siblings : 16
core id : 0
cpu cores : 12
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 32
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb intel_pt sha_ni xsaveopt xsavec xgetbv1 xsaves split_lock_detect user_shstk avx_vnni dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp hwp_pkg_req hfi vnmi umip pku ospke waitpkg gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm md_clear serialize pconfig arch_lbr ibt flush_l1d arch_capabilities
vmx flags : vnmi preemption_timer posted_intr invvpid ept_x_only ept_ad ept_1gb flexpriority apicv tsc_offset vtpr mtf vapic ept vpid unrestricted_guest vapic_reg vid ple shadow_vmcs ept_violation_ve ept_mode_based_exec tsc_scaling usr_wait_pause
bugs : spectre_v1 spectre_v2 spec_store_bypass swapgs eibrs_pbrsb rfds bhi
bogomips : 4992.00
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:
2. Od SSE k AVX a posléze k AVX-512
Na technologii AVX se můžeme dívat jako na další krok, kterým se původně čistě skalární architektura x86 postupně rozšiřuje o nové vektorové operace (a nepřímo taktéž o nové vektorové registry, které doplňují původní sadu skalárních registrů). V souladu s Moorovým zákonem totiž mohou výrobci mikroprocesorů vytvářet na čipech nové (a delší, resp. možná přesněji řečeno širší) registry, zvětšovat počet aritmeticko-logických jednotek atd., což nepřímo přináší i nutnost změn (rozšíření) instrukční sady. A přesně tento postupný vývoj můžeme vidět i na platformě x86 a x86–64, která byla rozšířena o MMX, SSE (SSE, SSE2, SSE4.1 atd.), AVX (původní AVX i AVX2) a nyní o AVX-512 (samotné AVX10 si dovolím pro jednoduchost a jen pro tuto chvíli považovat za pouhou variantu AVX-512).
Kromě rozšíření instrukční sady se postupně zvětšoval i počet pracovních registrů a taktéž jejich šířka. Ostatně tyto změny jsou patrné i z následující tabulky:
| # | Typ registrů | Počet registrů (x86) | Počet registrů (x86–64) | Bitová šířka registru | Jména registrů |
|---|---|---|---|---|---|
| 1 | Pracovní registry MMX | 8 | 8 | 64 bitů | MM0 .. MM7 |
| 2 | Pracovní registry SSE | 8 | 16 | 128 bitů | XMM0 .. XMM7 (XMM15) |
| 3 | Pracovní registry AVX | 8 | 16 | 256 bitů | YMM0 .. YMM7 (YMM15) |
| 4 | Pracovní registry AVX-512 | 8 | 32 | 512 bitů | ZMM0 .. ZMM31 |
3. Pracovní registry AVX a AVX-512
Z tabulky uvedené ve druhé kapitole je patrný dramatický skok v případě instrukční sady AVX-512, kdy se zdvojnásobil (resp. oproti 32bitové x86 dokonce zečtyřnásobil) počet vektorových registrů a současně se i zdvojnásobila jejich bitová šířka. Ve skutečnosti vznikly nové registry AVX se jmény YMMx i registry AVX-512 se jmény ZMMx rozšířením registrů SSE na 256 nebo 512 bitů a přidáním nových registrů. To například znamená, že operace s registrem XMM0 (SSE) ve skutečnosti může modifikovat spodních 128 bitů registru YMM0 i ZMM0. U instrukcí je pak definováno, zda budou horní prvky registrů vynulovány, nebo ponechány na původní hodnotě. Tento koncept není úplně nový a můžeme ho vidět i u základních pracovních registrů (AL → AX → EAX → RAX):
| 512..256 | 255..128 | 127..0 |
|---|---|---|
| ZMM0 | YMM0 | XMM0 |
| ZMM1 | YMM1 | XMM1 |
| ZMM2 | YMM2 | XMM2 |
| ZMM3 | YMM3 | XMM3 |
| ZMM4 | YMM4 | XMM4 |
| ZMM5 | YMM5 | XMM5 |
| ZMM6 | YMM6 | XMM6 |
| ZMM7 | YMM7 | XMM7 |
| ZMM8 | YMM8 | XMM8 |
| ZMM9 | YMM9 | XMM9 |
| ZMM10 | YMM10 | XMM10 |
| ZMM11 | YMM11 | XMM11 |
| ZMM12 | YMM12 | XMM12 |
| ZMM13 | YMM13 | XMM13 |
| ZMM14 | YMM14 | XMM14 |
| ZMM15 | YMM15 | XMM15 |
| ZMM16 | YMM16 | XMM16 |
| ZMM17 | YMM17 | XMM17 |
| ZMM18 | YMM18 | XMM18 |
| ZMM19 | YMM19 | XMM19 |
| ZMM20 | YMM20 | XMM20 |
| ZMM21 | YMM21 | XMM21 |
| ZMM22 | YMM22 | XMM22 |
| ZMM23 | YMM23 | XMM23 |
| ZMM24 | YMM24 | XMM24 |
| ZMM25 | YMM25 | XMM25 |
| ZMM26 | YMM26 | XMM26 |
| ZMM27 | YMM27 | XMM27 |
| ZMM28 | YMM28 | XMM28 |
| ZMM29 | YMM29 | XMM29 |
| ZMM30 | YMM30 | XMM30 |
| ZMM31 | YMM31 | XMM31 |
4. Datové typy podporované v instrukčních sadách AVX a AVX2
Při použití technologie AVX se používají vektory o šířce 256 bitů. Tyto vektory je možné rozdělit na celočíselné prvky popř. na prvky s hodnotami reprezentovanými s využitím systému plovoucí řádové čárky. V následující tabulce jsou všechny možné a podporované kombinace vypsány. Vzhledem k tomu, že jsou tyto datové typy relativně často používány i v překladačích jazyka C, uvádím pro úplnost i jejich názvy tak, jak jsou definovány v překladači GCC:
| Typ v C | Význam | Deklarace |
|---|---|---|
| _v32qi | 32 celočíselných prvků, každý o šířce 8bitů (pro C++) | typedef char __v32qi __attribute__ ((__vector_size__ (32))); |
| _v32qs | 32 celočíselných prvků se znaménkem, každý o šířce 8bitů | typedef signed char __v32qs __attribute__ ((__vector_size__ (32))); |
| _v16hi | 16 celočíselných prvků se znaménkem, každý o šířce 16bitů | typedef short __v16hi __attribute__ ((__vector_size__ (32))); |
| _v8si | 8 celočíselných prvků se znaménkem, každý o šířce 32bitů | typedef int __v8si __attribute__ ((__vector_size__ (32))); |
| _v4di | 4 celočíselné prvky se znaménkem, každý o šířce 64bitů | typedef long long __v4di __attribute__ ((__vector_size__ (32))); |
| _v32qu | 32 celočíselných prvků bez znaménka, každý o šířce 8bitů | typedef unsigned char __v32qu __attribute__ ((__vector_size__ (32))); |
| _v16hu | 16 celočíselných prvků bez znaménka, každý o šířce 16bitů | typedef unsigned short __v16hu __attribute__ ((__vector_size__ (32))); |
| _v8su | 8 celočíselných prvků bez znaménka, každý o šířce 32bitů | typedef unsigned int __v8su __attribute__ ((__vector_size__ (32))); |
| _v4du | 4 celočíselné prvky bez znaménka, každý o šířce 64bitů | typedef unsigned long long __v4du __attribute__ ((__vector_size__ (32))); |
| _v8sf | osm prvků typu float | typedef float __v8sf __attribute__ ((__vector_size__ (32))); |
| _v4df | čtyři prvky typu double | typedef double __v4df __attribute__ ((__vector_size__ (32))); |
V assembleru se namísto toho používají pseudoinstrukce DB, DW, DD, DQ a DT, popř. pro neinicializované vektory pseudoinstrukce RESB, RESW, RESD, RESQ a REST.
To je vhodný doplněk ke (stále podporovaným) datovým typům pro SSE i pro SSE2:
| Typ v C | Význam | Deklarace |
|---|---|---|
| _v16qi | 16 celočíselných prvků, každý o šířce 8bitů (pro C++) | typedef char __v16qi __attribute__ ((__vector_size__ (16))); |
| _v16qs | 16 celočíselných prvků se znaménkem, každý o šířce 8bitů | typedef signed char __v16qs __attribute__ ((__vector_size__ (16))); |
| _v8hi | 8 celočíselných prvků se znaménkem, každý o šířce 16bitů | typedef short __v8hi __attribute__ ((__vector_size__ (16))); |
| _v4si | 4 celočíselné prvky se znaménkem, každý o šířce 32bitů | typedef int __v4si __attribute__ ((__vector_size__ (16))); |
| _v2di | 2 celočíselné prvky se znaménkem, každý o šířce 64bitů | typedef long long __v2di __attribute__ ((__vector_size__ (16))); |
| _v16qu | 16 celočíselných prvků bez znaménka, každý o šířce 8bitů | typedef unsigned char __v16qu __attribute__ ((__vector_size__ (16))); |
| _v8hu | 8 celočíselných prvků bez znaménka, každý o šířce 16bitů | typedef unsigned short __v8hu __attribute__ ((__vector_size__ (16))); |
| _v4su | 4 celočíselné prvky bez znaménka, každý o šířce 32bitů | typedef unsigned int __v4su __attribute__ ((__vector_size__ (16))); |
| _v2du | 2 celočíselné prvky bez znaménka, každý o šířce 64bitů | typedef unsigned long long __v2du __attribute__ ((__vector_size__ (16))); |
| _v4sf | čtyři prvky typu float | typedef float __v4sf __attribute__ ((__vector_size__ (16))); |
| _v2df | dva prvky typu double | typedef double __v2df __attribute__ ((__vector_size__ (16))); |
5. Tříadresový kód podporovaný instrukcemi ze sady AVX
„Novým objevem“ (ve skutečnosti starým přibližně padesát let, ovšem zrovna u platformy x86 se jedná o novou vlastnost) je použití takzvaného tříadresového kódu (Three-Address Code, TAC) v AVX instrukcích. Co to znamená? V instrukčním slovu jsou zakódovány jak dva zdrojové operandy (registry popř. adresa), tak i jeden cílový operand. To znamená, že – na rozdíl od instrukcí SSE – není jeden ze zdrojových operandů (konkrétně registr) současně i operandem cílovým – není tedy přepsán výsledkem operace. To může pomoci překladači s alokací registrů, ovšem navíc se mnohdy ušetří operace kopie dat mezi dvojicí registrů (samozřejmě je stále možné v případě potřeby ten samý registr použít jak ve funkci zdrojového, tak i cílového operandu).
Podívejme se na rozdíly mezi dvouadresovým a tříadresovým kódem u instrukce součtu (a je jedno, jestli skalárního nebo vektorového). Ve dvouadresovém kódu je jeden ze zdrojových registrů i registrem cílovým:
c: 0f 28 4d 10 movaps xmm1, XMMWORD PTR [rbp+0x10] 10: 0f 28 45 30 movaps xmm0, XMMWORD PTR [rbp+0x30] 14: 0f 58 c8 addps xmm1, xmm0
U tříadresového kódu tomu tak není (navíc je jedním ze zdrojů adresa a nikoli registr):
1d: c5 fc 28 44 24 e0 vmovaps ymm1, YMMWORD PTR [rsp-0x20] 23: c5 fc 58 44 24 c0 vaddps ymm0, ymm1, YMMWORD PTR [rsp-0x40]
6. Nový způsob kódování instrukcí
V souvislosti s AVX byl navržen nový (kolikátý už? na platformě x86 už asi osmý?) způsob kódování instrukcí nazvaný VEX. Díky tomuto rozšíření bylo umožněno jak zvýšení počtu instrukcí (navíc s prostorem pro další rozšiřování), tak i rozšíření vektorů ze 128 bitů na 256 bitů a v neposlední řadě je taktéž ve VEX implementován výše zmíněný tříadresový kód.
Instrukce mají proměnnou délku (a to až do délky jedenácti bajtů, nepočítaje v to možné prefixy), jejich kódování je velmi složité a navíc existují kolize v 32bitovém režimu. Obecně je možné říci, že způsob zakódování instrukcí vypadá následovně:
| Část | Délka v bajtech |
|---|---|
| prefixy | proměnná |
| VEX | 0, 2 nebo 3 |
| OPCODE | 1 |
| ModR/M | 1 |
| SIB | 0 nebo 1 |
| DISP | 0, 1, 2 nebo 4 |
| IMM | 0 nebo 1 |
V bitovém poli ModR/M je zakódován způsob adresování operandů, které muselo být rozšířeno o SIB, v němž se specifikuje adresování přes index registr, bázový registr nebo vynásobení offsetu krátkou konstantou (2, 4, …). Navíc se na x86–64 zavádí prefix REX, který modifikuje význam bitového pole ModR/M tak, že lze použít nové pracovní registry (uff). Krátce: dnes již v naprosté většině případů nemá význam pokoušet se o dekódování instrukcí ručně; lepší je se spolehnout na debuggery, disassemblery nebo nástroj objdump (my se však k tomuto tématu ještě vrátíme).
7. Instrukce AVX a assembler NASM
Druhá část dnešního článku je – podobně jako u většiny ostatních článků z tohoto seriálu – věnována praktickému využití resp. přesněji řečeno otestování popsaných vlastností v praxi. Týkat se to bude i instrukcí AVX. Použijeme přitom assembler NASM, který AVX instrukce podporuje; viz též jejich seznam získaný z oficiální dokumentace NASMu. Všechny dále uvedené demonstrační příklady jsou přeložitelné na Linuxu (i na jeho 32bitové variantě). Příklady, které budou představeny dnes, ve skutečnosti ukazují jen velmi malou část nové funkcionality AVX. Složitější a přitom velmi užitečné instrukce typu gather/scatter, popř. instrukce umožňující kooperaci mezi SSE a AVX, budou popsány a pochopitelně i otestovány v navazujícím článku.
8. Detekce podpory instrukcí AVX
Současné typy mikroprocesorů s architekturou x86–64 již instrukce AVX podporují, ovšem ještě relativně nedávno byly prodávány čipy bez podpory tohoto rozšíření instrukční sady. Mj. i z tohoto důvodu je dobré vědět, jakým způsobem lze zjistit, jestli daný mikroprocesor AVX podporuje či nikoli. AVX je stále považována za jediné a ucelené rozšíření instrukční sady (na rozdíl od AVX-512), takže detekce jeho podpory nebo naopak nepodpory je snadná. K tomuto účelu použijeme instrukci CPUID, se kterou jsme se v tomto seriálu již několikrát setkali, a to při detekci rozšíření MMX, SSE a SSE2.
Konkrétně to znamená zavolat tuto instrukci s registrem EAX nastaveným na jedničku (první kategorie) s následným otestováním hodnoty bitu s indexem 28 registru ECX. Pozor: skutečně se testuje bit z registru ECX a nikoli EDX, jak jsme doposud prováděli. Výsledek lze interpretovat snadno: jedničkový bit je nastaven v případě, že instrukce AVX jsou podporovány; v opačném případě je nulový.
9. První demonstrační příklad: zjištění, zda mikroprocesor podporuje instrukce AVX
V dnešním prvním demonstračním příkladu je instrukcí CPUID zjištěno (v čase běhu), zda daný procesor podporuje instrukce AVX. Jedná se o rozšíření příkladů, které jsme si již ukázali, takže ve skutečnosti se bude detekovat i podpora MMX, SSE, SSE2. Na většině mikroprocesorů vyrobených v posledních cca deseti letech by se měla vypsat podpora pro všechna čtyři vektorová rozšíření (ale v případě později popsané AVX-512 to už není tak jisté):
[bits 32]
%include "linux_macros.asm"
;-----------------------------------------------------------------------------
section .data
hex_message:
times 8 db '?'
db ' '
hex_message_length equ $ - hex_message
mmx_supported:
db 10, "MMX supported"
mmx_supported_length equ $ - mmx_supported
sse_supported:
db 10, "SSE supported"
sse_supported_length equ $ - sse_supported
sse2_supported:
db 10, "SSE2 supported"
sse2_supported_length equ $ - sse2_supported
avx_supported:
db 10, "AVX supported"
avx_supported_length equ $ - avx_supported
;-----------------------------------------------------------------------------
section .bss
id_string: resb 8
;-----------------------------------------------------------------------------
section .text
global _start ; tento symbol ma byt dostupny i linkeru
_start:
; ziskani indexu nejvyssi volatelne funkce CPUID
xor eax, eax ; nulta kategorie
cpuid
mov edx, eax ; hodnota, ktera se ma vytisknout
mov ebx, hex_message ; buffer, ktery se zaplni hexa cislicemi
call hex2string ; zavolani prislusne subrutiny
print_string hex_message, hex_message_length ; tisk hexadecimalni hodnoty
; test podpory SSE
mov eax, 1 ; prvni kategorie
cpuid
mov ebx, hex_message ; buffer, ktery se zaplni hexa cislicemi
call hex2string ; zavolani prislusne subrutiny
print_string hex_message, hex_message_length ; tisk hexadecimalni hodnoty
; vypis CPU ID
xor eax, eax ; nulta kategorie
cpuid
mov [id_string], ebx ; prvni ctyri znaky ID
mov [id_string+4], edx ; dalsi ctyri znaky ID
mov [id_string+8], ecx ; posledni ctyri znaky ID
print_string id_string, 12 ; tisk 12 znaku CPU ID
mov eax, 1 ; prvni kategorie
cpuid ; naplneni EDX a ECX
bt edx, 23 ; test bitu cislo 23: podpora MMX
jnc mmx_not_supported
print_string mmx_supported, mmx_supported_length
mmx_not_supported:
mov eax, 1 ; prvni kategorie
cpuid ; naplneni EDX a ECX
bt edx, 25 ; test bitu cislo 25 registru EDX: podpora SSE
jnc sse_not_supported
print_string sse_supported, sse_supported_length
sse_not_supported:
mov eax, 1 ; prvni kategorie
cpuid ; naplneni EDX a ECX
bt edx, 26 ; test bitu cislo 25 registru EDX: podpora SSE2
jnc sse2_not_supported
print_string sse2_supported, sse2_supported_length
sse2_not_supported:
mov eax, 1 ; prvni kategorie
cpuid ; naplneni EDX a ECX
bt ecx, 28 ; test bitu cislo 28 registru ECX: podpora AVX
jnc avx_not_supported
print_string avx_supported, avx_supported_length
avx_not_supported:
exit ; ukonceni procesu
%include "hex2string.asm"
Výsledek by mohl vypadat následovně (první řádek ovšem může být odlišný – záleží na konkrétním typu mikroprocesoru):
00000020 BFEBFBFF GenuineIntel MMX supported SSE supported SSE2 supported AVX supported
10. Instrukce pro přenosy dat mezi novými registry AVX
Mezi první typ instrukcí z instrukční sady AVX, které si musíme popsat, pochopitelně patří instrukce určené pro přenos hodnot mezi vektorovými registry YMMx navzájem, popř. mezi vektorovým registrem YMMx a operační pamětí. Již při popisu instrukční sady SSE jsme si řekli, že se ve skutečnosti nejedná o zcela triviální problematiku, protože při přesunech dat mezi operační pamětí a vektorovým registrem se rozlišuje čtení/zápis do paměti se zarovnáním adres a bez zarovnání (což do jisté míry souvisí se šířkou datového kanálu mezi mikroprocesorem a cache). „Zarovnaný“ přístup je (resp. byl) obecně rychlejší a pro tyto účely existují vlastní varianty přenosových instrukcí. Jména těchto instrukcí typicky začínají znaky VMOV (vector move), přičemž další znaky jména instrukce určují další vlastnosti operace, která je instrukcí prováděna:
| # | Instrukce | Prováděná operace |
|---|---|---|
| 1 | VMOVDQU | přenos mezi registry či registrem a pamětí bez zarovnání |
| 2 | VMOVDQA | přenos mezi registry či registrem a pamětí se zarovnáním |
| 3 | VMASKMOVDQU | přenos se selektivním výběrem bajtů |
| 4 | VMOVD | přenos mezi částí vektorového registru a 32bitovým obecným registrem |
| 5 | VMOVQ | přenos mezi částí vektorového registru a 64bitovým obecným registrem |
V dalším textu si prozatím vystačíme s instrukcí VMOVDQU.
11. Pomocné makro pro tisk hodnoty YMM registru
V další trojici demonstračních příkladů a taktéž v příkladech, které budou uvedeny příště, budeme provádět tisk hodnot vektorových registrů YMMx. Víme již, že tyto registry mají šířku 256 bitů, což odpovídá třiceti dvěma bajtům. Hodnoty těchto bajtů budeme pro jednoduchost (a jednoznačnost) tisknout v hexadecimálním formátu. Pro zobrazení obsahu třiceti dvou bajtů je nutné vytisknout 64 hexadecimálních cifer, což je velké množství (v tištěných materiálech je to celá šířka řádku). Proto mezi skupiny těchto cifer budeme vkládat mezery, aby se jejich čtení zjednodušilo.
Vlastní tisk hodnoty registru YMMx je realizován v makru nazvaném print_avx_reg_as_hex, které očekává, že se mu předá jméno YMM registru, jehož obsah má být vytisknut. Vlastní funkce makra je poněkud těžkopádná: obsah registru se uloží do paměti (bufferu), ze kterého čteme jednotlivé čtveřice bajtů (32 bitů). Ty jsou tisknuty jiným makrem nazvaným print_hex:
; makro pro vypis obsahu AVX vektoru
%macro print_avx_reg_as_hex 1
mov ebx, avx_tmp ; adresa bufferu
vmovdqu [ebx], %1 ; ulozeni do pameti (32 bajtu)
mov eax, [ebx+28] ; nacteni casti AVX vektoru do celociselneho registru
print_hex eax, ' ' ; zobrazeni obsahu tohoto registru v hexadecimalnim tvaru
mov eax, [ebx+24] ; nacteni casti AVX vektoru do celociselneho registru
print_hex eax, ' ' ; zobrazeni obsahu tohoto registru v hexadecimalnim tvaru
mov eax, [ebx+20] ; nacteni casti AVX vektoru do celociselneho registru
print_hex eax, ' ' ; zobrazeni obsahu tohoto registru v hexadecimalnim tvaru
mov eax, [ebx+16] ; nacteni casti AVX vektoru do celociselneho registru
print_hex eax, ' ' ; zobrazeni obsahu tohoto registru v hexadecimalnim tvaru
mov eax, [ebx+12] ; nacteni casti AVX vektoru do celociselneho registru
print_hex eax, ' ' ; zobrazeni obsahu tohoto registru v hexadecimalnim tvaru
mov eax, [ebx+8] ; nacteni casti AVX vektoru do celociselneho registru
print_hex eax, ' ' ; zobrazeni obsahu tohoto registru v hexadecimalnim tvaru
mov eax, [ebx+4] ; nacteni casti AVX vektoru do celociselneho registru
print_hex eax, ' ' ; zobrazeni obsahu tohoto registru v hexadecimalnim tvaru
mov eax, [ebx] ; nacteni casti AVX vektoru do celociselneho registru
print_hex eax, 0x0a ; zobrazeni obsahu tohoto registru v hexadecimalnim tvaru
%endmacro
12. Druhý demonstrační příklad: zobrazení hodnoty 256bitového vektoru
V dnešním druhém demonstračním příkladu si otestujeme funkci výše popsaného makra určeného pro tisk obsahu vybraného vektorového registru YMMx. Díky existenci dalších pomocných maker je zdrojový kód tohoto příkladu velmi krátký a doufejme, že i dobře pochopitelný. V textovém segmentu je uložena sekvence třiceti dvou bajtů, které jsou načteny do registru YMM0 a jeho obsah je následně vytištěn. Povšimněte si zejména toho, že způsob uložení jednotlivých bajtů v operační paměti (ať již se jedná o měnitelný nebo o neměnitelný segment) odpovídá little endian, tj. první uložený bajt bude mít ve vektorovém registru nejnižší index atd. Úplný zdrojový kód tohoto 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
align 32
avx_val_1 db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
db 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
;-----------------------------------------------------------------------------
section .bss
avx_tmp resb 32
;-----------------------------------------------------------------------------
section .text
global _start ; tento symbol ma byt dostupny i linkeru
_start:
mov ebx, avx_val_1 ; adresa prvniho vektoru
vmovdqu ymm0, [ebx] ; nacteni puvodniho vektoru do registru YMM0
print_avx_reg_as_hex ymm0 ; tisk hodnoty registru YMM0
exit ; ukonceni procesu
%include "hex2string.asm"
Výsledek:
201F1E1D 1C1B1A19 18171615 14131211 100F0E0D 0C0B0A09 08070605 04030201
Popř. po rozdělení na jednotlivé bajty:
20 1F 1E 1D 1C 1B 1A 19 18 17 16 15 14 13 12 11 10 0F 0E 0D 0C 0B 0A 09 08 07 06 05 04 03 02 01
13. Operace součtu vektorů o délce 256 bitů s celočíselnými prvky
Dále si ukažme, jakým způsobem je možné provádět součty 256bitových vektorů (tedy vektorů o šířce třiceti dvou bajtů), v nichž jsou uloženy celočíselné prvky. Na výběr jsou čtyři typy těchto vektorů (minimálně v případě, že vynecháme celočíselný typ se šířkou 128 bitů, který se v praxi příliš nepoužívá):
| # | Instrukce | Formát zpracovávaných vektorů |
|---|---|---|
| 1 | VPADDB | 32 prvků s šířkou 8bitů (unsigned char) |
| 2 | VPADDW | 16 prvků s šířkou 16bitů (unsigned short) |
| 3 | VPADDD | 8 prvků s šířkou 32bitů (unsigned int) |
| 4 | VPADDQ | 4 prvky s šířkou 64bitů (unsigned long) |
14. Třetí demonstrační příklad: instrukce VPADDB
V dnešním třetím demonstračním příkladu je ukázán způsob použití instrukce VPADDB, tedy instrukce, která sčítá 256bitové vektory obsahující třicet dva jednobajtových prvků. První vektor obsahuje bajty s hodnotou od 1 do 32, druhý vektor obsahuje prvky se stejnou hodnotou 0×10=16 (pro účely jednoduššího tisku v hexadecimálním formátu):
[bits 32]
%include "linux_macros.asm"
;-----------------------------------------------------------------------------
section .data
hex_message:
times 8 db '?'
db ' '
hex_message_length equ $ - hex_message
align 32
avx_val_1 db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
db 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
avx_val_2 times 32 db 0x10
;-----------------------------------------------------------------------------
section .bss
avx_tmp resb 32
;-----------------------------------------------------------------------------
section .text
global _start ; tento symbol ma byt dostupny i linkeru
_start:
mov ebx, avx_val_1 ; adresa prvniho vektoru
vmovdqu ymm0, [ebx] ; nacteni puvodniho vektoru do registru YMM0
print_avx_reg_as_hex ymm0 ; tisk hodnoty registru YMM0
mov ebx, avx_val_2 ; adresa druheho vektoru
vmovdqu ymm1, [ebx] ; nacteni puvodniho vektoru do registru YMM1
print_avx_reg_as_hex ymm1 ; tisk hodnoty registru YMM1
vpaddb ymm2, ymm0, ymm1 ; ymm2 = ymm0 + ymm1
print_avx_reg_as_hex ymm2 ; tisk hodnoty registru YMM2
exit ; ukonceni procesu
%include "hex2string.asm"
Výsledky ve formátu přímo zobrazeném příkladem po jeho překladu a spuštění:
201F1E1D 1C1B1A19 18171615 14131211 100F0E0D 0C0B0A09 08070605 04030201 10101010 10101010 10101010 10101010 10101010 10101010 10101010 10101010 302F2E2D 2C2B2A29 28272625 24232221 201F1E1D 1C1B1A19 18171615 14131211
Mnohem čitelnější je však vizuální rozdělení na jednotlivé bajty:
první vektor: 20 1F 1E 1D 1C 1B 1A 19 18 17 16 15 14 13 12 11 10 0F 0E 0D 0C 0B 0A 09 08 07 06 05 04 03 02 01 druhý vektor: 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 součet: 30 2F 2E 2D 2C 2B 2A 29 28 27 26 25 24 23 22 21 20 1F 1E 1D 1C 1B 1A 19 18 17 16 15 14 13 12 11
15. Rozdíl mezi instrukcemi VPADDB, VPADDW, VPADDD a VPADDQ
Ve třinácté kapitole jsme se zmínili o čtveřici instrukcí nazvaných VPADDB, VPADDW, VPADDD a VPADDQ. Všechny instrukce z této skupiny provádí součet 256bitových vektorů, ovšem liší se v tom, jak od sebe „izolují“ jednotlivé bajty nebo skupiny bajtů uložených v těchto vektorech. První z těchto instrukcí, tj. instrukce VPADDB, provádí součet po jednotlivých bajtech s tím, že pokud dojde k přenosu na hranici mezi jednotlivými bajty (tj. například mezi bitem 7 a 8), bude tento přenos ignorován. Výsledkem je přetečení obsahu jednotlivých bajtů, tj. za hodnotou 0×ff (255) následuje hodnota 0×00 (0) atd. Totéž platí i pro všech 31 následujících bajtů. Podobně se chovají i ostatní tři instrukce, jen s tím rozdílem, že VPADDW ignoruje přenos mezi bity 15 a 16 atd. (16×), instrukce VPADDD pracuje s 32bitovými dvojslovy (double word) a instrukce VPADDQ pracuje se 64bitovými čtyřslovy (quad word).
16. Čtvrtý demonstrační příklad: ukázka výsledků získaných instrukcemi VPADDB, VPADDW, VPADDD a VPADDQ
Ve čtvrtém a současně i dnešním posledním demonstračním příkladu jsou porovnány výsledky všech čtyř instrukcí součtu 256bitových vektorů s celočíselnými hodnotami. Povšimněte si, jak se díky tříadresovému kódu mohl zjednodušit zápis celého programu – mění se totiž vždy jen cílový registr, nikdy oba registry zdrojové:
[bits 32]
%include "linux_macros.asm"
;-----------------------------------------------------------------------------
section .data
hex_message:
times 8 db '?'
db ' '
hex_message_length equ $ - hex_message
align 32
avx_val_1 db 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
db 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
db 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
db 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
avx_val_2 db 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
db 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
db 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
db 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
;-----------------------------------------------------------------------------
section .bss
avx_tmp resb 32
;-----------------------------------------------------------------------------
section .text
global _start ; tento symbol ma byt dostupny i linkeru
_start:
mov ebx, avx_val_1 ; adresa prvniho vektoru
vmovdqu ymm0, [ebx] ; nacteni puvodniho vektoru do registru YMM0
print_avx_reg_as_hex ymm0 ; tisk hodnoty registru YMM0
mov ebx, avx_val_2 ; adresa druheho vektoru
vmovdqu ymm1, [ebx] ; nacteni puvodniho vektoru do registru YMM1
print_avx_reg_as_hex ymm1 ; tisk hodnoty registru YMM1
vpaddb ymm2, ymm0, ymm1 ; ymm2 = ymm0 + ymm1 (po bajtech)
print_avx_reg_as_hex ymm2 ; tisk hodnoty registru YMM2
vpaddw ymm2, ymm0, ymm1 ; ymm2 = ymm0 + ymm1 (po slovech)
print_avx_reg_as_hex ymm2 ; tisk hodnoty registru YMM2
vpaddd ymm2, ymm0, ymm1 ; ymm2 = ymm0 + ymm1 (po dvojslovech)
print_avx_reg_as_hex ymm2 ; tisk hodnoty registru YMM2
vpaddq ymm2, ymm0, ymm1 ; ymm2 = ymm0 + ymm1 (po ctyrslovech)
print_avx_reg_as_hex ymm2 ; tisk hodnoty registru YMM2
exit ; ukonceni procesu
%include "hex2string.asm"
17. Analýza získaných výsledků
Po spuštění tohoto příkladu se zobrazí následující sekvence hexadecimálních hodnot:
FFFFFFFF FFFFFFFF 00000000 FFFFFFFF 00000000 0000FFFF 00000000 000000FF 00000000 00000001 00000000 00000001 00000000 00000001 00000000 00000001 FFFFFFFF FFFFFF00 00000000 FFFFFF00 00000000 0000FF00 00000000 00000000 FFFFFFFF FFFF0000 00000000 FFFF0000 00000000 00000000 00000000 00000100 FFFFFFFF 00000000 00000000 00000000 00000000 00010000 00000000 00000100 00000000 00000000 00000001 00000000 00000000 00010000 00000000 00000100
Jednotlivé řádky lze snadno dekódovat.
Součet po bajtech:
vstup1: FF FF FF FF FF FF FF FF 00 00 00 00 FF FF FF FF 00 00 00 00 00 00 FF FF 00 00 00 00 00 00 00 FF
vstup2: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01
-----------------------------------------------------------------------------------------------
VPADDB: FF FF FF FF FF FF FF 00 00 00 00 00 FF FF FF 00 00 00 00 00 00 00 FF 00 00 00 00 00 00 00 00 00
změny: ^^ ^^ ^^ ^^
Součet po slovech:
vstup1: FFFF FFFF FFFF FFFF 0000 0000 FFFF FFFF 0000 0000 0000 FFFF 0000 0000 0000 00FF
vstup2: 0000 0000 0000 0001 0000 0000 0000 0001 0000 0000 0000 0001 0000 0000 0000 0001
-------------------------------------------------------------------------------
VPADDW: FFFF FFFF FFFF 0000 0000 0000 FFFF 0000 0000 0000 0000 0000 0000 0000 0000 0100
změny: ^^^^ ^^^^ ^^^^ ^^^^
Součet po dvouslovech:
vstup1: FFFFFFFF FFFFFFFF 00000000 FFFFFFFF 00000000 0000FFFF 00000000 000000FF
vstup2: 00000000 00000001 00000000 00000001 00000000 00000001 00000000 00000001
-----------------------------------------------------------------------
VPADDD: FFFFFFFF 00000000 00000000 00000000 00000000 00010000 00000000 00000100
změny: ^^^^^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
Součet po čtyřslovech:
vstup1: FFFFFFFFFFFFFFFF 00000000FFFFFFFF 000000000000FFFF 00000000000000FF
vstup2: 0000000000000001 0000000000000001 0000000000000001 0000000000000001
-------------------------------------------------------------------
VPADDQ: 0000000000000000 0000000100000000 0000000000010000 0000000000000100
změny: ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
18. Obsah navazujícího článku
Mezi nejdůležitější nové instrukce AVX patří instrukce provádějící operace typu gather/scatter. A právě s konceptem, na kterých jsou tyto instrukce postaveny, se seznámíme v navazujícím článku.
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 |
| 235 | sse_support.asm | detekce, zda mikroprocesor podporuje instrukce SSE | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_support.asm |
| 236 | sse_instr_formats.asm | instrukční formát SSE | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_instr_formats.asm |
| 237 | sse_value_unaligned1.asm | načtení konstanty do XMM registru (nezarovnaná adresa) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_value_unaligned1.asm |
| 238 | sse_value_unaligned2.asm | načtení konstanty do XMM registru (nezarovnaná adresa, ovšem vyžadováno je zarovnání) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_value_unaligned2.asm |
| 239 | sse_value_aligned.asm | načtení konstanty do XMM registru (zarovnaná adresa) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_value_aligned.asm |
| 240 | sse_addss.asm | skalární součet instrukcí ADDSS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_addss.asm |
| 241 | sse_addps.asm | vektorový součet instrukcí ADDPS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_addps.asm |
| 242 | sse_subss.asm | skalární rozdíl instrukcí SUBSS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_subss.asm |
| 243 | sse_subps.asm | skalární rozdíl instrukcí SUBPS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_subps.asm |
| 244 | sse_mulps.asm | součin prvků vektorů instrukcí MULPS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_mulps.asm |
| 245 | sse_divps.asm | podíl prvků vektorů instrukcí DIVPS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_divps.asm |
| 246 | sse_maxmin.asm | porovnání a výběr větších resp. menších prvků z dvojice vektorů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_maxmin.asm |
| 247 | sse_reciprocal.asm | přibližný výpočet převrácené hodnoty | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_reciprocal.asm |
| 248 | sse_sqrt.asm | výpočet druhé odmocniny prvků | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_sqrt.asm |
| 249 | sse_cmpeqps.asm | porovnání prvků vektorů na rovnost | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_cmpeqps.asm |
| 250 | sse_cmpltps.asm | porovnání prvků vektorů na relaci „menší než“ | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_cmpltps.asm |
| 251 | sse_inf_nan.asm | speciální hodnoty nekonečno a NaN v instrukčním souboru SSE | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_inf_nan.asm |
| 252 | sse_ordered.asm | zjištění, které prvky vektorů jsou porovnatelné | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_ordered.asm |
| 253 | sse_unpckhps.asm | proložení prvků dvou vektorů instrukcí UNPCKHPS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_unpckhps.asm |
| 254 | sse_unpcklps.asm | proložení prvků dvou vektorů instrukcí UNPCKLPS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_unpcklps.asm |
| 255 | sse_shufps.asm | použití instrukce SHUFPS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_shufps.asm |
| 256 | sse_cvtsi2ss.asm | konverze celého čísla na hodnotu typu single | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_cvtsi2ss.asm |
| 257 | sse_cvtss2si.asm | konverze hodnoty typu single na celé číslo | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_cvtss2si.asm |
| 258 | sse_cvtss2si_fract.asm | konverze neceločíselných hodnot na celé číslo | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_cvtss2si_fract.asm |
| 258 | sse_cvtss2si_special.asm | konverze speciálních hodnot na celé číslo | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_cvtss2si_special.asm |
| 259 | sse_ldmxcsr.asm | načtení nové hodnoty do stavového a řídicího registru MXCSR z paměti | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_ldmxcsr.asm |
| 260 | sse_stmxcsr.asm | uložení hodnoty stavového a řídicího registru MXCSR do paměti | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_stmxcsr.asm |
| 261 | sse2_support.asm | detekce podpory instrukcí SSE2 | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_support.asm |
| 262 | sse2_paddb.asm | součet dvojice vektorů 16×8 bitů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_paddb.asm |
| 263 | sse2_paddw.asm | součet dvojice vektorů 8×16 bitů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_paddw.asm |
| 264 | sse2_paddsb.asm | součet bezznaménkových bajtů se saturací | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_paddsb.asm |
| 265 | sse2_paddusb.asm | součet bajtů se znaménkem se saturací | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_paddusb.asm |
| 266 | sse2_sqrtpd.asm | výpočet druhé odmocniny vektorů s prvky typu double | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_sqrtpd.asm |
| 267 | sse2_sqrtpd_negative.asm | výpočet druhé odmocniny záporných hodnot | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_sqrtpd_negative.asm |
| 268 | sse2_sqrtpd_special.asm | výpočet druhé odmocniny nekonečen a NaN | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_sqrtpd_special.asm |
| 269 | sse2_shift_right_words.asm | bitový posun 128bitového vektoru, omezení prvků na 16bitová slova | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_shift_right_words.asm |
| 270 | sse2_shift_right_dwords.asm | bitový posun 128bitového vektoru, omezení prvků na 32bitová slova | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_shift_right_dwords.asm |
| 271 | sse2_shift_right_qwords.asm | bitový posun 128bitového vektoru, omezení prvků na 64bitová slova | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_shift_right_qwords.asm |
| 272 | sse2_shift_right_dqwords.asm | posun 128bitového vektoru po celých bajtech | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_shift_right_dqwords.asm |
| 273 | sse2_and.asm | tři varianty instrukce bitového součinu | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_and.asm |
| 274 | sse2_and_not.asm | dvě varianty instrukce bitového součinu s negací | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_and_not.asm |
| 275 | sse2_cvtps2dq.asm | konverzní instrukce CVTPS2DQ | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_cvtps2dq.asm |
| 276 | sse2_cvtps2dq_neg.asm | konverze záporných hodnot na celá čísla | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_cvtps2dq_neg.asm |
| 277 | sse2_cvtps2dq_special.asm | konverze speciálních hodnot na celá čísla | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_cvtps2dq_special.asm |
| 278 | sse2_cvtps2pd.asm | konverze vektoru s prvky typu single na prvky typu double | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_cvtps2pd.asm |
| 279 | sse2_cvtpd2ps.asm | konverze vektoru s prvky typu double na prvky typu single | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_cvtpd2ps.asm |
| 280 | sse2_cvtpd2ps_special.asm | konverze vektoru s prvky typu double na prvky typu single (speciální hodnoty) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_cvtpd2ps_special.asm |
| 281 | sse2_add_delta.asm | přičtení konstanty ke všem prvků pole (vektoru) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_add_delta.asm |
| 282 | sse2_pmovmskb.asm | přečtení příznaku záporné hodnoty pro všechny bajty ve 128bitovém vektoru | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_pmovmskb.asm |
| 283 | sse2_unpckhpd.asm | extrakce a proložení prvků o šířce 64bitů ze 128bitových vektorů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_unpckhpd.asm |
| 284 | sse2_unpcklpd.asm | extrakce a proložení prvků o šířce 64bitů ze 128bitových vektorů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_unpcklpd.asm |
| 285 | sse2_punpckhbw.asm | extrakce a proložení jednotlivých bajtů ze 128bitových vektorů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_punpckhbw.asm |
| 286 | sse2_punpcklbw.asm | extrakce a proložení jednotlivých bajtů ze 128bitových vektorů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_punpcklbw.asm |
| 287 | sse2_pshufd.asm | komplikovanější proložení prvků vektorů instrukcí PSHUFD | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_pshufd.asm |
| 288 | sse2_add_delta.asm | přičtení konstanty ke všem bajtům ve 128bitovém vektoru | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_add_delta.asm |
| 289 | sse2_add_delta_32bytes.asm | rozšíření předchozího příkladu na dvojici 128bitových vektorů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_add_delta_32bytes.asm |
| 290 | sse2_dot_product_16bytes.asm | skalární součin osmibitových hodnot uložených ve dvojici 128bitových vektorů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_dot_product_16bytes.asm |
| 291 | avx_support.asm | otestování podpory instrukcí AVX pomocí CPUID | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/avx_support.asm |
| 292 | avx_print_register.asm | tisk obsahu 256bitového vektorového registru | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/avx_print_register.asm |
| 293 | avx_vpaddb.asm | instrukce VPADDB | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/avx_vpaddb.asm |
| 294 | avx_add_variants.asm | ukázka výsledků získaných instrukcemi VPADDB, VPADDW, VPADDD a VPADDQ | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/avx_add_variants.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 - CMPPS — Compare Packed Single Precision Floating-Point Values
https://www.felixcloutier.com/x86/cmpps - ADDPS — Add Packed Single Precision Floating-Point Values
https://www.felixcloutier.com/x86/addps - SUBPS — Subtract Packed Single Precision Floating-Point Values
https://www.felixcloutier.com/x86/subps - SQRTPS — Square Root of Single Precision Floating-Point Values
https://www.felixcloutier.com/x86/sqrtps - RSQRTPS — Compute Reciprocals of Square Roots of Packed Single Precision Floating-PointValues
https://www.felixcloutier.com/x86/rsqrtps - UNPCKHPS — Unpack and Interleave High Packed Single Precision Floating-Point Values
https://www.felixcloutier.com/x86/unpckhps - UNPCKLPS — Unpack and Interleave Low Packed Single Precision Floating-Point Values
https://www.felixcloutier.com/x86/unpcklps - SHUFPS — Packed Interleave Shuffle of Quadruplets of Single Precision Floating-Point Values
https://www.felixcloutier.com/x86/shufps - CVTSI2SS — Convert Doubleword Integer to Scalar Single Precision Floating-Point Value
https://www.felixcloutier.com/x86/cvtsi2ss - CVTSS2SI — Convert Scalar Single Precision Floating-Point Value to Doubleword Integer
https://www.felixcloutier.com/x86/cvtss2si - CVTTSS2SI — Convert With Truncation Scalar Single Precision Floating-Point Value to Integer
https://www.felixcloutier.com/x86/cvttss2si - CVTPI2PS — Convert Packed Dword Integers to Packed Single Precision Floating-Point Values
https://www.felixcloutier.com/x86/cvtpi2ps - CVTPS2PI — Convert Packed Single Precision Floating-Point Values to Packed Dword Integers
https://www.felixcloutier.com/x86/cvtps2pi - CVTTPS2PI — Convert With Truncation Packed Single Precision Floating-Point Values to PackedDword Integers
https://www.felixcloutier.com/x86/cvttps2pi - Streaming SIMD Extensions 2 (SSE2)
https://softpixel.com/~cwright/programming/simd/sse2.php - Redundant SSE instructions
https://www.pagetable.com/?p=19 - AVX2
https://wiki.osdev.org/AVX2 - x86/x64 SIMD Instruction List (SSE to AVX512)
https://www.officedaytime.com/simd512e/ - NASM instruction list
https://userpages.cs.umbc.edu/chang/cs313/nasmdoc/html/nasmdocb.html