5.2 Praktische Übungen MC6840 Lösungsvorschläge zu den Praktischen Übungen

5.3/1

5.3 Praktische Übungen zum Praktikumsrechner

Nachdem wir in den vorausgehenden Kapiteln und Abschnitten alle Komponenten des Praktikumsrechners ausführlich beschrieben haben, wollen wir Ihnen nun in diesem letzten Abschnitt Gelegenheit geben, sich in Praktischen Übungen mit allen diesen Komponenten noch einmal im Zusammenhang zu beschäftigen.1) Am Ende der Kurseinheit finden Sie zu jeder Übung eine Musterlösung. Bewußt haben wir bei diesen Lösungen auf die Angabe von Kommentaren verzichtet. Denn Sie sollen nur im "Notfall", also dann, wenn Sie keine eigene Lösung finden, darauf zurückgreifen. In diesem Fall sollen Sie den Programmablauf selbst analysieren und herausfinden, was durch die einzelnen Befehle geleistet wird. (In der Kopfzeile der Aufgaben sind jeweils die Komponenten angegeben, die in den Aufgaben besonders behandelt werden.)

Praktische Übung P5.3-1: (Komponente: CPU)
Es soll ein Programm geschrieben werden, das einen vierstelligen Dezimal-/Hexadezimal-Zähler realisiert. Der Zählmodus, die Schrittweite des Zählers sowie der Anfangswert des Zählzyklus sollen über die Tastatur einzugeben sein.

Im einzelnen soll das Programm

  1. die Anzeige löschen.

  2. mit dem Startwert '0000' beginnend, ca. im 1/4-Sekunden-Takt mit der Schrittweite 1 in den Anzeigestellen S5-S2 (Adreßfeld) aufwärtszählen.

  3. dabei die Tastatur abfragen und folgendermaßen auf die Tasten reagieren:

    Taste "R": Rücksetzen des Zählerzustandes auf '0000', Fortsetzen des Zählvorganges.
    Taste "S": Anhalten des Zählvorganges, solange die Taste gedrückt wird.
    Taste "A": Eingabe eines vierstelligen Anfangswertes (z.B. mit SHOWADR, beendet durch "+"), danach Fortsetzen des Zählvorganges.
    Taste "+": Wahl des hexadezimalen Zählmodus.
    Taste "-":Wahl des dezimalen Zählmodus.
    "0,..,F": Datentasten: Vorgabe der Zählerschrittweite 0-15. Diese bleibt bis zur nächsten Eingabe unverändert.

    Alle anderen Funktionstasten sollen ohne Wirkung sein.

5.3/2

Praktische Übung P5.3-2: (Komponente: CPU)
Gesucht ist ein Programm, das eine eingegebene Dezimalzahl Z=d2d1d0 (mit 0<Z<127) in die entsprechende Hexadezimalzahl umwandelt. Die Darstellung soll wahlweise im Zweierkomplement erfolgen.

Im einzelnen soll Ihr Programm

  1. die Anzeige löschen,

  2. sukzessiv die drei Dezimalziffern d2, d1, d0 einlesen und sofort in den Anzeigestellen S4, S3, S2 des Adreßfeldes darstellen; dabei sollen alle anderen Tasten (A,..,F und Funktionstasten) nicht akzeptiert werden,

  3. feststellen, ob die eingegebene Zahl im vorgegebenen Bereich 0<Z<127 liegt;
    - ist dies nicht der Fall, so soll nach ca. 1 Sekunde das Programm von vorne begonnen werden (Punkt 1.),
    - liegt sie im Bereich, muß sie in die Hexadezimalform umgerechnet werden (s. Hinweis),

  4. danach die Tastatur abfragen und nach Drücken der
    Taste 'S' zur Eingabe der nächsten Zahl zum Anfang zurückspringen,
    Taste '+' im Operationsfeld (Stelle S7) das stilisierte '+'-Zeichen "|-" sowie im Datenfeld (Stellen S1,S0) die Hexadezimalzahl darstellen,
    Taste '-' im Operationsfeld (Stelle S7) das Zeichen '-' sowie im Datenfeld (Stellen S1,S0) die Hexadezimalzahl im Zweierkomplement darstellen.

Hinweis: Z = d2d1d0 = d2·100 + d1·10 + d0 = d2·$64 + d1·$A + d0.

5.3/3

Praktische Übung P5.3-3: (Komponente: CPU)
Es soll ein Programm geschrieben werden, das die Eingabe einer vierstelligen Hexadezimalzahl und die wahlweise Darstellung dieser Zahl in "normaler" oder "invertierter" Form erlaubt. Unter "invertiert" soll dabei verstanden werden, daß die zunächst aktivierten LEDs der 7-Segment-Anzeige ausgeschaltet, die nicht aktivierten eingeschaltet werden.

Im einzelnen soll das Programm,

  1. die Anzeige löschen,

  2. die Eingabe der vierstelligen Hexadezimal-Zahl vornehmen. Diese Eingabe soll von links nach rechts geschehen, und die eingegebenen Ziffern sollen in den Anzeigestellen S5-S2 (Adreßfeld der Anzeige) dargestellt werden.

  3. die Tastatur zyklisch abfragen und folgendermaßen auf die Tasten reagieren:
    Taste "+": Darstellung der Zahl (in S5-S2) in normaler Form, also so wie sie eingegeben wurde.
    Taste "-": Darstellung der Zahl (in S5-S2) in invertierter Form.
    Taste "R":
    - automatischer Wechsel zwischen beiden Darstellungsformen ca. im 1/4-Sekunden-Takt. Durch Betätigen der
    - Funktionstaste "A": Abbruch des Wechsels in der Darstellung und Rücksprung zu 3.
    Taste "S": Verzweigung zu 1. zur Eingabe einer neuen Zahl.

Hinweise:
Alle anderen Funktionstasten brauchen nicht berücksichtigt zu werden. Zur Ziffern-Darstellung in invertierter Form können Sie die folgende Tabelle verwenden, die für jede Hex.-Ziffer 0,..,F die erforderliche Codierung zur Ansteuerung der Segmente in hexadezimaler Form angibt. Hex.-Ziffer 0 1 2 3 4 5 6 7 Codierung $40 $79 $24 $30 $19 $12 $02 $78 Hex.-Ziffer 8 9 A B C D E F Codierung $00 $18 $08 $03 $27 $21 $06 $0E

5.3/4

Praktische Übung P5.3-4: (Komponente: CPU)
Es soll ein Programm geschrieben werden, das eine Folge von 4-stelligen Hexadezimalzahlen einliest, in der Anzeige darstellt und in einem Benutzer-Stack ablegt. Gleichzeitig soll die Nummer des jeweiligen Stack-Eintrags dargestellt werden. Die Übernahme der Zahl in den Stack wird durch die Taste '+' ausgelöst. Durch die Taste '-' kann der aktuelle Stack-Inhalt in umgekehrter Reihenfolge abgerufen werden. Dabei soll eine Überprüfung auf "Stack Underflow" stattfinden und das Programm ggfs. von vorne beginnen.

Im einzelnen soll das Programm,

  1. die Anzeige löschen,

  2. eine 4-stellige Hexadezimal-Zahl als Initialwert für den Benutzer-Stackpointer einlesen und in den Anzeigestellen S5,..,S2 darstellen; (Die Eingabe soll durch die Funktionstaste 'Ad' ausgelöst werden, bei allen anderen Funktionstasten Rücksprung zu Punkt 1.)

  3. die Nummer des aktuellen Stackeintrags in den Anzeigestellen S1, S0 ausgeben;

  4. die Tastatur zyklisch abfragen, eine 4-stellige Hexadezimalzahl einlesen und in den Anzeigestellen S5,..,S2 darstellen;

  5. nach Betätigen der Taste '+':
    die Zahl in den Benutzer-Stack übertragen, den Zähler für den Stackeintrag um '1' erhöhen und mit Punkt 3. fortfahren;

  6. nach Betätigen der Taste '-':
    den Zähler für den Stackeintrag um '1' erniedrigen

    • falls Zählerwert = 0:
      • die Anzeige löschen,
      • 'SU' (Stack Underflow) in S7, S6 für ca. 1 Sekunde ausgeben,
      • mit Punkt 1. fortfahren;
    • falls Zählerwert > 0: selektierten Stackeintrag in S5,..,S2 darstellen;

  7. die Tastatur abfragen und nach Drücken der

    • Taste '-': mit Punkt 6. fortfahren,
    • aller anderen Tasten: mit Punkt 3. fortfahren.

5.3/5

Praktische Übung P5.3-5: (Komponente: CPU)
Es soll ein Programm geschrieben werden, das eine verschlüsselte Ausgabe des Speicherinhalts ermöglicht. Dazu soll zunächst als Code eine Permutation der Ziffern {0,..,9,A,..F} eingegeben werden und danach jedes auszugebende Datum mit diesem Code umgesetzt werden.

Im einzelnen soll das Programm,

  1. die Anzeige löschen,

  2. den benutzten Code als Permutation der Hex-Ziffern 0,..,F einlesen. Dazu soll sukzessiv ca. im Halbsekundentakt die jeweilige Ziffer in der Anzeigestelle S1 ausgegeben, die Stelle S0 gelöscht und danach über die Tastatur der Codewert eingelesen und in S0 dargestellt werden.

  3. danach sequentiell ca. im Halbsekundentakt den Speicherbereich ab Adresse $0400 lesen und verschlüsselt in der Anzeige in der folgenden Form ausgeben:
    • Anzeigestellen S5-S2: Adresse der aktuelle dargestellten Speicherzelle
    • Anzeigestellen S1-S0: Wert der adressierten Speicherzelle
    • Anzeigestellen S7-S6: Wert der Speicherzelle, aber umgewandelt mit dem zunächst eingegebenen Code.

  4. die unter 3. beschriebene Darstellung des Speicherbereichs mit einem Sprung ins Monitorprogramm abbrechen, sobald die Funktionstaste "S" betätigt wird.

Hinweis:
Die korrekte Eingabe des Codes unter 2. als Permutation der Hex-Ziffern obliegt dem Benutzer und muß nicht durch das Programm überprüft werden.

5.3/6

Praktische Übung P5.3-6: (Komponente: CPU)
Es soll ein Programm geschrieben werden, das eine eingegebene zweistellige Hex-Zahl verschlüsselt wieder ausgibt. Dazu soll zunächst als Code eine Permutation der Ziffern {0,..,9,A,..F} eingegeben werden und danach jedes eingelesene Datum mit diesem Code umgesetzt werden.

Im einzelnen soll das Programm,

  1. den benutzten Code als Permutation der Hex-Ziffern 0,..,F einlesen. Dazu sollen sukzessiv jeweils 4 Hex-Ziffern (0123/4567/89AB/CDEF) in den Anzeigestellen S7-S4 ausgegeben und die zugehörigen Codewerte eingelesen und in den Stellen S3-S0 dargestellt werden.

  2. danach
    • die Anzeige löschen,
    • eine zweistellige Hex-Zahl einlesen und in den Stellen S1,S0 darstellen,
    • die eingelesene Zahl ziffernweise mit dem unter 2. vorgegebenen Code umwandeln und in den Anzeigestellen S7,S6 ausgeben

  3. nach einer Verzögerung von ca. einer halben Sekunde mit Punkt 2. fortfahren.

Hinweise:
Zur Eingabe des Codes bzw. der umzuwandelnden Daten benutzen Sie am besten die Routinen SHOWADR und SHOWDATA. Die korrekte Eingabe des Codes unter 2. als Permutation der Hex-Ziffern obliegt dem Benutzer und muß nicht durch das Programm überprüft werden.

5.3/7

Praktische Übung P5.3-7: (Komponente: Anzeige)
Es soll ein Programm geschrieben werden, das eine Folge von Hexadezimal-Ziffern einliest und in einem Benutzer-Stack ablegt. Dabei soll jedes eingegebene Zeichen in der Anzeige in einer Art Balkendarstellung ausgegeben werden. Außerdem soll der Stackinhalt in beiden Richtungen fortlaufend in der Anzeige dargestellt werden können.

Im einzelnen soll das Programm,

  1. die Anzeige löschen;

  2. danach zyklisch die Tastatur abfragen und beim Betätigen

    • einer Datentaste k aus {0,..,9,A,..,F}:
      • k in einem Benutzer-Stack ab Adresse $1000 abspeichern,
      • k als Balkendarstellung durch das Zeichen '-' (Segment g) in allen Anzeigestellen Sj mit 0 j (k mod 8) ausgeben;

    • der Funktionstaste '-':
      sukzessiv alle bereits eingelesenen Stackwerte in umgekehrter Eingabereihenfolge ca. im Halbsekunden-Takt und in der eben beschriebenen Balkendarstellung ausgeben;

    • der Funktionstaste '+':
      sukzessiv alle bereits eingelesenen Stackwerte in der Eingabereihenfolge ca. im Halbsekunden-Takt und in der eben beschriebenen Balkendarstellung ausgeben.

Hinweise:

  1. Die Tasten '+' und '-' sollen mit gleicher Funktion beliebig oft zu betätigen sein.
  2. Alle nicht genannten Funktionstasten sollen keine Funktion haben.
  3. Die Darstellung der eingegebenen Daten als Balken geschieht am besten in einem Unterprogramm.
  4. Die sukzessive Darstellung der Stackwerte darf den aktuellen Stackbereich nicht überschreiten.

5.3/8

Praktische Übung P5.3-8: (Komponente: Anzeige)
Es ist ein Programm zu schreiben, daß eine waagerechte "Balkenanzeige" (in Form einer Segmentreihe) in der Anzeige nachbildet. Dabei sollen wahlweise das oberste oder das mittlere Segment jeder Anzeigestelle benutzt werden können. Ausgehend von der "gelöschten" Anzeige, soll der "Balken" solange nach rechts länger bzw. nach links kürzer werden, wie bestimmte Tasten gedrückt werden. In jedem Zustand soll ein Rücksprung in den Anfangszustand zur Auswahl einer Segmentreihe möglich sein.

Skizze:


Im einzelnen soll das Programm:

  1. zunächst die Anzeige löschen,

  2. die Auswahl der Segmentreihe (des Balkens) durch die Kennung 'E' in der Anzeigestelle S0 anfordern:

    • Funktionstaste 'A': oberste Segmentreihe (Segment a),
    • Funktionstaste 'G': mittlere Segmentreihe (Segment g),

    und danach zyklisch die Tastatur abfragen und nach Betätigen der

  3. Taste '+': den "Balken", wie oben beschrieben, (ungefähr) im Halb-Sekundentakt solange nach rechts wachsen lassen, wie die Taste '+' gedrückt ist, und bei Erreichen der Anzeigestelle S0 stoppen,

  4. Taste '-': den "Balken" (ungefähr)im Halb-Sekundentakt solange nach links schrumpfen lassen, wie die Taste '-' gedrückt ist, und nach Löschen der Anzeigestelle S7 stoppen,

  5. Taste 'R': mit der Auswahl einer neuen Segmentreihe unter 2. fortfahren.

(Alle Datentasten und nicht erwähnten Funktionstasten sind ohne Funktion)

Hinweis:
Die Benutzung der Routinen zur Bearbeitung des Anzeigepuffers (CLDBUF, SHOWDBUF, RRDBUF, RLDBUF, COPYDBUF) erleichtert die Lösung der Aufgabe.

5.3/9

Praktische Übung P5.3-9: (Komponente: Anzeige)
Es ist ein Programm zu schreiben, daß ein "Lauflicht" (in Form eines einzelnen Leuchtpunktes) zyklisch nach rechts durch die Anzeige rotiert (, so daß der rechts "herausfallende" Leuchtpunkt links wieder erscheint). Bei dieser Rotation sollen die Randsegmente (a,b,c,d,e,f; s. Skizze) der Anzeigestellen im Uhrzeigersinn durchlaufen werden. Die Rotation soll wahlweise segmentweise auf Anforderung oder aber kontinuierlich geschehen. In jedem Zustand soll ein Rücksetzen in den Anfangszustand möglich sein.

Skizze:


Im einzelnen soll das Programm:

  1. zunächst die Anzeige löschen,

  2. den Anfangszustand herstellen, in dem nur das Segment a der Anzeigestelle S7 aktiviert ist,

    und danach zyklisch die Tastatur abfragen und nach Betätigen der

  3. Taste '+': den "Leuchtpunkt" kontinuierlich, wie oben beschrieben, (ungefähr) im Viertel-Sekundentakt nach rechts durch die Anzeige rotieren lassen,
    Taste '-':die kontinuierliche Rotation stoppen,

  4. Taste 'S': den "Leuchtpunkt", wie oben beschrieben, (ungefähr) im Viertel-Sekundentakt solange nach rechts durch die Anzeige rotieren lassen, wie die Taste 'S' gedrückt ist,

  5. Taste 'R': den unter 2. beschriebenen Anfangszustand wieder herstellt.

(Alle Datentasten und nicht erwähnten Funktionstasten sind ohne Funktion)

Hinweis:
Die Benutzung der Routinen zur Bearbeitung des Anzeigepuffers (CLDBUF, SHOWDBUF, RRDBUF, RLDBUF, COPYDBUF) erleichtert die Lösung der Aufgabe.

5.3/10

Praktische Übung P5.3-10: (Komponente: Tastatur)
Es soll ein Programm geschrieben werden, das bei jedem Tastendruck die Zeile bzw. Spalte der Tastatur anzeigt, in der die gedrückte Taste liegt. Außerdem sollen der gewählte Modus "Zeile/Spalte" sowie der gedrückte Tastenwert dargestellt werden.

Im einzelnen soll das Programm,

  1. die Anzeige löschen und die Voreinstellung des "Zeilen-Modus" durch ein "L" in der Anzeigestelle S7 anzeigen;

  2. danach zyklisch die Tastatur abfragen und beim Betätigen

    • der Funktionstaste 'L':
      die Anzeige löschen, in den "Zeilen-Modus" schalten und dabei ein "L" in der Anzeigestelle S7 ausgeben;

    • der Funktionstaste 'S':
      die Anzeige löschen, in den "Spalten-Modus" schalten und dabei ein "S" in der Anzeigestelle S7 ausgeben;

    • einer Datentaste k aus {0,..,9,A,..,F}:
      • den Wert k in der Anzeigestelle S0 ausgeben;
      • im "Zeilen-Modus" die Zeile der Datentastatur in den Anzeigestellen S5-S2 ausgeben, in der k liegt;
      • im "Spalten-Modus" die Spalte der Datentastatur in den Anzeigestellen S5-S2 ausgeben, in der k liegt.

Alle anderen Funktionstasten (außer "L", "S") sollen keine Funktion haben.

Beispiel:
Taste Anzeige    
L L_ ____ __  _ gelöschteAnzeigestelle
5L_ 45 67 _5   
EL_ CDEF _E   
SS_ ____ __   
5S_ 159D _5   

5.3/11

Praktische Übung P5.3-11: (Komponente: Tastatur)
Es soll ein Programm geschrieben werden, das bei jedem Druck einer Datentaste die Position der betätigten Taste anzeigt. Die Darstellung soll wahlweise in zwei verschiedenen Modi möglich sein: durch Angabe der Zeilen- und Spaltennummer oder des "Quadranten", in dem die gedrückte Taste liegt. Außerdem sollen der gewählte Modus "Zeile&Spalte" bzw. "Quadrant" sowie der gedrückte Tastenwert dargestellt werden.

Im einzelnen soll das Programm,

  1. die Anzeige löschen und die Voreinstellung des "Zeilen&Spalten"-Modus durch eine "0" in der Anzeigestelle S7 anzeigen;

  2. danach zyklisch die Tastatur abfragen und beim Betätigen

    • der Funktionstaste 'A':
      die Anzeige löschen, in den "Zeilen&Spalten"-Modus schalten und dabei ein "0" in der Anzeigestelle S7 ausgeben;

    • der Funktionstaste 'D':
      die Anzeige löschen, in den "Quadranten"-Modus" schalten und dabei eine "1" in der Anzeigestelle S7 ausgeben;

    • einer Datentaste k aus {0,..,9,A,..,F}:
      • den Wert k in der Anzeigestelle S0 ausgeben;
      • im "Zeilen&Spalten"-Modus: in der Anzeigestelle S3 die Zeile 0-3 der Datentastatur und in S2 die Spalte 0-3 ausgeben, in der k liegt;
      • im "Quadranten"-Modus: in der Anzeigestelle S3 angeben, ob die Taste in der oberen (Ausgabe "o") oder unteren Hälfte (Ausgabe "u") liegt, in der Anzeigestelle S2, ob die Taste in der linken (Ausgabe "l") oder rechten Hälfte (Ausgabe "r") liegt.

Alle anderen Funktionstasten (außer "A", "D") sollen keine Funktion haben. Die Numerierung der Zeilen und Spalten sei so gewählt, daß die Datentaste "0" in der 0. Zeile und 0. Spalte, die Datentaste "F" in der 3. Zeile und 3. Spalte liegt.

Beispiel:
Taste Anzeige    
A 0_ ____ __  _ gelöschte Anzeigestelle
9 0_ __21 _9   
30_ __03 _3   
D1_ ____ __   
91_ __o l _9   
31_ __u r _3

5.3/12

Praktische Übung P5.3-12: (Komponente: Tastatur)
Es soll ein Programm geschrieben werden, das eine Folge von Tasteneingaben entgegen nimmt und die Gruppenzugehörigkeit (Datentaste oder Funktionstaste) jeder betätigten Taste in bestimmter Form in der Anzeige ausgibt. Sobald eine vorgegebene Obergrenze für eine der Tastengruppen erreicht ist, sollen die Anzahlen der betätigten Tasten jeder Gruppe ausgegeben werden und das Programm von vorne beginnen.

Im einzelnen soll das Programm,

  1. die Anzeige löschen,

  2. auf den Start durch die Funktionstaste 'S' warten und danach den Ablauf um ca. eine halbe Sekunde verzögern, (alle anderen Tasten sollen hier keine Funktion haben.)

  3. danach zyklisch die Tastatur abfragen und beim Betätigen

    • einer Datentaste k aus {0,..,9,A,..,F}:
      • einen (internen) Zähler ZD für die Betätigung einer Datentaste um '1' erhöhen,
      • in der Anzeigestelle Sj mit j = k mod 8 das Zeichen 'd' solange ausgeben, wie die Taste gedrückt bleibt;

    • einer Funktionstaste aus {+,-,Ad,Da,...,F3}:
      • einen (internen) Zähler ZF für die Betätigung einer Funktionstaste um '1' erhöhen,
      • für den internen Tastencode $8X (X=0,..,B) in der Anzeigestelle Sj mit j = X mod 8 das Zeichen 'F' solange ausgeben, wie die Taste gedrückt bleibt;

  4. Sobald einer der internen Zähler ZD oder ZF den Hex.-Wert $A erreicht, sollen beide Zählerstände in der Anzeige dargestellt werden (ZD in S7, ZF in S0) und danach mit Punkt 1. fortgefahren werden.

5.3/13

Praktische Übung P5.3-13: (Komponente: Anzeige)
Es ist ein Programm zu schreiben, daß eine 8stellige Dezimalzahl zyklisch nach rechts durch die Anzeige rotiert (, so daß die rechts "herausfallende" Ziffer links wieder erscheint). Die Rotation soll wahlweise stellenweise auf Anforderung oder aber kontinuierlich geschehen. In jedem Zustand soll ein Rücksetzen in die Ausgangslage möglich sein.

Im einzelnen soll das Programm:

  1. die Anzeige löschen,

  2. die 8stellige Dezimalzahl Z ziffernweise einlesen und gleichzeitig, mit der Anzeigestelle S7 beginnend, in der Anzeige darstellen; (dabei sollen alle Funktionstasten und die Datentasten 'A,B,C,D,E,F' unberücksichtigt bleiben)

    und danach zyklisch die Tastatur abfragt und nach Betätigen der

  3. Taste '+': die Zahl Z in der Anzeige um eine Stelle nach rechts rotiert,

  4. Taste 'G': die Zahl Z kontinuierlich (ungefähr) im Sekundentakt nach rechts durch die Anzeige rotiert,
    Taste 'S': die kontinuierliche Rotation stoppt, (alle anderen Tasten ohne Funktion)

  5. Taste 'R': die ursprünglich eingegebene Zahl Z wieder darstellt.

Beispiel:
Eingabe Z:4 5 2 1 7 9 8 0
Taste '+':0 4 5 2 1 7 9 8
Taste '+':8 0 4 5 2 1 7 9
Taste 'G':9 8 0 4 5 2 1 7
 7 9 8 0 4 5 2 1
 1 7 9 8 0 4 5 2 ....
Taste 'S':Stopp der Rotation
Taste 'R':4 5 2 1 7 9 8 0

Hinweis:
Die Benutzung der Routinen zur Bearbeitung des Anzeigepuffers (CLDBUF, SHOWDBUF, RRDBUF, RLDBUF, COPYDBUF) erleichtert die Lösung der Aufgabe.

5.3/14

Praktische Übung P5.3-14: (Monitorroutine)
Gesucht ist ein Programm, das den Offset eines Branch-Befehls in hexadezimaler Form berechnet. Dazu muß als Startadresse die Adresse des ersten OpCodes hinter dem Branch-Befehl und als Endadresse die Adresse des OpCodes angegeben werden, zu dem das Programm verzweigen soll. Bei ückwärtssprüngen muß das Offset im Zweierkomplement angegeben werden.

Im einzelnen soll das Programm,

  1.  die Anzeige löschen,

  2.  ins Operationsfeld der Anzeige (Stellen S6,S7) die Kennung "SA" ("Startadresse") schreiben und dann eine vierstellige Hexadezimaladresse einlesen und diese im Adreßfeld (S5-S2) darstellen,

  3.  ins Operationsfeld der Anzeige die Kennung "EA" ("Endadresse") schreiben und dann eine vierstellige Hexadezimaladresse einlesen und diese im Adreßfeld (S5-S2) darstellen,

  4.  feststellen, ob ein short branch oder ein long branch vorliegt und dies durch ein "L" bzw. "S" im Operationsfeld (Stelle S7) anzeigen; (ein long branch liegt vor, falls die Anzahl der zu überspringenden Bytes größer als 127 bzw. kleiner als -128 ist)

  5.  das errechnete hexadezimale Offset eines short branch in den Stellen S2,S3 bzw. eines long branch in den Stellen S5-S2 darstellen,

  6.  nach Drücken der Taste '+' zur Ausführung der nächsten Offset-Berechnung zum Anfang zurückspringen (Punkt 1.),

  7.  nach Drücken der Taste '-' die eingegebene Startadresse und Zieladresse nebeneinander in der Anzeige (S7-S0) darstellen.

5.3/15

Praktische Übung P5.3-15: (Monitorroutine)
In dieser Aufgabe soll ein kleiner Speicherbereich nach dem Auftreten zweier einzugebener Zahlen untersucht und alle Speicherzellen "zwischen" den Fundorten angezeigt werden. Wird eine Zahl nicht gefunden, soll sie nach dem Durchsuchen dargestellt werden.

Schreiben Sie ein Programm, daß

  1. zunächst die Anzeige löscht,

  2. in den Anzeigestellen S7,S6 die Kennung "E0" ("Eingabe 0") ausgibt und in den Stellen S5,S4 die zweistellige Hexadezimal-Zahl E0 einliest,

  3. in den Anzeigestellen S3,S2 die Kennung "E1" ("Eingabe 1") ausgibt und in den Stellen S1,S0 die zweistellige Hexadezimal-Zahl E1 einliest,

  4. die Anzeige löscht,

  5. den Speicherbereich $0400 - $04FF sequentiell durchsucht und

  6. falls E0 nicht gefunden wird: die Zahl E0 in S1,S0 ausgibt und das Programm beendet,

  7. falls E0 gefunden wird:
    mit der Adresse der Fundstelle beginnend, den Rest des Speicherbereichs sequentiell darstellt,
    wobei in S5 - S2 die jeweilige Speicheradresse und in S1,S0 das zugehörige Datum ausgegeben werden soll und
    zwischen den Darstellungen der Speicherzellen eine Zeitverzögerung von etwa einer halben Sekunde auftreten soll,

  8. jedes ausgegebene Datum mit der Zahl E1 vergleicht und

  9. falls E1 im untersuchten Speicherbereich $0400 - $04FF gefunden wird:
    das Programm (mit der Darstellung der Fundadresse in S5 - S2 und der Zahl E1 in S1,S0) beendet,

  10. falls E1 nicht gefunden wird: die Zahl E1 in S1,S0 ausgibt und das Programm beendet.

5.3/16

Praktische Übung P5.3-16: (Monitorroutine)
In dieser Aufgabe sollen Sie einen kleinen Speicherbereich nach dem Auftreten zweier einzugebener Zahlen untersuchen und jeden "Fundort" einer der Zahlen kennzeichnen.

Schreiben Sie ein Programm, das

  1. zunächst die Anzeige löscht,

  2. in den Anzeigestellen S7,S6 die Kennung "E0" ("Eingabe 0") ausgibt und in den Stellen S5,S4 die zweistellige Hexadezimal-Zahl E0 einliest,

  3. in den Anzeigestellen S7,S6 die Kennung "E1" ("Eingabe 1") ausgibt und in den Stellen S5,S4 die zweistellige Hexadezimal-Zahl E1 einliest,

  4. die Anzeige löscht,

  5. den Speicherbereich $0400 - $04FF sequentiell durchsucht und in den Anzeigestellen S5 - S2 die jeweilige Speicheradresse, in S1,S0 das zugehörige Datum ausgibt, wobei zwischen den Darstellungen der Speicherzellen eine Zeitverzögerung von etwa einer halben Sekunde auftreten soll,

  6. falls eine der eingegebenen Zahlen E0 oder E1 gefunden wird:
    gleichzeitig ihre Kennung ("E0", "E1") in den Stellen S7,S6 ausgibt und die Verzögerung der Darstellung auf zwei Sekunden verlängert,

  7. auf Betätigen der Taste S ("Stop") den Suchvorgang jederzeit beendet. (Um die Zeitverzögerung zu erfassen, kann die Taste S dazu entsprechend lange gedrückt bleiben.)

5.3/17

Praktische Übung P5.3-17: (Komponente: Parallel-Port PB)
Schließen Sie zunächst die Schnittstellen-Erweiterungskarte am Praktikumsrechner an.
Schreiben Sie nun ein Programm, das

  1. die Anzeige löscht,

  2. einen Rechteck-Takt mit einer Frequenz von 1 Hz erzeugt und den Zustand dieses Taktes im Datenfeld der Anzeige (Stelle S0) durch "0" bzw. "1" darstellt,

  3. in Abhängigkeit von der Stellung der Schalter SW0 und SW1 an den Porteingängen PB0,PB1 den erzeugten Takt auf einen der Ausgänge PB7-PB4 gibt, wobei der Schaltzustand (SW1,SW0) [als Dezimalzahl aufgefaßt] + 4 gerade den Index i der Portleitung PBi angeben soll,
  4. durch die Tasten '+' bzw. '-' des Mikrorechners veranlaßt, den Ausgang CB2 so steuert, daß die angeschlossene LED aktiviert bzw. nicht aktiviert wird.

Die Abfrage der Tasten '+', '-' und der Schalter SW0, SW1 braucht nur zu den Zeitpunkten der Zustandsänderungen des Taktes geschehen, so daß Sie zur Erzeugung der Taktzeiten die Routine DLY1MS benutzen können.

5.3/18

Praktische Übung P5.3-18: (Komponente: Parallel-Port PB)
In dieser Aufgabe soll jede über die Tastatur eingegebene Hexadezimal-Ziffer in den ASCII-Code übersetzt und auf "Anforderung" auf dem Port PB ausgegeben werden. Die Ausgabe soll über CB2 angezeigt werden.

Schließen Sie zunächst die Schnittstellen-Erweiterungskarte am Praktikumsrechner an.
Schreiben Sie nun ein Programm, das

  1. die Anzeige löscht,

  2. den Port PB geeignet initialisiert,

    und danach zyklisch

  3. die Datentasten der Tastatur abfragt, (die Funktionstasten sollen keine Funktion haben, auch nicht bei der Eingabe eines Datums!)

  4. jedes eingegebene Datum (0,..,9,A,..F) in der Anzeigestelle S7 und seine ASCII-Darstellung in den Stellen S5,S4 ausgibt,

  5. falls über den Schalter an CB1 keine Ausgabeanforderung gestellt wurde, mit 3. weitermacht,

  6. falls über CB1 eine Ausgabeanforderung gestellt wurde:

    • die aktuelle Anforderung im Steuerregister löscht,

    • das zuletzt eingegebene Zeichen als ASCII-Zeichen auf den Port PB ausgibt und

    • diese Ausgabe durch die LED an CB2 und durch die Ziffer "0" in der Anzeige stelle S0 ca. eine Sekunde lang anzeigt.

hex.ASCII hex.ASCII hex.ASCII hex. ASCII
0304 34838C 43
131 535939 D44
232 636A41 E45
333 737B42 F46

5.3/19

Praktische Übung P5.3-19: (Komponente: Parallel-Port PB)
In dieser Aufgabe sollen Sie die am Port PB anliegenden Binär-Informationen genau dann einlesen und in der Anzeige hexadezimal darstellen, wenn das Programm im "Einlesemodus" ist. Die Umschaltung zwischen den Modi quot;Einlesen/nicht Einlesen" soll durch die Tastatur geschehen.

Schließen Sie zunächst die Schnittstellen-Erweiterungskarte am Praktikumsrechner an.

Schreiben Sie nun ein Programm, das

  1. die Anzeige löscht,

  2. den Port PB geeignet initialisiert,

    und danach zyklisch

  3. die Tastatur auf Betätigung der Funktionstasten "+" und "-" abfragt, (alle anderen Tasten sollen keine Funktion haben!)

  4. sich nach Betätigen der Taste "-":
    • im Modus 0 befindet, in dem keine Eingabe über den Port PB möglich ist, und
    • dies durch die Ziffer "0" in der Anzeigestelle S0
      (alle anderen Anzeigestellen gelöscht !)
    • sowie durch eine ausgeschaltete LED an CB2 anzeigt,
    • Einlese-Anforderungen über den Schalter an CB1 ignoriert (und im Status-register des Ports löscht),

  5. sich nach Betätigen der Taste "+":
    • im Modus 1 befindet, in dem eine Eingabe über den Port PB möglich ist, und
    • dies durch die Ziffer "1" in der Anzeigestelle S0
    • sowie durch eine eingeschaltete LED an CB2 anzeigt,
    • Einlese-Anforderungen über den Schalter an CB1 auswertet, danach löscht und
    • die eingelesene Binär-Information als Hexadezimal-Zahl in den Stellen S7,S6 darstellt.

5.3/20

Praktische Übung P5.3-20: (Komponente: Zeitgeber/Zähler)
In dieser Aufgabe sollen Sie mit Hilfe des Zeitgeber-/Zählerbausteins einen sog. Watch-Dog Timer (WDT) realisieren. Dieser soll während der Ausführung eines Programms überwachen, ob jeweils vor Ablauf eines Zeitintervalls eine gewünschte Reaktion der Rechnerperipherie stattfindet. Ist dies nicht der Fall, soll der WDT eine Fehlermeldung zum Anwender und zur Peripherie ausgeben.

Im einzelnen soll das Hauptprogramm,

  1. die Anzeige löschen,

  2. den Zähler #3 des MC6840 so initialisieren (noch nicht starten!), daß er einen einzelnen Impuls maximaler Länge ausgeben und den Prozessor am Ende des Impulses durch einen Interrupt informieren kann,

  3. den Anfangswert '0000' in den Anzeigestellen S5 - S2 ausgeben und auf die Betätigung der Tastatur warten,

  4. nach Betätigen der Funktionstaste 'S' (für 'START'):
    a) die Anzeigestellen S5 - S2 als 4-stelligen Hexadezimalzähler (ohne Zeitverzögerung) hochzählen,
    b) den Zähler #3 des MC6840 starten,

  5. bei jeder Betätigung der Funktionstaste 'R' (für 'RESET') den Zähler #3 des MC6840 auf den Anfangswert 'FFFF' zurücksetzen und erneut starten,

In der Interruptroutine zum Zähler #3 soll immer dann, wenn der Zähler #3 auf den Wert '0000' heruntergezählt wurde, also nicht rechtzeitig die Taste 'R' betätigt wurde:

  1. der Zähler #3 gestoppt werden,

  2. als Fehlermeldung in der Anzeigestelle S2 (nur) der Dezimalpunkt aktiviert werden,

  3. auf die erneute Betätigung der Funktionstaste 'S' (für 'START') gewartet werden,

  4. danach der Zähler #3 erneut mit dem Wert 'FFFF' gestartet

  5. und der Zählvorgang des o.g. Hexadezimalzählers in den Anzeigestellen S5 - S2 ohne Zurücksetzen fortgesetzt werden.

Hinweise:

  • Vergessen Sie nicht, das Interrupt Flag des Zählers #3 vor Verlassen der Interruptroutine zurückzusetzen.
  • Alle jeweils nicht genannten Funktionstasten sollen keine Wirkung haben.

5.3/21

Praktische Übung P5.3-21: (Komponente: Zeitgeber/Zähler)
In dieser Aufgabe soll ein vom Zeitgeber-/Zählerbaustein ausgegebenes Rechtecksignal durch den Prozessor überwacht werden. Sobald dieses Signal durch den Steuereingang des Zählers #3 zu lange unterbrochen wird, wird die Ausgabe gestoppt, bis sie eventuell vom Benutzer erneut gestartet wird.

Im einzelnen soll das Hauptprogramm,

  1. die Anzeige löschen,

  2. den Zähler #3 des MC6840 so initialisieren (noch nicht starten!), daß er ein periodisches Rechtecksignal maximaler Dauer (minimaler Frequenz) ausgeben und den Prozessor am Ende jedes ählzyklus durch einen Interrupt informieren kann,

  3. den Anfangswert '0000' in den Anzeigestellen S5 - S2 und die Kennung 'S' (für 'STOP') in der Stelle S0 ausgeben und auf die Betätigung der Tastatur warten,

  4. nach Betätigen der Funktionstaste 'G' (für 'GO'):
    a) den Zähler #3 des MC6840 starten, b) in der Anzeigestelle S0 die Kennung 'C' (für 'COUNT') ausgeben,

  5. eine Zeitverzögerung von ca. 16 Sekunden ablaufen lassen,

  6. feststellen, ob während der gesamten Verzögerungszeit der Zähler #3 über seinen Steuereingang G3 gesperrt war und
    • den Zähler #3 stoppen und zu 3. zurückspringen, falls dies der Fall war,
    • mit 5. weitermachen, falls es nicht der Fall war.

In der Interruptroutine des Zählers #3 soll

  1. der Hexadezimal-Zähler in den Anzeigestellen S5 - S2 nach jedem Zählzyklus des Zählers #3 um 1 erhöht werden,

  2. das Hauptprogramm geeignet darüber informiert werden, daß der Zähler #3 einen Zählzyklus beendet hat und also nicht gesperrt war.

Hinweise:

  • Vergessen Sie nicht, das Interrupt Flag des Zählers #3 vor Verlassen der Interruptroutine zurückzusetzen.
  • Alle jeweils nicht genannten Funktionstasten sollen keine Wirkung haben.


5.2 Praktische Übungen zum Zeitgeber-/Zähler-Baustein Lösungsvorschläge zu den Praktischen Übungen