3.2 Das Monitorprogramm Lösungsvorschläge zu den Selbsttestaufgaben

P3/1

Lösungsvorschläge zu den Praktischen Übungen

Zu P3.1-1:

  1. Es ist zu sehen, wie nach Betätigen der Taste 'C' das Monitorprogramm zunächst die Speicherzellen $00-$FF initialisiert. Danach wird mit Hilfe eines Datenpuffers in den Zellen $80-$90 die Anzeige aufgebaut. Jede Betätigung einer weiteren Funktionstaste zeigt den wiederholten Zugriff auf diesen Pufferbereich.

  2. Das Programm realisiert drei Hexadezimalzähler in den Akkumulatoren A und B sowie der Speicherzelle $00. Diese werden im Hauptprogramm (HP) zunächst initialisiert und dann in HP sowie zwei ineinander geschachtelten Unterprogrammen (SUB1,SUB2) aufwärtsgezählt. Vor jedem Unterprogrammaufruf wird der entsprechende Zählerzustand auf dem Stack abgelegt und nach der Rückkehr aus dem Unterprogramm von dort wieder geladen. Auf der tiefsten Schachtelungstiefe wird in einem weiteren Unterprogramm (SUB3) eine Zeitverzögerung mit der Routine DLY1MS erzeugt (Y=$0040=64 ms). (In DLY1MS wird der eingegebene Verzögerungswert zunächst auf dem Stack gerettet. RA: Rücksprung-Adressen.)

Adresse OpCodeMnemocode Bemerkung
1; Stack -Beobachtung    
2  DLY1MS  EQU$F160 ; Verzögerungsroutine
3        
40400  ORG $0400 
50400CC 10 20HP LDD#$1020 ; Zähler Z1 in Akku A, Z2 in B
604030F 00  CLR$00; Zähler Z3 in $00
704054CL INCA ; Z1 inkrementieren
8040634 02  PSHSA; Z1 auf den Stack
90408BD 04 20  JSRSUB1 
10040B35 02RA1 PULSA; Z1 vom Stack
11040D20 F6  BRAL; Endlosschleife
12        
130420   ORG$0420  
1404205CSUB1 INCB  ; Z2 inkrementieren
15042134 04  PSHSB; Z2 auf den Stack
160423BD 04 40  JSRSUB2  
17042635 04RA2 PULSB; Z2 vom Stack
18042839  RTS ; Rücksprung
19        
200440   ORG$0440 
2104400C 00SUB2 INC$00; Z3 inkrementieren
22044296 00  LDA$00; Z3 nach Accu A
23044434 02  PSHSA; Z3 auf den Stack
240446BD 04 60  JSRSUB3 
25044935 02RA3 PULSA; Z3 vom Stack

P3/2

26044B39  RTS ; Rücksprung
27        
280460   ORG$0460 
29046010 8E 00 40 SUB3LDY#$0040 ; Verzögerungswert Yd
300464BD F1 60  JSRDLY1MS ; Verzögerungsroutine
31046739RA4 RTS ; Rücksprung

Die Beobachtung des Stack-Bereichs zeigt die folgende Speicherzellenbelegung:

Adresse  
YdH YdL
RA4RA3H
1FF0
FF 88Z4 0040 0467 04
1FF8
49 Z304 26Z2 040B Z1
 
RA3L  RA2  RA1 

Zu P3.1-2:

Der Adreßbereich $1040 -$1047 wird in der folgenden Routine zum Anzeige-Puffer gemacht, indem das X-Register auf den Wert $1040 gesetzt wird. Dieser Puffer wird zunächst mit der Routine CLRBUF (s. Abschnitt 1.2.2) "gelöscht". Danach wird er byteweise unter Beachtung etwaiger Überträge ins nächste Byte inkrementiert. Mit der Routine SHOWDBUF wird nach jeder Erhöhung der Puffer in die Anzeige übertragen.

AdresseOpCode Mnemocode Bemerkung
04008E 10 40  LDX #$1040 ; X setzen
0403BD F1 30 JSRCLRDBUF ; Löschen des Puffers
040686 00L: LDA#0; Bytezähler initialisieren
04086C 86M: INCA,X; Byte inkrementieren
040A26 05BNE N; zur Anzeigeroutine
040C4CINCA ; Bytezähler inkrementieren
040D81 08CMPA #8; letztes Byte ?
040F26 F7BNE M; nächstes Byte
0411BD F1 33N: JSRSHOWDBUF; Anzeigeroutine
041410 8E 00 01 LDY#1; Y mit 1 ms laden (1 kHz)
0418BD F1 60JSR DLY1MS; Verzögerung
041B7E 04 06JMP L

P3/3

Zu P3.1-3:

AdresseOpcode Mnemocode Bemerkung
0400BD F1 10 JSR CLRDISP ; Löschen der Anzeige
04038E F0 10LDX #$F010; X initialisieren
040686 07N:LDA #7; Spaltenzähler initialisieren
0408E6 86LDB A,X; Spaltenwert nach B bringen
040AEA 86M:ORB A,X; Spalten "verodern"
040CC4 0FANDB #$F; Bits 7-4 maskieren
040EF7 F0 20STB $F020; in die Anzeige bringen
04114ADECA ; nächste Spalte
04122A F6BPL M; falls nicht letzte Spalte
04142B F0BMI N; falls letzte Spalte

Zu P3.2-1:

Auf das Flußdiagranm der Routine können wir in diesem Fall verzichten,da wir uns an der Interpreterschleife nach Bild 3.2-2 orientieren. Das Assemblerlisting sieht dann so aus:

AdresseOpCode Mnemocode Bemerkung
;Kommandointerpreter   
1800    ORG$1800  
18008E 00 02KOM: LDX#2 ; Anzeige im Adreßfeld
1803BD F1 56  JSRSH0WADR; Kommandoeingabe
1806C1 80  CMPB#$80; letzte Taste = "+"?
180826 F9  BNE-7; sonst neues Kommando
180A8E 18 30  LDX#KOMTAB; Beginn der Sprungtabelle
180DCC FF FF  LDD#$FFFF; Zeichen für Tabellenende
181010 AC 81   NAECHST:CMPY,X + + ; Vergleich Befehl mit Tabelle
181327 12  BEQGEFUNDEN; falls gleich, gefunden
181530 02  LEAX2,X; nächste Eintragung
181710 A3 84  CMPD,X; Tabellenende erreicht?
181A26 F4  BNENAECHST; sonst weitertesten
181C8E 00 00  LDX#0; im Datenfeld
181FCC 00 5B  LDD#$5B; " ?"
1822BD F1 16  JSRSHOWD; ausgeben
182520 DC  BRAKOM; zur Kommandoeingabe
1827AD 94    GEFUNDEN:JSR[,X]; Sprung zur Routine
1829BD F1 10  JSRCLRDISP; Anzeige löschen
182C20 D5  BRAKOM; zur Kommandoeingabe
1830   ORG$1830 
183041 44      KOMTAB:FDB'AD' ; ASCII-Code des Bezeichners
1832E3 B0  FDBADDRESS; Startadresse der Routine

P3/4

183444 41  FDB'DA';
1836E3 F0  FDBDATEN;
183852 45  FDB'RE';
183AE5 3C  FDBREGIST;
183C47 4F  FDB'GO';
183EE4 30  FDBGO;
184053 41  FDB'SA'; für jede Routine:
1842E9 00  FDBSAVE;
18444C 4F  FDB'LO'; Bezeichner
1846EA 00  FDBLOAD; Startadresse
184854 52  FDBTR';
184AEC A0  FDBTRACE;
184C49 4E  FDB'IN';
184EEC 0E  FDBINSERT;
185044 45  FDB'DE';
1852EC 36  FDBDELETE;
185444 55  FDB'DU';
1856EC 5B  FDBDUMP;
1858FF FF  FDB$FFFF; Ende der Sprungtabelle

Der wesentliche Unterschied zwischen beiden Routinen besteht in der Ausführung der Tabelle, die hier sowohl die Bezeichner der Monitorroutinen als auch deren Startadressen aufnehmen muß.

Zu P3.2-2:


  1. Bild

    P3/5

  2. Routine INDATA
    Eingaberegister:
    Ausgaberegister:   A: Datum, B:Funktionstaste
    Funktion: Liest die Tastatur und packt die beiden zuletzt eingegebenen Hex-Zeichen nach A. Die Routine wird durch eine beliebige Funktionstaste verlassen, deren Code in B zur Verfügung steht. Initialisierung von A mit $00.
    AdresseOpCode Mnemocode Bemerkung
    F3B6   ORG$F3B6 
    F3B64F CLRA  ; Initialisierung des Datums
    F3B78D DCL:JSR HALTKEY; auf eine Taste warten
    F3B92A 01  BPLW ; falls Hexadezimalziffer
    F3BB39 RTS  ; zurück mit Funktionstastencode
    F3BC34 04W:PSHS B; Ziffer auf den Stack retten
    F3BE48 LSLA   
    F3BF 48 LSLA  ; Zahl um eine Ziffer
    F3C048 LSLA  ; nach links schieben
    F3C148 LSLA   
    F3C2AA E0  ORA,S+; neue Ziffer einfügen
    F3C420 F1  BRAL; nächste Taste


    Bild

P3/6

Zu P3.2-3:

  1. Die tatsächliche Startadresse ist zu ermitteln, indem Sie in der Sprungtabelle für die Hilfsroutinen bei SHOWADR nachsehen. Dort steht der Befehl "JMP $F3FF", die Startadresse steht also in den Speicherstellen SHOWADR+1 und SHOWADR+2. Da der erste Befehl der Routine,`"LDY #0" (hexadezimal: 10 8E 00 00), nicht ausgeführt werden soll, muß zu der Startadresse vier addiert werden. Es ergibt sich die absolute Sprungadresse $F403.
    Der Sprungbefehl müßte richtig JMP [SHOWADR+1]+4 lauten. Ein 6809-Assembler kann diesen Ausdruck aber nicht verarbeiten, da der Prozessor diese Adressierung nicht kennt. Der Assembler seinerseits kann die absolute Adresse nicht errechnen, da der Inhalt der angegebenen Adresse SHOWADR+1 bei der Assemblierung nicht unbedingt bekannt sein muß und außerdem - falls es sich um Speicherzellen im RAM handelt - zur Laufzeit verändert sein könnte. Daher ist der Umweg über das U-Register zur Berechnung der Startadresse notwendig. Alternativ könnte man die Adresse "zu Fuß" berechnen (siehe oben) und den Sprung mit einer absoluten Adresse versehen: JMP >$F4E4.

  2. Folgende Anpassungen der Routine sind notwendig:

    Sie werden feststellen, daß Sie zur Anwahl der nächsten Monitorfunktion die entsprechende Funktionstaste zweimal betätigen müssen. Das ist notwendig, weil die Tastaturabfrage des Monitors andere Tastencodes liefert als die HALTKEY-Routine.


  3. ; Routine ADDRESS: Adresse editieren
    ; Ausgabe der Kennung und Holen der Adresse
     
    1075  ADREQU $75 
     
    ;  ORG $1000 
    100034 33ADDRESS: PSHSA,X,Y,CC; Register retten
    1002BD F1 10  JSRCLRDISP ; Anzeige löschen
    1005CC 77 5E  LDD#$775E; 7-Segmentcode für "Ad"
    10088E 00 06  LDX#$6; im Operationsfeld
    100BBD F1 16  JSRSHOWD; anzeigen
    100E10 9E 75  LDY<ADR; zu editierende Adresse holen
     ; das Zeichen "<" kennzeichnet die DP-Register-Adressierung
     ; Adresse editieren
    1011E6 A4W:LDB ,Y; zugehöriges Datum in Akku B
    10138E 00 00  LDX#0; im Datenfeld
    1016BD F1 20  JSRSHOWB7SG; anzeigen
    10198E 00 02  LDX#2; Anzeige im Adreßfeld
    101C12 NOP 
    101DBE F1 57  LDUSHOWADR+1; Startadresse aus Sprungtabelle.
    1020AD 64  JSR4,U;Aufruf ohne Löschen von Y
     
     ; Ergebnis von SHOWADR interpretieren
    1022C1 81  CMPB#$81; letzte Taste
    102422 08  BHIR; >$81?, dann fertig
    102627 02  BEQ$2; =$81("-")?, dekrementieren
    102831 22  LEAY2,Y; Zeiger inkrementieren (um2, da wieder dekrementiert wird)
    102A31 3F  LEAY-1,Y; Zeiger dekrementieren
    102C20 E3  BRAW; und erneut editieren
     ; falls Ergebnis nicht "+" oder "-", Ende
    102E10 9F 75R:STY <ADR; neue Adresse ablegen
    103135 33  PULSA,X,Y,CC; Register restaurieren
    103339 RTS  ; zurück zum Monitor

  4. Wir gehen nach derselben Methode vor, die bei der ADDRESS-Routine angewandt wurde. Die Anforderungen an die DATA-Routine:

    Das Flußdiagramm:

    Bild

    Das Programm:

    Routine DATA
    Eingaberegister:
    Ausgaberegister: B: enthält neue Funktionstaste
    Funktion: Das Datum, auf das der Adressenzeiger des Monitors zeigt, kann editiert werden. Mit den Tasten '+', '-' kann die Adresse inkrementiert/dekrementiert werden.
    1CLRDISPEQU $F110 ; Anzeige löschen
    2SHOWDEQU$F116 ; D in die Anzeige
    3SHOWD7SGEQU$F123; D hexadezimal in die Anzeige
    4SHOWDATAEQU$F150 
    5ADR EQU$75  
     
    140000 34 73  PSHSA,X,Y,U,CC ; Register retten
    150002BD F1 10  JSRCLRDISP ; Anzeige Iöschen
    160005CC 5E 77  LDD#$5E77 ; "dA"
    1700088E 00 06  LDX#6; im Operationsfeld
    18000BBD F1 16  JSRSHOWD; anzeigen
    19000E10 9E 75  LDY<ADR ; Adresse aus Systembereich
    2000111F 20LOOP: TFRY,D; nach D
    2100138E 00 02  LDX#2; im Adreßfeld
    220016BD F1 23  JSRSHOWD7SG ; anzeigen
    230019A6 A4  LDA,Y ; zu editierendes Datum
    24001B8E 00 00 LDX#0 ; im Datenfeld
    25001EFE F1 51  LDUSHOWDATA+1 ; Startadresse + 2
    260021AD 42  JSR2,U ; editieren
    270023A7 A4  STA,Y ; und wieder ablegen
    280025C1 81 CMPB#$81 ; letzte Taste "+" oder "-"?
    29002722 08  BHIENDE; falls nein
    30002927 02  BEQ$2; letzte Taste = "-"
    31002B31 22  LEAY2,Y; "+": Adresse+2 (da wieder
    33      ; dekrementiert wird)
    34002D31 3F LEAY -1,Y; "-": Adresse dekrementieren
    35002F20 E0 BRALOOP; nächstes Datum editieren
    36 ;     
    37003110 9F 75 ENDE:STY<ADR; neue Adresse ablegen
    38003435 73  PULSA,X,Y,U,CC ; Register restaurieren
    39003639  RTS ; zurück

    Die Tasten "+" und "-" wirken hier genauso wie bei der ADDRESS-Routine auf die Adresse und nicht auf das zu editierende Datum ein. Das ist sinnvoll, da im allgemeinen aufeinanderfolgende Speicherplätze editiert werden, die so bequem angewählt werden können. Es kommt dagegen selten vor, daß der Inhalt einer Speicherzelle inkrementiert bzw. dekrementiert werden soll.

Zu P3.2-4:

; Routine INSERT
; Die 255 Bytes über der aktuellen Adresse werden um einen Platz nach oben
; der freigewordene Platz wird mit $FF. Dann wird die Adresse inkrementiert und in
; die DATA-Routine gesprungen, so daß das gewünschte Datum eingegeben
; werden kann.
;
EC0E   ORG $EC0E 
;
EC0E34 17INSERT: PSHSA,B,X,CC; Register retten
EC10BD F1 10  JSRCLRDISP; Anzeige löschen
EC138E 00 06  LDX#$06; S6 selektieren
EC16CC 06 54  LDD#$0654; "in"
EC19BD F1 16  JSRSHOWD; ausgeben
EC1C9E 75  LDX<ADO ; aktuelle Adresse
EC1EC6 01  LDB#1; um 1
EC203A ABX  ; erhoehen
EC219F 75  STX<ADO; und speichern
EC2350 NEGB  ; B = $FF
EC243A ABX  ; X zeigt auf höchste Adresse
EC25A6 82ILOOP: LDA,-X; X dekrementieren, Datum
EC27A7 01  STA1,X; 1 Platz nach oben schieben
EC299C 75  CMPX<ADO; aktuelle Adresse erreicht?
EC2B26 F8  BNEILOOP; wenn nicht, wiederholen
EC2D86 FF  LDA#$FF; $FF in
EC2FA7 84  STA,X; freigewordene Speicherplatz
EC3135 17  PULSA,B,X,CC ; Register restaurieren
EC3313 SYNC  ; Ende

Zu P3.2-5:

Da die Routine bereits in Bild 3.2-9 vollständig beschrieben wird, wird hierzu kein Lösungsvorschlag angegeben.

Zu P3.2-6:

Das folgende Listing können Sie erhalten, indem Sie aus dem Praktikumsrechner (mit Hilfe des Programms TERM9.EXE) oder aus dem 6809-Emulator den Speicherbereich $FE00-$FEFF in eine Datei übertragen und diese mit dem Programm DS9.EXE disassemblieren. Studieren Sie es aufmerksam unter Beachtung der Kommentare.

AdresseOpCode Mnemocode Bemerkung
1         
2009B ZK EQU$9B; Zeilenkennung
3009C ZL EQU$9C; Zeilenlänge
4009D PS EQU$9D; Prüfsumme
5009E LO EQU$9E; Lade-Offset
6F008 DRACIA EQU$F008; Datenregister der ACIA
7F009 SRACIA EQU$F009; Statusregister der ACIA
8F110 CLRDISP EQU$F110 
9F116 SHOWD EQU$F116 
10F120 SHOWB7SG EQU$F120 
11F156 SHOWADR EQU$F156 
12E38F MONITOR EQU$E38F 
13       
14FE00   ORG$FE00 
15FE00BD FE CE V24LOADJSROFFSET ; 'oF' ausgeben, Lade-Offset einlesen
16FE03BD F1 10 JSRCLRDISP  ; Anzeige löschen
17FE067F 00 9B  CLR>ZK ; Zeilenkennung löschen
18FE097F 00 9D  CLR>PS ; Prüfsumme löschen
19FE0CBD FE 46 LOOP_ZJSRWAIT_Z ; auf Zeilenanfang warten
20FE0F8D 48  BSRINBYTE ; Byte empfangen und umwandeln
21FE11F7 00 9C  STB>ZL ; als Zeilenlänge abspeichern
22FE148D 43  BSRINBYTE ; Byte empfangen und umwandeln
23FE161F 98  TFRB,A ; als Zeilenanfangsadresse ZAAH nach Akku A
24FE188D 3F  BSRINBYTE ; ZAAL empfangen und umwandeln
25FE1AF3 00 9E  ADDD>LO ; Lade-Offset zu ZAA addieren
26FE1D1F 01  TFRD,X ; Zeilenanfangsadresse nach X
27FE1F8D 38  BSRINBYTE ; Byte empfangen und umwandeln
28FE21F7 00 9B  STB>ZK ; als Zeilenkennnung abspeichern
29FE248D 66  BSRINDATA ; Daten der Zeile empfangen und
30       ; im Puffer mit X abspeichern
31FE268D 31  BSRINBYTE ; Byte empfangen und umwandeln
32FE287D 00 9D  TST>PS ; Prüfsumme testen
33FE2B26 71  BNEFEHLER ; falls ungleich $00, Fehlerausgabe
34FE2D7D 00 9B  TST>ZK ; letzte Zeile ?
35FE3027 DA  BEQLOOP_Z ; nein: Zeilenschleife bearbeiten
36        
37FE328E 00 06 ENDELDX#$0006 ; Anzeigestelle S6 anwählen
38FE35CC 79 54  LDD#$7954 ; Code für 'En' nach Akku D
39FE38BD F1 16  JSRSHOWD ; darstellen in der Anzeige
40FE3B30 1E  LEAX-2,X ; X um 2 dekr., S4 anwählen
41FE3DCC 5E 79  LDD#$5E79 ; Code für 'dE' nach Akku D
42FE40BD F1 16  JSRSHOWD ; darstellen in der Anzeige
43FE437E E3 25  JMPMONITOR ; Sprung zum Monitor
44        
45FE46BD FE 4E WAIT_ZJSRINCHAR ; Zeichen über V24 empfangen
46FE49C1 3A  CMPB #$3A; Vergleich mit ':'
47FE4B26 F9  BNEWAIT_Z ; kein Zeilenanfang gefunden
48FE4D39  RTS  ; Rücksprung
49FE4EF6 F0 09 INCHARLDBSRACIA ; Lesen des ACIA-Statusregisters
50FE51C5 08  BITB#$08 ; Testen des IRQ-Flags (kann entf.)
51FE5327 F9  BEQINCHAR ; Schleife, bis IRQ (dann hier BPL)
52FE55F6 F0 08  LDBDRACIA ; Lesen des ASCII-Zeichens
53FE5839  RTS  ; Rücksprung
54FE5934 12 INBYTEPSHSA,X ; A,X auf dem Stack retten
55FE5B8D 1B  BSRWACHAR ; auf 1. Zeichen warten und umwandeln
56FE5D58  LSLB  ; 1. Hex-Tetrade links verschieben
57FE5E58  LSLB   
58FE5F58  LSLB   
59FE6058  LSLB   
60FE6134 04  PSHSB ; 1. Tetrade auf dem Stack sichern
61FE638D 13  BSRWACHAR ; auf 2. Zeichen warten und umwandeln
62FE65EA E0  ORB,S+ ; mit 1. Tetrade verodern und Stack restaurieren
63FE671F 98  TFRB,A ; Byte nach Akku A bringen
64FE69BB 00 9D  ADDA>PS ; zur Prüfsumme addieren
65FE6CB7 00 9D  STA>PS ; und abspeichern
66FE6F8E 00 00  LDX#$0000 ; S0 der Anzeige anwählen
67FE72BD F1 20  JSRSHOWB7SG ; Byte anzeigen
68FE7535 12  PULSA,X ; A,X restaurieren
69FE7739  RTS  ; Rücksprung
70FE78BD FE 4E WACHARJSRINCHAR ; ASCII-Zeichen einlesen
71FE7BBD FE 7F  JSRASC2HEX ; ASCII hexadezimal umwandeln
72FE7E39  RTS  ; Rücksprung
73FE7FC0 30 ASC2HEXSUBB#$30 ; Offset von $30 abziehen
74FE81C1 0A  CMPB#$0A ; Ziffer oder Buchstabe ?
75FE8325 02  BLOZIFFER ; Sprung, falls Ziffer
76FE85C0 07  SUBB#$07 ; Buchstaben-Offset ($07) abziehen
77FE87C1 10 ZIFFERCMPB#$10 ; Buchstabe aus (A,B,...,F)
78FE8924 18  BHSFEHLER+5 ; Fehlermeldung
79FE8B39  RTS  ; Rücksprung
80FE8C34 02 INDATAPSHSA ; A retten
81FE8EB6 00 9C  LDA>ZL ; Zeilenlänge laden
82FE9127 08  BEQRUECK ; letztes Datum gelesen
83FE93BD FE 59 EINGJSRINBYTE ; Byte empfangen
84FE96E7 80  STB,X+ ; im Puffer über X abspeichern
85FE984A  DECA  ; Datenzähler dekrementieren
86FE9926 F8  BNEEING ; neues Datum empfangen
87FE9B35 02 RUECKPULSA ; A restaurieren
88FE9D39  RTS  ; Rücksprung
89FE9ECC 73 6D FEHLERLDD#$736D ; 'PS' Fehlermeldung
90FEA120 03  BRAWEITER  
91FEA3CC 74 79  LDD#$7479 ; 'hE' Fehlermeldung
92FEA6BD F1 10 WEITERJSRCLRDISP ; Anzeige löschen
93FEA98E 00 06  LDX#$0006 ; S6 in der Anzeige anwählen
94FEAC34 06  PSHSA,B ; A,B retten
95FEAECC 71 79  LDD#$7179 ; 'FE' in S7,S6
96FEB1BD F1 16  JSRSHOWD ; ausgeben
97FEB430 1E  LEAX-2,X ; X:=X-2, S4 anwählen
98FEB6CC 74 38  LDD#$7438 ; 'hL' in S5,S4
99FEB9BD F1 16  JSRSHOWD ; ausgeben
100FEBC30 1E  LEAX-2,X ; X:=X-2, S2 anwählen
101FEBECC 79 50  LDD#$7950 ; 'Er' in S3,S2
102FEC1BD F1 16  JSRSHOWD ; ausgeben
103FEC430 1E  LEAX-2,X ; X:=X-2, S0 anwählen
104FEC635 06  PULSA,B ; A,B restaurieren
105FEC8BD F1 16  JSRSHOWD ; 'PS' oder 'hL' ausgeben
106FECB7E E3 25  JMPMONITOR ; Sprung in den Monitor
107FECEBD F110 OFFSETJSRCLRDISP ; Anzeige löschen
108FED18E 0000  LDX#$0000 ; S0 in der Anzeige anwählen
109FED4CC 5C 71  LDD#$5C71 ; Code 'oF' nach Akku D
110FED7BD F1 16  JSRSHOWD ; ausgeben
111FEDA30 02  LEAX2,X ; X:=X+2, S2 anwählen
112FEDCBD F1 56  JSRSHOWADR ; Offset einlesen
113FEDF10 BF 00 9E  STY>LO ; Abspeichern als Lade-Offset
114FEE330 04  LEAX4,X ; S6 anwählen
115FEE5CC 38 5C  LDD#$385C ; Code 'Lo' nach D
116FEE8BD F1 16  JSRSHOWD ; ausgeben
117FEEB39  RTS  ; Rücksprung

Machen Sie sich bitte gründlich mit der Funktion ASC2HEX (ab $FE7F) vertraut.

Zu P3.2-7:

Um die Funktionstaste 'F1' mit der der FILL-Routine neu zu belegen, müssen Sie lediglich die Startadresse $1820 in die Speicherzellen $006C,$006D eintragen (s. KE1, Abschnitt 1.2.1).


3.2 Das Monitorprogramm Lösungsvorschläge zu den Selbsttestaufgaben