Funkamateur 11/84

zurück zu Teil 9

Funkamateure entwickeln Amateurcomputer "AC1" (10)

Dipl.-Ing. F. HEYDER - Y21SO

Die Bilder 35, 36 und 37 geben einen Vorschlag zur Gestaltung einer Leiterplatte für die Tastaturelektronik nach Bild 14 an. Diese Platine ist wie die Leiterplatte des Grundmoduls als zweiseitige Leiterplatte konzipiert. Die Abkürzungen der Bezeichnungen von L- und B-Seite (TE-L und TE-B) müssen, um Deckungsgleichheit zu erreichen, dabei an der gleichen Kante liegen. Für den Fall, daß die Taster für Leerzeichen, Wagenrücklauf und Rückschritt nur einen Schließkontakt haben, sind die drei Reedrelais vorgesehen.
Nach Abschluß der Hardware des Grundmoduls des Amateurcomputers "AC1" soll nun die Grundsoftware (Monitorprogramm, Mini-BASIC-Interpreter) beschrieben werden. Ein kleiner Einblick wurde ja bereits im Teil 6 dieser Reihe gegeben.

Das Monitorprogramm

Nach jedem Einschalten bzw. Reset befindet sich der Amateurcomputer im Monitorprogramm. Dieses ermöglicht mit seinen Befehlen z.B. das Einlesen und Starten von Anwendungsprogrammen, das Entwickeln und Testen neuer Programme, und auch teilweise den Test von Zusatzbaugruppen, wie Speichererweiterungen u.ä. Wie im Teil 6 dieser Reihe bereits gesagt, entstand dieses Monitorprogramm durch Anpassen, Verändern und Erweitern des in [10] veröffentlichten Monitors. Der Monitor des Amateurcomputers meldet sich mit der Überschrift "AC 1 U 880 - MONITOR V 3.1", dem Promptsymbol # (Doppelkreuz) und dem dahinter blinkendem Cursor am Anfang der Eingabezeile. Ein Promptsymbol soll dem Bediener zeigen, daß der Computer bereit ist, eine Eingabe oder einen Befehl entgegenzunehmen und darauf entsprechend seinem Programm zu reagieren. Zur besseren Unterscheidung der Programme, in denen man sich gerade befindet, verwendet man meist verschiedene Promptsymbole. So benutzt der Mini-Basic-Interpreter z.B. ein > (größer als) als Promptsymbol. Jeder Befehl wird dem Monitor in Form einer Kommandozeile übergeben, die die Form # X aaaa bbbb cccc CR (Wagenrücklauf) hat. X ist hierbei ein Zeichen aus dem ASCII-Zeichen­satz, mit dem der Befehl abgekürzt wird. Diese Abkürzung basiert meist auf einem Schlüsselwort in englischer Sprache. aaaa, bbbb und cccc stellen drei maximal vierstellige hexadezimale Argumente zum Befehl dar. Führende Nullen in den Argumenten dürfen weggelassen werden. Die einzelnen Argumente sind durch mindestens ein Leerzeichen voneinander zu trennen. Zwischen dem Kennzeichen und dem ersten Argument braucht kein Leerzeichen zu stehen; es schadet aber nicht. Werden weniger Argumente angegeben, als der Befehl erfordert, so wird für die fehlenden der Wert 0 angenommen. Das Kommando gelangt erst durch Drücken der CR-Taste zur Analyse und Ausführung zum Rechner: das heißt also, bis dahin kann die Eingabe mit Hilfe der Backspacetaste (Rückschritt) noch korrigiert bzw. verändert werden. Ist der Befehl falsch oder nicht im Monitor enthalten, so quittiert der Computer die Eingabe mit der Ausschrift WHAT #. Fügt man dem Kennzeichen anstatt der Argumente einen : (Doppelpunkt) an, so kommen die letzten zwischengespeicherten Argumente zur Anwendung. Die einzelnen Befehle sind:
A aaaa bbbb c (Arithmetik)
Es werden Summe, Differenz, wenn möglich das Displacement, (relative Distanz) für einen Sprungbefehl aus den ersten beiden Argumenten sowie der dezimale Wert des ersten Arguments, berechnet. c gibt die Länge des Sprungbefehls an. Für die relativen Sprungbefehle des U­880-Befehlssatzes ist dann c z.B. gleich zwei.
B aaaa (Breakpoint)
Dieser Befehl ist nützlich für das Testen von bzw. die Fehlersuche in Programmen. Er setzt ein Softwarehaltepunkt auf die Adresse aaaa. aaaa muß dabei immer auf das erste Byte eines Befehls zeigen. Ist nach dem Starten des Programms diese Adresse erreicht, erfolgt die Ausschrift BREAK AT aaaa # und die Kontrolle geht wieder an den Monitor zurück. Zuvor werden alle Registerinhalte der CPU in die RSA (Register Save Area) gerettet, so daß sie sich z.B. mittels des R-Befehls anzeigen lassen. Das zu testende Programm wird durch den Break-Befehl nicht zerstört. Man kann es dann beispielsweise mit dem Go-Befehl fortsetzen.
C aaaa bbbb cccc (Compare)
Dieser Befehl vergleicht die beiden Speicherinhalte ab aaaa und bbbb für die Länge von cccc Bytes miteinander. Wird eine Ungleichheit gefunden, erscheinen die beiden nicht übereinstimmenden Bytes mit den jeweils zugehörigen Adressen auf dem Schirm. Mit der CR-Taste kann man die Suche fortsetzen. Jede andere Taste führt zum Abbruch.
D aaaa bbbb (Display Memory; Dump)
Der Speicherinhalt von der Adresse aaaa bis zur Adresse bbbb wird als Hexdump auf dem Bildschirm ausgegeben. Zu Beginn jeder Zeile erfolgt die Ausgabe der jeweiligen Anfangsadresse, es folgen 16 Datenbytes.
E aaaa (Execute Machine Programm)
Das Maschinenprogramm ab Adresse aaaa läuft unter Breakpointkontrolle. Das heißt, die Register der CPU werden entsprechend der aktuellen Werte der RSA geladen, der Softwarebreakpoint wird aktiviert und dann wird zur Adresse aaaa gesprungen.
F aa bb ce dd ... nn (Find String)
Hier ist ab Adresse 00aaH die Datenfolge aa bb cc dd ... nn zu suchen. Die zu suchende Datenfolge oder Zeichenkette kann dabei maximal so lang sein, daß das gesamte Kommando gerade noch auf den Bildschirm paßt. Wird die angegebene Zeichenkette vollständig gefunden, springt der Monitor an den M-Befehl, wobei die Adresse auf das erste Byte der Datenfolge zeigt. Soll die Suche nach dem M-Befehl weitergehen, ist die Folge F: aa bb cc dd ... nn einzugeben. Wird die Datenfolge im gesamten Speicher nicht gefunden, erfolgt die Ausschrift NOT FOUND #.
G (Go on)
Dieses Kommando funktioniert analog dem E-Befehl. Die Programmausführung wird hierbei ab der Adresse im PC fortgesetzt. Falls ein Breakpoint zuvor eingegeben wurde, wird dieser aktiviert.
I (lnitialize)
Hiermit ist ein Löschen aller Anwenderregister möglich. Alle Speicherzellen der RSA werden (bis auf die für den Stackpointer) Null gesetzt; letzterer so, daß das jeweilige Ende des RAM-Speichers im Grundmodul vorsorglich als Anwenderstack genutzt wird. Dies deshalb, weil es z.B. für den E-, J- und G-Befehl erforderlich ist. Sollte dieser Bereich für den einen oder anderen Anwendungsfall nicht günstig sein, kann man den Stack natürlich mit Hilfe des R-Befehls auch in einen anderen RAM-Bereich legen. Auf dem Bildschirm erscheint die Ausschrift CLR/RSA.
J aaaa (Jump)
Dieser Befehl führt ebenfalls zum Ansprung eines Anwenderprogramms ab der Adresse aaaa analog dem E-Befehl, jedoch ohne Breakpointaktivierung.
L aaaa ± (Load from Cassette)
Der Computer versucht, ein Programm oder eine Datei, kurz File genannt, vom Bandgerätinterface in den Speicher zu laden. Das Argument aaaa± bewirkt, das File um diesen Offset verschoben vom ursprünglichen Speicherbereich einzulesen, zum Beispiel dann, wenn der Speicherbereich, von dem das File abgespeichert wurde, im eigenen Computer nicht vorhanden ist. Sonst, also in der Regel, kann man dieses Argument weglassen. Wird der Ladevorgang erfolgreich beendet, so trägt diese Routine die Startadresse des Files, die auch auf dem Bildschirm erscheint, in die Speicherzelle für das erste Argument ein. Das geladene Programm läßt sich dann einfach mit J: anspringen.
M aaaa (Modify Memory)
Hiermit kann der RAM-Speicher ab der Adresse aaaa byteweise angezeigt und neu beschrieben werden. Nach jedem Drücken der CR-Taste erscheinen die aktuelle Adresse und das zugehörige Byte. Nach dem Promptsymbol läßt sich ein neues Byte oder auch eine Bytefolge, durch Leerzeichen getrennt, eingeben. Drückt man laufend nur die CR-Taste, erfolgt die Speicheranzeige Byte für Byte. Bei einer Dateneingabe würde diese nach dem Drücken der CR-Taste in den Speicher übertragen und der Schreibvorgang überprüft. Sollte das neue Byte nicht vom Speicher übernommen worden sein, weil er z.B. im EPROM-Bereich liegt oder gar nicht vorhanden ist, so erfolgt eine Fehlermeldung. Man schließt den M-Befehl durch die Eingabe eines. (Punkt) ab. Dabei gelangt die zuletzt bearbeitete Speicheradresse in die Speicherstelle für das zweite Argument. Dadurch läßt sich der bearbeitete Bereich mit D: noch einmal betrachten.
P aaaa bbbb cc (Pattern)
Dieser Befehl füllt den Speicher von der Adresse aaaa bis zur Adresse bbbb mit dem Bitmuster cc auf.
R XX (Register Display/Modify)
Dieses Kommando ermöglicht analog dem M-Befehl die Anzeige und das Verändern der Inhalte aller Register der CPU. Hierbei steht XX für das jeweilige Registerpaar. Nach dem Drücken der CR-Taste erscheint der Wert des jeweiligen Doppelregisters, gefolgt vom # auf dem Bildschirm. Mit der nachfolgenden Eingabe eines Wertes läßt sich das Registerpaar dann neu setzen. Folgt dem R ein Doppelpunkt, so werden der gesamte Registersatz, der Breakpoint, die Breakpointsequenz (3 Bytes ab Breakpointadresse) angezeigt sowie die gesetzten Flaggs zusätzlich anhand ihres Symbols dargestellt.
S aaaa bbbb cccc name (Save to Cassette)
Hiermit kann man eine File ab der Adresse aaaa bis zur Adresse bbbb mit der Startadresse cccc unter dem Namen name (Länge max 6 Zeichen) auf Magnetband abspeichem.
T aaaa bbbb cccc (Transfer)
Mit diesem Befehl kann der Speicherinhalt ab der Adresse aaaa in den Speicherbereich ab der Adresse bbbb für die Länge von cccc Bytes kopiert werden. Ein Überlappen der beiden Speicherbereiche ist zulässig.
Beispiel: T 1900 1901 80 verschiebt den Speicherinhalt ab 1900H für 80H Byte um eines nach oben.
V (Verify with Cassette)
Hiermit ist es möglich, ein auf Magnetband abgespeichertes File noch einmal mit dem Speicheroriginal zu vergleichen. Dadurch sind z.B. Datenfehler aufgrund mangelhaften Bandmaterials vermeidbar.
Z
Mit diesem Befehl wird in den Mini-BASIC-Interpreter gesprungen, vorausgesetzt, daß die dafür erforderlichen beiden EPROMs gesteckt sind.
u aaaa bbbb cccc (u -Leerzeichen)
Ein Leerzeichen, gefolgt von Argumenten, speichert deren Werte in den entsprechenden Speicherzellen ab, so daß danach mit dem Operator : gearbeitet werden kann. Damit ist es z.B. möglich, die Startadresse für den F-Befehl frei zu wählen. Als Beispiel für die Benutzung der Monitorbefehle sei auch auf die beiden Bildschirmfotos vom Monitorprogramm im Teil 6 dieser Veröffentlichung hingewiesen.
Zum Abschluß der Beschreibung des Monitorprogramms noch einige Hinweise zu dessen Erweiterbarkeit, die sich ohne Eingriffe in das vorliegende Programm realisieren lassen.
Die einzelnen Befehlsroutinen des Monitors werden nicht über einen Sprungverteiler erreicht, sondern vom Monitor anhand eines Kodemusters im Adreßbereich von 0 bis 1FFFH gesucht. Jede Befehlsroutine hat dabei die Form 00 09 XX 0D ... Routine ... C9. XX ist der ASCII-Kode des entsprechenden Kennbuchstabens. Man braucht eigene, z.B. von Magnetband ladbare Ergänzungen, also nur in diesen Rahmen zu "packen". Damit ist es ebenfalls möglich, eigene Anwenderprogramme über Kennbuchstaben zu starten.
Der derzeitige Monitor belegt die ersten beiden Kilobyte des EPROM-Bereiches und etwa 128 Byte RAM zu Beginn des Arbeitsspeichers. Wenn man noch etwas Spielraum für mögliche Modifikationen späterer Monitorversionen läßt, hat man also den Speicherbereich von 1900H bis 1FFFH für Erweiterungen zur Verfügung. Es ist auch denkbar, auf den Mini-BASIC-Interpreter zu verzichten und diesen Bereich für Erweiterungen zu nutzen.
Da der Monitor am Anfang des Speicher­bereiches liegt, fallen in diesen Bereich auch die Ansprungpunkte der RST-Be­fehle und der Beginn der NMI-Routine.

Um nun trotzdem auch diese Möglichkeiten in Anwenderprogrammen nutzen zu können, ohne dabei die EPROMs zu wechseln, was auf Dauer auch im Interesse der Fassungen nicht zu empfehlen ist, sind die Routine RST8...RST38H sowie der NMI-Ansprung über eine Sprungtabelle im RAM geführt. Diese läßt sich vom Anwender modifizieren.
Tabelle 5 enthält die Einsprungpunkte der Unterprogramme zur Ein/Ausgabe, die man auch in selbst geschriebenen Programmen nutzen kann sowie die Belegung des Sprungverteilers im RAM für die RAT-Befehle und den NMI.
In Tabelle 6 ist ein kleines Testprogramm in Assemblersprache für den CTC-Baustein angeführt. Man braucht den Maschinenkode nur mit dem M-Befehl einzugeben und dann das Programm mit J 1900 zu starten. Wenn alles richtig gemacht wurde und der CTC-Baustein ordnungsgemäß funktioniert, wird der Bildschirm Zeile für Zeile immer wieder mit dem gesamten Zeichenvorrat des U 402 in der Reihenfolge des ASCII-Kodes beschrieben.
Ein Kanal des CTC dient hier in der Betriebsart Zeitgeber zur Zeitverzögerung. Sonst würde die Zeichenausgabe so schnell erfolgen, daß man sie nicht ohne weiteres verfolgen könnte. Wer ganz sicher gehen will, kann auch noch die restlichen drei Kanäle des CTC-Bausteins testen, indem er nacheinander die jeweilige Kanaladresse bei der Ausgabe von Steuerwort und Zeitkonstante einsetzt. Dieses einfache Maschinenprogramm läßt sich dann mit einem Reset abbrechen.

weiter mit Teil 11