Még mindig egyetlen scanline a vizsgálódásunk tárgya.
Azt tudjuk már, hogy egy sort így állítunk elõ: adott idõben kipakoljuk a megfelelõ adatokat. Nézzük, mik ezek az adatok, és honnan jönnek!
Az alapelv egyszerû; a B/W megoldás: elõvesszük a memóriából a neki megfelelõ szóhosszúságot (a mi esetünkben 8 bitet), és kiléptetjük a RAMDAC órajelével.
Igenám, de mi színes pixeleket szeretnénk, 8 bites színmélységgel, akkor tehát 8 db shift regisztert kéne használnunk. Számoljunk! A RAMDAC 7.125 MHz-es, tehát 140 ns-enként kéne 8 bitnyi adatot olvasni a memóriából. Ajjaj, ez nem fog menni... Lassabban kell olvasni azt a fránya memóriát. Sõt, még annál is lassabban, mint ahogy lehetne, mert a proci is akarja használni. Kompromisszumot kell tehát kötni. A NICK 8-szor ennyi idõ alatt olvas be egy byte-ot.
Ha a proci akarja elérni a memóriát, miközben a NICK is, akkor a NICK egész egyszerûen "elveszi" a proci órajelét arra az idõre. Brutális, de hatékony megoldás
Ennek persze ára van. Az elérhetõ felbontás és színmélység így egymás konkurrensévé vált (mint ahogy a szépség és az ész szorzata is állandó
) Egy 8 bites adat így tartalmazhat 8 db 2 színû pixelt, vagy 4 db 4 színût, vagy 2 db 16 színût, vagy 1 db 256 színût.
1 bittel persze csak 2 szín közül, 2 bittel csak 4 közül stb. lehet választani. Hogy melyik legyen az a színcsoport, erre szolgál a paletta.
A shift regiszterünk tehát így módosul 2-C (két színû) módban.
A MUX a multiplexer (adatválasztó) jelölése.
4-C módban (figyeld meg, a RAMDAC csak a fele)
16-C módban (a RAMDAC itt csak a negyede)
256-C módban RAMDAC/8 a shift regiszter órajele.
A pixel ezeken a rajzokon már 8 bites (kék vonalak), ahogyan a paletta is.
A szín üzemmód egy teljes scanline-ra vonatkozik, mivelhogy egy sorban csak egyszer lehet megadni.
Az már megvan, hogy
hogyan jelenítsük meg a színeket, az van még hátra, hogy
honnan vegyük az adatokat, és miként interpretáljuk.
Alapvetõen 4-féle display mód van, a pixel, az attribútum, a karakter, és a speciális. Ezek változataival együtt 7-féle. A NICK két pointert (LD1, LD2) használ az adatok helyének megadására. Egy slot alatt két byte-ot (BUF1, BUF2) olvas be a memóriából.
A pointerek használata és a shift regiszter feltöltése az egyes üzemmódokban:
PIXELBUF1 <- (LD1), BUF2 <- (LD1+1)
BUF1 és BUF2 együtt egy 16 bites shift regisztert alkot. LD1-et a memória-ciklusban kettõvel növeli. LD2 ebben az üzemmódban nem használt.
LPIXELEz ugyanaz, mint a PIXEL, de csak egy byte-ot olvas be (így LD1-et csak 1-gyel növeli), és a RAMDAC csak a fele. Fele annyi display memória kell hozzá, egyébként nem tudom, mi értelme.
ATTRAttribútum mód, ez egy újabb indirekció segítségével 16 színt engedélyez, de slot-onként csak kettõt.
BUF1 <- (LD1), ide kerül a színinformáció (a paletta indexe. Vagyis a palettája
)
BUF2 <- (LD2), ez pedig 2-C adat, ezt kell megjeleníteni, ez kerül a shift regiszterbe.
LD2-t növeli 1-gyel. LD1-et is növeli 1-gyel, de minden scanline kezdetén újratölti (bõvebben a modeline-nál). Ez a display mód szolgál a speccy grafika emulálására (ha a modeline 8 soros). Csak 2-C színmóddal van értelme.
CH256Ez az üzemmód szolgál a karakterfontok megjelenítésére, ismét csak indirekcióval.
BUF1 <- (LD1)
BUF2 <- (LD2 bit7..0, BUF1 bit 7..0)
(16-színû módban RAMDAC/4 stb. az órajel, de az mire jó?)
LD1-et növeli minden memória-ciklusban, de scanline elején újratölti. Ez mutat a karakter kódjára. LD2 pedig a fontleíró táblázatra mutat, annak egy adott sorára, ez kerül a shift regiszterbe. LD2 ezért minden scanline elején növekszik 1-gyel (az elõálló pointer tehát 256-tal). A fonttáblázat felépítése így: elõször minden karakter elsõ sora, összesen 256 byte, aztán a második sorok és így tovább.
CH128Ugyanaz, mint a CH256, de 128 elemû fontkészletre szolgál (megint csak a memória csökkentése az értelme, ill. némi színezés is). LD2-bõl most 9 bitet használunk, BUF1-bõl pedig csak 7-et.
BUF1 <- (LD1)
BUF2 <- (LD2 bit8..0, BUF1 bit 6..0)
CH64Dettó, mint az elõzõek, ismét csak a felhasznált bitek mások.
BUF1 <- (LD1)
BUF2 <- (LD2 bit9..0, BUF1 bit 5..0)
VSYNCA NICK ránk bízza a függõleges kioltás és szinkronjel vezérlését (emlékeztek még az analóg részre?), erre szolgál ez az üzemmód. Ilyenkor csak fekete színt (sõt, egyáltalán semmilyen színt sem) szabad kiadni, ezért semmilyen paletta nem felel meg erre a célra. Nem használja ezért a BORDER színt sem ilyenkor. A szinkronjel kezdetét és végét a margókkal tudjuk szabályozni.
--------------------
Mire jó ez a sokféle üzemmód? Hát hogy a SW-esnek könnyebb legyen.
No meg persze a procinak is jóval kevesebb dolga van így.
Ez tehát egy scanline elõállítása. Minden sor elején beolvas a NICK 16 byte-ot (LPB: Line Parameter Block), ezek az adatok tartalmazzák az adott sor képzéséhez az adatokat. Több scanline összefogható modeline-ra (ez egy logikai lépcsõ); az LPB egy modeline-ra vonatkozik. Így a megegyezõ módú sorokhoz nem kell új LPB-ket írni.
Nem célom kimásolni ide a dokut, inkább a miérteket és a hogyanokat szeretném bemutatni, de itt most hasznos lehet az LPB-t összefoglalni.
[table color=#232323]
[mrow] LPB+0 [col] SC [col] ScanLine. Azt mondja meg, hogy ez a modeline hány scanline-ból áll. Az értéke bekerül egy számlálóba, ami minden scanline elején növekszik 1-gyel. Amikor 0-vá válik, akkor van vége ennek a modeline-nak. (Ezért ide a komplemens kódot kell írni, tehát 256-scanline).
Pl: 9 soros karakteres üzemmód esetén ez kilenc (ill. 256-9) lesz, attribútum módnál (256-)8 stb.[/table]
[table color=#232323]
[mrow] LPB+1 [col]MB [col] ModeByte.
[row][col] b7 [col] VINT. Az ide írt érték egész egyszerûen kikerül a NICK egyik lábára, ami a DAVE-ben az egyik megszakítás-figyelõ lábra megy. Normál esetben ezt minden félképben (20 msec) egyszer kell 1-esbe tenni, a többi sorban 0-ba. Így áll elõ egy 50 Hz-es megszakítás.
Itt egy kicsit nem értem a tervezõket. Az élvezérelt megszakítás miatt csak 2 soronként lehet IT-t generálni. A NICK-ben létezik félsoros jel, amivel törölhetné ezt a bitet. Nem értem, miért nem ezt tették.
[row][col] b6..5 [col] Colour Mode. A lehetséges 4 színmód közül itt választhatunk
[row][col] b4 [col] VRES. Ha itt 0 van, akkor az LD1-et és az LD2-t is újratölti, minden scanline kezdetén. Szép hosszú függõleges sávokat lehet így egyszerûen elõállítani
[row][col] b3..1 [col] Video Mode.
A 8-ik, hiányzó módot TPIXEL-nek hívják (tiny resolution pixel talán?), de vagy csak nem dokumentált, vagy nem is létezik.
[row][col] b0 [col] Reload. Ide 1-et írva, a Line Pointer Base regisztert (IO port 82..83) újratölti. Errõl majd késõbb.
[/table]
[table color=#232323]
[mrow] LPB+2 [col] LM [col] Left Margin (és egyebek)
[row][col] b7,b6 [col] MSBALT, LSBALT. Ez két érdekes bit, 2-C PIXEL módban ezekkel 8 szín közül lehet 2-t használni. A HW-ünk tehát így módosul:
Értelme karakteres kijelzésnél van, ahol a felsõ és az alsó bit a fonttáblában jellemzõen 0. Így könnyedén átszínezhetõ egy-egy karakter képe. 80 karakteres üzemmódban az EXOS ki is használja.
[row][col] b5..0 [col] Left Margin. Az értéke határozza meg (slot egységben), hogy meddig tart a BORDER, ill. hol kezdõdjön az adott üzemmódnak megfelelõ kijelzés.
[/table]
[table color=#232323]
[mrow] LPB+3 [col] RM [col] Right Margin (és egyebek)
[row][col] b7,b6 [col] ALTIND1, ALTIND0. A szerepük hasonló, mint az xSBALT biteknek, de 2-C
karakteres üzemmódban, és nem a karakter
képe szerint színez, hanem a
kódja szerint.
[row][col] b5..0 [col] Right Margin. Ismét csak slot egységben, idáig tart az adott modeline üzemmódja. Innentõl kezdve BORDER lesz (az aktuális scsanline-ban).
[/table]
[table color=#232323]
[mrow] LPB+4 [col] LD1L, Line Data Pointer 1 low byte
[mrow] LPB+5 [col] LD1H, LD1 high byte.
[row] [col] LD1 mutat a PIXEL módokban a bitképre. Karakter módokban ez mutat a karakter kódjára. ATTR módban az attribútum byte-ra.
[/table]
[table color=#232323]
[mrow] LPB+6 [col] LD2L, LD2 low byte
[mrow] LPB+7 [col] LD2H, LD2 high byte
[row][col] LD2 mutat ATTR módban a pixel adatra, karakter módokban a fonttábla egy adott sorára. PIXEL módokban nem használt.
[/table]
- LD2 helyén találjuk minden módban a pixel adatot (ami a shift regiszterbe kerül), kivéve a PIXEL módokat. Nem értem, miért ez a distinkció...
- PIXEL módokban LD2 nem használt. A doku szerint függõleges felbontás megadására szánták, egy késõbbi idõpontban. Nem világos, mit érthetnek ezalatt. De talán összefügg az elõzõ megjegyzésemmel.
[table color=#232323]
[mrow] LPB+8..15 [col] A paletta elsõ 8 értéke.
[/table]
------------
Ezzel már össze is állt a kép. Szinte már meg is építettük a csipet
Egy (ill. több hasonló) sort már tudunk képezni, innentõl már csak ugrás az egészet összefogni. Legközelebb....