Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung |
z9001:software:os:kassetteninterface [2014/04/23 15:15] – [Logisches Aufzeichnungsformat] volkerp | z9001:software:os:kassetteninterface [2024/12/05 12:58] (aktuell) – volkerp |
---|
Endeblock | Endeblock |
| |
<ditaa noedgesep> | <a2s> |
+---------+---------+---------+ +---------+----------+ | #---------#---------#---------# #---------#----------# |
| Block 0 | Block 1 | Block 2 | ... | Block n | Block FF | | | Block 0 | Block 1 | Block 2 | ... | Block n | Block FF | |
+---------+---------+---------+ +---------+----------+ | #---------#---------#---------# #---------#----------# |
</ditaa> | </a2s> |
| |
b) Blockaufbau: | b) Blockaufbau: |
Prüfsumme 1 Byte (durch Addition aller Datenbytes gewonnen) | Prüfsumme 1 Byte (durch Addition aller Datenbytes gewonnen) |
| |
| <a2s> |
<ditaa noedgesep> | #--------#-------------#--------------#------------# |
+--------+-------------+--------------+------------+ | |
| Vorton | Blocknummer | Datenbereich | Pruefsumme | | | Vorton | Blocknummer | Datenbereich | Pruefsumme | |
+--------+-------------+--------------+------------+ | #--------#-------------#--------------#------------# |
</ditaa> | </a2s> |
| |
c) Byteaufbau: | c) Byteaufbau: |
| |
===== Hardware ===== | ===== Hardware ===== |
| |
| |
Bei der **Ausgabe ** jedes Bits wird der Kanal 0 des CTC | Bei der **Ausgabe ** jedes Bits wird der Kanal 0 des CTC |
{{:z9001:software:z9001_kassetteninterface_in.gif?600|}} | {{:z9001:software:z9001_kassetteninterface_in.gif?600|}} |
| |
{{:z9001:software:z9001_kassetteninterface1.gif?300|}} {{:z9001:software:z9001_kassetteninterface2.gif?300|}}\\ | {{:z9001:software:z9001_kassetteninterface1.gif|}} {{:z9001:software:z9001_kassetteninterface2.gif|}}\\ |
Audiosignal Eingang und hinter OPV, rechts Nulldurchgangsimpulse an Monoflop 22A/4 | Audiosignal Eingang und hinter OPV, rechts Nulldurchgangsimpulse an Monoflop 22A/4 |
| |
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. | 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. Aber - leider nur im Prinzip: | 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. | * 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. |
| |
* BASICODE | * BASICODE |
* TURBO (mit doppelter Frequenz sichern) | * [[z9001:software:turbo|verschiedene TURBO-Lader]] |
* TURBO (dem C64 nachempfunden - mit flackerndem Bildschirmrand) | |
* ... | * ... |
| |
| ====== 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 [[z9001:software:os:os12|]]. Die einzelnen Puzzlestücke aus dem OS sind hier zusammengefasst und erweitert kommentiert. |
| |
| <code> |
| 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 |
| </code> |
| |