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