Tippek - Trükkök

Látszólag több Hibás a PRINT USING!
Számítógépünk a rendszerszegmens 16291. ofszetcímén a működő, a következőn pedig a rossz szegmensek számát tárolja. Ha ide mindenféle hamis értékeket teszünk, akkor az INFO parancs a látszólagos memória méretét jeleníti meg. A
     SPOKE 255,16291,255
     SPOKE 255,16292,1

sorokat példaként megadva a gép látszólag 4 Mbájt memóriával rendelkezik, ebből egy szegmens nem működik. Legjobb, ha az értékeket a kísérletezés után eredetire visszaállítjuk (vagy kétszer megnyomjuk a reset gombot), mert különben az ENTERPRISE nem áll jót önmagáért.
A Basic programnyelvben a kiírandó adatok formálásának eszköze a PRINT USING utasítás. Szomorú tény, hogy az IS-BASIC ennek az utasításnak a végrehajtását hibásan végzi. Sem a 12 jegyű, sem a 14 jegyű számokkal nincs problémája, 13 jegyű szám kiírása után viszont leáll a
'BASIC data has been corrupted'
hibaüzenettel. Hogy miért éppen a 13 jegyű számokat nem tudja kiírni? Végül is a felhasználót ez nem érdekli.
A másik, talán még nagyobb probléma sokkal veszélyesebb, mert hibajelzés nélkül, észrevétlenül követi el. Nagy pozitív és negatív számoknál nincs hiba, viszont az 1-nél kisebb és -1-nél nagyobb számok helyett a tízszeresüket írja ki a program. Mivel az adatok nagyságrendjét a feladat határozza meg, a PRINT USING utasítást nem lehet teljes biztonsággal használni. Kár...

Videólapok pozícionálása

Amikor egy videólapot a megnyitás után elhelyezünk a képernyőre, akkor azt az operációs rendszer automatikusan középre állítja. A sorparaméter-táblában bizonyos bájtok átírásával mi is pozícionálhatjuk az ablakot. Ezt teszi a következő Basic program.
A függvénynek meg kell adnunk az eltolandó első sort, az eltolás hosszát és azt, hogy a középállástól mennyivel térjen el az ablak. A 150-190-es sorokban beírjuk a lap margóit meghatározó memóriahelyekre a módosított értékeket.
A sorparaméter-tábla újraépülésekor (pl. a TEXT parancsra) a régi értékek fognak szerepelni. Azt se felejtsük el, hogy így sem tudunk egymás mellé videólapokat helyezni.

100 PROGRAM "Vpos.bas"
110 DEF VPOS(L,E,D)
120   LET Z=16372
130   LET A=SPEEK(255,Z)+256*SPEEK(255,Z+1)
140   LET A=A+L*16:LET LEM=A+2:LET RIM=LEM+1
150   FOR J=1 TO E
160     POKE LEM,PEEK(LEM)+D
170     POKE RIM,PEEK(RIM)+D
180     LET LEM=LEM+16:LET RIM=RIM+16
190   NEXT
200 END DEF
210 SET VIDEO MODE 5
220 SET VIDEO COLOR 0
230 SET VIDEO X 10
240 SET VIDEO Y 8
250 OPEN £30:"video:"
260 SET £30:PALETTE 13,32
270 PLOT £30:150,150,ELLIPSE 100,100,
280 DISPLAY £30:AT 1 FROM 1 TO 8
290 CALL VPOS(1,8,-10)

EXDOS képernyő A LoriGRAPH gyorsítása
Néha rettentően idegesítő az EXDOS parancsértelmezőnek az a tulajdonsága, hogy a begépelt parancs a megjelenített directory-val, vagy a kiiratott file-al együtt elúszik. Basic-ben dolgozva segíthetünk ezen a helyzeten, ha a képernyő utolsó négy sorának valamelyikében kiadjuk az
     :EXDOS £0
parancsot. Ezután parancsainkat a nullás editor-csatorna dolgozza fel de az összes megjelenítés az EXDOS saját video-csatornáján fog történni. A rendszerparancsok stabilan állnak a képernyő alsó négy sorában, és a kettőspontot sem kell eléjük kitennünk. A parancsmódból a STOP leütésével léphetünk ki, az ESC nem hajlandó erre.
A LoriGRAPH (szegényes) ikonos menürendszeren keresztül irányítható így viszonylag könnyen tanulható. Amikor a felhasználó már igazán jól tudta kezelni, akkor nem nézi hogy mi van a képernyőn, hanem mindent "csuklóból" csinál. Ebben az esetben nagyon bosszantó lehet a program lassúsága. Ez főleg a grafikus képernyőkön való mozgásoknál jelentkezik. A lustaságot nem az alkalmazott programnyelv hanem a billentyűzet okozza. Az editor betöltő része Basic-ben íródott, ezért ebbe a részbe könnyedén belejavíthatunk. A billentyűzet gyorsítására is van lehetőség, módosítani kell a RATE KEY és a DELAY KEY rendszerváltozók értékét. Először a LOAD paranccsal töltsük be a LoriGRAPH-ot, majd írjuk a következőket:
     271 SET KEY DELAY 5
     272 SET KEY RATE 3

Az itt megadott értékek természetesen nem kötelezőek, mindenki a maga ízlése szerint állíthatja be őket. Ha mindkét rendszerváltozó egyenlő eggyel akkor a LoriGRAPH kezeléséhez már nagyon gyors ujjak kellenek.

Hol a kurzor?

A video-lapokon a kurzort a PRINT AT utasítással állíthatjuk be. Hiányoznak azonban ennek fordítottjai, a kurzorpozíció olvasását támogató függvények. Szerencsére a videokezelő rendelkezik ezzel a funkcióval, csupán a megfelelő rutinnal kell felébresztenünk ezt a lehetőségét. A kurzor y koordinátáját a WHEREY, az x koordinátáját a WHEREX függvény adja vissza. Az egyetlen szükséges paraméter egy nyitott videocsatorna számát tartalmazza.

100 ROGRAM "Wherexy.bas"
110 PRINT £102,AT 7,13:;
120 LET Y=WHEREY(102):LET X=WHEREX(102)
130 PRINT Y,X
140 DEF WHEREY(C)
150   LET WHEREY=WHERE(C,0)
160 END DEF
170 DEF WHEREX(C)
180   LET WHEREX=WHERE(C,1)
190 END DEF
200 DEF WHERE(C,M)
210   PRINT £C:CHR$(27);"?";
220   GET £C:Y$:GET £C:X$
230   IF M=0 THEN
240     LET WHERE=ORD(Y$)-32
250   ELSE
260     LET WHERE=ORD(X$)-32
270   END IF
280 END DEF

Németből angolba software-úton

A következő rövid Basic program a német, kétnyelvű gépek tulajdonosainak nyújthat segítséget, és a lemezegységgel rendelkezőknek is hasznos lehet. Sok olyan program van, amely csak angol gépen fut, vagy csak magnóról tölthető be. Ezen segít ez a program, amely a számítógépet alapkiépítésű angol géppé változtatja, mindenféle fizikai beavatkozás nélkül.
A program angol gépen is futtatható, ha a 90-es sorban az 5-ös szám helyett 4-est írunk, ugyanis az angol gépen a Basic cartridge a 4-es szegmensen van. Tehát a program utolsó sora angol gépre a következő:

90 DATA 0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0

1 PROGRAM "UK_mode.bas"
10 FOR A=0 TO 16
20   READ B
30   SPOKE 255,11193+A,B
40 NEXT
50 SPOKE 255,16279,189
60 SPOKE 255,16277,189
70 SPOKE 255,16278,171
80 EXT "BASIC"
90 DATA 0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,0

Megáll az idő Jellemtelen kurzorkarakter
A rendszeróra nem működik a magnóról olvasás és a magnóra írás közben, ezért az ilyen műveleteknél és utánuk nem érdemes az órára hagyatkozni; a "magnózás" befejeztével érdemes újra beállítani az időt.
A problémát feltehetően az okozza, hogy a magnó hangfrekvenciás jelének előállítása és visszakódolása a processzort teljesen igénybe veszi, és így ilyenkor nem lehet megengedni az órát rendes körülmények között "mozgató" megszakítást. A megoldás -az akkumulátorról állandóan működő CMOS hardverórát most nem számítva- az lett volna, hogy a magnókezelő interfész mellékesen kiszámítja, hogy mennyi ideig foglalkozott a hangelőállítással vagy megfejtéssel, és időnként (pl. blokk-közökben) helyesbítené az időt.
Az EXOS videokezelóje megengedi a kurzorkarakter beállítását, így ha például Basic-ben kiadjuk a
     SET CURSOR CHARACTER 95
parancsot, akkor a villogó négyzet (ASCII 142) helyett villogó aláhúzás karakter jelzi a kurzor helyét. Ez szép és jó egészen addig, amíg nem nyomjuk le kétszer az ALT+INS kombinációt (Insert üzemmód be/ki), ekkor ugyanis ismét a villogó négyzet lesz a kurzor. A hibát valószínűleg az EDITOR: okozza, amely az Insert kurzor bekapcsolása előtt nem menti el a kurzorkarakter eredeti kódját.

String a kéz alá

Egy jól megirt programtól elvárható, hogy lehetőleg minden beviendő adatot a felhasználó keze alá adjon, megmentve őt a monoton bebillentyűzéstől. Erre ad egy Basic nyelvű megoldást a listán látható program.
A függvénynek sorrendben a következő paramétereket kell átadnunk: promt,-szöveg, előre definiált string, y koordináta, x koordináta. Az ASCII 184 a kurzor balra mozgatását idézi elő a stringben is.

100 PROGRAM "Inpstr.bas"
110 LET M$="Kedvenced:"
120 LET A$="ENTERPRISE"
130 LET A$=INPSTR$(M$,A$,3,3)
140 PRINT A$
150 DEF INPSTR$(P$,Z$,Y,X)
160   FOR K=1 TO LEN(Z$)
170     LET Z$=Z$&CHR$(184)
180   NEXT
190   LET P$=P$&" "&Z$
200   INPUT AT Y,X,PROMPT P$:Z$
210   LET INPSTR$=Z$
220 END DEF

Ismeretlen hibatípusok A vonalzósor beállítása
A számítógép használata során az egyik legkellemetlenebb élmény, amikor váratlanul hibajelzést kapunk. Különösen bosszantó lehet azonban egy hibaüzenet, ha nem ismerjük a megfejtését.
Mit tegyünk akkor, ha a számmal jelzett hibakód nem található meg sem a Basic leírásban, sem az EXOS, az EXDOS, sem az IS-DOS kézikönyvben? Ebben a rovatban megpróbálunk megfejtést adni az ismeretlen hibajelzésekre. Kérjük mindazokat, akik ilyen "titkosított" hibajelzéssel találkoznak, mind pedig azokat, akik tudják vagy sejtik ezek megfejtését, hogy osszák meg velünk tapasztalataikat. Kezdetnek két ilyen kóbor hiba:
*** Error 185 - A fájl katalógus szerinti és tényleges mérete nem egyezik meg egymással.
*** Error 187 - Érvénytelen .COM fájl.
Aki dolgozott már igazi szövegszerkesztővel az megszokta, hogy a vonalzósor (ruler line) tetszőlegesen beállítható a szövegben - mondjuk - megjegyzés-sorként megadott minta alapján. Az ENTERPRISE gép beépített szövegszerkesztőjével is csinálhatunk hasonlót. Lépjünk be a szövegszerkesztőbe, és írjuk be például a következő két sort:
L 1 . 2 . 3 . 4 . 5 . 6 R
ALT-F2 . . . ALT-F4
Mentsük ki a PRINT paranccsal (nem a SAVE-vel) például R65 (65 karakter széles vonalzósor) néven. Most álljunk rá a kurzorral az első sorra, és hajtsuk végre a következő utasításokat:
ALT F2 töröljük a TAB pozícíókat); CTRL- kurzor jobbra és CTRL-F3 ismételve, míg ki nem érünk a jobb margóra (az új TAB pozíciók beállítása); ALT-F4 (a jobb margó beállítása). Ezután törölhetjük a két sort. Ha újra szükség lesz a beállításra, a kurzorral szövegmentes helyre állva újra betölthetjük, mivel ASCII file-ként van elmentve, a szöveget érintetlenül hagyva hozzáíródik. Hasonló módon tetszőleges vonalzósor-mintákat készíthetünk. Ha gyakran kell a vonalzósort váltogatni, a mintákat tartsuk RAM-disken, gyorsabb a betöltés.

Dőlt betűk egyszerűen

Előfordulhat, hogy megunjuk a megszokott karakterkészletet, és valami másra vágyunk, mondjuk dőlt betűket akarunk látni a képernyőn (a dőlt betűtípus neve az angol szakirodalomban italic). Semmi akadálya, hogy emberfeletti erőfeszítéssel átdefiniáljuk a karaktergenerátort, de van egy sokkal egyszerűbb módszer is. A mellékelt programmal fél perc alatt elfogadható kinézetű dőlt karaktereket kapunk. A program az összes karakter felső három pontsorát egy-egy ponttal jobbra, az alsó három sort egy-egy ponttal balra tolja, a középső három sor a helyén marad.
Nincs akadálya annak sem, hogy balra dóig betűket állítsunk elő. Ehhez mindössze a POKE utasítást tartalmazó két sort kell egymással felcserélni.

100 PROGRAM "Doltbetu.bas"
110 NUMERIC A,I
120 LET A=(SPEEK(255,16372)+SPEEK(255,16373)*256)-1152
130 FOR I=A TO A+3*128-1
140   POKE I,PEEK(I)/2
150 NEXT
160 FOR I=A+6*128 TO A+9*128-1
170   POKE I,MOD(2*PEEK(I),256)
180 NEXT


Directory fájlba BASIC program listázása szöveges állományba

Az idő előrehaladtával szükségünk lehet arra, hogy felidézhessük lemezeink tanalmát. Ha emlékezetünk erre túl rövidnek bizonyulna, Úgy célszerű ezt a feladatot is a gépre bízni: a directory listázását irányítsuk át egy fájlba, és később csak ezt "tájpoljuk ki". Basic-ben a megoldás:

OPEN £1:"A:DIRINFO" ACCESS OUTPUT
SET 4,1
DIR
CLOSE £1
SET 4,0

Ezek után a directory aktuális tartalma a DIRINFO fájlba kerül. Csak megjegyezzük, hogy így akár (az egyenlőre) vírusmentes programjaink eredeti hosszát is feljegyezhetjük a későbbi összehasonlíthatóság érdekében...

Nem csak directory-t, de BASIC programot is "listázhatunk" szöveges állományba az előbb megismert módon:

OPEN £1:"A:LIST.TXT" ACCESS OUTPUT
LIST £1
CLOSE £1

A Felhasználói kézikönyv szerényen hallgat róla, hogy az IS-BASIC szöveges állományt is be tud olvasni, tehát tetszőleges szövegszerkesztő programmal készített / módosított programlistát is be tudunk tölteni.


Rövid dallamok EXDOS kártya detektálása BASIC programból

Gyakran előfordul, hogy elkészült programunkat szeretnénk feldíszíteni hangokkal, rövid zenékkel. Bár az emberek többségének jó zenei hallása van, mégsem tud mindenki dallamokat DATA sorokba kódolni. Rajtuk próbálnak segíteni a listákon látható programok, melyek elindítása után kellemes zene szűrődik ki a gépből.
Fóti Marcell

MOZART.BAS, DVORAK.BAS, VANGELIS.BAS

Már egy BASIC program keretein belül is szükségünk lehet arra, hogy megállapítsuk van-e EXDOS kártya a rendszerben. Ezt ugyan megtehetjük egy, a programból kiadott EXT "HELP EXDOS" utasítással, de viszonylag hosszabb szöveget ír a képernyőbe, ami időbe telik. Az alábbi utasítás viszont semmi láthatót nem csinál:

EXT "EXDOS"&CHR$(253)

Kazettás rendszerben viszont "Unrecognised command string." (9240) hibát eredményez.


Színkeverés

Kedvenc masinánk 256 szín használatát teszi lehetővé. Ha egy-egy szöveges képernyőt ízlésessé szeretnénk tenni, akkor a megfelelő színek kiválasztása alapvetően fontos. Ez a gépben lévé színkavalkádból meglehetősen körülményes, ezért célszerű a listán látható programot segítségül hívni. Nincs más dolgunk, minthogy "billegtessük" a belső botkormányt, figyeljük a képernyő színeit, és lejegyezzük a megfelelő szirtkombináció kódját.

100 PROGRAM "Colorkey.bas"
110 LET B=0:LET F=255
120 DO
130   SELECT CASE JOY(0)
140   CASE 1
150     LET B=B+1 BAND 255
160   CASE 2
170     LET B=B-1 BAND 255
180   CASE 4
190     LET F=F-1 BAND 255
200   CASE 8
210     LET F=F+1
220   CASE ELSE
230   END SELECT
240   SET £102:PALETTE B,F,B,F
250   SET 27,B
260   PRINT £102,AT 1,1:B,F
270 LOOP

Stringek a Pascal-ban Stringek a Pascal-ban - újra
A Hisoft Pascal az eredeti Pascal-t olyannyira hűen valósítja meg az Exos-on hogy a rendszer nem ismeri a STRING típust. Megoldást jelent a karaktertömbök használata, amelyekből annyifélét kell tipizálnunk, ahány különböző hosszúságút akarunk használni. Ha esetleg escape-szekvenciát (azaz nem ábrázolható karaktereket) akarunk elküldeni az Exos-nak, akkor ne is próbálkozzunk a CONCAT()-al, hiszen ez már alapértelmezésben feltételezi a STRING típus meglétét. Csak úgy érhetünk célt, ha a tömb minden elemét külön-külön megadjuk...
Ez van!
Csak a tavaszi fáradság miatt maradhatott ki a hasonló című ötlethez tartozó Pascal nyelvű lista. Az ott közölt szöveg továbbra is érvényes, és íme, itt van a hozzátartozó program:

PROGRAM STRING.PAS;
TYPE STR6=PACKED ARRAY [1..6] OF CHAR;
VAR T:STR6;
PROCEDURE STDOUT(VAR X:STR6);
BEGIN
   RA:=CHR(121);
   RBC:=£0006;
   RDE:=ADDR(T);
   RA:=EXOS(8);
END; {of StdOut}
BEGIN
   T:='STRING';
   STDOUT(T);
END. {of program}


Megint egy START program!

Egyik előző számunkban már inunk arról, hogy mennyire megkönnyítheti életünket egy-két ügyesen megirt START program. Most is közreadunk egyet ezekből, ezúttal nem csak a programfejlesztgetőknek, hanem azoknak is, akik játszani is szeretnek.
Egy lemezen gyakran igen sok játékprogram fér el; a normál kétoldalason is átlagosan nyolc, de például a 3,5 hüvelykes (vagy 5,25 hüvelykes nem igazán szabványos) 720 kilobájtoson 16, az 1,44 megabájtoson pedig kb. 32. Egy-egy játék rendszerint 2-3, de néha 4-5 vagy még több fájlból áll. Hogy el ne vesszünk a félszáz különböző fájlnév között, érdemes a játékok 2., 3. és további fájljait HIDDEN (rejtett) attribútummal ellátni, csak az elsőt hagyni meg normálnak. Ekkor csak egy-egy fájl látható a katalógusban játékonként, ennek neve pedig rendszerint megegyezik a játék nevével. Így már könnyebb a választás (az EXDOS pedig gond nélkül megtalálja a rejtett fájlokat).
Hogy a dolog még egyszerűbb legyen, írhatunk egy rövid segédprogramot, amelyet azután START néven minden lemezünkre rámásolunk. Az F1 billentyű megnyomására a program elindul, és kiírja a katalógust. A kiíráson kívül a margótól beljebb villogó, megváltozott színű kurzor figyelmeztet arra, hogy most nem az IS-BASIC parancsértelmezőjével vagyunk kommunikációs kapcsolatban. A kurzorral a megfelelő programnevet tartalmazó sorra állva rögtön kiválaszthatjuk a futtatni kívánt programot, amit a programunk egy egyszerű trükkel elindít.
A program az illendőség kedvéért beállítja a dátumot és az időt, ha az nem lenne beállítva; ez persze játékprogram betöltésekor nem igazán fontos, ilyenkor a 120 ... 160-as sorszámú programrész elhagyható.
Csak megjegyezzük, hogy az itt közölt program tudomásunk szerint a lehető legegyszerűbb módszer programok menüből való indítására (jelenleg - az olcsó beszédfelismerő alrendszerek piacra dobásáig és az ENTERPRISE-hoz illesztésük megvalósításáig - ez a legkorszerűbbnek mondható eljárás az ember-gép kapcsolat területén). Emiatt hivalkodik kis programunk az elékelő MENÜ kiírással.
Mint minden egyszerű megoldásnak, ennek is megvannak a gyenge pontjai: senki sem akadályoz meg bennünket abban, hogy a képernyő tetszőleges pontjára vigyük a kurzort, és ott nyomjunk ENTER-t; ekkor ne csodálkozzunk, ha esetleg kellemetlen hibaüzeneteket kapunk. Nincs persze akadálya annak, hogy egy minden igényt kielégítő, álombeli menüprogramot csináljunk, de ez a legegyszerűbb esetben is nagyságrendekkel több erőfeszítést igényel. Talán majd valamelyik következő számban...
Csak a rend kedvéért jegyezzük meg, hogy vannak, akik az egyes játékokhoz tartozó fájlokat játékonként külön alkönyvtárban tárolják; emellett szól az, hogy a különböző játékok esetleg azonos nevű fájlokat használnak, ezek ekkor nem zavarhatják egymást. Ebben az esetben a program jelenlegi nagyszerű egyszerűségében nem alkalmas a programok indítására. Nincs azonban akadálya annak, hogy képessé tegyük alkönyvtárak végigbogarászására is.

100 PROGRAM "START.bas"
110 STRING X$
120 EXT "var 79 185"
130 IF DATE$="19800000" THEN
140   EXT "date"
150   EXT "time"
160 END IF
170 SET #102:PALETTE BLACK,GREEN,BLACK,CYAN
180 CLEAR SCREEN
190 PRINT :PRINT
200 PRINT " PROGRAMBETOLTO MENU"
210 PRINT
220 EXT "dir"
230 PRINT
240 PRINT " Alljon a kurzorral az inditani"
250 PRINT " kivant program sorara es nyomjon"
260 PRINT " ENTER-t"
270 LINE INPUT PROMPT " ":X$
280 IF LTRIM$(X$)<>"" THEN
290   LET X$=RTRIM$(X$(1:8))&"."&LTRIM$(X$(10:12))
300   RUN X$
310 END IF
320 SET #102:PALETTE BLACK,GREEN,BLACK,RED

 


Fent és lent A sarkon áll

Adjuk ki Basic-ben a
     SPOKE 255,15026,12
parancsot! Az Enter leütése után a képernyő tetején és az alján is a státuszsorban gyönyörködhetünk.

Szekeres Tamás

Még mielőtt bárki rossza gondolna, gyorsan elmondjuk, hogy az egyes editor-csatornák által a státuszsorban megjelenített szám jelentőségéről lesz szó. Sokan nem tudják ennek a számnak a jelentését. Nos, az editor tárolókapacitása is véges. Ha már csak 100 bájtnyi üres hely van a csatornában, akkor ezt jelzi ki a gép a képernyő jobb felső sarkában. A szöveg további írásakor ez a kijelzett érték folyamatosan csökken, hiszen fogy a szabad helyek száma. Ha az érték elérte a nullát, akkor ez azt jelenti, hogy az editor legelején álló szöveg eleje elveszett. A WP-vel dolgozóknak már a reflexükben van a sarok figyelése, mert csak így menekülhetnek meg szövegeik elvesztésétől...

Röviden az EDITOR-csatornáról

Egyik laptársunk egy olvasói levél alapján - arra hivatkozva, hogy ez az EXOS leírásból hiányzik - ismerteti a saját editor-csatorna megnyitásának módját, mégpedig pont az EXOS leírás szerint (lásd a 243. oldalon). Mivel azonban a lapban megjelent ismertetés hiányos, az EXOS leírás pedig köztudottan csapnivalóan rossz fordítás - és egyébként sincs meg mindenkinek -, most közérthetően, példával illusztrálva összefoglaljuk a teendőket, és kiegészítjük egy-két olyan tudnivalóval, ami sehol sem jelent meg. Nos, az eljárás a következő:

  1. Nyissunk meg egy videó-csatornát 40 vagy 80 oszlopos szöveges üzemmódban. A függőleges méret (VIDEO Y vagy Y_SIZ_VID) legalább 3 sornyi legyen, a vízszintes méret (VIDEO X vagy X_SIZ_VID) pedig legalább 4 karakternyi.
  2. Most (esetleg később) jelenítsük meg a videó-csatornát a képernyőn.
  3. Az EDITOR VIDEO gépi opció (a VID-EDIT rendszerváltozó) értéke legyen az 1. pontban megnyitott videó-csatorna száma. Ha semmit nem teszünk, itt az utoljára megnyitott editor-csatorna száma van; BASIC alatt ez 102, (a szabványos szöveges csatorna).
  4. Az EDITOR KEY gépi opció (a KEY EDIT rendszerváltozó) értéke legyen az editor-csatornához használni kívánt - nyitott - billentyűzetcsatorna száma. Ha semmit nem teszünk, itt az utoljára megnyitott billentyűzetcsatorna száma van; ez a Basic alatt 105 (a KEYBOARD: eszközre megnyitott szabványos csatorna); más programnyelvnél más lehet, illetve nekünk kell megnyitni billentyűzetcsatornát. (Itt más eszközre megnyitott csatornát is megadhatunk, ezzel érdekes trükköket lehet csinálni, de erről majd máskor.)
  5. Az EDITOR BUFFER gépi opció (a BUF_EDIT rendszerváltozó) értéke legyen az editor-csatornához szükséges puffer mérete (256 bájt az alapegység). Ha semmit nem teszünk, itt az utoljára megnyitott editor-csatorna puffermérete van, ez Basic alatt 8 egység (2 Kbájt). Vigyázzunk: túlzott nagyvonalúság mellett hamar elfogy a memória!
  6. Most megnyithatjuk az editor-csatornát (EDITOR: eszköznévvel). Ha kevés a videómemória, és nincs szükségünk a szabványos editor-csatornára, le is zárhatjuk (a hozzá tartozó videó-csatornával együtt) a saját csatorna (vagy csatornák) megnyitása előtt. Ezzel azonban vigyázzunk: ha nem adunk meg alapértelmezés szerinti csatornát (a DEFAULT CHANNEL gépi opcióval, illetve a DEF_CHAN rendszerváltozóval), a rendszer nem tudja megjeleníteni az esetleges hibajelzéseket.

Ügyeljünk arra is, hogy a gépi, illetve videó-opciók (rendszerváltozók) idejében visszakapják eredeti értéküket, különben furcsa jelenségeket tapasztalunk. A Basic például visszaállítja a 102-es csatornát az editor videó-csatornájának, de nem változtatja meg a pufferméretet, és nem állítja vissza a billentyűcsatorna számát sem.

100 PROGRAM "Editor.bas"
110 ! 1. lepes
120 SET VIDEO X 40
130 SET VIDEO Y 4
140 SET VIDEO MODE 0
150 SET VIDEO COLOR 0
160 OPEN £1:"video:"
170 ! 2. lepes
180 DISPLAY £1:AT 1 FROM 1 TO 4
190 ! 3. lepes
200 SET EDITOR VIDEO 1
210 ! 4. lepes
220 SET EDITOR KEY 105
230 ! 5. lepes
240 SET EDITOR BUFFER 1
250 ! 6. lepes
260 OPEN £2:"editor:"
270 WHEN EXCEPTION USE VISSZA
.
.
.
990 END WHEN
1000 HANDLER VISSZA
1010 SET EDITOR BUFFER 8
1020 DISPLAY TEXT
1030 END HANDLER

Nagyobb méret Torz Karakterek

Megalomániásoknak ajánljuk figyelmébe a listán látható rutint. A program lefuttatása után a szerkesztésre használt képernyő mérete a BASIC-ből elérhető maximális méretű lesz. Az eredetit a TEXT paranccsal állíthatjuk vissza.

100 PROGRAM "Bigedit.bas"
110 CLOSE £0
120 CLOSE £102
130 SET VIDEO MODE 0: SET VIDEO COLOR 0
140 SET VIDEO X 42: SET VIDEO Y 27
150 OPEN £102:"VIDEO:"
160 OPEN £0:"EDITOR:"
170 DISPLAY £102:AT 1 FROM 1 TO 27

Ez az ötlet tulajdonképpen az előző elfajzásának tekinthető. Az alapértelmezésű videó-csatornát ugyanis négyszínűnek állítjuk be, és így igen érdekes (értsd: gyakorlatilag olvashatatlankarakterek jelennek meg a képernyőn.

100 PROGRAM "ColChars.bas"
110 CLOSE £102
120 SET VIDEO COLOR 1
130 OPEN £102:"VIDEO:"
170 DISPLAY £102:AT 1 FROM 1 TO 24


BASIC programok titkosítása

Sokakat érdekelhet, hogyan dugjuk el az illetéktelen szemek elöl elkészült BASIC programjainkat. Ismerek erre egy eljárást, amely lehet, hogy sok felhasználónak már nem mond újat, de ilyen formában összegyűjtve tudomásom szerint még sehol sem jelent meg.
Az eljárás négy pontból áll, lássuk tehát sorra:

  1. A STOP billentyű letiltása
    Hatására a futó programot nem lehet a STOP billentyűvel megállítani. Megvalósítása a BASIC-ben:
         SET INTERRUPT STOP OFF

  2. Melegindítási cím átírása
    A program meleg reset-re (egyszer megnyomva a reset gombot) is "elszáll". Adjuk ki a
         SPOKE 255,49144,0: SPOKE 255,46145,0
    Parancsokat! Az 1.és 2. pontok közös hatása: ha a program már elindult, nem lehet megállítani. (csak ha hibával kilép) Célszerű ezért a hibalehetőségeket a programból lekezelni HANDLER-ek használatával.)

  3. Az autostartos indítás
    A program a LOAD-dal való betöltés után is automatikusan elindul. A programot az ASMON-ba kell tölteni, és a fejrész 5. számú bájtját - ami eddig 00 volt - 05-re kell átírni. (Az 5. sorszámú bájt sorrendben a hatodik!) Az ASMON-ra vonatkozó idevágó tudnivalók az ENTERPRESS Gépi kódú tanfolyamában olvashatók el.)
    Az 1., 2., és 3. pontok együttes alkalmazása már jó programvédelmet jelent. Ezt a programot nem lehet megnézni, mert autostarttal indul, és nem lehet megállítani. Magától azonban még megállhat, ha hibára fut, vagy ha úgy írtuk meg, hogy egyszerűen a végére ér.

  4. 4. A listázás leállítása
    A program listázása egy bizonyos sorszám után letiltásra kerül. Az eddigiek közül ez a legbonyolultabb és egyben a legveszélyesebb. Ha a program jól van megírva, erre a pontra már nincs is igazán szükség a fenti pontok alkalmazása után. Ha mégis alkalmazni kívánjuk, hagyjunk egy változatot az eredeti programból, nehogy hibázás esetén a teljes program elvesszen.

Ha a BASIC program egyik sorszámát 9999-nél nagyobb számra írjuk át, a listázás ezen sorszámtól elkezdve nem lehetséges. A sorszám felülírását szintén az ASMON-ban lehet megoldani, ehhez azonban ismernünk kell a BASIC program tárbeli szerkezetét. A BASIC program a tárban tokenizált formában, soronként egymásután helyezkedik el. Egy sor négy fő részre bontható, ezek a következők:

  • a sor hossza (1 bájt),
  • a sor BASIC sorszáma hexadecimálisan (2 bájt),
  • a sor "tartalma" tokenizált formában,
  • a sor végét jelző bájt (0).

Ha próbaképpen egy Basic programot az ASMON-ba töltünk, számoljuk le az első 16 bájtot (ez a programfejrész), a következőtől kezdődik az első programsor. Ezen bájt tartalmával előre haladva (mivel ez jelzi a sor hosszát), a második sor hosszjelző bájtjához érünk. Ez addig tart, amíg a sor hosszanként 0-t kapunk, ez már a program végét jelzi. A hosszjelző bájtok tehát egy láncot alkotnak, melyen végiglépkedve bármelyik sort megtalálhatjuk és átírhatjuk annak sorszámát.
Praktikus ez a megoldás, amikor a program első sorának ezt választjuk:
     100 PROGRAM "név.kit"
Ekkor a 110 sor sorszámát átírva listázáskor csupán annyi derül ki, hogy milyen program van a tárban. Az átíráshoz töltsük a programot az ASMON-ba, számoljuk le az első 16 bájtot, a következő bájt jelzi az első dor hosszát. Ezután a hexadecimális "64 00" következik, ami nem más, mint a ceximális 100 (64h = 100d), azaz a program első sora. A lánc következő tagja utáni két bájt:"6E 00", ez a 110. Ha itt a "00"-t átírjuk "FF"-re, máris 9999-nél nagyobb sorszámot laptunk. Ezután már csk ki kell menteni a programot! (Vigyázzunk a "LAST ADRESS"-re!)
A fenti négy pont alkalmazásával készült program tehát így kezdődik:

100 PROGRAM "név.kit"
110 SET INTERRUPT STOP OFF
120 SPOKE 255,49144,0
130 SPOKE 255,49145,0
140 ...

Ezenkívül át van írva az autostart bájt és a 110-es sor sorszáma. Így a program autostarttal indul, nem lehet megállítani, ha hiba miatt mégis kilép, listázáskor csak az első sorát mutatja magából. Ez a programvédelem szerintem bőven elég ahhoz, hogy illetéktelen személy ne tudjon belekontárkodi BASIC programunkba. Természetesen aki ismeri az eljárást , az könnyen feltörheti, de ez időt vesz igénybe, és egy BASIC program titkosítása végülis nem egy egetrengetően fontos dolog, inkább csak az érdekessége miatt érdemelhet egy-kéz szót.

Hámori György


A szinusz hangjai Villogó sorok

A szinusz-függvény egy érdekes alkalmazására mutat példát az alábbi program. A hang maságát ugyanis a rutin közepére helyezett SIN() határozza meg.

100 PROGRAM "Sinusoid.bas"
110 OPTION ANGLE DEGREES
120 DO
130   FOR I=1 TO 359
140     SOUND PITCH SIN(I)*32+32, INTERRUPT
150   NEXT
160 LOOP

A WP "Line colour" parancsával átszínezhetjük az egyes sorokat. Mivel az EDITOR: eszköz funkciói mindenhol élnek, így ezt a hatást BASIC-ben is elérhetjük. A sorok átszíneződését az ASCII 246 kódú karakter elküldése jelzi az editornak, így mindenféle billentyűnyomogatás nélkül is elérhetjük ezt a hatást.

100 PROGRAM "Flash.bas"
110 PRINT AT 5,1:"Ez a sor villog.";
120 FOR I=1 TO 50
125   WAIT DELAY 1
130   PRINT AT 5,1:CHR$(246);
140 NEXT


A funkcióbillentyűk - máshogy

A funkcióbillentyűk átprogramozása jelentősen megkönnyítheti a munkát. A billentyűk eredeti értelme elsősorban a BASIC használatához van optimalizálva. Más rendszerek - ha jól vannak megcsinálva - átdefiniálják a funkcióbillentyűket a saját ízlésük szerint. Így jár el például a HiSoft PASCAL rendszer automatikusan, vagy a nálunk forgalmazott - bővített - IS-DOS operációs rendszer a FKEY parancs kiadásával. Ha elsősorban nem BASIC-ben dolgozunk, szükségünk lehet egy hasonló megoldásra. Különösen a lemezegységgel rendelkezők tudják rugalmasan kihasználni ezt a lehetőséget.
Az itt bemutatott program (FKEYS.BAS) az EXDOS környezethez illeszkedő funkcióbillentyűket definiál. A billentyűk kiosztása, ahol lehet, illeszkedik az ISDOS alatt megszokott elrendezéssel. Hogy ne kelljen a billentyűk hatását memorizálni, sem pedig a billentyűsor fölötti emlékeztető csíkot cserélgetni, a program a képernyő senki által nem használt alsó három sorában létrehoz egy segítő menüt. Itt a kulcsszavak után álló aláhúzás karakter azt jelzi, hogy a billentyű lenyomásával a parancs kiadása nem fejeződik be, ahhoz egy vagy több paramétert kell megadni.
Az itt megadott billentyűkiosztás természetesen nem kötelező előírás, azt mindenki a maga ízléséhez alakíthatja.
Nem lenne teljes a megoldás, ha az átdefiniált funkcióbillentyűket nem lehetne egy mozdulattal visszadefiniálni. Ezt a feladatot az F16 funkcióbillentyű látja el a CLRKEYS.BAS program indításával. Ez néhány kivétellel visszaállítja a billentyűk eredeti értelmét, és az előzőhöz hasonló segítő menüt ír ki. A menü eltérő színe is figyelmeztet a változásra. A lemezegységgel dolgozó felhasználóknak nincs szükségük a REM1 és a REM2 funkcióbillentyűre, így ezeket át lehet definiálni hasznosabbra. Megintcsak az F16 billentyű adja a visszatérést a módosított billentyűkhöz.
Ennek a megoldásnak a hátránya az, hogy a billentyűk át- és visszadefiniálásakor elvész a memóriában esetleg ott lévő (és el nem mentett) program. Ilyenkor használjuk időben a SAVE parancsot.
Ne feledkezzünk meg viszont arról a tényről, hogy lehetőségünk van egyszerre több programot a memóriában tárolni, és ezeket egymásból a CHAIN utasítással indítani. Egy kis átalakítással a "magnósok" is kialakíthatnak egy saját funkcióbillentyű-kiosztást.

(FKEY.BAS; CLRKEYS.BAS)


Szimetria Ha letelt az idő

Az alábbi lista begépelése, a program elindítása után a gép véletlenszerűen szimmetrikus mintákat rajzol a képernyőre.

100 PROGRAM "Symm.bas"
105 TEXT 40
110 STRING D$(0 TO 1)
120 LET D$(0)=CHR$(32)
130 LET D$(1)=CHR$(142)
140 RANDOMIZE
150 DO
160   LET X=RND(20)+1
170   LET Y=RND(12)+1
180   LET Z=RND(2)
190   PRINT £102,AT Y,X:D$(Z);
200   PRINT £102,AT Y,41-X:D$(Z);
210   PRINT £102,AT 25-Y,X:D$(Z);
220   PRINT £102,AT 25-Y,41-X:D$(Z);
230 LOOP

Számtalan olyan alkalom van, amikor csak egy bizonyos ideig kell egy folyamatnak futnia (pl. várakozás billentyűre, várakozás karaktervételre soros vonalnál stb.), utána egy másikra kell áttérni. Az EXOS-nak van egy ilyen időzítője, amelyet BASIC-ből is remekül lehet használni. Ezt illusztrálja az alábbi program:

100 PROGRAM "timeout.bas"
110 PRINT "Nyomj le egy billentyut!"
120 SET TIMER 5
130 WHEN EXCEPTION USE TIMEOUT
140   LET A$=INKEY$
150   IF A$="" THEN 140
160   PRINT "Megnyomtad az ido lejarta elott."
170 END WHEN
180 HANDLER TIMEOUT
190   PRINT "Letelt az ido!"
200 END HANDLER


RND-rutin Hibás a magyar híd (BUS BRIDGE)

Ezt a rutint ajánljuk azoknak a program átíróknak, akik egyes játékprogramokból kihagyták a nagyon fontos RND-rutinokat. Használata: egyszer meghívjuk a RANDOM-ot, utána már csak az RND-t kell hívni.

RANDOM:


RND:

RND10:




RND20:













RNDTAR:
LD A,R
LD HL,(RNDTAR+1)
JR RND10
LD A,(RNDTAR+2)
LD HL,(RNDTAR)
LD B,8
; 8 vagy 16 vagy 24
; 8 -ha csak egy
; akkumulátort használunk,
; 16 - HL, 24 - HLA
LD C,A
RRCA
RRCA
RRCA
XOR C
RLA
RLA
LD A,C
ADC HL,HL
ADC A,A
DJNZ RND20
LD (RNDTAR+2),A
LD (RNDTAR),HL
RET
DB "RND"

Jelenségek: Az EXDOS elköltözik a 160-as szegmensre, emiatt néhány program nem működik. A WD portjai is 60H-tól kezdődnek 20H helyett. A hibát úgy deríthetjük fel, ha kiadjuk a

:VAR 64

parancsot.
Ha ezután a gép 160-at ír ki, akkor hibás a hídunk, ha 32-t, akkor minden rendben.

A hiba elhárítása: össze kell kötni az A36-ot a B36-tal a hídon, ezt ugyanis elfelejtette összekötni a sokat emlegetett magyar cég.


Gyorsítás Hol a hiba?

A programfutás sebességét gyorsíthatjuk a következő két lehetőséggel:

  1. A DAVE chip 0BFH portján kikapcsolhatjuk a várakozást a memória-hozzáférési műveleteknél. Adjuk ki az
    OUT 191,12
    parancsot. Hatására a futásidő kb,  86%-ra csökken.

  2. A megszakítást a kritikus helyeken kikapcsoljuk, majd helyreállítjuk.
    POKE 56,201 (A futásidő 81%-ra csökken)
    POKE 56,245 (helyreállítás)
    Ne felejtsük azonban, hogy kikapcsolt megszakítással a billentyűzetfigyelés nem működik és a gép órája is megáll! )

A két eljárást együttesen alkalmazva kb. 70%-ra csökkentjük a futási időt. Ezek a beállítások bármely nyelvből használhatóak.

Hsoft

Titokzatos hiba bujkál valahol az EXDOS - IS-DOS csatlakozásnál. Néha, ha RAM-diszket használva akarjuk az IS-DOS-t elindítani, az EXDOS File not Found hibaüzenettel utasítja el a próbálkozást. Ezután, ha megszüntetjük a RAM-diszket, és újra megpróbáljuk, a rendszer No RAM disk üzenetet ad, akkor is ha gondosan az A meghajtóra váltottunk előtte.
A hiba elhárításához ismerni kell a 72-es EXOS változó jelentését):
BOOT_DRV: "újraindítási meghajtó", alapállapota 0, ha behívjuk az IS-DOS-t, akkor ide eltárolódik az aktuális meghajtó (71-es változó). A továbbiakban a 72-es változó által meghatározott meghajtón keresi az IS-DOS az AUTOEXEC.BAT fájlt, a .HLP fájlokat, innen tölti vissza magát ha valamely program (vírus?) megrongálja az IS-DOS területeit, és az EXDOS is az IS-DOS következő meghívásakor erről a meghajtóról tölti be az IS-DOS.SYS fájlt (kivéve ha ROM-ban van az IS-DOS). Mivel az EXDOS csak akkor tárolja el az aktuális meghajtót ebbe a változóba, ha 0 van benne, így érthető, hogy miért kereste az IS-DOS-t a második próbálkozásnál még mindig a RAM-diszkben. A hiba elhárítása tehát nagyon egyszerű:
     VAR 72,0
(A leírtakból kiderül, hogy a hiba nemcsak az IS-DOS.SYS fájllal, hanem az AUTOEXEC.BAT-tal, és HLP fájlokkal is előfordulhat.)
Egy megjegyzés: az IS-DOS.SYS fájl 5-ös fejlécű modul, így a LOAD paranccsal is betölthető, csak ekkor nem adhatók át paraméterek.

Zozosoft


Bosszúságaink Újabb furcsaság

Tudjuk, hogy a szöveges képernyőn a háttér és a karakterek színe megváltoztatható. 40 karakteres üzemmódban kétféle papír-tinta színpárt használhatunk. Ha azonban letöröljük a képernyőt, és átállítjuk a tintaszínt, a gép erre nem reagál, a tintaszín nem állítódik át! Egyik programomban az alábbi sorok szerepeltek:

SET £102:PALETTE GREEN,RED,GREEN,BLACK

(azaz zöld háttér előtt piros és fekete betűk), majd később

CLEAR SCREEN
SET £102:INK 3

Erre a gép zavartalanul piros betűket kezdett el írni. A megoldás: legalább egyszer írni kell a lapra mielőtt átállítjuk a színeket. Legegyszerűbb egy üres PRINT utasítás:

CLEAR SCREEN
PRINT
SET £102:INK 3

Ekkor már a helyes színt kapjuk.

Azt bizonyára már többen észrevették, hogy az IS-BASIC készítői arra is figyeltek, hogy ha egy korábban képernyőre kerülő "ok" üzenet sorába mozgatva a kurzort megnyomjuk az ENTER-t a gép ne írjon ki hibaüzenetet. Ezt úgy sikerült megoldani, hogy az "ok" egy olyan parancs, amely nem csinál semmit.
Ha azonban egy futó programot megállítunk az ENTER megnyomásával és egy "ok" üzenetben ENTER-t nyomunk, ezután a CONTINUE parancs hatására a gép kiakad. Az OK parancs, bár semmit nem csinál, végrehajtása átrendezi a BASIC vermet, így a CONTINUE már hibás címre fut rá. A megoldás az OK parancs rutinjában letiltani a CONTINUE lehetőségét.

Sok Basic interpreter nélkülözi az olyan elemi szolgáltatásokat, mint például az IS-Basic rendszer RENUMBER parancsa, amely átsorszámozza a programsorokat. Bátran kijelenthetjük, hogy egy ilyen rendszer gyakorlatilag játszogatáson kívül bármi másra használhatatlan.
Létezik olyan újraszámozási megoldás, amelyik csak a sorok elején álló sorszámokat számozza át, a rájuk való hivatkozásokat már nem. Például, ha van egy GOSUB 1210 utasítás a programban, az újraszámozás után ez az utasítás máshova fog belépni, mint előtte. Hogy egy ilyen megoldás mit ér, nem kell taglalni.
Az IS-Basic rendszer RENUMBER parancsa intelligens, legalábbis első látásra: a GOTO és a GOSUB utasítások hivatkozásait is átszámozza (más kérdés, hogy az IS-Basic-ben ez az a két utasítás, amelyiket szerencsére soha sem kell használni). Nagy meglepetésünkre azonban az EXLINE függvénnyel együtt pl. egy IF utasításban szereplő hivatkozás az átszámolásnál nem változik, így az eredetileg egy adott utasításban előforduló hiba vizsgálata elromlik. Bizonyos szempontból talán érthető, miért maradt benn a rendszerben ez a hiba (ha egyáltalán észrevették és foglalkoztak vele): szinte lehetetlen ugyanis kideríteni, milyen módon kellene "átszámozni" a sorszámot az alábbi típusú utasításban:

IF EXLINE+20=A*B-320 THEN ...

A kiút: kerüljük az olyan programmegoldásokat, ahol a sorszámnak bármiféle jelentősége van (azaz ne használjuk, mivel egyébként sem tanácsos, a GOTO és a GOSUB utasítást sem). Ha a hibakezelésnél nem megoldható, hogy minden egyes kritikus programszakaszt önálló WHEN ... END WHEN blokkba tegyünk, vezessünk be egy változót (a főprogram elején deklaráljuk, hogy feltétlenül globális legyen), és ennek minden kritikus művelet előtt adjunk más és más értéket. A HANDLER-ben így garantáltan azonosíthatjuk a hibát.


Működik a "Set func key"! A német bővítésről

Egy jó hír az ASMON használók számára: Mégiscsak lehet a funkcióbillentyűket programozni! A SHIFT-tel együtt lenyomott funkcióbillentyűk jelentése az editorban és az editorból való kilépés után is megmarad. Ezen billentyűk számai 11h-tól 18h-ig terjednek. Azt csak úgy megjegyezzük, hogy így akár "billentyűmakrókat" is írhatunk az egyparaméteres ASMON parancsokhoz.
Tegyük fel, hogy gyakran van szükségünk az 1000h címtől a listázásra. Nos, gyomjuk le az 'I'-t, adjuk meg a 11-et (ez jelenti a SHIFT+F1-et), majd írjuk be: "L1000". (Figyelem! Az idézőjeleket is be kell gépelni, különben az ASMON ***HEX ERROR hibaüzenetet küld!) Ezek után a listázáshoz elegendő a SHIFT+F1-et és az ENTERT-t lenyomnunk.

Németh József

A bővítés a német (BRD), és az angol (UK) mód mellett tartalmazza a kinyomtatását (VDUMP), kimentését (VSAVE) és a kép betöltését (VLOAD) támogató bővítéseket is. A két utóbbi funkció meghívása parancssorból egyszerű:
     :VSAVE "képnév.kit"
     :VLOAD "képnév.kit"

Programból az idézőjelek miatt nehezebb a szintaktika, több programban látunk ilyet:
     100 EXT "VLOAD"&CHR$(34)&"képnév.kit"&CHR$(34)
Van ennél egyszerűbb hívási forma is:
     100 EXT "VLOAD""képnév.kit"""
A funkciók alapértelmezése a 101-es (grafikus) csatorna, de bármelyik videó-lapot kimenthetjük, vagy betölthetjük. Példa az alapértelmezésű szöveges lap mentésére:
     :VSAVE £102:"képnév.kit"
     100 EXT "VSAVE £102:""képnév.kit"""

Ha egy régebben kimentet képet szeretnénk betölteni, és elfelejtettük a hozzá tartozó videólap adatait, akkor gond van. Szerencsére a VSAVE a fejrészben kimenti ezeket az adatokat, melyeket az ASMON-al tudjuk megnézni. A 16 bájtos fejléc szerkezete:
00 0B VIDEO_MODE VIDEO_COLOR X_SIZE Y_SIZE 00 00 00 00 00 00 00 00 00 00
Ha nem nullás VIDEO_MODE értékű a kimentett kép, akkor az X_SIZE "80-as" karakterekben van megadva!
Van két hibája is a funkciónak:

  • Ha kimentés közben lenyomjuk a STOP-ot, majd újra hívjuk a VSAVE-t, akkor "az eszközt már használják" hibaüzenetet kapjuk.
  • Magnónál (főleg másoláskor zavaró az, hogy a funkció kétszer nyit meg csatornát.

Németh József


Logaritmikus keresés

Az IS-BASIC az egyik legtöbbet tudó BASIC "nyelvjárás", nem nehéz például egyszerű adatbáziskezelő programot írni BASIC-ben. Egy ilyen program írásánál csak egy probléma merülhet fel: a program sebessége. Sajnos a BASIC nagyon lassú. Ezen a problémán normális BASIC fordító nélkül (ami nem a ZZZIP!) csak egyféleképpen lehet segíteni: minél hatékonyabb eljárásokat kell írni.
Egy adatbáziskezelőben a sebesség szempontjából két kritikus pont van: az adatok rendezése és keresése. Most essen szó a keresésről, egészen pontosan a logaritmikus keresésről.
A logaritmikus keresés csak rendezett tömbben működik, viszont nagyon gyors. Egy 5000 elemű tömb bármely elemét képes megtalálni 2 másodpercen belül! Az algoritmus lényege, hogy a lehetséges elemek számát minden lévésben megfelezzük (a számkitaláló játék mintájára).
Az eljárást CALL KERES(változó) utasítással lehet meghívni. A változó a keresett elemet tartalmazza. A TOMB$(X) tömbben keressük a kérdéses elemet.
Az F változó a lehetséges felső indexhatárt tartalmazza. Kezdetben a tömb felső indexhatárára mutat: a példában 500 elemű tömb szerepel.
Az A változó a lehetséges alsó indexhatárra mutat.
A SORSZ változó a megtalált elem sorszámát tartalmazza. Ha az eljáráson kívül is használni akarjuk legyen globális változó!
A VAN logikai változó mutatja, hogy létezik-e a keresett elem.
Amennyiben a tömbben több azonos elem is szerepelhet a megtalált elem alatt és felett folytatni kell a keresést.

1000 DEF KERES(V$)
1010   LET A=1:LET F=500
1020   DO
1030     LET K=INT((A+F)/2)
1040     IF TOMB$(K)<V$ THEN LET A=K+1
1050     IF TOMB$(K)>V$ THEN LET F=K-1
1060   LOOP WHILE A<=F AND TOMB$(K)<>V$
1070   LET VAN=(A<=F)
1080   IF VAN THEN
1081     LET SORSZ=K
1082     PRINT "Megtaláltam! ";TOMB$(SORSZ);SORSZ
1083   END IF
1084   IF VAN=0 THEN PRINT "Nincs ilyen elem!"
1090 END DEF

Írás a státuszsorba Amikor az EXOS nem osztott lapot...

A CODE pointer átállításával lehetőséget kapunk, hogy a sztring-eket közvetlenül a memóriába írjuk. Az alábbi programot lefuttatva, szembetűnő sebességeltérést tapasztalhatunk a hagyományos és a CODE rutint használó státuszírásnál. A módszer addig lesz működőképes, ameddig a Basic nem használja a második lapot. ALLOCATE használat esetén, csak a kód elkészítése után állítsuk el a pointert, vagy alkalmazzunk elmentést és visszaállítást.

100 PROGRAM "Status.bas"
110 LET A$="ENTERPRESS A KEDVENC LAPOM, GUTA UT MEG, HA NEM KAPOM... "
120 POKE 56,201
130 ! 1. modszer
140 !
150 FOR I=1 TO 20
160   FOR X=1 TO 34
170     POKE 48829+X,ORD(A$(X))
180   NEXT
190   LET A$=A$(2:)&A$(1)
200 NEXT
210 ! 2. modszer
220 !
230 FOR I=1 TO 1000
250   ! A sebesseg allitasa
260   ! felkialtojeles sorokkal
270   POKE 540,190:POKE 541,190
280   CODE =A$(2:)&A$(1)
290 NEXT
300 POKE 56,245

Egy 5-ös fejlécű (NAP) program 100h-tól BFFF-ig terjedhet. Nemrégen történt, hogy olyan programot kívántam futtatni, amelynek a vége a második lapra esett. A program nem működött. A bogarászás végén ellenőriztem az első és második lapszegmens számát. Az első lapon a második lapra kívánkozó, a másodikon pedig a 255-ös szegmenset találtam. Az EXOS elfelejtett, vagy nem tudott helyesen belapozni.
A feladatot a következő módon oldottam meg. Az EXOS az előző felhasználói szegmenseket felszabadítja, és kettőt lefoglal a program részére. Az első felhasználó által foglalt szegmens az első lapra, a második pedig a másodikra kerül.

ORG 100H
LD SP,100H
LD A,255
OUT (0B2H),A
LD HL,(0BF9CH)
INC HL
LD A,(HL)
OUT (0B1H),A
INC HL
LD A,(HL)
OUT (0B1H),A

Hsoft
STAR nyomtató csatlakoztatása

Köztudott, hogy sokan használják ENTERPRISE gépükhöz a kiváló STAR nyomtatókat. (A STAR nagyon híres mátrix nyomtatóiról.) A gond csak akkor kezdődik, ha csatlakoztatni szeretnénk az EP-hez a STAR nyomtatót. Nos, az alábbi kapcsolási rajz talán segít. STAR IC-100 colour Printer csatlakozását mutatja be az EP-hez. A kapcsolási rajzot Németh Attila budapesti olvasónknak köszönhetjük.


Ellenőrzött INPUT rutin

Ha valaki igényes BASIC programot akar írni, az egyik legnagyobb problémája az adatok bekérése. Mert mit csinál a "gonosz" (f)elhasználó, ha egy INPUT paranccsal adatot vár tőle a program? Elmászkál a képernyőm a kurzorral, szám helyett betűket ír be. Az alábbi rutint az adatok "bolondbiztos" bevitelét valósítja meg. A rutint (INP.BAS) a következőképpen kell meghívni:

CALL INP(változótípus, maximális szöveghossz, pozíció, változó$)

  • Ha változótípusnak 0-át adunk meg, bármilyen betűt, számot (és a pontot) beírhatunk, egyéb esetben csak számot fogad el a rutin (és a pontot). A rutin meghívása után, ha numerikus értéket akarunk használni , a VAL függvénnyel konvertálni kell a változót.
  • A szöveghosszban a maximálisan beírható karakterszámot adhatjuk meg, de ez maximum 35 lehet. Ha ennél többet adunk meg, az értéket a rutim lecsökkenti 35-re.
  • A pozíció a függőleges pozíciót jelenti, vízszintesen automatikusan középre igazítja a rutin a megjelenő szövegmezőt.
  • A változót ne felejtsük az eljárás meghívása előtt deklarálni (létrehozni)!

A rutin a HFONT karakterkészletre van tervezve, annak keretező karaktereit használja és figyeli az ékezetes betűket is!
Ha át akarjuk alakítani, HFONT karakterkészlet nélküli használatra, a keretező részt (9960-9968) vagy teljes egészében elhagyjuk, vagy átalakítjuk. (pl. csak két határoló karaktert rajzoljuk meg). Ha nincs szükségünk az ékezetes karalterek figyelésére, a 9990-9994-es sorokat kell elhagynunk.
Egy egyszerű tipp a bővítésre: ha igény merülne fel az ESC billentyű figyelésére, ezt könnyen beépíthetjük a programba a 9994-es sor mögé (a programsorszámozás 9950-től egyesével történik, így előtte RENUMBER paranccsal át kell sorszámoznunk a programot). Az ESC ASCII kódja 27, az erre vonatkozó feltételes-ágra berakhatjuk pl., hogy a VALT$ változóba egyetlen olyan karaktert tegyünk, ami a rutinból nem beírható, majd kiléphetünk a billentyűzetfigyelő ciklusból (EXIT DO) és így az egész eljárásból. A program további részében vizsgálhatjuk, hogy ESC billentyűvel tértünk-e vissza a rutinból.


A GET és a LOOK utasítás használata szöveges képernyőről való olvasáshoz Rajzolás a pozíció relatív megadással

A Felhasználói kézikönyv állításával szemben a LOOK utasítás is használható szöveges képernyőről való karakterolvasásra. A két utasítás helyes használatukhoz fontos tudni azonban a karakterkészletről, hogy 128 karakteres Nick módot használ az EXOS, azonban az ASCII-ban 32-től kezdődnek a nyomtatható karakterek. Így kihasználatlan lenne a 128-as karakterkészlet 0-31 kódú karakterei. Ezért ezeket az EXOS-on keresztül 128-159 kódokkal érhetjük el, azonban a videó memóriába már konvertálva az eredeti kódokon kerülnek. És ezt is kapjuk vissza, amikor olvasunk a videó lapról. Ezért a GET utasítással nem tudunk kiolvasni az ALT-tal elérhető karaktereket.
A megoldás az, hogy LOOK-al kell olvasni numerikus változóba, és ha a kapott kód 32-nél kisebb, akkor hozzá kell adni 128-at.

Az EXOS ismer olyan rajzoló funkciót, ami a rajzolósugarat az előző pozíciójához viszonyított értékekkel mozgatja arrébb. A BASIC-ből azonban nincs ilyen utasítás (csak a teknőcgrafikus utasítások használják a funkciót). Szerencsére az escape-szekvenciák használatával könnyen pótolhatjuk ezt az utasítást.

9900 DEF PLOTREL(CH,X,Y)
9910   PRINT £CH:CHR$(27);"R";WORD$(X);WORD$(Y);
9920 END DEF


Furcsa ellipszisek

Egy Basic Programban a következő sor szerepelt: PLOT ELLISPE A,B. E sorban nincs is semmi hiba, de B értéke egy programhiba miatt negatív volt. Ennek ellenére a gép végrehajtotta a programsort! Igaz, a képen látható alakzat a legkevésbé sem hasonlított ellipszisre. Ha ciklusban rajzolunk ilyen "ellipsziseket" érdekes hatásokat érhetünk el.

100 GRAPHICS HIRES 4
110 SET PALETTE 0,YELLOW
120 PLOT 640,360
130 FOR A=50 TO 800 STEP 50
140   PLOT ELLIPSE A,-A
150 NEXT


Videolapok bezárásának sorrendje Amikor szükséges a változó deklaráció

Az esetlegesen megnyitott videolapokat egy "jól nevelt" program bezárja maga után a programfutás befejezte előtt. Ha sok videolapot nyitottunk meg (pl. egy animációhoz), akkor azok bezárásával sokkal hamarabb végez az EXOS, ha fordított sorrendben zárjuk be, mint ahogy megnyitottuk ezeket! Ennek magyarázata, hogy az EXOS minden csatornazárás után rendbe rakja a memóriát. Ezért van az eszközkezelőknél a puffer mozgatás funkció, amivel közli az EXOS az adott csatorna kezelőjével a mozgatást, és az megjegyezheti az új címeket. Ha éppen kijelzett videó lapot érint a mozgatás, akkor ilyen esetben látható egy kis villanás is a képen, amikor változik az LPT.
Példa a helyes sorrendre:

FOR I=1 TO 24
  OPEN £I:"video:"
NEXT
...
FOR I=24 TO 1 STEP -1
  CLOSE £I:"video:"
NEXT

A BASIC nyelvjárásokban - így az IS-BASIC-ben is - nem szükséges a változókat első használatuk előtt deklarálni. IS-BASIC-ben erre van lehetőség. Fontos azonban tudni, hogy a változóknak nincs kezdőértéke. Ezt sokszor hátrányként emlegették, pedig rögtön nagy előnnyé változik más BASIC változatokhoz képest, amikor egy elgépelt változónevet kell felderítenünk egy terjedelmesebb programlistában, mert az látható hiba nélkül nem azt csinálja amit elvileg kellene...
A Felhasználói kézikönyv eléggé érthetően magyarázza el a lokális és globális változók használatát, egyvalami azonban kimaradt belőle: Ha egy eljárás rekurzívan hívja önmagát és van benne FOR-NEXT ciklus, a ciklusváltozókat deklaráljuk az eljárás elején! Ellenkező esetben a gép nem egészen azt fogja csinálni, amit szeretnénk.
Még egy esetben szükséges a típusdeklaráció: Ha nem deklaráljuk használat előtt a szöveges változókat, maximális hosszuk 132 karakter lehet. Ez praktikus, hisz memóriatakarékosság céljából nem érdemes ennél nagyobbat használni, csak ritkán van szükségünk ennél nagyobb változóra. Ha ennél mégis hosszabb stringet szeretnénk a változóban tárolni, használat előtt deklarálnunk kell a STRING utasítással. A szöveges változók maximális hossza 254 karakter.


Logikai változók BASIC-ben Programok

Az IS-BASIC-ben történtek bizonyos próbálkozások logikai változók kezelésére, a PASCAL mintájára. Tegyük fel, hogy A=4 és B=2. L változót tekintsük logikai változónak. Próbáljuk ki a következő sorokat

L=(A>B)

Az előző értékkel L=-1 vagyis IGAZ

L=(A<B)

L=0, vagyis HAMIS

Sőt, akár összevont feltételeket is vizsgálhatunk:

L=((A=B)<C)

A felhasználói kézikönyv nem tesz említést a NOT függvényről, ami nevéhez híven logikai tagadást végez.

  • A NOT(0) = -1 (IGAZ) értéket ad,
  • a NOT (-1) = 0 (HAMIS) értéket ad (-1 helyett tetszőleges nem 0 érték is használható)

A zárójel elhagyható és akár IF utasítás kiértékelésében is használható a függvény:
IF NOT A THEN ...

HEKTIK.BAS - Az akadályok között elhelyezett összes értékes karaktert kell összegyűjtenünk.

HOLD.BAS - egy égitest körül keringő holdat mozgat

TANKWARS.BAS - A klasszikus XT-s játék EP-s megvalósítása

LABDA.BAS - Pattogó labda

LABIRINT.BAS - Labirintus "generátor"

MAGICSCR.BAS - Magic Screen: látványos effektek character-defre

RASZTER.BAS - Függőleges rasztercsíkok BASIC-ben

SQUIRM.BAS - A Squirm című C16-os játék kísérőzenéje

STOCKCAR.BAS - Autóverseny BASIC módra.

TKOCKA.BAS - Térbeli kocka

ZENEGEP.BAS - ENTERPRISE Zenegép (szintetizátor program)

Vissza