ASMON (SIMON)

File-név: ASMON13.EXT / ASMON13.ROM
Program neve: AsMon 1.3
1985 - SemiSoft
Z80 Assembly fejlesztő rendszer
File-név: ASMON15.EXT / ASMON15M.ROM / ASMEN15.ROM
Program neve: AsMon 1.5
1985 - SemiSoft
Z80 Assembly fejlesztő rendszer
File-név: TASMON15.ROM
Program neve: Turbo AsMon 1.5
1989 - SemiSoft
Z80 Assembly fejlesztő rendszer

Henrik Bendtsen programja az egyik legismertebb Assembler / monitor / debugger program. Ismertsége, elterjedtsége elsősorban annak volt köszönhető, hogy az egyik legrégebbi ilyen jellegű program. (Bár Hisoft Gen-Mon régebbi, az nem igazán biztosít komfortos munkát... Mondhatni igen fapados.)
A program 1.3-as változatát a gép fogalmazásának idején a Centrum áruházakban meg lehetett vásárolni 1298 Forintért. A program mint "igásló" került be a programot használók emlékezetébe, mivel sokmindent tudod, de az lassan és nem feltétlenül tökéletesen. (A későbbi magyar fejlesztések - mint pl. a FENASS, HEASS- sokkal gyorsabb, kényelmesebb editorral rendelkeztek, és a fordítás is lényegesen gyorsabb volt rajtuk.) Szerencsére a szerző kiadta a program forrásnyelvi listáját, így az 1.3-as változatot továbbfejlesztették melyben megpróbálták (több-kevesebb sikerrel) kijavítani a programban szereplő hibákat. A programnak így háromféle változata létezik, de magyarországi forgalmazásban csak az 1.3-as szerepelt. Mivel a 3 változat gyakorlatilag ugyanannak a programnak a továbbfejlesztése, az egyes változatok nagyon hasonlítanak egymásra, így azokat tárgyalhatjuk "egy kalap alatt", kitérve az egyes változatok közötti különbségre.

AsMon 1.3
AsMen 1.5
Turbo AsMon 1.5

A program 3 részből áll. Tartalmaz egy monitor / debugger, egy editor és egy makroassembler alprogramot. A program 1.3-as változata 6-os formátumú (abszolút rendszerbővítő), az 1.5-ös változatok ROM-file formátumban terjedtek, előkerült ugyan (utólag) betölthető változatban is. A program tartalmazza a VAR nevű bővítést is. Ezzel EXOS változók irhatők/olvashatók. Aktivizálása a:
VARn,x
utasítással történik. "n" az EXOS változó száma, "x" az új érték. Ha az "x" hiányzik, változó írás nem történik. Ha az "x" helyett a "T" betű kerül beírásra, az EXOS változó átbillentése történik. Minden esetben kiíródik a "Current value:" üzenet, és a változó új értéke. Ha nem létezik ilyen EXOS változó, a "No such variable" hibaüzenet íródik ki. Példa a VAR használatára:

:VAR27,255

(nem kell space!) a BORDER színe a 255 lesz.
A VAR bármely olyan programból hívható, amely parancsfüzért tud körbeadni.

A program indítása után a monitor rész Jelentkezik be. A képernyő alsó soraiban a regiszterlista látható. Mindegyik regiszterhez (kivéve az AF regisztert) memóriadump tartozik. (Memóriadump: a memóriatartalom számok formájában, általában ASCII alakban is.) Ez a regiszter értékénél kisebb címen kezdődik, a regiszter értékét két nyíl mutatja. A háttér regiszterkészlet használatakor a nyilak mellett egy "ALT REGS" üzenet látható. Az AF regiszternél a dump helyett a jelzőbitek vannak feltüntetve.
A regiszterek felett látható a parancs sor (ide írhatjuk be parancsainkat), melynek jobb oldalán különböző status információk vannak:

  • PRINTER: ON/OFF a nyomtató állapotát jelzi. Ha "ON", akkor minden képernyőre íródó üzenet a nyomtatóra is kikerül.
  • INPUT: az adatkérés típusát mutatja. A válaszok lehetnek: "HEX" esetén hexadecimális szám, "DEC" esetén decimális szám,"ASCII' esetén karaktersorozat. Ez utóbbinál egyes esetekben matematikai kifejezést kell írni.

A képernyő felső harmadában további információk láthatóak, attól függően, melyik változatot használjuk. Valamennyi változatban láthatóak a következő információk:

Az 1.5-ös változatokban a fentieken túl megjelenik a képernyőn a program összes paraméterének az állapota is. (Editor options - a szerkesztő beállításai, Disassemble options - a disassembler beállításai, Assemble options - az assembler beállításai, PRINTER options - a nyomtató beállításai).
A monitor üzemmódjait billentyű lenyomásával lehet elérni (nem kell utána ENTER). Az alkalmazott számrendszert a CTRL+F8 billentyű lenyomásával lehet decimálisról hexadecimálisra (és fordítva) váltani. Az addig beirt számok átíródnak a másik számrendszerre.

Az editor
A program egyik alprogramja az editor (szerkesztő). Ide "E" paranccsal lehet átlépni. Ekkor a program átvált 80 karakteres üzemmódba. Itt folyamatosan szerkeszthető az assembly nyelvű forrásprogram. Az ENTER leütése a kurzor mögötti sorokat lejjebb mozgatja és beszúr egy üres sort.
Az ALT+DEL letörli az adott sort, a többit előremozgatja. A SHIFT + DEL törli a sort, de az üres sor megmarad. A ERASE billentyű nem a megszokott módon működik: törli a balra lévő karaktert, a kurzor balra mozog, de a kurzortól jobbra lévő szöveget nem "húzza be", hanem a törlés helyén szóköz marad.
A SHIFT + INS egy új sort szúr be a kurzor pozíciójába.
ALT+JOY FEL a szöveg legtetejére, ALT+JOY LE a szöveg legvégére mozgatja a kurzort. A SHIFT + fel egy oldallal felfelé, a SHIFT + le egy oldallal lefelé lapozza a képernyőt.
A funkcióbillentyűkkel lehet szerkesztési üzemmódokat választani. Ekkor egy kis menüt ír ki, ebből a JOY-Jal lehet kijelölni a kívántat. Ezek a következők:

F1:
Find string: A beírt szöveget keresi. A keresést a kurzor pozíciójától kezdi, és a szöveg végéig keres.
Find &repl: Szintén megkeresi a megadott szöveget, de megadhatjuk, mire cseréljük ki a keresett szöveget.
Cont search: Folytat/a a keresést az eredeti szöveggel. Ha a szerkesztett forráskódban a keresett szöveg többször is előfordulhat, ezzel folytathatjuk a keresést.
Repl string: A megtalált szöveget helyettesíti.
Repl&cont: Helyettesit és folytatja a keresést.
F2:
Set tabmark: Tabulátor beállítása.
Res tabmark: Tabulátor törlése.
Clr tabmark: A tabulátorok törlése.
Stand tabm.: Tabulátorok felfüggesztése.
F3:
Mark start: Blokk kezdete a kurzor helyén lesz.
Mark end: Blokk vége a kurzor helyén lesz.
Copy block: Az így kijelölt blokkot a kurzor helyére beszúrja.
Del block: A kijelölt blokkot törli.
Prnt block: A blokkot nyomtatóra küldi.
Clr marks.: Blokk kezdetének és végének törlése.
F4:
Load flle: Forrásszöveg betöltése (a meglévő programhoz fűzi).
Save file: A forrásszöveg kimentése.
Save block: A blokk kimentése.
Kill text: A forrásszöveg törlése (megerősítést vár: Delete text (y/n)).
Turbo save: A forrásszöveget tömörítve és sokkal gyorsabban menti ki, így a betöltés is gyorsabb. Csak az 1.5-ös verziókban!
T. save bl A forrásszöveg kijelölt blokkját menthetjük el tömörített formában. Csak az 1.5-ös verziókban!
F6:
Text: A forrásszöveg hosszának kiírása.
Free: A szabad memória nagyságának kiírása.
F7:
Help: A szerkesztő funkciók kiírása.
F8:
  Visszatér a monitorhoz.

Az assembler
A szerkesztővel megírt forrásszöveget a futtatás előtt le kell fordítani. Ezt monitor üzemmódból az "A" billentyűvel lehet elkezdeni. Ekkor az assembler elemzi a szöveget, megpróbál végrehajtható kódot készíteni. Ezt két menetben (PASS-ban) végzi. Az első menetben a szimbólumokat gyűjti ki egy táblázatba, mindegyiknek megfeleltet egy értéket. A második menetben az így felállított táblázat alapján teljesen lefordítja a forrásszöveget. Az assembler számára az utasítást nem szabad a sor elején kezdeni, mert így szimbólumként értelmezi. A szimbólum és az utasítások között SPACE vagy : kell, hogy álljon. A megjegyzéseket ; után kell beírni. Az assemblerben a számok a következők lehetnek: decimálisak (a végükön D), hexadecimálisak (a végükön H betű, csak számmal kezdődhetnek), oktálisak (a végükön O betű), binárisak (a végükön B betű). Ha egy szám végén nincs betű, akkor az alapértelmezés szerinti számrendszerben próbálja értelmezni. Idézőjelek vagy aposztrófok közé zárt karakter (az értéke a betű ASCII. kódja lesz), szimbólumok (szimbólum nem lehet regiszternév, feltételnév, pl. NZ, BC, R, stb.), a $ karakter (a címszámláló fordítás közbeni aktuális értéke).
A számokból matematikai műveletek is alkothatók. Ezek:

X + Y összeadás
X - Y kivonás
X * Y szorzás
X / Y osztás
X MOD Y maradékfüggvény (X - INT(X / Y))
X SHR Y X Y bittel jobbra rotálódik
X SHL Y X Y bittel balra rotálódik
X AND Y bináris "X és Y" művelet
X OR Y bináris "X vagy Y" művelet
X XOR Y bináris "X kizáró vagy Y"
NOT X egyes komplemens képzés (a biteket negálja)
-A kettes komplemens képzés
LOW X X alacsonyabb byte-ja
HIGH X X magasabb byte-ja

Relációk:
X < Y, X > Y, X = Y, X <= Y, X >= Y, X<>Y

Kiértékelésnél prioritást is figyelembe vesz. (A műveleteket fontosságuk alapján hajtja végre.) A műveletekben zárójelek is alkalmazhatók. (Óvatosan kelt velük bánni, mivel a Z80 assembly-ben a zárójelek használva vannak!) Az assembler a normál Z80 utasításkészleten felül jónéhány direktívát is ismer . Támogatja a makrók feldolgozását, feltételes fordítást és beillesztést is lehetővé tesz.

Általános direktívák: (nem Z80 kódok, a fordítást vezérlik!):

ORG nn A fordítási cím nn lesz, vagyis a program erre a címre töltve lesz működőképes. Ezzel kell a programot kezdeni.
.PHASE nn
nn címtől kezd el fordítani úgy, hogy közben az aktuális fordítási számláló is növekszik. Hasznos olyan programoknál, amelyek olyan szubrutint tartalmaznak, amelyek nem a betöltési címen futnak. Például: egy ROM-ban futó program olyan alprogramot tartalmaz, amely később megváltozik. Mivel a ROM-ban nem lehet felülírni a programot, ezért ki kell másolni a RAM-ba. Viszont a RAM címe nem egyezik a ROM címével, ezért ezt a szubrutint a RAM címére kell fordítani. Ekkor lehet alkalmazni a PHASE utasítást. Az object kód betöltésekor az object kód az új helyre fog töltődni tehát, nem célszerű ilyenkor használni.
.DEPHASE A fordítási számláló visszanyeri aktuálisértékét.
END Lezárja a forrást (a további sorokat figyelmen kívül hagyja)
EXOS n 0F7H,n byte-oknak felel meg (RST,30H,DEFB n)
DEFB nn
számot kiértékeli, 1 byte-ba sűríti és így tárolja. n helyett több szám is állhat, vesszővel elválasztva. n lehet karaktersorozat is, ekkor karakterenként kerül tárolásra.
DB n ld. DEFB
DEFW un Hasonló a DEFB-hez, de itt 2 byte-os szavak kerülnek tárolásra.
DW nn ld. DEFW
DEFM "string" A string karakterenként kerül tárolásra.
DEFS nn nn darab byte-ot üresen hagy.
DS nn ld. DEFS
EQU nn A címke helyén álló bármilyen szimbólum értéke nn lesz.
INCLUDE név Megkeresi a "név" nevű programot, blokkonként lefordítja és a főprogramba illeszti.

Feltételes fordítás:
A fordítás során egyes programrészleteket bizonyos feltételtől függően ki lehet hagyni, míg másokat le lehet fordítani, a BASIC IF,ELSE,ENDIF szerkezethez hasonlóan.

IF kif
Ha a "kif" kifejezés igaz (értéke nem 0), akkor az utasítások1 lesz lefordítva, míg ha hamis (értéke 0) akkor az utasítások2. Az ENDIF lezárja a utasitások2 blokkot, az ezután következő utasításokat mindig lefordítja. Utasítások1,2 több sorból is állhat. Megengedett a feltételek egymásba ágyazása (max. 255)
IFT Ugyanaz, mint az IF
IFF Hasonló az IF-hez, de itt az első blokk a feltétel hamissága esetén fordítódik le.
IF1 Az első menetben igaz az értéke, a 2. menetben hamis.
IF2
A 2. menetben igaz, az elsőben hamis. Igen hasznos nagy tömegű adat esetén, amiket nem kell kétszer fordítani, így gyorsul a fordítás. (Ekkor az adatok után nem állhat címke!)

A feltételek listázásakor kétféleképpen viselkedik a fordító: csak azt listázza ki, ami lefordításra került; mindkettőt kilistázza, de csak ahhoz ír kódokat, amit lefordított. Ezt a "List conditions YES/NO" opcióval lehet beállítani. A YES esetén mindent listáz, a NO esetén csak a lefordításra kerülőt. Ezt fordítás közben is lehet állítani direktívák segítségével:

.SFCOND A feltételek listázását kikapcsolja (csak a lefordított utasításokat listázza)
.LFCOND A feltételek listázását bekapcsolja (a feltételes utasításokat is listázza)
.TFCOND Átkapcsolja a feltételek listázását (YES-ről NO-ra és viszont)

Makró feldolgozás:
A makrók olyan névvel ellátott programrészletek, amelyekre később a nevükkel hivatkozunk. Fordításkor az assembler amikor egy nem felismerhető utasítást talál megpróbálja előkeresni a makró táblázatból. Ha itt sem találja, csak akkor ad hibaüzenetet. Ebből következik, hogy makró névként nem használható normál Z80 utasításnév, vagy direktíva. Makrót olyan programrészleteknél célszerű használni, amik a programban sokszor előfordulnak, de bizonyos szempontok miatt (gyorsaság, stb.) nem ajánlott szubrutint csinálni. A makrók ezenkívül még egyéb lehetőséget is biztosítanak. A makrókat a szimbólumhoz hasonlóan kell definiálni:

név MACRO p1,p2

Létrehoz egy "név" nevű makródefiníciót, az utána következő sorokat nem fordítja le közvetlenül, hanem eltárolja a makró táblázatban. A makrók definiálása tehát önmagában még ne eredményez semmiféle kódot. Az így definiált makróra később a nevével hivatkozunk. p1 és p2 a híváskor megadandó paraméterek. Ezek formális paraméterek, (nem címkék!) csak a makrón belül van szerepük. Számuk tetszőleges lehet. Az itt felsorolt paraméterek helyére fordítás közben az assembler a hívás helyéről olvas paramétereket.
A makró és a szubrutin között az a különbség, hogy a szubrutin a kódban csak egyszer fordul elő, és ezt az egy rutin hívjuk meg a program egy másik helyéről; a makrók viszont minden esetben lefordításra kerül, ha hivatkozunk rá, így a makróban szereplő utasítások több helyen is szerepelhetnek majd a kódban.
Egy példa a makró definiálására és használatára:

; először a definíció
wrchr MACRO @char
ld a,070h
ld b,@char
rst30h
defb 2
endm
; majd a használat
  org 01000 h
wrchr "A"
end

Figyelem! Az ASMON-ban van egy hiba: a MACRO direktívát tartalmazó sor végére nem szabad kommentet (megjegyzést) tenni, mert az ASMON ezt nem hajlandó elfogadni!

ENDM Lezárja a makródefiníciót. Hasonló az END-hez, de itt csak a makró törzs záródik le, a fordítás folytatódik.
EXITM
Hasonló az ENDM-hez, de míg az ENDM csak a blokk végén állhat, az EXITM máshol is előfordulhat (a makrón belül). Így lehet például feltételes makrókat csinálni.

Fordítás közben nem a makró neve listázódik, hanem a makróból előállított szöveg. Egy példa:

TOLT MACRO
LD
LD
LD
LDIR
ENDM
P1,P2,P3
HL,P1
DE,P2
BC,P3

Fordításkor erre a definícióra pl. a TOLT100,200,100 utasítással hivatkozunk. A kifejtés során az assembler ebből az utasításból ezt a programot fordítja le:

  LD
LD
LD
LDIR
HL,100
DE,200
BC,100

Vagyis létrehoztunk egy utasítást, amely a megadott három címtől függő helyről a megadott címre, megadott mennyiségei adatot másol. A paraméterek helyén regiszterneveket is megadhatunk. A fordítás során listázáskor a kiírás formátumát is változtatni tudjuk. Erre direktívák szolgálnak. Általában a "." karakterrel kezdődő direktívák nem szólnak bele a lefordított kódba, csak a lista formátumát módosítják. Ezek:

.LIST
Bekapcsolja a listázást. Ekkor a fordítási lista a kővetkező alakban íródik ki: Fordítási cím, a lefordított kód (object), a forrásszöveg. Bekapcsolt nyomtató esetén a printerre is kiíródik a lista.
.XLIST Kikapcsolja a fordítási lista írását.
.PRINTX string
A "string" szöveget beírja a fordítási listába. Ha a "string" első karaktere a "%" Jel, akkor az utána álló szöveget kifejezésként értékeli ki és a számot írja a listába.
.COMMENT ch
A "ch" karaktert , keresi a következő sorokban, és amíg meg nem találja, addig nem fordítja a szöveget, csak kiírja.
TITLE string
Nem ponttal kezdődik! Nyomtatónál a fejlécbe ezt a szöveget Írja ki. Nyomtatásnál minden lap tetejére fejlécet ír.
.RADIX n
Az alapértelmezés szerinti számrendszer alapja n lesz. Azokat a számokat, amelyeknek a végén nincs azonosító betű, ilyen számrendszerben értékeli ki.

Relokálható file-ok készítése ASMON-nal:
Mindenféle híresztelés ellenére tud korrekt relokálható fájlokat készíteni!!! Csak a direktívák megfelelő használatát kell ismerni:

.SETRTP n
futási lap beállítása n-re. Ez akkor kell, ha a program valamely része a végrehajtáskor nem azon a lapon fog futni ahol a program. Például egy EXOS bővítő átlapozza magát az 1. lapra és ott folytatja működését, ekkor az egyes lapon futó szakasz elé kell egy .SETRTP 1 a helyes relokáció érdekében.
.RESRTP futási lap visszaállítása. Mikor az előző bővítő visszalapozza magát.
.INIOFS
a 2-es típusú fájlok inicializálási eltolás beállítására szolgálna, de: TUDJA VALAKI, hogy milyen operandus kellene neki???
.ASEG a következő utasításban szereplő 16 bites érték abszolút szónak kezelendő.
.CSEG a következő utasításban szereplő 16 bites érték áthelyezhető szónak kezelendő.

A "következő utasítások" listája:

Példa a program átírására:

Eredeti: Relokálható:
LD A,255
LD BC,10
LD DE,TEXT
CALL KIIR
JP 100H
LD A,255
.ASEG
LD BC,10
.CSEG
LD DE,TEXT
.CSEG
CALL KIIR
.ASEG
JP 100H

Ha egy 6-os fejléccel fordított rendszerbővítőt betöltünk, az lefoglal a gép memóriájából 16 Kilobájtot. A relokálható fájl csak annyi helyet foglal, amennyire szüksége van. És még valami: a relokálható fájlokat nehezebb visszafejteni.

A Monitor:
A debugger viszonylag sokfajta lehetőséggel rendelkezik: itt végezhetjük a program fordítását, lépésenkénti végrehajtását, futtatását: kezelhetjük a portokat, vájkálhatunk a tárban stb. A fő feladata tehát, hogy segítsen programunkat futtatható formába önteni, a hibákat kibogarászni (nem véletlenül hívják debugger-nek, a "bug" ugyanis bogarat jelent).
Az ASMON összes parancsa a megfelelő billentyű leütésével aktivizálható. A parancsok listáját a H (Help, segítség) billentyű lenyomásával kapuk meg. A parancsok paraméterként számokat és szövegeket is várhatnak. A számokat hexadecimális vagy decimális formában adhatjuk meg, a számrendszerek között a CTRL+F8 billentyűkkel válthatunk. Ez a billentyűkombináció egyébként a szükséges helyeken mindig működik, ugyanúgy, mint az [ESC], amellyel bármilyen helyzetből, bármelyik helyről visszaléphetünk a parancssorba. Sok opció alapértelmezéssel rendelkezik, így ha az ott szereplő érték számunkra megfelelő, akkor nincs más dolgunk, mint hogy az ENTER-t leüssük.

A (Assemble)
Az editor segítségével megírt forrásszöveget lefordítja, a meneteket Pass1, Pass2 felirattal jelzi. Az elkövetett hibákat számolja. Csak "No error" üzenet esetén keletkezik hibátlan kód. Opciói beállíthatók (ld. később).

B (Breakpoints)
2 db. töréspont beállítása. Futáskor a program erre a címre érve visszatér az monitorba, a regisztertartalmak megőrződnek. Ezen a címen lévő byte-ot a debugger lecseréli egy 0E7H kódra (RST 20H), így ilyen utasítás használata nem ajánlott.

C (Copy memory)
A Start: címtől End: végcímig tartó memóriablokkot a Destination: címre másolja. (Lehet átfedés is.)

D (Dump memory)
Start: címtől a memória tartalom listázása CP/M formátumban: tárcím, 8 byte hexa alakban, 8 byte ASCII formában, a 7. bit nélkül.

E (Edit source)
Belépés az ASMON editorába.

F (Fill memory)
A Start: címen kezdődő. End: címen végződő blokk feltöltése Value: értékű byte-tal.

G (Go -CALL PC)
PC értékére ugrás a B-vel megadott töréspontokkal. PC értéke a végrehajtás előtt módosítható (Start:).

H (HELP function)
Segítség kiírása.

I (Set func key)
Funkció billentyűk definiálása. Key number: billentyű száma; Key string: idézőjelek közé tett szó. (Hasonló a formátum a DEFB utasításhoz). Igaz, az editorba való belépéskor a funkcióbillentyűk programozása törlődik, de a SHIFT-el együtt lenyomott funkcióbillentyűk jelentése az editorban és az editorból való kilépés után is megmarad. Ezen billentyűk számai 11h-tól 18h-ig terjednek.
Akár "billentyű makrókat" is írhatunk az egyparaméteres ASMON parancsokhoz. Tegyük fel, hogy gyakran van szükségünk az 1000h címtől a listázásra. Nos nyomjuk le az I-t, adjuk meg a 11-et (ez jelenti a SHIFT+F1-et), majd írjuk be "L1000". (Az idézőjeleket is be kell gépelni, különben az ASMON a HEX ERROR hibaüzenetet küldi.) Ezek után a listázáshoz elegendő a SHIFT+F1-et és az ENTER-t lenyomnunk.

J (Swap registers)
Felcseréli a regiszterkészletet.

K (Read source)
Beolvas az editor szövegmezejébe egy forrásszöveget.

L (Disassemble)
Disassemblál ja a Start: kezdőcímű területet. Opciói beállíthatók.

M (Modify memory)
Start: értékétől memóriatartalom módosítása. Először dumpot csinál az éppen felülírható byte-ot a kurzor jelzi. ALT+F8 leütésére a kurzor az ASCII dumpra megy át, itt karakteres formában lehet módosítani.

N (Number cruncher)
A Value: kérdésre irt stringet értelmezi úgy, mint az assembler függvény kiértékelője. Itt azonban ha egy szám végén nincs semmi, akkor az nem decimális, hanem hexadecimális lesz. Az eredményt kiírja: 16-os rendszerben (Hexadecimal value) 10-es rendszerben (Decimal value) 2-es rendszerben (Binary value) ASCII karakterekként (először a magasabbik byte ! Alphanumeric value:).

O (Output port)
A Port: számú perifériára küldi a Value: értékét. (OUT utasítás)

P (Printer ON/OFF)
A printert be / kikapcsolja.

Q (Query port)
A Port: számú periféria értékét kiírja (Port value is:)

R (Read BIN file)
A Start: címen kezdődő és End: címen végződő blokkba betölti a File name: nevű file-t. Ha ez rövidebb mint a blokk, End of file üzenetet kapunk, és a file végcíme kiíródik.

S (Save BIN file)
A Start: címen és az End: címen végződő blokkot File name: néven kimenti.

T (Trace memory)
PC értékétől Steps: darab program lépést tesz. Közben látható az éppen végrehajtott utasítás és a címe.

U (Untrace)
Ugyanaz mint az előző, csak közben nem látszik semmi.

V (View status)
Megjeleníti a status információkat. (Z80-as lapok tartalma, szegmens információk: Free segment(s): üres szegmensek száma. Working segment(s): a munkaszegmensek száma. Defective segment(s): A hibás szegmensek száma. Total RAM segment(s): Az összes RAM szegmensek száma. Az 1.5-ös verziók a program paramétereit is megjelenítik. A program indulásakor is ez a lap jelenik meg.

W (Write source)
File name: néven kimenti a forrásszöveget.

X (eXamine register)
A Registerpair: promptra írt regiszterbe Value: promptra beírt értéket tölti.

Y (Options Disas)
A disassembler opciók beállítása.

Z (Options Assemble)
Az assembler opciók beállítása.

Egy futtatni kívánt program fordítása előtt be kell állítani az opciókat:

[ (Options printer)
Printer opciók:

\ (Options Editor)
Editor opciók:

] (Load module)
a "File name:" kérésre megadott nevű EXOS rendszerbővítő betöltése.

@ (Symbol table)
Kiírja a szimbólumtáblát "szimbólum fordítási értéke" formában. A szimbólumokat betűrendben írja ki.

= (Find string)
Start: címtől keresi a Search:-re megadott mintát. A minta lehet: számok vesszővel elválasztva (lehet 16 bites is!), idézőjelek közé zárt karaktersorozat, valamint ezek kombinációja.

: (EXOS string)
string : A stringet command stringként értelmezi. Azaz parancs küldése az EXOS-nak.

A következő funkciók az 1.5-ös változatokban érhetők el:

CTRL + A (Restart AsMon)
Az AsMon újraindítása.

CTRL + E (Errors)
Lekérdezhetjük a program hibaüzeneteit a kódjuk szerint.

CTRL + G (GEN txt to AsMon)
Hisoft GEN formátumú forráskód-file konvertálása AsMon formátumba.

CTRL + I (Intelligent Save)
A forrásszöveget és a hozzá tartozó fordítási beállításokat is elmenti. Csak az 1.5-ös verziókban!

CTRL + K (Kill text)
A szerkesztés alatt álló forráskód törlése. Szándékunkat meg kell erősíteni.

CTRL + L (Char. designer)
A megadott ASCII kódú karakter átdefiniálása. A Kurzort a beépített botkormánnyal mozgathatjuk. Egy pontot megváltoztatni a SPACE megnyomásával lehet. Az ENTER megnyomásával befejezhetjük a szerkesztést.

CTRL + N (Dump to file)
A Start címtől az END címig terjedő memóriaterületről dumpot menthetünk a megadott nevű file-ba.

CTRL + O (MON txt to AsMon)
Hisoft MON formátumú forráskód-file konvertálása AsMon formátumba.

S (Turbo txt Save)

CTRL + T (text to GEN)
A forráskód mentése Hisoft GEN formátumban.

Az assembler hibaüzenetei:

ZozoSoft javítása

Az 1.5-ös változatokban van egy hiba, ami EXOS 0 funkcióhívásnál (reset) fagyást tud okozni. A hibát Puskás Zsolt követte el, amikor a Gyányi Sanyi gyorstesztjét beépítette az eredeti ASMON ROM üres területére. Ebben a nehézség az, hogy az EXOS-nál kétféle ROM kezdet lehet, ami nem kompatibilis egymással:

Nem gondolták az Intelligent Software-nál, hogy kellhet majd mindkét funkció is egyazon ROM-ban... Ráadásul az ASMON INC / DEC-cel vált szegmensszámot, nem XOR-al, így nem cserélhetőek fel a szegmensei. Viszont hely a második szegmensben volt. Így azt a megoldást választotta, hogy a ROM elejei lettek megcserélve, majd az ott belépő program átlapozza magát a másik szegmensre, a TEST ROM programmal nincs is gond, mert az DI alatt fut.
Az EXOS ROM belépési program így néz ki az átvariálás után:

C00A
C00C
C00D
C00F
C011
8014
8015
8017

FFF0
FFF1
FFF3
FFF4
C00B

DB B2
08
DB B3
D3 B2
C3 14 80
3D
D3 B3
C3 F0 FF

08
D3 B2
79
C3 0B C0
C3 CD DB

IN A,(B2)
EX AF,AF'
IN A, (B3)
OUT (B2),A
JP 8014
DEC A
OUT (B3),A
JP FFF0

EX AF,AF'
OUT (B2),A
LD A, C
JP C00B
JP DBCD

Itt már látható is a hiba: ideiglenesen kilapozza a rendszerszegmenst a második lapról, pedig ilyenkor oda mutat a veremmutató, így ha ezen pár pillanatban fut be a megszakítás, kész a fagyás! Bármikor okozhat fagyást, amikor körbe vannak hívva az EXOS ROM-ok. A hibát okozó lapozás amúgy teljesen felesleges, nem kell elugrani azért a 3-as lapról, hogy kicseréljük az ott futó program alatt a szegmenst.
Íme a javítás:

C00A

FFEB
FFED
FFEE
FFF0
FFF1

C3 EB FF

DB B3
3D
D3 B3
79
C3 CD DB

JP FFEB

IN A,(B3)
DEC A
OUT (B3),A
LD A,C
JP DBCD

Mint látható, a JP-re való ugrás helyett akár ugorhatunk egyből a célba is mindezzel spóroltunk pár mikroszekundum végrehajtási időt is.

Maga a Turbo ASMON-ba rakott gyorsteszt is módosítva lett, hogy EXOS 2.0-val is kompatibilis legyen. A teszt lemegy a cartridge-ba is RAM-ot keresni, így egy kétfoglalatos cartridge egyik foglalatába 32K SRAM-ot téve készíthető RAM bővítés EP64-hez. Javítás közben derült ki, hogy ez a gyorsteszt is figyel egy billentyűt: az S billentyűt lenyomva az eredeti EXOS teszt fut le.

A módosításokat az ASMON15M.ROM változat tartalmazza.