A 'SPECTRAFORTH' rendszer

 

 

A FORTH története a 70-es évek elejére nyúlik vissza. Az amerikai Charles Moore nevű programozó egy óriás csillagászati teleszkóp irányításához fejlesztette ki a nyelvet. Mivel a nyelv a negyedik generációs programozási nyelvek közé tartozik, az angol "fourth" (negyedik) szó torzításából nyerte a nevét.

A FORTH az egyik legkülönlegesebb programozási rendszer: se nem interpreter, se nem compiler, viszont egyesíti magában mindkettő előnyös tulajdonságait: relatíve kevés memóriát foglal el, gyors működésű (az azonos feladatot megoldó gépi kódú programhoz képest a végrehajtási idő növekedése mindössze 1-3-szoros) és a programfejlesztése rendkívül gyors. A FORTH-ot leginkább vezérlési, szöveg- és adatfeldolgozási célokra használják, de kiválóan megállja a helyét a számítógépes grafika területén is. Ez indokolja, hogy bekerült a WHITE LIGHTNING-ba.

A WHITE LIGHTNING-ban a standard FIGFORTH rendszer került alkalmazásra, de 100 szóval többet tud, mint az eredeti. Két fontos újítást is meg kell említeni: az alap BASIC-hez való visszatérési képesség és az IDEAL-alnyev.

A FORTH legérdekesebb tulajdonsága jelen esetben is érvényesül: a WHITE LIGHTNING parancsait a felhasználó tetszés szerint kiegészítheti a már meglévő szavak felhasználásával (ADD NEW WORDS).

 

SZINTAKTIKA ÉS HIBAÜZENETEK

 

A WHITE LIGHTNING szintaktikája parancsok és betűk illetve számok kombinációjából épül fel. Az egyes tagokat szünettel kell egymástól elválasztani, a kombinációt pedig 'ENTER'-rel kell lezárni.

A parancsok nem tartalmazhatnak space-t (szóközt), mert ezt a gép két parancsként próbálja értelmezni. Az újonnan definiált parancsok max. 30 karakter hosszúak lehetnek.

Ha nem definiált illetve rosszul beírt parancsot próbálunk végrehajtatni vagy egy szám (változó) nem értelmezhető az adott helyen, a program hibaüzenettel értesít minket a rossz szintaktikáról.

 

Pl. SCORE (+Enter)  0 hibaüzenetet eredményez, mivel a

                    szótárban nincsen ilyen szó definiálva

    HEX 27CX        0 hibaüzenetet eredményez, mivel az 'X'

                    nem értelmezhető hexa szám

 

EGYÉB HIBAÜZENETEK

 

STACK EMPTY        - a stack üres

STACK FULL         - a stack betelt

DICTIONARY FULL    - a szótár betelt

 

Mielőtt még részletesen áttekintenénk a parancsokat, megjegyezzük, hogy az - új parancsok definiálásakor a parancsokhoz tartozó - értékek a stack-ba kerülnek (később hívhatóak is). Jelen Forth-rendszer az ún. Reverse Polish Notation-t (fordított frissítési módszer) használja. Ez a műveleteket olyan sorrendben hajtja végre, amilyenben a stack-ben vannak (a régebbi típusú számológépek használták ezt a módszert). Tekintsük át ezt egy rövid példán keresztül:

Tegyük fel, hogy össze kívánjuk adni az 1 és 2 számot, majd az eredményt meg kívánjuk szorozni 3-mal.

Először feltöltjük a stack-et (vermet) a számokkal: 3 2 1, majd beadjuk a műveleti jeleket: + és *

A következő történik: az első művelet az utoljára beírt, vagyis a verem tetején, (Top Of Stack, a továbbiakban TOS) lévő két szám (1 és 2) között hajtódik végre, majd a művelet eredménye megszorzódik a verem harmadik tagjával (3).

Most nézzük át részletesen az alkalmazható parancsokat:

 

 

INPUT/OUTPUT MŰVELETEK

 

 

EMIT:    A TOS-ban lévő karakter kiíratása a képernyőre. Pl. a

 

         HEX 41 EMIT CR (+ENTER)

 

         arra utasítja az interpretert, hogy hexadecimális

         értelmezési módban (HEX) írjon a stack tetejére 41-et

         (41),  majd a stack tetején lévő számot jelezze ki a

         képernyőre (EMIT) és állítsa a kurzort a következő

         sor elejére (CR). A példaparancs kiadása az "A"

         karaktert jeleníti meg a képernyőn (a kijelezni

         kívánt karakternek értelmezhető ASCII karakternek,

         grafikus karakternek vagy a TOS-on lévő számtól függő

         vezérlő karakternek kell lennie)

 

EMITC:   Ugyanaz a funkció, mint az EMIT, de a vezérlő

         karaktereket is értelmezi.

 

KEY:     Billentyűzetvizsgáló funkció. A megnyomott billentyű

         ASCII-kódját a stack tetejére helyezi (pl. "A"

         megnyomására a 41H kerül a TOS-ra). A következő példa

         megjeleníti a képernyőn ahhoz a billentyűhöz tartozó

         karaktert, amelyet megnyomtunk:

 

         KEY EMIT (+ENTER)

 

         Egy billentyű gyors megnyomása után a képernyőn

         megjelenik az adott karakter és rögtön utána az "OK"

         üzenet (az 'A' megnyomása esetén tehát "AOK" fog

         megjelenni). Ha a billentyű megnyomása "lassan"

         történt két kurzort kapunk eredményül, a felsőt nem

         kell figyelembe venni.

 

CR :     Sort emel és a kurzort a sor elejére állítja

 

. :      Átalakítja a TOS-ban lévő számot az aktuális

         kijelzési módba és megjeleníti a képernyőn. A

         kijelzési mód (a továbbiakban alap) decimális

         (DECIMAL) és hexadecimális (HEX) lehet. A "." kiadása

         kiveszi a veremből a TOS-t. Nézzünk néhány példát a

         funkció működéséré:

 

         HEX 2B1D . (+ENTER)    -----2B1D

         DECIMAL 1134 . (+ENTER)  ---1134

         DECIMAL 2048 HEX . (+ENTER)--800

 

U :      Kiírja a TOS tartalmát az alap figyelembe vétele

         nélkül. Pl.

 

         HEX DAAl DECIMAL U (+ENTER)

 

         hatására a gép a DAA1 kódot írja ki a képernyőre.

 

? :      Az aktuális alap figyelembe vételével megjeleníti azt

         az értéket, amely abban a memóriarekeszben van,

         amelyre a TOS mutat. Pl. tegyük fel, hogy a TOS

         DO88-at tartalmaz, az alap DECIMAL és a DD88/89-ben

         001C érték van. A ? hatására a gép a 29es értéket

         jeleníti meg.

 

TYPE :   A felső két TOS alapján megjelenít a képernyőn adott

         számú karaktert. A TOS a kiírandó karakterek számát,

         az alatta levő szám pedig a kezdőcímet tartalmazza,

         pl.

 

         HEX 92A1 11 TYPE (+ENTER)

 

         a 92A1 címnek megfelelőn megjelenít 17 (HEX 11)

         karaktert a képernyőn.

 

DUMP:    a TOS alapján kiír x byte-ot az adott címtől

 

" :      Kiírja az idézőjelbe tett stringet a képernyőre (az

         idézőjelek mellett szüneteket kell hagyni).

 

         Pl.: " STRING " (+ENTER)

 

         után megjelenik: STRING

 

SPACE :  Egy szóköz karaktert jelenít meg a képernyőn

 

SPACES : TOS számú szünetet ír a képernyőre

 

 

MATEMATIKAI MŰVELETEK

 

 

+ :      Összeadja a két felső stack-számot és az eredményt a

         TOS-ba teszi.

 

- :      A TOS alatt lévő számból kivonja a TOS-t és az

         eredményt a TOS-ba teszi.

 

* :      Összeszorozza a TOS-t az alatta lévő számmal és az

         eredményt a TOS-ba teszi.

 

/ :      A TOS alatt lévő számot elosztja a TOS-szal és az

         eredményt elhelyezi a TOS-ban.

 

MAX :    A stack tetején lévő két szám közül törli a

         kisebbiket. Pl.

 

         596 441 MAX . (+ENTER)

 

         hatására az 596 fog megjelenni a képernyőn.

 

MIN :    A MAX-hoz hasonló módon törli a nagyobbik értéket.

 

ABS:     A TOS abszolút értéke

 

MINUS:   Negálja a TOS-t

 

n+ :     n értékkel növeli a TOS értékét (n=1 ill.2)

 

n- :     n értékkel csökkenti a TOS értékét (n=l ill.2)

 

MOD :    A TOS alatt lévő szám (a továbbiakban TOS2)

         előjelével a TOS-ba teszi a TOS2 TOS-szal történő

         elosztásának maradékát. Pl.

 

         19 -4 MOD . (+ENTER)

 

         a -3-at fogja kiírni a képernyőre.

 

/MOD :   A TOS2/TOS osztás hányadosát a TOS-ba, maradékát a

         TOS2-be teszi.

 

 

STACK MŰVELETEK

 

 

DUP :    A TOS-t duplázva írja ki. Pl.

 

         507 DUP .. (+ENTER)

 

         esetén 507 507 jelenik meg.

 

DROP :   Törli a verem tetején a TOS-t

 

SWAP :   Cserét hajt végre a TOS és a TOS2 között

 

OVER :   TOS2-t a verem tetejére másolja, de a többi számot

         sértetlenül hagyja, pl.

 

         204 107 OVER . CR . CR .(+ENTER)

 

         eredményeképpen megjelenik egymás alatt: 204, 107, 204

 

ROT :    megforgatja a verem felső három elemét, pl.

 

         5 7 9 ROT . CR . CR . (+ENTER)

 

         eredményeképpen megjelenik egymás alatt: 9, 7, 5

 

 

EGYÉB MŰVELETEK

 

 

; :      TOS2-t eltárolja a TOS által kijelölt címre, pl.

 

         ha TOS=D0FC, TOS2=CB85 és megadjuk:

 

         HEX CB85 D0FC ; (+ENTER)

 

         úgy a CBB5 bekerül a D0FC/FD címekre.

 

@ :      Amennyiben TOS tartalma egy memóriacím, úgy a parancs

         a TOS helyére a cím tartalmát helyezi, pl. ha a DF00

         cím tartalma 12, úgy

 

         DF00  . (+ENTER)

 

         hatására a képernyőre 12 íródik ki.

 

CI :     Amennyiben TOS tartalma egy memóriacím, úgy a parancs

         az adott címre helyezi a T0S2-ben tárolt értéket.

 

@C :     Amennyiben TOS tartalma egy memóriacím, úgy a parancs

         a TOS-ba helyezi a címen tárolt 2 byte-ot, de úgy,

         hogy közben a nagyobb helyiértékű byte-ot lenullázza.

 

+2 :     Amennyiben TOS tartalma egy memóriacím, úgy a T0S2-t

         hozzáadja a TOS által kijelölt cím tartalmához, és az

         eredményt a TOS-ban tárolja.

 

 

KETTŐSPONT DEFINÍCIÓK

 

 

A WL-ben a definíciókat ':'-tal kezdjük. Segítségével új szavakat alkothatunk, előzetesen definiált szavakból. Hosszuk tetszőleges, de minden 80. karakter után sort kell emelnünk.

 

Általános forma:

 

    : új szó 1.szó 2.szó.....n.szó . ;

 

(A definíciót mindig pontosvesszővel kell lezárnunk.)

Próbáljunk egy négyzetreemelést végrehajtó definíciót írni:

 

    : NEGYZET DECIMAL CR . " A NEGYZETE " DUP .. " -NEK "

    DUP . ; (+ENTER)

 

A definíciót előhívhatjuk pl:

 

    7 NEGYZET (+ENTER),

 

melynek eredménye: A NEGYZETE 7-nek 49.

 

 

VEZÉRLŐSZERKEZETEK (ciklusok)

 

 

A WL kétféle ciklusműveletet képes végrehajtani. Az egyik a DO...LOOP, a másik pedig a DO...+LOOP, ezeket kettőspont definícióban kell elhelyezni!

Az első verzió általános felépítése a következő:

 

    : DEFINÍCIÓ határ start DO.....'FORTH szavak'

    LOOP ; (+ENTER)

 

Ennek eredményeképpen a cikluson belüli FORTH utasítások végrehajtása egészen addig tart, amíg - az egyébként növekvő - start értéke el nem éri a határ értékét, pl.

 

    : MINTA 6 0 D0 . " DEMO " CR LOOP ; (+ENTER),

 

majd MINTA (+ENTER) eredményeképpen a DEMO szöveg 6-szor egymás alá íródik.