Obsah
1. Zvuky a hudba na platformě IBM PC (2)
2. První skutečná hudba na PC: zvuková karta Adlib
3. Adlib a OPL2: začátek rozšiřování demoscény na IBM PC
7. Frekvenční modulace a její použití při zvukové syntéze
8. Od objevu frekvenční modulace k hudebním syntetizérům firmy Yamaha
10. Realizace změny jednoho řídicího registru karty OPL2
12. Operátory a jejich vzájemná vazba
16. Nastavení parametrů pro přehrání tónu komorního A
17. Praktický příklad: přehrání tónu komorního A
18. Zápis hodnot registrů OPL2 do tabulky
19. Repositář s demonstračními příklady
1. Zvuky a hudba na platformě IBM PC (2)
Na předchozí článek o zvukovém subsystému osobních mikropočítačů IBM PC dnes navážeme. Zabývat se budeme především čipem OPL2, který byl použitý jak v hudebních kartách AdLib, tak i v některých dalších zvukových kartách, které byly s AdLibem kompatibilní. Čip OPL2 byl poměrně flexibilní a umožňoval naprogramovat zvuky různých hudebních nástrojů (ale samozřejmě i zcela syntetické zvuky). Tato flexibilita byla později rozšířena v čipu OPL3, jenž nabízel možnost použití více hudebních kanálů a především zvukovou syntézu založenou na čtyřech operátorech a nikoli pouze na operátorech dvou, jako tomu bylo u OPL2. Nicméně nejdříve je vhodné pochopit princip činnosti OPL2 (dva operátory) a teprve poté si znalosti rozšířit o další možnosti OPL3.
Obrázek 1: Covox vyrobený v domácích podmínkách představoval levnou alternativu ke komerčním zvukovým kartám, nicméně veškerou syntézu hudby ponechával na CPU.
2. První skutečná hudba na PC: zvuková karta Adlib
V roce 1988 založil Martin Prevel v Quebecu firmu, kterou pojmenoval Adlib. Jednalo se o společnost zaměřenou na vývoj periferních zařízení pro tehdy již široce rozšířené osobní počítače kompatibilní s IBM PC (tedy jak samotných originálních IBM PC, tak i nesčetných klonů). Jedním z prvních zařízení – a nutno říci, že nakonec také nejúspěšnějších – byla zvuková karta Adlib postavená na čipu YM3812 (označovaném také jako OPL2) vyráběném firmou Yamaha. Yamaha, která se na hudební syntézu založenou na fázové či frekvenční modulaci specializovala, původně tento čip dodávala pouze firmě Adlib, později však firma Microsoft (zrovna oni!) požádala, aby se tyto čipy nabízely i dalším výrobcům periferních zařízení.
Obrázek 2: Čip Yamaha YM3812 neboli OPL2 na OPLBoardu připojeném k Arduinu. Jsou zde patrné i záchytné registry a D/A převodník.
Výsledek na sebe nenechal dlouho čekat, protože jednou z prvních firem, které začaly čip YM3812 používat ve svých zvukových kartách, byla kromě samotného Adlibu i společnost Creative Technology se svými kartami Sound Blaster. Na jednu stranu to sice znamenalo, že se Adlib stal ve své době de facto standardem pro syntézu hudby (karty Sound Blaster s ním byly zpětně kompatibilní), ale samozřejmě se také jednalo o konkurenci, která po několika letech dovedla firmu Adlib ke krachu, protože nedokázala konkurovat relativně levným Sound Blasterům (které vlastně veškerou funkcionalitu Adlibu obsahovaly a přidávaly další vlastnosti navíc) a zvukovým kartám Pro Audio Spectrum.
Obrázek 3: Hudební karta Adlib, která je postavena na bázi čipu OPL2.
3. Adlib a OPL2: začátek rozšiřování demoscény na IBM PC
Nicméně zvuková karta Adlib je oprávněně považována za mezník ve vývoji osobních počítačů kompatibilních s IBM PC, protože umožnila relativně snadnou tvorbu hudby s velmi malými nároky na výpočetní výkon použitého mikroprocesoru (Adlib bylo možné použít i v IBM XT) i nepatrnými nároky na požadovanou kapacitu operační paměti – řádově se jednalo o stovky bajtů na přehrávací rutinu a několik kilobajtů pro mnohaminutovou skladbu.
Obrázek 4: Sanxion – program obsahující několik skladeb pro zvukové karty obsahující čip OPL2. Podobné programy nazývané musicdisky, které kromě hudby většinou obsahovaly i grafické efekty, byly vytvářeny mnoha demoskupinami a dnes jich existuje minimálně několik stovek.
Poměrně brzy po vzniku prvních her, které čip OPL2 zabudovaný v Adlibu používaly, se začaly objevovat i aplikace umožňující tvorbu tónů napodobujících různé hudební nástroje (kolekce těchto tónů se nazývaly banky, soubory s banky byly v různých formátech dostupné jak komerčně, tak i cestou freeware) i programy pro tvorbu hudby, které byly v mnoha ohledech podobné trackerům, o nichž jsme se zmínili v předchozí části tohoto seriálu. Některé trackery, například Scream Tracker, dokonce později umožňovaly kombinovat hudbu pro čip OPL2 se samplovanými zvuky. Bližší informace o OPL2 i aplikacích pro něj si povíme v navazující části dnešního článku.
Obrázek 5: Pravděpodobně nejdokonalejším trackerem pro Adlib je program Adlib Tracker II. Stále je možné ho provozovat, například v DOSBoxu.
4. Princip činnosti OPL
V předchozí kapitole jsme si řekli, že zvuková karta Adlib je postavena na čipu YM3812 neboli OPL2 (zajímavé je, že se jedná o plně digitální čip, ve své podstatě o jednoduchý signálový procesor doplněný o paměť ROM, ve které jsou uloženy vzorky první čtvrtiny periody sinusového signálu). Označení OPL2 vzniklo ze zkratky Operator Type L2, což v pojetí firmy Yamaha znamená, resp. znamenalo, že zvuk v každém hudebním kanálu může být vytvořen s využitím maximálně dvou takzvaných operátorů, které mohou být propojeny tak, jak je ukázáno na následujícím obrázku – buď se jedná o aditivní syntézu (oba signály jsou jednoduše sečteny) nebo o fázovou modulaci (PM), s volitelnou zpětnou vazbou (v materiálech firmy Yamaha se sice píše, že je použita frekvenční modulace, ve skutečnosti se však jedná o modulaci fázovou, i když praktické rozdíly při generování zvuku nejsou velké). Každý operátor je přitom vždy složen ze tří bloků – oscilátoru (generátoru periodického signálu), generátoru obálky (envelope) a obvodu pro řízení výstupní úrovně.
Obrázek 6: Způsob zapojení dvojice operátorů v jednom hudebním kanálu v čipu OPL2.
Každý oscilátor může generovat periodický signál odvozený od klasické sinusovky, jejíž podoba je uložena v ROM přímo na hudebním čipu. Všechny čtyři varianty signálu jsou zobrazeny na dalším obrázku:
Obrázek 7: Původní čip OPL2 umožňuje pro každý operátor použít jeden ze čtyř tvarů vlny založený na různým způsobem modifikované sinusovce o volitelné frekvenci.
Celkem je v čipu OPL2 možné využít osmnáct operátorů zapojených buď do devíti melodických hudebních kanálů (vždy dvojice operátorů tvoří jeden melodický hudební kanál) nebo do šesti melodických kanálů (každý obsahuje dva operátory) a současně pěti kanálů použitých pro bicí nástroje:
Obrázek 8: Zpětná vazba v zapojení dvou operátorů umožňuje při správném nastavení generovat šum, což je i základem pro bicí nástroje.
Interně se jedná o plně digitální čip obsahující poměrně jednoduchý procesor doplněný o paměť ROM s kapacitou 512 bytů, která je rozdělena na dvě stejně velké části. V prvních 256 bajtech se nachází vzorky jedné čtvrtiny periody sinusového signálu uložené v logaritmické škále (výpočet sinusovky by byl zbytečně komplikovaný, navíc ze znalosti první čtvrtiny periody lze díky symetrii sinusovky odvodit její průběh pro celou periodu), druhých 256 bajtů obsahuje převodní hodnoty exponenciální funkce – veškeré výpočty na čipu YM 3812 jsou totiž prováděny s hodnotami v logaritmické škále, protože nejčastější výpočty (především samotná fázová modulace, modifikace signálu obálkou pomocí amplitudové modulace, změna hlasitosti a aplikace zpětné vazby) jsou založeny na násobení, jež se v logaritmické škále převádí na sčítání, které je implementačně pochopitelně mnohem jednodušší než násobení.
5. Časovače na čipu OPL2
Navíc jsou na čipu OPL2 umístěny dva časovače běžící s cyklem 80µs a 320µs, které mohou při správném připojení obvodu na sběrnici generovat přerušení, ale na původní kartě Adlib není přerušovací linka zapojena (možná z toho důvodu, že původní IBM PC i XT mělo pouze osm zdrojů přerušení a ne 15, jak je tomu na AT). Ovšem příznak přetečení časovačů lze i bez použití přerušení přečíst z řídicích a stavových registrů, což je vlastnost využívaná při automatické detekci přítomnosti této karty na sběrnici ISA či PC BUS – éra přídavných karet s podporou „plug and play“ totiž začala až o zhruba deset let později. Podrobnější informace o funkcích čipu OPL2 budou uvedeny v praktické části dnešního článku.
6. Externí D/A převodník
OPL2 byl skutečně čistě digitálním obvodem, neobsahoval totiž dokonce ani D/A převodník. Převod na lineární hodnoty je prováděn před posláním vypočteného signálu na externí digitálně-analogový převodník (většinou se jednalo o čip YM3014B, samplovací frekvence, tj. rychlost přenášení vzorků na D/A převodník, je poměrně vysoká – 49720 Hz). To, že je YM 3812 plně digitálním čipem je výhodné pro jeho emulaci, protože není nutné složitě modelovat chování analogových oscilátorů či filtrů (bylo však nutné zpětným inženýrstvím zjistit přesný způsob zapojení).
AdLib boardObrázek 9: Zvuková karta AdLib obsahovala jen velmi málo součástek: zvukový čip YM 3812, D/A převodník YM3014B a obvody zajišťující komunikaci počítače s kartou přes sběrnici.
7. Frekvenční modulace a její použití při zvukové syntéze
Principem, na němž je tvorba hudby pomocí čipů OPL2 postavena, je vzájemná kombinace dvou periodických signálů s využitím zpětnovazební smyčky (feedback loop), obálky typu ADSR a frekvenční modulace (FM) – jedná se modulaci, při jejíž aplikaci je frekvence druhého oscilátoru (nosné) řízena výstupem oscilátoru prvního (modulátoru).
Obrázek 10: Frekvenční modulace v případě, že má první signál (modrý) zvaný modulátor velmi dlouhou periodu v porovnání se signálem druhým, jenž je zvaný nosná (carrier).
Využitím FM syntézy pro napodobení zvuku hudebních nástrojů se zabýval John Chowning, který již v roce 1967 učinil důležitý objev při pokusu o vygenerování zvukového efektu známého pod pojmem vibrato. Chowningův pokus byl založen na použití elektronického obvodu sestaveného z dvojice za sebe zapojených oscilátorů, tj. generátorů sinusových signálů, přičemž první oscilátor (s frekvencí cca 20 Hz) ovlivňoval frekvenci druhého oscilátoru, který generoval výsledný signál. Pomocí takto zapojené dvojice oscilátorů se Chowningovi podařilo vytvořit harmonický tón s celým spektrem vyšších frekvencí, přičemž změnou frekvence a amplitudy prvního oscilátoru se výška výsledného tónu neměnila, ale jeho zabarvení ano (přesněji řečeno se výška samozřejmě měnila, ale tak rychle, že lidské ucho v celém spektru frekvencí rozpozná právě frekvenci základní, jejíž výkon ve frekvenčním spektru je nejvyšší).
Obrázek 11: V případě, že se perioda modulátoru zkracuje, je změna tvaru výstupního signálu stále výraznější.
Skutečné vibrato lze nasimulovat s použitím nižší frekvence prvního oscilátoru (nazývaného také modulator), naopak pro napodobení zvuku široké palety hudebních nástrojů je frekvence prvního modulátoru poněkud vyšší. Frekvence druhého oscilátoru (jenž se nazývá carrier – nosná) určuje základní frekvenci (výšku) vytvářeného tónu, přičemž podíl frekvencí obou oscilátorů lze v praxi vyjádřit jednoduchým zlomkem.
Obrázek 12: Další snižování frekvence modulátoru – výsledný signál získává tvar charakteristický pro FM syntézu. Po analýze signálu ve frekvenční oblasti by bylo patrné, že se zde vyskytuje nekonečné množství frekvencí, které jsou však při reálné reprodukci zvuku z obou stran ořezány.
8. Od objevu frekvenční modulace k hudebním syntetizérům firmy Yamaha
John Chowning, který v době svého objevu pracoval na universitě ve Stanfordu, se spojil s panem Ishimurou z firmy Yamaha, jenž při osobní návštěvě na Stanfordu po necelých deseti minutách princip FM, způsob jejího využití i důsledky pro další vývoj v celém oboru hudebních syntetizérů pochopil a doporučil svým nadřízeným, aby se Yamaha v této oblasti více angažovala.
Důvod Ishimurova nadšení spočíval v tom, že pro napodobení zvuku nástrojů pomocí FM syntézy je zapotřebí pouze poměrně jednoduchý analogový či číslicový obvod (Yamaha se v tomto ohledu téměř výhradně zaměřila na číslicové–digitální zvukové obvody) a především je pro každý nástroj a tón nutné nastavovat relativně malé množství parametrů, pro jejichž uložení dostačuje pouze minimum paměti (doslova pár bajtů), takže čipy s FM syntézou bylo možné použít i v levnějších syntetizérech, na rozdíl od pozdější wavetable syntézy, která vyžaduje poměrně velké množství paměti a výkonnější procesory pro zpracování vzorků nástrojů (nehledě na to, že samotná wavetable syntéza nijak neřeší tvorbu nových zvuků, na rozdíl od FM syntézy doplněné o možnost ovlivnění obálky – envelope – editovaného tónu).
Firma Yamaha si následně způsob tvorby hudby pomocí FM syntézy nechala licencovat a posléze zahájila vývoj a výrobu vlastních čipů pro syntézu hudby (původně měla tyto čipy pro Yamahu vyrábět firma NEC) a v roce 1983 prodala více než 200 000 kusů legendárního syntetizéru Yamaha DX-7, což bylo na tehdejší dobu (menší trh než dnes) považováno za velký úspěch následovaný po několika letech krachem firem, které vyráběly nyní již zastaralé elektromechanické a analogové syntetizéry (samotné obchodní značky těchto výrobců sice přežily, ale většinou patří jiným vlastníkům).
Obrázek 13: Legendární klávesy Yamaha DX-7 s FM syntézou – dodnes vyhledávaný a ceněný výrobek, který měl velký dopad na celou hudební scénu.
V roce 1994 dokonce přesahoval obrat trhu se zvukovými kartami s FM syntézou jednu miliardu dolarů – a naprostá většina těchto zvukových karet používala čip OPL2 nebo později OPL3, kterými se dnes zabýváme. Zajímavé přitom je, že starší čipy vyráběné Yamahou ve skutečnosti používaly při zvukové syntéze fázovou modulaci (PM) a ne modulaci frekvenční (FM), přestože firma měla patent pouze na FM syntézu. I když mezi fázovou modulací a modulací frekvenční je pouze minimální rozdíl (záleží jen na tom, v jakém okamžiku se aktuální hodnota modulátoru použije ve výpočtu výsledného signálu), mohlo – i přes existenci patentu – na trhu vzniknout více konkurenčních řešení.
9. Programování čipu OPL2
Čip OPL2 je vybaven piny pro připojení k osmibitové sběrnici řízené signály CS, RD a WR. Pro výběr adresy je vyveden pouze jediný pin – to je však dostačující, protože se rozlišují pouhé dvě adresy mapované do I/O prostoru 0×388 a 0×389 (tyto adresy byly z důvodu zpětné kompatibility použity i u modernějších zvukových karet, což si ostatně ukážeme příště).
Na adrese 0×388 je umístěný indexový registr, do nějž se zapisuje index vybraného interního registru (0–255), a na adrese 0×389 je datový registr. Čip obsahuje 244 interních osmibitových registrů, pomocí nichž se řídí celý průběh zvukové syntézy – počet registrů je tedy mnohem vyšší, než například u jednodušších zvukových čipů (POKEY: 9 registrů, SID: 29 registrů, AYčko: 14 registrů). Zápis do interního registru musí být proveden ve dvou krocích – výběr registru zápisem jeho čísla na I/O adresu 0×388 a po malém zpoždění zápisem nové hodnoty interního registru na adresu 0×389.
V původním zapojení OPL2 v kartě AdLib je nutné po zápisu do adresového registru (0×388) čekat 3,3 µs a po zápisu do datového registru 23 µs před modifikací dalšího registru. Prakticky se toto časování realizovalo malým trikem: po zápisu do adresového registru se provedlo šest čtení z I/O portu a po zápisu do datového registru 35 čtení z I/O portu. Využívalo se totiž toho, že zatímco vlastní mikroprocesor mohl mít různou hodinovou frekvenci, I/O operace byly stále stejně rychlé (což ovšem nemusela být pravda).
10. Realizace změny jednoho řídicího registru karty OPL2
V demonstračních příkladech, které budou použity ve druhé části dnešního článku, samozřejmě musíme umět nastavovat řídicí registry OPL2. Nejdříve si nadefinujeme adresy použitých I/O portů. Do prvního I/O portu se zapisuje adresa registru, který chceme modifikovat a do druhého portu pak zapisovaná hodnota do registru:
; registry karet s cipem OPL2 OPL_ADDRESS equ 0x388 OPL_DATA equ 0x389
Samotná modifikace vybraného řídicího registru OPL2 je implementována v následujícím podprogramu (subrutině), kterému je nutné v AL předat index registru OPL2 a v AH jeho hodnotu. Subrutina realizuje i potřebné čekací intervaly mezi zápisy a „ničí“ obsahy registrů DX a CL:
perform_write_to_opl_register: ; zapis do vybraneho registru OPL2 ; AL - registr ; AH - hodnota mov dx, OPL_ADDRESS ; vyber registru pro modifikaci out dx, al ; cekani priblizne 3.3 mikrosekundy mov cl, 6 .delay1: in al, dx loop .delay1 mov al, ah ; zapis hodnoty do vybraneho registru mov dx, OPL_DATA out dx, al ; cekani priblizne 23 mikrosekund mov cl, 35 .delay2: in al, dx loop .delay2 ret
11. Řídicí registry čipu OPL2
Víme již, že se OPL2 řídí přes 244 registrů. To je sice velké množství, ovšem tyto registry tvoří skupiny se stejným významem, protože OPL2 obsahuje devět samostatných hudebních kanálů. V této kapitole si všechny řídicí registry vypíšeme i s jejich originálním názvem; podrobnější popis bude uveden dále:
Registr/registry | Oficiální jméno |
---|---|
01 | Test LSI / Enable waveform control |
02 | Timer 1 data (viz kapitolu 5) |
03 | Timer 2 data (viz kapitolu 5) |
04 | Timer control flags (viz kapitolu 5) |
08 | Speech synthesis mode / Keyboard split note select |
20..35 | Amp Mod / Vibrato / EG type / Key Scaling / Multiple |
40..55 | Key scaling level / Operator output level |
60..75 | Attack Rate / Decay Rate |
80..95 | Sustain Level / Release Rate |
A0..A8 | Frequency (low 8 bits) |
B0..B8 | Key On / Octave / Frequency (high 2 bits) |
BD | AM depth / Vibrato depth / Rhythm control |
C0..C8 | Feedback strength / Connection type |
E0..F5 | Wave Select |
Rozsahy 20..35, 40..55 atd. znamenají, že se v daném rozsahu nachází 18 registrů. Vždy dva z těchto registrů slouží pro nastavení parametrů dvou operátorů pro jeden hudební kanál (1–9). Mapování mezi indexem registru, kanálem a operátorem, ovšem není regulární, takže je nutné použít tabulku:
Kanál 1 2 3 4 5 6 7 8 9 Operátor 1 00 01 02 08 09 0A 10 11 12 Operátor 2 03 04 05 0B 0C 0D 13 14 15
12. Operátory a jejich vzájemná vazba
Čip Yamaha YM 3812 generuje zvuk pomocí devíti samostatně nastavitelných hudebních kanálů, přičemž každý kanál obsahuje dvojici takzvaných operátorů, které mohou být navzájem propojeny buď tak, že se oba signály vytvářené v obou operátorech jednoduše sčítají nebo první operátor (modulator) ovlivňuje pomocí fázové modulace tvar signálu vytvářeného druhým operátorem (carrier) – viz následující obrázek.
Každý operátor je složen ze tří bloků – oscilátoru (generátoru periodického signálu o zadané frekvenci), generátoru obálky (envelope) a obvodu pro řízení výstupní úrovně. Každý oscilátor může generovat periodický signál odvozený od klasické sinusovky, jejíž podoba je, jak již bylo řečeno v předchozím textu, uložena (v logaritmické škále) v 256 bajtech paměti ROM přímo na hudebním čipu. Na tomto místě je vhodné říci, že firma Yamaha vyráběla i „originální“ čip YM 3526 (OPL1), který se od YM 3812 odlišoval prakticky pouze v tom, že dokázal pracovat jen se sinusovkou a nikoli s dalšími třemi tvary signálů (OPL3 naopak další čtyři průběhy přidává, mezi jinými i oblíbený obdélníkový signál se širokým, teoreticky nekonečným spektrem).
Základní nastavení společné pro oba operátory (modulátor i nosnou) nalezneme v těchto registrech:
20..35 | Amp Mod / Vibrato / EG type / Key Scaling / Multiple |
40..55 | Key scaling level / Operator output level |
E0..F5 | Wave Select |
První sada registrů 20..35 má pro všechny operátory, tedy jak pro modulátor, tak i pro nosnou, tento formát:
7 6 5 4 3 2 1 0 +-----+-----+-----+-----+-----+-----+-----+-----+ | Amp | Vib | EG | KSR | Modulator Frequency | | Mod | | Typ | | Multiple | +-----+-----+-----+-----+-----+-----+-----+-----+
Význam bitů:
Bit | Význam |
---|---|
7 | povolení AM modulace |
6 | povolení vibrata pro operátor |
5 | způsob interpretace fáze SUSTAIN (viz další kapitolu) |
4 | ? |
3–0 | modifikace základní frekvence tónu v oktávách (-1 oktáva, výchozí oktáva atd.) |
Druhá sada registrů 40..55, které se taktéž nastavují pro všechny operátory, obsahuje úroveň signálu na výstupu:
7 6 5 4 3 2 1 0 +-----+-----+-----+-----+-----+-----+-----+-----+ | Scaling | Total Level | | Level | 24 12 6 3 1.5 .75 | v decibelech +-----+-----+-----+-----+-----+-----+-----+-----+
Nejvyššími dva bity se řídí, zda se bude úroveň signálu snižovat společně s rostoucí frekvencí (00 – vypnuto, 11 – maximální efekt).
A konečně třetí sada registrů E0..F5, které se opět nastavují pro všechny operátory, řídí tvar signálu:
7 6 5 4 3 2 1 0 +-----+-----+-----+-----+-----+-----+-----+-----+ | unused | Waveform | | | Select | +-----+-----+-----+-----+-----+-----+-----+-----+
Možné hodnoty jsou postupně:
- Sinusovka
- Jen kladné vlny sinusovky
- Absolutní hodnota sinusovky
- Pouze půlvlny sinusovky (druhá část periody je nulová)
Následují registry, které jsou společné vždy pro celý kanál, tedy pro oba operátory, které kanál tvoří (nezávisle na jejich propojení).
V registrech A0 až A8 je uloženo spodních osm bitů frekvence kanálu v rámci oktávy. K těmto bitům jsou doplněny dva bity z registrů B0 a B8. Pro základní oktávu můžeme najít následující vztah mezi uloženou 10bitovou hodnotou a frekvencí:
Hodnota (10b) Frekvence Odpovídá notě ---------------------------------------- 16B 277.2 C# 181 293.7 D 198 311.1 D# 1B0 329.6 E 1CA 349.2 F 1E5 370.0 F# 202 392.0 G 220 415.3 G# 241 440.0 A 263 466.2 A# 287 493.9 B 2AE 523.3 C
V registrech B0..B8 je navíc v dalších třech bitech uložena oktáva 0–7 a pátým bitem se povoluje nebo zakazuje výstup kanálu (jedná se o hodnotu KEY ON zmíněnou v navazující kapitole).
13. Obálka typu ADSR
Signál vytvářený v každém operátoru je ovlivněn obálkou (envelope), pomocí níž lze měnit jeho amplitudu. Jedná se o obálku typu ADSR (attack, decay, sustain, release). Základní tvar obálky je určen čtveřicí parametrů – attack rate (doba či strmost náběhu první hrany), decay rate (doba či strmost druhé – klesající/sestupné – hrany), sustain level (stabilní úroveň signálu obálky po prvotním vzrůstu a poklesu, jenž je v programech většinou vyjadřovaná v procentech amplitudy, ovšem v řídicích registrech uložená jako zlomek maximální úrovně) a release rate (doba či strmost poslední – klesající – hrany).
Obrázek 14: Tvar obálky generované pro každý operátor na čipu YM 3812. AR=attack rate, DR=decay rate, SL=sustain level a RR=release rate. Začátek obálky i doba trvání úrovně sustain je určena stavem bitu KEY-ON.
Pro každý z těchto parametrů je v řídicích registrech zvukového čipu YM 3526 vyhrazena čtveřice bitů, což prakticky znamená, že hodnoty attack a decay jsou společně uloženy v jednom osmibitovém registru a hodnoty sustain a release v registru druhém. Tyto registry jsou alokovány pro každý operátor zvlášť:
Registr/registry | Oficiální jméno |
---|---|
60..75 | Attack Rate / Decay Rate |
80..95 | Sustain Level / Release Rate |
Formát registrů 60..75 je následující:
7 6 5 4 3 2 1 0 +-----+-----+-----+-----+-----+-----+-----+-----+ | Attack | Decay | | Rate | Rate | +-----+-----+-----+-----+-----+-----+-----+-----+
Hodnota F znamená nejkratší náběh/doběh, hodnota 1 naopak nejdelší čas. Nastavením nuly se příslušný čas vlastně stane nekonečným.
Formát registrů 80..95:
7 6 5 4 3 2 1 0 +-----+-----+-----+-----+-----+-----+-----+-----+ | Sustain Level | Release | | 24 12 6 3 | Rate | +-----+-----+-----+-----+-----+-----+-----+-----+
Release rate je opět časový úsek, zatímco sustain level je hodnota odvozená od celkové síly signálu.
Povšimněte si, že čtyři výše uvedené parametry nejsou pro úplné popsání tvaru obálky dostatečné. Především chybí určení doby, po kterou si obálka drží úroveň sustain a taktéž amplituda, tj. maximální úroveň signálu obálky v bodě, kde se náběžná hrana attack láme a mění se v sestupnou hranu decay. Tyto dva parametry jsou nastavovány následovně: maximální úroveň signálu obálky je vždy nastavena na 100% a doba úrovně sustain závisí na době, po kterou je bit KEY-ON programově držený v úrovni logické jedničky. Tento bit je rezervovaný pro každý kanál (nikoli pro operátor), jednotlivé kanály je tedy možné ovládat zvlášť, což je pro skutečnou polyfonii (vícehlasou hudbu) nezbytné.
14. Zpětná vazba
Další zajímavou vlastností čipu YM 3812 je možnost zavedení zpětné vazby u prvního operátoru – modulátoru. Pomocí tří bitů lze zvolit zpoždění signálu, který se pomocí zpětné vazby vrací na vstup modulátoru, aby zde byl sečten s původním vstupním signálem. Doba zpoždění není zadána absolutně (to by při změně výšky tónu znamenalo nutnost dobu zpoždění přepočítat), ale relativně s ohledem na frekvenci (periodu signálu) nastavenou pro daný operátor.
Tyto hodnoty jsou nastavovány v registrech C0..C8:
7 6 5 4 3 2 1 0 +-----+-----+-----+-----+-----+-----+-----+-----+ | unused | Feedback | Alg | | | | | +-----+-----+-----+-----+-----+-----+-----+-----+
Bity 3–1 nastavují sílu zpětné vazby, přičemž 0 znamená, že se zpětná vazba neuplatní a 7 znamená, že zpětnovazební signál má nejvyšší váhu.
Nultým bitem se volí způsob vzájemného propojení obou operátorů. FM (resp. přesněji řečeno PM) modulace je použita ve chvíli, kdy je tento bit nulový. Pokud je nastavený na jedničku, bude každý z operátorů pracovat nezávisle jako zdroj tónu (sinusovka nebo její varianty).
15. Perkusní režim
Poslední důležitou vlastností je možnost přepnutí čipu do takzvaného perkusního režimu (percussion mode), který představuje alternativu k výše popsanému melodickému režimu. Zatímco v melodickém režimu lze použít osmnáct operátorů rozdělených po dvojicích do devíti hudebních kanálů, je po přepnutí čipu do režimu perkusního k dispozici šest melodických kanálů (každý obsahuje dva operátory, které se chovají tak, jak byly popsány v předchozích kapitolách) a současně pět kanálů použitých pro bicí nástroje – Bass Drum, Snare Drum, Tom-Tom, Cymbal a Hi-Hat. Pro vytváření zvuků bicích nástrojů je použitý generátor bílého šumu, což je v mnoha ohledech podobné funkcím čipů POKEY, SID či AY-3–8190.
Perkusní režim se řídí registrem BD:
7 6 5 4 3 2 1 0 +-----+-----+-----+-----+-----+-----+-----+-----+ | AM | Vib | Rhy | BD | SD | TOM | Top | HH | | Dep | Dep | Ena | | | | Cym | | +-----+-----+-----+-----+-----+-----+-----+-----+
Význam jednotlivých bitů:
Bit | Stručný popis |
---|---|
7 | řízení AM (viz příští článek) |
6 | síla vibrata (viz příští článek) |
5 | povolení/zákaz perkusního režimu |
4 | Bass drum on/off |
3 | Snare drum on/off |
2 | Tom tom on/off |
1 | Cymbal on/off |
0 | Hi Hat on/off |
16 Nastavení parametrů pro přehrání tónu komorního A
Programování čipu OPL2 není triviální, protože i pro přehrání jednoduchého tónu je nutné (pře)nastavit relativně velké množství registrů. Ukažme si to na jednoduchém příkladu – přehrání komorního A, tedy tónu o frekvenci 440Hz. Musíme provést celkem deset zápisů do deseti různých registrů:
Registr | Hodnota | Ovlivňuje | Popis významu nastavené hodnoty |
---|---|---|---|
0×20 | 0×01 | modulátor | změna násobitele frekvence: použije se původní frekvence |
0×40 | 0×10 | modulátor | nastavení úrovně signálu (zhruba –40dB) |
0×60 | 0×F0 | modulátor | nejrychlejší náběh na maximální úroveň + čas doběhu bude nekonečný |
0×80 | 0×77 | modulátor | úroveň signálu po jeho náběhu a ustálení |
0×A0 | 0×41 | celý kanál | spodních osm bitů frekvence, 0×241 = 440 Hz = komorní A (horní dva bity zde nejsou) |
0×23 | 0×01 | nosná | změna násobitele frekvence: použije se původní frekvence |
0×43 | 0×00 | nosná | nastavení úrovně signálu (max) |
0×63 | 0×F0 | nosná | nejrychlejší náběh na maximální úroveň + čas doběhu bude nekonečný |
0×83 | 0×77 | nosná | úroveň signálu po jeho náběhu a ustálení |
0×B0 | 0×32 | celý kanál | volba oktávy + povolení výstupu zvuku z kanálu |
Povšimněte si, že jsme vlastně nepoužili ADSR obálku, resp. jsme registry nastavili takovým způsobem, že je vlastně tvar obálky tvořen jednotkovým skokem.
17. Praktický příklad: přehrání tónu komorního A
V případě, že využijeme makro write_opl_register, které bylo popsáno v desáté kapitole, bude přehrání tónu prvním zvukovým kanálem vyžadovat následující sekvenci zápisů do registrů čipu OPL2:
write_opl_register 0x20, 0x01 ; nastaveni modulatoru: nasobeni frekvence jednickou write_opl_register 0x40, 0x10 ; uroven vystupu 40 dB write_opl_register 0x60, 0xF0 ; modulator: rychly nastup zvuku + pomale doznivani write_opl_register 0x80, 0x77 ; urovne sustain a release pro modulator write_opl_register 0xA0, 0x41 ; frekvence zvuku (komorni A = 440 Hz) write_opl_register 0x23, 0x01 ; nastaveni nosne: nasobeni frekvence jednickou write_opl_register 0x43, 0x00 ; nastavni urovne vystupu nosne na 47 dB write_opl_register 0x63, 0xF0 ; nosna: rychly nastup + pomale doznivani write_opl_register 0x83, 0x77 ; urovne sustain a release pro nosnou write_opl_register 0xB0, 0x32 ; zapnuti/povoleni zvuku + nastaveni oktavy a vyssich bitu frekvence
Těchto deset zápisů je realizováno v následujícím jednoduchém demu, které je možné si spustit na reálném PC s AdLibem nebo SoundBlasterem a pochopitelně i v emulátoru (DOSBox):
; Prehrani zakladniho tonu na kartach s cipem OPL2. ; ; ; preklad pomoci: ; nasm -f bin -o sound_opl2_basic.com sound_opl2_basic.asm ; ; nebo pouze: ; nasm -o sound_opl2_basic.com sound_opl2_basic.asm ;----------------------------------------------------------------------------- ; registry karet s cipem OPL2 OPL_ADDRESS equ 0x388 OPL_DATA equ 0x389 ;----------------------------------------------------------------------------- ; 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 ; makro pro zapis do registru OPL2 %macro write_opl_register 2 mov al, %1 mov ah, %2 call perform_write_to_opl_register %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: write_opl_register 0x20, 0x01 ; nastaveni modulatoru: nasobeni frekvence jednickou write_opl_register 0x40, 0x10 ; uroven vystupu 40 dB write_opl_register 0x60, 0xF0 ; modulator: rychly nastup zvuku + pomale doznivani write_opl_register 0x80, 0x77 ; urovne sustain a release pro modulator write_opl_register 0xA0, 0x41 ; frekvence zvuku (komorni A = 440 Hz) write_opl_register 0x23, 0x01 ; nastaveni nosne: nasobeni frekvence jednickou write_opl_register 0x43, 0x00 ; nastavni urovne vystupu nosne na 47 dB write_opl_register 0x63, 0xF0 ; nosna: rychly nastup + pomale doznivani write_opl_register 0x83, 0x77 ; urovne sustain a release pro nosnou write_opl_register 0xB0, 0x32 ; zapnuti/povoleni zvuku + nastaveni oktavy a vyssich bitu frekvence wait_key exit perform_write_to_opl_register: ; zapis do vybraneho registru OPL2 ; AL - registr ; AH - hodnota mov dx, OPL_ADDRESS ; vyber registru pro modifikaci out dx, al ; cekani priblizne 3.3 mikrosekundy mov cl, 6 .delay1: in al, dx loop .delay1 mov al, ah ; zapis hodnoty do vybraneho registru mov dx, OPL_DATA out dx, al ; cekani priblizne 23 mikrosekund mov cl, 35 .delay2: in al, dx loop .delay2 ret
18. Zápis hodnot registrů OPL2 do tabulky
Vzhledem k tomu, že neustálé volání makra write_opl_register zbytečně „natahuje“ výsledný programový kód, bude výhodnější si indexy i hodnoty registrů uložit do tabulky a modifikovat registry OPL2 na základě informací přečtených z této tabulky. Na konec tabulky vložíme vhodnou „zarážku“ představovanou registrem číslo 0, který na OPL2 neexistuje:
tone1: ; tabulka s tonem pro prvni kanal db 0x20, 0x01 ; nastaveni modulatoru: nasobeni frekvence jednickou db 0x40, 0x10 ; uroven vystupu 40 dB db 0x60, 0xF0 ; modulator: rychly nastup zvuku + pomale doznivani db 0x80, 0x77 ; urovne sustain a release pro modulator db 0xA0, 0x41 ; frekvence zvuku (komorni A = 440 Hz) db 0x23, 0x01 ; nastaveni nosne: nasobeni frekvence jednickou db 0x43, 0x00 ; nastavni urovne vystupu nosne na 47 dB db 0x63, 0xF0 ; nosna: rychly nastup + pomale doznivani db 0x83, 0x77 ; urovne sustain a release pro nosnou db 0xB0, 0x32 ; zapnuti/povoleni zvuku + nastaveni oktavy a vyssich bitu frekvence db 0, 0 ; zarazka
Přepis programu tak, aby tuto tabulku využil, vlastně není příliš složitý, což je patrné z jeho úplného výpisu:
; Prehrani zakladniho tonu na kartach s cipem OPL2. ; ; ; preklad pomoci: ; nasm -f bin -o sound_opl2_table.com sound_opl2_table.asm ; ; nebo pouze: ; nasm -o sound_opl2_table.com sound_opl2_table.asm ;----------------------------------------------------------------------------- ; registry karet s cipem OPL2 OPL_ADDRESS equ 0x388 OPL_DATA equ 0x389 ;----------------------------------------------------------------------------- ; 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 ; makro pro zapis do registru OPL2 %macro write_opl_register 2 mov al, %1 mov ah, %2 call perform_write_to_opl_register %endmacro ;----------------------------------------------------------------------------- org 0x100 ; zacatek kodu pro programy typu COM (vzdy se zacina na 256) start: push cs pop ds ; DS==CS mov si, tone1 ; zacatek tabulky call write_table_to_opl2 ; zapis obsahu tabulky do OPL2 wait_key exit write_table_to_opl2: lodsb ; nacist bajt z tabulky (cislo registru) or al, al ; test na nulu jnz .write_register ret ; dosahli jsme konce tabulky .write_register: mov ah, al lodsb ; nacist dalsi bajt z tabulky (hodnota registru) xchg al, ah ; podprogram vyzaduje opacne poradi AL, AH call perform_write_to_opl_register jmp write_table_to_opl2 ; muzeme prejit na dalsi registr tone1: ; tabulka s tonem pro prvni kanal db 0x20, 0x01 ; nastaveni modulatoru: nasobeni frekvence jednickou db 0x40, 0x10 ; uroven vystupu 40 dB db 0x60, 0xF0 ; modulator: rychly nastup zvuku + pomale doznivani db 0x80, 0x77 ; urovne sustain a release pro modulator db 0xA0, 0x41 ; frekvence zvuku (komorni A = 440 Hz) db 0x23, 0x01 ; nastaveni nosne: nasobeni frekvence jednickou db 0x43, 0x00 ; nastavni urovne vystupu nosne na 47 dB db 0x63, 0xF0 ; nosna: rychly nastup + pomale doznivani db 0x83, 0x77 ; urovne sustain a release pro nosnou db 0xB0, 0x32 ; zapnuti/povoleni zvuku + nastaveni oktavy a vyssich bitu frekvence db 0, 0 ; zarazka perform_write_to_opl_register: ; zapis do vybraneho registru OPL2 ; AL - registr ; AH - hodnota mov dx, OPL_ADDRESS ; vyber registru pro modifikaci out dx, al ; cekani priblizne 3.3 mikrosekundy mov cl, 6 .delay1: in al, dx loop .delay1 mov al, ah ; zapis hodnoty do vybraneho registru mov dx, OPL_DATA out dx, al ; cekani priblizne 23 mikrosekund mov cl, 35 .delay2: in al, dx loop .delay2 ret
19. Repositář s demonstračními příklady
Demonstrační příklady napsané v assembleru, které jsou určené pro překlad s využitím assembleru NASM, byly uloženy do Git repositáře, který je dostupný na adrese https://github.com/tisnik/8bit-fame. Jednotlivé demonstrační příklady si můžete v případě potřeby stáhnout i jednotlivě bez nutnosti klonovat celý (dnes již poměrně rozsáhlý) repositář:
# | Příklad | Stručný popis | Adresa |
---|---|---|---|
1 | hello.asm | program typu „Hello world“ naprogramovaný v assembleru pro systém DOS | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello.asm |
2 | hello_shorter.asm | kratší varianta výskoku z procesu zpět do DOSu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_shorter.asm |
3 | hello_wait.asm | čekání na stisk klávesy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_wait.asm |
4 | hello_macros.asm | realizace jednotlivých částí programu makrem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hello_macros.asm |
5 | gfx4_putpixel.asm | vykreslení pixelu v grafickém režimu 4 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_putpixel.asm |
6 | gfx6_putpixel.asm | vykreslení pixelu v grafickém režimu 6 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel.asm |
7 | gfx4_line.asm | vykreslení úsečky v grafickém režimu 4 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_line.asm |
8 | gfx6_line.asm | vykreslení úsečky v grafickém režimu 6 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_line.asm |
9 | gfx6_fill1.asm | vyplnění obrazovky v grafickém režimu, základní varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill1.asm |
10 | gfx6_fill2.asm | vyplnění obrazovky v grafickém režimu, varianta s instrukcí LOOP | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill2.asm |
11 | gfx6_fill3.asm | vyplnění obrazovky instrukcí REP STOSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill3.asm |
12 | gfx6_fill4.asm | vyplnění obrazovky, synchronizace vykreslování s paprskem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_fill4.asm |
13 | gfx4_image1.asm | vykreslení rastrového obrázku získaného z binárních dat, základní varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image1.asm |
14 | gfx4_image2.asm | varianta vykreslení rastrového obrázku s využitím instrukce REP MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image2.asm |
15 | gfx4_image3.asm | varianta vykreslení rastrového obrázku s využitím instrukce REP MOVSW | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image3.asm |
16 | gfx4_image4.asm | korektní vykreslení všech sudých řádků bitmapy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image4.asm |
17 | gfx4_image5.asm | korektní vykreslení všech sudých i lichých řádků bitmapy | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image5.asm |
18 | gfx4_image6.asm | nastavení barvové palety před vykreslením obrázku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image6.asm |
19 | gfx4_image7.asm | nastavení barvové palety před vykreslením obrázku, snížená intenzita barev | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image7.asm |
20 | gfx4_image8.asm | postupná změna barvy pozadí | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx4_image8.asm |
21 | gfx6_putpixel1.asm | vykreslení pixelu, základní varianta se 16bitovým násobením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel1.asm |
22 | gfx6_putpixel2.asm | vykreslení pixelu, varianta s osmibitovým násobením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel2.asm |
23 | gfx6_putpixel3.asm | vykreslení pixelu, varianta bez násobení | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel3.asm |
24 | gfx6_putpixel4.asm | vykreslení pixelu přes obrázek, nekorektní chování (přepis obrázku) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel4.asm |
25 | gfx6_putpixel5.asm | vykreslení pixelu přes obrázek, korektní varianta pro bílé pixely | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/gfx6_putpixel5.asm |
26 | cga_text_mode1.asm | standardní textový režim s rozlišením 40×25 znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode1.asm |
27 | cga_text_mode3.asm | standardní textový režim s rozlišením 80×25 znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode3.asm |
28 | cga_text_mode_intensity.asm | změna významu nejvyššího bitu atributového bajtu: vyšší intenzita namísto blikání | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_intensity.asm |
29 | cga_text_mode_cursor.asm | změna tvaru textového kurzoru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_cursor.asm |
30 | cga_text_gfx1.asm | zobrazení „rastrové mřížky“: pseudografický režim 160×25 pixelů (interně textový režim) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_gfx1.asm |
31 | cga_text_mode_char_height.asm | změna výšky znaků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_mode_char_height.asm |
32 | cga_text_160×100.asm | grafický režim 160×100 se šestnácti barvami (interně upravený textový režim) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/cga_text_160×100.asm |
33 | hercules_text_mode1.asm | využití standardního textového režimu společně s kartou Hercules | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_text_mode1.asm |
34 | hercules_text_mode2.asm | zákaz blikání v textových režimech | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_text_mode2.asm |
35 | hercules_turn_off.asm | vypnutí generování video signálu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_turn_off.asm |
36 | hercules_gfx_mode1.asm | přepnutí karty Hercules do grafického režimu (základní varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_gfx_mode1.asm |
37 | hercules_gfx_mode2.asm | přepnutí karty Hercules do grafického režimu (vylepšená varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_gfx_mode2.asm |
38 | hercules_putpixel.asm | subrutina pro vykreslení jediného pixelu na kartě Hercules | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_putpixel.asm |
39 | ega_text_mode_80×25.asm | standardní textový režim 80×25 znaků na kartě EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_text_mode_80×25.asm |
40 | ega_text_mode_80×43.asm | zobrazení 43 textových řádků na kartě EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_text_mode_80×43.asm |
41 | ega_gfx_mode_320×200.asm | přepnutí do grafického režimu 320×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_320×200.asm |
42 | ega_gfx_mode_640×200.asm | přepnutí do grafického režimu 640×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_640×200.asm |
43 | ega_gfx_mode_640×350.asm | přepnutí do grafického režimu 640×350 pixelů se čtyřmi nebo šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_640×350.asm |
44 | ega_gfx_mode_bitplanes1.asm | ovládání zápisu do bitových rovin v planárních grafických režimech (základní způsob) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_bitplanes1.asm |
45 | ega_gfx_mode_bitplanes2.asm | ovládání zápisu do bitových rovin v planárních grafických režimech (rychlejší způsob) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_gfx_mode_bitplanes2.asm |
46 | ega_320×200_putpixel.asm | vykreslení pixelu v grafickém režimu 320×200 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_320×200_putpixel.asm |
47 | ega_640×350_putpixel.asm | vykreslení pixelu v grafickém režimu 640×350 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_640×350_putpixel.asm |
48 | ega_standard_font.asm | použití standardního fontu grafické karty EGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_standard_font.asm |
49 | ega_custom_font.asm | načtení vlastního fontu s jeho zobrazením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_custom_font.asm |
50 | ega_palette1.asm | změna barvové palety (všech 16 barev) v grafickém režimu 320×200 se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette1.asm |
51 | ega_palette2.asm | změna barvové palety (všech 16 barev) v grafickém režimu 640×350 se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette2.asm |
52 | ega_palette3.asm | změna všech barev v barvové paletě s využitím programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette3.asm |
53 | ega_palette4.asm | změna všech barev, včetně barvy okraje, v barvové paletě voláním funkce BIOSu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/ega_palette4.asm |
54 | vga_text_mode_80×25.asm | standardní textový režim 80×25 znaků na kartě VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_80×25.asm |
55 | vga_text_mode_80×50.asm | zobrazení 50 a taktéž 28 textových řádků na kartě VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_80×50.asm |
56 | vga_text_mode_intensity1.asm | změna chování atributového bitu pro blikání (nebezpečná varianta změny registrů) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_intensity1.asm |
57 | vga_text_mode_intensity2.asm | změna chování atributového bitu pro blikání (bezpečnější varianta změny registrů) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_intensity2.asm |
58 | vga_text_mode_9th_column.asm | modifikace způsobu zobrazení devátého sloupce ve znakových režimech (720 pixelů na řádku) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_9th_column.asm |
59 | vga_text_mode_cursor_shape.asm | změna tvaru textového kurzoru na grafické kartě VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_cursor_shape.asm |
60 | vga_text_mode_custom_font.asm | načtení vlastního fontu s jeho zobrazením | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_text_mode_custom_font.asm |
61 | vga_gfx_mode_640×480.asm | přepnutí do grafického režimu 640×480 pixelů se šestnácti barvami, vykreslení vzorků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_640×480.asm |
62 | vga_gfx_mode_320×200.asm | přepnutí do grafického režimu 320×200 pixelů s 256 barvami, vykreslení vzorků | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_320×200.asm |
63 | vga_gfx_mode_palette.asm | změna všech barev v barvové paletě grafické karty VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_palette.asm |
64 | vga_gfx_mode_dac1.asm | využití DAC (neočekávané výsledky) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac1.asm |
65 | vga_gfx_mode_dac2.asm | využití DAC (očekávané výsledky) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac2.asm |
66 | vga_640×480_putpixel.asm | realizace algoritmu pro vykreslení pixelu v grafickém režimu 640×480 pixelů se šestnácti barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_640×480_putpixel.asm |
67 | vga_320×200_putpixel1.asm | realizace algoritmu pro vykreslení pixelu v grafickém režimu 320×200 s 256 barvami (základní varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel1.asm |
68 | vga_320×200_putpixel2.asm | realizace algoritmu pro vykreslení pixelu v grafickém režimu 320×200 s 256 barvami (rychlejší varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_putpixel2.asm |
69 | vga_gfx_mode_dac3.asm | přímé využití DAC v grafickém režimu 13h | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_dac3.asm |
70 | vga_gfx_mode_unchained_step1.asm | zobrazení barevných pruhů v režimu 13h | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step1.asm |
71 | vga_gfx_mode_unchained_step2.asm | vypnutí zřetězení bitových rovin a změna způsobu adresování pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step2.asm |
72 | vga_gfx_mode_unchained_step3.asm | vykreslení barevných pruhů do vybraných bitových rovin | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_unchained_step3.asm |
73 | vga_gfx_mode_320×400.asm | nestandardní grafický režim s rozlišením 320×400 pixelů a 256 barvami | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_gfx_mode_320×400.asm |
74 | vga_320×200_image.asm | zobrazení rastrového obrázku ve standardním grafickém režimu 320×200 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image.asm |
75 | vga_320×200_unchained_image1.asm | zobrazení rastrového obrázku v režimu s nezřetězenými rovinami (nekorektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_unchained_image1.asm |
76 | vga_320×200_unchained_image2.asm | zobrazení rastrového obrázku v režimu s nezřetězenými rovinami (korektní řešení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_unchained_image2.asm |
77 | vga_320×400_unchained_image.asm | zobrazení rastrového obrázku v nestandardním režimu 320×400 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_unchained_image.asm |
78 | vga_vertical_scroll1.asm | vertikální scrolling na kartě VGA v režimu s rozlišením 320×200 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_vertical_scroll1.asm |
79 | vga_vertical_scroll2.asm | vertikální scrolling na kartě VGA v režimu s rozlišením 320×400 pixelů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_vertical_scroll2.asm |
80 | vga_split_screen1.asm | režim split-screen a scrolling, nefunční varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_split_screen1.asm |
81 | vga_split_screen2.asm | režim split-screen a scrolling, plně funkční varianta | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_split_screen2.asm |
82 | vga_horizontal_scroll1.asm | horizontální scrolling bez rozšíření počtu pixelů na virtuálním řádku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll1.asm |
83 | vga_horizontal_scroll2.asm | horizontální scrolling s rozšířením počtu pixelů na virtuálním řádku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll2.asm |
84 | vga_horizontal_scroll3.asm | jemný horizontální scrolling s rozšířením počtu pixelů na virtuálním řádku | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_horizontal_scroll3.asm |
85 | vga_320×240_image.asm | nastavení grafického režimu Mode-X, načtení a vykreslení obrázku, scrolling | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×240_image.asm |
86 | io.asm | knihovna maker pro I/O operace | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/io.asm |
87 | vga_lib.asm | knihovna maker a podprogramů pro programování karty VGA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_lib.asm |
88 | vga_320×240_lib.asm | nastavení grafického režimu Mode-X, tentokrát knihovními funkcemi | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×240_lib.asm |
89 | vga_bitblt1.asm | první (naivní) implementace operace BitBLT | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt1.asm |
90 | vga_bitblt2.asm | operace BitBLT s výběrem bitových rovin pro zápis | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt2.asm |
91 | vga_bitblt3.asm | operace BitBLT s výběrem bitových rovin pro čtení i zápis | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt3.asm |
92 | vga_bitblt4.asm | korektní BitBLT pro 16barevný režim, realizace makry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt4.asm |
93 | vga_bitblt5.asm | korektní BitBLT pro 16barevný režim, realizace podprogramem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt5.asm |
94 | vga_bitblt_rotate.asm | zápisový režim s rotací bajtu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt_rotate.asm |
95 | vga_bitblt_fast.asm | rychlá korektní 32bitová operace typu BitBLT | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_bitblt_fast.asm |
96 | vga_320×400_bitblt1.asm | přenos obrázku v režimu 320×400 operací BitBLT (neúplná varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_bitblt1.asm |
97 | vga_320×400_bitblt2.asm | přenos obrázku v režimu 320×400 operací BitBLT (úplná varianta) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×400_bitblt2.asm |
98 | vga_write_modes1.asm | volitelné zápisové režimy grafické karty VGA, zápis bez úpravy latche | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes1.asm |
99 | vga_write_modes2.asm | volitelné zápisové režimy grafické karty VGA, zápis s modifikací latche | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes2.asm |
100 | vga_write_modes3.asm | volitelné zápisové režimy grafické karty VGA, cílená modifikace latche vzorkem | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_write_modes3.asm |
101 | instruction_jump.asm | použití instrukce JMP | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jump.asm |
102 | instruction_jnz.asm | použití instrukce JNZ pro realizaci programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jnz.asm |
103 | instruction_jz_jmp.asm | použití instrukcí JZ a JMP pro realizaci programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_jz_jmp.asm |
104 | instruction_loop.asm | použití instrukce LOOP pro realizaci programové smyčky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_loop.asm |
105 | instruction_template.asm | šablona všech následujících demonstračních příkladů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_template.asm |
106 | instruction_print_hex.asm | tisk osmibitové hexadecimální hodnoty | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_print_hex.asm |
107 | instruction_xlat.asm | využití instrukce XLAT pro získání tisknutelné hexadecimální cifry | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_xlat.asm |
108 | instruction_daa.asm | operace součtu s využitím binární i BCD aritmetiky | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_daa.asm |
109 | instruction_daa_sub.asm | instrukce DAA po provedení operace rozdílu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_daa_sub.asm |
110 | instruction_das.asm | instrukce DAS po provedení operace rozdílu | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_das.asm |
111 | instruction_aaa.asm | korekce výsledku na jedinou BCD cifru operací AAA | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_aaa.asm |
112 | instruction_mul.asm | ukázka výpočtu součinu dvou osmibitových hodnot | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_mul.asm |
113 | instruction_aam.asm | BCD korekce po výpočtu součinu instrukcí AAM | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_aam.asm |
114 | instruction_stosb.asm | blokový zápis dat instrukcí STOSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_stosb.asm |
115 | instruction_rep_stosb.asm | opakované provádění instrukce STOSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_stosb.asm |
116 | instruction_lodsb.asm | čtení dat instrukcí LODSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_lodsb.asm |
117 | instruction_movsb.asm | přenos jednoho bajtu instrukcí MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_movsb.asm |
118 | instruction_rep_movsb.asm | blokový přenos po bajtech instrukcí MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_movsb.asm |
119 | instruction_rep_scas.asm | vyhledávání v řetězci instrukcí SCAS | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/instruction_rep_scas.asm |
120 | vga_320×200_image_0B.asm | výsledek blokového přenosu ve chvíli, kdy je CX=0 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_0B.asm |
121 | vga_320×200_image_64kB.asm | výsledek blokového přenosu ve chvíli, kdy je CX=0×ffff | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_64kB.asm |
122 | vga_320×200_image_movsb.asm | blokový přenos v rámci obrazové paměti instrukcí REP MOVSB | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb.asm |
123 | vga_320×200_image_movsw.asm | blokový přenos v rámci obrazové paměti instrukcí REP MOVSW | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsw.asm |
124 | vga_320×200_image_movsd.asm | blokový přenos v rámci obrazové paměti instrukcí REP MOVSD | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsd.asm |
125 | vga_320×200_image_movsb_forward.asm | blokový přenos překrývajících se bloků paměti (zvyšující se adresy) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_forward.asm |
126 | vga_320×200_image_movsb_backward1.asm | blokový přenos překrývajících se bloků paměti (snižující se adresy, nekorektní nastavení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_backward1.asm |
127 | vga_320×200_image_movsb_backward2.asm | blokový přenos překrývajících se bloků paměti (snižující se adresy, korektní nastavení) | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_movsb_backward2.asm |
128 | sound_bell.asm | přehrání zvuku pomocí tisku ASCII znaku BELL | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_bell.asm |
129 | sound_beep.asm | přehrání zvuku o zadané frekvenci na PC Speakeru | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_beep.asm |
130 | sound_play_pitch.asm | přehrání zvuku o zadané frekvenci na PC Speakeru, použití maker | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_play_pitch.asm |
131 | sound_opl2_basic.asm | přehrání komorního A na OPL2 | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_basic.asm |
132 | sound_opl2_table.asm | přehrání komorního A na OPL2, použití tabulky s hodnotami registrů | https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_table.asm |
20. Odkazy na Internetu
- The Intel 8088 Architecture and Instruction Set
https://people.ece.ubc.ca/~edc/464/lectures/lec4.pdf - x86 Opcode Structure and Instruction Overview
https://pnx.tf/files/x86_opcode_structure_and_instruction_overview.pdf - x86 instruction listings (Wikipedia)
https://en.wikipedia.org/wiki/X86_instruction_listings - x86 assembly language (Wikipedia)
https://en.wikipedia.org/wiki/X86_assembly_language - Intel Assembler (Cheat sheet)
http://www.jegerlehner.ch/intel/IntelCodeTable.pdf - 25 Microchips That Shook the World
https://spectrum.ieee.org/tech-history/silicon-revolution/25-microchips-that-shook-the-world - Chip Hall of Fame: MOS Technology 6502 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-mos-technology-6502-microprocessor - Chip Hall of Fame: Intel 8088 Microprocessor
https://spectrum.ieee.org/tech-history/silicon-revolution/chip-hall-of-fame-intel-8088-microprocessor - Jak se zrodil procesor?
https://www.root.cz/clanky/jak-se-zrodil-procesor/ - Apple II History Home
http://apple2history.org/ - The 8086/8088 Primer
https://www.stevemorse.org/8086/index.html - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - INT 21 – DOS Function Dispatcher (DOS)
https://www.stanislavs.org/helppc/int21.html - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - Bit banging
https://en.wikipedia.org/wiki/Bit_banging - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Bootloaders
https://en.wikibooks.org/wiki/X86_Assembly/Bootloaders - Počátky grafiky na PC: grafické karty CGA a Hercules
https://www.root.cz/clanky/pocatky-grafiky-na-pc-graficke-karty-cga-a-hercules/ - Co mají společného Commodore PET/4000, BBC Micro, Amstrad CPC i grafické karty MDA, CGA a Hercules?
https://www.root.cz/clanky/co-maji-spolecneho-commodore-pet-4000-bbc-micro-amstrad-cpc-i-graficke-karty-mda-cga-a-hercules/ - Karta EGA: první použitelná barevná grafika na PC
https://www.root.cz/clanky/karta-ega-prvni-pouzitelna-barevna-grafika-na-pc/ - RGB Classic Games
https://www.classicdosgames.com/ - Turbo Assembler (Wikipedia)
https://en.wikipedia.org/wiki/Turbo_Assembler - Microsoft Macro Assembler
https://en.wikipedia.org/wiki/Microsoft_Macro_Assembler - IBM Personal Computer (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Personal_Computer - Intel 8251
https://en.wikipedia.org/wiki/Intel_8251 - Intel 8253
https://en.wikipedia.org/wiki/Intel_8253 - Intel 8255
https://en.wikipedia.org/wiki/Intel_8255 - Intel 8257
https://en.wikipedia.org/wiki/Intel_8257 - Intel 8259
https://en.wikipedia.org/wiki/Intel_8259 - Support/peripheral/other chips – 6800 family
http://www.cpu-world.com/Support/6800.html - Motorola 6845
http://en.wikipedia.org/wiki/Motorola_6845 - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - CRTC operation
http://www.6502.org/users/andre/hwinfo/crtc/crtc.html - 6845 – Motorola CRT Controller
https://stanislavs.org/helppc/6845.html - The 6845 Cathode Ray Tube Controller (CRTC)
http://www.tinyvga.com/6845 - Motorola 6845 and bitwise graphics
https://retrocomputing.stackexchange.com/questions/10996/motorola-6845-and-bitwise-graphics - IBM Monochrome Display Adapter
http://en.wikipedia.org/wiki/Monochrome_Display_Adapter - Color Graphics Adapter
http://en.wikipedia.org/wiki/Color_Graphics_Adapter - Color Graphics Adapter and the Brown color in IBM 5153 Color Display
https://www.aceinnova.com/en/electronics/cga-and-the-brown-color-in-ibm-5153-color-display/ - The Modern Retrocomputer: An Arduino Driven 6845 CRT Controller
https://hackaday.com/2017/05/14/the-modern-retrocomputer-an-arduino-driven-6845-crt-controller/ - flat assembler: Assembly language resources
https://flatassembler.net/ - FASM na Wikipedii
https://en.wikipedia.org/wiki/FASM - Fresh IDE FASM inside
https://fresh.flatassembler.net/ - MS-DOS Version 4.0 Programmer's Reference
https://www.pcjs.org/documents/books/mspl13/msdos/dosref40/ - INT 21 – DOS Function Dispatcher (DOS)
https://www.stanislavs.org/helppc/int21.html - DOS API (Wikipedia)
https://en.wikipedia.org/wiki/DOS_API - IBM Basic assembly language and successors (Wikipedia)
https://en.wikipedia.org/wiki/IBM_Basic_assembly_language_and_successors - X86 Assembly/Arithmetic
https://en.wikibooks.org/wiki/X86_Assembly/Arithmetic - Art of Assembly – Arithmetic Instructions
http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter6/CH06–2.html - ASM Flags
http://www.cavestory.org/guides/csasm/guide/asm_flags.html - Status Register
https://en.wikipedia.org/wiki/Status_register - Linux assemblers: A comparison of GAS and NASM
http://www.ibm.com/developerworks/library/l-gas-nasm/index.html - Programovani v assembleru na OS Linux
http://www.cs.vsb.cz/grygarek/asm/asmlinux.html - Is it worthwhile to learn x86 assembly language today?
https://www.quora.com/Is-it-worthwhile-to-learn-x86-assembly-language-today?share=1 - Why Learn Assembly Language?
http://www.codeproject.com/Articles/89460/Why-Learn-Assembly-Language - Is Assembly still relevant?
http://programmers.stackexchange.com/questions/95836/is-assembly-still-relevant - Why Learning Assembly Language Is Still a Good Idea
http://www.onlamp.com/pub/a/onlamp/2004/05/06/writegreatcode.html - Assembly language today
http://beust.com/weblog/2004/06/23/assembly-language-today/ - Assembler: Význam assembleru dnes
http://www.builder.cz/rubriky/assembler/vyznam-assembleru-dnes-155960cz - Programming from the Ground Up Book – Summary
http://savannah.nongnu.org/projects/pgubook/ - DOSBox
https://www.dosbox.com/ - The C Programming Language
https://en.wikipedia.org/wiki/The_C_Programming_Language - Hercules Graphics Card (HCG)
https://en.wikipedia.org/wiki/Hercules_Graphics_Card - Complete 8086 instruction set
https://content.ctcd.edu/courses/cosc2325/m22/docs/emu8086ins.pdf - Complete 8086 instruction set
https://yassinebridi.github.io/asm-docs/8086_instruction_set.html - 8088 MPH by Hornet + CRTC + DESiRE (final version)
https://www.youtube.com/watch?v=hNRO7lno_DM - Area 5150 by CRTC & Hornet (Party Version) / IBM PC+CGA Demo, Hardware Capture
https://www.youtube.com/watch?v=fWDxdoRTZPc - 80×86 Integer Instruction Set Timings (8088 – Pentium)
http://aturing.umcs.maine.edu/~meadow/courses/cos335/80×86-Integer-Instruction-Set-Clocks.pdf - Colour Graphics Adapter: Notes
https://www.seasip.info/VintagePC/cga.html - Restoring A Vintage CGA Card With Homebrew HASL
https://hackaday.com/2024/06/12/restoring-a-vintage-cga-card-with-homebrew-hasl/ - Demoing An 8088
https://hackaday.com/2015/04/10/demoing-an-8088/ - Video Memory Layouts
http://www.techhelpmanual.com/89-video_memory_layouts.html - Screen Attributes
http://www.techhelpmanual.com/87-screen_attributes.html - IBM PC Family – BIOS Video Modes
https://www.minuszerodegrees.net/video/bios_video_modes.htm - EGA Functions
https://cosmodoc.org/topics/ega-functions/#the-hierarchy-of-the-ega - Why the EGA can only use 16 of its 64 colours in 200-line modes
https://www.reenigne.org/blog/why-the-ega-can-only-use-16-of-its-64-colours-in-200-line-modes/ - How 16 colors saved PC gaming – the story of EGA graphics
https://www.custompc.com/retro-tech/ega-graphics - List of 16-bit computer color palettes
https://en.wikipedia.org/wiki/List_of16-bit_computer_color_palettes - Why were those colors chosen to be the default palette for 256-color VGA?
https://retrocomputing.stackexchange.com/questions/27994/why-were-those-colors-chosen-to-be-the-default-palette-for-256-color-vga - VGA Color Palettes
https://www.fountainware.com/EXPL/vga_color_palettes.htm - Hardware Level VGA and SVGA Video Programming Information Page
http://www.osdever.net/FreeVGA/vga/vga.htm - Hardware Level VGA and SVGA Video Programming Information Page – sequencer
http://www.osdever.net/FreeVGA/vga/seqreg.htm - VGA Basics
http://www.brackeen.com/vga/basics.html - Introduction to VGA Mode ‚X‘
https://web.archive.org/web/20160414072210/http://fly.srk.fer.hr/GDM/articles/vgamodex/vgamx1.html - VGA Mode-X
https://web.archive.org/web/20070123192523/http://www.gamedev.net/reference/articles/article356.asp - Mode-X: 256-Color VGA Magic
https://downloads.gamedev.net/pdf/gpbb/gpbb47.pdf - Instruction Format in 8086 Microprocessor
https://www.includehelp.com/embedded-system/instruction-format-in-8086-microprocessor.aspx - How to use „AND,“ „OR,“ and „XOR“ modes for VGA Drawing
https://retrocomputing.stackexchange.com/questions/21936/how-to-use-and-or-and-xor-modes-for-vga-drawing - VGA Hardware
https://wiki.osdev.org/VGA_Hardware - Programmer's Guide to Yamaha YMF 262/OPL3 FM Music Synthesizer
https://moddingwiki.shikadi.net/wiki/OPL_chip - Does anybody understand how OPL2 percussion mode works?
https://forum.vcfed.org/index.php?threads/does-anybody-understand-how-opl2-percussion-mode-works.60925/ - Yamaha YMF262 OPL3 music – MoonDriver for OPL3 DEMO [Oscilloscope View]
https://www.youtube.com/watch?v=a7I-QmrkAak - Yamaha OPL vs OPL2 vs OPL3 comparison
https://www.youtube.com/watch?v=5knetge5Gs0 - OPL3 Music Crockett's Theme
https://www.youtube.com/watch?v=HXS008pkgSQ - Bad Apple (Adlib Tracker – OPL3)
https://www.youtube.com/watch?v=2lEPH6Y3Luo - FM Synthesis Chips, Codecs and DACs
https://www.dosdays.co.uk/topics/fm_synthesizers.php - The Zen Challenge – YMF262 OPL3 Original (For an upcoming game)
https://www.youtube.com/watch?v=6JlFIFz1CFY - [adlib tracker II techno music – opl3] orbit around alpha andromedae I
https://www.youtube.com/watch?v=YqxJCu_WFuA - [adlib tracker 2 music – opl3 techno] hybridisation process on procyon-ii
https://www.youtube.com/watch?v=daSV5mN0sJ4 - Hyper Duel – Black Rain (YMF262 OPL3 Cover)
https://www.youtube.com/watch?v=pu_mzRRq8Ho - IBM 5155–5160 Technical Reference
https://www.minuszerodegrees.net/manuals/IBM/IBM_5155_5160_Technical_Reference_6280089_MAR86.pdf - a ymf262/opl3+pc speaker thing i made
https://www.youtube.com/watch?v=E-Mx0lEmnZ0 - [OPL3] Like a Thunder
https://www.youtube.com/watch?v=MHf06AGr8SU - (PC SPEAKER) bad apple
https://www.youtube.com/watch?v=LezmKIIHyUg - Powering devices from PC parallel port
http://www.epanorama.net/circuits/lptpower.html - Magic Mushroom (demo pro PC s DOSem)
http://www.crossfire-designs.de/download/articles/soundcards//mushroom.rar - Píseň Magic Mushroom – originál
http://www.crossfire-designs.de/download/articles/soundcards/speaker_mushroom_converted.mp3 - Píseň Magic Mushroom – hráno na PC Speakeru
http://www.crossfire-designs.de/download/articles/soundcards/speaker_mushroom_speaker.mp3 - Pulse Width Modulation (PWM) Simulation Example
http://decibel.ni.com/content/docs/DOC-4599 - Resistor/Pulse Width Modulation DAC
http://www.k9spud.com/traxmod/pwmdac.php - Class D Amplifier
http://en.wikipedia.org/wiki/Electronic_amplifier#Class_D - Covox Speech Thing / Disney Sound Source (1986)
http://www.crossfire-designs.de/index.php?lang=en&what=articles&name=showarticle.htm&article=soundcards/&page=5 - Covox Digital-Analog Converter (Rusky, obsahuje schémata)
http://phantom.sannata.ru/konkurs/netskater002.shtml - PC-GPE on the Web
http://bespin.org/~qz/pc-gpe/ - Keyboard Synthesizer
http://www.solarnavigator.net/music/instruments/keyboards.htm - FMS – Fully Modular Synthesizer
http://fmsynth.sourceforge.net/ - Javasynth
http://javasynth.sourceforge.net/ - Software Sound Synthesis & Music Composition Packages
http://www.linux-sound.org/swss.html - Mx44.1 Download Page (software synthesizer for linux)
http://hem.passagen.se/ja_linux/ - Software synthesizer
http://en.wikipedia.org/wiki/Software_synthesizer - Frequency modulation synthesis
http://en.wikipedia.org/wiki/Frequency_modulation_synthesis - Yamaha DX7
http://en.wikipedia.org/wiki/Yamaha_DX7 - Wave of the Future
http://www.wired.com/wired/archive/2.03/waveguides_pr.html - Analog synthesizer
http://en.wikipedia.org/wiki/Analog_synthesizer - Minimoog
http://en.wikipedia.org/wiki/Minimoog - Moog synthesizer
http://en.wikipedia.org/wiki/Moog_synthesizer - Tutorial for Frequency Modulation Synthesis
http://www.sfu.ca/~truax/fmtut.html - An Introduction To FM
http://ccrma.stanford.edu/software/snd/snd/fm.html - John Chowning
http://en.wikipedia.org/wiki/John_Chowning - I'm Impressed, Adlib Music is AMAZING!
https://www.youtube.com/watch?v=PJNjQYp1ras