2023/07/07

121 színű zsírkréta

„Ezután bizonyos bitek megváltoztatásával érjük el, hogy művünk megjelenjen a tv/monitor képernyőjén, és a megfelelő színekben ragyogjon.”
       - Traffic Jam, 2. szám

Nemrég a Plus/4 család hangjáról szedtem össze érdekességeket, kézenfekvő választás, hogy beszélgessünk a grafikáról is. Már csak azért is érdekes téma, mert ez az egyik terület, ahol a Plus/4 bizonyos szempontokból előnyt élvez a C64-gyel szemben.

Ahogy a zene esetében, most is elmélkedek a hardver adta lehetőségeken. Működéséből adódik, hogy grafikáról sokkal több mindent lehet írni, mint a zenéről, ezért a posztban ebbe az irányba jobban elkóboroltam. Ez alkalommal is próbáltam azért a legegyszerűbb szinten tartani a részleteket.

Rajzóra

Foglaljuk össze dióhéjban mit is nyújt a Plus/4 grafika terén!

Bizonyára elég széles körben ismert, hogy a Commodore gépek két, alapvetően eltérő képernyőkép felépítéssel tudnak dolgozni: karakteres és pixel- vagy más néven rasztergrafikus módban. Mindkét megjelenítési módszernek megvannak a maga előnyei és hátrányai.

Karakteres módban ugyan limitált mennyiségű (legfeljebb 256) különálló grafikai elem (karakter) jelenhet meg egyszerre a képernyőn, már amennyiben nem trükközünk. Nem valami sok, viszont nagy előnye a módnak, hogy karaktereket mozgatni sokkal kevesebb adatot jelent, ezért a viszonylag gyenge processzor is jó teljesítménnyel tud képernyőelemeket görgetni vagy újrarajzolni.

PETSCII kép: Heartbleed
(forrás: TomoAlien - 
DevianArt)
A Commodore gépek ugyanazt a karakterkészletet használják a rendszer ki-bemenet alapértelmezett megjelenítéséhez, ez az úgynevezett PETSCII. Sokakat megihletett a mindenféle grafikai elemekből kikombinálható műremekek, még összetett játékok is készültek kizárólag a beépített karakterekből felépítve.

Grafikus módban minden egyes képpont színét meg tudjuk határozni bizonyos korlátok között, így részletgazdag grafikát lehet megjeleníteni. Viszont nyolcszor annyi adatot jelent a karakteres módhoz képest egy azonos méretű terület lefedése. Ez mind processzorteljesítmény, mind pedig memóriafogyasztás szempontjából lényegesen nagyobb kihívást jelent.

Ha összevetjük a C16 képességeivel: grafikus módot bekapcsolva a képernyőmemória hozzávetőleg 10 KB területet foglal le a teljes memória 16 KB-jából. A maradék tárhely se áll mind rendelkezésre, ilyen körülmények között a BASIC programoknak mindössze 2 KB marad.

Felbontás vagy sok szín?

Manic Miner (hi-res) és
The Magician’s Curse (multicolor)
A két főhős közötti különbségen
jól látszik a többszínű grafika torzítása
(forrás: 
Plus/4 World)
Mindkét megjelenítési módban lehetőség van választani, hogy inkább jobb felbontást (320x200 pixel), vagy több színt (160x200 pixel) szeretnénk-e alkalmazni.

A jobb felbontás (hi-res azaz high resolution) esetében karakteres módban az egész képernyőre egységes háttérszín és karakterenként egy változtatható szín áll rendelkezésre. Grafikus módban két színt választhatunk 8x8-as pixelblokkonként.

Többszínű (multicolor) grafikus és karakteres módban még két színt használhatunk, ami az egész képernyőre azonos.

A több szín a horizontális felbontás felére csökkenésével jár és egyben torzítja a koordináta rendszert is, mivel a pixelek a képernyőn aszimmetrikusan dupla olyan szélesek lesznek, mint amilyen magasak.

Többszínű karakteres módban van még egy korlátozás (vagy lehetőség, ha máshonnan nézzük). A karakterenként változó színeket csak az első 8 színből lehet kiválasztani, mert a szín adat legfelső bitje kapcsolja ki-be a többszínű módot. Ezzel kevert nagyfelbontású- és többszínű grafikát jeleníthetünk meg.

Szövegkiemelés extended color mode
és inverz karakterek használatával
Terror News #01-ben
(forrás: 
Yape)
Ezeken a módokon kívül még egy speciális karaktermegjelenítés lehetséges, amikor a karakterek háttérszíne választható meg négy, egész képernyőre azonos színből (extended color mode). Ez a mód a könyvek kijegyzeteléséhez használt kiemelő filcekre emlékezetet, lemezújságok előszeretettel alkalmazták, de más hasznát tudomásom szerint nem nagyon vette senki. Bizonyára túl nagy hátrány, hogy ilyenkor a megjeleníthető különböző karakterek száma 64-re csökken és ezzel a megjeleníthető grafika is jelentősen megcsappan. [Korrekció: Lavina felhívta rá kedves figyelmem, hogy volt néhány demó, amiben alkalmazták az extended color mode-ot.]

Ismerd meg a BASIC nyelvet!

Microscope - BASIC rajzoló
utasításokkal készült állókép 
(forrás: 
Plus/4 World)
Nagy segítség a BASIC 3.5-ös verziója, amivel a gépet szállították. Ez a verzió többek közt tartalmaz sok grafikai utasítást is, ezért viszonylag minimális programozói tudással is lehet készíteni programokat, amelyek összetettebb vizuális élményt nyújthatnak. Sajnos a beépített rajzolórutinok sebessége hagy némi kívánnivalót maga után, különösen a területfeltöltés idegőrlően lassú.

A grafikus mód (azaz rasztergrafika) bekapcsolásával viszont eltűnik a karakteres képernyő. Így már nem feltétlenül könnyű parancsokat begépelni. Szerencsére, ha bármilyen hiba keletkezik a grafikus mód automatikusan visszavált karakteresbe. Van lehetőség kevert grafikus és karakteres módra is, amikor a képernyő alsó 40 pixelsorában a karakteres, a többi részen pedig a grafikus képernyő látszik. Ilyen kevert megjelenítési módot a hardver közvetlenül nem támogat, a játékokban és demókban általánosan használt raszter megszakítással érik el. (Lásd alább.)

Érdemes még megemlíteni, hogy a standard eszközökkel módosítható képernyő körül egy viszonylag vastag keret is megjelenik. A keret színét lehet módosítani, de közvetlenül rajzolni rá nem lehetséges. A hangról szóló posztban már említettem, hogy a képernyőmegjelenítést ki lehet kapcsolni. Ilyen esetben a keretszín tölti fel a teljes képernyőt.

Színes egyéniség

Ha a C64 képességeihez hasonlítjuk a Plus/4 grafikai adottságait akkor sem kell szemlesütve a sarokba kullogni. A már korábban emlegetett Sprite hiánya ugyan égetően fájó pont, de ezen felül a képernyőmódok karakteres és rasztergrafikus megjelenítéshez is szinte teljes egészében megegyeznek.

Az egyetlen jelentősebb különbség, hogy C64-en három szín változhat 8x8-as pixelblokkonként többszínű grafikus módban, Plus/4-en ez a lehetőség két színre korlátozódik.

Viszont… A választható színek számában a C64 erősen korlátozott, mindössze 16 darab, előre meghatározott szín áll rendelkezésre a Plus/4 121 különböző színéhez képest. (Háhááá! Nesztek! Nesztek! 🤪🤛)

A Plus/4 összes színe és
a program amivel
készült a színskála
(forrás: 
Yape és szerénységem)
A 121 szín úgy kombinálható ki, hogy 16 alapszínből 15-höz lehet 8 különböző fényerőt választani. A fekete a kivétel, aminek minden fényereje ugyanazt a színt eredményezi. (Utánaszámolva: 15 * 8 + 1 = 121)

Az extra színek hatása leginkább az alább tárgyalt, úgynevezett FLI grafikáknál érezhető, de általában is, ha jól használják ki a színeket, akkor egyértelműen szebbek lehetnek a grafikák a C64 programokhoz képest.

Monokróm színek

Egy kép a Mental Hangover
című demóból – tipikus esztétika
a ’90-es évekből: a betűk
ugyanannak a színnek különböző
árnyalatait használják fel
(forrás: 
Plus/4 World)
Van egy váratlan következménye a színárnyalatoknak: mivel annak idején a legtöbb programozó (Magyarországon legalább is) rákényszerült, hogy fekete-fehér TV-t használjon kijelzőként, ezért a régebbi programok sokszor nem igazán használják ki a színek lehetőségeit. Helyette a biztonságos megoldást választották: ugyanannak a színnek különböző árnyalatait rakták egymás mellé, amik ezért biztosan jól illeszkednek.

A másik oldalról mondhatjuk azt is, hogy ez a tendencia egy jellegzetes stílusjeggyé vált a Plus/4 programok ’90-es évekbeli korszakára.

Helyzet kontroll alatt

A másik nem jelentéktelen előnye a TED chipnek, hogy regiszterein keresztül hozzá lehet férni bizonyos belső számlálóihoz. Ilyen számláló például, hogy hányadik sorban tart a képernyőrajzolás a kijelzőn, vagy a soron belül épp merre jár a képalkotás.

Nem csak olvasni lehet ezeket a számlálókat és ezzel precíz időzítéseket megvalósítani, hanem meghatározott keretek között módosítani is lehet az aktuális tartalmukat. Ezzel manipulálva hogyan jelenik meg a képernyőn a memóriából a képadat. Bár C64-en is lehetséges beavatkozni a képalkotásba, Plus/4-en ez lényegesen egyszerűbb és rugalmasabb.

Gumiszalag grafika (FLD)
a BPL demoban
(forrás: 
Yape)
A képernyő felépítést kontrolláló regiszterekkel sokféle vizuális effektust lehet megvalósítani. Az egyik méltán népszerű trükk a flexibilis sorok (flexible line distance vagy röviden FLD és egyéb alfajtái). A megoldás lényege, hogy képalkotás közben számlálókat átírva képernyősorokat megsokszorozva jeleníthet meg a hardver, ami a memóriában csak egy sorként szerepel. Vagy épp átlép bizonyos sorok megjelenítését előre ugorva a sorok között. Ezzel a módszerrel nyújtható vagy összenyomható a grafika, mint egy gumiszalag. Extrémebb felhasználása esetén a képernyőt soronként válogatják össze a memória különböző pozícióiból anélkül, hogy az adatot a memóriában másolni kellene.

Rasztercsík naplemente

Ha csak az eddig felsoroltakra lenne képes a hardver már az sem lenne rossz, de viszonylag sok korlát miatt nem igazán lehetne szép vizuális élményt produkálni.

Szerencsére a Commodore gépek egyik nagy előnye, hogy a képalkotó alrendszer képes szólni a processzornak úgynevezett megszakítás generálásával amikor egy bizonyos sorba ér. Ekkor a processzor félreteszi amivel épp foglalkozik, és végrehajt egy előre meghatározott programkódot.

Ez a lehetőség kombinálva azzal, hogy a képernyőrajzolás közben is lehet a képalkotásért felelős regisztereket módosítani nagyban kiszélesíti a lehetőségeket.

Például a képernyőt megfelezve két különböző karakterkészletet lehet használni, ezzel megduplázva a képernyőn egyszerre megjeleníthető karakterek számát. Vagy a képernyő háttérszínét megváltoztatva két- vagy akár több részre lehet osztani a képernyőt vizuálisan. És így működik az előzőekben emlegetett kevert grafikus és karakteres mód is, amit a GRAPHIC BASIC paranccsal tudunk bekapcsolni.

Rasztercsíkokból felépített
pálya a 
Trailblazerben
(forrás: Yape)
Precíz időzítéssel akár képpont soronként is meg lehet változtatni a háttérszínt, így keletkezik az úgynevezett rasztercsík (rasterbars).

Képernyőfelosztást már a korai játékok is alkalmaztak, aztán a ’80-as évek végétől egyre több demóban jelent meg a rasztercsík. Ez az egyik nagyon népszerű és látványos effekt, különösen a sok fényerő lehetőségével adta magát, mint alapkő a demókhoz.

Azért azt megjegyezném, hogy a precíz időzítés eléggé lefoglalja a processzort, amíg rasztercsíkokat rajzol addig másra nem nagyon marad idő.

I believe I can FLI

Visszatérve a színek számára grafikus módban: ahogy említettem egy 8x8-as vagy 4x8-as pixel csoportra lehet egyedi színeket meghatározni. Nyilván ez egy elég jelentős korlát, grafikák rajzolásakor okoz nem kevés nehézséget, hogy ilyen nagy blokkon belül csak azonos színeket lehet használni.

Az egyes pixelek színeit a globális színektől eltekintve egy karakteres képernyővel megegyező méretű és felépítésű memóriaterület határozza meg, aminek a kezdőcímét el lehet tolni a memóriában. Vagyis „több” képernyő is lehet a memóriában, amiből mindig egyet használ fel a képernyőalkotáshoz a TED chip.

Gyönyörű FLI
grafika: Butterfly
(forrás: 
Plus/4 World)
Logikus a kérdés: ha a háttérszínt soronként át lehet állítani akkor vajon a színmemória kezdőcímét is? Nos, bizonyára nem okoz akkora meglepetést (ha már így felvezettem), hogy a válasz: IGEN, vagyis majdnem. Nem pontosan olyan egyszerűen, mint ha a háttérszínt állítanánk, de ha sikerül akkor lényegében soronként lehet új színeket választani. Nos, ez C64-en jól működik, viszont Plusin jobban üzemel, ha minden második sorban kap új színmemóriát (technikai okokból, amit most inkább nem fejtek ki). Tehát a blokkok összezsugorodnak 8x2 vagy 4x2 méretűre, természetesen megint a processzorteljesítmény rovására.

Ezt a trükköt aztán sok mindenre fel lehet használni, demókban effektekre, meg hihetetlenül színgazdag állóképekre is akár. A trükk neve pedig: FLI (Flexible Line Interpretation – lefordítva kb. rugalmas sor értelmezés, de más neveken is emlegetik) és vannak alfajtái is, amire már végleg nem akarok kitérni.

Csak egy röpke megjegyzés: a C64-en FLD és FLI neveken ismert effektek nem azonosak a Plus/4 változatukkal. Bár sok hasonlóságot mutatnak, de nem pontosan ugyanúgy viselkednek, ezért az megegyező név megtévesztő lehet.

Zoom4 színorgia a
Chaos trackmoban
(forrás: 
Plus/4 World)
Még hozzátenném, hogy az FLI-vel azonos módszerrel lehet elérni egy speciális új „grafikus módot”, amit Zoom4 néven szoktak említeni. Számos 2000 után készült demóban felhasználják, mert viszonylag egyszerű előállítani és kezelni, processzor időt pedig kevésbé igényel.

A Zoom4 működése a következő: 4 pixelsoronként két különböző színmemóriát felváltva beállítanak, horizontálisan pedig két színt váltogatnak 4 pixelenként. Ezzel ez 4x4 pixelből álló (80x50 pixel felbontású) mátrixot lehet előállítani, ahol minden egyes pixel színét a 121 színből szabadon ki lehet választani. Többszínű módban alkalmazva még két extra színt lehet használni.

Keretek közé szorítva

Végül az utolsó grafikai effekt, amit szeretnék felhozni az a képernyő körüli keret eltűntetése, vagyis inkább felhasználása, mint módosítható képernyő tartalom.

Scroll az alsó kereten a
One on One intrójában
(forrás: 
Yape)
Az alsó- és felső keret eltűntetése nem annyira nagyon bonyolult, köszönhetően a flexibilis TED regisztereknek. Leegyszerűsítve a megoldás abból áll, hogy megmondjuk a TED-nek mikor a kerethez ér, hogy öreg, itt kezdődik ám a képernyő. Erre ő szorgalmasan ki is rajzolja, aztán amikor a normál képernyőméret végéhez ér akkor megint azt mondjuk, hogy itt kezdődik, ezzel jó alaposan átverve.

Persze mindez nem ilyen triviális, elég pontos időzítést igényel. A monitor a képalkotáshoz szükséges úgy nevezett szinkron jelet egy bizonyos időben várja és ha nem kapja meg akkor elkezd „futni” a kép. Idősebbek biztosan tudják, hogy ez mit jelent, fiatalabbaknak meg nem is próbálom meg elmagyarázni. Szüleink ilyenkor szoktak a TV tetejére csapni javítás gyanánt a régi szép időkben... A legszebb az volt, hogy időnként még működött is a módszer. 😅

Na de mi van az oldalsó kerettel? C64-en már megoldották az eltűntetést egy jó ideje, ott sprite-okat használnak a trükkhöz. Plus/4-en a mai napig az egyik Szent Grál, bár volt sok különböző próbálkozás több-kevesebb sikerrel, de összességében még mindig nincs erős megkötések nélküli megoldás a teljes oldalsó keret lebontásának kihívására.

Mivel ez a poszt már így is szép hosszú lett ezért kettévágtam. Legközelebb folytatjuk a magyarok grafikai tevékenységeinek boncolgatásával.

Köszönet Siznek, Csabonak, BSZ-nek és Unrealnek a lektorálásért, Lavinanak és gerliczernek a javításokért!

Nincsenek megjegyzések:

Megjegyzés küldése

Népszerű posztok