SMON

Aus C64-Wiki
Zur Navigation springenZur Suche springen
SMON
Startbildschirm
Entwickler Norfried 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 Norfried 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 | Quelltext 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 | Quelltext 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 | Quelltext 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 $80 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 | Quelltext bearbeiten]

Ein- und Ausgabe[Bearbeiten | Quelltext 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 | Quelltext 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)

Lädt eine Programmdatei names "dateiname" vom Gerät, dass mittels I-Kommando definiert wurde (optional an die Adresse xxxx).
Wichtig: Zwischen Kommandoname und "dateiname" darf kein Leerzeichen vorkommen.

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 dem Dateinamen "dateiname" als Programmdatei (incl. Startadresse) auf das Gerät abgespeichert, das mit dem Kommando I definiert wurde. 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 | Quelltext bearbeiten]

Der Diskettenmonitor von SMON...
  • Z - Aufruf des Diskettenmonitors - Hierbei wechselt die Bildschirmrahmenfarbe nach gelb.
    SMON besitzt 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 Block
    Liest den Block von Track tt (hex.) und Sektor ss (hex.) in den Speicher. Falls tt und ss fehlen, wird der nächste logische (nicht physikalisch vorhandene!) Block gelesen.
  • W (tt ss) - Write Block
    Schreibt den Block von Track tt (hex.) und Sektor ss (hex.) auf eine Diskette. Falls tt und ss fehlen, werden die letzten Parameter vom letzten "Read Block"-Befehl genutzt.
  • M - Memory Dump Block
    Zeigt einen eingelesenen Block aus dem Pufferspeicher auf den Bildschirm an. Mit SHIFT  kann die Ausgabe unterbrochen bzw. fortgesetzt werden. Mit CRSR ⇐  kann die Ausgabe zeilenweise fortgesetzt werden.
  • @ - 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 | Quelltext 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 Low-Byte minus 1/High-Byte. 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 (Weiß) ä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).

Fehler[Bearbeiten | Quelltext bearbeiten]

  • Befehl TW ist bei neuen CIA-Versionen mitunter wirkungslos, es kommt nicht zu einem Fortschritt zum nächsten Befehl.
    Ursache ist das veränderte CIA-Timing, da sich bei dem ca. 1986 eingeführten HMOS-2-Herstellungsprozess eine technische Änderung am Timer-Interrupt der CIA ergeben hat. Dabei kommt der Interrupt einen Taktzyklus früher.
    Bei Offset $0D8D wird ein Timer-Wert geladen, der den NMI-Timer genauso lange laufen lässt, dass der Interrupt genau zum Zeitpunkt der Befehlsabarbeitung stattfindet. Erst unmittelbar nach dem Ende der Befehlsabarbeitung wird der Interrupt bedient und dann geht die Kontrolle wieder an den Monitor, wo die Break-Point-Handling-Routine aufgerufen wird.
  • Alt-CIAs:
LDA #$47
  • Neu-CIAs benötigen:
LDA #$49
  • Bei der Disk-Monitor-Erweiterung liest der R-Befehl einen Block in den internen Puffer. Die letzte Pufferposition (Offset $FF) wird allerdings dabei von eiem Wert wie $E0 oder $FF überschrieben. Ein Zurückschreiben des Blocks mittels Befehl "W" würde damit auch das überschriebene Byte mit einem falschen Wert zurück aufs Medium schreiben.

Erweiterungen und Versionen[Bearbeiten | Quelltext bearbeiten]

SMON gibt es in verschiedenen Versionen und mit diversen Anpassungen.

Es befinden sich verschiedenste Varianten von SMON im Umlauf, die nicht immer so ohne weiteres zu unterscheiden sind. Gelegentlich weist ein Kürzel oder Buchstabe beim Dateinamen darauf hin:

Die Varianten im Detail:

  • 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 binär aus (ein Byte pro Zeile)
H 4000 (5000)
Gibt Bereich binär 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 LDA und LDX
  • DCP entspricht DEC und CMP
  • ISC entspricht INC und SBC
  • RLA entspricht ROL und AND
  • 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.
  • TSB.MON
Die SMON-Version für die Basic-Erweiterung TSB liegt am Ende des Basic-RAMs an Adresse $7000. Sie beruht auf der ursprünglichen SMON-Version mit eingebautem Floppy-Monitor. Beim Start von TSB.MON schützt es sich selbst vor Überschreiben durch Strings. In TSB.MON ist das M-Kommando (Memory Dump) geändert worden (s.u.), weshalb der interne Aufbau des Monitors (betrifft die Einsprungadressen der Befehlsroutinen) etwas verändert ist.
Neu sind:
  • Geänderter Befehl M (jetzt auch ohne Parameter)
M setzt die Ausgabe an der zuletzt mit Stop  abgebrochenen Stelle fort.
  • Trennlinie nach dem Opcode RTI
Im ursprünglichen SMON gibt es die Trennlinie nur nach JMP, RTS und BRK.
  • Das vom Kommando I festgelegte Bezugslaufwerk fürs Laden und Speichern gilt auch im Floppy-Monitor.
  • Das von USE in TSB festgelegte Bezugslaufwerk wird beim Start von TSB.MON übernommen. Eine Änderung durch I gilt nur innerhalb des Monitors und wirkt sich nicht auf TSB aus.
  • Beim Verlassen des Monitors stellt TSB.MON die Standardfarben von TSB wieder her.
Geändert hat sich:
  • Die POKE-Adresse für die Farbe des Cursors im Monitor lautet $7221 (Standard: 3, cyan) und für Hintergrund und Rahmen $7219 (Standard: 6, blau).
  • Die POKE-Adresse für den korrekten CIA-Wert beim Trace-Befehl TW lautet $7D86 (Standard: $49, neuere CIAs).
  • Wenn man Speicherstelle $01 auf $36 geändert hatte (RAM unter Basic-ROM an), wird beim Verlassen von TSB.MON der Standardzustand ($37) wieder hergestellt.

Speicherbelegung[Bearbeiten | Quelltext 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 | Quelltext bearbeiten]

Dieses Sonderheft im praktisch eine Neuauflage des SH08-1985.
Die beiliegende Diskette enthält die Versionen:
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 | Quelltext bearbeiten]

WP-W11.png Wikipedia: Smon

Quellen[Bearbeiten | Quelltext bearbeiten]