1.1 Einleitung 1.3 Der Mikroprozessor MC6809

1.2/1

1.2 Bedienung des Praktikumsrechners

1.2.1 Funktion der Tasten

In diesem Abschnitt sollen Sie zunächst mit der Bedienung des Praktikumsrechners vertraut gemacht werden 1). Grundlage für die Benutzung des Rechners ist die im Festwertspeicher abgelegte Systemsoftware, der sog. Monitor. Er ist insbesondere für die Ansteuerung von Tastatur und Anzeige verantwortlich. Wir werden Ihnen im folgenden die Funktion der einzelnen Tasten und der Anzeige erklären und danach die Hilfsroutinen des Monitors beschreiben, die Sie in den Selbsttest- und Einsendeaufgaben zur Lösung komplexerer Probleme einsetzen sollten. Der Aufbau des Monitors wird in Kapitel 3 detailliert dargestellt.

Die Anzeige (Display) des Mikrorechners besteht aus acht 7-Segmentanzeigen mit je einem Dezimalpunkt. Sie sind, wie in Bild 1.2-1 dargestellt, in drei Felder unterteilt.



Bild 1.2-1: Die 8-stellige 7-Segmentanzeige

Das linke Feld (S7,S6) dient (bis auf wenige Ausnahmen) zur Kennzeichnung (KZ) der gerade ausgeführten Operation und wird im folgenden deshalb mit Operationsfeld bezeichnet.

Das mittlere Feld stellt meistens einen hexadezimalen Zahlenwert dar. Das ist in der Regel eine 4-stellige Adresse. Deshalb wird dieses Feld im folgenden vereinfacht Adreßfeld genannt. Zur Darstellung des Inhalts eines 8-bit-Registers werden von den vier Stellen S2-S5 dieses Feldes lediglich die beiden linken Stellen S4 und S5 benutzt.

Das rechte Feld (S1,S0) kennzeichnet innerhalb einer ausgeführten Operation die einzugebenden Parameter bzw. Register und stellt für eine angewählte Speicherzelle deren Inhalt in hexadezimaler Form dar. Es wird abkürzend mit Datenfeld bezeichnet.

1.2/2

Schließen Sie nun zunächst den Praktikumsrechner ans Netz an und schalten Sie ihn mit dem Netzschalter auf der Rückseite ein. Wenn das System betriebsbereit ist, wird es automatisch in einen Grundzustand versetzt (Power on Reset). Dabei werden insbesondere die Tabellen für die Systemsoftware, dem rudimentären Betriebssystem (Monitor), erzeugt. Anschließend erscheint in der Anzeige beispielsweise die in Bild 1.2-2 gezeigte Information.


Bild 1.2-2:Die Anzeige nach dem Einschalten

Darin ist:

FU die Abkürzung für die "FernUniversität",
0102 die Nummer des Ihnen vorliegenden Mikrorechners,
07 die Versionsnummer der im Rechner implementierten Betriebssoftware.

Bild 1.2-3 zeigt die Tastatur und die Einteilung der Tasten in verschiedene Gruppen.


Bild 1.2-3:Die Tastatur und die verschiedenen Tastengruppen

Im folgenden werden nun die einzelnen Tastenfunktionen ausführlich erklärt. Wenn es nicht extra anders gesagt wird, stellen alle benutzten absoluten Zahlenwerte Beispiele dar 2).

1.2/3

Ein leuchtender Dezimalpunkt hinter einer Ziffer bildet den Zeiger (Cursor) auf die Position, an der das nächste über die Tastengruppe 2 (0,..,9,A,..,F) eingegebene Zeichen dargestellt wird. Dieser Cursor läuft im Adreßfeld mit jedem eingegebenen Zeichen um eine Position nach rechts, bis er nach der Anzeigenstelle S2 wieder in der Stelle S5 erscheint ("zyklische Verschiebung"). Im Datenfeld ändert er bei jedem eingegebenen Hexadezimalzeichen seine Position innerhalb des Feldes, was ebenfalls als zyklische Verschiebung interpretiert werden kann. Ein Überschreiben falsch eingegebener Werte ist durch nochmaliges Eingeben der Zahl möglich 3).

Praktische Übung P1.2-1:
Führen Sie alle im folgenden angegebenen Tastenbetätigungen und Beispiele mit Ihrem Praktikumsrechner textbegleitend selbst durch, um sich mit der Bedienung des Gerätes vertraut zu machen! Da die Zero-Page, also die Speicherzellen mit den Adressen $0000-$00FF, für die Systemvariablen des Monitors benutzt werden, sollten Sie diese Adressen nicht verwenden!

Die 1. Tastengruppe

Die 1. Tastengruppe besteht lediglich aus der Taste C ("Clear").


Mit ihr kann das System jederzeit in den Grundzustand versetzt werden. Dies ist besonders dann wichtig, wenn sich der Rechner "aufgehängt" hat, d.h. auf andere Weise nicht mehr beeinflußt werden kann. Dabei bleiben alle eingegebenen Programme im Arbeitsspeicher erhalten. Verändert werden jedoch die internen Prozessorregister und die Systemvariablen im Speicher. Danach erzeugt das System die im Bild 1.2-2 gezeigte Meldung.

Die 2. Tastengruppe

Die 2. Tastengruppe besteht aus den 16 schwarzen Tasten

Sie dienen zur Eingabe von Adressen, Daten und Maschinenbefehlen in hexadezimaler Form, wobei stets mit dem höchstwertigen Zeichen begonnen wird.

Die 3. Tastengruppe

Die 3. Tastengruppe enthält die 9 grauen Tasten

1.2/4

Mit diesen werden fest vorgegebene Funktionen aufgerufen. (Die Tasten A und D dürfen nicht mit den Datentasten gleicher Bezeichnung verwechselt werden!)

("Address", Kennzeichen in der Anzeige - KZ: Ad)

Mit dieser Taste wird der Rechner in den Modus Adreßeingabe umgeschaltet. In der Anzeige erscheint die Information:

In diesem Modus ist es möglich, die im Adreßfeld dargestellte Adresse zu ändern. Der Cursor zeigt dabei jeweils auf die Position, an der das nächste Zeichen einzugeben ist. Zu einer vollständig eingegebenen Adresse wird die zugehörende Speicherstelle angewählt und das darin enthaltene Datum im Datenfeld dargestellt.

("Data", KZ: dA)

Mit ihr wird das System in den Modus Dateneingabe umgeschaltet.

In diesem Modus ist es möglich, Daten oder Programme über die Tastatur in den Schreib/Lese-Speicher oder Daten in die Register der Eingabe/ Ausgabe-Bausteine des Systems einzugeben. In nicht belegte Adreßbereiche oder in EPROM-Bereiche ist eine Eingabe natürlich nicht möglich. Das eingegebene Datum wird in diejenige Speicherstelle übertragen, deren Adresse gerade im Adreßfeld der Anzeige steht. Die Übernahme in die Speicherzelle geschieht dabei erst, wenn beide Tetraden des Datums eingegeben wurden 4).

("Increment", kein KZ)

In beiden eben beschriebenen Modi (Adreß- bzw. Dateneingabe) wird durch diese Taste die dargestellte Adresse um 1 erhöht und der Inhalt der neu angewählten Speicherzelle im Datenfeld angezeigt.

Somit ist es möglich, durch mehrfaches Betätigen dieser Taste einen zusammenhängenden Speicherbereich zu betrachten. Dabei wird der Cursor auf die erste Position des jeweils angewählten Anzeigefeldes verschoben, also

  • im Adreßeingabe-Modus auf die Stelle S5,
  • im Dateneingabe-Modus auf die Stelle S1.

1.2/5


("Decrement", kein KZ)

In beiden eben beschriebenen Modi wird durch diese Taste die dargestellte Adresse um 1 erniedrigt. Der Cursor wird wie bei der Taste + verändert

("Register", KZ: rE)

Durch das Betätigen dieser Taste kann der Benutzer die Inhalte der internen Prozessorregister betrachten, wie sie bei der letzten Programmunterbrechung im Arbeitsspeicher abgelegt wurden (vgl. Taste T und Taste F4).

Durch die Taste + kann das nächste Register, durch die Taste - das vorhergehende in einer fest vorgegebenen Reihenfolge angezeigt werden. Der Inhalt der Register wird im Adreßfeld dargestellt, und zwar in den Stellen

  • S2-S5 bei 16-bit-Registern,
  • S4,S5 bei 8-bit-Registern.

Das Datenfeld enthält jeweils die Bezeichnung des gerade angewählten Registers, wie Sie sie im Abschnitt 1.3 kennenlernen werden.

Alle "Registerinhalte" können beliebig geändert werden. Dabei ist natürlich zu beachten, daß nicht die internen Register des Mikroprozessors selbst, sondern ihr "Bild" im Arbeitsspeicher geändert wird. Wird jedoch das Programm an der Unterbrechungsstelle fortgesetzt, so wird dieses Bild in die internen Register geladen und dann mit seinen Werten weiter gerechnet (vgl. die Tasten T und F4).

1.2/6


("Go", KZ: Go)

Diese Taste dient zur Vorbereitung eines Programmstarts. In der Anzeige erscheint zunächst:

Die Startadresse $0400 ist für Benutzerprogramme vorgegeben. Beachten Sie bitte, daß die folgenden Funktionen Trace und Break nur mit dieser Startadresse fehlerfrei arbeiten.

Im Adreßfeld steht die Startadresse des Programms, wie sie zuletzt eingegeben wurde. Sie kann nun beliebig abgeändert werden. Im Datenfeld steht der Inhalt (Daten) der so adressierten Speicherstelle.

Die Taste + ermöglicht es, im Programm einen Unterbrechungspunkt (Breakpoint ) zu setzen. Ihre Betätigung führt zu der Anzeige:

Vorgegeben ist die Adresse $0000, die anzeigt, daß kein Breakpoint gesetzt wird. Sie muß auch immer dann angegeben werden, wenn ein vorher gesetzter Breakpoint wieder gelöscht werden soll.

Sobald im laufenden Programm die eingegebene Breakpoint-Adresse angesprochen wird, wird die Ausführung des Programms unterbrochen und der Befehl SWI1 (s. Abschnitt 1.3.5) ausgeführt. Ist z.B. die Breakpoint-Adresse $0450 gewählt worden so erscheint in der Anzeige die Information:

Nun ist es möglich, sich bestimmte Registerinhalte (Taste R) oder Speicherinhalte (Taste A) anzuschauen und danach das Programm an der Unterbrechungsstelle fortzusetzen (Taste G oder Taste T). Das Fortsetzen des Programmes funktioniert jedoch nur dann fehlerfrei, wenn die Programmstartadresse $0400 gewählt wurde. Breakpoint-Adressen müssen immer auf den Opcode, d.h. auf das 1. Byte eines Maschinenbefehls weisen. Sie können grundsätzlich nur im RAM-Bereich gesetzt werden. Ist ein Setzen des Breakpoints (BP) an einer bestimmten Adresse nicht möglich (z.B. im ROM-Bereich oder nicht belegten Speicherbereich), so erscheint in der Anzeige:

Eine Fortsetzung ist dann über die Taste + möglich, wonach ein neuer Breakpoint eingegeben werden kann, oder über die Tasten G und T zum Starten des Programms.

1.2/7

Starten des Programms Nach der Eingabe der Programm-Startadresse und eventuell eines Breakpoints wird das Programm durch erneutes Drücken der Taste G gestartet.

Kurze Erklärung zur Wirkung des Breakpoints Durch die Angabe der Breakpoint-Adresse wird der Inhalt der angesprochenen Speicherzelle in einer anderen Zelle des Schreib/Lese-Speichers abgelegt und danach durch den Befehl SWI1 (Opcode 3F, Software Interrupt 1, s. Abschnitt 1.3) ersetzt. Sobald das laufende Programm diese Adresse anspricht, wird in eine Interruptroutine verzweigt (deren Startadresse im RAM unter den Adressen $0044 und $0045 abgelegt ist). In dieser Routine wird zunächst der alte Wert der "Breakpoint-Speicherzelle" rekonstruiert. Danach werden die Inhalte der internen Register im RAM abgelegt, und der Monitor wird wieder aktiviert. Aus dem Gesagten ergibt sich, daß die Rekonstruktion der Breakpoint-Speicherzelle "von Hand" geschehen muß, wenn die entsprechende Adresse im Programmlauf nie aufgerufen wird und deshalb das Programm durch die Interruptroutine nicht unterbrochen wird. Außerdem muß bei jedem Programmstart die Breakpoint-Adresse gegebenenfalls erneut gesetzt werden.


("Trace", KZ: Tr)
(Die Startadresse des Programmes sollte $0400 sein.) Nach dem Drükken dieser Taste wird jeweils genau ein Befehl des Programms ausgeführt (Einzelschrittausführung, Single Step Execution).

Danach können die aktuellen Inhalte der internen Register betrachtet und gegebenenfalls verändert werden (Taste R ). Ein erneutes Drücken der Taste T veranlaßt danach die Ausführung des nächsten Maschinenbefehls. Drücken der Taste G veranlaßt die Fortsetzung des Programms ab dem nächsten Maschinenbefehl. Die Darstellung im Display sieht folgendermaßen aus:

In der Anzeige erscheint die Adresse des Opcodes des nächsten auszuführenden Maschinenbefehles sowie dieser selbst, nicht jedoch die zugehörenden Operanden. Nach Sprung- und Verzweigungsbefehlen erscheint die Adresse des Befehles, zu dem gesprungen wurde. Vor der nächsten Ausführung des Trace-Befehles kann eine neue Adresse eingegeben oder die dargestellte durch die Tasten + und - geändert werden. Auf diese Weise können bestimmte Programmteile angewählt oder übersprungen werden, was besonders bei Schleifen mit vielen Durchläufen nützlich ist. Die Trace-Funktion kann auch auf Programme im ROM angewendet werden .

1.2/8


("Save", KZ: SA) Diese Taste dient zur Übertragung eines Programmes oder eines Datenbereiches - beides wird im folgenden kurz Datensatz genannt - aus dem Speicher des Praktikumsrechners zu einem über die serielle Schnittstelle angeschlossenen PC 5). Der übertragene Datensatz wird im PC auf der Festplatte oder Diskette abgespeichert. Nach Betätigen der Taste S erscheint zunächst in der Anzeige:

Die Startadresse kann nun beliebig geändert werden. Sie gibt die Adresse des ersten abzuspeichernden Bytes im Arbeitsspeicher des Praktikumsrechners an und wird zusammen mit dem Datensatz in der Datei abgelegt. Nach Eingabe der Startadresse führt die Taste + zur Anzeige:

und erlaubt dadurch die Eingabe der Datensatz-Endadresse. Voreingestellt ist die Adresse $04FF, also eine Datensatzlänge von 256 Bytes.

Durch den nächsten Druck der Taste S wird die eigentliche Übertragung gestartet. Am Ende der Übertragung wird die Initialisierungsroutine des Praktikumsrechners aufgerufen und erzeugt die im Bild 1.2-2 gezeigte Systemmeldung. Während der Übertragung auftretende Fehler werden nicht festgestellt und gemeldet.

Sollte die Übertragung nicht erfolgreich beendet werden, müssen Sie nach entsprechender Wartezeit die Taste C ("Clear") drücken und ggf. den Uuml;bertragungsvorgang wiederholen 6).


("Load", KZ: Lo)
Mit dieser Taste wird ein Datensatz (Programm oder Datenbereich) vom PC in den Arbeitsspeicher des Praktikumsrechners geladen. Die erste Betätigung der Taste führt zur Anzeige:

Hier können Sie nun einen Lade-Offset angeben, der beim Einlagern der Daten zur aufgezeichneten Startadresse (s. Taste S) addiert wird. Dadurch ist eine Verschiebung der geladenen Daten gegenüber den abgespeicherten Daten im Arbeitsspeicher möglich. (Achtung: Bei absoluten Adressen in einem Programm kann das natürlich zu Fehlern führen.)

1.2/9>

Nach dem nächsten Betätigen der Taste L erlöscht die Anzeige und der Praktikumsrechner wartet auf die Daten vom PC. Während der Übertragung wird das aktuelle empfangene Datum zur Kontrolle in den beiden rechten Anzeigestellen S1,S0 ausgegeben.

Nach erfolgreicher Beendigung des Ladevorgangs erscheint die Meldung 7):


Die 4. Tastengruppe

Die 4. Tastengruppe wird aus den speziellen Funktionstasten

gebildet. Die ersten drei werden beim Initialisieren des Systems mit bestimmten Funktionen vorbelegt. Jedoch kann der Benutzer jederzeit dafür sorgen, daß durch sie andere, selbstdefinierte Funktionen aufgerufen werden.

("Insert", KZ: In)
Diese Taste ist mit der "Einfüge-Funktion" vorbelegt. Diese erlaubt das Einfügen eines Bytes in eine bestimmte Stelle eines zusammenhängenden Datenbereiches.

Vor dem Aufruf der Insert-Funktion muß im Adreßeingabe-Modus (s. Taste A ) die um 1 verminderte Adresse angewählt werden, in die das Byte eingeschoben werden soll. Nach dem Druck der Taste F1 werden zunächst die nächsten 255 Bytes im Speicher um eine Zelle nach "oben", also zu höheren Adressen hin, verschoben. Achtung: Das 256. Byte geht bei dieser Operation verloren!

In der Anzeige erscheint danach die Adresse der Einfügestelle:

In die angezeigte Speicherstelle wird nun das neu eingegebene Datum eingetragen. Ein wiederholtes Betätigen der Taste F1 erlaubt auf einfache Weise das Einfügen eines größeren Datenblockes.

Das folgende Bild 1.2-4 zeigt ein Beispiel für die Verwendung der Insert-Funktion. Darin werden ab der Adresse $0450 die Bytes $45 und $A7 eingefügt.

1.2/10


Bild 1.2-4:Beispiel für die mehrfache Ausführung der Insert-Funktion

Bedingt durch die Verschiebung des Datenblockes vergrößern sich die Sprungdistanzen zwischen Adressen vor der Einfügestelle und innerhalb des verschobenen Blockes. Daher müssen die in den entsprechenden Sprungbefehlen angegebenen Distanzen ggf. angepaßt werden.

Hinweis:
Die Startadresse der F1-Funktion wird beim Drücken der Taste F1 aus den Speicherstellen $006C,$006D (H-Byte,L-Byte) entnommen.Diese Stellen liegen im Schreib/Lese-Speicher. Daher können sie vom Benutzer jederzeit geändert werden. So kann durch die Taste F1 eine eigendefinierte Funktion aktiviert werden.

1.2/11


("Delete", KZ: dE)
Diese Taste ist mit der "Lösch-Funktion" vorbelegt, mit der ein einzelnes Byte aus einem zusammenhängenden Datenbereich oder einem Programm entfernt werden kann.

Dazu muß zunächst (mit der Taste A) die Adresse der zu löschenden Speicherzelle ins Adreßfeld geschrieben werden. Durch Drücken der Taste F2 werden dann die 255 folgenden Bytes jeweils um eine Zelle nach unten (gegen niedrigere Adressen) verschoben. In das 256 Byte wird der hexadezimale Wert $FF nachgezogen. Mehrmalige Betätigung der Taste F2 erlaubt so das einfache Löschen eines ganzen Speicherbereiches. Auch hier müssen Sprungdistanzen ggf. korrigiert werden.

Bild 1.2-5 zeigt ein Beispiel für die zweifache Ausführung der Delete-Funktion.


Bild 1.2-5:Beispiel für die zweifache Ausführung der Delete-Funktion

1.2/12

Hinweis: Die Startadresse für die F2-Funktion wird den RAM-Speicherzellen $006F, $0070 (H-Byte,L-Byte) entnommen und kann daher vom Benutzer jederzeit geändert werden. So ist es möglich, durch die Taste F2 eine andere Funktion aufzurufen.


("Dump", KZ: dU)
Diese Taste erlaubt in ihrer Vorbelegung ein schnelleres "Durchblättern" eines zusammenhängenden Speicherbereiches. Das Betätigen der Taste führt zu der Anzeige:

Nach Eingabe der Anfangsadresse des Bereiches, der dargestellt werden soll, muß ein weiteres Mal die Taste F3 gedrückt werden. Danach erscheinen in der Anzeige die ersten vier Bytes des angewählten Speicherbereiches. Durch die Taste + können jeweils die vier folgenden Bytes, durch die Taste - die vier vorhergehenden Bytes dargestellt werden. Die Dump-Funktion wird durch das Betätigen einer beliebigen anderen Funktionstaste abgebrochen. Das folgende Beispiel zeigt die mehrfache Anwendung der Dump-Funktion (vgl. Bild 1.2-6).


Bild 1.2-6:Mehrfache Anwendung der Dump-Funktion

Die Startadresse der F3-Funktion ist in den Speicherzellen $0072, $0073 (H-Byte,L-Byte) abgelegt und kann wiederum vom Benutzer zum Aufruf einer eigenentwickelten Funktion über die Taste F3 modifiziert werden.

1.2/13


("Break", KZ:br)
(Die Startadresse des Programmes sollte $0400 sein.) Durch diese Taste kann ein laufendes Programm jederzeit unterbrochen werden. Voraussetzung dafür ist, daß im Bedingungsregister CC des 6809 nicht das Interruptflag (I-Flag, s. Abschnitt 1.3.2) gesetzt und im Port-Baustein 6821 der Interrupteingang CA1 (s. Kapitel 4) nicht deaktiviert wurde. Die Startadresse der Break-Routine liegt in den RAM-Speicherzellen $0036 und $0037. In der Anzeige erscheint z.B. die Information:

Das heißt, daß das Programm vor der Ausführung des Opcodes in Adresse $1011 unterbrochen wurde. Nun ist es möglich, sich die Registerinhalte mit der Taste R oder bestimmte Speicherplätze mit der Taste A anzusehen, und danach das Programm an der Unterbrechungsstelle fortzusetzen (Taste G oder Taste T).

Im Unterschied zu den drei Tasten F1-F3 ist hier eine Änderung der Startadresse nicht möglich, da die Taste F4 einen Hardware-Interrupt erzeugt.


Zusammenfassung

Die bisher beschriebenen Funktionen erlauben es, auf einfache Weise durch die Taste:

1.2/14

Im nächsten Abschnitt werden Sie weitere fest implementierte Funktionen kennenlernen, die Ihnen die Arbeit mit dem Mikrorechner erleichtern werden. Sie sind im Gegensatz zu den bisher erklärten Funktionen nicht durch eine bestimmte Taste, sondern nur durch einen Unterprogrammsprung aufzurufen.

Hinweis auf eine Testmöglichkeit
Zum Abschluß dieses Abschnittes möchten wir Ihnen noch kurz erklären, wie man den Befehl SWI1 (Opcode $3F), den Sie bereits von der Beschreibung der Taste G kennen, einsetzen kann, um das Testen eines Programmes zu erleichtern:
Dazu können Sie an wichtigen Stellen diesen Befehl einfügen. Jedesmal, wenn im Programmlauf dieser Befehl gefunden wird, wird das Programm durch die oben beschriebene Interruptroutine unterbrochen. Sie können danach den abgespeicherten Inhalt der internen Register (Taste R) und bestimmter Speicherstellenanschauen (Taste A) und verändern (Taste D) und das Programm an der Unterbrechungsstelle erneut starten (Taste G oder Taste T). Erst wenn dieser Test ein fehlerfreies Programm zeigt, ersetzen Sie alle SWI1-Befehle durch den Befehl No Operation (NOP, Opcode $12), der lediglich ein Inkrementieren des Befehlszählers im Mikroprozessor bewirkt (s. Abschnitt 1.3).

Wichtiger Tip
Der Befehl SWI1 bietet auch eine geschickte Möglichkeit, ein Anwenderprogramm mit einem Sprung in das Monitor-Programm zu verlassen.

1.2/15

1.2.2 Hilfsroutinen

In diesem Abschnitt werden wir Ihnen einige Hilfsroutinen vorstellen, die Ihnen das Arbeiten mit dem Mikrorechner erleichtern sollen. Natürlich wäre es besser, wenn Sie jetzt bereits die Architektur und den Befehlssatz des Mikroprozessors kennen würden. Dennoch haben wir uns dazu entschlossen, diese Routinen bereits hier zu erklären. Auf diese Weise sind Sie in der Lage, sie bereits bei der Beschreibung des Mikroprozessors und den dabei von Ihnen begleitend durchzuführenden Übungen nutzbringend anzuwenden.

Für das Verständnis dieses Abschnittes müssen Sie nur wissen, daß der Prozessor zwei 8-bit-Akkumulatoren A und B sowie zwei 16-bit-Indexregister X,Y besitzt. Die Akkumulatoren A und B können auch zu einem 16-bit-Akkumulator D (A: H-Byte, B: L-Byte) verkettet werden. Die Register werden von den Hilfsroutinen zur Aufnahme der Eingangs- und Ausgangsparameter benutzt. Grundsätzlich sind die Routinen so geschrieben worden, daß in ihnen zunächst die Inhalte aller zusätzlich benötigten Register in den Kellerspeicher (Systemstack) gerettet werden. Vor dem Ende der Routinen werden diese Register dann wieder "restauriert", so daß Ihnen die ursprünglichen Werte danach unverändert zur Verfügung stehen. Nur die Inhalte der in den folgenden Beschreibungen explizit als Ein- oder Ausgaberegister angegebenen Regi-ster werden durch die Routinen verändert.

Nach Eingabe der jeweils benötigten Parameter in den Registern A,B,X,Y können Sie die Routinen durch einen Unterprogrammsprung (Jump to SubRoutine - JSR, Branch to SubRoutine - BSR, s. Abschnitt 1.3) ansprechen.

Mit dem Begriff Anzeigepuffer werden 8 Speicherzellen im RAM bezeichnet, die durch die entsprechenden Routinen "zusammenhängend" in die Anzeige übertragen werden. Dies ermöglicht es, vor der Darstellung in der Anzeige die Information zunächst im RAM zu "editieren".

Die Startadressen der Hilfsroutinen sind in einer Tabelle untergebracht, die im Adreßbereich $F100-$F1FF im EPROM liegt. In Tabelle 1.2-1 sind diese Startadressen mit einer Kurzbeschreibung der Routinen zusammengefaßt 1).

Es folgt nun eine detailliertere Beschreibung der aufgeführten Hilfsroutinen. Eine Übersicht zeigt Tabelle 1.2-1. Ein vorangesetztes $-Zeichen bezeichnet stets eine Hexadezimalzahl. In der 7-Segmentanzeige des Mikrorechners dargestellte Zeichen werden in ".." gesetzt. Verkürzend werden im folgenden auch Speicherzellen mit dem Begriff Ein- bzw. Ausgabe-"Register" bezeichnet. Durch eckige Klammern ([ ]) wird der Inhalt einer Speicherzelle angegeben, durch spitze Klammern (< >) eine durch ein Register adressierte Speicherzelle. Mit ":=" wird die Übertragung eines Wertes in eine Speicherzelle oder ein Register symbolisiert.

1.2/16

Tabelle 1.2-1: Übersicht über die implementierten Monitor-Routinen

Name FunktionAdresse
 1. Umwandlungsroutinen 
T7SG Umwandlung der unteren Tetrade von B in den 7-Segment-Code, Ergebnis in A F100
B7SG Umwandlung beider Tetraden von B in den 7-Segment-Code, Ergebnis in D=A,B F103
D7SG Umwandlung der vier Tetraden von D in den 7-Segment-Code, Ergebnis in D,Y F106
  2. Darstellungsroutinen  
CLRDISP Löschen der Anzeige F110
SHOWA Bringt A in die Anzeige, Position in X F113
SHOWD Bringt D in die Anzeige, Position in X F116
SHOWYD Bringt Y,D in die Anzeige, Position in X F119
SHOWT7SG Umwandlung der unteren Tetrade von B in 7-Segment-Code, Darstellung in der Anzeige, Position in X F11C
SHOWB7SG Umwandlung beider Tetraden von B in den 7-Segment-Code, Darstellung in der Anzeige, Position in X F120
SHOWD7SG Umwandlung der vier Tetraden von D in den 7-Segment-Code, Darstellung in der Anzeige, Position in X  
 3. Routinen zur Bearbeitung des Anzeigepuffers
(Adresse des Puffers in X)
 
CLRBUF Löschen des Anzeigepuffers F130
SHOWDBUF Übertragen des Puffers in die Anzeige F133
RRDBUF Rotieren des Puffers um eine Stelle nach rechts F136
RLDBUF Rotieren des Puffers um eine Stelle nach links F139
COPYDBUF Kopieren eines 2. Puffers in den Anzeigepuffer F13C
 4. Routinenzur Abfrage der Tastatur 
KEY Lesen der Tastatur ohne Warten, Tastencode nach B F140
HALTKEY Lesen der Tastatur mit Warten, Tastencode nach B F143
SHOWKEY Lesen der Tastatur ohne Warten und Anzeigen, Tastencode nach BF146
SHOWHKEY Lesen der Tastatur mit Warten und Anzeigen, Tastencode nach BF149
INDATA Einlesen eines 8-bit-Datums über die Tastatur, Datum nach A, Tastencode nach BF14C
SHOWDATA Einlesen eines 8-bit-Datums über die Tastatur und Anzeigen, Datum nach A, Tastencode nach B F150
INADR Einlesen einer 16-bit-Adresse über die Tastatur, Adresse nach Y, Tastencode nach B F153
SHOWADR Einlesen einer 16-bit-Adresse über die Tastatur und Anzeigen, Adresse nach Y, Tastencode nach B F156
 5. weitere Routinen 
DLY1MS Schleife zur Zeitverzögerung, Zeitdauer in Y vorgegeben F160
RANDOM Pseudo-Zufallszahlengenerator, alter und neuer Wert in Y F163
COPYXD Verschieben von Speicherbereichen, Startadressen in X,Y, Länge in D F166

1.2/17

Praktische Übung P1.2-2:
Führen Sie alle folgenden Routinen mit geeigneten Parametern selbst durch. Diese Parameter können Sie mit der Registerauswahl-Funktion der Taste R(s. Ab-schnitt 1.2.1) eingeben. Danach rufen Sie mit der Taste G(z.B. für die Routine SHOWA) das folgende kurze Programmstück auf:
Adresse Befehl Mnemocode Bemerkung
0400
0401
0402
BD
F1
13
JSR SHOWA ggf. andere Startadresse einsetzen,
danach für :
    Hilfsroutinen, die etwas in der Anzeige darstellen
0403 13SYNC Warteschleife, beenden durch "Clear" (Taste C).
    Hilfsroutinen, die ohne Anzeige arbeiten
0403 3FSWI1 Softwareinterrupt, Sprung in den Monitor, Taste R: Register überprüfen und ändern.

1. Umwandlungsroutinen

T7SG Startadresse: $F100
 Eingaberegister: B
 Ausgaberegister: A
 Funktion: Die untere Tetrade von B, also die Bits B0-B3, wer-den in den 7-Segment-Code umgewandelt. Dieser steht danach im Akkumulator A zur Verfügung. Der Akkumulator B bleibt unverändert.
 Beispiel: Eingabe:
Ausgabe:
B:=$D8
A:=$7F, B:=$D8
B7SG Startadresse: $F103
 Eingaberegister: B
  Ausgaberegister: D (bzw. A,B)
 Funktion: Beide Tetraden von B werden in den 7-Segment-Code umgewandelt. Der Code der oberen Tetrade steht danach im Akkumulator A, der der unteren Tetrade im Akkumulator B zur Verfügung.
 Beispiel: Eingabe:
Ausgabe:
B:=$D8
A:=$5E, B:=$7F.

1.2/18

D7SG Startadresse: $F106
 Eingaberegister: D
 Ausgaberegister: D,Y
  Funktion: Die in D (bzw. A,B) stehenden 2 Bytes, entsprechend 4 Tetraden, werden in den 7-Segment-Code umgewandelt. Nach der Ausführung stehen die beiden Codes des Bytes aus A in Y, die beiden Codes des Bytes aus B in D (vgl. B7SG)
 Beispiel: Eingabe:
Ausgabe * :
D=A,B:=$D87C
Y:=$5E7F, D:=$0758

2. Darstellungsroutinen

In den folgenden Routinen besitzt das X-Register eine fest vorgegebene Doppelfunktion. Dazu ist es in die beiden Bitgruppen X15,..,X3 und X2,X1,X0 unterteilt. Die Zahl n=X2,X1,X0 (0 < n < 7) dient als Zeiger auf die rechte Stelle des Anzeigefeldes, in dem eine Information geschrieben werden soll. Die Zahl m=X15,..,X3 (m=8 *)i, 0<i<213) zeigt auf den Beginn eines 8 byte großen Pufferbereiches im Speicher. Dieser Pufferbereich wird durch <X>,...,<X+7> dargestellt. Nach der Vorgabe durch m beginnt er immer mit einer Adresse $xxx0 oder $xxx8 (x aus dem Bereich 0,..,F) 2).

Alle Darstellungsroutinen lassen den Pufferzeiger m unverändert, so daß es reicht, diesen für eine Folge von Routinen-Ausführungen ein einziges Mal zu setzen. Das X-Register mit der beschriebenen Doppelfunktion wird im folgenden mit X=(m,n) bezeichnet. Die 8 Stellen der Anzeige werden S7,...,S0 genannt. Dabei ist S0 die rechte, S7 die linke Stelle in der Anzeige (s. Abschnitt 1.2.1). Wird eine Stelle Si mit i>7 angesprochen, so hat diese Aktion keine Auswirkung auf die Anzeige.

CLRDISP Startadresse: $F110
Eingaberegister: keines
Ausgaberegister: Anzeige S7,...,S0
Funktion: Diese Routine löscht die gesamte Anzeige, d.h. in die entsprechenden Speicherzellen 3) wird der Wert $00 eingeschrieben.

1.2/19

SHOWAStartadresse: $F113
Eingaberegister: A, X=(m,n)
Ausgaberegister: Anzeige S7,...,S0
Funktion: Die Nummer n=X2,X1,X0 der Anzeigestelle steht in den 3 unteren Bits von X. Das Byte in A wird in die so ausgewählte Anzeigestelle im Hexadezimalcode übertragen. Dabei gilt folgende Beziehung zwischen den Bits A0,..,A7 des Akkumulators A und den Segmenten a,b,..,h der Anzeige:
Beispiel: Eingabe:
Ausgabe:
A:=$7F, X:=0005
S5:="8"

 

SHOWD Startadresse: $F116
Eingaberegister: D; X=(m,n)
Ausgaberegister: Anzeige S7,...,S0
Funktion: Die beiden Bytes in D=A,B werden hexadezimal in die Anzeigestellen Sn,Sn+1 geschrieben, wobei B nach Sn und A nach Sn+1 kommt.
Beispiel: Eingabe:
Ausgabe:
D=A,B:=$5E7F, X:=$0004
S5:="d", S4:="8"

 

SHOWYD Startadresse: $F119
Eingaberegister: Y; D; X=(m,n)
Ausgaberegister: Anzeige S7,...,S0
Funktion: Diese Routine stellt die vier Bytes in den Registern Y und D hexadezimal in der Anzeige dar. Das Byte aus B kommt in die Stelle Sn, das Byte aus A in die Stelle Sn+1. Das niederwertige Byte aus Y wird nach Sn+2 und das höherwertige nach Sn+3 übertragen (natürlich nur, sofern n+i<8).
Beispiel: Eingabe:
Ausgabe:
Y:=$5E7F, D:=$075B, X:=$0000
S3:="d", S2:="8", S1:="7", S0:="2"

1.2/20

SHOWT7SG Startadresse: $F11C
Eingaberegister: B, X=(m,n)
Ausgaberegister: Anzeige S7,...,S0
Funktion: Diese Routine verknüpft die Routinen T7SG und SHOWA. Die Akkumulatoren A,B bleiben jedoch unverändert. Die untere Tetrade von B wird zunächst in den 7-Segmentcode umgewandelt. Danach wird dieser in die Anzeigestelle Sn gebracht.
Beispiel: Eingabe:
Ausgabe:
B:=$D8, X:=$0005
S5:="8"

 

SHOWB7SG Startadresse: $F120
Eingaberegister: B, X=(m,n)
Ausgaberegister: Anzeige S7,...,S0
Funktion: Diese Routine verknüpft die Routinen B7SG und SHOWD. Beide Tetraden in B werden zunächst in den 7-Segmentcode umgewandelt. Danach werden diese in die Anzeigenstellen Sn und Sn+1 übertragen.
Beispiel: Eingabe:
Ausgabe:
B:=$D8, X:=$0004
S5:="d", S4:="8"

 

SHOWD7SGStartadresse: $F123
Eingaberegister: D (bzw. A,B) , X=(m,n)
Ausgaberegister: Anzeige S7,...,S0
Funktion: Diese Routine kombiniert die Routine D7SG und SHOWYD. Alle vier Tetraden von D werden zunächst in den 7-Segmentcode umgewandelt. Danach werden sie in die 4 Anzeigestellen Sn,Sn+1,Sn+2, Sn+3 übertragen (sofern n+i<8 !).
Beispiel: Eingabe:
Ausgabe:
D=A,B:=$D87C, X:=$0000
S3:="d",S2:="8",S1:="7",S0:="c"

1.2/21

3. Routinen zur Bearbeitung des Anzeigepuffers

CLRBUF Startadresse: $F130
Eingaberegister: X
Ausgaberegister: <X>,...,<X+7>
Funktion: Das X-Register zeigt auf den Anfang eines 8-byte-Speicherbereiches (Anzeigepuffer). Dieser Bereich wird auf den Wert $00 zurückgesetzt.
Beispiel: Eingabe:
Ausgabe:
X:=$1040
[$1040]:=$00,...,[$1047]:=$00

 

SHOWDBUF Startadresse: $F133
Eingaberegister: X, <X>,..,<X+7>
Ausgaberegister: Anzeige S7,...,S0
Funktion: Durch das X-Register wird wieder ein 8 byte großer Anzeigepuffer <X>,..,<X+7> im Speicher selektiert. Dieser Bereich wird in die Anzeigestellen S7,..,S0 übertragen, wobei <X+i> nach Si kommt (i=0,..,7).
Beispiel: Eingabe:
Ausgabe:
X:=$1048
S0:=[$1048],...,S7:=[$104F]

 

RRDBUF Startadresse: $F136
Eingaberegister: X, <X>,..,<X+7>
Ausgaberegister: <X>,...,<X+7>
Funktion: Der 8-byte-Anzeigepuffer <X>,...,<X+7> wird um eine Stelle "nach rechts rotiert", d.h. der Inhalt der Speicherzelle <X+n-1> wird in die Speicherzelle <X+n> (n=1,..,6) übertragen, der Inhalt der Zelle <X+7> in die Zelle <X>.
Beispiel: Eingabe:
Ausgabe:
X:=$1040
[$1041]:=[$1040] 4)
...........
[$1046]:=[$1045]
[$1047]:=[$1046]
[$1040]:=[$1047]
Hinweis: Da die Reihenfolge der 8 Stellen in der Anzeige umgekehrt gewählt wurde, bedeutet eine Linksverschiebung im Puffer mit anschließender Darstellung eine Rechtsverschiebung in der Anzeige. Diese Richtungsumkehrung gilt entsprechend auch für die folgende Routine.

1.2/22

RLDBUF Startadresse: $F139
Eingaberegister: X, <X>,..,<X+7>
Ausgaberegister: <X>,...,<X+7>
Funktion: Der 8-byte-Anzeigepuffer <X>, ..., <X+7> wird um eine Stelle "nach links rotiert", d.h. der Inhalt der Speicherzelle <X+n> wird in die Speicherzelle <X+n-1> (n=1,...,7) übertragen, der Inhalt der Zelle <X> in die Zelle <X+7>.
Beispiel: Eingabe:
Ausgabe:
X:=$1040
[$1040]:=[$1041]
[$1041]:=[$1042]
............
[$1046]:=[$1047]
[$1047]:=[$1040]

 

COPYDBUF Startadresse: $F13C
Eingaberegister: X,Y,<Y>,..,<Y+7>
Ausgaberegister: <X>,...,<X+7>
Funktion: Der durch das Y-Register adressierte 8-byte-Speicherbereich <Y>,..,<Y+7> wird in den Anzeigepuffer <X>,..,<X+7> kopiert.
Beispiel: Eingabe:
Ausgabe:
X:=$1040, Y:=$1060
[$1040]:=[$1060]
[$1041]:=[$1061]
..........
[$1047]:=[$1067]

4. Routinen zur Abfrage der Tastatur

Die folgenden Routinen verlangen teilweise nur eine Eingabe von der Tastatur. Daher entfällt in diesen Fällen die Angabe eines Eingaberegisters. Bei allen Routinen wird dafür gesorgt, daß das "Prellen" einer Taste nicht zu einer falschen Information führt.

KEYStartadresse: $F140
Ausgaberegister: B
Funktion: Diese Routine liest einmalig die Tastatur. Im Akkumulator B wird der Wert $FF zurückgegeben, wenn keine Taste gedrückt wird, in allen anderen Fällen enthält B den Tastencode nach der folgenden Tabelle 1.2-2.
Beispiel: Ausgabe:B:=$88, Taste T gedrückt,
B:=$FF, keine Taste gedrückt.

1.2/23

Tabelle 1.2-2: Tastencodes

Datentasten Funktionstasten
TasteCode TasteCodeTasteCode TasteCode
0$008 $08+$80T $88
1$01 9$09-$81F1 $89
2$02 A$0AA$82F2 $8A
3$03 B$0BD$83F3 $8B
4$04 C$0CR$84   
5$05D $0DG$85   
6$06E $0ES$86   
7$07F $0FL$87   
(Sie dürfen diese Tastencodes nicht mit den durch die Hardware vorgegebenen Codes der Tastatur verwechseln, wie Sie sie in Kapitel 2 kennenlernen werden. Hier handelt es sich um eine "willkürlich" gewählte Codierung der Routine KEY.)

 

HALTKEY Startadresse:$F143
Ausgaberegister: B
Funktion: Diese Routine liefert den gleichen Code wie die Routine KEY, wenn eine Taste gedrückt wird. Im Unterschied zu dieser wird nun jedoch die Tastatur zyklisch solange abgefragt, bis eine Taste gedrückt wurde oder aber die Routine unterbrochen wird (Taste F4 oder Taste C).
Beispiel: Ausgabe: B:=$81 ,Taste - gedrückt.
Hinweis: Diese Routine bietet die Möglichkeit, ein Benutzerprogramm zu "beenden", ohne daß die Anzeige verändert wird. Ist der nächste Befehl nach dem Aufruf der Routine ein SWI1, so führt jeder Tastendruck zu einem Sprung in den Monitor.

1.2/24

SHOWKEY Startadresse:$F146
Eingaberegister: X=(m,n)
Ausgaberegister: B, Anzeige S7,..,S0
Funktion: Diese Routine liest wie KEY einmal die Tastatur. Der erhaltene Tastencode nach Tabelle 1.2-2 wird jedoch in den 7-Segment-Code umgewandelt und in der Anzeigestelle Sn dargestellt. Bei den Funktionstasten wird lediglich die untere Tetrade umgewandelt und dargestellt. Zu ihrer Erkennung wird jedoch außerdem der Dezimalpunkt der Stelle Sn angesprochen. Ist keine Taste gedrückt worden, so wird wieder B:=$FF gesetzt und die angewählte Stelle durch Sn:=" " gelöscht.
Beispiel:Eingabe:
Ausgabe:
X:=$0003
B:=$04, S3:="4", Taste 4,
B:=$86, S3:="6.", Taste S,
B:=$FF, S3:=" ", keine Taste

 

SHOWHKEY Startadresse:$F149
Eingaberegister: X=(m,n)
Ausgaberegister: B, Anzeige S7,..,S0
Funktion: Diese Routine verknüpft die Routinen HALTKEY und SHOWT7SG. Die Tastatur wird ununterbrochen solange gelesen, bis eine Taste gedrückt wird. Der Tastencode (s. Tabelle 1.2-2) wird dann in der Stelle Sn dargestellt.
Beispiel: Eingabe:
Ausgabe:
X:=$0005
B:=$87, S5:="7.", Taste L

 

INDATA Startadresse: $F14C
Ausgaberegister: A, B
Funktion: Diese Routine liest zyklisch die Tastatur und packt die beiden jeweils zuletzt eingegebenen Hexadezimalzeichen {0,..,F} nach A. Die Routine wird durch Betätigen einer beliebigen Funktionstaste verlassen. Deren Tastencode steht danach in B zur Verfügung. Der Accu A wird mit dem Wert $00 initialisiert.
Beispiel: Initialisierung: A:=$00
Taste 4: A=$04
Taste 8: A=$48
Taste D: A=$8D
Taste +: A=$8D, B=$80

1.2/25

SHOWDATA Startadresse: $F150
Eingaberegister: X=(m,n)
Ausgaberegister: A,B, Anzeige S7,..,S0
Funktion: Diese Routine verknüpft die Routinen INDATA und SHOWB7SG, liest also ein Datum über die Tastatur und stellt es in der Anzeige dar.
Beispiel: Initialisierung: A:=$00, X:=$0000, S1:="0", S0:="0"
Taste 4: A=$04, S1="0", S0="4"
Taste F: A=$4F, S1="4", S0="F"
Taste D: A=$FD, S1="F", S0="D"
Taste +: A=$FD, S1="F", S0="D", B=$80

 

INADR Startadresse: $F153
Ausgaberegister: Y,B
Funktion: Diese Routine liest zyklisch die Tastatur und packt jeweils die letzten vier eingegebenen Hexadezimalzeichen ins Y-Register. Dabei werden die Zeichen in Y tetradenweise zu den höherwertigen Bitpositionen verschoben. Die Routine wird durch das Betätigen einer beliebigen Funktionstaste verlassen. Der entsprechende Tastencode steht danach im Accu B zur Verfügung. Y wird mit dem Wert $0000 initialisiert.
Beispiel: Initialisierung: Y:=$0000
Taste 4:Y=$0004
Taste F:Y=$004F
Taste D:Y=$04FD
Taste 9:Y=$4FD9
Taste 0:Y=$FD90
Taste +:Y=$FD90, B=$80

 

SHOWADR Startadresse: $F156
Eingaberegister: X=(m,n)
Ausgaberegister: A,B, Anzeige S7,...,S0
Funktion: Diese Routine verknüpft die Routinen INADR und SHOWD7SG, d.h. sie liest eine vierstellige Zahl (Adresse) über die Tastatur ins Y-Register und stellt sie gleichzeitig in der Anzeige dar. Y wird mit dem Wert $0000 initialisiert.
Beispiel: Initialisierung: Y:=$0000, X:=$0002, S5..S2:="0000"
Taste 4:Y=$0004, S5..S2="0004"
Taste F:Y=$004F, S5..S2="004F"
Taste D:Y=$04FD, S5..S2="04FD"
Taste 9:Y=$4FD9, S5..S2="4FD9"
Taste 0:Y=$FD90, S5..S2="FD90"
Taste +:Y=$FD90, S5..S2="FD90", B=$80

1.2/26

5. Weitere Hilfsroutinen

DLY1MSStartadresse: $F160
Eingaberegister: Y
Funktion: Diese Routine erzeugt eine Zeitverzögerung bis zur Ausführung des nächsten Befehls im Benutzerprogramm. Die Verzögerungszeit ist in msec-Schritten im Y-Register zu wählen und berechnet sich nach der Formel:

Td= (0.034 + Y) msec.

Y=$0000 wird dabei als $10000=216=65536 interpretiert und ergibt somit die maximale Verzögerungszeit

Td,max= 65.536034 sec.

Beispiel: Eingabe:Y:=$03E8=1000 ergibt eine Verzögerung von ca. 1 Sekunde

 

RANDOM Startadresse: $F163
Eingaberegister: Y
Ausgaberegister: Y
Funktion: Diese Routine erzeugt aus der eingegebenen Zahl im Y-Register eine 16-bit-Pseudo-Zufallszahl, die ebenfalls im Y-Register ausgegeben wird. Startet man eine Programmfolge zur Erzeugung von Zufallszahlen mit einem Wert Y>$0000 und wird das jeweils zuletzt erhaltene Ergebnis als Eingabe für den neuen Durchlauf benutzt, so werden in einer fest vorgegebenen Reihenfolge alle 65535 möglichen Zufallszahlen aus dem Bereich $0001 - $FFFF generiert. Diese Zufallszahlen sind gleichverteilt. Man spricht von Pseudo-Zufallszahlen, weil dieselbe Reihenfolge der Zahlen immer dann gezogen wird, wenn man mit demselben Startwert beginnt.
Beispiel: Eingabe:
Ausgabe:
Y:=$BB8C (Startwert)
Y:=$4B35 (= neue Eingabe)
Y:=$3FCA (= neue Eingabe)
Y:=$405B

1.2/27

COPYXD Startadresse: $F166
Eingaberegister: X,Y, D=A,B
Funktion: Diese Routine kopiert einen zusammenhängenden Speicherbereich in einen anderen. Die Startadresse des Quellbereiches wird dazu im X-Register, die des Zielbereiches im Y-Registers angegeben. Die Länge des Bereiches muß im D-Register übergeben werden.
Beispiel: Eingabe:
Ausgabe:
X:=$0400, Y:=$0600, D:=$00FF
[$0600]:=[$0400]
[$0601]:=[$0401]
....
[$06FF]:=[$04FF]

1.1 Einleitung 1.3 Der Mikroprozessor MC6809