ZX Spectrum

Tippek és Trükkök


Tartalom

Előszó

1. A Spectrumról általában
1.1 Bevezetés
1.2 A ZX 81-estől a ZX Spectrumig

2. Tippek a BASIC nyelvű programíráshoz
2.1 Általános tudnivalók a BASIC nyelvről
2.2 A hatékony programozás

3. PEEK-ek, POOK-ok és USR-ek
3.1 A Spectrum tárja
3.2 A rendszerváltozók
3.3 Néhány tipp és trükk

4. Hasznos rutinok, rövid programok
4.1 Kétszeres nagyságú betűk a képernyőn
4.2 Soronként 64 karakteres ábrázolás
4.3 MASTERMIND

5. Logikai játék: Jelképfejtés
5.1 A játék magyarázata
5.2 A program kidolgozása

6. Látványos képszerkesztés a Spectrummal:
Nappalok és éjszakák a Földön

6.1 A program kidolgozása

7. Kiegészítő készülékek és bővítési lehetőségek
7.1 Bevezetés
7.2 Az Interface 1 bővítő egység
7.3 Sornyomtató
7.4 Fényceruza
7.5 Szövegszerkesztő
7.6 Fordító

8. Táblázatok grafikus ábrázolása
8.1 Bevezetés
8.2 A BUSYGRAPH program kidolgozása
8.3. A program használata

9. A hirdetőoszlop: reklámozás Spectrummal
9.1 Bevezetés
9.2. A program kidolgozása

10. A Spectrum a kisüzemben
10.1 Általános megjegyzések
10.2 A vezérlőprogram
10.3 A BUSYDAT,a vevők adatait nyilvántartó program
10.4 A BUSYDAT program használata
10.5 A BUSYMAN raktár- és forgalomnyilvántartó program
10.6 A BUSYMAN program használata

1. Függelék: A Spectrum utasításkészlete
2. Függelék: Hibajelzések


Előszó

Ha a légi közlekedés az utóbbi években annyit fejlődött volna, mint a számítógépipar, akkor ötven márkáért félóránál rövidebb idő alatt repülhetnénk Frankfurtból Tokióba. A számítógépek meghódították az egész világot. Életünk ma már elképzelhetetlen a számítógépek nélkül. CLIVE SINCLAIR a ZX 81-es és a ZX Spectrum kifejlesztésével jelentős részt vállalt a számítógépek széles körű elterjesztésében. Számítógépei gazdaságosak és kezdőknek kiválóan alkalmasak.
Ez a könyv a jelenlegi és jövőbeli Spectrum tulajdonosokhoz szól. A könyvből megismerhetjük a BASIC nyelv elemi fogásait, és ha már programozni is tudunk, akkor nagyon sokféleképpen használhatjuk majd számítógépünket. A könyv sok útmutatást, tippet, trükköt és programot mutat be a számítógép használatához. A programokat igényeink szerint elhelyezhetjük programkönyvtárunkba, hogy megkönnyítsük velük programjaink írását.
Néhány rövid program bemutatása után egy hosszabb játékprogram készítése következik, amelynek során nem az ellenséget kell lelőni minél nagyobb számban, hanem elsősorban a probléma megoldásán kell gondolkozni. A következő programban a Spectrum grafikus lehetőségeit használjuk ki. A világtérkép megrajzolása után a Nap mindenkori állását, a nappali és éjszakai zónákat is bejelölhetjük a tv képernyőjén.
A gazdaságos és gyors tömegtárolók, a kazettás egységek megjelenésével a Spectrum alkalmazási lehetőségei jelentősen kibővültek. Az alkalmazási lehetőségeket a különböző cégek által nagy választékban kínált tartozékok is (különösképpen a billentyűzetek) növelik. A kiegészítő berendezésekről részletesen tájékoztat a könyv.
A könyv további fejezeteiben olyan ötleteket és programokat mutatunk be, amelyek kisebb üzemekben is jelentősen megkönnyítik a munkát. Ilyenek pl. a raktár- és forgalomnyilvántartó, a vásárló adatnyilvántartó és a diagramokat rajzoló program. A Spectrumot még hirdetések készítésére is felhasználhatjuk, ha a kívánt szövegeket különböző színben és nagyságban megjelenítjük a képernyőn.
A könyv a különböző érdeklődésű olvasóknak segítséget, ötleteket ad és nem utolsósorban kellemes szórakozást nyújt.

1. A Spectrumról általában

1.1 Bevezetés

A ZX Spectrum viszonylag olcsó, sokoldalú számítógép. Segítségével egyrészt örömet lelhetünk a játékokban, másrészt sokat megtudhatunk a számítógépekről is. Ha megfelelően alkalmazzuk, akkor hasznos segítőtársunk lesz. Teljesen kezdőknek először a Spectrum kézikönyv alapos tanulmányozását javasoljuk. A kézikönyv kezdők és haladók számára egyaránt fontos információkat nyújt.
A Spectrum szíve, vagy inkább az agya a ZILOG cég által gyártott Z80-as proceszszor. Ez a 8 bites processzor egy 64 kbyte-os tár címzésére alkalmas. A tárból 16 kbyte-ot az operációs rendszer foglal el, amelyet egy ROM-ban helyeztek el.
Mit jelent az operációs rendszer? Mit tartalmaz a ROM? Az operációs rendszer egy program, tehát szoftver, amely a processzor és a külvilág kapcsolatát teremti meg. Külvilág alatt a számítógép üzemeltetőjét, valamint az egyéb készülékeket (a televíziót, a kazettás egységet és a számítógép billentyűzetét) értjük. A Spectrumnak tudnia kell, hogy mit akarunk tőle. Ezt a megfelelő billentyűk lenyomásával adhatjuk tudomására. Az operációs rendszer felismeri és értelmezi a mindenkori bevitelt. A használó a bevitelnél adott szabályokhoz tartja magát, így az operációs rendszer el tudja dönteni, hogy új program írásáról vagy egy közvetlen végrehajtandó parancsról van-e szó.
Az újonnan megírt programot először tárolni kell, hogy később szükség szerint felhasználhassuk. A Spectrum programnyelve a BASIC. Ez a Beginners Allpurpose Symbolic Instruction Code rövidítése. A processzor nem ezt a nyelvet, hanem saját gépi kódját érti. Ezért a BASIC nyelven írt programokat le kell fordítani, értelmezni kell. Az értelmezőprogramot angolul interpreternek hívják és az operációs rendszer része. Sok számítógép típusnál az operációs rendszer és az értelmezőprogram élesen elkülönül egymástól, a Spectrumban azonban ezek nem választhatók szét.
A számítógépek beépített programjai a használó számára nagyon fontosak, és a számítógépnek megváltoztathatatlan alkotórészei. Ezért ezeket a tárnak egy olyan részében helyezik el, ahonnan csak olvasni lehet. Innen ered a neve is, Read Only Memory, röviden ROM, ami magyarul azt jelenti, hogy csak olvasásra használható tár. Ha az egész tár csak olvasásra lenne alkalmas, akkor saját programjainkat nem tudnánk beírni, és nem beszélhetnénk számítógépről. A tárnak azonban olyan része is van, amibe tetszés szerint írhatunk és amit tetszés szerint törölhetünk. Ezt Random Access Memory-nak, röviden RAM-nak nevezzük (magyarul: véletlen bemeneti memória).

A Spectrumban a ROM-ban elhelyezett programok 16 kbyte-ot foglalnak el. Így a RAM-ban 48 kbyte-ot használhatunk. A tárban a 23685-ös címtől kezdve lehet dolgozni. Az 16385-től a 23685-ig terjedő helyeket a képernyőtár, a rendszerváltozók stb. foglalják le.
Mivel a Spectrum képernyője 256 * 192 pontból áll, és minden 8 x 8-as mátrixot el lehet látni egy színjelzővel, a képernyőtár 6144 helyet igényel, további 704 helyet a színinformációknak kell fenntartani.
A Spectrum teljes karakterkészletének (256 karakter) kódja 0-tól 255-ig terjed. Az első 128 karakter az általános ASCII szabványnak felel meg. A 165-255 között vannak a Spectrum gépen használható BASIC parancsok kódjai. Ez teszi lehetővé, hogy egy parancsot egyetlen billentyű, ill. egy billentyűkombináció lenyomásával beírjunk. A Spectrum billentyűzete nem hasonlít az írógép billentyűzetéhez, a gépbe programozott BASIC parancsok végrehajtása egyszerűbb. Ennek előnye, hogy a beíráskor nem követhetünk el gépelési hibát, ugyanakkor a parancsszavak a tárban csak 1 byte-ot foglalnak el. Más számítógépek sokszor minden betű tárolásához 1 byte-ot igényelnek.
Miként vesz tudomást a Spectrum agya, a Z80 arról, hogy melyik billentyűt nyomtuk le, és hogy az mit jelent? A gép belsejében a billentyűket huzalrendszer köti össze, egy 5 * 8-as háló formájában. Egy billentyű működtetése adott áramköri kombinációnak felel meg. A Spectrum egy speciális chipje az ULA (Uncommitted Logical Array, magyarul: nem lekötött logikai tömb) érzékeli azt, hogy melyik kombinációról van szó. A billentyűknek több jelentése van. A rendszerváltozók határozzák meg a Z80-as számára a billentyűk aktuális értékét, valamint azt is, hogy milyen beviteli rendszerben dolgozunk. A billentyű jelentésének értékelése után jelenik meg az információ a képernyőn.
A Spectrumot BASIC-ben és gépi kódban is lehet programozni. Könyvünkben főként a BASIC nyelvű programozással foglalkozunk. A programozás elkezdése előtt röviden tekintsük át a jó öreg ZX 81-es és a Spectrum közötti eltéréseket. Az eltérések bemutatásával a haladók és az egyéb rendszereket már ismerők tanulási idejét szeretnénk lerövidíteni.

1.2 A ZX 81-estől a ZX Spectrumig

A Sinclair ZX 81-esről a Spectrum programozására könnyű az áttérés, csak azt kell megszoknunk, hogy egy sokkal gazdagabb nyelven, a BASIC-en programozhatunk. A Spectrum használatakor - ellentétben a ZX 81-essel - lehetőségünk van arra, hogy egy sorszám alatt több utasítást írjunk, vagy közvetten üzemmódban utasításokat kettősponttal elválasztva adjunk be. A SLOW és a FAST üzemmód között nincs különbség, a Spectrum mindig FAST módban dolgozik. A SCROLL parancsra sincs többé szükség. Ha a képernyő tele van, akkor automatikusan megáll, és felteszi a SCROLL? kérdést. Új sor kiírását egy billentyű lenyomásával érhetjük el. A SCROLL utasítást a RAND USR 3582-os ROM rutinnal pótolhatjuk.
A Spectrum jóval nagyobb grafikus felbontóképessége miatt a PLOT utasítás alkalmazásánál lényeges különbségek vannak. Az UNPLOT utasítást nem ismeri a Spectrum, de sok olyan grafikus parancs van, ami a ZX 81-esnél még nem létezett. (A BASIC utasítások teljes listáját és magyarázatát az 1. függelék tartalmazza.)
A Spectrumnak ugyan kevesebb rögzített grafikus karaktere van, viszont 21 szabadon meghatározható és mindig hívható karakterrel rendelkezik. Kis ügyességgel teljesen új karakterkészletet határozhatunk meg, vagy több karakterkészletet egymás mellett is használhatunk. A harmadik, és főként a negyedik fejezetben erre még visszatérünk. Egy rutint mutatunk be, amivel a Spectrum 64 karaktert tud soronként a képernyőn megjeleníteni.
A Spectrum - ellentétben a ZX 81-essel - ASCII kódban dolgozik.
A ZX Spectrumnál a CLEAR utasítással a RAMTOP lejjebb hozható. A CLEAR utasításban a cím maximális értékét decimálisan kell megadni. A használó által meghatározott karakterek, az UDG-k, mindig egy NEW törlési parancstól védett területre kerülnek.
A Spectrum hatszor gyorsabban veszi fel a programokat kazettára, mint a ZX 81-es, ezért a tárolás problémamentesebb. A SAVE parancs végrehajtását VERIFY paranccsal ellenőrizhetjük, így az adatok elvesztése kizárt. Ha a programokat egy LINE utasítással kiegészítve visszük fel, akkor azok betöltés után az adott sortól kezdve automatikusan íródnak be. Betöltéskor a program neve megjelenik a képernyőn.
A rendelkezésre álló 8 színen kívül a Spectrum hangokat is ad a BEEP utasítás hatására. Természetesen sem a PINK FLOYD, sem a Bécsi Filharmonikusok nem vállaltak keresztapaságot az utasítás kidolgozásában, mégis érdekes hangeffektusokat lehet létrehozni. Egy sakkprogramban (Spectrum Voice Chess) pl. az emberi beszédre hasonlító hangokat fedezhetünk fel.
A SCRENN$ paranccsal a képernyő teljes tartalmát tárolhatjuk szalagon, abban az esetben is, ha nagy felbontású grafikáról van szó. Ez azért lehetséges, mert a Spectrum a BASIC programokon kívül byte-ok tárolását és betöltését is lehetővé teszi. A SAVE "Név" SCREEN$ a SAVE "Név" CODE 16384, 6912 paranccsal azonos. A képernyő file a 16384-es címtől kezdődik és pontosan 6912 byte hosszú. A képernyő file tehát rögzített hosszúságú, ellentétben a ZX 81 -essel.
A SCREEN$ parancs másképp is felhasználható, ha ellátjuk két argumentummal. Az egyik a sor-, a másik az oszlopszámot jelenti, eredményül pedig azt a karaktert kapjuk, ami a képernyőnek ezen a helyén található. Hasonló feladata van a POINT (sor, oszlop) parancsnak is. Le lehet kérdezni vele, hogy a képpontnak éppen írás - vagy háttérszíne van-e. Ebben az esetben a sorok és az oszlopok értékei a grafikus rendszerben értendők, tehát a 0-tól 255-ig, ill. 175-ig terjedő számok.
A Spectrumba a számokat bináris alakban is beadhatjuk a BIN utasítással. Így a PRINT BIN 00000100 utasítás a 4-es számot állítja elő. Ez különösen a karakterek meghatározásánál jelent nagy segítséget. A karaktert egyszerűen fel kell rajzolni egy 8 * 8-as rácsra, majd a megfelelő helyekre 1-eseket kell beírni. Így elmarad a tízes számrendszerbe való átszámítás, ami több karakternél sok munkával járna. Egy kis példával megvilágítjuk ezt a módszert. Ha az S betűt szeretnénk meghatározni, akkor a számokat az alábbiak szerint a megfelelő tárhelyekre kell bevinni, pl. USR "a"-tól USR "a"+7-ig.

BIN 00000000
BIN 11111111
BIN 10000000
BIN 10000000
BIN 11111111
BIN 00000001
BIN 00000001
BIN 11111111

A PRINT USR "a" a karakter helyes képét mutatja.
Adatokat DATA utasításokban tárolunk és READ utasításokkal olvasunk. RESTORE utasítással jelölhetjük ki azt a sort, amitől az olvasást kezdeni akarjuk.
A Spectrum ROM tárja nagyobb, minta ZX 81-esé, így a rendszerváltozók elhelyezkedése is más. A rendszerváltozókat, valamint a PEEK-ek és POKE-ok által nyújtott lehetőségeket a 3. fejezetben tárgyaljuk részletesebben.
Néhány eltérés a két gép külsejében is van, legszembetűnőbb a billentyűzeté.
A SINCLAIR cég Spectrumnál is szóba jöhető bővítési lehetőségei jelentősek. Az Interface bővítő egység és a kazettás egység olyan kiépítési lehetőségeket nyújt a Spectrumnak, hogy drágább készülékekkel összehasonlítva sem kell szégyenkeznie. A kazettás egységgel egy gazdaságos és relatíve gyors (gyorsabb, mint néhány lemezegység) háttértár áll rendelkezésünkre. A beépített RS 232-es csatlakozóhoz több nyomtató illeszthető közvetlenül, vagy adapteren (átvivőn) keresztül kapcsolat építhető ki más számítógépekkel. A gép érdekessége, hogy helyi hálózaton maximálisan 64 db Spectrum (és Sinclair QLS) közvetlenül összekapcsolható. Részletesen a 7. fejezet foglalkozik ezzel a problémával.

2. Tippek a BASIC nyelvű programíráshoz

2.1 Általános tudnivalók a BASIC nyelvről

A BASIC nyelvet eredetileg kezdő programozóknak szánták. Mint minden széles körben elterjedt programnyelvnek, a BASIC-nek is léteznek továbbfejlesztett változatai, amelyek - nagy rugalmasságuk miatt - különböző számítógép típusoknál alkalmazhatók. A BASIC programnyelvet bonyolult problémák megoldására is használhatjuk. Minél összetettebb egy program, annál nagyobb a lehetséges hibaforrások száma, és a programírás is több előkészítő munkát igényel.
A programozást módszeresen kell végezni. A folytonos javítgatás nem vezet végleges, jó programhoz. Az állandó átdolgozás fárasztó, unalmas munka és sok, nehezen észrevehető hibát okoz. A fölösleges munka elkerülésére és a hibák kiküszöbölésére a legtöbb esetben célszerű a feladatot papíron, ceruzával felvázolni. Minden feladatot fel lehet bontani részfeladatokra, és ezeket egyenként, egyszerűbben meg lehet oldani.
A hivatásos programozók a program menetét ún. folyamatábrán szokták ábrázolni. A folyamatábra mindig START blokkal kezdődik és STOP blokkal végződik. A kettő között van a lényeg. A program minden részfeladatához egy blokkot rendelünk, és a blokkokat nyilakkal kötjük össze. A nyilak a lehetséges programvégrehajtás irányát és sorrendjét mutatják meg. A blokkokban az egy-egy programrészben végrehajtandó feladatokat tüntetjük fel. Nagyobb programok készítésénél tanácsos a folyamatábrát vagy legalábbis feladatok részletes listáját elkészíteni. A 4. fejezetben a MASTERMIND programnál bemutatjuk a folyamatábra készítését. Ha az előkészítő munkákkal készen vagyunk, akkor a számítógépet már érdemes bekapcsolni.
A programba hasznos magyarázó megjegyzéseket iktatni, amelyeket REM-mel kezdődő sorokba kell írni. Itt a különböző programrészek jelzésein kívül a használt változók jelentését is elmagyarázhatjuk. Ha később megtelik a tár, akkor a REM-eket egyszerűen kitörölhetjük, de addig is sok segítséget nyújtanak.
A PASCAL programnyelv előnyös tulajdonsága az ún. eljárás-elv. Az eljárásokat programban tetszőleges néven határozhatjuk meg, és ezen a néven bármikor hívhatjuk. A BASIC néhány új változatában már megvalósították ezt az elvet, de a Spectrumnál még nem. A Spectrumnál is megvalósítható egy ehhez hasonló eljárás, ha a program elején a következőket írjuk:

LET menu=900
LET feladat1=1500
...
LET feladatn=6666

Ha a megfelelő programrészeket a RETURN utasítással fejezzük be, akkor az egyes feladatokat a GOSUB feladat1, GOSUB feladat2 ... stb. utasításokkal hívhatjuk. A program sokkal áttekinthetőbbé válik. Előnye az is, hogy a program átírásánál gyakran csak a sorszámot kell megváltoztatni, és a rutinok hívása helyes marad.
Ajánlatos a programokat egységesen összeállítani, és ehhez ragaszkodni. A menü-vezérelt programoknál pl. a menüt mindig a 9000-es sornál kezdjük. A különböző részfeladatok pedig kezdődhetnek az 1000-es, 2000-es stb. sorokban. A 100-astól a 999-esig terjedő sorokat szubrutinok írására használhatjuk, a 20-astól a 99-esig terjedő sorokban pedig a változókat tárolhatjuk. Az első sorokban határozhatjuk meg az írás, a háttér, a keret színét és a különböző részfeladatok kezdősorait.

1 CLEAR 65535
2 INK 0: PAPER 6: BORDER 3: CLS
3 LET keret=100: LET hiba=150: LET hang=200
10 LET menu=9000: GOTO menu
20 DIM a (100): DIM b(32)
30 DIM g$(17,3)
...
90 GOTO menu
100 REM keret
...
140 RETURN
150 REM rossz bevitel
...
190 RETURN
200 REM hang
...
290 RETURN
...
1000 REM elso rutin
...
1990 GO TO menu
...
9000 CLS: PRINT "Fomenu"
...

A programban a változók számára úgy biztosítunk tárhelyet, hogy egyszer az elején beadjuk a GOTO 20 közvetlen parancsot. A programot LINE 1 utasítással együtt tároljuk, így betöltés után automatikusan fut, anélkül, hogy a változókat törölné. Ha valamilyen hiba miatt a program leáll, akkor a GOTO 1-gyel újraindítható. Ha minden programnál így járunk el, akkor a fenti címet csak egyszer kell megjegyeznünk.
A programok könnyű átalakíthatósága és a hibakeresés miatt az áttekinthető programozáson kívül célszerű a programlistákat tagoltan szerkeszteni. Ez egyrészt sok REM utasítással, másrészt a színek variálásával, üres sorok beiktatásával érhető el. Egy REM utasítás pl. a következőképpen lesz jól látható:

100 REM **********

vagy

100          REM

Rövid alprogramokat (szubrutinokat) pl. a következőképpen írhatunk:

100 REM A 10-15 sorok torlese
110  FOR i=10 TO 15
120   PRINT AT 10,i,,
130  NEXT i
140 RETURN

A Spectrum kézikönyvben megtalálhatjuk a színek kódjait. A PRINT utasítással kiírandó szöveg színét ezekkel lehet meghatározni akkor, ha nem akarjuk az INK és a PAPER utasításokat használni. A lista tetszés szerinti helyén alkalmazhatjuk ezeket az utasításokat. A programrészek elejét pl. pirossal könnyen kiemelhetjük (a megfelelő sor előtt a CAPS SHIFT és a SYMBOL SHIFT billentyű egyszerre való lenyomásával), így bővített módba kerülhetünk. Ezután a CAPS SHIFT és a kettes billentyű lenyomásával a sor végén megszüntetjük az előző színt, és kijelöljük az alapszínt. Így elérhetjük egy sor vagy akár az egész lista villogását.
A kódokat egyszerű megjegyezni. Először is bővített módba kell kerülni, majd a 0-tól 7-ig terjedő számok lenyomásával a háttér megfelelő színét beállítani. A 8-as és a 9-es az élességet fogja befolyásolni. Ha a számokkal egy időben a CAPS SHIFT billentyűt is lenyomjuk, akkor az írás színét állítjuk be, ill. a 8-assal és a 9-essel a villogást kapcsolhatjuk ki és be.
Ha elkészítettük a programot, és az rendeltetésszerűen lefutott, akkor szánhatunk még egy kis időt arra is, hogy felrakjuk az i-re a pontot. Tegyük a programot olyan mutatóssá, amennyire csak lehet! A színek és a hangok (vagy helyesebben a BEEP-ek) is rendelkezésünkre állnak a Spectrumban, használjuk ezeket is! Még a fekete-fehér televízión is érdemes a különböző színeket használni, mivel a különböző tónusú szürke árnyalatok áttekinthetőbbé teszik a képernyőt. A zöld vagy a sárga írás fekete háttéren nagyon jól mutat, és hosszan tartó használatnál nem olyan fárasztó a szemnek, mint a fekete írás fehér alapon. Áttekinthetőbb lesz a képernyő, különösen akkor, ha azonos típusú információkhoz mindig azonos színeket rendelünk.
Alig van olyan hosszú program, amelyik valahol ne tartalmazna egy kis hibát. Mindenesetre célszerű a hibák számát a lehető legkisebbre csökkenteni. A hibák legtöbbször a programfutás szélsőséges eseteinél lépnek fel, pl. amikor az adatmező már tele van, és szeretnénk valamilyen műveletet végrehajtani az adatokon. Ritkán előforduló helyzetekben a probléma akkor is jelentkezhet, ha a művelet normál esetben mindig működik.
Ne sajnáljuk az időt az alapos tesztelésre, különösen akkor ne, ha az általunk írt programot más is használni fogja. Adjuk át programunkat olyan szakembernek, aki nem vett részt a programozásban, és különösebb tájékoztatás nélkül kérjük meg, hogy használja a "mestermunkát". Velünk kevésbé fordulhat elő, hogy saját magunk által készített programjaink használata során hibás adatokat adjunk be, vagy olyasmit műveljünk, amitől teljesen "fejre áll" a program.
Ha még van hely a tárban, akkor célszerű minél több bevitelt segítő magyarázatot a képernyőre kiíratni. Gyakran pár hét múlva már magunk sem emlékszünk pontosan az egyes programrészekre, így ezek a magyarázatok nekünk is segítenek.

2.2 A hatékony programozás

A programszerkesztéssel kapcsolatos eddigi meggondolásaink többé-kevésbé hatékony tárkihasználást eredményeztek. Sok lehetőségünk van még arra, hogy a tárhelyekkel takarékosan bánjunk. Egy kis példát már láthattunk. Tegyük fel, hogy szeretnénk a képernyő 10. sorát törölni. Ezt a

PRINT AT 10,0,"                         "

paranccsal végezhetjük el, azaz írunk egy 32 elemből álló üres füzért. A

PRINT AT 10,0,,

paranccsal ugyanezt érjük el, de 32 byte-tal kevesebb tárhelyre van szükségünk.
A számok tárolására a Spectrumban 5 byte van, a kulcsszavak csak 1 byte-ot foglalnak el. A változók tárolása is 1 byte-ot igényel. Ezért a fenti parancsot még hatékonyabban így írhatjuk:

PRINT AT 10,VAL "0"

vagy

PRINT AT 10,NOT PI,,

A PI/PI az 1, a NOT PI a 0 helyett áll. Ha egy hosszú programban megnézzük, hogy milyen gyakran szerepel a 0, ill. az 1-es, akkor könnyen kiszámíthatjuk, hogy esetünkben mennyi tárhelyet nyerhetünk a numerikus változók következetes helyettesítésével.
Ha az olyan utasítás sorszámát, amelyikre sokat hivatkozunk, változóra (lehetőleg rövidre) cseréljük fel, akkor szintén helyet nyerünk. Ilyen pl. annak az utasításnak a sorszáma, amiben a menü áll. Itt célszerű a 9000-t pl. m-mel helyettesíteni, vagyis GOTO 9000 helyett mindig a kisebb helyigényű GOTO m-et írni.
A rend kedvéért meg kell említenünk, hogy ez a módszer egy kicsit lassítja a program futását, mert a gépnek minden esetben ki kell keresnie a változó értékét. Ez az időbeli különbség azonban általában nem jelentős. Célszerű ugyanazt a változónevet annyiszor használni, ahányszor csak lehetséges, mivel az új változó plusz helyet foglal el. Vigyázni kell természetesen arra, hogy fölül ne írjuk azoknak a változóknak az értékét, amelyekre a későbbiekben még szükségünk lehet.
Ha egy programban sok olyan számot kell tárolnunk, amelyeknek értéke nem nagyobb mint 255, akkor ezeket a számokat azzal a karakterrel helyettesítsük, amelyik az adott számnak megfelel. Ez természetesen csak egész számoknál lehetséges. Egy szám tárolásához csak 1 és nem 5 byte-ra van szükség. A karakterből azután a szám értékét a CODE utasítással visszakaphatjuk.
Ha a számok értéke 65536-ig terjed, akkor is megéri azokat 2 byte-on karakterekként tárolni. Az egyik byte az INT (szám/256), a másik byte a szám - 256*INT (szám/256) érték tárolására való. A fenti módszerrel hivatkozik a Spectrum a 65536 tárhelyére. A következő fejezetben gyakran lesz dolgunk ezzel a címzéssel.

Az Interface 1-gyel, vagy anélkül, az egyszerű PRINT utasítás helyett a PRINT#-et is írhatjuk, ha a képernyő mellett a nyomtatót is szeretnénk adatkivitelre használni.
Egy szokásos ROM-nál 3 különböző csatorna van, amelyeket 1, 2, ill. 3-mal jelöltek. Az első csatornához, amelyet k-val jelöltek, a képernyő alsó része tartozik, ezen keresztül megy végbe a bevitel (INPUT). A második csatornát s-nek nevezzük, a képernyő felső, általában a nagyobbik részéhez rendelték, ezen keresztül végzik a képernyőre a megjelenítést (PRINT). A harmadik csatornához a nyomtató csatlakozik.
Ha az Interface 1-gyel dolgozunk, akkor további csatornák is vannak. Pl. az m a kazettás egységé, a t és a b a sornyomtatóé, az n pedig a hálózaté. A PRINT "hallo" utasítás tulajdonképpen a PRINT# 2,"hallo" utasítás rövidített formája. Az LPRINT "hallo" viszont a PRINT# 3,"hallo" utasítás megfelelője. Hasonlóan működik a LIST, ill. a LLIST utasítás is. Ezeket az utasításokat sok programnál ki lehet használni, és így egyszerűbben lehet a képernyőre írt információkat kinyomtatni.
Példa a fentiek megvilágítására:

100 REM kivitel
110 LET kivitel=2
120 FOR i=1 TO 200
130 PRINT# kivitel,a(i),b(i)
140 NEXT i
150 IF kivitel=2 THEN INPUT "nyomtatni I/N";m$
160 IF m$="i" THEN LET kiviel=3: GO TO 120
170 LET kivitel=2

Ha a programban a ciklus előtt a kiviteli változó értékét 2-re állítjuk, akkor a kiírás a képernyőn jelenik meg. A 150-es sorban meg kell válaszolnunk a kérdést, hogy kívánunk-e nyomtatni. Ha igen, akkor a kiviteli változó értéke 3-ra változik, és az eredmény megjelenik a nyomtatón. A módszer biztonságos, és különösen a sok PRINT utasítást tartalmazó programoknál hasznos, mivel időt takarítunk meg vele. A programteszteléshez papírt sem kell használnunk, hiszen a képernyőre íratunk.

3. PEEK-ek, POOK-ok és USR-ek

3.1 A Spectrum tárja

Az olvasó számára talán különösnek tűnik ennek a fejezetnek a címe, de a beavatottak már tudják, hogy miről van szó. Most egy kicsit a Spectrum tárjával kívánunk foglalkozni. A tárban minden helynek címe van. Ha meg akarjuk tudni, hogy egy adott helyen mi áll, pl. az 1000-es helyen, akkor ezt az utasítást kell írnunk:

PRINT PEEK 1000

Válaszként erre megjelenik a képernyőn egy 0 és 255 közötti szám, esetünkben a 9-es. A PEEK utasítás tehát a következőt jelenti: Nézz utána, mi áll az adott tárhelyen! Ha egy konkrét számot, pl. a 6-ot szeretnénk egy adott, pl. a 30000-es címen tárolni, akkor a

POKE 30000,6

utasítást írjuk.
Természetesen ezt csak a tár RAM területén lehet megtenni. Ha a ROM-ban is megtehetnénk, akkor az operációs rendszer tönkremenne.
A tár címei a lehető legegyszerűbbek, ui. 0-nál kezdődnek és a Spectrum típusától függően 32767-ig (16 kbyte), ill. 65535-ig (48 kbyte) terjednek. Az első 16 kbyte-ot, pontosabban az első 16383 helyet a ROM foglalja el. Erre a területre POKE utasítással nem írhatunk, csak a tartalmát olvashatjuk PEEK utasítással. A ROM-ból az operációs rendszer egyes rutinjait használhatjuk, programunkkal hívhatjuk. Ennek módszerét és az érdekesebb rutinokat a későbbiekben közelebbről is megmutatjuk.
A 16384-től 22527-ig terjedő tárhelyeken a képernyő-file, azaz a képernyőre vonatkozó információk helyezkednek el. Ez pontosan 256*192/8=6144 byte-ot jelent. A képernyőn minden 8*8-as mátrix egy nyomtatási pozíciónak felel meg, mindegyikhez hozzárendelhetünk egy adott színt is. Ez a 32*24=768 byte még a képernyő file-hoz tartozik, és a 22528-tól 23295-ig terjedő helyeket foglalja el a tárban. A nyomtató puffertárja 256 byte-os, és 23296-tól 23551-ig terjed. Ezután következnek a rendszerváltozók, amelyek fontos adatokkal segítik a programok szervezését. Nem minden adat található meg egy rögzített címen. Gyakran célszerűbb csak azt megjegyezni, ahol a keresett adatok címe már megtalálható. A fenti megoldás egy gyakran úton levő kereskedőhöz hasonlítható. A kereskedő útja során, ha új helyre érkezik, hazatelefonál és megadja az aktuális telefonszámot. A munkatársak gyakran nem tudják pontosan, hogy hol tartózkodik, de ha el akarják érni, tudnak egy állandó telefonszámot, az otthoni hivatalának számát, ahol megtudhatják az aktuális telefonszámot.
A rendszerváltozókhoz, amelyek az adatok helyéről tájékoztatnak, a kazettás egység tartalomjegyzéke és a csatorna információ csatlakozik. Ezután következik a tulajdonképpeni BASIC terület, ahol először a programot, majd a programban használt változókat tároljuk.
A teljes BASIC területen kívül még a UDG-k részére is van hely a tárban.

3.2 A rendszerváltozók

Az Interface nélküli Spectrumban a rendszerváltozók a tár 23552-es helyétől a 23733-asig találhatóak. Ha az Interface 1-gyel kazettás egységet, RS 232-es csatlakozót és hálózati csatlakozót is használunk, akkor a változók a 23734-től 23791-ig levő helyeken vannak. A változók közül néhányat ügyesen kiolvashatunk (PEEK) és be is írhatunk (POKE) utasítással, ez azonban meglepő eredményekhez, pl. a teljes leálláshoz vezethet.
A változókat nevekkel látjuk el, ezek azonban nem lehetnek azonosak a BASIC-ben használtakkal. Ha egy változó értékét meg akarjuk változtatni, akkor nem adhatunk pl. LET VALT=0 utasítást. A megfelelő értéket POKE utasítással vihetjük be a tárbeli címre. Ha olyan változóról van szó, ami 2 byte-ot foglal el, akkor mindig az első byte a kevésbé jellemző. Ha a d decimális számot a z 2 byte-os címre akarjuk beírni, akkor az utasítás:

POKE z,d-256*INT (d/256)
POKE z+1,INT (d/256)

Az előbb beírt érték olvasásához a

PRINT PEEK z+256*PEEK (z+1)

utasítást írjuk be. Az eredményt decimális alakban kapjuk meg.
A rendszerváltozók magyarázatát a Spectrum kézikönyvben találhatjuk meg. Most néhány rendszerváltozó jelentésével és a POKE utasítás hatásaival foglalkozunk.

23560 LAST K

Ezen a helyen tároljuk az utoljára lenyomott billentyű kódját. Ha ezt a kódot direkt üzemmódban lekérdezzük, akkor válaszként mindig 13-at kapunk.

23561 REPDEL

Megadja azt az időt 1/50 s-os egységben, mialatt a lenyomott billentyű hatása automatikusan megismétlődik. Indulásnál ez az érték 35. Ha POKE utasítással az 1-es számot írjuk be, akkor érdekes hatást tapasztalunk. A hatást fokozhatjuk, ha a következő címre is beírunk egy 1-est.

23562 REPPER

Itt ui. a két ismétlés közti idő áll 1/50 s-os egységben. Ennek az értéke általában 5. Ha a 23561-es és a 23562-es címen egyaránt 1 áll, akkor többé-kevésbé lehetetlen a további bevitel. Ilyenkor legtöbbször csak a hálózati csatlakozó kihúzása segít.

23606-23607
CHARS

Itt a jelkészlet kezdő címe, a -256 áll. A jelkészlet a CHR$ 127-tel végződik. A 256-ot azért kell levonni, mert a 32*8=256. Ezt a címet célszerű beírni, hogy egy saját jelkészletet meghatározhassunk. A 4. fejezetben élni fogunk ezzel a lehetőséggel, hogy soronként 64 karaktert ábrázolhassunk.

23608 RASP

A figyelmeztető hang hosszúsága. Olyankor szólal meg, amikor a tár megtelt, és nincs lehetőség további bevitelre. Értéke 64, és nem célszerű megváltoztatni.

23609 PIP

A billentyű lenyomását kísérő hang hossza. Értéke általában 0. Néhány programnál megválaszthatjuk a hang hosszát egy szám beírásával. A szám megválasztásánál legyünk óvatosak!

23613-23614
ERR SP

Itt az a cím található, amelyre hiba esetén ugrunk.

23617 MODE

Azt a módot jelzi, amiben éppen vagyunk. Értéke általában 0.

23624 BORDR

A keret színe * 8. A képernyő alsó részét tároljuk itt. A 132, 176, 198 stb. beírása eredményes. A legegyszerűbb a 0-tól 255-ig terjedő számokat sorra kipróbálni, vigyázva arra, hogy minden értéknél írjunk a képernyő utolsó két sorába is. A megjelenítés így jobb lesz.

23627-23628
VARS

A változók és ezzel egyben a BASIC programok végének címét adja meg.

23635-23636
PROG

A BASIC programok kezdetét jelzi. A VARS-sal együtt a programok hossza kiszámítható.
256*(PEEK 23628-PEEK 23636)+PEEK 23627-PEEK 23635

23659 DF SZ

A képernyő alsó felében lévő sorok számát adja meg. Ez általában 2. Ha ide 0-t írunk, akkor többé nem lehet hibaüzenetet kiadni. A BREAK billentyű lenyomására a rendszer "elszáll", és még a program se listázható ki.

23672-23674
FRAMES

A képváltozásokat számolja, minden 20. ms-ban 1-gyel növekszik. Beállítható időmérésre, a számlálást csak a töltés, a megőrzés és a BEEP használata szakítja meg. Az óra használatát a 4. fejezetben ismertetjük.

23675-23676
UDG

Az első általunk meghatározható grafikus szimbólum címe, amit a PRINT USR "a" paranccsal kérdezhetünk le. Ha a tár már nagyon tele van, akkor a POKE utasítás a felesleges karaktereket eltávolítja, így tárhelyet nyerhetünk.

23677-23678 COORDS

Ez a két hely az utoljára kirajzolt pont x és y koordinátáját adja meg. Néha POKE utasításba is célszerű beírni, még akkor is, ha az megfelel a PLOT utasításnak.

23684 S POSN

A nyomtatási pozíció oszlopszámát adja meg. 33-tól lefelé számol, az AT viszont 0-tól felfelé.

23685

Analóg a 23684-gyel, de magát a sorszámot mutatja. Ezen értékek ismerete gyakran hasznos.

23692 SCR CT

A görgetések számát adja meg, mielőtt azt a SCROLL lekérdezéssel megszakítanánk. Ha ide mindig egy 1-nél nagyobb számot írunk be, akkor a görgetés sose ér véget.

23693 ATTR P

Az aktuális színt határozza meg, hasonlóan a 23624-eshez. Ide is célszerű valamilyen számot (pl. 155, 156, 157) vagy 0-t beírni.

23730-23731
RAMTOP

A BASIC számára rendelkezésre álló utolsó byte címét adja meg. CLEAR-rel változtatható meg.

23732-23733
P-RAMT

A tár utolsó byte-jának címét adja meg. Lekérdezésével megtudjuk, hogy 16 vagy 48 kbyte-os Spectrum gépen dolgozunk-e.

23791 COPIES

A kazettás egységen készítendő másolatok számát mutatja. Ha itt nagy számot adunk meg, akkor a file elérési idejét lerövidíthetjük.

3.3 Néhány tipp és trükk

A fejezet végén sok olyan tanácsot adunk és foglalunk össze, amelyek részben a programírásnál, részben a programtárolásnál szükségesek ahhoz, hogy a jogtalan használók ne készíthessenek listát róla.
A Spectrumot gépi kódban is lehet programozni. A gépi kódú programokat vagy programrészeket a BASIC programból a

RAND USR n

vagy a

PRINT USR n

utasításokkal hívhatjuk, ahol n a program kezdő címét jelöli. Egy ilyen gépi kódú program a RETURN utasítással (természetesen ennek gépi kódú alakjával) végződik.
A ROM-ot is gépi kódban írták. A program sok rutinból áll, amelyek általában RETURN utasítással zárulnak. Ezek hívható és használható rutinok. Ha nem akarjuk hidegindításhoz a gép csatlakozóját a hálózatból kihúzni (gyakori ismétlése nem használna a gépnek), akkor a következő ROM utasítást adjuk:

RAND USR 0

Az utasítást veszély nélkül kipróbálhatjuk pl. a képernyőtörlésnél. A

RAND USR 3435

utasítás törli a képernyőt.
A CLS utasítással egyszerűbben törölhettük volna a teljes képernyőt, a képernyő alsó részét azonban csak a

RAND USR 3652

utasítással törölhetjük.
A SCROLL? lekérdezéssel tudhatjuk meg, hogy a ROM-nak melyik részén vagyunk képernyőtörlés közben. A rutin a görgetést végzi. Attól függően, hogy hol lépünk be a SCROLL rutinba, különböző hatásokat érhetünk el.

RAND USR 3280 - Egy sort feljebb görget
RAND USR 3582 - Egy sort és a keretet feljebb görgeti
RAND USR 3652 - A kép alsó felét görgeti
RAND USR 3583 - A kép alsó felét a kerettel együtt görgeti
RAND USR 3330 - Az 1. sorba görget.

Az előző fejezetben már láttuk, hogyan lehet a keret és a képernyő utolsó két sorának színét egyszerre befolyásolni, és egyúttal a villogást is szabályozni. Ezt a

POKE 23624,n

utasítással értük el ahol n értéke 0-tól 255-ig terjedt. A nagyobb számok a látványosabb hatásokat eredményezték. A képernyő színének megváltoztatására a

POKE 23693,n

utasítást kell beírni.
Ha a programunkat védeni kívánjuk a jogtalan használóktól, akkor több trükkre van szükségünk. Vannak olyan cégek, amelyek a másolásvédelem szoftverjeinek írásával foglalkoznak. A tökéletes programvédelmet még nem sikerült megtalálni. A védelemmel együtt a védelem kijátszásának módszerei is fejlődnek. Ma még senki se gondot arra, hogy papírjának és a tintájának azonos színt válasszon, és ezzel az írását láthatatlanná tegye. Talán ez jó módszere volna a másolás elleni védekezésnek, de még senki sem gondolt rá.
Mindenesetre egy COPYRIGHT jelölést betehetünk a listába, ami a saját nevünket tartalmazza! Ha ezt az 1. sorba írjuk, és utána

POKE 23756,0

utasítást adunk, akkor az 1. sort átszámoztuk 0-ra és listázáskor ez többé nem jelenik meg. Megtréfálhatjuk a kezdőket, ha a

POKE 23606,20

vagy a

POKE 23606,111

utasításokat adjuk be (a szám tetszőleges lehet). Ezek az utasítások az írást olvashatatlanná teszik. A kiírás azért lesz olvashatatlan, mert a jelkészlet kezdő címét száműztük. Ha vissza akarjuk állítani, akkor a szám helyére 0-t kell írnunk. Természetesen a karakterkészlet kezdő címének ezt a megváltoztatását ki is használhatjuk, pl. saját karakterkészletünk meghatározására. A következő fejezetben ezt részletesen fogjuk tárgyalni.
A programból való kilépés megakadályozására egyszerűen a képernyő alsó sorainak számát (ami alapesetben 2) 0-ra változtatjuk. Ezt a

POKE 23659,0

utasítással érjük el.
Ilyenkor már nincs hely a hibaüzenet számára, a BREAK parancsot sem lehet meghívni és a program leáll. Hasonlóan működik a

POKE 23613,0: POKE 23614,0

utasítás is. Ilyenkor a program a hibaüzenetnél hidegindítást okoz. Az utasításnak egyetlen hátránya, hogy a változók értékei nem mindig maradnak meg, a folyamatot ezért többször meg kell ismételni.

4. Hasznos rutinok, rövid programok

4.1 Kétszeres nagyságú betűk a képernyőn

Ismerkedjünk meg néhány rutinnal, amelyek a képernyőre való írás méretét befolyásolják! Először próbáljuk meg egy tömbnek, pl. az y$-nak a tartalmát kétszeres nagyságban kiírni. Ezzel fontos üzeneteket tudunk kiemelni a programban. Kezdjük el egyetlen karakterrel. Először hozzuk be a karakter kódját. Ez a

8*CODE y$ + PEEK 23606+256*PEEK 23607=8*CODE y$+15360

utasítással kezdődik, és 8 számból áll. Vegyük először az első négy számot és tegyük be őket kétszer egymás után az USR "a"-ba, a második négy számot ehhez hasonlóan az USR "b"-be. Az általunk meghatározott a és b karaktereket a kívánt helyre, egymás alá íratjuk ki, és már készen is vagyunk.
Tehát:

800 LET CODE x=8*CODE y$+15360
810 FOR z=0 TO 7
820 LET a=PEEK (x+z)
830 LET b=PEEK (x+z+1)
840 POKE USR "a"+2*z,a
850 POKE USR "b"+2*z+1,b
860 NEXT z

és pl.:

900 PRINT AT 9,9;"A"
910 PRINT AT 10,9;"B"

Az utolsó két sorban kiválasztjuk a megfelelő grafikus karaktert. Adjuk még be a

700 INPUT y$

és a

990 GO TO 700

utasításokat is, majd futtassuk a programot! Ha a program lefut, akkor a rutint azzal bővítjük, hogy y$-t egy karakternél hosszabbra választjuk. Ennek létrehozására egy ciklust szervezünk:

750 FOR i= 1 TO LEN y$

Ezután a 800-as, a 900-as és a 910-es sorokat meg kell változtatni:

800 LET x=8*CODE y$(i)+15360
900 PRINT AT 9,i;"A"
910 PRINT AT 10,i;"B"

és hozzá kell tenni a

920 NEXT i

utasítást.
Ha kijelöljük a grafikus a és a grafikus b nyomtatási helyét, az xpoz, ypoz és az xpoz+1, ypoz koordinátákkal, és végül 930 RETURN-nel zárunk, akkor olyan rutinhoz jutunk, amelyet több programban is felhasználhatunk.
Összefüggően a rutin így néz ki:

750 FOR i= 1 TO LEN y$
800 LET x=8*CODE y$(i)+15360
810 FOR z=0 TO 7
820 LET a=PEEK (x+z)
830 LET b=PEEK (x+z+1)
840 POKE USR "a"+2*z,a
850 POKE USR "b"+2*z+1,b
860 NEXT z
900 PRINT AT xpoz,ypoz+i-1;"A"
910 PRINT AT xpoz+1,ypoz+i-1;"B"
920 NEXT i
930 RETURN

A rutin viszonylag lassú, bár ez nem mindig jelent gondot. Ha egy kicsit gyorsítani szeretnénk, akkor a következő változatot célszerű beírni:

800 LET c=USR "a"
810 FOR i=1 TO LEN y$
820 IF y$=" " THEN PRINT AT xpoz+1,ypoz+i-1;" ": GO TO 900
830 LET x=8*CODE y$(i)+15360
840 FOR z= 0 TO 7
850 POKE c+2*z,PEEK (x+z)
860 POKE c+2*z+1,PEEK (x+z+1)
870 NEXT z
880 PRINT AT xpoz,ypoz+i+1;"A"
890 PRINT AT xpoz+1,ypoz+i-1;"B"
900 NEXT i
910 RETURN

A ciklusok itt kevesebb számítási műveletet tartalmaznak, így ez a változat az előzőhöz képest kb. kétszer olyan gyors lesz. Hasonlítsuk össze a két rutint! Gondoljunk arra, hogy az xpoz és az ypoz értékét meg kell határozni!
Ha még nagyobb betűket szeretnénk hasonló módon ábrázolni, akkor a BASIC nyelv korlátai miatt ezek már túl hosszú programok lennének. Ilyenkor célszerűbb gépi kódban programozni. A 9. fejezetben egy olyan gépi kódban írt programot mutatunk be, amellyel tetszőleges nagyságú betűket írhatunk. Megtehetjük természetesen azt is, hogy programjainkat megírjuk BASIC nyelven, majd egy fordítóprogrammal gépi kódra fordítjuk. Erről a fordítóprogramról a 7. fejezetben lesz szó.

6. Látványos képszerkesztés a Spectrummal
Nappalok és éjszakák a Földön

6.1 A program kidolgozása

Ebben a fejezetben egy olyan programot fogunk kidolgozni, amelynek közvetlen hasznát nem vehetjük, és ráadásul nagyon sok adatot is kell a gépbe bevinnünk, de jól mutatja majd a Spectrum grafikus képességeit. A programmal végül egy világtérképet rajzolhatunk a képernyőre.
A program változatossá tételéhez beépítünk egy órát, ami a mindenkori nappali és éjszakai zónákat mutatja a Földön. A zónáknak természetesen az órán szinkronban kell váltakozniuk, és a különböző napszakoknak a nyári és téli értékekhez is igazodniuk kell. A világtérképet természetesen SAVE NAME SCREEN utasítással tároljuk, és címlappal is ellátjuk.
A tengereket kékre színezzük. A nappali zónákat sárgával, az éjszakaiakat feketével jelöljük. Bár a Spectrum nagy felbontóképességű grafikával rendelkezik, minden nyomtatási pozíciónál tulajdonképpen 2 különböző színt használhatunk: egyet a háttér és egyet az írás színezésére. A mi esetünkben a nappalok és az éjszakák határvonalánál 3 szín találkozik, a kék, a fekete és a sárga. Ha a zónáké csak minden egész órában mutatjuk, akkor a problémákat úgy oldhatjuk meg, hogy egy óra egy nyomtatási pozíció szélességének, vagyis 8 képpontnak feleljen meg.
Ebben az esetben a 3 szín mindig éppen két egymást követő nyomtatási pozíció határán találkozik. A világtérkép adatait DATA utasításokban tároljuk, majd READ utasításokkal olvassuk, és azután értékeljük őket. A megfelelő méretű világtérképet rá kell rajzolni egy 102*192-es négyzethálóra. Oszloponként (észak-déli irányban haladva) kikeressük azokat a négyzeteket, amelyekben a víz és a szárazföle találkozik, és ezeket egy DATA utasításban tároljuk. Ha egy oszloppal elkészültünk, akkor két nullát írunk a végére, ezzel jelezve, hogy új oszlop következik. A eljárást folytatva olyan DATA utasításokhoz jutunk, amelyek a rajzolórutin számára érthetők lesznek.
Az adatok bevitele után (jó gépelést kívánunk!) foglalkozhatunk a tulajdonképpeni programmal. A feliratok fontosabb részeinek kiemelésére a 4. fejezetben ismertetett nagybetűkkel író rutint fogjuk használni, amit a 20-as sortól kezdődően viszünk be. Megoldottuk a hónapok és az órák lekérdezését és megteremtettük az időpont átállításának a lehetőségét. Most megrajzolhatjuk a világtérképet, megadhatjuk az időpontokat és az időeltolódásokat, valamint a Nap jelét is. A Napot piros színnel rajzoljuk fel. A világtérlép megrajzolása után gondoskodnunk kell arról, hogy az órát percenként, az egész képet minden órában újra ki tudjuk rajzolni. Az óra előállítását, és az idő normális múlását, a SEK változó értékét percenként megváltoztatjuk. Arra azonban ügyelnünk kell, hogy a térkép rajzolásához is időre van szükségünk, ezért a percek számát 1-gyel növelni kell, mivel a kép elkészültéig már megkezdődött a következő perc.

Napej.z80

7. Kiegészítő készülékek és bővítési lehetőségek

7.1 Bevezetés

Minden számítógép-tulajdonosban előbb vagy utóbb felmerül a kérdés: milyen tartozékkal tudná rendszerét bővíteni? A SINCLAIR cég sok kiegészítő készüléket kínál, pl. az Interface 1-et, a kazettás egységet, amelyekkel a számítógép nyújtotta lehetőségeket bővíteni, lehet. Mivel a Spectrum gépek nagyon elterjedtek a világon, más cégek is foglalkoznak a SINCLAIR számítógépek perifériáinak gyártásával. A Spectrum a ~perifériák széles skálájával rendelkezik, így majdhogynem csak a használó pénztárcája szab határt a bővítésnek.
A hosszabb programok kizárólag képernyőn való szerkesztése nagyon fárasztó, ezért elsőként a nyomtató fog hiányozni. Ha a nyomtatót csak listázásra használjuk, akkor az ALPHACOM nyomtató elfogadható, de az igényesebb használóknak a SEIKOSHA GP 505 típusú mátrixnyomtatót ajánljuk. Egy CENTRONICS PARALEL illesztővel nagyobb számítógépek számára készített nyomtatók is használhatók, amelyek soronként 80 vagy még több karaktert is nyomtatnak. A 80 karakteres nyomtatók írásképe szép, és így a Spectrum szövegszerkesztő feladatok megoldására is használható.
Ha sok szöveget kívánunk a Spectrummal íratni, akkor egy idő után elégedetlenek leszünk a gumibillentyűkkel (ez természetesen a Spectrum Plus tulajdonosokra nem vonatkozik). A cégek felismerték a problémát, és meg is oldották. A Spectrum billentyűzet a számítógép külön része. Ha felnyitjuk a Spectrum dobozát, azt látjuk, hogy a billentyűzettől két dugóval csatlakozó lapos kábel vezet a nyomtatott áramköri alaplemezhez. Egy új billentyűzetet általában úgy csatlakoztathatunk, hogy kihúzzuk a két kábelt, és a helyére bedugjuk az új billentyűzet két kábelét.

7.2 Az Interface 1 bővítő egység

A Spectrum kétségkívül legsokoldalúbb kiegészítő készüléke az Interface 1. Az illesztővel gyors háttértárhoz juthatunk; egy beépített RS 232-es csatlakozóhelyen keresztül más számítógépekkel, nyomtatókkal és átvivőkkel kapcsolhatjuk össze gépünket. Mindez nem is nagyon költséges. Az Interface 1 lehetővé teszi továbbá 64 db Spectrum és SINCLAIR QLS összekapcsolását is. A magnetofon és a ZX nyomtatók csatlakoztatási lehetősége is megmarad.
Az Interface 1-ben egy 8 kbyte-os ROM bővítés is van, amely a Spectrum 16 kbyte-os ROM-jához csatlakozik. A ROM-bővítés a Spectrum parancs-, ill. utasításkészletét az alábbi utasításokkal egészíti ki:

CAT
CLOSE
ERASE
FORMAT
MOVE
OPEN

és a következő utasítások lehetőségeit kiterjeszti:

CLS
CLEAR
INPUT
INKEY$
PRINT
LPRINT
LIST
LLIST
SAVE
LOAD
MERGE
VERIFY

Az utasítások jelentése az 1. függelékben található, mi csak néhány érdekesebbet emelünk ki. A CAT paranccsal tartalomjegyzéket kérhetünk a kazettás egységről. A CAT parancs hatására megtudjuk a kazetta és a rajta levő első ötven, nem védett file nevét. A védett file-ok neve CHR$ 0-val kezdődik. Ezek a file-ok CAT paranccsal nem olvashatók. Megjelenik még a rendelkezésünkre álló tárhely mennyisége kbyte-ban. Ha a parancsot a fenti formában írjuk be, akkor a lista a képernyőn jelenik meg.
Ha a listát pl. a nyomtatóra akarjuk kiírni, akkor meg kell nyitni a megfelelő csatornát, és a parancsot az alábbi formában kell beírni:

CAT #n;1

ahol n a csatornaszám.

Ha az RS 232-es csatlakozóhelyen keresztül az adatátvitel sebességének meghatározására a FORMAT utasítást használjuk, akkor az 50,110, 300, 600, 1200, 2400, 4800, 9600 és 19200-as értékeket lehet beadni. Ha nem adunk be külön értéket, akkor az átviteli sebesség 9600 baud (1 baud (Bd) egy elemi karakter/s sebességegység. A FORMAT-ban megadható értékek 50-től 300-ig kicsi, míg 600-tól 9600-ig közepes átviteli sebességeket jelentenek). Ha olyan értéket írunk be, amelyik nem szerepel a listán, akkor az utasítás a legközelebbi és kisebb értéket veszi figyelembe. A minimum természetesen az 50-es.
A CLS# utasítás az Interface 1 jelenlétében is megengedett. Ellentétben az egyszerű CLS utasítással, a CLS# nemcsak a képernyő file-t törli, hanem a következőket is meghatározza:

INK 0 (fekete az írás)
PAPER 7 (fehér a háttér)
BORDER 7 (fehér a keret )
INVERSE 0  
BRIGHT 0  
OVER 0  
FLASH 0  

 

A CLEAR# utasítás a csatornán kivitt adatokat törli. Minden csatornát lezár; azok az adatok, amelyek valamelyik puffertárban voltak, ellentétben a CLOSE# utasítással, így elvesznek.
Az Interface 1-hez 8 kazettás egység csatlakoztatható, és ezeket egyidejűleg képes vezérelni. A kazettás egységgel speciális végtelenített szalagok írhatók és olvashatók. Minden kazettában egy körülbelül 5 m hosszú szalag van, amelynek a végigjátszásához körülbelül 7s-ra van szükség. A szalag közepén levő adat 3-5s alatt érhető el. A kazettában kb. 90 kbyte adat tárolható. A kazetta tárhelyeinek megszerkesztését célszerű többször is elvégezni, mivel a rendelkezésre álló tárhelyek a próbálkozások során változhatnak.

Az Interface 1 előnye a helyi hálózat kiépítésének lehetősége. A 64 db Spectrurnmal és a SINCLAIR QLS-sel kiépített kapcsolatot egy egyszerű kéterű kábellel létrehozhatjuk. Az adatokat 5 kbyte/s sebességgel vihetjük át az egyik gépből a másikba.
A FORMAT "n",7 utasítással a Spectrumhoz hozzárendeljük a 7-es pozíciószámot. Ennek a pozíciószámnak 1-64 közé kell esnie. A POKE 23749,7 parancsnak is ugyanez a hatása. A LOAD, SAVE, MERGE stb. parancsokkal az adatátvitel egyszerűen megoldható. Az m karakter a kazettás egységet, az n karakter a hálózati csatlakozást jelenti. A variációs lehetőségek sokfélék. Az Interface 1 kézikönyv szerint pl. több Spectrum tulajdonos egy közös drága perifériát is használhat, ilyen lehet pl. egy nyomtató.
Több Spectrum összekapcsolása esetén új játékokra nyílik lehetőség. Olyan programok is készíthetők, ahol a két számítógép egy program különböző részein dolgozik. A számítások eredményei kicserélhetők, és azok két (vagy több számítógép esetén több) képernyőn is megjeleníthetők. Az összekapcsolás mind a hardver, mind a szoftver fejlesztők számára ad érdekes feladatokat.

7.3 Sornyomtató

Az Interface 1 és az RS 232-es csatlakozó tulajdonosai a nyomtatón kívül írógépet is használhatnak. A modellek közül a BROTHER cég EP 44-esét szeretnénk kiemelni, a típus sokoldalúsága miatt. Az írógép vagy szalag nélkül, hőérzékelő papírra ír (ez nem túl olcsó), vagy szalaggal (ami szintén nem olcsó) normál papírra. Az íráskép a 18*24-es pontmátrixnak köszönhetően nagyon jó. A Spectrumhoz ennél alkalmasabb nyomtatót nem is találhatnánk. Bedugjuk az RS 232-es kábelt, és az adatátvitel paramétereinek a következő értékeket adjuk:

BAUD RATE

tetszőleges, de egyeznie kell a Spectrum értékével

BIT LENGTH 8
PARITY N
NEW LINE CR + LF
CODE 7 BIT
ER Y

A megfelelő kapcsolót terminál állásba tesszük és a Spectrumnak a következő utasítást adjuk:

OPEN#3,"t": FORMAT "t";baud rate

ahol a baud rate az EP 44-nek megadott átviteli sebesség. Az LPRINT és a LLIST utasítások már az EP 44-nek szólnak.
Az LPRINT és a LLIST utasítások a PRINT#3 és a LIST#3 utasításoknak felelnek meg, COPY-t sajnos nem írhatunk, mivel az EP 44 rajzolni nem tud.
Az írógép a szövegtárolás és a távadatátvitel területén nagyon sokoldalú. Egy kis szövegszerkesztőt is beépítettek a gépbe. Azoknak a Spectrum tulajdonosoknak, akiknek nincs kiegészítő billentyűzetük, hasznos az a lehetőség, hogy az EP 44-et beviteli perifériaként is alkalmazhatják.
Egy egyszerű rutinra van csupán szükség:

10 OPEN#3,"t":FORMAT "t";300
20 BORDER 0
100 LET m$=INKEY$#3
110 IF CODE m$>31 THEN PRINT m$;
150 GO TO 100

Minden, amit az EP 44-en beadunk, megjelenik a képernyőn. A rutin segít az írógép billentyűzetén bevinni a programokat. Az EP 44 használható nyomtatóként és korlátozott mértékben billentyűzetként is.
Ha Spectrumból azonnal az írógépen akarunk írni, vagy netán a kettő között párbeszédes üzemmódban kívánunk dolgozni, akkor az előbbi rutint a következő két sorral még ki kell egészíteni:

120 LET n$=INKEY$
130 IF CODE n$>31 THEN PRINT#3;n$

7.4 Fényceruza

A Spectrum (és a többi számítógép) jó kiegészítője a fényceruza. A fényceruzával olyan dolgokat vihetünk végbe, ami egy laikus számára varázslatnak tűnhet. Vonalakat, köröket és más figurákat rajzolhatunk a képernyőre. A menüből való látványos kiválasztásra is használhatjuk a ceruzát. Természetesen valódi csodát ne várjunk tőle. Aki pl. az aacheni dómot szeretné a képernyőre rajzolni, szép egyenes vonalakkal, annak sokat kell gyakorolnia.
Hogyan működik egy ilyen fényceruza? Elvileg egy fényérzékelő, amely a fényjeleket a számítógép számára érthető elektromos jelekké alakítja. A televíziós kép pl. minden másodpercben 25-szőr jelenik meg a képernyőn. Az elektronsugár 625 vízszintes vonalat rajzol a képernyőre. Ha a fényceruzát a képernyő elé tartjuk, akkor minden olyan esetben, amikor az elektronsugár a neki megfelelő pozícióra irányul, fényt érzékel. Ilyenkor jelet küld a számítógépbe. A számítógép kiszámítja, mennyi idő telt el a sugár rajzolásának kezdete óta, vagyis azóta, amikor a sugár még a bal felső sarokban volt. Ebből az időkülönbségből egész pontosan meg tudja határozni, hogy melyik pozíción volt a fényceruza.
Szabad kézzel bonyolultabb festményeket nem tudunk készíteni, de egy jó szoftverrel még ezt is megtehetjük. A fényceruza nagyon kellemes beviteli eszköz azok számára akik nem értenek a programozáshoz, egyszerűen csak rá kell mutatni arra a pontra, amit be akarunk vinni. A fényceruzával a választás is egyszerű a menüből. Vigyáznunk kell arra, hogy a fényceruza ne kapjon fényt a képernyőhöz való közelítés közben, vagy akkor, amikor a képernyőn továbbvisszük. A hibát kiküszöbölhetjük, ha kis szünetet tartva, kétszer egymás után ugyanazt a sort lekérdezzük. Ha mindkétszer ugyanazt az eredményt kapjuk, akkor biztosak lehetünk abban, hogy a ceruzát egy helyen tartottuk.
A programba a következő sorokat írjuk be:

100 LET sor1=USR 63109: REM vagy az a szám, amelyen az előállító rutint elhelyezte
110 PAUSE 10
120 LET sor2=USR 63109
130 IF sor1=sor2 THEN GO TO ...
140 GO TO 100

A 110-es sorba írt szünet tetszőlegesen változtatható, és így optimális eredményt kaphatunk.

7.6 Fordító

A BASIC programok hátrányos tulajdonsága, hogy ha sok a számolási művelet, akkor viszonylag lassan futnak. Meggyorsíthatjuk a futást, ha a számítógépet megkíméljük a BASIC nyelvről a gépi kódra való fordítástól. Ez elég fáradságos és nem is egyszerű feladat. A számítógép ebben is tud segíteni, ha erre alkalmas programmal rendelkezik. Az ilyen programot fordítónak hívják és éppen azt teszi, amit megkívánunk tőle; BASIC nyelvről gépi kódra fordít. A fordítóprogram maga is gépi kódú. Töltsük be a fordítót a Spectrumba. Ezután kezdjünk el BASIC nyelven programozni, vagy töltsünk be egy már kész programot és fordítsuk le.
A fordítótól függően a gépi kódú program 5-50-szer gyorsabban fut, mint BASIC nyelven. A fordítóprogramok alapvetően abban különböznek egymástól, hogy egész számokat vagy lebegőpontos számokat tudnak-e kezelni. Felmerül a kérdés, hogy mi a jelentősége ennek, ha lehetőségünk van mindkét számtípus kezelésére. Erre a sebességek közötti eltérés adja meg a választ. Éppen a lebegőpontos aritmetika az, ami nagyon időigényes. Ha pl. olyan játékokat szeretnénk lefordítani, amelyeknél a reakcióidő és a rajzolás a legfontosabb, akkor egy egyszerű fordító is megfelel. A nyert pontokat mindig kifejezhetjük egész számokkal. A könyvelési programok esetében az általános fordító a jobb, hiszen az üzletemberek egy fillérről sem szeretnének lemondani.
A fordítók általában nem értik mindazokat az utasításokat, amik a Spectrumban rendelkezésünkre állnak. Pl. legtöbbször a tömbök megengedett dimenziószáma egy. Ez természetesen nem jelentős probléma, mivel minden többdimenziós tömb ábrázolható egy dimenziósként is, amelyben az értékeket egymás után tároljuk. A Spectrumon belül a tárolás mindig így valósul meg. A fordító általában nem érti a VAI utasítást, és a számított ugrást nem hajtja végre. De ez a probléma is megkerülhető pl. CODE CHR$ utasítással.
A fordítók előnye még, hogy a részprogramok egymás után fordíthatók és különböző tárcímekben kezdhetők. A rutinokat aztán tetszőleges programból hívhatjuk a RAND USR... utasítással.

1. Függelék: A Spectrum utasításkészlete

Az INPUT, a DEF és a DATA utasításokon kívül minden utasítás közvetlen parancsként is adható. Egy sorban több utasítás is állhat, ezeket kettősponttal kell egymástól elválasztani. A REM utasítás utáni rész viszont nem kerül végrehajtásra. Az IF utasítást ugyanazon sorban az egymást követő utasítások csak abban az esetben mennek végbe, ha a feltétel rész logikai értéke igaz.
Ezekután ismertetjük a Spectrum utasításait.

BEEP x,y
x másodpercig megszólal egy hang a beépített hangszóróból, amelynek magassága y félhanggal a normál c fölött van. Ha y negatív, akkor a hang c-nél mélyebb. A hang megjelenik a EAR kimeneten van és erősíthető.

BORDER m
Az m a képernyőkeret és a képernyő alsó részének háttérszínét adja meg. Az m értéke 0 és 7 közé esik.

BRIGHT n
A kontrasztot határozza meg, ha n 0, akkor normál, ha 1, akkor éles, ha 8, akkor "átlátszó".

CAT
A kazettás egységre vonatkozik (lásd később).

CIRCLE x,y,z
Az x,y pontba z sugárral kört rajzol.

CLEAR
Törli a változókat. Ezenkívül a RESTORE és a CLS utasítás is végbemegy, a PLOT helyzete a bal alsó sarokban (0,0) lesz és a GO SUB a tárat törli.

CLEAR n
Ugyanaz, mint a CLEAR utasítás és amennyiben ez lehetséges, a RAMTOP n-re állítódik.

CLOSE#
Csak kazettás egység használatakor érvényes (lásd később).

CLS
Törli a képernyőtárat és ezzel együtt a képernyőt is.

CONT(inue)
Folytatja a programot attól a ponttól, ahonnan az egy 0-tól eltérő üzenettel megszakadt.

COPY
A képernyő felső 22 sorát a nyomtatóra másolja.

DATA a,b,c;;;
A programban szereplő adatlista, amelyet READ utasítással lehet beolvasni.

DEF FN f(a,b,...)=e
Egy függvényt definiál, amelyet a programban FN-nel hívhatunk.

DELETE f
A kazettás egység használatakor érvényes (lásd később).

DIM a(m,n,...,S)
Törli a tömböt, és tárhelyet foglal egy s dimenziójú numerikus a tömbnek.

DIM aS(m,n,...,S)
Ugyanaz, mint a DIM a(m,n,...,s) parancs, csak a tömb szöveg típusú. Kezdetben minden helyet üres karakterrel tölt fel.

DRAW x,y
Az a,b pozícióból az a+x és a b+y pozícióig egyenest rajzol. (a,b az aktuális rajzolási pozíció)

ERASE
Csak kazettás egység használatakor érvényes (lásd később).

FLASH n
Ha a=1, akkor a karakter villogni kezd, a=0 esetében megszűnik a villogás, ha n =8, akkor marad a korábbi állapot.

FOR a=x TO y
Az a változó értékét törli és kijelöli ciklusváltozónak. Ezután az a értéke felveszi INT x értékét, végbemegy a ciklus, amelynek végét a NEXT a jelzi, majd a értékét 1-gyel megnövelve újból á következő ciklus hajtódik végre. Ez addig ismétlődik, amíg y értéke kisebb, mint a.

FOR a=x TO y STEP z
Ugyanaz, mint a FOR a=x TO y parancs, de itt a ciklusváltozó minden lépésnél az a+z értéket veszi fel, z negatív szám is lehet (ha x>y).

FORMAT f
Csak kazettás egység használatakor érvényes (lásd később).

GO SUB n
Ezzel az utasítással a program az n. sorban kezdődő részprogramra (szubrutinra) ugrik. A részprogramot a RETURN utasítással kelt befejezni.

GOTO n
Az n. sorra való ugrást eredményezi. Ha nincs ilyen sorszám, akkor a következőre ugrik.

IF x THEN y
Ha x (ami kifejezés is lehet) igaz, vagyis nem 0, akkor végrehajtódik az y utasítás.

INK n
A karakterek színét állítja be, az n 0 és 7 közé eshet, vagy az n=8 a fényerőt, az n=9 a kontrasztot jelenti.

INPUT...
Megszakítja a programot és bevitelre vár. A bevitelt ENTER utasítással kell befejezni.

INVERSE n
n = 1 esetén az írás és a háttér színét megcseréli. n=0 esetében az alapállapotot állítja be. n értéke csak 0 vagy 1 lehet.

LET v=e
v változó felveszi e változónak, vagy kifejezésnek az értékét.

LIST
Kiírja a programot a képernyőre.

LIST n
1-tól n-ig kiírja a programsorokat a képernyőre.

LLIST
A programot a nyomtatóra írja.

LLIST n
1-től n-ig írja a programot a nyomtatóra.

LOAD f
Betölti a programot és a változókat.

LOAD f DATA ()
Betölt egy numerikus tömböt.

LOAD f DATA S$()
Betölt egy szövegfüzért.

LOAD f CODE m,n
n byte-ot tölt be a tár m-ből m + n-ig terjedő helyére.

LOAD f CODE m
Byte-okat tölt be a tároló m címétől kezdődően.

LOAD f CODE
A tárnak azokra a címeire tölt be byte-okat, amelyekről a felvételnél kivittünk.

LOAD f SCREEN$
Azonos a LOAD f CODE 16384, 6912 utasítással, 6912 byte-ot tölt be a képernyőtárba.

LPRINT e
Az e változó vagy kifejezés értékét kiírja a nyomtatóra.

MERGE f
Ugyanaz, mint a LOAD f utasítás, de a Spectrumban levő programsorok nem törlődnek.

MOVE a,b
Csak kazettás egység használatakor érvényes (lásd később).

NEW
Törli a BASIC-nyelvű programot és a változókat, Az UDG-ket és a CLEAR n által foglalt n-nél nagyobb címen levő tároló helyeket nem befolyásolja.

NEXT x
Egy FOR utasítással elkezdett ciklus lezárása.

OPEN #
Csak kazettás egység használatakor érvényes (lásd később).

OUT m,n
Az n byte-ot az m portra küldi.

OVER n
n=1 esetén egy karaktert ír a képernyőre anélkül, hogy az előzőt törölné, ha n=0, akkor visszaáll az alaphelyzet.

PAPER n
Mint az INK utasítás, csak ez a háttér színét szabályozza.

PAUSE n
Megállítja a program futását és n egységnyi szünetet tart. Az egység 1/50 s. Ha közben megnyomunk egy billentyűt, akkor a szünet megszakad. n=0 esetén addig tart a szünet, amíg egy billentyűt le nem nyomunk.

PLOT m,n
Az m,n koordinátájú helyre egy pontot ír 0<=m<=255,és 0<=n<175.

POKE m,n
n értékét az m című tárba írja be.

PRINT e
Az e változót vagy kifejezést a képernyő soron következő nyomtatási pozíciójára írja.

PRINT AT x,y;e
Az e értéket kiírja az x, sor y. oszlopába (0 <= x <= 21 és 0 <= y <= 31).

PRINT TAB x;e
Az e értékét kiírja a következő sor x. oszlopába.

RAND(omize) n
Ha n<>0, akkor a véletlenszám-generátor kezdő értéket n-re állítja be. n=0 esetében vagy ha n-t elhagyjuk, akkor a véletlenszámot képernyőn a bekapcsolás óta eddig megjelent képek számát tároló rendszerváltozó értéke alapján veszi fel.

READ a,b,c,...
Adatokat olvas a DATA utasításból és ezeket a,b, stb. változókhoz rendeli.

REM
A REMARK (megjegyzés) szó rövidítése. A REM utasítás utáni rész a programsorban nem kerül értelmezésre.

RESTORE n
A READ utasítás mutatóját az n. sorra állítja. Ha n-t elhagyjuk, akkor a RESTORE 0-t jelent.

RETURN
A szubrutinok utolsó utasítása. Az utasítás hatására a program a hívó GO SUB utasítás utáni sorral folytatódik.

RUN n
Törli az összes változót és az n. sortól indítja a programot. Ha n-t elhagyjuk, akkor a program az első sortól kezdődik.

SAVE f
A programot és a változókat tárolja.

SAVE f LINE n
Utasítás is tárolja a programot és a változókat, de az így felvett program betöltésekor az automatikusan az n. sorral kezdődik.

SAVE f DATA ()
Egy numerikus tömböt vesz fel.

SAVE f DATA S$()
Egy szöveges tömböt vesz fel.

SAVE f CODE m,n
n byte-ot tárol az m. címtől kezdődően.

SAVE f SCREEN$
Elmenti a képernyőtár tartalmát. Az utasítás azonos a SAVE f CODE 16384,6912-vel.

STOP
A program futását megszakítja és a 9. üzenet jelenik meg. Ha CONT parancsot adunk, akkor a program a STOP utáni utasítással folytatódik.

VERIFY
Azonos a LOAD utasítással, de az adatokat nem tölti be a tárba, csak összehasonlítja annak tartalmával.

Az utasítások mellett a Spectrumban az alábbi függvények használhatók:

ABS x
x abszolút értéke

ACS x
arkusz-koszinusz (radiánban). Az x értéke: -1 <= x <= 1.

AND
A logikai és.

ASN x
arkusz-szinusz (radiánban). Az x értéke: -1 <= x <= 1.

ATN x
arkusz-tangens (radiánban)

ATTR (x,y)
Egy bináris szám, amely a képernyő x. sorsában és y. oszlopában lévő képernyőpont jellemzőit adja meg. A 7. bit a legjellemzőbb. Értéke akkor 1, ha a FLASH 1, és 0 akkor, ha a FLASH 0. Ha a 6. bit értéke egyenlő 1-gyel, akkor a képernyő világos, ha 0, akkor normál. Az 5. és a 3. bit a háttér, a 2. és a 0. bit az előtér színét határozza meg.

BIN
Ha egy számot nem decimális, hanem bináris formában akarunk megadni, akkor azt a BIN után 0,1 számsorozattal tehetjük.

CHR$ x
Azt a karaktert eredményezi, amelynek az INT x a kódja.

CODE x$
Az x$ szöveg első karakterének kódját adja meg, Szóköz esetén üres karakter az eredmény.

COS x
Koszinusz x

EXP x
e^x exponenciális függvény.

FN e (x)
Ezzel lehet a DEF FN utasításban meghatározott függvényt hívni. Az x-et mindig zárójelbe kell tenni! Ha nincs x, akkor is ki kell tenni a zárójelet!

IN x
Az x portról beolvasott byte.

INKEY$
A billentyűzetet olvassa le. Az eredmény az a karakter, amelyet az utasítás végrehajtásának pillanatában lenyomva tartunk, egyébként üres string.

INT x
x egész része, x-INT x a tizedesvessző utáni részt jelenti.

LEN x$
x$ füzér hosszát adja meg.

LN x
Természetes alapú logaritmus függvény.

NOT x
Logikai függvény. Ha x <> 0, akkor a kifejezés értéke 0, ha viszont x=0, akkor a kifejezés értéke 1.

OR
Logikai vagy: x OR y azt jelenti, hogy vagy az x, vagy az y igaz.

PEEK x
Az INT(x) tárhelyen levő byte értékét adja meg.

PI
3,14159265, konstans.

POINT (x,y)
Ha az (x,y) pont színe a tintaszín, akkor az értéke 1, 0 akkor, ha az (x,y) pont színe a háttérszín 0 <=x <= 255 és 0 <= y <=175.

RND
0 és 1 közötti pszeudó-véletlenszámot állít elő. a és b közötti véletlenszámot az a+(b-a)*RND utasítással állíthatunk elő.

SCEEN$ (x,y)
Az x. sor y. oszlopában lévő karaktert eredményezi.

SGN x
Az x változó előjele. Ha x<0, akkor -1, ha x=0, akkor 0, ha x > 0, akkor +1 az értéke.

SIN x
szinusz x

SQR x
Az x változó négyzetgyöke.

STR$ x
Az x változót füzérré alakítja.

TAN x
tangens x, x radiánban van megadva.

USR x
Az x. címen kezdődő gépi kódú rutint hívja.

USR x$
Egy általunk definiált grafikus karakter címét adja meg.

VAL x$
x$ füzér numerikus értékét adja.

VAL$ x$
Az idézőjelek nélküli x$ stringkifejezésként való kiértékelése.

-x
Az x változó előjelét váltja.

A Spectrum a következő aritmetikai és összehasonlító műveleteket végzi el:

+ összeadás (fűzérekké is)
- kivonás
* szorzás
/ osztás
^ hatványozás
= egyenlő
> nagyobb, mint
< kisebb, mint
>= nagyobb vagy egyenlő
<= kisebb vagy egyenlő
<> nem egyenlő

Ha Interface 1 is van, akkor a Spectrum parancskészlete kibővül. Ekkor 15 logikai csatorna van, amelyeket 1-től 15-ig sorszámozunk. Létezik még ezenkívül kétféle csatorna: k a billentyűzeté, s a képernyőé, p a nyomtatóé, t az RS 232-es csatlakozóhelyhez tartozó szövegillesztőé, b az RS 232-es csatlakozóhelyhez tartozó bináris illesztőé, n a hálózaté, m a kazettás egységé. Így további utasítások használhatóak:

CAT x
Megadja az x. kazettás egységbe helyezett kazetta tartalomjegyzékét. A lista ABC sorrendben jelenik meg. Megtudhatjuk még a kazetta nevét és a szabad tárhelyet kbyte-ban.

CAT#z;x
Az x. kazettás egységbe helyezett kazetta tartalomjegyzékét kiírja a z. logikai csatornára.

CLOSE#x
Az x. logikai csatorna összes átvitelét lezárja. Ha még van adat a puffertárban, akkor azokat kiírja.

ERASE "m";x;f
Törli az x. kazettás egységen levő f nevű file-t.

FORMAT "m";x;f
Az x. kazettás egység kazettáját formázza. A kazettát elnevezi (f-nek), és ez a név a tartalomjegyzékben megjelenik. Ha már volt valami a kazettán, akkor az felülíródik.

FORMAT "n";x
Kiépített helyi hálózat esetén az x sorszámot adja a Spectrumnak.

FORMAT "t";x
Az RS 232-es csatlakozón keresztüli adatátvitel sebességét határozza meg. x értékei a következők lehetnek: 50, 110, 300, 600, 1200, 2400, 4800, 9600 és 19200.

FORMAT "b";x
Azonos a FORMAT "t";x utasítással, az átviteli sebesség a t és b csatornán mindig azonos.

INKEY#x
Az x csatornából jövő karaktert adja vissza. Ha ez nincs, akkor üres karakter jelenik meg.

INPUT#x;y
Az y csatornán az x érték kerül bevitelre. Sorválasztás itt is lehetséges.

LOAD#...
A jelzett csatornán beviszi a programot, az adatokat vagy a byte-okat. A bevitelre csak a b, az n és az m csatornák használhatók. A normál LOAD utasításban megengedett választások itt is használhatók.

MERGE#...
Ugyanaz, mint a szokásos MERGE utasítás, csak itt egy adott csatornán dolgozunk.

MOVE a TO b
Az a forrásból a b-be viszi át az adatokat. Az utasítás előtt nem kell a csatornát megnyitni és lezárni.

OPEN#x,y
Az y csatornát az x logikai csatornához rendeli. Ezzel megnyílik a csatorna a BASIC nyelvű be- és kivitel számára. A megengedett csatornák: k, s, p.

PRINT#x...
Adatátvitelt hajt végre a megjelölt logikai csatornához. Ezt előzőleg az adatkivitel számára meg kell nyitni.

SAVE#...
A jelzett csatornán programot, adatokat vagy byte-okai vesz fel. Csak b, n és m csatornákat lehet használni. A normál SAVE utasításban megengedett választások itt is használhatók.

VERIFY#
Ugyanaz, mint a normál VERIFY utasítás, de az adatok megjelölt csatornáról jönnek.

2. Függelék: Hibajelzések

A Spectrum minden parancs és program végrehajtásakor a képernyő alsó részében üzenetet küld. Ez az üzenet egy kódból és egy rövid magyarázatból áll, amely megkönnyíti a hibakeresést. Ha az üzenet 0, OK, sorszám, utasítás, akkor ez azt jelenti, hogy a művelet szabályosan lezajlott, formális hiba nincsen. Sajnos, gyakran más üzenetek jelennek meg a képernyőn.

0 OK.
A program sikeresen lefutott.

1 NEXT without FOR
A ciklus elejéről hiányzik a FOR utasítás.

2 Variable not found
Olyan változót használunk, amelyet a LET, a READ vagy az INPUT utasítással nem határoztunk meg. Tömb esetében ez azt jelenti, hogy kihagytuk a DIM utasítást.

3 Subscript wrong
A tömbelemek száma meghaladja a LET vagy a DIM utasításban rögzített értéket.

4 Out of memory
A Spectrum tárja nem elég a feladatra.

5 Out of screen
Egy INPUT utasításban több mint 23 sort akarunk a képernyő alsó részére bevinni, vagy a PRINT utasítás hosszabb, mint 21 sor.

6 Number too big
Túlcsordulás, 10^38-nál nagyobb szám áll elő. Ez legtöbbször akkor fordul elő, ha olyan változóval osztunk, amelynek az értéke 0.

7 RETURN without GO SUB
A program olyan RETURN utasításra futott, amelyet nem előzött meg GO SUB utasítás.

8 End of file
A file végéhez érkeztünk. Csak azok számára érdekes, akiknek van kazettás egységük.

9 STOP statement
A programot STOP utasítás szakította meg. Ha CONTINUE parancsot adunk, akkor a STOP utáni utasítás végbemegy.

A Invalid argument
A függvény argumentumában szereplő mennyiség nem megengedett.

B Integer out of range
Túlcsordulás, egy egész szám túl nagy.

C Nonsense In BASIC
A VAL utasítással kiszámított kifejezés nem megengedett.

D BREAK-CONT repeats
A programot a BREAK billentyűvel megszakítottuk. Ha ezután CONT parancsot adunk, akkor a megszakított utasítás megismétlődik, ellentétben az L típusú hibával.

E Out of DATA
Több változót szeretnénk a READ utasítással beolvasni, mint amennyit a DATA-ban meghatároztunk. Ez általában akkor fordul elő, ha a RESTORE utasítást elfelejtettük.

F Invalid file name
Egy file-t név nélkül vagy tíz karakternél hosszabb névvel akartunk megőrizni.

G No room for line
A következő utasítás részére már nem elég a tárhely.

H STOP in INPUT
Egy INPUT utasítást STOP paranccsal megállítottunk. A CONTINUE parancs hatására megismétlődik az INPUT utasítás.

I FOR without NEXT
A ciklus végéről lefelejtettük a NEXT utasítást.

J Invalid I/O device
Hibás INPUT-OUTPUT utasítás a kazettás egységen.

K Invalid colour
Nem megengedett számot adtunk be a szín kijelölésénél.

L BREAK into program
BREAK billentyűvel két programsor között szakítottuk meg a futást.

M RAMTOP no good
A RAMTOP részére megadott szám vagy túl kicsi, vagy túl nagy.

N Statement lost
Nemlétező utasításra szeretnénk ugrani.

O Invalid stream
A kazettás egység, ill. az Interface 1 használatánál nem megengedett logikai csatornának szóló utasítást adtunk ki.

P FN without DEF
Olyan függvényt használtunk, amit előtte DEF FN utasítással nem határoztunk meg.

Q Parameter error
Egy a DEF FN-nel meghatározott függvényt hibás számú vagy hibás típusú paraméterrel hívtunk.

R Tape loading error
Betöltésnél vagy ellenőrzésnél olvasási hibát találtunk.

Ha Interface 1 is csatlakozik a Spectrum-hoz, akkor még további 21 hibaüzenet létezik.

Code error
A LOAD utasítással több kódot szerettünk volna betölteni, mint amennyi hely van.

Drive "write" protected
Egy védett kazettára akartunk írni, és ez nem sikerült.

File not found
A kazettán nincs olyan file, amelyet LOAD utasítással be szeretnénk tölteni, vagy ha nem lehet tökéletesen elolvasni. Ez akkor fordul elő, ha a kazetta megsérült, vagy a file-t nem szabályosan zártuk le.

Invalid device expression
Más betűkkel jelöltünk egy egységet, mint amivel lehetséges. A lehetséges betűk s,p,k,m,n,t vagy b. A hiba akkor is előfordulhat, ha az s,p vagy k csatorna kijelölésekor pontosvesszőt használtunk vessző helyett.

Invalid name
Egy file-nak vagy nincs neve, vagy az 10 karakternél hosszabb.

Invalid station number
Helyi hálózat esetén valamely egységhez 0-nál kisebb vagy 64-nél nagyobb számot rendeltünk, ill. a FORMAT utasításban 1-nél kisebb vagy 64-nél nagyobb számot használtunk.

Invalid stream number
Egy logikai csatornához 0-nál kisebb vagy 15-nél nagyobb számot rendeltünk.

Merge error
Adatokat vagy kódokat próbáltunk bevinni MERGE utasítással. A MERGE utasítás csak programoknál megengedett, és ott is csak akkor, ha azokat LINE utasítás nélkül vettük fel.

Microdrive full
Nincs már hely a kazettán a SAVE utasítás végrehajtására. Egy file-t törölni kell a kazettáról.

Microdrive not present
Vagy nem kapcsoltuk be a kazettás egységet, vagy nincs benne kazetta, ill. a benne levő kazetta nincs megformálva.

Missing band rate
Elfelejtettük az átviteli sebességet a FORMAT utasítással meghatározni.

Missing drive number
Olyan kazettás egységet akarunk elérni, amit elfelejtettünk megszámozni.

Missing name
Nem adtunk meg egy file nevet.

Missing station number
Egy csatlakozóhely számát nem adtuk meg.

Program finished
Olyan utasítást akartunk végrehajtani, amelyiknek a sorszáma nagyobb a programban előforduló legnagyobbnál. Ez az üzenet akkor is megjelenik, ha olyankor adunk RUN parancsot, amikor nincs program a tárban.

Reading a "write" file
Egy nemlétező, ill. írásra megnyitott file-ből szeretnénk adatot olvasni.

Stream already open
Olyan logikai csatornát szeretnénk megnyitni, amit már egy új csatornához hozzárendeltünk (m,n,t vagy b). Ebben az esetben az áramot le kell zárni.

Verification has failed
Az azonosításnál különbséget találtunk a felvett és a tárban lévő, annak megfelelő file között.

Writing to a "read" file
Olyan file-t szeretnénk kivinni, ami már létezik és a régit még nem töröltük le.

Wrong file type
A file típusa nem felel meg a kívánt műveletnek. Ez pl. akkor fordul elő, ha a kódot programként szeretnénk betölteni vagy a programot szeretnénk adatként átvinni.

Vissza