SMON

Aus C64-Wiki
Wechseln zu: Navigation, Suche
SMON
Startbildschirm
Entwickler N. Mann, Dietrich Weineck
Verleger Markt & Technik Verlag
Release 1985
Plattform(en) C64, C128, VC-20
Genre Maschinensprachemonitor
Steuerung Icon tastatur.png
Medien Listing, Icon disk525.png
Sprache(n) Sprache:englisch
Information Erschien in mehreren Teilen als Listing zum Abtippen in der 64'er 1984/85

SMON ist ein bei vielen Anwendern beliebter Maschinensprachemonitor für den C64, entwickelt von N. Mann und Dietrich Weineck, der in den ersten Ausgaben der Computerzeitschrift 64'er in den Jahren 1984/85 in mehreren Teilen als Listing zum Abtippen veröffentlich wurde. Zeitgleich erschien in der 64'er der damals berühmte Assembler-Kurs für Einsteiger: "Assembler ist keine Alchemie", der sich ab Teil 3 oft auf den SMON bezieht. Später wurde SMON auch in Sonderheften und Büchern der 64'er bzw. im Markt & Technik Verlag erneut veröffentlicht, diesmal mit kompletten Versionen auf der Diskette.

Beschreibung[Bearbeiten]

SMON enthält alles, was zum "Standard" gehört: die Anzeige des Speicherinhalts in Hex-Bytes (Memory-Dump) mit Änderungsmöglichkeiten, einen Disassembler mit Änderungsmöglichkeit sowie Routinen zum Laden, Speichern und Starten von Maschinenprogrammen. Darüber hinaus gibt es einen kleinen Direktassembler, der sogar Labels verarbeitet, Befehle zum Verschieben im Speicher mit und ohne Umrechnen der Adressen, Routinen zum Umrechnen von Hex-, Dezimal- und Binärzahlen, leistungsfähige Suchroutinen und einen Trace-Modus, mit dem sich Maschinenprogramme Schritt für Schritt abarbeiten und kontrollieren lassen.

Laden und Starten[Bearbeiten]

Von einer Diskette in Laufwerk 8 kann der SMON geladen und gestartet werden mit:

LOAD "SMON $C000",8,1
NEW
SYS 49152

Das NEW vor dem SYS-Befehl verhindert eine spätere Fehlerausgabe "OUT OF MEMORY", wenn BASIC benutzt werden soll. Das Programm liegt vollständig in einem 4 KByte großen Speicherbereich, in der Standardversion zwischen $C000 und $CFFF. Nach dem Start wird der Bildschirmhintergrund und die Rahmenfarbe auf Blau sowie die Zeichenfarbe auf Türkis gesetzt und die Registerbelegung angezeigt.

Registeranzeige[Bearbeiten]

   PC  SR AC XR YR SP   NV-BDIZC
 ;C000 B0 C2 00 00 EE   10110000

Der rechte Block zeigt das Statusregister (SR) in bitweiser Darstellung mit den Namen der einzelnen Flags oberhalb.

Die erste Zeilen der Ausgabe, auch Registerzeile genannt, bedeutet dabei folgendes:

Alle Zahlen (bis auf das Statusregister) werden in hexadezimaler Form angezeigt.

Flags

Die Flags bedeuten (von High-Byte nach Low-Byte):[1]

Bits:  76543210 
Flags: NV-BDIZC
  • Bit 7: N (negative flag) - Zeigt bei mathematischen und logischen Operationen an, ob das Ergebnis negativ geworden ist (also gesetzt, wenn der Wert im Bereich $7F bis $FF liegt).
  • Bit 6: V (overflow flag) - Signalisiert den Überlauf bei mathematischen Operationen, wenn das Ergebnis den Wertebereich -128 bis +127 in der 2er-Komplementdarstellung verlassen hat.
  • Bit 5: - nicht benutzt, immer 0.
  • Bit 4: B (break flag) - markiert einen Interrupt der mittels eines BRK-Befehls ausgelöst wurde.
  • Bit 3: D (decimal flag) - Mathematische Operationen (Addieren/Subtrahieren) werden in BCD-Arithmetik ausgeführt.
  • Bit 2: I (interrupt flag) - Unterdrückt oder erlaubt IRQs.
  • Bit 1: Z (zero flag) - Ist gesetzt, sobald ein Ergebnis einer Operation 0 ergibt.
  • Bit 0: C (carry flag) - Dient als Übertrag bei mathematischen und logische Operationen, wenn diese den Wertebereich $00 bis $FF verlassen, um u.a. Mehr-Byte-Operationen zu realisieren.

Um ein Flag zu ändern, muss der hexadezimale Wert im Statusregister überschrieben werden.

Befehle[Bearbeiten]

Ein- und Ausgabe[Bearbeiten]

Der Monitor nutzt für alle Ein- und Ausgaben die hexadezimale Schreibweise (zweistellig für Bytes, vierstellig für Adressen) ohne führendes "$". Um den Bereich ab $C000 zu disassemblieren, schreibt man also direkt hinter den Prompt "." einfach D C000. Bei Adressbereichen ist die Startadresse inklusiv, die Endadresse exklusiv. Um den Bereich von $C000 bis $C00A (inklusiv) zu disassemblieren, gibt man also ein: D C000 C00B. Leerzeichen (oder Kommata) nach einem Befehl werden i.a. überlesen. Eine Ausnahme von dieser Regel bilden Befehle aus dem Bereich Find oder Trace, die auch zwei Zeichen lang sein können. Hier muss hinter einem zweistelligen Befehl die Dateneingabe direkt folgen, hinter einem einstelligen Befehl muss ein Leerzeichen (oder Komma) folgen.

Die Ausgabe nach einigen Kommandos (D,K und M ohne Endadress-Angabe) besitzt die folgende gleiche Tastensteuerung:

  • RETURN  oder eine beliebige andere Taste (außer CTRL , C= , SHIFT  oder eine der beiden folgenden Tasten): Darstellung weiterlaufen lassen bzw. stoppen.
  • Leertaste : Eine weitere Zeile darstellen.
  • RUN/STOP : Kommando beenden, zurück zum Eingabe-Prompt.

Wird ein Ausgabe-Befehl mit SHIFT  eingegeben, so werden die Daten nicht nur auf dem Bildschirm, sondern auch auf dem Drucker ausgegeben.


SMON kennt die folgenden Befehle[2] im Standardmodus und im Diskettenmonitor:

Standardmodus - Maschinensprachemonitor[Bearbeiten]

A xxxx - Assembliere (Assemble)

Assembliere Code ab Adresse xxxx mittels der üblichen 6502-Mnemonics. Es ist auch die Verwendung von speziellen Labels in der Form Mxx möglich, wobei xx eine 2-stellige Zahl darstellt (maximal 30). Beendet wird er Vorgang mit der Eingabe eines einzelnen "F" (engl. finish).
Beliebige Werte können mit vorangestelltem "." gefolgt vom Hex-Wert eingefügt werden, z.B. .2C

B xxxx yyyy - BASIC-DATA-Zeilen erzeugen (Basic Data)

Erzeuge BASIC-Zeilen mit DATA-Kommandos, die Werte aus dem Speicherbereich von xxxx bis yyyy enthalten. Die Zeilennummern beginnen immer bei 32000 (definiert in den Speicherstellen $C087/$C088). Die dabei erstellte Zeilenlänge ist mit 80 Zeichen (entsprechend dem C64-Bildschirmeditor) vorgegeben und könnte, falls erwünscht, über die Speicherstelle $C9AE angepasst werden, wobei hier die gewünschte Zeilenlänge abzüglich 7 anzugeben ist (also 65 für z.B. 72, wie es z.B. für USENET-News-Postings üblich ist).

C xxxx yyyy zzzz aaaa bbbb - Konvertiere Programm (Convert Program)

Ein Programmcodeabschnitt von Adresse xxxx bis yyyy wird nach Adresse zzzz transferiert, wobei dort alle absoluten Adressen, die sich auf den Bereich aaaa bis bbbb beziehen entsprechend der Verschiebung angepasst werden. Das dient typischerweise dazu, um an Adresse xxxx einen Befehl oder eine Programmsequenz einzufügen, wobei sich xxxx dann auf zzzz verschiebt und von xxxx bis zzzz-1 für Ergänzungen frei ist.

D xxxx (yyyy) - Disassembliere (Disassemble)

Erstellt die disassemblierte Ausgabe des Programmcodes beginnend bei Adresse xxxx (optional endend bei yyyy). Mit der Leertaste  kann fortgesetzt werden, beenden wird mit RUN/STOP . Zur besseren Übersicht werden nach BRK, JMP, RTS Trennzeilen (horizontale Linie mit Bindestrichen) ausgegeben.
Etwaige Änderungen bei den Opcodes werden im Bildschirmeditor mit einem abschließendem RETURN  in den Speicher zurück geschrieben.

F aa bb cc ..., xxxx yyyy - Finde Bytes (Find Bytes)

Suche alle Vorkommnisse der Byte-Sequenz aa bb cc ... im Speicherbereich xxxx bis yyyy. An Stelle einer Hexadezimal-Ziffer kann auch ein "*"-Wildcard-Zeichen verwendet werden, um einen beliebigen Nibble-Wert zu treffen.
Im Gegensatz zu den meisten anderen SMON-Kommandos ist bei allen Find-Kommandos die Syntax peinlich genau einzuhalten. D.h. es dürfen keine Leerzeichen zwischen Kommando und den Argumenten vorkommen (mit Ausnahme des F-Kommandos, welches exakt ein Leerzeichen erwartet) und vor dem Adressbereich muss ein Komma angegeben sein.

FAaaaa, xxxx yyyy - Finde absolute Adresse (Find absolute Address)

Suche im Bereich xxxx bis yyyy alle Referenzen auf die Adresse aaaa .
Wichtig: Zwischen "FA" und "aaaa" darf kein Leerzeichen vorkommen.

FRaaaa, xxxx yyyy - Finde relative Sprungbefehle (Find Relative)

Suche im Bereich von xxxx bis yyyy alle relativen Sprungbefehle die auf die Adresse aaaa verweisen.
Wichtig: Zwischen "FR" und "aaaa" darf kein Leerzeichen vorkommen.

FTxxxx yyyy - Finde Tabellen und Daten (Find Table)

Suche im Bereich von xxxx bis yyyy Datenstrukturen, also solche Informationen, die keinem Programm entsprechen (also nicht disassembliert werden können).
Wichtig: Zwischen "FT" und "xxxx" darf kein Leerzeichen vorkommen.

FZaa, xxxx yyyy - Finde Zeropage-Adressen (Find Zero page)

Suche im Bereich von xxxx bis yyyy alle Referenzen auf die Zeropage-Adresse aa.
Wichtig: Zwischen "FZ" und "aa" darf kein Leerzeichen vorkommen.

FIaa, xxxx yyyy - Finde direkt angegebene Werte (Find Immediate)

Suche im Bereich von xxxx bis yyyy alle Befehle mit direkter Adressierung bezogen auf Wert aa.
Wichtig: Zwischen "FI" und "aa" darf kein Leerzeichen vorkommen.

G (xxxx) - Führe aus (Go)

Führe das Maschinenprogramm an Adresse xxxx oder jener des aktuellen PC-Registers, falls nicht angegeben. Sollte das Programm mit einem RTS enden, wird SMON verlassen. Nur ein auf BRK endendes Programm gibt die Kontrolle wieder an SMON zurück.

I xx - Ein-/Ausgabegerät (I/O device)

Legt das Gerät für die Kommandos Load und Save fest. Typische Werte sind 01 für Datasette oder 08 bis 0B für ein Diskettenlaufwerk.

K xxxx (yyyy) - Speicherinhalt kontrollieren

Der Speicherbereich von xxxx bis yyyy wird in ASCII-Darstellung angezeigt. Änderungen können über den C64-Bildschirmeditor durch Überschreiben der Werte übernommen werden.

L"dateiname" (xxxx) - Laden (Load)
Wichtig
Zwischen Kommandoname und "dateiname" darf kein Leerzeichen vorkommen.

Lädt eine Datei names "dateiname" vom Gerät, dass mittels I-Kommando definiert wurde (optional an die Adresse xxxx).

M xxxx (yyyy) - Speicherinhalt anzeigen (Memory dump)

Der Speicherbereich von xxxx bis yyyy wird in hexadezimaler Darstellung zusammen mit ASCII-Zeichendarstellung angezeigt. Änderungen können über den C64-Bildschirmeditor durch Überschreiben der Werte übernommen werden.

O xxxx yyyy zz - Speicherbereich füllen (Occupy)

Füllt den Speicherberich von xxxx bis yyyy mit dem Wert zz.

P xx - Druckgerät festlegen (Printer)

Legt das Gerät, auf dem gedruckt werden soll, fest. Erlaubte Werte für xx sind 04 und 05. Die Ausgabe eines Kommandos wird auf dieses Gerät umgelenkt, wenn das Kommand in Großschreibung (mittels Shift ) angegeben wird.

R - Register

Zeigt den Inhalt der CPU-Register an. Änderungen können über den C64-Bildschirmeditor durch Überschreiben der Werte übernommen werden.

S("dateiname" xxxx yyyy) - Abspeichern (Save)

Der Speicherbereich von xxxx bis yyyy wird mit Dateiname "dateiname" auf das Gerät definiert durch Kommando I abgespeichert. Falls keine Parameter angegeben sind, werden jene des letzten L-Kommandos verwendet.
Wichtig: Zwischen Kommandoname und "dateiname" darf kein Leerzeichen vorkommen.

TW (xxxx) - Einzelschrittausführung (Trace Walk)

Führt den Befehl an Adresse xxxx (bzw. jener des aktuellen PC-Registers) aus (Single-Step), gibt die aktuellen Registerinhalte aus und wartet auf Tasteneingabe. Nächsten Befehl mit beliebiger Taste ausführen, Abbruch mit RUN/STOP . Unterprogrammaufrufe (JSR) können mit Taste J  direkt in Echtzeit durchlaufen werden.

TB xxxx yy - Haltepunkt setzen (Trace Break)

Mit Adresse xxxx wird eine Stelle (Haltepunkt, engl. breakpoint) festgelegt, bei der die CPU stoppen soll, wenn mit TQ-Kommando die Ausführung gestartet wird und die Stelle zum yy+1-ten mal durchlaufen wurde. Dann befindet man sich im Singe-Step-Modus wie beim TW-Kommando.

TQ (xxxx) - Ausführung bis zum Haltepunkt (Trace Quick)

Führt den Code beginnend ab Adresse xxxx (bzw. ab der des aktuellen PC-Registers) aus, bis der Haltepunkt gemäß TB-Kommando erreicht wurde und wechsle in den Single-Step-Modus (siehe TW-Kommando).

TS xxxx (yyyy) - Stoppe aus Ausführung (Trace Stop)

Führt den Code beginnend ab Adresse xxxx aus und stoppt, sobald die Adresse yyyy erreicht wird (funktioniert nur im RAM!).

V xxxx yyyy zzzz aaaa bbbb - Verschiebe Bereich (moVe addresses)

Alle Referenzen im Code von Bereich aaaa bis bbbb, die auf den Bereich xxxx bis yyyy verweisen werden auf den entsprechenden Bereich startend bei zzzz angepasst.

W xxxx yyyy zzzz - Bereich kopieren (Write)

Kopiert ein Speicherinhalt von Bereich xxxx bis yyyy an die Stelle zzzz. Der Inhalt wird nicht verändert und Überlappungen von Quell- und Zielbereich werden korrekt berücksichtigt.

= xxxx yyyy - Bereich vergleichen

Der Speicher beginnend ab Adresse xxxx wird mit jenem an Adresse yyyy verglichen und die Adresse der ersten Abweichung wird ausgegeben.

X - Beenden (eXit SMON)

Beendet SMON und es werden die herkömmlichen C64-Standardfarben eingestellt (aber nicht jene, die beim Aufruf vorhanden waren). Ein erneuter Start ist mit dem richtigen SYS-Befehl möglich (z. B. SYS 49152 für die Version ab Speicheradresse $C000 ).

Konvertier- und Rechenanweisungen
  • # num - Convert Decimal
    Dezimalzahlen in Hexadezimalzahlen umwandeln. Wenn die Zahl aus 8 Bits besteht, wird sie als Dualzahl ebenfalls angezeigt.
  • $ xxxx - Convert Hexadecimal
    Hexadezimalzahl xxxx in Dezimalzahl umwandeln. Wenn die Zahl xxxx aus 8 Bits besteht, wird sie als Dualzahl ebenfalls angezeigt. Auch $ xx (zweistellige Hexadezimalzahl) ist hier möglich.
  • % xxxxxxxx - Convert Binary
    Eine (8 Bit lange!) Dualzahl xxxxxxxx wird als Dezimal- und Hexadezimalzahl angezeigt.
  • ? xxxx + yyyy - Hexadecimal Addition or Subtraction
    Führt einfache Berechnungen aus: Zwei 16-Bit-Hexadezimalzahlen können addiert oder subtrahiert werden. Das Ergebnis wird angezeigt.


Diskettenmonitor[Bearbeiten]

Der Diskettenmonitor von SMON...
  • Z - Aufruf des Diskettenmonitors - Hierbei wechselt die Bildschirmrahmenfarbe nach gelb.
    SMON beistzt einen eingebauten Diskettenmonitor für das Diskettenlaufwerk mit der Geräteadresse #8. Um Probleme mit den Befehlen von SMON zu vermeiden, wird der Diskettenmonitor separat gestartet und beendet.
    Hinweis: Es ist nicht möglich ein anderes Peripherie-Gerät wie eine Festplatte einer Emulationsumgebung oder eine Datasette als Geräteadresse #8 zu definieren und somit zu untersuchen - es muss ein reales Laufwerk bzw. True-Drive-Emulation vorliegen!
    Hierbei sind nur die folgenden Befehle möglich:
  • R (tt ss) - Read Sector
    Liest Track tt und Sektor ss in den Speicher. Falls tt und ss fehlen, der nächste logische (nicht physikalisch vorhandene!) Sektor wird gelesen.
  • W (tt ss) - Write Sector
    Schreibt Track tt und Sektor ss auf eine Diskette. Falls tt und ss fehlen, werden die letzten Parameter vom letzten "Read Sector"-Befehl genutzt.
  • M - Memory Dump
    Zeigt einen Disketten-Sektor aus dem Speicher auf den Bildschirm an. The shift keys can be used to interrupt/continue the display process.
  • @ - Floppy Error Status
    Zeigt den Fehlermeldungskanal des Diskettenlaufwerks (Floppy) an. Falls kein Fehler aufgetreten ist, wird die Meldung 00, OK,00,00 angezeigt.
  • X - Verlässt den Diskettenmonitors (engl. eXit), Rückkehr zum SMON-Monitor, hierbei wird die Bildschirmrahmenfarbe wieder auf Blau gestellt.


Arbeiten mit dem SMON[Bearbeiten]

Eine typische Anwendung des SMON ist die Analyse eines Programms, also Disassemblieren, Speicherbereiche anzeigen und ggf. Suchen von Adressen. Wir schauen uns den Programmcode des SMON einmal etwas genauer an - mit dem SMON! Nach dem Laden, Starten und der Registeranzeige gibt der Monitor einen Punkt als Prompt aus und wartet auf die Eingabe eines Befehls.

Zuerst sehen wir nach, wo das Programm endet. Da das Programmende nach LOAD oder SAVE in $AE/$AF gespeichert wird, geben wir ein M 00A0, drücken einmal die Leertaste und dann RUN/STOP . Der Speicherbereich von $00A0 bis $00AF wird angezeigt und wir lesen das Programmende ab: $CFFB. Zu Beginn jeder Zeile des Speicherbereichs steht ein Doppelpunkt. Dies ist ein versteckter Befehl (hidden command), den SMON ausführt, wenn wir in einer Zeile RETURN  drücken. Eine Änderung bei den hexadezimalen Bytes wird damit übernommen. Die Anzeige der ASCII-Werte rechts dient nur zur Information. Hier ist eine Änderung nicht wirksam. (Beispiel 1)

Nun disassemblieren wir den Beginn des Programms mit D C000 und drücken so oft die Leertaste, bis die Zeile C00D angezeigt ist, bevor wir die Anzeige mit RUN/STOP  beenden. In den ersten fünf Zeilen wird die Adresse $C214 in den Zeiger $0316/$0317 geschrieben und damit der IRQ-Vektor auf eine eigene Routine umgeleitet. Zum Schluss läuft das Programm auf ein BRK und springt damit in die neue IRQ-Routine nach $C214. Will man eigene Programme mit dem SMON schreiben, so sollten sie für das Testen mit dem Monitor auch immer mit einem BRK (Code 00) enden und damit die Kontrolle an SMON zurückgeben. Am Zeilenanfang erkennen wir jeweils ein Komma. Dies ist wieder ein versteckter Befehl (hidden command), der ausgeführt wird, wenn wir in einer der Zeilen RETURN  drücken. Dabei werden Änderungen im rechten Teil mit dem Assembler-Code übernommen. Die Hexadezimal-Bytes davor dienen nur als Information und können nicht geändert werden.
Ab C00B stehen offenbar Daten. Die sehen wir uns jetzt weiter an mit dem Memory-Dump M C00B. Hinter C06B stoppen wir. Der Bereich C00B bis C026 enthält Zeichen, welche die SMON-Befehle darstellen. Von C02B bis etwa C063 folgen Adressen. Dieses sind die Einsprungadressen der Befehls-Routinen in der Form Lowbyte-1/Highbyte. Später werden wir die Befehlsverarbeitungs-Routine suchen. (Beispiel 2)

Zunächst schauen wir aber einmal in die IRQ-Routine des SMON mit D C214. Hier sehen wir, dass die Geräteadressen - 08 für die Floppy, 04 für den Drucker - und dann Hintergrund-, Rahmen- und Zeichenfarbe gesetzt werden (Beispiel 3). Jetzt können wir z.B. die Zeichenfarbe von 3 (Türkis) auf 1 (Weiss) ändern, indem wir in der Zeile C227 die #03 mit #01 überschreiben und die Änderung mit RETURN  übernehmen (Beispiel 4).

Damit diese Änderung wirkt, starten wir den SMON neu mit dem Go-Befehl: G C000. Wollen wir die Änderung dauerhaft machen, können wir den SMON nun speichern mit dem Save-Befehl S"SMON" C000,CFFB (Beispiel 5).

Nun suchen wir die Routine des SMON, die die Befehle verarbeitet. Wir wissen, dass die Befehlszeichen ab C00B liegen. Da wir nicht genau voraussagen können, mit welcher Adresse SMON diese Tabelle anspricht, suchen wir mit Hilfe des Jokers "*": FAC00*,C000 D000. Hier muss die gesuchte Adresse direkt hinter dem Befehl FA stehen, sonst wird nichts gefunden. Nachdem wir gesehen haben, dass in C305 die Adresse C00A benutzt wird, prüfen wir nun noch die Befehlsadressen mit FAC02*,C000 D000. SMON findet zwei Zeilen bei C319 und C31E. Jetzt disassemblieren wir D C305 und sehen die ganze Routine (Beispiel 6).

Erweiterungen / Versionen[Bearbeiten]

Vom SMON gibt es verschiedene Versionen und Anpassungen.

  • SMON Standard
    • SMON ohne Farbänderungen
Da SMON (für die Standardversion mit Disk-Monitor) beim Verlassen des Disk-Monitor-Modus und bei Rückkehr ins BASIC nicht die beim Aufruf vorhandenen Farbeinstellung wieder herstellt, sondern stets jene des Standard-Kernals, könnte dies bei angepassten Kernals mit anderer Farbgebung stören.
Eine SMON-Variante, ohne Änderung der Rahmen-, Hintergrund und Zeichenfarbe erhält man mit folgendem Patch-Progamm, das auf den bereits im Speicher ab $C000 befindlichen SMON anzuwenden ist. Der gepatchte SMON kann dann mit sich selbst abgespeichert werden. Einsteigen mit SYS49152 und abspeichern mit S"SMON-NOCOLOR" C000 D000
1 REM SMON FARB-PATCH
2 B=49152
3 READS,L,F:IFS=0THENPRINT"PATCH ABGESCHLOSSEN.":END
4 FORI=B+STOB+S+L:POKEI,F:NEXT:GOTO3
5 DATA95,0,122,543,12,234,3593,4,234,4038,4,234,0,0,0
  • SMON+
Die Erweiterung SMON+ von Mark Richter erzeugt die Version SMONEX. Der Diskettenmonitor fehlt hier.
Spezielle Befehle:
Z 4000 (5000)
Gibt Bereich binar aus (ein Byte pro Zeile)
H 4000 (5000)
Gibt Bereich binar aus (drei Byte pro Zeile)
N 4000 (5000)
Ausgabe in Bildschirmcode (32 Zeichen pro Zeile)
U 4000 (5000)
Ausgabe in Bildschirmcode (40 Zeichen pro Zeile)
E 4000 (5000)
Füllen des Speicherbereichs mit $00
Y40
Neue SMON-Version ab $4000 erzeugen
Q2000
Kopieren des Zeichensatzes nach $2000
J
Bringt den letzten Ausgabebefehl zuruck
  • FLOPPYMON
FLOPPYMON erzeugt eine Erweiterung des Disk-Monitors. Dafür sind die Trace-Befehle herausgenommen.
Für Einzelheiten siehe die Beschreibung aus dem 64'er SH35.
  • SMON ILLEGAL
Die Disassembler-Erweiterung NDISASS erzeugt die Version SMON ILLEGAL.
Der Disk-Monitor fehlt hier.
Disassemblierung von folgenden illegalen Opcodes ist möglich:
  • LAX entspricht LOA und LOX
  • DCP entspricht DEC und CMP
  • ISC entspricht INC und SBC
  • RLA entspricht ROL und ANO
  • RRA entspricht ROR und ADC
  • SLO entspricht ASL und ORA
  • SRE entspricht LSR und EOR
  • SAX entspricht A AND X, ST A
  • CRA FUhrt zum Absturz des Prozessors
  • NOP Ein-, Zwei- oder Drei-Byte-NOP
Beim Assemblieren werden diese Befehle allerdings nicht berücksichtigt.

Speicherbelegung[Bearbeiten]

Folgende Zeropage-Adressen werden benutzt:

FLAG     $AA    Universalflag
ADRCODE  $AB    Adressierungscode für Assembler/Disassembler
COMMAND  $AC    SMON-Befehlscode
BEFCODE  $AD    Befehlscode Ass./Disass.
LOPER    $AE    Low-Operand für Ass./Disass.
HOPER    $AF    High-Operand für Ass./Disass.
BEFLEN   $B6    Befehlslänge Ass./Disass.
PCL      $FB    SMON-Programmcounter Low-Byte
PCH      $FC    SMON-Programmcounter High-Byte

Außerhalb der Zeropage benutzt SMON die Bereiche:

PCHSAVE  $02A8 
PCLSAVE  $02A9
SRSAVE   $02AA
AKSAVE   $02AB  dienen der Zwischenspeicherung
XRSAVE   $02AC  der angegebenen Register
YRSAVE   $02AD
SPSAVE   $02AE
PRINTER  $02AF  Printer-Nummer
IO.NR    $02B0  Device-Nummer
MEM      $02B1  Buffer bis $02B8
TRACEBUF $02B8  Buffer für Trace-Modus bis $02BF

Dann folgen die vom Diskmonitor benötigten Adressen:

SAVEX    $02C1  Zwischenspeicherung für X- und Y-Register
TMPTRCK  $02C2
TMPSECTO $02C3  Zwischenspeicher für Track und Sektor
DCMDST   $02D0  Diskkommando-String
TRACK    $02D8
SECTO    $02DB  Track und Sektornummer
BUFFER   $033C  Puffer für Label, nur für Assembler

Einsprungadressen von SMON-Routinen:

; (TICK)       $CADB
# (BEFDEC)     $C92E
$ (BEFHEX)     $C908
% (BEFBIN)     $C91c
, (KOMMA)      $C6FC
: (COLON)      $C41D 
; (SEMIS)      $C3B6
= (COMP)       $CAF5
? (ADDSUB)     $C89A
A (ASSMBLER)   $C6D1
B (BASICDATA)  $C96C
C (CONVERT)    $CA3D
D (DISASS.)    $C55D
F (FIND)       $CB11
G (GO)         $C3E3
I (IO.SET)     $C844
K (KONTROLLE)  $CAB7
L (LOADSAVE)   $C84E
M (MEMDUMP)    $C3F9
0 (OCUPPY)     $C9C1
P (SETPRINTER) $C83D
R (REGISTER)   $C386
S (LOADSAVE)   $C84E
T (TRACE)      $CBF1
V (VERSCHIEB)  $CA43
W (WRITE)      $C9D3
X (EXIT)       $C36E
Z (DMON)       $CE09


Artikel und Bücher[Bearbeiten]

  • 64'er Magazin 1984-11, SMON (Teil 1), Seite 59 ff. einschließlich Quelltext auf S.65
  • 64'er Magazin 1984-12, SMON (Teil 2), Seite 60 ff.
  • 64'er Magazin 1985-01, SMON (Teil 3), Seite 69 ff.
  • 64'er Magazin 1985-02, SMON (Teil 4), Seite 72 ff.
  • 64'er Magazin 1985-04, SMON (Teil 5), Seite 64 ff.
  • 64'er Magazin 1985-12 Tips zum SMON, Seite 100 ff.
  • 64'er Sonderheft 8/1985, SMON komplett, Seite 122 ff. / Neues vom SMON, Seite 137 ff.
  • 64'er Sonderheft 35, SMON: der Profi-Monitor, Seite 132 ff. / Kurs "Assembler ist keine Alchemie" S. 6-89
Dieses Sonderheft im praktisch eine Neuauflage des SH08-1985.
  • 64'er Sonderheft 71, SMON - Der Maschinensprachemonitor, Seite 30 ff. / Erweiterungen zum SMON, Seite 34 ff.
Die beiliegende Diskette enthält
17 "SMONPC000",8,1: PRG - entspricht SMONEX
16 "SMONIC000",8,1: PRG - entspricht SMON ILLEGAL
17 "SMONFC000",8,1: PRG - entspricht SMON erweitert mit FLOPPYMON

Weblinks[Bearbeiten]

WP-W11.png Wikipedia: Smon

Quellen[Bearbeiten]

  1. Magic Disk 64: "Assembler-Kurs Teil 3"; 03/1990
  2. SMON Befehlsübersicht zu Power64-Emulator Sprache:deutsch