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
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
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
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.
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.
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.
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.
Ú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.
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).
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.
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/soundcards//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.
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_movsb_forward.asm |
126 | vga_320×200_image_movsb_backward1.asm | blokový přenos překrývajících se bloků paměti (snižující se adresy, nekorektní nastavení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_backward1.asm |
127 | vga_320×200_image_movsb_backward2.asm | blokový přenos překrývajících se bloků paměti (snižující se adresy, korektní nastavení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_backward2.asm |
128 | sound_bell.asm | přehrání zvuku pomocí tisku ASCII znaku BELL | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_bell.asm |
129 | sound_beep.asm | přehrání zvuku o zadané frekvenci na PC Speakeru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_beep.asm |
130 | sound_play_pitch.asm | přehrání zvuku o zadané frekvenci na PC Speakeru, použití maker | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_play_pitch.asm |
20. Odkazy na Internetu
- The Intel 8088 Architecture and Instruction Set
https://people.ece.ubc.ca/~edc/464/lectures/lec4.pdf - x86 Opcode Structure and Instruction Overview
https://pnx.tf/files/x86_opcode_structure_and_instruction_overview.pdf - x86 instruction listings (Wikipedia)
https://en.wikipedia.org/wiki/X86_instruction_listings - x86 assembly language (Wikipedia)
https://en.wikipedia.org/wiki/X86_assembly_language - Intel Assembler (Cheat sheet)
http://www.jegerlehner.ch/intel/IntelCodeTable.pdf - 25 Microchips That Shook the World
https://spectrum.ieee.org/tech-history/silicon-revolution/25-microchips-that-shook-the-world - Chip Hall of Fame: MOS Technology 6502 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-mos-technology-6502-microprocessor - Chip Hall of Fame: Intel 8088 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-intel-8088-microprocessor - Jak se zrodil procesor?
https://www.root.cz/clanky/jak-se-zrodil-procesor/ - Apple II History Home
http://apple2history.org/ - The 8086/8088 Primer
https://www.stevemorse.org/8086/index.html - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - INT 21 – DOS Function Dispatcher (DOS)
https://www.stanislavs.org/helppc/int21.html - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - Bit banging
https://en.wikipedia.org/wiki/Bit_banging - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Bootloaders
https://en.wikibooks.org/wiki/X86_Assembly/Bootloaders - Počátky grafiky na PC: grafické karty CGA a Hercules
https://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/ - Co mají společného Commodore PET/4000, BBC Micro, Amstrad CPC i grafické karty MDA, CGA a Hercules?
https://www.root.cz/clanky/co-maji-spolecneho-commodore-pet-4000-bbc-micro-amstrad-cpc-i-graficke-karty-mda-cga-a-hercules/ - Karta EGA: první použitelná barevná grafika na PC
https://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/ - RGB Classic Games
https://www.classicdosgames.com/ - Turbo Assembler (Wikipedia)
https://en.wikipedia.org/wiki/Turbo_Assembler - Microsoft Macro Assembler
https://en.wikipedia.org/wiki/Microsoft_Macro_Assembler - IBM Personal Computer (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Personal_Computer - Intel 8251
https://en.wikipedia.org/wiki/Intel_8251 - Intel 8253
https://en.wikipedia.org/wiki/Intel_8253 - Intel 8255
https://en.wikipedia.org/wiki/Intel_8255 - Intel 8257
https://en.wikipedia.org/wiki/Intel_8257 - Intel 8259
https://en.wikipedia.org/wiki/Intel_8259 - Support/peripheral/other chips – 6800 family
http://www.cpu-world.com/Support/6800.html - Motorola 6845
http://en.wikipedia.org/wiki/Motorola_6845 - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - CRTC operation
http://www.6502.org/users/andre/hwinfo/crtc/crtc.html - 6845 – Motorola CRT Controller
https://stanislavs.org/helppc/6845.html - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - Motorola 6845 and bitwise graphics
https://retrocomputing.stackexchange.com/questions/10996/motorola-6845-and-bitwise-graphics - IBM Monochrome Display Adapter
http://en.wikipedia.org/wiki/Monochrome_Display_Adapter - Color Graphics Adapter
http://en.wikipedia.org/wiki/Color_Graphics_Adapter - Color Graphics Adapter and the Brown color in IBM 5153 Color Display
https://www.aceinnova.com/en/electronics/cga-and-the-brown-color-in-ibm-5153-color-display/ - The Modern Retrocomputer: An Arduino Driven 6845 CRT Controller
https://hackaday.com/2017/05/14/the-modern-retrocomputer-an-arduino-driven-6845-crt-controller/ - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - INT 21 – DOS Function Dispatcher (DOS)
https://www.stanislavs.org/helppc/int21.html - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Arithmetic
https://en.wikibooks.org/wiki/X86_Assembly/Arithmetic - Art of Assembly – Arithmetic Instructions
http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter6/CH06–2.html - ASM Flags
http://www.cavestory.org/guides/csasm/guide/asm_flags.html - Status Register
https://en.wikipedia.org/wiki/Status_register - Linux assemblers: A comparison of GAS and NASM
http://www.ibm.com/developerworks/library/l-gas-nasm/index.html - Programovani v assembleru na OS Linux
http://www.cs.vsb.cz/grygarek/asm/asmlinux.html - Is it worthwhile to learn x86 assembly language today?
https://www.quora.com/Is-it-worthwhile-to-learn-x86-assembly-language-today?share=1 - Why Learn Assembly Language?
http://www.codeproject.com/Articles/89460/Why-Learn-Assembly-Language - Is Assembly still relevant?
http://programmers.stackexchange.com/questions/95836/is-assembly-still-relevant - Why Learning Assembly Language Is Still a Good Idea
http://www.onlamp.com/pub/a/onlamp/2004/05/06/writegreatcode.html - Assembly language today
http://beust.com/weblog/2004/06/23/assembly-language-today/ - Assembler: Význam assembleru dnes
http://www.builder.cz/rubriky/assembler/vyznam-assembleru-dnes-155960cz - Programming from the Ground Up Book – Summary
http://savannah.nongnu.org/projects/pgubook/ - DOSBox
https://www.dosbox.com/ - The C Programming Language
https://en.wikipedia.org/wiki/The_C_Programming_Language - Hercules Graphics Card (HCG)
https://en.wikipedia.org/wiki/Hercules_Graphics_Card - Complete 8086 instruction set
https://content.ctcd.edu/courses/cosc2325/m22/docs/emu8086ins.pdf - Complete 8086 instruction set
https://yassinebridi.github.io/asm-docs/8086_instruction_set.html - 8088 MPH by Hornet + CRTC + DESiRE (final version)
https://www.youtube.com/watch?v=hNRO7lno_DM - Area 5150 by CRTC & Hornet (Party Version) / IBM PC+CGA Demo, Hardware Capture
https://www.youtube.com/watch?v=fWDxdoRTZPc - 80×86 Integer Instruction Set Timings (8088 – Pentium)
http://aturing.umcs.maine.edu/~meadow/courses/cos335/80×86-Integer-Instruction-Set-Clocks.pdf - Colour Graphics Adapter: Notes
https://www.seasip.info/VintagePC/cga.html - Restoring A Vintage CGA Card With Homebrew HASL
https://hackaday.com/2024/06/12/restoring-a-vintage-cga-card-with-homebrew-hasl/ - Demoing An 8088
https://hackaday.com/2015/04/10/demoing-an-8088/ - Video Memory Layouts
http://www.techhelpmanual.com/89-video_memory_layouts.html - Screen Attributes
http://www.techhelpmanual.com/87-screen_attributes.html - IBM PC Family – BIOS Video Modes
https://www.minuszerodegrees.net/video/bios_video_modes.htm - EGA Functions
https://cosmodoc.org/topics/ega-functions/#the-hierarchy-of-the-ega - Why the EGA can only use 16 of its 64 colours in 200-line modes
https://www.reenigne.org/blog/why-the-ega-can-only-use-16-of-its-64-colours-in-200-line-modes/ - How 16 colors saved PC gaming – the story of EGA graphics
https://www.custompc.com/retro-tech/ega-graphics - List of 16-bit computer color palettes
https://en.wikipedia.org/wiki/List_of16-bit_computer_color_palettes - Why were those colors chosen to be the default palette for 256-color VGA?
https://retrocomputing.stackexchange.com/questions/27994/why-were-those-colors-chosen-to-be-the-default-palette-for-256-color-vga - VGA Color Palettes
https://www.fountainware.com/EXPL/vga_color_palettes.htm - Hardware Level VGA and SVGA Video Programming Information Page
http://www.osdever.net/FreeVGA/vga/vga.htm - Hardware Level VGA and SVGA Video Programming Information Page – sequencer
http://www.osdever.net/FreeVGA/vga/seqreg.htm - VGA Basics
http://www.brackeen.com/vga/basics.html - Introduction to VGA Mode ‚X‘
https://web.archive.org/web/20160414072210/http://fly.srk.fer.hr/GDM/articles/vgamodex/vgamx1.html - VGA Mode-X
https://web.archive.org/web/20070123192523/http://www.gamedev.net/reference/articles/article356.asp - Mode-X: 256-Color VGA Magic
https://downloads.gamedev.net/pdf/gpbb/gpbb47.pdf - Instruction Format in 8086 Microprocessor
https://www.includehelp.com/embedded-system/instruction-format-in-8086-microprocessor.aspx - How to use „AND,“ „OR,“ and „XOR“ modes for VGA Drawing
https://retrocomputing.stackexchange.com/questions/21936/how-to-use-and-or-and-xor-modes-for-vga-drawing - VGA Hardware
https://wiki.osdev.org/VGA_Hardware - Programmer's Guide to Yamaha YMF 262/OPL3 FM Music Synthesizer
https://moddingwiki.shikadi.net/wiki/OPL_chip - Does anybody understand how OPL2 percussion mode works?
https://forum.vcfed.org/index.php?threads/does-anybody-understand-how-opl2-percussion-mode-works.60925/ - Yamaha YMF262 OPL3 music – MoonDriver for OPL3 DEMO [Oscilloscope View]
https://www.youtube.com/watch?v=a7I-QmrkAak - Yamaha OPL vs OPL2 vs OPL3 comparison
https://www.youtube.com/watch?v=5knetge5Gs0 - OPL3 Music Crockett's Theme
https://www.youtube.com/watch?v=HXS008pkgSQ - Bad Apple (Adlib Tracker – OPL3)
https://www.youtube.com/watch?v=2lEPH6Y3Luo - FM Synthesis Chips, Codecs and DACs
https://www.dosdays.co.uk/topics/fm_synthesizers.php - The Zen Challenge – YMF262 OPL3 Original (For an upcoming game)
https://www.youtube.com/watch?v=6JlFIFz1CFY - [adlib tracker II techno music – opl3] orbit around alpha andromedae I
https://www.youtube.com/watch?v=YqxJCu_WFuA - [adlib tracker 2 music – opl3 techno] hybridisation process on procyon-ii
https://www.youtube.com/watch?v=daSV5mN0sJ4 - Hyper Duel – Black Rain (YMF262 OPL3 Cover)
https://www.youtube.com/watch?v=pu_mzRRq8Ho - IBM 5155–5160 Technical Reference
https://www.minuszerodegrees.net/manuals/IBM/IBM_5155_5160_Technical_Reference_6280089_MAR86.pdf - a ymf262/opl3+pc speaker thing i made
https://www.youtube.com/watch?v=E-Mx0lEmnZ0 - [OPL3] Like a Thunder
https://www.youtube.com/watch?v=MHf06AGr8SU - (PC SPEAKER) bad apple
https://www.youtube.com/watch?v=LezmKIIHyUg - Powering devices from PC parallel port
http://www.epanorama.net/circuits/lptpower.html - Magic Mushroom (demo pro PC s DOSem)
http://www.crossfire-designs.de/download/articles/soundcards//mushroom.rar - Píseň Magic Mushroom – originál
http://www.crossfire-designs.de/download/articles/soundcards/speaker_mushroom_converted.mp3 - Píseň Magic Mushroom – hráno na PC Speakeru
http://www.crossfire-designs.de/download/articles/soundcards/speaker_mushroom_speaker.mp3 - Pulse Width Modulation (PWM) Simulation Example
http://decibel.ni.com/content/docs/DOC-4599 - Resistor/Pulse Width Modulation DAC
http://www.k9spud.com/traxmod/pwmdac.php - Class D Amplifier
http://en.wikipedia.org/wiki/Electronic_amplifier#Class_D - Covox Speech Thing / Disney Sound Source (1986)
http://www.crossfire-designs.de/index.php?lang=en&what=articles&name=showarticle.htm&article=soundcards/&page=5 - Covox Digital-Analog Converter (Rusky, obsahuje schémata)
http://phantom.sannata.ru/konkurs/netskater002.shtml