Obsah
1. Rozšíření instrukční sady SSE2 (2. část)
2. Výpočet druhé odmocniny vektorů s prvky typu double
3. Druhé odmocniny záporných hodnot, nekonečen a NaN
4. Logické posuny slov, dvojslov i čtyřslov
5. Příklady bitových posunů doprava
7. Logické operace se 128bitovými vektory
8. Pejsek s kočičkou navrhují instrukční sadu: ANDPS, ANDPD a PAND
9. Rozdíl mezi instrukcemi ANDPS, ANDPD a PAND
11. Instrukce pro konverzi dat
13. Konverze záporných hodnot na celá čísla
14. Konverze speciálních hodnot na celá čísla
15. Konverze mezi FP hodnotami ve formátu single a double
16. Konverze dvojice hodnot typu single na vektor prvků typu double
17. Konverze dvojice hodnot typu double na vektor prvků typu single
18. Zaokrouhlení na nulu či na nekonečno při konverzích
19. Repositář s demonstračními příklady
1. Rozšíření instrukční sady SSE2 (2. část)
V článku Od instrukční sady SSE k sadě SSE2 jsme si popsali základní vlastnosti rozšíření instrukční sady SSE2. Připomeňme si, že toto rozšíření umožňuje pracovat se 128bitovými vektory, které obsahují nejenom hodnoty typu single, ale i celočíselné bajty, 16bitová slova, 32bitová slova, 64bitová slova a dokonce i hodnoty typu double. Oproti původní instrukční sadě SSE se tedy jedná o značné vylepšení, které umožnilo „vektorizovat“ mnoho dalších algoritmů. Ovšem na druhou stranu ani tato instrukční sada není ortogonální a některé instrukce (kupodivu) chybí. A naopak – některé instrukce „přebývají“, resp. přesněji řečeno v SSE2 nalezneme dvojici či trojici instrukcí, které provádí stejnou operaci, ale mají odlišný operační kód.
2. Výpočet druhé odmocniny vektorů s prvky typu double
Dnešní první příklad bude velmi jednoduchý – tréninkový. Je v něm volána instrukce SQRTPD, která vypočítá druhou odmocninu z dvouprvkového vektoru obsahujícího prvky typu double. Za připomenutí stojí fakt, že odmocnina je touto instrukcí vypočtena přesně – nejedná se tedy o aproximaci tak, jak tomu bylo u instrukcí SSE a vektorů s typy single. V příkladu, jehož zdrojový kód je vypsán pod tímto odstavcem, vypočteme druhou odmocninu z hodnot 1.0 a 2.0. Výsledek je zobrazen v hexadecimálním formátu:
[bits 32] %include "linux_macros.asm" ;----------------------------------------------------------------------------- section .data hex_message: times 8 db '?' db ' ' hex_message_length equ $ - hex_message align 16 sse_val_1 dq 1.0, 2.0 ;----------------------------------------------------------------------------- section .bss sse_tmp resb 16 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: mov ebx, sse_val_1 movdqu xmm0, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM0 sqrtpd xmm1, xmm0 ; odmocniny dvou hodnot typu double print_sse_reg_as_hex xmm1 ; tisk hodnoty registru XMM1 exit ; ukonceni procesu %include "hex2string.asm"
Výsledky:
vstup: 4000000000000000 3FF0000000000000 odmocniny: 3FF6A09E667F3BCD 3FF0000000000000
Což v FP formátu odpovídá:
vstup: 2.0 1.0 odmocniny: 1.4142135623730951 1.0
3. Druhé odmocniny záporných hodnot, nekonečen a NaN
Definiční obor funkce pro výpočet druhé odmocniny je omezen na hodnoty větší nebo rovny nule. Ovšem bude užitečné zjistit, jak se instrukce SQRTPD chová v případě, že budeme chtít vypočítat odmocninu ze záporných čísel nebo z hodnot NaN. Začneme zápornými čísly:
[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 dq -1.0, -2.0 ;----------------------------------------------------------------------------- section .bss sse_tmp resb 16 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: mov ebx, sse_val_1 movdqu xmm0, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM0 sqrtpd xmm1, xmm0 ; odmocniny dvou hodnot typu double print_sse_reg_as_hex xmm1 ; tisk hodnoty registru XMM1 exit ; ukonceni procesu %include "hex2string.asm"
Výsledky:
vstup: C000000000000000 BFF0000000000000 odmocniny: FFF8000000000000 FFF8000000000000
Což v FP formátu odpovídá:
vstup: -2.0 -1.0 odmocniny: NaN NaN
Výsledkem je tedy v obou případech hodnota NaN (Not a Number).
A jaké budou výsledky, když bude NaN naopak vstupem do výpočtu druhé odmocniny, popř. když bude vstupem nekonečno?
[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 dq __Infinity__, __NaN__ ;----------------------------------------------------------------------------- section .bss sse_tmp resb 16 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: mov ebx, sse_val_1 movdqu xmm0, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM0 sqrtpd xmm1, xmm0 ; odmocniny dvou hodnot typu double print_sse_reg_as_hex xmm1 ; tisk hodnoty registru XMM1 exit ; ukonceni procesu %include "hex2string.asm"
vstup: 7FF8000000000000 7FF0000000000000 odmocniny: 7FF8000000000000 7FF0000000000000
Což v lidsky čitelném výstupu znamená?
vstup: NaN Infinity odmocniny: NaN Infinity
Druhá odmocnina NaN je tedy opět NaN a druhá odmocnina kladného nekonečna je (logicky) kladné nekonečno.
4. Logické posuny slov, dvojslov i čtyřslov
Připomeňme si, že v instrukční sadě SSE2 nalezneme instrukce určené pro provedení logických posunů doleva a aritmetických i logických posunů doprava. Tyto instrukce můžeme rozdělit podle několika kategorií:
- Směr posunu: doprava či doleva
- Typ posunu: logický či aritmetický (jen dvě instrukce aritmetického posunu)
- Jednotka posunu: většina instrukcí podporuje posun po bitech, ale dvojice instrukcí po bajtech
- Typ vektoru: 8×16 bitů, 4×32 bitů, 2×64 bitů a 1×128 bitů (neexistuje posun 16×8 bitů!!!)
Všechny tyto instrukce jsou vypsány v následující tabulce:
# | Instrukce | Operace/funkce | Struktura vektoru | Datový typ | Posun po |
---|---|---|---|---|---|
1 | PSLLDQ | logický posun doleva | 1×128bitů | integer | bajtech |
2 | PSLLQ | logický posun doleva | 2×64bitů | integer | bitech |
3 | PSLLD | logický posun doleva | 4×32bitů | integer | bitech |
4 | PSLLW | logický posun doleva | 8×16bitů | integer | bitech |
5 | PSRLDQ | logický posun doprava | 1×128bitů | integer | bajtech |
6 | PSRLQ | logický posun doprava | 2×64bitů | integer | bitech |
7 | PSRLD | logický posun doprava | 4×32bitů | integer | bitech |
8 | PSRLW | logický posun doprava | 8×16bitů | integer | bitech |
9 | PSRAD | aritmetický posun doprava | 4×32bitů | integer | bitech |
10 | PSRAW | aritmetický posun doprava | 8×16bitů | integer | bitech |
5. Příklady bitových posunů doprava
Otestujeme si, jakým způsobem pracují instrukce, které provádí bitové posuny doprava. Jedná se o instrukce PSRLW, PSRLD a PSRLQ.
Nejdříve použijeme instrukci PSRLW, která provádí posun 128bitového vektoru tak, jakoby obsahoval 16bitové prvky:
[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 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff sse_val_2 db 1 ;----------------------------------------------------------------------------- section .bss sse_tmp resb 16 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: mov ebx, sse_val_1 movdqu xmm0, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM0 mov esi, 1 ; konstanta, kterou budeme pricitat movd xmm1, esi ; nacteni konstanty do druheho vektoru print_sse_reg_as_hex xmm1 ; tisk hodnoty registru XMM0 mov eax, 16 next_shift: psrlw xmm0, xmm1 ; logicky posun doprava push eax print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM1 pop eax dec eax ; snizit pocitadlo jnz next_shift ; a opakovat smycku exit ; ukonceni procesu %include "hex2string.asm"
Z výsledků je vidět, že posuny jsou skutečně provedeny po bitech a ve skupinách 16bitů (slov):
vstup: FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF delta: 0000 0000 0000 0000 0000 0000 0000 0001 --------------------------------------- posun: 7FFF 7FFF 7FFF 7FFF 7FFF 7FFF 7FFF 7FFF posun: 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF posun: 1FFF 1FFF 1FFF 1FFF 1FFF 1FFF 1FFF 1FFF posun: 0FFF 0FFF 0FFF 0FFF 0FFF 0FFF 0FFF 0FFF posun: 07FF 07FF 07FF 07FF 07FF 07FF 07FF 07FF posun: 03FF 03FF 03FF 03FF 03FF 03FF 03FF 03FF posun: 01FF 01FF 01FF 01FF 01FF 01FF 01FF 01FF posun: 00FF 00FF 00FF 00FF 00FF 00FF 00FF 00FF posun: 007F 007F 007F 007F 007F 007F 007F 007F posun: 003F 003F 003F 003F 003F 003F 003F 003F posun: 001F 001F 001F 001F 001F 001F 001F 001F posun: 000F 000F 000F 000F 000F 000F 000F 000F posun: 0007 0007 0007 0007 0007 0007 0007 0007 posun: 0003 0003 0003 0003 0003 0003 0003 0003 posun: 0001 0001 0001 0001 0001 0001 0001 0001 posun: 0000 0000 0000 0000 0000 0000 0000 0000
Další je instrukce PSRLD, která provádí taktéž posun 128bitového vektoru, nyní ovšem po skupinách 32 bitů (dvouslov):
[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 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff sse_val_2 db 1 ;----------------------------------------------------------------------------- section .bss sse_tmp resb 16 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: mov ebx, sse_val_1 movdqu xmm0, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM0 mov esi, 1 ; konstanta, kterou budeme pricitat movd xmm1, esi ; nacteni konstanty do druheho vektoru print_sse_reg_as_hex xmm1 ; tisk hodnoty registru XMM0 mov eax, 16 next_shift: psrld xmm0, xmm1 ; logicky posun doprava push eax print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM1 pop eax dec eax ; snizit pocitadlo jnz next_shift ; a opakovat smycku exit ; ukonceni procesu %include "hex2string.asm"
Výsledky:
vstup: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF delta: 00000000 00000000 00000000 00000001 ----------------------------------- posun: 7FFFFFFF 7FFFFFFF 7FFFFFFF 7FFFFFFF posun: 3FFFFFFF 3FFFFFFF 3FFFFFFF 3FFFFFFF posun: 1FFFFFFF 1FFFFFFF 1FFFFFFF 1FFFFFFF posun: 0FFFFFFF 0FFFFFFF 0FFFFFFF 0FFFFFFF posun: 07FFFFFF 07FFFFFF 07FFFFFF 07FFFFFF posun: 03FFFFFF 03FFFFFF 03FFFFFF 03FFFFFF posun: 01FFFFFF 01FFFFFF 01FFFFFF 01FFFFFF posun: 00FFFFFF 00FFFFFF 00FFFFFF 00FFFFFF posun: 007FFFFF 007FFFFF 007FFFFF 007FFFFF posun: 003FFFFF 003FFFFF 003FFFFF 003FFFFF posun: 001FFFFF 001FFFFF 001FFFFF 001FFFFF posun: 000FFFFF 000FFFFF 000FFFFF 000FFFFF posun: 0007FFFF 0007FFFF 0007FFFF 0007FFFF posun: 0003FFFF 0003FFFF 0003FFFF 0003FFFF posun: 0001FFFF 0001FFFF 0001FFFF 0001FFFF posun: 0000FFFF 0000FFFF 0000FFFF 0000FFFF
Poslední instrukcí z této skupiny je instrukce PSRLQ pro posun čtyřslov ve 128bitovém vektoru:
[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 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff sse_val_2 db 1 ;----------------------------------------------------------------------------- section .bss sse_tmp resb 16 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: mov ebx, sse_val_1 movdqu xmm0, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM0 mov esi, 1 ; konstanta, kterou budeme pricitat movd xmm1, esi ; nacteni konstanty do druheho vektoru print_sse_reg_as_hex xmm1 ; tisk hodnoty registru XMM0 mov eax, 16 next_shift: psrlq xmm0, xmm1 ; logicky posun doprava push eax print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM1 pop eax dec eax ; snizit pocitadlo jnz next_shift ; a opakovat smycku exit ; ukonceni procesu %include "hex2string.asm"
Výsledky jsou snadno pochopitelné:
vstup: FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF delta: 0000000000000000 0000000000000001 --------------------------------- posun: 7FFFFFFFFFFFFFFF 7FFFFFFFFFFFFFFF posun: 3FFFFFFFFFFFFFFF 3FFFFFFFFFFFFFFF posun: 1FFFFFFFFFFFFFFF 1FFFFFFFFFFFFFFF posun: 0FFFFFFFFFFFFFFF 0FFFFFFFFFFFFFFF posun: 07FFFFFFFFFFFFFF 07FFFFFFFFFFFFFF posun: 03FFFFFFFFFFFFFF 03FFFFFFFFFFFFFF posun: 01FFFFFFFFFFFFFF 01FFFFFFFFFFFFFF posun: 00FFFFFFFFFFFFFF 00FFFFFFFFFFFFFF posun: 007FFFFFFFFFFFFF 007FFFFFFFFFFFFF posun: 003FFFFFFFFFFFFF 003FFFFFFFFFFFFF posun: 001FFFFFFFFFFFFF 001FFFFFFFFFFFFF posun: 000FFFFFFFFFFFFF 000FFFFFFFFFFFFF posun: 0007FFFFFFFFFFFF 0007FFFFFFFFFFFF posun: 0003FFFFFFFFFFFF 0003FFFFFFFFFFFF posun: 0001FFFFFFFFFFFF 0001FFFFFFFFFFFF posun: 0000FFFFFFFFFFFF 0000FFFFFFFFFFFF
6. Posuny po celých bajtech
Instrukce PSRLDQ sice taktéž patří mezi instrukce pro logické posuny, ovšem zajímavé je, že v tomto případě jsou posuny realizovány po celých bajtech a nikoli po bitech. Logickou jednotkou pro posuny jsou osmibajtová slova (vždy uložena ve dvojici) a samotný posun v bajtech je specifikován v celočíselné konstantě, nikoli v XMM registru. Opět si ukažme, jak může vypadat postupný posun osmibajtových slov doprava o jednotlivé bajty:
[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 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff sse_val_2 db 1 ;----------------------------------------------------------------------------- section .bss sse_tmp resb 16 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: mov ebx, sse_val_1 movdqu xmm0, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM0 mov eax, 16 next_shift: psrldq xmm0, 1 ; logicky posun doprava push eax print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM1 pop eax dec eax ; snizit pocitadlo jnz next_shift ; a opakovat smycku exit ; ukonceni procesu %include "hex2string.asm"
A takto vypadají výsledky postupného posunu 8bajtových slov doprava:
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00FFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 0000FFFF FFFFFFFF FFFFFFFF FFFFFFFF 000000FF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF FFFFFFFF 00000000 00FFFFFF FFFFFFFF FFFFFFFF 00000000 0000FFFF FFFFFFFF FFFFFFFF 00000000 000000FF FFFFFFFF FFFFFFFF 00000000 00000000 FFFFFFFF FFFFFFFF 00000000 00000000 00FFFFFF FFFFFFFF 00000000 00000000 0000FFFF FFFFFFFF 00000000 00000000 000000FF FFFFFFFF 00000000 00000000 00000000 FFFFFFFF 00000000 00000000 00000000 00FFFFFF 00000000 00000000 00000000 0000FFFF 00000000 00000000 00000000 000000FF 00000000 00000000 00000000 00000000
7. Logické operace se 128bitovými vektory
Logické operace se 128bitovými vektory jsme si již uvedli minule, takže jen krátce. Některé z těchto operací mají podobný význam, jako stejně pojmenované operace z rozšíření MMX, ovšem mohou pracovat se 128bitovým registrem a (i z tohoto důvodu) mají i odlišný operační kód. Jak však uvidíme v dalším textu, jsou některé operace funkčně totožné s jinými instrukcemi:
# | 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 |
8. Pejsek s kočičkou navrhují instrukční sadu: ANDPS, ANDPD a PAND
V instrukční sadě SSE (bez dvojky na konci) existuje instrukce ANDPS, která provádí bitový součin čtyř hodnot typu single. V instrukční sadě SSE navíc máme instrukci ANDPD provádějící bitový součin dvou hodnot typu double a navíc i instrukci PAND pracující přímo s celým 128bitovým vektorem. Ovšem když se nad těmito instrukcemi zamyslíme, zjistíme, že vlastně mají provádět stejnou operaci, takže je otázkou, jestli se jedná pouze o jmenné aliasy, nebo o samostatné instrukce. Jak uvidíme v další kapitole, jde o odlišné instrukce (mají odlišné kódování), i když provádí naprosto stejnou operaci. A uvádí se, že u mikroprocesorů Intel dokonce vykonání těchto instrukcí zajišťují odlišné subsystémy. Takto tedy vypadá svět architektury x86 :-)
Zkusme vykonat stejnou operaci bitového součinu se stejnými vstupy, ale s využitím odlišných instrukcí:
[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 dd 0xffffffff, 0x33333333, 0x11111111, 0x00000000 sse_val_2 dd 0x01020304, 0x01020304, 0x01020304, 0x01020304 ;----------------------------------------------------------------------------- section .bss sse_tmp resb 16 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: mov ebx, sse_val_1 movdqu xmm0, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM0 mov ebx, sse_val_2 movdqu xmm1, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm1 ; tisk hodnoty registru XMM1 movdqu xmm2, xmm0 pand xmm2, xmm1 ; prvni varianta bitoveho soucinu print_sse_reg_as_hex xmm2 ; tisk hodnoty registru XMM2 movdqu xmm2, xmm0 andps xmm2, xmm1 ; druha varianta bitoveho soucinu print_sse_reg_as_hex xmm2 ; tisk hodnoty registru XMM2 movdqu xmm2, xmm0 andpd xmm2, xmm1 ; treti varianta bitoveho soucinu print_sse_reg_as_hex xmm2 ; tisk hodnoty registru XMM2 exit ; ukonceni procesu %include "hex2string.asm"
9. Rozdíl mezi instrukcemi ANDPS, ANDPD a PAND
Jaký je tedy rozdíl mezi výše zmíněnými instrukcemi ANDPS, ANDPD a PAND? Z výsledků vypsaných předchozím příkladem je patrné, že z funkčního pohledu žádný, protože vždy dostaneme stejný výsledek:
vstup1: 00000000 11111111 33333333 FFFFFFFF vstup2: 01020304 01020304 01020304 01020304 ----------------------------------- PAND: 00000000 01000100 01020300 01020304 ANDPS: 00000000 01000100 01020300 01020304 ANDPD: 00000000 01000100 01020300 01020304
Liší se ovšem způsob zakódování těchto instrukcí ve strojovém kódu. Druhá a třetí instrukce se odlišuje použitím prefixu 0×66 u „double“ varianty a první instrukce má taktéž prefix 0×66, který ji odlišuje od její MMX varianty:
36 0000017C 660FDBD1 pand xmm2, xmm1 ; prvni varianta bitoveho soucinu 40 00000237 0F54D1 andps xmm2, xmm1 ; druha varianta bitoveho soucinu 44 000002F1 660F54D1 andpd xmm2, xmm1 ; treti varianta bitoveho soucinu
10. Bitový součin s negací
Zejména při provádění různých rastrových operací je velmi užitečná existence instrukce provádějící bitový součin s negací. I tato instrukce existuje se dvěma názvy ANDNPS a ANDNPD i dvěma odlišnými operačními kódy, ovšem prováděná operace je stále stejná – bitová negace prvního 128bitového operandu a provedení bitového součinu s negovanou hodnotou a druhým operandem. Podívejme se na chování této instrukce:
[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 dd 0xffffffff, 0x33333333, 0x11111111, 0x00000000 sse_val_2 dd 0x01020304, 0x01020304, 0x01020304, 0x01020304 ;----------------------------------------------------------------------------- section .bss sse_tmp resb 16 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: mov ebx, sse_val_1 movdqu xmm0, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM0 mov ebx, sse_val_2 movdqu xmm1, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm1 ; tisk hodnoty registru XMM1 movdqu xmm2, xmm0 andnps xmm2, xmm1 ; prvni varianta bitoveho soucinu s negaci print_sse_reg_as_hex xmm2 ; tisk hodnoty registru XMM2 movdqu xmm2, xmm0 andnpd xmm2, xmm1 ; druha varianta bitoveho soucinu s negaci print_sse_reg_as_hex xmm2 ; tisk hodnoty registru XMM2 exit ; ukonceni procesu %include "hex2string.asm"
Výsledky budou vypadat následovně:
vstup1: 00000000 11111111 33333333 FFFFFFFF vstup2: 01020304 01020304 01020304 01020304 ----------------------------------- ANDNPS: 01020304 00020204 00000004 00000000 ANDNPD: 01020304 00020204 00000004 00000000
11. Instrukce pro konverzi dat
Opět si připomeňme, že v instrukční sadě SSE2 nalezneme velké množství instrukcí určených pro konverzi vektorů obsahujících prvky různých typů – typicky 32bitové celočíselné hodnoty, FP hodnoty ve formátu single/float a taktéž FP hodnoty ve formátu double. Jak je patrné, opět se nejedná o ortogonální sadu instrukcí, to však v praxi nemusí vadit:
# | 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) |
12. Instrukce CVTPS2DQ
Z velkého množství konverzních instrukcí zmíněných v předchozí kapitole si pro praktické otestování vybereme instrukci nazvanou CVTPS2DQ. V první řadě je vhodné zjistit, jak vůbec přečíst název této instrukce. Prefix CVT je zřejmý – znamená ConVerT. Další dva znaky PS naznačují, že vstupem bude vektor (P=packed) obsahující hodnoty typu single. Dvojka se může číst jako „to“ a konečně znaky DQ znamenají double word a fakt, že výsledek bude uložen do XMM registru. Tato instrukce tedy převede čtveřici hodnot typu single na čtveřici 32bitových celých čísel se znaménkem. Podobným způsobem lze dekódovat i jména dalších instrukcí (i když by možná mohl být zvolen lepší způsob).
Ukažme si nyní, jak se provede konverze FP hodnot na celá čísla touto instrukcí:
[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 dd 1.0, 1.5, 2.0, 2.5 ;----------------------------------------------------------------------------- section .bss sse_tmp resb 16 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: mov ebx, sse_val_1 movdqu xmm0, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM0 cvtps2dq xmm1, xmm0 ; konverze hodnot typu single na cela cisla print_sse_reg_as_hex xmm1 ; tisk hodnoty registru XMM1 exit ; ukonceni procesu %include "hex2string.asm"
Z výsledků je patrné, že zaokrouhlování hodnot končících na 0,5 může být provedeno jak směrem nahoru, tak i dolů:
vstup (FP): 40200000 40000000 3FC00000 3F800000 odpovídá: 2.5 2.0 1.5 1.0 výstup (int): 00000002 00000002 00000002 00000001
13. Konverze záporných hodnot na celá čísla
Dále je vhodné zjistit, zda a jak se konvertují záporné FP hodnoty typu single na celá čísla. Předchozí zdrojový kód tedy nepatrně upraví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 dd -1.0, -1.5, -2.0, -2.5 ;----------------------------------------------------------------------------- section .bss sse_tmp resb 16 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: mov ebx, sse_val_1 movdqu xmm0, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM0 cvtps2dq xmm1, xmm0 ; konverze hodnot typu single na cela cisla print_sse_reg_as_hex xmm1 ; tisk hodnoty registru XMM1 exit ; ukonceni procesu %include "hex2string.asm"
Výsledky ukazují, že získáme skutečně celočíselné hodnoty se znaménkem:
vstup (FP): C0200000 C0000000 BFC00000 BF800000 odpovídá: -2.5 -2.0 -1.5 -1.0 výstup (int): FFFFFFFE FFFFFFFE FFFFFFFE FFFFFFFF odpovídá: -2 -2 -2 -1
14. Konverze speciálních hodnot na celá čísla
Formát single podporuje reprezentaci různých speciálních hodnot, zejména kladného a záporného nekonečna a taktéž hodnot NaN (dvě, resp. tři varianty). Jak se tyto hodnoty převedou na celá čísla, u nichž se podobný koncept nepoužívá, si ukážeme v dalším 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 dd __Infinity__, -__Infinity__, __NaN__, __QNaN__ ;----------------------------------------------------------------------------- section .bss sse_tmp resb 16 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: mov ebx, sse_val_1 movdqu xmm0, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM0 cvtps2dq xmm1, xmm0 ; konverze hodnot typu single na cela cisla print_sse_reg_as_hex xmm1 ; tisk hodnoty registru XMM1 exit ; ukonceni procesu %include "hex2string.asm"
Výsledky:
vstup (FP): 7FC00000 7FC00000 FF800000 7F800000 odpovídá: NaN NaN záporné a kladné nekonečno výstup (int): 80000000 80000000 80000000 80000000 odpovídá: -2147483648 -2147483648 -2147483648 -2147483648
15. Konverze mezi FP hodnotami ve formátu single a double
Často se setkáme s požadavkem na převod numerických hodnot mezi formáty single a double či (pochopitelně) v opačném směru (zde se ztrátou přesnosti). K tomuto účelu nalezneme v instrukční sadě SSE2 čtveřici instrukcí, které se liší v tom, kterým směrem je konverze prováděna a taktéž, zda se má jednat o převod skalární hodnoty nebo o převod vektoru. Vzhledem k tomu, že do 128bitového vektoru je možné uložit pouze dvě hodnoty typu double, jsou konverzní funkce omezeny pouze na dvouprvkové vektory – nelze tedy například zkonvertovat vektor se čtyřmi hodnotami typu single a uložit výsledek do dvojice XMM vektorů:
# | Instrukce | Konverze z… | Konverze do… |
---|---|---|---|
1 | CVTSS2SD | 1×32bitový single | 1×64bitový double |
2 | CVTSD2SS | 1×64bitový double | 1×32bitový single (horní polovina registru se nemění) |
3 | CVTPS2PD | 2×32bitový single | 2×64bitový double |
4 | CVTPD2PS | 2×64bitový double | 2×32bitový single ve spodní polovině MMX registru |
16. Konverze dvojice hodnot typu single na vektor prvků typu double
Ukažme si příklad založený na instrukci CVTPS2PD. Z tabulky uvedené v patnácté kapitole je zřejmé, že tato instrukce konvertuje vektor obsahující dvě FP hodnoty ve formátu single/float na dvě hodnoty typu double. Ovšem ještě je nutné vědět, které hodnoty typu single se vlastně převádí, protože v XMM vektoru jsou uloženy čtyři. V případě SSE2 se převádí nejnižší dva prvky vektoru, zatímco vyšší dva prvky jsou touto instrukcí ignorovány:
[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 dd 1.0, 1.5, 2.0, 2.5 ;----------------------------------------------------------------------------- section .bss sse_tmp resb 16 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: mov ebx, sse_val_1 movdqu xmm0, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM0 cvtps2pd xmm1, xmm0 ; konverze hodnot typu single na hodnoty typu double print_sse_reg_as_hex xmm1 ; tisk hodnoty registru XMM1 exit ; ukonceni procesu %include "hex2string.asm"
Výsledky budou vypadat následovně:
vstup (single): 40200000 40000000 3FC00000 3F800000 výstup (double): 3FF8000000000000 3FF0000000000000
Po převodu z hexadecimálního zápisu na „lidský“ desítkový zápis dostaneme tyto výsledky:
vstup (single): 2.5 2.0 1.5 1.0 výstup (double): 1.5 1.0
17. Konverze dvojice hodnot typu double na vektor prvků typu single
Zajímavější a potenciálně problematický je pochopitelně opačný převod, tj. konverze hodnot typu double na typ single. Při konverzi totiž může dojít ke ztrátě přesnosti, ale taktéž k tomu, že malé hodnoty budou zaokrouhleny na přesnou nulu. A naopak velké hodnoty nebude možné ve formátu single reprezentovat.
Pokusme se tedy o převod přesně definované hodnoty 2.0 a nepřesně uložené hodnoty 0.1 (tu nelze ve formátu s exponentem se základem 2 uložit přesně ani při použití single, ale ani double):
[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 dq 2.0, 0.1 ;----------------------------------------------------------------------------- section .bss sse_tmp resb 16 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: mov ebx, sse_val_1 movdqu xmm0, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM0 cvtpd2ps xmm1, xmm0 ; konverze hodnot typu double na hodnoty typu single print_sse_reg_as_hex xmm1 ; tisk hodnoty registru XMM1 exit ; ukonceni procesu %include "hex2string.asm"
Výsledky budou vypadat následovně:
vstup (double): 3FB999999999999A 4000000000000000 výstup (single): 00000000 00000000 3DCCCCCD 40000000
Neboli po převodu do lidského formátu:
vstup (double): 0.1 (nepřesně) 2.0 (přesně) výstup (single): 0.0 0.0 0.1 (nepřesně) 2.0 (přesně)
18. Zaokrouhlení na nulu či na nekonečno při konverzích
V dnešním posledním demonstračním příkladu se pokusme o převod příliš velkých, příliš malých hodnot i hodnot blízkých nule z formátu double do formátu single. Bude se jednat o tyto hodnoty 1e100, –1e100 a taktéž o hodnoty blízké nule: 1e-100 a –1e-100:
[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 dq 1e100, -1e100 sse_val_2 dq 1e-100, -1e-100 ;----------------------------------------------------------------------------- section .bss sse_tmp resb 16 ;----------------------------------------------------------------------------- section .text global _start ; tento symbol ma byt dostupny i linkeru _start: mov ebx, sse_val_1 movdqu xmm0, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM0 cvtpd2ps xmm1, xmm0 ; konverze hodnot typu double na hodnoty typu single print_sse_reg_as_hex xmm1 ; tisk hodnoty registru XMM1 mov ebx, sse_val_2 movdqu xmm0, [ebx] ; nacteni puvodniho vektoru do registru XMM0 print_sse_reg_as_hex xmm0 ; tisk hodnoty registru XMM0 cvtpd2ps xmm1, xmm0 ; konverze hodnot typu double na hodnoty typu single print_sse_reg_as_hex xmm1 ; tisk hodnoty registru XMM1 exit ; ukonceni procesu %include "hex2string.asm"
Podívejme se na výsledky, nejprve v hexadecimální podobě:
vstup (double): D4B249AD2594C37D 54B249AD2594C37D výstup (single): 00000000 00000000 FF800000 7F800000 vstup (double): AB2BFF2EE48E0530 2B2BFF2EE48E0530 výstup (single): 00000000 00000000 80000000 00000000
Přepis na lidsky čitelné výsledky ukazuje, že velké hodnoty, které nelze uložit do formátu single, jsou převedeny na kladné nebo záporné nekonečna. A naopak velmi malé hodnoty blízké nule jsou převedeny na kladnou nebo zápornou nulu:
vstup (double): -1e100 1e100 výstup (single): 0.0 0.0 -nekonečno nekonečno vstup (double): -1e-100 1e-100 výstup (single): 0.0 0.0 -0.0 0.0
19. Repositář s demonstračními příklady
Demonstrační příklady napsané v assembleru, které jsou určené pro překlad s využitím assembleru NASM, byly uloženy do Git repositáře, který je dostupný na adrese https://github.com/tisnik/8bit-fame. Jednotlivé demonstrační příklady si můžete v případě potřeby stáhnout i jednotlivě bez nutnosti klonovat celý (dnes již poměrně rozsáhlý) repositář:
# | Příklad | Stručný popis | Adresa |
---|---|---|---|
1 | hello.asm | program typu „Hello world“ naprogramovaný v assembleru pro systém DOS | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello.asm |
2 | hello_shorter.asm | kratší varianta výskoku z procesu zpět do DOSu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_shorter.asm |
3 | hello_wait.asm | čekání na stisk klávesy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_wait.asm |
4 | hello_macros.asm | realizace jednotlivých částí programu makrem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_macros.asm |
5 | gfx4_putpixel.asm | vykreslení pixelu v grafickém režimu 4 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_putpixel.asm |
6 | gfx6_putpixel.asm | vykreslení pixelu v grafickém režimu 6 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel.asm |
7 | gfx4_line.asm | vykreslení úsečky v grafickém režimu 4 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_line.asm |
8 | gfx6_line.asm | vykreslení úsečky v grafickém režimu 6 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_line.asm |
9 | gfx6_fill1.asm | vyplnění obrazovky v grafickém režimu, základní varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill1.asm |
10 | gfx6_fill2.asm | vyplnění obrazovky v grafickém režimu, varianta s instrukcí LOOP | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill2.asm |
11 | gfx6_fill3.asm | vyplnění obrazovky instrukcí REP STOSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill3.asm |
12 | gfx6_fill4.asm | vyplnění obrazovky, synchronizace vykreslování s paprskem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill4.asm |
13 | gfx4_image1.asm | vykreslení rastrového obrázku získaného z binárních dat, základní varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image1.asm |
14 | gfx4_image2.asm | varianta vykreslení rastrového obrázku s využitím instrukce REP MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image2.asm |
15 | gfx4_image3.asm | varianta vykreslení rastrového obrázku s využitím instrukce REP MOVSW | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image3.asm |
16 | gfx4_image4.asm | korektní vykreslení všech sudých řádků bitmapy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image4.asm |
17 | gfx4_image5.asm | korektní vykreslení všech sudých i lichých řádků bitmapy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image5.asm |
18 | gfx4_image6.asm | nastavení barvové palety před vykreslením obrázku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image6.asm |
19 | gfx4_image7.asm | nastavení barvové palety před vykreslením obrázku, snížená intenzita barev | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image7.asm |
20 | gfx4_image8.asm | postupná změna barvy pozadí | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image8.asm |
21 | gfx6_putpixel1.asm | vykreslení pixelu, základní varianta se 16bitovým násobením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel1.asm |
22 | gfx6_putpixel2.asm | vykreslení pixelu, varianta s osmibitovým násobením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel2.asm |
23 | gfx6_putpixel3.asm | vykreslení pixelu, varianta bez násobení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel3.asm |
24 | gfx6_putpixel4.asm | vykreslení pixelu přes obrázek, nekorektní chování (přepis obrázku) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel4.asm |
25 | gfx6_putpixel5.asm | vykreslení pixelu přes obrázek, korektní varianta pro bílé pixely | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel5.asm |
26 | cga_text_mode1.asm | standardní textový režim s rozlišením 40×25 znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode1.asm |
27 | cga_text_mode3.asm | standardní textový režim s rozlišením 80×25 znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode3.asm |
28 | cga_text_mode_intensity.asm | změna významu nejvyššího bitu atributového bajtu: vyšší intenzita namísto blikání | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_intensity.asm |
29 | cga_text_mode_cursor.asm | změna tvaru textového kurzoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_cursor.asm |
30 | cga_text_gfx1.asm | zobrazení „rastrové mřížky“: pseudografický režim 160×25 pixelů (interně textový režim) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_gfx1.asm |
31 | cga_text_mode_char_height.asm | změna výšky znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_char_height.asm |
32 | cga_text_160×100.asm | grafický režim 160×100 se šestnácti barvami (interně upravený textový režim) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_160×100.asm |
33 | hercules_text_mode1.asm | využití standardního textového režimu společně s kartou Hercules | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_text_mode1.asm |
34 | hercules_text_mode2.asm | zákaz blikání v textových režimech | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_text_mode2.asm |
35 | hercules_turn_off.asm | vypnutí generování video signálu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_turn_off.asm |
36 | hercules_gfx_mode1.asm | přepnutí karty Hercules do grafického režimu (základní varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_gfx_mode1.asm |
37 | hercules_gfx_mode2.asm | přepnutí karty Hercules do grafického režimu (vylepšená varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_gfx_mode2.asm |
38 | hercules_putpixel.asm | subrutina pro vykreslení jediného pixelu na kartě Hercules | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_putpixel.asm |
39 | ega_text_mode_80×25.asm | standardní textový režim 80×25 znaků na kartě EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_text_mode_80×25.asm |
40 | ega_text_mode_80×43.asm | zobrazení 43 textových řádků na kartě EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_text_mode_80×43.asm |
41 | ega_gfx_mode_320×200.asm | přepnutí do grafického režimu 320×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_320×200.asm |
42 | ega_gfx_mode_640×200.asm | přepnutí do grafického režimu 640×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_640×200.asm |
43 | ega_gfx_mode_640×350.asm | přepnutí do grafického režimu 640×350 pixelů se čtyřmi nebo šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_640×350.asm |
44 | ega_gfx_mode_bitplanes1.asm | ovládání zápisu do bitových rovin v planárních grafických režimech (základní způsob) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_bitplanes1.asm |
45 | ega_gfx_mode_bitplanes2.asm | ovládání zápisu do bitových rovin v planárních grafických režimech (rychlejší způsob) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_bitplanes2.asm |
46 | ega_320×200_putpixel.asm | vykreslení pixelu v grafickém režimu 320×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_320×200_putpixel.asm |
47 | ega_640×350_putpixel.asm | vykreslení pixelu v grafickém režimu 640×350 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_640×350_putpixel.asm |
48 | ega_standard_font.asm | použití standardního fontu grafické karty EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_standard_font.asm |
49 | ega_custom_font.asm | načtení vlastního fontu s jeho zobrazením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_custom_font.asm |
50 | ega_palette1.asm | změna barvové palety (všech 16 barev) v grafickém režimu 320×200 se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette1.asm |
51 | ega_palette2.asm | změna barvové palety (všech 16 barev) v grafickém režimu 640×350 se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette2.asm |
52 | ega_palette3.asm | změna všech barev v barvové paletě s využitím programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette3.asm |
53 | ega_palette4.asm | změna všech barev, včetně barvy okraje, v barvové paletě voláním funkce BIOSu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette4.asm |
54 | vga_text_mode_80×25.asm | standardní textový režim 80×25 znaků na kartě VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_80×25.asm |
55 | vga_text_mode_80×50.asm | zobrazení 50 a taktéž 28 textových řádků na kartě VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_80×50.asm |
56 | vga_text_mode_intensity1.asm | změna chování atributového bitu pro blikání (nebezpečná varianta změny registrů) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_intensity1.asm |
57 | vga_text_mode_intensity2.asm | změna chování atributového bitu pro blikání (bezpečnější varianta změny registrů) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_intensity2.asm |
58 | vga_text_mode_9th_column.asm | modifikace způsobu zobrazení devátého sloupce ve znakových režimech (720 pixelů na řádku) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_9th_column.asm |
59 | vga_text_mode_cursor_shape.asm | změna tvaru textového kurzoru na grafické kartě VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_cursor_shape.asm |
60 | vga_text_mode_custom_font.asm | načtení vlastního fontu s jeho zobrazením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_custom_font.asm |
61 | vga_gfx_mode_640×480.asm | přepnutí do grafického režimu 640×480 pixelů se šestnácti barvami, vykreslení vzorků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_640×480.asm |
62 | vga_gfx_mode_320×200.asm | přepnutí do grafického režimu 320×200 pixelů s 256 barvami, vykreslení vzorků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_320×200.asm |
63 | vga_gfx_mode_palette.asm | změna všech barev v barvové paletě grafické karty VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_palette.asm |
64 | vga_gfx_mode_dac1.asm | využití DAC (neočekávané výsledky) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac1.asm |
65 | vga_gfx_mode_dac2.asm | využití DAC (očekávané výsledky) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac2.asm |
66 | vga_640×480_putpixel.asm | realizace algoritmu pro vykreslení pixelu v grafickém režimu 640×480 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_640×480_putpixel.asm |
67 | vga_320×200_putpixel1.asm | realizace algoritmu pro vykreslení pixelu v grafickém režimu 320×200 s 256 barvami (základní varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel1.asm |
68 | vga_320×200_putpixel2.asm | realizace algoritmu pro vykreslení pixelu v grafickém režimu 320×200 s 256 barvami (rychlejší varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel2.asm |
69 | vga_gfx_mode_dac3.asm | přímé využití DAC v grafickém režimu 13h | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac3.asm |
70 | vga_gfx_mode_unchained_step1.asm | zobrazení barevných pruhů v režimu 13h | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step1.asm |
71 | vga_gfx_mode_unchained_step2.asm | vypnutí zřetězení bitových rovin a změna způsobu adresování pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step2.asm |
72 | vga_gfx_mode_unchained_step3.asm | vykreslení barevných pruhů do vybraných bitových rovin | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step3.asm |
73 | vga_gfx_mode_320×400.asm | nestandardní grafický režim s rozlišením 320×400 pixelů a 256 barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_320×400.asm |
74 | vga_320×200_image.asm | zobrazení rastrového obrázku ve standardním grafickém režimu 320×200 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image.asm |
75 | vga_320×200_unchained_image1.asm | zobrazení rastrového obrázku v režimu s nezřetězenými rovinami (nekorektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_unchained_image1.asm |
76 | vga_320×200_unchained_image2.asm | zobrazení rastrového obrázku v režimu s nezřetězenými rovinami (korektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_unchained_image2.asm |
77 | vga_320×400_unchained_image.asm | zobrazení rastrového obrázku v nestandardním režimu 320×400 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_unchained_image.asm |
78 | vga_vertical_scroll1.asm | vertikální scrolling na kartě VGA v režimu s rozlišením 320×200 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_vertical_scroll1.asm |
79 | vga_vertical_scroll2.asm | vertikální scrolling na kartě VGA v režimu s rozlišením 320×400 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_vertical_scroll2.asm |
80 | vga_split_screen1.asm | režim split-screen a scrolling, nefunční varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_split_screen1.asm |
81 | vga_split_screen2.asm | režim split-screen a scrolling, plně funkční varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_split_screen2.asm |
82 | vga_horizontal_scroll1.asm | horizontální scrolling bez rozšíření počtu pixelů na virtuálním řádku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll1.asm |
83 | vga_horizontal_scroll2.asm | horizontální scrolling s rozšířením počtu pixelů na virtuálním řádku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll2.asm |
84 | vga_horizontal_scroll3.asm | jemný horizontální scrolling s rozšířením počtu pixelů na virtuálním řádku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll3.asm |
85 | vga_320×240_image.asm | nastavení grafického režimu Mode-X, načtení a vykreslení obrázku, scrolling | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×240_image.asm |
86 | io.asm | knihovna maker pro I/O operace | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/io.asm |
87 | vga_lib.asm | knihovna maker a podprogramů pro programování karty VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_lib.asm |
88 | vga_320×240_lib.asm | nastavení grafického režimu Mode-X, tentokrát knihovními funkcemi | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×240_lib.asm |
89 | vga_bitblt1.asm | první (naivní) implementace operace BitBLT | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt1.asm |
90 | vga_bitblt2.asm | operace BitBLT s výběrem bitových rovin pro zápis | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt2.asm |
91 | vga_bitblt3.asm | operace BitBLT s výběrem bitových rovin pro čtení i zápis | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt3.asm |
92 | vga_bitblt4.asm | korektní BitBLT pro 16barevný režim, realizace makry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt4.asm |
93 | vga_bitblt5.asm | korektní BitBLT pro 16barevný režim, realizace podprogramem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt5.asm |
94 | vga_bitblt_rotate.asm | zápisový režim s rotací bajtu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt_rotate.asm |
95 | vga_bitblt_fast.asm | rychlá korektní 32bitová operace typu BitBLT | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt_fast.asm |
96 | vga_320×400_bitblt1.asm | přenos obrázku v režimu 320×400 operací BitBLT (neúplná varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_bitblt1.asm |
97 | vga_320×400_bitblt2.asm | přenos obrázku v režimu 320×400 operací BitBLT (úplná varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_bitblt2.asm |
98 | vga_write_modes1.asm | volitelné zápisové režimy grafické karty VGA, zápis bez úpravy latche | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes1.asm |
99 | vga_write_modes2.asm | volitelné zápisové režimy grafické karty VGA, zápis s modifikací latche | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes2.asm |
100 | vga_write_modes3.asm | volitelné zápisové režimy grafické karty VGA, cílená modifikace latche vzorkem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes3.asm |
101 | instruction_jump.asm | použití instrukce JMP | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jump.asm |
102 | instruction_jnz.asm | použití instrukce JNZ pro realizaci programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jnz.asm |
103 | instruction_jz_jmp.asm | použití instrukcí JZ a JMP pro realizaci programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jz_jmp.asm |
104 | instruction_loop.asm | použití instrukce LOOP pro realizaci programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_loop.asm |
105 | instruction_template.asm | šablona všech následujících demonstračních příkladů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_template.asm |
106 | instruction_print_hex.asm | tisk osmibitové hexadecimální hodnoty | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_print_hex.asm |
107 | instruction_xlat.asm | využití instrukce XLAT pro získání tisknutelné hexadecimální cifry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_xlat.asm |
108 | instruction_daa.asm | operace součtu s využitím binární i BCD aritmetiky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_daa.asm |
109 | instruction_daa_sub.asm | instrukce DAA po provedení operace rozdílu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_daa_sub.asm |
110 | instruction_das.asm | instrukce DAS po provedení operace rozdílu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_das.asm |
111 | instruction_aaa.asm | korekce výsledku na jedinou BCD cifru operací AAA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_aaa.asm |
112 | instruction_mul.asm | ukázka výpočtu součinu dvou osmibitových hodnot | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_mul.asm |
113 | instruction_aam.asm | BCD korekce po výpočtu součinu instrukcí AAM | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_aam.asm |
114 | instruction_stosb.asm | blokový zápis dat instrukcí STOSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_stosb.asm |
115 | instruction_rep_stosb.asm | opakované provádění instrukce STOSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_stosb.asm |
116 | instruction_lodsb.asm | čtení dat instrukcí LODSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_lodsb.asm |
117 | instruction_movsb.asm | přenos jednoho bajtu instrukcí MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_movsb.asm |
118 | instruction_rep_movsb.asm | blokový přenos po bajtech instrukcí MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_movsb.asm |
119 | instruction_rep_scas.asm | vyhledávání v řetězci instrukcí SCAS | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_scas.asm |
120 | vga_320×200_image_0B.asm | výsledek blokového přenosu ve chvíli, kdy je CX=0 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_0B.asm |
121 | vga_320×200_image_64kB.asm | výsledek blokového přenosu ve chvíli, kdy je CX=0×ffff | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_64kB.asm |
122 | vga_320×200_image_movsb.asm | blokový přenos v rámci obrazové paměti instrukcí REP MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb.asm |
123 | vga_320×200_image_movsw.asm | blokový přenos v rámci obrazové paměti instrukcí REP MOVSW | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsw.asm |
124 | vga_320×200_image_movsd.asm | blokový přenos v rámci obrazové paměti instrukcí REP MOVSD | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsd.asm |
125 | vga_320×200_image_movsb_forward.asm | blokový přenos překrývajících se bloků paměti (zvyšující se adresy) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_forward.asm |
126 | vga_320×200_image_movsb_backward1.asm | blokový přenos překrývajících se bloků paměti (snižující se adresy, nekorektní nastavení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_backward1.asm |
127 | vga_320×200_image_movsb_backward2.asm | blokový přenos překrývajících se bloků paměti (snižující se adresy, korektní nastavení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_backward2.asm |
128 | sound_bell.asm | přehrání zvuku pomocí tisku ASCII znaku BELL | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_bell.asm |
129 | sound_beep.asm | přehrání zvuku o zadané frekvenci na PC Speakeru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_beep.asm |
130 | sound_play_pitch.asm | přehrání zvuku o zadané frekvenci na PC Speakeru, použití maker | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_play_pitch.asm |
131 | sound_opl2_basic.asm | přehrání komorního A na OPL2 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_basic.asm |
132 | sound_opl2_table.asm | přehrání komorního A na OPL2, použití tabulky s hodnotami registrů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_table.asm |
133 | sound_opl2_table2.asm | přepis tabulky s obsahy registrů pro přehrání komorního A | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_table2.asm |
134 | sound_key_on.asm | přímé ovládání bitu KEY ON mezerníkem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_key_on.asm |
135 | sound_adsr.asm | nastavení obálky pro tón přehrávaný prvním kanálem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_adsr.asm |
136 | sound_modulation.asm | řízení frekvence modulátoru klávesami 1 a 0 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_modulation.asm |
137 | keyboard_basic.asm | přímá práce s klávesnicí IBM PC | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/keyboard_basic.asm |
138 | sound_stereo_opl2.asm | stereo zvuk v konfiguraci DualOPL2 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_stereo_opl2.asm |
139 | sound_opl2_multichannel.asm | vícekanálový zvuk na OPL2 (klávesy), delší varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_multichannel.asm |
140 | sound_opl2_multichannel2.asm | vícekanálový zvuk na OPL2 (klávesy), kratší varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_multichannel2.asm |
141 | sound_opl3_stereo1.asm | stereo výstup na OPL3 (v kompatibilním režimu) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_stereo1.asm |
142 | sound_opl3_stereo2.asm | stereo výstup na OPL3 (v režimu OPL3) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_stereo2.asm |
143 | sound_opl3_multichannel.asm | vícekanálový zvuk na OPL3 (klávesy) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_multichannel.asm |
144 | sound_opl3_waveform1.asm | interaktivní modifikace tvaru vlny u prvního operátoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform1.asm |
145 | sound_opl3_waveform2.asm | oprava chyby: povolení režimu kompatibilního s OPL3 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform2.asm |
146 | sound_opl3_waveform3.asm | vliv tvaru vln na zvukový kanál s FM syntézou | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform3.asm |
147 | sound_opl3_waveform4.asm | modifikace tvaru vlny nosné vlny i modulátoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform4.asm |
148 | sound_opl3_4operators1.asm | výběr AM/FM režimu ve čtyřoperátorovém nastavení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_4operators1.asm |
149 | sound_opl3_4operators2.asm | výběr AM/FM režimu ve čtyřoperátorovém nastavení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_4operators2.asm |
150 | timer_basic.asm | základní obsluha přerušení od časovače/čítače | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_basic.asm |
151 | timer_restore.asm | obnovení původní obsluhy přerušení při ukončování aplikace | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_restore.asm |
152 | timer_restore_better_structure.asm | refaktoring předchozího demonstračního příkladu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_restore_better_structure.asm |
153 | timer_faster_clock.asm | zrychlení čítače na 100 přerušení za sekundu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_faster_clock.asm |
154 | instruction_push_imm.asm | instrukce PUSH s konstantou | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_push_imm.asm |
155 | instruction_imul_imm.asm | instrukce IMUL s konstantou | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_imul_imm.asm |
156 | instruction_into1.asm | instrukce INTO s obsluhou přerušení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_into1.asm |
157 | instruction_into2.asm | instrukce INTO s obsluhou přerušení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_into2.asm |
158 | instruction_bound1.asm | instrukce BOUND s obsluhou přerušení (nekorektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bound1.asm |
159 | instruction_bound2.asm | instrukce BOUND s obsluhou přerušení (korektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bound2.asm |
160 | vga_320×200_putpixel286.asm | instrukce bitového posunu s konstantou větší než 1 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel286.asm |
161 | instruction_push_pop.asm | instrukce PUSH a POP se všemi pracovními registry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_push_pop.asm |
162 | instruction_push_pop_B.asm | instrukce s novými segmentovými registry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_push_pop_B.asm |
163 | instruction_near_jz_jmp.asm | blízké skoky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_near_jz_jmp.asm |
164 | instruction_bsf.asm | nová instrukce BSF | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bsf.asm |
165 | instruction_bsr.asm | nová instrukce BSR | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_bsr.asm |
166 | instruction_add_32bit.asm | 32bitový součet | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_add_32bit.asm |
167 | instruction_inc_32bit.asm | 32bitová instrukce INC v šestnáctibitovém režimu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_inc_32bit.asm |
168 | instruction_inc_32bit_B.asm | 32bitová instrukce INC v 32bitovém režimu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_inc_32bit_B.asm |
169 | ems_status.asm | zjištění stavu (emulace) paměti EMS | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ems_status.asm |
170 | ems_total_mem.asm | získání celkové kapacity paměti EMS v blocích | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ems_total_mem.asm |
171 | ems_free_mem.asm | získání volné kapacity paměti EMS v blocích | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ems_free_mem.asm |
172 | xms_free_mem.asm | získání volné kapacity paměti XMS v blocích | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/xms_free_mem.asm |
173 | vga_320×200_short_address1.asm | blokový přenos provedený v rámci prostoru segmentu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address1.asm |
174 | vga_320×200_short_address2.asm | rozepsaný blokový přenos provedený v rámci prostoru segmentu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address2.asm |
175 | vga_320×200_short_address3.asm | přenos nelze provést přes hranici offsetu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address3.asm |
176 | vga_320×200_short_address4.asm | přenos nelze provést přes hranici offsetu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_short_address4.asm |
177 | vga_320×200_long_address1.asm | 32bitový blokový přenos | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address1.asm |
178 | vga_320×200_long_address2.asm | rozepsaný 32bitový blokový přenos provedený v rámci prostoru segmentu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address2.asm |
179 | vga_320×200_long_address3.asm | přístup do obrazové paměti přes segment 0×0000 a 32bitový offset | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address3.asm |
180 | vga_320×200_long_address4.asm | otestování, jak lze přenášet data s využitím 32bitového offsetu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_long_address4.asm |
181 | print_msw.asm | přečtení a zobrazení obsahu speciálního registru MSW | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/print_msw.asm |
182 | print_cr0.asm | přečtení a zobrazení obsahu speciálního registru CR0 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/print_cr0.asm |
183 | prot_mode286.asm | přechod do chráněného režimu na čipech Intel 80286 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode286.asm |
184 | prot_mode386.asm | přechod do chráněného režimu na čipech Intel 80386 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode386.asm |
185 | prot_mode_back_to_real_mode286.asm | přechod mezi reálným režimem a chráněným režimem i zpět na čipech Intel 80286 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode_back_to_real_mode286.asm |
186 | prot_mode_back_to_real_mode386.asm | přechod mezi reálným režimem a chráněným režimem i zpět na čipech Intel 80386 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode_back_to_real_mode386.asm |
187 | prot_mode_check.asm | test, zda se mikroprocesor již nachází v chráněném režimu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/prot_mode_check.asm |
188 | unreal_mode.asm | nastavení nereálného režimu (platné pro Intel 80386) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/unreal_mode.asm |
189 | float32_constants.asm | vytištění základních FP konstant typu single | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/float32_constants.asm |
190 | float64_constants.asm | vytištění základních FP konstant typu double | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/float64_constants.asm |
191 | fpu_arithmetic.asm | základní aritmetické operace prováděné matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_arithmetic.asm |
192 | fpu_divide_by_zero.asm | dělení nulou matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_by_zero.asm |
193 | fpu_divide_by_neg_zero.asm | dělení záporné hodnoty nulou matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_by_neg_zero.asm |
194 | fpu_divide_by_neg_zero2.asm | dělení hodnoty zápornou nulou matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_by_neg_zero2.asm |
195 | fpu_divide_zero_by_zero.asm | výpočet 0/0 matematickým koprocesorem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_zero_by_zero.asm |
196 | io.asm | pomocná makra pro komunikaci s DOSem a BIOSem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/io.asm |
197 | print.asm | pomocná makra pro tisk FPU hodnot typu single a double v hexadecimálním tvaru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/print.asm |
198 | fpu_divide.asm | operace podílu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide.asm |
199 | fpu_divide_r.asm | operace podílu s prohozenými operandy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_divide_r.asm |
200 | fpu_sqrt.asm | výpočet druhé odmocniny | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_sqrt.asm |
201 | fpu_sqrt_neg_value.asm | výpočet druhé odmocniny ze záporné hodnoty | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_sqrt_neg_value.asm |
202 | fpu_check.asm | detekce typu matematického koprocesoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_check.asm |
203 | fpu_compare.asm | porovnání dvou hodnot s vyhodnocením výsledku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_compare.asm |
204 | fpu_status_word.asm | tisk obsahu stavového slova koprocesoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_status_word.asm |
205 | fpu_status_word_stack.asm | tisk obsahu stavového slova koprocesoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/fpu_status_word_stack.asm |
206 | Makefile | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/Makefile | |
207 | hex2string.asm | subrutina pro převod 32bitové hexadecimální hodnoty na řetězec | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/hex2string.asm |
208 | linux_macros.asm | pomocná makra pro tvorbu aplikací psaných v assembleru pro Linux | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/linux_macros.asm |
209 | mmx_init.asm | inicializace subsystému MMX | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_init.asm |
210 | mmx_paddb1.asm | zavolání MMX instrukce pro součet vektorů bajtů (bez přetečení) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddb1.asm |
211 | mmx_paddb2.asm | zavolání MMX instrukce pro součet vektorů bajtů (s přetečením) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddb2.asm |
212 | mmx_paddusb.asm | zavolání MMX instrukce pro součet vektorů bajtů se saturací | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddusb.asm |
213 | mmx_paddw.asm | zavolání MMX instrukce pro součet vektorů šestnáctibitových slov | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddw.asm |
214 | mmx_paddd.asm | zavolání MMX instrukce pro součet vektorů 32bitových slov | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddd.asm |
215 | mmx_paddq.asm | zavolání MMX instrukce pro součet 64bitových slov | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddq.asm |
216 | mmx_paddx.asm | porovnání operací součtu pro vektory s prvky různých typů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddx.asm |
217 | mmx_support.asm | zjištění, zda je MMX podporována | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_support.asm |
218 | mmx_paddx_saturation.asm | součet osmiprvkových a čtyřprvkových vektorů se saturací | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_paddx_saturation.asm |
219 | mmx_psubx.asm | rozdíl vektorů s různým počtem a šířkou prvků | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_psubx.asm |
220 | mmx_pmullw1.asm | součin vektorů prvek po prvku se získáním spodních 16 bitů výsledků (varianta bez přetečení) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pmullw1.asm |
221 | mmx_pmullw2.asm | součin vektorů prvek po prvku se získáním spodních 16 bitů výsledků (varianta s přetečením) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pmullw2.asm |
222 | mmx_pmulhw.asm | součin vektorů prvek po prvku se získáním horních 16 bitů výsledků (varianta s přetečením) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pmulhw.asm |
223 | mmx_pmaddwd.asm | součin vektorů prvek po prvku, součet mezivýsledků | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pmaddwd.asm |
224 | mmx_logical.asm | logické instrukce MMX | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_logical.asm |
225 | mmx_shift_left.asm | logické posuny prvků vektorů doleva | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_shift_left.asm |
226 | mmx_shift_right.asm | logické posuny prvků vektorů doprava | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_shift_right.asm |
227 | mmx_arithmetic_right.asm | aritmetické posuny prvků vektorů doprava | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_arithmetic_right.asm |
228 | mmx_cmpeq.asm | porovnání prvků vektorů na rovnost | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_cmpeq.asm |
229 | mmx_cmpgt.asm | porovnání prvků vektorů na relaci „větší než“ | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_cmpgt.asm |
230 | mmx_unpack_bytes.asm | rozbalení bajtů z vektorů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_unpack_bytes.asm |
231 | mmx_unpack_words.asm | rozbalení slov z vektorů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_unpack_words.asm |
232 | mmx_unpack_dwords.asm | rozbalení dvojslov z vektorů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_unpack_dwords.asm |
233 | mmx_pack_into_bytes1.asm | zabalení vektorů slov do vektoru bajtů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pack_into_bytes1.asm |
234 | mmx_pack_into_bytes2.asm | řešení přetečení při zabalování vektorů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/mmx_pack_into_bytes2.asm |
235 | sse_support.asm | detekce, zda mikroprocesor podporuje instrukce SSE | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_support.asm |
236 | sse_instr_formats.asm | instrukční formát SSE | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_instr_formats.asm |
237 | sse_value_unaligned1.asm | načtení konstanty do XMM registru (nezarovnaná adresa) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_value_unaligned1.asm |
238 | sse_value_unaligned2.asm | načtení konstanty do XMM registru (nezarovnaná adresa, ovšem vyžadováno je zarovnání) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_value_unaligned2.asm |
239 | sse_value_aligned.asm | načtení konstanty do XMM registru (zarovnaná adresa) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_value_aligned.asm |
240 | sse_addss.asm | skalární součet instrukcí ADDSS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_addss.asm |
241 | sse_addps.asm | vektorový součet instrukcí ADDPS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_addps.asm |
242 | sse_subss.asm | skalární rozdíl instrukcí SUBSS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_subss.asm |
243 | sse_subps.asm | skalární rozdíl instrukcí SUBPS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_subps.asm |
244 | sse_mulps.asm | součin prvků vektorů instrukcí MULPS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_mulps.asm |
245 | sse_divps.asm | podíl prvků vektorů instrukcí DIVPS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_divps.asm |
246 | sse_maxmin.asm | porovnání a výběr větších, resp. menších prvků z dvojice vektorů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_maxmin.asm |
247 | sse_reciprocal.asm | přibližný výpočet převrácené hodnoty | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_reciprocal.asm |
248 | sse_sqrt.asm | výpočet druhé odmocniny prvků | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_sqrt.asm |
249 | sse_cmpeqps.asm | porovnání prvků vektorů na rovnost | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_cmpeqps.asm |
250 | sse_cmpltps.asm | porovnání prvků vektorů na relaci „menší než“ | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_cmpltps.asm |
251 | sse_inf_nan.asm | speciální hodnoty nekonečno a NaN v instrukčním souboru SSE | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_inf_nan.asm |
252 | sse_ordered.asm | zjištění, které prvky vektorů jsou porovnatelné | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_ordered.asm |
253 | sse_unpckhps.asm | proložení prvků dvou vektorů instrukcí UNPCKHPS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_unpckhps.asm |
254 | sse_unpcklps.asm | proložení prvků dvou vektorů instrukcí UNPCKLPS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_unpcklps.asm |
255 | sse_shufps.asm | použití instrukce SHUFPS | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_shufps.asm |
256 | sse_cvtsi2ss.asm | konverze celého čísla na hodnotu typu single | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_cvtsi2ss.asm |
257 | sse_cvtss2si.asm | konverze hodnoty typu single na celé číslo | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_cvtss2si.asm |
258 | sse_cvtss2si_fract.asm | konverze neceločíselných hodnot na celé číslo | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_cvtss2si_fract.asm |
258 | sse_cvtss2si_special.asm | konverze speciálních hodnot na celé číslo | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_cvtss2si_special.asm |
259 | sse_ldmxcsr.asm | načtení nové hodnoty do stavového a řídicího registru MXCSR z paměti | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_ldmxcsr.asm |
260 | sse_stmxcsr.asm | uložení hodnoty stavového a řídicího registru MXCSR do paměti | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse_stmxcsr.asm |
261 | sse2_support.asm | detekce podpory instrukcí SSE2 | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_support.asm |
262 | sse2_paddb.asm | součet dvojice vektorů 16×8 bitů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_paddb.asm |
263 | sse2_paddw.asm | součet dvojice vektorů 8×16 bitů | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_paddw.asm |
264 | sse2_paddsb.asm | součet bezznaménkových bajtů se saturací | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_paddsb.asm |
265 | sse2_paddusb.asm | součet bajtů se znaménkem se saturací | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_paddusb.asm |
266 | sse2_sqrtpd.asm | výpočet druhé odmocniny vektorů s prvky typu double | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_sqrtpd.asm |
267 | sse2_sqrtpd_negative.asm | výpočet druhé odmocniny záporných hodnot | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_sqrtpd_negative.asm |
268 | sse2_sqrtpd_special.asm | výpočet druhé odmocniny nekonečen a NaN | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_sqrtpd_special.asm |
269 | sse2_shift_right_words.asm | bitový posun 128bitového vektoru, omezení prvků na 16bitová slova | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_shift_right_words.asm |
270 | sse2_shift_right_dwords.asm | bitový posun 128bitového vektoru, omezení prvků na 32bitová slova | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_shift_right_dwords.asm |
271 | sse2_shift_right_qwords.asm | bitový posun 128bitového vektoru, omezení prvků na 64bitová slova | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_shift_right_qwords.asm |
272 | sse2_shift_right_dqwords.asm | posun 128bitového vektoru po celých bajtech | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_shift_right_dqwords.asm |
273 | sse2_and.asm | tři varianty instrukce bitového součinu | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_and.asm |
274 | sse2_and_not.asm | dvě varianty instrukce bitového součinu s negací | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_and_not.asm |
275 | sse2_cvtps2dq.asm | konverzní instrukce CVTPS2DQ | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_cvtps2dq.asm |
276 | sse2_cvtps2dq_neg.asm | konverze záporných hodnot na celá čísla | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_cvtps2dq_neg.asm |
277 | sse2_cvtps2dq_special.asm | konverze speciálních hodnot na celá čísla | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_cvtps2dq_special.asm |
278 | sse2_cvtps2pd.asm | konverze vektoru s prvky typu single na prvky typu double | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_cvtps2pd.asm |
279 | sse2_cvtpd2ps.asm | konverze vektoru s prvky typu double na prvky typu single | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_cvtpd2ps.asm |
280 | sse2_cvtpd2ps_special.asm | konverze vektoru s prvky typu double na prvky typu single (speciální hodnoty) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_cvtpd2ps_special.asm |
281 | sse2_add_delta.asm | přičtení konstanty ke všem prvků pole (vektoru) | https://github.com/tisnik/8bit-fame/blob/master/pc-linux/sse2_add_delta.asm |
20. Odkazy na Internetu
- The Intel 8088 Architecture and Instruction Set
https://people.ece.ubc.ca/~edc/464/lectures/lec4.pdf - x86 Opcode Structure and Instruction Overview
https://pnx.tf/files/x86_opcode_structure_and_instruction_overview.pdf - x86 instruction listings (Wikipedia)
https://en.wikipedia.org/wiki/X86_instruction_listings - x86 assembly language (Wikipedia)
https://en.wikipedia.org/wiki/X86_assembly_language - Intel Assembler (Cheat sheet)
http://www.jegerlehner.ch/intel/IntelCodeTable.pdf - 25 Microchips That Shook the World
https://spectrum.ieee.org/tech-history/silicon-revolution/25-microchips-that-shook-the-world - Chip Hall of Fame: MOS Technology 6502 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-mos-technology-6502-microprocessor - Chip Hall of Fame: Intel 8088 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-intel-8088-microprocessor - Jak se zrodil procesor?
https://www.root.cz/clanky/jak-se-zrodil-procesor/ - Apple II History Home
http://apple2history.org/ - The 8086/8088 Primer
https://www.stevemorse.org/8086/index.html - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - Bit banging
https://en.wikipedia.org/wiki/Bit_banging - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Bootloaders
https://en.wikibooks.org/wiki/X86_Assembly/Bootloaders - Počátky grafiky na PC: grafické karty CGA a Hercules
https://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/ - Co mají společného Commodore PET/4000, BBC Micro, Amstrad CPC i grafické karty MDA, CGA a Hercules?
https://www.root.cz/clanky/co-maji-spolecneho-commodore-pet-4000-bbc-micro-amstrad-cpc-i-graficke-karty-mda-cga-a-hercules/ - Karta EGA: první použitelná barevná grafika na PC
https://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/ - RGB Classic Games
https://www.classicdosgames.com/ - Turbo Assembler (Wikipedia)
https://en.wikipedia.org/wiki/Turbo_Assembler - Microsoft Macro Assembler
https://en.wikipedia.org/wiki/Microsoft_Macro_Assembler - IBM Personal Computer (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Personal_Computer - Intel 8251
https://en.wikipedia.org/wiki/Intel_8251 - Intel 8253
https://en.wikipedia.org/wiki/Intel_8253 - Intel 8255
https://en.wikipedia.org/wiki/Intel_8255 - Intel 8257
https://en.wikipedia.org/wiki/Intel_8257 - Intel 8259
https://en.wikipedia.org/wiki/Intel_8259 - Support/peripheral/other chips – 6800 family
http://www.cpu-world.com/Support/6800.html - Motorola 6845
http://en.wikipedia.org/wiki/Motorola_6845 - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - CRTC operation
http://www.6502.org/users/andre/hwinfo/crtc/crtc.html - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - Motorola 6845 and bitwise graphics
https://retrocomputing.stackexchange.com/questions/10996/motorola-6845-and-bitwise-graphics - IBM Monochrome Display Adapter
http://en.wikipedia.org/wiki/Monochrome_Display_Adapter - Color Graphics Adapter
http://en.wikipedia.org/wiki/Color_Graphics_Adapter - Color Graphics Adapter and the Brown color in IBM 5153 Color Display
https://www.aceinnova.com/en/electronics/cga-and-the-brown-color-in-ibm-5153-color-display/ - The Modern Retrocomputer: An Arduino Driven 6845 CRT Controller
https://hackaday.com/2017/05/14/the-modern-retrocomputer-an-arduino-driven-6845-crt-controller/ - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Arithmetic
https://en.wikibooks.org/wiki/X86_Assembly/Arithmetic - Art of Assembly – Arithmetic Instructions
http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter6/CH06–2.html - ASM Flags
http://www.cavestory.org/guides/csasm/guide/asm_flags.html - Status Register
https://en.wikipedia.org/wiki/Status_register - Linux assemblers: A comparison of GAS and NASM
http://www.ibm.com/developerworks/library/l-gas-nasm/index.html - Programovani v assembleru na OS Linux
http://www.cs.vsb.cz/grygarek/asm/asmlinux.html - Is it worthwhile to learn x86 assembly language today?
https://www.quora.com/Is-it-worthwhile-to-learn-x86-assembly-language-today?share=1 - Why Learn Assembly Language?
http://www.codeproject.com/Articles/89460/Why-Learn-Assembly-Language - Is Assembly still relevant?
http://programmers.stackexchange.com/questions/95836/is-assembly-still-relevant - Why Learning Assembly Language Is Still a Good Idea
http://www.onlamp.com/pub/a/onlamp/2004/05/06/writegreatcode.html - Assembly language today
http://beust.com/weblog/2004/06/23/assembly-language-today/ - Assembler: Význam assembleru dnes
http://www.builder.cz/rubriky/assembler/vyznam-assembleru-dnes-155960cz - Programming from the Ground Up Book – Summary
http://savannah.nongnu.org/projects/pgubook/ - DOSBox
https://www.dosbox.com/ - The C Programming Language
https://en.wikipedia.org/wiki/The_C_Programming_Language - Hercules Graphics Card (HCG)
https://en.wikipedia.org/wiki/Hercules_Graphics_Card - Complete 8086 instruction set
https://content.ctcd.edu/courses/cosc2325/m22/docs/emu8086ins.pdf - Complete 8086 instruction set
https://yassinebridi.github.io/asm-docs/8086_instruction_set.html - 8088 MPH by Hornet + CRTC + DESiRE (final version)
https://www.youtube.com/watch?v=hNRO7lno_DM - Area 5150 by CRTC & Hornet (Party Version) / IBM PC+CGA Demo, Hardware Capture
https://www.youtube.com/watch?v=fWDxdoRTZPc - 80×86 Integer Instruction Set Timings (8088 – Pentium)
http://aturing.umcs.maine.edu/~meadow/courses/cos335/80×86-Integer-Instruction-Set-Clocks.pdf - Colour Graphics Adapter: Notes
https://www.seasip.info/VintagePC/cga.html - Restoring A Vintage CGA Card With Homebrew HASL
https://hackaday.com/2024/06/12/restoring-a-vintage-cga-card-with-homebrew-hasl/ - Demoing An 8088
https://hackaday.com/2015/04/10/demoing-an-8088/ - Video Memory Layouts
http://www.techhelpmanual.com/89-video_memory_layouts.html - Screen Attributes
http://www.techhelpmanual.com/87-screen_attributes.html - IBM PC Family – BIOS Video Modes
https://www.minuszerodegrees.net/video/bios_video_modes.htm - EGA Functions
https://cosmodoc.org/topics/ega-functions/#the-hierarchy-of-the-ega - Why the EGA can only use 16 of its 64 colours in 200-line modes
https://www.reenigne.org/blog/why-the-ega-can-only-use-16-of-its-64-colours-in-200-line-modes/ - How 16 colors saved PC gaming – the story of EGA graphics
https://www.custompc.com/retro-tech/ega-graphics - List of 16-bit computer color palettes
https://en.wikipedia.org/wiki/List_of16-bit_computer_color_palettes - Why were those colors chosen to be the default palette for 256-color VGA?
https://retrocomputing.stackexchange.com/questions/27994/why-were-those-colors-chosen-to-be-the-default-palette-for-256-color-vga - VGA Color Palettes
https://www.fountainware.com/EXPL/vga_color_palettes.htm - Hardware Level VGA and SVGA Video Programming Information Page
http://www.osdever.net/FreeVGA/vga/vga.htm - Hardware Level VGA and SVGA Video Programming Information Page – sequencer
http://www.osdever.net/FreeVGA/vga/seqreg.htm - VGA Basics
http://www.brackeen.com/vga/basics.html - Introduction to VGA Mode ‚X‘
https://web.archive.org/web/20160414072210/http://fly.srk.fer.hr/GDM/articles/vgamodex/vgamx1.html - VGA Mode-X
https://web.archive.org/web/20070123192523/http://www.gamedev.net/reference/articles/article356.asp - Mode-X: 256-Color VGA Magic
https://downloads.gamedev.net/pdf/gpbb/gpbb47.pdf - Instruction Format in 8086 Microprocessor
https://www.includehelp.com/embedded-system/instruction-format-in-8086-microprocessor.aspx - How to use „AND,“ „OR,“ and „XOR“ modes for VGA Drawing
https://retrocomputing.stackexchange.com/questions/21936/how-to-use-and-or-and-xor-modes-for-vga-drawing - VGA Hardware
https://wiki.osdev.org/VGA_Hardware - Programmer's Guide to Yamaha YMF 262/OPL3 FM Music Synthesizer
https://moddingwiki.shikadi.net/wiki/OPL_chip - Does anybody understand how OPL2 percussion mode works?
https://forum.vcfed.org/index.php?threads/does-anybody-understand-how-opl2-percussion-mode-works.60925/ - Yamaha YMF262 OPL3 music – MoonDriver for OPL3 DEMO [Oscilloscope View]
https://www.youtube.com/watch?v=a7I-QmrkAak - Yamaha OPL vs OPL2 vs OPL3 comparison
https://www.youtube.com/watch?v=5knetge5Gs0 - OPL3 Music Crockett's Theme
https://www.youtube.com/watch?v=HXS008pkgSQ - Bad Apple (Adlib Tracker – OPL3)
https://www.youtube.com/watch?v=2lEPH6Y3Luo - FM Synthesis Chips, Codecs and DACs
https://www.dosdays.co.uk/topics/fm_synthesizers.php - The Zen Challenge – YMF262 OPL3 Original (For an upcoming game)
https://www.youtube.com/watch?v=6JlFIFz1CFY - [adlib tracker II techno music – opl3] orbit around alpha andromedae I
https://www.youtube.com/watch?v=YqxJCu_WFuA - [adlib tracker 2 music – opl3 techno] hybridisation process on procyon-ii
https://www.youtube.com/watch?v=daSV5mN0sJ4 - Hyper Duel – Black Rain (YMF262 OPL3 Cover)
https://www.youtube.com/watch?v=pu_mzRRq8Ho - IBM 5155–5160 Technical Reference
https://www.minuszerodegrees.net/manuals/IBM/IBM_5155_5160_Technical_Reference_6280089_MAR86.pdf - a ymf262/opl3+pc speaker thing i made
https://www.youtube.com/watch?v=E-Mx0lEmnZ0 - [OPL3] Like a Thunder
https://www.youtube.com/watch?v=MHf06AGr8SU - (PC SPEAKER) bad apple
https://www.youtube.com/watch?v=LezmKIIHyUg - Powering devices from PC parallel port
http://www.epanorama.net/circuits/lptpower.html - Magic Mushroom (demo pro PC s DOSem)
http://www.crossfire-designs.de/download/articles/soundcards//mushroom.rar - Píseň Magic Mushroom – originál
http://www.crossfire-designs.de/download/articles/soundcards/speaker_mushroom_converted.mp3 - Píseň Magic Mushroom – hráno na PC Speakeru
http://www.crossfire-designs.de/download/articles/soundcards/speaker_mushroom_speaker.mp3 - Pulse Width Modulation (PWM) Simulation Example
http://decibel.ni.com/content/docs/DOC-4599 - Resistor/Pulse Width Modulation DAC
http://www.k9spud.com/traxmod/pwmdac.php - Class D Amplifier
http://en.wikipedia.org/wiki/Electronic_amplifier#Class_D - Covox Speech Thing / Disney Sound Source (1986)
http://www.crossfire-designs.de/index.php?lang=en&what=articles&name=showarticle.htm&article=soundcards/&page=5 - Covox Digital-Analog Converter (Rusky, obsahuje schémata)
http://phantom.sannata.ru/konkurs/netskater002.shtml - PC-GPE on the Web
http://bespin.org/~qz/pc-gpe/ - Keyboard Synthesizer
http://www.solarnavigator.net/music/instruments/keyboards.htm - FMS – Fully Modular Synthesizer
http://fmsynth.sourceforge.net/ - Javasynth
http://javasynth.sourceforge.net/ - Software Sound Synthesis & Music Composition Packages
http://www.linux-sound.org/swss.html - Mx44.1 Download Page (software synthesizer for linux)
http://hem.passagen.se/ja_linux/ - Software synthesizer
http://en.wikipedia.org/wiki/Software_synthesizer - Frequency modulation synthesis
http://en.wikipedia.org/wiki/Frequency_modulation_synthesis - Yamaha DX7
http://en.wikipedia.org/wiki/Yamaha_DX7 - Wave of the Future
http://www.wired.com/wired/archive/2.03/waveguides_pr.html - Analog synthesizer
http://en.wikipedia.org/wiki/Analog_synthesizer - Minimoog
http://en.wikipedia.org/wiki/Minimoog - Moog synthesizer
http://en.wikipedia.org/wiki/Moog_synthesizer - Tutorial for Frequency Modulation Synthesis
http://www.sfu.ca/~truax/fmtut.html - An Introduction To FM
http://ccrma.stanford.edu/software/snd/snd/fm.html - John Chowning
http://en.wikipedia.org/wiki/John_Chowning - I'm Impressed, Adlib Music is AMAZING!
https://www.youtube.com/watch?v=PJNjQYp1ras - Milinda- Diode Milliampere ( OPL3 )
https://www.youtube.com/watch?v=oNhazT5HG0E - Dune 2 – Roland MT-32 Soundtrack
https://www.youtube.com/watch?v=kQADZeB-z8M - Interrupts
https://wiki.osdev.org/Interrupts#Types_of_Interrupts - Assembly8086SoundBlasterDmaSingleCycleMode
https://github.com/leonardo-ono/Assembly8086SoundBlasterDmaSingleCycleMode/blob/master/sbsc.asm - Interrupts in 8086 microprocessor
https://www.geeksforgeeks.org/interrupts-in-8086-microprocessor/ - Interrupt Structure of 8086
https://www.eeeguide.com/interrupt-structure-of-8086/ - A20 line
https://en.wikipedia.org/wiki/A20_line - Extended memory
https://en.wikipedia.org/wiki/Extended_memory#eXtended_Memory_Specification_(XMS) - Expanded memory
https://en.wikipedia.org/wiki/Expanded_memory - Protected mode
https://en.wikipedia.org/wiki/Protected_mode - Virtual 8086 mode
https://en.wikipedia.org/wiki/Virtual_8086_mode - Unreal mode
https://en.wikipedia.org/wiki/Unreal_mode - DOS memory management
https://en.wikipedia.org/wiki/DOS_memory_management - Upper memory area
https://en.wikipedia.org/wiki/Upper_memory_area - Removing the Mystery from SEGMENT : OFFSET Addressing
https://thestarman.pcministry.com/asm/debug/Segments.html - Segment descriptor
https://en.wikipedia.org/wiki/Segment_descriptor - When using a 32-bit register to address memory in the real mode, contents of the register must never exceed 0000FFFFH. Why?
https://stackoverflow.com/questions/45094696/when-using-a-32-bit-register-to-address-memory-in-the-real-mode-contents-of-the - A Brief History of Unreal Mode
https://www.os2museum.com/wp/a-brief-history-of-unreal-mode/ - Segment Limits
https://wiki.osdev.org/Segment_Limits - How do 32 bit addresses in real mode work?
https://forum.osdev.org/viewtopic.php?t=30642 - The LOADALL Instruction by Robert Collins
https://www.rcollins.org/articles/loadall/tspec_a3_doc.html - How do you put a 286 in Protected Mode?
https://retrocomputing.stackexchange.com/questions/7683/how-do-you-put-a-286-in-protected-mode - Control register
https://en.wikipedia.org/wiki/Control_register - CPU Registers x86
https://wiki.osdev.org/CPU_Registers_x86 - x86 Assembly/Protected Mode
https://en.wikibooks.org/wiki/X86_Assembly/Protected_Mode - MSW: Machine Status Word
https://web.itu.edu.tr/kesgin/mul06/intel/intel_msw.html - 80×87 Floating Point Opcodes
http://www.techhelpmanual.com/876–80×87_floating_point_opcodes.html - Page Translation
https://pdos.csail.mit.edu/6.828/2005/readings/i386/s05_02.htm - 80386 Paging and Segmenation
https://stackoverflow.com/questions/38229741/80386-paging-and-segmenation - 80386 Memory Management
https://tldp.org/LDP/khg/HyperNews/get/memory/80386mm.html - DOSEMU
http://www.dosemu.org/ - Intel 80386, a revolutionary CPU
https://www.xtof.info/intel80386.html - PAI Unit 3 Paging in 80386 Microporcessor
https://www.slideshare.net/KanchanPatil34/pai-unit-3-paging-in-80386-microporcessor - 64 Terabytes of virtual memory for 32-bit x86 using segmentation: how?
https://stackoverflow.com/questions/5444984/64-terabytes-of-virtual-memory-for-32-bit-x86-using-segmentation-how - Pi in the Pentium: reverse-engineering the constants in its floating-point unit
http://www.righto.com/2025/01/pentium-floating-point-ROM.html - Simply FPU
http://www.website.masmforum.com/tutorials/fptute/ - Art of Assembly language programming: The 80×87 Floating Point Coprocessors
https://courses.engr.illinois.edu/ece390/books/artofasm/CH14/CH14–3.html - Art of Assembly language programming: The FPU Instruction Set
https://courses.engr.illinois.edu/ece390/books/artofasm/CH14/CH14–4.html - INTEL 80387 PROGRAMMER'S REFERENCE MANUAL
http://www.ragestorm.net/downloads/387intel.txt - x86 Instruction Set Reference: FLD
http://x86.renejeschke.de/html/file_module_x86_id100.html - x86 Instruction Set Reference: FLD1/FLDL2T/FLDL2E/FLDPI/FLDLG2/FLDLN2/FLDZ
http://x86.renejeschke.de/html/file_module_x86_id101.html - X86 Assembly/Arithmetic
https://en.wikibooks.org/wiki/X86_Assembly/Arithmetic - 8087 Numeric Data Processor
https://www.eeeguide.com/8087-numeric-data-processor/ - Data Types and Instruction Set of 8087 co-processor
https://www.eeeguide.com/data-types-and-instruction-set-of-8087-co-processor/ - 8087 instruction set and examples
https://studylib.net/doc/5625221/8087-instruction-set-and-examples - GCC documentation: Extensions to the C Language Family
https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html#C-Extensions - GCC documentation: Using Vector Instructions through Built-in Functions
https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html - SSE (Streaming SIMD Extentions)
http://www.songho.ca/misc/sse/sse.html - Timothy A. Chagnon: SSE and SSE2
http://www.cs.drexel.edu/~tc365/mpi-wht/sse.pdf - Intel corporation: Extending the Worldr's Most Popular Processor Architecture
http://download.intel.com/technology/architecture/new-instructions-paper.pdf - SIMD architectures:
http://arstechnica.com/old/content/2000/03/simd.ars/ - Tour of the Black Holes of Computing!: Floating Point
http://www.cs.hmc.edu/~geoff/classes/hmc.cs105…/slides/class02_floats.ppt - 3Dnow! Technology Manual
AMD Inc., 2000 - Intel MMXTM Technology Overview
Intel corporation, 1996 - MultiMedia eXtensions
http://softpixel.com/~cwright/programming/simd/mmx.phpi - AMD K5 („K5“ / „5k86“)
http://www.pcguide.com/ref/cpu/fam/g5K5-c.html - Sixth Generation Processors
http://www.pcguide.com/ref/cpu/fam/g6.htm - Great Microprocessors of the Past and Present
http://www.cpushack.com/CPU/cpu1.html - Very long instruction word (Wikipedia)
http://en.wikipedia.org/wiki/Very_long_instruction_word - CPU design (Wikipedia)
http://en.wikipedia.org/wiki/CPU_design - Bulldozer (microarchitecture)
https://en.wikipedia.org/wiki/Bulldozer_(microarchitecture) - MMX (instruction set)
https://en.wikipedia.org/wiki/MMX_(instruction_set) - Extended MMX
https://en.wikipedia.org/wiki/Extended_MMX - Saturation arithmetic
https://en.wikipedia.org/wiki/Saturation_arithmetic - CMPPS — Compare Packed Single Precision Floating-Point Values
https://www.felixcloutier.com/x86/cmpps - ADDPS — Add Packed Single Precision Floating-Point Values
https://www.felixcloutier.com/x86/addps - SUBPS — Subtract Packed Single Precision Floating-Point Values
https://www.felixcloutier.com/x86/subps - SQRTPS — Square Root of Single Precision Floating-Point Values
https://www.felixcloutier.com/x86/sqrtps - RSQRTPS — Compute Reciprocals of Square Roots of Packed Single Precision Floating-PointValues
https://www.felixcloutier.com/x86/rsqrtps - UNPCKHPS — Unpack and Interleave High Packed Single Precision Floating-Point Values
https://www.felixcloutier.com/x86/unpckhps - UNPCKLPS — Unpack and Interleave Low Packed Single Precision Floating-Point Values
https://www.felixcloutier.com/x86/unpcklps - SHUFPS — Packed Interleave Shuffle of Quadruplets of Single Precision Floating-Point Values
https://www.felixcloutier.com/x86/shufps - CVTSI2SS — Convert Doubleword Integer to Scalar Single Precision Floating-Point Value
https://www.felixcloutier.com/x86/cvtsi2ss - CVTSS2SI — Convert Scalar Single Precision Floating-Point Value to Doubleword Integer
https://www.felixcloutier.com/x86/cvtss2si - CVTTSS2SI — Convert With Truncation Scalar Single Precision Floating-Point Value to Integer
https://www.felixcloutier.com/x86/cvttss2si - CVTPI2PS — Convert Packed Dword Integers to Packed Single Precision Floating-Point Values
https://www.felixcloutier.com/x86/cvtpi2ps - CVTPS2PI — Convert Packed Single Precision Floating-Point Values to Packed Dword Integers
https://www.felixcloutier.com/x86/cvtps2pi - CVTTPS2PI — Convert With Truncation Packed Single Precision Floating-Point Values to PackedDword Integers
https://www.felixcloutier.com/x86/cvttps2pi - Streaming SIMD Extensions 2 (SSE2)
https://softpixel.com/~cwright/programming/simd/sse2.php - Redundant SSE instructions
https://www.pagetable.com/?p=19
Autor: Pavel Tišnovský 2024