Časovač 8253 a systém přerušení na IBM PC

19. 11. 2024
Doba čtení: 54 minut

Sdílet

 Autor: Depositphotos
Při programování IBM PC je třeba zajistit volání nějakého podprogramu v pravidelných intervalech. Realizace formou čekacích smyček je většinou nepraktická, proto je výhodnější využít časovač představovaný čipem 8253.

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

20. Odkazy na Internetu

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:

  1. Základy činnosti 8253 (jak nastavit frekvenci časovače)
  2. Základy činnosti 8259 (jak vyvolá přerušení)
  3. Znalost takzvané tabulky vektorů přerušení z pohledu 8086
  4. 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.

Poznámka: díky tomu, že čip 8253 obsahuje tři kanály a každý kanál má vstup GATE, je možné dva kanály spojit (jedním kanálem řídit kanál druhý) a generovat tak například zvuk sofistikovanějšími způsoby, popř. zajistit ještě delší intervaly, které bude časovač měřit.

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.

Poznámka: kanál bude nastaven do režimu binárního čítače, nikoli BCD čítače.

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 D0D7 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 IR0IR7, 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 D0D7. 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
Poznámka: na IBM PC AT (286) je navíc díky kaskádovému zapojení dvou řadičů přerušení 8259 k dispozici dalších sedm externích zdrojů přerušení.

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
Poznámka: instrukce CLI a STI zajišťují, že v průběhu změny vektoru nedojde k vyvolání přerušení, protože adresa ještě není zapsána celá.

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
Poznámka: náš program je typu COM a nemá tedy možnost pouhé rezervace paměti. Z tohoto důvodu používám příkaz assembleru dw, který program zvětší o 4 bajty (dvě slova) a nikoli resb, což je pouhá rezervace paměti bez její inicializace.

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
Poznámka: z důvodu větší čitelnosti se snažím pro zdrojovou adresu používat registr SI a pro cílovou adresu registr DI. Taktéž si povšimněte, že original_handler je skutečně blok paměti (4 bajty) umístěný v kódovém segmentu – v reálném režimu zapomeňte na ochranu paměti.

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:

bitcoin školení listopad 24

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_mov­sb_forward.asm
126 vga_320×200_image_movsb_backward1.asm blokový přenos překrývajících se bloků paměti (snižující se adresy, nekorektní nastavení) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_mov­sb_backward1.asm
127 vga_320×200_image_movsb_backward2.asm blokový přenos překrývajících se bloků paměti (snižující se adresy, korektní nastavení) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_mov­sb_backward2.asm
       
128 sound_bell.asm přehrání zvuku pomocí tisku ASCII znaku BELL https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_bell.asm
129 sound_beep.asm přehrání zvuku o zadané frekvenci na PC Speakeru https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_beep.asm
130 sound_play_pitch.asm přehrání zvuku o zadané frekvenci na PC Speakeru, použití maker https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_play_pitch.asm
       
131 sound_opl2_basic.asm přehrání komorního A na OPL2 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_basic.asm
132 sound_opl2_table.asm přehrání komorního A na OPL2, použití tabulky s hodnotami registrů https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_table.asm
       
133 sound_opl2_table2.asm přepis tabulky s obsahy registrů pro přehrání komorního A https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_table2.asm
134 sound_key_on.asm přímé ovládání bitu KEY ON mezerníkem https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_key_on.asm
135 sound_adsr.asm nastavení obálky pro tón přehrávaný prvním kanálem https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_adsr.asm
136 sound_modulation.asm řízení frekvence modulátoru klávesami 1 a 0 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_modulation.asm
       
137 keyboard_basic.asm přímá práce s klávesnicí IBM PC https://github.com/tisnik/8bit-fame/blob/master/pc-dos/keyboard_basic.asm
       
138 sound_stereo_opl2.asm stereo zvuk v konfiguraci DualOPL2 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_stereo_opl2.asm
139 sound_opl2_multichannel.asm vícekanálový zvuk na OPL2 (klávesy), delší varianta https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_multichannel.asm
140 sound_opl2_multichannel2.asm vícekanálový zvuk na OPL2 (klávesy), kratší varianta https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_multichannel2.asm
141 sound_opl3_stereo1.asm stereo výstup na OPL3 (v kompatibilním režimu) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_stereo1.asm
142 sound_opl3_stereo2.asm stereo výstup na OPL3 (v režimu OPL3) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_stereo2.asm
143 sound_opl3_multichannel.asm vícekanálový zvuk na OPL3 (klávesy) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_multichannel.asm
       
144 sound_opl3_waveform1.asm interaktivní modifikace tvaru vlny u prvního operátoru https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform1.asm
145 sound_opl3_waveform2.asm oprava chyby: povolení režimu kompatibilního s OPL3 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform2.asm
146 sound_opl3_waveform3.asm vliv tvaru vln na zvukový kanál s FM syntézou https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform3.asm
147 sound_opl3_waveform4.asm modifikace tvaru vlny nosné vlny i modulátoru https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_waveform4.asm
148 sound_opl3_4operators1.asm výběr AM/FM režimu ve čtyřoperátorovém nastavení https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_4operators1.asm
149 sound_opl3_4operators2.asm výběr AM/FM režimu ve čtyřoperátorovém nastavení https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl3_4operators2.asm
       
150 timer_basic.asm základní obsluha přerušení od časovače/čítače https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_basic.asm
151 timer_restore.asm obnovení původní obsluhy přerušení při ukončování aplikace https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_restore.asm
152 timer_restore_better_structure.asm refaktoring předchozího demonstračního příkladu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_restore_better_structure.asm
153 timer_faster_clock.asm zrychlení čítače na 100 přerušení za sekundu https://github.com/tisnik/8bit-fame/blob/master/pc-dos/timer_faster_clock.asm

20. Odkazy na Internetu

  1. The Intel 8088 Architecture and Instruction Set
    https://people.ece.ubc.ca/~ed­c/464/lectures/lec4.pdf
  2. x86 Opcode Structure and Instruction Overview
    https://pnx.tf/files/x86_op­code_structure_and_instruc­tion_overview.pdf
  3. x86 instruction listings (Wikipedia)
    https://en.wikipedia.org/wi­ki/X86_instruction_listin­gs
  4. x86 assembly language (Wikipedia)
    https://en.wikipedia.org/wi­ki/X86_assembly_language
  5. Intel Assembler (Cheat sheet)
    http://www.jegerlehner.ch/in­tel/IntelCodeTable.pdf
  6. 25 Microchips That Shook the World
    https://spectrum.ieee.org/tech-history/silicon-revolution/25-microchips-that-shook-the-world
  7. Chip Hall of Fame: MOS Technology 6502 Microprocessor
    https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-mos-technology-6502-microprocessor
  8. Chip Hall of Fame: Intel 8088 Microprocessor
    https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-intel-8088-microprocessor
  9. Jak se zrodil procesor?
    https://www.root.cz/clanky/jak-se-zrodil-procesor/
  10. Apple II History Home
    http://apple2history.org/
  11. The 8086/8088 Primer
    https://www.stevemorse.or­g/8086/index.html
  12. flat assembler: Assembly language resources
    https://flatassembler.net/
  13. FASM na Wikipedii
    https://en.wikipedia.org/wiki/FASM
  14. Fresh IDE FASM inside
    https://fresh.flatassembler.net/
  15. MS-DOS Version 4.0 Programmer's Reference
    https://www.pcjs.org/docu­ments/books/mspl13/msdos/dos­ref40/
  16. INT 21 – DOS Function Dispatcher (DOS)
    https://www.stanislavs.or­g/helppc/int21.html
  17. DOS API (Wikipedia)
    https://en.wikipedia.org/wiki/DOS_API
  18. Bit banging
    https://en.wikipedia.org/wi­ki/Bit_banging
  19. IBM Basic assembly language and successors (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Basic_assembly_lan­guage_and_successors
  20. X86 Assembly/Bootloaders
    https://en.wikibooks.org/wi­ki/X86_Assembly/Bootloaders
  21. Počátky grafiky na PC: grafické karty CGA a Hercules
    https://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/
  22. 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/
  23. Karta EGA: první použitelná barevná grafika na PC
    https://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/
  24. RGB Classic Games
    https://www.classicdosgames.com/
  25. Turbo Assembler (Wikipedia)
    https://en.wikipedia.org/wi­ki/Turbo_Assembler
  26. Microsoft Macro Assembler
    https://en.wikipedia.org/wi­ki/Microsoft_Macro_Assembler
  27. IBM Personal Computer (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Personal_Computer
  28. Intel 8251
    https://en.wikipedia.org/wi­ki/Intel_8251
  29. Intel 8253
    https://en.wikipedia.org/wi­ki/Intel_8253
  30. Intel 8255
    https://en.wikipedia.org/wi­ki/Intel_8255
  31. Intel 8257
    https://en.wikipedia.org/wi­ki/Intel_8257
  32. Intel 8259
    https://en.wikipedia.org/wi­ki/Intel_8259
  33. Support/peripheral/other chips – 6800 family
    http://www.cpu-world.com/Support/6800.html
  34. Motorola 6845
    http://en.wikipedia.org/wi­ki/Motorola_6845
  35. The 6845 Cathode Ray Tube Controller (CRTC)
    http://www.tinyvga.com/6845
  36. CRTC operation
    http://www.6502.org/users/an­dre/hwinfo/crtc/crtc.html
  37. 6845 – Motorola CRT Controller
    https://stanislavs.org/hel­ppc/6845.html
  38. The 6845 Cathode Ray Tube Controller (CRTC)
    http://www.tinyvga.com/6845
  39. Motorola 6845 and bitwise graphics
    https://retrocomputing.stac­kexchange.com/questions/10996/mo­torola-6845-and-bitwise-graphics
  40. IBM Monochrome Display Adapter
    http://en.wikipedia.org/wi­ki/Monochrome_Display_Adap­ter
  41. Color Graphics Adapter
    http://en.wikipedia.org/wi­ki/Color_Graphics_Adapter
  42. Color Graphics Adapter and the Brown color in IBM 5153 Color Display
    https://www.aceinnova.com/en/e­lectronics/cga-and-the-brown-color-in-ibm-5153-color-display/
  43. The Modern Retrocomputer: An Arduino Driven 6845 CRT Controller
    https://hackaday.com/2017/05/14/the-modern-retrocomputer-an-arduino-driven-6845-crt-controller/
  44. flat assembler: Assembly language resources
    https://flatassembler.net/
  45. FASM na Wikipedii
    https://en.wikipedia.org/wiki/FASM
  46. Fresh IDE FASM inside
    https://fresh.flatassembler.net/
  47. MS-DOS Version 4.0 Programmer's Reference
    https://www.pcjs.org/docu­ments/books/mspl13/msdos/dos­ref40/
  48. INT 21 – DOS Function Dispatcher (DOS)
    https://www.stanislavs.or­g/helppc/int21.html
  49. DOS API (Wikipedia)
    https://en.wikipedia.org/wiki/DOS_API
  50. IBM Basic assembly language and successors (Wikipedia)
    https://en.wikipedia.org/wi­ki/IBM_Basic_assembly_lan­guage_and_successors
  51. X86 Assembly/Arithmetic
    https://en.wikibooks.org/wi­ki/X86_Assembly/Arithmetic
  52. Art of Assembly – Arithmetic Instructions
    http://oopweb.com/Assembly/Do­cuments/ArtOfAssembly/Volu­me/Chapter6/CH06–2.html
  53. ASM Flags
    http://www.cavestory.org/gu­ides/csasm/guide/asm_flag­s.html
  54. Status Register
    https://en.wikipedia.org/wi­ki/Status_register
  55. Linux assemblers: A comparison of GAS and NASM
    http://www.ibm.com/develo­perworks/library/l-gas-nasm/index.html
  56. Programovani v assembleru na OS Linux
    http://www.cs.vsb.cz/gryga­rek/asm/asmlinux.html
  57. Is it worthwhile to learn x86 assembly language today?
    https://www.quora.com/Is-it-worthwhile-to-learn-x86-assembly-language-today?share=1
  58. Why Learn Assembly Language?
    http://www.codeproject.com/Ar­ticles/89460/Why-Learn-Assembly-Language
  59. Is Assembly still relevant?
    http://programmers.stackex­change.com/questions/95836/is-assembly-still-relevant
  60. Why Learning Assembly Language Is Still a Good Idea
    http://www.onlamp.com/pub/a/on­lamp/2004/05/06/writegreat­code.html
  61. Assembly language today
    http://beust.com/weblog/2004/06/23/as­sembly-language-today/
  62. Assembler: Význam assembleru dnes
    http://www.builder.cz/rubri­ky/assembler/vyznam-assembleru-dnes-155960cz
  63. Programming from the Ground Up Book – Summary
    http://savannah.nongnu.or­g/projects/pgubook/
  64. DOSBox
    https://www.dosbox.com/
  65. The C Programming Language
    https://en.wikipedia.org/wi­ki/The_C_Programming_Langu­age
  66. Hercules Graphics Card (HCG)
    https://en.wikipedia.org/wi­ki/Hercules_Graphics_Card
  67. Complete 8086 instruction set
    https://content.ctcd.edu/cou­rses/cosc2325/m22/docs/emu8086in­s.pdf
  68. Complete 8086 instruction set
    https://yassinebridi.github.io/asm-docs/8086_instruction_set.html
  69. 8088 MPH by Hornet + CRTC + DESiRE (final version)
    https://www.youtube.com/wat­ch?v=hNRO7lno_DM
  70. Area 5150 by CRTC & Hornet (Party Version) / IBM PC+CGA Demo, Hardware Capture
    https://www.youtube.com/wat­ch?v=fWDxdoRTZPc
  71. 80×86 Integer Instruction Set Timings (8088 – Pentium)
    http://aturing.umcs.maine­.edu/~meadow/courses/cos335/80×86-Integer-Instruction-Set-Clocks.pdf
  72. Colour Graphics Adapter: Notes
    https://www.seasip.info/Vin­tagePC/cga.html
  73. Restoring A Vintage CGA Card With Homebrew HASL
    https://hackaday.com/2024/06/12/res­toring-a-vintage-cga-card-with-homebrew-hasl/
  74. Demoing An 8088
    https://hackaday.com/2015/04/10/de­moing-an-8088/
  75. Video Memory Layouts
    http://www.techhelpmanual.com/89-video_memory_layouts.html
  76. Screen Attributes
    http://www.techhelpmanual.com/87-screen_attributes.html
  77. IBM PC Family – BIOS Video Modes
    https://www.minuszerodegre­es.net/video/bios_video_mo­des.htm
  78. EGA Functions
    https://cosmodoc.org/topics/ega-functions/#the-hierarchy-of-the-ega
  79. 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/
  80. How 16 colors saved PC gaming – the story of EGA graphics
    https://www.custompc.com/retro-tech/ega-graphics
  81. List of 16-bit computer color palettes
    https://en.wikipedia.org/wi­ki/List_of16-bit_computer_color_palettes
  82. Why were those colors chosen to be the default palette for 256-color VGA?
    https://retrocomputing.stac­kexchange.com/questions/27994/why-were-those-colors-chosen-to-be-the-default-palette-for-256-color-vga
  83. VGA Color Palettes
    https://www.fountainware.com/EX­PL/vga_color_palettes.htm
  84. Hardware Level VGA and SVGA Video Programming Information Page
    http://www.osdever.net/Fre­eVGA/vga/vga.htm
  85. Hardware Level VGA and SVGA Video Programming Information Page – sequencer
    http://www.osdever.net/Fre­eVGA/vga/seqreg.htm
  86. VGA Basics
    http://www.brackeen.com/vga/ba­sics.html
  87. Introduction to VGA Mode ‚X‘
    https://web.archive.org/web/20160414072210/htt­p://fly.srk.fer.hr/GDM/ar­ticles/vgamodex/vgamx1.html
  88. VGA Mode-X
    https://web.archive.org/web/20070123192523/htt­p://www.gamedev.net/referen­ce/articles/article356.asp
  89. Mode-X: 256-Color VGA Magic
    https://downloads.gamedev­.net/pdf/gpbb/gpbb47.pdf
  90. Instruction Format in 8086 Microprocessor
    https://www.includehelp.com/embedded-system/instruction-format-in-8086-microprocessor.aspx
  91. How to use „AND,“ „OR,“ and „XOR“ modes for VGA Drawing
    https://retrocomputing.stac­kexchange.com/questions/21936/how-to-use-and-or-and-xor-modes-for-vga-drawing
  92. VGA Hardware
    https://wiki.osdev.org/VGA_Hardware
  93. Programmer's Guide to Yamaha YMF 262/OPL3 FM Music Synthesizer
    https://moddingwiki.shika­di.net/wiki/OPL_chip
  94. Does anybody understand how OPL2 percussion mode works?
    https://forum.vcfed.org/in­dex.php?threads/does-anybody-understand-how-opl2-percussion-mode-works.60925/
  95. Yamaha YMF262 OPL3 music – MoonDriver for OPL3 DEMO [Oscilloscope View]
    https://www.youtube.com/watch?v=a7I-QmrkAak
  96. Yamaha OPL vs OPL2 vs OPL3 comparison
    https://www.youtube.com/wat­ch?v=5knetge5Gs0
  97. OPL3 Music Crockett's Theme
    https://www.youtube.com/wat­ch?v=HXS008pkgSQ
  98. Bad Apple (Adlib Tracker – OPL3)
    https://www.youtube.com/wat­ch?v=2lEPH6Y3Luo
  99. FM Synthesis Chips, Codecs and DACs
    https://www.dosdays.co.uk/to­pics/fm_synthesizers.php
  100. The Zen Challenge – YMF262 OPL3 Original (For an upcoming game)
    https://www.youtube.com/wat­ch?v=6JlFIFz1CFY
  101. [adlib tracker II techno music – opl3] orbit around alpha andromedae I
    https://www.youtube.com/wat­ch?v=YqxJCu_WFuA
  102. [adlib tracker 2 music – opl3 techno] hybridisation process on procyon-ii
    https://www.youtube.com/wat­ch?v=daSV5mN0sJ4
  103. Hyper Duel – Black Rain (YMF262 OPL3 Cover)
    https://www.youtube.com/wat­ch?v=pu_mzRRq8Ho
  104. IBM 5155–5160 Technical Reference
    https://www.minuszerodegre­es.net/manuals/IBM/IBM_5155_5160_Techni­cal_Reference_6280089_MAR86­.pdf
  105. a ymf262/opl3+pc speaker thing i made
    https://www.youtube.com/watch?v=E-Mx0lEmnZ0
  106. [OPL3] Like a Thunder
    https://www.youtube.com/wat­ch?v=MHf06AGr8SU
  107. (PC SPEAKER) bad apple
    https://www.youtube.com/wat­ch?v=LezmKIIHyUg
  108. Powering devices from PC parallel port
    http://www.epanorama.net/cir­cuits/lptpower.html
  109. Magic Mushroom (demo pro PC s DOSem)
    http://www.crossfire-designs.de/download/articles/sou­ndcards//mushroom.rar
  110. Píseň Magic Mushroom – originál
    http://www.crossfire-designs.de/download/articles/sou­ndcards/speaker_mushroom_con­verted.mp3
  111. Píseň Magic Mushroom – hráno na PC Speakeru
    http://www.crossfire-designs.de/download/articles/sou­ndcards/speaker_mushroom_spe­aker.mp3
  112. Pulse Width Modulation (PWM) Simulation Example
    http://decibel.ni.com/content/docs/DOC-4599
  113. Resistor/Pulse Width Modulation DAC
    http://www.k9spud.com/trax­mod/pwmdac.php
  114. Class D Amplifier
    http://en.wikipedia.org/wi­ki/Electronic_amplifier#Clas­s_D
  115. Covox Speech Thing / Disney Sound Source (1986)
    http://www.crossfire-designs.de/index.php?lang=en&what=ar­ticles&name=showarticle.htm&ar­ticle=soundcards/&page=5
  116. Covox Digital-Analog Converter (Rusky, obsahuje schémata)
    http://phantom.sannata.ru/kon­kurs/netskater002.shtml
  117. PC-GPE on the Web
    http://bespin.org/~qz/pc-gpe/
  118. Keyboard Synthesizer
    http://www.solarnavigator­.net/music/instruments/ke­yboards.htm
  119. FMS – Fully Modular Synthesizer
    http://fmsynth.sourceforge.net/
  120. Javasynth
    http://javasynth.sourceforge.net/
  121. Software Sound Synthesis & Music Composition Packages
    http://www.linux-sound.org/swss.html
  122. Mx44.1 Download Page (software synthesizer for linux)
    http://hem.passagen.se/ja_linux/
  123. Software synthesizer
    http://en.wikipedia.org/wi­ki/Software_synthesizer
  124. Frequency modulation synthesis
    http://en.wikipedia.org/wi­ki/Frequency_modulation_syn­thesis
  125. Yamaha DX7
    http://en.wikipedia.org/wi­ki/Yamaha_DX7
  126. Wave of the Future
    http://www.wired.com/wired/ar­chive/2.03/waveguides_pr.html
  127. Analog synthesizer
    http://en.wikipedia.org/wi­ki/Analog_synthesizer
  128. Minimoog
    http://en.wikipedia.org/wiki/Minimoog
  129. Moog synthesizer
    http://en.wikipedia.org/wi­ki/Moog_synthesizer
  130. Tutorial for Frequency Modulation Synthesis
    http://www.sfu.ca/~truax/fmtut.html
  131. An Introduction To FM
    http://ccrma.stanford.edu/sof­tware/snd/snd/fm.html
  132. John Chowning
    http://en.wikipedia.org/wi­ki/John_Chowning
  133. I'm Impressed, Adlib Music is AMAZING!
    https://www.youtube.com/wat­ch?v=PJNjQYp1ras
  134. Milinda- Diode Milliampere ( OPL3 )
    https://www.youtube.com/wat­ch?v=oNhazT5HG0E
  135. Dune 2 – Roland MT-32 Soundtrack
    https://www.youtube.com/wat­ch?v=kQADZeB-z8M
  136. Interrupts
    https://wiki.osdev.org/In­terrupts#Types_of_Interrup­ts
  137. Assembly8086SoundBlasterDma­SingleCycleMode
    https://github.com/leonardo-ono/Assembly8086SoundBlas­terDmaSingleCycleMode/blob/mas­ter/sbsc.asm
  138. Interrupt table
    https://stanislavs.org/hel­ppc/int_table.html
  139. Interrupts in 8086 microprocessor
    https://www.geeksforgeeks­.org/interrupts-in-8086-microprocessor/
  140. Interrupt Structure of 8086
    https://www.eeeguide.com/interrupt-structure-of-8086/
ikonka

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

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

Autor článku

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