Od instrukční sady SSE k sadě SSE2

13. 3. 2025
Doba čtení: 68 minut

Sdílet

Autor: Depositphotos
Proč se většina nově přidaných instrukcí SSE omezuje na práci s hodnotami typu single, když je mnoho aplikací založených na celočíselných datech nebo naopak používá typ double? Odpovědí byla instrukční sada SSE2.

Obsah

1. Od instrukční sady SSE k sadě SSE2

2. Nové datové typy podporované instrukční sadou SSE2

3. Nové instrukce přidané v rámci rozšíření instrukční sady SSE2

4. Seznam všech aritmetických instrukcí SSE2

5. Logické instrukce – rozšíření možností zavedených v rámci MMX

6. Instrukce pro konverzi dat

7. Instrukce pro porovnání skalárních hodnot nebo vektorů

8. Instrukce pro načítání či ukládání skalárů a vektorů

9. Prokládání dat, shuffling atd.

10. Řízení cache

11. Praktická část

12. Detekce podpory instrukcí SSE2

13. Součty vektorů s různými počty a typy prvků

14. Součet dvojice vektorů 16×8 bitů

15. Součet dvojice vektorů 8×16 bitů

16. Součet bezznaménkových bajtů se saturací

17. Součet bajtů se znaménkem se saturací

18. Obsah navazujícího článku

19. Repositář s demonstračními příklady

20. Odkazy na Internetu

1. Od instrukční sady SSE k sadě SSE2

Poměrně záhy po uvedení instrukční sady SSE se mnozí vývojáři začali vcelku logicky ptát, z jakého důvodu se vlastně většina nově přidaných instrukcí omezuje pouze na práci s numerickými hodnotami s jednoduchou přesností (single), když je mnoho aplikací založených na celočíselných datech (osmibitových bajtech, šestnáctibitových slovech, 32bitových slovech atd.), které by tak mohly využívat všech možností nabízených novými 128bitovými registry technologie SSE. Vývojáři pracující především na vývoji algoritmů z oblasti numerické matematiky by naopak uvítali práci s numerickými hodnotami s dvojitou přesností (double) uloženými v 64 bitech (tj. v případě 128bitových registrů by bylo možné do těchto registrů ukládat dvojice čísel s dvojitou přesností – i to by mohlo představovat poměrně významné zvýšení výpočetního výkonu).

Odpovědí na oba v podstatě protichůdné požadavky byla instrukční sada pojmenovaná jednoduše SSE2, která pochází z roku 2001 (je dobré si uvědomit, že SIMD jsou s námi na platformě x86 již dlouho). Tato instrukční sada byla zpočátku použita v mikroprocesorech Intel Pentium 4 a Intel Xeon, později se však rozšířila i na mikroprocesory firmy AMD (Athlon64, Opteron), což umožnilo její širokou adaptaci.

Technologie SSE2 vývojářům přinesla nové instrukce a samozřejmě i podstatné změny v interní struktuře vektorové výpočetní jednotky, ovšem počet registrů ani jejich bitová šířka se (alespoň prozatím) nijak nezměnila. Programátoři používající, ať již přímo či nepřímo, rozšíření instrukční sady SSE2, mohli do osmice 128bitových registrů pojmenovaných XMM0XMM7 ukládat celkem šest různých typů vektorů, resp. přesněji řečeno pracovat s vektory, jejichž prvky jsou šesti různých typů (formátů). Základ zůstal nezměněn – jednalo se o čtyřprvkové vektory obsahující čísla reprezentovaná ve formátu plovoucí řádové čárky, přičemž každé číslo bylo uloženo v 32 bitech (4×32=128 bitů), což odpovídá typu single/float definovanému v normě IEEE 754.

2. Nové datové typy podporované instrukční sadou SSE2

Kromě výše uvedeného typu vektoru 4×single byly v rámci SSE2 ještě zavedeny dvouprvkové vektory obsahující taktéž hodnoty reprezentované ve formátu plovoucí řádové čárky, ovšem tentokrát se jednalo o čísla uložená v 64 bitech (2×64=128) odpovídající dvojité přesnosti (double) z normy IEEE 754 (a to včetně volby zaokrouhlovacích režimů atd.).

Zbývají nám ovšem ještě čtyři další podporované datové typy. V těchto případech se jedná o vektory s celočíselnými prvky: šestnáctiprvkové vektory s osmibitovými hodnotami (zpracování obrazů), osmiprvkové vektory s šestnáctibitovými hodnotami (zpracování zvukových vzorků), čtyřprvkové vektory s 32bitovými hodnotami a konečně dvouprvkové vektory s 64bitovými celočíselnými hodnotami.

Obrázek 1: Nové typy vektorů, s kterými je nově možné nativně pracovat na mikroprocesorech podporujících technologii SSE2.

Instrukce SSE2 je možné využít i v některých oblastech numerické matematiky, i když je na tomto místě nutné říct, že přímo v SSE2 nejsou podporována čísla s rozšířenou přesností (extended), takže v některých případech může dojít při výpočtech v jednotce SSE2 (a nikoli FPU) ke kumulaci chyb ve výsledku. Nicméně kombinace instrukcí určených pro matematický koprocesor s instrukcemi určenými pro funkční jednotku SSE2 byla možná a v mnoha případech dokonce nutná, protože matematický koprocesor kromě základních aritmetických operací podporuje například i výpočet goniometrických funkcí, logaritmů atd.

Poznámka: chybí podpora pro datový typ half float, tj. šestnáctibitových hodnot s plovoucí řádovou čárkou. Jejich použití se rozšířilo zejména s rozmachem neuronových sítí a v současnosti i LLM (přesněji embedding vektorů).

3. Nové instrukce přidané v rámci rozšíření instrukční sady SSE2

Zatímco se v rozšiřující instrukční sadě SSE popsané v předchozích třech článcích nachází „pouze“ 70 nových instrukcí, byli tvůrci instrukční sady SSE2 mnohem velkorysejší, protože navrhli a posléze i implementovali hned 144 nových instrukcí, což mimochodem přibližně odpovídá počtu všech základních instrukcí procesorů x86 (pokud samozřejmě nepočítáme všechny povolené adresní režimy a další instrukce, které byly na tuto architekturu postupně „nabaleny“). Tento velký počet nových instrukcí souvisí jak s jíž zmíněnou podporou šesti nových datových typů popsaných v předchozí kapitole (včetně více než dvaceti zcela nových konverzních funkcí), tak i s novými režimy přístupu k prvkům uloženým ve vektorech a se zcela novými operacemi, které byly navrženy pro podporu algoritmů pro 3D grafiku a taktéž pro práci s videem.

Všechny instrukce, které byly přidány v rozšiřující instrukční sadě SSE2, je možné rozdělit do několika kategorií:

  1. Aritmetické operace prováděné s celými čísly (včetně součtu a rozdílu se saturací)
  2. Aritmetické operace prováděné s čísly s plovoucí řádovou čárkou (single, double)
  3. Logické operace (některé jsou prováděny pro všech 128 bitů)
  4. Bitové posuny prvků o různé bitové šířce
  5. Porovnávací (komparační, relační) operace
  6. Konverzní funkce
  7. Konverze prvků uložených ve vektorech (zvýšení či snížení bitové šířky, shuffling apod.)
  8. Načítání a ukládání dat do operační paměti
  9. Řízení vyrovnávací paměti (cache)

O těchto instrukcích se zmíníme v navazující kapitole.

Obrázek 2: Ukázka urychlení operace součtu 1024 číselných prvků reprezentovaných ve formátu s plovoucí řádovou čárkou. Celkem byly použity čtyři algoritmy pro součet:
1 – využití instrukcí FPU
2 – využití instrukcí FPU s rozbalením smyčky
3 – využití vektorových operací SSE/SSE2
4 – využití vektorových operací SSE/SSE2 s rozbalením smyčky

4. Seznam všech aritmetických instrukcí SSE2

Podobně jako u již dříve popsaných rozšiřujících instrukčních sad MMX, 3DNow! a SSE se SIMD instrukcemi, tvoří i u instrukční sady SSE2 nejpodstatnější část nové instrukce určené pro provádění aritmetických operací nad vektory prvků různých datových typů. Všechny nové operace implementované v rámci SSE2 jsou vypsány v následující tabulce. Ve třetím sloupci je naznačeno, jaké vektory jsou danou operací zpracovávány, přičemž první číslo znamená počet prvků vektoru, za nímž následuje bitová šířka jednotlivých prvků:

# Instrukce Operace/funkce Struktura vektoru Datový typ Saturace? Poznámka
1 ADDPD součet 2×64bit double ×  
2 ADDSD součet 1×64bit double × operace provedena jen s pravým prvkem vektorů
3 SUBPD rozdíl 2×64bit double ×  
4 SUBSD rozdíl 1×64bit double × operace provedena jen s pravým prvkem vektorů
5 MULPD součin 2×64bit double ×  
6 MULSD součin 1×64bit double × operace provedena jen s pravým prvkem vektorů
7 DIVPD podíl 2×64bit double ×  
8 DIVSD podíl 1×64bit double × operace provedena jen s pravým prvkem vektorů
9 PADDB součet 16×8bit integer ne  
10 PADDW součet 8×16bit integer ne  
11 PADDD součet 4×32bit integer ne  
12 PADDQ součet 2×64bit integer ne  
13 PADDSB součet 16×8bit integer ano  
14 PADDSW součet 8×16bit integer ano  
15 PADDUSB součet 16×8bit unsigned ano  
16 PADDUSW součet 8×16bit unsigned ano  
             
17 PSUBB rozdíl 16×8bit integer ne  
18 PSUBW rozdíl 8×16bit integer ne  
19 PSUBD rozdíl 4×32bit integer ne  
20 PSUBQ rozdíl 2×64bit integer ne  
21 PSUBSB rozdíl 16×8bit integer ano  
22 PSUBSW rozdíl 8×16bit integer ano  
23 PSUBUSB rozdíl 16×8bit unsigned ano  
24 PSUBUSW rozdíl 8×16bit unsigned ano  
             
25 MAXPD maximu 2×64bit double ×  
26 MAXSD maximum 2×64bit double × operace provedena jen s pravým prvkem vektorů
27 MINPD minimum 2×64bit double ×  
28 MINSD minimum 2×64bit double × operace provedena jen s pravým prvkem vektorů
             
29 PMADDWD součin/add 8×16bit integer ×  
30 PMULHW součin 8×16bit integer × vrací vektor horních 16 bitů výsledků
31 PMULLW součin 8×16bit integer × vrací vektor dolních 16 bitů výsledků
32 PMULUDQ součin 4×32bit integer × 64 bitový výsledek pro každý součin
             
33 RCPPS převrácená hodnota 4×32bit single × aproximace
34 RCPSS převrácená hodnota 4×32bit single × operace provedena jen s pravým prvkem vektorů
35 SQRTPD druhá odmocnina 2×64bit double ×  
36 SQRTSD druhá odmocnina 2×64bit double ×   operace provedena jen s pravým prvkem vektorů
Poznámka: některé z těchto instrukcí již známe, protože jsou součástí původní instrukční sady SSE.

Obrázek 3: Ukázka urychlení operace výpočtu skalárního součinu pro 1024 trojrozměrných vektorů. Prvky vektorů jsou opět reprezentovány ve formátu s plovoucí řádovou čárkou. Celkem byly použity čtyři algoritmy pro součet:
1 – využití instrukcí FPU
2 – využití instrukcí FPU s rozbalením smyčky
3 – využití vektorových operací SSE/SSE2
4 – využití vektorových operací SSE/SSE2 s rozbalením smyčky
Důvod, proč ze došlo k většímu urychlení při použití SSE/SSE2 je jednoduchý: s jednou načtenými daty (vektory) se provádělo větší množství operací, takže se zde v menší míře projevila latence operačních pamětí a další externí vlivy. Sice je možné najít i algoritmy, u nichž je dosaženo ještě většího urychlení výpočtů, ale v praxi je zhruba trojnásobné urychlení (podobně jako na tomto grafu) považováno za poměrně velký úspěch.

5. Logické instrukce – rozšíření možností zavedených v rámci MMX

V instrukční sadě SSE2 můžeme kromě aritmetických instrukcí najít i nové logické instrukce a taktéž instrukce určené pro provádění logických či aritmetických posunů. Ve skutečnosti se vlastně jedná o pouhé rozšíření stávajících instrukcí MMX takovým způsobem, aby bylo možné pracovat s novými 128bitovými vektory, popř. s daty uloženými v operační paměti v bloku šestnácti bajtů (16×8=128 bitů). Nejprve si popišme instrukce pro aritmetické a logické posuny. Ty dokážou pracovat s celočíselnými hodnotami o velikosti 16, 32, 64 či 128 bitů, tj. každá část vektoru se posouvá zvlášť (je tedy například velký rozdíl mezi posunem jednoho 128bitového čísla a dvojice 64bitových čísel). Při logických posunech se do nového bitu nasouvá vždy logická nula (nikoli příznak carry), u aritmetických posunů se opakuje hodnota původního nejvyššího bitu, tj. instrukce pracují přesně tak, jak to programátoři očekávají:

# Instrukce Operace/funkce Struktura vektoru Datový typ Poznámka
1 PSLLDQ logický posun doleva 1×128bitů integer  
2 PSLLQ logický posun doleva 2×64bitů integer  
3 PSLLD logický posun doleva 4×32bitů integer  
4 PSLLW logický posun doleva 8×16bitů integer  
5 PSRLDQ logický posun doprava 1×128bitů integer  
6 PSRLQ logický posun doprava 2×64bitů integer  
7 PSRLD logický posun doprava 4×32bitů integer  
8 PSRLW logický posun doprava 8×16bitů integer  
9 PSRAD aritmetický posun doprava 4×32bitů integer  
10 PSRAW aritmetický posun doprava 8×16bitů integer  

Následuje seznam instrukcí určených pro provádění logických operací nad vektory různé délky. V některých případech (PAND, POR, PXOR) se jedná o „pouhé“ rozšíření původních MMX instrukcí takovým způsobem, aby tyto instrukce mohly pracovat se 128bitovými vektory. Dokonce i operační kódy instrukcí zůstávají stejné, ovšem v případě SSE2 je před vlastním instrukčním kódem uveden prefix 0×66, takže jsou instrukce o jeden bajt delší (to ostatně platí i pro aritmetické operace popsané o několik odstavců výše):

# Instrukce Operace/funkce Struktura vektoru Datový typ Poznámka
1 PAND and 1×128 bitů integer  
2 PANDN not and 1×128 bitů integer první operand je negován
3 POR or 1×128 bitů integer  
4 PXOR xor 1×128 bitů integer  
5 ANDPD and 2×64 bitů double  
6 ORPD or 2×64 bitů double  
7 XORPD xor 2×64 bitů double  
8 ANDNPD not and 2×64 bitů double první operand je negován
9 ANDNPS not and 4×32 bitů single první operand je negován
Poznámka: operace AND s negací jednoho operandu se poměrně často používá v 2D grafice (za předpokladu, že se vykreslování – rendering – provádí softwarově a nikoli na GPU).

6. Instrukce pro konverzi dat

Při implementaci mnoha typů algoritmů, především pak při zpracování obrazových a zvukových datových toků, se mnohdy programátoři dostanou do situace, kdy potřebují zkonvertovat data do jiného formátu, než v jakém byla původně uložena. Pro tyto účely jsou v instrukční sadě SSE2 k dispozici dvě desítky konverzních instrukcí začínajících prefixem CVT, vypsaných v tabulce pod tímto odstavcem. Opět platí, že konverze jsou prováděny paralelně:

# Instrukce Konverze z… Konverze do…
1 CVTDQ2PD 2×32bitový integer 2×64bitový double
2 CVTDQ2PS 4×32bitový integer 4×32bitový single
3 CVTPD2PI 2×64bitový double 2×32bitový integer v MMX registru
4 CVTPD2DQ 2×64bitový double 2×32bitový integer ve spodní polovině MMX registru
5 CVTPD2PS 2×64bitový double 2×32bitový single ve spodní polovině MMX registru
6 CVTPI2PD 2×32bitový integer 2×32bitový single ve spodní polovině MMX registru
7 CVTPS2DQ 4×32bitový single 4×32bitový integer
8 CVTPS2PD 2×32bitový single 2×64bitový double
9 CVTSD2SI 1×64bitový double 1×32bitový integer v pracovním registru (CPU)
10 CVTTPD2PI 2×64bitový double 2×32bitový integer (odseknutí desetinné části)
11 CVTTPD2DQ 2×64bitový double 2×32bitový integer (odseknutí desetinné části)
12 CVTTPS2DQ 4×32bitový single 4×32bitový integer (odseknutí desetinné části)
13 CVTTPS2PI 2×32bitový single 2×32bitový integer (odseknutí desetinné části) v MMX registru
14 CVTTSD2SI 1×64bitový double 1×32bitový integer (odseknutí desetinné části) v pracovním registru
15 CVTTSS2SI 1×32bitový single 1×32bitový integer (odseknutí desetinné části) v pracovním registru
16 CVTSI2SD 1×32bitový integer 1×64bitový double
17 CVTSI2SS 1×32bitový integer 1×32bitový single
18 CVTSD2SS 1×64bitový double 1×32bitový single (horní polovina registru se nemění)
19 CVTSS2SD 1×32bitový single 1×64bitový double
20 CVTSS2SI 1×32bitový single 1×32bitový integer v pracovním registru (CPU)
Poznámka: opět si připomeňme, že některé z těchto instrukcí již známe, protože byly součástí původní sady SSE.

Obrázek 28: Univerzální konverzní funkce PSHUF byla v instrukční sadě SSE2 rozšířena tak, aby dokázala pracovat i se 128bitovými registry (existuje několik variant této instrukce, další varianty byly zavedeny až v SSE3 atd).

Poznámka: popravdě řečeno by se pro mnoho serverových aplikací hodily ještě instrukce pro konverzi mezi UTF-8 a UCS-4, což je po obvodové stránce poměrně jednoduchá bitová transformace, ovšem obtížně reprezentovatelná v reálně existujících strojových instrukcích.

7. Instrukce pro porovnání skalárních hodnot nebo vektorů

Dalších několik instrukcí dokáže porovnat vektory různých typů a buď nastavit prvky výsledného vektoru či přímo ovlivnit příznakový registru EFLAGS (což je poměrně užitečná novinka). Jedná se o následující instrukce:

# Instrukce Prováděná operace Příznaky uloženy do
1 CMP??SD porovnání dvou hodnot typu double (dolní polovina registru) registr XMM
2 CMP??PD porovnání dvou registrů s hodnotami double registr XMM
3 COMISD porovnání dvou hodnot typu double (dolní polovina registru) příznakový registr EFLAGS
4 UCOMISD porovnání dvou hodnot typu double (dolní polovina registru) příznakový registr EFLAGS
5 PCMP??B porovnání vektorů s 8bitovými integery registr XMM
6 PCMP??W porovnání vektorů se 16bitovými integery registr XMM
7 PCMP??D porovnání vektorů s 32bitovými integery registr XMM

Většina assemblerů rozpoznává následující znaky, kterými lze nahradit otazníky v názvu instrukce. Tyto znaky specifikují způsob porovnání a v instrukční slovu jsou uloženy ve zvláštním bajtu (jedná se vlastně o třetí operand těchto instrukcí):

# Znaky Význam
1 EQ rovnost
2 LT menší než
3 LE menší nebo rovno
4 NE nerovnost
5 NLT není menší než (tedy větší nebo rovno)
6 NLE větší než
7 ORD porovnatelné hodnoty
8 UNORD neporovnatelné hodnoty

8. Instrukce pro načítání či ukládání skalárů a vektorů

Další část instrukcí slouží pro načtení či naopak pro uložení skalárních hodnot z/do registrů XMM. Některé z těchto instrukcí jsme již viděli ve variantě pro SSE, další jsou nově zavedené právě pro SSE2:

Nově jsou přidány instrukce pro přenosy bez použití cache, což může být velmi užitečná optimalizace (samozřejmě v závislosti na řešeném problému). A poslední dvě instrukce pracují s takzvanými maskami. Těmito instrukcemi se budeme zabývat v samostatné kapitole.

Poznámka: povšimněte si, že nyní je konečně možné přenášet data mezi XMM a MMX registry a tedy používat jak SIMD, tak FPU se stejnými daty nebo alternativně používat SSE2 společně s MMX (pokud to dává smysl).

9. Prokládání dat, shuffling atd.

Nejzajímavější změny, které byly v instrukční sadě SSE2 provedeny, se týkají instrukcí pro prokládání dat ve vektorových registrech, pro přesuny prvků (shuffling) v rámci registrů atd. Těchto instrukcí je nyní celá řada a doplňují tak původní trojici instrukcí UNPCKHPS, UNPCKLPS a SHUFPS, které jsme si popsali minule. Tyto instrukce sice mohou být poněkud složitější na pochopení (a příslušný vzor nerozpoznají ani mnohé překladače), ale jsou velmi užitečné:

# Instrukce Prováděná operace
1 MOVQ přenos 64bitové hodnoty, horní polovina cílového XMM registru se vynuluje
2 MOVSD přenos 64bitové hodnoty, horní polovina cílového registru se nemusí změnit
3 MOVAPD přenos 128bitové hodnoty, která musí být v paměti zarovnána
4 MOVUPD přenos 128bitové hodnoty, která nemusí být v paměti zarovnána
5 MOVHPD přenos horních 64 bitů XMM registru
6 MOVLPD přenos dolních 64 bitů XMM registru
7 MOVDQ2Q přenos 64bitové hodnoty mezi XMM a MMX registry
8 MOVQ2DQ přenos 64bitové hodnoty mezi XMM a MMX registry
9 MOVNTPD uložení 128 bitů do paměti bez použití cache
10 MOVNTDQ uložení 128 bitů do paměti bez použití cache
11 MOVNTI přenos 32bitové hodnoty bez použití cache
12 MASKMOVDQU uložení vybraných bajtů z XMM registru do paměti
13 PMOVMSKB vytvoření masky na základě znaménkových bitů z každého bajtu XMM registru
# Instrukce Prováděná operace
1 PSHUFD shuffle, s 32bitovými prvky
2 PSHUFHW shuffle, se 16bitovými prvky
3 PSHUFLW shuffle, se 16bitovými prvky
4 UNPCKHPD rozbalení prvků, 64bitové hodnoty v horních 64bitech
5 UNPCKLPD rozbalení prvků, 64bitové hodnoty v dolních 64bitech
6 PUNPCKHBW rozbalení a proložení prvků, 8 osmibitových hodnot
7 PUNPCKHWD rozbalení a proložení prvků, 4 16bitové hodnoty
8 PUNPCKHDQ rozbalení a proložení prvků, 2 32bitové hodnoty
9 PUNPCKHQDQ rozbalení a proložení 64bitových hodnot
10 PUNPCKLBW obdoba PUNPCKHBW, ale pro spodních 64 bitů vektorového registru
11 PUNPCKLWD obdoba PUNPCKHWD, ale pro spodních 64 bitů vektorového registru
12 PUNPCKLDQ obdoba PUNPCKHDQ, ale pro spodních 64 bitů vektorového registru
13 PUNPCKLQDQ obdoba PUNPCKHQDQ, ale pro spodních 64 bitů vektorového registru
14 PACKSSDW převod 32bitových hodnot do 16bitové hodnoty se saturací (signed)
15 PACKSSWB převod 16bitových hodnot do osmibitové hodnoty se saturací (signed)
16 PACKUSWB převod 16bitových hodnot do osmibitové hodnoty se saturací (unsigned)
Poznámka: tyto instrukce ještě budou popsány podrobněji, protože jsou velmi důležité.

10. Řízení cache

Posledních několik instrukcí slouží pro řízení cache; takže je například možné vyprázdnění cache před prováděním složitějších výpočtů na stejným (větším) polem atd.:

# Instrukce Prováděná operace
1 CLFLUSH vyprázdnění cache
2 LFENCE zajištění, že všechny instrukce před touto instrukcí budou dokončeny (bariéra)
3 MFENCE zajištění, že všechny operace čtení a zápise před touto instrukcí budou dokončeny

11. Praktická část

Podobně jako v předchozích článcích se i dnes vydáme do temných zákoutí assembleru. Ukážeme si několik příkladů využití vybraných instrukcí ze sady SSE2. Ovšem ty složitější (a nutno dodat, že i zajímavější) instrukce budou ukázány příště, kdy téma SSE2 dokončíme. Všechny dále uvedené demonstrační příklady jsou napsány pro Netwide Assembler (NASM) a jsou přeložitelné a spustitelné v Linuxu.

12. Detekce podpory instrukcí SSE2

Začneme již klasickým příkladem – využitím instrukce CPUID pro zjištění, zda mikroprocesor vůbec podporuje instrukce SSE2. Většina mikroprocesorů x86, resp. x86–64 vyrobená v posledních dvaceti letech by měla plně podporovat většinu již popsaných SIMD rozšíření, tedy MMX, SSE i SSE2 (ovšem nikoli 3DNow!, což však nevadí). Povšimněte si, že podpora SSE2 je vyjádřena příznakovým bitem, jehož index je o jedničku vyšší, než index příznaku podpory SSE:

[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
 
;-----------------------------------------------------------------------------
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: 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: podpora SSE2
        jnc sse2_not_supported
        print_string  sse2_supported, sse2_supported_length
 
sse2_not_supported:
 
        exit                         ; ukonceni procesu
 
 
%include "hex2string.asm"

Výsledky mohou vypadat například takto:

00000020 BFEBFBFF GenuineIntel
MMX supported
SSE supported
SSE2 supported

13. Součty vektorů s různými počty a typy prvků

V rámci instrukční sady SSE2 se rozšířily možnosti instrukcí provádějících vektorové součty. Situace je vlastně velmi jednoduchá – tyto instrukce existovaly již v sadě MMX, kde pracovaly s 64bitovými vektory. V SSE2 došlo k rozšíření těchto instrukcí takovým způsobem, že bylo možné použít i registry XMM s dvojnásobnou šířkou a tím pádem i s vektory, které obsahují dvojnásobný počet prvků. Čistě teoreticky tak lze dosáhnout dvojnásobného výpočetního výkonu u těchto operací (v praxi to samozřejmě bude méně):

1 PADDB součet 16×8bit integer ne  
2 PADDW součet 8×16bit integer ne  
3 PADDD součet 4×32bit integer ne  
4 PADDQ součet 2×64bit integer ne  
5 PADDSB součet 16×8bit integer ano  
6 PADDSW součet 8×16bit integer ano  
7 PADDUSB součet 16×8bit unsigned ano  
8 PADDUSW součet 8×16bit unsigned ano  

Zajímavé bude zjistit, jak se vlastně liší kódování stejných instrukcí ze sady MMX a SSE2. To, o kterou instrukci se jedná, se zjistí z jejich parametrů:

section .text
        paddb mm0, mm1
        paddb xmm0, xmm1
 
        paddsb mm0, mm1
        paddsb xmm0, xmm1
 
        paddusb mm0, mm1
        paddusb xmm0, xmm1
 
        paddw mm0, mm1
        paddw xmm0, xmm1
 
        paddsw mm0, mm1
        paddsw xmm0, xmm1
 
        paddusw mm0, mm1
        paddusw xmm0, xmm1
 
        paddd mm0, mm1
        paddd xmm0, xmm1
 
        paddq mm0, mm1
        paddq xmm0, xmm1

Z výsledků je patrné, že nové SSE2 instrukce pouze přidávají prefixový bajt 0×66, zbytek instrukčního slova je shodný:

     1                                  [bits 32]
     2
     3                                  ;-----------------------------------------------------------------------------
     4                                  section .text
     5 00000000 0FFCC1                          paddb mm0, mm1
     6 00000003 660FFCC1                        paddb xmm0, xmm1
     7
     8 00000007 0FECC1                          paddsb mm0, mm1
     9 0000000A 660FECC1                        paddsb xmm0, xmm1
    10
    11 0000000E 0FDCC1                          paddusb mm0, mm1
    12 00000011 660FDCC1                        paddusb xmm0, xmm1
    13
    14 00000015 0FFDC1                          paddw mm0, mm1
    15 00000018 660FFDC1                        paddw xmm0, xmm1
    16
    17 0000001C 0FEDC1                          paddsw mm0, mm1
    18 0000001F 660FEDC1                        paddsw xmm0, xmm1
    19
    20 00000023 0FDDC1                          paddusw mm0, mm1
    21 00000026 660FDDC1                        paddusw xmm0, xmm1
    22
    23 0000002A 0FFEC1                          paddd mm0, mm1
    24 0000002D 660FFEC1                        paddd xmm0, xmm1
    25
    26 00000031 0FD4C1                          paddq mm0, mm1
    27 00000034 660FD4C1                        paddq xmm0, xmm1
    28

14. Součet dvojice vektorů 16×8 bitů

V dnešním druhém demonstračním příkladu je ukázán součet dvou šestnácti prvkových vektorů s hodnotami typu byte. Nejprve načteme dvojici vektorů do SSE registrů XMM0 a XMM1. Následně provedeme součet obou vektorů instrukcí PADDB, která provádí součet bajt po bajtu (tedy paralelně se sečte šestnáct hodnot prvního vektoru se šestnácti hodnotami vektoru druhého). V případě, že výsledek přesáhne hodnotu 255, dojde k přetečení:

[bits 32]
 
%include "linux_macros.asm"
 
;-----------------------------------------------------------------------------
section .data
 
hex_message:
         times 8 db '?'
         db ' '
         hex_message_length equ $ - hex_message
 
align 16
sse_val_1 db 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0
sse_val_2 db 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
 
;-----------------------------------------------------------------------------
section .bss
sse_tmp resb 16
 
 
;-----------------------------------------------------------------------------
section .text
        global _start                ; tento symbol ma byt dostupny i linkeru
 
_start:
        mov ebx, sse_val_1
        movaps xmm0, [ebx]           ; nacteni prvni hodnoty do registru XMM0
        print_sse_reg_as_hex xmm0    ; tisk hodnoty registru XMM0
 
        mov ebx, sse_val_2
        movaps xmm1, [ebx]           ; nacteni druhe hodnoty do registru XMM1
        print_sse_reg_as_hex xmm1    ; tisk hodnoty registru XMM1
 
        paddb xmm0, xmm1             ; soucet vektoru po bajtech
        print_sse_reg_as_hex xmm0    ; tisk hodnoty registru XMM0
        exit                         ; ukonceni procesu
 
 
%include "hex2string.asm"

Výsledky ukazují, že dochází k přetečení k rámci jednotlivých bajtů, ovšem nikoli k přenosu hodnoty do vyšších bajtů:

vektor1:  F0 E0 D0 C0 B0 A0 90 80 70 60 50 40 30 20 10 00
vektor2:  80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80
          -----------------------------------------------
výsledek: 70 60 50 40 30 20 10 00 F0 E0 D0 C0 B0 A0 90 80
Poznámka: mimochodem – při pohledu na paralelní součet šestnácti prvků vektorů je zřejmé, jak tyto operace mohou urychlit například práci s rastrovými obrázky.

15. Součet dvojice vektorů 8×16 bitů

Podobným způsobem, ovšem s využitím instrukce PADDW namísto PADDB, můžeme provést součet osmi šestnáctibitových prvků vektorů. Samotný zdrojový kód příkladu se změní jen nepatrně (náhrada jediné instrukce), ovšem výsledky budou zcela odlišné:

[bits 32]
 
%include "linux_macros.asm"
 
;-----------------------------------------------------------------------------
section .data
 
hex_message:
         times 8 db '?'
         db ' '
         hex_message_length equ $ - hex_message
 
align 16
sse_val_1 db 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0
sse_val_2 db 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
 
;-----------------------------------------------------------------------------
section .bss
sse_tmp resb 16
 
 
;-----------------------------------------------------------------------------
section .text
        global _start                ; tento symbol ma byt dostupny i linkeru
 
_start:
        mov ebx, sse_val_1
        movaps xmm0, [ebx]           ; nacteni prvni hodnoty do registru XMM0
        print_sse_reg_as_hex xmm0    ; tisk hodnoty registru XMM0
 
        mov ebx, sse_val_2
        movaps xmm1, [ebx]           ; nacteni druhe hodnoty do registru XMM1
        print_sse_reg_as_hex xmm1    ; tisk hodnoty registru XMM1
 
        paddw xmm0, xmm1             ; soucet vektoru po slovech
        print_sse_reg_as_hex xmm0    ; tisk hodnoty registru XMM0
        exit                         ; ukonceni procesu
 
 
%include "hex2string.asm"

Ze zobrazených výsledků je patrné, že nyní dochází k přenosu do vyšších bajtů, ale vždy jen v hranici 16bitových slov:

vektor1:  F0E0 D0C0 B0A0 9080 7060 5040 3020 1000
vektor2:  8080 8080 8080 8080 8080 8080 8080 8080
          ---------------------------------------
výsledek: 7160 5140 3120 1100 F0E0 D0C0 B0A0 9080
přenosy:   ^    ^    ^    ^

16. Součet bezznaménkových bajtů se saturací

V multimediálních a DSP aplikacích je velmi užitečná i možnost sčítat a odčítat hodnoty se saturací namísto přetečení. Tuto operaci si můžeme ukázat na součtu bezznaménkových bajtů (resp. přesněji řečeno vektorů se šestnácti osmibitovými prvky), přičemž použijeme instrukci PADDUSB. Tato instrukce provádí součet se saturací, přičemž se sčítané hodnoty považují za osmibitové hodnoty bez znaménka (unsigned). Výsledky tedy nepřetečou přes hodnotu 0×FF (což si ověříme):

[bits 32]
 
%include "linux_macros.asm"
 
;-----------------------------------------------------------------------------
section .data
 
hex_message:
         times 8 db '?'
         db ' '
         hex_message_length equ $ - hex_message
 
align 16
sse_val_1 db 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0
sse_val_2 db 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
 
;-----------------------------------------------------------------------------
section .bss
sse_tmp resb 16
 
 
;-----------------------------------------------------------------------------
section .text
        global _start                ; tento symbol ma byt dostupny i linkeru
 
_start:
        mov ebx, sse_val_1
        movaps xmm0, [ebx]           ; nacteni prvni hodnoty do registru XMM0
        print_sse_reg_as_hex xmm0    ; tisk hodnoty registru XMM0
 
        mov ebx, sse_val_2
        movaps xmm1, [ebx]           ; nacteni druhe hodnoty do registru XMM1
        print_sse_reg_as_hex xmm1    ; tisk hodnoty registru XMM1
 
        paddusb xmm0, xmm1           ; soucet vektoru po bajtech se saturaci
        print_sse_reg_as_hex xmm0    ; tisk hodnoty registru XMM0
        exit                         ; ukonceni procesu
 
 
%include "hex2string.asm"

Z výsledků je skutečně patrné, že součty, které přesahují hodnotu 255, jsou saturovány právě na této hodnotě (0×ff):

vektor1:  F0 E0 D0 C0 B0 A0 90 80 70 60 50 40 30 20 10 00
vektor2:  80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80
          -----------------------------------------------
výsledek: FF FF FF FF FF FF FF FF F0 E0 D0 C0 B0 A0 90 80

17. Součet bajtů se znaménkem se saturací

V některých případech, například při zpracování audio vzorků, se nepracuje s hodnotami bez znaménka (unsigned), ale naopak s hodnotami se znaménkem (signed). V případě bajtů budou takové hodnoty saturovány v rozsahu –128 až 127, což si ověříme na tomto příkladu:

[bits 32]
 
%include "linux_macros.asm"
 
;-----------------------------------------------------------------------------
section .data
 
hex_message:
         times 8 db '?'
         db ' '
         hex_message_length equ $ - hex_message
 
align 16
sse_val_1 db 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xa0, 0xb0, 0xc0, 0xd0, 0xe0, 0xf0
sse_val_2 db 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
 
;-----------------------------------------------------------------------------
section .bss
sse_tmp resb 16
 
 
;-----------------------------------------------------------------------------
section .text
        global _start                ; tento symbol ma byt dostupny i linkeru
 
_start:
        mov ebx, sse_val_1
        movaps xmm0, [ebx]           ; nacteni prvni hodnoty do registru XMM0
        print_sse_reg_as_hex xmm0    ; tisk hodnoty registru XMM0
 
        mov ebx, sse_val_2
        movaps xmm1, [ebx]           ; nacteni druhe hodnoty do registru XMM1
        print_sse_reg_as_hex xmm1    ; tisk hodnoty registru XMM1
 
        paddsb xmm0, xmm1            ; soucet vektoru po bajtech se saturaci
        print_sse_reg_as_hex xmm0    ; tisk hodnoty registru XMM0
        exit                         ; ukonceni procesu
 
 
%include "hex2string.asm"

Výsledky v případě, že sčítáme hodnoty s konstantami 0×80 (tedy nejmenší reprezentovatelnou hodnotou v oboru bajtů se znaménkem):

vektor1:  F0 E0 D0 C0 B0 A0 90 80 70 60 50 40 30 20 10 00
vektor2:  80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80
          -----------------------------------------------
výsledek: 80 80 80 80 80 80 80 80 F0 E0 D0 C0 B0 A0 90 80

Saturace na nejvyšší možné kladné hodnotě 127 (0×7F) vypadá takto:

hacking_tip

vektor1:  F0 E0 D0 C0 B0 A0 90 80 70 60 50 40 30 20 10 00
vektor2:  7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F 7F
          -----------------------------------------------
výsledek: 6F 5F 4F 3F 2F 1F 0F FF 7F 7F 7F 7F 7F 7F 7F 7F

18. Obsah navazujícího článku

V dalším článku se zaměříme na komplikovanější instrukce, které byly zavedeny v sadě SSE2. Ukážeme si také praktičtěji zaměřené příklady, například rychlý výpočet skalárního součinu, což nemusí být tak triviální úloha, jak by se mohlo na první pohled zdát (na druhou stranu se tento výpočet používá velmi často, jako jedna z variant zjištění podobnosti dvou vektorů v mnoha „AI“ algoritmech).

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_mov­sb_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_mov­sb_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_mov­sb_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_mo­de286.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_mo­de386.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

20. Odkazy na Internetu

  1. The Intel 8088 Architecture and Instruction Set
    https://people.ece.ubc.ca/~ed­c/464/lectures/lec4.pdf
  2. x86 Opcode Structure and Instruction Overview
    https://pnx.tf/files/x86_op­code_structure_and_instruc­tion_overview.pdf
  3. x86 instruction listings (Wikipedia)
    https://en.wikipedia.org/wi­ki/X86_instruction_listin­gs
  4. x86 assembly language (Wikipedia)
    https://en.wikipedia.org/wi­ki/X86_assembly_language
  5. Intel Assembler (Cheat sheet)
    http://www.jegerlehner.ch/in­tel/IntelCodeTable.pdf
  6. 25 Microchips That Shook the World
    https://spectrum.ieee.org/tech-history/silicon-revolution/25-microchips-that-shook-the-world
  7. Chip Hall of Fame: MOS Technology 6502 Microprocessor
    https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-mos-technology-6502-microprocessor
  8. Chip Hall of Fame: Intel 8088 Microprocessor
    https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-intel-8088-microprocessor
  9. Jak se zrodil procesor?
    https://www.root.cz/clanky/jak-se-zrodil-procesor/
  10. Apple II History Home
    http://apple2history.org/
  11. The 8086/8088 Primer
    https://www.stevemorse.or­g/8086/index.html
  12. flat assembler: Assembly language resources
    https://flatassembler.net/
  13. FASM na Wikipedii
    https://en.wikipedia.org/wiki/FASM
  14. Fresh IDE FASM inside
    https://fresh.flatassembler.net/
  15. MS-DOS Version 4.0 Programmer's Reference
    https://www.pcjs.org/docu­ments/books/mspl13/msdos/dos­ref40/
  16. DOS API (Wikipedia)
    https://en.wikipedia.org/wiki/DOS_API
  17. Bit banging
    https://en.wikipedia.org/wi­ki/Bit_banging
  18. IBM Basic assembly language and successors (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Basic_assembly_lan­guage_and_successors
  19. X86 Assembly/Bootloaders
    https://en.wikibooks.org/wi­ki/X86_Assembly/Bootloaders
  20. Počátky grafiky na PC: grafické karty CGA a Hercules
    https://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/
  21. 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/
  22. Karta EGA: první použitelná barevná grafika na PC
    https://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/
  23. RGB Classic Games
    https://www.classicdosgames.com/
  24. Turbo Assembler (Wikipedia)
    https://en.wikipedia.org/wi­ki/Turbo_Assembler
  25. Microsoft Macro Assembler
    https://en.wikipedia.org/wi­ki/Microsoft_Macro_Assembler
  26. IBM Personal Computer (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Personal_Computer
  27. Intel 8251
    https://en.wikipedia.org/wi­ki/Intel_8251
  28. Intel 8253
    https://en.wikipedia.org/wi­ki/Intel_8253
  29. Intel 8255
    https://en.wikipedia.org/wi­ki/Intel_8255
  30. Intel 8257
    https://en.wikipedia.org/wi­ki/Intel_8257
  31. Intel 8259
    https://en.wikipedia.org/wi­ki/Intel_8259
  32. Support/peripheral/other chips – 6800 family
    http://www.cpu-world.com/Support/6800.html
  33. Motorola 6845
    http://en.wikipedia.org/wi­ki/Motorola_6845
  34. The 6845 Cathode Ray Tube Controller (CRTC)
    http://www.tinyvga.com/6845
  35. CRTC operation
    http://www.6502.org/users/an­dre/hwinfo/crtc/crtc.html
  36. The 6845 Cathode Ray Tube Controller (CRTC)
    http://www.tinyvga.com/6845
  37. Motorola 6845 and bitwise graphics
    https://retrocomputing.stac­kexchange.com/questions/10996/mo­torola-6845-and-bitwise-graphics
  38. IBM Monochrome Display Adapter
    http://en.wikipedia.org/wi­ki/Monochrome_Display_Adap­ter
  39. Color Graphics Adapter
    http://en.wikipedia.org/wi­ki/Color_Graphics_Adapter
  40. Color Graphics Adapter and the Brown color in IBM 5153 Color Display
    https://www.aceinnova.com/en/e­lectronics/cga-and-the-brown-color-in-ibm-5153-color-display/
  41. The Modern Retrocomputer: An Arduino Driven 6845 CRT Controller
    https://hackaday.com/2017/05/14/the-modern-retrocomputer-an-arduino-driven-6845-crt-controller/
  42. flat assembler: Assembly language resources
    https://flatassembler.net/
  43. FASM na Wikipedii
    https://en.wikipedia.org/wiki/FASM
  44. Fresh IDE FASM inside
    https://fresh.flatassembler.net/
  45. MS-DOS Version 4.0 Programmer's Reference
    https://www.pcjs.org/docu­ments/books/mspl13/msdos/dos­ref40/
  46. DOS API (Wikipedia)
    https://en.wikipedia.org/wiki/DOS_API
  47. IBM Basic assembly language and successors (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Basic_assembly_lan­guage_and_successors
  48. X86 Assembly/Arithmetic
    https://en.wikibooks.org/wi­ki/X86_Assembly/Arithmetic
  49. Art of Assembly – Arithmetic Instructions
    http://oopweb.com/Assembly/Do­cuments/ArtOfAssembly/Volu­me/Chapter6/CH06–2.html
  50. ASM Flags
    http://www.cavestory.org/gu­ides/csasm/guide/asm_flag­s.html
  51. Status Register
    https://en.wikipedia.org/wi­ki/Status_register
  52. Linux assemblers: A comparison of GAS and NASM
    http://www.ibm.com/develo­perworks/library/l-gas-nasm/index.html
  53. Programovani v assembleru na OS Linux
    http://www.cs.vsb.cz/gryga­rek/asm/asmlinux.html
  54. Is it worthwhile to learn x86 assembly language today?
    https://www.quora.com/Is-it-worthwhile-to-learn-x86-assembly-language-today?share=1
  55. Why Learn Assembly Language?
    http://www.codeproject.com/Ar­ticles/89460/Why-Learn-Assembly-Language
  56. Is Assembly still relevant?
    http://programmers.stackex­change.com/questions/95836/is-assembly-still-relevant
  57. Why Learning Assembly Language Is Still a Good Idea
    http://www.onlamp.com/pub/a/on­lamp/2004/05/06/writegreat­code.html
  58. Assembly language today
    http://beust.com/weblog/2004/06/23/as­sembly-language-today/
  59. Assembler: Význam assembleru dnes
    http://www.builder.cz/rubri­ky/assembler/vyznam-assembleru-dnes-155960cz
  60. Programming from the Ground Up Book – Summary
    http://savannah.nongnu.or­g/projects/pgubook/
  61. DOSBox
    https://www.dosbox.com/
  62. The C Programming Language
    https://en.wikipedia.org/wi­ki/The_C_Programming_Langu­age
  63. Hercules Graphics Card (HCG)
    https://en.wikipedia.org/wi­ki/Hercules_Graphics_Card
  64. Complete 8086 instruction set
    https://content.ctcd.edu/cou­rses/cosc2325/m22/docs/emu8086in­s.pdf
  65. Complete 8086 instruction set
    https://yassinebridi.github.io/asm-docs/8086_instruction_set.html
  66. 8088 MPH by Hornet + CRTC + DESiRE (final version)
    https://www.youtube.com/wat­ch?v=hNRO7lno_DM
  67. Area 5150 by CRTC & Hornet (Party Version) / IBM PC+CGA Demo, Hardware Capture
    https://www.youtube.com/wat­ch?v=fWDxdoRTZPc
  68. 80×86 Integer Instruction Set Timings (8088 – Pentium)
    http://aturing.umcs.maine­.edu/~meadow/courses/cos335/80×86-Integer-Instruction-Set-Clocks.pdf
  69. Colour Graphics Adapter: Notes
    https://www.seasip.info/Vin­tagePC/cga.html
  70. Restoring A Vintage CGA Card With Homebrew HASL
    https://hackaday.com/2024/06/12/res­toring-a-vintage-cga-card-with-homebrew-hasl/
  71. Demoing An 8088
    https://hackaday.com/2015/04/10/de­moing-an-8088/
  72. Video Memory Layouts
    http://www.techhelpmanual.com/89-video_memory_layouts.html
  73. Screen Attributes
    http://www.techhelpmanual.com/87-screen_attributes.html
  74. IBM PC Family – BIOS Video Modes
    https://www.minuszerodegre­es.net/video/bios_video_mo­des.htm
  75. EGA Functions
    https://cosmodoc.org/topics/ega-functions/#the-hierarchy-of-the-ega
  76. 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/
  77. How 16 colors saved PC gaming – the story of EGA graphics
    https://www.custompc.com/retro-tech/ega-graphics
  78. List of 16-bit computer color palettes
    https://en.wikipedia.org/wi­ki/List_of16-bit_computer_color_palettes
  79. Why were those colors chosen to be the default palette for 256-color VGA?
    https://retrocomputing.stac­kexchange.com/questions/27994/why-were-those-colors-chosen-to-be-the-default-palette-for-256-color-vga
  80. VGA Color Palettes
    https://www.fountainware.com/EX­PL/vga_color_palettes.htm
  81. Hardware Level VGA and SVGA Video Programming Information Page
    http://www.osdever.net/Fre­eVGA/vga/vga.htm
  82. Hardware Level VGA and SVGA Video Programming Information Page – sequencer
    http://www.osdever.net/Fre­eVGA/vga/seqreg.htm
  83. VGA Basics
    http://www.brackeen.com/vga/ba­sics.html
  84. Introduction to VGA Mode ‚X‘
    https://web.archive.org/web/20160414072210/htt­p://fly.srk.fer.hr/GDM/ar­ticles/vgamodex/vgamx1.html
  85. VGA Mode-X
    https://web.archive.org/web/20070123192523/htt­p://www.gamedev.net/referen­ce/articles/article356.asp
  86. Mode-X: 256-Color VGA Magic
    https://downloads.gamedev­.net/pdf/gpbb/gpbb47.pdf
  87. Instruction Format in 8086 Microprocessor
    https://www.includehelp.com/embedded-system/instruction-format-in-8086-microprocessor.aspx
  88. How to use „AND,“ „OR,“ and „XOR“ modes for VGA Drawing
    https://retrocomputing.stac­kexchange.com/questions/21936/how-to-use-and-or-and-xor-modes-for-vga-drawing
  89. VGA Hardware
    https://wiki.osdev.org/VGA_Hardware
  90. Programmer's Guide to Yamaha YMF 262/OPL3 FM Music Synthesizer
    https://moddingwiki.shika­di.net/wiki/OPL_chip
  91. Does anybody understand how OPL2 percussion mode works?
    https://forum.vcfed.org/in­dex.php?threads/does-anybody-understand-how-opl2-percussion-mode-works.60925/
  92. Yamaha YMF262 OPL3 music – MoonDriver for OPL3 DEMO [Oscilloscope View]
    https://www.youtube.com/watch?v=a7I-QmrkAak
  93. Yamaha OPL vs OPL2 vs OPL3 comparison
    https://www.youtube.com/wat­ch?v=5knetge5Gs0
  94. OPL3 Music Crockett's Theme
    https://www.youtube.com/wat­ch?v=HXS008pkgSQ
  95. Bad Apple (Adlib Tracker – OPL3)
    https://www.youtube.com/wat­ch?v=2lEPH6Y3Luo
  96. FM Synthesis Chips, Codecs and DACs
    https://www.dosdays.co.uk/to­pics/fm_synthesizers.php
  97. The Zen Challenge – YMF262 OPL3 Original (For an upcoming game)
    https://www.youtube.com/wat­ch?v=6JlFIFz1CFY
  98. [adlib tracker II techno music – opl3] orbit around alpha andromedae I
    https://www.youtube.com/wat­ch?v=YqxJCu_WFuA
  99. [adlib tracker 2 music – opl3 techno] hybridisation process on procyon-ii
    https://www.youtube.com/wat­ch?v=daSV5mN0sJ4
  100. Hyper Duel – Black Rain (YMF262 OPL3 Cover)
    https://www.youtube.com/wat­ch?v=pu_mzRRq8Ho
  101. IBM 5155–5160 Technical Reference
    https://www.minuszerodegre­es.net/manuals/IBM/IBM_5155_5160_Techni­cal_Reference_6280089_MAR86­.pdf
  102. a ymf262/opl3+pc speaker thing i made
    https://www.youtube.com/watch?v=E-Mx0lEmnZ0
  103. [OPL3] Like a Thunder
    https://www.youtube.com/wat­ch?v=MHf06AGr8SU
  104. (PC SPEAKER) bad apple
    https://www.youtube.com/wat­ch?v=LezmKIIHyUg
  105. Powering devices from PC parallel port
    http://www.epanorama.net/cir­cuits/lptpower.html
  106. Magic Mushroom (demo pro PC s DOSem)
    http://www.crossfire-designs.de/download/articles/sou­ndcards//mushroom.rar
  107. Píseň Magic Mushroom – originál
    http://www.crossfire-designs.de/download/articles/sou­ndcards/speaker_mushroom_con­verted.mp3
  108. Píseň Magic Mushroom – hráno na PC Speakeru
    http://www.crossfire-designs.de/download/articles/sou­ndcards/speaker_mushroom_spe­aker.mp3
  109. Pulse Width Modulation (PWM) Simulation Example
    http://decibel.ni.com/content/docs/DOC-4599
  110. Resistor/Pulse Width Modulation DAC
    http://www.k9spud.com/trax­mod/pwmdac.php
  111. Class D Amplifier
    http://en.wikipedia.org/wi­ki/Electronic_amplifier#Clas­s_D
  112. Covox Speech Thing / Disney Sound Source (1986)
    http://www.crossfire-designs.de/index.php?lang=en&what=ar­ticles&name=showarticle.htm&ar­ticle=soundcards/&page=5
  113. Covox Digital-Analog Converter (Rusky, obsahuje schémata)
    http://phantom.sannata.ru/kon­kurs/netskater002.shtml
  114. PC-GPE on the Web
    http://bespin.org/~qz/pc-gpe/
  115. Keyboard Synthesizer
    http://www.solarnavigator­.net/music/instruments/ke­yboards.htm
  116. FMS – Fully Modular Synthesizer
    http://fmsynth.sourceforge.net/
  117. Javasynth
    http://javasynth.sourceforge.net/
  118. Software Sound Synthesis & Music Composition Packages
    http://www.linux-sound.org/swss.html
  119. Mx44.1 Download Page (software synthesizer for linux)
    http://hem.passagen.se/ja_linux/
  120. Software synthesizer
    http://en.wikipedia.org/wi­ki/Software_synthesizer
  121. Frequency modulation synthesis
    http://en.wikipedia.org/wi­ki/Frequency_modulation_syn­thesis
  122. Yamaha DX7
    http://en.wikipedia.org/wi­ki/Yamaha_DX7
  123. Wave of the Future
    http://www.wired.com/wired/ar­chive/2.03/waveguides_pr.html
  124. Analog synthesizer
    http://en.wikipedia.org/wi­ki/Analog_synthesizer
  125. Minimoog
    http://en.wikipedia.org/wiki/Minimoog
  126. Moog synthesizer
    http://en.wikipedia.org/wi­ki/Moog_synthesizer
  127. Tutorial for Frequency Modulation Synthesis
    http://www.sfu.ca/~truax/fmtut.html
  128. An Introduction To FM
    http://ccrma.stanford.edu/sof­tware/snd/snd/fm.html
  129. John Chowning
    http://en.wikipedia.org/wi­ki/John_Chowning
  130. I'm Impressed, Adlib Music is AMAZING!
    https://www.youtube.com/wat­ch?v=PJNjQYp1ras
  131. Milinda- Diode Milliampere ( OPL3 )
    https://www.youtube.com/wat­ch?v=oNhazT5HG0E
  132. Dune 2 – Roland MT-32 Soundtrack
    https://www.youtube.com/wat­ch?v=kQADZeB-z8M
  133. Interrupts
    https://wiki.osdev.org/In­terrupts#Types_of_Interrup­ts
  134. Assembly8086SoundBlasterDma­SingleCycleMode
    https://github.com/leonardo-ono/Assembly8086SoundBlas­terDmaSingleCycleMode/blob/mas­ter/sbsc.asm
  135. Interrupts in 8086 microprocessor
    https://www.geeksforgeeks­.org/interrupts-in-8086-microprocessor/
  136. Interrupt Structure of 8086
    https://www.eeeguide.com/interrupt-structure-of-8086/
  137. A20 line
    https://en.wikipedia.org/wi­ki/A20_line
  138. Extended memory
    https://en.wikipedia.org/wi­ki/Extended_memory#eXtended_Me­mory_Specification_(XMS)
  139. Expanded memory
    https://en.wikipedia.org/wi­ki/Expanded_memory
  140. Protected mode
    https://en.wikipedia.org/wi­ki/Protected_mode
  141. Virtual 8086 mode
    https://en.wikipedia.org/wi­ki/Virtual_8086_mode
  142. Unreal mode
    https://en.wikipedia.org/wi­ki/Unreal_mode
  143. DOS memory management
    https://en.wikipedia.org/wi­ki/DOS_memory_management
  144. Upper memory area
    https://en.wikipedia.org/wi­ki/Upper_memory_area
  145. Removing the Mystery from SEGMENT : OFFSET Addressing
    https://thestarman.pcminis­try.com/asm/debug/Segments­.html
  146. Segment descriptor
    https://en.wikipedia.org/wi­ki/Segment_descriptor
  147. 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/qu­estions/45094696/when-using-a-32-bit-register-to-address-memory-in-the-real-mode-contents-of-the
  148. A Brief History of Unreal Mode
    https://www.os2museum.com/wp/a-brief-history-of-unreal-mode/
  149. Segment Limits
    https://wiki.osdev.org/Segment_Limits
  150. How do 32 bit addresses in real mode work?
    https://forum.osdev.org/vi­ewtopic.php?t=30642
  151. The LOADALL Instruction by Robert Collins
    https://www.rcollins.org/ar­ticles/loadall/tspec_a3_doc­.html
  152. How do you put a 286 in Protected Mode?
    https://retrocomputing.stac­kexchange.com/questions/7683/how-do-you-put-a-286-in-protected-mode
  153. Control register
    https://en.wikipedia.org/wi­ki/Control_register
  154. CPU Registers x86
    https://wiki.osdev.org/CPU_Re­gisters_x86
  155. x86 Assembly/Protected Mode
    https://en.wikibooks.org/wi­ki/X86_Assembly/Protected_Mo­de
  156. MSW: Machine Status Word
    https://web.itu.edu.tr/kes­gin/mul06/intel/intel_msw­.html
  157. 80×87 Floating Point Opcodes
    http://www.techhelpmanual.com/876–80×87_floating_point_opcodes.html
  158. Page Translation
    https://pdos.csail.mit.edu/6­.828/2005/readings/i386/s05_02­.htm
  159. 80386 Paging and Segmenation
    https://stackoverflow.com/qu­estions/38229741/80386-paging-and-segmenation
  160. 80386 Memory Management
    https://tldp.org/LDP/khg/Hy­perNews/get/memory/80386mm­.html
  161. DOSEMU
    http://www.dosemu.org/
  162. Intel 80386, a revolutionary CPU
    https://www.xtof.info/intel80386.html
  163. PAI Unit 3 Paging in 80386 Microporcessor
    https://www.slideshare.net/Kan­chanPatil34/pai-unit-3-paging-in-80386-microporcessor
  164. 64 Terabytes of virtual memory for 32-bit x86 using segmentation: how?
    https://stackoverflow.com/qu­estions/5444984/64-terabytes-of-virtual-memory-for-32-bit-x86-using-segmentation-how
  165. Pi in the Pentium: reverse-engineering the constants in its floating-point unit
    http://www.righto.com/2025/01/pentium-floating-point-ROM.html
  166. Simply FPU
    http://www.website.masmfo­rum.com/tutorials/fptute/
  167. Art of Assembly language programming: The 80×87 Floating Point Coprocessors
    https://courses.engr.illi­nois.edu/ece390/books/arto­fasm/CH14/CH14–3.html
  168. Art of Assembly language programming: The FPU Instruction Set
    https://courses.engr.illi­nois.edu/ece390/books/arto­fasm/CH14/CH14–4.html
  169. INTEL 80387 PROGRAMMER'S REFERENCE MANUAL
    http://www.ragestorm.net/dow­nloads/387intel.txt
  170. x86 Instruction Set Reference: FLD
    http://x86.renejeschke.de/html/fi­le_module_x86_id100.html
  171. x86 Instruction Set Reference: FLD1/FLDL2T/FLDL2E/FLDPI/­FLDLG2/FLDLN2/FLDZ
    http://x86.renejeschke.de/html/fi­le_module_x86_id101.html
  172. X86 Assembly/Arithmetic
    https://en.wikibooks.org/wi­ki/X86_Assembly/Arithmetic
  173. 8087 Numeric Data Processor
    https://www.eeeguide.com/8087-numeric-data-processor/
  174. Data Types and Instruction Set of 8087 co-processor
    https://www.eeeguide.com/data-types-and-instruction-set-of-8087-co-processor/
  175. 8087 instruction set and examples
    https://studylib.net/doc/5625221/8087-instruction-set-and-examples
  176. GCC documentation: Extensions to the C Language Family
    https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html#C-Extensions
  177. GCC documentation: Using Vector Instructions through Built-in Functions
    https://gcc.gnu.org/online­docs/gcc/Vector-Extensions.html
  178. SSE (Streaming SIMD Extentions)
    http://www.songho.ca/misc/sse/sse­.html
  179. Timothy A. Chagnon: SSE and SSE2
    http://www.cs.drexel.edu/~tc365/mpi-wht/sse.pdf
  180. Intel corporation: Extending the Worldr's Most Popular Processor Architecture
    http://download.intel.com/techno­logy/architecture/new-instructions-paper.pdf
  181. SIMD architectures:
    http://arstechnica.com/ol­d/content/2000/03/simd.ar­s/
  182. Tour of the Black Holes of Computing!: Floating Point
    http://www.cs.hmc.edu/~ge­off/classes/hmc.cs105…/sli­des/class02_floats.ppt
  183. 3Dnow! Technology Manual
    AMD Inc., 2000
  184. Intel MMXTM Technology Overview
    Intel corporation, 1996
  185. MultiMedia eXtensions
    http://softpixel.com/~cwrig­ht/programming/simd/mmx.phpi
  186. AMD K5 („K5“ / „5k86“)
    http://www.pcguide.com/ref/cpu/fam/g5K5-c.html
  187. Sixth Generation Processors
    http://www.pcguide.com/ref/cpu/fam/g6­.htm
  188. Great Microprocessors of the Past and Present
    http://www.cpushack.com/CPU/cpu1.html
  189. Very long instruction word (Wikipedia)
    http://en.wikipedia.org/wi­ki/Very_long_instruction_word
  190. CPU design (Wikipedia)
    http://en.wikipedia.org/wi­ki/CPU_design
  191. Bulldozer (microarchitecture)
    https://en.wikipedia.org/wi­ki/Bulldozer_(microarchitec­ture)
  192. MMX (instruction set)
    https://en.wikipedia.org/wi­ki/MMX_(instruction_set)
  193. Extended MMX
    https://en.wikipedia.org/wi­ki/Extended_MMX
  194. Saturation arithmetic
    https://en.wikipedia.org/wi­ki/Saturation_arithmetic
  195. CMPPS — Compare Packed Single Precision Floating-Point Values
    https://www.felixcloutier­.com/x86/cmpps
  196. ADDPS — Add Packed Single Precision Floating-Point Values
    https://www.felixcloutier­.com/x86/addps
  197. SUBPS — Subtract Packed Single Precision Floating-Point Values
    https://www.felixcloutier­.com/x86/subps
  198. SQRTPS — Square Root of Single Precision Floating-Point Values
    https://www.felixcloutier­.com/x86/sqrtps
  199. RSQRTPS — Compute Reciprocals of Square Roots of Packed Single Precision Floating-PointValues
    https://www.felixcloutier­.com/x86/rsqrtps
  200. UNPCKHPS — Unpack and Interleave High Packed Single Precision Floating-Point Values
    https://www.felixcloutier­.com/x86/unpckhps
  201. UNPCKLPS — Unpack and Interleave Low Packed Single Precision Floating-Point Values
    https://www.felixcloutier­.com/x86/unpcklps
  202. SHUFPS — Packed Interleave Shuffle of Quadruplets of Single Precision Floating-Point Values
    https://www.felixcloutier­.com/x86/shufps
  203. CVTSI2SS — Convert Doubleword Integer to Scalar Single Precision Floating-Point Value
    https://www.felixcloutier­.com/x86/cvtsi2ss
  204. CVTSS2SI — Convert Scalar Single Precision Floating-Point Value to Doubleword Integer
    https://www.felixcloutier­.com/x86/cvtss2si
  205. CVTTSS2SI — Convert With Truncation Scalar Single Precision Floating-Point Value to Integer
    https://www.felixcloutier­.com/x86/cvttss2si
  206. CVTPI2PS — Convert Packed Dword Integers to Packed Single Precision Floating-Point Values
    https://www.felixcloutier­.com/x86/cvtpi2ps
  207. CVTPS2PI — Convert Packed Single Precision Floating-Point Values to Packed Dword Integers
    https://www.felixcloutier­.com/x86/cvtps2pi
  208. CVTTPS2PI — Convert With Truncation Packed Single Precision Floating-Point Values to PackedDword Integers
    https://www.felixcloutier­.com/x86/cvttps2pi
  209. Streaming SIMD Extensions 2 (SSE2)
    https://softpixel.com/~cwrig­ht/programming/simd/sse2.php
Neutrální ikona do widgetu na odběr článků ze seriálů

Zajímá vás toto téma? Chcete se o něm dozvědět víc?

Objednejte si upozornění na nově vydané články do vašeho mailu. Žádný článek vám tak neuteče.


Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
'; document.getElementById('outstream-iframe').onload = function () { setupIframe(); } replayScreen = document.getElementById('iinfoOutstreamReplay'); iinfoOutstreamPosition = document.getElementById('iinfoOutstreamPosition'); outstreamContainer = document.getElementsByClassName('outstream-container')[0]; setupReplayScreen(); } function setupIframe() { outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document; let el = outstreamDocument.createElement('style'); outstreamDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:-5px;right:25px}"; videoContent = outstreamDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; if ( location.href.indexOf('rejstriky.finance.cz') !== -1 || location.href.indexOf('finance-rejstrik') !== -1 || location.href.indexOf('firmy.euro.cz') !== -1 || location.href.indexOf('euro-rejstrik') !== -1 || location.href.indexOf('/rejstrik/') !== -1 || location.href.indexOf('/rejstrik-firem/') !== -1) { outstreamDirectPlayed = true; soundAllowed = true; iinfoVastUrlIndex = 0; } if (!outstreamDirectPlayed) { console.log('OUTSTREAM direct'); setUpIMA(true); } else { if (soundAllowed) { const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('OUTSTREAM sound allowed'); setUpIMA(false); }).catch(function () { console.log('OUTSTREAM sound forbidden'); renderBanner(); }); } } else { renderBanner(); } } } function getWrapper() { let articleWrapper = document.querySelector('.rs-outstream-placeholder'); // Outstream Placeholder from RedSys manipulation if (articleWrapper && articleWrapper.style.display !== 'block') { articleWrapper.innerHTML = ""; articleWrapper.style.display = 'block'; } // Don't render OutStream on homepages if (articleWrapper === null) { if (document.querySelector('body.p-index')) { return null; } } if (articleWrapper === null) { articleWrapper = document.getElementById('iinfo-outstream'); } if (articleWrapper === null) { articleWrapper = document.querySelector('.layout-main__content .detail__article p:nth-of-type(6)'); } if (articleWrapper === null) { // Euro, Autobible, Zdravi articleWrapper = document.querySelector('.o-article .o-article__text p:nth-of-type(6)'); } if (articleWrapper === null) { articleWrapper = document.getElementById('sidebar'); } if (!articleWrapper) { console.error("Outstream wrapper of article was not found."); } return articleWrapper; } function setupDimensions() { outstreamWidth = Math.min(iinfoOutstreamPosition.offsetWidth, 480); outstreamHeight = Math.min(iinfoOutstreamPosition.offsetHeight, 320); } /** * Sets up IMA ad display container, ads loader, and makes an ad request. */ function setUpIMA(direct) { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); if (direct) { adsRequest.adTagUrl = directVast; console.log('Outstream DIRECT CAMPAING advert: ' + directVast); videoContent.muted = true; videoContent.volume = 0; outstreamDirectPlayed = true; } else { adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Outstream advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; } // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = outstreamWidth; // adsRequest.linearAdSlotHeight = outstreamHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function setupReplayScreen() { replayScreen.addEventListener('click', function () { iinfoOutstreamPosition.remove(); iinfoVastUrlIndex = 0; outstreamInit(); }); } /** * Sets the 'adContainer' div as the IMA ad display container. */ function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. outstreamDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( outstreamDocument.getElementById('adContainer'), videoContent); } function unmuteAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } } /** * Loads the video content and initializes IMA ad playback. */ function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(outstreamWidth, outstreamHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } /** * Handles the ad manager loading and sets ad event listeners. * @param { !google.ima.AdsManagerLoadedEvent } adsManagerLoadedEvent */ function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } /** * Handles actions taken in response to ad events. * @param { !google.ima.AdEvent } adEvent */ function onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (for example, // ALL_ADS_COMPLETED) don't have ad object associated. const ad = adEvent.getAd(); console.log('Outstream event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: // This is the first event sent for an ad - it is possible to // determine whether the ad is a video ad or an overlay. if (!ad.isLinear()) { // Position AdDisplayContainer correctly for overlay. // Use ad.width and ad.height. videoContent.play(); } outstreamDocument.getElementById('adContainer').style.width = '100%'; outstreamDocument.getElementById('adContainer').style.maxWidth = '640px'; outstreamDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); // This event indicates the ad has started - the video player // can adjust the UI, for example display a pause button and // remaining time. if (ad.isLinear()) { // For a linear ad, a timer can be started to poll for // the remaining time. intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } outstreamDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (outstreamLastError === 303) { if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } } break; case google.ima.AdEvent.Type.COMPLETE: // This event indicates the ad has finished - the video player // can perform appropriate UI actions, such as removing the timer for // remaining time detection. if (ad.isLinear()) { clearInterval(intervalTimer); } if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } break; } } /** * Handles ad errors. * @param { !google.ima.AdErrorEvent } adErrorEvent */ function onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); outstreamLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { renderBanner(); } } function renderBanner() { if (isBanner) { console.log('Outstream: Render Banner'); iinfoOutstreamPosition.innerHTML = ""; iinfoOutstreamPosition.style.height = "330px"; iinfoOutstreamPosition.appendChild(bannerDiv); } else { console.log('Outstream: Banner is not set'); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoOutstreamPosition.remove(); outstreamInit(); } else { return false; } adVolume = 1; return true; } /** * Pauses video content and sets up ad UI. */ function onContentPauseRequested() { videoContent.pause(); // This function is where you should setup UI for showing ads (for example, // display ad timer countdown, disable seeking and more.) // setupUIForAds(); } /** * Resumes video content and removes ad UI. */ function onContentResumeRequested() { videoContent.play(); // This function is where you should ensure that your UI is ready // to play content. It is the responsibility of the Publisher to // implement this function when necessary. // setupUIForContent(); } function onActiveView() { if (outstreamContainer) { const containerOffset = outstreamContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (outstreamPaused) { adsManager.resume(); outstreamPaused = false; } return true; } else { if (!outstreamPaused) { adsManager.pause(); outstreamPaused = true; } } } return false; } let outstreamInitInterval; if (typeof cpexPackage !== "undefined") { outstreamInitInterval = setInterval(tryToInitializeOutstream, 100); } else { const wrapper = getWrapper(); if (wrapper) { let outstreamInitialized = false; window.addEventListener('scroll', () => { if (!outstreamInitialized) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { outstreamInit(); outstreamInitialized = true; } } }); } } function tryToInitializeOutstream() { const wrapper = getWrapper(); if (wrapper) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { if (cpexPackage.adserver.displayed) { clearInterval(outstreamInitInterval); outstreamInit(); } } } else { clearInterval(outstreamInitInterval); } } }
OSZAR »