Friday, 24 April 2020

Xorka - logikai játék. Az Enterprise változat átírása TVC-re

A Xorka logikai játék átírása IS-BASIC-ből TVC basicbe.
Avagy: Hogyan írjunk át Enterprise basic programokat TVC-re?


A játék egyszerűen leprogramozhatónak tűnt, először Enterprise-ra írtam meg, természetesen basic nyelven, lásd az előző posztban. Az Enterprise jó tulajdonsága, hogy egymás alá több, különböző paraméterezésű videólapot is meg lehet nyitni, mindegyikben beállítani egyénileg a grafikus módot és a palettát. Bár például attribútum módban csak 16 színt lehet használni (a feketével együtt) a 256-ból, mindegyik videólapnak külön beállíthatjuk a palettáját, így szép színes képernyőt nyerhetünk. A menüben is két videólapot állítottam be, és a játék alatt is egyik videólapon látszódik a játéktér, a másikon az eredmények: pontszám, lépések száma, stb.

Jött az ötlet, miért ne lehetne Videoton TVC-re is megcsinálni. Kilistáztam az Enterprise változatot egy txt fájlba, és nekiestem. Leírom, hogyan tettem futtathatóvá a programot TVC-n.

1. Utasítások, melyek TVC-n nem értelmezhetők, teljesen kihagyandók:
- A program legelejéről a PROGRAM utasítást töröltem legelőször. A hangulat kedvéért beírtam REM mögé a program címét. A SET STATUS OFF, SET KEY CLICK OFF, CLEAR SOUND utasításokat is töröltem.

2. A hangkeltés
- Az ENVELOPE NUMBER-t nem ismeri a TVC-t, ezeket is töröltem.
- A SOUND utasításokból kitöröltem az ENVELOPE, SOURCE, SYNC, STYLE paramétereket, csak a PITCH és DURATION paramétereket hagytam meg. A DURATION kb. ugyanúgy működik mindkét gépen. A PITCH szólni fog akkor is, ha az EP-s érték marad, de teljesen más lesz a hang, így ezt majd át kell írni, hogy jól hangozzon. Az EP-s PITCH értékek TVC-n mind közel ugyanazt a mély hangot adják.
- Enterprise-on a hangpufferbe 25 hang fér. Ha kiadunk több SOUND utasítást is egymás után, nem várakozik a program addig, amíg nem játssza le mindet, hanem fut tovább, és közben zenél. Ezért általában elindítjuk a zenét, és például utána írjuk ki a Congratulations feliratot, így a pompázó felirat közben zenei élményben is lehet részünk. TVC-n, ha ugyanezzel a módszerrel programoznánk, akkor nem jelenne meg a felirat, csak miután lement a zene. Ezért ilyen esetekben a SOUND utasításokat át kell helyezni későbbre, ha ugyanazt a hatást akarjuk elérni, mint EP-n.
A hangot legcélszerűbb elölről írni, ennek módjára talán később visszatérek majd.

3. SET CHARACTER: Ez az utasítás ugyanúgy működik mindkét gépen, csak TVC-n eggyel több számot kell megadni, mert eggyel több pixelsort tartalmaznak a karakterek. 
- Volt két SET CHARACTER a program elején. Ezek a karakterdefiníciók talán maradhatnak, de mivel a TVC karakterei egy pixellel magasabbak, lehetséges, hogy érdemes újratervezni a karaktereket. Az EP-s karakterdefiníciót TVC-n alkalmazva a karakter utolsó sora biztosan üres lesz, ami sok esetben nem is zavaró. (Mivel, ha az utolsó sort definiáló 0-át lehagyjuk a végéről, az akkor is 0 marad.) Kritikus esetben általában vagy az egész elejére kell 0-át írni, ami lejjebb tolja a karaktert, vagy pedig az utolsó sor adatait még egyszer beírni, így az egymás alatt lévő karakterek TVC-n is összeérnek.
Enterprise-on a karakterkészlet bármely eleme áttervezhető. Fontos, hogy TVC-n nem lehet akármelyik karaktert átdefiniálni, így új kódokat kell megadni, majd a program további részében is megkeresni a hivatkozásokat az átdefiniált karakterekre, és megfelelően módosítani azokat. Olykor előfordul, hogy EP-n már meglévő karaktert definiálunk át, erre TVC-n nincs mindig lehetőség. A TVC-s karakterkészlet három csoportra osztható:
  1. előre definiált karakterek, amelyeket nem tudunk átdefiniálni (például a betűk, számok);
  2. előre definiált karakterek, amelyeket át tudunk definiálni (például az ékezetes betűk).
  3. definiálatlan, üres karakterek, melyeket mi tervezhetünk meg.

Érdemes általában a 3. csoporton belül definiálni karaktereket. Az Enterprise programban az X betűt definiáltam át, ez lett a kurzor a játék közben. TVC-n ez nem oldható meg, másik, üres karaktert definiáltam kurzornak. Kellett még egy karakter a kurzor inverzének (amikor tereptárgyon van a kurzor, hogy az is látsszon), és egy teljesen tömör karaktert is kellett definiálni (csupa 255 mindegyik sora), amely a fal ill. tereptárgy. TVC-n a könnyen megjegyezhető 200-as kódú karakterrel kezdtem az új karakterek definiálását.

4. Tömbök: Enterprise-on STRING, NUMERIC, DIM is van, TVC-n csak DIM van.
- Jó szokás szerint felsoroljuk jobb esetben a program elején a változóneveket STRING ill. NUMERIC utasítás után. Erre TVC-n nem volt szükség (mivel nincsenek külön külső és belső változók), és egyébként sem ismeri a TVC a STRING és a NUMERIC utasítást. Volt egy tömb, amit STRING-gel adtam meg, ezt átírtam DIM-re, a TVC csak ezt ismeri. A STRING-ben és a NUMERIC-ben a tömb alsó és felső határát is meg kell adni, a DIM-ben csak a felsőt, az alsó mindig 0. Eszerint átírtam a STRING-et DIM-re.
Mivel a DIM alsó határa nem adható meg, így keletkezett egy felesleges tömbtartomány, de ez nem okoz problémát.

5. Videolapok, videocsatornák:
- A videolapok megnyitását és megjelenítését egyből kitöröltem mindet: az OPEN #csatornaszám:"video:" és a DISPLAY utasításokat. Két videólap volt egyszerre a képernyőn, így arra is figyelni kell, hogy a PRINT utasításból ha kivesszük a csatornaszámot, akkor az EP-n még két videólapra író utasítás TVC-n ugyanarra a lapra fog írni, így például a PRINT #1,AT 2,2:"X" és a PRINT #50,AT 2,2:"Score" felülírják egymást. Így a képernyőn más helyet kell keresni a két videólapra írt karaktereknek.
- A PRINT utasításokból kitöröltem a csatornaszámokat. Át kell írni úgy az egészet, hogy a régebbi két videólap ne keveredjen össze.

- Jó szokása az Enterprise-nak, hogy ha megjelenítünk egy videólapot, azt a képernyő megadott soraiban pontosan középre teszi, és jobb és bal oldalon is pont ugyanannyi fog kimaradni mellette. Így például a PRINT #1,AT 1,1 nem feltétlenül a képernyő vagy nem is egy képernyősor bal oldalára fog írni, hanem annál általában beljebb. Ugyanakkor a TVC-n a PRINT AT 1,1 minden esetben a képernyő bal felső sarkát jelenti. Így a koordinátákhoz hozzá kell adni bizonyos értéket. Mivel ebben a játékban még többféle méretű játéktér is lehet, ez külön érdekes probléma volt. Csak a megjelenítésben kell arra törekedni, hogy középen legyen a játéktér. A program ettől még a játéktér elemeit tároló tömbben az 1,1-es koordinátán fogja tárolni a játéktér bal felső elemét, de a képernyőre való kiíráskor arra 1+n,1+m-mel kell hivatkozni. Hogy mennyi lesz az n és m értéke, az az aktuális játéktér méretétől függ, valószínű az összes játéktérhez külön kell definiálni értékeket.

- Az Enterprise szöveges képernyője alapból 24x42 karaktert tud megjeleníteni. (Basic programozással ennél magasabb lap is létrehozható.) TVC-n az ehhez a legközelebb álló videomódban kevesebb karakter lehet a képernyőn vízszintesen, csak 32, de függőlegesen szintén 24. Ha egy programban fontos, hogy 32-nél több karakter legyen egy sorban, akkor vagy valami rafinériát kell kitalálni a programtól függően, vagy a nagyobb felbontású videomódba (GRAPHICS 2) kell a programot átírni, ilyenkor a színekről le kell mondanunk.


6. Színek:
- A SET INK és SET PALETTE utasításokból is ki kell venni a csatornaszámokat. A tinta színét és a palettát külön ki kell kísérletezni. Az egyéb EP specifikus grafikai beállításokat (pl. SET BIAS) is el kell távolítani.

7. Változók kezelése:
- Enterprise-on több változónak is megadhatjuk egyszerre ugyanazt az értéket (pl. LET WIN,SUM=0). TVC-n ez nem lehetséges, ott külön-külön kell minden változónak megadni az értékét minden esetben (pl. LET WIN=0:LET SUM=0).

8. Strukturált programozás: eljárások, blokkok, feltételek, ciklusok
- Át kell írni a strukturált programozásra jellemző részeket: SELECT, CASE, END SELECT; IF, ELSE, END IF. A legcélszerűbb ezeket IF-fé alakítani, és a THEN után odazsúfolni mindent, ami EP-n a feltételes eljárásban szerepel utána. Ilyenkor figyelni kell egy dologra: Az Enterprise a CASE ágaknál,ha teljesül a feltétel, akkor nem nézi tovább a többi feltételt, hogy azok is teljesülnek-e, hanem a következő CASE ágakat ilyenkor már átugorja. Ha TVC-n a CASE ágakat IF utasításokká alakítjuk, akkor a feltétel teljesülésekor nem utasítja még semmi arra a gépet, hogy a következő feltételeket ne nézze végig. Ezért a soron következő IF-eket is végignézi a program, ami lassíthat a futásán. Nem csak lassíthat, hanem lehetséges olyan eset, amikor a CASE ágon belül átírtuk valamelyik változónak az értékét, pont azét, amelyikét vizsgáljuk, így a következő IF utasításnál pont igaz lesz a feltétel már újra, így a program nem fog megfelelően működni. Ennek megoldása, ha a feltétel teljesülésekor egy GOTO-val utasítjuk a gépet, hogy ugorjon oda, ahol EP-n az END SELECT volt. A CASE ELSE ágra nincs szükség, ha nem hajt végre semmit a program, így TVC-n azt nyugodtan törölhetjük.
A CALL- DEF részeket át kell írni GOSUB - RETURN eljárásokra.
A DO - LOOP helyett a DO helyére egy REM-et kell írni, a LOOP helyére pedig egy GOTO-t, mely a REM sorszámára hivatkozik. LOOP UNTIL helyett IF ... THEN GOTO-t kell használni.

9. Gépi kóddal kapcsolatos utasítások:
- Szerencsére POKE nem volt a programban. Illetve egy volt, ami a program ideiglenes gyorsítását hivatott elvégezni a megszakítások kikapcsolása által, a program indításakor, hogy előbb megjelenjen a menü. Ezt törölni kellett, nincs is rá szükség, mert a TVC basicje gyorsabb, mint az EP-é. A gyorsító OUT 191,12-t is törölni kellett. Egyéb POKE utasításoknál külön utána kellene nézni, hogy amit el akarunk akkor végezni, azt TVC-n hogyan lehetséges.

10. Joystick figyelése:
- A JOY függvény helyett mást kell használni. A beépített botkormány TVC-n billentyűleütésekként (is) lekérdezhető az INKEY$ változóból, ezt használtam, JOY-hoz hasonló függvényt nem találtam TVC-n. A különbség, hogy a JOY függvény értéke mindig tükrözi azt, hogy el van-e döntve a botkormány valamilyen irányba, tehát akkor is, ha az INKEY$ változóban nem jelenik meg az értéke, mert a billentyűismétlés gyakorisága pl. alapértelmezés. Így ha TVC-n az INKEY$-ből olvassuk ki a botkormány mozgatását, akkor nem lesz olyan folyamatos, mint EP-n a JOY függvénnyel. A kívánt eredményhez a SET DELAY ill. SET RATE értékét megfelelően be kell állítani (EP-n SET KEY DELAY, SET KEY RATE).
A JOY függvény értékeit a következő, TVC-s INKEY$ értékekre kell átírni:

--------------ENTERPRISE JOY()-----------TVC INKEY$
jobbra.....................1.................................4
balra.......................2 ...............................19
le............................4................................24
fel...........................8................................5
tűz.........................16...............................32 (space)

11. Egyebek:
- TVC-n a WAIT DELAY utasítás ismeretlen, ezt  át kell alakítani FOR-NEXT ciklussá.


A jelentősebb problémát talán a videólapok megszüntetése miatt megváltozó PRINT utasítás koordinátái okozták. Nem igazán kell a felső matematikát ismerni ahhoz, hogy kiszámoljuk, hogyan állítható be minden pálya pont a képernyő közepére, de számolni tudni kell.
Problémát okozhat még, ha az IF eljárásban sok utasítás volt több sorban, és ezek nem férnek el TVC-n a THEN után. Ilyenkor GOSUB-bal kell egy külön részt meghívni a programban, amely elvégzi a szükséges feltételhez tartozó tennivalókat. Ilyen probléma most nem volt, több utasítás is kifért egy sorba.
Külön össze kell válogatni a színeket és el kell készíteni a hangeffekteket, zenét. Ahol EP-n sok szín volt, vagy összetettebb a zene, ott TVC-n meg kell elégednünk valami egyszerűbbel.

No comments:

Post a Comment