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ó:
- előre definiált karakterek, amelyeket nem tudunk átdefiniálni (például a betűk, számok);
- előre definiált karakterek, amelyeket át tudunk definiálni (például az ékezetes betűk).
- 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