TEDMON
Der ab BASIC 3.5 eingebaute Maschinensprachemonitor TEDMON wird entweder durch den BASIC-Befehl MONITOR
, SYS 1024
oder durch SYS 45056
(beim C128) oder mit gedrücktem RUN/STOP beim Einschalten oder Reset aufgerufen.
Er ist u.a. in den Heimcomputersystemen C16/116, C128/D/DCR und Plus/4 integriert (vergleiche dazu MONITOR$C000, MONITOR$8000 (Commodore) beim C64!).
Ebenso lässt sich der Monitor mit dem BRK-Opcode über den BREAK-Vektor aufrufen, was bei der Registeranzeige mit BREAK angezeigt wird. Dies kann zum einen als Einstieg von BASIC aus via SYS-Befehl (auf eine beliebige Adresse die 0 enthält) oder zum anderen für Debugging-Zwecke verwendet werden. Der Monitor sieht keine besonderen Befehle für Haltepunkte oder schrittweise Befehlsabarbeitung vor. Dies muss gegebenenfalls mit dem temporären Setzen eines BRK-Opcodes (0-Byte) manuell erfolgen.
Registerzeile[Bearbeiten | Quelltext bearbeiten]
Nach dem Aufruf meldet er sich z.B. mit folgender Meldung:
- BASIC 3.5 (C16)
MONITOR PC SR AC XR YR SP ; 0004 30 00 00 00 F6 |
- BASIC 7.0 (C128)
MONITOR PC SR AC XR YR SP ; FB000 00 00 00 00 F8 |
Die Anzeigen, auch hier Registerzeile genannt, bedeuten dabei folgendes:
- PC: Programmzähler (engl. program counter) mit der Speicheradresse des nächsten auszuführenden Befehls. Beim C128 wird der PC fiktiv als 20-Bit-Adresse geführt, wobei die erste Ziffer der aktuellen Speicherbank (0-F) entspricht.
- SR: Inhalt des Statusregisters.
- AC: Inhalt des Akkumulatorregisters (engl. accumulator).
- XR: Inhalt des X-Indexregisters.
- YR: Inhalt des Y-Indexregisters.
- SP: Inhalt des Stapelzeigers (engl. stack pointer).
Alle Zahlen werden in hexadezimaler Form angezeigt.
Maschinensprachemonitor-Befehle[Bearbeiten | Quelltext bearbeiten]
Folgende Befehle stehen bei dem eingebauten Maschinensprachemonitor zur Verfügung:
- A - Assembliert (engl. assemble) eine Mnemonics-Zeile in den entsprechenden Maschinencode.
- A <Adresse> <Befehl> [<Operand>]
- Zahlen bei Operanden brauchen ein führendes $-Zeichen, auf einem C128 kann das aber weggelassen werden oder im entsprechenden Zahlensystem angegeben werden.
- Beeenden mit einer Leereingabe (nur RETURN )
- C - Vergleicht (engl. compare) zwei Speicherbereiche und zeigt die Unterschiede an.
- C <Startadresse> <Endadresse> <Start Vergleichsadresse>
- D - Disassembliert (engl. disassemble) eine Maschinencode-Zeile in entsprechenden Mnemonic (Klartext-Befehl).
- D [<Startadresse> [<Endadresse>]]
- F - Füllt (engl. fill) Speicherbereiche mit angegebenen Byte auf.
- F <Startadresse> <Endadresse> <Byte>
- G - Startet (engl. go) ein Maschinenspracheprogramm an der angegebenen Startadresse.
- G <Adresse>
- H - Durchsucht (engl. hunt) Speicherbereich nach einen bestimmten Wert und zeigte alle gefundenen Speicherstellen an.
- H <Startadresse> <Endadresse> <Daten> (Daten können hexadezimale Zahlen getrennt durch Leerzeichen oder Zeichenkette mit vorgestellten Apostroph (') sein).
- J - Nur C128: Springt (engl. jump to subroutine) in ein Maschinenspracheunterprogramm an der angegebenen Adresse. Im Unterschied zu G gelangt nach Ausführung des Befehls, bei der Rückkehr aus dem Unterprogramm mittels RTS, die Kontrolle wieder zum Monitor.
- J <Adresse>
- L - Lädt (engl. load) eine Programmdatei von Diskette oder Datasette in den Speicher.
- L "<Dateiname>",<Geräteadresse($1-$F)>,<Ladeadresse beim C128>
- M - Zeigt den angegebenen Speicherbereich (engl. memory) in hexadezimaler Darstellung an.
- M [<Startadresse> [<Endadresse>]] (werden die Adressen weggelassen, so werden nur die ersten 12 Zeilen angezeigt).
- R - Zeigt die aktuelle Registerzeile (engl. registers) wieder an.
- S - Speichert (engl. save) den angegebenen Speicherbereich als Programmdatei auf Diskette oder Datasette.
- S "<Dateiname>",<Geräteadresse>,<Anfangsadresse>,<Endeadresse+1>
- T - Verschiebt (engl. transfer) bzw. kopiert einen Speicherbereich in einem anderen.
- T <Anfangsadresse> <Endadresse> <Start Zieladresse>
- V - Vergleicht (engl. verify) ein Programm von Diskette oder Datasette im Arbeitsspeicher.
- V "<Dateiname>",<Geräteadresse($1-$F)>,<Anfangsadresse beim C128>
- X - Beendet (engl. exit) den Monitor und man gelangt wieder in den BASIC-Direktmodus.
- > - Modifiziert ein bis acht Bytes ab einer bestimmten Speicherzelle (nach M-Befehl).
- > <Adresse> <Byte1> <Byte2> ... <Byte8>
- . - Gleiche Wirkung wie der A-Befehl.
- ; - Ändert die Registerinhalte (nach R-Befehl).
- @ - Nur C128: Anzeige des Diskettenlaufwerksstatus oder Aufruf eines Diskettenbefehls.
- @[Geräteadresse($8-$F)][,[ Floppy-Befehl ]]
Standardgeräteadresse ist 8.
- @[Geräteadresse($8-$F)][,[ Floppy-Befehl ]]
Es wird kein Prompt angezeigt, lediglich der blinkende Cursor zeigt die Eingabebereitschaft an.
Bei einer falschen Eingabe (unbekannter Befehl) wird ein Fragezeichen ? ausgegeben.
Zahlensysteme[Bearbeiten | Quelltext bearbeiten]
Beim Maschinensprachemonitor des C128 können durch die Angabe bestimmter Vorzeichen alternative Zahlensysteme genutzt werden. Standardmäßig wird das hexadezimale Zahlensystem verwendet:
- $ : Hexadezimale Zahlen
- + : Dezimale Zahlen
- & : Oktale Zahlen
- % : Binäre (duale) Zahlen
Adressen[Bearbeiten | Quelltext bearbeiten]
Normalerweise sind 4-stellige Hexadezimalzahlen in Verwendung, die den 64-KByte-Adressraum abdecken.
Beim C128 mit bis zu 16 Bänken (siehe auch BASIC 7.0 Kommando BANK für weitere Details) zu je 64 KByte werden 5-Stellig Hexadezimaladressen verwendet. Das führende Nibble gibt die jeweilige Speicherbank an:
Bank | Zugriff auf |
---|---|
0 | RAM 0 |
1 | RAM 1 |
2 | RAM 2 |
3 | RAM 3 |
4 | INT ROM, RAM 0, I/O |
5 | INT ROM, RAM 1, I/O |
6 | INT ROM, RAM 2, I/O |
7 | INT ROM, RAM 3, I/O |
8 | EXT ROM, RAM 0, I/O |
9 | EXT ROM, RAM 1, I/O |
A | EXT ROM, RAM 2, I/O |
B | EXT ROM, RAM 3, I/O |
C | KERNAL + INT (lo), RAM 0, I/O |
D | KERNAL + EXT (lo), RAM 0, I/O |
E | KERNAL + BASIC, RAM 0, CHARROM |
F | KERNAL + BASIC, RAM 0, I/O |