| Hinweise zur Bearbeitung der Einsendeaufgaben zu KE1-7 |  | Einsendeaufgaben zur Kurseinheit 2 |

# Einsendeaufgaben zur Kurseinheit 1

- Aufgabe 1-1
- Aufgabe 1-2
- Aufgabe 1-3
- Aufgabe 1-4
- Aufgabe 1-5

## Aufgabe 1-1: (10 Punkte)

Hinweis: In dieser Aufgabe sollen Sie den Umgang mit dem Praktikumsrechner üben. (Diese Aufgabe ist als einführende Selbstaufgabe gedacht. Sie können Sie ohne weiteres auslassen, wenn Sie sich mit der Bediengung des Praktikumsrechners hinreichend vertraut fühlen.) Dazu geben wir ein kleines Programm vor, welches Sie eingeben sollen, um dann ein paar Untersuchungen durchzuführen. Da Sie den Umgang mit dem Praktikumsrechner und nicht mit dem Simulator oder Terminalprogramm üben sollen, werden sie auf der beigefügten Diskette keine Vorlagedatei finden.

Geben Sie das folgende Programm ein und zwar genau so, wie es abgedruckt ist. Es enthält einen Fehler, den Sie im folgenden herausfinden sollen.

Bei der Bearbeitung der Aufgabe werden Sie vielleicht den Fehler viel früher finden oder auch den vorgegebenen Weg zur Fehlersuche für nicht besonders gelungen halten - Sie könnten sogar mit einer gewissen Berechtigung sagen, daß niemand diesen Fehler machen würde. Doch in dieser Aufgabe geht es um die Bedienung des Praktikumrechners und darum, aus den im folgenden erzielten Ergebnissen gewisse Rückschlüsse zu ziehen. Es geht weniger darum, eine effiziente Methode zum Auffinden von Fehlern darzustellen.

Aufgabe: Schreiben Sie ein Programm, welches eine achtstellige Zahl einliest, darstellt und diese mit den Tasten "+" und "-" nach rechts bzw. links durch die Anzeige rollt. Die Taste "S" soll das Programm beenden.

Gegeben sei das folgende Programm (Musterlösung: 1_ML.ASM):

    0001 0400                    ORG   $0400     ;Beginn des Programmbereichs
    0002
    0003 0400 bd f1 10           JSR   CLRDIS    ;Anzeige loeschen
    0004 0403 10 8e 05 08        LDY   #DATAEND  ;Y mit Zeiger auf Ende des Datenbereichs laden
    0005 0407 8e 00 07           LDX   #7        ;X mit Anzeigeposition und Anzahl laden
    0006 040a bd f1 43   WEITER  JSR   HALTKEY   ;Zeichen lesen...
    0007 040d bd f1 1c           JSR   SHOWT7SG  ;ausgeben...
    0008 0410 bd f1 00           JSR   T7SG      ;in Siebensegmentcode wandeln...
    0009 0413 a7 a2              STA   ,-Y       ;und schliesslich speichern
    0010 0415 30 82              LEAX  ,-X       ;Zaehler in X dekrementieren
    0011 0417 10 8c 05 00        CMPY  #DATAANF  ;am Pufferanfang angekommen?
    0012 041b 26 ed              BNE   WEITER    ;nein, also noch ein Schleifendurchlauf
    0013
    0014 041d 8e 05 00           LDX   #DATAANF  ;Zeiger auf Pufferanfang
    0015 0420 bd f1 33   TASTE   JSR   SHOWDBU   ;Puffer anzeigen
    0016 0423 bd f1 43           JSR   HALTKEY   ;auf Tastendruck warten
    0017 0426 c1 80              CMPB  #$80      ;"+" gedrueckt?
    0018 0428 26 03              BNE   N_PLUS    ;nein, weitersuchen
    0019 042a bd f1 39           JSR   RLDBUF    ;ja, Puffer nach links rotieren
    0020 042d c1 81      N_PLUS  CMPB  #$81      ;"-" gedrueckt?
    0021 042f 27 03              BEQ   N_MINUS   ;nein, weitersuchen
    0022 0431 bd f1 36           JSR   RRDBUF    ;ja, Puffer nach rechts rotieren
    0023 0434 c1 86      N_MINUS CMPB  #$86      ;"S" gedrueckt?
    0024 0436 26 e8              BNE   TASTE     ;nein, weiter auf Taste warten
    0025 0438 3f                 SWI             ;ja, Programmende
    0026
    0027 0500            DATAANF EQU   $0500
    0028 0508            DATAEND EQU   $0508
    0029
    0030 0439            U_END   ORG   *         ;Ende des Programmbereichs

### a) Eingabe (1 Punkt)

Beantworten Sie kurz folgende Fragen:

- Welche Teile des obigen Listings geben Sie ein?
- Wie gehen Sie dabei vor?

### b) Kontrolle (1 Punkt)

Kontrollieren Sie Ihr Programm auf Eingabefehler und berichtigen Sie diese. Verwenden Sie dazu zwei verschiedene Möglichkeiten, um das Listing mit den eingegebenen Daten zu vergleichen:

1. Benutzen Sie die Address- oder Data-Funktion und gehen Sie mit den Tasten "+" und/oder "-" das Listing byteweise durch.
2. Benutzen Sie die Dump-Funktion und gehen Sie mit den Tasten "+" und/oder "-" das Listing in vier-Byte-Schritten durch.

Beantworten Sie kurz folgende Fragen:

- Was sind für Sie die Vor- und Nachteile der Address/Data-Methode?
- Was sind für Sie die Vor- und Nachteile der Dump-Methode?

### c) Testlauf (1 Punkt)

Nachdem das Programm nun entsprechend dem obigen Listing im Speicher des Praktikumsrechner vorliegt, starten Sie einen Testlauf. Benutzen Sie dazu die Go-Funktion und starten Sie das Programm an der Adresse $0400.

Zuerst können Sie nun acht Tasten drücken, worauf jeweils eine Ziffer in der Anzeige erscheint. Danach sollten die oben beschriebenen Funktionen mit den Tasten "+"- und "-" ausgeführt werden können und der Programmabbruch mit der Taste "S" funktionieren.

Beantworten Sie folgende Fragen zum Testlauf:

- Was passiert, wenn unter den ersten acht Tastenbetätigungen Funktionstasten enthalten sind? Warum?
- Was passiert bei Betätigung der Taste "+"?
- Was passiert bei Betätigung der Taste "-"?
- Was passiert bei Betätigung der Taste "S"?
- Was passiert bei Betätigung der anderen Tasten (außer den Tasten "F4" und "C" oben rechts natürlich; diese Tasten haben immer die gleiche Funktion)?

### d) Fehler lokalisieren - erster Versuch (2 Punkte)

Da in der Programmbeschreibung die einzugebenden acht Zeichen nicht ausdrücklich auf den Bereich der Ziffern oder Hex.-Ziffern eingeschränkt wurde, können Sie das Verhalten des Programms in dieser Beziehung als korrekt auffassen.

Das Verhalten aller anderen Tasten bis auf die Taste "S" ist jedoch als fehlerhaft zu bezeichnen.

Denken Sie bitte daran, daß beim Anzeigen des Puffers die niedrigste Speicherstelle rechts angezeigt wird und die höchste links. Ein Rollen des Puffers nach rechts bewirkt also ein Rollen der Anzeige nach links und umgekehrt.

Als "naiven" Ansatz zur Fehlersuche versuchen Sie nun bitte, das Programm mittels der Trace-Funktion Schritt für Schritt durchzugehen: Drücken Sie die Taste "G", um den Programmzähler zu kontrollieren und ggf. auf $0400 zu setzen. Starten Sie nun die Trace-Funktion, indem Sie die Taste "T" drücken und beobachten Sie die Anzeige. Beantworten Sie folgende Fragen:

- Was steht nach dem ersten, zweiten, dritten und vierten Traceschritt in der Anzeige?
- Führen Sie solange Traceschritte durch, bis die Adreßanzeige im Bereich von $F300 und höher landet (ca. 60 Schritte). Führen Sie dann etwa 30 weitere Traceschritte durch und beobachten Sie die Anzeige. Was passiert? Warum? In welcher Monitorroutine sind Sie wohl gelandet?
- Wo liegen also die Probleme der Trace-Funktion? Welche Programmteile kann man damit bearbeiten, welche nicht?

### e) Fehler lokalisieren - Taste "+" (2 Punkte)

Nun versuchen Sie bitte, mit Breakpoints zu arbeiten. Als erstes sollen Sie die Wirkung der Taste "+"untersuchen. Dazu setzen Sie einen Breakpoint auf die Adresse $042A, da das Programm dorthin verzweigt, wenn die Taste "+" gedrückt ist. Gehen Sie dabei wie folgt vor: Zuerst drücken Sie die Taste "G", um in den Go-Modus zu gelangen. Kontrollieren Sie die Anfangsadresse und geben Sie ggf. $0400 ein. Dann drücken Sie die Taste "+", um einen Breakpoint eingeben zu können. Geben Sie als Adresse $042A ein. Nun drücken Sie die Taste "G", um das Programm zu starten. Im Programm geben Sie wie gewohnt die acht Zeichen ein, dann drücken Sie die Taste "+".

Beantworten Sie nun folgende Frage:

- Was steht in der Anzeige?

Im nächsten Trace-Schritt würde nun die Monitorroutine RLDBUF in Einzelschritten abgearbeitet werden. Das sollen Sie vermeiden. Sie sollen direkt mit dem Folgebefehl an Adresse $042D fortfahren. Beantworten Sie dazu folgende Fragen:

- Wie gehen Sie vor, um an Adresse $042D mit dem Tracen fortzufahren?
- Was steht nach dem ersten und zweiten Traceschritt in der Anzeige?
- Was ist passiert? Warum gerät das Programm an diese Stelle? Warum funktioniert die Taste "+" also nicht, wie vorgesehen?

### f) Fehler lokalisieren - Taste "-" (2 Punkte)

Bevor Sie mit der Fehlerberichtigung beginnen, sollen Sie jedoch die anderen Fehler auch noch genauer betrachten. Dazu setzen Sie bitte einen Breakpoint auf die Adresse $0431, um das Verhalten der Taste "-" zu untersuchen.

Beantworten Sie folgende Frage:

- Was passiert, wenn Sie nach dem Programmstart und der Eingabe der acht Zeichen die Taste "-" drücken?

Setzen Sie nun zur Untersuchung dieses Effekts einen Breakpoint auf die Adresse $042F. Schauen Sie sich mit der Register-Funktion den Inhalt der Prozessorregister an. Beantworten Sie folgende Fragen:

- Welchen Inhalt hat das Register B? Welchen Inhalt hat das Register-CC? Wie ist entsprechend der Zustand der Prozessor-Flags?
- Führen Sie nun drei Traceschritte durch. Was steht jeweils in der Anzeige?
- Warum funktioniert die Taste "-" also nicht, wie vorgesehen?

### g) Fehleranalyse und -berichtigung (1 Punkt)

Nun sollten Sie herausgefunden haben, wo der Fehler im Programm liegt. Falls Sie noch unsicher sind, führen sie Schritt f) statt mit der Taste "-" mit einer anderen Taste - z.B. den Hex.-Zifferntasten - durch und analysieren Sie das Ergebnis.

Berichtigen Sie den Fehler und kontrollieren Sie, ob das Programm nun korrekt läuft. Beantworten Sie folgende Frage:

- Wo lag der Fehler im Programm? Wie lautet der korrekte Befehl?

## Aufgabe 1-2: (25 Punkte)

Hinweis: In dieser Aufgabe soll das "manuelle" Disassemblieren geübt werden. Als kleine Hilfe haben wir jeweils angegeben, welche Bytes zu einem Assemblerbefehl gehören. Falls Sie Probleme haben, schauen Sie sich wieder Abschnitt 1.4 an und versuchen Sie, nur anhand der ersten zwei Spalten (Adresse und Opcode) auf den dahinter stehenden Assemblerbefehl zu kommen.

Das folgende Programm finden Sie unter dem Dateinamen 2A_VORL.ASM auf der mitgelieferten Diskette. Dort sind Adresse und Opcode als Kommentar angegeben, Sie können Ihre Lösung davor eintragen. Z.B. wird aus (siehe wieder Abschnitt 1.4) "`0500 BD F1 10`" der Befehl "JSR CLRDISP". Sie würden als Zeile in der von uns beigelegten Assemblerdatei finden:

                                  ;0500    BD F1 10 ;

und sollten daraus in Ihrer Lösung machen:

    LABEL1:    JSR   CLRDISP      ;0500    BD F1 10     ;Anzeige löschen

### a) (10 Punkte, Vorgabedatei: 2A_VORL.ASM, Lösungsdatei: 2A_EA.ASM)

Das folgende Programm ist im Maschinencode angegeben. In der ersten Spalte stehen die Adressen der Befehle, und in der zweiten Spalte stehen die Opcodes der Assemblerbefehle.

Disassemblieren Sie das folgende Programm, d.h. geben Sie zu jedem Befehl den Assemblercode an, und benutzen Sie symbolische Namen (Labels) für die Sprungziele! Kommentieren Sie das Programm!

                          Adresse Opcode
                          0400    8E 02 00
                          0403    10 8E 03 00
                          0407    C6 20
                          0409    A6 84
                          040B    A7 A4
                          040D    1C FE
                          040F    1E 01
                          0411    C9 01
                          0413    1E 10
                          0415    1C FE
                          0417    1E 02
                          0419    C9 01
                          041B    1E 20
                          041D    1C FE
                          041F    C0 01
                          0421    C1 00
                          0423    26 E4
                          0425    3F

### b) (4 Punkte, keine Lösungsdatei)

Zeichnen Sie das Flußdiagramm!

### c) (5 Punkte, keine Lösungsdatei)

Was leistet das Programm? Wie funktioniert es?

### d) (6 Punkte, Lösungsdatei: 2D_EA.ASM)

Verbessern Sie dieses Programm so weit wie möglich und geben Sie die verbesserte Form an! Verwenden Sie dabei keine Hilfsroutinen des Monitorprogramms!

## Aufgabe 1-3: (10 Punkte)

Hinweis: Wir geben Ihnen eine Aufgabe und die dazugehörige Lösung an, in der aber die Adressen und Namen der Monitorroutinen, ein paar Werte sowie Kommentare fehlen. Ihre Aufgabe ist es, die Lösung zu vervollständigen.

(Vorlagedatei: 3_VORL.ASM, Lösungsdatei: 3_EA.ASM)

Es war ein Programm zu schreiben, das 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:

1. Anzeige löschen
2. Eine achtstellige Dezimalzahl soll ziffernweise eingelesen und, mit S7 beginnend, in der Siebensegmentanzeige dargestellt werden. Alle Funktionstasten und die Datentasten A..F sollen dabei unberücksichtigt bleiben.
3. Dann wird die Tastatur abgefragt:
   - Taste "+": Die Dezimalzahl wird um eine Stelle nach rechts rotiert.
   - Taste "G": Die Dezimalzahl wird im ½-Sekunden-Takt nach rechts rotiert, bis die Taste "S" gedrückt wird.
   - Taste "R": Die Dezimalzahl wird wieder auf den ursprünglich unter 2) eingegebenen Wert gesetzt.
4. Weiter mit Punkt 3)

Die (unvollständige) Lösung, in der alle Auslassungen durch "?" ersetzt sind, lautet:

    Label            Befehl            Kommentar
    EINGABE          JSR    ?
                     LDA    #
    L1               TFR    A,B
                     TFR    D,X
                     JSR    ?
                     CMPB   #?
                     BHS    L1
                     JSR    ?
                     PSHS   A
                     LDX    #$0500     ;X mit Zeiger auf Pufferspeicher laden
                     JSR    T7SG
                     PULS   B
                     STA    B,X
                     TFR    B,A
                     DECA              ;Index dekrementieren
                     BPL    L1         ;Rücksprung, falls noch nicht fertig
                     LDX    #$0510
                     LDY    #$0500
                     JSR    ?
                     EXG    X,Y
    WEITER           JSR    ?
                     JSR    ?
                     CMPB   #$80
                     BNE    N_PLUS     ;Sprung, falls nicht "+" gedrückt
                     JSR    ?
                     BRA    WEITER
    N_PLUS           CMPB   #?
                     BNE    N_RESET
                     LDY    #$0510
                     JSR    ?
                     BRA    WEITER
    N_RESET          CMPB   #?
                     BNE    WEITER     ;keine der Tasten, also Rücksprung
                     LDY    #500
    L2               JSR    ?
                     JSR    ?
                     JSR    ?
                     JSR    ?
                     CMPB   #$86
                     BNE    L2
                     BRA    WEITER

## Aufgabe 1-4: (20 Punkte)

Hinweis: In dieser Aufgabe dürfen nur bestimmte Monitorroutinen benutzt werden. Entsprechend verkürzt sind die Definitionsteile der Vorlagedateien.

### a) (10 Punkte, Vorlagedatei 4A_VORL.ASM, Lösungsdatei: 4A_EA.ASM)

Schreiben Sie ein Programm, welches zunächst die Anzeige löscht und danach über die Tastatur eine zweistellige Hex.-Zahl einliest und diese Zahl im Datenfeld der Anzeige darstellt. Nach Ausführung des Programms soll die Zahl im Akkumulator B weiterhin zur Verfügung stehen.

Außer den Routinen CLRDISP, HALTKEY und SHOWB7SG sollen Sie keine anderen Hilfsroutinen benutzen.

### b) (10 Punkte, Vorlagedatei 4B_VORL.ASM, Lösungsdatei: 4B_EA.ASM)

Erweitern Sie das Programm aus Teil a) nun derart, daß nach Drücken der Taste "+" die eingegebene Zahl als Dualzahl, also als 8-stellige 0-1-Kette in der Anzeige dargestellt wird.

Sie dürfen zusätzlich die Hilfsroutine SHOWT7SG benutzen.

## Aufgabe 1-5: (30 Punkte)

(Lösungsdatei: 5_EA.ASM)

In dieser Aufgabe sollen Sie ein recht komplexes Programm entwickeln, welches etwa Klausurniveau hat. Um Ihnen dabei etwas zu helfen, ist die Aufgabenstellung an die Aufgabe angelehnt, für die in Abschnitt 1.4 eine Beispiellösung vorgestellt wurde. So können Sie sich bei der Lösung der Aufgabe an diesem Abschnitt orientieren.

Der Speicher soll fortlaufend ab einer einzugebenden Anfangsadresse nach einem einzugebenden Datum durchsucht werden. Bei jedem Fund soll die Funstelle ausgegeben und auf einen Tastendruck gewartet werden. Das Programm soll bis zur Adresse $FFFF weitersuchen.

Im einzelnen: Schreiben Sie ein Programm, welches der Reihe nach

1. die Anzeige löscht,
2. die Kennung "dA" ins Operationsfeld der Anzeige schreibt und danach ein Byte (das Suchdatum) über die Tastatur einliest und im Datenfeld anzeigt,
3. die Anzeige löscht,
4. die Kennung "AA" ins Operationsfeld schreibt und eine (Anfangs-)Adresse einliest und im Adreßfeld darstellt,
5. den Speicherbereich von der Anfangsadresse bis zur Adresse $FFFF nach dem Auftreten des in 2) eingegebenen Bytes durchsucht,
6. die Kennung "FO" (bzw. "F0") ins Operationsfeld, die Fund-Adresse im Adreßfeld und das zu suchende Byte im Datenfeld anzeigt und auf Drücken der Taste "+" wartet, um dann ab der Fundstelle weiterzusuchen,
7. "FF FFFF FF" anzeigt, falls das zu suchende Byte nirgends im Speicherbereich gefunden werden kann, bzw. die Weiter-Suche ab einer Fundstelle keine weitere Fundstelle mehr liefert.

Hinweis: Die formale Gestaltung dieser Aufgabenstellung wird Ihnen im weiteren Verlauf des Praktikums immer wieder begegnen: Zunächst wird, in knappen Worten durch Kursivschrift gekennzeichnet, die geforderte Funktionalität des Programms beschrieben, dann folgt in "algorithmischer" Schreibweise eine genaue Beschreibung der geforderten Programmschritte.

| Hinweise zur Bearbeitung der Einsendeaufgaben zu KE1-7 |  | Einsendeaufgaben zur Kurseinheit 2 |