A SZÖVEGSZERKESZTŐ ------------------- A szövegszerkesztőbe a monitorból az E paranccsal lép- hetünk be. A monitorba visszalépni az ESC-pel lehet. A szerkesztőbe csak a saját maga által előállított szö- vegfile-ok tölthetők be; ezek a file-ok más szövegszer- kesztőben nem használhatók, nem nyomtathatók. (Ennek az az oka, hogy a sorokban egymás után álló szóközöket egy byte- on tárolja. így tömör, de máshol nem használható adatszer- kezet jön létre.) Egy sorban max. 58 karakter állhat. A szerkesztő üres sort nem fogad el, ezért minden sorban legalább egy, nem szóköz karakternek kell állnia. A szerkesztett (módosított) sor akkor kerül be a memóri- ába, amikor a sorból kilépünk, ezért a RETURN gomb haszná- lata nem kötelező. A sor memóriába kerülését az jelzi, hogy sorszámot kap. A sorszámozás, átsorszámozás (sorbe- szúráskor, - törléskor) automatikus. A keretszín megválto- zása a memória betelését jelzi. Ilyenkor csak a túlcsordu- ló sor törlése után módosíthatunk a szövegben. A képernyő alján és tetején scrollozás történik. A BASIC editorban megszokott funkciók itt is működnek, vagyis az INS, DEL, SHIFT DEL, CTRL I, CTRL K, CTRL N, a CTRL Y és a cursormozgatás. A RETURN a következő sor 8. (mnemonik) pozíciójára ugrik és C cursort állít be. A kibővített cursor-funkciók: ----------------------------- jobbra / balra : A a cursor a következő karak- terre lép, szóközök esetén a következő tabulátor pozícióra. SHIFT fel : A képernyő első sorára állás. SHIFT le : A képernyő utolsó sorára állás. SHIFT balra : Az 1. pozícióra állás. SHIFT jobbra : Sorvégre állás(a következő üres pozícióra). CTRL fel ( = CTRL E ) : Lapozás visszafelé. CTRL le ( = CTRL X ) : Lapozás előre. ALT fel : A legelső sorra állás. ALT le : A legutolsó sorra állás. Sorra állító parancsok: ----------------------- CTRL L : Sorszámot kérdez, majd rááll a megadott sorra. CTRL F : Bekéri a keresendő szót, majd a cursor sorától kezd keresni.Ha megtalálta rááll az adott sor- ra, egyébként csipog. A keresendő szó nem kez- dődhet és végződhet szóközzel! CTRL R : Folytatólagos keresés a cursor sorától. Blokk kezelő utasítások: ------------------------ Lehetőség van a szöveg két blokkjelző (négy cursor négy- zet) közé zárt soraival műveleteket végezni. Egyszerre csak egy kijelölt blokk létezhet. CTRL @ : Blokkjelző beszúrása. (a blokkjelzőt az őt tartalmazó sorral együtt lehet törölni.) CTRL A : Az első blokkjelzőre állás, ha az létezik. CTRL Z : A második blokkjelzőre állás, ha az létezik. CTRL - : A kijelölt blokk törlése a blokkjelzőkkel együtt. CTRL C : A kijelölt blokk bemásolása az adott sor elé. A blokkon belülre másolás tiltott! CTRL O : A kijelölt blokk kinyomtatása sorszámok nél- kül. Ha a nyomtató helyén pl. magnó van, és van írásra nyitott pufferelt file, akkor ha- gyományos szövegszerkesztőbe beolvasható állo- mányt készíthetünk. Egyéb parancsok: ---------------- CTRL B : Hardcopy a képernyőtartalomról. CTRL U : UNDO. (A sor eredeti tartalmának visszaállítá- sa, módosítás után,ha a sorból még nem léptünk ki.) : A címkemező (1-8. kar.) törlése, majd a kö- vetkező sorra állás. CTRL W : A teljes szöveg törlése, de csak a CTRL W há- romszori lenyomása után. A RENDSZER MEMÓRIAKIOSZTÁSA, RENDSZERPARANCSOK ---------------------------------------------- A MNEMONIC IV. programnak két változata van, a BOTTOM a 19EFH-5BFFH, a TOP pedig 0BE21H-0FFFFH címekre töltődik. (A további leírás a BOTTOM változatra vonatkozik, a TOP- hoz tartozó eltéréseket "[]" zárójelek között közöljük.) A program I/O munkaterületnek a BASIC rendszerváltozók területét használja fel (pl.: BUFFER, COMMAND,stb.). A maradék memória három részre osztódik fel: --- Kódpuffer: 5C00H-7FFFH [19EFH-39EEH]. Alapállapotban az assembler ide helyezi a lefordított tárgykódot, és a monitor is itt használható. --- Szövegpuffer: 8000H-0DFFFH [39EFH-99EEH]. A szövegszerkesztő tartalma található itt. --- Szimbólumtábla:0E000H-0FFFFH [99EFH-0BE20H]. A fordítás során értéket kapott címkék táblázata. A program BASIC ROM-ot nem használ, ezért a 2-3. lap ó1-2. lapÁ szabadon lapozható. A szövegszerkesztőhöz és a szimbólumtáblához tartozó RAM lapok be- és kilapozása automatikus. Mint látható, a program bejelentkezés után 64k RAM-ot tételez fel, valamint fix pufferkiosztást vezet be. A program nem helyezhető át, de a pufferkiosztás igen. Erre szolgál a V parancs, amellyel pl. 32k-s gépen is használ- ható a program. ótermészetesen csak a BOTTOM verzió! V n,nn : az n-edik rendszerváltozó értékét nn-re ál- -------- lítja, a puffer eredeti tartalma elveszik! Figyelni kell a helyes paraméterezésre, az egymást átfedő pufferkiosztás a rendszer lefa- gyását okozhatja! V n : kiírja a változó aktuális értékét. A 10 rendszerváltozóból az első 7 írható a V parancs- csal, a többi 3 csak olvasható. n értékei: ---------- 0: A kódpuffer kezdőcíme, 1: a kódpuffer vége, 2: a szövegpuffer kezdete, 3: a szövegpuffer vége, 4: a szimbólumtábla kezdete, 5: a szimbólumtábla vége, 6: bit 0=1 : szimbolikus debugger, disassembler bekapcsolása. (Ha egy utasítás visszafordítá- sakor annak címe, vagy valamely paramétere egy létező szimbólum értékével azonos, akkor a számérték helyett a talált szimbólum nevét írja ki a disassemblált sorban.) bit 1= bit2= 1: A szimbólumtábla rögzítése az assembler fordítás előtt. (ld. később részle- tesen!) bit 3=1 : lépésenkénti nyomkövetéskor a re- gisztertükör mindig a képernyő tetejére író- dik, egyébként az adott cursorpozíció sorába. bit 4 - bit 15 : makrobővítés céljára, jelen- leg nem használt. 7 az utoljára kiadott ORG értéke. (Csak olvasha- tó!) 8 a) az assembler fordítás után az első szabad byte fizikai címét veszi fel, b) memória terület beolvasása után (ld. R utasí- tás) a beolvasott file utáni első byte fizikai címét tartalmazza a valtozó. (Csak olvasható!) 9 a címzési eltolás értéke. (Csak olvasható!) A kódpuffer címzése eléggé speciális. Alaphelyzetben ugyanis csak a kódpuffer tartalmát írhatjuk-olvashatjuk, így elkerülhető a többi puffer és a MNEMONIC IV program felülírása. A pufferen kívülre címzésre a "Kifutás a tár- ból!" hibaüzenet figyelmeztet. A kódpufferben lehetőség van címzési eltolás használa- tára, erre szolgál az ORG nn utasítás. -------- Lássunk erre egy példát: Betöltünk a kódpuffer elejére egy gépi kódú programot. így a program fizikai kezdőcíme 5C00H. A programról tud- juk, hogy valójában a 19EFH címen kezdődik, ezért kiadjuk az ORG 19EFH parancsot. A monitor ezután már a 19EFH logi- kai címen látja a kódpuffert. Ezután pl. a disassemblálás, dumpolás címhelyesn történik. Természetesen ez a program nem indítható el, mert a fizikai és a logikai címe külön- böző. Az ORG nn utasítás a monitorban és az assemblerben is használható. Assembler fordítás során csak egy ORG lehet a programban, annak is az elején. Az ORG nn kiadása után a kódpuffer kezdetét az nn logikai címen látjuk. ENT vagy ENT $ A teljes 64K memória elérését teszi --- ------ lehetővé, a címzési eltolást MEG- SZÜNTETI. Az assemblerben és a mo- nitorban is használható. A BASIC-be a Q utasítással léphetünk ki. A kilé- --- péskor lezáródnak a nyitott file-ok és meleg reset történik. A BASIC az 5C00H-0BFFFH-ig [19EFH- 0BE20H-ig] terjedő memóriát kapja vissza. Az előzőleg az erre a terü- letre lerakott adatok megsérülnek! A MNEMONIC IV.-be az EXT 0 utasítással térhe- tünk vissza: EXT 0 A felhasználói regisztertükör tör- lődik, a puffertartalmak megmarad- nak. EXT 0,11111 A felhasználói regisztertükör, a törésponttáblázat, a szimbólumtáb- la, a szövegszerkesztő tartalma, valamint a COM_DEV a REG_DEV és a BRK_DEV változók tartalma is törlő- dik. A V paranccsal definiált puf- ferkiosztás megmarad. EXT 0,22222 Hidegindítás; azonos a program újra betöltésével. SZINTAXIS,RÖVIDíTÉSEK --------------------- A monitor és az assembler max. 58 karakterből álló so- rokat fogad el. A sorok felépítése: ------------------- CíMKEMEZŐ: Az utasításhoz rendelt címke helye, ha az létezik. A címke a jobbra mellette álló assembler utasítás memóriacímét veszi fel a fordítás- kor, értéke később nem változtatha- tó meg. A címkenévnek a sor elején kell kezdődnie, előtte szóköz nem állhat. A szimbólumnév max. 7 ka- rakter hosszú lehet, melyben betűk, ékezetes betűk és számok lehetnek, de az első karakter nem lehet szám- jegy! A címkenév nem lehet azonos regiszternévvel, vagy feltételszó- val (C, NC, Z, NZ, PO, PE, P, M)! A címkenévben a kis- és nagybetűk kü- lönbözőek, ezért ugyanaz a név kis- vagy nagybetűvel írva, más-más cím- két jelöl. A monitorban címke nem definiál- ható, de a már definiáltakra hivat- kozhatunk. UTASíTÁS: Z80 utasítás, monitorparancs, vagy assembler direktíva neve. Az utasí- tásnévben a kisbetűk használata tiltott. Az assembler forrásszöveg- ben az utasítások előtt (a címke és az utasítás között) legalább egy szóköznek kell állnia. A monitorban az utasítás előtti szóköz nem köte- lező, de megenegedett. PARAMÉTEREK: Az utasításhoz tartozó első paramé- tert az utasítástól egy, vagy több szóköznek kell elválasztania. Egy- mástól a paramétereket vessző vá- lasztja el. A paraméterben álló re- giszternevek és feltételszavak csak nagybetűkkel írhatók! MEGJEGYZÉS: A pontosvessző után álló feliratok- kal a fordító és a monitor nem fog- lalkozik, azokat megjegyzésnek te- kinti. A csak megjegyzést tartalmazó sor használata megengedett. íme egy példa: ALFA CALL NZ,BÉTA; feltételes szubrutinhívás Számkonstansok használata, és az alapértelmezés szerinti számrendszer fogalma ---------------------------------------------------------- A Mnemonic IV rendszer négyféle számrendszert ismer fel: 1.) binárist (2-es alapút): xxxb, xxxB vagy %xxx; 2.) oktálist (8-as alapút): xxxo vagy xxxO; 3.) decimálist (10-es alapút): xxxd, xxxD vagy .xxx; 4.) hexadecimálist (16-os alapút): xxxh, xxxH vagy #xxx; Az "xxx" a számjegyeket jelöli. Ha a számjegyek előtt, vagy után nincs módosítójel, akkor a szám az alapértelme- zett számrendszer szerint értékelődik ki! A MONITOR alapértelmezett számrendszere a HEXADECIMÁ- LIS, az ASSEMBLER FORDíTƒÉ DECIMÁLIS! Alapértelmezett de- cimális számrendszernél minden számot decimálisan, egyéb- ként hexadecimálisan ír ki a rendszer. A hexadecimális számok számjegyeket, és "abcdef" vagy "ABCDEF" betűket tartalmazhatnak, és # jellel, vagy szám- jeggyel kell kezdődniük! így a #ffbc, a 0FFBCH és a 0ffbc alak helyes,az FFBC és az ffbch pedig hibás! Alapértelmezett hexadecimális számrendszer esetén az xxxb, xxxB, xxxd és xxxD alak természetesen hexadecimális számot jelöl! Rövidítések: ------------ nn,mm : 16 bites aritmetikai kifejezés. n,m : 8 bites aritmetikai kifejezés. Az aritmetikai kifejezések egymástól műveleti jelekkel elválasztott, max. 16 bites tagokból állhatnak. A kiértékelt kifejezés értéke 16 bitesre csonkítódik. A tagok és műveleti jelek közötti felesleges szóköz tiltott! A lehetséges tagok: ------------------- $ :Az aktuális memóriamutató értéke. Szimbólumnév :az első fordítási menetben értéket kapott szimbólum (címke, EQU konstans), vagy SET változó értéke. Regiszternév :az elmentett felhasználói regiszterérték. Csak monitorban használható, itt is csak kódot nem generáló parancsokban! (Ld. pl. debugger parancsok.) Számkonstans :lásd feljebb! ASCII konstans:"a", 'OK' stb. A " jel '-ok között írható le, és viszont. Pl.: '"', "'" . A lehetséges műveleti jelek: ---------------------------- (, ) : zárójelek. (pl.: LD E,(n+m)*3 ) + : összeadás, vagy pozitív előjel. (pl.: LD HL,CíMKE+1 ) - : kivonás, vagy negatív előjel (kettes komplemens képzése). (pl.: LD HL,LAB2-LAB1; LD A,-3 ) NOT : egyes komplemens képzése. (pl.: LD B,NOT 9 ) *, /, MOD : szorzás, osztás és osztási maradék kép- zése. (pl.: LD HL,DATA*6; LD A,28 MOD 3 ) AND, OR, XOR : bitenkénti és, vagy, kizáró vagy művelet (pl.: LD A,n XOR m ) SHL, SHR : bitenkénti balra, illetve jobbra lépte- tés. A belépő bitek 0-át tartalmaznak. (pl.: LD A,2 SHL 3 : A-ba 16-ot tölt; LD HL,83ACH SHR 4 : HL-be 083AH-t tölt.) LOW, HIGH : alsó, illetve felső byte kiemelése. (pl.: LD A,LOW 83ACH : A-ba 0ACH kerül, LD A,HIGH 83ACH : A-ba 83H kerül.) < vagy LT > vagy GT Összehasonlítások. Ha a reláció igaz, <= vagy LE akkor -1 -et, ha hamis, akkor 0-át ka- >= vagy GE punk eredményül. (A logikai műveletek a = vagy EQ feltételes fordítást vezérlő utasítások- <> vagy NE ban használhatók fel leginkább.) A NOT, MOD, AND, OR, XOR, SHL, SHR, LOW, HIGH, LT, GT, LE, GE, EQ és NE operátorok előtt és után egy és csak egy szóköz írása kötelező! A műveletek végrehajtási sorrendje (prioritása): 1.: (, ) 2.: *, /, MOD, előjelek, NOT, LOW, HIGH, SHL, SHR 3.: +, - 4.: AND 5.: OR, XOR 6.: <, >, <=, >=, =, <> (LT, GT,LE, GE, EQ, NE) A MONITOR HASZNÁLATA -------------------- A monitorban találhatjuk a memória vizsgáló,- felülíró, I/O és debugger funkciókat, továbbá innen érhető el a szö- vegszerkesztő és az assembler fordító is. A monitor sorassemblerként is működik, azaz a beírt Z80 assembler utasításokat azonnal lerakja a memóriába, de itt címkéket nem definiálhatunk. A monitor full screen editor módban működik, azaz a cur- sorral szabadon lehet mozogni, módosítani a képernyőn. A monitor az utasítássor első öt, inverz karakterét figyel- men kívül hagyja, 58 karakternél hosszabb logikai utasí- tássort nem fogad el! Az utasítás végrehajtása után a következő sor elejére inverzben kiírja az új memóriamutató értékét ($) az aktuá- lis számrendszer szerint. ? Számkonverziók: - ? : Az aktuális számrendszer cseré- je. Nem decimálisból decimálisba, decimálisból hexadecimálisba vált ? nn : Az nn kifejezés értékének dec. és hex. kiírása. Ha a szám ábrá- zolható 8 biten és/vagy negatív értékként, akkor úgy is kiírja. J nn :A memóriamtató ($) nn címre állí- ------ tása. + : $:=$+1 á a cursor helyben marad, - : $:=$-1 így a funkció ismételhető M Memória másolás: --- M nn,mm : Az nn címtől mm címig taró memó- riarészt a $ címre másolja. Az átfedés megengedett! mm>=nn ! INS Beszúrás a memóriába: INS nn,mm : A $ címtől nn-ig tartó memóriát mm db. byte-tal feljebb helyezi. A felszabaduló részt 0-val tölti fel. nn>=$ ! S nn : A $ címtől nn címig tartó memó- ------ riáról 24 bites ellenőrző össze- get ír ki. nn>=$ ! C Memóriaterületek összehasonlítá- --- sa: C nn : A $ címen kezdődő memóriát ösz- szehasonlítja az nn címen kezdő- dővel. Eltérés esetén kiírja a talált címeket ,az ottlévő byte- okat, majd billentyűlenyomásra vár: SPACE : tovább ellenőriz; ESC : kilép; CTRL B: HARDCOPY a nyomtatón! Egyező blokkok esetén egy üres sort ír ki. F Byte-sorozat keresése a memóriá- --- ban: F n,"felirat",m,... : Megkeresi az adatok első előfor- dulását a $ címtől kezdve. Sike- res kereséskor kiírja a talált címet, majd billentyűlenyomásra vár : SPACE : tovább keres; ESC : kilépés RETURN : DUMP-ot ad a talált címtől egyéb : kilép, és a $-ba má- solja a talált címet L Disassemblálás: --- L : A $ címtől listáz L nn : Az nn címtől listáz. Egy sor kiírása után billentyű- lenyomásra vár: SPACE : újabb sort listáz ESC : kilépés ^ : kilépés, az utolsó listázott sor címe a $-ba másolódik. @ : DB n listázás ki-bekapcsolása. A bekapcsolt állapotot a keretszín jel- zi. INS : Az EDITOR-ba listázás ki-bekapcsolása. Az így listázott sor a szövegszerkesz- tőbe is bekerül. A bekapcsolt állapotot egy cursor-négyzet jelzi a sorban. RETURN : JP nn, JR nn, CALL nn utasítás esetén a listázást az nn címen folytatja. A CALL vagy feltételes ugró utasítás címét megjegyzi (max. kb. 500-at). DEL : visszatér az előző, a RETURN lenyomása előtti címre, ha ott CALL vagy feltéte- les ugró utasítás állt, azaz csak elá- gazási pontra tér vissza. CTRL B : Hardcopy a nyomtatón. D Memória listázása,felülírása: --- D : DUMP a $ címtől. D nn : DUMP az nn címtől. A képernyő tetején: a listázott 256 byte kezdete,vége és az aktuális lapkiosztás. A képernyő alján: (mm)=nn;n ahol mm : a cursor pozíciója a memóriában; nn : a cursor címén lévő 16 bites; n : a cursor címén lévő 8 bites ér- ték. A használható funkciók: CTRL B : hardcopy a nyomtatóra. INS : ASCII karakterek 7. bitjének ki-be- kapcsolása. botkormány : mozgás a memóriában : SHIFT-tel : négyesével mozog; CTRL fel/le : a megelőző/következő 240 byte. ALT jobbra/balra : Grafikus dump szélességének változ- tatása. A graf. dump a cursor pozí- citól kezdődik. A grafikus dump se- gítségével lehet a memóriában ábrá- kat (pl. sprite-okat) keresni. RETURN : a cursor vált az ASCII és a hexa- mező között. A kijelölt cím csak a villogó cursor helyén írható felül! A hexadecimális mezőben az A-F szám- jegyek csak nagybetűvel írhatók! ALT RETURN : GRAPHICS mód csere. (csak ha a gra- fikus dump be van kapcsolva.) CTRL ^ : a kurzor helyén álló érték szerinti címre ugrás. DEL : visszaállítja a felülírt címek ere- deti tartalmát az aktuális DUMP kép- ernyőn. ESC : visszalép a monitorba (vagy a FIND parancsba). A monitor I/O - kezelő funkciói: -------------------------------- I Az IN_TABLE olvasása,módosítása: --- I n : kiírja az IN_TABLE n. elemét. I n,m : az IN_TABLE n. elemébe m érté- ket ír. O Az OUT_TABLE olvasása, módosítá- --- sa: O n; O n,m : ua. mint az I-nél. Az IN- és OUT_TABLE módosítása- kor a program nem ellenőrzi a beírt adat helyességét! PORT I/O port írása,olvasása: ---- PORT nn : kiírja az nn portról olvasott értéket. PORT nn,n : az nn portra n értéket küld. (Megjegyzés: a TVC beépített portjai csak 8 bites portcímeket használnak.) H : Hardcopy a nyomtatón. --- (Nem grafikus !) OS RST 30h,n rutin végrehajtása: ---- OS n : DE-be a $ fiz. címét, BC-be 0-át tölt,majd végrehajt egy RST 48,n utasítást. OS n,nn : DE-be a $ fiz. címét, BC-be nn-t tölt,majd RST 48,n. Mindkét esetben kiírja a vissza- kapott értékeket. A<>0 esetén hibát jelez. PAL paletta-értékek módosítása: ----- PAL : kiírja az aktuális (elmentett) palettaértékeket. PAL param. : módosítja a paletta aktuális ér- tékét a paraméterekben megadott értékekkel. pl.:PAL 0 : a papírszínt változtatja PAL 0,16,85,4: mind a négy palettaszínt módo- sítja. CLS képernyő törlés: ----- CLS : -ll- CLS 0 : GRAPHICS 2 CLS 1 : -ll- 4 CLS 2 : -ll- 16 P memória lapozás: --- P : kiírja az aktuális lapkiosztást. P n : lapozás az n érték szerint. (csak a 2-3. ó1-2.Á lapra hajtó- dik végre!) OPEN file nyitása írásra/olvasásra: ---- OPEN W : pufferelt file nyitása írásra, OPEN W,file-név : név nélkül, illetve névvel. OPEN R : file nyitása olvasásra név nél- OPEN R,file-név : kül, illetve névvel. CLOSE file zárása: ----- CLOSE R : olvasott file lezárása. CLOSE W : írt file lezárása. W memóriaterület mentése: --- W file-név : A lefordított program kimentése (V 7 -től V 8-1 címig). W file-név,nn : A $-tól nn címig tartó memória kimentése. W file-név,SYM : a szimbólumtábla kimentése. W file-név,TXT : az assembler forrásszöveg kimen- tése. R memóriaterület betöltése. --- R : betöltés a kódpuffer elejére, R file-név : név nélkül, vagy névvel. Csak annyi byte-ot tölt be, amennyi bele is fér a kódpufferbe. (V 8 értékét beállítja a file utáni első byte fizikai címére!) R file-név,nn : A $-tól nn címig tartó terület- re töltés. (V 8-at beállítja!) R file-név,SYM : új szimbólumtábla betöltése; a régi törlődik. Az esetleges elő- ző tábla rögzítést feloldja! R file-név,TXT : hozzátöltés a már meglévő for- rásszöveghez. Az R és a W az U3 RAM területén is használható, ilyenkor a képernyőn zavaros ábra jelenik meg, de ez nem hiba! (A videomemória átmeneti adattároló- ként üzemel ilyenkor.) [A TOP nem tud az U3 RAM terülületére tölteni!] \ : VT-DOS kompatibilis floppymeg- - hajtó esetén belépés a BASIC CLI-be. \parancs DOS parancs végrehajtása -------- pl.: \DIR b:*.ASM Munkaterületnek a definiálha- tó karakterek mátrixát hasz- nálja fel. A DEBUGGER FUNKCIÓK: -------------------- A debugger funkciók lehetővé teszik a gépi kódra lefor- dított programok kipróbálását, tesztelését. Használatuknál a következőket kell figyelembe venni: - A debugger közös stacket használ az operációs rendszerrel, ezért az U0 RAM-ot kilapozni ti- los, az SP csak az U0 RAM-ba mutathat! - A tesztelni kívánt program logikai és fizikai címének egyeznie kell, ellenkező estben "Nem használható!" hibajelzést kapunk! - A Mnemonic IV rendszer vektoros interrupt le- kezelésére nincs felkészítve, ezért a teszte- lendő programban nem lehet IM 2 utasítás! X Az elmentett regiszterkészlet olvasása, módo- --- sítása: X 0 : Az összes regisztert törli; az SP-t alaphely- zetbe állítja (5800 dec.), a PC-be a $ érté- két tölti. X : Kiírja a teljes regisztertükröt; valamint a PC címen lévő utasítás nevét, kódját. A PC érté- két az aktuális számrendszerben, a regisztere- ket hexadecimálisan, az F-et és F'-őt biten- ként írja ki. Az F melletti, név nélküli adat a PAGE érték; az F' melletti, név nélküli adat az I regiszter értéke. X x : Kiírja az x értékét. X x,n : Az x-be 8 vagy 16 bites értéket tölt. x fajtái: --------- AF BC DE HL IX IY AF' BC' DE' HL' SP PC regiszterpár,vagy az A F B C D E H L XH XL YH YL A' F' B' C' D' E' H' L' I és IFF regiszter, ahol: IFF =0: DI üzemmód, IFF<>0: EI üzemmód. A monitorban az "x"-re hivatkozás megengedett. pl.: D HL D PC L DE, stb. B Töréspontok definiálása, törlése: --- - A tesztelendő programban max. 8 db. töréspont hasz- nálható. - Töréspontnak RST 0 utasítást használunk, ezért ez másra nem használható! - A rendszer csak a B utasítással definiált töréspon- tot ismeri fel, a memóriába direkt beírt RST 0 uta- sítás hatása a Mnemonic IV EXT 0 utasítással törté- nő újraindításával azonos! - Töréspont csak RAM-ban használható! - Több byte-os utasítás esetén a töréspontot az első byte-ra kell helyezni! - Lehetőség van úgynevezett többszörös töréspont de- finiálására, azaz olyan töréspont készíthető, ahol csak az mm-edik átfutáskor áll meg a program. így megszámlálható az adott ponton való áthaladások száma. B : Kiírja az egész törésponttáblázatot: 1. oszlop a töréspont címe, 2. oszlop a max. átfutásszám, 3. oszlop a még hátralévő átfutások száma. B 0 : Törli az egész törésponttáblázatot. B nn : Az nn címre egyszeres töréspont definiálása. B nn,mm: Az nn címre mm-szeres töréspont definiálása. (Vagy a már meglévő töréspont átfutásszámá- nak módosítása.) B nn,0 : Az nn címen levő töréspont törlése a táblá- zatból. G A program elindítása, folytatása töréspont --- után: A töréspontok a G utasítás kiadása után kerülnek a programba (az akkor aktuális lapkiosztás szerint!), a törésponttáblázat alapján. A monitorba visszatéréskor visszaáll az eredeti tartalom, azaz a töréspontok eltün- nek a programból, de a törésponttáblázatban megmaradnak. G nn : Szubrutinhívás az nn címre. A verembe visz- szatérési cím kerül. G : Ugrás az aktuális PC-címre. (nem a $ cím- re!) A stack-be nem kerül visszatérési cím! Leginkább töréspont utáni folytatáskor al- kalmazható. T Lépésenkénti programfuttatás. RAM-ban és --- ROM-ban is használható. Kiadásakor törés- pontok nem kerülnek a programba. Az RST utasítások rutinjaiba nem lép bele. T : Lépésenkénti végrehajtás a PC címtől. Min- den lépés előtt kiírja a regisztertükröt, a soronkövetkező utasítást, majd billentyű lenyomására vár: ESC : vissza a monitorba. CTRL : utasítás végrehajtása, a szubru- tinhívásokba "belelép". ALT : utasítás végrehajtása, a szubru- tinhívásokba nem lép bele, azokat egy utasításnak értelmezi. - : a soronkövetkező utasítás átugrása T nn : A PC-címtől nn darab utasítás végrehajtása. A regisztertükröt csak a lefutás után írja ki. A billentyűzetet most is figyeli! A program futási sebessége a normálisnak kb. 1/2000-ed része ! FIGYELEM az nn nem a kezdő cím, hanem a végrehajtandó utasítások száma !!! Az alábbi utasítások mind az assembler fordítóban, mind a monitorban használhatók. Az adatok a $ címtől kerülnek lerakásra. LAB : A szimbólumtábla elemeinek lis- --- tázása, a definiálás sorrendjé- ben. A listázás bármely billen- tyű lenyomásával szüneteltethe- tő, illetve folytatható, ESC le- nyomására megszakad. Az érték melletti jel a szimbólum típusát jelzi: L : címke, < : EQU-val definiált konstans, \ : SET-tel definiált változó. RADIX nn : Az aktuális számrendszer alapját nn-re cseréli. nn csak 2, 8, 10 vagy 16 lehet! DB n,"felirat",m,... : 8 bites kifejezések és feliratok DB 'szöveg',n,n.. lerakása a memóriába. DW nn,mm,nn,mm,... : 16 bites kifejezések lerakása a memóriába, alsó-,felső byte sor- rendben. DS nn : A memóriába nn darab 0 byte-ot helyez. D$ n,"felirat",m,... : Elhelyezi az adatbyte-ok számát egy byte-on, majd magát az 'n,"f elirat",m,...' adatokat. így le- het pl. egyszerűen file-neveket lerakni. FILL nn : A memóriát az nn címig 0 byte- tokkal tölti fel. FILL nn,n,'felirat',m,..: A memóriát az nn címig feltölti az n,'felirat',m,... adatokkal. A FILL és a DS utasítások nn paraméterében címkene- vet ne használjunk, ez fordítási fázishibához vezethet! AZ RST p UTASíTÁSOK SZINTAKTIKÁJA --------------------------------- A p az AKTUÁLIS SZÁMRENDSZERnek megfelelő szám, vagy használjuk a számrendszer jelöléseket! (pl. 30H, .48) Az RST 8 (hibaüzenet) és RST .48 (operációs rendszer rutin hívása) utasítások kétparaméteresek. A második para- méter a funkciókód. Pl.: RST 8,1; "Not understood" hibajelzés RST .48,.33; egy karakter kiírása. A nem szabványos Z80 utasítások használata ------------------------------------------ Mind a monitorban, mind az assemblerben elérhetjük az IX és az IY regiszterpárt regiszterenként is. Az így elér- hető alsó regiszterek neve XL és YL, a felsőké XH és YH. Ezek a regiszterek a bitműveletek kivételével mindenhol hassználhatóak, ahol az L és H regiszterek használata me- gengedett. Pl.: LD A,XL; OR YH; ADC A,XH ; stb. A két indexregiszter egyazon utasításban nem használható. Ezért pl.: az LD XH,YL nemlétező utasítás. Lehetőség van még az SLL param. utasítás használatára is. Az SLL funkciója: a paraméter bitjet shifteli: CY <- (7 <- 0) <-1 A paraméterek: A, B, C, D, E, H, L, (HL), (IX+d) és (IY+d) lehetnek. Pl.: SLL (HL); SLL C; stb. AZ ASSEMBLER MŰKÖDÉSE --------------------- Az assembler két menetben fordít; az első menetben a szimbólumtábla, a másodikban a kód készül el. A második menetre csak az első hibátlan lefutása esetén kerül sor. A fordítás I/O hiba, vagy a szimbólumtábla megtelése esetén azonnal megszakad. A fordítás bármely gomb lenyomásával szüneteltethető, - folytatható, az ESC-pel bármikor kiléphetünk belőle. A fordítás kezdetekor a már meglévő szimbólumtábla tör- lődik. A törlést a V 6 rendszerváltozó 1. és 2. bitjének 1-be állításával megakadályozhatjuk. A bitek beállításako- ri szimbólumtáblázat ezután már soha sem törlődik, csak a később definiált részek. A rendszer a 2. bit kinullázásá- val jelzi a szimbólumtábla alsó felének rögzítését. A tel- jes szimbólumtábla ismét törölhető a két bit 0-ázása után. A fordítás végén az első szabad byte fizikai címe a V 8 változóba, logikai címe a $-ba kerül. A A szövegszerkesztő tartalmának lefordítása. --- A : A lefordított kód a memóriába (a kódpuffer- be) kerül. A 0 : Kód nem készül; szintaktikai ellenőrzésre használható. A file-név:A második menetben a kódot pufferelt file- ba tölti. File-ba fordításkor mindössze 64 byte hosszú kódpufferre van szükség! A file első két byte-ja az ORG-címet tar- talmazza, a többi byte maga a kód. Magnóin- ításra "Magnófelvétel indul!" felirattal figyelmeztet.File-ba fordítás előtt érdemes ASM 0-val szintaktikai ellenőrzést végezni! ASSEMBLER DIREKTíVÁK: --------------------- A forrásszövegben található, az assembler működését vezérlő parancsok: MODE A fordítás módjának megváltoztatása a for- ---- dítás közben: MODE 0 : "A 0" fordítási módot kapcsol be, azaz in- nentől kezdve kód nem készül, csak szintak- tikai ellenőrzés történik. MODE C : Kód nem készül, a memóriában már bent lévő kódot összehasonlítja a forrásszöveg által előírttal. Az eltérő sorokat kiírja. MODE N : Visszaállítja a MODE 0 vagy MODE C előtti fordítási állapotot. EQU Számkonstans szimbólum definiálása, nem de- --- finiálható újra. címke EQU nn : a 'címke'-nevű, nn értékű konstans definiá- lása.Az nn kifejezésben címkenevet ne hasz- náljunk, fordítási fázishibához vezethet ! SET : Változó szimbólum definiálása.Az így létre- --- hozott szimbólum értéke egy újabb SET uta- címke SET nn sítással átdefiniálható. END : Befejezi a fordítást; az esetleg hátralevő --- forrásszöveget figyelmen kívül hagyja.Hasz- nálata nem kötelező. INCLUDE file-név: A 'file-név' nevű file tartalmát betölti ---------------- a szövegpuffer még üres részébe (ha van elég hely), majd lefordítja. File-vég után az így betöltött file törlődik, a fordítás az INCLUDE után következő sorban folytató- dik. Az INCLUDE utasítások nem ágyazhatók egymásba! Magnóindításra mindig figyelmez- tet. Az INCLUDE utasítás használatával olyan nagy programot is készíthetünk,melynek for- rásszövege egy darabban nem férne be a szö- vegszerkesztőbe. LIST Fordítási listát készít a következő sortól. ---- Ha az A parancs kiadásakor működőkész nyom- tatót, vagy annak helyén más eszközt talál, oda -, ennek hiányában a képernyőre listáz. A lista oszlopai: - sorszám (dec.) - cím (akt. számrendszer) - kód (hexa.) - forrássor LIST : Bekapcsolja a listázást. LIST nn : nn=0 esetében ki-, nn<>0 esetben bekapcsol- ja a listázást. IF nn : Feltételes fordítási blokk kezdete. nn<>0 ------ esetén fordít tovább. IFE nn : Feltételes fordítási blokk kezdete. nn=0 ------ esetén fordít tovább. ELSE : Fordítási mód cseréje.(fordít<->nem fordít) ---- ENDIF : Feltételes fordítási blokk vége. Innentől ----- ismét minden lefordítódik. FIGYELEM! A nem fordított blokkokban is történik szintaktikai ellenőrzés ! Áthelyezhető programok készítése -------------------------------- Áthelyezhető (relokálható) az a program, amely a memó- ria bármely részére betöltve működőképes. Mivel a TVC operációs rendszere ilyen programok használatát nem támo- gatja, és a puffereletlen kazettás file-kezelés hatékony relokáló loader használatát lehetetlenné teszi, ezért a relokálható programok hossza mindig nagyobb lesz, mert a relokáláshoz szükséges adatokat is tartalmazniuk kell. A fordítót a forrásszöveg elején (az ORG nn helyett) elhelyezett "címke RELOC" paranccsal utasíthatjuk relokál- ----------- ható program készítésére. A címke megadása kötelező! Az áthelyezhető programok írásának szabályai: - Áthelyezhető programot nem lehet közvetlenül file-ba fordítani! - relokálni csak a JP címke; JP feltétel,címke; CALL címke; CALL feltétel,címke; LD A,(címke); LD (címke),A; LD dd,címke; LD dd,(címke) és LD (címke),dd utasításokat lehet! A címke igen lényeges feltétel, ugyanis ha az előző utasítások számkonstansokat, EQU- val, vagy SET-tel definiált szimbólumokat tartalmaz- nak, akkor azok nem relokálódnak (fix címre mutatnak)! - A "DW címke1,címke2,... címkex" utasítások nem relo- kálhatók, ezért az ilyen, ún. ugrótáblákból felvett értékekhez, amennyiben azok a programon belüli címeket tartalmaznak, mindig hozzá kell adni a program kezdő- címét! A relokálás után a program kezdőcíme a Start+2 címen lerakva megtalálható, ahol a "Start" a RELOC pa- rancs címkéje. - Az előző pontból következik, hogy egy ugrótábla nem tartalmazhat egyszerre programon belüli és kívüli cí- meket! - Címkékhez hozzá lehet adni, illetve címkéből ki lehet vonni konstans értéket. Címkével más műveletet végezni tilos! ( Két, ALFA és BÉTA címke távolságát kiszámíta- ni a "táv SET BÉTA-ALFA" paranccsal lehet, a "táv" szimbólum értéke már szabadon felhasználható.) A relokálható program látszólag a 0000H címre fordító- dik (ORG 0000H), ám szerkezete jelentősen különbözik a ha- gyományosétól. A program egy 42 (dec.) byte-os relokáló rutinnal kezdődik, majd a "valódi" program következik. A már felsorolt utasítások után 2-2 byte adat kerül a kódba. A program így, relokálás nélkül nem futtatható, és nem is fordítható vissza helyesen! A "CODE" címre betöltött program BASIC-ből az USR(CODE,CODE) gépi kódból pedig az LD HL,CODE CALL CODE parancsokkal relokálható. A relokáló rutin ekkor négy dol- got végez el: - a programban található adatok alapján elvégzi a cím- kehivatkozások átírását a "CODE" címhez képest, - az adatbyte-okat NOP utasításokra cseréli, - a CODE cím értékét elhelyezi a (CODE+2) címre, hogy a program ugrótáblát kezelő rutinjainak legyen honnan felvenniük az eltolási értéket, - a relokáló szubrutint "kikapcsolja" a programból, így az soha többé nem futhat le. (A program így felszaba- duló 5-42. byte-ja ezután bármilyen célra felhasznál- ható.) A relokálás végeztével a vezérlés visszakerül a reloká- ló rutin hívójához. Ezután a programkód már bármikor meg- hívható az USR(CODE), illetve a CALL CODE utasításokkal. A rendszer bővíthetősége ------------------------ A Mnemonic IV program a felhasználó részéről bővíthető, kiegészíthető. A bővítések számára három belépési pont van. A belépési pontokhoz három 2-2 byte-os rendszerváltozó tartozik. A változóknak kell tartalmazni a felhasználó részéről megírt bővítőrutin kezdőcímét, hasonlóan a BASIC EXT utasításai- nak ugrótáblájához. Alapesetben a kezdőcím 0 . Mindhárom bővítőrutinnak RET utasításal kell végződnie! 1.) A @ monitor utasítás, változója a COM_DEV A felhasználó saját monitor utasítást, utasításokat ír- hat, ezt "@ param1,param2" módon hívhatja meg. Az áta- dott paraméterstringek a STRING1 és a STRING2 címekre kerülnek lerakásra a memóriába. (Stringen egy, a memóriába lerakott feliratot értünk, első byte-ja a felirat további byte-jainak számát tar- talmazza.) A paraméterek megadása nem kötelező. A rutinból kilé- péskor az A regiszter hibakódként értelmezett! 2.) A következő belépési pont a töréspont lekezelő rutin- ban található. A bővítés rutin megléte esetén a törés- pontnál csak akkor áll meg a tesztelendő program, ha a bővítésrutin NZ flagtartalommal tér vissza. így lehetőség van 'intelligens' töréspont készítésére Pl. egy adott memóriacím tartalmától, vagy a REG_TAB-ba elmentett regiszter tartalmaktól függő megállásra. 3.) Az utolsó belépési pont a REGVIEW rutinban található. Ez a rutin írja ki az elmentett regisztertartalmakat és a PC címen lévő utasítást a képernyőre. Bővítésével el- érhető pl. a felhasználó részéről fontosnak tartott me- móriacímek tartalmának megjelenítése. Az alábbiakban felsoroljuk a felhasználható rutinok listáját. Ahol nincs más megemlítve ott a paraméterek min- dig fizikai címet jelölnek, valamint a regiszterek vissza- térő tartalma megváltozik. Kiíró rutinok: -------------- CRLF a cursort a következő sor elejére állítja. PRINT a HL címen kezdődő string kiírása, a 224 és na- gyobb kódú karakterek helyett kód-223 db. space-t ír ki. PRINTLN PRINT a sor elején. PRINTAT PRINT a BC-vel megadott cursorpozíciótól. INVERZ a PRINT inverz változata. SPACE az A reg. számú space-t ír ki. FreeLin Ha a képernyőre írunk, a kiírt felirat sokszor nem felülírja, hanem maga alól "kitolja" a már ott lé- vő sorokat. A FreeLin rutin a HL-ben adott számú karakterhelyet felszabadít a képernyőn, az aktuá- lis sor kezdetétől, a kiírás előtt. Ajánlatos 16- tal osztható értéket adni! REGVIEW a regisztertükröt megjelenítő rutin. HEXBYTE a B reg. hexadecimális kiírása "H" nélkül. NUMERIC a HL értékét írja ki az aktuális számrendszer sze- rint. DECIMAL a HL értékét írja ki decimálisan. HEXANUM a HL értékét írja ki hexadecimálisan, "H" nélkül. EQU_NUM "string=nn" felirat kiírása; a stringre a HL mu- tat, DE:=nn. KONVERZIÓS RUTINOK: ------------------- FPC_RUT a logikai címből a címzési eltolás szerinti fizi- kai címet állítja elő: in/out=HL LPC_RUT a fizikai címből a címzési eltolás szerinti logi- kai címet állítja elő: in/out=HL FORM_16 a HL címen kezdődő 16 bites numerikus kifejezést tartalmazó string értékét a HL-be tölti, NZ flag- tartalom esetén az A regiszter hibakóddal tér vissza. FORM_8 ugyanez, csak 8 bites kifejezésre, az eredmény az L-be kerül. LINE a HL címen kezdődő, C karakter hosszú 'n,n,"feli- rat",n,n,...' típusu szöveget a DE címre lerakott bináris stringgé alakítja. (ld. a DB utasítást!) Az esetleges hibakód az A-ba kerül. ELLENŐRZŐ RUTINOK ----------------- CPHLDE HL és DE összehasonlítása: 'CP HL,DE'. F az ered- ményt jelzi, HL és DE kezdőértéke megmarad. T_ADDR input : HL=logikai cím; output: NZ=hibás cím; A=hibakód; A=7: kifutás a tárból, vagy A=11 : HL<$ KIFUTÁS input : HL=logikai cím; output: CY=kódpufferen kívülre címzés. (kifutás a tárból.) HL=változatlan. ST_END output: CY=a stack mélysége kisebb mint 200 byte! Regisztert nem módosít! KERESŐ RUTINOK -------------- CíMZŐ egy HL címen kezdődő kétbyte-os adatokat tartal- mazó táblázat A-adik elemét a HL-be tölti (első a 0. adat!). A DE az adat 2. byte-jának címére mutat a visszatéréskor. FINDER0 egy n db. stringet tartalmazó táblázatban megke- resi a DE címen kezdődő stringet. A táblázat kez- detére a HL mutat. A táblázat végét egy 0 byte jelzi. Ha megtalálta, akkor A-ba a megtalált elem sorszáma-1; ha nem, akkor A-ba n kerül. EGYÉB RUTINOK ------------- CLEAR a HL címen kezdődő BC-db. byte feltöltése 0-val. CLEARúA a HL címen kezdődő BC-db. byte feltöltése az A regiszter tartalmával. IOúRUT LOAD, SAVE, VERIFY az U2-U3+ lapon. A 3.lap hasz- nálata esetén a képernyőn zavaros ábra jelenik meg. File nyitást/zárást a rutin meghívása előtt/ után kell végezni. óCsak a BOTTOM-ban létező ru- tin!Á Input : A=funkciókód DE=terület kezdete BC=terület nagysága Output: (HIBA)=hibakód. ASK inverzben kiírja a HL címen kezdődő stringet, majd billentyű lenyomásra vár. "I","i","Y","y" lenyomása esetén NC; "N" vagy "n" esetén CY flag- tartalommal tér vissza. CURSOR a cursor villogtatása billentyűlenyomásig. A ka- pott ASCII érték a C és az A regiszterekbe kerül. Nem írja ki a kapott karaktert! BEEP kettős pittyegés, a HL es DE értékét megőrzi. A fontosabb változók -------------------------- Változó byte leírás ------- ---- ------ HIBA 1 Az IO_RUT rutin által visszaadott hibakód. STRING1 57 I/O munkaterület. STRING2 55 I/O munkaterület. FPC 2 Az aktuális memóriamutató ($) fizikai címe. LPC 2 Az aktuális memóriamutató ($) logikai címe. EL 2 A címzési eltolás aktuális értéke. (EL = fizikai cím - logikai cím.) INICTAB 8*2 A V 0-V 7 rendszerváltozók alapértékei. A Mnemonic IV program betöltés után, illetve EXT 0,22222-vel újraindításkor ebből a táb- lázatból veszi a kezdőértékeket. RST_TAB 8*1 Az RST 0 - RST 56 utasítások hossza az assembler, a disassembler és a debugger számára. Értékeik: 80H : egybyte-os (RST 0, RST 16, RST 32, RST 40, RST 56); 81H : kétbyte-os (RST 8, RST 48) 82H : többyte-os. (RST 24) REG_TAB 13*2 A debugger regisztertükör értékei; sorrend- ben: PC, SP, BC, DE, HL, IX, IY, BC', DE', HL' ,AF, AF', I-IFF. (az IFF 2. bitje az EI állapotot jelöli). COM_DEV 2 A É utasítás kezdőcíme. BRK_DEV 2 A töréspont kiértékelő rutin bővítéscíme. REG_DEV 2 a REGVIEW rutin bővítéscíme. Az itt leírt változók és szubrutinok címei a BOT_SYM [illetve a TOP_SYM] file-ban találhatók meg. A file szim- bólumtáblába töltése után rögzítsük a szimbólumtáblát! A HIBAÜZENETEK MAGYARÁZATA -------------------------- Hibakód hibaüzenet / magyarázat ------- ----------------------- 1: Kevés a memória! A fordítás során megtelt a kódpuffer. 2: x/0! Nullával osztás. 3: Ismeretlen parancs! A Mnemonic IV. az utasítást nem ismeri. 4: Túlcsordulás! Az aritmetikai kifejezés (vagy annak egy tag- ja) nem ábrázolható az adott szóhosszon. ( 8, illetve 16 biten ). 5: Hibás kifejezés! Az aritmetikai kifejezésben tiltott karakter található. 6: Hibás paraméterszám! a) Az utasítás több, vagy kevesebb paramétert vár a megadottnál. b) A RELOC, EQU vagy SET utasítás címke nél- kül áll. 7: Kifutás a tárból! A kódpufferen kívülre hivatkozás. 8: Túl hosszú név! A címke neve hosszabb hét karakternél! 9: Tele a tár! a) A szimbólumtábla megtelt. b) Az INCLUDE file nem fér be a szövegpuffer- be. c) Megtelt a törésponttáblázat. 10: Elérhetetlen! A cím nem érhető el relatív címzéssel! 11: Hibás paraméter! Az utasítás paramétere értelmetlen, vagy kí- vül esik az értelmezési tartományon. 13: Hibás elnevezés! A címkenévben tiltott karakter található! 14: Védett szó! A címkenév regiszternévvel vagy feltételszó- val azonos! 15: Nem használható! a) Címzési eltolás van érvényben, a debugger nem használható. b) Az editorba vagy a szimbólumtáblába nem odaillő file-t próbáltunk betölteni. c) Az utasítás monitor parancs, az assembler- ben nem használható. 16: Újradefiniálás! A címke már létezik! 18: Ismeretlen cím! Definiálatlan címkére hivatkozás. 20: ???! Szintaktikai hiba, az utasítás nem választha- tó szét a paramétereitől, vagy csak címke ta- lálható a sorban. 21: Nem címkézhető! Assembler direktríva ( ORG,LIST,END,...) cím- kézése. 128-255: I/O hiba! Az operációs rendszer hibajelzései. FÁZISHIBA !!! A két fordítási menet különböző hosszúságú kódot állított elő. Ennek az az oka, hogy az első menet során valamelyik 'FILL nn', 'DS nn' vagy 'címke EQU nn' utasítás nn kifeje- zésében még definiálatlan címkére történt hi- vatkozás. 12, 17, 19, 22-127: - Nem használt hibakódok. KÖSZÖNETNYILVÁNíTÁS ------------------- Itt szeretném megköszönni Filó Gusztáv és Gyányi Sándor barátaim önzetlen segítségét, amit ezen leírás begépelésé- vel, illetve az aritmetikai kifejezéseket kiértékelő rutin megírásával tettek nekem! Mindenkinek jó munkát kívánok: Bp. 1990. VI. 28. Bata László (1137 Bp. Jászai Mari tér 5. I/4.)