Programok

HiSoft DevPac
Programozási segédlet

1985 - HiSoft


Tartalom

GEN & MON

1. Bevezetés a GEN-hez
1.1. Gyakorlott programozóknak

2. GEN-referencia
2.1. A GEN működése
2.2. A parancssor
2.3. parancssor opciók
2.4. Az Assembler utasítások formátuma
2.5. Címkék
2.6. Utasítás számláló
2.7. Szimbólum tábla
2.8. Kifejezések
2.9. Relokálható címkék és relatív címek
2.10. Assembler direktívák
2.11. Assembler formátum vezérlő utasítások
2.12. Macrók
2.13. Fordítás lsitázás

3. Az integrál editor

4. Gyors hivatkozási útmutató
4.1 A GEN hibaüzenetei
4.2. Fenntartott szavak
4.3. Érvényes mnemonikok
4.4. Assembler direktívák
4.5. parancssor opciók
4.6. Assembler parancsok
4.7. Operátorok

5. Bevezetés a MON-ba
5.1 A MON betöltése
5.2. A főképernyő
5.3. A MON EXOS használata

6. Standard MON parancsok
6.1. Számok bevitele
6.2. Az érvényes parancsok

7. Magasabb szintű MON parancsok
7.1. Visszafordítási parancsok
7.2. Töréspont parancsok
7.3. Futtatási parancsok


Első fejezet: Bevezetés GEN-hez

A GEN egy gyors Z80 assembler, melyet az EXOS operációs rendszerrel ellátott Enterprise számítógépekre terveztek.
A GEN lefordítja a standard Z80 mnemonikokat, további szolgáltatásai között megtalálhatjuk a feltételes fordítót, a teljes szöveg macrókat, az aritmetikai műveletek teljes skáláját és sok assembler parancsot. Az object kódok összeszerkesztésének kivételével a GEN kompatibilis a ZILOG Z80 assemblerrel. A GEN az object kódokat bármilyen külső eszközre ki tudja írni, s minden EXOS object kód modul típusra a pontos fejlécek is automatikusan kiíródnak. Az EXOS relokálható formátum teljes mértékben biztosított.

A GEN betöltése az Enterprise-ba
A GEN egy relokálható rendszerbővítés, ezért betöltésekor csupán a GEN-t tartalmazó kazettát kell betennünk a kazettás magnóba úgy, hogy a GEN címke felül helyezkedjen el; nyomjuk meg az 1-es funkcióbillentyűt (a BASIC-nél a START, szövegszerkesztőnél a LOAD) majd a PLAY gombot a kazettás magnón. Ekkor a GEN betöltodik és inicializálódik; a GEN elindítása a következőképpen történik:

:GEN <ENTER>

BASIC-ben, vagy

FUNCTION KEY 8 majd
GEN <ENTER>

a beépített szövegszerkesztőnél.

Ekkor megjelenik az editor (a szerkesztő) további segítséget, információkat nyújtó (help) szolgáltatása; ha elolvassuk a kézikönyv többi fejezetét, részletesebb magyarázatot kapunk a GEN, valamint az editor működéséről.

A 2. fejezet átfogó Képet nyújt a GEN tulajdonságairól és bemutatja, milyen módon lehet optimálisan kihasználni azokat.
A 3. fejezet a beépített editort részletezi, amely a standard EXOS editor csatornáit használja a könnyebb kezelés és nagyobb hatékonyság érdekében.
A 4. fejezet egy gyors hivatkozási útmutató a GEN-hez.

Amennyiben ön az assembly nyelv programozásában még kezdő, azt javasoljuk, hogy a GEN használata előtt alaposan olvassa el a 2. és 3. fejezetet! Ha már van gyakorlata, látni fogja, hogy a 3. és a 4. fejezet elolvasása elegendő a GEN gyors és hatékony használatához. Ha mégsem tud várni a kezdéssel, olvassa el a következőket:

1.1. Gyakorlott programozók részére
Ez a fejezet a tényleges tájékoztatót megelőzve a legszükségesebb alapdolgokat ismerteti az assembly programozásban jártas programozókkal. Ezen információk alkalmazásával gyors sikerélményhez juthat a GEN használatában. Természetesen, ha problémák merülnének fel, olvassa el a tájékoztató szükséges fejezeteit.

  1. A forrás file-ok létrehozhatók és fordíthatók a memóriában, vagy fordíthatók külső eszközről. A forráskód a memóriába a beépített editor segítségével juttatható, mely a sorszámokat a BASIC-hez hasonlóan használja. Az
         I10,10 <ENTER>
    szöveg bevitelére használatos, a <STOP> megnyomásával kiléphetünk az inzertálásból.
  2. A forrásfile különböző területei (címke, mnemonik, operandus) az ún. white space-szel különíthetők el egymástól. A white space tetszőleges számú tabulátor vagy szóköz karaktert jelent.
  3. A címkék tetszőleges hosszúságúak lehetnek és kettősponttal lezárhatók, a kettőspontot a szimbólum táblába történő felvételkor figyelmen kívül hagyja.
  4. A mnemonikok a 2. oszlopban kezdődjenek vagy utána (így a forráslile első oszlopában elegendő egy space vagy tab).
  5. Az
         A,, <ENTER>
    parancs (az editorból kiadva) általában elegendő a fordításhoz; ez a forrást assembly lista nélkül fogja fordítani.
  6. A forrásprogramban az ENT $ használatával kijelölhető egy indítási cím az editor R (Run), azaz futtatás parancsa számára. Enélkül relokálható formátumú kód jön létre.
  7. A kód az
         R <ENTER>
    editorból kiadott utasítás bevitelével futtatható. A kód a RET utasítással végződjék, ezáltal jutunk vissza az editorhoz.
  8. A kódot az editorból az
         O,,TEST <ENTER>
    utasítás segítségével lehet szalagra vagy disc-re vinni. Ekkor a lefordított modul pontos header típusa is automatikusan kiíródik; a modul típusa megváltoztatható a *R assembler utasítás segítségével. Az alapértelmezés R 5 (Új Alkalmazások Program).

A GEN használata az Enterprise munkaterületén
A GEN relokálható rendszerbővítés. Futása során az 1. és 2. lapon lefoglalja magának a maximális 2 szegmenst, ha lehetséges. Az ezekben, valamint a 0. lapon lévő szöveg (kb. a #300-tól kezdődően) megőrződik a GEN és MON közötti közlekedés során.
A <STOP> billentyű (software megszakítás) és a meleg indítás vektorait a GEN beállítja. Így biztosítja az assembler meleg indítását.
A 120 és 129 közötti csatornaszámok, beleértve a határokat is, foglaltak a HiSoft Devpac, a GEN és a MON részére. A GEN használ egy videó csatornát (hardware szöveg módban), egy billentyűzet csatornát, egy editor csatornát (2k-s bufferrel) valamint további csatornákat (szalag/disc vagy printer, stb.), mikor melyik szükséges.

Második fejezet: GEN-referencia

2.1. A GEN működése
A GEN egy relokálható rendszerbővítés, ezért a Z80 3. lapján fut és megközelítőleg 12K-t vesz igénybe. A memóriát a #300 címtől használja a szöveg, a szimbólum tábla és az object számára; az 1. és a 2. lapon maximálisan 2 további szegmenst foglal magának, ha teljes szegmensek állnak rendelkezésre; a GEN megosztott szegmenst nem foglal le. A GEN egy videó csatornát használ (hardware szöveg módban), egy billentyűzet csatornát, egy editor csatornát (2K-s bufferrel); más csatornákat, mint például a printer, a szalag vagy a disc, szükség szerint nyit meg és használ. Ennek a rendszernek az eredményeként a GEN részére megközelítőleg 47K memória áll rendelkezésre az Enterprise 128-on. Habár ez a módszer nem használ memória lapozást, az Include opció segítségével legalább 24K-s objectet készíthetünk egy fordítással.

A GEN a rendelkezésre álló memóriát hárem részre osztja; egy rész a forrásszövegnek, egy másik rész a szimbólum táblának és a harmadik rész a objectnek az említett sorrendben. A szimbólum tábla méretét általában rögzíti az assembler, de ez a bufferméret a fordítás alatt változtatható a file elején lévő B opció segítségével vagy a parancssorban.

A GEN egy kétmenetes assembler; az

A,, <ENTER>

bevitele után, amellyel meghívódik a GEN, az azt követő parancssort megvizsgálja; lefoglalja a szimbólum tábla bufferét és megkezdi az első menetet, azaz megkeresi a szövegben található esetleges hibákat és beszerkeszti a szimbólum táblát a memóriába. Az Include assembler utasítással egy megadott külső file-ból vett forrást lehet fordítani; a fordítás befejeztével az assembly az eredeti file-ban lévő include sor utáni sorral folytatódik. Mindez automatikusan végbemegy és félreérthetetlen a felhasználó számára.
Az első menet alatt - hacsak nem fordul elő hiba - nem íródik ki semmi, sem a képernyőre, sem a printerre. Hiba esetén kinyomtatja a rossz sort a hibaüzenettel együtt, majd folytatja a fordítást, szükség szerint újabb hibaüzeneteket megjelenítve. A hibás sorok későbbi vizsgálatának esetére hasznos lehet, ha ezeket az üzeneteket nemcsak a képernyőre íratjuk ki, hanem betesszük egy külso file-ba (a parancssorban lévő W opció segítségével). Lásd a 2.3. fejezetet.
Az első menet végén a következő üzenet jelenik meg:

Pass 1 errors: nn

azaz "az 1. menetben a hibák száma:"
Ha hibát talált, a fordítás megszakad és nem tér rá a második menetre, hacsak nincs külön kikötve a 2. menet végrehajtása.
Ha olyan címkét talál az operandus mezőben, amely nem szerepel a címkék mezőben, kiírja a

*WARNING* LABEL absent

hibaüzenetet (a deklarálatlan címke nevével együtt). Ha nem talált sem figyelmeztetést, sem hibát (vagy ki volt kötve a 2. menet végrehajtása), az assembly rátér a 2. menetre.

A 2. menet alatt történik az object előállítása, ha szükséges. A kód a memória object bufferébe kerül egész byte-okban vagy bit sorozatos alakban, amennyiben előírtuk, hogy az object EXOS relokálható formában legyen (a parancssorban lévő R opciót használva). A 2. menet alatt assembler listát is szolgáltat (lásd a 2.13. fejezetet), hacsak ki nem iktatjuk a *L-utasítás segítségével.

A 2. menet alatt csak a következő hibák fordulhatnak elő:

Out of range (korlát túllépés)
Type mismatch

(hibás típuspárosítás)

Az ezeket a hibákat követő események hasonlatosak az 1. menet hibáinál leírtakhoz.

Az assembler listázás a <HOLD> leütésével bármikor megállítható és újraindítható a <HOLD> újbóli leütésével; a <STOP> leütése megszakítja a listázást.
A 2. menet végén a következőket írja ki:

Pass 2 errors: nn

azaz "a 2. menetben a hibák száma:"
majd megismétli az 1. menet alatt esetleg előfordult, hiányzó címkékre utaló figyelmeztetéseket is. Utána következik:

Symbol table used: #XXXX out of #yyyy.

ahol xxxx jelöli a szimbólum tábla által igénybevett byte-ok számát hexadecimálisan és yyyy pedig a tábla számára lefoglalt byte-ok számát.

Végül az assembly az object végrehajtási címének a kiírásával fejeződik be; ez csak a nem relokálható file-ok esetében történik és a végrehajtási cím egyszerűen az ENT assembler utasítás programbeli helye által meghatározott cím lesz. Ez pusztán az editor Run parancsának működését biztosítja és nincs hatással az előállított kódra.

Megjegyzés: Ha az 1. menet alatt előfordulna, hogy a szimbólum tábla betelik, a következő üzenet jelenik meg:

Used all #XXXX bytes of Symbol Table!

és a fordítás megszakad.

2.2. A parancssor
A GEN-be való belépéshez használjuk a következő editoron belüli parancssort:

A,,options

Az itt állítható opciókat Top-of-file (azaz file-on felüli) opcióknak nevezzük és a következőkben tárgyaljuk:

2.3. Parancssor opciók
A GEN-en belül sok olyan opció található, amelyek a fordítás folyamatát vezérlik. Ezek nagyjából két csoportra oszthatók: az egyikben a parancssorban előforduló opciók, a másikban a file-on belül akárhol előforduló opciók találhatók. A parancssor (vagy top-of-file) opciókat most tárgyaljuk, míg a többit, melyeket assembler utasításoknak nevezünk, majd később. Három olyan top-of-file opció van, amely mindkét csoportba beletartozik, ezeket ennek megfelelően mindkét fejezetben tárgyalni fogjuk.
Az opciókat tab-okkal vagy space-ekkel kell elválasztani egymástól, pl.

A,,N W PRINTER

A top-of-file opciókat célszerű két csoportra osztani: Kapcsolókra és Globális opciókra. Most ezeket írjuk le.

A KAPCSOLÓK egy, a parancsra utaló betűből állnak (vagy tetszés szerint az egész szóból), melyet egy white space követ. (azaz space vagy tab karakterek) és azután az ON, OFF, + vagy - valamelyike. Ez a formátum lehetőséget ad mind a tömörítésre, mind pedig a gyakorlatlanabb felhasználóknak szóló világosabb kifejtésre. Például:

A,,LIST OFF  
A,,Listing OFF  
A,,L- (Figyelje meg a + és a - használatát)
A,,List- (a white space itt nem szükséges)

ezeknek ugyanaz a hatásuk (kikapcsolják a listázást).
A három kapcsoló a következő:

List
Ez jelöli, hogy kell-e assembly listázás. Az assembly 2. menete alatt rendelkezésre áll egy számláló, s ennek az állapota szabja meg, hogy van-e listázás vagy nincs. A List ON parancs 1-et ad a számlálóhoz, a List OFF pedig kivon 1-et. Ha a számláló 0 vagy pozitív, akkor van listázás, ha negatív, akkor nincs. A számláló default értéke -1 (azaz nincs listázás). A rendszer meglehetősen nagy szabadsági fokot enged meg a listázások engedélyezésénél, pl. a List OFF általában a library file elején jelenik meg s ezt hatástalaníthatja a main file-ban kiadott List ON parancs. Ha a felhasználónak nincs szüksége efféle irányításra, természetesen az ON és OFF parancsok váltogatása a kívánt eredményt szolgáltatja. A List kapcsoló egyúttal assembly utasítás is (azaz bárhol megjelenhet a file-ban), ezért a 2.11. fejezetben is megemlítjük.

ObjShow
Az O kapcsoló használata során az object listázásának ki-be kapcsolása történik; a default helyzet az O OFF, vagyis az object-ot nem listázza, az O ON vagy 0+ alkalmazása pedig újra lehetővé teszi a listázást.

Maclist
Ez jelöli, hogy a macró hívások után keletkezett sorok listázandók-e vagy sem. A default a Maclist OFF. A Macró kapcsoló assembly utasítás is (azaz bárhol megjelenhet a file-ban), ezért a 2.11 fejezetben is megemlítjük. A macró sorai sorszámok nélkül listázódnak ki.

Global opciók csak a parancssorban jelenhetnek meg. A következőkben ezeket mutatjuk be:

ForceSecond
Az opció hívásakor az assembly rátér a 2. menetre annak ellenére, hogy az 1. menetben hibák vagy figyelmeztetések voltak. Általában akkor használatos, ha egy print-file már rendelkezésre áll (lásd lentebb), mert ebben az esetben egyszerre vizsgálhatók és javíthatók a hibák. Az opció egy további alkalmazása az

Out of range vagy Type mismatch

hibák megkeresése (pl. egy relatív jump, ami határon túl esik). Ez a típusú hiba csak a 2. menetben fordul elő, s ha az assembly már az 1.; menetben megszakítódik a file más hibái miatt, ez a hiba nem derülne ki. A default beállítás nem írja elő a 2. menet végrehajtását.

NoObject
Ez azt jelöli, hogy egy object létrejöjjön-e vagy sem. Ha ezzel az opcióval megakadályozzuk egy object létrejöttét, az így kapott fordítással gyorsan kideríthetők a file-ban lévő szintaktikus hibák. Default állapotban előállítja az object-ot.

TablePrint
Ezen opció választása esetén a 2. menet végén kiíródik a szimbólum tábla, alfabetikus sorrendben felsorolva a címkéket (értékükkel együtt). Ha az opciót nyomtatás nélkül választjuk és egy print-file rendelkezésre áll, akkor egy olyan file-t kapunk, amely csak a forrásfile címkéit tartalmazza. Ez rendkívül kényelmes debuggolás-nál (nyomkövetéses hibakeresésnél) és hivatkozások esetén. Default állapotban nem állítja elő a szimbólum táblát.

WritePRNfile
Ez az opció egy olyan file-t hoz létre, amely tartalmaz minden olyan fordítási listát és hibaüzenetet, amely egyébként a képernyőn jelenne meg. A felhasználó megadhatja a file nevét a WritePRNfile után (tab-bal vagy space-szel elválasztva). Ez egy szokásos EXOS filenév legyen, mint pl., TAPE:TEST.PRN vagy PRINTER: ezek után minden assembler output ebbe a file-ba ill. eszközre kerül. A fordítás során előforduló hibaüzenetek bekerülnek mind a file-ba, mind a képernyőre. Default beállítás esetén nem keletkezik print-file. A WritePRNfile opciót nem követheti semmilyen más assembler opció.

SizeOfLabels S
Ez előírja a cimkékből figyelembe veendő karakterek számát és kér egy numerikus paramétert. Ez decimális szám kell, hogy legyen, az opciótól tab-bal vagy space-vel elválasztva. Ez az adott szám (a fenti S betű reprezentálja) jelöli a szimbólum táblába kerülő karakterek számát, ílymódon a táblában rendelkezésre álló hely felhasználásától függ a címkehossz felső határa. Bármi is legyen az S értéke, a címkék első S számú karaktere egyetlen példányban létezhet csak, máskülönben kiírja a

Re-defined symbol

(azaz újradefiniált szimbólum) hibaüzenetet. Az S alapértéke 8, ami általában elegendő is.

BufferSymbols N
Ez a szimbólum tábla által használt memóriaterület nagyságát adja meg és megkövetel egy numerikus paramétert. Ez egy decimális szám kell, hogy legyen, az opciótól tab-bal vagy space-szel elválasztva. Az adott érték a szimbólum tábla által elfoglalható terület nagyságát jelöli kilobyte-okban. A felhasznált és lefoglalt területek nagysága a fordítás végén jelenik meg. Gyorsabb fordítás érdekében jó, ha a szükségesnél nagyobb táblaméretet jelölünk ki. Például, ha egy teszt fordítás kiírja, hogy a szimbólum tábla használt mérete #1E00 (7.5k) volt, akkor a felhasználó a későbbiekben jelöljön ki egy 8k-s területet a hatékonyabb és gyorsabb fordítás érdekében.

Runtype N
Ennek a segítségével megválasztható az object modul header típusa. Az opció egy space után egy numerikus paramétert kér. A paraméter akkor értékelődik ki, s jelöli ki a keletkezett object típusát, amikor az editor O parancsa kimenti a kódot egy külső eszközre (általában szalagra vagy disc-re). Pl.

R 7 - az object egy Rendszer Relokálható modul,
R 5 - az object egy új Alkalmazások Program

Felhívjuk a figyelmét arra, hogy relokálható object létrehozásakor az ORG és ENT utasításoknak speciális jelentésük van; lásd a 2.10 fejezetet.

2.4. Az Assembler utasítások formátuma
A GEN végrehajtandó utasításai a következő formátumot vehetik fel:

Címke Mnemonik Operandus Megjegyzés
start LD HL,címke ; beolvassa a 'címké'-t

A felesleges space és tab karaktereket (a különböző mezőket elválasztó karakterek előtt és után levőket) figyelmen kívül hagyja.

A GEN egy forrás sort a következőképpen dolgoz fel:

Megnézi az első karaktert. Minden további esemény ennek a típusától függ:

; - az egész sort kommentként értékeli, azaz lényegében átugorja.
* - következő karakternek egy assembler utasítás első karakterét várja- lásd a 2.11. fejezetet. Egy sorban több utasítás is lehet, s ekkor tab, space vagy vessző karakterrel választjuk el azokat.
<CR> - (sorvége karakter) egyszerűen kihagyja a sort.
 
(space) ha az első karakter space vagy tab, a GEN a következő nem-space/tab karakternek egy mnemonik, macró vagy komment első karakterét várja.

Ha az első karakter mindezektől különbözik, az assembler egy címke jelenlétét feltételezi. A címkék formátumát a 2.5 fejezetben tárgyaljuk.

Ha az assembler érvényes címkét, vagy az első helyen space/tab karaktert talál, elkezdi keresni az első nem space/tab karaktert. Ekkor vagy a <CR> karaktert várja (ebben az esetben a sor feldolgozása véget is ér), vagy egy mnemonik vagy macró karaktereit, amelyeket pedig white space zár le; a mnemonikok listája a 4.3 fejezetben található. Ha egy mnemonik, vagy macró érvényes, egy vagy több operandus kell, hogy kövesse. Ekkor az előttük álló space-eket átugorva dolgozza fel az operandus mezőt. Minden mnemonikhoz meghatározott számú operandus tartozik.

Megjegyzések (kommentek) bárhol állhatnak az operandus mező, (vagy ha a mnemoniknak nincs argumentuma) a mnemonik mező után és elvileg tetszőleges hosszúságúak lehetnek.

2.5. Címkék
A címke egy olyan szimbólum, amely egy 16 bitig terjedő információt tartalmaz. Használható egy adatterület címének vagy egy speciális instrukciónak a kijelölésére, vagy egyszerűen egy adat jelölésére. Ha egy címke egy 8 bit-nél nagyobb értéket jelöl és ezt később egy 8 bites értékként akarják használni, pl.

cimke EQU #1234
LD A,cimke

az assembler hibaüzenetet ír ki,

Out of range

miután feldolgozta a második utasítást a 2. menetben.

Egy címke tetszőleges számú érvényes karaktert tartalmazhat. Az a felhasználó szabad választása, hogy hány karaktert tekint lényegesnek. Tegyük fel, hogy egy felhasználó előírja (az S assembly parancs segítségével), hogy a címkék 6 karakter hosszúak legyenek. Habár az aktuális forrásfile-ban bármilyen hosszú címkék előfordulhatnak, csak az első 6 karakterük szerepel a szimbólum táblában; ílymódon két olyan címke, melyekben megegyezik az első hat karakter (s a többi akár különböző is lehet), a GEN számára azonos. Ezért, ha a címke hossza S (default érték 8), a címke első S karaktere különbözzék a többitől, mert címkéket nem lehet újradefiniálni (hacsak nem használjuk a DEFL pseudo-operandust. Lásd a 2.10. fejezetet). Egy címke sosem egyezhet meg egy foglalt szóval - lásd a 4.2. fejezetet -, habár egy foglalt szó szerepelhet egy címke részeként.

A címkében megengedett karakterek: 0-9 $ és A-Z, de egy címke nem kezdődhet decimális számjeggyel. Az A-Z tartalmazza az összes kis-és nagybetűt, valamint a [ \ ] ^ ' _ karaktereket. A címke tetszőlegesen lezárható kettősponttal. Ezek a tulajdonságok biztosítják a többi assembler forrásfile-jával való kompatibilitást.

Néhány példa érvényes címkékre:

LOOP
loop
(ez a két címke különböző, mivel a betűtípusok is azok)
a_long_label  
Label_no1
Label_no2
(alapértelmezésben nem különbözők, mivel az első 8 karakter azonos)
LDIR (LDIR nem foglalt szó)
labell:
labell
(ez a két címke azonos,mivel a kettőspont úgyis elveszik)

2.6. Utasítás számláló
Az assembler utasítás számlálót biztosít azért, hogy a címkemezőben lévő szimbólumokat elláthassa címekkel, s azok bekerülhessenek a szimbólum táblába. Az utasítás számláló értékét az ORG utasítás állítja be (lásd a 2.10 fejezetet). Megjegyezzük, hogy az ORG által adott cím lehet relatív vagy abszolút és ez a különbség - habár mindkét esetben az utasítás számláló módosul - hatással van az előállított object-ra; lásd az ORG utasítást részletesebben.
Ha a $-t egy kifejezésben használjuk, megkaphatjuk az utasítás számláló értékét az aktuális kifejezésre:

HERE equ $

betölti a HERE szimbólumba az utasítás számláló értékét.

2.7. Szimbólum tábla
Ebben a részben a szimbólum és a címke szavak nagyjából ugyanazt fogják jelenteni. Általában a címkemezőben található szöveget hívjuk szimbólumnak. Minden alkalommal, amikor először találkozunk egy szimbólummal (akár a címkemezőben, akár az operandusmezőben),

CIMKE LD HL,3
LD HL,CIMKE
; CIMKE a címkemezőben
; CIMKE az operandusmezőben

az beíródik a táblába. Ha a címke először a címkemezőben fordul elő, az értéke (mely ekkor azonos az utasítás számláló értékével) is bekerül a szimbólum táblába. Máskülönben ez csak később kerül be, a szimbólum címkemezőbeli előfordulásainál.

Ha az 1. menet végén a táblában olyan szimbólum található, amelyhez nem tartozik érték, a következő hibaüzenet jelenik meg:

*WARNING* LABEL Absent

(hiányzó CIMKE)
Ha az első menet alatt egy szimbólumot többször definiáltunk a címkemezőben, a következő hibaüzenet jelenik meg:

Re-defined symbol

(azaz újradefiniált szimbólum)
mivel az assembler nem tudja, hogy melyik érték tartozik a címkéhez.
Megjegyezzük, hogy a címkének csak az első S számú karaktere kerül a táblába (lásd a 2.5 fejezetet) méretbeli meggondolások miatt. A szimbólum tábla részére lefoglalt területet a parancssorban definiálhatjuk (lásd a 2.2. és a 2.3 fejezeteket), míg a default lefoglalt terület a szövegfile méretétől függ. Hogy egy durva becslést adhassunk a szimbólum tábla részére lefoglalandó terület méretére, tegyük fel, hogy mindegyik szimbólum 7+S byte-nyi területet foglal a táblában, ahol S az S assembler parancs által lefoglalt szimbólum méret.

A fordítás végén kiíródik, hogy mekkora területet használt el a szimbólum tábla a fordítás alatt. A 2. menet végén létrehozható a szimbólum tábla egy teljes alfabetikus listája (lásd a 2.3 fejezetet). Természetesen a szimbólumoknak csak az első S számú Karaktere jelenik meg a listán.

2.8. Kifejezések
A GEN-beli kifejezésekben számos operátor rendelkezésre áll teljes precedenciával, amely a zárójelek használatával persze módosítható. A kifejezésekben szerepelhetnek szimbólumok az aktuális értékükkel, számok vagy karakterek.

A következő számok lehetségesek:

A betűkarakterek dupla idézőjelbe kerülnek. Az alábbi sorok például ugyanazt az objectot eredményezik:

LD A,65
LD A,#41
LD A,41H
LD A,%1000001
LD A,01000001B
LD A,"A"

Az aritmetikai műveletek általában 16 bites előjeles aritmetikát használnak, de az eredményt MODULUS 65536 veszi és a túlcsordulást figyelmen kívül hagyja. Ez tulajdonképpen azt jelenti, hogy az eredmény általában annyi lesz, mint amennyit várunk. Például: -3 * #4000 = #C000. Ha szigorúbban nézzük, ez a művelet túlcsorduláshoz vezetne előjeles aritmetikában (#C000 valójában -#4000), de a várt eredményt kapjuk vissza (azaz 3*4 = 12 =#C). Az egyetlen kivétel osztáskor lép fel, amikor az operandus negatív szám (azaz nagyobb, mint #7FFF). Például:

-#C000/2 = #E000

(azaz -4/2=-2).
Ha nem a + és - operátorokat használjuk, az operandusok legyenek inkább abszolútak, mint relokálhatók, mert például két relokálható címke összeszorzása értelmetlen. Általában a kifejezés eredményének típusa világos kell, hogy legyen, de összefoglaljuk a szabályokat:

Operátor 1. operandus 2. operandus Eredmény
+
abszolút abszolút abszolút
+
abszolút relatív relatív
+
relatív abszolút relatív
+
relatív relatív illegal*
       
-
abszolút abszolút abszolút
-
abszolút relatív illegal*
-
relatív abszolút relatív
-
relatív relatív abszolút

* Az illegális muveletek esetén hibaüzenet íródik ki (Type mismatch) a fordításnál.

A logikai hamis-t a 0 érték, a logikai igaz-at a -1 (vagy a #FFFF) jelöli, habár a legtöbb esetben más nem-nulla érték is IGAZ-at jelent. A logikai operátorok bit operátorok.
Megjegyzés: A $ szimbólum visszaadja az utasítás számláló értékét. Használatára vonatkozólag lentebb találhatunk példákat és részletesebb útmutatást.
A következő lista az operátorokat szemlélteti prioritással együtt (1 a legnagyobb prioritás). A zárójelek () használata természetesen módosíthatja a prioritást.

Operátor Precedencia Tábla

  1. Az előjel plusz (+),
    Az előjel mínusz (-)
    Logikai NEM (.NOT.)

  2. Hatványozás (.EXP.)

  3. Szorzás (*),
    Osztás (/),
    Maradék (.MOD.),
    Logikai shift balra (.SHL.),
    Logikai shift jobbra (.SHR.)

  4. Kétoperandusú plusz (+),
    Kétoperandusú mínusz (-)

  5. Logikai ÉS (& vagy .AND.)

  6. Logikai VAGY (.OR.),
    Logikai KIZÁRÓ VAGY (.XOR.)

  7. Egyenlőség (= vagy .EQ.),
    Előjeles kisebb mint (< vagy .LT.),
    Előjeles nagyobb mint (> vagy .GT.)
    Előjeltelen kisebb mint (.ULT.),
    Előjeltelen nagyobb mint (.UGT.)

A következők GEN-ben megengedett kifejezések:

címke-#5000 relatív
16-%1110001 abszolút
címke1-címke2+konstans abszolút
címke1-(konst2+konst3) relatív
2.EXP.konst abszolút
konst1+(2*.NOT.(var2=-1)) abszolút
"A"+128 abszolút
"A"-"a" abszolút
címke-$ abszolút
$+(címke2-címke1) relatív

Megjegyzések az operátorokhoz

2.9. Relokálható címkék és relatív címek
Egy programban használt címke lehet abszolút vagy relatív. A címkék általában relatívak a fordítás elejének abszolút címéhez és ha a kódot relokálható modulként mentjük ki, akkor az EXOS betöltő lehetővé teszi, hogy a kód a 16k-s szegmensen belül tetszőleges címre kerülhessen. Sőt, az EQU és a DEFL utasítások használatával mind relatív, mind abszolút címek definiálhatók. Az előállított címke típusa a címkét definiáló kifejezés típusától függ. Az operátorokra vonatkozó szabályok a 2.8 fejezetben találhatók.
Amikor relatív címek szükségesek (mint pl. a JR vagy a DJNZ utasításoknál) a GEN relatív kifejezéshez ragaszkodik és ennek megfelelően állítja elő a kódját. A relatív címek lehetséges értékei megegyeznek a következő utasítás utasitás számlálójának +127 és -128 közötti értékével.

2.10. Assembler direktívák
A GEN felismer bizonyos pseudo-mnemonikokat. Ezek az assembler direktívák, melyeknek semmi hatásuk nincs a Z80 processzorra, azaz nem alakulnak utasításkóddá, hanem közvetlenül utasítják az assemblert bizonyos műveletekre. Ezen utasítások eredménye valamilyen módon hatással van a GEN által előállított objectra. A pseudo-mnemonikok a végrehajtható utasításoknak megfelelően fordítódnak le; megelőzheti őket címke (sőt kötelező az EQU, DEFL, MACRO esetében) és követheti őket magyarázat (komment). A rendelkezésre álló direktívák a következők:

Az ORG kifejezés
Ennek a direktívának a hatása az object típusától függően kicsit változhat. Abszolút objectok esetében az ORG kifejezés egyszerűen beállítja az utasítás számláló értékét a kifejezés értékére, pl.:


Cimke1


Cimke2

ORG #100
ld hl,0
ret

ORG #200
ld hl,1
ret

ebben az esetben az utasítás számláló #i00 ill. #200-ra állítódik be, azaz a Címke1 értéke #100, a Címke2 értéke pedig #200 lesz.
Általában az ORG használata után nem lehet az objectot az editorból futtatni. Az igaz, hogy az utasítás számlálót az ORG állítja be, de a létrejövő objectok szekvenciálisan helyezkednek el a memóriában és nem a kijelölt ORG címen. Kód- vagy adatblokkok esetén több ORG alkalmazásakor biztosítani kell, hogy a program a futáskor a megfelelő helyre kerüljön.
Relokálható object file-ok esetére kétféle ORG direktíva létezik; az egyik egy abszolút kifejezést, a másik egy relokálható kifejezést jelöl ki. Abszolút kifejezés megadása esetén a fentebb tárgyalt folyamat játszódik le, azaz a kifejezés értéke átadódik az utasítás számlálónak, s ez teszi lehetővé, hogy a létrehozott kód- vagy adatblokkot a későbbiekben a pontos futtatási címre helyezzük. Az ilyen ORG után definiált címkék mind abszolútak, azaz a kód betöltésénél nem helyeződnek át. Azonban, ha az ORG után relatív címet jelölünk ki, más lesz a helyzet; a belső utasítás számláló puszta beállítása helyett a GEN bizonyos információkat is ad a töltő utasítás számlálójának a megadott relatív címmel való eltolásához, pl.:


Loop







Data

ld hl,Data
ld a,(hl)
inc hl
or a
jr nz,Loop
ret

ORG $+100

defm "Hello World"
defb 0

A fenti példában, azonkívül, hogy a GEN utasítás számlálója beállítódik a 100 byte hozzáadásával, az ORG $+100 létrehoz egy "Állíts utasítás számlálót" direktívát az objecton belül, s ílymódon az EXOS a "Hello World" adatot a 'ret' utáni 100. byte-ra tölti be.
Megjegyezzük, hogy mindez csak relokálható object esetében igaz.

EQU kifejezés
Címkének kell megelőznie. A címke értékének a kifejezés értékét adja.
A kifejezés nem tartalmazhat olyan szimbólumot, amely még nem vett fel semmilyen értéket. A címke ugyanolyan típusú lesz (abszolút vagy relatív), mint a kifejezés.

DEFB Kifejezés[, Kifejezés, Kifejezés, stb. ]
A DEFB után annyi kifejezés állhat, amennyi egy sorba berakható. Ezeket vessző választja el egymástól és értékük 8 bitig terjedhet. A kifejezéshez tartozó megfelelő byte-ban (mely az utasítás számlálónál kezdődik, s kifejezésenként egy byte-tal nő) tárolódik a kifejezés értéke.

DEFW Kifejezés[, Kifejezés, Kifejezés, stb. ]
A DEFW után annyi kifejezés állhat, amennyi egy sorba berakható. Ezeket vessző választja el egymástól és értékük 16 bitig terjedhet. A kifejezéshez tartozó megfelelő szóban, vagy 2 byte-ban (mely az utasítás számlálónál kezdődik, s kifejezésenként két byte-tal nő) tárolódik a kifejezés értéke. A legkisebb helyértékű byte (l.s.b.) az alacsonyabb címnél áll, a legnagyobb helyértékű byte (m.s.b.) pedig ez után következik, akárcsak a szokásos Z80 / Intel formátumban.

DEFL Kifejezés
Címkének kell megelőznie. A címke értékének a kifejezés értékét adja. A kifejezés nem tartalmazhat olyan szimbólumot, amely még nem vett fel semmilyen értéket. A DEFL nagyon hasonlít az EQU-hoz, ellenben ha egy korábban definiált címkét EQU-val újradefiniálunk, ez hibát jelent. A DEFL használatával újradefiniálhatunk címkéket és kikerülhetjük ezt a hibát, azaz a fordítás ideje alatt a címke úgy viselkedik, mint egy változó. Így az alábbi kód:

cimke1
cimke2
EQU 0
EQU 1

hibát eredményez, ellenben a következő kód már megengedett:

cimke1
cimke2
EQU 0
DEFL 1

A DEFL direktívát ugyanarra a címkére akárhányszor alkalmazhatjuk. Ezt a tulajdonságát gyakran kihasználják a macrókkal kapcsolatban, hogy elkerüljék ugyanannak a kód részletnek ismételt előállítását. Lásd a macrókról szóló 2.12. fejezetet.

DEFS kifejezés
Az aktuális utasítás számláló értékénél annyi byte-ot foglal le és tölt föl nullával a memóriában, amennyit a kifejezés értéke megjelöl.

DEFH "string"
Egy N byte nagyságú területre lerakja a string ASCII reprezentációját, ahol N a string hossza, ami 0 és 255 közötti érték lehet, a határokat is beleértve. Az operandus mezőben az első karakter az ", ez a string határa, a string pedig két ilyen határ közé eső karaktersorozatot jelent; a sorvége karakter szintén string lezárásként működik, ezért nem szerepelhet stringben.

MACRO paraméterek
Ez előtt a direktíva előtt egy címkének kell állnia, és egyúttal ez lesz a macró azonosítója. Ezt követik a macró paraméterei. Mindegyik paraméternek a @ karakterrel kell kezdődnie és vesszővel kell elválasztani őket egymástól. Ezek után jön a macró definíciója és ezt az ENDM direktíva zárja le. (lásd a köv.)

ENDM
Ez a direktíva a macró definíció végét jelzi.

IF kifejezés
Ez a négy feltételes direktíva egyike. A másik három a COND (amely minden szempontból azonos az IF-fel, bármelyik használható), ELSE és az ENDC. Az IF kiértékeli a kifejezést. Ha az eredmény HAMIS (nulla), mellőzi a sorok fordítását a következő ELSE vagy ENDC pseudó-mnemonikig. Ha az eredmény nem nulla, rendesen megy tovább a fordítás.

COND kifejezés
Ez a feltételes direktíva működésében azonos az IF-fel (Lásd fentebb). Más assemblerekkel való kompatibilitás érdekében használják. Bármelyik használható.

ELSE
Ez a pseudó-mnemonik egyszerűen "átkapcsolja" a fordítót, ha a fordító működik egy ELSE utasítás előtt, ehhez érve abbamarad, és ez fordítva is fennáll.

ENDC
Ez a pseudó-mnemonik egyszerűen elindítja a fordítót.

Ezeknek a feltételes direktíváknak a használata azon a képességükön alapszik, hogy vezérelni tudják, egyes kódrészletek fordítódjanak, vagy sem. Gyakran használják őket címkékkel kapcsolatban és használhatók hibakereső kódrészek fordításának ellenőrzésére, mint pl., a következő sorokban:

IF DEBUG
   -- ; itt a hibakereső kód van és csak akkor
   -- ; lesz lefordítva, ha a DEBUG értéke nem
      ; 0
ENDC

Ezt a tulajdonságát akkor is használják, amikor ugyanazt a kódot lefordítják néhány különböző gépre és a létrehozott különböző gép-specifikus kódrészleteket az alábbi sorokkal kontrollálják:

IF E128
   -- ; ez a kód akkor lesz lefordítva, ha
   -- ; az E128 értéke nem 0
EHDC
IF E64
   -- ; ez a kód akkor lesz lefordítva, ha
   -- ; az E64 értéke nem 0
EHDC

END
Ez a direktíva azt jelöli, hogy ebben a részben már nincs több vizsgálandó szöveg. Használhatják például macró-ban az IF direktívával együtt a fordítás megállítására azokban az esetekben, amikor a használt paraméterek nem összeillők a macró saját műveletével vagy potenciálisan "veszélyesek" a rendszerre. Például vegyük a következő macró-t:

MOVE


*Zzzz
MACRO @BYTES,@FROM,@TO
IF @BYTES<1




END

ENDC
LD BC,@BYTES
LD HL,@FROM
LD DE@TO
LDIR
ENDM

; azaz, ha az elmozgatandó
; szám 0
; a listázást itt
; megállíthatja,
; megnézi, hogy mi a
; helyzet és kiszáll

A fenti macró segítségével előállított következő kódrészlet:

MOVE L2-L1,L1,L3

ahol L1 egyenlő L2-vel, "veszélyes", ezért megállítja.

ENT
Az ENT direktíva két dologra használható. Ha a GEN működése közben futtatni akarunk egy kódot az R paranccsal, az ENT közli a GEN-nel, hogy hol kezdődik a kód. Másrészt, ha User Relokálható Modult (2 típus) generálunk, az ENT cím a modul header-ben (4. és 5. byte) inicializációs offset (eltolás) címként tárolódik.

SRTP cím
Az SRTP direktíva a relokálható modulban létrehoz egy Futás Idő Lap Beállító elemet. Ez egy kifejezés, amelyet moduló 4 véve, megadja a lap számát, amelyen a program futni fog.

RRTP
Az RRTP direktíva a relokálható modulban létrehoz egy Futás Idő Lap Visszaállító elemet. Az SRTP direktívával együtt használatos.

2.11. Assembler formátum vezérlő utasítások
Az assembler formátum vezérlő utasítások, egy jelentős kivétellel (*Include), nincsenek hatással a GEN által előállított kódra. Az assembly listázás előállítására és formázására használatosak. Azokban a sorokban fordulnak elő, amelyek *-gal kezdődnek és bárhol megjelenhetnek a file-ban. Egy sorban kettő vagy több is előfordulhat, ezeket vesszővel, tab-pal vagy space-szel kell elkülöníteni. Az utasításnak csak az első karaktere lényeges (ez kis vagy nagybetű is lehet), a többi nem lényeges a következő space, tab vagy vessző karakterig. A következő utasítások állnak rendelkezésre:

*Eject
Új lap kérést küld a print-file-ba.

*Zzzzz
Az adott ponton megállítja a listázást, amely a billentyűzet bármelyik gombjának lenyomásával újraindítható. Listázás közben a címek elolvasásánál hasznos lehet. Megjegyezzük, hogy a *Z még végrehajtódik a *L- után; lásd lentebb, a *Z nem állítja meg a printelést.

*Heading string
Egy adott string első 32 karakterét beveszi és fejlécként kinyomtatja minden új lap tetejére. A *H után automatikusan végrehajtódik a *E. A fejlécet csak a listázó készülékre küldi ki. A sorvége karaktert a string lezárásaként értékeli, s a stringben a white space is előfordulhat. A *H parancs mellett a sorban más szöveg nem szerepelhet.

*Include filename
Ez egy hatékony assembler utasítás, amely vesz egy másik file-ban lévő forráskódot és hozzáfordítja az adott file-hoz, azaz úgy kezeli, mintha az is kifejezetten benne lenne a fileban. A *Include szót egy file-névnek kell követnie (white space-szel elválasztva). A *Include parancsok nem egymásba ágyazhatók (azaz egy "bevett" külső file nem tartalmazhat egy másik *Include parancsot). A *Include parancs szorgalmazza és elősegíti a programozás moduláris megközelítését azáltal, hogy lehetővé teszi a modulok egyenkénti létrehozását és tesztelését, s végül egy nagyon kicsi fő összeszerkesztő (linking) file segítségével együtt fordítja az egész programot:

*LIST ON TABLEPRINT WRITE_PRN_FILE
     ; Main linking file
DEBUG EQU 0
*Include MODULE1
*Include MODULE2
*I         MODULE3

*List
A *List egyike annak a három assembler utasításnak, amelyek egyúttal top-of file opciók is, ezért megjelenhet a parancssorban az opció listán. A *List egy kapcsoló, s működésének részletei a top-of-file opciókról szóló fejezetben vannak leírva.

*Maclist
Ez szintén egy kapcsoló és top-of-file opció; lásd a fenti *List-et.

*ObjShow
Ez egy másik kapcsoló, amely szintén top-of file opció. A *O parancs egy object assembler listázását ki-be kapcsolja kívánság szerint. Az alapértelmezett helyzet *O-, azaz nincs listázandó object, a listázás megindításához a *O+ -t kell használni.

2.12. Macrók
A GEN macróinak használatával az assembly nyelvű programozás nagymértékben leegyszerűsíthető. Néhány kevésbé bonyolult assemblerben a macrók segítségével könnyen készíthetünk nagyméretű kódokat, de a DEFL, a feltételes fordítás valamint a GEN szöveg paramétereinek segítségével ezek a fíle-ok különösen áttekinthetővé és tömörebbé válnak.
Bemutatunk egy macrót:

BC_DE MACRO @PARAM1,@PARAM2
LD BC,@PARAM1
LD DE,@PARAM2
ENDM

A MACRO pseudó-mnemoník vezeti be a macrót, az előtte álló címke pedig a neve lesz. Ezen a néven hívható a macró. Utána egy paraméter lista állhat. A paraméterneveket egy @ karakter kell, hogy megelőzze és a bennük szereplő karakterek csak megengedett címke-karakterek lehetnek (lásd a 2.5. fejezetet). A paraméterneveket vessző, space vagy tab karakter választja el egymástól, de ezek a karakterek a paraméteren belül is előfordulhatnak idézőjelek közé zárva, pl.:

PRINT






M@$YM

L@$YM

MACRO @P1
PUSH HL
LD HL,M@$YM
CALL MOUT
POP HL
JR L@$YM

DEFM "@P1"
DEFB 0
EQU $
ENDM
PRINT "Ez egy uzenet"




; egy üzenet kiíró rutin

; lásd lentebb a
; @$YM használatát

A paraméterszám felső határa ritkán jelent korlátot a gyakorlatban.

A macró első sorában deklarált paraméterekre a macró belsejében a deklarált nevükkel hivatkozunk. A macró definíciója az ENDM pseudó mnemonikkal záródik. A MACRO sor és az ENDM sor közé eső szövegrészt nevezzük a macró definíciójának. Az itt szereplő utasítások nem fordítódnak le, így aztán nem definiálnak címkéket, nem okoznak hibát és nem hoznak létre kódot. Egy macró belsejében nem definiálható egy másik macró (azaz egymásba ágyazott definíciók nem megengedettek), de egy macró-ból hívható egy másik macró (a rekurzió megengedett) és így egy macró önmagát is hívhatja.
Egy macró így hívható:

BC_DE #4424,-1

ahol a név a mnemonikus mezőn helyezkedik el. Ezt követik az aktuális paraméterek a megengedett módon elkülönítve egymástól, azaz vesszővel, space-szel vagy tab-bal. Egy paramétert idézőjelek közé is tehetünk, ezek úgyis eltűnnek a macró tényleges használatakor. Ellenben, ha a paraméter tartalmaz vesszőt, space-t vagy tab-ot, akkor azt kötelező idézőjelek közé zárni. Ebben az esetben az idézőjel alatt dupla idézőjelet értünk (azaz " -t). A paraméterek a szövegbe helyettesítődnek be. Amikor egy macró meghívódik, az összes paraméter beíródik a definícióban szereplő összes előfordulásába. Ílymódon a fenti példában szereplő macró meghívása ugyanazt a kódot eredményezi, mintha egyenesen a következő sorokat írtuk volna be:

LD BC,#4424
LD DE,-1

A következő példa megvilágítja a szövegbe való behelyettesítés igazi előnyeit, szemben néhány más assemblerben használt módszerrel, ahol, a behelyettesítést megelőzi a kiértékelés.

EXCH

MACRO @REG1,@REG2
PUSH @REG1
PUSH @REG2
POP @REG1
POP @REG2
ENDM

EXCH DE,BC


; a macro
; definíció
; törzse



; a macró
; hívása

A macró hívása a következő kódot eredményezi:

PUSH DE
PUSH BC
POP DE
POP BC

Látható, hogy egy új és hasznos pseudó-utasítás jött létre, amely pontosan úgy használható, mint egy szokásos assembler mnemonik, nevezetesen az, amelyik lehetővé teszi bármely két regiszterpár tartalmának kicserélését (az SP-t kivéve). Ily módon standard Z80-as EX DE,HL utasítás egy bővítését nyertük.
Még egy adalék a felhasználó által definiált paraméterekhez: minden macrónak van egy további implicit paramétere, a @$YM. Ez egy 4 jegyű hexadecimális számot ad vissza, amely minden macró híváskor eggyel növekszik. Legtöbbször a macróban előforduló címkék előállítására használják. Például:

ABS



ABS@$YM
MACRO
OR A
JP P,ABS@$YM
NEG

ENDM

feltéve, hogy ez volt az egyetlen macró a programban, az első hívás után a következőt hozza létre:




ABS0001
OR A
JP P,ABS0001
NEG

ezt pedig a következő hívás után:




ABS0002
OR A
JP P,ABS0002
NEG

Ha nem használnánk a @$YM-et, kétszer definiálódna ugyanaz a címke és hibát eredményezne.
A fenti hiba elkerülésére megadunk egy másik fantázia serkentő módszert. Az előző módszer gyorsabb, de nagyon nagy mennyiségű kódot eredményez. A következő módszer teljesen tömör.

ABSLAB

ABS



ABSUB



ABSLAB
ABSEND

EQU 0

MACRO
CALL ABSUB
IF .NOT.ABSLAB
JR ABSEND
OR A
RET P
NEG
RET
DEFL .NOT.ABSLAB

ENDC
ENDM

A macrók hívhatók rekurzívan, azaz egy macró hívhatja, önmagát, de macró definíciók nem ágyazhatók egymásba.

2.13. Fordítás lsitázás
A GEN 2. menete alatt létrejövő fordítási listák sorai a következő formátumot veszik fel:

6000 210100 25 címke LD HL ;1-et ad a HL-hez
.
1
.
6
.
15
.
21
.
30
.
36
 

Az első belépés a sorban, a sor feldolgozásának kezdetén aktuális utasítás számláló érték, kivéve azt az esetet, amikor a sorban lévő mnemonik vagy macró megegyezik az EQU vagy DEFL pseudó-mnemonikokkal (lásd a 2.10 fejezetet), amikoris az első belépés az utasítás operandusmező-beli értéket jelöli. A 6. oszlopnál lévő hexa érték az utasítás kódja 8 karakter hosszú lehet (azaz legfeljebb 4 byte-ot reprezentálhat) és az aktuális utasítás által létrehozott objectot tartalmazza. A listázásnak ezt a részét ki lehet iktatni a *O OFF kapcsoló használatával, s ekkor a lista további része 9 karakterrel balra tolódik.
Utána a sorszám következik. A sorszámok 1 és 65535 közötti egész számok lehetnek. Macró kiértékelések létrejöttekor sorszámok nem keletkeznek.
A 21. oszloptól a 20+S. oszlopig (ahol S az S parancs által definiált címkehossz, S=8 default értékkel) a szóbajöhető címkék karakterei helyezkednek el. Ha a sor nem tartalmaz címkét, ez a rész üresen marad.
A 30. oszlopban (feltéve, hogy a címkék 8 karakteresek) kezdődik a mnemonik, macró, pseudó-mnemonik vagy assembler direktíva helye.
És végül, a 36. oszloptól (feltéve, hogy a címkék 8 karakteresek) kezdődnek az operandusok az őket követő esetleges magyarázatokkal együtt. Ez utóbbiak az 50. oszloptól kezdődhetnek.

Harmadik Fejezet: Az integrál editor

A GEN-nel ellátott integrál editor a standard HiSoft line editor és az EXOS screen editor kombinációja. Ez az összeállítás lehetőséget ad az assembler programok egyszerű, de hatékony megalkotásához és editálásához. Az editoron belül rendelkezésre áll az összes szokásos BASIC-ben használatos képernyő-editáló lehetőség (lásd az Enterprise BASIC kézikönyv 40. oldalát), valamint a következő GEN-specifikus tulajdonságok, mindegyik parancs az <ENTER>-rel végződik:

Szövegbevitel In,m
Pl: I10,5

Az n (a példában 10.) sortól kezdve szövegbevitelt tesz lehetővé, a sorszámokat m (a példában: 5) soronként írja ki; a már bennlévő sorokat szükség esetén feljebb tolja. Az n és m alapértéke a 10. A sorszámok automatikusan jönnek létre, akárcsak a BASIC AUTO-ban. A <STOP> billentyűvel lehet kiszállni.

Szöveg editálás En
Pl: E100

Az n (100.) sort editálja; a sor megjelenik a képernyőn s a joystick, stb. segítségével elvégezhető a szerkesztés. Az <ENTER> megnyomásával elmentődnek a az elvégzett változtatások.

Szöveg törlése Dn,m
Pl::D10,50

Törli a szövegfile-ból az n-m (10-50) közé eső sorokat, beleértve a 10. és 50. sort is. A parancs csak két sorszámmal működik, de ezek azonosak is lehetnek.

Szöveg mozgatása Mn,m,o
Pl: M10,30,200

Elmozgatja az n és m (10-30.) sor közé eső szövegrészt (határok is beleértendők) közvetlenül az o (200.) sor elé. Egy szövegrész önmagán belül nem mozgatható el, azaz az M50,100,55 utasítás nem megengedett, ezért nem is hajtódik végre.

Szöveg újraszámozása Nn,m
Pl: N5,10

Újraszámozza a szöveget úgy, hogy az első sor száma n (5) legyen, és ettől kezdve minden sor m (tízzel) nagyobb sorszámú lesz az előzőnél. Ha ez nem megvalósítható, a program megszakad. Mindkét szám szükséges a parancs végrehajtásához. Ha az újraszámozás során valamelyik új sorszám értéke meghaladná a 65535-öt, figyelmen kívül hagyja az addig elvégzett újraszámozást és meghagyja mindenhol az eredeti sorszámokat.

Szöveg listázása Ln,m
Pl: L100,200

Kilistázza az n és m (100-200.) sor közé eső szövegrészt, beleértve a határokat is. A listázás szüneteltethető a <HOLD> billentyű leütésével; s folytatható a <HOLD> újabb leütésével. A <STOP> billentyű leütése után megszakad a listázás és visszatér az editorba. Ha nem adunk peg paramétereket, kilistázza az egész szöveglile-t.

Szöveg küldése eszközre Pn,m,s
Pl: P1,999,PRINTER:

Az n-m-ig (1-9999) terjedő szövegrészt kiküldi az alapértelmezett vagy valamilyen fent megadott (s) eszközre; ez a folyamat a <STOP> leütésével megszakítható. Az adott példa az 1 és 9999 közé eső sorokat küldi a nyomtatóra.

Szöveg beolvasása eszközről G,,s
Pl: G,,TEST.GEN

A default vagy valamilyen megadott eszközről (pl.: TAPE1:TEST.GEN) megkeresi a TEST.GEN file-t; ha megtalálta, hozzácsatolja az aktuális forrás-filehoz. A <STOP> leütése megszakítja a parancsot. A csatolt file újraszámozódik a már létező file utolsó sorszámához igazítva.

Szövegfile ellenőrzése V,,s
Pl: V,,TEST.GEN

Az alapértelmezett vagy a megadott eszközön lévő file-t összehasonlítja a memóriában lévő szövegfile-lal. Az összehasonlítás eredményétől függően kiírja a 'Verified' vagy a 'Falled!' üzeneteket (az elsőt, ha minden rendben van, a másodikat, ha hibát talált).

String keresése szövegben Fn,m,f
Pl: F30,50,LDIR

Az f ("LDIR") stringet keresi az n és m (30-50.) sor közé eső részben (a határokat is beleértve); ha megtalálja, az őt tartalmazó sort, kiírja a képernyőre és edit módba áll - ekkor lehetőség nyílik a változtatásra.

String cseréje sn,m,f,s
Pl: S30,50,LDIR,lddr

Az f ("LDIR") stringet kicseréli az s ("lddr") stringre a megadott n-m sortartományban. Minden kicserélendő stringet tartalmazó sort kiír a képernyőre Edit módban, s így minden egyes cseréről dönteni lehet; az <ENTER> leütése után az F vagy S és az őket követő <ENTER> lenyomásával lehet folytatni a keresést illetőleg a cserét.

Utolsó sorszám kiírása U
Pl: U

Kiírja az aktuális szövegfile utolsó sorának sorszámát a képernyőre. Ez hasznos lehet a szövegfile végének a nyomtatásánál vagy ha a file végére akarunk állni, hogy hozzácsatoljunk egy szöveget.

Aktuális állapot leírása C
Pl: C

Megjeleníti a képernyőn az aktuális default sorszámokat, a megtalálandó és kicserélendő stringeket és az assembler opciók bufferjét.

Határolók változtatása Q,,s
Pl: Q,,*

Kicseréli az editor paramétereket elválasztó karaktereket az s (a példában *) karakterre. Ezeket a Q**, paranccsal cserélhetjük vissza.

Memória terület kiírása Wn.m
Pl: W#100,#180

Kiírja az n és m (#100 - #200) memóriacímek között lévő terület tartalmát hexadecimálisan (határok is beleértendők). A tárolási címeket hex. vagy decimális alakban is írhatja.

Tárgykód futtatása R
Pl: R

Az utolsó fordításnál előállított objectot futtatja; ez nem lehetséges, ha az object relokálható típusú, ha ORG-ot specifikáltak előtte, ha a fordítás után elmozgatták a szöveget, vagy ha az utolsó alkalommal nem jött létre object. A lefuttatott kódnak RET utasítással kell visszatérnie.

Tárgykód kimentése O,,s
Pl: O,,TEST.OBJ

Az utoljára előállított objectot kimenti a kijelölt vagy az alapértelmezett eszközre, tekintetbe véve annak modul-típusát (melyet az R opció jelöl ki a parancssorban), valamint az EXOS által megkövetelt fejléceket és zárórészeket.

Printer laphossz megadása Yn
Pl: Y66

Egyszerűen beállítja a printer laphosszát n-re (66-ra) vagy bármely, a parancs után definiált-hosszra.

EXOS modul betöltése X,,s
Pl: X,,nev

Betölt és inicializál egy modult az alapértelmezett, vagy megadott eszközről. A GEN-ből a betöltött modult-t a :NÉV használatával lehet meghívni (lásd következő funkció).

Rendszerbővítés hívása :NÉV
Pl: :MON

Meghív egy rendszerbővítést, amely lehet ROM-ba épített (mint pl. a BASIC vagy a WP) vagy RAM bővítés, mint pl., a MON debugger / disassembler. Ha a :HELP funkciót hívjuk meg, kiíródik a pillanatnyilag elérhető bővítések listája. Ha egy speciális bővítésre vagyunk kíváncsiak, a :HELP NÉV beírásával több információt kaphatunk róla, a :NÉV beírásával pedig elérhetjük a bővítést.

Forrásszöveg fordítás A,,s
Pl: A,,opciók

Egyszerűen lefordítja a forrásszöveget az első sorától kezdve, figyelembe véve a parancssorban kiadott opciókat; további részletek a 2. fejezetben.

Buffer terület B
Pl: B

Ez a parancs a szöveg vége és a memória eleje közti terület nagyságát írja ki decimálisan. Ezt a területet a textfile használja editálás alatt, a szimbólum tábla és az object pedig fordítás alatt. Ahogy a textfile nagysága nő, ez a buffer csökken. Ha elfogy a buffer terület (túl sok szöveg bevitele miatt vagy a fordítási idő alatt), megjelenik a 'No Room!' hibaüzenet.
Időnként hasznos lehet a GEN által használt fölső memóriahatár értékének megváltoztatása. Ez a T paranccsal tehető meg, amely szükség esetén csökkenti vagy növeli az elérhető memóriaterületet, esetleg még szegmenst is lefoglal vagy felszabadít.

Buffer teteje Tn
Pl: T32000

A GEN által használt memória tetejét n-re (32000-re) állítja. Ezzel a paranccsal be lehet állítani a GEN által használt memóriaterület legmagasabb pozícióját. Általában a GEN két szegmenst foglal le (egyet az 1. lapon, egyet a 2. lapon), s a fölső memóriahatárt #C000-ra (decimálisan 49152, a 2. lap teteje) állítja be. Ez az érték a T parancs használatával durván #400-ra (decimális 1024) lecsökkenthető.
A kezdeti érték laphatárokat lép át, így ha lejjebb visszük a határt a kapcsolódó szegmens felszabadul; így lehet a rendszer segítségével szabaddá téve, újabb szegmenseket használni, mondjuk ha az assembler programban meg akartunk nyitni egy grafikus képernyőt és azt vizsgálni. Ha a későbbiekben a T parancsot használjuk az elérhető bufferterület növelésére, a szegmensek szükség szerint újra lefoglalódnak; ne felejtsük el az assembler programban megnyitott csatornákat lezárni, így a rendszer az ezek által használt szegmenseket felszabadítja, hozzáférhetővé válnak a GEN számára. Például:

T#6000 <ENTER>

Ez a parancs a GEN fölső memóriahatárát #6000-re (hexadecimális) leszállítja, íly módon felszabadítja a 2. lappal kapcsolatban lévő szegmenst. A #6000 és #8000 közti részt a rendszer nem tudja használni, mivel a GEN nem használ megosztott szegmenst.

Fontos megjegyzés
A GEN-t olyan object programok létrehozására tervezték, amelyek az Enterprise-on futtathatók az EXOS alatt. Ezért általában ezek az object programok lehetnek felhasználói programok (a #100-as címről indítva), vagy rendszerbővítések (relokálható vagy abszolút) a 3. lapon futtatva.
Így általában nem lehetséges a programok tesztelése (az R parancs segítségével) azon a címen, amelyen végül futni fognak, mert a GEN egy rendszerbővítés, a szövegek pedig a #100 közelében kezdődnek. Ezért nem ajánlatos az ORG direktíva használata programtesztelés közben, egyszerűen meg kell várni azt, hogy a GEN egy biztonságos helyre letegye az objectot és utána kell tesztelni az R parancs vagy a MON segítségével. Csak a program hibakeresésénél (debug) vigyük be az ORG-ot és a header kódot (a meleg indításhoz) s aztán fordítsuk le a pontos modul formátumba (az R assembly opciót használva).
Kérjük, hogyha valami problémája van az EXOS használatával, nézzen utána az EXOS Technikai útmutatóban.

Negyedik Fejezet: Gyors hivatkozási útmutató

4.1 A GEN hibaüzenetei

Label missing
Az EQU DEFL MACRO assembler direktívák valamelyike olyan sorban fordult elő, amelynek üres a címkemezője.

Illegal symbol
Ez az üzenet azt jelzi, hogy egy címke rossz formátumú vagy nem megengedett karaktereket tartalmaz. Megjegyezzük, hogy a mnemonikokat és az assembler direktívákat is címkéknek tekinti.

Symbol is Reserved Word
A szóbanforgó címke megegyezik egy fenntartott szóval. Ne feledjük, hogy egy foglalt szó képezheti egy címke részét, így a HL egy nem megengedett címke, a HL1 viszont igen.

Redefined symbol
Ez akkor íródik ki, ha egy címke kétszer jelenik meg a címkemezőben (azaz a DEFL-t nem használtuk a második és az azt követő esetekben). A hibát az okozhatja, ha látszólag különböző címkéknek az első S számú karakterük megegyezik, ahol S a definiált címkehossz.

Bad mnemonic
Azt jelöli, hogy a mnemonik (vagy opcode) nem megengedett. Ez a hiba akkor fordul elő, ha egy macrót úgy hívunk meg, hogy előzőleg (vagy egyáltalán) nem deklaráltuk.

Bad expression
Egy kifejezés rossz formátumú. Ez általában azt jelenti, hogy egy operátor hiányzik belőle vagy felismerhetetlen.

Expression syntax
A sorban az operandus mező formátuma rossz, pl. LD A,DE.

Digit after # or %
A # karakter után érvénytelen hex. számjegy vagy a % után érvénytelen bináris számjegy áll.

Expression too complex
A meghívott kifejezés kiértékelőnek túl bonyolult a kifejezés. A tripla zárójel a körülbelüli maximum. Bontsa szét a kifejezést egyszerűbb egységekre.

Divislon by zero
Nullával való osztás.

Bad dot operator
Érvénytelen pont operátort használt a kifejezésben. Ez azt jelenti, hogy egy pont operátor rossz formátumú, pl., .LT vagy . NOTT.

Type mismatch
Ez akkor fordul elő, amikor egy kifejezésben egy szám vagy címke helyén regiszter áll, pl. LD A,-HL. Akkor is megjelenhet, ha abszolút és relokálható operandusok nem megengedett kombinációja szerepel.

Missing )
Ez a hibajelzés egy kifejezésben a jobb zárójel hiányára utal. A kifejezés regisztert is tartalmazhat, pl. LD HL, (32*CIMKE vagy LD A,(HL.

Illegal Index
Ha nincs zárójelben az (IX+n) vagy az (IY+n) kifejezés.

JP (IX+n), JP (IY+n) illegal
Nyilvánvaló.

Mismatch of registers
Ha a HL, IX, IY regiszterpárok közül kettő ugyanabban a sorban van, pl. ADD HL,IX.

Bad command
A hibajelzés azt jelenti, hogy a parancsként használt kezdőbetű érvénytelen vagy egy parancs szintaxisa rossz, pl. *Q vagy *L.

Bad filename
A *Include-nál szereplő file-név rossz formátumú vagy a file nem létezik.

Too many includes
Az include-ok nem egymásba ágyazhatók.

Bad directive
Ez a hiba akkor fordul elő, ha egy assembler direktíva mellett nem megengedett számú paraméter áll, pl. DEFS 4,5 vagy IF CIMKE,6.

Forward reference
Ez a hiba azt jelenti, hogy a következő direktívák (ORG, EQU, DEFL) valamelyike után álló kifejezés olyan címkét tartalmaz, amelynek az értéke még nincs deklarálva.

Nested conditional
Feltételes assembler direktívák nem lehetnek egymásba ágyazva.

Macro parameter stack overflow
A macró kiértékelése alatt keletkező karakterek száma túl sok. A maximum 255. Ez a hiba általában rekurzív macróknál szokott előfordulni, de egymásba ágyazásnál is megjelenhet, azaz ha egy macróban előfordul egy másik macró.

Bad Macro parameter
A macró paramétereket a @ karakternek kell megelőzni a macró deklarációjában.

Bad ENDM
Az ENDM direktíva megjelenése őt megelőző MACRO direktíva nélkül.

Out of range
Ez a 2. menet alatt fordul elő. Legtöbb esetben határon túli relatíve jump-ot (relatív ugrást) vagy DJNZ-t jelent. Általában azt mutatja, hogy egy kifejezés értéke túl nagy, nem fér bele egy byte-ba, pl. LD A,256 vagy DJNZ $-300, stb.

A következő hibaüzenetek fatális hibákat (fatal error) jelölnek. Fatal error esetén a fordítás folyamata megszakad és visszatér az editorba.

Used all #XXXX bytes of Symbol Table!
A szimbólum tábla mérete túlhaladta a számára kijelölt helyet. Ez fatal error.

No Room!
Nincs több hely az objectnak a memóriában. Ez fatal error.

4.2. Fenntartott szavak
A következőkben bemutatjuk a GEN fenntartott szavainak a listáját. Ezek a szimbólumok nem használhatók címkeként, habár képezhetik egy címke részét.

A B C D E H L I R $
AF BC DE HL IX IY SP      
C NC Z NZ M P PE PO    

Megjegyezzük, hogy a fenntartott szavak kis- és nagybetűsek is lehetnek.

4.3. Érvényes mnemonikok

ADC ADD AND BIT CALL CCF CP
CPD CPDR CPI CPIR CPL DAA DEC
DI DJNZ EI EX EXX HALT IM
IN INC IND INDR INI INIR JP
JR LD LDD LDDR LDI LDIR NEG
NOP OR OTDR OTIR OUT OUTD OUTI
POP PUSH RES RET RETI RETN RL
RLA RLC RLCA RLD RR RRA RRC
RRCA RRD RST SBC SCF SET SLA
SRA SRL SUB XOR      

Megjegyezzük, hogy a mnemonikok kis- és nagybetűsek is lehetnek.

4.4. Assembler direktívák

ORG        
EQU END      
DEFB DEFW DEFL DEFS DEFM
MACRO ENDM      
IF COND ELSE ENDC  
END SRTP RRTP    

Megjegyezzük, hogy az assembler direktívák kis és nagybetűsek is lehetnek.

4.5. Parancssor opciók

List
Maclist
ForceSecond
NoObject
TablePrint
WrltePRNfile
SizeOfLabels
BufferSymbols
Runtype

Megjegyezzük, hogy a top-of-file opciók kis- és nagybetűsek is lehetnek.

4.6. Assembler parancsok

*List
*Maclist
*Eject
*Zzzzz
*Heading
*Inciude

Megjegyezzük, hogy az assembler parancsok kis- és nagybetűsek is lehetnek.

4.7. Operátorok

  1. + - .NOT.
  2. .EXP.
  3. * / ? .MOD. .SHL .SHR.
  4. + -
  5. & .AND.
  6. .OR. .XOR.
  7. = .EQ. > .GT. < .LT. .UGT. .ULT.

5. Fejezet: Bevezetés a MON-ba

Gratulálunk, Ön egy hatékony, rugalmas és könnyen kezelhető debugger / disassembler (azaz hibakereső / visszafordító) tulajdonosa (és reméljük vevője!), melyet az EXOS alatt futó Enterprise gépen használhat. A MON számtalan lehetőséget biztosit Önnek, pl. egy teljes visszafordítót, amely segítségére lehet a gépi kódú programok hibakeresésében és tesztelésében; ezek a programok bevihetők közvetlenül gépeléssel, létrehozhatja őket egy assembler (reméljük, hogy a GEN) vagy a BASIC. A MON mindegyik esetben olyan körülményeket biztosit Önnek, melyben ezeknek a programoknak a megértése és javítása gyorsan és könnyen elvégezhető.

5.1 A MON betöltése
A MON-nak kétféle formája létezik; egy relokálható rendszerbővítés és egy felhasználói program, a MON szalagon mind a kettő megtalálható, s a relokálható rendszerbővítés az első. Általában ezt az elsőt fogja használni, mivelhogy ez a legkönnyebben kezelhető hibakereső, de esetenként (pl.,ha egy létező rendszerbővítést akar debuggolni) szüksége lesz a másik változatra is. A betöltő utasítások mindkét fajtára ugyanazok; helyezze a MON-t tartalmazó kazettát a kazettás magnóba a MON címkével fölfelé, nyomja meg az 1-es Funkció billentyűt (a BASIC-nél a START, a szövegszerkesztőnél a LOAD) és végül nyomja le a magnón a PLAY-t.
Ha a MON felhasználói program verzióját akarja betölteni, akkor a PLAY lenyomása előtt tekerje előre a szalagon az első verziót. Ekkor a MON betöltődik és automatikusan elindul; átugorhatja a következő bekezdést.

Ha a MON-t, mint relokálható rendszerbővítést tölti be, a MON betöltődik és inicializálódik; a MON-ba belépni a

:MON <ENTER>

beírásával lehet (a BASIC-ből), vagy a
FUNCTION KEY 8 leütésével majd a

MON <ENTER>

beírásával (a beépített szövegszerkesztőből).
Először a főképernyő jelenik meg.

5.2. A főképernyő
Amit most a képernyőn lát, azt főképernyőnek (Front Panel, szó szerint előlap) hívják. Az elnevezés a nagy-és miniszámítógépekre felszerelt előlapból származik, amely bizonyos időpontokban információt szolgáltat a gép állapotáról, általában felvillanó fényekkel. Ezek a fények a számítógép bizonyos elektronikus kapcsolóinak a zárt vagy nyitott voltát jelzik; általában a belső regiszterekkel és flagekkel kapcsolatos elektronikus kapcsolókról ad információt az előlap, s ílymódon lehetővé teszi a programozók és mérnökök számára a számítógép programfutás alatti megfigyelését. (Mi inkább a főképernyő szót fogjuk használni a továbbiakban, mert magyarul jobban kifejezi a feladatát.)
Ez volt a hardware előlap; a MON főképernyője egyfajta "software előlap" - a MON kódja megvizsgálja a gép állapotát és a kapott információkat kiírja a képernyőre. A MON egy képernyőmintája:


Amint látható, a képernyő három fő részre oszlik:

  1. Regiszter kép
  2. Lista kép
  3. Memória kép

A regiszter kép:

PC 0100
SP FB27
IY 0000
IX 0000
HL 0000
DE 0000
BC 0000
AF 0000
MR 0100
IR 0001
I SZ J VNC
- a programszámláló
- a stack-mutató
- az IY regiszter
- az IX regiszter
- a HL' és HL regiszterek
- a DE' és DE regiszterek
- a BC' és BC regiszterek
- az AF' és AF regiszterek
- a pseudó-memória regiszter
- a megszakító és frissítő regiszterek
- a megszakítás állapot és flagek

A képernyő a különböző belső Z80 regiszterek értékét mutatja, beleértve a flag regisztert is. Ne felejtsük el, hogy a HL, DE és BC regiszter (és a vesszős párjuk is) egyaránt tekinthető egy 16 bites regiszternek vagy két 8 bitesnek. Egy pseudó regiszter is látható (azaz olyan regiszter, amely nem létezik a Z80 processzorban): a memória regiszter (MR). Ez hasznos lehet olyan címek tárolásánál, amelyeket később is használni akarunk; például a zsebszámológép memóriájához hasonlíthatnánk. Az aktuális regiszter mindig ezen regiszterek valamelyike és külön ki van emelve (a kezdésnél ez az MR pseudó-regiszter).

A regiszter képtől balra a lista kép látható. A kép a memória egy 80 byte-os területének pillanatfelvétele, induláskor középpontba helyezve a #100 címet. A címek a bal oldalon helyezkednek el, s tőlük jobbra az őket követő 8 byte tartalma íródik ki (hexadecimálisan). A jobb szélen az előbb említett byte-ok ASCII reprezentációja látható, s ha egy kód nem megjeleníthető, a helyére pont kerül. Látható, hogy a képen a byte-ok között van egy kiemelt byte, ennek az ún. memória mutató a címe - ez egy belsőleg használt fogalom a MON-ban, semmi köze a Z80-hoz. A memória kép (hacsak nincs külön beállítva) az aktuálisan megcímzett regiszter (a kiemelt regiszter) által tartalmazott címhez van kapcsolva, és ha a regiszter értéke megváltozik vagy ha egy másik regiszterre mutatunk, akkor a memória mutató (ne felejtsük el, hogy ki van emelve) felveszi az adott regiszter által tartalmazott új címet. A memória mutató értékét az M parancs segítségével szabadon is beállíthatjuk - lásd lentebb. Sőt, ha a kurzort az aktuálisan megjelenített memórialapon mozgatjuk, ezzel is változtatható a memória mutató: ha fölfelé lépünk, így feltoljuk a kiemelt címet (a memóriában viszont lefelé) 8 byte-tal, ha jobbra lépünk, eggyel növeljük, stb. Az aktuális képernyőből nem lehet a fent említett kurzormozgatással kilépni; ez csak a <SHIFT> <joy fel> és a <SHIFT> <joy le> használatával megengedett, amikor a megjelenített rész egy képernyőnyi nagyságú résszel tolódik el, előre vagy visszafelé haladva a memóriában.

5.3. A MON EXOS használata
A MON vagy egy 3. lapon lévő relokálható rendszerbővítésként futtatható, vagy egy 0. lapon lévő felhasználói programként (attól függően, hogy melyik változatot töltöttük be). Megnyit egy videó csatornát hardware szövegmódban, 40 oszloppal és 24 sorral. A felhasználó EXOS változóit és a software megszakító vektort megőrzi a MON, s a J parancs használata során újraállítja. A MON-ban létezik egy meleg indítás, amelynek a helye megőrződik a felhasználói programok futása alatt is, így az újraindító gomb egyszeri megnyomása visszajuttatja a felhasználót a MON-ba (feltéve, hogy a program nem állította újra ezt a vektort).
A MON a billentyűzeten történő bevitelre a 105-ös csatornát használja és a felhasználó is ebből a célból veheti igénybe. A 120-129-ig terjedő csatornákat (beleértve a két szélsőt is) a HiSoft Devpac foglalja le, ezek nem állnak a felhasználó rendelkezésére.

A következő két fejezet a MON-ban rendelkezésre álló parancsokat mutatja be. 2 csoport van, a standard és a magasabb szintű parancsok csoportja. A standard parancsokat a 6. fejezetben láthatja, a magasabb szintűeket a 7.-ben. Először a 6. fejezetet olvassa el, mert esetleg úgy találhatja, hogy nincs is szüksége a 7. fejezetre, s a MON-t megfelelően tudja működtetni a standard parancsok használatával is.

6. Fejezet: Standard MON parancsok
A parancsok széles választéka vihető be és hajtható végre, valahányszor a főképernyő megjelenik és a kurzor a képernyő bal alján lévő parancssorban vár. Mielőtt rátérnénk a parancsok leírására, részletezzük a számok bevitelét a MON használata közben.

6.1. Számok bevitele
Számtalanszor előfordul, hogy a MON használata közben egy számot akarunk bevinni, pl. egy memória címet. Ezek a számok lehetnek decimálisak vagy hexadecimálisak (az alap 16-os), s ezeket meg is különböztetjük; a decimális számokat a \ szimbólummal kezdjük. Ez itt más, mint a GEN-ben, ahol a számok default (alapértelmezés szerinti) alakja a decimális volt és a hexadecimális számokat egy kezdő "#"-kal vagy egy záró H-val jelöltük. Reméljük ez nem fog zavart okozni; indokunk a következő: a GEN közel áll a ZILOG standardhoz, ahol az alapértelmezett szám a decimális szám, de a MON-ban sokkal célszerűbb a hexadecimálist választani alapértelmezettnek.
Egy decimális számnak maximum 5 jegye lehet, míg egy hexadecimálisnak maximum 4; ha egy hexadecimális számnál több számjegyet írunk, mint a megengedett, a legnagyobb helyértékű jegy (az m.s.d.) elveszik. Ha például be akarjuk adni a CDF0B számot, akkor a képernyőn a DF0B fog megjelenni és ez a szám kerül be. Decimális számok esetén 5-nél több számjegyet nem fogad el.
Egy szám bevitelét egy olyan karakter leütésével zárjuk le, amely idegen a számban használható karakterektől, azaz decimális szám esetén egy 0-9-től különböző, hexadecimális szám esetén egy 0-9-tol és A-F (vagy a-f)-től különböző karakterrel. Ha a leütött karakter egyúttal egy érvényes parancs, akkor ez végre is hajtódik. természetesen a számjegyek, mint mindig, most is törölhetők az <ERASE> billentyűvel.
A negatív számokat a szám elé tett mínusz jellel jelölhetjük, és ne feledjük, hogy minden beolvasott szám moduló 65536 vagy moduló 256 tekintődik, attól függően, hogy a szövegkörnyezet szavakat vagy byte-okat enged meg.
Egy szám bevitelét az [ESC] lenyomásával lehet megszakítani.
S most nézzük a rendelkezésre álló parancsokat:

6.2. Az érvényes parancsok
Az műveleteket megszakító billentyű az [ESC], habár a <STOP> is ugyanezt eredményezi, csak sokkal erősebb, hisz az egész képernyőt újraállítja; a visszaléptető billentyű az <ERASE>.

A memória mutató beállítása
M
A megjelenő kettőspont után lehet bevinni egy memória címet. Ha ez megtörtént, a memória kép úgy állítódik be, hogy a bevitt cím a kép közepén helyezkedjen el. A parancsot bármikor meg lehet szakítani az [ESC] lenyomásával.

A memória mutató növelése 1-gyel

JOY jobbra
A memória mutató értékéhez hozzáad 1-et, s ezáltal az aktuálisan megcímzett memória helyet előbbre tolja 1-gyel. Ez csak az aktuálisan megjelenített memória képen működik.

A memória mutató csökkentése 1-gyel

JOY balra
A memória mutató értékéből kivon 1-et, s ezáltal az aktuálisan megcímzett memória helyet hátrébb tolja 1-gyel. Ez is csak az aktuálisan megjelenített memória képen működik.

A memória mutató növelése 8-cal

JOY le
A memória mutató értékéhez hozzáad 8-at, s ezáltal a kiemelt cím egy sorral előbbre lép (azaz 8 byte-tal). Ezzel a paranccsal nem lehet kilépni az aktuális képből.

A memória mutató csökkentése 8-cal

JOY fel
A memória mutató értékéből kivon 8-at, s ezáltal a memória mutató 8 byte-tal hátrébb állítódik. Ennél is az aktuális képen marad.

A memória módosítása

Az aktuális memória mutató által kijelölt címen (azaz a memória kép kiemelt- byte-jában) módosíthatjuk a memóriát egy szám vagy egy ASCII string bevitelével. számok bevitelekor a kívánt szám (decimális vagy hexadecimális) beütése után nyomjunk <ENTER>-t vagy lépjünk a joystick-kel; általában ilyenkor célszerű a <JOY jobbra> használata, mert ekkor a memória kép mutatója eggyel jobbra állítódik, s a következő módosításra vár. Ne feledjük, hogy a beütött számnak csak az alsó 8 bitje (egy byte) jut a memóriába. Ha számok helyett betűket akarunk bevinni, akkor az idézőjel szimbólum (") használata után adjuk be az ASCII stringet, majd üssük le az <ENTER>-t vagy lépjünk a joystick-kel. Pl., a promt megjelenése után begépelhetjük a következőket:
CD <JOY jobbra> beírja a #CD-t és eggyel tovább lép
\66 <ENTER> beírja a decimális 66-ot és helyben marad
"Hello <JOY le> beírja a "Hello"-t és 8-at lép előre

Regiszter módosítása

. (pont)
Ha egy szám (decimális vagy hexadecimális) beírását a pont írásjel begépelésével zárjuk, ez az aktuális regiszterbe íródik be, azaz a regiszter kép kiemelt részébe. Abban az esetben, ha a begépelt számot egy ponttól különböző karakterrel zárjuk, a szám alsó 8 bitje beíródik az aktuális memória mutató által kijelölt memóriacímre.

A regiszter mutató vissza / előre léptetése

<ALT> <JOY fel / le>
A regiszter kép kiemelt mutatóját egyesével lépteti vissza vagy előre, a kép aljától a tetejéig vagy a tetejétől az aljáig. Ha, a mutató eléri a kép alját (MR), a következő előreléptetés eredményeképpen a kép tetejére fog lépni (PC); másképpen, ha az MR-t éri el, akkor az <ALT> <JOY le> parancs a PC-re küldi. Tudjuk, hogy a memória kép hozzá van kapcsolva az aktuálisan kiválasztott regiszterben lévő címhez, ezért a fenti parancs végrehajtása során a memória kép megváltozik. Ellenben, ha egymás után többször és gyorsan használjuk ezt a parancsot, a memória kép nem változik egészen addig, amíg az utolsót végre nem hajtottuk; ezzel a tulajdonságával nagymértékben megnöveli a regiszter képen való mozgás sebességét.

A regiszter mutató címe a regiszterbe megy

T

Az aktuális memória mutató címet az aktuálisan megcímzett (kiemelt) regiszterbe másolja. Ez a regisztertartalom megváltoztatásának egy másik módja; az elsőnél, a már említett módon, be kell ütnünk a kívánt értéket és a pont írásjellel kell lezárnunk a szám beadását (lásd fentebb).

A program futtatása lépésenként

Z

A gép aktuális állapotából kiindulva, melyet a regiszter kép tükröz, lépésenként mutatja az utasítások végrehajtását. A regiszter kép és a memória kép minden utasítás végrehajtás után újraíródik, tükrözve a gép új állapotát.

Ugrás a PC-re

J
A program végrehajtását abból a regiszterállapotból folytatja, amelyet az aktuális regiszter kép tükröz (jobbra felül). A futtatás a PC által tartalmazott címtől kezdődik és vagy korlátlanul, vagy töréspontig folytatódik; a töréspont címét úgy definiálhatjuk, hogy a, J után beírjuk a kívánt címet, ha nem akarunk töréspontot, a J után egyszerűen leütjük az <ENTER>-t, például a
J:B800 <ENTER> a #B800 címig, a
J: <ENTER>

pedig korlát nélkül futtatja a programot.

A parancs az <ENTER> előtt leütött <ESC>-pel szakítható meg.
Ha egynél több töréspontot akarunk létrehozni, a következő fejezetben tárgyalt Set Breakpoint ([CTRL]-B) rutint kell használnunk. A program számlálóban (PC) lévő cím futtatása előtt a MON különféle általa használt EXOS változókat visszaállít és a software megszakító vektornak visszaadja azt az értéket, mellyel a MON utolsó belépésekor rendelkezett; ezzel minimalizálja a program tesztelése alatt a MON és a program kölcsönhatását.
Az éppen futó programból a gép hátulján lévő RESET gomb EGYSZERI megnyomásával lehet kiszállni és visszatérni a MON-ba. Ha gyorsan egymás után kétszer nyomjuk meg a RESET-et, a gép újraindítását érjük el.

Lista a PC-től

L

Újraírja az aktuális program számláló (PC) által kijelölt címtől kezdődő, visszafordítást tartalmazó lista képet. A lista kép jele ('>') a kép első utasítására mutat és a PC cím változásának megfelelően mozog.

Alternatív memóriakép

S

Ez egy más formátumú memória képet szolgáltat:

A kép a legfölső sorban a regiszterek tartalmát mutatja, alatta pedig a regiszterek által megcímzett 8 szó (az SP-nél) vagy 8 byte (az IY-tól az AF-ig) tartalma látható. Az IY-tól az AF-ig a megcímzett byte-ok ASCII megfelelőjét is kiírja. Ez a kép hasznos lehet, ha tudjuk, hogy valamelyik regiszter egy táblázatra mutat vagy ha meg akarjuk nézni a stack-et.
Ha ezt a parancsot ismételgetjük, felváltva fogja mutatni a korábban említett memória képet és ezt a másik változatot.

Relatív eltolásra ugrás

O

Egy relatív elmozdulást végez. Ez a parancs veszi az aktuális memória mutató által kijelölt byte-ot, úgy tekinti, mint egy relatív eltolást és ennek megfelelően írja át a memória képet. Például:
Tegyük fel, hogy a memória mutató a #8800-ra van állítva, és a #87FF és #8800 címek tartalma #20 illetve #16. Ez a két byte értelmezhető úgy is, mint egy JR HZ,$+24 utasítás. Ha meg akarjuk tudni, hogy a nem-nulla feltétel teljesülése esetén hogy ágazik el a program, adjuk ki az O parancsot, s a memória mutató megcímzi az elmozdulást tartalmazó byte-ot (#15). Ezután a kép átíródik, s az elágazásnál megjelölt célállomás a #8817 lesz a közepe. Ne felejtsük el, hogy a #7F (127)-nél nagyobb relatív eltolásokat a Z80 processzor negatívnak tekinti, a parancs ezt tekintetbe veszi.
Az elágazást jelölő utasítás címéhez való visszatérést a következő parancs biztosítja.

Visszaugrás a relatív eltolástól

U

Az előbbi O parancs átírja a memória képet a relatív eltolásnak megfelelően, azaz a JR vagy a DJHZ utasítások hatását szemlélteti, ez a parancs pedig visszaírja a memória képet arra a címre, amelynél az utolsó O parancsot kiadtuk.

Kiterjesztett címre ugrás

X

Ez a parancs veszi az aktuális memória mutató által kijelölt 16 bites címet, majd átírja a memória képet úgy, hogy ez a cím legyen középen. Ne felejtsük el, hogy a címnek az alacsonyabb helyértékű felét jelöli ki először, s aztán a magasabb helyértékűt. Például:
Tegyük fel, hogy meg akarjuk nézni a #CD #05 #83 kód által hívott rutint; az M parancs segítségével állítsuk be a memória mutatót úgy, hogy a CALL utasítás (azaz a #CD)-ban lévő #05-re mutasson, majd nyomjuk meg az X-et; a memória kép úgy fog átíródni, hogy a #8305 lesz a közepe.
Az X Kiadásának címéhez való visszatérést a következő parancs biztosítja.

Visszaugrás a kiterjesztett címről

V

Visszaírja a memória képet abba az állapotba, amelyben az utolsó X parancs kiadása előtt volt.

Keres egy mintát

G

A memória mutatótól kiindulva egy byte- vagy karaktersorozatot, vagy mnemonikot keres a memóriában. A parancs mellett megjelenő kettőspontot követően kell beírni a keresett mintát. Ez a minta lehet:

A kívánt visszafordított utasítás keresését a <STOP> lenyomásával lehet megszakítani.
Példák:

G:21 00 00 7E FE 55 [ENTER]
G:"SYNTAX ERR [ENTER]
G:%LD A,(HL) [ENTER]

Megkeresi a következő előfordulást

N

Az előző G paranccsal kijelölt minta következő előfordulását keresi a memória mutatótól kiindulva. Ha megtalálta, a minta elejét középre helyezve újraírja a memória képernyőt.

Memória kiírása a nyomtatóra

<CTRL> P

A parancs promtjai a 'First:' (első) és a 'Last:' (utolsó); az első után a printerre kiküldendő memóriablokk elejének a címét, a második után a végének a címét kell beírni (hexadecimálisan vagy decimálisan). A memóriablokk printerre kerülő formátuma a memória képhez hasonló, azaz címek, a byte-ok tartalma hex.-ákban, ASCII értelmezés. A parancsot a címek beadásakor az <ESC> lenyomásával, a printerre történő kiíratáskor a <STOP> lenyomásával lehet megszakítani.

A memória feltöltése

P

Feltölti a memória két kijelölt cím közötti részét egy kijelölt byte-tal. A parancs promtjai a 'First:' (Első) és a 'Last:' (utolsó); az első után a kitöltendő rész kezdőcímét, a második után a végének a címét kell beírni. A harmadik promt a 'With:' (mivel) ezután pedig a feltöltő byte tartalma következzék, például a következő:

>P
First:A000 [ENTER]
Last:A5FF [ENTER]
With:55 [ENTER]

a memória #A000 és #A5FF Közti részét #55-tel tölti fel.
Ha a kezdőcím nagyobb mint a zárócím, a parancs végrehajtása megszakad és nem történik semmi.

Intelligens másolás

I

Egy memóriablokkot másol. A parancs promtjai (First: Last:) az átmásolandó blokk kezdő illetve zárócímét kérdezik. Ha a zárócím kisebb a kezdőcímnél, a parancs végrehajtása megszakad. A következő promt (To: (hová)) a célcímet kérdezi, erre a címre másolja át a blokkot. A másolás értelmes bármilyen célcím esetén, akkor is, ha a célcím az átmásolandó blokkon belül helyezkedik el. Az <ESC> lenyomása a parancsvégrehajtást bármilyen állapotban megszakítja.

Belépés egy modulba

:

A parancs lehetőséget nyújt a BASIC (:BASIC), a GEN (:GEN) vagy bármely beszerkesztett modulba történő belépésre a kettőspont (':'), valamint a kívánt rendszerbővítés nevének beírásával, majd az <ENTER> lenyomásával. Felhívjuk a figyelmet arra, hogy ha a MON-t, mint új felhasználói programot futtatjuk, és a ':' paranccsal kilépünk belőle, nem lehetséges a visszatérés, csak a szalagról való újrabetöltéssel.

Szegmens belapozása

Q

Egy szegmens belapozását végzi az 1. vagy a 2. lapra. Először a 'Page:' (lap) promt jelenik meg, erre az 1 vagy 2 számot kell beírni, majd a 'Segment:' (szegmens), ami után egy 0 és #FF közé eső szám írandó. Ez a szegmens lapozódik be a kijelölt lapra. Megjegyezzük, hogy a parancs nem foglal helyet új szegmens számára, csupán a meglévőket lapozza be a kiválasztott lapra.

Egy EXOS modul betöltése

<CTRL> X

Lehetővé teszi egy EXOS modul MON-ból való betöltését és inicializálását, hasonlóan a GEN X parancsához; egyszerűen a <CTRL> X beütése után a parancs keres egy felismerhető EXOS modult az alapértelmezett külső eszközön. Ha megtalálta betölti, inicializálja és a vezérlés visszaadódik a MON-nak. A parancs a <STOP>-pal bármikor megszakítható.

Beállítja a kiemelő színt

<CTRL> I vagy <TAB>

A megjelenő 'Colour:' (szín) promt után egy 1 és 255 (decimális) közé eső számot kell beírnunk; ennek a számnak megfelel egy kiemelő szín a MON képernyőn. Ezeknek a próbálgatása hasznos lehet, habár az esetek többségében a 255-ös default érték (élénk fehér) megfelelőnek bizonyul.

Videó lap megjelenítése

<CTRL> V

Ez a parancs a 'Video channel' (videó csatorna) promt után egy csatornaszámot vár (hexában vagy decimálisan), majd egy <ENTER>-t. A parancs végrehajtása során kiírja a képernyőre a fenti csatornaszámon megnyitott videó eszköz aktuális lapjának tartalmát. Ez hibakeresés alatt nagyon hasznos, hisz lehetőséget ad a program addigi működésének nyomonkövetésére. Ha a csatorna nincs megnyitva vagy nincs hozzá kijelölve videó eszköz, hibaüzenetet kapunk.

Blokk beolvasása

R

Egy adatblokk külső eszközről történő beolvasásánál használatos. Először a megjelenő 'Name:' (név) promtra kell a betöltendő blokk nevét beírni; ez egy standard EXOS eszköz kell, hogy legyen és egy file-név, mint pl. a TEST vagy a TAPE:DUMMY. Ha nem ismerjük a file nevét, üssük le az [ENTER]-t. Ezután megjelenik a 'Header(Y/N)?' (Fejléc) - ha Y-t írunk, a blokk első 16 byte-ja nem töltődik be, azaz az esetleges létező fejléceket (header-eket) átugorja; ha N-t válaszolunk, az egész blokk betöltődik a fejlécekkel együtt - ez lehetőséget. ad a fejlécek esetleg szükségessé váló módosítására. S végül megkérdezi a betöltendő blokk betöltési helyének kezdő-és zárócímét a 'First:' és a 'Last:' promtokkal. Ha a blokk hosszabb, mint a megjelölt terület, csak akkora rész fog betöltődni, mint amekkorát kértünk; ha rövidebb, az egész blokk betöltődik.

Blokk kiyrása

W

Először a megjelenő 'Name:' promtra kell a kimentendő file nevét beírni; ez egy standard EXOS eszköz / file-név kell, hogy legyen [ENTER]-rel lezárva. Ezután megjelenik a 'Header(Y/N)?' - ha Y-t írunk, a blokk elé egy 16 byte-os fejlécet ír a MON ;ha N-t válaszolunk, csak a blokk fog kimentődni - természetesen a fejlécek a memóriában is létrehozhatók. Ha a MON csinálja a fejlécet, feltételezi az 5-ös modul típust - egy új felhasználó program típusát. Végül megkérdezi a kimentendő blokk kezdő-és zárócímét a 'First:' és a 'Last:' promtokkal.

A fenti két parancs esetében a blokkművelet bármikor megszakítható a [STOP], illetve a billentyűzeten történő bevitel az [ESC] leütésével.

Ezzel zárjuk a MON érvényes standard parancsait tartalmazó fejezetet; a következő fejezetben olyan más parancsokat részletezünk, amelyek további lehetőségeket és rugalmasságot biztosítanak a programcsomagnak, de egy egyszerű hibakereső eljárásnál nem alapvetőek. A legtöbb esetben a standard parancsok tökéletesen megfelelnek céljainknak. Az alábbiakban még megadjuk a standard parancsok és default értékeik összefoglaló listáját:

<JOY jobbra> a memória mutatót 1-gyel előre lépteti
<JOY balra> a memória mutatót 1-gyel visszalépteti
<JOY le> a memória mutatót 8-cal előre lépteti
<JOY fel> a memória mutatót 8-cal visszalépteti
<SHIFT> <JOY fel> a memória előző 80 byte-ját nézi
<SHIFT> <JOY le> a memória következő 80 byte-ját nézi

Bármilyen hexadecimális vagy decimális szám (\-sel kezdődő), melyet érvénytelen számjeggyel zárunk le (általában az [ENTER]-rel vagy a kurzor billentyűkkel), vagy bármely a " karakterrel kezdődő betűkből álló string megváltoztatja a RAM memóriát az aktuális memória mutatónál.

Regisztermódosítás:

<ALT> <JOY fel/le> a regiszter mutatót mozgatja a regiszterek között

Bármely hexadecimális vagy decimális (\-sel kezdődő) szám, melyet a pont írásjellel zártunk le, beíródik az aktuálisan megcímzett regiszterbe.

T a memória mutató címét beírja az aktuálisan megcímzett regiszterbe.

Hibakeresés a programban:

Z lépésenként, a közben kiírt regiszterértékekkel
J a gép aktuális állapotából kiindulva folytatja egy esetleges töréspontig
L a visszafordítás egy PC-től számított oldalát adja
S a regiszterértékek valamint az általuk megcímzett byte-ok alternatív memória képét adja
O végrehajtja a relatív és abszolút ugrásokat és hívásokat,
U      majd visszatér az ugró ill. hívó utasításokra
V visszaírja a memória képet abba az állapotba, amelyben az utolsó X parancs kiadása előtt volt.

Memória vizsgálat:

G vár egy mintát (byte, ASCII (") vagy mnemonik (%)) és keresi az első előfordulást
N keresi a további előfordulásokat a G után.

Memória másolás:

P a memória egy területét feltölti egy megadott byte-tal
I egy memóriablokk intelligens másolása
<CTRL> P egy memória rész kiírása a printerre

Kapcsolattartás az EXOS-sal:

Q egy szegmens belapozása az 1. vagy a 2, lapra.
: belépés egy aktív rendszerbővítésbe
<CTRL> X betolt egy EXOS modult
<CTRL> I beállítja a kiemelő szint.
<CTRL> V megjelenít egy videó lapot

7. Fejezet: Magasabb szintű MON parancsok

Ebben a fejezetben további 9 parancsot részletezünk, ezek kiterjesztik a MON eddigi lehetőségeit. A programok hibakeresése megfelelően elvégezhető a 6. fejezetben bemutatott standard parancsok segítségével, de a következő ún. magasabb szintű parancsokkal jobban irányítható a hibakeresés folyamata - esetleg úgy érezheti, hogy nincs szüksége erre a lehetőségre és nem akarja elolvasni a következő fejezetet. Javasoljuk, hogy azért legalább egyszer olvassa át.

7.1. Visszafordítási parancsok

Visszafordítás a memória mutatóról

<CTRL> L

Ez a parancs a memória mutató aktuális értékétől adja a visszafordítás egy lista képét - ez egy kód memória képének vizsgálásánál hasznos lehet. Az L paranccsal vissza lehet állítani a visszafordítás PC-től számított lista képet.

A következő lap visszafordítása

<CTRL> N

Annak az utasításblokknak a visszafordítását adja, amely a keretmezőben aktuálisan megjelenített visszafordítási lapot követi. A [CTRL]-L és L parancsok használatával bármikor vissza lehet állítani az eredeti lapot.

Blokk visszafordítás

<CTRL> D

Visszafordít egy memóriablokkot a képernyőre, printerre vagy egy külső file-ba. A megjelenő 'First:' és 'Last:' promtokra meg kell adni a visszafordítandó memóriablokk kezdő- és zárócímét (beleértve a határokat is); ez beírható hexadecimális vagy decimális formában és ha a kezdőcím nagyobb, mint a zárócím, a parancs végrehajtása megszakad.
Azután megjelenik a 'File?' Kérdés: ha a visszafordításból file-t akar csinálni, üsse le a Y-t - ezt a file-t a fordító (GEN) rendes szövegfile-ként fogja betölteni. Igenlő válasz esetén kér egy beírandó file-nevet is a létrehozandó file részére. Bármit is válaszolt az előző kérdésre, a gép megkérdezi a 'Printer?' kérdéssel, hogy akarja-e a file kiíratását a printerre is. Ha igen, üsse be az Y-t, bármely más billentyű leütésével csak a képernyőre ír.
Ezután megjelenik a 'Workspace:' (Munkaterület) - a visszafordítónak szüksége van egy munkaterületre egy egyszerű szimbólum tábla és a file buffer létrehozásához (ha kért file-létrehozást). Az [ENTER] leütése 1K nagyságú munkaterületet biztosit a MON-ban. Ha ez a válasz hibát eredményez vagy már előre tudja, hogy 1K-nál nagyobb területre lesz szüksége, egy másik munkaterületet kell kijelölnie válaszként.
Végül, többször megismétli a 'First:' és a 'Last:' promtokat; ezzel a visszafordítandó részen belül lévő tartományokat vár. Ezeket a visszafordításkor adatblokkoknak tekinti. Az adatterületeket másképpen tekinti, mint a Z80 utasításokat tartalmazó területeket. Ezek többek között lehetnek szöveg üzenetek is. A bennük lévő memória tartalmak úgy fordítódnak vissza, mint DEFB xxx sorozatok, ahol xxx az odaillő byte tartalma. Az xxx értékek ASCII-ben íródnak ki (mint idézőjelbe tett karakterek), ha értékük 32 és 127 közé esik, máskülönben hexadecimálisan (mint két hexa szám egy hash jellel megelőzve). A definiálandó adatterületek listájának lezárása az [ENTER] leütésével történik, mind a 'First:', mind a 'Last:' után.
Miután minden kérdésre válaszoltunk, vagy default állapotban hagytuk, a képernyő törlődik és kis szünet következik; ezalatt a visszafordító az első menetben létrehozza a címkék szimbólum tábláját. A listázás a <HOLD> leütésével bármikor megállítható; a <HOLD> újbóli leütésével visszaáll újra a főképernyőre, s folytatja a listázást. A visszafordításból a <STOP> lenyomásával lehet visszatérni a főképernyőhöz.
A címkéket a szükséges helyeken (pl., a #C3 #00 #98 ) LXXXX formában állítja elő, ahol XXXX a címke abszolút hex. címe; ha egy cím a visszafordító határain kívül esik, akkor a fordító EQU pseudó-mnemonikja definiálja a címkét - ez a GEN fordítóval való kompatibilitás érdekében történik.
Ha a fordító találkozik egy RST #30 utasítással, akkor az utasítást követő byte DEFB xx formában fordítódik; ennek az az oka, hogy az RST #30 egy EXOS-nak szóló hívás, amelyet egy beépített (inline) paraméter követ.
Példa a blokk visszafordításra:

>[CTRL]-D
 
First:DE00 [ENTER] (A visszafordítás a #DE00-tól)
Last:DE10 [ENTER] (a #DE10-ig történik)
File:[ENTER] (Ne hozzon létre külső file-t)
Printer:Y [ENTER] (Küldje ki a printerre)
Workspace:[ENTER] (Használja a MON default munkaterületét)
First:DE05 [ENTER] (Az adatterület #DE05-től kezdődjék)
Last:DE0B [ENTER] (és #DE0B-nél végződjék)
First:[ENTER]
Last:[ENTER]
 

7.2. Töréspont parancsok

Töréspontok létrehozása

<CTRL> B

A memória mutatóban lévő aktuális címen létrehoz egy töréspontot. Az ott lévő byte tartalmát kimenti és helyettesíti egy RST utasítással; miután ez végrehajtódott, a byte visszakapja eredeti értékét és egy billentyű leütésére vár; ha ez is megtörtént, belép a megjelenő főképernyőre, mely a gép aktuális állapotát tükrözi. Az RST utasításon általában az RST #18-at értjük (egyenértékű az RST 3 vagy #DF utasításokkal).
Ezt a parancsot több töréspont létrehozására használják; általában a standard J parancs, mely egy töréspont létrehozását teszi lehetővé, elegendőnek bizonyul. Egyszeri alkalommal nagyon sok töréspont létrehozható, ennek csak memóriabeli megfontolások vethetnek gátat.

Az összes töréspont eltörlése

<CTRL> R

Ez a parancs eltörli az összes előzőleg kijelölt töréspontot és a kódot visszaállítja az eredeti állapotába. A töréspontok a MON-ból való kilépéskor is eltörlődnek.

7.3. Futtatási parancsok
A következő három parancs a program lépésenkénti futtatásánál biztosit további lehetőségeket. Az egyik a Z80 kód kiértékelését használja, szemléltetve az egyes utasítások feladatát. A kiértékelés alatt a futtatás a <STOP> leütésével megszakítható - ekkor rögtön megjelenik a főképernyő, s mutatja a gép megszakításkori állapotát. Ennek a hasznos tulajdonságnak az a hátránya, hogy a kiértékelés alatt a kód lassan fut. Választani kell hát; egyik lehetőség a program megszakíthatóságának előnyét élvezni, de elviselni a valószerűtlenül lassú futtatást, a másiknál a standard J parancs és a magasabb szintű [CTRL]-S és [CTRL]-Z parancsok nem végeznek kiértékelést, viszont a kód normális sebességgel fut.

Kiértékelés töréspontig

<CTRL> J

Kiértékeli a programot az aktuális PC értékétől kezdve egy bármilyen előzőleg meghatározott töréspontig. A parancs kiadása után is létrehozható a töréspont oly módon, hogy a [CTRL)-J parancs kettőspont promtja után beírjuk a töréspont címét. Ha nem akarunk töréspontot létrehozni, üssük le az [ENTER]-t.
Ez a parancs kiértékelést végez, ezért meglehetősen lassan futtatja a programot; a <STOP> leütésével bármikor be lehet lépni a főképernyőbe.

Kiértékelés töréspontig

<CTRL> Z

A parancs a kérdőjel promt után egy számot vár (hexadecimálist vagy decimálist). A szám beütése, majd az [ENTER]-rel való lezárása után megindul a program futtatása a PC által tartalmazott címtől kezdve. A futtatás azután szakad meg, miután az a cím, melyről elindult a program, annyiszor előfordult, amennyit a promt után beütött számmal kijelöltünk.
Például, tekintsük a következő kódot:

844F   CD4690
8452   2B
8453   10FA
8455   21FFFF
CALL L9046
DEC HL
DJNZ L844F
LD HL,#FFFF

Tegyük fel, hogy a PC tartalma 8452 és a B regiszter értéke #20, mi pedig azt szeretnénk látni, mi történik a DJNZ ciklusban addig, amíg a B értéke ##10-re nem csökken, azaz a 16 (decimális) kör megtétele alatt. Használjuk a [CTRL]-Z parancsot és a promt után írjunk be 10-et vagy \16-ot, majd üssük le az [ENTER]-t. A főképernyő a ciklus 16-szori végrehajtása után fog megjelenni.

Utasítás átugrása

<CTRL> S

Az aktuális program számláló (PC) által megcímzett Z80 utasítás végén töréspontot hoz létre és az utasítást kiértékelés nélkül hajtja végre. A CALL utasítások átugrása hasznos lehet, ha nem akarunk végiglépegetni az egész szubrutinon. Például az RST #30 EXOS hívásnál is használatos, mert az RST #30-at követő belső (inline) byte-ot számításba veszi és átugorja.
Ez a parancs egyenértékű a J:X+N paranccsal, ahol X az aktuális utasítás címe, N pedig az utasítás hossza.

Vissza a könyvekhez

Vissza a felhasználói programokhoz