C 64
Tips und Tricks

Tricks und Tips zum SMON

Neben einer kompletten Befehlsübersicht und allen erforderlichen Einsprungadressen stellen wir Ihnen einen komfortablen Disketten-Monitor und einen Disassembler vor, der auch illegale Opcodes disassembliert.

SMON, der Maschinensprachemonitor, liegt nun seit Ausgabe 4/85 vollständig vor. Damals hatten wir um Kritik und Anregungen gebeten, und das Echo war größer als wir gehofft beziehungsweise befürchtet hatten. Daher wollen wir heute die Fragen beantworten, die am häufigsten gestellt wurden. Außerdem erhalten Sie eine Befehlsübersicht, die nunmehr auch den Diskmonitor mit einschließt, und wichtige Tabellen für die Arbeit mit SMON.

Daß wir inzwischen nicht ganz untätig waren, das zeigen die beiden kleinen Erweiterungen, die Sie ebenfalls in diesem Artikel finden, sozusagen als Treuebonus.

Tatsächlich hatten wir keine Vorstellung von dem, was über uns hereinbrechen sollte. Es gab Tage, an denen das Telefon nicht stillstehen wollte, und wenn wir uns gegen 23.30 Uhr manchmal mit verschlafener Stimme meldeten, dann nur deshalb, weil der erste Anrufer bereits gegen 7.30 Uhr Auskunft haben wollte.

Natürlich haben wir uns einen Teil der Suppe selbst eingebrockt, schließlich war das Fehlerteufelchen durch die ganze Serie hindurch unser treuester Begleiter.

Gefreut hat uns natürlich, wieviel positive Resonanz SMON bei den Lesern der 64’er gefunden hat, und das Lob und die Zustimmung haben uns für viel Mühe und Ärger entschädigt. (Die originellste Danksagung erhielten wir in Form eines gewaltigen Freßpakets — der Leser ist im Hauptberuf Metzger, ein Beispiel, das Schule machen sollte…) Genug der Vorrede, hinein ins Vergnügen. Beginnen wir mit den Korrekturen:

Bereits im zweiten Teil (Ausgabe 12/84) haben wir einen Fehler in der Druckerroutine korrigiert; diese Korrektur scheint aber nicht durchgedrungen zu sein. Der Fehler führt dazu, daß der jeweils letzte Befehl in einem Absatz nicht mit ausgedruckt wird. Sollten Sie Probleme mit dem Drucker haben, listen Sie folgende Zeilen mit M C56C C57B

Sie sollten folgende Ausgabe erhalten: :C56C 09 C9 30 F0 05 C9 21 D0 :C574 1 1 EA 20 94 C4 20 51 03

Wenn das bei Ihnen anders aussieht, müssen Sie Ihre Version durch Überschreiben ändern und danach neu speichern. Die Druckerroutine läuft mit allen uns bekannten Druckern, die an Geräteadresse 4 über den seriellen Bus oder Interface betrieben werden. Leider haben wir keine Erfahrung mit Druckern, die über RS232 und Geräteadresse 2 angesteuert werden.

Ebenfalls schon korrigiert ist ein Fehler im Diskmonitor, der dazu führt, daß beim Einlesen eines Sektors das letzte Byte unterschlagen wird, beim Zurückschreiben aber ein (zufälliges) 256. Byte mitgeschickt wird. Wenn Sie es noch nicht korrigiert haben, geben Sie 0 CED8 CEDC EA ein, damit werden zwei überflüssige Befehle mit NOPs überschrieben.

Einen weiteren und hoffentlich den letzten Programmfehler hat ein aufmerksamer Leser aus Hamburg gefunden. Der Trance-Befehl (TW) hat die unangenehme Eigenschaft, bei jedem Aufruf die Prozessorflags, also das Statusregister, nach eigenem Gutdünken zu verändern. Auch hier haben wir des Guten zuviel getan und ein paar überflüssige Befehle programmiert. Abhilfe schafft
0 CD59 CD5E EA

Die weitaus größere Zahl der Anfragen bezog sich aber nicht auf Fehler, sondern auf die Bedienung von SMON. Viele Leser wollten sich mit unserer geschmackvollen Farbgebung nicht zufrieden geben, anderen paßte es nicht, daß sie bei jedem Abspeichern erst auf Kassettenbetrieb umstellen mußten. SMON setzt nämlich bei jedem BRK alle diese Einstellungen mit konstanter Boshaftigkeit auf die von uns voreingestellten Werte. Dauerhafte Abhilfe schafft deshalb nur eine Änderung der Break-Routine, die wir hier disassembliert und kommentiert darstellen wollen. Geben Sie D C214 C22E ein. Sie erhalten

C214 CLD ; löscht eventuellen Dezimalmodus
C215 LDA #08 ; das ist die Gerätenummer der Floppy
C217 STA 02B0
C21A LDA #04 ; das ist die Gerätenummer des Druckers
C21C STA 02AF
C21F LDA #06 ; Farbe für
C221 STA D020 ; Rahmen und
C224 STA D021 ; Hintergrund
C227 LDA #03 ; Farbe für
0229 STA 0286 ; Zeichendarstellung
C22C LDX #05 ; jetzt werden 6 Werte
C22E PLA ; vom Stack geholt, nämlich die Register

Sie können die Werte mit Ihren Lieblingsfarben, Ihrem Lieblingsdrucker etc. überschreiben und dann ein für allemal auf Ihrem Lieblingsgerätabspeichern.

Weitergehende Änderungen einzelner Routinen lassen sich nachträglich kaum in das bereits abgetippte Programm einbauen. Die von Markt & Technik vertriebene fertige Version von SMON enthält allerdings eine Reihe wichtiger Verbesserungen. So bricht der Vergleichsbefehl nicht mehr bei der ersten Nichtübereinstimmung ab, Änderungen mit dem »K-Befehl« sind inzwischen unkritisch, der Drucker läuft bei allen Befehlen (auch FIND), der Diskmonitor kann alle Diskettenkommandos ausgeben und so weiter. Besonderer Dank gebührt hier Herrn Hans Örtel für seine nicht endenwollende geduldige Kritik, die letztlich zu weiteren Verbesserungen geführt hat. Sollten Sie übrigens zu den glücklichen Besitzern der M&T-Version gehören und nicht die oben dargestellten Fehler im Diskmonitor und Trace-Modus haben, können Sie diese folgendermaßen beheben:

Suchen Sie nach dem Fehler im Diskmonitor mit F A6 90 D0 06, C000 D000 Wenn Sie fündig werden, ist der Fehler vorhanden und Sie müssen ab der angezeigten Adresse 4 Byte mit NOPs ($EA) überschreiben. Genauso können Sie den Fehler im Trace mit F 08 68 8D AA 02 finden. Nur müssen Sie diesmal 5 Byte ab der gefundenen Adresse mit NOPs überschreiben.

Insgesamt gab es einige Schwierigkeiten mit den FIND-Funktionen. Dies ist die einzige Stelle, an der SMON die Einhaltung einer genauen Schreibweise fordert. Während er sonst Komma und Leerzeichen geflissentlich überliest, reagiert er hier recht penibel. Wie Sie wissen, besteht jeder FIND-Befehl aus zwei Buchstaben, der erste ist immer ein »F«. Der zweite ist »A« für absolute Adressen, »Z« für Zeropage-Adressen, »R« für relative Sprünge und »I« für Immediate-Adressierung. Das zweite Zeichen kann aber auch ein Leerzeichen sein, nämlich bei der Suche nach einzelnen Hexbytes. Und dieses Leerzeichen darf auf gar keinen Fall fehlen.

Nach dem Befehl selbst steht, wonach gesucht werden soll, also eine Adresse oder Bytefolge. Diese muß unmittelbar ohne Leerzeichen hinter dem Befehl stehen und mit einem Komma abgeschlossen werden; dann kann die Angabe des zu untersuchenden Bereichs folgen. Wenn sie unterbleibt, wird der gesamte Speicher durchsucht. Bei der Bereichsangabe ist SMON wieder tolerant, Komma und Leerzeichen darf, muß aber nicht sein.

Ein paar Beispiele:

FA D020, C000 D000 Falsch: Space zwischen FA und D020
FAD020 C000 D000 Falsch: Kein Komma nach D020
FAD020, C000 D000 Richtig
F08 68, C000 D000 Falsch: Space nach F fehlt
F 0868, C000 D000 Falsch: Space zwischen den Bytes fehlt
F 08 68 C000 D000 Falsch: Kein Komma nach der Bytefolge
F 08 68, C000, D000 Richtig

Noch einmal: SMON verschieben

Viele Schwierigkeiten gab es beim Verschieben von SMON in einen anderen Speicherbereich. Immerhin waren die nötigen Routinen einschließlich Fehlerteufelchen auch auf drei Ausgaben verteilt. Da konnte man schon mal das eine oder andere übersehen. Deshalb hier noch einmal alles auf einen Blick. Wie gehabt, gehen wirals Beispiel davon aus, daß SMON in den Bereich von $9000 bis $A000 verschoben werden soll. Natürlich geht das für jeden anderen Bereich genauso.

  1. Wir verschieben zuerst das ganze Programm ohne Umrechnen in den neuen Bereich: W C000 CFFA 9000
  2. Nun lassen wir alle absoluten (3-Byte-)Befehle umrechnen. Die Tabellen am Anfang von SMON bleiben verschont: V C000 CFFA 9000 920B 9FD2
  3. Als nächstes ändern wir die High-Bytes der Befehlsadresse. Geben Sie »M 902B 906B« ein und ändern Sie in jedem zweiten Byte das »C« durch Überschreiben in »9«. Vergessen Sie nicht, am Ende jeder Zeile »RETURN« zu drücken, damit Ihre Änderung auch übernommen wird.
  4. Nun sind die Befehle mit Immediate-Adressierung an der Reihe. Sie müssen so geändert werden, daß sie sich auf den neuen Bereich $9… beziehen. Suchen Sie sie mit FIC*,9000 9FFA heraus. Sie erhalten
    9005 LDA #C2 ändern
    9124 CPX #00 nicht ändern
    9386 LDY #C0 ändern
    9441 CMP #C0 nicht ändern
    987F LDX #C3 nicht ändern
    988D LDX #C1 nicht ändern
    9992 LDA #C1 nicht ändern
    9C2C LDA #CC ändern
    9C5B LDA #C2 ändern
    9CF4 LDA #CC ändern
    9DA1 LDX #CC ändern
    9E03 LDA #CC ändern
    9E6C CMP #00 nicht ändern
    9F71 LDY #CF ändern

    Sie sehen, es gibt keine Regel, welche Befehle zu ändern sind und welche nicht. Aus diesem Grunde müssen Sie diese Änderungen »von Hand« vornehmen.

  5. Die Adressen im Diskmonitor müssen ebenfalls umgestellt werden. Dazu geben Sie bitte ein: M 9FD8 9FE4 und ändern Sie jedes zweite Byte wie unter Punkt 3 beschrieben.

Vergessen Sie bitte auf keinen Fall, Ihre neue(n) Version(en) unter neuem Namen zu speichern. Sie lassen sich dann mit LOAD "Name",8,1 von Diskette laden und mit dem entsprechenden SYS (zum Beispiel 36864 bei SMON $9000) starten. Denken Sie auch daran, nach dem Laden und vor dem SYS ein NEW einzugeben, sonst beschwert sich der B-Befehl mit einem OUT OF MEMORY ERROR.

SMON lüftet Geheimnisse

Zwei Erweiterungen haben wir Ihnen zu Beginn angekündigt, die SMON noch leistungsfähiger machen sollen. Dabei handelt es sich einmal um eine Erweiterung des Disassemblers, mit dem nun auch die »illegalen« Opcodes des 6502 disassembliert werden, zum anderen, um neue Funktionen beim Diskmonitor, mit denen Sie in den Innereien Ihrer Floppy herumstöbern können. Nun ist der Speicherplatz bis auf 5 Byte ausgeschöpft, und die 4-KByte-Grenze soll auf keinen Fall überschritten werden. Wir haben daher andere Funktionen herausgenommen, und zwar für die Disassembler-Erweiterung den Diskmonitor und für die Diskmonitor-Erweiterung den Trace-Modus. Beide Erweiterungen sind also nicht gleichzeitig einsetzbar; überhaupt ist es sinnvoll, eigene Versionen für spezielle Anwendungen zusammenzustellen, eine »normale«, eine Spezial-Disk-Version und eine für verschärftes Disassemblieren.

Beginnen wir mit dem letzten: Wie Sie wissen, erscheinen beim Disassemblieren immer drei Sternchen, wenn SMON auf ein Byte trifft, das keinen gültigen 6510-Opcode darstellt. Nun wissen Sie aber vielleicht auch, daß es über den offiziellen Befehlssatz hinaus noch einige Befehle gibt, die der Hersteller des Prozessors zwar nicht dokumentiert hat, die aber nichtsdestotrotz funktionieren und in einigen Programmen auch ausgenutzt werden. (Die 64’er hat in Ausgabe 3/85 darüber berichtet.) Es wäre natürlich schön, wenn SMON auch diese »illegalen« Opcodes anzeigen könnte. Unsere Erweiterung macht’s möglich.

Wir haben Mnemonics für eine Reihe dieser Befehle eingesetzt und lassen diese von SMON mit einem vorangestellten »*« ausgeben. Übrig bleiben noch zehn Befehle, deren Wirkung aber so komplex ist, daß sie sich beim besten Willen nicht mit einem Mnemonic abkürzen lassen. Sie fallen auch aus der Logik der Prozessorstruktur heraus. Im einzelnen handelt es sich um die Opcodes 0B, 2B, 4B, 6B, 8B, 9C, 9E, AB, CB und EB. Bei diesen Befehlen haben wir keine gemeinsame Struktur entdecken können. Nähere Informationen enthält der oben genannte Artikel. Die neuen Mnemonics haben folgende Bedeutung:

LAX Load Akku and X
entspricht LDA und LDX.
DCP Decrement and ComPare
entspricht DEC und CMP.
ISC Increment and SubtraCt
entspricht INC und SBC.
RLA Rotate Left and Akku
entspricht ROL und AND
RRA Rotate Right an Add with carry
entspricht ROR und ADC.
SLO Shift Left OR Akku
entspricht ASL und ORA.
SRE Shift Right and EOR Akku
entspricht LSR und EOR.
SAX Store Akku AND X
führt eine UND-Verknüpfung zwischen Akku und X-Register durch und speichert das Ergebnis in der angegebenen Adresse ab.
CRA CRAsh
führt zum »Absturz« des Prozessors.
NOP NO Operation
entspricht dem bekannten NOP, jedoch kann dieser Befehl auch 2 oder 3 Byte lang sein. Dies wird durch die angegebene Adresse deutlich, die in diesem Fall natürlich keinerlei Bedeutung hat.

Über den Sinn dieser Befehle läßt sich sicher streiten; allerdings kommen sie bisweilen in Programmen vor, meist um das Lesen dieser Programme unmöglich zu machen, also als Programmschutz. Von der Verwendung dieser Befehle in eigenen Programmen raten wir auf jeden Fall ab. Erstens wird kein Hersteller garantieren, daß die »illegalen« tatsächlich mit jedem 6510-Prozessor funktionieren, zweitens gibt es keine Funktion, die nicht auch mit den »normalen« Befehlen ebenso gut erreicht werden könnte. Und als Programmschutz taugen die »illegalen« spätestens mit der Veröffentlichung dieses Artikels ja auch nichts mehr. Aus diesem Grund haben wir bewußt auf eine Erweiterung des Assemblers in dieser Richtung verzichtet. Sie können also keine normalen Opcodes durch Überschreiben in »illegale« ändern, wohl aber umgekehrt. Es bleibt lediglich die Eingabe als Einzelbyte, was aber hoffentlich zu umständlich ist.

Komfortabler Disketten-Monitor für SMON

Jetzt folgt unser zweiter Leckerbissen in Form eines kleinen aber ungemein wertvollen Zusatzprogrammes für den SMON. Es handelt sich dabei um eine Erweiterung des Disketten-Monitors, mit dem jeder auf einen Schlag die Arbeit von Stunden zunichte machen kann. Geben Sie das Programm wie beschrieben ein, starten Sie SMON wie gewohnt und springen mit »Z« in den Disketten-Monitor. Von hieraus erreichen Sie mit »F« (wie Floppy) die neuen Befehle. Wir haben absichtlich diesen umständlichen Weg gewählt, denn Fehler in diesem Modus wirken noch dramatischer als sonst. Mit diesem Werkzeug haben Sie unmittelbaren Zugriff auf die Eingeweide der Floppy. Jetzt können Sie die folgenden Befehle mit einer Übungsdiskette (!!!) in aller Ruhe durcharbeiten.

M Memory-Dump des Disketten-Monitors
Beispiel: M (ohne weitere Eingabe) listet den Bereich des Floppy-RAM von $0000-$00FF. (Es erscheint zunächst die erste Zeile, weitere Ausgabe mit der SPACE-Taste.)

In diesem Bereich befinden sich unter anderem die Jobspeicher ($00-$04) für die fünf Puffer 0-4, sowie die wichtigsten Variablen des DOS.

M 07 Memory-Dump ab $0700

Die BAM der Diskette wird nach dem Initialisieren in Puffer 4 ($0700 im Floppy-RAM) eingelesen. Schauen Sie sich also mit»M07« die aktuelle BAM an. Sie könnten jetzt durch einfaches Überschreiben den Inhalt der BAM ändern. (Der Doppelpunkt vor der Zeile wirkt als »hidden command«). Dann schauen Sie sich Ihre Änderung mit »M 07« wieder an. Sie sehen, daß inzwischen der Inhalt des Floppy-RAM geändert wurde. Wenn Sie nun den Jobcode »90« (=Schreibbefehl an den Floppy-Controller) in Speicherstelle $04 bringen, würde die geänderte (falsche!) BAM auf Diskette zurückgeschrieben werden!! Es gibt also genug Möglichkeiten, wie oben angedeutet, die Disketten zu »versauen«.

Für das Ausprobieren noch einige wichtige Speicherstellen und Jobcodes:

$80 Lesen
$90 Schreiben
$C0 »Anschlagen« des Kopfes
$D0 Maschinenprogramme im Puffer ausführen
$E0 Programm im Puffer ausführen mit Hochfahren des Laufwerks

Speicherstellen im Floppy-RAM:

$06/$07 ist Spur- und Sektornummer für den Befehl in Puffer 0
$08/$09 für Puffer 1
$0A/$0B für Puffer 2
$0C/$0D für Puffer 3
$0E/$0F für Puffer 4

Jedem Puffer sind zwei Speicherstellen zugeordnet, eine für den Jobcode ($0000 bis $0004) und eine für Spur und Sektor. Wenn Sie also in Puffer 0 (in $0300 gelegen) einen bestimmten Block einlesen wollen, geben Sie folgende Befehle ein:

»M« liest die Zeropage der Floppy ein - so sehen dann zum Beispiel die ersten Zeilen aus: :0000 01 01 01 FF 03 04 01 34 :0008 23 02 04 50 01 03 0A 11

Gehen Sie mit dem Cursor in die erste Zeile und schreiben Sie »80« in die erste Speicherstelle (anstelle der ersten 01). In Speicherstelle $06/$07 (die letzten beiden in der ersten Reihe) die Spur- und die Sektornummer, die gelesen werden soll, zum Beispiel 12 01. Sie sehen dann :0000 80 01 01 FF 03 04 12 01 :0008 unverändert

Drücken Sie die RETURN-Taste, mit »M 03« kann jetzt der eingelesene Block (hier der erste Directory-Block) angesehen werden. Änderungen können durch einfaches Überschreiben vorgenommen werden. Dauerhaft wird Ihre Änderung erst durch Zurückschreiben (nach Spur $12 und Sektor $01) mit dem Jobcode »90« in der ersten Speicherstelle. Nach Änderung der beiden für Puffer 0 zuständigen Adressen ($06/$07) auch an jede beliebige andere Stelle. Das ist wörtlich zu nehmen. Denn wir befinden uns hier »unterhalb« der Controllerebene, die unter anderem für die Prüfung auf Einhaltung der zulässigen Spur und Sektorgrenzen verantwortlich ist. Es erfolgt also keine Fehlermeldung, wenn Sie versuchen sollten, mit Ihrer Floppy bis in die des Nachbarn zu schreiben (zum Beispiel mit der Spur 152).

Entsprechende Lese- und Schreibübungen können mit den anderen Puffern durchgeführt werden. Denken Sie daran, erst ist die Spur- beziehungsweise Sektornummer für den entsprechenden Puffer (in der zweiten Zeile!) einzugeben, bevor Sie in Zeile 1 den Jobcode mit einem »RETURN« übergeben. Denn mit Druck auf die RETURN-Taste wird Ihr Befehl ausgeführt. Und noch eins: Quälen Sie bitte dabei Ihren Schreibkopf nicht mehr als unbedingt erforderlich, sonst könnte er sich mechanisch verklemmen und nur noch mit einem Eingriff in die Floppymechanik wieder »befreit« werden.

Falls Sie die Ausgaben 1/85 (Seite 151) und 3/85 (Seite 103 bis 135) der 64’er besitzen, können Sie sich dort über andere Speicherstellen der Floppy und die weitere Anwendung der Jobcodes informieren.

Der Befehl @ ohne weitere Angaben fragt den Fehlerkanal ab, ansonsten dient er zur Befehlsübermittlung an die Floppy.

Beispiel: @ Fehlerkanal
@I Initialisierungsbefehl oder
@S:name Befehl zum Scratchen
und so weiter.

Bedingt durch die verschiedenen Versionen, springt dieser Befehl manchmal in den »normalen« Disketten-Monitor zurück, erkennbar an dem »*« am Zeilenanfang. Sie müssen dann wieder ein »F« eingeben.

Mit X gelangt man wieder in den Disketten-Monitor.

Zum Abschluß ein sehr hilfreicher Befehl namens »V«, der es erlaubt, Speicherbereiche aus dem Computer in den Laufwerkspuffer zu verschieben. Folgende einfache Syntax gilt dabei: V von nach

Um zum Beispiel ein Maschinenprogramm von $6000 in den Puffer 1 zu bekommen, geben Sie folgendes ein: V 6000 0400

Dabei wird immer eine ganze Seite, also 256 Byte, übertragen. Was das Programm dort soll, fragen Sie? Führen Sie es doch einfach aus (Jobcode $D0 in Speicherstelle $01 schreiben); oder schreiben Sie es mit dem Jobcode »90« in einen beliebigen Sektor der Diskette.

Wenn Sie dann Ihre Floppy so richtig durcheinander gebracht haben, und nichts läuft mehr, brauchen Sie nicht zu verzweifeln. Außer einem eventuell festhängenden Lesekopf passiert der Floppy nichts, nur Ihren Disketten.

Tippen Sie die beiden Erweiterungsprogramme (Listing 1 und 2 beziehungsweise bei der M&T-Version Listing 3 und 4) mit dem MSE-Programm ab und speichern Sie die fertigen Programme. Die Programme für die M&T-Version haben sinnigerweise ein M&T im Namen.

Laden und starten Sie dann Ihren SMON $C000. Geben Sie ein: L"NDISASS"

Damit werden die neuen Befehle automatisch über den bisherigen Disketten-Monitor geladen. Sie müssen nun aber noch aktiviert werden. Geben Sie dazu G CF0D ein.

Hinweise zum Abtippen

SMON meldet sich sofort mit seiner Registeranzeige wieder. Sie sollten nun diese Version unbedingt abspeichern, zum Beispiel mit S"SMON NDISASS" C000 CF3D

Wenn Sie nun das Programm »ILLEGAL-CODE« (Listing 5) laden und mit D 4000 disassemblieren, sehen Sie die »illegalen« Opcodes schön geordnet nacheinander.

Um die neuen Befehle des Disketten-Monitors in SMON einzubinden, gehen Sie ganz ähnlich vor. Nach dem Abtippen und Speichern des Programms »FLOPPYMON« muß natürlich SMON C000 geladen und gestartet werden. Anschließend

Zum Abspeichern geben Sie S"SMON-FLOPPY" C000 CFFF ein. Das gilt für beide Versionen.

(Dietrich Weineck/ah)

Bei allen Ausgabe-Befehlen ist gleichzeitig die Ausgabe auf einem Drucker möglich. Dazu werden die Befehle geSHIFTet eingegeben.

A 4000 (Assembler)
symbolischer Assembler (Verarbeitung von Label möglich) Startadresse $4000
B 4000 4200 (Basic-Data)
erzeugt Basic-DATA-Zeilen aus Maschinenprogramm im Bereich von $4000 bis $41FF
C 4010 4200 4013 4000 4200 (Convert)
in ein Programm, das von $4000 bis $4200 im Speicher steht, soll bei 4010 ein 3-Byte-Befehl eingefügt werden. Dazu wird das Programm ab $4010 bis 4200 auf die neue Adresse $4013 verschoben. Alle absoluten Adressen, die innerhalb des Programmbereichs ($4000 bis $4200) stehen, werden umgerechnet, so daß die Sprungziele stimmen.
D 4000 (4100) (Disassembler)
disassembliert den Bereich von $4000 (bis $4100) mit Ausgabe der Hex-Werte. Änderungen sind durch Überschreiben der Befehle möglich.
F (Find)
findet Zeichenketten (F), absolute Adressen (FA), relative Sprünge (FR), Tabellen (FT), Zeropageadressen (FZ) und Immediate-Befehle (FI)
G (4000) (Go)
startet ein Maschinenprogramm, das bei $4000 im Speicher beginnt
I 01 (I/O-Gerät)
stellt die Gerätenummer für Floppy (08 oder 09) oder Datasette (01) ein
K A000 (A500) (Kontrolle)
zum schnellen Durchsuchen des Bereichs von $A000 (bis $A500) nach ASCII-Zeichen (32 Byte pro Zeile). Änderungen sind durch Überschreiben der ASCII-Zeichen möglich.
L (4000) (Load)
lädt ein Maschinenprogramm an die richtige oder eine angegebene Adresse ($4000)
M 4000 (4400) (Memory-Dump)
gibt den Inhalt des Speichers von $4000 (bis $43FF) in Hex-Byte und ASCII-Code aus. Änderungen sind durch Überschreiben der Hex-Zahlen möglich.
0 4000 4500 AA (Occupy)
füllt den Speicherbereich von $4000 bis $4500 mit vorgegebenem Byte ($AA) aus
P 05 (Printer)
setzt Geräteadresse 5 für Drucker
R (Register)
zeigt die Registerinhalte und Flags an. Änderungen sind durch Überschreiben möglich.
S »Test« 4000 5000 (Save)
speichert ein Programm von $4000 bis $4FFF unter dem Namen »Test« ab.
TW (4000) (Trace Walk)
führt auf Tastendruck den jeweils nächsten Maschinenbefehl aus und zeigt die Registerinhalte an. Subroutinen können in Echtzeit durchlaufen werden (»J«). Wird keine Startadresse eingegeben, beginnt >TW« bei der letzten mit »R« angezeigten Adresse.
TB 4010 05 (Trace Break)
setzt einen Haltepunkt für den Schnellschrittmodus bei $4010. Der Schnellschrittmodus wird unterbrochen, nachdem $4010 zum fünften Mal erreicht worden ist.
TQ 4000 (Trace quick)
Schnellschrittmodus, springt beim Erreichen eines Haltepunktes in den Einzelschrittmodus.
TS 4000 4020 (Trace stop)
arbeitet ein Programm ab $4000 in Echtzeit ab und springt beim Erreichen von $4020 in die Registeranzeige. Von dort aus kann (nach eventueller Änderung der Register) mit »G« oder »TW« fortgefahren werden. »TS« arbeitet nur im RAM-Speicher.
V 6000 6200 4000 4100 4200 (Verschieben)
ändert in einem Programm von $4100 bis $41FF alle absoluten Adressen, die sich auf den Bereich von $6000 bis $6200 beziehen, auf einen neuen Bereich, der bei $4000 beginnt.
W 4000 4300 5000 (Write)
verschiebt den Speicherinhalt von $4000 bis $42FF nach $5000 ohne Umrechnung der Adressen (zum Beispiel Tabellen)
X (Exit)
springt aus dem Monitor-Programm ins Basic zurück
# 49152
Dezimalzahl umrechnen
$ 002B
4stellige Hex-Zahl umrechnen
% 01101010
8stellige Binärzahl umrechnen
? 0344 + 5234
Addition oder Subtraktion zweier 4stelliger Hex-Zahlen
= 4000 5000 (Vergleich)
vergleicht den Speicherinhalt ab $4000 mit dem ab $5000
Z (Diskmonitor)
ruft den Diskmonitor auf. Dieser verfügt über folgende Befehle:
R (12 01) (Read)
liest Track $12, Sektor $01 von der Diskette in einen Puffer im Speicher. Fehlt die Angabe von Track und Sektor, wird der logisch (!) nächste Sektor gelesen.
W (12 01) (Write)
schreibt den Puffer im Speicher nach Track $12, Sektor $01 auf die Diskette. Ohne Angabe von Track und Sektor werden die letzten Eingaben von »R« benutzt.
M (Memory-Dump)
zeigt den Pufferinhalt als Hexdump (wie normales »M«), Weitere Ausgabe mit CBM-Taste, Abbruch mit STOP. Werte können durch Überschreiben geändert werden.
X (Exit)
springt in SMON zurück
F (weitere Disketten-Befehle initialisieren)
sind die Befehle initialisiert, gilt:
M (07)
Memory-Dump (Floppy-RAM/ROM)
V 6000 0400
Verschieben eines 256-Byte-Blocks von $6000 in den Laufwerkspuffer 1 beziehungsweise in das Floppy-RAM
@ normale Disketten-Befehle senden
X zurück zum normalen Disketten-Monitor
Befehlsübersicht zum SMON
Die Angaben in Klammern beziehen sich auf die M&T-Version
; (TICK) $CADB ($CACF)
# (BEFDEC) $C92E ($C92F)
$ (BEFHEX) $C908 ($C909)
% (BEFBIN) $C91C ($C910)
, (KOMMA) $C6FC ($C6B1)
: (COLON) $C41D ($C40B)
; (SEMIS) $C3B6 ($C3A0)
= (COMP) $CAF5 ($CaE9)
? (ADDSUB) $C89A ($C89B)
A (ASSMBLER) $C6D1 ($C6BC)
B (BASICDATA) $C96C ($C96D)
C (CONVERT) $CA3D ($CA32)
D (DISASS.) $C55D ($C542)
F (FIND) $CB11 ($CB0C)
G (GO) $C3E3 ($C3CD)
I (IO.SET) $C844 ($C830)
K (KONTROLLE) $CAB7 ($CAAC)
L (LOADSAVE) $C84E ($C83A)
M (MEMDUMP) $C3F9 ($C3E3)
O (OCUPPY) $C9C1 ($C9C2)
P (SETPRINTER) $C83D ($C829)
R (REGISTER) $C386 ($C370)
S (LOADSAVE) $C84E ($C83A)
T (TRACE) $CBF1 ($CBEC)
V (VERSCHIEB) $CA43 ($CA38)
W (WRITE) $C9D3 ($C9D4)
X (EXIT) $C36E ($C369)
Z (DMON) $CE09 ($CDFE)
Einsprungadressen von SMON-Routinen
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 dienen der Zwischenspeicherung der angegebenen Register
PCLSAVE $02A9
SRSAVE $02AA
AKSAVE $02AB
XRSAVE $02AC
YRSAVE $02AD
SPSAVE $02AE
PRINTER $02AF Printernummer
IO.NR $02B0 Devicenummer
MEM $02B1 Buffer bis $02B8
TRACEBUF $02B8 bis $02BF Buffer für Trace-Modus
Dann folgen die von Diskmonitor benötigten Adressen.
SAVEX $02C1 Zwischenspeicherung der X- und Y-Register
TMPTRCK $02C2
TMPSECTO $02C3 Zwischenspeicher für Track und Sektor
DCMDST $02D0 Diskkommandostring
TRACK $02D8
SECTO $02DB Track und Sektornummer
BUFFER $033C bis $03FC Buffer für Label, nur für Assembler
SMON-Speicherstellen
PROGRAMM : NDISASS        CE09 CF3F
-----------------------------------
CE09 : 2B 4B 6B 8B 9B AB BB CB   C4
CE11 : EB 89 93 9F 0B 9C 9E 4E   46
CE19 : 53 52 53 52 53 4C 44 49   F0
CE21 : 43 4F 4C 4C 52 52 41 41   E8
CE29 : 43 53 52 50 4F 41 45 41   4B
CE31 : 58 58 50 43 41 25 26 20   48
CE39 : 21 82 80 81 22 21 82 81   24
CE41 : 03 13 07 17 1B 0F 1F 97   48
CE49 : D7 BF DF 02 02 02 02 03   76
CE51 : 03 03 02 02 03 03 A2 02   6E
CE59 : D0 28 A6 AD D0 2B A2 01   90
CE61 : B1 FB C9 9C F0 38 C9 80   0F
CE69 : F0 EC C9 89 F0 E8 29 0F   8C
CE71 : C9 02 F0 16 C9 0A F0 0A   FF
CE79 : E8 C9 04 F0 05 E8 C9 0C   3C
CE81 : D0 1C 86 B6 A2 01 8E C5   D0
CE89 : 02 60 B1 FB 29 90 49 80   E4
CE91 : D0 04 A2 02 D0 EC 86 B6   48
CE99 : A2 0A 8E C5 02 60 A0 02   46
CEA1 : 84 B6 A0 00 8C C5 02 B1   0B
CEA9 : FB A2 0F DD 08 CE F0 D9   E3
CEB1 : CA D0 F8 29 01 F0 D2 B1   8D
CEB9 : FB 4A 4A 4A 4A 4A 18 69   DF
CEC1 : 02 8D C5 02 A2 0B B1 FB   7D
CEC9 : 3D 40 CE DD 40 CE F0 03   DA
CED1 : CA D0 F3 BD 35 CE 85 AB   EF
CED9 : BD 4B CE 85 B6 60 A0 00   91
CEE1 : A6 AD F0 06 20 4C C3 4C   67
CEE9 : DA C5 AE C5 02 D0 06 20   09
CEF1 : 4C C3 4C C9 C5 A9 2A 20   FE
CEF9 : D2 FF BD 17 CE 20 D2 FF   56
CF01 : BD 21 CE 20 D2 FF BD 2B   81
CF09 : CE 4C 16 C6 A9 00 8D 6B   03
CF11 : C0 8D 6C C0 A9 4C 8D 29   50
CF19 : C5 8D BE C5 A9 20 8D 30   3F
CF21 : CD A9 5B 8D 2A C5 A9 CE   60
CF29 : 8D 2B C5 A9 DF 8D BF C5   E7
CF31 : 8D 31 CD A9 CE 8D C0 C5   E7
CF39 : 8D 32 CD 00 FF B2         3A
Listing 1. Mit dieser Erweiterung lassen sich illegale Opcodes disassemblieren
PROGRAMM : FLOPPYMON      CBF1 CDEF
-----------------------------------
CBF1 : A9 36 85 01 A2 00 BD B2   BD
CBF9 : CD F0 06 20 D2 FF E8 D0   36
CC01 : F5 20 51 C3 A2 3E 20 40   F0
CC09 : C3 20 CF FF C9 3E F0 F9   16
CC11 : C9 20 F0 F5 A2 05 DD C8   40
CC19 : CD F0 09 CA D0 F8 20 51   F2
CC21 : C3 4C 05 CC 8A 0A AA E8   5B
CC29 : BD CC CD 48 CA BD CC CD   32
CC31 : 48 60 20 C2 C2 D0 0A A9   38
CC39 : 00 8D C0 CD 8D C1 CD F0   EA
CC41 : 1A 20 8D C2 8D C1 CD 20   85
CC49 : C2 C2 D0 07 A9 00 8D C0   D4
CC51 : CD F0 08 20 8D C2 29 F8   22
CC59 : 8D C0 CD 20 77 CD A2 0F   4C
CC61 : 20 C9 FF A2 00 BD BD CD   3A
CC69 : 20 D2 FF E8 E0 06 90 F5   7C
CC71 : 20 CC FF A2 0F 20 C6 FF   59
CC79 : A0 00 20 CF FF 99 00 BF   68
CC81 : C8 D0 F7 20 CC FF 4C BC   2B
CC89 : CF A9 BF 85 FC A9 00 85   F5
CC91 : FB 60 20 33 CC 20 8A CC   BC
CC99 : A2 3A 20 40 C3 AD C1 CD   B5
CCA1 : 20 2A C3 AD C0 CD 20 2A   CC
CCA9 : C3 A0 20 A2 00 20 4C C3   D2
CCB1 : 20 4C C3 A1 FB 20 2A C3   0D
CCB9 : A1 FB 20 39 C4 D0 F1 A9   75
CCC1 : 08 18 6D C0 CD 8D C0 CD   31
CCC9 : 08 C9 F8 D0 06 20 5C CC   7A
CCD1 : 20 8A CC 28 90 09 EE C1   FF
CCD9 : CD 20 5C CC 20 8A CC 20   31
CCE1 : 87 CD 20 E1 FF D0 B1 4C   79
CCE9 : 02 CC 20 7E C2 A5 FB 8D   8E
CCF1 : C6 CD A5 FC 8D C7 CD 20   35
CCF9 : 19 CD A0 20 A2 00 20 CA   65
CD01 : C2 20 CA C2 20 9A C2 20   00
CD09 : D2 FF 20 39 C4 D0 F2 20   E9
CD11 : CC FF 20 BC CF 4C 07 CC   92
CD19 : 20 77 CD A2 0F 20 C9 FF   D6
CD21 : A2 00 BD C3 CD 20 D2 FF   D4
CD29 : E8 E0 06 90 F5 60 20 7E   F5
CD31 : C2 A2 FD 20 80 C2 A5 FD   78
CD39 : 8D C6 CD A5 FE 8D C7 CD   68
CD41 : A9 20 8D C8 CD 20 19 CD   55
CD49 : A0 00 B1 FB 20 D2 FF C8   FF
CD51 : C0 20 90 F6 18 A9 20 6D   4E
CD59 : C6 CD B0 0C 8D C6 CD A9   4D
CD61 : 20 65 FB 85 FB 4C 46 CD   BA
CD69 : 20 CC FF 20 BC CF A9 08   F4
CD71 : 8D C8 CD 4C 02 CC A9 0F   AB
CD79 : A8 A2 08 20 BA FF A9 00   CB
CD81 : 20 BD FF 4C C0 FF 20 E4   60
CD89 : FF F0 FB 60 20 C2 C2 D0   D0
CD91 : 03 4C 86 CF A9 08 20 B1   15
CD99 : FF A9 6F 20 93 FF 20 CF   A6
CDA1 : FF 20 A8 FF C9 0D D0 F6   11
CDA9 : 20 AE FF 4C 02 CC 4C 09   74
CDB1 : CE 0D 3E 46 4C 4F 50 2D   39
CDB9 : 4D 4F 4E 00 4D 2D 52 00   C9
CDC1 : 00 FF 4D 2D 57 00 00 08   3F
CDC9 : 3A 4D 56 40 58 EA CC 92   7D
CDD1 : CC 2E CD 8C CD AE CD A9   96
CDD9 : 00 8D 22 C0 A9 46 8D D7   F3
CDE1 : CF A9 CB 8D E3 CF A9 F0   6F
CDE9 : 8D E2 CF 00 00 16         63
Listing 2. Komfortabler Disketten-Monitor. Bitte beachten Sie die Eingabehinweise auf Seite 54.
PROGRAMM : NDISASS M&T    CE09 CF3F
-----------------------------------
CE09 : 2B 4B 6B 8B 9B AB BB CB   C4
CE11 : EB 89 93 9F 0B 9C 9E 4E   46
CE19 : 53 52 53 52 53 4C 44 49   F0
CE21 : 43 4F 4C 4C 52 52 41 41   E8
CE29 : 43 53 52 50 4F 41 45 41   4B
CE31 : 58 58 50 43 41 25 26 20   48
CE39 : 21 82 80 81 22 21 82 81   24
CE41 : 03 13 07 17 1B 0F 1F 97   48
CE49 : D7 BF DF 02 02 02 02 03   76
CE51 : 03 03 02 02 03 03 A2 02   6E
CE59 : D0 28 A6 AD D0 2B A2 01   90
CE61 : B1 FB C9 9C F0 38 C9 80   0F
CE69 : F0 EC C9 89 F0 E8 29 0F   8C
CE71 : C9 02 F0 16 C9 0A F0 0A   FF
CE79 : E8 C9 04 F0 05 E8 C9 0C   3C
CE81 : D0 1C 86 B6 A2 01 8E C5   D0
CE89 : 02 60 B1 FB 29 90 49 80   E4
CE91 : D0 04 A2 02 D0 EC 86 B6   48
CE99 : A2 0A 8E C5 02 60 A0 02   46
CEA1 : 84 B6 A0 00 8C C5 02 B1   0B
CEA9 : FB A2 0F DD 08 CE F0 D9   E3
CEB1 : CA D0 F8 29 01 F0 D2 B1   8D
CEB9 : FB 4A 4A 4A 4A 4A 18 69   DF
CEC1 : 02 8D C5 02 A2 0B B1 FB   7D
CEC9 : 3D 40 CE DD 40 CE F0 03   DA
CED1 : CA D0 F3 BD 35 CE 85 AB   EF
CED9 : BD 4B CE 85 B6 60 A0 00   91
CEE1 : A6 AD F0 06 20 43 C3 4C   1E
CEE9 : BE C5 AE C5 02 D0 06 20   ED
CEF1 : 43 C3 4C AD C5 A9 2A 20   71
CEF9 : D2 FF BD 17 CE 20 D2 FF   56
CF01 : BD 21 CE 20 D2 FF BD 2B   81
CF09 : CE 4C F8 C5 A9 00 8D 60   86
CF11 : C0 8D 61 C0 A9 4C 8D 10   5C
CF19 : C5 8D A2 C5 A9 20 8D 28   28
CF21 : CD A9 5B 8D 11 C5 A9 CE   CF
CF29 : 8D 12 C5 A9 DF 8D A3 C5   EA
CF31 : 8D 29 CD A9 CE 8D A4 C5   73
CF39 : 8D 2A CD 00 FF 13         FA
Listing 3. Illegale Opcodes disassemblieren mit der M&T-Version des SMON
PROGRAMM : FLOPPYMON M&T  CBF1 CDCD
-----------------------------------
CBF1 : A9 36 85 01 A2 00 BD 90   79
CBF9 : CD F0 06 20 D2 FF E8 D0   36
CC01 : F5 20 48 C3 A2 3E 20 37   9C
CC09 : C3 20 CF FF C9 3E F0 F9   16
CC11 : C9 20 F0 F5 A2 05 DD A6   FC
CC19 : CD F0 09 CA D0 F8 20 48   E0
CC21 : C3 4C 05 CC 8A 0A AA E8   5B
CC29 : BD AA CD 48 CA BD AA CD   99
CC31 : 48 60 20 B9 C2 D0 0A A9   17
CC39 : 00 8D 9E CD 8D 9F CD F0   50
CC41 : 1A 20 84 C2 8D 9F CD 20   32
CC49 : B9 C2 D0 07 A9 00 8D 9E   86
CC51 : CD F0 08 20 84 C2 29 F8   91
CC59 : 8D 9E CD 20 77 CD A2 0F   3B
CC61 : 20 C9 FF A2 00 BD 9B CD   B2
CC69 : 20 D2 FF E8 E0 06 90 F5   7C
CC71 : 20 CC FF A2 0F 20 C6 FF   59
CC79 : A0 00 20 CF FF 99 00 BF   68
CC81 : C8 D0 F7 20 CC FF 4C C4   3B
CC89 : CF A9 BF 85 FC A9 00 85   F5
CC91 : FB 60 20 33 CC 20 8A CC   BC
CC99 : A2 3A 20 37 C3 AD 9F CD   0B
CCA1 : 20 21 C3 AD 9E CD 20 21   13
CCA9 : C3 A0 20 A2 00 20 43 C3   AE
CCB1 : 20 43 C3 A1 FB 20 21 C3   65
CCB9 : A1 FB 20 20 C4 D0 F1 A9   52
CCC1 : 08 18 6D 9E CD 8D 9E CD   64
CCC9 : 08 C9 F8 D0 06 20 5C CC   7A
CCD1 : 20 8A CC 28 90 09 EE 9F   BB
CCD9 : CD 20 5C CC 20 8A CC 20   31
CCE1 : 87 CD 20 E1 FF D0 B1 4C   79
CCE9 : 02 CC 20 75 C2 A5 FB 8D   6C
CCF1 : A4 CD A5 FC 8D A5 CD 20   02
CCF9 : 19 CD A0 20 A2 00 20 C1   53
CD01 : C2 20 C1 C2 20 91 C2 20   76
CD09 : D2 FF 20 20 C4 D0 F2 20   C6
CD11 : CC FF 20 C4 CF 4C 07 CC   93
CD19 : 20 77 CD A2 0F 20 C9 FF   D6
CD21 : A2 00 BD A1 CD 20 D2 FF   90
CD29 : E8 E0 06 90 F5 60 20 75   E3
CD31 : C2 A2 FD 20 77 C2 A5 FD   E8
CD39 : 8D A4 CD A5 FE 8D A5 CD   CF
CD41 : A9 20 8D A6 CD 20 19 CD   10
CD49 : A0 00 B1 FB 20 D2 FF C8   FF
CD51 : C0 20 90 F6 18 A9 20 6D   4E
CD59 : A4 CD B0 0C 8D A4 CD A9   1A
CD61 : 20 65 FB 85 FB 4C 46 CD   BA
CD69 : 20 CC FF 20 C4 CF A9 08   75
CD71 : 8D A6 CD 4C 02 CC A9 0F   9A
CD79 : A8 A2 08 20 BA FF A9 00   CB
CD81 : 20 BD FF 4C C0 FF 20 E4   60
CD89 : FF F0 FB 60 4C FE CD 0D   19
CD91 : 3E 46 4C 4F 50 2D 4D 4F   32
CD99 : 4E 00 4D 2D 52 00 00 FF   05
CDA1 : 4D 2D 57 00 00 08 3A 4D   1F
CDA9 : 56 58 40 EA CC 92 CC 2E   8A
CDB1 : CD 8C CD 76 CF A9 00 8D   6C
CDB9 : 22 C0 A9 46 8D DF CF A9   D9
CDC1 : CB 8D EB CF A9 F0 8D EA   76
CDC9 : CF 00 00 8D               B5
Listing 4. Komfortabler Disketten-Monitor für die M&T-Version
PROGRAMM : ILLEGAL-CODE   4000 40F6
-----------------------------------
4000 : 87 87 C7 C7 E7 E7 A7 A7   E1
4008 : 27 27 67 67 07 07 47 47   DE
4010 : D7 D7 F7 FF 37 AA 17 60   B6
4018 : 57 20 97 13 B7 20 8F 0F   A0
4020 : CF CF 01 8F EF 20 0C AF   99
4028 : 19 20 2F 24 30 6F 60 60   62
4030 : 0F 0C 04 4F 20 2A DF 05   0D
4038 : 06 FF 0F 04 3F 60 60 7F   FA
4040 : 03 0D 1F 20 23 5F 32 30   EC
4048 : DB 60 20 FB 05 11 BF 01   B5
4050 : 04 3B 03 0F 7B 12 33 1B   E0
4058 : 60 01 5B 12 03 83 12 C3   6E
4060 : 32 E3 0C A3 18 23 01 63   61
4068 : 01 03 31 43 31 D3 19 F3   9E
4070 : 60 B3 0C 33 01 73 01 13   E9
4078 : 01 53 32 53 32 EA 6D 54   F3
4080 : 6B 03 81 09 A6 07 B9 02   7C
4088 : 43 27 9D 06 AE 07 A1 1A   65
4090 : 5B 3F 85 1E B6 0F A9 12   5F
4098 : 53 37 8D 16 BE 2F 91 2A   AD
40A0 : 6B 0F B5 2E 86 67 99 22   14
40A8 : 63 07 BD 26 8E 67 81 3A   62
40B0 : 7B 1F A5 3E 9B 43 B2 21   CD
40B8 : 57 BD B6 B0 4A B5 20 43   0B
40C0 : EF 36 CE 95 59 EE 49 C4   EC
40C8 : 3F C1 EE 4D E7 3A F0 54   0A
40D0 : 72 D1 00 F7 1E F7 F0 F0   71
40D8 : 5A 7B AA 60 FC F7 C9 60   1E
40E0 : 42 95 59 05 CB F2 EA E4   AE
40E8 : 92 A4 E1 94 A1 C2 03 FB   0B
40F0 : 00 54 20 00 00 1F         07
Listing 5. Mit dem Befehl D 4000 erscheinen alle illegalen Opcodes disassembliert auf dem Bildschirm
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →