Hlavní navigace

Zvuky a hudba na platformě IBM PC

1. 10. 2024
Doba čtení: 46 minut

Sdílet

 Autor: Pavel Tišnovský
Zmíníme se o skromných začátcích rozvoje zvukového subsystému. Tyto počítače se z kanceláří postupně rozšířily i do domácností a společně s vývojem her se i pro ně začaly vyrábět rozličné zvukové karty.

Obsah

1. Zvuky a hudba na platformě IBM PC

2. Zapojení PC Speakeru v IBM PC

3. Základní metody tvorby zvuků na PC Speakeru

4. PC Speaker a jeho alternativy

5. Praktický příklad: přehrání signálu „bell“

6. Řízení reproduktoru přes integrovaný obvod 8255

7. Programovatelný čítač/časovač 8253 (8254)

8. Nastavení čipu 8253 pro přehrání tónu

9. Od teorie k praxi

10. Úplný zdrojový kód dnešního druhého demonstračního příkladu

11. Makra pro zapnutí a vypnutí zvuku i pro přehrání tónu

12. Úplný zdrojový kód dnešního třetího demonstračního příkladu

13. Přehrávání samplované hudby na PC Speakeru

14. Generování pulsů různé šířky přímo časovačem 8253

15. Pulsní šířková modulace

16. Omezení PWM na PC Speakeru

17. Zvukový systém Covox: D/A převodník připojený na paralelní port

18. Jednodušší zapojení Covoxu

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

20. Odkazy na Internetu

1. Zvuky a hudba na platformě IBM PC

Poměrně velká část domácích osmibitových mikropočítačů i šestnácti popř. třicetidvoubitových osobních mikropočítačů měla jednu společnou vlastnost – obsahovaly totiž více či méně sofistikovaný (a většinou dedikovaný) integrovaný obvod určený pro tvorbu zvuků a/nebo hudby. Připomeňme si, že například domácí osmibitové mikropočítače Atari měly instalován čip POKEY (čtyři hlasy, podpora tvorby šumu, 16 úrovní hlasitosti), mikropočítače Commodore C64 slavný čip SID (tři hlasy, řízení obálky, modulace, volitelné filtry), v ZX Spectru 128+ a taktéž v Atari ST byl zabudovaný čip AY-3–8910 (nebo též plně kompatibilní integrovaný obvod YM2149), počítače Sharp používaly integrovaný obvod SN76489 a konečně ve slavných osobních počítačích Amiga byl nainstalovaný zvukový čip Paula (přehrávání samplů ve čtyřech kanálech). Zvukové čipy ovšem nalezneme i v dobových herních konzolích (pětikanálový zvuk v NESu atd.). Hudba tvořená zmíněnými čipy nazývá chiptune.

pc7109

Obrázek 1: Ukázka grafických možností osmibitových domácích mikropočítačů Commodore C64 (režim FLI).

Nicméně v tomto seriálu se primárně zaměřujeme na platformu IBM PC. Z pohledu tvorby zvuku a hudby byly osobní počítače IBM PC jen chudými příbuznými, protože jak po zvukové, tak i z velké míry po grafické stránce je překonávaly i mnohé levné osmibitové počítače. Z pohledu grafického subsystému to již víme – viz články o grafických adaptérech MDA a CGA. Zaměřme se ovšem na zvuky a hudbu. V IBM PC (ve standardních počítačových sestavách) byl zvuk vytvářen pouze pomocí takzvaného PC Speakeru (beeper, squeezer atd.), což vlastně byl reproduktor připojený přes hradlo (ovládané bitem z obvodu 8255) a jednoduchou propust na binární (dvoustavový) výstup časovače tvořeného obvodem 8253, popř. v pozdějších počítačových sestavách modernějším obvodem 8254. Na PC Speaker byl tedy přiváděn binární signál a teoreticky tak nebylo možné ovlivnit hlasitost a tím pádem ani přehrávat sofistikovanější samply atd.

x

Obrázek 2: První verze Deluxe Paintu (Amiga 500).

2. Zapojení PC Speakeru v IBM PC

Podívejme se na dobové schéma zapojení PC Speakeru v originálním IBM PC. Pozdější modely a klony IBM PC mohly mít zapojení mírně odlišné, ovšem se shodným výsledkem:

Obrázek 3: Zapojení PC Speakeru v originálním IBM PC.

Připomeňme si, že původní IBM PC bylo osazeno několika standardními (a poměrně levnými) osmibitovými čipy, konkrétně se jednalo o integrovaný obvod Intel 8251 (UART), dále o 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 na obrázku číslo 3 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:

Obrázek 4: Signály ovlivňující výstup na PC Speaker.

Z tohoto schématu je patrné, že z jednoho osmibitového portu čipu 8255 (konkrétně z bitu číslo 1 vyvedeného z portu B, bity jsou číslovány od nuly) je vyveden logický signál na hradlo AND. Druhým vstupem do tohoto hradla je hodinový signál číslo 2 z časovače/čítače 8253. Výstup z hradla, což je pochopitelně taktéž logický signál, je předán do jednoduché dolní propusti a výsledný signál je přiveden (přes odpor) na běžný reproduktorek s impedancí 8 Ω. To mimochodem znamenalo poměrně hlasitý a čistý zvuk, teprve později se začal reproduktorek nahrazovat za piezoelektrický reproduktor, který má odlišné zvukové charakteristiky (ale je levnější).

Obrázek 5: Podrobnější nákres připojení PC Speakeru.

Poznámka: dnes se pochopitelně již se samostatnými čipy 8253 a 8255 na základních deskách nesetkáme, protože postupně došlo k jejich integraci do southbridge. Nicméně po prakticky celou dobu existence platformy PC byly funkce těchto čipů emulovány, takže po velmi dlouhou dobu se zvuk (přesněji řečeno zvuk pro PC Speaker) generoval právě nastavováním pracovních registrů integrovaných obvodů 8253 a 8255.

Obrázek 6: Brány obvodu 8255 (viz další text).

Obrázek 7: Na originálním PC byl PC Speaker připojen přes latch.

3. Základní metody tvorby zvuků na PC Speakeru

Vraťme se však k výše uvedenému zapojení. Díky tomu, že je signál vyvedený do PC Speakeru odvozen ze dvou signálů, které vznikají v různých obvodech, je možné i zvuk tvořit různými způsoby.

Například si můžeme pomocí obvodu 8253 nechat vygenerovat pravidelný obdélníkový signál o určité frekvenci a potom bitem číslo 1 z portu B z 8255 pouze řídit, zda se má zvuk ozvat či nikoli. Nebo můžeme 8253 vynechat (přesněji řečeno nechat ho vysílat konstantní jedničku) a programově řídit 8255; tím lze programově posílat sofistikovanější „samply“, ovšem za cenu zatížení CPU (prakticky na 100%).

Možná je ovšem i kombinace těchto způsobů pro realizaci více či méně sofistikovanějších podob pulsně-šířkové modulace, simulace několika hlasů atd. K některým z těchto způsobů se pochopitelně ještě vrátíme – nikoli proto, že PC Speaker je tak kvalitní součást PC, ale proto, že poměrně dlouhou dobu se museli uživatelé spokojit právě pouze s PC Speakerem, protože alternativy nebyly buď dostupné, nebo byly drahé (a zpočátku pochopitelně taktéž nepodporované).

Obrázek 8: Program FastTracker II dokáže přehrávat hudbu uloženou v modulech jak na PC Speakeru (zde nazývaném IBM Sound Technology :-) či zvukovém systému Covox (pojmenovaný jako Soundplayer), tak i na „skutečných“ zvukových kartách typu Sound Blaster či Gravis Ultrasound. Při přehrávání na PC Speakeru lze zvolit mezi jednobitovou PCM (pulsní kódovou modulací) či PWM (pulsní šířkovou modulací) – viz zobrazená konfigurační obrazovka.

4. PC Speaker a jeho alternativy

Zvuk generovaný PC Speakerem má mnoho nedostatků. Zvukový signál dokonce není ani vyvedený na externí konektor, což bylo minimálně neobvyklé. Z tohoto důvodu se v pozdější době – spolu s vývojem kvalitnějších her – začaly i pro osobní počítače IBM PC objevovat první zvukové karty určené buď pro sběrnici ISA nebo jednoduché digitálně-analogové převodníky zapojené na paralelní port.

V dnešním článku si popíšeme jak starodávný PC Speaker, už jen z toho důvodu, že ho velmi pravděpodobně máte emulovaný i ve svém desktopu :-) – to je ta věc, která ohavně pípá při startu počítače nebo při přeplnění bufferu klávesnice (nebo v horším případě ve chvíli, kdy se detekuje chyba hardware) –, tak i ve své době oblíbený digitálně-analogový převodník Covox a částečně se zmíníme i o zvukové kartě Adlib (té se budeme později věnovat podrobněji, resp. přesněji řečeno nikoli samotnému Adlibu, ale na ní integrovaném čipu OPL2). Kromě toho si podrobněji vysvětlíme princip pulsní šířkové modulace používané zejména na PC Speakeru pro přehrávání samplované hudby, včetně hudebních modulů.

5. Praktický příklad: přehrání signálu „bell“

Pro přehrání nějakého jednoduchého zvuku na PC Speakeru ve skutečnosti nepotřebujeme žádný sofistikovaný program. Postačuje nám totiž nechat si „vytisknout“ ASCII znak s kódem 7 na standardní výstup. Tento řídicí znak se jmenuje „bell“ (viz například tento článek) a kdysi sloužil k upozornění obsluhy dálnopisu na novou zprávu atd. I dnešní operační systémy tento znak takto interpretují v původním významu, a to včetně DOSu. To znamená, že nám postačuje použít službu DOSu pro zobrazení řetězce a vložit do tohoto řetězce právě znak „bell“:

        ; retezec ukonceny znakem $
        ; (tato data jsou soucasti vysledneho souboru typu COM)
message_with_beep db "Hello, ", 0x07, "world!", 0x0d, 0x0a, "$"

Pokud si tento řetězec necháme vytisknout službou DOSu, zobrazí se nápis „Hello “, následovat bude krátký zvukový signál a poté se zobrazí zbytek řetězce.

Poznámka: frekvence zvuku se pohybuje okolo 900 Hz, popravdě si však nejsem jistý, jestli se jedná o standardizovanou hodnotu (novější BIOSy totiž pískají s vyšší frekvencí).

Úplný zdrojový kód tohoto demonstračního příkladu vypadá následovně:

; "Zobrazeni" znaku Bell
;
;
; preklad pomoci:
;     nasm -f bin -o sound_bell.com sound_bell.asm
;
; nebo pouze:
;     nasm -o sound_bell.com sound_bell.asm
 
 
;-----------------------------------------------------------------------------
 
; 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
%endmacro
 
; tisk retezce na obrazovku
%macro print 1
        mov     dx, %1
        mov     ah, 9
        int     0x21
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        print message_with_beep
        wait_key
        exit
 
        ; retezec ukonceny znakem $
        ; (tato data jsou soucasti vysledneho souboru typu COM)
message_with_beep db "Hello, ", 0x07, "world!", 0x0d, 0x0a, "$"

6. Řízení reproduktoru přes integrovaný obvod 8255

Pro tvorbu sofistikovanějších zvuků již budeme muset nastavovat integrované obvody 8255 a 8253. Podívejme se nejdříve na čip 8255, což je realizace tří paralelních osmibitových portů pojmenovaných A, B a C. Tyto porty jsou mapovány na I/O porty 0×60, 0×61 a 0×62 (I/O port je vlastně pouze samostatný adresový rozsah určený pro čtení a zápis dat na periferní zařízení mikroprocesorem) a každý z nich má svoji pevně danou funkci (obsluha klávesnice, zjištění konfigurace atd.). Z pohledu programátora zvukového subsystému nás bude zajímat pouze port B mapovaný na I/O port 0×61, jehož jednotlivé bity mají následující význam:

Bit Stručný popis
7 volba obsahu portu A
6 řízení hodinového signálu pro komunikaci s klávesnicí
5 povolení chybových signálů z expanzního slotu (XT)
4 povolení kontroly parity RAM
3 řízení motoru kazetové mechaniky (nikdy jsem neviděl v akci)
2 volba obsahu portu C
1 výstup na PC Speaker (což nás zajímá)
0 řídicí hradlo (GATE) kanálu číslo 2 časovače 8253 (což nás zajímá)

Měnit budeme pouze bity číslo 0 a 1, ostatní bity ponecháme na původní hodnotě. Bitem číslo 1 se povoluje výstup na PC Speaker (což je onen jeden vstup do hradla AND, který jsme již zmínili) a bitem číslo 0 se ovládá GATE časovače, konkrétně kanálu 2, který je použit pro PC Speaker.

7. Programovatelný čítač/časovač 8253 (8254)

Časovač realizovaný integrovaným obvodem 8253 obsahuje tři samostatně konfigurovatelné šestnáctibitové kanály, přičemž pro generování zvuku je použit kanál třetí, který je doposud (i v mnoha moderních desktopech) namapován na I/O port 0×42. 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. Na vstup časovače je připojen hodinový signál s frekvencí 1193180 Hz, což je hodnota odvozena 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 je to složitější, protože frekvence CPU byla odlišná.

Výše zmíněný signál 1193180 Hz je v každém kanálu 0–2 vydělen nastavenou šestnáctibitovou hodnotou (každý kanál má svoji hodnotu dělitele), což vlastně znamená, že minimální frekvence zvuku vytvářená čítačem/časovačem je rovna 18,2 Hz (1193180/65536) a maximální frekvence dosahuje úrovně ultrazvuku (otázkou samozřejmě je, jaká je mezní frekvence samotného reproduktoru). S využitím čítače/časovače 8253 je tak 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.

Poznámka: díky tomu, že 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 zvuk sofistikovanějšími způsoby.

8. Nastavení čipu 8253 pro přehrání tónu

Řídicí a stavové registry obvodu 8253 jsou mapová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 zajímat jen kanál číslo 2):

Bity Stručný popis
7–6 výběr kanálu 0, 1 nebo 2 (3 není povoleno)
5–4 volba čtení/zápisu vyššího či nižšího bajtu dělitele (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).

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

9. Od teorie k praxi

Jak tedy nastavíme čipy 8253 a 8255 pro přehrání tónu? Začneme čipem 8255, což je jednodušší. Na I/O portu 0×61 je nutné nastavit spodní dva bity na jedničku, čímž povolíme výstup na PC Speaker a současně i povolíme GATE čítače (ideální je tedy tuto operaci provést až po nastavení čítače):

in  al, 0x61          ; obsah řídicího bajtu portu b
and al, 0b11111100    ; zákaz gate + zákaz výstupu na pc speaker
out 0x61, al          ; zápis modifikovaného řídicího bajtu portu b

Dále nastavíme čítač 8253, konkrétně kanál číslo 2 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

Přehrávat budeme tón komorního A s frekvencí 440 Hz. Podílem 1193180 / 440 získáme hodnotu dělitele frekvence 2711, kterou zapíšeme stylem dolní bajt+horní bajt na port 0×42:

mov  ax, 2711         ; dělitel: 1193180 / 440
out  0x42, al         ; nastaveni dolniho bajtu delitele
mov  al, ah
out  0x42, al         ; nastaveni horniho bajtu delitele

Nyní se již začne komorní A přehrávat. Vypnutí zvuku lze realizovat zákazem výstupu na PC Speaker:

in  al, 0x61          ; obsah řídicího bajtu portu b
or  al, 0b00000011    ; povolení gate + povolení výstupu na pc speaker
out 0x61, al          ; zápis modifikovaného řídicího bajtu portu b

10. Úplný zdrojový kód dnešního druhého demonstračního příkladu

Výše uvedené sekvence instrukcí použijeme v dnešním druhém demonstračním příkladu pro přehrání noty komorního A. Po stisku klávesy se zvuk vypne a celý program je ukončen. Na analyzátoru spektra je možné snadno ověřit, že se skutečně používá frekvence přibližně 440 Hz (mě se ukazuje 439.X Hz):

; Zakladni vystup zvuku na PC Speaker s vyuzitim casovace 8253
;
;
; preklad pomoci:
;     nasm -f bin -o sound_beep.com sound_beep.asm
;
; nebo pouze:
;     nasm -o sound_beep.com sound_beep.asm
 
  
;-----------------------------------------------------------------------------
 
; 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
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        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  ax, 2711         ; dělitel: 1193180 / 440
        out  0x42, al         ; nastaveni dolniho bajtu delitele
        mov  al, ah
        out  0x42, al         ; nastaveni horniho bajtu delitele
 
        in  al, 0x61          ; obsah řídicího bajtu portu B
        or  al, 0b00000011    ; povolení GATE + povolení výstupu na PC Speaker
        out 0x61, al          ; zápis modifikovaného řídicího bajtu portu B
 
        wait_key
 
        in  al, 0x61          ; obsah řídicího bajtu portu B
        and al, 0b11111100    ; zákaz GATE + zákaz výstupu na PC Speaker
        out 0x61, al          ; zápis modifikovaného řídicího bajtu portu B
 
        wait_key
        exit

11. Makra pro zapnutí a vypnutí zvuku i pro přehrání tónu

Samozřejmě je vhodné celý program refaktorovat a vytvořit si makra popř. podprogramy pro zapnutí zvuku, vypnutí zvuku a taktéž pro přehrání tónu o zvolené frekvenci. Makra pro vypnutí a zapnutí zvuku lze zapsat triviálním způsobem:

; povoleni zvuku
%macro sound_enable 0
        in  al, 0x61          ; obsah řídicího bajtu portu B
        or  al, 0b00000011    ; povolení GATE + povolení výstupu na PC Speaker
        out 0x61, al          ; zápis modifikovaného řídicího bajtu portu B
%endmacro
 
; zakaz zvuku
%macro sound_disable 0
        in  al, 0x61          ; obsah řídicího bajtu portu B
        and al, 0b11111100    ; zákaz GATE + zákaz výstupu na PC Speaker
        out 0x61, al          ; zápis modifikovaného řídicího bajtu portu B
%endmacro

Makro pro zahájení přehrání tónu je nepatrně složitější, neboť vyžaduje parametr. Ovšem díky tomu, že se používá makro a nikoli podprogram, je výpočet dělicí konstanty proveden při překladu a nikoli v runtime:

; vyber tonu
%macro play_pitch 1
        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  ax, 1193180 / %1 ; dělitel
        out  0x42, al         ; nastaveni dolniho bajtu delitele
        mov  al, ah
        out  0x42, al         ; nastaveni horniho bajtu delitele
%endmacro

Praktické použití těchto tří maker je velmi jednoduché, jak je to ostatně patrné i z následujícího úryvku zdrojového kódu:

        play_pitch 440
 
        sound_enable
        wait_key
 
        sound_disable
        wait_key

12. Úplný zdrojový kód dnešního třetího demonstračního příkladu

A takto vypadá úplný zdrojový kód dnešního třetího demonstračního příkladu, v němž se pro přehrávání volají (resp. expandují) pomocná makra:

; Zakladni vystup zvuku na PC Speaker s vyuzitim casovace 8253
;
;
; preklad pomoci:
;     nasm -f bin -o sound_play_pitch.com sound_play_pitch.asm
;
; nebo pouze:
;     nasm -o sound_play_pitch.com sound_play_pitch.asm
 
  
;-----------------------------------------------------------------------------
 
; 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
%endmacro
 
; povoleni zvuku
%macro sound_enable 0
        in  al, 0x61          ; obsah řídicího bajtu portu B
        or  al, 0b00000011    ; povolení GATE + povolení výstupu na PC Speaker
        out 0x61, al          ; zápis modifikovaného řídicího bajtu portu B
%endmacro
 
; zakaz zvuku
%macro sound_disable 0
        in  al, 0x61          ; obsah řídicího bajtu portu B
        and al, 0b11111100    ; zákaz GATE + zákaz výstupu na PC Speaker
        out 0x61, al          ; zápis modifikovaného řídicího bajtu portu B
%endmacro
 
; vyber tonu
%macro play_pitch 1
        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  ax, 1193180 / %1 ; dělitel
        out  0x42, al         ; nastaveni dolniho bajtu delitele
        mov  al, ah
        out  0x42, al         ; nastaveni horniho bajtu delitele
%endmacro
 
;-----------------------------------------------------------------------------
org  0x100        ; zacatek kodu pro programy typu COM (vzdy se zacina na 256)
 
start:
        play_pitch 440
 
        sound_enable
        wait_key
 
        sound_disable
        wait_key
 
        exit

13. Přehrávání samplované hudby na PC Speakeru

V případě požadavku na přehrání samplované hudby či složitějších zvuků (včetně napodobení hudebních nástrojů či mluveného slova) se na PC Speakeru využívala pulsní šířková modulace, neboli PWM. Na I/O portu 0×61 se nachází řídicí registr druhé osmibitové brány (B) obvodu 8255. Nultým bitem lze nastavit stav řídicího signálu (GATE) časovače 8253, což jsme si již odzkoušeli. V případě, že je tento bit nulový, čítač/časovač je pozastaven a tím pádem na reproduktor neposílá žádný signál. První bit I/O portu 0×61 v tomto případě přímo řídí binární výstup, na nějž je připojen reproduktor. To znamená, že programovou změnou prvního bitu portu 0×61 lze generovat dvoustavový signál posílaný na reproduktor, nezávisle na čítači.

Přehrávací rutina je většinou napojena na přerušení od časovače (může být použit i jeho třetí kanál, neboť ten je při této konfiguraci odpojen od reproduktoru), jehož frekvence musí být několikanásobně větší, než původní vzorkovací frekvence přehrávaných samplů. Při dobrém časování lze na PC Speakeru pomocí PWM přehrávat cca pěti či šestibitové samply, což odpovídá dynamickému rozsahu 30 resp. 36 dB (připomeňme, že CD-Audio má dynamický rozsah 96 dB).

14. Generování pulsů různé šířky přímo časovačem 8253

Ovšem takto napsané přehrávací rutiny byly velmi náročné na čas CPU a každé přerušení bylo „slyšet“. Existovaly však přehrávací rutiny, které využívaly další režimy časovače 8253. Bylo totiž možné, aby se namísto režimu děliče frekvence 1:N nastavil například režim monostabilního klopného obvodu. Tímto způsobem bylo možné nastavit přehrávání pulsů o poměrně přesné šířce (ostatně vycházelo se z frekvence 1193180 Hz). A velmi krátké pulsy (buď nad hranicí slyšitelnosti, nebo okolo ní) nebyly přehrány jako logická jednička, ale jako puls s menší amplitudou. Tyto přehrávací rutiny tedy pouze měnily nastavení časovače, a to s pevnou frekvencí změn (například 17 kHz, 18 kHz s limitem přibližně právě nad 18 kHz atd.). Díky tomu měl CPU více času například na výpočet mixování zvuků do jediného výstupního kanálu atd.

Poznámka: časovač zde tedy nesloužil pro vytváření tónu o zadané výšce, ale pro změnu amplitudy zdánlivého zvukového signálu na výstupu.

Obrázek 8: Pulsní šířková modulace sinusové vlny (červená barva), která je porovnávána s referenčním trojúhelníkovým signálem (modrá barva). Výsledný binární signál je zobrazen žlutou barvou.

15. Pulsní šířková modulace

Na obrázcích 7 až 11 je naznačen jeden ze způsobů převodu analogového signálu (popř. i signálu navzorkovaného) na signál binární (dvoustavový) pomocí pulsní šířkové modulace. Princip je jednoduchý – původní analogový signál je kontinuálně porovnáván s trojúhelníkovým signálem o vyšší frekvenci, jehož amplituda je shodná s amplitudou (resp. maximální absolutní hodnotou) původního analogového signálu. V případě, že je aktuální hodnota původního modulovaného signálu vyšší, než je hodnota trojúhelníkového referenčního signálu, je na výstupu vysoká úroveň (většinou kladné napětí), v opačném případě nízká úroveň (záporné napětí o stejné absolutní hodnotě).

Obrázek 9: Pulsní šířková modulace – frekvence referenčního trojúhelníkového signálu je dvojnásobná oproti signálu zobrazeném na čtvrtém obrázku, výstup by však stále nebyl (při přehrání na reproduktoru) dostatečně kvalitní.

Pokud je pulsní šířková modulace implementována v elektronickém obvodu (ale takový luxus v PC nemáme), jsou oba signály porovnávány pomocí operačního zesilovače, na nějž je zapojený Schmittův klopný obvod, který zajistí kolmost hran výsledného binárního signálu. Programová implementace je založena na výpočtu referenčního signálu v diskrétních krocích a jeho jednoduchém porovnání s původními vzorky.

Obrázek 10: Pulsní šířková modulace – frekvence referenčního trojúhelníkového signálu je dvojnásobná oproti signálu zobrazeném na pátém obrázku.

Aby byl výsledek PWM kvalitní, je nutné, aby frekvence trojúhelníkového referenčního signálu byla mnohonásobně vyšší, než frekvence signálu vstupního. V případě, že se pomocí PWM převádí navzorkovaný (digitální) zvuk s určitou vzorkovací frekvencí, je vhodné, aby frekvence referenčního signálu byla minimálně 10× vyšší než frekvence vzorkovací, což ovšem klade vyšší nároky na přesnost časování při přehrávání zvuku (tato situace zhruba odpovídá šestému obrázku). Pokud byl například původní zvuk navzorkován s frekvencí 22 kHz, což odpovídá spíše menší kvalitě (ztrácí se vyšší slyšitelné frekvence), tak by se měla PWM provádět s frekvencí 220 kHz, tj. při programové implementaci by se měla přerušovací rutina volat 220000× za sekundu.

Obrázek 11: Na tomto grafu je frekvence referenční trojúhelníkové vlny cca 10× vyšší, než frekvence převáděného signálu, což je již pro mnoho aplikací dostatečné.

Když uvážíme, že tato rutina musí před vlastní PWM provést i mixáž všech zvukových kanálů, zjistíme, že na původních IBM PC (a dokonce i modelech XT a AT) bylo přehrávání tak náročné, že ho nebylo možné použít přímo ve hrách (tam nejvíce času zabralo přepočítání obrázků, protože grafické karty CGA/EGA/Hercules prakticky žádnou podporu programátorům nenabízely), ale pouze na úvodních obrazovkách či specializovaných přehrávačích (například Visual Player či Mod Player – ty pracovaly i na šestnáctibitových mikroprocesorech).

Obrázek 12: Další zdvojnásobení frekvence referenční trojúhelníkové vlny. Výsledný graf je již částečně zkreslen vlivem převodu původních analogových průběhů do rastrového obrázku (již se přibližujeme k hranici, při níž vzniká obrazový alias).

16. Omezení PWM na PC Speakeru

V případě, že má být signál modulovaný pomocí PWM přehráván pomocí reproduktoru, je nutné dodržet několik podmínek, které však u původního PC Speakeru nebyly všechny splněny. Vhodné je, aby vyšší úroveň byla reprezentována kladným napětím určité hodnoty a nižší úroveň záporným napětím o stejné absolutní hodnotě. Tím je zajištěno optimální využití výkonu reproduktoru, protože se jeho membrána může z klidové polohy vychylovat na obě strany. U původního PC-Speakeru sice byla vyšší úroveň reprezentována kladným napětím, ale nižší úroveň byla rovna 0V, tj. membrána reproduktoru se vychylovala pouze jedním směrem. Tím se vlastně výkon reproduktoru snížil, což sice nevadí při běžném „pípání“ (spíše naopak), ale samplovaná hudba byla z tohoto důvodu přehrávána poměrně potichu.

Problém však nastal u pozdějších osobních počítačů, zejména laptopů, ve kterých se mnohdy původní reproduktory (s cívkou) začaly nahrazovat piezoelektrickými rezonátory, známými například z digitálních hodinek. Tam již k integraci dvoustavového signálu nedocházelo, takže se v přehrávané hudbě začalo objevovat nežádoucí pískání, především tehdy, pokud byla pulsní šířková modulace prováděna s nižší frekvencí. Zajímavé je, že všechny zmíněné nevýhody PC Speakeru bylo možné obejít využitím sériového portu RS-232C, na nějž bylo možné připojit napěťový dělič s RC článkem a výstup vést buď do zesilovače nebo přímo reproduktoru – toto velmi jednoduché řešení se však, pokud vím, nikdy neujalo.

Pro představu, jakou hudbu bylo možné s PC Speakerem vytvořit, si poslechněte následující dva odkazy. Pod prvním odkazem najdete původní skladbu zdigitalizovanou moderním A/D převodníkem, pod odkazem druhým je tatáž skladba přehrávaná PC Speakerem v DOSovém demu nazvaném Magic Mushroom. Podotýkám, že na většině tehdejších PCček byla skladba přehrávaná v horší kvalitě, zejména byla mnohem tišší, což si majitelé starých PC mohou odzkoušet – http://www.crossfire-designs.de/download/articles/sou­ndcards//mushroom.rar (pozor – v DOSboxu není výsledek autentický).

17. Zvukový systém Covox: D/A převodník připojený na paralelní port

Zvukové zařízení Covox Speech Thing, které je známé spíše pod svým zkráceným názvem Covox, bylo ve druhé polovině devadesátých letech minulého století poměrně populární, především díky tomu, že ho bylo velmi snadné vyrobit i v domácích podmínkách. V podstatě se jednalo o velmi jednoduchý osmibitový digitálně-analogový převodník (DAC – Digital to Audio Converter) připojený na paralelní port. Původní Covox Speech Thing byl vyráběný firmou Covox Tympanum Corporation, ovšem jeho cena byla velmi vysoká – celých 70 tehdejších dolarů, což odpovídá cca 85 současným dolarům.

Ovšem vzhledem k tomu, že digitálně-analogový převodník byl sestaven pouze z 25pinového konektoru DB-25, několika rezistorů a jednoho kondenzátoru (bez zesilovače, protože Covox se běžně připojoval do aktivních reproduktorových soustav), bylo ho možné sestavit doslova za pár korun. Existuje několik variant systému Covox, z nichž nejjednodušší obsahuje pouze devět rezistorů a jeden kondenzátor – viz níže zobrazené schéma:

Obrázek 13: Jedno z nejjednodušších zapojení Covoxu, které ovšem vyžaduje poměrně přesné hodnoty odporů – odpor každého rezistoru připojeného na datový pin paralelního portu by měl být ideálně dvojnásobný oproti rezistoru předchozímu.

18. Jednodušší zapojení Covoxu

Původní Covox se připojoval většinou na první paralelní port, který je přístupný na I/O adrese 0×378 – viz navazující část tohoto seriálu. Data se na paralelní port přenáší programově, tj. většinou v přerušovací rutině napojené na časovač. Teoreticky je možné použít jakoukoli vzorkovací frekvenci, v praxi se ustálily běžné hodnoty 11025 Hz, 22050 Hz a 44100 Hz. Existovaly i vylepšené varianty Covoxu, například Disney Sound Source obsahoval vlastní zdroj přerušení.

Obrázek 14: Další způsob zapojení Covoxu, kde jsou vyžadovány pouze rezistory dvou typů. Vzhledem k většímu proudovému zatížení datových pinů je vhodnější použít cca dvojnásobné hodnoty odporu než ty, které jsou uvedeny na obrázku (zde je pin s nejnižším bitem zatěžován proudem 3,3 mA, vhodnější je maximální proud omezit na cca 2 mA).

Někdy se také využívaly různé podoby zapojení Covoxu pro stereo výstup. Kromě velmi primitivních podob (například pro každý kanál se využily pouhé čtyři bity nebo se použily dva paralelní porty) se ujalo zapojení s dvojicí D/A převodníků připojených na výstupy dvou záchytných osmibitových registrů (postačovaly obvody řady 7400, protože paralelní port je kompatibilní s TTL). Datové piny paralelního portu byly zapojeny na vstupy obou těchto registrů, volba levého či pravého kanálu se prováděla dalším samostatně ovládaným signálem, například Strobe.

CS24 tip temata

Obrázek 15: Covox vyrobený v domácích podmínkách.

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

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
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.