Obsah
1. Časovač 8253 a systém přerušení na IBM PC
2. Krátké zopakování – programovatelný čítač/časovač 8253 a 8254
3. Zapojení čítače/časovače 8253/8254 v IBM PC
4. Řídicí a stavové registry čítače/časovače 8253
5. Maskovatelné a nemaskovatelné přerušení na mikroprocesorech Intel 8086
6. Řadič přerušení Intel 8259 a podpora pro více zdrojů generujících hardwarové přerušení
7. Softwarově vyvolané přerušení
8. Vektory přerušení na IBM PC
9. Realizace vlastní přerušovací rutiny s její „registrací“
10. Úplný zdrojový kód dnešního prvního demonstračního příkladu
11. Chování programu po jeho ukončení
12. Uložení původní přerušovací subrutiny
13. Obnova původní přerušovací subrutiny před ukončením procesu
14. Úplný zdrojový kód dnešního druhého demonstračního příkladu
15. Refaktoring jednotlivých operací do maker
16. Úplný zdrojový kód dnešního třetího demonstračního příkladu
17. Změna frekvence generování přerušení IRQ 8
18. Úplný zdrojový kód dnešního posledního demonstračního příkladu
19. Repositář s demonstračními příklady
1. Časovač 8253 a systém přerušení na IBM PC
Při programování činností, které je nutné vyvolávat s určitou předem známou frekvencí, se na IBM PC nemůžeme spolehnout na naivní zpožďovací smyčky, protože procesory mohou mít různé hodinové frekvence, délky jejich instrukcí se mohou lišit (zrychlení mezi 8086 a 80286 je v tomto ohledu značné), mohou se lišit rychlosti sběrnic a v neposlední řadě měly PC i tlačítko „turbo“ pro změnu rychlosti výpočtů (samotná realizace „turba“ bývala odlišná).
Namísto zpožďovacích smyček je tedy vhodnější využít nějaký mechanismus založený na čítači/časovači. To je na platformě PC možné díky existenci čipu 8253 (8254), v němž jsou podporovány tři čítače/časovače. Navíc dokáže jeden z těchto čítačů vyvolat přerušení, které je zpracováno čipem 8259 a dále samotným mikroprocesorem.
Pro implementaci takového systému tedy musíme znát:
- Základy činnosti 8253 (jak nastavit frekvenci časovače)
- Základy činnosti 8259 (jak vyvolá přerušení)
- Znalost takzvané tabulky vektorů přerušení z pohledu 8086
- Některé specifické instrukce, které s přerušením souvisí (CLI, STI, IRET)
2. Krátké zopakování – programovatelný čítač/časovač 8253 a 8254
Krátce si zopakujme základní informace o programovatelném čítači/časovači 8253, resp. 8254 (dále budeme používat pouze označení 8253, ostatně samotný čip 8254 se liší jen nejvyšší možnou frekvencí vstupního hodinového signálu, ale v jiných ohledech se oba čipy chovají stejně).
Na vstup tohoto obvodu je připojen hodinový signál s frekvencí 1193180 Hz, což je hodnota odvozená dělením z nominální frekvence IBM PC či IBM PC XT, která činila 4,77 MHz (a ta je odvozena od NTSC, v PC historicky vše souvisí se vším). Původní frekvence se dělí dvěma a poté ještě jednou dvěma. V dalších modelech PC je to sice složitější, protože samotná frekvence CPU byla odlišná, nicméně vstupní frekvence 1193180 bývá s větším či menším úsilím zachována.
Čítač a časovač realizovaný integrovaným obvodem 8253 obsahuje tři samostatně konfigurovatelné šestnáctibitové kanály, přičemž každý z těchto kanálů byl použit pro různé účely. Výše zmíněný signál o frekvenci 1193180 Hz je v každém kanálu 0–2 vydělen nastavenou šestnáctibitovou hodnotou (každý kanál má svoji vlastní hodnotu dělitele nezávislou na ostatních kanálech), což vlastně znamená, že minimální frekvence zpracovatelná čítačem/časovačem je rovna 18,2 Hz (1193180/65536) a maximální frekvence dosahuje právě 1193180 Hz.
První kanál časovače (s indexem 0) se typicky používá pro vyvolání nějaké subrutiny v pravidelných časových intervalech – a právě jím se dnes budeme zabývat nejvíce. Druhý kanál časovače sloužil pro generování signálů určených pro obnovení obsahu dynamických pamětí (a proto se nepoužíval k jiným účelům – mohlo by totiž dojít k zamrznutí systému). A konečně třetí kanál časovače 8253 (kanály se indexují od nuly, takže má index 2) většinou pracuje v režimu generátoru obdélníkových pulsů se střídou 1:1, ovšem k dispozici je i mnoho dalších režimů činnosti čítače/časovače. Lze ho použít pro čítání a časování a taktéž pro generování signálu pro PC Speaker, což je téma, kterým jsme se již v tomto seriálu zabývali.
3. Zapojení čítače/časovače 8253/8254 v IBM PC
Připomeňme si, že původní IBM PC bylo osazeno několika standardními (a i ve své době poměrně levnými) osmibitovými čipy. Konkrétně se jednalo o integrovaný obvod Intel 8251 (UART), dále o čip Intel 8253 (programovatelný časovač), Intel 8237/8257 (programovatelný řadič DMA), Intel 8255 (paralelní rozhraní) a konečně Intel 8259 (programovatelný řadič přerušení). Ze schématu zobrazeného na obrázku číslo 1 je patrné, že obvody PC Speakeru byly připojeny k obvodu 8255 a taktéž k 8253, tedy k paralelní bráně a k časovači. Jak konkrétně toto zapojení vypadalo, zjistíme ze servisního manuálu, v němž kromě dalších informací nalezneme i zmíněné schéma:
Obrázek 1: Zapojení čítače/časovače v IBM PC.
Nejzajímavější jsou signály vycházející z pravé strany čipu 8253. Signál z prvního kanálu je zapojen do čipu 8259A, kde slouží pro vyvolání přerušení (viz další text). Signál ze druhého kanálu skutečně slouží k obnově obsahu dynamických pamětí a signál ze třetího kanálu může být (ale nemusí!) přiveden na PC Speaker. Pokud budeme potřebovat tento kanál využít pro nějaké jiné účely (například pro načasování déletrvající akce), lze přes port 0×61 výstup do PC Speakeru zakázat – potom je možné s tímto kanálem laborovat, číst jeho hodnotu atd. aniž by došlo k vyluzování „pazvuků“ na PC Speakeru.
S využitím čítače/časovače 8253 je tak například možné na PC Speaker posílat v tom nejjednodušším případě pravidelný obdélníkový signál, což ovšem postačuje pouze pro přehrávání velmi jednoduchých jednohlasých melodií. Nicméně přesně tento typ generování zvuku používá BIOS při POSTu () a DOS/Linux při „zobrazení“ znaku Bell (7, což již víme). Používal se i v GW Basicu a QBasicu v příkazu PLAY.
4. Řídicí a stavové registry čítače/časovače 8253
Řídicí a stavové registry obvodu 8253 jsou z pohledu mikroprocesoru namapovány na I/O porty 0×40 až 0×41 a mají následující význam:
I/O port | Stručný popis |
---|---|
0×40 | kanál 0: systémový časovač, nastaven na 18,2 přerušení za sekundu (dělí se tedy 65536, což se zapisuje jako 0) |
0×41 | kanál 1: řízení obnovení (refresh) pamětí RAM na IBM PC |
0×42 | kanál 2: výstup na PC Speaker |
0×43 | řídicí registr |
Osm bitů řídicího registru slouží pro volbu režimu konkrétního kanálu (a nás bude v dnešním článku zajímat pouze kanál číslo 0):
Bity | Stručný popis |
---|---|
7–6 | výběr kanálu 0, 1 nebo 2 (3 není povoleno, takový kanál neexistuje) |
5–4 | volba čtení/zápisu vyššího či nižšího bajtu dělitele (kombinace bitů 11 znamená zápis obou bajtů) |
3–1 | volba režimu kanálu (viz třetí tabulku) |
0 | 16bitový binární čítač nebo BCD čítač (9999) |
Bity 3–1 volí režim zvoleného kanálu 0–2. Lze volit jeden z šesti režimů činnosti:
M2 | M1 | M0 | Stručný popis režimu |
---|---|---|---|
0 | 0 | 0 | čítač |
0 | 0 | 1 | monostabilní obvod |
x | 1 | 0 | dělič 1:N |
x | 1 | 1 | generátor obdélníkových pulsů |
1 | 0 | 0 | zpoždění |
1 | 0 | 1 | signálem spouštěné zpoždění |
Pro nás bude nejzajímavější režim číslo 3, protože v tomto režimu je na výstupu zvoleného kanálu (pro nás kanál 2) signál po N/2 času ve stavu 0 a po zbytek času (N+1)/2 ve stavu 1. Jedná se tedy o dělič frekvence, konkrétně vstupní frekvence 1193180 zvolenou šestnáctibitovou hodnotou, přičemž hodnota 0 odpovídá 65536. Signálem GATE=1 se čítání povolí (a GATE ovládáme přes 8255). Čítač tedy vlastně dokáže vyvolat přerušení s frekvencí 1193180/N Hz.
5. Maskovatelné a nemaskovatelné přerušení na mikroprocesorech Intel 8086
V pořadí již dvacáté páté části seriálu o IBM PC asi již není nutné opakovat, že tyto počítače byly založeny na mikroprocesorech řady Intel 8086. Tyto mikroprocesory měly dva vstupní piny, které sloužily pro vyvolání přerušení: NMI (nemaskovatelné přerušení) a INTR (maskovatelné přerušení). Mikroprocesor potvrzoval přijetí informace o přerušení signálem INTA. To však není vše, protože se přes adresové piny D0 až D7 do mikroprocesoru přenesla ještě informace o čísle přerušení v rozsahu 0..255. Externí čip tedy mikroprocesor nejprve pozastavil signálem NMI nebo INTA a následně mu po datové sběrnici poslal číslo přerušení. Zapojení vypadalo přibližně takto (ponechal jsem i čítač/časovač, naopak odstranil pomocné logické obvody):
Obrázek 2: Zjednodušené zapojení přerušovacího subsystému IBM PC.
6. Řadič přerušení Intel 8259 a podpora pro více zdrojů generujících hardwarové přerušení
Podobně jako mnoho dalších typů mikroprocesorů měl i čip 8086 pouze dva vstupy pro realizaci přerušení – viz výše zmíněné piny INTR a NMI. Ovšem v praxi je nutné reagovat na různé zdroje přerušení, například od časovačů, sériových portů, paralelních portů, řadičů disků a disket, síťových karet atd. Z tohoto důvodu byl do IBM PC přidán čip Intel 8259, neboli řadič přerušení. Tento čip dokázal zpracovat osm přerušovacích signálů označovaných IR0 až IR7, vyvolat přerušení mikroprocesoru a „vnutit“ mu číslo přerušení přes datovou sběrnici, resp. přesněji řečeno přes její osmibitovou část D0 až D7. Přerušení mají svoji prioritu danou jejich pořadím.
Taktéž bylo možné zřetězit více čipů 8259 v případě, že bylo nutné obsluhovat více než osm hardwarových přerušení. To bylo realizováno až na PC AT, které tak dokázalo obsloužit až patnáct zdrojů přerušení (šestnácté bylo zabráno samotným zřetězením). A i takto velký počet externích zdrojů přerušení nebyl dostatečný, což se až mnohem později vylepšilo čipy z rodiny Advanced Programmable Interrupt Controller (APIC).
7. Softwarově vyvolané přerušení
Z hlediska čipu 8289 probíhá obsluha přerušení takovým způsobem, jak to bylo popsáno v předchozím textu – čip pošle signál INT (na pin INTR) a na datové sběrnici přes signály D0-D8 nastaví číslo přerušení. Procesor přerušení potvrdí signálem INTA.
Z pohledu mikroprocesoru vypadá obsluha takto: procesor získá číslo přerušení v rozsahu 0..255 (ve skutečnosti však jen 8..15 pro IRQ, ovšem teoreticky skutečně 0..255). Tuto hodnotu vynásobí čtyřmi a získá tak adresu segmentu a offsetu příslušné přerušovací rutiny. Samotná tabulka obsahující 256 hodnot segment+offset má délku 1024 bajtů (segment má 2 bajty, offset další 2 bajty – ovšem stále dokážeme adresovat jen jeden megabajt paměti) a je umístěna od fyzické adresy 0, tedy na logické adrese 0000:0000. Procesor adresu přerušovací subrutiny (segment+offset) přečte, uloží na zásobník příznakový registr, dále uloží na zásobník aktuální hodnotu CS a aktuální hodnotu IP a poté provede skok na adresu obsluhy přerušení (změní se jak CS tak i IP – je to „dlouhý“ skok mimo aktuální segment). Navíc vynuluje příznaky Interrupt a Flag.
Obsluha přerušení (což může být náš program) provede to, co je nutné; například vytiskne znak na obrazovku, přečte bajt ze sériového portu, pošle jeden sampl na zvukovou kartu atd. Ovšem navíc je nutné obsluhu přerušení řádně ukončit, vrátit se do hlavního programu a obnovit příznakový registr. To se provádí instrukcí IRET, která se od RET liší tím, že obnoví i příznakový registr. Pokud obsluha přerušení mění i další registry, měla by se sama postarat o jejich obnovu.
Navíc – pokud se jedná o hardwarové přerušení IRQ0 až IRQ7 – je nutné oznámit řadiči přerušení, že se přerušovací subrutina ukončuje. To se provede touto sekvencí instrukcí, kde první konstanta 0×20 je bitová maska a druhá konstanta 0×20 je číslo I/O portu:
mov al, 0x20 out 0x20, al ; oznameni, ze preruseni je u konce radici preruseni
Celkově tedy obslužná rutina přerušení může vypadat takto:
interrupt_x_handler: ... ... ; vlastní kód subrutiny ... mov al, 0x20 out 0x20, al ; oznameni, ze preruseni je u konce radici preruseni sti ; povoleni maskovatelnych preruseni iret ; navrat z preruseni
Pokud budeme vyžadovat obnovu všech registrů, můžeme na 80286 použít instrukce PUSHA a POPA; na 8086 pak sekvenci instrukcí PUSH a POP:
interrupt_x_handler: pusha ; ulozit vsechny registry ... ... ; vlastní kód subrutiny ... mov al, 0x20 out 0x20, al ; oznameni, ze preruseni je u konce radici preruseni popa ; obnovit vsechny registry sti ; povoleni maskovatelnych preruseni iret ; navrat z preruseni
8. Vektory přerušení na IBM PC
Díky tomu, že číslo přerušení je po jeho vzniku „vnuceno“ mikroprocesoru přes datovou sběrnici, bylo možné čísla přerušení definovat a určitým způsobem standardizovat. O to se pokusila společnost Intel, která specifikovala následující tabulku, kterou by měli dodržovat výrobci počítačů. Pro snadnější vyhledávání ponechávám původní popisky:
Číslo přerušení | Popis | Platné pro čipy |
---|---|---|
0 | Divide by zero | |
1 | Single step | |
2 | Non-maskable (NMI) | |
3 | Breakpoint | |
4 | Overflow trap | |
5 | BOUND range exceeded | 186, 286, 386 |
6 | Invalid opcode | 186, 286, 386 |
7 | Coprocessor not available | 286, 386 |
8 | Double fault exception | 286, 386 |
9 | Coprocessor segment overrun | 286, 386 |
A | Invalid task state segment | 286, 386 |
B | Segment not present | 286, 386 |
C | Stack exception | 286, 386 |
D | General protection exception | 286, 386 |
E | Page fault | 286, 386 |
F | Reserved | |
10 | Coprocessor error | 286, 386 |
Na platformě IBM PC se signál přerušení z čipu 8259 (a tedy z logického pohledu přerušení IRQ0 až IRQ7) mapuje do tabulky vektorů přerušení na offset 8 a obsazuje tedy v tabulce indexy 8 až F. To je sice v rozporu s výše zmíněným doporučením Intelu, že prvních 17 (později 32) vektorů má být rezervovaných pro samotný mikroprocesor, ale toto doporučení bylo při návrhu IBM PC ignorováno. Proto máme na PC tyto hardwarová přerušení, tedy přerušení, která jsou generována z pohledu mikroprocesoru externími vlivy:
IRQ (HW přerušení) | Číslo přerušení | Stručný popis |
---|---|---|
IRQ0 | 8 | čítač/časovač (ten využijeme dnes) |
IRQ1 | 9 | obsluha klávesnice |
IRQ2 | A | vertikální zatemnění na EGA/VGA (nelze se spolehnout) |
IRQ3 | B | sériový port COM2 nebo COM4 |
IRQ4 | C | sériový port COM1 nebo COM3 |
IRQ5 | D | řadič pevného disku nebo paralelní port LPT2 |
IRQ6 | E | řadič disketové mechaniky |
IRQ7 | F | paralelní port LPT1 |
Spojeno dohromady – pokud se zaměříme na IBM PC a XT, bude tabulka s přerušovacími vektory vypadat přibližně následovně:
Číslo přerušení | Stručný popis |
---|---|
0 | dělení nulou |
1 | ladění – provedení jednoho kroku |
2 | NMI |
3 | dosažení breakpointu |
4 | overflow |
5 | rutina pro Print Screen |
6 | nevalidní instrukce (ne na IBM PC) |
7 | koprocesor není dostupný (ne na IBM PC) |
8 | IRQ0 – čítač/časovač (ten využijeme dnes) |
9 | IRQ1 – obsluha klávesnice |
A | IRQ2 – vertikální zatemnění na EGA/VGA (nelze se spolehnout) |
B | IRQ3 – sériový port COM2 nebo COM4 |
C | IRQ4 – sériový port COM1 nebo COM3 |
D | IRQ5 – řadič pevného disku nebo paralelní port LPT2 |
E | IRQ6 – řadič disketové mechaniky |
F | IRQ7 – paralelní port LPT1 |
10 | BIOS – video podslužby (už jsme viděli) |
11–1F | BIOS – další více či méně užitečné podslužby |
20 | DOS – ukončení procesu |
21 | DOS – většina služeb systému (známe jen některé) |
22–2F | DOS – další služby systému |
40-… | BIOS, NETBIOS atd., tady už je docela zmatek |
70–77 | IRQ8-IRQ15 na PC AT a vyšších |
F1-FF | rezervováno pro IBM (ale to s PC AT padlo, IBM přestala být v tomto ohledu relevantní) |
9. Realizace vlastní přerušovací rutiny s její „registrací“
Pokusme se nyní vytvořit si vlastní rutinu volanou při přerušení IRQ 0, které je způsobeno čítačem/časovačem. V této rutině nejdříve uložíme všechny pracovní registry na zásobník, přičemž si „pomůžeme“ instrukcí PUSHA podporovanou až mikroprocesorem 80186. Následně si necháme přes službu DOSu vytisknout na standardní výstup (typicky na konzoli) znak „t“ (od slova „tick“). Přerušení je potvrzeno zápisem konstanty 0×20 na port (taktéž) 0×20. V dalších krocích obnovíme pracovní registry instrukcí POPA, povolíme přerušení instrukcí STI a provedeme návrat z přerušovací subrutiny instrukcí IRET:
int8_handler: ; nova obsluha preruseni pusha ; ulozit vsechny registry print_char 't' ; t=tick mov al, 0x20 out 0x20, al ; oznameni, ze preruseni je u konce radici preruseni popa ; obnovit vsechny registry sti ; povoleni maskovatelnych preruseni iret ; navrat z preruseni
Vlastní registrace této přerušovací subrutiny, resp. přesněji řečeno přeregistrace původní subrutiny, se musí provést přímým zápisem do tabulky vektorů přerušení, která je uložena na adrese 0000:0000. Vektor pro hardwarové přerušení IRQ 0 odpovídá vektoru SW přerušení číslo 8 a tedy právě od adresy 32 (0×20) je uložena adresa subrutiny (segment+offset). Samotná hodnota 32 vznikla vynásobením 8×4 (tedy číslo přerušení × délka adresy realizovaná dvojicí segment+offset:
IRQ_0_VECTOR equ 0x0020 ; adresa vektoru preruseni pro IRQ 0
Registrace by mohla vypadat následovně:
xor ax, ax mov es, ax mov di, IRQ_0_VECTOR ; ES:DI obsahuje adresu, na ktere je adresa obsluhy preruseni 0x08 cli ; zakaz preruseni lea ax, int8_handler ; zmena offsetove casti adresy mov es:[di], ax mov ax, cs ; zmena segmentove casti adresy mov es:[di+2], ax sti ; povoleni preruseni
10. Úplný zdrojový kód dnešního prvního demonstračního příkladu
Úplný zdrojový kód dnešního prvního demonstračního příkladu, v němž je realizována registrace obsluhy přerušení časovače, která při každém „tiku“ vytiskne na výstup jeden znak, vypadá následovně:
; Zakladni pouziti casovace 8253 v IBM PC ; ; ; Tento demonstracni priklad je pouzity v serialu o programovani ; grafickych dem a her na PC v DOSu: ; https://www.root.cz/serialy/vyvoj-her-a-grafickych-dem-pro-platformu-pc/ ; ; ; preklad pomoci: ; nasm -f bin -o timer_basic.com timer_basic.asm ; ; nebo pouze: ; nasm -o timer_basic.com timer_basic.asm ;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 286 ; specifikace pouziteho instrukcniho souboru IRQ_0_VECTOR equ 0x0020 ; adresa vektoru preruseni pro IRQ 0 ;----------------------------------------------------------------------------- ; ukonceni procesu a navrat do DOSu %macro exit 0 ret %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 ; vyvolani sluzby BIOSu %endmacro ; tisk jedineho znaku pres DOS %macro print_char 1 mov ah, 0x02 ; cislo sluzby DOSu mov dl, %1 ; kod zapisovaneho znaku int 0x21 ; vyvolani sluzby DOSu %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: print_char '>' ; oznameni uzivateli, ze jsme pripraveni xor ax, ax mov es, ax mov di, IRQ_0_VECTOR ; ES:DI obsahuje adresu, na ktere je adresa obsluhy preruseni 0x08 cli ; zakaz preruseni lea ax, int8_handler ; zmena offsetove casti adresy mov es:[di], ax mov ax, cs ; zmena segmentove casti adresy mov es:[di+2], ax sti ; povoleni preruseni wait_key ; cekani na stisk klavesy print_char '.' ; oznameni uzivateli, ze ukoncujeme proces exit ; ukonceni procesu int8_handler: ; nova obsluha preruseni pusha ; ulozit vsechny registry print_char 't' ; t=tick mov al, 0x20 out 0x20, al ; oznameni, ze preruseni je u konce radici preruseni popa ; obnovit vsechny registry sti ; povoleni maskovatelnych preruseni iret ; navrat z preruseni
11. Chování programu po jeho ukončení
Ve chvíli, kdy výše uvedený program ukončíme, dojde skutečně k návratu řízení do operačního systému, tj. zobrazí se výzva (prompt) DOSu, zobrazí se okno Norton Commanderu, pokračuje se v činnosti BAT skriptu atd. Ovšem přerušovací rutina, kterou jsme napsali, je stále vyvolávána a stále se tedy na obrazovce zobrazují hvězdičky. A to až do té doby, kdy operační systém přepíše blok paměti s touto rutinou – potom s velkou pravděpodobností dojde k pádu celého systému nebo k jeho zamrznutí (další „tik“ časovače si totiž vynutí skok na přepsanou paměť obsahující vlastně náhodné instrukce).
Aby se program ukončil korektně a obnovil původní chování systému, musíme před jeho skutečným ukončením nastavit adresu původní přerušovací subrutiny pro obsluhu „tiku“ časovače.
12. Uložení původní přerušovací subrutiny
Samotný princip obnovy je ukázán v navazující kapitole. Nejprve ovšem musíme před nastavením nové přerušovací subrutiny získat adresu (segment+offset) původní subrutiny a tu si uložit na bezpečné místo v operační paměti. Toto místo si rezervujeme následovně:
original_handler: dw 0, 0
Následně přečteme z adresy 0000:0008 segment a offset původní přerušovací subrutiny a uložíme tyto informace do bloku paměti začínajícího návěštím original_handler:
xor ax, ax mov es, ax mov si, IRQ_0_VECTOR ; ES:SI obsahuje adresu, na ktere je adresa obsluhy preruseni 0x08 lea di, original_handler mov ax, es:[si] ; ulozeni puvodni adresy (segment + offset) do mov cs:[di], ax ; uloziste original_handler mov ax, es:[si+2] mov cs:[di+2], ax
13. Obnova původní přerušovací subrutiny před ukončením procesu
Obnova původní přerušovací subrutiny před ukončením procesu (přes DOS) se provádí opačným způsobem – adresu segment+offset uloženou na adrese original_handler přesuneme do tabulky obsluhy přerušení, která je, jak již víme, uložena od adresy 0000:0000. Musíme si však dát pozor na to, aby se mezi zápisem segmentu a offsetu subrutina nevyvolala, protože současný zápis segmentu+offsetu pochopitelně není atomický (a skok by byl proveden na špatnou adresu). V této části programu tedy zakážeme přerušení a po obnově adresy přerušovací subrutiny přerušení opět povolíme. K tomu slouží instrukce CLI a STI:
xor ax, ax mov es, ax cli ; zakaz preruseni lea si, original_handler mov di, IRQ_0_VECTOR mov ax, cs:[si] ; obnoveni puvodniho handleru mov es:[di], ax mov ax, cs:[si+2] mov es:[di+2], ax sti ; povoleni preruseni
14. Úplný zdrojový kód dnešního druhého demonstračního příkladu
Druhý demonstrační příklad, který dokáže při svém startu uchovat adresu původní přerušovací rutiny a po svém ukončení ji obnovit, vypadá následovně:
; Pouziti casovace, obnoveni puvodni rutiny po ukonceni programu ; ; ; Tento demonstracni priklad je pouzity v serialu o programovani ; grafickych dem a her na PC v DOSu: ; https://www.root.cz/serialy/vyvoj-her-a-grafickych-dem-pro-platformu-pc/ ; ; ; preklad pomoci: ; nasm -f bin -o timer_restore.com timer_restore.asm ; ; nebo pouze: ; nasm -o timer_restore.com timer_restore.asm ;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 286 ; specifikace pouziteho instrukcniho souboru IRQ_0_VECTOR equ 0x0020 ; adresa vektoru preruseni pro IRQ 0 ;----------------------------------------------------------------------------- ; ukonceni procesu a navrat do DOSu %macro exit 0 ret %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 ; vyvolani sluzby BIOSu %endmacro ; tisk jedineho znaku pres DOS %macro print_char 1 mov ah, 0x02 ; cislo sluzby DOSu mov dl, %1 ; kod zapisovaneho znaku int 0x21 ; vyvolani sluzby DOSu %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: print_char '>' ; oznameni uzivateli, ze jsme pripraveni xor ax, ax mov es, ax mov si, IRQ_0_VECTOR ; ES:SI obsahuje adresu, na ktere je adresa obsluhy preruseni 0x08 lea di, original_handler mov ax, es:[si] ; ulozeni puvodni adresy (segment + offset) do mov cs:[di], ax ; uloziste original_handler mov ax, es:[si+2] mov cs:[di+2], ax mov di, IRQ_0_VECTOR ; ES:DI obsahuje adresu, na ktere je adresa obsluhy preruseni 0x08 cli ; zakaz preruseni lea ax, int8_handler ; zmena offsetove casti adresy mov es:[di], ax mov ax, cs ; zmena segmentove casti adresy mov es:[di+2], ax sti ; povoleni preruseni wait_key ; cekani na stisk klavesy print_char '.' ; oznameni uzivateli, ze ukoncujeme proces xor ax, ax mov es, ax cli ; zakaz preruseni lea si, original_handler mov di, IRQ_0_VECTOR mov ax, cs:[si] ; obnoveni puvodniho handleru mov es:[di], ax mov ax, cs:[si+2] mov es:[di+2], ax sti ; povoleni preruseni exit ; ukonceni procesu int8_handler: ; nova obsluha preruseni pusha ; ulozit vsechny registry print_char 't' ; t=tick mov al, 0x20 out 0x20, al ; oznameni, ze preruseni je u konce radici preruseni popa ; obnovit vsechny registry sti ; povoleni maskovatelnych preruseni iret ; navrat z preruseni original_handler: dw 0, 0
15. Refaktoring jednotlivých operací do maker
Předchozí zdrojový kód byl sice funkční, ale kvůli své délce (i samotnému nízkoúrovňovému kódu) ztrácel svoji čitelnost. Pokusme se tedy o jeho úpravu s využitím maker (nebo můžete použít i podprogramy) tak, aby hlavní tělo programu bylo krátké a snadno čitelné i upravitelné.
Nejprve si připravíme makro, kterému se předá adresa v tabulce vektorů přerušení a druhá adresa, na které se původní vektor přerušení uloží. Tomuto makru se tedy předávají například parametry IRQ0_VECTOR a original_handler, přičemž se počítá s tím, že original_handler je dostupný v rámci aktuálního CS:
; ulozeni puvodniho vektoru preruseni %macro store_original_vector 2 xor ax, ax mov es, ax mov si, %1 ; ES:SI obsahuje adresu, na ktere je adresa obsluhy preruseni 0x08 lea di, %2 mov ax, es:[si] ; ulozeni puvodni adresy (segment + offset) do mov cs:[di], ax ; uloziste original_handler mov ax, es:[si+2] mov cs:[di+2], ax %endmacro
Druhé makro provádí opačnou operaci, tj. obnovení adresy původní přerušovací rutiny v tabulce s vektory přerušení. V průběhu změny této globální tabulky je zakázán příjem jiných přerušení:
; obnoveni puvodniho vektoru preruseni %macro restore_original_vector 2 xor ax, ax mov es, ax cli ; zakaz preruseni lea si, %2 ; uloziste mov di, %1 ; adresa vektoru mov ax, cs:[si] ; obnoveni puvodniho handleru mov es:[di], ax mov ax, cs:[si+2] mov es:[di+2], ax sti ; povoleni preruseni %endmacro
A konečně máme k dispozici makro, které změní vektor v globální tabulce s vektory přerušení na novou adresu (segment+offset). Opět se počítá s tím, že nový handler (obsluha) je uložena v aktuálním CS:
; nastaveni noveho vektoru preruseni %macro set_irq_handler 2 mov di, %1 ; ES:DI obsahuje adresu, na ktere je adresa obsluhy preruseni 0x08 cli ; zakaz preruseni lea ax, %2 ; zmena offsetove casti adresy mov es:[di], ax mov ax, cs ; zmena segmentove casti adresy mov es:[di+2], ax sti ; povoleni preruseni %endmacro
Po výše zmíněných úpravách se celý náš program stane bez problémů čitelný, protože vlastně obsahuje pouze volání (přesněji řečeno expanzi) několika maker a používají se symbolická jména parametrů maker. Hlavní tělo programu bude vypadat následovně, což již vypadá podobně jako program psaný ve vyšších programovacích jazycích:
start: print_char '>' ; oznameni uzivateli, ze jsme pripraveni store_original_vector IRQ_0_VECTOR, original_handler set_irq_handler IRQ_0_VECTOR, int8_handler wait_key ; cekani na stisk klavesy print_char '.' ; oznameni uzivateli, ze ukoncujeme proces restore_original_vector IRQ_0_VECTOR, original_handler exit ; ukonceni procesu
16. Úplný zdrojový kód dnešního třetího demonstračního příkladu
Dnešní třetí demonstrační příklad, který byl získán úpravou a refaktoringem příkladu druhého, vypadá následovně:
; Pouziti casovace, obnoveni puvodni rutiny po ukonceni programu ; ; ; Tento demonstracni priklad je pouzity v serialu o programovani ; grafickych dem a her na PC v DOSu: ; https://www.root.cz/serialy/vyvoj-her-a-grafickych-dem-pro-platformu-pc/ ; ; ; preklad pomoci: ; nasm -f bin -o timer_restore_better_struct.com timer_restore_better_struct.asm ; ; nebo pouze: ; nasm -o timer_restore_better_struct.com timer_restore_better_struct.asm ;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 286 ; specifikace pouziteho instrukcniho souboru IRQ_0_VECTOR equ 0x0020 ; adresa vektoru preruseni pro IRQ 0 ;----------------------------------------------------------------------------- ; ukonceni procesu a navrat do DOSu %macro exit 0 ret %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 ; vyvolani sluzby BIOSu %endmacro ; tisk jedineho znaku pres DOS %macro print_char 1 mov ah, 0x02 ; cislo sluzby DOSu mov dl, %1 ; kod zapisovaneho znaku int 0x21 ; vyvolani sluzby DOSu %endmacro ; ulozeni puvodniho vektoru preruseni %macro store_original_vector 2 xor ax, ax mov es, ax mov si, %1 ; ES:SI obsahuje adresu, na ktere je adresa obsluhy preruseni 0x08 lea di, %2 mov ax, es:[si] ; ulozeni puvodni adresy (segment + offset) do mov cs:[di], ax ; uloziste original_handler mov ax, es:[si+2] mov cs:[di+2], ax %endmacro ; obnoveni puvodniho vektoru preruseni %macro restore_original_vector 2 xor ax, ax mov es, ax cli ; zakaz preruseni lea si, %2 ; uloziste mov di, %1 ; adresa vektoru mov ax, cs:[si] ; obnoveni puvodniho handleru mov es:[di], ax mov ax, cs:[si+2] mov es:[di+2], ax sti ; povoleni preruseni %endmacro ; nastaveni noveho vektoru preruseni %macro set_irq_handler 2 mov di, %1 ; ES:DI obsahuje adresu, na ktere je adresa obsluhy preruseni 0x08 cli ; zakaz preruseni lea ax, %2 ; zmena offsetove casti adresy mov es:[di], ax mov ax, cs ; zmena segmentove casti adresy mov es:[di+2], ax sti ; povoleni preruseni %endmacro ; oznameni, ze preruseni je u konce radici preruseni %macro end_interrupt 0 mov al, 0x20 out 0x20, al %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: print_char '>' ; oznameni uzivateli, ze jsme pripraveni store_original_vector IRQ_0_VECTOR, original_handler set_irq_handler IRQ_0_VECTOR, int8_handler wait_key ; cekani na stisk klavesy print_char '.' ; oznameni uzivateli, ze ukoncujeme proces restore_original_vector IRQ_0_VECTOR, original_handler exit ; ukonceni procesu int8_handler: ; nova obsluha preruseni pusha ; ulozit vsechny registry print_char 't' ; t=tick end_interrupt ; oznameni, ze preruseni je u konce radici preruseni popa ; obnovit vsechny registry sti ; povoleni maskovatelnych preruseni iret ; navrat z preruseni original_handler: dw 0, 0
17. Změna frekvence generování přerušení IRQ 8
Volání subrutiny s obsluhou přerušení přibližně 55× za sekundu (frekvence je 18,2 Hz) může postačovat pro jednodušší účely, například pro obnovení hodnot na obrazovce atd. Ale například pro přehrávání samplů je již nutné mít frekvenci mnohem vyšší. Toho samozřejmě můžeme dosáhnout; existují totiž jen dvě omezení: maximální frekvence je rovna 1193180 Hz a navíc musí být frekvence získána podílem 1193180 a nějakého celého čísla (posledním omezením pochopitelně je, že musíme často volané subrutiny „ustíhat“ dokončovat).
Pokusme se zvýšit frekvenci zápisu znaků „t“ na obrazovku na přibližně 100 znaků za sekundu (řádek+dalších 20 znaků).
Nejprve nastavíme čítač 8253, konkrétně kanál číslo 0, do režimu děliče frekvence. Specifikujeme, že další dva zápisy na port 0×42 zvolí šestnáctibitovou konstantu dělitele:
mov al, 0b10110110 ; 10xxxxxx: kanál číslo 2 ; xx11xxxx: zápis obou bajtů dělitele ; xxxx011x: režim generátoru obdélníku ; xxxxxxx0: binární režim čítače out 0x43, al ; zápis na řídicí port obvodu 8253 mov al, 0b00110110 ; 00xxxxxx: kanál číslo 0 ; xx11xxxx: zápis obou bajtů dělitele ; xxxx011x: režim generátoru obdélníku ; xxxxxxx0: binární režim čítače
Podílem 1193180 / požadovaná_frekvence získáme hodnotu dělitele, kterou zapíšeme stylem dolní bajt+horní bajt na port 0×40, což je port čítače/časovače číslo 0:
mov ax, 1193180 / %1 ; delitel out TIMER_CHANNEL_0, al ; nastaveni dolniho bajtu delitele mov al, ah out TIMER_CHANNEL_0, al ; nastaveni horniho bajtu delitele
18. Úplný zdrojový kód dnešního posledního demonstračního příkladu
Dnešní poslední demonstrační příklad, v němž se na obrazovku vypisují znaky s vyšší frekvencí, vypadá následovně. Mimochodem – tento příklad ještě není dokonalý, protože neobnoví původní frekvenci přerušení IRQ 8. Je to tak schválně, protože po ukončení tohoto příkladu a spuštění (dejme tomu) Norton Commanderu nebo Volkov Commanderu se bude screen saver pouštět prakticky ihned – nikoli tedy po nastaveném intervalu (jedna minuta atd.) ale přibližně 55× rychleji:
; Pouziti casovace, zrychleni citani, obnoveni puvodni rutiny po ukonceni programu ; ; ; Tento demonstracni priklad je pouzity v serialu o programovani ; grafickych dem a her na PC v DOSu: ; https://www.root.cz/serialy/vyvoj-her-a-grafickych-dem-pro-platformu-pc/ ; ; ; preklad pomoci: ; nasm -f bin -o timer_faster_clock.com timer_faster_clock.asm ; ; nebo pouze: ; nasm -o timer_faster_clock.com timer_faster_clock.asm ;----------------------------------------------------------------------------- BITS 16 ; 16bitovy vystup pro DOS CPU 286 ; specifikace pouziteho instrukcniho souboru IRQ_0_VECTOR equ 0x0020 ; adresa vektoru preruseni pro IRQ 0 TIMER_CHANNEL_0 equ 0x40 ; kanal 0 casovace TIMER_CONTROL equ 0x43 ; ridici port casovace ;----------------------------------------------------------------------------- ; ukonceni procesu a navrat do DOSu %macro exit 0 ret %endmacro ; vyprazdneni bufferu klavesnice a cekani na klavesu %macro wait_key 0 xor ax, ax int 0x16 ; vyvolani sluzby BIOSu %endmacro ; tisk jedineho znaku pres DOS %macro print_char 1 mov ah, 0x02 ; cislo sluzby DOSu mov dl, %1 ; kod zapisovaneho znaku int 0x21 ; vyvolani sluzby DOSu %endmacro ; ulozeni puvodniho vektoru preruseni %macro store_original_vector 2 xor ax, ax mov es, ax mov si, %1 ; ES:SI obsahuje adresu, na ktere je adresa obsluhy preruseni 0x08 lea di, %2 mov ax, es:[si] ; ulozeni puvodni adresy (segment + offset) do mov cs:[di], ax ; uloziste original_handler mov ax, es:[si+2] mov cs:[di+2], ax %endmacro ; obnoveni puvodniho vektoru preruseni %macro restore_original_vector 2 xor ax, ax mov es, ax cli ; zakaz preruseni lea si, %2 ; uloziste mov di, %1 ; adresa vektoru mov ax, cs:[si] ; obnoveni puvodniho handleru mov es:[di], ax mov ax, cs:[si+2] mov es:[di+2], ax sti ; povoleni preruseni %endmacro ; nastaveni noveho vektoru preruseni %macro set_irq_handler 2 mov di, %1 ; ES:DI obsahuje adresu, na ktere je adresa obsluhy preruseni 0x08 cli ; zakaz preruseni lea ax, %2 ; zmena offsetove casti adresy mov es:[di], ax mov ax, cs ; zmena segmentove casti adresy mov es:[di+2], ax sti ; povoleni preruseni %endmacro ; oznameni, ze preruseni je u konce radici preruseni %macro end_interrupt 0 mov al, 0x20 out 0x20, al %endmacro ; nastaveni frekvenci casovace %macro timer_frequency 1 mov al, 0b00110110 ; 00xxxxxx: kanál číslo 0 ; xx11xxxx: zápis obou bajtů dělitele ; xxxx011x: režim generátoru obdélníku ; xxxxxxx0: binární režim čítače mov ax, 1193180 / %1 ; delitel out TIMER_CHANNEL_0, al ; nastaveni dolniho bajtu delitele mov al, ah out TIMER_CHANNEL_0, al ; nastaveni horniho bajtu delitele %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: print_char '>' ; oznameni uzivateli, ze jsme pripraveni store_original_vector IRQ_0_VECTOR, original_handler set_irq_handler IRQ_0_VECTOR, int8_handler timer_frequency 100 wait_key ; cekani na stisk klavesy print_char '.' ; oznameni uzivateli, ze ukoncujeme proces restore_original_vector IRQ_0_VECTOR, original_handler exit ; ukonceni procesu int8_handler: ; nova obsluha preruseni pusha ; ulozit vsechny registry print_char 't' ; t=tick end_interrupt ; oznameni, ze preruseni je u konce radici preruseni popa ; obnovit vsechny registry sti ; povoleni maskovatelnych preruseni iret ; navrat z preruseni original_handler: dw 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 |
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/ - INT 21 – DOS Function Dispatcher (DOS)
https://www.stanislavs.org/helppc/int21.html - 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 - 6845 – Motorola CRT Controller
https://stanislavs.org/helppc/6845.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/ - INT 21 – DOS Function Dispatcher (DOS)
https://www.stanislavs.org/helppc/int21.html - 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 - Interrupt table
https://stanislavs.org/helppc/int_table.html - Interrupts in 8086 microprocessor
https://www.geeksforgeeks.org/interrupts-in-8086-microprocessor/ - Interrupt Structure of 8086
https://www.eeeguide.com/interrupt-structure-of-8086/