Myslím, že by bylo vhodné uvést, proč se pro 320x200x256 používá tak „podivná“ organizace paměti, aby to nevypadalo, že IBM jsou úplní pitomci, co jen tak bez důvodu zahodí 3/4 kapacity paměti. :-)
Uplni pitomci v IBM urcite nejsou, jsou jen trosku zahledeni sami do sebe (ostatne je to predevsim jejich problem, jine firmy z toho profituji).
U VGA totiz chybi krome cca sedmi existujicich ctecich/zapisovych rezimu jeste rezim jeden (ci jejich doplnek), kdy by se pomoci jednoho dvoubitoveho registru specifikoval offset zapisu do bitovych rovin. Z obrazku uvedeneho v clanku je patrne, ze v rezimu 320x200x256 jsou vsechny bitove roviny zretezeny tak, ze se z kazde vyuzije pouze ctvrtina pixelu - dalsi tri ctvrtiny nejsou dostupne.
Zapis a cteni pixelu je potom sice jednoduche, ale diky zretezeni rovin (posledni dva bity adresy ve skutecnosti specifikuji bitovou rovinu, nikoli adresu v rovine) jsme prisli o moznost ADRESACE zbylych pixelu, ty tam samozrejme jsou ulozeny, jak se da dokazat prepinanim chained/unchained mode. Stacily by tedy ctyri dalsi bity, kterymi by se specifikoval offset v ramci jedne bitove roviny. To u IBM neudelali, proto je z tohoto hlediska VGA docela slozite programovatelna, zejmena v porovnani s dalsimi grafickymi subsystemy te doby - Amiga, Atari ST atd.
Toto se da "decentne" obejit zapnutim mapovanim celych 128KB pameti najednou 0xa000-0xbfff (celkem neznama "ficura" :-). Tak mame i s touto organizaci pameti trosku mista (2 obrazovky) na scrolling. Problemem je pak jeste prace v RealModu, kde muzeme pres segment adresovat pouze 64 KB (takze si musime dynamicky nadstavovat i segment:-{
Ano, tato fíčura se kupodivu příliš často nepoužívala (pár dem), i když byla vcelku jasně popsaná i v manuálech od IBM. Snad to bylo tím, že se měla zachovat kompatibilita s dvoumonitorovými systémy - ve své podstatě by se ale nemělo nic stát, kdyby se při zápisu do segmentu 0xb000 tato data zapisovala současne do paměti VGA i MDA/Herculesu. Akorát by jeden z těchto adaptérů zobrazoval bordel :-)
Ale adresace 128kB pořád nenahrazuje ztrátu 3/4 paměti v chained režimu.
A nepouziva se nahodou ten chained rezim kvuli rychlosti pametovych cipu?
Tech 25MHz by totiz vyzadovalo minimalne 40ns nebo rychlejsi pameti, ale na
VGA sou typ. 60-80ns chipy (vecinou 8: 64k x 4bit). Pokud bude kazda bitova
rovina v samostatnem chipu a pri cteni se postupne vystridaji 1. az 4. tak se
snizi naroky na casovani a zvladne to i ten 80ns chip.
Přesně tohle jsem taky původně měl na mysli. Ale pořád zůstává faktem, že i tak se dala adresace udělat tak, aby se neztratily 3/4 kapacity. Jenže, po pravdě řečeno, jsem rád, že to takhle udělali – programovat cokoli pro třeba 640x480x16 byl porod, 320x200x256 byla vždycky nádhera. :-)
Ano, s rychlostí pamětí mohou být problémy, ale ono ani tak nejde o vlastní čtení z paměti (vždyť se pořád zobrazuje pouze 64000 pixelů), ale o přístup do zbylé paměti, tedy "posun" uvnitř bitových rovin.