Sunday, 22 January 2023

Basic programok átírása TVC-ről Enterprise-ra

Képernyők és videolapok fajtái Enterprise-on és TVC-n

Alapesetben az Enterprise szöveges képernyőt nyit meg, melyre rajzolni nem lehet, csak írni, de a színeket itt is változtathatjuk bizonyos határok között. Az Enterprise ugyanis külön kezel szöveges és grafikus videolapokat, és a grafikus lapokra is lehet írni szöveget, de ott nem jelenhet meg a kurzor, tehát editor képernyőként nem lehet használni, valamint grafikus lapon a karakterek nem felülíródnak, hanem egyik karakterre ráíródik a másik. Alapesetben egy 42x24 karakterből álló videolap nyílik meg Enterprise-on, de megnyithatunk ennél tetszőlegesen kisebb lapot is, vagy még egy picivel nagyobbat is, és azt szabadon pozicionálhatjuk a képernyőn. A pozicionálásnál a videolap mindenképpen az egész képernyősort elfoglalja, akkor is, ha kisebb a szélessége jóval, mint a képernyőé. Ilyenkor a képernyő közepére kerül vízszintesen a videolap maga, és a körülötte üresen maradt részek a kerethez fognak tartozni. Többféle szöveges és karakteres videomód létezik Enterprise-ra, valamint attribútum mód is, ezekről később lesz szó. Egyszerre a képernyőn többféle videomódú videolap (ablak) is megnyitható, akár soronként eltérő tulajdonságokkal rendelkező videolapok is.

TVC-n gyakorlatilag csak grafikus üzemmódok vannak, ezek nagyjából egyesítik az Enterprise-os grafikus és szöveges lapok tulajdonságait: megjelenik rajtuk a kurzor, editálható a szöveg, ugyanakkor rajzolni is lehet ezekre a lapokra, és a karakterek nem egymásra íródnak, hanem felülírják egymást alapesetben. Egy előnye az Enterprise-os szöveges lapnak, hogy ha átdefiniálunk egy karaktert, akkor a képernyőn lévő összes ilyen karakter alakja megváltozik, ami például játékokban a háttéranimációhoz jól kihasználható.

Csatornák

Mivel Enterprise-on többféle videolap létezik, ezekre különböző csatornaszámokkal lehet hivatkozni. Alapértelmezése is van ennek, így a PRINT utasítás mindig az alapból megnyitott képernyőre nyomtat, ami a 0-ás csatorna. A PRINT "hello" tehát ugyanaz, mint a PRINT #0:"hello". Mivel a szöveges képernyőre nem lehet rajzolni, a rajzolással kapcsolatos utasítások nem a 0-ás csatornát használják alapértelmezettként, hanem a 101-es csatornát. Egy GRAPHICS utasítással egy négyszínű videolap nyílik meg a képernyő felső 20 sorában, a szöveges képernyő pedig a képernyő alsó 4 sorára korlátozódik. Ha ilyenkor a PLOT utasítással rajzolunk, akkor az a 101-es, GRAPHICS utasítással megnyitott csatornán fog megjelenni. Tehát például a PLOT 30,80 az ugyanaz, mint a PLOT #101:30,80. A SET INK, SET PAPER utasítások is a 101-es csatornát használják alapértelmezettként. Mivel TVC-n ez nem így van, és a PRINT és SET PAPER utasítások ugyanarra a képernyőre vonatkoznak, átírásnál külön meg kell adni a csatornaszámot, ha a szöveges képernyőn a szín megváltozik. Ezért, ha csak szöveg van a TVC-s programban, akkor a szöveges képernyőt használjuk EP-n, és ilyenkor mindig SET #102:INK és SET #102:PAPER kell a puszta SET INK és SET PAPER helyett! A 102-es csatorna az alapértelmezett szöveges videolapra vonatkozik. (A 0-ás csatorna az editor csatorna.) Programtól függően persze olykor az Enterprise-on a grafikus képernyőt célszerű használni a szöveges helyett, ilyenkor viszont a PRINT után kell csatornaszámot megadni.

Az Escape játékban a szörnyek szeme külön színű volt. TVC-n ezt úgy oldották meg, hogy átállítottak valamit, ami miatt nem felülírták egymást a karakterek, hanem egymásra kerültek. Mivel ez EP-n csak grafikus képernyőn lehetséges, célszerű volt grafikus képernyősre írni át a játékot. Emiatt a karakterek letörlése volt probléma, ilyenkor egy háttérszínű, mindent betöltő négyzet alakú karakterrel kellett felülírni azt a karaktert, melynek helyére írni akartunk valamit, és utána visszaállítani a tinta színét a korábbira. Ha a Bányász vagy a Létra című játékot akarnánk átírni Enterprise-ra, akkor is ez lenne a helyzet, ha a nagy karaktereket akarnánk használni, hiszen nagy karakteres videomód nincs.

Ha TVC-n a GRAPHICS 2-vel megnyitott képernyőhöz hasonlót akarunk EP-n, azt a TEXT 80 paranccsal érhetjük el, ilyenkor 80 karakter fér egy sorba. Tetszőlegesen paraméterezhető videolap megnyitásával akár teljesen lehetne emulálni a TVC 64 karakter szélességű üzemmódját, így ha ez a cél, ez is megvalósítható, de erre általában nincs szükség, csak speciálisabb esetekben. Mivel a GRAPHICS 2-vel megnyitott képernyőre rajzolni is lehet, a TEXT 80-nal megnyitott képernyőre pedig nem, így a programtól függően nyithatunk EP-n kétszínű videolapot inkább (szintén GRAPHICS 2 vagy GRAPHICS HIRES 2), ha ez tűnik célszerűbbnek.

TVC-n a GRAPHICS 4-gyel megnyitott képernyőhöz hasonlót EP-n a TEXT 40 (vagy simán csak TEXT, mivel alapértelmezése 40) paranccsal nyithatunk. Ha rajzolni is kell a képernyőre, akkor GRAPHICS HIRES 4 vagy akár GRAPHICS 4 utasítással megnyitható grafikus videolap is.

Egy kis bökkenő van a GRAPHICS 16-ot használó TVC-s basic programokkal, ugyanis az Enterprise-on a GRAPHICS 16 vagy GRAPHICS HIRES 16 utasítással megnyitható videolapra 6 karakterrel kevesebb fér ki, mint TVC-n. Ilyenkor, ha fontos, hogy meglegyen egy sorban a 16 karakter, a legegyszerűbb 40 karakteres módot használni. Ilyenkor a karakterek kisebbek lesznek, és a képernyő szélein 12-12 karakternyi hely üresen fog maradni. Egy másik lehetséges megoldás ilyenkor újraírni úgy a programot, hogy egy karakternek 2x2 karakter feleljen meg, és így szebben néz ki 40 karakteres szöveges lapon,  bár így meg függőlegesen nem fog kiférni az ugyanúgy 24 sorba. Gépi kódú programozással esetleg létre lehet hozni a TVC-éhez hasonló képernyőt.

Lehetséges, hogy valamiért pont akkora képernyőt akarunk EP-n, mint TVC-n. Erre az esetre jó félretenni egy programrészt, amely pontosan 32 vagy 64 karakter széles képernyőt hoz létre EP-n. A Multetris átírásakor előnyös volt ugyanakkora képernyő.

Eltérés még, hogy ha PLOT-tal adjuk meg a PRINT-elendő szöveg koordinátáit, TVC-n nem kell vessző a PLOT végére, EP-n igen, mert EP-n akkor a pontot is odateszi, ami nem szép, pl.

TVC: PLOT 300,300:PRINT #0:"text"
EP: PLOT 300,300,:PRINT "text"

Feltételek és ciklusok

A Enterprise basicjének fontos tulajdonsága a strukturáltság, így egy sorban csak egy olyan utasítás lehet, mely a feltételek és a ciklusok kezelését végzi. Így a FOR és NEXT utasításokon kívül az adott sorban nem lehet más utasítás. Két IF sem kerülhet egyetlen sorba. Az ELSE csak egyetlen utasítás lehet a sorban. Az ON x GOTO és az ON x GOSUB utáni sorszámfelsorolás végére sem kerülhet újabb utasítás, ennek új sorba kell mennie.

TVC-n így fest egy bonyolult, feltételekkel teli rész, az Escape című játékból:

930 IF EL=1 THEN PRINT#0,AT EX,EY:MONSTER$:IF MOVE=1 THEN IF MAP(EX,EY)<>0 THEN EL=0:GOSUB3100:IF ENEMYLIVE(MAP(EX,EY))=1 THEN ENEMYLIVE(MAP(EX,EY))=0:GOSUB3120

Ezt EP-n így kell megcsinálni:

 930 IF EL=1 THEN
 931   PRINT #10,AT EX,EY:MONSTER$
 932   IF MOVE=1 THEN
 933     IF MAP(EX,EY)<>0 THEN
 934       EL=0:GOSUB 3100
 935       IF ENEMYLIVE(MAP(EX,EY))=1 THEN ENEMYLIVE(MAP(EX,EY))=0:GOSUB 3120
 936     END IF
 937   END IF
 938 END IF
 
Még egy eltérés az IF utasítással:

TVC-n: IF NOT A$="3" THEN
EP-n: IF A$<>"3" THEN 

A SET utasítás kezelése:

TVC-n: SET PAPER0;INK1
EP-n: SET PAPER 0:SET INK 1

SET STYLE nincs EP-n, helyette SET LINE STYLE van, ami talán hasonlóan működik (ellenőrizni kell). SET MODE sincs ebben a formában EP-n, de valami biztos van helyette.

EP-n a SET után közvetlenül eléggé általános a csatornaszám megadása, pl. SET #101:PALETTE 2,5,20... 

TVC: SET RATE és SET DELAY - EP: SET KEY RATE, SET KEY DELAY.

Változók:

TVC-n minden változó értéke alapból 0. Enterprise-on azonban, ha egy változónak nem adunk értéket és így kérdezzük le vagy hivatkozunk rá pl. IF után, akkor hibaüzenetet kapunk, hogy nincs ilyen változó. Az Escape vagy a Multetris játék átírásánál volt probléma, hogy nem voltak alapból megadva a változóknak az értékek, így ezeket pótolni kellett.

Egy string lehetséges maximális hosszát beállíthatjuk TVC-n a DIM M$*100 utasítással. Enterprise-on ezt a STRING *100 M$ utasítással oldhatjuk meg.

Eltérő vagy eltérően működő utasítások:

TVC: CLS - Enterprise: CLEAR SCREEN (képernyő törlése). Ez a 102-es videolapot törli, más videolap törlésénél a CLEAR #x-re lehet szükség, ahol x a csatorna száma. Programtól függ, milyen képernyő van, milyen csatornaszámmal.

Ha billentyűleütésre megy tovább a program, TVC-n a GET A$ önmagában billentyűleütésre vár és nem is megy tovább, amíg nem ütünk le billentyűt. Ehhez EP-n 3 utasítás kell 3 külön sorban (ha nem akarjuk a GOTO-t használni):

DO
  GET A$
LOOP UNTIL A$<>""

TVC-n erre egyetlen GET A$ elég.

 

SET CHARACTER - mindkét gépen ugyanaz, csak TVC-n eggyel több pixelsor van. EP-re átírásnál egy számot törölni kell innen és figyelni kell, hogy melyiket. Az Escape átírásakor emiatt egy pixellel feljebb vagy lejjebb volt a szörnyek szeme, amit az eredeti program írója vett csak észre. 

Az OPEN és CLOSE utasítás mindkét gépen létezik, de a szintaxisuk eltér.

Az EXT utasítás létezik EP-n, de teljesen más a funkciója, mint TVC-n.

LOMEM: Nem létező utasítás EP-n.

Az OUT és POKE létezik mindkét gépen, de eltérő hatásuk lehet.

A függvények között is lehetnek eltérések, pl. a STRING$, VARPTR függvényt az EP nem ismeri. A VERNUM létezik EP-n, de valószínű eltérő értéket ad.

A színkódok eltérnek! Ezeket ki kéne kísérletezni, mi felel meg EP-n az adott TVC-s színeknek.

Gép nyelve:

Enterprise-ból létezik angol és német nyelvű gép. Az angol nyelvű képen a T billentyű után az Y jön, a német nyelvű gépen a Z, illetve az X mellett balra van géptípustól függően az Y vagy a Z. Az Escape játék átírásakor ennek pont nagy jelentősége volt, ugyanis az irányítógombok közé tartozott a Z is, és nem minden Enterprise-on lehetett emiatt jól játszani. Bár ez Enterprise specifikus kérdés, talán átírásnál is érdemes lehet erre felkészülni, bár túl gyakran nem lehet erre szükség.

Szintaxis:

Enterprise-on illik mindent külön írni, ami nem egy szó. Bizonyos esetekben egybeírva is elfogadja az EP basic interpreter, de valamikor nem. Példák:

TVC: SET INK0 - EP: SET INK 0

TVC: FORA=1TO20 - EP: FOR A=1 TO 20

TVC: NEXTI - EP: NEXT I 

TVC: DATA0,2,2 - EP: DATA 0,2,2

A változóneveket mindenképpen írjuk külön attól, ami előtte van!

A csatornaszámokat # jellel jelöljük például txt fájlban. EP basicben ez font jelként fog megjelenni.

Hang:

A SOUND DURATION paraméterezése gyakorlatilag megegyezik. A PITCH-é eléggé eltér, ennek átszámítása bonyolult lehet. A VOLUME paramétert teljesen törölni kell, helyette LEFT és RIGHT kell, és ennek paraméterezése más. A VOLUME 0 és 15 közötti érték lehet, a LEFT és RIGHT pedig 0 és 255 közötti. Így ha pont ugyanazt a hangerőt akarjuk elérni, akkor a 0-15 közötti számot át kell számolni 0-255 közötti számra, és a LEFT és a RIGHT után is azt kell beírni.

Ha a TVC-s SOUND-ban nincs ; (pontosvessző), akkor az INTERRPUT paramétert meg kell adni EP-n. Ha van pontosvessző, akkor csak simán törölni kell a pontosvesszőt.

Példa:

TVC: SOUND;PITCH 3349,DURATION 100,VOLUME 15
EP: SOUND PITCH 37,DURATION 100,LEFT 255,RIGHT 255

TVC: SOUND PITCH 3349,DURATION 100,VOLUME 15
EP: SOUND PITCH 37,DURATION 100,LEFT 255,RIGHT 255,INTERRUPT

Egyéb EP specifikus dolgok:

Szükség lehet bizonyos programoknál, pl. játékoknál a billentyűhang kikapcsolására, ami TVC-n nincs. Játékok irányításakor zavaró lehet a billentyűk megnyomásával járó kattogás, így EP-n ki kell adni: SET KEY CLICK OFF.

EP-n a komolyabb programok eltüntetik a status sort felülről, mert irreleváns: SET STATUS OFF. TVC-n ilyen nincs.

EP-n célszerű a legelső sornak így kinéznie: PROGRAM "név.kit" ahol a név max. 8 karakter, melyet max. 3 karakterből álló kiterjesztés követhet, ez többnyire .bas, ami arra utal, hogy ez egy basic program. Például:

100 PROGRAM "escape.bas"

Ha egy puszta SAVE parancsot adunk ki basicben, akkor a PROGRAM utasítás után megadott névvel menti ki a programot.

Kezdődhet egy átlagos TVC-ről EP-re konvertált program így:

100 PROGRAM "név.bas"
110 SET STATUS OFF:SET KEY CLICK OFF:TEXT

Wednesday, 18 January 2023

Enterprise - TVC basic konverzió: Gengszter

Nem olyan régen átírtam Enterprise basicből TVC basicbe a Gengszter című szöveges kalandjátékot. Elég keveset kellett módosítani átírásnál. Leírom a tapasztalataimat.

A Gengszter című basic szöveges kalandjáték átírása Enterprise-ról TVC-re nem volt túlságosan elhúzódó folyamat. Először törölni kellett az Enterprise specifikus részeket, az állapotsor eltűntetése és a billentyűhang bekapcsolása, az első sorban a PROGRAM utasítás, ami TVC-n nem létezik. Mivel Enterprise-on nincsenek alapból ékezetes karakterek, így először megvizsgálta a program, van-e ilyen bővítés, és ha nincs, akkor átdefiniálta a szükséges karaktereket. A funkcióbillentyűket is átállította, hogy a játékban előforduló parancsokat egy gombnyomással el lehessen érni, valamint a funkcióbillentyűk új funkciójáról egy színes csík tájékoztatott a képernyő alján. Ezekre nem volt már szükség.

Az Enterprise egyszerre több változónak is adhatja ugyanazt az értéket, pl. LET A,B,C=1, ahol mind a három változó értéke 1 lesz. TVC-n ez nem lehetséges, ott külön meg kell adni, hogy LET A=1:LET B=1:LET C=1. Egy-két ilyen volt a programban, ezeket át kellett írni.

A TVC-s gépkönyv szerint az ON GOTO utasítás továbblép akkor, ha a kívánt érték nem szerepel benne, ez valójában hibát okoz. Emiatt minden ON GOTO sor végére kellett egy ELSE GOTO [következő sor száma]

Enterprise-on egyszerűen egymás mellé lehet tenni a PRINT után több stringet is, szóközzel elválasztva. TVC-n ez hibát okoz, a szóközt ;-re kell cserélni. 1-2 ilyen volt a programban. Az egyik helyen mást is módosítottam: amikor arról tájékoztat a játék, hogy milyen irányba tudunk menni, mindig vesszőt tett az irányok közé, és az utolsó irány után is. Ezt a vesszőt kivettem, helyette – került minden irány elé, ez szebben is mutat.

Az Enterprise-os ékezetes karakterek teljesen máshol vannak, mint TVC-n, így ezeket is módosítani kellett a szövegekhez.

Két helyen volt WAIT 1 utasítás, mely 1 másodpercig várakozik. Ezeket átírtam FOR-NEXT ciklusos várakozásra.

Enterprise-on a képernyő szélessége 42 karakter, TVC-n 32. A problémát nem is ez okozta, hanem az, hogy a TVC nem kezdi új sorban azokat a szavakat, melyek nem férnek ki, hanem egyszerűen kettétöri őket. Így szóközöket kellett beszúrni és olykor elválasztójelről gondoskodni.

Enterprise-on külön színe van annak a szövegnek, amiben a gép informál, és annak, amikor mi írhatjuk be az utasításokat. Ez így is maradt, azonban teljesen más színek lettek. Az eredetihez közelítő sötétes-pirosas szín túl harsány volt. Továbbá, valamilyen rejtélyes oknál fogva a TVC-s változat az input színével írta ki közvetlen a játék indítása után a start szobás szöveget, ez elé külön be kellett tenni egy set ink utasítást.

LCASE$, LTRIM$, RTRIM$ - A TVC ezeket nem ismeri. Elegánsabb, ha ezek is benne vannak, de végső soron nagy problémát nem okoz a hiányuk.

STRING, NUMERIC -> DIM

TEXT 40 (EP-n 42 karakter szélességű szöveges lapot nyit meg) – GRAPHICS 4 (TVC-n 32 karakter szélességű szöveges-grafikus lapot nyit meg)

TEXT 80 (EP-n 80 karaktersor hosszúságú szöveges lapot nyit meg) – GRAPHICS 2 (TVC-n 64 karakter szélességű szöveges-grafikus lapot nyit meg)

Figyelni kell arra is, hogy TVC-n egy string hossza alapból maximum 18 lehet, míg Enterprise-on akár 132 karakter is. Ha 18 karakternél hosszabb stringre van szükség, akkor a DIM után fel kell tüntetni a stringet és meg kell adni a maximális hosszát TVC-n. EP-n is meg lehet határozni a string maximális hosszát, ezt a STRING utasítás után lehet megadni: STRING *200 M$. TVC-n: DIM M$*200.

 

SET STATUS OFF - A status sort kapcsolja ki EP-n. TVC-n értelmezhetetlen, törölni kell.

SET KEY CLICK ON - A billentyűhangot kapcsolja ki EP-n. TVC-n értelmezhetetlen, törölni kell.

LET T,A,AB=0 - TVC-n helyette: LET T=0:LET A=0:LET AB=0

EXIT FOR - A FOR ciklusból kiugraszt a NEXT utánra. TVC-n nincs, helyette GOTO kell.

Az összetett IF-es sor első feltételét vizsgálja csak meg az EP. Ha ez nem teljesül, nem is vizsgálja meg a másik feltételt az AND után:

 350 IF I<4 AND K(I,2)=1 THEN 340

TVC-n mindkét  részét megvizsgálja a feltételnek. Így ha a második része éppen nem értelmezhető, akkor hibát okoz. Ezért így kell átírni TVC-re:

  350 IF I<4 THEN IF K(I,2)=1 THEN 340

ON GOTO végére mindig ELSE kell, EP-n nem. A TVC dokumentációban is tévesen szerepel.

 

WAIT DELAY átírása: FOR ciklussá kell alakítani, kb. 1000-rel kell szorozni a másodpercek számát a ciklusváltozóban, pl.:

WAIT 1 - Egy másodpercet várakoztat.

Ebből lesz: FOR WAIT=1 TO 1000:NEXT

 

PRINT " ";EG$(J) ","; -nem fogadja el a TVC, helyette:

PRINT " ";EG$(J);","; - szóköz nem állhat a PRINT idézőjelei között, helyette ; kell TVC-n.

Overflow: M$ hossza 20 volt, sok volt TVC-n. EP-n a string hossza jóval több lehet.