DMA se programovalo tak, že se naprogramoval celý buffer (který mohl mít max 64kB). Zvuková karta pak přehrávala tento buffer dokola, a přerušení posílala vždy v prostřed a na konci. Program pak postupně plnil levou nebo pravou půlku bufferu. Na zvukové kartě SB16 pak přibyla povinnost naplnění buffer potvrzovat kartě, jinak se nepotvrzená půlka nepřehrála a přehrávání se zastavilo, dokud se buffer nepotvrdil. Zabraňovalo to typickému koktání vyplývající právě ze situace, kdy se program zastavil na delší čas, než byla rychlost přehrávání.
Jinak přerušení bylo dalším celkem dobrým zdrojem cyklicky spouštěných přerušení (časovač), akorát pokud neměla hrát hudba,musel se buffer vynulovat.
Obecně si myslím, že v architektuře PC bylo velice málo časovačů k volnému použití, systémové byly obsazené a člověku zbýval jen ten na Adlibu, nebo na SB, připadně na externí kartě s čipem 8253.
Jo jasně Int 8. Ale ten byl právě obsazený. Jeho přeprogamování bylo taky dost zásadný zásah do systému, například se zrychlily hodiny. Celý plánovač DOSu najednou více zatěžoval systém. Proto, pro vyšší frekvence se buď úplně odstavil, nebo se původní obsluha volala tak, aby bylo dosaženo původní frekvenci (a povoloval jsem při tom přerušení, aby zpracování int 8 mohlo přerušit vše co bylo zavěšené v původní obsluze, musel jsem akorát zajistit, že mi to tam nevleze víckrát :-)
V Branách Skeldalu byl Int 8 přeprogramován na 50Hz. Používal se na všelicos, hlavně od toho bylo odvozeno časování hry. Ve Windows Patchi se to už nepoužívá, odvozuje se to jinak.
Diky za doplneni. Jeste se dal pouzit "casovac", presneji tedy pravidelne vyvolavane preruseni od VGA karty pri vertical blanku (navratu paprsku), napojit na to nejaky citac nebyl problem - implementace double bufferingu apod. (bez vertical blanku sel delat jen tripple buffering, a na to v nekterych grafickych modech (muj oblibeny 320x400) jiz nezbyla volna kapacita VRAM (ale pro klasicky mod-x bylo mozne pouzit tri buffery).
V pozdejsich PC byl jeste volny kanal pouzivany drive pro refresh pameti, ale nevim, jestli ho nekdo skutecne vyuzival (to uz bylo v dobach 32bitovych OS, kdy se primo na hardware uz moc nesahalo :-)
Me u tech modu s 240 nebo 480 radky vadilo, ze jely jen v 60 Hz a pri svetlem pozadi to dost blikalo (treba mam dojem, ze Vyhen nejaky podobny mod pouzivala, tam to pri cteni dost vadilo). Mody s 200 a 400 radky jely v 70 Hz. Taky sly trosku menit i setnactibarevne rezimy, az nekam k 800 pixelum na radek, ale to muj monitor vetsinou uz nedal a pridaval si k tomu dalsi graficke efekty a pisteni :-)
Já jsem VGA viděl v režimu 800x600x4. Ale VGA má dva fixní zdroje časování a nejde tam zvětšit pixelclock, takže ve výsledku ten mód 800x600 jel na asi na 35Hz. Z toho blikání by člověk leda dostal nějakou psychickou poruchu.
No prave, VGAcko melo pro pixelclock max. 28MHz krystal (druhy mel 25MHz), to znamena, ze zvyseni rozliseni se resilo zmensovanim borderu, tj. snizovaly se casy mezi horizontalnim navratem paprsku a vykreslovanim a naopak horizontalnim i vertikalnim roztahovanim screenu. Do urcite miry to monitory zvladaly (musely si vlastne porad synchronizovat casovou zakladnu, napriklad muj MAG u toho pekne cvakal :-), ale nektere mely na vyssich rozlisenich jiz problem se synchronizaci, jak snimkovou, tak i radkovou. Tech 800x600 je asi opravdu maximum, co se dalo rozume vytahnout.
U nekterych dem se slo ale zase niz, takze se pouzivaly treba rezimy s "kulatym" horizontalnim rozlisenim 256x200 ci 256x240 apod.
Emulátor ZX Spectrum při mé prezentaci na VŠ uměl 256x192 i s plnohodnotným Border. Byl to skutečný border VGA karty roztažený do větších pásů. Časování bylo upraveno tak, aby tenhle režím byl spíš obdélníkem (aby CIRCLE 100,100,50 udělala opravdu kruh).
Grafický režim byl 256 barev organizovaných tak, že dolní půlka (4 bity) byly Ink a horních půlka Paper. U pozadí to bylo obráceně. cca 4x za sekundu se převrátila paleta, tak aby barva Ink se stala barvou Paper. Tím se emulovalo celoobrazovkové blikání :-D
800x600 jsem simuloval rozlišením 800x300 s emulovaným interlaced. Fungovalo to tak
1) na kartě se nastavil nějaký režím 640x350
2) karta se načasovala tak, aby udělala 800 bodů na šířku a 300 bodů na výšku
3) délka scanline se zvětšila 2x (tedy 1600 bodů na řádek), karta kreslila každou druhou řádku
4) při přerušení na V-blank se posunul offset o 800 bodů tam nebo zpět.
V Branách Skeldalu šlo v DOSu zapnout 320x480x256 jako fallback pro karty, které neuměly 640x480x32768. Přepočet barev byl sofistikovaný, výsledek byl šílený. Dalším fallbackem byl 640x480x16(gray). I tam si člověk vyblbnul z Latch Registry.
Chtělo by to zase nějaký článek o HW o grafice :-D
Clanek o grafice tady pred nejakou dobou bezel, ale je fakt, ze jsem se v nem do nejakych vice hardcore veci nepoustel. Urcite v tomto serialu neco o grafikach bude, od prehistorie az po ty moderni zrouty energie :) Jestli mas (mate) nejake napady k obsahu, urcite je uvitam.
Co mas vlastne spolecnyho s BS? Co si pamatuju, tak to delal nejakej Jindra Rohlik, nebo vas bylo vic? (jinak klasickej ctvereckovej dungeon, to je ma druha nejoblibenejsi kategorie her, hned po Dune II-like hrach)
Btw, prepocet barev z 2^24 nebo 2^16(15) do 256 umi dobre napriklad knihovna Allegro, akorat si na prevodni tabulku vezme dost pameti (presneji dnes je to jedno, v dobach DOSu to bolelo).
Jindra to produkoval, já to programoval, Karel (Matějka) to víceméně kreslil, podle návrhů Martina Zhoufa. Bylo to v letech 1996 - 1998, původní kód vznikl ve Watcom C, jako extender byl použit Dos4GW. Dneska se to dá (po větších úpravách) přeložit ve Visual Studio 2008. Na SF to leží ve stavu "stáhní, přelož projekt a spusť", měl by to zvládnout každý.
No ta moje převodní tabulka měla z 2^16 na 2^8 64KB, vlastně to bylo jednoduchý, kouklo se do tabulky a jelo. Hra původně běžela v 32tis barev a v tabulce byly pro každou barvu dve alternativy, které se periodicky střídaly (jednoduchý dithering)
Diky za objasneni a gratuluji k velmi pekne hre (i kdyz se priznam, ze jsem nemel cas ji nikdy dohrat :-), urcite to byla v dobach DOSu a prvnich SVGA karet zabava (VESA API bylo takove vselijake, asi sis pri nastavovani toho hi-color rezimu uzil, co?)
Jojo, původně se to psalo jen na VESA 2 (s frame bufferem). Nakonec se dodělala podpora na VESA 1 s bankami (ve finále to zvládalo obojí, FB byl rychlejší). Několik výkonově náročných (tehdy náročných) funkcí bylo psáno asi 6x, pro každý grafický režim jinak. Po problémech s 15bit hloubkou se do patche dodělala podpora 16bit hloubky (také tabulkou). Celkově bylo k dispozici několik režimů. 640x480x16, 640x480x15, 640x480x8 (s pevnou paletou a ditteringem), 320x480x8 a 640x480x4 (odstíny šedi). Na Vesa bežely pouze první tři, čtvrtý byl xmode a pátý byla obyčejná VGA 16 barev. Níž už to nešlo (zkoušel jsem ještě EGA, ale to jsem vzdal).
Pokud se vrátím k tématu, Brány Skeldalu uměly SB16+, SBPro (stereo), SB2, SB1, Gravis Ultrasound (ale mixování bylo SW, protože rutinka už byla napsaná a přepisovat celý systém mixování jen kvůli GUSu se mi nechtělo) a ještě Windows Sound System (zvláštní karta, té době v naších zeměpisných šířkách ale častá). Dále to samozřejmě hrálo přes Covox (ale jen mono) a přes PC Speakera (ten samplovaný režim). Ve všech režimech chodily všechny zvukové efekty i muzika, jenom u PCSpeakera se každé natažení muziky projevilo cvaknutím, takže se většinou muzika v tomhle případě vypínala :-)