Hlavní navigace

Zvuky a hudba na platformě IBM PC: čip OPL2 aneb Yamaha YM3812

8. 10. 2024
Doba čtení: 50 minut

Sdílet

 Autor: Finnianhughes101, podle licence: Public Domain
Zaměříme se na čip OPL2 (Yamaha YM3812), který umožňoval tvorbu hudby s využitím syntézy založené na frekvenční (správně spíše fázové) modulaci. Na PC se jednalo o přelomový koncept a OPL2 byl použit v mnoha hrách i demech.

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

4. Princip činnosti OPL

5. Časovače na čipu OPL2

6. Externí D/A převodník

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

9. Programování čipu OPL2

10. Realizace změny jednoho řídicího registru karty OPL2

11. Řídicí registry čipu OPL2

12. Operátory a jejich vzájemná vazba

13. Obálka typu ADSR

14. Zpětná vazba

15. Perkusní režim

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

20. Odkazy na Internetu

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.

Poznámka: později si řekneme, že kromě OPL2 vznikl i čip OPL3, v němž jeden hudební kanál obsahoval celkem čtyři operátory. V takovém případě již byly možnosti propojení těchto operátorů mnohem větší, než  případě operátorů dvou.

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 board

Obrá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ě:

  1. Sinusovka
  2. Jen kladné vlny sinusovky
  3. Absolutní hodnota sinusovky
  4. 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.

Poznámka: pokud chcete vypnout FM (PM) syntézu a dostat tak na výstupu čistou sinusovku, je nutné nastavit i nultý bit v registru 0×C0.

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:

bitcoin_skoleni

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_mov­sb_forward.asm
126 vga_320×200_image_movsb_backward1.asm blokový přenos překrývajících se bloků paměti (snižující se adresy, nekorektní nastavení) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_mov­sb_backward1.asm
127 vga_320×200_image_movsb_backward2.asm blokový přenos překrývajících se bloků paměti (snižující se adresy, korektní nastavení) https://github.com/tisnik/8bit-fame/blob/master/pc-dos/vga_320×200_image_mov­sb_backward2.asm
       
128 sound_bell.asm přehrání zvuku pomocí tisku ASCII znaku BELL https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_bell.asm
129 sound_beep.asm přehrání zvuku o zadané frekvenci na PC Speakeru https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_beep.asm
130 sound_play_pitch.asm přehrání zvuku o zadané frekvenci na PC Speakeru, použití maker https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_play_pitch.asm
       
131 sound_opl2_basic.asm přehrání komorního A na OPL2 https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_basic.asm
132 sound_opl2_table.asm přehrání komorního A na OPL2, použití tabulky s hodnotami registrů https://github.com/tisnik/8bit-fame/blob/master/pc-dos/sound_opl2_table.asm

20. Odkazy na Internetu

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

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

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

Autor článku

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