MOTOROLA 68000 (12. část)
Dneska budu pokračovat v pokecu o programování časovačů na ST/STE.
2) přístup přes hardware registry (bylo minule), XBIOS
3) Přehrávání samplů řešené na ST přes TIMER A
4) ŕádkový rozklad pomocí TIMER B, umožňující více než 16 barev na obrazovce.
XBIOS
Přístup přes XBIOS má oproti přímému programování jednu velikou výhodu. Pokud by například došlo ke změně adres časovačů, byly by tyto rutiny pravděpodobně korektně upraveny a váš program by fungoval i nadále. Druhou výhodu, pro kterou se XBIOS používá například v programech napsaných v jazyce 'C', bych viděl v možnosti zavolat XBIOS, který se hrabe ve všech možných hardware registrech, a přitom zůstat v user módu procesoru.
Jak však programovat právě časovač? V jazyce 'C' by se mělo jedna o funkci Xbtimer či nějak podobně a v Asembleru:
pea VECTOR,-(sp)
move.w
data,-(sp)
move.w
control,-(sp)
move.w
timer,-(sp)
move.w
31,-(sp)
trap
14
lea 12(sp),sp
_VECTOR_ je adresa, kde se nachází rutina pro časovač.
Proměnná _data_ označuje počet tiků, které musí proběhnout, aby se rozběhlo přerušení.
_control_, sem musí být zapsána hodnota jak bylo minule uvedeno (ovládací registry). Jediný rozdíl tvoří TIMER D, který by měl být samozřejmě o 4 bity posunut dolů.
_timer_
Timer A: 0
Timer B: 1
Timer C: 2
Timer D: 3
I přesto, že lze nastavit časovače bez používání hardwarových adres, stejně se jim nevyhnete, protože vaše rutina je bude muset sama pravděpodobně nastavovat (nemusela by, kdybyste pracovali v módu Automatic Software of Interrupt). A navíc, pokud budete využívat nějakých zvláštních schopností časovačů, nakonec se jim stejně nevyhnete. Ovšem, program, ve kterém použijete Xbiosy bude pro mnoho coderů těžko luštitelný bez objasňujících komentářů ;-).
3) Přehrávání samplů na ST řešené přes TIMER A
Přehrávání samplů na STE už kdysi, v dávné minulosti Narsilu, vysvětloval NED, jak však takovou věc udělat i na ST, to si rozebereme až dnes.
Jak to tedy vlastně funguje. Snad každý z vás přibližně chápe (já to totiž také chápu pouze přibližně :), že zvuk se vytváří určitou změnou hustoty vzduchu, který poté dolehne na membránu (nebo sluchové buňky). Následovně dojde k jejich kmitání a tímto způsobem se vytvoří zvuk. Bohužel, tvůrci ATARI ST nějak nepochopili, že dalším prvkem, potřebným pro zvýšení kvality her v letech 80., budou právě samplované zvuky. Toho si povšimla naopak firma Commodore, a proto tento způsob přehrávání do svých počítačů vložila, čímž si zajistila dostatečný náskok. Naštěstí, Atari programátoři se nezvzdali své šance jen tak lehce, a řekli si, když jdou samply přehrávat na Spectru a osmikilech, proč by to nezvládlo i ST. Pro přehrávání použili, podobně jako u osmibitů, obyčejné, frekvenčně modulované, kanály obvodu YM-2149. Jak? Velmi jednoduše, vypustili všechny jeho schopnosti týkající se modulace tónu, a nadále se věnovali pouze hlasitostem, tedy změnám hustoty. Jelikož má YM-2149 hlasitostí na každém kanálu 16, tedy 4 bity a kanály celkem 3, říká se tomuto způsobu zpracování občas i 12 bitový replay, což sice není vůbec pravda, ale zato toto číslo poměrně dobře vystihuje podstatu :-).
A do těchto tří kanálu se při každé hodnotě digitalizovaného zvuku (obvykle 8 nebo 16 bitů, tedy v rozsahu 0-255 nebo 0-65535) přiřadí tři hodnoty, do každého kanálu jedna hlasitost. A takhle vzniká zvuk. Abychom však dostali nijak nezkreslený zvuk (i když zkreslený je opravdu vždy :-), musíme alespoň dodržet stejnou frekvenci, jaká byla při přehrávání. A právě k této věci nám pomůže časovač, který dokáže měřit s přesností až na 1 milióntinu vteřiny. Nám však postačí maximálně 1 dvacetitisícina (na vice Khz se počítač ST stejně zavaří), takže už vlastně nemáme žádný problém, jen to napsat.
V dnešním TOS archívu pro nás kódery jsou ohledně přehrávání samplů dva soubory, jeden má název UNSIGNED.S, ten slouží k přehrávání samplů (SND a SAM), tedy samplů ze STOS Maestro, u kterých si i sám detekuje přehrávanou rychlost a klasických samplů SND, které byly používány ve starších hrách. Tam si musíte nastavit ale rychlost sami.
Druhý zdrojový kód má název SIGNED.S, který přehrává osmibitově samply ve formátu DMA přehrávání používaného například u STE (mono) či zvuky používané ve všech těch Noise, Pro a jiných trackerech. I u této alternativy si musíte nastavit rychlost sami.
K samotnému přehrávání se vyjadřovat příliš nebudu, protože se jedná o poměrně přehledný zdrojový kód, který bude běhat dokonce i na Falconech a TT, protože žádným způsobem neovliňuje obsah programových buněk (self modification) a nepoužívá neexistující adresy soundchipu, ST a STE mělo adresy $ffff8800 a $ffff8802 namapované na celé stránce paměti, tj. (8804 bylo 8800 a 8806 bylo 8802 atd.).
4) ŕádkový rozklad pomocí Timer B
To je další často používaná rutina na ATARI ST/STE. Nejčastěji se systém řádkového rozkladu používal na osmibitech, kde byl opravdový nedostatek barev (ZX, Commodore, Atari 800). Tehdy tuto metodu používali patrně všichni a komu to šlo nejlépe, ten dělal nejlepší hry. Ještě dnes si vzpomínám na hru Ghost Chaser, kde byla na každém řádku taková spousta duchů, že jeden opravdu nechápal. To vše díky spriteům na osmistovce a řádkovému rozkladu.
Později se vyrojili počítače nové, některé měli řádkový rozklad tak nepřehledný, že se nepoužíval (Mac a PC), jiné měli dost barev (Silicon) a ostatní opět tyto berličky používali (Amiga a ST). ST, co se týče počtu barev dopadlo ze 16-bitů nakonec pravděpodobně nejhůře, mluvím o standardním vybavení a bavím se o dnešku, v době svého vzniku mělo PC jen textové režimy, pozdějí 'bombastické CGA', lepší 'EGA', která je s ST patrně nejsrovnatelnější, a nakonec vcelku kvalitní VGA.
Jenže, programování i na těchto 16 barvách jde, stačí se jen na chvíli zastavit, myslím přerušení VBL ;-), připravit přerušení přes Timeru B, a pak to celé spustit. Čítač v timeru označuje počet řádků (televizních), které se nakreslí do dalšího přerušení. V přerušovací rutině můžete prakticky dělat cokoliv, ale význam má z hlediska rychlosti měnit pouze barvy, kolik barev změníte, to záleží samozřejmě na vás, ale jako první každopádně doporučuji měnit barvu 0, ta se projeví ihned. Ve hrách tohoto systému obvykle používají k vytvoření oblohy (Shadow of the Beast, Vroom), nebo k změně palety při vykreslování skóre tabulky (Chaos Engine) či rozpůlení obrazovky pro dva hráče, přičemž každý se pohybuje v úplně jiných barvových lokací (neznám takovou hru, ale můžete ji zkusit udělat). Jinak je podobného systému použito dokonce u TOS 1.4 a 1.6 v barevném rozlišení v dialogu desktop info.
Pozor!! Součet řádků na které čekáte musí být roven počtu řádků na obrazovce, tj. 200, jinak dochází k nepatřičnému chaosu, barvy poskakují.
Pro vytváření hodně barev jsou v dnešním ZIPu dvě rutiny. Jedna se jmenuje 118AEO.S, zde pracuje počítač v režimu Automatic End of Interrupt, což vám umožní například kombinaci takové rutiny s přehráváním samplů dohromady apod.
A druhá se jmenuje 118SEO.S, ta pracuje v módu Software End of Interrupt. Rozdíl mezi těmito dvěma kódy uvidíte sami.
Kromě VBL a Timer B pozmění rutina i vektor přerušení klávesnice tak, aby nedocházelo k rušivým jevům zapřičíněným dlouhým trváním jejího volání.
A tím končím vysvětlováním významu Timer A a Timer B z hlediska kódování. Timer C (200 Hz), kódeři využijí pouze na vytváření časové smyčky či přehrávací rutiny pro módy a Timer D si můžete přepsat dle libosti :-), tedy pokud zrovna nepoužíváte modem :-).
Tak se zatím mějte . . .
HEAD
P.S. Jak řekl Sedma, ty nepropracovanější rutiny si kóder stejně nechává pro sebe, takže vám je k dispozici nedávám (týká se to přehrávání samplů). Není to však, myslím, že u Sedmy je to podobné, z důvodu čistě sobeckých. Ty nejpropracovanější rutiny totiž vždy někde něco ošidí. Dám vám malou radu, pokud například budete chtít mít dobře optimalizovanou rutinu, zkuste použít samo modifikaci, nebude sice potom běhat korektně na Falconech, ale co je vám po tom, však si můžou vypnout cache. Druhá věc jak to jde udělat, kontrolovat konec samplu až po každém VBL atd. Pokud by si přece jen někdo nevěděl rady, ať mi ukáže nějaký kód, kde by rutinu rychlejší zhruba o 20% nutně potřeboval a já mu ji tam s klidem dám.