PMON ------
Ich erinnere mich noch zu genau an die gute alte Zeit, es mag so sieben bis acht Jahre her sein, als man noch auf- trumpfen konnte, wenn man die Basic- programmierung des VC-20 einigermaßen beherrschte. Heute ist das alles ganz anders! Jedermann kann einen Maschinensprache- monitor bedienen, oder weiß zumindest, daß ein Monitor nicht immer ein Bild- schirm sein muß. Wir schließen uns dieser Welle voll und ganz an, und haben uns aus diesem Grunde entschloßen, einen Maschinen- sprachemonitor zu veröffentlichen. Doch bevor wir zur Befehlsübersicht schreiten, möchte ich einige Vorab- erklärungen leisten. Alle Zahlen lassen sich hexadezimal (ohne Kennzeichen oder auch mit vor- rangehendem "$"), 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 Start- bzw. 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 $1f bzw. $80 bis $9f 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, X- und 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 Drucker- ausgaben (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üng- liche Adresse geladen. Das zweite Anführungszeichen bei dem Filenamen kann dann entfallen. Grundsätzlich erfolgt eine Anzeige der Start- und 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 X- und Y-Registers (XR, YR), des Statusregisters, sowohl hexadezimal (SR) als auch aufgeschlüsselt in die einzelnen Flaggen (nv-bdizc), 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 HEX- oder die Binärdarstellung ändert - beides ist möglich. S "name" sa ea speichert den ange- gebenen Bereich unter dem Namen "name". T sa ea ad überträgt den Speicher- bereich 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-, Dezimal- und 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 Be- fehl 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 $0d). < < erzeugt ein Formfeed (Blattvor- schub) auf dem Drucker durch Aus- gabe des Codes $0c. 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)