[1] Ein 2-stelliger Hex-Zähler ist mit einer Frequenz von 10 Hz zu betreiben. Seine aktuelle Stellung soll über Port C [7:0] ausgegeben und mittels der 7-Segment-Anzeigen A1 und A2 (mit Decoder) dargestellt werden. Der zeitbestimmende Programmteil soll als Unterprogramm (D100) unter Verwendung des Registers Y formuliert werden. Orientieren Sie sich an den Programmen aus Versuch 2.
[2] Modifizieren Sie das Programm nach [1] so, daß beim Starten des Programms der Text "M68HC11 gestartet" auf das Terminalfenster ausgegeben wird. Verwenden Sie dazu die beim Versuch 3 entwickelten Unterprogramme zur Initialisierung der SCI, sowie zur Zeichen- und Stringausgabe (CHOU und STOU).
[3] Zusätzlich zu [2] sind nun bedingte Unterbrechungen zu bearbeiten. Mittels der Tasten T0 und T1, die an den Eingängen STRA und PA7 des M68HC11 anzuschließen sind, können bedingte Unterbrechungen ausgelöst werden. Als Folge darauf sollen vom Hauptprogramm aus folgende Ausgaben auf das Terminalfenster erfolgen:
org $ffda
dc.w pirq ; pulse accu input (PA7)
org $fff2
dc.w sirq ; IRQ/STRA
org $fffe
dc.w main ; reset
[4] Ergänzend zu [3] soll statt des Textes "PA7I seen" beim Auftreten einer Unterbrechung durch T1 an PA7 der jeweilige Befehlszählerstand des unterbrochenen Programms als 4-stellige Hexzahl auf das Terminalfenster ausgegeben werden ("PC=XXXX"). Verwenden Sie dazu unter anderem das Unterprogramm hx4a (siehe unten). Es wird nur der Wert des Befehlszählers in der 16-Bit-Variablen PCSTAT von der Unterbrechungsbearbeitung ans Hauptprogramm übergeben; die Ausgabe erfolgt dann dort.
Die beiden Unterprogramme hx2a und hx4a können Sie von dieser Angabe per Cut-and-Paste übernehmen. Dabei ist zu beachten, daß hx2a und hx4a den entstehenden String nach fallenden Adressen hin aufbauen und daß damit die Übergabeparameter entsprechend gewählt werden müssen. Sehen Sie sich dazu auch den Quelltext zu den Unterprogrammen am Ende dieses Dokuments an.
hx4a psha ; Akku A auf dem Stack ablegen
bsr hx2a ; Akku B umwandeln (Stelle 3 und 4)
pulb ; Akku A vom Stack holen, in Akku B ablegen
; Nun einfach in hx2a fallen und Akku B
; umwandeln (Stelle 1 und 2)
hx2a pshb ; Akku B auf dem Stack sichern
bsr hx1a ; Bits 0-3 von Akku B umwandeln
pulb ; Original-Akku B wieder holen
lsrb ; viermal schieben (Bits 4-7 --> 0-3)
lsrb
lsrb ; und nun die obere Haelfte umwandeln
lsrb ; indem einfach in hx1a gefallen wird
; Nun wird die eigentliche Arbeit gemacht:
hx1a andb #$0F ; die oberen 4 Bits ausmaskieren
addb #48 ; ASCII-Wert von "0" addieren
cmpb #57 ; groesser als "9"?
bls hx1b ; nein, dann speichern
addb #7 ; sonst die Distanz zwischen "9" und "a" addieren
hx1b stab 0,y ; im Speicher ablegen, auf den Y zeigt
dey ; Y zeigt jetzt auf die Stelle davor
rts ; und weg
Beispielaufruf:
ldd #$AFFE ; Hexzahl in Akku D laden
ldy #PUFFER+3 ; Position auf letzte Stelle im Puffer
; der Puffer muss im Datenbereich reserviert sein
bsr hx4a ; do it!
ldy #PUFFER ; y --> Pufferanfang
bsr STOU ; z.B. seriell ausgeben