Systemuhr fürZ 1013 ohne CTC

Eine interne Uhr, die verdeckt oder offen in einer Ecke des Bildschirmes mitläuft, ist für viele Arbeiten am Computer von Nutzen. Es gibt mehrere Möglichkeiten, dies zu realisieren. Eine ist mit dem Einsatz eines Counter/Timer Circuit (CTC, z.B. U 857) verbunden. Für den Bastler meist einfacher zu realisieren ist die Nutzung eines externen Sekundentaktes von einer Quarzuhr oder einer kleinen Zusatzschaltung.
Der externe Sekundentakt wird am  Steckverbinder  X2,  Anschluß A3 angeschlossen. Man kann z. B. die Taktgeberleiterplatte aus einem alten Quarzwecker, eine Armbanduhr mit defekter LCD-Anzeige oder eine selbst  aufgebaute  Schaltung, nach  Möglichkeit  mit  einem stromsparenden  CMOS-UhrenSchaltkreis nutzen. 
Mit dem nachfolgenden kleinen Maschinenprogramm wird über die PIO, vom Sekundentakt ausgelöst, ein laufendes Programm unterbrochen und die aktuelle Uhrzeit auf dem Bildschirm oben rechts  eingeblendet.  Danach wird das Programm fortgesetzt. Bei dieser einfachen Software-Lösung wird durch Save bzw. Load die laufende Zählung der PIO verlangsamt, so daß anschließend die Uhr nachgeht. Deshalb muß sie nach jedem Save/Load neu gestellt werden. Das Uhrprogramm besteht aus zwei Teilen:

- uhrd: Uhrzeit-Darstellung
- init: Initialisieren der PIO, Stellen der Uhr
Es kann auf beliebigen Adressen stehen.  Die Startadresse von "uhrd" muß allerdings in den Teil "init" eingetragen werden.
Der Teil "init" besteht ebenfalls aus zwei Teilen: Uhr stellen und Initialisieren. Beim vorliegenden Programm wird auf der Adresse 0B0  für "@U"  ein Sprung zum Stellen der Uhr eingetragen. Eventuell dort vorhandene Sprungadressen bleiben erhalten. Folgende RAM-Zellen werden benutzt:

00 = 0...Uhr aufgeblendet
   + 0...Uhr läuft verdeckt
08 Sekundenzähler
09 Minutenzähler
0A Stundenzählar
10 NWT der Startadresse von uhrd
11 HWT der Startadresse von uhrd.

Die Interrupt.Programmierung der PIO sieht wie folgt aus:
1. PIO auf BIT-E/A, BIT 4 auf Eingabe
2. Startadresse  von  uhrd  in Adresse 10/11 eintragen
3. Laden des lnterrupt-Registers der CPU
4. Laden des Interrupt-VektorRegisters der PIO
5. Ausgabe des lnterrupt-Steuerwortes an PIO
6. Ausgabe des lnterrupt-Maskenwortes an PIO
7. Freigabe Interrupt
Bei Verschiebung auf andere Adressen muß der Inhalt von 3F11 und 3F12 die neue Adresse von jetzt 3F16 beinhalten. In jetzt 3F41 muß der NWT und in jetzt 3F42 der HVVT der neuen Startadresse von uhrd stehen (jetzt 3F57).
Wird ein 2-Sekunden-Takt eingespeist, so ist der Inhalt von 3F5F von 01 auf 02 zu ändern.

init ab 3F00
21 DC 00 11 DF 00 01 2E
00 ED B8 3E 55 32 B0 00
21 16 3F 22 B1 00 E7 02
61 6B 74 75 65 6C 6C 65
20 5A 65 69 74 BA 21 0A
00 0E 03 06 02 E7 01 E7
00 D6 30 ED 6F 10 F6 E7
0E 2B 0D 20 EE F3 ED 5E
21 57 3F 22 10 00 AF ED
47 3E 10 D3 03 3E 97 D3
03 3E EF D3 03 FB FF
uhrd ab 3F57
                     F5
E5 D5 21 08 00 7E C6 01
27 FE 60 38 01 AF 77 38
20 23 7E C6 01 27 FE 60
38 01 AF 77 38 13 23 7E
C6 01 27 FE 24 38 01 AF
77 38 06 D1 E1 F1 FB ED
4D 2A 2B 00 E5 ED 5B 1F
00 3A 00 00 B7 20 1A 21
16 EC 22 2B 00 21 0A 00
7E E7 06 E7 02 BA 2B 7E
E7 06 E7 02 BA 2B 7E E7
06 E1 ED 53 1F 00 22 2B
00 3E 20 32 1E EC 18 C3

U. Rehn, D. Bittner
practic 4 /88
Das ganze nochmal als Source, diesmal von Adresse 0E100h an.
E100 21 DC 00 LD HL,00DC
E103 11 DF 00 LD DE,00DF
E106 01 2E 00 LD BC,002E
E109 ED B8 LDDR
E10B 3E 55 LD A,55
E10D 32 B0 00 LD (00B0),A
E110 21 16 E1 LD HL,E116
E113 22 B1 00 LD (00B1),HL
E116 E7 02 DA PRST7
E118 61 6B 74 75 DB 'aktu'
E11C 65 6C 6C 65 DB 'elle'
E120 20 5A 65 69 DB ' Zei'
E124 74 BA DB 't:'
E126 21 0A 00 LD HL,000A
E129 0E 03 LD C,03
E12B 06 02 LD B,02
E12D E7 01 DA INCH
E12F E7 00 DA OUTCH
E131 D6 30 SUB 30
E133 ED 6F RLD
E135 10 F6 DJNZ E12D-#
E137 E7 0E DA OUTSP
E139 2B DEC HL
E13A 0D DEC C
E13B 20 EE JRNZ E12B-#
E13D F3 DI
E13E ED 5E IM 2
E140 21 57 E1 LD HL,E157
E143 22 10 00 LD (0010),HL
E146 AF XOR A
E147 ED 47 LD I,A
E149 3E 10 LD A,10
E14B D3 03 OUT 03
E14D 3E 97 LD A,97
E14F D3 03 OUT 03
E151 3E EF LD A,EF
E153 D3 03 OUT 03
E155 FB EI
E156 FF RST 38
E157 F5 PUSH AF
E158 E5 PUSH HL
E159 D5 PUSH DE
E15A 21 08 00 LD HL,0008
E15D 7E LD A,M
E15E C6 01 ADD 01
E160 27 DAA
E161 FE 60 CMP 60
E163 38 01 JRC E166-#
E165 AF XOR A
E166 77 LD M,A
E167 38 20 JRC E189-#
E169 23 INC HL
E16A 7E LD A,M
E16B C6 01 ADD 01
E16D 27 DAA
E16E FE 60 CMP 60
E170 38 01 JRC E173-#
E172 AF XOR A
E173 77 LD M,A
E174 38 13 JRC E189-#
E176 23 INC HL
E177 7E LD A,M
E178 C6 01 ADD 01
E17A 27 DAA
E17B FE 24 CMP 24
E17D 38 01 JRC E180-#
E17F AF XOR A
E180 77 LD M,A
E181 38 06 JRC E189-#
E183 D1 POP DE
E184 E1 POP HL
E185 F1 POP AF
E186 FB EI
E187 ED 4D RETI
E189 2A 2B 00 LD HL,(002B)
E18C E5 PUSH HL
E18D ED 5B 1F 00 LD DE,(001F)
E191 3A 00 00 LD A,(0000)
E194 B7 OR A
E195 20 1A JRNZ E1B1-#
E197 21 16 EC LD HL,EC16
E19A 22 2B 00 LD (002B),HL
E19D 21 0A 00 LD HL,000A
E1A0 7E LD A,M
E1A1 E7 06 DA OUTHX
E1A3 E7 02 DA PRST7
E1A5 BA DB ':'
E1A6 2B DEC HL
E1A7 7E LD A,M
E1A8 E7 06 DA OUTHX
E1AA E7 02 DA PRST7
E1AC BA DB ':'
E1AD 2B DEC HL
E1AE 7E LD A,M
E1AF E7 06 DA OUTHX
E1B1 E1 POP HL
E1B2 ED 53 1F 00 LD (001F),DE
E1B6 22 2B 00 LD (002B),HL
E1B9 3E 20 LD A,20
E1BB 32 1E EC LD (EC1E),A
E1BE 18 C3 JR E183-#

Hardwarefehler beim Z1013

Beim Ausprobieren dieses kleinen Programms sind die tollsten Erscheinungen aufgetreten, mal wurde der Zeichensatz umgeschalten (OUT 0Ch, OUT 10h) und in seltenen Fällen blieb der Rechner ganz hängen; Nicht einmal mehr /Reset hat an diesem Status etwas gändert ( Test: man versuche die PIOB auf Ausgabe zu Programmieren - und dann OUT PIOB,0FFh - und schon steht er. Bemerkung:. Es ist aber nicht sonderlich gut, auf die Adressleitung A0 einen H-Pegel(B5) zu legen. siehe Schaltplan IOA27)
 
Die Dekodierung des IO-Bereiches (/IOSEL0 ... /IOSEL2 ...) erfolgt nur über /IORQ und dem Auswerten von A2-A4. 
Jetzt sollte man sich anschauen, was im IM2 passiert: 
Die CPU hat gerade einen Befehl abgearbeitet und auf dem Adressbus liegt z.B. der 100Ch an. Die PIO hat gerade einen Interrupt-Befehl losgeschickt und die CPU quittiert diesen mit /IORQ und ?(/M1?). 
Das weitere kann man sich ausmalen. Sinnvoll ist demnach eine bessere IO-Request Dekodierung. 
Andreas Ziermann
Halle, 11.04.1999