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 simpler und einfacher Maschinensprachemonitor zum Assemblieren und Disassemblieren. Das Tool erschien in mehreren Teilen als Listing zum Abtippen in den ersten Ausgaben der Computerzeitschrift 64'er in den Jahren 1984/85. Später wurde SMON auch in Sonderheften und Büchern der 64'er bzw. im Markt & Technik Verlag erneut auf Diskette veröffentlicht. Zusätzlich erschien zeitgleich in der 64'er der damals berühmte Assembler-Kurs für Einsteiger: "Assembler ist keine Alchemie" (im Jahr 2004 wurde der komplette Kurs als Buch im skriptorium-Verlag wiederveröffentlicht).

Start[Bearbeiten]

Der Maschinensprachemonitor

Der etwa 4 KByte große Assembler SMON kann z.B. mit dem Befehlseingabe SYS 49152 (für SMON-Versionen ab der Speicheradresse $C000) gestartet werden. Anschließend wird der Bildschirmhintergrund und die Rahmenfarbe auf Blau, die Zeichenfarbe auf türkis gesetzt und folgende Zeilen erscheinen:

   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.


Befehle[Bearbeiten]

Einige Kommandos (D, K, M) haben folgende gleichartige Tastensteuerung:

  • RETURN  oder eine beliebige andere Taste (außer die folgenden Tasten): Darstellung weiterlaufen lassen oder stoppen.
  • Leertaste : Eine weitere Zeile darstellen.
  • RUN/STOP : Kommando beenden.


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 ).


  • # 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.
  • % 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.


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