Kassetteninterface
Physisches Aufzeichnungsformat
Zur Aufzeichnung der Information wird ein Frequenzmodulationsverfahren benutzt. Dabei existieren drei Zustände: Vorton (Trennzeichen), logisch „0“ und logisch „1“. Jeder Zustand wird durch eine Periode mit bestimmter Dauer charakterisiert.
Die Übertragungsrate beträgt etwa 1800 Baud.
| Typ | Frequenz | Periode | CTC-Konstante |
|---|---|---|---|
| Trennzeichen | 600 Hz | 1667 µs | 80h |
| 0-Bit | 1200 Hz | 833 µs | 40h |
| 1-Bit | 2400 Hz | 417 µs | 20h |
Zeitkonstantenberechnung: 2,4576 Mhz (Takt) / 16 (CTC-Vorteiler) / 2 (DL074) / 600 Hz = 80h
Jedes Zeichen wird durch eine volle Periode aufgezeichnet.
Logisches Aufzeichnungsformat
Die Übertragung erfolgt blockweise, jeder Block hat 128 Bytes. Vor jedem Block wird ein langer Vorton gesendet. Innerhalb eines Blockes werden die Bytes durch kurze Vortöne getrennt. Die Organisation der Blöcke sowie die Umwandlung der Information in Perioden bestimmter Dauer wird softwaremäßig realisiert.
a) Dateiaufbau:
Block 0 Dateikopf
Inhalt ist der komplette FCB (siehe 2.3.4.)
Block 1, …, n Daten der Datei
Block FFH letzter Datenblock der Datei
Endeblock
b) Blockaufbau:
Vorton Folge von 1 - Bit mit abschließendem Trennzeichen
Block 0: 6000
sonst 160
Blocknummer 1 Byte
Daten 128 Bytes
Prüfsumme 1 Byte (durch Addition aller Datenbytes gewonnen)
c) Byteaufbau:
Information 8 Zeichen
Trennzeichen 1 Zeichen
Hardware
Bei der Ausgabe jedes Bits wird der Kanal 0 des CTC (21D) initialisiert. Der Ausgang dieses Kanals steuert den Takteingang des D-Flip-Flops (19D), welches aus dem CTC-Signal einen Rechteckimpuls formt. Die Flanken dieses Impulses werden durch die RC-Kombination (R25, C70) abgeschliffen. Der nachfolgende Spannungsteiler (R26, R27) verringert den Pegel des Ausgabesignals auf max. 45 mV an RL = 10 kOhm. Dieses Signal wird dann über die Diodenbuchse X5 dem Kassettengerät zugeführt.
Beim Lesen vom Kassettengerät wird das Signal über ein Filter zum Operationsverstärker (24A) geführt, der das Signal in einen Rechteckimpuls umformt, der durch den nachfolgenden Widerstand und Diode (R24, V4) in ein TTL-Signal umgewandelt wird.
Die jetzt folgende Verzögerungskette mit dem Exklusiv-Oder (20A) am Schluss liefert bei jedem Flankenwechsel einen kurzen Impuls, der im Monoflop (22A) ein Signal von ca. 2 µs Länge erzeugt, welches über den Eingang ASTB der PIO1 (24D) einen Interrupt erzeugt. Softwaremäßig wird jetzt die Zeitdauer zwischen den PIO-Interrupts gemessen und der ermittelte Wert den entsprechenden Zuständen logisch „0“, „1“ oder Vorton zugeordnet.

Audiosignal Eingang und hinter OPV, rechts Nulldurchgangsimpulse an Monoflop 22A/4
Kassettenformate
Das Kassetten-Magnetband-Interface des Z9001, ein Diphase-Verfahren, wurde von Dr. Ulrich Kordon entwickelt, als ausreichend sicher gefunden und auf alle DDR-HC übernommen.
Deshalb benutzt der Z9001 im Prinzip das gleiche Kassettenaufzeichnungsformat wie auch die Mühlhauser Rechner HC900 und Nachfolger KC85/2..KC85/4. Aber - leider nur im Prinzip:
- Systemprogramme beginnen mit dem Block Nummer 0 und haben als Endekennung den Block Nummer 255 (0FFh). Beim HC900 beginnen Systemprogramme mit dem Block Nummer 1. Das übersehen leider viele Tools und Emulatoren.
- Der HC900 interpretiert den Kopfblock anders: Hier können bis zu 9 Parameter genutzt werden; beim Z9001 sind es 3 (AADR, EADR, SADR).
- Basic-Programme beginnen mit dem Block Nummer 1.
- Ab dem KC 87.2x werden Basic-Programme mit einem willkürlichen Block Nummer 0 begonnen, dann folgt das BASIC-Programm, dann folgt manchmal noch ein willkürlicher Block Nummer 255. Diese Außenblöcke stören nur und können gefahrlos entfernt werden.
- Es gibt Programme, die nicht die Systemroutinen zum Speichern nutzen und die aufeinanderfolgende Blocknummerierung durcheinanderwirbeln. Hierzu gehören z.B. relokatible Programme wie OS-SAVE.
Basic-Programme
Basic-Programme haben am Anfang 3x dasselbe Zeichen: 0D3h für Basic-Programme, 0D4h für Basic-Data-Feld-Dateien, 0D5h für ASCII-Listings. Wurde ein SAVE-Schutz mittels POKE 861,<>0 eingeschaltet, erhalten die BASIC-Programme die Codenummern 0D7h, 0D8h bzw. 0D9h. Dann folgen 8 Zeichen für den Dateinamen (mit Leerzeichen aufgefüllt).
Neben dem Standardformat zum Speichern aus Kassette gibt es eine Reihe weiterer Formate:
- BASICODE
- …
Implementierung
Das Betriebssystem stellt keine Funktion zum Speichern eines kompletten Speicherbereichs bereit. Diese muss als Programm nachgeladen werden (OS-SAVE, ZM30). Es gibt nur die drei Systemrufe (via CALL 5) zum Öffnen für Kassette schreiben, Schreiben eines BLocks, Schließen.
Auszug aus dem Betriebssystem Version OS 1.2. Die einzelnen Puzzlestücke aus dem OS sind hier zusammengefasst und erweitert kommentiert.
1/ 0 : page 0
2/ 0 :
3/ 0 : ; Z9001 Kassetteninterface, Auszug aus os.asm
4/ 0 :
5/ 0 : ;PN MONITOR 16.08.85
6/ 0 : ;
7/ 0 : ;MONITOR FUER SERIENGERAET 1985
8/ 0 : ;V 01.02.
9/ 0 : ;
10/ 0 : ; TITL ' R0BOTRON Z 9001 - MONITOR '
11/ 0 : ;
12/ 0 : cpu z80
13/ F000 : ORG 0F000H
14/ F000 : ;
15/ F000 : ;*******************************************************************
16/ F000 : ;* *
17/ F000 : ;* MONITOR - D E F I N I T I O N E N *
18/ F000 : ;* *
19/ F000 : ;*******************************************************************
20/ F000 : ;
21/ F000 : =0DH BCSV: EQU 0DH ;REGISTER FUER BC
22/ F000 : =0FH ASV: EQU 0FH ;REGISTER FUER A
23/ F000 : =1BH DMA: EQU 1BH ;ZEIGER AUF KASSETTENPUFFER
24/ F000 : =36H EOR: EQU 36H ;ZEIGER AUF LOG. RAM - ENDE
25/ F000 : =5CH FCB: EQU 5CH ;FILE-CONTROL-BLOCK
26/ F000 : ;FCB: BER 36 ;Dateikontrollblock
27/ F000 : ; FNAME: EQU FCB ;Dateiname 8 Zeichen
28/ F000 : ; FTYP: EQU FCB+8 ;Dateityp 3 Zeichen
29/ F000 : ; PSUM: EQU FCB+13 ;Prüfsumme eines Datenblockes
30/ F000 : ; ARB: EQU FCB+14 ;Hilfszelle für Kassettentreiber
31/ F000 : ; BLNR: EQU FCB+15 ;Blocknummer
32/ F000 : ; LBLNR: EQU FCB+16 ;gesuchte Blocknummer bei Lesen
33/ F000 : ; AADR EQU FCB+17 ;Dateianfangsadresse
34/ F000 : ; EADR EQU FCB+19 ;Dateiendeadresse
35/ F000 : ; SADR EQU FCB+21 ;Startadresse, wenn Datei ein Maschinencodeprogramm ist
36/ F000 : ; SBY: EQU FCB+23 ;Schutzbyte ;0 nicht geschützt
37/ F000 : ; ;1 System nach Laden der Datei vor WRITE geschützt
38/ F000 : =69H PSUM: EQU 69H ;PRUEFSUMME
39/ F000 : =6AH ARB: EQU 6AH ;ARBEITSZELLE
40/ F000 : =6BH BLNR: EQU 6BH ;BLOCKNUMMER
41/ F000 : =6CH LBLNR: EQU 6CH ;ZU LESENDE BLOCKNUMMER
42/ F000 : =6DH AADR: EQU 6DH ;ANFANGSADRESSE
43/ F000 : =6FH EADR: EQU 6FH ;ENDADRESSE
44/ F000 : =71H START: EQU 71H ;STARTADRESSE
45/ F000 : ;
46/ F000 : =80H STDMA: EQU 80H ;STANDARDPUFFER FUER KASSETTE
47/ F000 : =0EFC0H MAPPI: EQU 0F000H-64 ;SYSTEMBYTE
48/ F000 : ;
49/ F000 : ; System-PIO ist PIO1
50/ F000 : =88H DPIO1A: equ 88H ;Daten Kanal A Video
51/ F000 : =8AH SPIO1A: equ 8aH ;Steuerung Kanal A
52/ F000 : =80H CTC0: EQU 80H
53/ F000 : =82H CTC2: EQU 82H
54/ F000 :
55/ F000 : ; Systemaufrufe
56/ F000 : =0F2FEH OCRLF equ 0F2FEh ; Ausgabe CR+LF
57/ F000 : =0F310H OSPAC equ 0F310h ; Ausgabe Leerzeichen
58/ F000 :
59/ F000 : =0F5A3H REA equ 0F5A3h ; AUSGABE FEHLERCODE A
60/ F000 : =0F593H REQU equ 0F593h ; Ausgabe String 'start tape' , warten auf ENTER
61/ F000 : ; setzt HL = (DMA)
62/ F000 :
63/ F000 : =0F23BH CHRAM equ 0F23Bh ;LOGISCHER SPEICHERTEST
64/ F000 : =0FAE3H INITA equ 0FAE3h ;TASTATUR INITIALISIERN
65/ F000 :
66/ F000 :
67/ F000 :
68/ F000 : ;noramchk equ 1 ; kein Schutz (MAPPI), kein Test auf RAM
69/ F000 :
70/ F000 :
71/ F000 : ;
72/ F000 : ;*******************************************************************
73/ F000 : ;* C L O A D - KOMMANDO *
74/ F000 : ;*******************************************************************
75/ F000 : ;
76/ F000 : ; Funktion: Laden eines Programms
77/ F000 : ;
78/ F000 : LOAD: ;prep fcb ;FCB muss korrekt gefüllt sein
79/ F000 : ;...
80/ F000 : CD 24 F0 LOAD4: CALL OPENR
81/ F003 : 30 09 JR NC, LOAD5 ;KEIN FEHLER
82/ F005 : B7 OR A
83/ F006 : 37 SCF
84/ F007 : C8 RET Z ;STOP GEGEBEN
85/ F008 : CD A3 F5 CALL REA ;AUSG. FEHLERMELD. WARTEN REAKT.
86/ F00B : D8 RET C ;STOP GEGEBEN
87/ F00C : 18 F2 JR LOAD4 ;WIEDERHOLUNG
88/ F00E : 2A 6D 00 LOAD5: LD HL,(AADR) ;DATEIANFANGSADRESSE
89/ F011 : 22 1B 00 LD (DMA),HL ;NACH ADR. KASSETTENPUFFER
90/ F014 : CD 60 F0 LOA55: CALL READ ;LESEN BLOCK
91/ F017 : 30 05 JR NC, LOAD6 ;KEIN FEHLER
92/ F019 : CD A3 F5 CALL REA ;AUSG. FEHLERMELD. WARTEN REAKT.
93/ F01C : D8 RET C ;STOP GEGEBEN
94/ F01D : AF XOR A
95/ F01E : B7 LOAD6: OR A
96/ F01F : 28 F3 JR Z, LOA55 ;WEITER BIS DATEIENDE LESEN
97/ F021 : C3 FE F2 JP OCRLF
98/ F024 : ;
99/ F024 :
100/ F024 : ;
101/ F024 : ;*******************************************************************
102/ F024 : ;* BDOS CALL5-Routinen *
103/ F024 : ;*******************************************************************
104/ F024 : ;
105/ F024 : ;OPEN FUER KASSETTE LESEN
106/ F024 : ;
107/ F024 : CD 93 F5 OPENR: CALL REQU ;AUSGABE STARTMELDUNG
108/ F027 : ; HL := (DMA)
109/ F027 : 3C INC A
110/ F028 : D8 RET C ;STOP GEGEBEN
111/ F029 : E5 PUSH HL
112/ F02A : AF XOR A ;BLOCKNUMMER 0 LESEN
113/ F02B : 32 6C 00 LD (LBLNR),A
114/ F02E : CD 60 F0 CALL READ ;BLOCKLESEN
115/ F031 : E1 POP HL
116/ F032 : 22 1B 00 LD (DMA),HL ;PUFFERADR. ZURUECKSETZEN
117/ F035 : D8 RET C ;LESEFEHLER
118/ F036 : E5 PUSH HL
119/ F037 : 11 11 00 LD DE,17 ;OFFS. AADR (= AADR-FCB)
120/ F03A : 19 ADD HL,DE
121/ F03B : 11 6D 00 LD DE,AADR
122/ F03E : 01 08 00 LD BC,8
123/ F041 : ED B0 LDIR ;DATEIPARAMETER UEBERNEHMEN
124/ F043 : D1 POP DE
125/ F044 : 21 5C 00 LD HL,FCB
126/ F047 : 06 0B LD B,11
127/ F049 : CD 24 F1 CALL CHEC ;NAMENSVERGLEICH
128/ F04C : 3E 0D LD A,13
129/ F04E : 37 SCF
130/ F04F : C0 RET NZ ;FALSCHE DATEI GELESEN
131/ F050 : =>UNDEFINED ifndef noramchk
132/ F050 : 3A 73 00 LD A,(FCB+23) ;SCHUTZBYTE
133/ F053 : B7 OR A
134/ F054 : C8 RET Z ;KEIN SCHUTZ
135/ F055 : 32 C0 EF LD (MAPPI),A ;SYSTEMSCHUTZ EIN
136/ F058 : =>FALSE else
137/ F058 : XOR A ;A=0, Cy=0
138/ F058 : [131] endif
139/ F058 : C9 RET
140/ F059 : ;
141/ F059 : ;CLOSE FUER KASSETTE LESEN
142/ F059 : ;
143/ F059 : 21 6D 00 CLOSR: LD HL,AADR ;ADRESSE DER DATEIPARAMETER
144/ F05C : 22 0D 00 CLR1: LD (BCSV),HL ;UEBERGEBEN
145/ F05F : C9 RET
146/ F060 : ;
147/ F060 : ;BLOCKLESEN SEQUENTIELL
148/ F060 : ;
149/ F060 : CD 71 F0 READ: CALL RRAND ;BLOCK LESEN
150/ F063 : D8 RET C ;LESEFEHLER
151/ F064 : 22 1B 00 LD (DMA),HL ;PUFFERADR. UM 128 ERHOEHEN
152/ F067 : 21 6C 00 LD HL,LBLNR
153/ F06A : 34 INC (HL) ;ZU LESENDE BLOCKNUMMER ERHOEHEN
154/ F06B : F5 PUSH AF
155/ F06C : CD 10 F3 CALL OSPAC ;AUSGABE LEERZEICHEN
156/ F06F : F1 POP AF
157/ F070 : C9 RET
158/ F071 : ;
159/ F071 : ;BLOCKLESEN
160/ F071 : ;
161/ F071 : =>UNDEFINED RRAND: ifndef noramchk
162/ F071 : 2A 36 00 LD HL,(EOR) ;LOGISCHES RAM - ENDE
163/ F074 : 11 7F 00 LD DE,7FH
164/ F077 : ED 52 SBC HL,DE
165/ F079 : ED 5B 1B 00 LD DE,(DMA) ;PUFFERADRESSE
166/ F07D : CD 1E F1 CALL COMPW ;ADRESSVERGLEICH
167/ F080 : 3E 0A LD A,10
168/ F082 : D8 RET C ;BLOCK UEBERSCHREIBT RAM - ENDE
169/ F083 : EB EX DE,HL
170/ F084 : CD 3B F2 CALL CHRAM ;LOGISCHER SPEICHERTEST
171/ F087 : 3E 09 LD A,9
172/ F089 : 30 1D JR NC, ERAND ;BEREICH GESCHUETZT/ROM
173/ F08B : [161] endif
174/ F08B : F5 RR1: PUSH AF
175/ F08C : F1 RR2: POP AF
176/ F08D : CD D9 F1 CALL MAREK ;EINGABE BLOCK
177/ F090 : CD E3 FA CALL INITA ;TASTATUR INITIALISIEREN
178/ F093 : F5 PUSH AF
179/ F094 : E5 PUSH HL
180/ F095 : 21 6C 00 LD HL,LBLNR ;ZU LESENDE BLOCKNUMMER
181/ F098 : 3A 6B 00 LD A,(BLNR) ;GELESENE BLOCKNUMMER
182/ F09B : BE CP A, (HL)
183/ F09C : E1 POP HL
184/ F09D : 38 ED JR C, RR2 ;BLOCKNUMMER NOCH NICHT ERREICHT
185/ F09F : 28 09 JR Z, RROK ;GEFUNDEN
186/ F0A1 : FE FF CP A, 0FFH
187/ F0A3 : 28 05 JR Z, RROK ;ENDEBLOCK GELESEN
188/ F0A5 : F1 POP AF
189/ F0A6 : 3E 0B LD A,11 ;BLOCKNUMMER ZU GROSS
190/ F0A8 : 37 ERAND: SCF
191/ F0A9 : C9 RET
192/ F0AA : F1 RROK: POP AF
193/ F0AB : 3E 0C LD A,12
194/ F0AD : D8 RET C ;LESEFEHLER
195/ F0AE : 3A 6B 00 LD A,(BLNR) ;RUECKGABE EOF - KENNZEICHEN
196/ F0B1 : 3C INC A
197/ F0B2 : 3E 00 LD A,0
198/ F0B4 : 20 01 JR NZ, RROK1
199/ F0B6 : 3C INC A
200/ F0B7 : 32 0F 00 RROK1: LD (ASV),A ;1 WENN ENDEBLOCK, SONST 0
201/ F0BA : C9 RET
202/ F0BB : ;
203/ F0BB : ;OPEN FUER KASSETTE SCHREIBEN
204/ F0BB : ;
205/ F0BB : CD 93 F5 OPENW: CALL REQU ;AUSGABE STARTMELDUNG
206/ F0BE : ;HL := (DMA)
207/ F0BE : 3C INC A
208/ F0BF : D8 RET C ;STOP GEGEBEN
209/ F0C0 : E5 PUSH HL
210/ F0C1 : 21 5C 00 LD HL,FCB
211/ F0C4 : 22 1B 00 LD (DMA),HL ;SCHREIBEN DES FCB
212/ F0C7 : 3E 00 LD A,0
213/ F0C9 : 32 73 00 LD (FCB+23),A ;KEIN SCHUTZ
214/ F0CC : 01 70 17 LD BC,1770H ;LANGER VORTON
215/ F0CF : AF XOR A
216/ F0D0 : 32 6B 00 LD (BLNR),A ;BLOCKNUMMER 0
217/ F0D3 : 3E 02 LD A,2
218/ F0D5 : 32 6C 00 LD (LBLNR),A
219/ F0D8 : CD E8 F0 CALL WRIT1 ;SCHREIBEN BLOCK
220/ F0DB : E1 POP HL
221/ F0DC : 22 1B 00 LD (DMA),HL ;PUFFERADR. AUF AUSGANGSWERT
222/ F0DF : C9 RET
223/ F0E0 : ;
224/ F0E0 : ;CLOSE FUER KASSETTE SCHREIBEN
225/ F0E0 : ;
226/ F0E0 : 3E FF CLOSW: LD A,0FFH
227/ F0E2 : 32 6B 00 LD (BLNR),A ;BLOCKNUMMER FFH
228/ F0E5 : ;
229/ F0E5 : ;BLOCKSCHREIBEN SEQUENTIELL
230/ F0E5 : ;
231/ F0E5 : 01 A0 00 WRITE: LD BC,0A0H ;KURZER VORTON
232/ F0E8 : ED 5B 1B 00 WRIT1: LD DE,(DMA) ;PUFFERADRESSE
233/ F0EC : =>UNDEFINED ifndef noramchk
234/ F0EC : 3A C0 EF LD A,(MAPPI)
235/ F0EF : B7 OR A
236/ F0F0 : 28 04 JR Z, WRIT2 ;KEIN SCHUTZ VOR SCHREIBEN
237/ F0F2 : 3E 09 WERR: LD A,9 ;SCHREIBSCHUTZ
238/ F0F4 : 37 WERR1: SCF ;FEHLERAUSGANG
239/ F0F5 : C9 RET
240/ F0F6 : 2A 36 00 WRIT2: LD HL,(EOR) ;LOGISCHES RAM - ENDE
241/ F0F9 : D5 PUSH DE
242/ F0FA : 11 7F 00 LD DE,7FH
243/ F0FD : ED 52 SBC HL,DE
244/ F0FF : D1 POP DE
245/ F100 : CD 1E F1 CALL COMPW ;ADRESSVERGLEICH
246/ F103 : 3E 0A LD A,10
247/ F105 : 38 ED JR C, WERR1 ;BLOCK LIEGT HINTER RAM - ENDE
248/ F107 : EB EX DE,HL
249/ F108 : CD 3B F2 CALL CHRAM ;LOGISCHER SPEICHERTEST
250/ F10B : 30 E5 JR NC, WERR ;BEREICH IST GESCHUETZT/ROM
251/ F10D : [233] endif
252/ F10D : CD 5B F1 CALL KARAM ;AUSGABE BLOCK
253/ F110 : 22 1B 00 LD (DMA),HL ;PUFFERADR. UM 128 ERHOEHEN
254/ F113 : 21 6B 00 LD HL,BLNR
255/ F116 : 7E LD A,(HL)
256/ F117 : 32 0F 00 LD (ASV),A ;BLOCKNUMMER ZURUECKGEBEN
257/ F11A : 34 INC (HL) ;BLOCKNUMMER ERHOEHEN
258/ F11B : C3 E3 FA JP INITA ;TASTATUR INITIALISIERN
259/ F11E :
260/ F11E : ;Hilfsroutinen
261/ F11E :
262/ F11E : ;ADRESSVERGLEICH HL, DE
263/ F11E : E5 COMPW: PUSH HL
264/ F11F : B7 OR A
265/ F120 : ED 52 SBC HL,DE
266/ F122 : E1 POP HL
267/ F123 : C9 RET
268/ F124 : ;
269/ F124 : ;ZEICHENKETTENVERGLEICH
270/ F124 : ; in: HL Adresse String 1
271/ F124 : ; DE Adresse String 2
272/ F124 : ; B Anzahl zu vergleichender Zeichen
273/ F124 : ; ret: Z=1 -> String 1 = String 2
274/ F124 : ; DE unverändert
275/ F124 : ; HL Wort vor String 2
276/ F124 : ;
277/ F124 : E5 CHEC: PUSH HL ;ADR. 1. ZEICHENKETTE
278/ F125 : D5 PUSH DE ;ADR. 2. ZEICHENKETTE
279/ F126 : EB EX DE,HL
280/ F127 : 1A CHC0: LD A,(DE)
281/ F128 : FE 20 CP A, 20H
282/ F12A : 28 04 JR Z, CH0
283/ F12C : FE 40 CP A, 40H
284/ F12E : 38 02 JR C, CHC01
285/ F130 : E6 DF CH0: AND A, 0DFH ;NUR GROSSBUCHSTABEN
286/ F132 : BE CHC01: CP A, (HL)
287/ F133 : 13 INC DE
288/ F134 : 23 INC HL
289/ F135 : 20 0C JR NZ, CHC1
290/ F137 : 10 EE DJNZ CHC0 ;(B)=ANZAHL ZEICHEN
291/ F139 : D1 POP DE
292/ F13A : D1 POP DE ;ADR. 1. ZEICHENKETTE
293/ F13B : 6B LD L,E
294/ F13C : 62 LD H,D
295/ F13D : 2B DEC HL
296/ F13E : 7E LD A,(HL)
297/ F13F : 2B DEC HL
298/ F140 : 6E LD L,(HL)
299/ F141 : 67 LD H,A ;(HL)=WORT VOR 1. ZEICHENKETTE
300/ F142 : C9 RET
301/ F143 : D1 CHC1: POP DE
302/ F144 : E1 POP HL
303/ F145 : C9 RET
304/ F146 : ;
305/ F146 :
306/ F146 : ;
307/ F146 : ;
308/ F146 : ;*******************************************************************
309/ F146 : ;* *
310/ F146 : ;* O P E R A T I N G - S Y S T E M *
311/ F146 : ;* *
312/ F146 : ;*******************************************************************
313/ F146 :
314/ F146 : ; HARDWARE
315/ F146 :
316/ F146 : ;*******************************************************************
317/ F146 : ; Bei der Ausgabe jedes Bits wird der Kanal 0 des CTC initialisiert. Der Ausgang
318/ F146 : ; dieses Kanals steuert den Takteingang eines D-Flip-Flops, welches aus dem CTC-
319/ F146 : ; Signal einen Rechteckimpuls formt. Die Flanken dieses Impulses werden durch eine
320/ F146 : ; RC-Kombination abgeschliffen. Der nachfolgende Spannungsteiler verringert den
321/ F146 : ; Pegel des Ausgabesignals. Dieses Signal wird dann über die Diodenbuchse X5 dem
322/ F146 : ; Kassettengerät zugeführt.
323/ F146 : ;
324/ F146 : ; Beim Lesen vom Kassettengerät wird das Signal über ein Filter zu einem
325/ F146 : ; Operationsverstärker geführt, der das Signal in einen Rechteckimpuls umformt.
326/ F146 : ; Eine Verzögerungskette liefert bei jedem Flankenwechsel einen kurzen Impuls,
327/ F146 : ; welches über den Eingang ASTB der PIO1 einen Interrupt erzeugt. Softwaremäßig
328/ F146 : ; wird jetzt die Zeitdauer zwischen den PIO-Interrupts gemessen und der ermittelte
329/ F146 : ; Wert den entsprechenden Zuständen logisch "0", "1" oder Vorton zugeordnet.
330/ F146 : ;*******************************************************************
331/ F146 : ;
332/ F146 : ;INITIALISIERUNG DES COMPUTERS
333/ F146 : ;
334/ F146 : INIT: ; ...CALL IOST ;INITIALISIEREN STANDARD-E/A
335/ F146 :
336/ F146 : ;INTERRUPTADRESSEN
337/ F146 : 21 C3 F1 ld hl,IKACT ;KASSETTE SCHREIBEN
338/ F149 : 22 00 02 ld (200h), hl ;CTC0 200h
339/ F14C : 21 3A F2 ld hl,IKEP ;KASSETTE LESEN
340/ F14F : 22 0A 02 ld (20Ah), hl ;SPIOA 20Ah
341/ F152 :
342/ F152 : C9 ret
343/ F153 :
344/ F153 : WARM:
345/ F153 : ;...CALL INICT ;INITIALISIERUNG CTC
346/ F153 :
347/ F153 : 3E 03 LD A,3 ;Steuerwort CTC: Reset
348/ F155 : D3 80 OUT CTC0, A
349/ F157 : AF XOR A
350/ F158 : D3 80 OUT CTC0, A ;INTERRUPT-VEKTOR = 00h
351/ F15A :
352/ F15A : C9 RET
353/ F15B :
354/ F15B : ;
355/ F15B : ;*******************************************************************
356/ F15B : ;* KASSETTEN - E/A *
357/ F15B : ;*******************************************************************
358/ F15B : ;
359/ F15B : ;SCHREIBEN EINES BLOCKES
360/ F15B : ;
361/ F15B : F3 KARAM: DI
362/ F15C : AF XOR A
363/ F15D : 32 69 00 LD (PSUM),A
364/ F160 : ;CALL INIC1 ;Uhr aus
365/ F160 : ;OUT SPIOB, A ;TASTATUR AUS (A ist 3)
366/ F160 : CD 8D F1 CALL INIVT ;VORTON INIT.
367/ F163 : CD B1 F1 KARA1: CALL AUS1 ;VORTON AUSGEBEN
368/ F166 : ED A1 CPI
369/ F168 : EA 63 F1 JP PE,KARA1 ;BC MAL
370/ F16B : CD A9 F1 CALL AUST ;TRENNZEICHEN
371/ F16E : 3A 6B 00 LD A,(BLNR)
372/ F171 : CD 98 F1 CALL KAUBT ;BLOCKNUMMER AUSGEBEN
373/ F174 : 2A 1B 00 LD HL,(DMA) ;BLOCKADRESSE
374/ F177 : 06 80 LD B,80H ;ANZAHL BYTES
375/ F179 : 7E KARA2: LD A,(HL)
376/ F17A : CD 98 F1 CALL KAUBT ;AUSGABE DATENBYTE
377/ F17D : 3A 69 00 LD A,(PSUM)
378/ F180 : 86 ADD A, (HL) ;NEUE PRUEFSUMME
379/ F181 : 32 69 00 LD (PSUM),A
380/ F184 : 23 INC HL
381/ F185 : 10 F2 DJNZ KARA2
382/ F187 : CD 98 F1 CALL KAUBT ;PRUEFSUMME AUSGEBEN
383/ F18A : 7A LD A,D
384/ F18B : 18 2B JR DYNST ;LETZTE HALBPERIODE AUSGEBEN
385/ F18D : ;
386/ F18D : ;VORTON INITIALISIEREN
387/ F18D : 3E 85 INIVT: LD A,85H ;Steuerwort CTC: (EI, Zeitkonstante folgt)
388/ F18F : D3 80 OUT CTC0, A ;CTC0
389/ F191 : 3E 40 LD A,40H ;VORTON 1
390/ F193 : D3 80 OUT CTC0, A ;CTC0 Zeitkonstante: 2,4576 Mhz / 16 / 40h = 2400 Hz
391/ F195 : FB EI
392/ F196 : 57 LD D,A ;LAENGE HALBPERIODE
393/ F197 : C9 RET
394/ F198 : ;
395/ F198 : ;SCHREIBEN EINES BYTES
396/ F198 : ;in: A Byte
397/ F198 : ; D Länge Halbperiode vorheriges Bit
398/ F198 : ;ret: D Länge Halbperiode vorheriges Bit
399/ F198 : ;
400/ F198 : C5 KAUBT: PUSH BC
401/ F199 : 4F LD C,A
402/ F19A : 06 08 LD B,8
403/ F19C : CB 09 KAUB1: RRC C
404/ F19E : F5 PUSH AF
405/ F19F : DC B1 F1 CALL C, AUS1 ;1 BIT
406/ F1A2 : F1 POP AF
407/ F1A3 : D4 AD F1 CALL NC, AUS0 ;0 BIT
408/ F1A6 : 10 F4 DJNZ KAUB1
409/ F1A8 : C1 POP BC
410/ F1A9 : ;
411/ F1A9 : 1E 80 AUST: LD E,80H ;TRENNZEICHEN Zeitkonstante: 2,4576 Mhz / 16 / 80h = 600 Hz
412/ F1AB : 18 06 JR AUS
413/ F1AD : 1E 20 AUS0: LD E,20H ;0 BIT Zeitkonstante: 2,4576 Mhz / 16 / 20h = 1200 Hz
414/ F1AF : 18 02 JR AUS
415/ F1B1 : 1E 40 AUS1: LD E,40H ;1 BIT Zeitkonstante: 2,4576 Mhz / 16 / 40h = 2400 Hz
416/ F1B3 : 7A AUS: LD A,D
417/ F1B4 : CD B8 F1 CALL DYNST ;LETZTE HALBPERIODE NOCH AUSGEB.
418/ F1B7 : 7A LD A,D ;1. HALBPERIODE NEUES BIT
419/ F1B8 : 32 6A 00 DYNST: LD (ARB),A
420/ F1BB : 3A 6A 00 DY1: LD A,(ARB)
421/ F1BE : B7 OR A
422/ F1BF : 20 FA JR NZ, DY1 ;WARTEN BIS FLANKE AUSGEGEBEN
423/ F1C1 : 53 LD D,E ;LAENGE NEUE HALBPERIODE
424/ F1C2 : C9 RET
425/ F1C3 : ;
426/ F1C3 : ;INTERRRUPTROUTINE ZUM SCHREIBEN
427/ F1C3 : ;ret: (ARB)=0
428/ F1C3 : ;
429/ F1C3 : F5 IKACT: PUSH AF
430/ F1C4 : 3E 03 LD A,3 ;Steuerwort CTC (Reset)
431/ F1C6 : D3 80 OUT CTC0, A ;CTC0
432/ F1C8 : 3E 85 LD A,85H ;Steuerwort CTC (EI, Zeitkonstante folgt)
433/ F1CA : D3 80 OUT CTC0, A ;CTC0
434/ F1CC : 3A 6A 00 LD A,(ARB) ;Zeitkonstante holen
435/ F1CF : D3 80 OUT CTC0, A ;ZAEHLERWERT ENTSPR. ZEICHEN
436/ F1D1 : AF XOR A
437/ F1D2 : 32 6A 00 LD (ARB),A ;Arbeitszelle auf 0 setzen als Fertigmarkierung
438/ F1D5 : F1 POP AF
439/ F1D6 : FB EI
440/ F1D7 : ED 4D RETI
441/ F1D9 : ;
442/ F1D9 : ;LESEN EINES BLOCKES
443/ F1D9 : ; ret: BLNR Blocknummer
444/ F1D9 : ; PSUM Prüfsumme
445/ F1D9 : ; CY 0 kein Fehler, 1 Fehler
446/ F1D9 : ;
447/ F1D9 : MAREK:
448/ F1D9 : F3 DI
449/ F1DA : ;CALL INIC1 ;Uhr aus
450/ F1DA : 3E 03 LD A,3
451/ F1DC : MAREK0: ;OUT SPIOB, A ;TASTATUR AUS
452/ F1DC : D3 8A OUT SPIO1A, A
453/ F1DE : 3E 05 LD A,5
454/ F1E0 : D3 80 OUT CTC0, A ;CTC 0 ZUM ZEIT MESSEN
455/ F1E2 : 3E B0 LD A,0B0H ;STARTWERT
456/ F1E4 : D3 80 OUT CTC0, A
457/ F1E6 : 3E 0F LD A,0FH
458/ F1E8 : D3 8A OUT SPIO1A, A
459/ F1EA : 3E 0A LD A,0AH ;Interruptvektor 20A -> IKEP
460/ F1EC : D3 8A OUT SPIO1A, A
461/ F1EE : 3E E7 LD A,0E7H ;SYSTEM PIO INTERRUPT ERLAUBT
462/ F1F0 : D3 8A OUT SPIO1A, A
463/ F1F2 : FB EI
464/ F1F3 : 06 16 MA1: LD B,22 ;22 VORTOENE SUCHEN
465/ F1F5 : CD 4E F2 MA2: CALL LSTOP ;EIN BIT/TRENNZEICHEN LESEN
466/ F1F8 : 38 F9 JR C, MA1 ;0 BIT GELESEN
467/ F1FA : FE 90 CP A, 90H
468/ F1FC : 38 F5 JR C, MA1 ;TRENNZEICHEN GELESEN
469/ F1FE : 10 F5 DJNZ MA2
470/ F200 : 06 02 LD B,2 ;1 TRENNZEICHEN
471/ F202 : AF MA3: XOR A
472/ F203 : 32 69 00 LD (PSUM),A
473/ F206 : 4F LD C,A
474/ F207 : 32 6A 00 LD (ARB),A
475/ F20A : CD 5D F2 CALL LS1 ;EINE HALBPERIODE MESSEN
476/ F20D : FE 52 CP A, 52H
477/ F20F : 30 F1 JR NC, MA3 ;KEIN TRENNZEICHEN
478/ F211 : 10 EF DJNZ MA3
479/ F213 : CD 65 F2 CALL IBYTE ;BLOCKNUMMER LESEN
480/ F216 : D8 RET C ;FEHLER
481/ F217 : 32 6B 00 LD (BLNR),A
482/ F21A : 06 80 LD B,80H ;ANZAHL BYTES
483/ F21C : 2A 1B 00 LD HL,(DMA) ;BLOCKADRESSE
484/ F21F : CD 65 F2 MA4: CALL IBYTE ;DATENBYTE LESEN
485/ F222 : D8 RET C ;FEHLER
486/ F223 : 77 LD (HL),A
487/ F224 : 3A 69 00 LD A,(PSUM)
488/ F227 : 86 ADD A, (HL) ;NEUE PRUEFSUMME
489/ F228 : 32 69 00 LD (PSUM),A
490/ F22B : 23 INC HL
491/ F22C : 10 F1 DJNZ MA4
492/ F22E : CD 65 F2 CALL IBYTE ;PRUEFSUMME LESEN
493/ F231 : D8 RET C ;FEHLER
494/ F232 : 47 LD B,A
495/ F233 : 3A 69 00 LD A,(PSUM)
496/ F236 : B8 CP A, B
497/ F237 : C8 RET Z ;IN ORDNUNG
498/ F238 : 37 SCF
499/ F239 : C9 RET ;FEHLER
500/ F23A : ;
501/ F23A : ;INTERRUPTROUTINE ZUM LESEN
502/ F23A : ;ret: (ARB) = Länge einer Halbperiode
503/ F23A : ;
504/ F23A : F5 IKEP: PUSH AF
505/ F23B : DB 80 IN A, CTC0
506/ F23D : F5 PUSH AF
507/ F23E : 3E 07 LD A,7
508/ F240 : D3 80 OUT CTC0, A
509/ F242 : 3E B0 LD A,0B0H ;NEUE ZEITMESSUNG
510/ F244 : D3 80 OUT CTC0, A ;Startwert
511/ F246 : F1 POP AF
512/ F247 : 32 6A 00 LD (ARB),A ;gemessener Wert
513/ F24A : F1 POP AF
514/ F24B : FB EI
515/ F24C : ED 4D RETI
516/ F24E : ;
517/ F24E : ;LESEN EINES BITS
518/ F24E : ;ret: C = Länge der Periode
519/ F24E : ; CY = 1 0 Bit
520/ F24E : ; = 0 und C < 90H Trennz.
521/ F24E : ; = 0 und C >= 90H 1 Bit
522/ F24E : ;
523/ F24E :
524/ F24E : ;Bit Wert B0-x *2 Return
525/ F24E : ; KAUBT
526/ F24E : ;-------------------------------------
527/ F24E : ;0 20h 90h 120h Cy=1
528/ F24E : ;1 40h 70h E0h > 90h
529/ F24E : ;Trennz 80h 30h 60h < 90h
530/ F24E :
531/ F24E : AF LSTOP: XOR A
532/ F24F : 32 6A 00 LD (ARB),A
533/ F252 : 3A 6A 00 LS0: LD A,(ARB)
534/ F255 : B7 OR A
535/ F256 : 28 FA JR Z, LS0 ;WARTEN AUF 1. FLANKE
536/ F258 : 4F LD C,A
537/ F259 : AF XOR A
538/ F25A : 32 6A 00 LD (ARB),A
539/ F25D : 3A 6A 00 LS1: LD A,(ARB)
540/ F260 : B7 OR A
541/ F261 : 28 FA JR Z, LS1 ;WARTEN AUF 2. FLANKE
542/ F263 : 81 ADD A, C
543/ F264 : C9 RET
544/ F265 : ;
545/ F265 : ;LESEN EINES BYTES
546/ F265 : ; ret: A, E Byte
547/ F265 : ; CY 1 Fehler, 0 kein Fehler
548/ F265 : ;
549/ F265 : 16 08 IBYTE: LD D,8
550/ F267 : AF XOR A
551/ F268 : 5F LD E,A
552/ F269 : CD 4E F2 IB1: CALL LSTOP ;LESEN EIN ZEICHEN
553/ F26C : 3F CCF
554/ F26D : 30 04 JR NC, IB2 ;0 BIT
555/ F26F : FE 90 CP A, 90H
556/ F271 : D8 RET C ;TRENNZEICHEN
557/ F272 : 37 SCF ;1 BIT
558/ F273 : CB 1B IB2: RR E
559/ F275 : 15 DEC D
560/ F276 : 20 F1 JR NZ, IB1
561/ F278 : CD 4E F2 CALL LSTOP ;LESEN TRENNZEICHEN
562/ F27B : 7B LD A,E
563/ F27C : C9 RET
564/ F27D : ;
565/ F27D : END

