Obsah
1. Podrobnější popis možností zvukového čipu řady AY-3–8910
3. Průběh a frekvenční spektru komorního A
4. Průběh zvukového signálu o vysoké frekvenci
5. Průběh zvukového signálu o nízké frekvenci
6. Přehrání dvou tónů současně
8. Průběh a frekvenční spektrum šumu
10. Použití obálek pro modifikaci (modulaci) tónu
11. Čistý tón modifikovaný periodicky se opakující obálkou ve tvaru pily
12. Průběh zvukového signálu modifikovaného s využitím obálky ve tvaru pily
13. Použití obálky ve tvaru trojúhelníku v případě, že se frekvence tónu a obálky přibližují
14. Použití obálky ve tvaru trojúhelníku v případě, že jsou frekvence tónu a obálky velmi rozdílné
15. Kombinace šumu s generátorem obálky
18. Příloha: upravený soubor Makefile pro překlad demonstračních příkladů
19. Repositář s demonstračními příklady
1. Podrobnější popis možností zvukového čipu řady AY-3–8910
V dnešní části seriálu o tvorbě her i dalších aplikací určených pro slavné ZX Spectrum se ještě jednou vrátíme ke zvukovému čipu řady AY-3–8910, který je použit ve Spectru 128k, ale i v některých dalších rozšiřujících modulech pro ZX Spectrum (například československý Melodik). Ukážeme si průběhy i frekvenční charakteristiky signálů, které lze naměřit na zvukovém výstupu ZX Spectra. Samozřejmě nezapomeneme ani na možnost tvorby šumu či na použití obálek (envelope) u složitějších zvuků.
2. Přehrání komorního A
Připomeňme si, jakým způsobem je nutné zvukový čip AY-3–891× nastavit takovým způsobem, aby se začala přehrávat nota komorní A, tedy (ideálně čistý) tón o frekvenci 440 Hz. Je nutné nastavit tři hodnoty:
- Hodnotu dělitele frekvence tak, aby se vygeneroval tón o kýžené frekvenci (přes registry R0 a R1 pro kanál A)
- Hlasitost v rozsahu 0..15 (přes registr R8 pro kanál A)
- Bitovou masku, která povolí zvukový výstup ze zvoleného kanálu A, B či C (pro tento účel se používá společný registr R7)
Hodnotu dělitele frekvence vypočteme následujícím způsobem:
- Hodinová frekvence na ZX Spectru 128k je rovna 3546900 Hz
- Frekvence vstupního CLK po vydělení hodinové frekvence dvěma v ULA je rovna: fmaster = 1773400 Hz
- Frekvence po vydělení 16: fmaster/16 = 1773400 / 16 = 110837 Hz
- Nota, která se má zahrát: 440 Hz
- Potřebná konstanta pro dělič: 110837 / 440 = 251
- Hodnota vyšších 4 bitů ukládaná do řídicího registru R1: int(251/256) = 0
- Hodnota nižších 8 bitů ukládaná do řídicího registru R0: 251 mod 256 = 251
Potřebnou hodnotu děliče frekvence již známe, takže si ukažme program v assembleru, který toto nastavení provede. Komorní A se čipem AY-3–8910 (resp. AY-3–8912) vygeneruje následujícím způsobem:
ENTRY_POINT equ $8000
AY_SELECT_REGISTER equ $fffd
AY_DATA_REGISTER equ $bffd
org ENTRY_POINT
start:
ld d, 0 ; výška tónu (spodní bajt)
ld e, 251
call ay_write ; zápis hodnoty do AY
ld d, 1 ; výška tónu (horní bajt)
ld e, 0
call ay_write ; zápis hodnoty do AY
ld d, 8 ; hlasitost kanálu A
ld e, 15 ; maximální hlasitost
call ay_write ; zápis hodnoty do AY
ld d, 7 ; povolení výstupu z kanálu A
ld e, %11111110 ; bitová maska
call ay_write ; zápis hodnoty do AY
loop:
jr loop ; nechceme návrat do BASICu
ay_write:
ld bc, AY_SELECT_REGISTER ; zápis do výběrového registru AY
out (c), d ; index vybraného registru
ld bc,AY_DATA_REGISTER ; zápis do datového registru AY
out (c), e ; zapisovaná hodnota
ret ; návrat ze subrutiny
end ENTRY_POINT
3. Průběh a frekvenční spektru komorního A
Teoreticky by měl mít výstupní zvukový signál s notou A ideální obdélníkový průběh (ostatně čip AY-3–8910 vlastně pouze dělí vstupní hodinový signál zadanou konstantou), ovšem kvůli vazebnímu kondenzátoru atd. se na výstupu signál částečně „derivuje“, takže bude mít přibližně následující tvar:
Obrázek 1: Průběh původně obdélníkového signálu přibližně tak, jak ho můžeme změřit na zvukovém výstupu ZX Spectra, popř. na svorkách reproduktoru.
Podívejme se pro zajímavost i na spektrum tohoto signálu (pozor na to, že osy nemají lineární měřítko). Můžeme zde vidět (podle očekávání), že nejvíce energie nalezneme okolo frekvence 440 Hz; další špičky (spikes) jsou umístěny na frekvencích lichých harmonických. U ideálního obdélníkového signálu by měly být vidět pouze tyto špičky, ovšem my již víme, že ideální obdélníkový signál ve skutečnosti nedostaneme:
Obrázek 2: Frekvenční spektrum signálu komorního A tak, jak ho vygeneruje „ayčko“ na ZX Spectru.
4. Průběh zvukového signálu o vysoké frekvenci
Tvar signálu na výstupu ZX Spectra do značné míry závisí na frekvenci signálu. Ukažme si tedy, jak bude vypadat signál o relativně vysoké frekvenci, konkrétně v případě, že je dělitel frekvence (TP) nastaven na 20 (dekadicky). Zvukový signál generovaný ayčkem tedy bude mít frekvenci 110837/20=5541 Hz (schválně si příklad přeložte a poslechněte si, jak poměrně vysoký je výsledný tón):
ENTRY_POINT equ $8000
AY_SELECT_REGISTER equ $fffd
AY_DATA_REGISTER equ $bffd
org ENTRY_POINT
start:
ld d, 0 ; výška tónu (spodní bajt)
ld e, 20
call ay_write ; zápis hodnoty do AY
ld d, 1 ; výška tónu (horní bajt)
ld e, 0
call ay_write ; zápis hodnoty do AY
ld d, 8 ; hlasitost kanálu A
ld e, 15 ; maximální hlasitost
call ay_write ; zápis hodnoty do AY
ld d, 7 ; povolení výstupu z kanálu A
ld e, %11111110 ; bitová maska
call ay_write ; zápis hodnoty do AY
loop:
jr loop ; nechceme návrat do BASICu
ay_write:
ld bc, AY_SELECT_REGISTER ; zápis do výběrového registru AY
out (c), d ; index vybraného registru
ld bc,AY_DATA_REGISTER ; zápis do datového registru AY
out (c), e ; zapisovaná hodnota
ret ; návrat ze subrutiny
end ENTRY_POINT
Na dalším obrázku můžeme vidět, že výsledný signál do značné míry ztratil původní obdélníkový charakter a přiblížil se sinusovému signálu (alespoň na první pohled, do určité míry je tento pohled zkreslen vzorkovací frekvencí analyzátoru):
Obrázek 3: Signál s relativně vysokou frekvencí na výstupu ze ZX Spectra.
5. Průběh zvukového signálu o nízké frekvenci
Jak bude zvukový signál na výstupu ze ZX Spectra vypadat v případě, kdy budeme naopak generovat zvukový signál o relativně nízké frekvenci? Můžeme si to otestovat například na signálu, který vznikne při použití dělitele frekvence nastaveného na 10×256=2560, což znamená, že signál bude mít frekvenci přibližně 43 Hz (na těchto frekvencích již můžeme rozeznat jednotlivé změny signálu):
ENTRY_POINT equ $8000
AY_SELECT_REGISTER equ $fffd
AY_DATA_REGISTER equ $bffd
org ENTRY_POINT
start:
ld d, 0 ; výška tónu (spodní bajt)
ld e, 0
call ay_write ; zápis hodnoty do AY
ld d, 1 ; výška tónu (horní bajt)
ld e, 10
call ay_write ; zápis hodnoty do AY
ld d, 8 ; hlasitost kanálu A
ld e, 15 ; maximální hlasitost
call ay_write ; zápis hodnoty do AY
ld d, 7 ; povolení výstupu z kanálu A
ld e, %11111110 ; bitová maska
call ay_write ; zápis hodnoty do AY
loop:
jr loop ; nechceme návrat do BASICu
ay_write:
ld bc, AY_SELECT_REGISTER ; zápis do výběrového registru AY
out (c), d ; index vybraného registru
ld bc,AY_DATA_REGISTER ; zápis do datového registru AY
out (c), e ; zapisovaná hodnota
ret ; návrat ze subrutiny
end ENTRY_POINT
U takto nízkých frekvencí se plně projeví vliv vazebního kondenzátoru, takže získáme prakticky ideální modifikaci obdélníkového signálu derivačním článkem:
Obrázek 4: Signál s relativně nízkou frekvencí na výstupu ze ZX Spectra.
6. Přehrání dvou tónů současně
Připomeňme si, že čip AY-3–8910 dokáže současně generovat tři na sobě nezávislé zvukové signály, které jsou přivedeny na tři samostatné piny. Tyto tři signály lze různým způsobem kombinovat, například při snaze o stereo výstup atd. V případě ZX Spectra jsou tyto tři signály jednoduše spojeny (zjednodušeně řečeno: výstupní proudy se sečtou a na rezistoru „převedou“ na napětí přivedené na interní zesilovač). Jak tedy bude vypadat zvukový signál na výstupu ze ZX Spectra v případě, že nastavíme dva tóny generované v kanálech A a B? Signály budou mít odlišnou frekvenci i odlišnou amplitudu:
ENTRY_POINT equ $8000
AY_SELECT_REGISTER equ $fffd
AY_DATA_REGISTER equ $bffd
org ENTRY_POINT
start:
; nota A4 = 440.00 Hz
ld a, 0 ; výška tónu (spodní bajt) pro kanál A
ld bc, AY_SELECT_REGISTER
out (c), a
ld a, 251
ld bc, AY_DATA_REGISTER
out (c), a ; zápis hodnoty do AY
ld a, 1 ; výška tónu (horní bajt) pro kanál A
ld bc, AY_SELECT_REGISTER
out (c), a
ld a, 0
ld bc, AY_DATA_REGISTER
out (c), a ; zápis hodnoty do AY
; nota C4 = 261.63 Hz
ld a, 2 ; výška tónu (spodní bajt) pro kanál B
ld bc, AY_SELECT_REGISTER
out (c), a
ld a, 167
ld bc, AY_DATA_REGISTER
out (c), a ; zápis hodnoty do AY
ld a, 3 ; výška tónu (horní bajt) pro kanál B
ld bc, AY_SELECT_REGISTER
out (c), a
ld a, 1
ld bc, AY_DATA_REGISTER
out (c), a ; zápis hodnoty do AY
ld a, 8 ; hlasitost kanálu A
ld bc, AY_SELECT_REGISTER
out (c), a
ld a, 15 ; maximální hlasitost
ld bc, AY_DATA_REGISTER
out (c), a ; zápis hodnoty do AY
ld a, 9 ; hlasitost kanálu B
ld bc, AY_SELECT_REGISTER
out (c), a
ld a, 10
ld bc, AY_DATA_REGISTER
out (c), a ; zápis hodnoty do AY
ld a, 7 ; povolení výstupu z kanálu A i kanálu B
ld bc, AY_SELECT_REGISTER
out (c), a
ld a, %11111100 ; bitová maska
ld bc, AY_DATA_REGISTER
out (c), a ; zápis hodnoty do AY
loop:
jr loop ; nechceme návrat do BASICu
end ENTRY_POINT
Podívejme se nejdříve na průběh výsledného signálu:
Obrázek 5: Dva signály s odlišnou amplitudou a frekvencí, které jsou sečteny před vstupem do zesilovače.
Zajímavější je (opět) spektrum výsledného signálu, kde můžeme vidět oba „peaky“ odpovídající frekvencím obou původních signálů:
Obrázek 6: Spektrum signálu, který vznikl spojením dvou zvukových signálů s rozdílnou frekvencí.
7. Přehrání šumu
Další důležitou vlastností čipu AY-3–8910 je jeho schopnost generovat šum s proměnnou frekvencí. Šum je možné generovat pro libovolný zvukový kanál nebo pro kombinaci kanálů. Frekvence („výška“) šumu se nastavuje obsahem registru číslo R5, ovšem význam má pouze nejnižších pět bitů tohoto registru, takže volba frekvence je zde více omezená, než u generátorů obdélníkového signálu. Dále je nutné v registru R7 generátor šumu pro daný kanál povolit. Připomeňme si, že obsahem tohoto registru je bitové pole s následujícími bity (povolení – zápis nuly, nikoli jedničky):
| Bit | Povolení/zákaz/směr |
|---|---|
| 0 | tón kanálu A |
| 1 | tón kanálu B |
| 2 | tón kanálu C |
| 3 | šum do kanálu A |
| 4 | šum do kanálu B |
| 5 | šum do kanálu C |
| 6 | I/O port 1 (směr: vstup či výstup) |
| 7 | I/O port 2 (směr: vstup či výstup), na ZX Spectrum nepoužito |
Podívejme se nyní na praktický příklad. V tomto demonstračním příkladu povolíme generátor šumu pro zvukový kanál A, nastavíme výšku šumu, a nakonec zvolíme i hlasitost kanálu A. Povšimněte si zejména konstanty ukládané do registru R7. Výsledný program bude vypadat následovně:
ENTRY_POINT equ $8000
AY_SELECT_REGISTER equ $fffd
AY_DATA_REGISTER equ $bffd
org ENTRY_POINT
start:
ld a, 5 ; výška šumu
ld bc, AY_SELECT_REGISTER
out (c), a
ld a, 100
ld bc, AY_DATA_REGISTER
out (c), a ; zápis hodnoty do AY
ld a, 8 ; hlasitost kanálu A
ld bc, AY_SELECT_REGISTER
out (c), a
ld a, 15 ; maximální hlasitost
ld bc, AY_DATA_REGISTER
out (c), a ; zápis hodnoty do AY
ld a, 7 ; povolení výstupu z kanálu A
ld bc, AY_SELECT_REGISTER
out (c), a
ld a, %11110111 ; bitová maska
ld bc, AY_DATA_REGISTER
out (c), a ; zápis hodnoty do AY
loop:
jr loop ; nechceme návrat do BASICu
end ENTRY_POINT
8. Průběh a frekvenční spektrum šumu
Nyní se, podobně jako tomu bylo i u předchozích příkladů, podívejme na to, jak vlastně vypadá průběh zvukového signálu se šumem:
Obrázek 7: Průběh šumu generovaného čipem AY-3–8910.
Mnohem zajímavější je (opět) frekvenční spektrum šumu, které nyní po analýze vypadá následovně:
Obrázek 8: Frekvenční spektrum šumu generovaného čipem AY-3–8910.
9. Šum o nízké frekvenci
Frekvence šumu je vypočtena podle vztahu prakticky totožného se vztahem pro výpočet frekvence čistého tónu:
fnoise=fmaster/16NP
Jedinou změnou je fakt, že namísto dvanáctibitového děliče se používá pouze pětibitový dělič. Nejnižší dosažitelná frekvence šumu tedy vznikne při nastavení dělicí konstanty na hodnotu 63, což je ukázáno na dalším příkladu:
ENTRY_POINT equ $8000
AY_SELECT_REGISTER equ $fffd
AY_DATA_REGISTER equ $bffd
org ENTRY_POINT
start:
ld a, 5 ; výška šumu
ld bc, AY_SELECT_REGISTER
out (c), a
ld a, 63
ld bc, AY_DATA_REGISTER
out (c), a ; zápis hodnoty do AY
ld a, 8 ; hlasitost kanálu A
ld bc, AY_SELECT_REGISTER
out (c), a
ld a, 15 ; maximální hlasitost
ld bc, AY_DATA_REGISTER
out (c), a ; zápis hodnoty do AY
ld a, 7 ; povolení výstupu z kanálu A
ld bc, AY_SELECT_REGISTER
out (c), a
ld a, %11110111 ; bitová maska
ld bc, AY_DATA_REGISTER
out (c), a ; zápis hodnoty do AY
loop:
jr loop ; nechceme návrat do BASICu
end ENTRY_POINT
Průběh signálu může vypadat následovně:
Obrázek 9: Šum o nižší frekvenci.
10. Použití obálek pro modifikaci (modulaci) tónu
Jednou z nejzajímavějších vlastností čipu AY-3–8910 je jeho schopnost modifikovat generovaný signál s využitím takzvané obálky (envelope). Samotnou obálku si můžeme představit jako další signál, který může být (i když to není nutné) periodický nebo může proběhnout pouze jednou. Připomeňme si, že obálka se nastavuje čtyřmi bity registru RD a rychlost její změny pak pomocí dvojice registrů RB a RC, do nichž lze zadat šestnáctibitovou konstantu s následujícím významem:
fEP=fmaster/256EP
Tvar obálky může být vybrán z těchto možností:
0 \__________ pouze sestupná fáze, která se neopakuje
4 /|_________ vzestupná fáze, následovaná skokem na 0, která se neopakuje
8 \|\|\|\|\|\ opakující se sestupná fáze
9 \__________ single decay then off
10 \/\/\/\/\/\ pilovitý signál
_________
11 \| sestupná fáze následovaná skokem na 1, která se neopakuje
12 /|/|/|/|/|/ opakující se vzestupná fáze
__________
13 / klasický attack & hold
14 /\/\/\/\/\/ pilovitý signál fázově posunutý od 10
15 /|_________ dtto jako 4
11. Čistý tón modifikovaný periodicky se opakující obálkou ve tvaru pily
Podívejme se nyní na to, jaké řídicí registry ayčka je nutné nastavit v případě, že budeme chtít přehrát čistý tón, ovšem s hlasitostí modulovanou periodicky se opakující obálkou ve tvaru pily:
| Registry | Hodnota | Stručný popis |
|---|---|---|
| R0, R1 | 251 | dělící konstanta použitá pro specifikaci frekvence tónu kanálu A |
| R8 | 16 | pátým bitem se specifikuje, že hlasitost kanálu A je určena obálkou |
| RB, RC | 251 | dělící konstanta použitá pro specifikaci frekvence obálky (ovšem výsledek je odlišný od R0, R1) |
| RD | 10 | \/\/\/\/\/\ pilovitý signál |
| R7 | %11111110 | povolení tónu posílaného na kanál A |
A takto by mohlo vypadat naprogramování ayčka v assembleru:
ENTRY_POINT equ $8000
AY_SELECT_REGISTER equ $fffd
AY_DATA_REGISTER equ $bffd
org ENTRY_POINT
start:
ld d, 0 ; výška tónu (spodní bajt)
ld e, 251
call ay_write ; zápis hodnoty do AY
ld d, 1 ; výška tónu (horní bajt)
ld e, 0
call ay_write ; zápis hodnoty do AY
ld d, 8 ; hlasitost kanálu A
ld e, 16 ; hlasitost ovládat pomocí obálky
call ay_write ; zápis hodnoty do AY
ld d, $b ; frekvence generátoru obálky (spodní bajt)
ld e, 251
call ay_write ; zápis hodnoty do AY
ld d, $c ; frekvence generátoru obálky (horní bajt)
ld e, 0
call ay_write ; zápis hodnoty do AY
ld d, $d ; nastavení tvaru obálky (bitové pole)
ld e, 10
call ay_write ; zápis hodnoty do AY
ld d, 7 ; povolení výstupu z kanálu A
ld e, %11111110 ; bitová maska
call ay_write ; zápis hodnoty do AY
loop:
jr loop ; nechceme návrat do BASICu
ay_write:
ld bc, AY_SELECT_REGISTER ; zápis do výběrového registru AY
out (c), d ; index vybraného registru
ld bc,AY_DATA_REGISTER ; zápis do datového registru AY
out (c), e ; zapisovaná hodnota
ret ; návrat ze subrutiny
end ENTRY_POINT
12. Průběh zvukového signálu modifikovaného s využitím obálky ve tvaru pily
Opět se pokusme vizualizovat zvukový signál, který je nyní modifikován s využitím obálky ve tvaru pily. Frekvence signálu je v tomto případě mnohem vyšší než frekvence obálky. Povšimněte si, že pila není „lineární“ – její průběh vypadá jako součást exponenciály (což je další typická vlastnost ayčka):
Obrázek 10: Zvukový signál modifikovaný obálkou ve tvaru pily.
13. Použití obálky ve tvaru trojúhelníku v případě, že se frekvence tónu a obálky přibližují
Samozřejmě je možné zvukový čip AY-3–8910 nakonfigurovat takovým způsobem, aby byla frekvence původního obdélníkového signálu podobná jako frekvence obálky. V takovém případě bude výsledný modulovaný signál vypadat odlišně a pochopitelně bude i odlišně znít. Opět si to můžeme otestovat na jednoduchém demonstračním příkladu, v němž bude frekvence signálu a frekvence obálky nastavena následujícím způsobem:
| Generátor | Dělitel | Frekvence |
|---|---|---|
| tón | 251 | 1773400 / 16 / 251 = 440 Hz |
| obálka | 100 | 1773400 / 256 / 100 = 69 Hz |
Obrázek 11: Použití obálky ve tvaru trojúhelníku v případě, že se frekvence tónu a obálky přibližují.
Kód v assembleru, který ayčko nastaví a začne generovat zvuk, bude vypadat následovně:
ENTRY_POINT equ $8000
AY_SELECT_REGISTER equ $fffd
AY_DATA_REGISTER equ $bffd
org ENTRY_POINT
start:
ld d, 0 ; výška tónu (spodní bajt)
ld e, 251
call ay_write ; zápis hodnoty do AY
ld d, 1 ; výška tónu (horní bajt)
ld e, 0
call ay_write ; zápis hodnoty do AY
ld d, 8 ; hlasitost kanálu A
ld e, 16 ; hlasitost ovládat pomocí obálky
call ay_write ; zápis hodnoty do AY
ld d, $b ; frekvence generátoru obálky (spodní bajt)
ld e, 100
call ay_write ; zápis hodnoty do AY
ld d, $c ; frekvence generátoru obálky (horní bajt)
ld e, 0
call ay_write ; zápis hodnoty do AY
ld d, $d ; nastavení tvaru obálky (bitové pole)
ld e, 12
call ay_write ; zápis hodnoty do AY
ld d, 7 ; povolení výstupu z kanálu A
ld e, %11111110 ; bitová maska
call ay_write ; zápis hodnoty do AY
loop:
jr loop ; nechceme návrat do BASICu
ay_write:
ld bc, AY_SELECT_REGISTER ; zápis do výběrového registru AY
out (c), d ; index vybraného registru
ld bc,AY_DATA_REGISTER ; zápis do datového registru AY
out (c), e ; zapisovaná hodnota
ret ; návrat ze subrutiny
end ENTRY_POINT
14. Použití obálky ve tvaru trojúhelníku v případě, že jsou frekvence tónu a obálky velmi rozdílné
Samozřejmě můžeme zvukový čip AY nastavit opačným způsobem, tedy tak, že frekvence tónu (modulovaného obálkou) se bude o řád či o dva řády lišit od frekvence obálky. Příkladem může být například následující nastavení:
| Generátor | Dělitel | Frekvence |
|---|---|---|
| tón | 251 | 1773400 / 16 / 251 = 440 Hz |
| obálka | 100 | 1773400 / 256 / (3×256) = přibližně 9 Hz |
Výsledkem bude tento průběh signálu naměřeného na výstupu ZX Spectra, popř. na svorkách reproduktoru:
Obrázek 12: Výsledný zvukový signál ve chvíli, kdy je frekvence tónu mnohem vyšší než frekvence obálky.
Pro úplnost si samozřejmě ukážeme i úplný zdrojový kód příkladu:
ENTRY_POINT equ $8000
AY_SELECT_REGISTER equ $fffd
AY_DATA_REGISTER equ $bffd
org ENTRY_POINT
start:
ld d, 0 ; výška tónu (spodní bajt)
ld e, 251
call ay_write ; zápis hodnoty do AY
ld d, 1 ; výška tónu (horní bajt)
ld e, 0
call ay_write ; zápis hodnoty do AY
ld d, 8 ; hlasitost kanálu A
ld e, 16 ; hlasitost ovládat pomocí obálky
call ay_write ; zápis hodnoty do AY
ld d, $b ; frekvence generátoru obálky (spodní bajt)
ld e, 0
call ay_write ; zápis hodnoty do AY
ld d, $c ; frekvence generátoru obálky (horní bajt)
ld e, 3
call ay_write ; zápis hodnoty do AY
ld d, $d ; nastavení tvaru obálky (bitové pole)
ld e, 12
call ay_write ; zápis hodnoty do AY
ld d, 7 ; povolení výstupu z kanálu A
ld e, %11111110 ; bitová maska
call ay_write ; zápis hodnoty do AY
loop:
jr loop ; nechceme návrat do BASICu
ay_write:
ld bc, AY_SELECT_REGISTER ; zápis do výběrového registru AY
out (c), d ; index vybraného registru
ld bc,AY_DATA_REGISTER ; zápis do datového registru AY
out (c), e ; zapisovaná hodnota
ret ; návrat ze subrutiny
end ENTRY_POINT
15. Kombinace šumu s generátorem obálky
Zajímavé je, že i samotný šum je možné modulovat s využitím obálky. Jedinou změnou v programovém kódu je povolení generátoru šumu pro zvolený kanál, v našem konkrétním případě pro kanál A (ale naprosto stejné nastavení lze udělat i pro kanál B či C). A samozřejmě nesmíme zapomenout na konfiguraci hlasitosti – registr R8 musí být nastaven na hodnotu 16, jinak se obálka nebude pro kanál A aplikovat. Takto vypadá výsledný kód napsaný v assembleru:
ENTRY_POINT equ $8000
AY_SELECT_REGISTER equ $fffd
AY_DATA_REGISTER equ $bffd
org ENTRY_POINT
start:
ld d, 5 ; výška šumu
ld e, 100
call ay_write ; zápis hodnoty do AY
ld d, 8 ; hlasitost kanálu A
ld e, 16 ; hlasitost ovládat pomocí obálky
call ay_write ; zápis hodnoty do AY
ld d, $b ; frekvence generátoru obálky (spodní bajt)
ld e, 0
call ay_write ; zápis hodnoty do AY
ld d, $c ; frekvence generátoru obálky (horní bajt)
ld e, 1
call ay_write ; zápis hodnoty do AY
ld d, $d ; nastavení tvaru obálky (bitové pole)
ld e, 12
call ay_write ; zápis hodnoty do AY
ld d, 7 ; povolení výstupu z kanálu A
ld e, %11110111 ; bitová maska
call ay_write ; zápis hodnoty do AY
loop:
jr loop ; nechceme návrat do BASICu
ay_write:
ld bc, AY_SELECT_REGISTER ; zápis do výběrového registru AY
out (c), d ; index vybraného registru
ld bc,AY_DATA_REGISTER ; zápis do datového registru AY
out (c), e ; zapisovaná hodnota
ret ; návrat ze subrutiny
end ENTRY_POINT
16. Tvar výsledného signálu
Jak je patrné z následující vizualizace zvukového signálu, je skutečně možné zkombinovat šum s obálkou, resp. přesněji řečeno provést modulaci šumu obálkou:
Obrázek 14: Tvar zvukového signálu, který vznikl kombinací šumu s generátorem obálky.
17. Přehrávací rutiny
Pro generování hudby většinou postačuje měnit parametry registrů čipu AY pouze 50× za sekundu, tedy například v synchronizaci se snímky. Podrobnosti o této velmi často používané technice si řekneme příště.
18. Příloha: upravený soubor Makefile pro překlad demonstračních příkladů
Výše uvedené demonstrační příklady i příklady, které již byly popsány v předchozích patnácti článcích [1] [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13], [14], [15], [16], je možné přeložit s využitím souboru Makefile, jehož aktuální verze vypadá následovně (pro překlad a slinkování je použit assembler Pasmo):
ASSEMBLER := pasmo
all: 01.tap 02.tap 03.tap 04.tap 05.tap 06.tap 07.tap 08.tap 09.tap 10.tap \
11.tap 12.tap 13.tap 14.tap 15.tap 16.tap 17.tap 18.tap 19.tap 20.tap \
21.tap 22.tap 23.tap 24.tap 25.tap 26.tap 27.tap 28.tap 29.tap 30.tap \
31.tap 32.tap 33.tap 34.tap 35.tap 36.tap 37.tap 38.tap 39.tap 40.tap \
41.tap 42.tap 43.tap 44.tap 45.tap 46.tap 47.tap 48.tap 49.tap 50.tap \
51.tap 52.tap 53.tap 54.tap 55.tap 56.tap 57.tap 58.tap 59.tap 60.tap \
61.tap 62.tap 63.tap 64.tap 65.tap 66.tap 67.tap 68.tap 69.tap 70.tap \
71.tap 72.tap 73.tap 74.tap 75.tap 76.tap 77.tap 78.tap 79.tap 80.tap \
81.tap 82.tap 83.tap 84.tap 85.tap 86.tap 87.tap 88.tap 80.tap 90.tap \
91.tap 92.tap 93.tap 94.tap 95.tap 96.tap 97.tap 98.tap 99.tap 100.tap \
101.tap 102.tap 103.tap 104.tap 105.tap 106.tap 107.tap 108.tap 109.tap \
110.tap 111.tap 112.tap 113.tap 114.tap 115.tap 116.tap 117.tap 118.tap
clean:
rm -f *.tap
.PHONY: all clean
01.tap: 01-color-attribute.asm
$(ASSEMBLER) -v -d --tap $< $@ > 01-color-attribute.lst
02.tap: 02-blinking-attribute.asm
$(ASSEMBLER) -v -d --tap $< $@ > 02-blinking-attribute.lst
03.tap: 03-symbolic-names.asm
$(ASSEMBLER) -v -d --tap $< $@ > 03-symbolic-names.lst
04.tap: 04-operators.asm
$(ASSEMBLER) -v -d --tap $< $@ > 04-operators.lst
05.tap: 05-better-symbols.asm
$(ASSEMBLER) -v -d --tap $< $@ > 05-better-symbols.lst
06.tap: 06-tapbas-v1.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 06-tapbas-v1.lst
07.tap: 07-tapbas-v2.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 07-tapbas-v2.lst
08.tap: 08-loop.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 08-loop.lst
09.tap: 09-loop.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 09-loop.lst
10.tap: 10-loop.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 10-loop.lst
11.tap: 11-loop.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 11-loop.lst
12.tap: 12-loop.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 12-loop.lst
13.tap: 13-loop.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 13-loop.lst
14.tap: 14-loop.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 14-loop.lst
15.tap: 15-loop.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 15-loop.lst
16.tap: 16-loop.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 16-loop.lst
17.tap: 17-loop.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 17-loop.lst
18.tap: 18-cls.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 18-cls.lst
19.tap: 19-print-char-call.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 19-print-char-call.lst
20.tap: 20-print-char-rst.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 20-print-char-rst.lst
21.tap: 21-print-char.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 21-print-char.lst
22.tap: 22-print-all-chars.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 22-print-all-chars.lst
23.tap: 23-print-all-chars.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 23-print-all-chars.lst
24.tap: 24-change-color.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 24-change-color.lst
25.tap: 25-change-flash.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 25-change-flash.lst
26.tap: 26-print-at.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 26-print-at.lst
27.tap: 27-print-string.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 27-print-string.lst
28.tap: 28-print-string.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 28-print-string.lst
29.tap: 29-print-colorized-string.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 29-print-colorized-string.lst
30.tap: 30-print-string-ROM.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 30-print-string-ROM.lst
31.tap: 31-attributes.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 31-attributes.lst
32.tap: 32-fill-in-vram.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 32-fill-in-vram.lst
33.tap: 33-fill-in-vram-no-ret.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 33-fill-in-vram-no-ret.lst
34.tap: 34-fill-in-vram-pattern.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 34-fill-in-vram-pattern.lst
35.tap: 35-slow-fill-in-vram.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 35-slow-fill-in-vram.lst
36.tap: 36-slow-fill-in-vram-no-ret.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 36-slow-fill-in-vram-no-ret.lst
37.tap: 37-fill-block.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 37-fill-block.lst
38.tap: 38-fill-block-with-pattern.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 38-fill-block-with-pattern.lst
39.tap: 39-fill-block-optimized.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 39-fill-block-optimized.lst
40.tap: 40-draw-char.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 40-draw-char.lst
41.tap: 41-draw-any-char.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 41-draw-any-char.lst
42.tap: 42-block-anywhere.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 42-block-anywhere.lst
43.tap: 43-block-anywhere-rrca.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 43-block-anywhere-rrca.lst
44.tap: 44-better-draw-char.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 44-better-draw-char.lst
45.tap: 45-even-better-draw-char.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 45-even-better-draw-char.lst
46.tap: 46-draw-char-at.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 46-draw-char-at.lst
47.tap: 47-draw-char-at-unrolled.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 47-draw-char-at-unrolled.lst
48.tap: 48-incorrect-print-string.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 48-incorrect-print-string.lst
49.tap: 49-correct-print-string.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 49-correct-print-string.lst
50.tap: 50-ascii-table.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 50-ascii-table.lst
51.tap: 51-plot-block.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 51-plot-block.lst
52.tap: 52-plot-pixel.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 52-plot-pixel.lst
53.tap: 53-plot-pixel.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 53-plot-pixel.lst
54.tap: 54-plot-pixel-on-background.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 54-plot-pixel-on-background.lst
55.tap: 55-plot-pixel-on-background.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 55-plot-pixel-on-background.lst
56.tap: 56-inverse-ascii-table.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 56-inverse-ascii-table.lst
57.tap: 57-plot-pixel-on-inverse-background.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 57-plot-pixel-on-inverse-background.lst
58.tap: 58-plot-inverse-pixel-on-inverse-background.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 58-plot-inverse-pixel-on-inverse-background.lst
59.tap: 59-configurable-ascii-table.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 59-configurable-ascii-table.lst
60.tap: 60-plot-over.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 60-plot-over.lst
61.tap: 61-print-number-A.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 61-print-number-A.lst
62.tap: 62-print-number-B.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 62-print-number-B.lst
63.tap: 63-print-number-C.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 63-print-number-C.lst
64.tap: 64-print-number-D.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 64-print-number-D.lst
65.tap: 65-more-numbers-A.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 65-more-numbers-A.lst
66.tap: 66-more-numbers-B.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 66-more-numbers-B.lst
67.tap: 67-print-flags-1.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 67-print-flags-1.lst
68.tap: 68-print-flags-2.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 68-print-flags-2.lst
69.tap: 69-print-flags-3.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 69-print-flags-3.lst
70.tap: 70-print-flags-4.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 70-print-flags-4.lst
71.tap: 71-print-flags-5.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 71-print-flags-5.lst
72.tap: 72-print-flags-6.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 72-print-flags-6.lst
73.tap: 73-print-flags-7.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 73-print-flags-7.lst
74.tap: 74-print-hex-number.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 74-print-hex-number.lst
75.tap: 75-print-hex-number.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 75-print-hex-number.lst
76.tap: 76-print-hex-numbers.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 76-print-hex-numbers.lst
77.tap: 77-add-hex-numbers.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 77-add-hex-numbers.lst
78.tap: 78-add-bcd-numbers.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 78-add-bcd-numbers.lst
79.tap: 79-print-hex-digit-jmp.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 79-print-hex-digit-jmp.lst
80.tap: 80-print-hex-digit-overflow.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 80-print-hex-digit-overflow.lst
81.tap: 81-print-hex-digit-daa.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 81-print-hex-digit-daa.lst
82.tap: 82-print-hex-numbers-daa.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 82-print-hex-numbers-daa.lst
83.tap: 83-print-fp-numbers.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 83-print-fp-numbers.lst
84.tap: 84-print-ascii-table.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 84-print-ascii-table.lst
85.tap: 85-copy-ascii-table.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 85-copy-ascii-table.lst
86.tap: 86-copy-ascii-table-B.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 86-copy-ascii-table-B.lst
87.tap: 87-copy-ascii-table-C.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 87-copy-ascii-table-C.lst
88.tap: 88-copy-ascii-table-D.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 88-copy-ascii-table-D.lst
89.tap: 89-copy-ascii-table-E.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 89-copy-ascii-table-E.lst
90.tap: 90-copy-ascii-table-F.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 90-copy-ascii-table-F.lst
91.tap: 91-copy-ascii-table-G.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 91-copy-ascii-table-G.lst
92.tap: 92-copy-ascii-table-H.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 92-copy-ascii-table-H.lst
93.tap: 93-copy-ascii-table-I.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 93-copy-ascii-table-I.lst
94.tap: 94-color-attribute.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 94-color-attribute.lst
95.tap: 95-keypress.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 95-keypress.lst
96.tap: 96-keypress-row.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 96-keypress-row.lst
97.tap: 97-keypress-all-rows.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 97-keypress-all-rows.lst
98.tap: 98-game-character.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 98-game-character.lst
99.tap: 99-game-character-2.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 99-game-character-2.lst
100.tap: 100-cursor-joystick.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 100-cursor-joystick.lst
101.tap: 101-sinclair-joystick.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 101-sinclair-joystick.lst
102.tap: 102-kempston-joystick.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 102-kempston-joystick.lst
103.tap: 103-beep.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 103-beep.lst
104.tap: 104-music-scale.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 104-music-scale.lst
105.tap: 105-direct-speaker.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 105-direct-speaker.lst
106.tap: 106-direct-speaker-di.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 106-direct-speaker-di.lst
107.tap: 107-direct-speaker-border.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 107-direct-speaker-border.lst
108.tap: 108-direct-speaker-border-di.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 108-direct-speaker-border-di.lst
109.tap: 109-ay-note-a.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 109-ay-note-a.lst
110.tap: 110-ay-note-a.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 110-ay-note-a.lst
111.tap: 111-ay-two-notes.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 111-ay-two-notes.lst
112.tap: 112-ay-noise.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 112-ay-noise.lst
113.tap: 113-ay-low-frequency.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 113-ay-low-frequency.lst
114.tap: 114-ay-high-frequency.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 114-ay-high-frequency.lst
115.tap: 115-ay-low-noise.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 115-ay-low-noise.lst
116.tap: 116-ay-envelope.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 116-ay-envelope.lst
117.tap: 117-ay-envelope.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 117-ay-envelope.lst
118.tap: 118-ay-envelope.asm
$(ASSEMBLER) -v -d --tapbas $< $@ > 118-ay-envelope.lst
19. Repositář s demonstračními příklady
V tabulce zobrazené pod tímto odstavcem jsou uvedeny odkazy na všechny prozatím popsané demonstrační příklady určené pro překlad a spuštění na osmibitovém domácím mikropočítači ZX Spectrum (libovolný model či jeho klon), které jsou psány v assembleru mikroprocesoru Zilog Z80. Pro překlad těchto demonstračních příkladů je možné použít například assembler Pasmo (viz též úvodní článek):
| # | Soubor | Stručný popis | Adresa |
|---|---|---|---|
| 1 | 01-color-attribute.asm | modifikace jednoho barvového atributu | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/01-color-attribute.asm |
| 2 | 02-blinking-attribute.asm | barvový atribut s nastavením bitů pro blikání a vyšší intenzitu | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/02-blinking-attribute.asm |
| 3 | 03-symbolic-names.asm | symbolická jména v assembleru | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/03-symbolic-names.asm |
| 4 | 04-operators.asm | operátory a operace se symbolickými hodnotami | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/04-operators.asm |
| 5 | 05-better-symbols.asm | tradičnější symbolická jména | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/05-better-symbols.asm |
| 6 | 06-tapbas-v1.asm | vygenerování BASICovského loaderu (neúplný příklad) | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/06-tapbas-v1.asm |
| 7 | 07-tapbas-v2.asm | vygenerování BASICovského loaderu (úplný příklad) | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/07-tapbas-v2.asm |
| 8 | 08-loop.asm | jednoduchá počítaná programová smyčka: naivní varianta | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/08-loop.asm |
| 9 | 09-loop.asm | programová smyčka: zkrácení kódu pro vynulování použitých pracovních registrů | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/09-loop.asm |
| 10 | 10-loop.asm | programová smyčka: optimalizace skoku na konci smyčky (instrukce DJNZ) | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/10-loop.asm |
| 11 | 11-loop.asm | programová smyčka: optimalizace využití pracovních registrů | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/11-loop.asm |
| 12 | 12-loop.asm | programová smyčka: použití pracovního registru IX | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/12-loop.asm |
| 13 | 13-loop.asm | programová smyčka: použití pracovního registru IY | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/13-loop.asm |
| 14 | 14-loop.asm | programová smyčka se šestnáctibitovým počitadlem, základní varianta | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/14-loop.asm |
| 15 | 15-loop.asm | programová smyčka se šestnáctibitovým počitadlem, vylepšená varianta | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/15-loop.asm |
| 16 | 16-loop.asm | použití relativního skoku a nikoli skoku absolutního | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/16-loop.asm |
| 17 | 17-loop.asm | programová smyčka: inc l namísto inc hl | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/17-loop.asm |
| 18 | 18-cls.asm | smazání obrazovky a otevření kanálu číslo 2 (screen) přes funkci v ROM | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/18-cls.asm |
| 19 | 19-print-char-call.asm | smazání obrazovky a výpis jednoho znaku na obrazovku přes funkci v ROM (použití instrukce CALL) | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/19-print-char-call.asm |
| 20 | 20-print-char-rst.asm | smazání obrazovky a výpis jednoho znaku na obrazovku přes funkci v ROM (použití instrukce RST) | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/20-print-char-rst.asm |
| 21 | 21-print-char.asm | pouze výpis jednoho znaku na obrazovku bez jejího smazání | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/21-print-char.asm |
| 22 | 22-print-all-chars.asm | výpis znakové sady znak po znaku (nekorektní verze příkladu) | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/22-print-all-chars.asm |
| 23 | 23-print-all-chars.asm | výpis znakové sady znak po znaku (korektní verze příkladu) | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/23-print-all-chars.asm |
| 24 | 24-change-color.asm | změna barvových atributů (popředí a pozadí) vypisovaných znaků | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/24-change-color.asm |
| 25 | 25-change-flash.asm | povolení či zákaz blikání vypisovaných znaků | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/25-change-flash.asm |
| 26 | 26-print-at.asm | výpis znaku či znaků na určené místo na obrazovce | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/26-print-at.asm |
| 27 | 27-print-string.asm | výpis celého řetězce explicitně zapsanou programovou smyčkou (základní varianta) | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/27-print-string.asm |
| 28 | 28-print-string.asm | výpis celého řetězce explicitně zapsanou programovou smyčkou (vylepšená varianta) | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/28-print-string.asm |
| 29 | 29-print-colorized-string.asm | výpis řetězce, který obsahuje i řídicí znaky pro změnu barvy atd. | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/29-print-colorized-string.asm |
| 30 | 30-print-string-ROM.asm | výpis řetězce s využitím služby/subrutiny uložené v ROM ZX Spectra | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/30-print-string-ROM.asm |
| 31 | 31-attributes.asm | modifikace atributů pro tisk řetězce subrutinou uloženou v ROM | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/31-attributes.asm |
| 32 | 32-fill-in-vram.asm | vyplnění celé bitmapy barvou popředí, návrat do systému | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/32-fill-in-vram.asm |
| 33 | 33-fill-in-vram-no-ret.asm | vyplnění celé bitmapy barvou popředí, bez návratu do systému | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/33-fill-in-vram-no-ret.asm |
| 34 | 34-fill-in-vram-pattern.asm | vyplnění celé bitmapy zvoleným vzorkem | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/34-fill-in-vram-pattern.asm |
| 35 | 35-slow-fill-in-vram.asm | pomalé vyplnění celé bitmapy, vizualizace struktury bitmapy | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/35-slow-fill-in-vram.asm |
| 36 | 36-slow-fill-in-vram-no-ret.asm | pomalé vyplnění celé bitmapy, vizualizace struktury bitmapy, bez návratu do systému | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/36-slow-fill-in-vram-no-ret.asm |
| 37 | 37-fill-block.asm | vykreslení bloku 8×8 pixelů | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/37-fill-block.asm |
| 38 | 38-fill-block-with-pattern.asm | vykreslení bloku 8×8 pixelů zvoleným vzorkem | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/38-fill-block-with-pattern.asm |
| 39 | 39-fill-block-optimized.asm | optimalizace předchozího příkladu | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/39-fill-block-optimized.asm |
| 40 | 40-draw-char.asm | vykreslení znaku do levého horního rohu | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/40-draw-char.asm |
| 41 | 41-draw-any-char.asm | podprogram pro vykreslení libovolně zvoleného znaku do levého horního rohu | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/41-draw-any-char.asm |
| 42 | 42-block-anywhere.asm | podprogramy pro vykreslení bloku 8×8 pixelů kamkoli na obrazovku | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/42-block-anywhere.asm |
| 43 | 43-block-anywhere-rrca.asm | podprogramy pro vykreslení bloku 8×8 pixelů kamkoli na obrazovku, vylepšená varianta | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/43-block-anywhere-rrca.asm |
| 44 | 44-better-draw-char.asm | vykreslení znaku v masce 8×8 pixelů, vylepšená varianta | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/44-better-draw-char.asm |
| 45 | 45-even-better-draw-char.asm | posun offsetu pro vykreslení dalšího znaku | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/45-even-better-draw-char.asm |
| 46 | 46-draw-char-at.asm | vykreslení znaku v masce 8×8 pixelů kamkoli na obrazovku | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/46-draw-char-at.asm |
| 47 | 47-draw-char-at-unrolled.asm | vykreslení znaku v masce 8×8 pixelů kamkoli na obrazovku | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/47-draw-char-at-unrolled.asm |
| 48 | 48-incorrect-print-string.asm | tisk řetězce, nekorektní varianta | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/48-incorrect-print-string.asm |
| 49 | 49-correct-print-string.asm | tisk řetězce, korektní varianta | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/49-correct-print-string.asm |
| 50 | 50-ascii-table.asm | tisk několika bloků ASCII tabulky | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/50-ascii-table.asm |
| 51 | 51-plot-block.asm | vykreslení pixelu verze 1: zápis celého bajtu na pozici pixelu | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/51-plot-block.asm |
| 52 | 52-plot-pixel.asm | vykreslení pixelu verze 2: korektní vykreslení jednoho pixelu, ovšem překreslení celého bajtu | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/52-plot-pixel.asm |
| 53 | 53-plot-pixel.asm | vykreslení pixelu verze 3: vylepšená verze předchozího demonstračního příkladu | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/53-plot-pixel.asm |
| 54 | 54-plot-pixel-on-background.asm | vykreslení pixelu vůči pozadí (nekorektní varianta) | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/54-plot-pixel-on-background.asm |
| 55 | 55-plot-pixel-on-background.asm | vykreslení pixelu vůči pozadí (korektní varianta) | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/55-plot-pixel-on-background.asm |
| 56 | 56-inverse-ascii-table.asm | vykreslení ASCII tabulky inverzní barvou (inkoust vs. papír) | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/56-inverse-ascii-table.asm |
| 57 | 57-plot-pixel-on-inverse-background.asm | vykreslení pixelů barvou papíru proti inverzní ASCII tabulce | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/57-plot-pixel-on-inverse-background.asm |
| 58 | 58-plot-inverse-pixel-on-inverse-background.asm | vykreslení pixelů inverzní barvou proti inverzní ASCII tabulce | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm58-plot-inverse-pixel-on-inverse-background.asm/ |
| 59 | 59-configurable-ascii-table.asm | vykreslení ASCII tabulky buď přímo inkoustem nebo inverzně | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/59-configurable-ascii-table.asm |
| 60 | 60-plot-over.asm | přibližná implementace příkazu PLOT OVER | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/60-plot-over.asm |
| 61 | 61-print-number-A.asm | ukázka použití podprogramu pro tisk celého čísla | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/61-print-number-A.asm |
| 62 | 62-print-number-B.asm | pokus o vytištění záporných čísel | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/62-print-number-B.asm |
| 63 | 63-print-number-C.asm | tisk maximální podporované hodnoty 9999 | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/63-print-number-C.asm |
| 64 | 64-print-number-D.asm | tisk vyšší než podporované hodnoty 10000 | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/64-print-number-D.asm |
| 65 | 65-more-numbers-A.asm | vytištění číselné řady | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/65-more-numbers-A.asm |
| 66 | 66-more-numbers-B.asm | kombinace tisku celočíselných hodnot s dalšími subrutinami | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/66-more-numbers-B.asm |
| 67 | 67-print-flags-1.asm | příznakové bity po provedení celočíselné operace 1+2 | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/67-print-flags-1.asm |
| 68 | 68-print-flags-2.asm | příznakové bity po provedení celočíselné operace 0+0 | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/68-print-flags-2.asm |
| 69 | 69-print-flags-3.asm | příznakové bity po provedení operace 255+1 | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/69-print-flags-3.asm |
| 70 | 70-print-flags-4.asm | příznakové bity po provedení operace 254+1 | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/70-print-flags-4.asm |
| 71 | 71-print-flags-5.asm | příznakové bity po provedení operace 255+255 | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/71-print-flags-5.asm |
| 72 | 72-print-flags-6.asm | výsledek operace 100+100, nastavení příznakových bitů | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/72-print-flags-6.asm |
| 73 | 73-print-flags-7.asm | výsledek operace 128+128, nastavení příznakových bitů | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/73-print-flags-7.asm |
| 74 | 74-print-hex-number.asm | tisk hexadecimálního čísla v rozsahu 0×00 až 0×ff (neoptimalizovaná varianta) | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/74-print-hex-number.asm |
| 75 | 75-print-hex-number.asm | tisk hexadecimálního čísla v rozsahu 0×00 až 0×ff (optimalizovaná varianta) | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/75-print-hex-number.asm |
| 76 | 76-print-hex-numbers.asm | tisk několika hexadecimálních hodnot | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/76-print-hex-numbers.asm |
| 77 | 77-add-hex-numbers.asm | součet dvou osmibitových hexadecimálních hodnot s tiskem všech výsledků | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/77-add-hex-numbers.asm |
| 78 | 78-add-bcd-numbers.asm | součet dvou osmibitových BCD hodnot s tiskem všech výsledků | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/78-add-bcd-numbers.asm |
| 79 | 79-print-hex-digit-jmp.asm | tisk jedné hexadecimální cifry s využitím podmíněného skoku | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/79-print-hex-digit-jmp.asm |
| 80 | 80-print-hex-digit-overflow.asm | otestování, jaký znak je vytištěn pro hodnoty větší než 15 | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/80-print-hex-digit-overflow.asm |
| 81 | 81-print-hex-digit-daa.asm | tisk jedné hexadecimální cifry s využitím instrukce DAA | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/81-print-hex-digit-daa.asm |
| 82 | 82-print-hex-numbers-daa.asm | tisk série hexadecimálních hodnot s využitím instrukce DAA | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/82-print-hex-numbers-daa.asm |
| 83 | 83-print-fp-numbers.asm | tisk numerických hodnot reprezentovaných v systému plovoucí řádové tečky | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/83-print-fp-numbers.asm |
| 84 | 84-print-ascii-table.asm | tisk jednoho bloku s ASCII tabulkou | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/84-print-ascii-table.asm |
| 85 | 85-copy-ascii-table.asm | kopie bloku bajt po bajtu založená na naivní programové smyčce | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/85-copy-ascii-table.asm |
| 86 | 86-copy-ascii-table-B.asm | kopie bloku s využitím instrukce LDIR | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/86-copy-ascii-table-B.asm |
| 87 | 87-copy-ascii-table-C.asm | kopie bloku bajt po bajtu založená na programové smyčce a instrukci LDI | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/87-copy-ascii-table-C.asm |
| 88 | 88-copy-ascii-table-D.asm | rozbalení programové smyčky s instrukcí LDI | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/88-copy-ascii-table-D.asm |
| 89 | 89-copy-ascii-table-E.asm | korektní smyčka pro všechny možné velikosti bloků | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/89-copy-ascii-table-E.asm |
| 90 | 90-copy-ascii-table-F.asm | kostra programu, který pro kopii bloků (16 bajtů) využívá zásobník | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/90-copy-ascii-table-F.asm |
| 91 | 91-copy-ascii-table-G.asm | definice makra a několikeré použití (aplikace) tohoto makra | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/91-copy-ascii-table-G.asm |
| 92 | 92-copy-ascii-table-H.asm | opakování makra založené na REPT | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/92-copy-ascii-table-H.asm |
| 93 | 93-copy-ascii-table-I.asm | vícenásobná kopie části obrazovky | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/93-copy-ascii-table-I.asm |
| 94 | 94-color-attribute.asm | modifikace jednoho barvového atributu na obrazovce ZX Spectra | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/94-color-attribute.asm |
| 95 | 95-keypress.asm | detekce stisku jedné klávesy s vizualizací stisku | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/95-keypress.asm |
| 96 | 96-keypress-row.asm | detekce stisku kláves v jednom fyzickém řádku | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/96-keypress-row.asm |
| 97 | 97-keypress-all-rows.asm | detekce stisku všech kláves klávesnice ZX Spectra 48k | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/97-keypress-all-rows.asm |
| 98 | 98-game-character.asm | zajištění pohybu hráče v herní scéně s využitím klávesnice | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/98-game-character.asm |
| 99 | 99-game-character-2.asm | vylepšení předchozího demonstračního příkladu | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/99-game-character-2.asm |
| 100 | 100-cursor-joystick.asm | zajištění pohybu hráče v herní scéně kurzorovým joystickem | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/100-cursor-joystick.asm |
| 101 | 101-sinclair-joystick.asm | zajištění pohybu hráče v herní scéně joystickem připojeným přes Interface 2 | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/101-sinclair-joystick.asm |
| 102 | 102-kempston-joystick.asm | zajištění pohybu hráče v herní scéně joystickem připojeným přes rozhraní Kempston | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/102-kempston-joystick.asm |
| 103 | 103-beep.asm | využití subrutiny v ROM s implementací příkazu BEEP | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/103-beep.asm |
| 104 | 104-music-scale.asm | přehrání celé stupnice | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/104-music-scale.asm |
| 105 | 105-direct-speaker.asm | přímé programové ovládání beeperu | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/105-direct-speaker.asm |
| 106 | 106-direct-speaker-di.asm | zakázání přerušení při přehrávání | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/106-direct-speaker-di.asm |
| 107 | 107-direct-speaker-border.asm | vizualizace frekvence přehrávání změnou okraje v reálném čase | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/107-direct-speaker-border.asm |
| 108 | 108-direct-speaker-border-di.asm | vizualizace frekvence přehrávání změnou okraje v reálném čase | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/108-direct-speaker-border-di.asm |
| 109 | 109-ay-note-a.asm | přehrání komorního A na čipu AY-3–8912 na ZX Spectru | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/109-ay-note-a.asm |
| 110 | 110-ay-note-a.asm | přehrání komorního A na čipu AY-3–8912 na ZX Spectru | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/110-ay-note-a.asm |
| 111 | 111-ay-two-notes.asm | souběžné přehrání dvojice not | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/111-ay-two-notes.asm |
| 112 | 112-ay-noise.asm | vygenerování šumu | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/112-ay-noise.asm |
| 113 | 113-ay-low-frequency.asm | čistý tón s nízkou frekvencí | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/113-ay-low-frequency.asm |
| 114 | 114-ay-high-frequency.asm | čistý tón s vysokou frekvencí | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/114-ay-high-frequency.asm |
| 115 | 115-ay-low-noise.asm | vygenerování šumu s nízkou frekvencí | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/115-ay-low-noise.asm |
| 116 | 116-ay-envelope.asm | použití obálky založené na trojúhelníkovém signálu | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/116-ay-envelope.asm |
| 117 | 117-ay-envelope.asm | použití obálky založené na trojúhelníkovém signálu s vysokou frekvencí | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/117-ay-envelope.asm |
| 118 | 118-ay-envelope.asm | použití obálky založené na trojúhelníkovém signálu s nízkou frekvencí | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/118-ay-envelope.asm |
| 119 | Makefile | Makefile pro překlad a slinkování všech demonstračních příkladů do podoby obrazu magnetické pásky | https://github.com/tisnik/8bit-fame/blob/master/Speccy-asm/Makefile |
20. Odkazy na Internetu
- z80 standalone assembler
https://www.asm80.com/onepage/asmz80.html - The ZX BASIC Compiler
https://www.boriel.com/pages/the-zx-basic-compiler.html - Z80 Assembly programming for the ZX Spectrum
https://www.chibiakumas.com/z80/ZXSpectrum.php - 8-BIT SMACKDOWN! 65C02 vs. Z80: slithy VLOGS #6
https://www.youtube.com/watch?v=P1paVoFEvyc - Instrukce mikroprocesoru Z80
https://clrhome.org/table/ - Z80 instructions: adresní režimy atd.
https://jnz.dk/z80/instructions.html - Z80 Instruction Groups
https://jnz.dk/z80/instgroups.html - Elena, New programming language for the ZX Spectrum Next
https://vintageisthenewold.com/elena-new-programming-language-for-the-zx-spectrum-next/ - Sinclair BASIC
https://worldofspectrum.net/legacy-info/sinclair-basic/ - Grafika na osmibitových počítačích firmy Sinclair
https://www.root.cz/clanky/grafika-na-osmibitovych-pocitacich-firmy-sinclair/ - Grafika na osmibitových počítačích firmy Sinclair II
https://www.root.cz/clanky/grafika-na-osmibitovych-pocitacich-firmy-sinclair-ii/ - HiSoft BASIC
https://worldofspectrum.net/infoseekid.cgi?id=0008249 - YS MegaBasic
https://worldofspectrum.net/infoseekid.cgi?id=0008997 - Beta Basic
https://worldofspectrum.net/infoseekid.cgi?id=0007956 - BASIC+
https://worldofspectrum.net/infoseekid.php?id=0014277 - Spectrum ROM Memory Map
https://skoolkit.ca/disassemblies/rom/maps/all.html - Goto subroutine
https://skoolkit.ca/disassemblies/rom/asm/7783.html - Spectrum Next: The Evolution of the Speccy
https://www.specnext.com/about/ - Sedmdesátiny assemblerů: lidsky čitelný strojový kód
https://www.root.cz/clanky/sedmdesatiny-assembleru-lidsky-citelny-strojovy-kod/ - Programovací jazyk BASIC na osmibitových mikropočítačích
https://www.root.cz/clanky/programovaci-jazyk-basic-na-osmibitovych-mikropocitacich/ - Programovací jazyk BASIC na osmibitových mikropočítačích (2)
https://www.root.cz/clanky/programovaci-jazyk-basic-na-osmibitovych-mikropocitacich-2/#k06 - Programovací jazyk BASIC na osmibitových mikropočítačích (3)
https://www.root.cz/clanky/programovaci-jazyk-basic-na-osmibitovych-mikropocitacich-3/ - Sinclair BASIC (Wikipedia CZ)
http://cs.wikipedia.org/wiki/Sinclair_BASIC - Assembly Language: Still Relevant Today
http://wilsonminesco.com/AssyDefense/ - Programovani v assembleru na OS Linux
http://www.cs.vsb.cz/grygarek/asm/asmlinux.html - Why Assembly Language Programming? (Why Learning Assembly Language Is Still a Good Idea)
https://wdc65×x.com/markets/education/why-assembly-language-programming/ - Low Fat Computing
http://www.ultratechnology.com/lowfat.htm - Assembly Language
https://www.cleverism.com/skills-and-tools/assembly-language/ - Why do we need assembly language?
https://cs.stackexchange.com/questions/13287/why-do-we-need-assembly-language - Assembly language (Wikipedia)
https://en.wikipedia.org/wiki/Assembly_language#Historical_perspective - Assembly languages
https://curlie.org/Computers/Programming/Languages/Assembly/ - vasm
http://sun.hasenbraten.de/vasm/ - B-ELITE
https://jsj.itch.io/b-elite - ZX-Spectrum Child
http://www.dotkam.com/2008/11/19/zx-spectrum-child/ - Speccy.cz
http://www.speccy.cz/ - Planet Sinclair
http://www.nvg.ntnu.no/sinclair/ - World of Spectrum
http://www.worldofspectrum.org/ - The system variables
https://worldofspectrum.org/ZXBasicManual/zxmanchap25.html - ZX Spectrum manual: chapter #17 Graphics
https://worldofspectrum.org/ZXBasicManual/zxmanchap17.html - Why does Sinclair BASIC have two formats for storing numbers in the same structure?
https://retrocomputing.stackexchange.com/questions/8834/why-does-sinclair-basic-have-two-formats-for-storing-numbers-in-the-same-structu - Plovoucí řádová čárka na ZX Spectru
https://www.root.cz/clanky/norma-ieee-754-a-pribuzni-formaty-plovouci-radove-tecky/#k05 - Norma IEEE 754 a příbuzní: formáty plovoucí řádové tečky
https://www.root.cz/clanky/norma-ieee-754-a-pribuzni-formaty-plovouci-radove-tecky/#k05 - 1A1B: THE ‚REPORT AND LINE NUMBER PRINTING‘ SUBROUTINE
https://skoolkid.github.io/rom/asm/1A1B.html - 2DE3: THE ‚PRINT A FLOATING-POINT NUMBER‘ SUBROUTINE
https://skoolkid.github.io/rom/asm/2DE3.html - 5C63: STKBOT – Address of bottom of calculator stack
https://skoolkid.github.io/rom/asm/5C63.html - 5C65: STKEND – Address of start of spare space
https://skoolkid.github.io/rom/asm/5C65.html - Why does Sinclair BASIC have two formats for storing numbers in the same structure?
https://retrocomputing.stackexchange.com/questions/8834/why-does-sinclair-basic-have-two-formats-for-storing-numbers-in-the-same-structu - Chapter 24: The memory
https://worldofspectrum.org/ZXBasicManual/zxmanchap24.html - Survey of Floating-Point Formats
https://mrob.com/pub/math/floatformats.html - Convert an 8bit number to hex in z80 assembler
https://stackoverflow.com/questions/22838444/convert-an-8bit-number-to-hex-in-z80-assembler - 80 MICROPROCESSOR Instruction Set Summary
http://www.textfiles.com/programming/CARDS/z80 - Extended Binary Coded Decimal Interchange Code
http://en.wikipedia.org/wiki/EBCDIC - ASCII/EBCDIC Conversion Table
http://docs.hp.com/en/32212–90008/apcs01.html - EBCDIC
http://www.hansenb.pdx.edu/DMKB/dict/tutorials/ebcdic.php - EBCDIC tables
http://home.mnet-online.de/wzwz.de/temp/ebcdic/cc_en.htm - The Mainframe Blog
http://mainframe.typepad.com/blog/2006/11/my_personal_mai.html - Binary-coded decimal
https://en.wikipedia.org/wiki/Binary-coded_decimal - BCD
https://cs.wikipedia.org/wiki/BCD - Z80 heaven: Floating Point
http://z80-heaven.wikidot.com/floating-point - Z80, the 8-bit Number Cruncher
http://www.andreadrian.de/oldcpu/Z80_number_cruncher.html - Floating-point library for Z80
https://github.com/DW0RKiN/Floating-point-Library-for-Z80 - z80float
https://github.com/Zeda/z80float - Fixed point arithmetic
https://www.root.cz/clanky/fixed-point-arithmetic/ - ZX Spectrum BASIC Programming – 2nd Edition
https://archive.org/details/zx-spectrum-basic-programming/page/n167/mode/2up - ZX Spectrum BASIC Programming – 2nd Edition
https://archive.org/details/zx-spectrum-basic-programming/page/n169/mode/2up - How fast is memcpy on the Z80?
https://retrocomputing.stackexchange.com/questions/4744/how-fast-is-memcpy-on-the-z80 - How do Z80 Block Transfer instructions work?
https://retrocomputing.stackexchange.com/questions/5416/how-do-z80-block-transfer-instructions-work - Retro Programming Made Simple: Keyboard
http://www.breakintoprogram.co.uk/hardware/computers/zx-spectrum/keyboard - How ZX Spectrum avoided key ghosting
https://retrocomputing.stackexchange.com/questions/16235/how-zx-spectrum-avoided-key-ghosting - ZX Spectrum Keyboard Visualized
http://www.kameli.net/marq/?p=2055 - Sinclair ZX Spectrum Joysticks Explained
https://www.retroisle.com/general/spectrum_joysticks.php - When A Single Bit Was Enough, Into The Sound Of The ZX Spectrum
https://hackaday.com/2022/01/20/when-a-single-bit-was-enough-into-the-sound-of-the-zx-spectrum/ - 03B5: THE ‚BEEPER‘ SUBROUTINE
https://skoolkid.github.io/rom/asm/03B5.html - How To Write ZX Spectrum Games – Chapter 3
https://chuntey.wordpress.com/2013/02/28/how-to-write-zx-spectrum-games-chapter-3/ - Understanding computer sound
https://www.youtube.com/playlist?list=PL0qES-IQZC8w4vqeQhxHxKgxYYqs3CEOx - Understanding Computer Sound. 5. ZX Spectrum
https://www.youtube.com/watch?v=N5ACJd2LvbY - Dark Fusion (Gremlin Graphics, 1988)
https://www.youtube.com/watch?v=ADL3mdRMzoA - Arkanoid Spectrum Title Music
https://www.youtube.com/watch?v=TymO0Lj7Vp8 - Tim Follin – „Chronos“ (ZX Spectrum) [Oscilloscope Visualization]
https://www.youtube.com/watch?v=yJy45MHrPjc - [60 FPS] Wally Beben – „Sanxion Loader“ [ZX Spectrum (Beeper)] (Oscilloscope View)
https://www.youtube.com/watch?v=JwMxOfQVl7A - Understanding Computer Sound
http://forgottencomputer.com/retro/sound/ - AY-3–8912
https://sinclair.wiki.zxnet.co.uk/wiki/AY-3–8912 - AY-3–8912
https://github.com/topics/ay-3–8912 - Z80 Assembly programming for the ZX Spectrum
https://www.chibiakumas.com/z80/ZXSpectrum.php?noui=1 - AY-3–8910
http://vgmpf.com/Wiki/index.php/AY-3–8910 - AY-3–8910/8912 Programmable sound generator data manual
https://f.rdw.se/AY-3–8910-datasheet.pdf