PMON ------
Ich erinnere mich noch zu genau an die
gute alte Zeit, es mag so sieben bis
acht Jahre her sein, als man noch auftrumpfen konnte, wenn man die Basicprogrammierung des VC-20 einigermaßen
beherrschte.
Heute ist das alles ganz anders!
Jedermann kann einen Maschinensprachemonitor bedienen, oder weiß zumindest, daß ein Monitor nicht immer ein Bildschirm sein muß.
Wir schließen uns dieser Welle voll und
ganz an, und haben uns aus diesem
Grunde entschloßen, einen Maschinensprachemonitor zu veröffentlichen.
Doch bevor wir zur Befehlsübersicht
schreiten, möchte ich einige Voraberklärungen leisten.
Alle Zahlen lassen sich hexadezimal
( ohne Kennzeichen oder auch mit vorrangehendem "$"), dezimal ( Kennzeichen
"|") oder binär ("%") angeben. Die
Zahlen c000,$ c000,|49152 und
%1100000000000000 sind also vollkommen
indentisch.
Einzelne Bytes ($00 bis $ ff) können auch
als ASCII-Zeichen mit vorrangehendem "'" eingegeben werden.' a entspricht also
$41 . Alle Ausgaben erfolgen jedoch in
hexadezimaler Schreibweise.
Die Befehle lassen sich sowohl
ungeshiftet ( Kleinbuchstaben) als auch
geshiftet ( Großbuchstaben) eingeben.
Während bei ungeshifteten Befehlen die
Ausgabe nur auf dem Bildschirm erfolgt, wird sie bei großgeschriebenen Befehlen
auch auf den Drucker geleitet, soweit
dies möglich ist.
In der folgenden Befehlsübersicht sind
Parameter, die weggelassen werden
können, in {} eingeschlossen." Sa"," ea"
und " ad" sind beliebige Adressen;" sa" und " ea" stehen für die Startbzw.
Endadressen eines Bereichs. Zu beachten
ist hierbei, daß ein Bereich ( im
Gegensatz zu den meisten anderen
Monitoren) die Adresse " ea" einschließt.
Um z. B. den Bereich von $ c000 bis $ c073 zu speichern, sind genau die Werte
anzugeben und nicht eine um 1 erhöhte
Endadresse. Selbstverständlich hält sich
auch der Befehl " L" an diese Regelung
und gibt die Adresse des ersten und
letzten Bytes aus.
Jetzt aber zur eigentlichen Anleitung:
A { sa { ea}} gibt den Speicherbereich
von Adresse " sa" bis Adresse " ea" als
ASCII-DUMP aus. Steuerzeichen im
Bereich von $00 bis $1 f bzw.$80 bis $9 f
werden invertiert dargestellt.
C sa ea ad vergleicht den Bereich von
" sa" bis " ea" mit dem Bereich ab " ad" .
Unterscheiden sich die Bytes, so werden
ihre Adressen, die Bytes selbst und eine
Binärzahl ausgegeben. Diese Binärzahl
ergibt sich aus einer EOR-Verknüpfung
der beiden Bytes und gibt die Bits an, in denen sie sich unterscheiden.
D { sa { ea}} gibt den Bereich von " sa" bis " ea" disassembliert aus. Zur
besseren Lesbarkeit des Listings wird
nach den Befehlen BRK, JMP, RTS und RTI
eine Trennzeile ausgegeben.
Hand in Hand ( . . . we stand! Hallo Seoul) mit dem Disassembler arbeitet ein
kleiner Direktassembler. Er ermöglicht
es, Assemblerprogramme abzuändern oder
sogar einzugeben. Es gibt zwei
Möglichkeiten, in den Assemblermodus zu
gelangen: Durch Ändern einer
Disassemblierten Zeile oder durch
Eingabe von " : adresse: befehl", wobei
" adresse" die Startadresse des Programms
darstellt und " befehl" ein
Assemblerbefehl ( wie z. B. lda #12) ist.
Eine eingegebene Zeile wird ( wie im
Basic) mit < RETURN> abgeschlossen. Ist
die Zeile fehlerhaft, so wird an der
Fehlerstelle ein " ?" ausgegeben, ansonsten wird die Zeile übersetzt, formatiert ausgegeben und die
nächstfolgende Adresse vorgegeben.
F sa ea by füllt den angegebenen
Bereich mit dem Byte " by" .
G { ad} startet ein Programm ab
Adresse " ad" bzw. ab dem aktuellen
PC-Stand, wenn " ad" nicht angegeben ist.
Akkumulator, Xund Y-Register, Prozessor-Status, Stackpointer und
Konfigurationsregister ($01 in der
Zeropage) werden entsprechend den
Angaben gesetzt, wie sie sich durch " R" ausgeben und ändern lassen.
H sa ea by { by} . .{ by} sucht in dem
Bereich nach Auftreten des Bytes " by" .
Es können auch mehrere Bytes angegeben werden. Wird die Bytefolge gefunden, so
wird ihre Adresse ausgegeben.
I by1{ by2} legt die Geräteadressen für
Diskettenzugriffe ( byte #1) und Druckerausgaben ( Byte #2) fest. Ist ein Gerät
bei Druckerausgaben nicht vorhanden, so
erfolgt keine Fehlermeldung. Bei den
Befehlen " L"," S"," KLAMMERAFFE" und "$" wird ein " ?" ausgegeben, wenn die Floppy
fehlt.
L " name"{ ad} lädt ein Programm nach
Adresse " ad" . Ist " ad" nicht angegeben, so wird das Programm an seine ursprüngliche Adresse geladen. Das zweite
Anführungszeichen bei dem Filenamen kann
dann entfallen. Grundsätzlich erfolgt
eine Anzeige der Startund Endadresse.
M { sa { ea}} gibt den angegebenen
Bereich als HEX-DUMP aus. Es erfolgt
auch eine Darstellung als ASCII-Zeichen.
Die Darstellung erfolgt im allgemeinen mit 8 Byte pro Zeile. Erfolgt die
Ausgabe auf dem Drucker, so werden
jeweils 16 Byte ausgegeben. Diese Bytes, jedoch nicht die ASCII-Zeichen, lassen
sich durch überschreiben ändern.
R gibt alle Register und
Zeiger aus. Es erfolgt eine Anzeige des
aktuellen Programmzählers ( PC), des
Stapelzeigers ( SP), des Akkumulators
( AC), des Xund Y-Registers ( XR, YR), des Statusregisters, sowohl hexadezimal
( SR) als auch aufgeschlüsselt in die
einzelnen Flaggen ( nvbdizc), als
Binärzahl und das Konfigurationsregister
( CR) .
Es entspricht in seiner Funktion
vollkommen der Speicherstelle $01 . Durch
Verändern von " CR" läßt sich festlegen, welche Speicherbereiche behandelt
werden.
Auch die Register lassen sich durch
einfaches überschreiben ändern. Bei dem Prozessor-Status- Register ist es jedem
freigestellt, ob er die HEXoder die
Binärdarstellung ändert - beides ist
möglich.
S " name" sa ea speichert den angegebenen Bereich unter dem Namen " name" .
T sa ea ad überträgt den Speicherbereich von " sa" bis " ea" in einen
entsprechend großen Bereich " ad" ab.
X kehrt in das Basic zurück.
? ad {+/- ad} gibt in seiner
einfachsten Form den angegebenen Wert
als Hexadezimal-, Dezimalund Binärzahl
aus. Es ist jedoch auch möglich, mehrere
Zahlen zu addieren oder voneinander zu
subtrahieren. Es erfolgt dann die
Ausgabe des Ergebnisses.
" KLAMMERAFFE"{ Befehl} sendet einen Befehl an das Diskettenlaufwerk und gibt die Rückmeldung aus. Ist ein Befehl
nicht angegeben, so erfolgt nur die
Anzeige des Fehlerstatus.
$ gibt das Directory einer Diskette
aus.
< gibt eine Leerzeile auf dem Drucker aus ( Ausgabe des Codes $0 d) .
<< erzeugt ein Formfeed ( Blattvorschub) auf dem Drucker durch Ausgabe des Codes $0 c.
PMON ist in drei Versionen auf dieser
Diskette gespeichert: Einmal liegt PMON
im Speicher ab $ c000 und wird mit SYS
49152 gestartet. Sollte dieser Bereich
bereits belegt sein, so gibt es noch
PMON $1000 und PMON $9000, die mit SYS
4096 bzw. SYS 36864 ins Leben gerufen
werden.
( om)