IS-BASIC

Tartalom

Bevezetés
1. A BASIC nyelvi elemei

1.1 A nyelv jelkészlete
1.2. A program utasításai és sorai
1.3. Azonosítók
1.4. Számok
1.5. Szövegkonstansok
1.6. Megjegyzések
1.7. A BASIC program szerkezete

2. Adattípusok és deklarációk
2.1. Numerikus változók
2.2. Szövegfüzér változók
2.3. Tömbváltozók
2.4. Előzetes deklaráció
2.5. Értékadó utasítás
2.6. Nagy mennyiségű adat tárolása

3. Kifejezések
3.1. Egy- és kétoperandusú műveletek
3.2. A műveletek csoportosítása
3.3. Matematikai függvények
3.4. Szövegfüzérek kezelését segítő függvények

4. Vezérlési szerkezetek
4.1. Feltételes utasítások
4.1.1. IF-THEN utasításszerkezet
4.1.2. SELECT CASE-szerkezet
4.2. Ciklusutasítások
4.2.1. FOR-NEXT ciklusok
4.2.2. DO-LOOP ciklusok
4.3. Kilépés a ciklusból

5. Alapvető I/O műveletek
5.1. Írás a képernyőre - PRINT
5.2. A kiírások formázása
5.2.1. A PRINT USING és IMAGE használata
5.2.2. Szerkesztő funkciók
5.3. Beviteli utasítások
5.3.1. Az INPUT utasítás

6. Eljárások és függvények
6.1. Az eljárások
6.1.1. Az eljárás paraméterei
6.1.2. A változók érvényességi köre
6.2. A függvények
6.3. Kilépés az eljárásokból, függvényekből
6.4. Rekurzió

7. Kivételes esetek, hibák kezelése

8. I/O műveletek
8.1. Csatornák
8.2. Állománykezelés
8.2.1. File-nyitás
8.2.2. Írás file-ba
8.2.3. Olvasás file-ból
8.3. Hálózat
8.3.1. Hálózatkezelés a háttérben

9. A Minimal BASIC
9.1. A GOTO utasítás
9.2. A szubrutinok
9.3. Többirányú elágazás
9.4. Tömbök létrehozása, a DIM kifejezés

10. Videolapok kezelése
10.1. Videolapok megnyitása
10.2. EDITOR csatorna megnyitása
10.3. A videolapok megjelenítése
10.4. A videolapok törlése, lezárása
10.5. Koordináta rendszerek

11. Grafikai utasítások
11.1. Pontok, vonalak, ellipszisek
11.2. Teknőcgrafika
11.3. Színek használata
11.4. Az attribútum mód
11.5. Animáció

12. A karakterkészlet

13. Hangkeltés
13.1. A SOUND utaítás

14. BASIC programok láncolása

15. Memóriakezelés, gépi kódú rutinok

 

Bevezetés
Az ENTERPRISE ROM-ban tárolt programnyelve az IS-BASIC az Intelligent Software terméke. Korát megelőző programnyelv, képességei messze túlmutatnak a korabeli 8-bites számítógépek programozási nyelvén. Legfőbb tulajdonságai:

Az IS-BASIC lényegében egy "öszvérnyelv" a BASIC, a Pascal és Logo ötvözete. A Pascal és Turbo-Pascal programok többsége "tükörfordításban" átírható IS-BASIC-be, fordítva ez - a BASIC nyelv sajátosságaiból eredő okokból - nem igaz. Ezért az IS-BASIC - figyelembe véve a BASIC nyelv gazdag hibakeresési lehetőségeit - különösen alkalmas algoritmusok, eljárások tesztelésére, "belövésére" mielőtt azokat Pascal-ban "élesben" használnánk.
A géphez adott magyar nyelvű Felhasználói kézikönyv a korabeli gépkönyvek között jó minőségűnek számított, de még így is kimaradt belőle az IS-BASIC számos lehetősége. Ezen ismertetőben igyekszünk összefoglalni az IS-BASIC azon lehetőségeit, melyeket a Felhasználói Kézikönyv csak részben, vagy egyáltalán nem említ. Ismertetőnk tehát inkább kiegészítés, nem, helyettesíti a Felhasználói Kézikönyvet!

1. A BASIC nyelvi elemei

1.1 A nyelv jelkészlete
Az IS-BASIC az ASCII karakterkészletből az alábbi szimbólumokat használja:

Német billentyűzeten a font jel (£) helyett a kettőskereszt (#) használandó ugyanazzal a jelentéssel.
A kis- és nagybetűket az interpreter azonosaknak tekinti, kivéve a programozó által szöveghűen előírt adatok, azaz a karakterek és az úgynevezett karakterláncok esetében (szövegkonstansokban és szöveges kifejezésekben).

1.2. A program utasításai és sorai
A BASIC program utasítások sorozatából áll. Az utasításokat a program sorai tartalmazzák.

Egy programsorban több utasítást is írhatunk, kivéve a blokkszervező utasításokat (FOR - NEXT, DO - LOOP, DEF - END DEF, WHEN - END WHEN, HANDLER - END HANDLER), és a NUMERIC, STRING, CONTINUE, IMAGE, ON GOTO, ON GOSUB, REM, END utasításokat, melyek minden esetben külön sorban írandók. Ha egy sorban több utasítást írunk, az egyes utasításokat kettősponttal (:) kell elválasztani.
A program sorait sorszámmal kell ellátni. A sorszám 1-9999 közötti érék lehet. A program futása során a számítógép a legkisebb sorszámú sornál kezdi a végrehajtást - függetlenül a sorok bevitelének sorrendjétől - és végighalad a legnagyobbig, feltéve, hogy bizonyos utasításokkal nem módosítjuk ezt a sorrendet. Egy BASIC sor maximális hossza - a sorszámot bele nem számítva - kb. 242 karakter, ez a képernyőn természetesen több sorban jelenik meg. A már tokenizált sor hossza 254 bájt lehet, ebből 1 byte a hossz, 2 byte a sorszám, 1 byte a bekezdési szint, így marad 250 az utasításokra. Ha ennél hosszabb sor bevitelével próbálkozunk, de a programsor az ebbe a korlátozásba beleférő karakterek alapján esetleg szintaktikailag helyes, a további karakterek hibaüzenet nélkül elvesznek.

Az utasítások a BASIC nyelvben "mondattanilag" két részből állnak: a kulcsszóból, amely a mondat állítmányának felel meg, és az utasítás tárgyából, amely azt mutatja, hogy melyik adaton kell elvégezni a kulcsszóval meghatározott műveletet. Fontos szintaktikai szabály, hogy a kulcsszó és az utasítás tárgya között legalább egy szóközt kell hagyni. Ha több szóközt írunk a két rész közé, az interpreter akkor is csak egyet helyez el a két elem között. Az kulcsszó karakterei között viszont nem szerepelhet a szóköz elválasztó karakter. Van olyan kulcsszó, amelyhez nem tartozik utasítástárgy (pl. PING), és van olyan kulcsszó, melynek tárgya elhagyható (NEXT).
Az utasítás tárgyában valamilyen konstans (szöveges vagy szám), kifejezés és az ezeket elválasztó operátorok szerepelhetnek az adott kulcsszó szintaktikai szabályai szerint. A kifejezésekben szerepelhetnek szintén a BASIC nyelv részét képező függvények.
A kifejezésekben szereplő változókat, konstansokat (számokat, sztringeket, stb.) és függvényhívásokat operandusoknak nevezzük.
A kifejezésekben szereplő változókat, konstansokat és függvényhívásokat összekapcsoló műveleti jeleket operátoroknak nevezzük.

1.3. Azonosítók
A programban az általunk létrehozott elemeknek (változóknak, eljárásoknak, függvényeknek, hibakezelő blokkoknak) nevet kell adni, hogy hivatkozni tudjunk rájuk. Természetesen a névnek egyedinek kell lennie, például nem adhatjuk ugyanazt a nevet két változónak vagy egy változónak és egy függvénynek (viszont az előre definiált függvények és konstansok jelentése eltakarható azonos nevű eljárással, változóval). Az IS-BASIC maximum 31 karakteres azonosítók használatát engedi, mind a 31 karakter szignifikáns. A 31 karakterbe beszámítandó a szövegfüzér típusú azonosítók jelölésére szolgáló $ karakter, mely az azonosító utolsó karaktere. (Ez jóval több, mint az azonosítók javasolt maximális hossza.) Az azonosító tartalmazhat betűket, számjegyeket, pontot és aláhúzásjelet, az első karakterüknek azonban betűnek kell lenni.
A BASIC lehetővé teszi, hogy a kulcsszavakkal és az előre definiált függvények neveivel azonos azonosítóneveket definiáljunk. Mivel az interpreter a sor értelmezése közben tudja, hogy mikor vár kulcsszót és mikor következik az utasítás tárgya, ez általában nem okoz gondot. Természetesen, ha egy függvény eredeti jelentését "eltakarjuk" egy általunk definiált azonosítóval, a függvény nem lesz többé elérhető a programfutás során. Mindazonáltal ezt a lehetőséget nem javasolt kihasználni, mert a programunk esetleg nem azt fogja csinálni, amit várunk...

1.4. Számok
Az IS-BASIC-ben egész és valós számokat egyaránt használhatunk. A programban elhelyezett számértékeket számkonstansnak nevezzük.

Az egész szám a matematikában megszokott pozitív és negatív egész számok egy véges tartományát és a nullát jelenti. Az egész számok írásmódjának formai szabályai: Az egész típusú szám decimális számjegyek sorozata, amelyet előjel előzhet meg. A pozitív előjel elhagyható.
Egész szám bináris számrendszerben is megadható 0-1023 értéktartományon belül a BIN függvény segítségével (a függvény max. 12 karaktert fogad el, de kiértékelni csak tízet képes). Hiányzik viszont a BIN függvén ellentétje. Pozitív egész szám binárissá alakítására (szövegfüzérbe, vezető nullák nélkül) ajánlható a következő függvény:

100 DEF BIN$(N)
110   LET N=ABS(INT(N)):LET B$=""
120   DO
140     LET B$=STR$(MOD(N,2))&B$:LET N=INT(N/2)
150   LOOP WHILE N>0
160   LET BIN$=B$
170 END DEF

A HEX$ függvény elsődleges funkciója a gépi kódú program byte sorozatának bevitele. Ezért csak 0-FFh (decimálisan 0-255) tartományban megadott számok átváltására alkalmas ORD(HEX$(H$)) alakban.
Valós számokat tizedes törtként (például 123.45) és hatványkitevős alakban (1.2345E2) egyaránt megadhatunk. (A számok megadásakor nem tizedesveszőt, hanem tizedespontot használunk.) A hatványkitevős konstansok az alábbi elemekből épülnek fel:

Ha elhagyjuk az előjelet, akkor a szám pozitív lesz. Az egészrész vagy a törtész elhagyható.
A megadásban a hatvány jel (az E betű) 10 hatványát jelöli (a kitevőben a pozitív előjelet nem kötelező használni). Az alábbi példákban a különböző számmegadási módokat mutatjuk be:

-12.56E-5 = -0.0001256 = -1.25600E-04
2.3E+3 = 2300 = 2.3E3 = 2.30000E+03

A legnagyobb ábrázolható számot megadja az INF függvény: 9.999999999E62. A legkisebb, még ábrázolható pozitív szám az 1E-64.

1.5. Szövegkonstansok
A szövegkonstanst (string-konstanst) idézőjelek (") között kell megadni. Ha szövegen belül időzőjel szerepel, akkor azt duplázni kell pl: "Enterprise: ""szinkronban az idovel""". Ha a sztring semmit sem tartalmaz az idézőjelek között (""), akkor üres sztringről beszélünk. A sztring hossza az aposztrófok között megadott karakterek számának felel meg. A szövegkonstans tartalmazhat grafikus karaktereket és nem megjeleníthető karaktereket is, ha a CHR$(x) függvénnyel hozzáfűzzük, amely az x ASCII kódú karaktert adja.
A stringek aktuális karakterei ASCII-ben tárolódnak úgy, mint az eredeti forrásszövegben, de megelőzi őket a string hosszbyte-ja.

1.6. Megjegyzések
A program tetszőleges sorában magyarázatot helyezhetünk el. Ezeket a magyarázatokat az interpreter nem értelmezi, a programvégrehajtást nem befolyásolja, csak a programozónak szólnak. Megjegyzéseket az alábbi két módszer közül választva adhatunk meg:

Példa a két megoldásra:

100 REM *** Nehezsegi gyorsulas ***
110 LET G=9.80665

100 LET G=9.80665 !*** Nehezsegi gyorsulas ***

Mind a REM mind a felkiáltójel hatására a program interpretálása a következő sortól folytatódik.

1.7. A BASIC program szerkezete
A BASIC programok szerkezetére nincsenek kötelező formai megkötések.
A program fejlécének tekinthető a legelső sorban elhelyezett PROGRAM utasítás, melynek alakja:

PROGRAM "programnév" (változólista)

Az utasítás megadja a program nevét, melyre a CHAIN utasításban (ld. később) hivatkozhatunk, és SAVE parancs is használja ezt a nevet, ha a SAVE után nem adunk meg file-nevet. A program nevére a file-nevekre vonatkozó megkötések érvényesek, maximum 28 karakterből állhat, de lemezes rendszerben az EXDOS lerövidíti 8 karakterre, +3 karakteres kiterjesztést tartalmazhat a file-név. A változólista lehetőséget ad arra, hogy a START paranccsal, vagy a CHAIN utasítással paramétereket adjunk át a programnak. A paraméterlista elhagyható. Ha a fejlécben szerepelnek paraméterek, de a program indításakor / hívásakor nem adjuk meg ezeket, a szám típusú paraméterek 0, a szövegfüzér típusú paraméterek "" (üres string) kezdőértéket kapják.
A PROGRAM utasítást azért is célszerű használni, mert az INFO parancs - többek között - valamennyi, a tárban lévő program első sorát is megadja, ezzel könnyen azonosíthatjuk a tárban lévő programokat.
Ha a PROGRAM utasítás nem a program első sorában áll, a rendszer nem jelez ugyan hibát, de ebben az esetben az utasítás hatástalan!

Az END utasítás a program logikai végét jelzi. Hatására a program futtatása befejeződik, az esetleges további programsorok nem kerülnek végrehajtásra. Ha a programnak - logikai felépítéséből adódóan - több kilépési pontja is van, több END utasítás is lehet egy programban, a program bármely pontján. Ha a program utolsó sora egyben annak kilépési pontja, vagy a kilépési pont után csak eljárás-, függvénydefiníciók, hibakezelő blokkok, DATA sorok állnak, az END utasítás elhagyható.
Hasonló a STOP utasítás, mely megszakítja a program futását. A BASIC rendszer ilyenkor kiírja, melyik sorban történt a program megállítása. Lényeges különbség az END-hez képest, hogy a STOP-pal megállított program a CONTINUE paranccsal folytatható. STOP utasításokat jellemzően a program tesztelésekor használunk, annak adott pontján való megállítására, a változók értékének vizsgálatára.

A program szerkezetére vonatkozó általános ajánlás:

  1. prografejléc,
  2. a globális változók deklarációja,
  3. a fő- (vezérlő-) program,
  4. az END utasítás, amely jelzi a számítógépnek, hogy a program futása befejeződik,
  5. függvények és eljárások,
  6. a DATA adathalmazok.

2. Adattípusok és deklarációk
Számítógépes programok többsége a futása során megadott adatokat valamilyen módon feldolgozza és megjeleníti az eredményeket. A programban az adatokat változókban tároljuk. Az adattípus határozza meg, hogy egy változó milyen értéket vehet fel és milyen műveletek végezhetők rajta. A változók számára az interpreter az adott típus tárolásához szükséges bájtot foglal le a memóriában. Ez a tárterület tartalmazza a változó aktuális értékét, ami a program futása során meg is változhat. Ha megvizsgáljuk egy változó tartalmát, akkor pillanatnyi (aktuális) értékről beszélünk. A programban a változókra névvel hivatkozunk, ezért minden változót azonosítóval kell ellátni. Az ún. változóazonosítók kialakítására az azonosítókra vonatkozó szabályok érvényesek.
A BASIC nyelv mindössze kétféle elemi adattípust ismer: szám és szövegfüzér. Az elemi adattípusok közös jellemzője, hogy az ilyen típusú változók egyszerre csak egyetlen adatot (egy számot, vagy szövegfüzért) tárolnak. A változó nevének és típusának összerendelését a változó deklarációjának (leírásának) nevezzük. Az IS-BASIC nyelvben a legtöbb esetben nem szükséges a változókat első használatuk előtt deklarálni, amikor egy változónév először szerepel egy értékadó utasítás (LET) bal oldalán vagy értéket kap INPUT utasítással, ez automatikusan megtörténik.

2.1. Numerikus változók
Az IS-BASIC-ben nincs külön típus az egész és lebegőpontos számok tárolására: A szimbólumtáblában a számok 6 byte-os BCD alakban tárolódnak, ezért tud az IS-BASIC pontosabban számolni, mint a korabeli 8-bites számítógépek (pl. bináris lebegőpontos formátumban a 0.1 nem ábrázolható pontosan). A legalsó memóriacímnél lévő számpár a legkisebb helyiértékű számjegy. A szám fölső byte-ja tartalmazza a bináris kitevőt és előjelet, s a fölső byte alatt egy byte-tal helyezkedik el a legnagyobb helyiértékű számpár. Viszont a 0 és 9999 közti egész számok a gyorsaság miatt nem lebegőpontos alakban tárolódnak, hanem a normál Z80 formátumban, 16 bites bináris számként (a programsorszámok is így tárolódnak). Ezért pl. az alábbi program gyorsabban fut le, ha a SZAM kezdőértéke 0, mintha 10000 lenne:

100 LET SZAM=0
110 FOR I=1 TO 9999
120   LET SZAM=SZAM+1
130 NEXT

A BASIC-ben nincs külön logikai típusú változó. A BASIC konvencióknak megfelelően a 0 érték a logikai hamis, minden más érték logikai igaz értéket jelenti. Az IS-BASIC-ben a logikai műveletek -1 (igaz) vagy 0 (hamis) értéket szolgáltatnak.

2.2. Szövegfüzér változók
Szöveges adatok tárolására a szövegfüzér típusú változó szolgál. Egy szövegfüzér típusú változó deklarációtól függően 1-254 karakter tárolására tehető alkalmassá. Előzetes deklaráció hiányában az IS-BASIC - helytakarékosság végett - 132 karakter tárolására alkalmas szöveges változókat hoz létre (ennék hosszabb szövegfüzér tárolására csak ritkán van szükség). A szöveges változó tárolása hossz+2 byte-on történik: az adatmező első bájtja a lefoglalt bájtok számát adja, a 2. bájt a ténylegesen tárolt karakterek száma. Ezt a karakterek ASCII kódja követi. A lefoglalt terület hátralévő része definiálatlan.
A szövegfüzér típusú változó azonosítójának utolsó karaktere $ karakter kell hogy legyen, tehát egy változó azonosítójából egyértelműen kiderül annak típusa is.
Egy szöveges változóban tárolható karakterek maximális számát a MAXLEN(a$) függvénnyel kérdezhetjük le.

2.3. Tömbváltozók
Amikor több, valamilyen szempontból összetartozó adatot kell tárolni / feldolgozni, tömbváltozót használunk. A tömb adott számú, azonos típusú elemet tartalmazó adattípus, lehet szám vagy szöveges típusú is. A BASIC nyelv egy vagy kétdimenziós tömböket kezel. Az egydimenziós tömböt vektornak, míg a kétdimenziós tömböt mátrixnak is szokás nevezni. A tömbelemek száma a tömb definíciója által rögzített, azaz a program végrehajtása során nem változik (és így a tömb által lefoglalt memória mérete sem).
A már deklarált tömb elemére a tömb és az index megadásával hivatkozhatunk: NÉV(index), kétdimenziós tömb esetén mindkét index megadása kötelező: NÉV(index1,index2). 2001-es típusú hibát eredményez, ha a tömb alsó indexhatára alá, vagy a felső indexhatára fölé hivatkozunk.

Egy tömb alsó indexhatárának lekérdezésére szolgál az LBOUND(a) függvény, a felső indexhatárt az UBOUND(a) függvény adja meg. Egy tömb elemeinek számát a SIZE(a) függvény adja meg. Mindhárom függvény használható kétdimenziós tömbökre is (LBOUND(a,b), UBOUND(a,b),SIZE(a,b))

SIZE(a)=UBOUND(a)-LBOUND(a)+1

2.4. Előzetes deklaráció
Bár a BASIC-ben feleslegesnek tűnhet a változók előzetes deklarációja, hisz a program bármely pontján a LET, INPUT vagy READ utasítást (ld. később) használva ez automatikusan is megtörténik mégis javasolt a program elején deklarálni a használandó változókat a program olvashatósága miatt is. Három esetben azonban szükségszerű a deklaráció:

Szám típusú - akár globális, akár lokális - változók deklarálására a NUMERIC kulcsszó használatos. Alakja:

NUMERIC változó-lista

A változó-lista egy vagy több azonosító felsorolásából áll. Tömbváltozó esetén az azonosító után az zárójelben az alsó és felső indexhatárt is meg kell adnunk, TO szóval elválasztva: NÉV(alsó TO felső), kétdimenziós tömb esetén: NÉV(alsó TO felső,alsó TO felső). Egy tömb elemeinek a sorszáma tetszőleges tartományba eshet, így akár negatív is lehet.
Pl:

NUMERIC X1,Y1,X2,Y2,VEKTOR(1 TO 10)
NUMERIC TOMB(1 TO 10, 1 TO 10)

Az első példában deklaráljuk az X1, Y1, X2, Y2 változókat és a 10 elemű VEKTOR nevű vektort. A második példában deklaráljuk a TOMB nevű, 10x10-es mátrixot.

Szövegfüzér típusú változók deklarálására a STRING kulcsszó használandó. Itt azonban - a numerikus tömbökkel ellentétben - az egyes elemek hossza is megadható: NÉV(also TO felső)*hossz. Ha a hossz megadása elmarad, 132 karakter tárolására alkalmas változó jön létre. Pl:

STRING CIM$,UZENET$*254,NEV$(1 TO 100)*16
STRING ORAREND$(1 TO 5,1 TO 8)*15

Az első példában deklaráltuk a 132 karakter tárolására alkalmas CIM$ nevű, a 254 karakter tárolására alkalmas UZENET$ nevű változót és a 100 név tárolására alkalmas vektort, melyben az egyes elemek maximális hossza 16 karakter. A második példában létrehozzuk az ORAREND$ nevű 5x8-as tömböt, melyben az elemek maximális hossza 15 karakter.

Fontos tudni, hogy a deklarált változóknak sincs kezdőértéke, így annak első használata előtt az értékadást el kell végezni. A programban bárhol lehet új változókat bevezetni. Ha kezdőértékkel nem rendelkező változót használunk kifejezésben, az 20040-es hibát eredményez.

2.5. Értékadó utasítás
Az értékadó utasítással egy, vagy több változónak adunk értéket, amely lehet egy másik változó értéke, vagy valamilyen művelet eredménye. BASIC-ben a LET kulcsszó az értékadó utasítás:

LET változólista=kifejezés

Ha a változó neve nem kulcsszó, akkor a LET elhagyható, de a program kilistázásakor a BASIC rendszer automatikusan kiírja. Parancsmódban is használható. Ha egyszerre több változónak kívánjuk ugyanazt az értéket adni, a változókat vesszővel elválasztva kell felsorolni a változólistában. Ilyenkor az értékadó utasításban jobb oldalán szereplő kifejezés csak egyszer értékelődik ki. Pl.:

LET A=0
LET NEV$="Enterprise"
LET B,C,TOMB(1)=A

2.6. Nagy mennyiségű adat tárolása
Gyakran szükséges, hogy a feldolgozást több különböző bemeneti adattal elvégezzük, vagy egy nagyobb tömböt feltöltsünk a szükséges kezdeti értékekkel. Erre szolgál a READ és a DATA utasításpár. Az adatokat a DATA utasítás tárgyában soroljuk fel, és a felsorolás sorrendjében a READ utasítással olvashatók ki. A READ utasítás alakja:

READ változólista

A READ utasítás a kiolvasott adatok értékét a READ utasítás tárgyában felsorolt változókhoz rendeli. A BASIC rendszer minden egyes DATA adatelemet csak egyszer olvas be. Hibát okoz, ha elfogytak a DATA sorban tárolt adatelemek, és újabb READ utasítást akarunk végrehajtani.
A READ utasítást felkészíthetjük az adatok elfogyására - elkerülendő a program hibaüzenettel történő leállását:

READ IF MISSING sorszám:változólista
READ IF MISSING EXIT DO:változólista

Ebben az esetben, ha az adatok elfogyása után újabb olvasási kísérletet hajtunk végre, akkor az IF MISSING után meghatározott tevékenységet hajtja végre a gép. Ha egy sorszám áll az IF MISSING után, a programvégrehajtás a megadott számú programsoron folytatódik, az EXIT DO kilép a DO-LOOP ciklusból (ld. 4.2.2. alfejezet). A READ utasítást jellemzően ciklusokban használjuk, ezért ez egy nagyon kényelmes módja a program egyszerűsítésének.
A DATA utasítás alakja:

DATA adatlista

Az adatlista elemei is veszővel kell elválasztani, tartamlmazhet tetszőleges sorrendben számkonstansokat és szövegkonstansokat is, de kifejezést nem. A szövegfüzéreket csak akkor kell idézőjelbe tenni, ha vesszőt vagy felkiáltójelet is tartalmaznak. A Microsoft-BASIC-hez hasonlóan a numerikus adatokat tartalmazó adatlistában a 0 értékeket nem kell kiírni, kivéve az adatlista utolsó elemét! Tehát helyes a

DATA 0,1,2,0,0,0,3,4,5,0

és a

DATA ,1,2,,,,3,4,5,0

de helytelen a

DATA ,1,2,,,,3,4,5,

A DATA sorokban tárolt adatlista beolvasási sorrendjét változtathatjuk meg a RESTORE utasítással. Ennek lehetséges alakjai:

RESTORE
RESTORE sorszám

Az utasítás a következő READ utasítás által olvasandó DATA adatsor sorszámát adja meg. Ha a paraméter hiányzik, akkor a program első DATA utasítására vonatkozik.

3. Kifejezések
A kifejezés egy értéket ad meg, ennek kiszámítási módja a kifejezésben használt mennyiségektől és műveletektől függ. A kifejezés operátorok és operandusok sorozatából épül fel. Operátoroknak nevezzük a különféle műveleti jeleket, amelyek összekapcsolják a kifejezésben szereplő operandusokat (változókat, konstansokat és függvényhívásokat). Az operátorok által előírt műveletek a program futása során (futási időben) kerülnek végrehajtásra. Egy kifejezés kiértékelése (kiszámítása) a benne szereplő összes művelet elvégzését jelenti.
A kifejezéseket két alapvető csoportját az aritmetikai és a logikai kifejezések alkotják. Az aritmetikai kifejezés kiértékelésének eredménye mindig egy számérték, míg a logikai kifejezés értéke egy logikai érték, ami igaz = -1 vagy hamis = 0.

3.1. Egy- és kétoperandusú műveletek
A műveleteket csoportosíthatjuk az operandusok száma szerint. Ez alapján a BASIC-ben minden művelet egy- vagy kétoperandusú. Azt a műveleti jelet, amely az egyetlen operandusa előtt szerepel, ún. egyoperandusú operátornak nevezzük. Ilyen művelet például az előjelváltás:

LET A=-A

Amennyiben az operandusok közrefogják a műveleti jelet, úgy ún. kétoperandusú műveletről (és operátorról) beszélünk. Kétoperandusú műveletek például, az összeadás és a szorzás:

LET C=A+B
LET Y=X*2

3.2. A műveletek csoportosítása
A műveleteket az alábbi csoportokba sorolhatjuk:

aritmetikai műveletek:

  Művelet precedencia
- előjelváltás 1
^ hatványozás 2
* szorzás 3
/ osztás 3
+ összeadás 4
- kivonás 4

összehasonlító műveletek (relációk):

= egyenlő 5
< kisebb 5
> nagyobb 5
<= kisebb vagy egyenlő 5
>= nagyobb vagy egyenlő 5
<> nem egyenlő 5

logikai műveletek:

NOT logikai tagadás (NEM) 6
AND logikai ÉS 7
OR logikai VAGY 8
BAND bináris ÉS 9
BOR bináris VAGY 10

A XOR művelet nincs implementálva, de a XOR és minden további logikai művelet a megvalósított alapműveletekkel elkészíthető.
A XOR mevalósítása:

(A BOR B)-(A BAND B)

Az implikáció megvalósítása:

(-1)*(NOT(A)) BOR B

Szövegfüzérekre vonatkozó műveleti jel:

& konkatenáció (összekapcsolás)

A szövegfüzéreken értelmezhető másik művelet a részstring képzés. Egy adott szövegfüzér (string) részstringjének nevezzük azt a karaktersorozatot, amely az eredeti string egy vagy több, egymást az eredeti sorrendben követő karakteréből áll. Ez a művelet tetszőleges string-kifejezésen elvégezhető. A művelet alakja a következő:

string-kifejezés(kezdet:vég)

Például:

"abcdef"(2:5)="bcde"

Ha a "kezdet" megadását elhagyjuk, a számítógép ennek értékét 1-nek (a szövegfüzér első karakterét) veszi; ha a "vég" értékét nem adjuk meg, akkor ez az érték a szövegfüzér utolsó karaktere lesz. Tehát:

"abcdef"(:5) = "abcdef"(1:5) = "abcde"
"abcdef"(2:) = "abcdef"(2:6) = "bcdef"
"abcdef"(:) = "abcdef"(1:6) = "abcdef"

Minden további szövegfözéreken értelmezhető művelet függvényként van definiálva.

A kifejezések kiértékelésénél a következő három elsőbbségi szabályt veszi figyelembe az interpreter:

  1. Két különböző precedenciájú operátor esetén először a magasabb precedenciájú operátor által előírt művelet kerül végrehajtásra.
  2. Az azonos precedenciájú operátorok a felírásuk sorrendjében (balról jobbra haladva) értékelődnek ki.
  3. A zárójelezés megváltoztatja a műveletek kiértékelési sorrendjét. Először mindig a zárójelben megadott műveletek hajtódnak végre. A zárójelek egymásba ágyazhatók.

Megjegyzések:

CODE DIV2=HEX$("CB,3C,CB,1D,C9")

A rutin meghívása pl. SZAM=USR(DIV2,I) utasítással lehetséges, amely egyenértékű a SZAM=IP(I/2) utasítással. Megjegyzendő, az IS-BASIC-ben csak akkor tapasztalhatunk mérhető gyorsulást, ha 9999-nél nagyobb, vagy nem egész számokra alkalmazzuk az eljárást.

3.3. Matematikai függvények
A matematikai kifejezésekben az ismertetett aritmetikai operátorokon túlmenően matematikai függvények is szerepelhetnek. Programunkban számos előre definiált függvényt használhatunk.
A trigonometrikus függvényeket az OPTION ANGLE feltétellel beállított szög mértékegységben számolja a BASIC-rendszer:

OPTION ANGLE DEGREES - szögekben számol,
OPTION ANGLE RADIANS - radiánban számol.

A 201h (513 decimális) címen lévő rendszerváltozó byte-nak a 0. bitje 1 értékű, ha az OPTION ANGLE DEGREES az aktív beállítás, azaz a szögeket fokokban számolja a BASIC. Az alapértelmezés szerint használt mértékegység a radián.

Matematikai függvények:

ABS(x) Az x abszolút értéke, a függvény egyszerűen csak az előjelet törli.
ACOS(x) A koszinuszfüggvény ellentettje, azaz azt a szöget adja meg, amelynek a koszinusza x.
ACOS(COS(X))=X.
ANGLE(x,y) A pozitív x tengely és a (0,0) pontból induló, (x,y) ponton átmenő egyenes szöge. x és y negatív is lehet.
ASIN(x) A szinuszfüggvény ellentettje.
ASIN(x)=ATN(x/SQR(-x*x+1))
ATN(x) A tangensfüggvény ellentettje.
CEIL(x) Az x-nél nem kisebb, legkisebb egész szám, azaz a legközelebbi egészre felkerekített érték.
PI. CEIL(3.45)=4, CEIL(-3.45)=-3.
COS(x) A koszinuszfüggvény.
COS(x)=SIN(PI/2-x)
COSH(x) A koszinusz hiperbolikusz függvény.
COSH(x)=(EXP(x)+EXP(-x))/2
COT(x) A kotangensfüggvény.
COT(x)=1/TAN(x)
CSC(x) A koszekánsfüggvény.
CSC(x)=1/SIN(x)
DEG(x) Az x radián szög értéke fokban, azaz x*180/PI.
EPS(x) A legkisebb mennyiség, amit x-hez adva vagy belőle levonva az x tárolt értéke megváltozik.
EXP(x) Az "e" az x-edik hatványon függvény. Az "e" (=2.71828...) a természetes logaritmus bázisa.
FP(x) Törtrész függvény, az IP ellentéte.
FP(1.23)=0.23, FP(-1.23)=-0.23.
INT(x) A legnagyobb, x-nél nem nagyobb egész szám.
INT(3.4)=3, INT(-3.4)=-4.
IP(x) Egész rész, azaz a tizedespont utáni részt törli.
IP(9.9)=9, IP(-9.9)=-9.
LOG(x) Természetes, azaz "e" alapú logaritmus.
LOG10(x) Tízes alapú logaritmus.
LOG2(x) Kettes alapú logaritmus.
MAX(x,y) A két szám közül a nagyobbik, pl. MAX(6,99)=99.
MIN(x,y) A két szám közül a kisebbik.
PI A Pi nevű szám, a gép kerekítve 3.141592654-gyel számol.
RAD(x) Az x fok értéke radiánban, azaz x*PI/180.
RND Egy 0 és 1 közötti véletlenszámot állít elő, de az 1-et nem éri el soha. Az értéktartományt szorzással tudjuk növelni, pl. az INT(RND*100) egy 0 és 99 közti egész számot ad.
RND(x) Egy 0 és x közötti egész véletlenszámot ad, "n" maximuma 32767.
ROUND(x,n) Az x számot kerekíti n jegyre, pl. ROUND(1.7668,2)=1.77,de ROUND(-1.7668,2)=-1.76.
ROUND(x,0)=INT(x+0.5)
SEC(x) A szekánsfüggvény.
SEC(x)=1/COS(x)
SGN(x) Az x előjelétől függően, ha x negatív, akkor -1, ha x pozitív, akkor + 1, ha pedig x nulla, akkor a függvény értéke is az.
SIN(x) A szinuszfüggvény.
SIN(x)=COS(PI/2-x)
SINH(x) A szinusz hiperbolikusz függvény.
SINH(x)=(EXP(x)-EXP(-x))/2
SQR(x) Az x négyzetgyöke.
SQR(x)=x^0.5
TAN(x) A tangensfüggvény.
TAN(x)=1/COT(x)
TANH(x) A tangens hiperbolikusz függvény.
TANH(x)=SINH(x)/COSH(x)

A szinusz szögfüggvényt (a szög megfelelő tartományba való konvertálása után) a

hatványsorral közelíti a rendszer. A koszinusz szögfüggvényt a

cos(x) = sin(x+PI/2)

összefüggés alapján kerül meghatározásra.
A koszekáns függvény értelmezését 1/sin(x), míg a szekáns függvényt az 1/cos(x)-et határozza meg. A tangens függvény a sin(x)/cos(x)-re vezethető vissza. A cos(x) pedig mint láttuk kifejezhető sin(x) ismeretében.
Mint láthatjuk minden szögfüggvény a szinusz szögfüggvényen keresztül határozható meg. Ennek a rutinnak viszont van egy korlátja. A teljes körülfordulásnál nagyobb szögeket a szögfüggvény számítás szempontjából X=MOD(szög,2*PI)-vel kell figyelembe venni. A szinusz rutin a szöget csak

-57,2958 < x < 57,2957 radián között

azaz

-3282,8 < x < 3282,8 fok közötti

tartományban képes feldolgozni. Ha várhatóan e határon kívül lévő értékek szögfüggvényeit kell meghatároznunk, akkor a maradék részt mi magunknak kell előállítani a függvény argumentumában: SIN(MOD(SZOG,360))

3.4. Szövegfüzérek kezelését segítő függvények

CHR$(x) Az x ASCII kódú karakter.
INKEY$
A billentyűzetpufferben lévő karaktert adja vissza, ill. ha nincs egyetlen karakter sem a pufferben, akkor egy üres karaktersorozatot ("") ad. A karaktert törli a pufferből.
LCASE$(a$) A nagybetűket kisbetűvé alakítja.
LEN(a$) A a$-ban levő karakterek számát adja.
LTRIM$(a$) Törli a karaktersorozat elején álló szóközöket.
ORD(a$) Az a$ karakter vagy karaktersorozat esetén az első karakter ASCII kódja.
POS(x$,y$) Az y$ szövegrészlet első előfordulásának a helyét adja meg az x$ szövegben. Ha y$ nincs benne az x$-ban, akkor az értéke nulla.
POS(x$,y$,n)
Hasonló az előzőhöz, de a keresést az x$ szöveg n-edik karakterénél kezdi. Tehát POS("LONDON","ON") = 2, de POS("LONDON","ON",4) =5, mert a második esetben a keresést a "D" betűnél kezdte.
RTRIM$(a$) A karaktersorozat végén levő szóközöket levágja.
STR$(x) Az x számot karaktersorozattá alakítja, és ha szükséges a "-' előjelet is elé teszi.
UCASE$(a$) A kisbetűket alakítja át nagybelükké a karaktersorozatban.
VAL(a$) Egy karaktersorozatot alakít át számmá. A STR$ függvény ellentettje. A átalakítást a karaktersorozat első nem szám karakteréig végzi.

Az - igen sokkoldalúan használható - INKEY$ függvény lehetővé teszi, hogy a program futása közben úgy ellenőrizzük, hogy van-e lenyomott billentyű, hogy közben a program látszólag egy pillanatra sem áll meg. Általában menük kezelésénél használatos, ahol a megfelelő billentyű lenyomásától függ, hogyan folytatódik a program végrehajtása. Az alábbi példa addig várakozik, amíg az 1-5 billentyűk valamelyikét meg nem nyomjuk, ilyenkor a KEY$ változóban visszaadja a lenyomott karaktert.

500 DO
510   LET KEY$=INKEY$
520 LOOP WHILE KEY$<"1" OR KEY$>"5"

Valójában az INKEY$ a billentyűzetpuffer tartalmát figyeli, így ha egy hosszabb programvégrehajtás közben egy karakter került a pufferbe (mert a felhasználó véletlenül lenyomott egy billentyűt), akkor legutoljára leütött billentyű karakterét adja vissza, akkor is, ha már az nincs is lenyomva. Ez esetleg zavaró lehet, tehát a billentyűzetfigyelő programrész előtt érdemes kiüríteni a billentyűzetpuffert:

490 LET KEY$=INKEY$

4. Vezérlési szerkezetek
A BASIC nyelven írt program végrehajtható (futtatható) része elvégzendő tevékenységek (utasítások) sorozatából áll. A BASIC programban az egyszerű utasítássorozaton (szekvencián) túlmenően bonyolultabb programstruktúrák megvalósítására is van lehetőség. Ezen megoldások két fő csoportba, a kiválasztás (szelekció) és az ismétlés (iteráció) csoportokba sorolhatók. Az első csoportot a nyelv feltételes utasításai, míg a másodikat a ciklusutasításai képviselik.

4.1. Feltételes utasítások
Az egyszerűbb programok felépítése olyan, hogy a sikeres működéshez elegendő a program sorait egymás után végrehajtani. Ha azonban a programunkat "érzékennyé" szeretnénk tenni a futás közben bekövetkező eseményekre (mint például egy kifejezés kiértékelésének eredménye vagy hibás bemeneti adat), akkor szükségessé válik ezen esetek létrejöttének vizsgálata. Attól függően, hogy milyen esemény keletkezik, a programunk más és más úton halad tovább - "elágazik".
Az IS-BASIC-ben a program futásának elágaztatására feltételes utasításokat (IF és CASE) használunk. Ezen utasítások segítségével a vizsgált feltétel eredményétől függően a program egyik vagy másik része kerül végrehajtásra.

4.1.1. IF-THEN utasításszerkezet
Az IF-THEN szerkezet legegyszerűbb alakjában egyetlen utasítássor végrehajtását vagy végre nem hajtását vezérli. Alakja ebben az esetben:

IF logikai-kifejezés THEN utasítás1: utasítás2, ...

Az utasítás végrehajtása során az interpreter először kiértékeli az IF kulcsszó után álló logikai kifejezést. Ha a kifejezés értéke igaz, akkor végrehajtja a THEN után álló utasítást / utasításokat, ellenkező esetben nem. Az IF utasítás végrehajtása ezzel mindkét esetben befejeződik. A THEN után tetszőleges számú utasítás állhat, de nem állhat CONTINUE, DATA, DEF, END, DIM, NUMERIC, STRING újabb IF és bármely blokkszervező-utasítás. A BASIC sor maximális hosszára vonatkozó megkötést azonban ebben az esetben is figyelembe kell venni.
Sok BASIC változatban az IF után csak egyetlen utasítás állhat. Az ilyen BASIC implementációkban gyakori az

IF logikai-kifejezés THEN GOTO sorszám

megoldás, mely a feltétel teljesülése esetén a megadott programsoron folytatja a program végrehajtását. (A GOTO feltétel nélküli vezérlésátadást eredményez, mely csak IF-THEN-szerkezetben alkalmazva tehető feltételessé.) Ilyen esetben a tömörség érdekében a GOTO kulcsszó el is hagyható:

IF logikai-kifejezés THEN sorszám

Az IS-BASIC-ben nem kényszerülünk a THEN kulcsszó után felsorolni a feltétel teljesüléséhez tartozó utasításokat és ELSE ágat is használhatunk az IF utasításcsoport összetett alakjának használatával:

IF logikai-kifejezés THEN
   utasítások
   ...
ELSE
   utasítások
   ...
END IF

Ebben az esetben, ha a logikai-kifejezés teljesül, a THEN után álló programsorok kerülnek végrehajtásra, ha a feltétel nem teljesül, az ELSE kulcsszó után álló utasítások. A THEN és ELSE után bármely, programban végrehajtható utasítás szerepelhet (akár újabb IF-THEN szerkezetet, vagy más blokkszervező utasítást is), és a programsorok számára sincs korlátozás. Az ELSE-ág használata nem kötelező, az el is maradhat.
Az IF-szerkezettel kettőnél több irányú elágaztatására is van lehetőség, mert a THEN-ág és az ELSE-ág között tetszőleges számú ELSE IF-ág is felsorolható:

IF logikai-kifejezés1 THEN
   utasítások
   ...
ELSE IF logikai-kifejezés2 THEN
   utasítások
   ...
ELSE
   utasítások
   ...
END IF

Az ilyen szerkezet abban különbözik a több egymás után álló IF-THEN utasításszerkezettől, hogy a logikai-kifejezés2 csak akkor értékelődik ki, ha a logikai-kifejezés1 nem teljesül.
BASIC programokban igen gyakori a

IF változó>érték THEN LET változó=érték

típusú kifejezés. Ezzel egyenértékű, de rövidebb és gyorsabb a

LET változó=MIN(változó,érték)

típusú megoldás.

4.1.2. SELECT CASE-szerkezet
A CASE utasítás segítségével könnyen megoldhatjuk a programunk többirányú elágazását. Használata olyan esetben célszerű, ahol kettőnél több IF utasítást kellene egymásba ágyaznunk. A SELECT CASE utasítás tulajdonképpen egy kifejezés lehetséges értékeitől függő többirányú választást tesz lehetővé. Alakja:

SELECT CASE kifejezés0
CASE kifejezés1
   utasítások1
   ...
CASE kifejezés2
   utasítások1
   ...
CASE kifejezésN
   utasításokN
   ...
CASE ELSE
   utasítások
   ...
END SELECT

Az utasítás végrehajtása a kifejezés0 aritmetikai kifejezés (amely leggyakrabban egyetlen változó) kiértékelésével kezdődik, majd azt és csak azt a CASE ágat hajtja végre, amely előtt a kifejezés0 értékével megegyező kifejezés vagy konstans áll. Ezután a programvégrehajtás az END SELECT utáni programsoron folytatódik. A kifejezés0 lehet szám- és szöveges kifejezés (változó) egyaránt. A CASE-ágakban bármely, programban végrehajtható utasítás szerepelhet.
A SELECT CASE sorban a CASE kulcsszó elhagyható, kivéve, ha a kifejezés éppen a CASE azonosítóval kezdődik.
A CASE-ágakban szereplő kifejezések lehetnek azonos értékűek, hibát nem okoz, de ilyenkor csak az adott értékhez tartozó legelső CASE-ág hajtódik végre.
A CASE ELSE-ág csak egyszer fordulhat elő, és utolsónak kell lennie Az egyes ágakat a sorszámok sorrendjében vizsgáljuk meg, a CASE ELSE-ág után nincs értelme továbbiakat írni, mert ezeket úgysem hajtja végre a program. A CASE ELSE-ág el is hagyható, de ilyenkor, ha a kifejezés0 olyan értéket képvisel, amire nem teljesül egyik CASE-ág feltétele sem, az 10004-es hibát okoz.
A CASE után intervallum megadására is van lehetőség:

CASE kifejezés1 TO kifejezés2

Ebben az esetben feltétel, hogy kifejezés1 értéke nem lehet kisebb kifejezés2 értékénél (egyenlő lehet).
Az IS-BASIC-ben az is megengedett, hogy a CASE-ágban relációt vizsgáljunk, ilyenkor a CASE IS alakot kell használnunk. Pl:

CASE IS<kifejezés1

vagy pl.:

CASE IS>=kifejezés2

Ha több esethez is ugyanaz a CASE-ág tartozik, egy CASE után több kifejezés is felsorolható vesszővel elválasztva, ahol természetesen bármely felsorolt esetmegadási lehetőséget használhatjuk vegyesen:

CASE kifejezés1,kifejezés2,...,kifejezésN

Pl:

CASE 5,8 TO 23,IS>=130

Ilyenkor, ha a kifejezés0 értéke bármely felsorolt értékkel megegyezik, az adott CASE-ág hajtódik végre.
Az alábbi példa megadja a H-adik hónapról, hogy hány napos. (A SZOKOEV(EV) függvény megadja egy adott évről, hogy szökőév-e vagy sem):

340 SELECT H
350 CASE 4,6,9,11
360   LET NAPOS=30
370 CASE 2
380   IF SZOKOEV(EV) THEN
390     LET NAPOS=29
400   ELSE
410     LET NAPOS=28
420   END IF
430 CASE ELSE
440   LET NAPOS=31
450 END SELECT

4.2. Ciklusutasítások
Programozás során gyakran találkozunk olyan feladattal, amikor egy tevékenységet egymás után többször kell elvégezni. Az ilyen ismétlődő tevékenységek programnyelven történő megfogalmazására használjuk a ciklusutasításokat. Az IS-BASIC a ciklusok szervezését két ciklusutasításpárral támogatja. Ha előre (a ciklusba való belépés előtt) ismerjük az ismétlések számát, akkor a FOR-NEXT utasításpár használata javasolt. Amennyiben a ciklust valamilyen feltétel vezérli (vagyis az ismétlések száma attól függ, hogy mikor válik a feltétel igazzá vagy hamissá), akkor a DO-LOOP utasításokat használjuk.

4.2.1. FOR-NEXT ciklusok
Sok BASIC implementációban az egyetlen lehetőség a ciklusszervezésre (a GOTO utasítást leszámítva) a FOR-NEXT utasításpár. Olyankor használható, ha a ciklusmagban van olyan változó, amelynek értéke minden ciklusmag végrehajtása során egyenletesen (lineárisan) változik (nő vagy csökken), és értéke alapján a ciklus befejezése eldönthető. Az említett változó a ciklusváltozó lesz. A FOR-NEXT utasításpárral felépített ciklusban azt kell meghatározni, hogy a ciklusváltozó milyen kezdőértékétől milyen lépésenként haladva, milyen végfeltétel-értékig kell a ciklust végrehajtani. A program a ciklusmagot mindaddig végrehajtja, amíg a ciklusváltozó értéke meg nem haladja a záróértékét. A ciklusváltozó értékének módosítását a program minden ciklusmag végrehajtásakor automatikusan elvégzi. A ciklusváltozó bármilyen nem egész értéket is felvehet, így a lépésköz értékére sincs megkötés. A programozónak nem kell vizsgálati utasítást kódolnia, mert az ellenőrzést az utasítás automatikusan elvégzi, és ha a folytatási feltétel nem teljesül, a gép a ciklust befejezi.
Alakja:

FOR ciklusváltozó=kifejezés1 TO kifejezés2 [STEP kifejezés3]
   ...
(ciklusmag)
NEXT ciklusváltozó

ahol

A ciklusutasításban szereplő mindhárom kifejezés egyetlen egyszer, a ciklusba való első belépéskor értékelődik ki. A ciklusváltozó nem lehet tömbváltozó és string-változó, csak egyszerű szám-változó.
A lépésköz lehet növelő-, vagy csökkentő jellegű. Ha a lépésköz +1, a lépésköz megadása (STEP ...) elmaradhat.
Fontos szabály, hogy az interpreter a ciklusfeltételt mindig a ciklusmag végrehajtása előtt vizsgálja meg, ezért ha a lépésköz pozitív és kifejezés1 nagyobb, mint kifejezés2, a ciklusmag egyszer sem fut le. Szintén nem fut le a ciklusmag, ha a lépésköz negatív és kifejezés1 kisebb, mint kifejezés2.
A ciklusmagban bármely, programban végrehajtható utasítás szerepelhet (akár újabb ciklusszervező-, vagy más blokkszervező utasítást is), és a programsorok számára sincs korlátozás. Ha kettő vagy több ciklus van egymás belsejében (ciklusmagjában), egymásba ágyazott ciklusokról beszélünk. A legfontosabb, ezzel kapcsolatos szabály, hogy a belső ciklus sohasem végződhet a külsőn kívül (azaz a FOR ciklusokat nem lehet fordítottan egymásba ágyazni, mint a Spectrum BASIC-ben). Ebből következik, hogy minden NEXT utasításról egyértelműen eldönthető, melyik FOR utasításhoz tartozik. Ezért az IS-BASIC-ben a NEXT után a ciklusváltozó jelölése csak a felhasználó tájékoztatását szolgálja, az akár el is hagyható, sőt az sem okoz hibát ha rossz ciklusváltozó szerepel a NEXT utasítás mögött.
Üres ciklusnak hívjuk, ha a FOR utasítást rögtön követi a NEXT, vagyis a ciklusmag "üres". Üres ciklust várakozásra lehet használni, más hatása nincs. A FOR és a NEXT akkor sem állhat egy sorban, ha a ciklusmag üres.
A ciklusváltozó értékét a ciklusmagban is megváltoztathatjuk (LET utasítással), ez az - egyáltalán nem ajánlott - megoldás azonban átgondolt ciklusszervezéssel minden esetben elkerülhető. A ciklusváltozó értéke a ciklus lefutása után is megőrződik: végérték+lépésköz lesz az értéke.
Az alábbi példaprogram 10x10-es szorzótáblát ír ki:

120 FOR I=1 TO 10
130   FOR J=1 TO 10
140     PRINT USING " £££":I*J;
150   NEXT
160   PRINT
170 NEXT

4.2.2. DO-LOOP ciklusok
A ciklusszervezése szolgáló mási utasításpár a DO-LOOP a lehető legnagyobb rugalmasságot biztosítja. Akkor célszerű alkalmazni, ha ciklusszervezés során nem ismerjük előre az ismétlések számát. A legegyszerűbb alakja végtelen ciklusok szervezésére alkalmas:

DO
   ...
(ciklusmag)
LOOP

A ciklus ebben az esetben nem tartalmaz semmilyen kilépési feltételt. Sokkal gyakrabban használunk olyan ciklusokat, amelyek valamilyen feltétel bekövetkeztéig ismétlődnek. Ilyen feltétel két módon adható meg: az UNTIL vagy a WHILE kulcsszóval. a WHILE és az UNTIL a feltételek két ellentétes típusa: a WHILE használata esetén addig ismétlődik a ciklus, amíg a feltétel igaz, az UNTIL esetén pedig akkor lépünk ki a ciklusból, ha a feltétel igazzá válik.
Mind az UNTIL, mind a WHILE típusú feltétel alkalmazható a ciklus elején (DO UNTIL / DO WHILE) vagy a ciklus végén (LOOP UNTIL / LOOP WHILE). E két megoldás között az alapvető különbség az, hogy ha a DO UNTIL, ill. a DO WHILE struktúrát alkalmazzuk, akkor a feltételt a számítógép a ciklusba való belépéskor vizsgálja meg (elöltesztelős ciklus), míg a másik esetben csak a ciklus magját alkotó utasítások végrehajtása után értékeli ki (hátultesztelős ciklus). Így az első megoldás alkalmazása esetén előfordulhat, hogy a ciklus utasításaira egyetlenegyszer sem lesz szükség, míg a második esetben ez legalább egyszer mindenképpen bekövetkezik.

DO WHILE logikai kif.
   ...
(ciklusmag)
LOOP
DO UNTIL logikai kif.
   ...
(ciklusmag)
LOOP

vagy

DO
   ...
(ciklusmag)
LOOP WHILE logikai kif.
DO
   ...
(ciklusmag)
LOOP UNTIL logikai kif.

Az IS-BASIC azt sem tiltja, hogy egy ciklus elején és a végén is vizsgáljunk kilépési feltételt.

Az alábbi példaprogram kiírja az első N. prímszámot:

100 PROGRAM "Prim.bas"
110 LET N=100
120 NUMERIC PRIM(1 TO N)
130 PRINT "Az elso ";N;"primszam:"
140 LET PRIM(1)=2:PRINT 2;
150 LET UTOLSO=1:LET SZAM=3
160 DO
170   LET X=1:LET OSZTO=INT(SQR(SZAM))
180   DO WHILE MOD(SZAM,PRIM(X))<>0 AND PRIM(X)<=OSZTO
190     LET X=X+1
200   LOOP
210   IF MOD(SZAM,PRIM(X))<>0 THEN
220     LET UTOLSO=UTOLSO+1:LET PRIM(UTOLSO)=SZAM
230     PRINT SZAM;
235   END IF
240   LET SZAM=SZAM+2
250 LOOP UNTIL UTOLSO=N

4.3. Kilépés a ciklusból
Az EXIT paranccsal bármikor kiléphetünk egy ciklusból. Alakja attól függ, hogy FOR-NEXT, vagy DO-LOOP ciklusban használjuk:

EXIT FOR

vagy

EXIT DO

E kilépést általában egy feltétel vizsgálatával kötjük össze, és a ciklusmag bármely pontján elhelyezhető, akár a ciklusmag több pontján is. Használatával kiléphetünk a DO-LOOP végtelen ciklusból is. Az EXIT utasítás hatására az interpreter a ciklust követő első utasítással folytatja a program végrehajtását. Az EXIT utasítás az egyetlen szabályos mód arra, hogy kilépjünk egy ciklusból, mielőtt az befejeződne.
Célszerű a FOR-ciklust használni a DO-LOOP ciklusok helyett akkor is, ha nem ismerjük előre az ismétlések számát, csak az ismétlések maximális lehetséges számát! A megfelelő feltételek telesülése esetén ugyanis bármikor szabályosan befejezhetjük a ciklust (EXIT FOR utasítással) és az interpreteres nyelvekben a számlálós ciklusok végrehajtási ideje valamivel gyorsabb.

5. Alapvető I/O műveletek
Minden program egyik legfontosabb része a felhasználóval való kapcsolattartás (kommunikáció). Ennek az a legegyszerűbb módja az, hogy a program adatokat kér a felhasználótól, majd megjeleníti a futási eredményeket. Alaphelyzetben a bemeneti (input) adatok a billentyűzetről érkeznek, míg a program kimeneti (output) eredményei a képernyőn jelennek meg.

5.1. Írás a képernyőre - PRINT
Valamennyi BASIC implementációban a PRINT kulcsszó szolgál a kiviteli műveletek elvégzésére. Sok BASIC változat csak a PRINT legegyszerűbb formáját ismeri:

PRINT adatlista

A vessző, vagy pontosvessző karakterrel elválasztott adatlista az alábbiakat tartalmazhatja:

Az utasítás hatására az aktuális kurzorpozíciójától kezdődően sorban kiírásra kerülnek az adatlista elemei. A kiírás formáját az elválasztó karakterek szabályozzák:

Az IS-BASIC-ben lehetőség van a kiírás kezdőpozíciójának tetszőleges meghatározására is. Az utasítás alakja ebben az esetben:

PRINT AT sorszám,oszlopszám:adatlista

Az utasítás az adatlista kiírásának megkezdése előtt a megadott pozícióba mozgatja a kurzort, és a kiírás onnan kezdődik. Ilyenkor a szöveges koordináta-rendszert kell használni, amelynek a kiindulópontja a képernyő bal felső sarkában van és első paramétere a sorszámot, a második az oszlopszámot jelöli. Mind a sorszám, mind az oszlopszám tetszőleges olyan kifejezés lehet, melynek értéke nem haladja meg az utasítás tárgyát képező videolap méretét sem vízszintesen, sem függőlegesen. Ha egymás után több PRINT AT utasítással írunk a képernyőre, javasolt minden - kivéve az utolsó - PRINT utasítás végére pontosvesszőt is tenni, hiszen gyorsul a kiírás, a kocsivissza-soremelés karakterek kiírásának elhagyásával, amely ebben az esetben amúgy is fölösleges.
Az eddig bemutatott kurzorpozícionálási lehetőségekhez képest (üres PRINT utasítás, pontosvessző, vessző) jelentős eltérés, hogy itt a kurzort nem csak előrefelé (a képernyőn jobbra illetve lefelé) pozícionálhatjuk, hanem tetszőleges kurzorpozícióba.

Az IS-BASIC-ben a PRINT utasítás végrehajtása jelentősen eltér a többi 8-bites mikroszámítógép BASIC-jében "megszokottól". Az IS-BASIC PRINT-je nem közvetlenül a képernyőre ír (alapértelmezés szerint a 102-es csatornán elérhető szöveges videolap), hanem a képernyőhöz rendelt EDITOR: eszközre. (Ez alapértelmezés szerint a 0-dik csatornán megnyitott eszköz. A 209 hexa, (521 decimális) memóriacímen tárolt rendszerváltozó tartalmazza az aktuális I/O csatorna számát.). Ennek köszönhetően a kiírás formázásához elérhetőek az EXOS-által biztosított szövegszerkesztő funkció:

Ebből látható, hogy míg más BASIC-ben a PRINT tulajdonképpen csak egyetlen sor kiírására használható, - ellenkező esetben gyakorlatilag olvashatatlan formátumot kapunk - az IS-BASIC-ben többsoros bekezdéseket is kiírhatunk, úgy hogy közben tetszőleges formátumot is beállíthatunk hozzá. Persze hátránya is van annak, hogy minden PRINT utasítást az EDITOR: eszköz dolgoz fel: az utasítás végrehajtása ugyanis így értelemszerűen lassabb. Ha gyorsaság érdekében nem akarunk élni a szövegszerkesztő ezen funkcióival, meg kell ismernünk az I/O utasítások következő általános alakját: Az I/O utasításokban paraméterként megadható, hogy melyik nyitott csatornára irányuljon annak végrehajtása. Így pl. a PRINT utasítással (mely alapértelmezés szerint a 0-dik csatornára ír) írhatunk nyomtatóra, file-ba, grafikus videólapra, vagy tetszőleges szöveges videólapra is. Alakja ebben az esetben:

PRINT £csatorna,AT sorszám,oszlopszám:adatlista

vagy, ha a pozícionálás elmarad:

PRINT £csatorna:adatlista

Ha a PRINT utasításban a kívánt videolapra hivatkozunk (alapesetben a BASIC a 102-es szöveges videolapot használja), a kiírás az EDITOR: eszköz megkerülésével történik, így annak funkcióit nem használja, a kiírás ennek megfelelően felgyorsul.

5.2. A kiírások formázása
A PRINT utasításban alkalmazható, eddig megismert formázási lehetőségeken felül számos további lehetőség van a képernyőn (vagy ép nyomtatón, file-ban) megjelenő kiírási formátum beállítására.

A függvényhívás speciális esete a TAB(x) függvény, mely csak PRINT utasításban alkalmazható. A függvény az x-dik oszlopba állítja a kurzort az aktuális sorban. x érteke kisebb is lehet, mint a kurzor pillanatnyi pozíciója.

5.2.1. A PRINT USING és IMAGE használata
Nagyméretű táblázat kiíratása a BASIC eddig megismert lehetőségeivel nem lesz formailag szép. Gondoljunk csak az eltérő mennyiségű számjegyekből álló számok egymás alatti megjelenítésének kérdésére. Mind a vesszővel jelzett oszlopkiíratás, mind a szövegmezők kiszámolásával készített, vagy akár a TAB függvény segítségével beosztott táblázatok legnagyobb hibája, hogy a táblázat oszlopaiban nem biztosítható, hogy a tizedespont egymás alá essen.
Ha két egymás alá írandó számjegy nagyságrendje (számjegyeinek száma) nem változik a feldolgozások folyamán, akkor a számjegyeket megelőző szövegmező hosszával beállítható, hogy a két szám tizedespontja egymás alatt legyen. Ha viszont egy szám nagyságrendje változhat, akkor az egymás alá kerülés nem oldható meg, mivel a számok kiírása a szövegmezőt követi, függetlenül a hosszától.
Ez a probléma a formátumkiírást megvalósító PRINT USING utasítással szüntethető meg, mely a legtöbb BASIC implementációban megtalálható. A PRINT USING utasítással pontosan meg lehet határozni, hogy az adatlista melyik elemét (jellemzően változók vagy függvények értékét) melyik pozícióra írja ki a program - annak értékének nagyságrendjétől függetlenül. Alakja:

PRINT £csatorna,USING formátumleírás:adatlista

A csatornaszámra való hivatkozás természetesen elhagyható. Az idézőjelek között megadott formátumleírásban kell definiálni a kiírás képét, vagyis azt, hogy hány mezőt, egymástól milyen távolságra kell kiírni. Az adatlista pedig azokat a PRINT utasításban kiírható elemeket tartalmazza sorrendben - vesszővel elválasztva -, amelyek értékét a kiírási mezőkben ki kell nyomtatni. A formátumleírás az alábbi karaktereket tartalmazhatja számokra:

, Vesszőt ír a számba.
$ Dollár jelet ír a szám elé. Csak a szám elején állhat pénznem megjelölésére.
- Előjelet ír a szám elé. A pozitív előjel helyett szóközt ír. Csak a szám előtt állhat.
+ Előjelet ír a szám elé. Csak a szám előtt állhat.
% Számjegyet ír. Ha a kiírandó szám rövidebb, a formátumleírásban megadott számjegyek számánál, vezető nullákat ír elé. A tizedespont után nem állhat.
£ Számjegyet ír (a vezető nullákat elhagyva).
* Számjegyet ír. Ha a kiírandó szám rövidebb, a formátumleírásban megadott számjegyek számánál, vezető * jeleket ír elé.
. Tizedespontot ír a számba. Értelemszerűen egy számban csak egyszer szerepelhet.
^ Kiírja az exponenst, minimum négy karakteren ('E' betűvel kezdve).

Karaktersorozatok kiírására az alábbi formátum-karakterek használhatóak:

£ egy karaktert ír
< A £ jelekkel megadott mezőben levő karaktersorozat balra igazítása. A formátumleírás első karaktere kell, hogy legyen.
> A £ jelekkel megadott mezőben levő karaktersorozat jobbra igazítása. A formátumleírás első karaktere kell, hogy legyen.
Ha nem adunk meg az igazítást meghatározó karaktert, akkor a szöveges mező tartalma középre állítódik.

A fenti listában nem szereplő összes további karakter megjelenítendő szövegként szerepelhet a formátumleírásban. Emellett egy vagy több szóköz karakter a megjelenítendő számok elkülönítésére is szolgál.
Hibát okoz, ha a kiírandó adat túl hosszú és nem fér el a formátumleírásban szereplő számjegyekben / karakterekben. A kiírás a formátumban előjelhelyesen történik. Negatív számnál az előjelnek is hagyni kell egy pozíciót, ha az előjelekről külön nem rendelkezünk a + vagy - karakterek valamelyikével.
A törtrészből csak annyit ír ki a program, amennyire helyet hagyunk. Adott esetben a törtrész teljesen elhagyható. Ha tizedespontot nem tartalmaz a mező, akkor csak egész számot ír ki a program a fenntartott nyomtatási pozíciókban jobbra illesztve.
A formátumot szöveges változóként is lehet definiálni, ekkor a formátumot a kiírási utasítás előtt kell meghatározni:

LET A$="+£££,£££": LET A=25600
PRINT USING A$:A

Példák:

Utasítás: Megjelenített forma:
PRINT USING "£££,£££":123456
123,456
PRINT USING "£££,£££":-123456
hibás!
PRINT USING "-£££,£££":-123456
-123,456
PRINT USING "-£££,£££":25600
25,600
PRINT USING "+£££,£££":25600
+25,600
PRINT USING "%%%,%%%":25600
025,600
PRINT USING "$£££,£££":25600
$25,600
PRINT USING "£££.£££":PI
3.142
PRINT USING "£££":PI
3
PRINT USING "%%%%%^^^^":PI
31416E-04
PRINT USING "£££ £££":100,5
100   5

Összetettebb példa:

PRINT USING "Osszesen: £££,£££ Ft":9950

ennek hatása:

Osszesen:   9,950 Ft

A második példa hatása ezután már egyértelmű:

PRINT USING "Toke: £££,£££,£££ Ft, Hozam: £££,£££,£££ Ft":A,A*.05

Az alábbi utasítás hibát okoz, mert négy számjegyű számot három szemjegyen próbálunk kiírni:

PRINT USING "£££":1250

Sajnos az IS-BASIC a PRINT USING végrehajtását hibásan végzi: a 12 és 14 számjegyű számokat is helyesen megjeleníti, de a 13 jegyű szám kiírása után leáll a BASIC data has been corrupted hibaüzenettel.

Lehetőség van arra is, hogy a programban használt formátumleírásokat előre definiáljuk, erre szolgál az IMAGE utasítás. Formája:

IMAGE:formátumleírás

A formátumleírásban használható karakterek és szabályok megegyeznek a PRINT USING-nál elmondottakkal, egyetlen különbség van: a formátumleírást nem határolják idézőjelek, a : karaktertől kezdődik és a sor utolsó karakteréig tart.
Az előre definiált formátumleírásokra úgy hivatkozhatunk, ha az USING kulcsszó után annak sorszámára hivatkozunk:

PRINT £csatorna,USING sorszám:adatlista

vagy

PRINT USING sorszám:adatlista

Az imént elmondottakból következik, hogy az IMAGE utasítás más utasítással nem állhat egy sorban, és az IMAGE utasítás programon belüli elhelyezkedése tetszőleges, akár a rá hivatkozó USING után is lehet.
Például az alábbi két programrészlet azonos hatású:

200 PRINT USING "Osszesen: £££,£££ Ft":SUM

120 IMAGE:Osszesen: £££,£££ Ft
...
200 PRINT USING 100:SUM

5.2.2. Szerkesztő funkciók
Az operációs rendszer lehetővé teszi, hogy a kiírt bekezdéseket és sorokat tetszőlegesen formázzuk. Egy "bekezdést" olyan PRINT utasítás zár le, melynek végén nem szerepel sem a vessző, sem a pontosvessző elválasztó karakter. Egy, a képernyőre kiírt bekezdés tehát több PRINT utasítással is kiírhatunk folytatólagosan (az utasítások végén vessző, vagy pontosvessző kell, hogy álljon. Ennek megfelelően egy bekezdés hosszabb lehet, mint amit egy programsor lehetséges maximális hossza megenged. Ahhoz, hogy egy bekezdést vagy sort formázni tudjunk, annak végén a megfelelő vezérlőkódot is "ki kell írnunk" az EDITOR: eszköznek. Ezt a CHR$(x) függvénnyel tehetjük meg, mely az x ASCII kódot adja. Például:

PRINT "szövegfüzér";CHR$(x)

Az alábbi ciklussal kiírhatjuk a 33-142. karaktereket és kódjaikat:

100 FOR I=33 TO 142
110   PRINT I;CHR$(I),
120 NEXT

Az alábbi vezérlókódok a már kiírt bekezdésekre és sorokra fejtik ki hatásukat:

241 Az aktuális sort középre igazítja.
248 Egyenesre igazítja a bekezdés sorainak széleit (sorkizárás).
246 A sor színét változtatja (40 karakteres szöveges módban a tinta színét 1-ről 3-ra, majd vissza váltja)
254 A bekezdés színét változtatja.

A következő vezérlőkarakterek az utánuk kiírt bekezdésekre és sorokra fejtik ki hatásukat:

243 A bal oldali margót a kurzorhoz állítja.
251 A jobb oldali margót a kurzorhoz állítja.
244 Felfüggeszti a margók használatát, a beállított margóktól függetlenül újra a képernyő teljes szélességében jelenik meg a kiírt szöveg, függetlenül a beállított margóktól.
252 A margókat széthúzza a képernyő széleihez.
242 Beállít vagy töröl egy tabulátorpozíciót a kurzor oszlopában.
249 Törli a tabulátorpozíciókat.

A 250-es karakterkóddal be-/kikapcsolhatjuk a vonalzósort. Ez elsősorban programszöveg-szerkesztés közben hasznos, hatása megegyezik az ALT+F3 megnyomásával.

5.3. Beviteli utasítások
A feladattípusok többségénél az az igény merül fel, hogy a felhasználó a program futásakor adja meg egyes változók értékét (a program paramétereit). Az eddig megismert LET értékadó utasítás segítségével az adatok változtatása nehézkes, a program módosításával jár. A futás közbeni gyors adatbevitelre az INPUT utasítás alkalmas.
A BASIC-ban a szabványos adatbeviteli (standard input) periféria a billentyűzet, IS-BASIC-ben ez az alapértelmezés szerinti 0-dik csatornán megnyitott EDITOR eszközön keresztül történik.

5.3.1. Az INPUT utasítás
A BASIC nyelv standard beviteli utasítása az INPUT. Formája a legegyszerűbb esetben:

INPUT változólista

amely adatokat olvas az alapértelmezés szerinti 0-dik (EDITOR) csatornáról a változólistában felsorolt változókba. A változólista elemei között vesszőknek kell állniuk. Amikor a program a végrehajtáskor eléri az INPUT utasítást, egy kérdőjelet ír ki, ezzel jelzi, hogy adatbevitelre vár. A kérdőjel kiírásával egyidejűleg a programfutás leáll, és csak az INPUT utasítás tárgyában levő változók értékének begépelése, valamint az ENTER billentyű lenyomása után folytatódik. Ha kevesebb értéket gépelünk be, mint amennyit az utasítás vár, akkor a program az ENTER billentyű lenyomása után újabb kérdőjelet ír a következő sor elejére, jelezve, hogy még vár adatokat. A megfelelő számú adat begépelése után az INPUT utasítás az utasítás tárgyában levő változókhoz rendeli hozzá a felsorolás sorrendjében a begépelt értékeket.
Hibát okoz, ha szám változóba olvasunk be értéket, de a felhasználó szövegfüzért ad be. Ezért gyakori magoldás, hogy minden esetben szövegfüzért olvasunk be, melyet utána szükség esetén számmá konvertálunk:

110 INPUT BE$
120 LET SZAM=VAL(BE$)

Amennyiben karaktersorozatot vár az INPUT de az vesszőt is tartalmaz, akkor alapértelmezésben a vessző és az utána következő karakterek elvesznek. Ha mégis szükség van a vesszőre vagy a karaktersor elején lévő szóközökre, akkor az adatokat idézőjelek között, vagy a LINE INPUT utasítás alkalmazásával kell beírni.
Az INPUT utasítás előtt ajánlatos egy PRINT utasítással kiírni, milyen adat beadása következik, hogy a felhasználó tudja, mikor, melyik adatot, és milyen mértékegységben kell beadni. Pl.:

100 PRINT "Vetelar (Ft)";
110 INPUT SUM

A program használóját minden esetben célszerű arról tájékoztatni, milyen adatot vár a program, azért a fenti példához hasonló megoldás nagyon gyakori. Az IS-BASIC-ben erre van egyszerűbb megoldás is, az INPUT PROMPT alak használata.

INPUT PROMPT "szövegfüzér":változólista

A PROMPT után megadott karaktersorozat az alapértelmezésként használt kérdőjelet ("?") és az utána lévő szóközt váltja fel.
Az alábbi példa hatása azonos az előbbi példával:

INPUT PROMPT "Vetelar (Ft)? ":SUM

Arra is van lehetőség, hogy a beolvasás képernyőbeli pozícióját megadjuk, a PRINT utasításnál megismert módon:

INPUT AT sorszám,oszlopszám:változólista
INPUT AT sorszám,oszlopszám,PROMPT "szövegfüzér":változólista
INPUT PROMPT "szövegfüzér"
,AT sorszám,oszlopszám:változólista

A pozíciómegadás tehát tetszőleges helyen állhat.
Az INPUT utasítás teljes alakja:

INPUT £csatorna, IF MISSING sorszám,AT sorszám,oszlopszám,PROMPT "szövegfüzér":változólista

Az INPUT kulcsszón és a változólistán kívül minden más elhagyható.
Az IF MISSING után megadott sorszámon akkor folytatódik a program végrehajtása, ha a csatornán nincs több adat. Ennek elsősorban akkor van jelentősége, ha nem az alapértelmezett csatornáról (billentyűzetről) végezzük. (Részletesen ld. később.) Az IF MISSING után sorszám megadása helyett használható az EXIT FOR / EXIT DO kulcsszó is. Az alábbi példa a 10 elemű A vektorba olvas be maximum 10 számot, addig, amíg le nem zárjuk a bevitelt egy üres sor bevitelével:

100 NUMERIC A(1 TO 10)
110 FOR I=1 TO 10
120   INPUT IF MISSING EXIT FOR:A(I)
130 NEXT

Figyelem! Az automatikus sorszámozás "összeakad" az IF MISSING-gel, ha használjuk a sorszámozás a 611-616 sorok körül folytatódik. Ilyenkor javasolt újra használni az AUTO parancsot, a bug egyéb hibát nem okoz.

Az INPUT utasítás másik alakja az LINE INPUT. Ezzel az utasítással csak karakterláncot lehet beolvasni, és egy teljes sort egyetlen karakterláncba olvas be. (Tehát pl. a beolvasott szövegfüzér tartalmazhat vessző (,) karaktereket is, melyek az INPUT utasításban az adatok elválasztására szolgál.). Teljes alakja azonos az INPUT utasításával:

LINE INPUT £csatorna, IF MISSING sorszám,AT sorszám,oszlopszám,PROMPT "szövegfüzér":változólista

6. Eljárások és függvények
A programozás során elég gyakran találkozunk olyan szituációval, amikor ugyanazt a tevékenységet a program különböző pontjain kell elvégezni. A megoldást az alprogramok bevezetése biztosítja számunkra. Az alprogram egy olyan névvel ellátott utasításblokk, amelyet valamilyen konkrét feladat elvégzésére készítünk. Az alprogramot a program különböző helyeiről a neve segítségével aktivizáljuk (hívjuk). Az alprogram a hívás hatására végrehajtja a benne rögzített feladatot, majd visszaadja a vezérlést a hívó főprogramnak vagy mások alprogramnak.
Az alprogramok használatának előnyei:

Az IS-BASIC-ben az alprogramokat eljárások vagy függvények formájában állíthatjuk elő.

6.1. Az eljárások
Eljárásnak hívjuk azokat a névvel ellátott programrészeket, amelyek egy-egy jól körülhatárolható feladat (részfeladat) megoldására készülnek. Az eljárások általános alakja:

DEF eljárásnév(paraméterlista)
   utasítások
   ...
END DEF

Az eljárás fejlécében a DEF foglalt szó után meg kell adni az alprogram azonosítóját (nevét), amit a paraméterek deklarációja követ (ha van paramétere az eljárásnak). Paraméterek nélküli eljárás esetén a fejléce egyszerűbb alakot ölt:

DEF eljárásnév

Az eljárásnév képzésére az azonosítókra vonatkozó szabályok érvényesek (ld. 1.3. fejezet).
Az eljárások és függvények a program bármely pontján elhelyezhetők, a program futtatásakor az interpreter átugorja az eljárás- és függvénydefiníciókat. Az eljárást a CALL utasítás segítségével hívhatjuk:

CALL eljárásnév(paraméterlista)

Hibát okoz, ha az eljáráshívásban szereplő paraméterlista eltér - akár a paraméterek számában, akár azok típusában - az eljárásdefiníció fejlécében megadott paraméterlistától.
Ha az eljárásnak nincs paramétere, akkor a hívás a következőképpen végezhető el:

CALL eljárásnév

Az eljáráshívás hatására a vezérlés a hívott alprogramhoz kerül, és mindaddig ott is marad, amíg az alprogram be nem fejezi működését. Egy eljárás futása általában akkor ér véget, ha az eljárás törzsében megadott utasítások mindegyike végrehajtódott, és elértük az utasításblokkot záró END DEF foglalt szót. Ezt követően a vezérlés visszakerül a hívó programhoz / főprogramhoz, az eljáráshívást követő utasításra.
Az eljárásban tetszőleges utasítás állhat, akár újabb eljárás-, függvénydefiníció is.

6.1.1. Az eljárás paraméterei
A paramétereket az eljárás fejlécében a név után, kerek zárójelek között kell felsorolnunk. A paraméterek lehetővé teszik, hogy ugyanazt a programrészt kicsit másképpen, más adatokkal futtassuk. Az alprogramok használatában rejlő előnyök teljes kiaknázásához paraméteres eljárásokat kell írnunk, azonban készíthetünk olyan eljárást is, amelynek nincsenek paraméterei.
A paraméter nélküli eljárások általában mindig ugyanazt a műveletet végzik. (Pl. figyelmeztető üzenetet ad.) Ha egy paraméter nélküli eljárás működését mégis kívülről kívánjuk vezérelni, akkor globális változókat használhatunk az alprogrammal való kommunikációra. (Első megközelítésben globális változók alatt az alprogramon kívül definiált/használt változókat értjük.) Általánosságban elmondható, hogy a paraméter nélküli eljárások és a globális változók együttes használata rossz programozási technikát takar.

Az eljárás fejlécében szereplő paramétereket formális paramétereknek nevezzük. Ezek meghatározzák, hogy az eljárás hívásakor hány és milyen típusú adatot (hívási paramétert) kell megadnunk. Az eljárás törzsében a formális paraméterekre mint helyi (lokális) változókra hivatkozhatunk. A bemutatott eljárásfejlécben megadott paraméterek mindegyike értékparaméter. Az értékparaméter csak egyirányú kommunikációt tesz lehetővé a hívó program és a hívott eljárás között. Eljáráshíváskor minden egyes aktuális (hívási) paraméter értéke a paraméterlista azonos helyén álló formális paraméterbe másolódik. Az eljáráson belül az átadott értékeket a formális paraméteren keresztül érhetjük el és használhatjuk fel.

A programozás során gyakran találkozhatunk olyan feladattal, amikor egy eljárás a paraméterein fejti ki hatását (például csökkenti, növeli vagy felcseréli azokat). Ekkor a bemenő (egyirányú) értékparaméterek használatával nem érjük el a célunkat, hiszen az ilyen paramétereken elvégzett műveletek hatása csak az eljáráson belül érzékelhető. Megoldást az ún. referencia-paraméterek bevezetése jelenti számunkra. A referencia-paraméter kétirányú adatcserét biztosít a hívó program és a hívott eljárás között. Az eljárás formális paraméterlistáján bármelyik értékparamétert változó-paraméterré alakíthatjuk, ha a paraméter neve elé a REF kulcsszót tesszük.
Az alábbi eljárás felcseréli a paraméterként megadott két változó értékét:

100 DEF SWAP(REF A,REF B)
110   LET T=A:LET A=B:LET B=T
120 END DEF

A tömbváltozókat és a függvényeket mindig REF paraméterként kell átadni! Az alábbi példa tetszőleges méretű egydimenziós numerikus-tömböt (vektort) tölt fel, véletlenszerű elemekkel, növekvő sorrendben.

500 DEF TOLT(REF T)
510   LET SZ=0
520   FOR I=LBOUND(T) TO UBOUND(T)
530     LET SZ=SZ+RND(5)
549     LET T(I)=SZ
550   NEXT
560 END DEF

6.1.2. A változók érvényességi köre
Minden eljárás rendelkezhet ún. saját (lokális) változókkal és további alprogramokkal. (Az előző példában bemutatott SWAP eljárás - mely két változó értékét cseréli fel - a T változót hozta létre "saját használatra".) A lokálisan deklarált azonosítók az eljáráson kívülről nem érhetők el: az eljárás befejezésekor ezek értéke elvész, a tárolásukra felhasznált tárterület felszabadul. Ebből következik, hogy két eljárásban - melyek nem egymásba ágyazva vannak definiálva - használhatunk azonos nevű változókat is, anélkül, hogy ez bármilyen - szintaktikai, szemantikai - hibát okozna. Ezzel szemben a főprogram szintjén létrehozott (globális) változók statikus élettartamúak és érvényességi körük a program egészére kiterjed (azaz az eljárásokban is használhatók). A statikus élettartamú változó a program indításakor jönnek létre, és a programból való kilépéskor is megmaradnak, azok értéke ellenőrizhető.

Példának nézzük a következő programot:

100 LET X=1:LET Y=2
110 CALL SWAP(X,Y)
120 PRINT X,Y
130 DEF SWAP(REF A,REF B)
140   LET T=A:LET A=B:LET B=T
150 END DEF

6.2. A függvények
A programozási gyakorlatban gyakran előfordul, hogy bizonyos feladatok (számítások) elvégzésének egyetlen érték az eredménye, amit általában kifejezésekben kívánunk felhasználni. A BASIC nyelv rendelkezik olyan eszközzel, amely lehetővé teszi, hogy az egyetlen értéket visszaadó alprogramokat a matematikában megszokott módon függvényként hívjuk.
A függvények definiálására ugyanúgy a DEF kulcsszó használható, mint az eljárások definiálására. A legtöbb BASIC változatban egy függvénydefiníciót egyetlen sorba kell írnunk, ennek alalkja IS-BASIC-ben:

DEF függvénynév(paraméterlista)=kifejezés

A kifejezésben természetesen felhasználhatóak a paraméterlistában felsorolt formális paramétereket. Az ilyen függvénydefiníciók csak egyszerűbb számítási feladatok elvégzésére használhatóak. Pl.:

100 DEF ATLAG(X,Y)=(X+Y)/2

Az egysoros program lefuttatása után látszólag nem történik semmi, de ezután végrehajtható az alábbi parancs, amely kiírja 2 és 4 számtani átlagát:

PRINT ATLAG(2,4)

Sokkal nagyobb felhasználási lehetőséget biztosít az IS-BASIC másik függvénydefiníciós lehetősége, amikor a függvény értéke nem csak egyetlen sorban írt kifejezés eredménye lehet. Ennek alakja szinte azonos az eljárások definíciójához:

DEF függvénynév(paraméterlista)
   utasítások
   ...
END DEF

Az egyetlen eltérés az eljárásokhoz képest: a függvényérték visszaadásáról magunknak kell gondoskodni! A függvényből való kilépés előtt a függvény nevét (mint egy közönséges változót) egy értékadás bal oldalán használva definiálhatjuk a visszatérési értéket. Ilyen értékadás a függvényen belül bárhol szerepelhet, akár több helyen is. A függvények visszaadott értéke lehet szám-, logikai- és szövegfüzér- típusú is.
A függvényhívások nem csak kifejezésekben szerepelhetnek, hívhatjuk CALL kulcsszóval is (ez igaz a BASIC beépített függvényeire is), de ilyenkor az eljárás visszaadott értéke nem használható fel.

Példák a függvénydefinícióra:

340 DEF LNKO(A,B)
350   DO WHILE B>0
360     LET T=B
370     LET B=MOD(A,B)
380     LET A=T
390   LOOP
400   LET LNKO=A
410 END DEF
420 DEF LKKT(A,B)=(A*B)/LNKO(A,B)

Az LNKO függvény két szám legnagyobb közös osztóját adja, az LKKT két szám két szám legkisebb közös többszörösét. Az LNKO többsoros függvénydefinícióban a 400. sorban gondoskodunk a függvény visszaadott értékéről.
A következő példában a KEY$ függvénynek nincs paramétere. A függvény várakozik egy számbillentyű lenyomásáig, majd visszaadja a lenyomott karaktert:

580 DEF KEY$
590   DO
600     LET KY$=INKEY$
610   LOOP UNTIL KY$>"0" AND KY$<="9"
620   LET KEY$=KY$
630 END DEF

Az ODD függvény logikai igaz értéked ad vissza, ha a paraméterként megadott szám páratlan, ha a szám páros, hamis értéket.

100 DEF ODD(X)
110   IF MOD(X,2)=0 THEN
120     LET ODD=0
130   ELSE
140     LET ODD=-1
150   END IF
160 END DEF

Az eljárások és függvények között nincs lényegi különbség, az alkalmazásuk módja határozza meg, hogy melyiket választjuk. A függvények sok mindenben (például a paraméterezés, a lokális deklarációk használata stb.) hasonlítanak az eljárásokra, azonban három lényeges dologban különböznek tőlük:

6.3. Kilépés az eljárásokból
Az EXIT kulcsszóval nem csak ciklusokból léphetünk ki (ld. 4.3. fejezet), hanem eljárásokból és függvényekből is. Alakja ebben az esetben:

EXIT DEF

Az EXIT DEF utasítást a DEF-blokkon belül bárhol elhelyezhetjük, akár egy cikluson belül is, de csak egyszeres ciklus mélységben (tehát pl. két egymásba ágyazott FOR-ciklus belsejéből már nem tud kilépni.)
Függvényekből az EXIT utasítással is csak akkor szabad kilépni, ha a függvény visszatérési értékét már definiáltuk.

6.4. Rekurzió
A matematikában lehetőség van bizonyos adatok és műveletek rekurzív definiálására. A rekurzív algoritmusokban a soron következő lépéshez az előző lépések elvégzésekor kapott eredményeket használjuk fel. A programozási nyelvekben a rekurzióról akkor beszélünk, amikor egy alprogram saját magát hívja (közvetlen rekurzió), vagy ha két (vagy több) alprogram felváltva hívja egymást (közvetett rekurzió). A rekurzív problémák rekurzív alprogrammal viszonylag egyszerűen megoldhatók, azonban ez a megoldás általában idő- és memóriaigényesebb. Minden rekurzív problémának létezik iteratív megoldása is, amely általában nehezebben programozható, de több szempontból hatékonyabb lehet a rekurzív megoldásnál.
Egy feladat rekurzív, ha a feladat megoldásához vezető lépések során

E módszer a teljes indukció elvén alapszik. A feladatot mindig visszavezetjük egy előző feladatra, melynek megoldása egy fokkal egyszerűbb. Véges lépésben elérjük a legegyszerűbb esetet, és így a feladatot megoldottuk.
Ahhoz, hogy egy rekurzív folyamat be tudjon fejeződni, figyelni kell arra, hogy legyen valami, ami megállítja a további rekurzív hívást, és az elkezdett rutinok sorra befejeződhessenek. A rekurzív rutinban minden esetben szerepelnie kell egy küszöbfeltételnek, vagy leállító feltételnek, mely alapján eldől, lesz-e további rekurzív hívás, vagy sem. IS-BASIC-ben az egymásba ágyazható blokkok maximális mélysége 38 (tehát pl. max. 38 FOR-NEXT vagy egyéb ciklus ágyazható egymásba). Ez igaz az önmagát rekurzívan hívó eljárásokra is, tehát a rekurzió maximális mélysége is 38 szint.

A rekurzív megoldás általában rövidebb és áttekinthetőbb, mint az iteratív (ciklusos) megoldás. Ez a megállapítás azonban csak a programírásra érvényes. A program futása során az alprogram minden újabb hívásakor újabb memóriaterület kerül lefoglalásra a veremben a paraméterek és a lokális változók számára.
A rekurzív feladatok klasszikus példája a Hanoi tornyai nevű logikai feladvány. Ebben adott három rúd: egy réz, arany és egy ezüst. A réz rúdon induláskor N darab különböző átmérőjű lyukas korong helyezkedik el, az átmérők szerinti csökkenő sorrendben. A feladat a korongok átrakása az arany rúdra, az alábbi szabályok figyelembevételével:

100 PROGRAM "Hanoi.bas"
110 CALL TORONY(4,"Rez  ","Arany","Ezust")
120 DEF TORONY(N,FORRAS$,CEL$,SEGED$)
130   IF N>0 THEN
140     CALL TORONY(N-1,FORRAS$,SEGED$,CEL$)
150     PRINT FORRAS$;" -> ";CEL$
160     CALL TORONY(N-1,SEGED$,CEL$,FORRAS$)
170   END IF
180 END DEF

7. Kivételes esetek, hibák kezelése
Körültekintő programozással számos, a programfutás folytatását lehetetlenné tevő esetet kivédhetünk, hisz egy jól megirt programmal szemben amúgy is követelmény, hogy "bolondbiztos" legyen. Mégis sok esetben a program jelentős egyszerűsítéséhez vezethet, ha a váratlan esetek kivédését inkább megszakításkezelő rutinokkal oldjuk meg. Emellett sok olyan esemély (kivételes eset) képzelhető el, melyre a programunkat csak a megszakításkezelő rutinok használatával készíthetjük fel. Ezek jellemzően az I/O műveletek, különös tekintettel a file-műveletekre.
Kivételes esetnek nevezzük az olyan folyamatokat, amelyek a programtól teljesen függetlenül mennek végbe, de valami módon a programfutásra befolyással lehetnek. Ilyen eset jellemzően pl. a le nem tiltott STOP billentyű lenyomása, vagy az említett file-műveletek közben bekövetkező olvasási hiba - melynek hatására egyébként a programfutás megszakadna, adatvesztést okozva. Kivételes esetet maga a program is generálhat.
A kivételes esetek kezelésére az alábbi blokkszervező utasításokat használhatjuk:

...
WHEN EXCEPTION USE név
   ...
END WHEN
...
HANDLER név
   ...
END HANDLER

A program WHEN... END WHEN utasításokkal behatárolt részén keletkezett hiba, kivételes eset hatására a név nevű megszakításkezelő rutin fog lefutni. A megszakításkezelő rutint a HANDLER... END HANDLER utasításokkal definiáljuk. Egy programon belül több megszakításkezelő-rutint is definiálhatunk és a programon belül több WHEN... END WHEN blokk is állhat, sőt ezek egymásba is ágyazhatók. Ilyen esetben, ha a megszakításkezelő-rutin végrehajtása közben újabb megszakítás következik be, akkor a következő külső megszakításkezelőé a vezérlés. Így a program különböző pontján bekövetkező váratlan eseményt, hibát más-más megszakításkezelő dolgozhat fel.

A megszakításkezelő rutinban több, olyan utasítás is segíti a bekövetkezett hiba / esemény beazonosítását, és kezelését, melynek használata a HANDLER-blokkon kívül nem lehetséges, értelmetlen:

Ha valamely WHEN... END WHEN blokkban bekövetkezett hiba hatására megfelelő a hibakezelő-rutin lefut, a program futása - alapértelmezés szerint - a hibát okozó WHEN... END WHEN blokk utáni első utasítástól folytatódik. Ezt változtathatjuk meg az alábbi utasításokkal, melyekkel megszakításkezelő rutinban elvégzett tevékenységek után a program futásának helyéről rendelkezhetünk:

Kivételes esetek maga a program is generálhat az alábbi módok valamelyikével:

Mivel a megszakításkezelést leggyakrabban file-műveleteknél használjuk, itt csak két egyszerűbb példát mutatunk be. Az első eset az időzített megszakításra mutat példát, ami játékoknál lehet hasznos.

100 PRINT "Billentyuzetpusztito";CHR$(241)
110 PRINT "Ez a program azt szamolja, hanyszot tudud megnyomni a SPACE billentyut 5 mp alatt."
120 PRINT "Kezdes: SPACE!";CHR$(241)
130 DO
140 LOOP UNTIL INKEY$=" "
150 LET DB=1
160 SET TIMER 5
170 WHEN EXCEPTION USE VEGE
180   DO
190     IF INKEY$=" " THEN LET DB=DB+1
200   LOOP
210 END WHEN
220 HANDLER VEGE
230   PRINT "Osszsesen";DB;"alkalommal sikerult lenyomni."
240 END HANDLER

A második (kicsit nyakatekert) példában azt kezeljük le, ha az INPUT utasításban szövegfüzért adunk meg, miközben a program számot vár, és a program leállítását sem engedjük meg.

100 WHEN EXCEPTION USE HIBA
110   INPUT PROMPT "Kerek egy szamot: ":A
120 END WHEN
130 PRINT "A beolvasott szam: ";A
140 HANDLER HIBA
150   IF EXTYPE=20034 THEN
160     PRINT "Ez nem szam!"
170   ELSE
180     PRINT :PRINT "Nem engedem leallitani!"
190   END IF
200   RETRY
210 END HANDLER

8. I/O műveletek
Az Enterprise operációs rendszer egyik fő jellemzője a csatornaalapú I/O (be- és kiviteli) rendszer. Ez azt jelenti, hogy egy adott perifériával folytatott információforgalmazáshoz először egy csatornát kell megnyitni. Ilyen csatornákat maga a BASIC-rendszer is megnyit alapértelmezés szerint, pl. a billentyűzethez vagy a hangkezelőhöz. A BASIC-rendszernek nem is kell azzal foglalkoznia, hogy amikor egy nyitott csatornára adatokat írunk, vagy onnan adatot fogadunk, milyen perifériával kommunikálunk éppen. Ebben a fejezetben tovább ismerkedünk az I/O műveletekkel.

8.1. Csatornák
A csatorna speciális, a számítógép két része között nyitott kommunikációs út. Ha ilyen csatornát nyitottunk valamely perifériához, az adott perifériával egyszerűen a csatornaszám megadásával kommunikálhatunk. A megnyitott csatornákat egy sorszámmal (csatornaszámmal) azonosítjuk. Mind a csatorna megnyitásánál, mint a csatornára irányuló I/O műveleteknél megadható hivatkozásként a csatornaszám. A csatornaszámot az I/O utasításokban a £ karakter után lehet megadni. Nem kötelező minden esetben csatornaszámra hivatkozni, ahogy eddig a PRINT és INPUT utasításoknál sem tettük.
Minden I/O műveletnek van alapértelmezett csatornája, ha az utasításból elhagyjuk a csatorna-hivatkozást, akkor az alapértelmezett csatornát próbálja használni. A csatornaszám 0-és 254 közötti érték lehet. A 255-ös az alapértelmezett csatorna, ha egy program ezt használja, akkor csatornaszámként a 4-es EXOS váltózóból (DEFAULT CHANNEL) kiolvasott érték lesz használva. IS-BASIC alatt ennek alapértéke 0, azaz az EDITOR csatorna. Maga az IS-BASIC nem használja, de az EXOS rendszerbővítők (pl. EXDOS) a 255-ös csatornán keresztül kommunikálnak. Pl (parancsmódban):

OPEN £1:"DIRINFO.TXT" ACCESS OUTPUT
SET DEFAULT CHANNEL 1
:DIR
CLOSE £1
SET DEFAULT CHANNEL 0

Azok a parancsok, amelyek törlik a változókat, automatikusan lezárják az 1-99 között levő nyitott csatornákat.
A BASIC-rendszer maga is megnyit pár alapértelmezett csatornát:

csatornaszám: eszköz:
0 EDITOR: Az operációs rendszer által biztosított szövegszerkesztő-rendszer csatornája.
102 VIDEO: A BASIC-rendszer által használt szöveges videolap.
103 SOUND: A hangkezelő csatornája.
104 PRINTER: A nyomtatóhoz nyitott csatorna.
105 KEYBOARD: A billentyűzet csatornája.

Szükség esetén az alábbi csatornákat nyitja meg a BASIC-rendszer:

csatornaszám: eszköz:
101 VIDEO: A BASIC-rendszer által használt grafikus videolap.
106 TAPE: vagy DISK: A magnó vagy lemezmeghajtó csatornája.
107 A lokális hálózat (NET:) alapértelmezett csatornája.

Például A PRINT utasítás alapértelmezés szerint a 0. csatornát használja, az LPRINT mely nyomtatóra ír, a 104-es csatornát használja. Ettől függetlenül a PRINT utasítással is írhatunk nyomtatóra, ha az utasításban hivatkozunk a nyomtató csatornájára. A grafikus utasítások a 101-es csatornát használják, a hangkezelő utasítások a 103-as csatornát. (A grafikus és hangkezelő utasítások csak a megfelelő escape-szekvenciákat írják ki a csatornára, melyet az operációsrendszer értelmez és hajt végre.)

Csatornanyitásra az OPEN utasítás szolgál, melynek általános alakja:

OPEN £csat:"eszköz:file-név"

A parancs egy eszközt vagy file-t és egy csatornát rendel egymáshoz. Egy csatornához egyszerre csak egy eszköz, ill. file rendelhető. Az eszközök nevét a végükön álló kettőspontról ismeri fel a rendszer. A file-nevet csak file szervezésű adatforgalomnál (ld. következő alfejezet) kell megadni, minden más esetben elhagyható, a rendszer figyelmen kívül hagyja.
Az egymáshoz rendelési viszonyt a CLOSE paranccsal szüntethetjük meg:

CLOSE £csat

A csatorna lezárása előtt az EXOS kiírja az eszközhöz tartozó pufferben levő adatokat, majd felszabadítja a csatornához használt memóriaterületet.

Egy adott (megnyitott) csatornára irányuló bármely műveletet (kivéve a csatorna lezárását) "el tudunk téríteni" a REDIRECT utasítással, melynek alakja:

REDIRECT FROM £csat1 TO csat2

Az utasítás kiadásától kezdve minden, a csat1 csatornára irányuló művelet a csat2 csatornára lesz átirányítva. Az utasítás hatása adatvége jel érkezéséig, vagy hiba bekövetkeztéig tart. Az átirányítást úgy tudjuk kikapcsolni, ha egy újabb REDIRECT utasításban a csat2 csatornának a 255-ös csatornát állítjuk be. Egyszerre több átirányítás is érvényben lehet.
Az alábbi példában 3 szöveges videolapot nyitunk. Valamennyi PRINT utasítás az 1-es csatornára irányul, hatása mégis mindig más videólapon fejt ki hatást.

100 PROGRAM "Redirect.bas"
110 CLEAR SCREEN
120 SET VIDEO X 40:SET VIDEO Y 5
130 SET VIDEO MODE 0:SET VIDEO COLOR 0
140 FOR I=1 TO 3
150 OPEN £I:"video:"
160   SET £I:PALETTE I*16,255,16,1
170   DISPLAY £I:AT(I-1)*6+1 FROM 1 TO 5
180   PRINT £I:I;". csatorna:"
190 NEXT
200 PRINT £1:"1. csatorna"
210 REDIRECT FROM £1 TO £2
220 PRINT £1:"redirect 1->2"
230 REDIRECT FROM £2 TO £3
240 PRINT £1:"redirect 2->3"
250 REDIRECT FROM £3 TO £2
260 PRINT £1:"redirect 3->2"
270 REDIRECT FROM £1 TO £255
280 PRINT £1:"Vege."

8.2. Állománykezelés
A lemezen tárolt állományok a számítógép lemezegységein vagy kazettán tárolt, névvel ellátott adathalmazokat jelölnek. A számítógépeken az operációs rendszer feladatai közé tartozik a file-rendszer támogatása és a file-ok elérésének biztosítása. Természetesen az IS-BASIC-ben is megtalálhatjuk a file-kezeléshez szükséges funkciókat. A file-okat - többek között - a bennük tárolt adatok szempontja szerint csoportosíthatjuk. Azokat a file-okat, amelyek adatelemeit csak sorban egymás után érhetjük el, soros (szekvenciális) állományoknak nevezzük. A másik csoportot a közvetlen elérésű állományok alkotják. Az IS-BASIC - mivel magnós konfigurációra tervezték - csak szekvenciális állománykezelést valósít meg: soros file-ként szöveges állományokat használhatunk.
A szöveges állományok karaktereket tartalmazó, különböző hosszúságú sorokból épülnek fel. Minden sort az EOLN (End Of Line) jel zár, vagyis: CHR$(13) és CHR$(10). Az egész állományt elvileg az EOF (End of File) jel - vagyis: CHR$(26) zárja, ami hiányozhat a file végéről, és hiányzik is, mert az IS-BASIC nem rakja ki automatikusan, de mi beleírhatjuk a file végére. Az állomány tartalmát mindig a legelső sortól kezdve egyesével olvashatjuk vagy írhatjuk.
Az állományok tartalmának eléréséhez a programozási nyelvtől és az operációs rendszer fajtájától függetlenül mindig ugyanazokat a főbb lépéseket kell végrehajtani:

8.2.1. File-nyitás
A felhasználni kívánt állományt először meg kell nyitni ahhoz, hogy file-műveleteket végezzünk rajta, ezt a már ismert OPEN utasítással tehetjük meg. A file-nyitó utasítás az adatok áramlásának irányát is meghatározza.

Az utasítás hatására - ha még nem létezik - létrejön a megadott nevű file. Ha a file már létezik, felülíródik, korábbi tartalma elvész.

Az elérési mód megadása ebben az esetben elhagyható:

OPEN £csat:"eszköz:file-név"

Alapkiépítésű rendszerben két eszköz használható file-műveletek végrehajtására: a magnókezelő (TAPE:) és a lemezkezelő (DISK:). A file-név megadása csak magnós konfigurációban hagyható el, az eszköz megjelölése bármely konfigurációban elhagyható. Ha az eszköz megjelölése elmarad, az alapértelmezés szerinti eszközt (magnós konfigurációban TAPE:, EXDOS-t tartalmazó konfigurációban DISK:) fogja használni a rendszer. Mind a TAPE: mind a DISK: eszközkezelő több eszközt (több magnót vagy meghajtót) is képes kezelni, ezért ezek sorszáma is megadható, és használható a lemezmeghajtók EXDOS által kiosztott betűjelei is. Ha nem adjuk meg az eszköz sorszámát, akkor a csatornanyitáskor éppen aktuális lemezmeghajtót használja a rendszer, magnós konfigurációban pedig az adatforgalom irányának megfelelő magnót.
Az alább megnevezések mind helyesek:

Magnók:

sorszám: eszköznevek:  
1. TAPE1: TAPE-1:
2. TAPE2: TAPE-2:

Használható továbbá a TAPE:
A magnó- eszközkezelő emellett tetszőleges (0-255) sorszámot is elfogad, a ténylegesen használt magnót az adatforgalom iránya határozza meg.

Lemezmeghajtók:

sorszám: EXDOS beűjel eszköznevek:  
1. A: DISK1: DISK-1:
2. B: DISK2: DISK-2:
3. C: DISK3: DISK-3:
4. D: DISK4: DISK-4:
RAMDISK E: DISK5: DISK-5:

Használható továbbá a DISK:

Megengedett, hogy az eszköz megjelölése csak az eszköz sorszámából álljon, ilyenkor az alapértelmezett eszköz megadott sorszámú eszközét jelöljük ki. Pl. a 2: eszköznév magnós konfigurációban a TAPE2: eszközt jelöli ki, EXDOS-t tartalmazó konfigurációban a DISK2: meghajtót.
Megjegyzendő, hogy az alapértelmezett eszközt más rendszerbővítés megváltoztathatja.

A file-névre BASIC azonosítókra vonatkozó szabályok érvényesek, kivéve, hogy a pont (.) karakter után legfeljebb három karakter hosszú kiterjesztést is tartalmazhat, és a file-név maximális hossza 28 karakter lehet (a 28 karakterbe a kiterjesztés is beleszámítandó). Azonban lemezen a file-név maximum 8+3 karakter lehet, ezért Az EXDOS a megkapott file-nevet szükség esetén rövidíti. Ezért célszerű a file neveket az EXDOS szigorúbb megkötése szerint meghatározni.
A TAPE: eszközkezelő megengedi a "névtelen" file-ok használatát, kompatibilitási szempontok miatt ez szintén nem javasolt lehetőség.

8.2.2. Írás file-ba
A file írásra történő megnyitása után a PRINT utasítással írhatunk sorokat a file-ba (természetesen a megfelelő csatornára történő hivatkozással). Egy sorba egy vagy több adatelem is írható, ez utóbbi esetben az adatelemek közé vessző karaktert is írni kell. (Esetleg a logikai összetartozó adatokat lehet célszerű egy sorba írni, a létrehozott file mérete nem csökken számottevően, mindössze a sorvége jeleket (2 byte) spóroljuk meg a sorok számának csökkenésével.) Ha egy szöveges adatelem tartalmazhat vessző karaktert, akkor azt mindenképpen külön sorba kell írni.
Visszaolvasáskor hibát okoz, ha a file végére érve újabb olvasási kísérletet teszünk. Ennek elkerülésére - illetve az adatok visszaolvasásának egyszerűsítésére - az adatok kiírásakor egyszerű előkészületi megoldást célszerű használni: A file legelső sorába kiírjuk a file-ba írandó sorok / adatok számát.

Az alábbi példa ezt a megoldást mutatja be (ebben DB darabszámú rekordot mentünk a file-ba):

1000 OPEN £1:"TELEFON.DAT" ACCESS OUTPUT
1010 PRINT £1:DB
1020 FOR I=1 TO DB
1030   PRINT £1:NEV$(I):PRINT £1:EMAIL$(I):PRINT £1:TEL$(I)
1040 NEXT
1050 CLOSE £1

Figyelem! Az adatok kimentését minden esetben hibakezelő blokkban (ld. 7. fejezet) érdemes elvégezni, elkerülendő az adatvesztést.

8.2.3. Olvasás file-ból
File-ból olvasásra az 5.3.1. alfejezetben ismertetett INPUT utasítás szolgál. A megfelelő csatornára hivatkozás nem hagyható el. Ha a beolvasandó szövegfüzérben vessző karakter is szerepelhet, a LINE INPUT formát kell használnunk, ha egy sorban több adatot tárolunk veszővel elválasztva, az INPUT formát. Az adatok visszaolvasása természetesen az adatok kimentésének sorrendjében lehetséges, ezt a sorrendet nem tudjuk megváltoztatni. (Vagyis, ha csak az utolsó sor tartalmára van szükség, akkor is végig kell olvasni az egész file-t.)
Ha a file végére érve egy újabb olvasási kísérletet End of file megszakítást eredményez, ezért ezt a lehetőséget olvasás közben vizsgálnunk kell. A visszaolvasás a következőképpen történhet:

Ha a file első sora tartalmazza az állomány sorainak számát:

2000 OPEN £1:"TELEFON.DAT"
2010 INPUT £1:DB
2020 FOR I=1 TO DB
2030   INPUT £1:NEV$(I),EMAIL$(I),TEL$(I)
2040 NEXT
2050 CLOSE £1

Ha a file csak az adatokat tartalmazza (max. N elemet olvasunk be):

2000 OPEN £1:"TELEFON.DAT"
2010 FOR I=1 TO N
2020   INPUT £1,IF MISSING EXIT FOR:NEV$(I)
2030   INPUT £1:EMAIL$(I),TEL$(I)
2040 NEXT
2050 CLOSE £1

File műveleteknél hatékony eszköz a sokoldalúan használható COPY parancs, melynek alakja:

COPY FROM £1 TO £2

mely az első csatornáról másol a másodikra. Mindkét csatornának nyitva kell lennie. A művelet a STOP gomb, az end-of-file jel vagy valamilyen hiba hatására fejeződik be. Ha az egyik csatornát nem adjuk meg, akkor az alapértelmezés a beolvasásra a 0., a kiírásra a 104. csatorna használható, azaz a rendszercsatornáról olvas és a sornyomtatóra ír ki. Pl:

100 OPEN #1:"Readme.txt" ACCESS INPUT
110 COPY FROM #1 TO #0
120 CLOSE #1

Egyetlen karaktert olvas be a megadott csatornáról a GET utasítás:

GET £csatorna:változó$

Ha nincs a csatornában karakter, akkor üres karaktersorozatot ad vissza. Általában a beolvasást billentyűzetről, háttértárról, vagy hálózatról végettük, de használhatjuk szöveges lapon, és grafikus lapon is. A csatorna alapértelmezése a 105 (billentyűzet), hatása ebben az esetben azonos mintha az INKEY$ függvényt használnánk. (Kompatibilitási okokból szükséges az INKEY$ függvény megléte.) Szöveges képernyőn használva meghatározhatjuk, hogy a képernyő egy pozíciójában van-e, és ha igen, milyen karakter. (Egy játékprogramban így pl. nem kell tömbben is tárolnunk a képernyő tartalmát, hiszen az amúgy is ott van a képernyőn.)

8.3. Hálózat
A megfelelő kábelhálózat felhasználásával maximum 32 számítógépet hálózatba köthetünk. A kiépített hálózat tetszőleges kétirányú adatátvitelre és programok átadására-fogadására alkalmas. A hálózat működésének előfeltétele, hogy a csatlakoztatott számítógépek egyedi azonosítószámmal rendelkezzenek. Számítógépünk nem rendelkezik előre megadott hálózati számmal, mikor összeállítjuk a hálózatot, nekünk kell e sorszámot beállítanunk a megfelelő rendszerváltozó beállításával:

SET NET NUMBER kifejezés

A kifejezés értéke 1 és 32 közötti érték lehet.
A számítógép aktuális hálózati sorszáma lekérdezhető a

ASK NET NUMBER változó

utasítással.

A hálózat másik tagjával történő kommunikáció megkezdéséhez először természetesen egy csatornát kell nyitnunk erre a célra. A hálózati szolgáltatás eszközkezelője a NET:, mely egyszerre maximum 1-32 eszköz kezelésére alkalmas. A 6. sorszámú géppel történő kommunikációra az alábbi utasítással nyithatunk csatornát:

OPEN £110:"NET-5:"

Ezt követően a megnyitott csatornán a már megismert I/O műveleteket hajthatjuk végre. Az adó gép addig küldi újra és újra az üzenetet, míg a címzett nem nyugtázza annak vételét.
A 0. hálózati sorszámot megadva (vagy ha a NET: után egyáltalán nem írunk sorszámot) a teljes hálózatra küldhető általános adás, amelyet minden hálózatra kapcsolt gép figyelhet. Ez a lehetőség nagyon hasznos lehet rövid, mindenkinek szóló üzenetek küldésére. Hátránya azonban, hogy a fogadásról ilyenkor az adó gép nem kap visszajelzést a címzettektől, így lehetséges (pl. mert a fogadó gépen futó program épp mással van elfoglalva), hogy valamelyik gép lemarad az elküldött adatcsomagról.
A hálózati kommunikáció pufferelt, általában egy adatcsomagot a számítógép mindaddig nem küld el, míg az el nem éri a 256 karakter hosszúságot. Ezen változtatni a

FLUSH £csatorna

paranccsal lehet; ennek hatására a csatornához tartozó puffer tartalmát haladéktalanul elküldjük, függetlenül attól, hogy esetleg csak néhány karakter hosszú. A

CLEAR £csatorna:NET

paranccsal a csatornához tartozó puffert törölhetjük. Erre azért lehet szükség, mert a számítógép azért, hogy az adatok ne kavarodjanak össze, mindaddig nem fogad el semmilyen üzenetet, míg az adott csatornához tartozó puffer nem teljesen üres.

8.3.1. Hálózatkezelés a háttérben
Ha két vagy több gépen egymástól függetlenül futó programok próbálnak egymással adatokat cserélni, elképzelhető, hogy az adó gépnek hosszabb időt kell várnia, amíg a fogadó gép nyugtázza a vételt, illetve általános adásnál elképzelhető, hogy valamelyik fogadó gép egyszerűen lemarad az adásról, mert ép mással van elfoglalva. Ezen lehetőségek elkerülésére az Enterprise operációs rendszere a hálózat kezelésére megszakításos rendszert alkalmaz, amely azt jelenti, hogy a számítógépek a használó számára nem látható időben társalognak egymással.
A kivételes esetek (ld. 7. fejezet) kezelésével a BASIC is nyújt lehetőséget arra, hogy ilyen műveletekkel foglalkozhassunk. Ha ezt a futó BASIC programunkban a SET INTERRUPT NET ON utasítással engedélyeztük, akkor a hálózatról érkező üzenet programunkban kivételes esetet okoz, melyet a megfelelően elkészített kezelővel feldolgozhatunk.
Ha kettőnél több gép kommunikál egymással - vagyis egyszerre gépenként egynél több csatorna van nyitva a hálózatkezelőnek-, nem egyértelmű melyik gép kíván küldeni. Ilyen esetben a kezelőben végig kell kérdeznünk a csatornákat az

ASK NET CHANNEL változó

utasítással, hogy tartalmaznak-e adatokat. Az utasítás hatására változó értéke annak a csatornának a száma lesz, amelyiken a pufferben levő olvasásra váró adat érkezett. Mivel egyszerre több csatorna is tartalmazhat adatokat, az ASK NET CHANNEL utasítást mindaddig meg kell ismételni az adatok továbbítását követően, míg az a 255-ös értékkel nem tér vissza, jelezve, hogy nincs több begyűjtésre váró adatcsomag. A SET INTERRUPT NET ON utasításnak a kezelőből való kilépés előtti utolsó utasításnak kell lennie.
A kivételes esetek kezelését programvezérelt megszakítások vezérlik, így ezek csak futó program esetén hatásosak, közvetlen parancsok végrehajtásakor nem.

9. A Minimal BASIC
A BASIC nyelv népszerűsége a mikroszámítógépek megjelenésével együtt megnőtt, és általában eltérő tulajdonságú BASIC-változatokat készítettek a különböző mikroszámítógépekhez. Ez részben azzal magyarázható, hogy a gyártók olyan BASIC-változatot adnak gépükhöz, amely a gép lehetőségeit a legjobban kihasználja. A főbb eltérések a géptípus hardver tulajdonságaiból fakadnak.
A nyelv egyes változatai közötti átjárhatóságot a BASIC nyelv legszűkebb - Minimal BASIC néven ismert változata - biztosítja. Ez a változat értelemszerűen nem tartalmazhat semmilyen hardware-specifikus szolgáltatást (pl. grafikai- hangkeltő utasítások), így csak a legegyszerűbb programozási feladatokra ad átjárható megoldást. Az átjárhatóságért számos kompromisszummal kell fizetnünk: nem támogatja a strukturált programozást (így az adatok elszigetelésének elvét sem), alprogramok szervezésére egyedül a szubrutin használható, ciklusszervezésre csak a FOR-NEXT utasításpár használható, a feltétel nélküli vezérlésátadás használata így elkerülhetetlen. A Minimal BASIC alábbi feltételeinek az IS-BASIC megfelel:

A Minimal BASIC-ben használható kulcsszavak: DATA, DEF, DIM, END, FOR, GOSUB, GOTO, IF, INPUT, LET, NEXT, ON, PRINT, RANDOMIZE, READ, REM, RESTORE, RETURN, STEP, STOP, THEN, TO

Használható függvények: ABS, ATN, COS, EXP, INT, LOG, RND, SGN, SIN, SQR, TAB, TAN.

A következőkben részletesen foglalkozunk a Minimal BASIC azon lehetőségeivel, melyek használata nem javasolt strukturált programozási nyelvekben, így az IS-BASIC-ben sem.

9.1. A GOTO utasítás
Feltétel nélküli vezérlésátadó utasítás. A GOTO utasítás segítségével lehet elérni, hogy a program a sorrendben következő helyett a GOTO utasítás tárgyában megadott sorszámú utasításra ugorjon, és onnan folytassa a végrehajtást. Az utasítás felépítése a következő:

GOTO sorszám

Amikor a program a végrehajtáskor eléri az utasítást, akkor a GOTO utasítás végrehajtásának eredményeként nem a következő legalacsonyabb sorszámú utasítás hajtódik végre, hanem a vezérlés átkerül a GOTO utasítás tárgyában megadott sorszámú utasításra. A GOTO tehát a programon belül ugrást hajt végre. Az a sorszám, ahová a program ugrik, lehet kisebb, mint a GOTO sorszáma (ekkor ismétlést hajt végre a program), vagy lehet nagyobb is (valamilyen utasítássorozat átugrása).
A GOTO utasítást többnyire IF-THEN szerkezetben alkalmazzuk, ciklusszervezésre, vagy egymás utáni IF utasításokkal feltételes elágaztatásra.

A GOTO utasítást csak abban az utasításblokkban ajánlott használni, amelyben a GOTO is van. Bár az utasításblokkokból (pl. FOR-NEXT, DO-LOOP, DEF-END DEF blokkokból) való kiugrás általában tiltott, IS-BASIC-ben nem okoz hibát, mert az utasítás a vermet is rendbe rakja maga után. Utasításblokkba kívülről "beugorni" nem lehet.

9.2. A szubrutinok
Ha ugyanazt a tevékenységet a program különböző pontjain kell elvégezni, az IS-BASIC-ben eljárásokat használhatunk, mely a paraméterátadást is lehetővé teszi. A BASIC implementációk többségében eljárások definiálására nincs lehetőség, a programozóban azonban jogosan merül fel az az igény, hogy egy ismétlődő modult csak egyszer kelljen kódolni, és a megfelelő helyekről - ahol végre kell hajtani - hívni lehessen. A Minimal BASIC-ben ennek megoldására csak szubrutinokat használhatunk.
Egy programban több szubrutin is lehet, és valamennyi többször is hívható a programon belül. A szubrutint csak egyszer kell kódolni, és több helyről lehet hívni. A szubrutin kezdetét semmilyen szubrutinnyitó utasítás nem jelzi, így a program olvasója sem veszi észre egy utasításról, hogy az szubrutinkezdés-e vagy sem. A szubrutin kezdő utasítását csak sorszáma alapján határozhatjuk meg, mert hívásakor a hívó utasításban (lásd később) a szubrutin kezdő utasításának sorszámát kell megadni. Gyakori hiba, hogy a főprogram - nem megfelelő programszervezés miatt egy szubrutin kezdetére fut. Ez hibás működést eredményez, ezért a Minimal BASIC-ben az END kulcsszó használata elengedhetetlen.
A programnak azon a pontján, ahol egy szubrutint végre kell hajtani,

GOSUB sorszám

szubrutinhívó utasítást adunk meg.
A GOSUB utasításkulcsszó jelöli a szubrutin hívását. Az utasítás tárgyában levő szám azt a sorszámot jelöli, ahol a szubrutin kezdődik (ebből a sorszámból lehet megtudni a program tanulmányozásakor, hogy melyik sornál kezdődik a szubrutin). Az utasítás hatására a vezérlés átkerül a megadott sorszámra. Ezután a hívott szubrutin végrehajtódik. A szubrutint minden esetben RETURN utasítással kell befejezni. Amikor a program eljut a szubrutin végét jelölő RETURN utasításhoz, akkor a szubrutin befejeződik, és a vezérlés visszakerül a hívó GOSUB utasítást követő utasításra. A program végrehajtása ezután az ún. főágban folytatódik.
Láthatjuk, hogy a szubrutinhívást a GOSUB utasítás valósítja meg, a visszatérés a főágra pedig a RETURN utasítás hatására megy végbe. Ha a programvégrehajtás egy RETURN utasításra ér, anélkül, hogy korábban GOSUB utasítás szerepelt volna a programban, a programfutás 10002 sorszámú (RETURN without GOSUB) hibával leáll.
A Minimal BASIC-ben valamennyi változó globális változó, hatókörük a teljes programra kiterjed. A "paraméterátadás" ebben az esetben csak - a szubrutin meghívása előtt - a megfelelő változók értékének beállításával lehetséges.
Az alprogram önmagát is többször akár 14720 alkalommal is meghívatja. Ez a meghívási mélység csak a szabad memóriaterület nagyságától függ. Nyilván ilyen meghívás sorozatot nem végzünk, de egy kvázi rekurzió kedvéért többször is felhasználhatja a szubrutin saját magát.

9.3. Többirányú elágazás
Többirányú elágazást hozhatunk létre az ON kulcsszóval, mely akár a GOTO akár a GUSUB utasítással együtt használható. Alakja:

ON kifejezés GOTO sorszámlista

vagy

ON kifejezés GOSUB sorszámlista

Az utasítás először kiszámítja a kifejezés értékét és egésszé alakítja át. Ha a kifejezés értéke N akkor a sorszámlistából az N-edik sorszámot véve ott folytatja a programot (a számlálás 1-től kezdődik). GOSUB-bal használva a megfelelő sorszámon kezdődő szubrutinra kerül a végrehajtás. Ha a listában nincs N-edik elem, akkor az utasításnak nincs hatása.

9.4. Tömbök létrehozása, a DIM kifejezés
Mivel az egyszerűbb BASIC-ekben nincsenek eljárások és így lokális változók sem, nincs szükség változó-deklaráló utasításokra (NUMERIC, STRING) sem. A 2.4. fejezetben megismert NUMERIC és STRING utasítások helyett Minimal Basic-ben csak a DIM utasítás használható tömbváltozók deklarálására. A DIM kulcsszóval 1 vagy kétdimenziós, szám és karakterfüzér típusú változókat is létrehozhatunk, kevésbé rugalmas módon. Alakja:

DIM tömblista

A változólistában csak a felső indexhatár megjelölése megengedett, az alsó indexhatár minden esetbe 0. Pl a DIM SZAM(10) egy 11 elemű tömböt hoz létre. A karakterláncok hossza nem adható meg, hanem alapértelmezés szerint 132 karakter lesz.
IS-BASIC-ben megengedett az alsó indexhatár megjelölése is a TO kulcsszóval, de ez nem szabványos lehetőség! Az alábbi példa 10 elemű tömböt hoz létre:

DIM SZAM(1 TO 10)

10. Videolapok kezelése
Az operációs rendszer videokezelője végzi az összes videolap megjelenítését a különböző kijelzési üzemmódokban úgy, hogy ennek során felhasználja a NICK chip lehetőségeinek nagyrészét. A megjelenítés kezelése az ún. videolapokon történik úgy, hogy egy lap megfelel egy, a videokezelő számára megnyitott csatornának. Ebben a fejezetben a BASIC-ből elérhető lehetőségekkel foglalkozunk.

10.1. Videolapok megnyitása
Ahhoz, hogy valamit megjelenítsünk a képernyőn, először egy videolapot kell nyitnunk. A BASIC-rendszer automatikusan megnyit egy 40x24 karakteres szöveges képernyőt a 102. csatornán, alapértelmezés szerint a BASIC rendszer és a futó programok ezt a csatornát használják kijelzésre. Ez a szöveges lap nem alkalmas grafikai műveletek megjelenítésére, ehhez egy másik, - erre alkalmas - videolapot kell nyitnunk. A BASIC rendszer a következő típusú videolapokat kezeli:

A kis- és nagyfelbontású grafikus lapok 2, 4, 16 vagy 256 színüzemmódúak lehetnek. A színek számának növelésével a grafikus lap felbontása csökken.
A kisfelbontású videolapon a vízszintes felbontás feleakkora, minta a nagyfelbontású videolapon, de memóriaigénye is értelemszerűen feleakkora.

Egy videolap megnyitásának általános esete:

  1. A megnyitandó videolap paramétereinek beállítása (típus, színmód, vízszintes-, függőleges méret),
  2. A videolap megnyitása.

A videolap típusát a VIDEO MODE gépi feltétel, vagy közvetlenül a 22. rendszerváltozó beállításával lehet. Ennek alakja:

SET VIDEO MODE kifejezés

vagy

SET 22,kifejezés

A kifejezés lehetséges értékei a következők:

0 - 40 oszlopos szöveglap (2 színpár);
1 - nagyfelbontású grafikus lap;
2 - 80 oszlopos szöveglap (4 színpár);
5 - kisfelbontású grafikus lap;
15 - attribútum típusú grafikus lap.

Az attribútum-típusú videolapon minden színcellának (8 pont széles és 1 pont magas) egy-egy tinta-, ill. papírszín adható meg. Ez az üzemmód 16 színű palettával ugyanazt a felbontást adja, mint a négyszínes HIRES grafika.
A színüzemmódot a VIDEO COLOUR gépi feltétel, vagy közvetlenül a 23. rendszerváltozó beállításával lehet. Ennek alakja:

SET VIDEO COLOUR kifejezés

vagy

SET VIDEO COLOR kifejezés

vagy

SET 23,kifejezés

A kifejezés lehetséges értékei a következők:

0 - 2 szín,
1 - 4 szín,
2 - 16 szín,
3 - 256 szín.

Minden más érték modulo 4 szerint redukálódik, ezért hiba nem keletkezik.
A 40 karakteres képernyő (SET VIDEO MODE 0) 2 színes módban (SET VIDEO COLOUR 0) ad olvasható eredményt, a színek számának növelésével a karakterek felbontása feleződik, így olvashatatlanok lesznek a karakterek. Saját karakterkészlet definiálásával viszont ezen módokban is látványos eredményt kaphatunk.
Az attribútum grafika módot a 2 szín móddal (0. mód) kell használni, noha 16 szín fog ténylegesen rendelkezésre állni a videolapon. Megjegyzendő, hogy lehet kisebb felbontású attribútum típusú videólapot is definiálni (1., 2. videomód), bár ez nyilvánvalóan értelmetlen.
A grafikai műveletek elvégzésének (pl. vonal-, körrajzolás) ideje természetesen függ az alkalmazott felbontástól, de nem függ a használt színek számától. Azonos színmélység mellet a kisfelbontású (LORES) videolapokon gyorsabban hajtódnak végre a grafikai utasítások, és pl. egy 4 színű nagyfelbontású videólapon is gyorsabbak ezek a műveletek, mint egy 2 színű nagyfelbontású videólapon.

A videolap vízszintes méretét a VIDEO X gépi feltétel (24. rendszerváltozó), függőleges méretét a VIDEO Y (25. rendszerváltozó) adja meg karakterekben. Alakja:

SET VIDEO X kifejezés
SET VIDEO Y kifejezés

vagy

SET 24,kifejezés
SET 25,kifejezés

A videolap vízszintes mérete 2-42 karakter között adható meg,a függőleges méret 1-255 karakter között. Függőlegesen maximum 27 sor jeleníthető meg a képernyőn, vagyis egy videolap magasabb lehet, mint amennyi egyszerre látható belőle.
A következő példa egy nagyfelbontású, 4 színű, 42x27 karakter méretű grafikus lapot nyit meg:

110 SET VIDEO MODE 1: SET VIDEO COLOUR 1
120 SET VIDEO X 42: SET VIDEO Y 27
130 OPEN £101:"video:"

Az egyszerre megnyitható videolapok számát csak a rendelkezésre álló videomemória korlátozza (ez lehetőséget ad pár "képkockából" álló animációk készítésére).
Egy videolap megnyitása előtt bármely paraméter beállítása elhagyható, mert mind a négy paraméternek van alapértelmezése (40x20 méretű, 4 színű HIRES mód) és a rendszer megjegyzi a legutóbb alkalmazott beállításokat. Tovább egyszerűsíti a helyzetet, a BASIC-rendszer más utasításokkal is segíti a videolapok gyors megnyitását:

TEXT kifejezés

Az utasítás bezárja a korábban esetleg megnyitott 101-es és 102-es videolapokat, és az alapértelmezett 102-es csatornán újra megnyit egy 40x24 karakter méretű szöveges lapot (valamint a 0. EDITOR csatornát) és megjeleníti azt. A kifejezés értéke 40 vagy 80 lehet, ennek megfelelően 40, vagy 80 oszlopos szöveges lapot nyit. Ha a kifejezés elmarad, az utoljára érvényes beállítással nyitja meg a videolapot.
Az éppen aktuális állapotot mi is le tudjuk kérdezni: az 526 (decimális) memóriacímen tárolja a rendszer a TEXT üzemmód jelző byte-ját: 0 = 40 karakteres üzemmód, 2 = 80 karakteres üzemmód.

A GRAPHICS parancs lezárja az esetleg korábban megnyitott 101. videolapot és 102. szöveges lapot, majd az alapértelmezés szerinti 101. csatornán egy 40x20 kararakter méretú grafikus lapot, és a 102-es csatornán egy 40x4 karakter méretű szöveges lapot nyit meg újra. Ezután a képernyő felső részén megjeleníti a grafikus lapot, alatta a szöveges lapot.

GRAPHICS videomód kifejezés

A videomód HIRES, LORES vagy ATTRIBUTE lehet, a megnyitandó grafikus lap ennek megfelelő típusú lesz. A kifejezés értéke a színmódot állítja be, értéke 2, 4, 16 vagy 256 lehet. Mind a videomód, mind a színmód megadása elmaradhat, ebben az esetben az utolsó érvényes beállításokkal nyitja meg a grafikus lapot. (Az alapértelmezés HIRES felbontás 4 színnel.) Az ATTRIBUTE videomód megadása esetén a színmód megadása értelmetlen, de hibát nem okoz a kifejezés megadása.
A szöveges lap típusa az utolsó érvényes beállításnak megfelelően 40 vagy 80 karakteres marad.

A GRAPHICS utasítással megnyitható 40x20 karakter méretű videolapokon az alkalmazott színüzemmódtól fügően az alábbi felbontások érhetők el:

GRAPHICS HIRES 2 - 640 x 180
GRAPHICS HIRES 4 - 320 x 180
GRAPHICS HIRES 16 - 160 x 180
GRAPHICS HIRES 256 - 80 x 180
GRAPHICS LORES 2 - 320 x 180
GRAPHICS LORES 4 - 160 x 180
GRAPHICS LORES 16 - 80 x 180
GRAPHICS LORES 256 - 40 x 180
ATTRIBUTE - 320 x 180

A fizikai felbontás természetesen nem csak a videó- és színüzemmódtól függ, hanem a videolap méretétől is. A függőleges minden esetben 9 pixel / karakter, a vízszintes felbontás HIRES videómodban a következőképp számítandó:

GRAPHICS HIRES 2 16 pixel / karakter
GRAPHICS HIRES 4 8 pixel / karakter
GRAPHICS HIRES 16 4 pixel / karakter
GRAPHICS HIRES 256 2 pixel / karakter

LORES üzemmód a felbontás értelemszerűen feleekkora.

10.2. EDITOR csatorna megnyitása
Az EDITOR csatorna megnyitásának általános lépései:

Az alábbi példaprogram létrehozza a TEXT(vízszintes-méret,függőleges-méret) nevű eljárást, mely az alapértelmezett 102. csatornát újra megnyitja az eljárás paramétereként megadott méretben. A vízszintes méret max. 82 karakter lehet.

110 DEF TEXT(XS,YS)
120   LET YS=MIN(YS,27):LET XSIZE=MIN(XS,82)
130   IF XS>42 THEN
140     LET XS=XS/2:LET M=2
150   ELSE
160     LET M=0
170   END IF
180   SET VIDEO X XS:SET VIDEO Y YS
190   SET VIDEO MODE M:SET VIDEO COLOR 0
200   CLOSE £102:CLOSE £0
210   OPEN £102:"video:"
220   DISPLAY £102:AT 1 FROM 1 TO YS
230   SET EDITOR BUFFER 32:SET EDITOR VIDEO 102
240   OPEN £0:"editor:"
250   SET FKEY 5 "CLEAR SCREEN"&CHR$(13)
260 END DEF

10.3. A videolapok megjelenítése
A videolapok megnyitásuk után nem jelennek meg a képernyőn automatikusan (ettől függetlenül bármilyen grafikai művelet végezhető rajtuk), ezt a kívánt időpontban nekünk kell megtennünk. Erre szolgál a DISPLAY utasítás. Alakja:

DISPLAY £csatorna:AT kifejezés1 FROM kifejezés2 TO kifejezés3

Az utasítás a megadott csatornaszámú grafikus lapot, vagy egy részét megjeleníti a képernyő kifejezés1. sorától. A megjelenített terület a videolap kifejezés2. sorától a kifejezés3. soráig terjed. A videolapokat csak függőlegesen pozícionálhatjuk, vízszintesen a videokezelő középre pozícionálja azokat. Az egymás után megjelenítendő videolapok részben vagy teljes egészében eltakarhatják egymást.
Az előző alfejezetben példaként megnyitott 42x27 karakter méretű videolapot az alábbi utasítással tudjuk megjeleníteni teljes egészében:

140 DISPLAY £101:AT 1 FROM 1 TO 27

Egy már megjelenített videolapot el is távolíthatunk a képernyőről, a DISPLAY paranccsal, ha a kifejezés2 értéke nulla:

DISPLAY £csatorna:AT x FROM 0 TO y

az x sortól kezdve y+1 sort leszed a képernyőről, keret marad a helyén. (Tehát ha FROM 0 TO 0 akkor 1 sort, ha FROM 0 TO 1 akkor 2 sort, stb.)

A DISPLAY TEXT az alapértelmezett 102-es szöveges lapot jeleníti meg, anélkül, hogy törölné annak korábbi tartalmát. Ez akkor lehet hasznos, ha több kisebb-nagyobb videolap eltakarja.

A DISPLAY GRAPHICS utasítás megjeleníti az alapértelmezett 101. grafikus lapot. Ha az nincs nyitva, megnyitja előbb, de ilyen esetben a 102. szöveges videolap 40x24-es méretű mard, tehát csak az alsó négy sora látszik ki a grafikus lap alól.

Ha szöveges videolapot nyitunk editor csatorna nélkül, zavaró lehet, hogy a kurzor alapértelmezés szerint látszik a mindenkori kurzorpozícióban. A kurzor kikapcsolására nincs BASIC utasítás (a SET £csatorna:CURSOR OFF hatástalan), de a megfelelő escape-szekvenciával van lehetőség a kurzor ki-bekapcsolására:

PRINT £csatorna:CHR$(27);"o"

A kurzorkijelzést a

PRINT £csatorna:CHR$(27);"O"

utasítással kapcsolhatjuk vissza.

10.4. A videolapok törlése, lezárása
Tetszőleges videolap tartalmát törölhetjük a

CLEAR £csatorna

utasítással, függetlenül attól, hogy a videolap éppen látszik-e a képernyőn, vagy sem.
A CLEAR TEXT utasítás törli a 102. szöveges lap tartalmát, a CLEAR GRAPHICS a 101. grafikus lap tartalmát. A CLEAR SCREEN törli mind a 101. grafikus-, mind a 102, szöveges videocsatornát (nem okoz hibát, ha valamelyik éppen nincs megnyitva). A többi megnyitott videolap tartalmát változatlanul hagyja.

A már nem használt videolapokat javasolt lezárni, felszabadítva ezzel a grafikus lap részére lefoglalt memóriát. Ezt a 8.1. fejezetben megismert

CLOSE £csat

utasítással tehetjük meg. Mivel az operációs rendszer minden nyitott csatorna lezárása után "rendbe rakja" a memóriát, a videolapok lezárása gyorsabb, ha fordított sorrendben történik, mint a megnyitásuk. (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.)
Tehát pl. ha egy animációhoz az alábbi ciklussal nyitottunk meg videocsatornákat:

200 FOR I=1 TO 10
210   OPEN £I:"video:"
220 NEXT

A lezárás az alábbi sorrendben hatékonyabb:

200 FOR I=10 TO 1 STEP -1
210   CLOSE £I:"video:"
220 NEXT

10.5. Koordináta rendszerek
Grafikus videolapokon másfajta koordinátarendszerrel határozzuk meg egy pont helyét, mint karakteres képernyőn: a síkbeli Descartes-féle koordináta-rendszerben egy P pont helyzetét az X-Y síkon az (x,y) rendezett számpárral (koordináta-kettős) adjuk meg. A két tengely metszéspontja a koordináta-rendszer kezdőpontja, az origó. A megállapodás szerinti első x koordináta az abszcissza, a második y koordináta az ordináta. Az origó (0,0 koordinátájú pont) a képernyő bal alsó sarkában van, tehát negatív számokat nem használhatunk: először a vízszintes (X), majd vesszővel elválasztva a függőleges (Y) koordinátát kell megadni nem negatív számmal (a rajzoló utasítások a nem egész számokat kerekítik, azok használata nem okoz hibát), vagy ilyen értéket képviselő kifejezéssel. Hibát eredményez, ha a megadott koordináta a videolap méretén kívül esik. A videolapokon alkalmazott koordinátarendszert nem befolyásolja annak felbontása: azonos méretű, de eltérő felbontású videolapokon a jobb felső sarok koordinátája minden esetben ugyanaz. Ez azért előnyös, mert rajzoló rutinjainkat egyetlen koordinátarendszerhez kell elkészíteni, mely ezután tetszőleges felbontású videólapon ugyanúgy működik (persze kisebb vagy nagyobb felbontásban látjuk az eredményt).
A GRAPHICS utasítással megnyitható 40x20 karakter méretű videolapokon a jobb felső sarok koordinátája - a tényleges fizikai felbontástól függetlenül - 1279,719, tehát az ilyen méretű grafikus videolap vízszintesen 1280, függőlegesen 720 pontra van felosztva. Ez azt jelenti, hogy egy fizikai képpontot több különböző logikai koordináta is meghatároz. Pl. 4 színű HIRES felbontású grafikus lapon a 640,360 logikai koordináta ugyanaz a pontot (a lap közepét) jelöli ki, mint a 643,362 logikai koordináta.
A különböző méretű videolapokhoz tartozó maximális koordinátákat a következőképen lehet kiszámítani:

Vagyis egy teljes képernyő (42x27 karakter) méretű grafikai lap magassága 972, szélessége pedig 1344 képpont. Ez a maximális vízszintes felbontás kétszeresének és a függőleges irányú felbontás négyszeresének felel meg. 9216-os sorszámú hibát okoz (INVALID BEAM POSITION), ha rajzoló műveletekben a videolap méretén kívüli területre hivatkozunk.
A grafikus lapokon használható az 5.1. fejezetben megismert szöveges lapokon használható koordinátarendszer is, ha a PRINT AT utasítással írunk grafikus videolapra. A grafikus lap felbontása meghatározza a kiírt karakterek méretét, ennek megfelelően változik az AT kulcsszóval megadható maximális koordináta (jobb-alsó sarok). Az alapértelmezett 40x24 karakter méretű videolapon a karakterpozíciók száma:

 
HIRES
LORES
2 színnel:
20x80
20x40
4 színnel:
20x40
20x20
16 színnel:
10x20
10x10
256 színnel:
10x10
10x5

Ha grafikus lapra írunk, a sor végénél a szövegkurzor a következő sor elejére ugrik, de nincs szóátvitel (hiszen azt az EDITOR eszköz biztosítja szöveges lapon). A lap végéről a kurzor visszamegy a lap bal felső sarkába - görgetés nincs.
Bár az operációs rendszer támogatja a kurzor és a rajzolósugár pozíciójának lekérdezését, a BASIC-ben ezek a funkciók nincsenek megvalósítva, nekünk kell az eljárásokat elkészíteni. A kurzorpozíció olvasása szöveges- és attribútum (ld. később) típusú videolapokon működik:

9000 DEF CURXY(CH,REF X,REF Y)
9010   PRINT £CH:CHR$(27);"?";
9020   GET £CH:Y$:GET £CH:X$
9030   LET Y=ORD(Y$)-32
9040   LET X=ORD(X$)-32
9050 END DEF

A sugárpozíció lekérdezése értelemszerűen csak grafikus (beleértve az attribútum típusút is) videolapokon lehetséges:

9100 DEF GRXY(CH,REF X,REF Y)
9110   PRINT £CH:CHR$(27);"@";
9120   GET £CH:XL$:GET £CH:XH$
9130   GET £CH:YL$:GET £CH:YH$
9140   LET X=ORD(XL$)+256*ORD(XH$)
9150   LET Y=ORD(YL$)+256*ORD(YH$)
9160 END DEF

CH mindkét esetben a lekérdezni kívánt csatorna számát tartalmazza.

11. Grafikai utasítások
Az operációs rendszer pontok, vonalak, ellipszisek rajzolását, zárt alakzatok kitöltését teszi lehetővé. Valamennyi rajzoló utasítás egy rajzolósugarat mozgat a képernyőn, miközben a rajzolósugarat új pozícióba mozgatjuk, vagy "nyomot hagy a képernyőn", vagy nem. Valamennyi rajzoló műveletet az igen sokoldalúan használható PLOT kulcsszó vezeti be.

11.1. Pontok, vonalak, ellipszisek

A PLOT utasítás legegyszerűbb alakja pontok, vonalak rajzolását teszi lehetővé:

PLOT £csatorna:pontlista

A PLOT utasítás alapértelmezés szerint a 101. csatornát használja, minden más esetben meg kell adni a csatornahivatkozást.
A pontlistát egy vagy több, számpár (vagy kifejezés) alkotja, melyek egy pont koordinátarendszerben elfoglalt helyét jelöli ki. A számpárok tagjait vessző választja el egymástól. A pontlista elemeit vessző, pontosvessző vagy szóköz választja el egymástól. Ha egy számpár után szóköz vagy pontosvessző áll, a rajzolósugár pontot rajzol a kijelölt pozícióba és bekapcsolva marad, azaz a rajzolósugár újabb elmozdításával vonalat húzunk a rajzolósugár előző és új pozíciója között. Ha a számpár után vessző áll, a rajzolósugár arrébb mozdul anélkül, hogy a rajzolósugár nyomot hagyna a képernyőn. A videolap megnyitása után a rajzolósugár alapértelmezés kikapcsolt állapotban van. Pl. az alábbi utasítás egy háromszöget rajzol:

PLOT X1,Y1;X2,Y2;X3,Y3;X1,Y1

Ezzel egyenértékű - bár nehezebben olvasható - az alábbi forma:

PLOT X1,Y1 X2,Y2 X3,Y3 X1,Y1

vagy

PLOT X1,Y1;X2,Y2;
PLOT X3,Y3;X1,Y1

Mivel a pontlista hosszát csak a BASIC programsor maximális hosszára vonatkozó megkötés korlátozza, az elválasztó karakterek megfelelő használatával egyetlen PLOT utasítással akár több vonalat is húzhatunk, pl. az alábbi utasítással kettőt (X1,Y1 és X2,Y2, valamint X3,Y3 és X4,Y4 között):

PLOT X1,Y1;X2,Y2,X3,Y3;X4,Y4

Ezt a példa egyenértékű az alább alakkal:

PLOT X1,Y1;X2,Y2
PLOT X3,Y3;X4,Y4

Ha a pontlista egyetlen számpárból áll, pontot rajzolhatunk:

PLOT X1,Y1

A PLOT utasítással nincs lehetőségünk a sugárpozíció aktuális pozíciójától számított relatív koordináták megadására. Bár az EXOS támogatja ezt a funkciót (a teknőcgrafikus utasítások használják ezt a funkciót), a BASIC-ben nincs implementálva. Ezt a hiányosságot azonban könnyen pótolhatjuk:

DEF PLOTREL(CH,X,Y)
  PRINT £CH:CHR$(27)&"R"&WORD$(X)&WORD$(Y)
END DEF

Az eljárás a ch csatornaszámú grafikus videólapon az aktuális pozícióból az x és y távolságba mozgatja a rajzolósugarat. Azaz x és y relatív koordináták, így negatív értéket is felvehetnek. Ha a rajzolósugarat bekapcsolt állapotban hagyjuk, vonalat húzunk az előző rajzolósugár pozícióból.

A pontlistába írt ELLIPSE kulcsszó segítségével kört vagy ellipszist rajzolhatunk úgy, hogy a rajzolósugár pillanatnyi pozíciója lesz a kör / ellipszis középpontja. Alakja:

PLOT ELLIPSE kif1,kif2

Ahol kif1 a vízszintes, kif2 a függőleges tengelyre mért sugarat adja meg. Ha kif1 = kif2, akkor kört rajzol, egyéb esetben ellipszist.
A rajzolósugár pozíciója a kör / ellipszis megrajzolása után változatlan marad, ezért, ha a körrajzoló utasítás végére nem rakunk vesszőt, a középpontban pont jelenik meg a kör megrajzolása után. Pl:

PLOT 640,360,ELLIPSE 600,300,

A kör középpontjának természetesen a videolapra kell esnie, de az megengedett, hogy a kör bárhól kilógjon a videolapról.
Mivel a pontlista az ELLIPSE kulcsszó után is folytatódhat, sőt, egy PLOT utasításban többször is szerepelhet az ELLIPSE kulcsszó, egyetlen PLOT utasítással több ellipszist és/vagy vonalat is rajzolhatunk:

PLOT 0,120;1279,120,0,132;1279,132,200,360,300,360,ELLIPSE 100,100,400,200;800,200;600,600;400,200,900,360,ELLIPSE 100,100,

A PAINT utasítás az aktuális tintaszínnel kitölt egy zárt alakzatot, a rajzolósugár aktuális pozíciójából indulva. A zárt alakzatot valamely tintaszínnel rajzolt folyamatos vonal (ide értve a körívet is) vagy a videolap széle kell, hogy határolja. Pl:

PLOT 640,360,ELLIPSE 600,300,PAINT

Hatástalan viszont az alábbi megoldás:

PLOT 640,360,ELLIPSE 600,300
PLOT PAINT

mert az ellipszis megrajzolása után a kör középpontjába egy pont kerül (hiányzik az ELLIPSE után a vessző, ami ezt megakadályozná), így a PAINT utasítás rögtön végez az egy pontból álló "zárt alakzat" kitöltésével.

Szaggatott vonalak rajzolását teszi lehetővé a LINE STYLE videofeltétel:

SET £csatorna:LINE STYLE kifejezés

14-féle minta közül választhatunk, így a kifejezés értéke 1-14 közé eshet. Nem okoz hibát, ha a kifejezés értéke 0 és 255 közé esik, de egyéb esetben az alapértelmezett 1-es mód állítódik be. A LINE STYLE feltételnek csak vonalrajzolásra van hatása, ellipszisrajzolásra nincs. Az alapértelmezett csatorna a 101-es.
Az alábbi program bemutatja a vonaltípusokat:

100 PROGRAM "Linest.bas"
110 GRAPHICS HIRES 4
120 SET PALETTE 0,YELLOW,WHITE
130 FOR I=1 TO 14
140   SET INK 1
150   PLOT 0,I*50,:PRINT £101:I
160   SET LINE STYLE I
170   SET INK 2
180   PLOT 112,I*50-12;1279,I*50-12
190 NEXT

A LINE MODE videofeltétel az előzőleg felrajzolt és az új képernyősorok színeinek egymásra hatását adja meg. Alakja:

SET £csatorna:LINE MODE kifejezés

Nullás módban (alapértelmezés) az új sorok színei felülírják a régieket, a többi módban viszont a kettő kombinációja alakul ki a következők szerint:

11.2. Teknőcgrafika
A teknőcgrafikus utasításokkal a sugárpozíció aktuális pozíciójából számított relatív elmozdításával rajzolhatunk. Eközben a sugárpozíciót előre-hátra mozdíthatjuk, vagy annak irányát fordíthatjuk el jobbra-balra. Természetesen a teknőcgrafikus utasításokat is a PLOT után kell alkalmazni: a pontlistában vegyesen szerepelhetnek ezen utasítások, a pontlista további elemei között:

FORWARD kifejezés A rajzolósugár az aktuális irányba a kifejezés értékének megfelelő (koordinátarendszerbeli) pozíciót halad előre.
BACK kifejezés A rajzolósugár hátrafelé halad a kifejezés értékének megfelelő (koordinátarendszerbeli) pozíciót.
LEFT kifejezés
A rajzolósugár iránya az aktuális iránytól a kifejezés értékének megfelelő szöggel balra fordul, anélkül, hogy közben pozíciója megváltozna. A szögmértékegység az OPTION ANGLE gépi feltételnek (ld. 3.3 fejezet) megfelelően radián vagy fok.
RIGHT kifejezés A rajzolósugár iránya az aktuális iránytól a kifejezés értékének megfelelő szöggel jobbra fordul, anélkül, hogy közben pozíciója megváltozna.
ANGLE kifejezés
A rajzolósugarat a kifejezés által meghatározott irányba állítja. A 0 fok a képernyő jobb széle felé mutat, a 90 fok (PI/2) felfelé, a 180 fok (PI) balra mutat. A BASIC indulása utáni alapértelmezés szerint a rajzolósugár 90 fokba (felfelé) néz.

A kifejezéseket nem kell kerekíteni, tizedes értékek sem okoznak hibát.
Példaprogram:

100 PROGRAM "Spiral.bas"
110 GRAPHICS HIRES 2
120 OPTION ANGLE DEGREES
130 PLOT 640,360;ANGLE 0;
140 FOR I=4 TO 534 STEP 6
150   PLOT FORWARD I;RIGHT 90.8;
160 NEXT

A teknős grafikával látványosan és igen egyszerű rövid programmal rajzolhatunk meg olyan idomokat, alakzatokat, melynek felrajzolásához valamilyen szabályszerűség szükséges (pl. sokszögek, fraktálok). Az alábbi eljárással szabályos sokszögeket rajzolhatunk, ahol n az élek és csúcsok száma, r a köréírt kör sugara. A rajzolósugár az eljárás lefutása előtt a sokszög középpontját adja meg, és ide is kerül vissza.

DEF POLY(R,N)
  PLOT ANGLE 90,FORWARD R,ANGLE 360-180/N;
  LET A=2*R*SIN(180/N)
  FOR I=1 TO N
    PLOT FORWARD A;RIGHT 360/N;
  NEXT
  PLOT ANGLE 270,FORWARD R,
END DEF

11.3. Színek használata
Az Enterprise összesen 256 színt képes előállítani. Azonban egyedül a 256 színes üzemmódban szerepelhet egyszerre ennyi szín egy BASIC programmal előállított videolapon, a többi üzemmódban (ide értve a karakteres videolapokat is) ennél kevesebb színt válogathatunk össze egy, az adott videolaphoz tartozó ún. színpalettára. A színpaletta 8 színt tartalmaz, tehát a 16 színű üzemmódban a fennmaradó 8 színt másképp lehet beállítani (BIAS). Kettő és négy színű üzemmódokban értelemszerűen csak a paletta első kettő vagy négy színét van értelme beállítani. Az egyes színekre 0 és 255 közé eső azonosítószámmal hivatkozhatunk:

A színek kiválasztásának másik módja az RGB függvény, mellyel a 3 alapszínből, a piros (RED), zöld (GREEN) és kék (BLUE) keverhetjük ki a kívánt színt. Ennek megfelelően az RGB függvénynek három paramétere van:

RGB(kif1,kif2,kif3)

ahol kif1 a piros, kif2 a zöld, kif3 a kék szín arányát adják meg a maximumhoz képest. Vagyis a három kifejezés értéke nulla és egy közé eshet (beleértve a nullát és az egyet). A színkódot egy byte (8 bit) határozza meg, a három alapszínre így 3 + 3 + 2 bit jut. Ezért az Enterprise 8 árnyalatot tud megkülönböztetni a vörös és a zöld színből és négyet a kékből. Az RGB függvény a

G0*128 + R0*64 + B0*32 + G1*16 + R1*8 + B1*4 + G2*2 + R2

kifejezéssel számol.
8 színre nevükkel is hivatkozhatunk:

BLACK fekete = 0 = RGB(0,0,0)
RED piros = 73 = RGB(1,0,0)
GREEN zöld = 146 = RGB(0,1,0)
YELLOW sárga = 219 = RGB(1,1,0)
BLUE kék = 36 = RGB(0,0,1)
MAGENTA lila = 109 = RGB(1,0,1)
CYAN világoskék = 182 = RGB(0,1,1)
WHITE fehér = 255 = RGB(1,1,1)

A színpalettát a PALETTE videofeltétellel lehet beállítani:

SET £csatorna:PALETTE szín0,szín1,szín2,szín3,szín4,szín5,szín6,szín7

A paletta színeinek számozása 0-tól kezdődik. (Pl. négyszínű üzemmódban palettánk négy színe a 0-3 sorszámot viseli.)
16 színű és attribútum üzemmódban a hátralevő nyolc szín megválasztása már kevésbé tetszőleges. A paletta 8-15 számú színeinek összefüggő színcsoportba kell tartozniuk. Ezeket a SET BIAS videofeltétellel választhatjuk ki, amelyet egy számnak kell követnie. E szám tetszőleges színcsoportot jelöl ki. Értéke 8-ra lesz kerekítve, ha pl. a SET BIAS 67 (vagy bármely más szám a 64-71 tartományban) parancsot adjuk ki, akkor palettánk 8. színe a 64-es lesz, a 9. a 65-ös, és így tovább egészen 71-ig. A színcsoport tehát 8 egymást követő színt tartalmaz, amely nyolccal osztható színkódon kezdődik.
Szükség lehet arra, hogy színpalettánknak csak egy színét változtassuk meg úgy, hogy közben a többi változatlan maradjon. Ez a SET COLOUR utasítással érhető el; pl., a paletta 3. színét a

SET COLOUR 3,110

utasítással változtathatjuk meg.
A használni kívánt színek kiválasztása után - vagy az alapértelmezett színpaletta használatával - a rajzoláshoz használt tinta színét bármikor megváltoztathatjuk a

SET £csatorna:INK színszám

utasítással.
A papír színét pedig a

SET £csatorna:PAPER színszám

utasítással adhatjuk meg. Az utasítás csak a lap letörlése után fejti ki hatását.
Minden esetben, ha nem a 256 színes üzemmódot használjuk, a SET INK, ill. a SET PAPER utasításokban levő számok a választott paletta színeinek sorszámára vonatkoznak, 256 színes üzemmódban pedig a színek kódjaira.
Példaprogram a színek és a LINE MODE használatára:

100 PROGRAM "Linem.bas"
110 GRAPHICS HIRES 256
120 SET INK RGB(1,1,0)
130 PRINT £101,AT 6,1:"ENTERPRISE"
140 LET C=0
150 SET LINE MODE 2
160 FOR I=296 TO 340 STEP 4
170   SET INK RGB(1-C,C,0)
180   PLOT 8,I;1264,I
190   LET C=C+.08
200 NEXT

A képernyőt körülvevő keret színét a

SET BORDER kifejezés

videofeltétellel állíthatjuk be. A keret színe független a palettaszínektől, semmilyen megkötés nem vonatkozik rá, így a kifejezés értéke 0-255 közé eső színkódszám, színnév vagy keverési arányt megadó RGB függvény lehet.

A LOOK utasítással tetszőleges változóba töltetjük az x, y koordinátájú pont színének palettaszámát. Az utasítás segítségével megtudhatjuk, hogy az adott képernyőponton van-e valami, és ha igen, milyen színű. Ez hasznos lehet pl. játékprogramok esetén ütközések, találkozások érzékelésére. Az utasítás alakja:

LOOK £csat,AT x,y:v

A csatorna alapértelmezése a standard grafikus csatorna. Ha nem adunk meg pozíciót, akkor a rajzolósugár aktuális helyét - továbbiakban rajzolópont - használja helyette. Ha megadunk egy pozíciót, akkor a rajzolósugár kikapcsolódik, és a rajzolópont új helye a megadott lesz. Az utasítás szöveges képernyőn is használhatjuk, de ilyen esetben nem használhatjuk a kurzor pozícionálására az AT paramétert, ezt az utasítás kiadása előtt a PRINT £csat,AT x,y:; utasítással kell elvégezni.
A V változóban visszaadott érték függ attól, hogy milyen típusú videólapon adjuk ki az utasítást:

A GET utasítást grafikus lapon használva, hasonló hatást érünk el, mint a LOOK utasítással (a GET viszont karaktert ad vissza).

11.4. Az attribútum mód
Az attribútum videomódban 16 szín használatára van lehetőség, olyan felbontás mellett, mint amilyen a 4 színű grafikus videomódé. Ez úgy lehetséges, hogy ebben a videómódban különválik memóriában a képpont- és a színterület. Az attribútum grafikai lap két egyenlő nagyságú RAM-területet igényel: az első (a képpont adatterület) a videolap bittérképe, ami egy az egyben megfelel a két színt használó kisfelbontású képpont lap bittérképének (mindegyik byte nyolc képpontot határoz meg). Azt, hogy melyek a papír- és tintaszínek, a második RAM-terület - a színterület - tartalmazza. A több színért tehát azzal a korlátozással fizetünk, hogy egy képbájthoz csak egy attribútum-bájt tartozhat, vagyis egy bájtban lévő nyolc egymást követő ponthoz csak két szín (papír- és tintaszín) rendelhető. Amikor attribútum módban egy képpontot felrajzolunk, három dolgot tudunk befolyásolni:

A három művelet elkülönül egymástól, bár alapértelmezés szerint rajzoló műveleteknél mind a három tevékenység végrehajtódik. Azt, hogy ténylegesen milyen műveletet akarunk a fentiek közül elvégezni vagy elhagyni, az ATTRIBUTES videofeltétellel állíthatjuk be. Alakja:

SET £csatorna:ATTRIBUTES kifejezés

Ahol a kifejezés lehetséges értékei:

1 - rajzolás papírszínnel
2 - rajzolás a képpontok megváltoztatása nélkül (csak a színatribútumokat állítja).
4 - rajzolás a tintaszínek megváltoztatása nélkül. (Vagyis nem az aktuális színnel fog rajzolni, hanem az adott képpont színattribútumával.)
8 - rajzolás a papírszínek megváltoztatása nélkül.
16 - írás (PRINT utasítás) papírszínnel.
32 - írás a képpontok megváltoztatása nélkül.
64 - írás a tintaszínek megváltoztatása nélkül.
128 - írás a papírszínek megváltoztatása nélkül.

A kívánt szolgáltatások jelzőértékeit össze kell adni, és az összeget be kell írni a feltételbe. Alapértelmezés: 0.
Egy karakter 8x9 képpont, tehát a PRINT utasítás egyszerre ekkora területen állítja be a színattribútumokat, nem csak egy 8x1 méretű színterületen.

11.5. Animáció
IS-BASIC-ben két módszer is nyílik pár képkockából álló animációk készítésére. Mindkét módszer kielégítően gyors "képkockaváltást", tesz lehetővé (sőt, általában üres FOR-NEXT ciklusokkal, vagy egyéb tevékenységgel lassítani is kell az animációt).

Az első módszerben előre megrajzoljuk a kívánt képkockákat külön-külön videolapra. A felhasználható képkockáknak ebben az esetben csak a rendelkezésre álló videomemória szab határt, tehát a megnyitandó videolapok méretét érdemes - gondos tervezés révén - a lehető legkisebb méretűre megnyitni, és - ha indokolt - LORES videómodot használni. Az - akár összetettebb - képkockák megrajzolása után a megnyitott videolapokat csak egymásra kell rakosgatni a megfelelő sorrendben. A programfutás végeztével pedig javasolt a megnyitott videolapokat bezárni, lehetőleg fordított sorrendben, mint ahogy megnyitottuk ezeket (ld. 10.4. fejezet).
Példaprogram:

100 PROGRAM "Szinusz.bas"
110 CLEAR SCREEN
120 SET VIDEO X 22:SET VIDEO Y 8
130 SET VIDEO MODE 1:SET VIDEO COLOR 1
140 FOR K=200 TO 209 ! videolapok megnyitasa
150   OPEN £K:"video:"
160   SET £K:PALETTE 0,249
170 NEXT
180 LET Z=0
190 OPTION ANGLE DEGREES
200 FOR K=200 TO 209 !kepkockak megrajzolsasa
210   DISPLAY £K:AT 5 TO 8 FROM 1
220   FOR T=0 TO 100 STEP 20
230     FOR I=Z TO 359+Z STEP 20
240     LET Y=SIN(I)*100
250     PLOT £K:0-Z+I+T*3,100+Y+T/2;
260   NEXT
270   PLOT £K
280 NEXT
290 FOR I=Z TO 359+Z STEP 20
300   LET Y=SIN(I)*100
310   PLOT £K:0-Z+I,100+Y;0-Z+I+300,100+Y+50
320 NEXT
330 LET Z=Z+36
340 NEXT
350 DO ! animacio
360   FOR K=200 TO 209
370     DISPLAY £K:AT 5 TO 8 FROM 1
380     FOR X=1 TO 30 ! varakozas
390     NEXT
400   NEXT
410 LOOP UNTIL INKEY$=CHR$(27)
420 FOR K=209 TO 200 STEP-1 ! videolapok bezarasa
430   CLOSE £K
440 NEXT
450 TEXT

A második módszer, egyszerűbb, maximum 8 képkockából álló animációkat tesz lehetővé, 16 színű üzemmódban, egyetlen videolap megrajzolásával. Ebben az esetben az egyes "képkockákat" külön-külön színnel rajzoljuk fel egyetlen videolapra. Ezután a színpalettában a kívánt módon rotáljuk a színeket (a BIAS korlát miatt csak a 0-7. színeket tudjuk felhasználni). Példa:

100 PROGRAM "HENGER.BAS"
110 LET S,C=0
120 GRAPHICS HIRES 16
130 SET PALETTE 0,128,16,144,2,130,18,146
140 OPTION ANGLE DEGREES
150 FOR A=0 TO 359 STEP 4
160   LET S=S+1
170   IF S=8 THEN LET S=1
180   LET Y=SIN(A)*100:LET X=COS(A)*300
190   SET INK S:PLOT 600+X,500+Y;600+X,102+Y
200 NEXT
210 DO
220   SET PALETTE 0,128,16,144,2,130,18,146
230   SET PALETTE 0,16,144,2,130,18,146,128
240   SET PALETTE 0,144,2,130,18,146,128,16
250   SET PALETTE 0,2,130,18,146,128,16,144
260   SET PALETTE 0,130,18,146,128,16,144,2
270   SET PALETTE 0,18,146,128,16,144,2,130
280   SET PALETTE 0,146,128,16,144,2,130,18
290 LOOP UNTIL INKEY$=CHR$(27)

12. A karakterkészlet
Az Enterprise 7 bites (128 karakteres) karakterkészletet asznál az ISO 646 szabvány szerint. Az angol karakterkészlet megfelel az ISO-646-GB szabványnak, a német az ISO-646-DE szabványnak. A szabvány karakterkészlet felett megnyert 32 karakterre előzékenyen bepakoltak több elterjedt európai ékezetes karaktert és jelet.

UK:

BRD:

A megjeleníthető karakterek alatti és feletti tartományban ún. vezérlő karakterek vannak, melyek a - többek között - a megjelenítést vezérlik. Valamennyi vezérlőkarakter elérhető a billentyűzetről is a CTRL vagy az ALT billentyűk segítségével:

Keys
normal
SHIFT
CTRL
ALT
1
2
3
4
5
6
7
8
9
0
-
^
@
[
;
:
]
\
,
.
/
A
B
C
D
E
F
G
H
I
J
K
L
M
31 (049)
32 (050)
33 (051)
34 (052)
35 (053)
36 (054)
37 (055)
38 (056)
39 (057)
30 (048)
2D (045)
5E (094)
40 (064)
5B (091)
3B (059)
3A (058)
5D (093)
5C (092)
2C (044)
2E (046)
2F (047)
61 (097)
62 (098)
63 (099)
64 (100)
65 (101)
66 (102)
67 (103)
68 (104)
69 (105)
6A (106)
6B (107)
6C (108)
6D (109)
21 (033)
22 (034)
23 (035)
24 (036)
25 (037)
26 (038)
27 (039)
28 (040)
29 (041)
5F (095)
3D (061)
7E (126)
60 (096)
7B (123)
2B (043)
2A (042)
7D (125)
7C (124)
3C (060)
3E (062)
3F (063)
41 (065)
42 (066)
43 (067)
44 (068)
45 (069)
46 (070)
47 (071)
48 (072)
49 (073)
4A (074)
4B (075)
4C (076)
4D (077)
31 (049)
32 (050)
33 (051)
34 (052)
35 (053)
36 (054)
37 (055)
38 (056)
39 (057)
1F (031)
2D (045)
1E (030)
- --
1B (027)
3B (059)
3A (058)
1D (029)
1C (028)
2C (044)
2E (046)
2F (047)
01 (001)
02 (002)
03 (003)
04 (004)
05 (005)
06 (006)
07 (007)
08 (008)
09 (009)
0A (010)
0B (011)
0C (012)
0D (013)
31 (049)
32 (050)
33 (051)
34 (052)
35 (053)
36 (054)
37 (055)
38 (056)
39 (057)
9F (159)
2D (045)
9E (158)
80 (128)
9B (155)
3B (059)
3A (058)
9D (157)
9C (156)
2C (044)
2E (046)
2F (047)
81 (129)
82 (130)
83 (131)
84 (132)
85 (133)
86 (134)
87 (135)
88 (136)
89 (137)
8A (138)
8B (139)
8C (140)
8D (141)
Keys
normal
SHIFT
CTRL
ALT
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
ENTER
ESC
TAB
DEL
ERASE
INS
STOP
SPACE
fel
le
balra
jobbra

F1
F2
F3
F4
F5
F6
F7
F8

6E (110)
6F (111)
70 (112)
71 (113)
72 (114)
73 (115)
74 (116)
75 (117)
76 (118)
77 (119)
78 (120)
79 (121)
7A (122)
0D (013)
1B (027)
09 (009)
A0 (160)
A4 (164)
A8 (168)
03 (003)
20 (032)
B0 (176)
B4 (180)
B8 (184)
BC (188)

- --
- --
- --
- --
- --
- --
- --
- --

4E (078)
4F (079)
50 (080)
51 (081)
52 (082)
53 (083)
54 (084)
55 (085)
56 (086)
57 (087)
58 (088)
59 (089)
5A (090)
0D (013)
1B (027)
09 (009)
A1 (161)
A5 (165)
A9 (169)
03 (003)
20 (032)
B1 (177)
B5 (181)
B9 (185)
BD (189)

- --
- --
- --
- --
- --
- --
- --
- --

0E (014)
0F (015)
10 (016)
11 (017)
12 (018)
13 (019)
14 (020)
15 (021)
16 (022)
17 (023)
18 (024)
19 (025)
1A (026)
0D (013)
1B (027)
09 (009)
A2 (162)
A6 (166)
AA (170)
03 (003)
20 (032)
B2 (178)
B6 (182)
BA (186)
BE (190)

F0 (240)
F1 (241)
F2 (242)
F3 (243)
F4 (244)
F5 (245)
F6 (246)
F7 (247)

8E (142)
8F (143)
90 (144)
91 (145)
92 (146)
93 (147)
94 (148)
95 (149)
96 (150)
97 (151)
98 (152)
99 (153)
9A (154)
0D (013)
1B (027)
09 (009)
A3 (163)
A7 (067)
AB (171)
03 (003)
20 (032)
B3 (179)
B7 (183)
BB (187)
BF (191)

F8 (248)
F9 (249)
FA (250)
FB (251)
FC (252)
FD (253)
FE (254)
FF (255)

Az alábbi példa a 80 karakteres 102-es csatorna (alapértelmezett szöveges lap) tartalmát .txt file-ba menti a megadott néven, amit később betölthetünk szövegszerkesztőbe. A grafikus (ékezetes) karakterek kezelésénél gondot okoz, 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. A megoldás az, hogy LOOK-al olvassuk be a karakterek tartalmát numerikus változóba, és ha a kód 32-nél kisebb, akkor hozzá kell adni 128-at.

110 DEF TXSAVE(NEV$)
120   WHEN EXCEPTION USE IOHIBA
130     OPEN £106:NEV$ ACCESS OUTPUT
140     FOR Y=1 TO 23
150       FOR X=1 TO 78
160         PRINT £102,AT Y,X:;
170         LOOK £102:S
180         IF S<32 THEN LET S=S+128
190         PRINT £106:CHR$(S);
200       NEXT
210       PRINT £106:
220     NEXT
230     CLOSE £106
240   END WHEN
250 END DEF
260 HANDLER IOHIBA
270   PRINT EXSTRING$(EXTYPE)
275   CLOSE £106
280   END
290 END HANDLER

A karakterek egy 9x8-as ponthálózatban jelenítődnek meg, 9 bájt 8-8 bitje segítségével. Azok a bitek, melyeknek értéke 1, tinta-, a 0 értékűek pedig papírszínűek lesznek. A 128 darabos karakterkészlet képét ekképpen meghatározó bájtok a karakter ROM-ban vannak, ahonnan a számítógép bekapcsolásakor az, operációs rendszer átmásolja a RAM-ba.
A karakter RAM az alapkiépítettségű Ep128-ban a 46208-as címen kezdődik, és értelemszerűen 128x9 bájt a mérete. Mivel azonban a karaktertábla helye konfigurációtól függően változhat (EXOS 2.0-ban máshol van), érdemes inkább kezdőcímét az EXOS-tól lekérdezni az alábbi kifejezéssel:

(SPEEK(255,16372)+SPEEK(255,16373)*256)-1152

Mivel a karaktermemória a RAM-ba másolódik, lehetőség van a karakterek átdefiniálására, amit a BASIC is támogat a CHARACTER videófeltétellel:

SET CHARACTER karakterkód,sor1,sor2,sor3,sor4,sor5,sor6,sor7,sor8,sor9

Az utasítás a 'karakterkód' kódú karaktert definiálja át úgy, hogy sor1-9 értékek az alak egy-egy sorát adja meg felülről lefelé haladva. Nem kötelező mind a 9 sor értékét megadni, a hiányzó sorokat az utasítás 0 értékűnek tekinti. Egyszerű karaktertervezést tesz lehetővé a BIN függvény, a Felhasználói kézikönyvben ismertetett módon:

100 NUMERIC SOR(1 TO 9)
110 FOR I=1 TO 9
120   READ SOR(I)
130   LET SOR(I)=BIN(SOR(I))
140 NEXT
150 SET CHARACTER 65,SOR(1),SOR(2),SOR(3),SOR(4),SOR(5),SOR(6),SOR(7),SOR(8),SOR(9)
160 DATA 00111100
170 DATA 01000010
180 DATA 10100101
190 DATA 10000001
200 DATA 10100101
210 DATA 10011001
220 DATA 01000010
230 DATA 00111100
240 DATA 00000000

A fenti program hatása egyenértékű a

SET CHARACTER 65,60,66,165,129,165,153,66,60,0

utasítással.
A karakterdefiníciónak nem feltétlenül a futó programunkban kell elhelyezni: a BASIC RUN utasítás után nem törlődik a karakterkészlet, így külön programban is elhelyezhetjük a SET CHARACTER utasításokat, vagy itt is használhatjuk a COPY parancsot, mint bármilyen elmentett escape-szekvencia betöltésére. A karakterdefiníciót először file-be átirányítva el kell menteni:

100 OPEN £1:"chr.bin" ACCESS OUTPUT
110 SET £1:CHARACTER 145,24,24,60,102,126,102,102
120 SET £1:CHARACTER 151,24,24,126,96,120,96,126
130 SET £1:CHARACTER 133,28,24,60,24,24,24,60
...
140 CLOSE £1

Az elmentett karakterdefiníció betöltése:

OPEN £1:"chr.bin"
COPY FROM £1 TO £102
CLOSE £1

Egy karakter átdefiniálása a hardware-szöveges lapon (TEXT 40) azonnal látszik a már megjelenített karaktereken, a grafikus módokban azonban csak az ezután kiírt karakterekre fejti ki hatását.

A karakterkészletet a CLEAR FONT utasítással azonnal visszaállíthatjuk az eredeti állapotba (ez az angol karakterkészlet).
A karakter memória kezdőcímének ismeretében a karaktertáblát bármikor elmenthetjük, visszatölthetjük.

Kimentés:

10 ALLOCATE 9
20 CODE MENT=HEX$("3E,01,01,80,04,EB,F7,08,C9")
30 LET FONT=(SPEEK(255,16372)+SPEEK(255,16373)*256)-1152
40 OPEN £1:"CHRSET.BIN" ACCESS OUTPUT
50 CALL USR(MENT,FONT)
60 CLOSE £1

Betöltés:

10 ALLOCATE 9
20 CODE TOLT=HEX$("3E,01,01,80,04,EB,F7,06,C9")
30 LET FONT=(SPEEK(255,16372)+SPEEK(255,16373)*256)-1152
40 OPEN £1:"CHRSET.BIN"
50 CALL USR(TOLT,FONT)
60 CLOSE £1

13. Hangkeltés
A hangkeltésért a DAVE chip felelős (néhány más egyéb funkció mellett). Négy csatornát használhatunk (ebből egy zajcsatorna), és sztereó hangkeltésre is képes, olyan módon, hogy külön megadhatjuk a jobb, illetve a bal csatorna hangerejét. A hullámformát nem a felhasználó választja meg, ez mindig négyszögjel.
A hangkezelő részére egyidőben csak egy EXOS csatorna lehet megnyitva (a BASIC indulásakor ez a 103-as csatorna). A hangkezelő csatornája a "SOUND:" eszközével nyitható meg. A hangkezelő a hangcsatornák mindegyikének egy hangvárakozási sort tart fenn. A sorban álló hangok mindegyike sorban lejátszásra kerül, amikor az előtte álló már befejeződött. A hangkeltéshez két utasítás használható BASIC-ből: a SOUND és ENVELOPE.

13.1. A SOUND utaítás
Általános alakja:

SOUND £csat:PITCH kif, DURATION kif, LEFT kif, RIGHT kif, SOURCE kif, STYLE kif, ENVELOPE kif, SYNC kif, INTERRUPT

A paraméterek sorrendje nem lényeges és bármelyik elhagyható. Az egyes paraméterek jelentése:

PITCH x
A hang magasságát adja meg félhangokban. A legmélyebb hanghoz a 0-át adhatjuk meg: SOUND PITCH 0 (ez egy H hang), és már morajlik is valami nagyon mély hang. A SOUND PITCH 127 a legmagasabb hangot adja (ez elméletileg egy fisz hang lenne), illetve adná, de annyira magas, hogy nem is hallható már.
A SOUND PITCH 1 a legmélyebb C hangot jelöli. Ha eggyel megnöveljük a szám értékét, egy félhanggal magasabb hangot kapunk. Így egy oktávval magasabb hanghoz 12-vel kell a pitch értékét növelni, a következő oktáv C hangja tehát 1+12=13. A következő oktávbeli C hang 13+12=25, az azután 37, az azutáni 49 és így tovább. A SOUND PITCH 37 a normál C hang, a 38 a cisz, a 39 D, a 40 disz, a 41 E, a 42 F, és így tovább. (Zenészek tudják, hogy az E és az F hang között csak félhangnyi, azaz kisszekund az eltérés, ahogy a H és az azt követő C között is, ezért nincs a zongorán fekete billentyű az E-F és a H-C hangok között. Így a 41 és 42 ill. a 48 és 49 különbsége 1, míg pl. a 37 és 39 különbsége 2.) Kb. 90-nél nagyobb értékeket nem érdemes megadni, mert olyan magas a frekvenciájuk, hogy nem hallatszanak jól. Másrészt, a hang-magasság ilyen magas hangoknál már nem olyan pontos, aminek okára rövidesen rátérünk.
Nem csak egész számokat adhatunk meg hangmagasságnak, így a SOUND PITCH 41.5 egy negyedhang az E és az F között. Megadhatunk akár 41.1-et, 41.2-t, tehát egész finom hangmagasság különbségek lehetségesek. A legmélyebb oktávban akár 0.03125 PITCH értékbeli különbség már eltérést okoz a frekvenciában (más kérdés, hogy az emberi fül ebből mit hall), a magasabb hangoknál kevésbé finoman állítható a hangmagasság. Így pl. a normál A hang (PITCH 46) környékén 0.05 körüli pitch értékbeli különbség jelent eltérést a frekvenciában. A két oktávval feljebb lévő A hang (PITCH 70) környékén "csak" 0.2-vel növelve lesz magasabb a hang. PITCH 100 felett pedig már a tört hangmagasság-értékeknek nincs is értelme: csak akkor változik a hangmagasságuk, ha 2-vel, 3-mal növeljük az értéküket, így a tényleges zenei hangok frekvenciája sem érhető el. (Ezért is csak elméletileg fisz hang a legmagasabb, a 127-es.) De ilyen magas hangokat úgyse használunk, mert nem is hallatszanak már. (Ennek az egésznek az oka, hogy a DAVE 125000/N Hz frekvenciájú négyszögjelet tud előállítani, ahol N 2 és 4096 közötti egész lehet. A PITCH pedig elvileg 12 * log2(125000/N/440) + 46, de a SOUND: eszköz nem egészen pontos, lineáris interpolációt használ.)
Itt kell megemlíteni, hogy a legtöbb PC-s zeneszerkesztő program, így a midi szerkesztők és az FL Stúdió sem teszi lehetővé (egykönnyen) a kromatikus skálánál finomabb skála használatát (mikrotonális rendszerek), de EP-n szinte minden eszköznél könnyebben írhatunk be ilyen zenét! Igaz, az ilyen zene nem túl gyakori, inkább a keleti dallamvilágra jellemző.
Megadhatunk PITCH értéknek nullánál kisebb értéket is, egészen -131-ig. A -1-től kezdődően azonban nem mélyebb hang lesz a 0-nál, hanem újra a legmagasabb (127-tel jelzett) hang jön. 127-nél is megadhatunk nagyobb értéket, egészen 259-ig. A 128 szintén nem magasabb a 127-nél, hanem a PITCH 0 értékkel azonos. Ha -131-nél kisebb, vagy 259-nél nagyobb értéket adunk a PITCH után, hibaüzenetet kapunk.
Ezért ha egy 0 és 127 közé eső pitch értékhez 128-at hozzáadunk vagy elveszünk belőle, ugyanazt a hangmagasságot kapjuk, pl. a SOUND PITCH 41 ugyanúgy szól, mint a SOUND PITCH 41+128 vagy a SOUND PITCH 41-128. A legmélyebb 4 pitch érték (SOUND PITCH 0, SOUND PITCH 1, SOUND PITCH 2, SOUND PITCH 3) úgy is elérhető, ha 128-at, és úgy is, ha 2*128-at adunk hozzá, pl.

SOUND PITCH 2 = SOUND PITCH 2+128 = SOUND PITCH 2+128+128.

Tehát a 256, 257, 258, 259 "kóbor" pitch értékek még hozzácsapódtak a mezőny végéhez. A mezőny elejére pedig három hallhatatlan magas hang sorolt be. A -128 tehát a 0-val azonos magasságú, a legmélyebb hang. Ez alá még bevonult a -129, -130, -131, melyek magassága a 127,126,125 pitch értékkel azonos. (Mint tudjuk, nullától lefele a számok "visszafele mennek". Vagyis, ha az abszolút értéküket nézzük, minél nagyobb egy szám abszolút értéke 0 alatt, annál mélyebb a hang, míg a pozitív számok jól megszokott tartományában minél nagyobb egy szám, annál magasabb hangot jelöl.)

DURATION n
A hang hosszát a DURATION paraméterrel adhatjuk meg. Az n értéke a másodperc 50-ed részét jelenti, tehát a legrövidebb (1-es hosszúságú) hang 1/50 másodpercig szól. Egy másodperces hanghoz a SOUND DURATION 50-et kell megadni (ez az alapértelmezés is), két másodpercig szóló hanghoz SOUND DURATION 100 kell. Tehát, ahány másodperc hosszú hangot akarunk, azt meg kell szorozni 50-nel.
Meg lehet adni tört értéket is a DURATION paraméterében, de a tizedespont utáni számoknak nincs hatása, hiszen az EXOS hang vezérlése 50Hz-en működik.
A leghosszabb hang, ami megadható, az a SOUND DURATION 65536, ez 1316.34 másodpercig szól (ami majdnem 22 perc). Ha ennél is nagyobb számot adunk meg, nem a hang lesz hosszabb, hanem újra elölről kezdődik minden: a 65537 a DURATION 1-nek felel meg, a 65538 a DURATION 2-nek, és így tovább, egészen 131072-ig, ami újra 65536-nak felel meg, majd a 131073 újra az 1-es duration értéket jelöli. (A gép tehát elfogad 16 biten nem ábrázolható értékeket is, de 16 bitesre csonkítja.) Így a következő utasításokban ugyanannyi lesz a hang hossza:

SOUND DURATION 1
SOUND DURATION 1+65536
SOUND DURATION 1+65536+65536
(azaz: 131073)

A legnagyobb megadható szám 132767. Ez 132767-2*65536 = 1695 duration értékkel azonos, ami kb. 34 másodperc.
A SOUND DURATION 0 nem 0 hosszúságú hangot eredményez, hanem a leghosszabbat, 65536 hosszúságút. Ez azért van, mert ha DURATION 1-től lefelé megyünk a negatív számok birodalma felé, újra a leghosszabb felől haladunk a rövidebb hangok felé. A DURATION -1 a DURATION 65535-öt, a DURATION -2 a DURATION 65534-et jelenti, és így tovább. A -65535 ugyanaz a hanghossz, mint az 1. A legkisebb megadható a SOUND DURATION -67231, ami kb. 34 másodperccel rövidebb a lehetséges leghosszabb hangnál. így ha valamit elszámolnánk programunkban, és megszólal egy hang, mely nem akar elhallgatni, akkor valószínűleg 0-át vagy negatív értéket sikerült beállítani a hang hosszának. Ilyen tragédia esetén a CLEAR SOUND utasítás segít, vagy a reset gomb.

SOURCE n
A source szó jelentése eredet, forrás. A paraméter a felhasználandó hanggenerátort adja meg (0-3). Az Enterprise hangchipje három négyszögjelcsatornát (tiszta hangot) és egy zajcsatornát képes kezelni. Ez azt jelenti, hogy egyszerre négy különböző hang szólaltatható meg, ebből az egyik zaj, a másik három zenei hang is lehet. Így az egyik négyszögcsatornán szólhat egy szólam, a másik négyszögcsatornán egy kíséret, a harmadikon például basszus, a zajcsatornán pedig például dobokra emlékeztető hangzások. A három négyszögcsatorna azonosítója: 0, 1, 2, a zajcsatornáé pedig 3. A SOURCE paramétereként ezt az azonosítót kell megadni. Alapértelmezésként a SOUND SOURCE 0 szól.
Ha egymás után meg akarunk szólaltatni pl. egy C és egy E hangot, az a következő BASIC programmal lehetséges:

100 SOUND PITCH 37
110 SOUND PITCH 41

Ha nem egymás után, hanem egyszerre akarjuk megszólaltatni a C és E hangot, akkor az egyik hangot egy másik csatornára kell tenni, például így:

100 SOUND PITCH 37
110 SOUND PITCH 41, SOURCE 1

Ha a zajcsatornát is használni akarjuk a C és az E hang kiadása közben, ezt kell megadnunk:

120 SOUND SOURCE 3

A SOURCE 3 paraméter használata sistergő hangot eredményez, ami leginkább a tévében az adáskimaradásra emlékeztet. Fontos még megemlíteni, hogy a zajcsatorna hangmagasságát nem tudjuk állítani a PITCH paraméterrel (tehát a SOUND SOURCE 3, PITCH x nem változtatja meg a hangmagasságot, akármennyit is írunk az x helyére). Van azonban egy másik lehetőség a zajcsatorna magasságának megváltoztatására, erről a STYLE paraméternél lesz majd szó. Egyébként ez a sistergés, amit a zajcsatorna kiad, fixen 31.25 kHz magasságú. (Azért pont ennyi, mert a Dave hanggenerátorai 250 kHz-es órajellel működnek, a négyszögjelek frekvenciája pedig csak olyan érték lehet, ami ezt páros egésszel osztja. 250/8 pont 31.25.)
A SOURCE paraméter után megadhatunk 0 és 3 közöttitől eltérő számot is. A legnagyobb megadható szám a SOUND SOURCE 255, a legkisebb a SOUND SOURCE -256. Sajnos ezek a számok nem jelölnek eddig felfedezetlen csatornákat, hanem a három csatorna ismétlődik. Pl. ha 4-et adunk meg, az újra a 0-s csatorna lesz, az 5 az 1-es csatorna, és így tovább. Mindegyik csatornára hivatkozhatunk úgy is, ha a SOUND SOURCE értékéhez hozzáadunk 4-et, 8-at, 12-t, stb., azaz négy egész számú többszörösét. Pl. a zajcsatorna megszólaltatható a SOUND SOURCE 3, a SOUND SOURCE 7 és a SOUND SOURCE 11 kiadásával is, és így tovább, végül a SOUND SOURCE 255 is a zajcsatornát használja. Gyakorlatilag a megszólaltatandó csatornához a következő képlet is használható:

SOUND SOURCE n+(4*m)

ahol n a csatorna tényleges száma, m pedig tetszőleges egész szám, melynek 64-nél kisebbnek kell lennie, de nem lehet kisebb -64-nél.
Érdekesség, hogy mivel a 0-ás csatornára a 4-es számmal is hivatkozhatunk, lehetne a csatornák számozása 1-től 4-ig, ahol a 3-as a zajcsatorna, a 4-es pedig tiszta hang. Így pont akkora számokkal hivatkozhatunk a csatornákra, ahány csatorna ténylegesen van. Technikai okok miatt célszerűbb 0 és 3 közötti számokkal hivatkozni a csatornákra, de BASIC programozásához az 1-4 számozási rendszer is megfelelne. Meg lehet adni a SOUND SOURCE paraméterének törtet is, de a tizedespont utáni részeket a gép nem veszi figyelembe természetesen.
Ha azt akarjuk, hogy valamelyik csatornán a hang hallgasson el, a CLEAR QUEUE n parancsot használhatjuk, ahol n az elnémítani kívánt csatorna száma.

SYNC 1/2/3
A sync a synchronize (szinkronizál) szó rövidítése. Ha több csatornán szólaltatunk meg zenét, a BASIC gyorsasága (ami lassúsága) miatt előfordulhat, hogy mire egyik SOUND utasításról a másikra lép a program, eltelik egy picike idő ahhoz, hogy a két csatornán a hang ne egyszerre szólaljon meg, hanem érzékelhető csúszással. Főleg akkor, ha a két SOUND utasítás között valami műveletet is végez a gép, pl.

90 LET A=41: LET B=127
100 SOUND PITCH 41
110 LET A=A+12: LET B=255-B
120 SOUND PITCH A, LEFT B, RIGHT 200, SOURCE 1

A 0-ás csatornán a hang előbb fog megszólalni, mint az 1-es csatornán. Hogy biztosan egyszerre szólaljon meg a két csatorna, a SYNC paramétert kell használni az egyszerre megszólaltatandó SOUND utasításokban. A fenti program így kiegészítve:

100 SOUND PITCH 41, SYNC 1
110 LET A=A+12: LET B=255-B
120 SOUND PITCH A, LEFT B, RIGHT 200, SOURCE 1, SYNC 1

Így a 100-as sor hangja nem fog megszólalni egész addig, amíg a 120-as sorhoz nem ér a program. Ha hozzáadjuk a programhoz pl. a 115 WAIT DELAY 8 sort, akkor is megvárja a 120-as sort, és csak akkor szólal meg hang. Egy adott SOUND utasításban a SYNC paraméter utáni szám azt jelöli, hogy hány másik hanggal kell egyszerre megszólaltatnunk az adott hangot. Két hang egyszerre megszólaltatva:

SOUND PITCH 49, SYNC 1
SOUND PITCH 44, SOURCE 1, SYNC 1

Három hang egyszerre megszólaltatva:

SOUND PITCH 49, SYNC 2
SOUND PITCH 44, SOURCE 1, SYNC 2
SOUND PITCH 41, SOURCE 2, SYNC 2

Vagyis ahány hangot összehangolunk, annyi mínusz 1-et kell a SYNC-ben megadnunk. Tehát 3-nál nagyobb számot nem is érdemes megadni a SYNC után, hiszen egy adott csatornával egyidejűleg maximum 3 másik csatorna szólalhat meg, mivel ennél több csatorna nincs. Mint látható, az összes összehangolt csatornánál ugyanazt a számot kell megadni SYNC után.
Ha nullát (ez az alapértelmezett), ilyenkor nincs szinkronizálás. 3-nál nagyobb számot is megadhatunk, a 4 újra a 0-ás értéket jelöli, az 5 az 1-et, a 6 a 2-őt, a 7 a 3-at, a 8 megint a 0-t, és így tovább. A legnagyobb megadható szám 255. Negatív számokat is megadhatunk egészen -256-ig, és törteket is. Ennek természetesen nincs értéke, de hibát nem okoz, a tört részt a gép figyelmen kívül hagyja.

STYLE n
A STYLE paraméterrel a hangzás jellegét tudjuk megváltoztatni. A style jelentése stílus, és valóban a megszólalás stílusát, a hangzásformát állíthatjuk be segítségével. Egyetlen paraméter, de többféle effektet (szám szerint hatot) is kezelhetünk vele.
A STYLE által kezelt effekteket érdemes két csoportba osztani:

I. Az egyik csoport effektjei egyetlen csatornán is kifejtik hatásukat, egyetlen SOUND utasítással is bekapcsolhatók. Két ilyen effekt van, az egyik csak a négyszögjel csatornákon (0,1 és 2), a másik csak a zajcsatornán (3-as csatorna) használható:

SOUND SOURCE 1,STYLE 16 - alacsony torzítás az 1-es csatornán,
SOUND SOURCE 2,STYLE 32 - közepes torzítás a 2-es csatornán,
SOUND STYLE 48 - magas torzítás a 0-ás csatornán (A 0-ás csatorna az alapértelmezett, ezért a SOURCE 0 paramétert példáinkban nem adjuk meg külön.)

Ha a SOURCE 0, SOURCE 1 vagy SOURCE 2 csatornán szólaltatunk meg hangot és STYLE 16 vagy STYLE 32 vagy STYLE 48 értéket adunk meg, azzal három különböző torzítást érhetünk el:

STYLE 16 az alacsony (4 bites) torzítás,
STYLE 32 a közepes (5 bites) torzítás,
STYLE 48 a magas (7 bites) torzítás.

Talán nem pontos kifejezés a "torzítás". A lényeg, hogy a négyszögjel "felépítését" változtatja meg 3 különböző módon, így más lesz a hangzás. Leegyszerűsítve, ezek a torzítások valamiféle zajt visznek a négyszögjelbe. Alacsony torzításnál a hangzás teltebb lesz, teljesen jól használható ebből a szempontból zenéhez. Közepes torzításnál ennél zajosabb a hangzás, de aránylag jól használható lehet még ez is zenéhez. Magas torzításnál a hang már szinte zaj, dallam lejátszására kevésbé lehet alkalmas, inkább dobszerű effektek vagy egyéb hangeffektek megszólaltatására való.

SOUND SOURCE 3,STYLE 8
SOUND SOURCE 3,STYLE 16

A torzításoknak van egy fogyatkozásuk, ami olykor előnyösen ki is használható. Alacsony torzításnál több PITCH értéknél is tapasztalhatjuk, hogy ugyanarra az értékre nem mindig ugyanazt a hangzást kapjuk. Például, ha az alapértelmezett PITCH 37 értéket egymás után többször is megszólaltatjuk STYLE 16 paraméterrel kiegészítve, előbb-utóbb előjön, hogy a hangzás olykor tettebb, olykor tompább lesz. Így ha egymás után többször is kiadjuk BASIC-ben, hogy SOUND STYLE 16, háromféle hangzással is találkozhatunk. Véletlenszerű, hogy mikor melyik hangzás jön elő, ezt állítani nem tudjuk gépi kódú programozással sem. SOUND STYLE 16,PITCH 39 pedig az esetek nagy részében egy adott hangzást eredményez, az esetek kisebb részében pedig egyáltalán nem szól semmilyen hang. Olyan hangmagasságértékek is léteznek, melyeknél egyáltalán nem szól hang sosem (pl. SOUND PITCH 50,STYLE 16). Ezen segíthetünk, ha a hangmagasságot kis mértékben megváltoztatjuk (pl. a SOUND PITCH 50.1,STYLE 16 már eredményez hangot). Léteznek olyan PITCH értékek alacsony torzításnál, ahol háromféle hangzás is lehetséges, vagy olyan PITCH értékek, ahol egy adott hangzás és a hang teljes hiánya fordulhat elő, olyan PITCH értékek, ahol stabilan egyáltalán nincs hang, és olyan PITCH értékek is, ahol stabilan mindig ugyanarra a hangzásra számíthatunk. A gyakorlatban általában ez utóbbi lehet a legelőnyösebb. Az ebből a szempontból hiányzó hangokat úgy érhetjük el, ha picivel megváltoztatjuk a PITCH értékét, akár 0.1-t, 0.2-t vagy még nagyobb számot adunk hozzá vagy vonunk ki belőle. Ugyanis a nem egész PITCH értékekre is igazak a fentiek.
Alacsony torzításnál a következő PITCH értékeknél nincs hang: (Itt most csak az egész értékeket ismertetjük. Számos nem egész PITCH érték is ide sorolható még.) SOUND STYLE 16, PITCH 0 / 3 / 11 / 12 / 20 / 31 / 50 / 57 / 69 / 96 /113...115 /120...124
Közepes és magas torzításnál nem ennyire bonyolult a helyzet. Közepes torzításnál a SOUND STYLE 32,PITCH 84 (és a környező nem egész PITCH értékek) az, ahol nem hallhatunk semmilyen hangot.
A hanggenerátor frekvenciája és a sorozat hossza együttesen határozzák meg, hogy valójában hány bit lesz a lejátszott minta hossza. Hogy mely bitek kerülnek ebbe bele, az "véletlenszerű", a polinomszámláló és a hang-generátor aktuális fázisától függ. Ha a hanggenerátor frekvenciája (mintavételezés gyakorisága) alacsony torzításnál 15 egész számú többszöröse, akkor egyetlen érték ismétlődik, gyakorlatilag nincs hang.
A mintavételezési frekvencia és a bitsorozat hosszának legnagyobb közös osztója határozza meg, milyen lesz a hangzás. Alacsony torzításnál a bitsorozat hosszúsága (15) nem prímszám (tehát nem csak önmagával és 1-gyel osztható), ezért kevésbé jósolható meg előre, milyen lesz a hang. Közepes és magas torzításnál a bitsorozat hosszúsága (31 ill. 127) prímszám, ezért a hang kiszámíthatóbb. Viszont 31 és 127 többszörösénél nincsen hang. Torzítás nélkül (STYLE 0, az alapértelmezés) a magasabb hangok (kb. PITCH 80 felett) nem hallatszanak. Torzítással azonban ezeknek is van hangjuk. Az ilyen magas hangok sokszor hamisak már, és több, egymás mellett lévő nagyon magas PITCH érték egybemosódik, ugyanazt a hangmagasságot eredményezi. (Ezt FOR-NEXT ciklussal könnyen tesztelhetjük, ha a ciklusváltozóba a hangmagasság értékét írjuk.) A nagyon mély hangok pedig (kb. 20-25 alatt) nem szólnak túl szépen, "recsegések".

II. A másik csoportba tartozó effektek csak úgy fejtik ki hatásukat, ha két csatornát használunk egyszerre. A STYLE paraméterével ilyenkor egy másik csatornára hivatkozunk (hogy melyik ez a másik csatorna, segédcsatorna, az effektenként eltér), így ezen a másik csatornán szóló hang magassága befolyásolni fogja az egyik csatornán szóló hang hangzását. A segédcsatorna hangerejét akár 0-ra levehetjük, a hatását akkor is kifejti. A kétcsatornás effekteknél az effekt frekvenciáját egy másik csatorna hangmagassága (ahogy a Felhasználói kézikönyvben szerepel: órajele) adja.
Ezek az effektek a következők:

SOUND SOURCE 3,STYLE 1,SYNC 1
SOUND PITCH 70,SYNC 1,LEFT 0,RIGHT 0
- a 0-ás csatornán szóló hangmagasság adja a zajcsatorna frekvenciáját.
SOUND SOURCE 3,STYLE 2,SYNC 1
SOUNT PITCH 100,SOURCE 1,SYNC 1,LEFT 0,RIGHT 0
- az 1-es csatornán szóló hangmagasság adja a zajcsatorna frekvenciáját.

SOUND SOURCE 3,STYLE 0 - a már ismert alapértelmezés, hangja sistergés, mint adáskimaradás a tévében SOUND SOURCE 3.STYLE 4 - picit más lesz a sistergés, talán tompább,
SOUND SOURCE 3,STYLE 8 - a sistergés sajátosan vibrál SOUND SOURCE 3,STYLE 12 - most is vibrál a sistergés, de kicsit fémesebb a hangzása,
SOUND SOURCE 3.STYLE 16 - egészen fémes, sípoló a hangzás.
A zajcsatornának tehát ötféle megszólaltatási módja létezik. Alapértelmezésben (style 0) a polinomszámláló 17 bites értékét vesz fel, style 4 esetén 15 bitest, style 8 esetén 11 bitest, style 12 esetén 9 bites, style 16 esetén pedig a 7 bites a polinomszámláló kerül bevetésre. Az 5 féle megszólaltatási mód eléréséhez tehát a style paraméterbe a 0, 1, 2, 3, 4 számok négyszeresét (0, 4, 8, 12, 16) kell beírni.
Hogy kicsit betekintsünk a technikai részletekbe: a DAVE chip négy polinomszámlálót tartalmaz. A négyszögjelcsatornáknál már szó volt háromról (a háromféle torzításhoz). A negyediket, a változtatható hosszúságú, 9/11/15/17 bites polinomszámlálót használja a zajcsatorna. A STYLE 16-tal elérhető, sípoló hangzást a zajcsatorna a 7 bites polinomszámláló használatával éri el. (A négyszögjelcsatornákon ez a polinomszámláló a magas torzításért felelős.)
Próbáljuk ki:

SOUND SOURCE 3,STYLE 1,SYNC 1
SOUND PITCH 74,SYNC 1,LEFT 0,RIGHT 0

A 74 helyett más értékeket is kipróbálhatunk 0 és 127 között és hallható lesz, hogy itt most tényleg a zajcsatorna magassága változik! Ennek inkább a magasabb hangoknál, kb. 50-es PITCH érték felett van értékelhető hangja. A zajcsatorna magassága alapból 31.25 KHz, ez igen magas hang (alapértelmezett polinomszámláló értéknél ez az a magas hangú sistergés). Ennél mélyebb hangokat az órajelcsatornán megadva hallhatjuk, milyen lesz az a sistergés mélyítve.
A zajcsatorna magasságát akár más polinomszámláló értékeknél is változtathatjuk. így nem csak a sistergést mélyíthetjük le, hanem a vibrálósabb vagy a sípolós hangzást is. Mivel azt is a style paraméterrel fejezhetjük ki, hogy egy másik csatornáról vesszük a frekvenciát (STYLE 1 vagy 2 vagy 3), és azt is, hogy más polinomszámláló értéken szóljon a zaj (STYLE 4, 8, 12 vagy 16), a kettő kombinációját úgy érhetjük el, ha a két értéket összeadjuk. Így ha a sipolós hangzás magasságát akarjuk a 0-ás csatornáról venni, akkor a STYLE 16 és a STYLE 1 értékét összeadva STYLE 17-et kell beírni. Ezért marad ki a 4 és a 8 között is és a többi között is 3 szám, hogy 1-et, 2-őt, 3-at hozzá tudjunk adni. Így a zajcsatornán a STYLE 0-tól kezdve a STYLE 19-ig mindegyik egész értéknek külön funkciója van.
Természetesen nem muszáj nullára állítani a hangerőt a hivatkozott négyszögjelcsatornán. Ha ügyesek vagyunk, meg tudjuk oldani, hogy zeneileg vagy a hangeffekt szempontjából értékelhető legyen a két hang egyszerre. Például, a zenében egy magas hang szól, és közben a dobok hangmagasságát a zájcsatorna erről a magas hangról állítja elő.
Ha nem szól semmi a hivatkozott négyszögjelcsatornán, amikor a zajcsatornán arra a négyszögjelcsatornára hivatkozunk, akkor a zajcsatornán sem fog szólni semmi. Az órajelcsatornán megadhatunk torzítást is, ez is kihatással van a zajcsatorna hangzására. Például:

SOUND SOURCE 3,SYNC 1,STYLE 17
SOUND SYNC 1,LEFT 0,RIGHT 0,PITCH 80,STYLE 16

Ha a végén STYLE 16 helyett STYLE 32, 48 vagy 0 áll, a zajcsatorna hangja más lesz. Nem csak torzítást, hanem akár gyűrűmodulációt vagy felüláteresztő szűrőt is megadhatunk az órajelcsatornán, melyhez a frekvenciát egy másik órajelcsatorna szolgáltathatja, így még változatosabb hangzásokat érhetünk el a zajcsatorna kimenetén. A szűrővel vagy gyűrűmodulációval egyidejűleg akár torzításokat is alkalmazhatunk az órajelcsatornán, közben a zajcsatornán a polinomszámláló értékeiből is többfélét kipróbálhatunk, így elég sokféle hangzást érhetünk el.

Gyűrűmoduláció a 0-ás és a 2-es csatorna között: Az eredeti zenei hangot a 0-ás csatornán szólaltatjuk meg, ehhez megadjuk a STYLE 128 paramétert is, és a 2-es csatornán pedig a másik frekvencia hangmagasságát kell a PITCH érték után megadni. A gyűrűmoduláció tehát a 0-ás és a 2-es csatorna között működik gyárilag, ezt nincs lehetőség módosítani (például nem lehet gyűrűmoduláció az 1-es és 2-es csatorna között). Egy példa:

SOUND SOURCE 0,SYNC 1,PITCH 49,STYLE 128
SOUND SOURCE 2,SYNC 1,PITCH 20

Így a 0-ás csatornán megszólal egy felső C hang, de a hangzása nem a szokásos lesz, mivel a 2-es csatornán megadott hangmagasság (alsó G) valahogy "bezavar" a hangzásba. A 2-es csatorna hangerejét akár teljesen le is halkíthatjuk, így is ki tudja fejteni hatását a 0-ás csatornára és meg tudja változtatni az előbbi C hang hangzását:

SOUND SOURCE 0,SYNC 1,PITCH 49,STYLE 128
SOUND SOURCE 2,SYNC 1,PITCH 20,LEFT 0,RIGHT 0

Talán érdemes a 2-es csatornán is olyan hangot adni meg, mely alapból is jól hangzik a 0-ás csatornán szóló hanggal, pl. C-hez a G illik, vagy egy másik oktávban a C. Különösen jó hangzást eredményez, ha a két hangmagasság csak kicsit tér el, pl. 0.1 vagy 0.2 vagy 0.3, vagy akár 0.05 is lehet a két hangmagasság közötti különbség. BASIC programban zenéhez ideális a következő programrész:

200 SOUND STYLE 128,PITCH A,DURATION B,SYNC 1
210 SOUND PITCH A+.1.DURATION B.SYNC 1,SOURCE 2

A 210-es sorban A+.1 helyett megadható A+.2 vagy A+.3 vagy A+.05 is, mindegyik kicsit más, de kellemes hangzást eredményez. Még akár a gyűrűmodulációt ki is vehetjük (tehát a 200-as sorból a STYLE 128-at elhagyhatjuk), a hangzás akkor is jó lesz. Különösen viszonylag mélyebb hangoknál lesz jó a végeredmény. Gyűrűmoduláció használatakor az órajelcsatornát teljesen le is halkíthatjuk (tehát a 210-es sor végére beírhatjuk a LEFT 0,RIGHT 0 paramétereket), így megint más lesz a hangzás.
Megadható teljesen ugyanaz a hangmagasság is a két csatornán, de ez nem mindig adja ugyanazt a hangzást, mivel a két azonos frekvenciájú négyszögjel nem feltétlen ugyanabban a fázisban találkozik, így akár teljesen ki is olthatják egymást.
Általában zenénél az a jó, ha a két hangmagasság között állandó a különbség. így pl. egy BASIC program részeként a következő is állhat:

200 SOUND SOURCE 0,SYNC 1,PITCH A,STYLE 128
210 SOUND SOURCE 2,SYNC 1,PITCH A-5,LEFT 0, RIGHT 0

De pl. extrémebb elektronikus zenénél váltakozó hangmagasságkülönbség is lehetséges, pl. a gyűrűmoduláció frekvenciáját adó csatorna magassága fixen 20-as pitch érték, a másik csatornán pedig különféle hangok szólnak.
Nincs akadálya annak sem, hogy torzított hangot adjunk meg a két csatorna egyikén, vagy akár mindkét csatornán. (Ha a gyűrűmodulációt bekapcsoló STYLE 128 mellé akarunk még a SOUND utasításba egy torzítást is, pl. STYLE 16-ot, azt is beírhatjuk. Tehát egyetlen SOUND utasításban két STYLE paraméter is szerepelhet. De az is megoldás, ha a 128-at és a 16-ot összeadjuk, és egyetlen STYLE paraméterbe 144-et írunk.) Mivel torzításból is háromféle létezik, valamint a két csatorna közötti hangmagasságkülönbség is elég sokféle lehet, így nagyon változatos hangzásokat lehet elérni. Még abban is sok lehetőség rejlik, hogy a torzítások fajtáját külön-külön a két csatornán hogyan variáljuk, vagy akár mindkét csatornán ugyanolyan torzítást állítunk be.
A hangzások változatosságának lehetőségét tovább bővíti, hogy a gyűrűmoduláció frekvenciáját adó csatornán a hangerő fokozatosan halkulhat vagy hangosodhat a zene során. Ezen kívül eltérő ENVELOPE-okat is beállíthatunk külön-külön mindkét csatornára.
Természetesen az összes létező variáció nem fog mind szépen szólni zenében, de extrémebb zenében vagy hangeffektekhez is sokat fel lehet használni.
Külön meg kell említeni azt a lehetőséget, amikor mindkét csatornán alacsony torzítást állítunk be (STYLE 16) és a két csatorna hangmagasságának különbsége 5 vagy 7 félhang (egy kvart vagy kvint). Ezzel a torzított elektromos gitáréhoz nagyon hasonló hangzást érhetünk el. Közben ügyelnünk kell az alacsony torzítás fent tárgyalt korlátaira is, és olyan értékeket kell megadnunk (sokszor törteket), melyek fix hangzást eredményeznek. Néhány példa torzított elektromos gitárt jól szimuláló hangzásokra:

SOUND STYLE 144,SYNC 1,PITCH 65
SOUND STYLE 16,SYNC 1,SOURCE 2.PITCH 58

SOUND STYLE 144,SYNC 1,PITCH 68
SOUND STYLE 16,SYNC 1,SOURCE 2,PITCH 61

SOUND STYLE 144,SYNC 1,PITCH 62.8
SOUND STYLE 16,SYNC 1,SOURCE 2,PITCH 55.8

Ahogy a példákból látható, torzított gitáros hangzásokhoz 60 feletti számokat érdemes PITCH értéknek megadni a gyűrűmodulált csatornán, és 70 fölé már nem nagyon érdemes menni. Az órajelcsatornán pedig 7-tel (vagy 5-tel) kisebb számot kell megadni hangmagasságnak. A magasabb helyett lehet az alacsonyabb PITCH értékhez állítani be gyűrűmodulációt, ez is elektromos gitáros hangzáshoz hasonló, de kevésbé telt a hangzás, mint a fenti példákban. Burkológörbék megadásával még élethűbb gitáros hangzást érhetünk el.
Az elején szó volt róla, hogy a gyűrümoduláció a 0-ás és a 2-es csatorna között lehetséges. A példáinkban a 0-ás csatornán adtuk meg a STYLE 128 paramétert. De lehet fordítva is. Megadható a 2-es csatornán is a STYLE 128 paraméter, a 0-ás csatornáról pedig elhagyható. Ilyenkor a gyűrűmoduláció frekvenciáját a 0-ás csatorna fogja adni. Sőt, még az is lehetséges, hogy a 0-ás és a 2-es csatornán is megadjuk a STYLE 128 paramétert, ilyenkor a két csatorna kölcsönösen gyűrűmodulálja egymást. A két csatornán ilyenkor is tetszőlegesen beállíthatunk teljesen eltérő hangmagasságokat és különböző torzításokat, tehát az elérhető hangzások repertoárját ez a lehetőség még tovább bővíti. Egészen sajátos hangzások is érhetők el így!

Gyűrűmoduláció az 1-es és a 3-as csatorna között: Az 1-es és 3-as csatornán is kiadhatjuk a STYLE 128 paramétert, így akkor azok egymással hoznak létre gyűrűmodulációt.
Példa:

SOUND SYNC 1,STYLE 128,SOURCE 1, PITCH 49
SOUND SYNC 1,SOURCE 3

A 3-as csatorna a zajcsatorna, így ha az alapértelmezés szerinti magas 31.25 KHz-et használjuk fel a gyűrűmodulációhoz, sajátos hangot kapunk. Itt is használhatunk torzításokat, a zajcsatornán különböző polinomszámláló-értékeket, vagy csak az egyik, vagy csak a másik csatornán állítva be gyűrűmodulációt, esetleg mindkettőn egyszerre. Ha a zajcsatornán a gyűrűmoduláció mellé polinomszámláló értéket is meg akarunk adni, vagy a négyszögcsatornán gyűrűmoduláció mellé torzítást is, akkor a 128-hoz hozzá kell adni a másik STYLE paraméter értékét. A következő például a zajcsatornán gyűrűmodulációhoz (alapból) az 1-es csatorna magasságát használja, valamint 7 bites polinomszámlálót is használ (így lesz a STYLE értéke 128+16=144), így sajátos hangzása lesz:

SOUND SOURCE 1,SYNC 1,PITCH 80,LEFT 0,RIGHT 0
SOUND SOURCE 3,SYNC 1,STYLE 144

A zajcsatorna hangmagassága fix, a PITCH 80 inkább csak a hangzást változtatja meg, mégis valamennyire átjön annak hangmagassága is. A fenti példában megadhatunk 80 helyett pl. 20-at vagy 0-át is, eléggé sajátos hangzása lesz.
Mint már tudjuk, a zajcsatorna hangmagasságát is megváltoztathatjuk, ha egy másik csatornáról vesszük hozzá kölcsön a frekvenciát. Ez a másik csatorna lehet az 1-es csatorna is, amelyet a gyűrűmodulációhoz is használunk, ilyenkor a STYLE paraméter értékéhez értelemszerűen 2-t kell hozzáadni. (Mivel, ha csak 1-et adnánk hozzá, az a 0-ás csatornára vonatkozna.) A fenti példában 146-os STYLE érték, és pl. 60-as vagy 70-es PITCH érték megintcsak sajátos hangzást eredményez. Azonban a frekvenciát vehetjük egy harmadik csatornáról is, tehát a gyűrűmodulációnak is lesz egy frekvenciája, és a zajcsatornának egy másik frekvenciája, például:

SOUND SOURCE 1,SYNC 2,PITCH 70,LEFT 0,RIGHT 0
SOUND PITCH 90,SYNC 2,LEFT 0,RIGHT 0
SOUND SOURCE 3,SYNC 2,STYLE 145

SOUND STYLE 64,SYNC 1,PITCH 37
SOUND SOURCE 1,SYNC 1,PITCH 44

0-ás és 1-es csatorna között

SOUND SOURCE 1,STYLE 64,SYNC 1,PITCH 37
SOUND SOURCE 2,SYNC 1,PITCH 44

1-es és 2-es csatorna között

SOUND SOURCE 2,SYNC 1,STYLE 64,PITCH 49
SOUND SOURCE 3,SYNC 1,LEFT 0,RIGHT 0

a 2-es csatorna és a zajcsatorna között.

SOUND SOURCE 3,STYLE 32,SYNC 1
SOUND SOURCE 2,PITCH 90,SYNC 1,LEFT 0,RIGHT 0

14. BASIC programok láncolása
Az Enterprise memóriájában több (maximum 128) programot is tárolhatunk egyidőben. Az egyes programokat 0 és 127 közé eső sorszámmal különböztetjük meg egymástól. Amikor egy új programot kezdünk szerkeszteni, a BASIC lefoglal számára kezdetben egy szegmens (16K) memóriát. A nullás számú program számára legfeljebb 42K, minden további számára legfeljebb 32K helyet biztosít a BASIC rendszer. A BASIC rendszer a számítógépben lévő teljes szabad memóriát elérheti a programok tárolására, beleértve az esetleges memóriabővítést is. Az

EDIT sorszám

vagy

EDIT "név"

paranccsal határozzuk meg, hogy éppen melyik programot akarjuk szerkeszteni. Ennek számát a gép a képernyő felső részén ki is írja. (Utóbbi alakot természetesen csak akkor használhatjuk, ha a PROGRAM utasítással adunk nevet a programjainknak.) Az aktuális program számára még rendelkezésre álló szabad byte-ok száma a tárban a FREE függvénnyel kérdezhetjük le.
Az egyes programok hívhatják egymást (azaz elindítják a memóriában lévő másik programot), és paraméterátadásra is van lehetőség a

CHAIN sorszám (paraméterlista)

vagy:

CHAIN "név" (paraméterlista)

Egy új program indulásakor (meghívásakor) a változók mindenképpen törlődnek (ahogy egy normál programindításkor), csak az átadott paraméterek őrződnek meg a hívott program számára. (Egy, a rendszertől igényelt szabad szegmensen viszont tetszőleges mennyiségű és méretű adat átadható a programok között.) Ha valamely program paramétert (paramétereket) vár, de meghívásakor nem kap paramétert, vagy elegendő paramétert, a hiányzó paraméterek kezdőértéke 0 (karakterfüzér változó esetén üres string) lesz.

15. Memóriakezelés, gépi kódú rutinok
Az Enterprise központi egysége - a Z80-as mikroprocesszor - 16 címvezetékével 2^16 = 64 kbájtot képes megkülönböztetni. Gépünk mégis maximum 4 Mbájt (256 * 16 384 bájtot) memóriaterületet képes kezelni (ebbe a ROM és a RAM egyaránt beleszámítandó). Ez úgy lehetséges, hogy a CPU címzési tartományát 4 - egyenként 16 kbájtos - lapokra osztották fel és ezekre a területekre a gép periféria-áramköre (a DAVE-chip) lapozza az elérhető 256 db 16 kbájtos memóriaszelet bármelyikét (az ún. szegmenseket). A szegmensszám kötött fizikai paraméter: adott szegmenshez mindig (bármilyen lapozásnál) ugyanazok a memóriarekeszek tartoznak. Azt, hogy a CPU a 4 memóriatartományban - mint ablakon - melyik szegmenst látja, a DAVE-chip 4 írható, olvasható regisztere határozza meg:

176. regiszter (B0H): 0. LAP
177. regiszter (B1H): 1. LAP
178. regiszter (B2H): 2. LAP
179. regiszter (B3H): 3. LAP

A lapozás elvégezhető a BASIC OUT utasításával, de ezt csak az 1. és 2. LAP-on használhatjuk, a 0. és 3. LAP átírása a rendszer összeomlását okozhatja. Az egyes lapokhoz tartozó címtartományok:

0. lap: 00000 - 16383
1. lap: 16384 - 32767
2. lap: 32768 - 49151
3. lap: 49152 - 65536

A

POKE cím,érték

utasítással a fenti Z80 címtartomány tetszőleges tárcímén elhelyezhető az egy bájtos érték, míg

PEEK cím

függvény visszaadja az adott memóriacímen lévő értéket. A RAM szegmensek számát a rendszer a 20Ch (524 dec) címen tárolja, ezt mi is bármikor lekérdezhetjük a PEEK függvénnyel.
A "hagyományos" BASIC-ből örökölt POKE/PEEK utasítást és függvényt körültekintően kell használni, hisz nem garantált, hogy az adott Z80-as memóriacímen épen a kívánt szegmens van belapozva. Ehelyett a SPOKE (Segment POKE) paranccsal bájtot tudunk letárolni egy adott szegmens ofszetcímére, az utasítás formája:

SPOKE(szegmensszám,ofszetcím,érték)

A szegmensszám 0 és 255, az ofszetcím 0 és 16383, az érték 0 és 255 közötti, illetve azzal egyenlő is lehet. Az ofszetcím helyére a megadottnál nagyobb értéket is felvehetünk, az utasítás csak a cím alsó 14 bitjét veszi figyelembe. Így ha például a SPOKE(200,0,0) helyett SPOKE(200,65536,0) írunk, ugyanazt az eredményt kapjuk. A ROM Basic saját, belső memórialapozásával gondoskodik arról, hogy az érték garantáltan jó helyre kerüljön - akkor is, ha a kívánt szegmens épp nincs belapozva -, megmentve a felhasználót ettől a feladattól.
A SPEEK (Segment PEEK) függvénnyel bájtot tudunk beolvasni egy szegmens adott címéről, a forma:

SPEEK(szegmensszám,ofszetcím)

A POKE / PEEK, SPOKE / SPEEK utasításoknak és függvényeknek könnyen elkészítetjük a kétbájtos változatát, mellyel 0 és 65536 közötti értéket helyezhetünk el a memóriában (két egymást követő címen):

100 DEF WSPOKE(SEG,ADDR,X)
110   SPOKE SEG,ADDR+1,INT(X/256)
120   SPOKE SEG,ADDR,X-256*SPEEK(SEG,ADDR+1)
130 END DEF
140 DEF WSPEEK(SEG,ADDR)
150   LET WSPEEK=SPEEK(SEG,ADDR)+256*SPEEK(SEG,ADDR+1)
160 END DEF

A gépi kódú rutinok tárolásának, a kódok memóriába töltésének viszonylag kényelmes eszköze a CODE utasítás. Ez egy füzér (string) karaktereit helyezi el a memóriában. A tárolás kezdőcíme a BASIC munkaterület kezdete. Óvatosan kell tehát bánni az utasítással, hiszen a BASIC program elejét felülírhatjuk vele. Ezt akadályozza meg egy a program elején kiadott ALLOCATE n utasítás, ami n bájttal hátracsúsztatja a programot, helyet csinálva a gépi kódú rutinunknak. Az utasítás törli a változókat, tehát valóban a program elején praktikus kiadni. A CODE utasítás - mint írtuk - egy füzért vár operandusként

CODE = karakterkifejezés

alakban. Például a

CODE=CHR$(6) &"VIDEO:"

utasítás a szöveg hosszát, majd karaktereit helyezi el az aktuális tárolási címtől a memóriában (így várja ezt pl. a csatorna megnyitáskor a rendszer).
Sokat egyszerűsít a beírás munkáján a HEX$ függvény, amely az argumentumában megadott (vesszővel elválasztott) hexadecimális értékeket alakítja bináris számokká és fűzi karaktersorozatba. A

CODE = HEX$ ("21,00,00,C9")

utasítás végrehajtása után pl. a 33,0,0,201 (decimális) értékeket találjuk a memóriában. Ha egy változónevet is megadunk a CODE után, az értelmező a változóba tölti a füzér aktuális tárolási címét. Praktikus ezt a lehetőséget kihasználni, hiszen gyakran szükség lehet a rutinok, adatmezők kezdőcímére (pl. szubrutinhívásnál). A kezdőcímek felhasználását is támogatja az értelmező a WORD$ függvénnyel: ez az argumentumot (0-65 535 közötti érték) alakítja kétbájtos egésszé. pL:

A$=WORD$(260)

PRINT LEN(A$)
2

PRINT ORD(A$(1:1)),ORD(A$(2:2))
4 1

a füzérben elöl az alsó bájt áll, azt követi a felső bájt. Ez a forma általános a gépi kódú programokban a címek megadására. A memóriában elhelyezett gépi kódú program futtatására a USR eljárás alkalmas. Hívható pl.:

CALL USR(cím,hl)

alakban, de alkalmazható akár függvény formában is:

PRINT 12*USR(cím,hl)+5

Az argumentumba természetesen a rutin kezdőcímét kell írni, valamint egy 0-65 535 közötti paramétert. Az értelmező a cím meghívása előtt a paraméter értékét (hl) a processzor HL regiszterébe tölti. Ezt felhasználhatjuk bemenő adatként rutinunkban. Ugyanígy vissza is adhatunk egy értéket (HL-ben) az értelmezőnek, amit az majd függvényértéknek tekint. A meghívott rutint "RET' utasítással kell zárnunk (C9H kód). Ennek hatására tér vissza a vezérlés a BASIC értelmezőhöz. A BASIC a visszaadott értéket előjeles kettes komplemens számnak tekinti.

Hosszabb rutinokat nem kényelmes hexadecimális alakban megadni, erre a célra célszerűbb az ASMON-t használnunk. Tetszőleges gépi kódú rutint lefordíthatunk 4-es típusú EXOS fejléccel (BASIC program). Pl. a HL értékét 256-tal szorzó

M1 LD H,L
   LD L,00
   RET
   END

rutin lefordítva a köovetkező BASIC programot kapjuk:

1 ALLOCATE 8
2 CODE M1=HEX$("65,2E,00,C9,00,00,00,00")

Ennek futtatása után a PRINT USR(M1,2) utasítás a 512-őt ír ki.

A SPOKE utasíts és a SPEEK utasítás alkalmazásával nagy mennyiségű adatot tárolhatunk, egy vagy több szegmensen. A módszer előnye, hogy így BASIC programok / láncolt programok is adhatnak át egymásnak nagy mennyiségű adatot. Célszerű nem "találomra" választani szegmenst (lehet, hogy az épen aktuális konfigurációban használatban van), hanem az EXOS-tól igényelni:

ALLOCATE 9
CODE GETSEGMENT=HEX$("F7,18,67,69,C9")
CODE FREESEGMENT=HEX$("4D,F7,19,C9")
LET WS=USR(GETSEGMENT,0)

WS-be kerül a kiutalt szegmens száma, melyet ettől kezdve szabadon felhasználhatunk adattárolásra. Természetesen így akár egymás után több szegmenst is igényelhetünk (amíg tart a memória). Ha WS értéke nagyobb mint 255, akkor hiba történt (ez lehet megosztott szegmens lefoglalásakor is), ekkor a felsőbájt (azaz az érték/256) a hibakód.
A programfutás befejezése előtt "illik" felszabadítani lefoglalt szegmenst (különben hamar elfogyhat a memória!):

CALL USR(FREESEGMENT,WS)

Vissza