V MCGA režimu, tedy ten režim 320×200×256 je skutečně mapováno tak jak je popsáno. Grafická karta jednoduše dva dolní bity adresy zároveň používá k výběru bitové roviny. Jestli mi někdo připomene, zda fungování tohoto zřetězení je opravdu závislé jen na Memory Mode Registru. Protože co si pamatuju, VGA byla hodně schizofrenní a každý obvod se musel programovat zvlášť. Nastavit třeba emulaci CGA v sequenceru tedy nestačilo, muselo se to nastavit asi na dalších třech místech. Teď jsem se díval do různých materiálů a nenašel jsem nikde informaci o tom, jak VGA zjistí, že to zřetězení není jen na úrovni přístupu do paměti procesorem, ale že se musí tímto způsobem data také načítat do posuvných registrů.
A ještě k paletě. V režimech VGA 16barev bylo možné použív VGA paletu, ale kdo si s tím zkoušel hrát, zjistil, že se nějak divně mapují barvy na indexy v této paletě. VGA tam dělala dvojitý překlad. Nejprve se z indexu udělala EGA barva a tato barva pak fungovala jako index do VGA palety. Barvy 0–15 se tedy mapovaly na indexy 0–6,56,7,58–63 Tenhle způsob mapování bylo možné vypnout nastavením EGA palety 1:1 hodnotě indexu.
Ahoj,
ten dvojity preklad barev byl dost opruz, inzenyri z IBM to tak navrhli kvuli zpetne kompatibilite s EGA (ta mela paletu 16 barev z 64). Ale nejlepsi, nejjednodusi a nejrychlejsi bylo zapisovat primo do tabulky D/A prevodniku.
S tim prechodem zretezeny/nezretezeny rezim (MCGA vs mod-x) je to trosku slozitejsi, nastavuje se jak priznak pro zretezeni, tak i rezim pristupu do pameti a jeste jedna vec, na kterou si ted nemuzu vzpomenout. Podivam se do kodu (asm) pro prepnuti MCGA/mod-x/zpet, a poreferuju.
Jo už vím. V režimu MCGA 320×200 je zapnut režim „adresa po 4 taktech“, nachází se v sekvenceru 3?5h / registr 14h … registr se jmenuje „Underline Location Register“.
Pokud je tam jednička, VGA zobrazí 4 body ze 4 bitových rovin a pak posune čítač adresy o 4 pozice. Pokud je tam nula, tak se takto neděje.
Podle toho se spíš domnívám, že obrázek není úplně správně, Ty čtyři body se skutečně ukládají pokaždé do jiné roviny, ale vždy na stejnou adresu dělitelnou 4. Tedy budou pod sebou.
Ale nemám to ověřený, chtělo by to vyzkoušet, Něco zapsat v MCGA a pak to přenout do ModeX a jak bude výsledný obraz vypadat. Jestli ty 4 body budou stále vedle sebe, nebo od sebe odskočí s mezerou 4 pixelů.
Mozna mas pravdu s tim, ze se vzdy ctyri body ukladaji do bitovych rovin „pod sebe“, budu si to muset vyzkouset. V praxi se to v podstate neprojevilo, protoze pro pristup k 3/4 obrazove pameti by se musel zretezeny (chain) rezim vypnout, ale bude zajimave po tak dlouhe dobe zjistit, jak to presne fungovalo.
Vlastne je skoda, ze AFAIK neexistovala zadna moznost nastaveni offsetu zacatku obrazove pameti ve zretezenem rezimu, to by se double buffering/triple buffering delal strasne jednoduse bez nutnosti prepnuti do x-modu (unchained).
Vždycky jsem našel návody, jak nastavit XMode ale nikdy jsem nezkoumal, jak je to nastaveno předtím.
Dnež už nemám jak to vyzkoušet, takže jsou to jen teorie. Taková druhá teorie je, že sequencer je nastaven do režimu dvojslov, (taky registr 14h), tam se ale mapují nejvyšší bity adresy na spodní dva bity a body se berou z bitových rovin. V tomhle uspořádání by takový offset nefungoval, protože ten prostor mezi každým bodem v jedné bitové rovině není prázdny. Přesnějí na pozice dělitelné se zbytkem roven 0 se mapuje první čtvrtina obrazovky, se zbytekem 1 druhá čtvrtina, ze zbytkem 2 třetí, atd…
mapování pak vypadá takto
AABBBBBB BBBBBBCC
A – čtvrtina obrazovky
B – bod ve čtvrtině
C – bitová rovina
bod.adresa:00BBBBBBBBBBAA
bit.rovina:CC
Je vidět, že adresa nad 64KB je opravdu nedostupná bez Xmode.
Pravda, prechod Xmode->13h se moc neresil, protoze to delala sluzba BIOSu, int 10h. Ale AFAIK mel BIOS pro kazdy standardni graficky rezim (0h-13h) ve svem datovem bloku (dostupnem samozrejme i programatorum) obsahy vsech ridicich registru graficke karty. Zcela urcite to platilo pro standardni EGA, u VGA to (vzhledem k ruznym klonum) mozna nebude 100% platit.
Jeste, kdyby to nekoho zajimalo, nastaveni barev na VGAcku. Funkce outp() zapisuje bajt (druhy parametr) na I/O port s adresou udanou v prvnim parametru, tj. jde o obdobu strojove instrukce outb:
#define uchar unsigned char void Write_DAC_C_Palette(uchar StartColor,uchar NumOfColors,uchar *Palette) { outp(0x03C6,0xff); //Mask all registers so we can update any of them outp(0x03C8,StartColor); //1st color to input! for(short i=0; i<NumOfColors*3; i++ ) { outp(0x03C9,Palette[i]<<2); } } void Set_DAC_C(uchar Color,uchar Red, uchar Green, uchar Blue) { outp(0x03C6,0xff); //Mask all registers even though we only need 1 of them outp(0x03C8,Color); //Color to set outp(0x03C9,Red); outp(0x03C9,Green); outp(0x03C9,Blue); }
Trochu mi chyba popis karty PGC (niekedy PGA).
Bola to mozno trochu malo rozsirena specialitka, ale ja som kontakt mal aj ked iba s monitorom, v 90tych rokoch moje prve pc malo monitor EGA/PGA (bol tam prepinac). Graficku kartu som mal VGA Sigma (na 8 bit ISA), ktora mala TTL 9 Pin aj 15 analogovy pin D sub. Monitor mal 9 pin a po prepnuti na EGA to slo dobre aj na VGA rezimy s jednou vadou – totalne rozhodene farby.
Potom asi po roku hrania vsetkeho vo farbach duhy som nasiel v manuale zapojenie 9 pin dsub v rezime PGA a podarilo sa mi zletovat redukciu z vga 15 pin na pga 9 pin. Vsetky hry zrazu dostali novy rozmer :D Druhy problem bol ze monitor bol uz dost vypaleny a strasne tmavy, takze taky doom bol o uroven strasidelnejsi :) :) Potom mi niekto povedal, ze sa da potenciometrami vnutri monitora doladit svietivost a potom som stastne a normalne pouzival EGA/PGA monitor na VGA az kym som ho nepredal kvoli nizkej obnovovacej frekvencii :)
A mal som asi 16 rokov a bol som na seba hrdy :)
O PGC se jeste zminim. Mate pravdu v tom, ze u nas se tato karta pravdepodobne moc nepouzivala, co si pamatuji, tak se dovazely hlavne Herculesy, EGA a VGA.
Ale vzhledem k tomu, ze slo v podstate o prvni graficky akcelerator pro PC (i kdyz fungoval zcela jinak nez dnesni akceleratory), tak se o PGC zminim.
S VGA kartou se daly dělat různé vylomeniny, jestli si dobře vzpomínám, tak monitor při zpětném řádkovém chodu generoval hardwarové přerušení. Pokud programátor v obsluze tohoto přerušení stihl změnit paletu některé barvy (resp. indexu barvy), mohl napřklad dostat do jednoho snímku tolik barev, kolik měl řádků. Tuším, že jsem to zkoušel v rozlišení 640×480, ale možná taky v textovém režimu, je to tak dávno :). Další fintou bylo tyto změny palety při každém novém snímku trochu posunout. Nejenom že pak měl obraz 480 (400) barev, ale ještě se barvy naprosto plynule posouvaly po obrazovace, což působilo neskutečně s tehdejším hardwarem.
V praxi to samozřejmě nebylo moc využitelné, ale mám pocit, že právě hra Scorched Earth dělala efektní výbuchy tak, že rotovala paletu některých barev mezi jednotlivými snímky. Bylo to mnohem snažší než překreslovat všechny pixely, které se výbuchu týkaly (což by asi hardware ani nestíhal).
Na animování palety mají dokonce Windows API
http://msdn.microsoft.com/…ary/dd183355(VS.85).aspx
Mate pravdu, jak Tank Wars, tak i Scorched Earth pouzivaly animaci palety. Vypadalo to zajimave predevsim na starsich pocitacich – samotne vykresleni vybuchu bylo pomale, dokonce bylo patrne vykreslovani pixelu u nejvetsich kruznic a potom animace palety uplne plynula, vsak se taky posouvalo jen nekolik bajtu :-)
Před cca 18ti lety jsem se v práci setkal s počítači Olivetti, už nevím typ. Byly XT kompatibilní. Byl to kompakt i s monitorem.
Měly údajně grafickou kartu CGA, ale textový režim byl kvalitní.
Studiem manuálu jsem zjistil, že mají jakousi kartu ATT kompatibilní. V textovém režimu měla
640×400. Ale v té době se hlavně používal T602, který se spouštěl v CGA režimu což byla kvalita naprd. Když jsem nahlédl do manuálu T602, zjistil sem, že T602 tyto karty podporuje. Stačilo spustit : „T602.EXE /ATT“ a kvalita zobrazení se zvíšila o 100 %. Mohl by někdo pro zajímavost řící něco bližšího o této grafice ?
Muzu :-) rozepisu se o ni trosku vic priste.
Je to skutecne karta kompatibilni s nejakym cipem z AT&T s rozlisenim (i grafickym, jak spravne pisete) 640×400 pixelu monochromaticky popr. 640×200 CGA 2 barvy popr. 320×200 CGA 4 barvy.
Jinak to, krome 2× vetsiho vertikalniho rozliseni v textovem rezimu, nic dalsiho oproti CGA neumelo :-). Takze fakta:
graficka pamet zacinala na 0×b800:0000
Textovy rezim 640×400 se nastavoval pres BIOS pomoci sluzby 10 (klasika), cislo rezimu 0×48 nebo 0×c8 – oboje jsou nestandardni cisla rezimu. Organizace pameti je tusim stejna jako na CGA, tj. sudy/lichy radek, ale to uz nemuzu vyzkouset, protoze moje Quaderno jiz nebootuje :(
Take jsem se setkal s pocitacem Olivetti, kompatibilnim s XT, melo to dve 5 1/4", 360 kB disketove mechaniky, zadny HD, docela prijemnou klavesnici, ale kvuli cemu pisu – ta graficka karta, kterou to melo, se jmenovala EGC, viz napr.:
http://www.root.cz/…leratory-12/#k07
Umelo to 640×400×16 barev v grafickem rezimu, takze lepsi nez EGA.
;-)
V odstavci 3 se pravi:
Díky tomu, že barvonosné signály (R, G, B) jsou analogové, není maximální počet barev omezen na šestnáct barev tak, jak je tomu u monitorů pro grafickou kartu EGA, u níž se každá barvová složka přenášela pomocí dvojice binárních (TTL) signálů. Pro každou složku tedy bylo možné nastavit pouze čtyři intenzity: nulovou, třetinovou, dvoutřetinovou a maximální.
Kdo si to pamatuje, tak ho musi prastit, ze omezeni EGA dane zpusobem prenosu nebylo na 16, ale na 64 barev (4×4×4). Omezeni na 16 barev bylo dano kapacitou pameti. Techto 16 „barev“ bylo pak mapovano do palety 64 barev.
Pro redakci: Prestoze je v seznamu povolenych znacek i <blockquote>, tak nefunguje a obsah oznaceny touto parovou znackou se vubec nezobrazi. Znacka <cite> funguje normalne.
…a bohuzel zase aspon dvakrat ve sve podstate. Dalo by se rict, ze aspon pokud jde o toto podivne spojeni, autor ve sve podstate snad ani netusi, co pise. (Jeste, ze to aspon vi o predmetu clanku. :-) )
Clanky jsou jiste zajimave a uzitecne, ale ta svoje podstata z nich „couha“ prilis napadne (a prilis casto, ale tady je asi prilis casty jakykoli vyskyt.)