Újabb dolgon töröm a fejem, a scrollozást kellene javítani hardveres támogatással a NICK 2.0-ban.
Abból indulok ki, hogy egy teljes képernyős grafikus képet az LPT egyetlen blokkjában mint 240 soros grafikus kép deklarálnám.
Az adatmező memóriacíménél megadom, hogy hol kezdődik a memóriában, ahogyan a klasszikus NICK ezt tudja is.
Szeretném viszont megrajzolni a pályát a memóriában sokkal nagyobbra, mint amennyit a képernyő mutatni tud. Majd a látható képet mozgatnám "eltolás" byte-okkal. Az elotlás max akkora lehet mint a megrajzolt "nagy kép". Ezt sem x sem y irányban nem tudom 1 byte-on ábrázolni, legalább 1 byte és 1 bit kellene, de akkor már lehet 2 byte.
A csatolmányba tettem néhány képet. A fekete vonalak a byte-okat jelentik a memóriában, ami egy hatalmas "hátteret" ír le. Minden új sor a kép új pixelsorát jelent, az egyik sor vége és a másik eleje egymás mellett vannak a memóriában. (mintha Asmon dump lenne).
A piros négyzet a képernyő mérete által megjelenített byte-okat mutatja. Minden ami a piros négyzeten belül van, az meg lesz mutatva a képernyőn. Ami kívül esik, az nincs megmutatva, de elő van készítve.
Azért lenne jó így csinálni, mert a piros képernyő mozgásakor a Z80-nak egy ideig semmi dolga nem lenne azon kívül, hogy lépteti a NICK eltolás vektorát. Közben előkészítheti a képernyőtartalmat a háttéren annak tudatában, hogy a játékban éppen merre járunk. Ezzel sokkal finomabb mozgást érnénk el, illetve csökkentenénk a Z80 munkáját.
Az első képet megnézve látszik, hogy a klasszikus Nick ezt nem tudja a poszt elején említett egysoros deklaráció mellet, mert nem "ugorja át" a piroson kívül eső sorokat. Van ugyan rá lehetőség, de akkor sajnos minden pixelsort egyenként kellene a sorparaméter táblában deklarálni, ami akkor 240sor * 16byte = 3,75KB lenne. Ezt a 240 sort írogatni is kellene. Sok munka a Z80-tól.
Másik dolog, hogy amikor a háttér egy sorának végéhez ér, akkor nem az utána következő sort kellene betölteni, hanem ugyanazt. (2. és 3. kép a csatolmányban)
Tehát az egyik újítás a NICK 2.0-nál ez lenne, hogy meg lehetne adni teljes háttér-szélességet, hogy a következő sor kezdőcímét ki tudja számolni az előző alapján: hozzáadná a háttér szélességet az előző sor kezdőcíméhez.
Ugyanezt megadjuk az pixel oszlopok miatt.
Tehát a sorparaméter tábla blokkja így nézne ki:
F900: x00 x01 x02 x03 x04 x05 x06 x07 x08 x09 x10 x11 x12 x13 x14 x15
x00: sor magassága (2-es komplemens) - innen jön a látható kép magassága
x01: sor módja (Nick 2.0 hires 4, 256 színnel -- 1 képpont=1byte)
x02: bal margó
x03: jobb margó (ebből a két értékből kapja meg a NICK a látható kép szélességét)
x04: kép kezdőcíme memóriában alsó byte
x05: kép kezdőcíme memóriában középső byte
x06: kép kezdőcíme memóriában felső byte (összesen 24byte - de nincs mind használva)
x07: foglalt/tartalék
--- itt kezdődnek a színdeklarációk, mivel 256 színnel dolgozunk, nincs szükség színre, elhasználjuk másra
x08: kép kezdőcím eltolása x irányba alsó byte
x09: kép kezdőcím eltolása x irányba felső byte (ezt kell növelni/csökkenteni a Z80-nak ahhoz hogy vándoroljon a látható kép X irányban)
x10: kép kezdőcím eltolása y irányba alsó byte
x11: kép kezdőcím eltolása y irányba felső byte (ezt kell növelni/csökkenteni a Z80-nak ahhoz hogy vándoroljon a látható kép Y irányban)
x12: háttér kép x mérete szorozva 2
x13: háttér kép y mérete szorozva 2 (azért kell a szorzás, hogy 8 biten ábrázolni lehessen max: 512-t)
x14: foglalt/tartalék
x15: foglalt/tartalék
Gyors számítás: ha háttér kép mérete 512x512 és képpontonként 1 byte (256 szín), akkor a háttérhez 512*512*1= 256k memória kell
Ez rengeteg, de a címbusz kiterjesztésével lehetséges.
SRAM használatával pedig a Z80 késleltetés nélkül képes a videomemóriába írni, ezzel minden követ elgörgettünk, hogy gyönyörű EP játékokat játszhassunk.