Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
z9001:software:os:kassetteninterface [2019/06/14 13:18] – [Kassettenformate] volkerpz9001:software:os:kassetteninterface [2025/12/16 14:28] (aktuell) – [Logisches Aufzeichnungsformat] volkerp
Zeile 1: Zeile 1:
 ====== Kassetteninterface ====== ====== Kassetteninterface ======
 +
 +
 +Das Kassetten-Magnetband-Interface des Z9001, ein Diphase-Verfahren, wurde von Dr. Ulrich Kordon, Dresden, 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. Die Frequenzen sind leicht anders (aber im Toleranzbereich), und der Kopfblock / FCB wird bzgl. Parametern anders genutzt. Basic-Programme können gegenseitig geladen und gestartet werden, sofern keine inkompatiblen BASIC-Befehle darin vorkommen.
 +
  
 ===== Physisches Aufzeichnungsformat ===== ===== Physisches Aufzeichnungsformat =====
Zeile 26: Zeile 32:
 a) Dateiaufbau: a) Dateiaufbau:
  
-Block 0 Dateikopf\\ +Block 0 DateikopfInhalt ist der komplette FCB (siehe FCB)\\
-Inhalt ist der komplette FCB (siehe 2.3.4.)\\+
 Block 1, ..., n Daten der Datei\\ Block 1, ..., n Daten der Datei\\
 Block FFH letzter Datenblock der Datei\\ Block FFH letzter Datenblock der Datei\\
 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:
  
-Vorton Folge von 1 - Bit mit abschließendem Trennzeichen\\ +Vorton Folge von 1 - Bit mit abschließendem TrennzeichenBlock 0 6000 Trennzeichen, sonst 160 Trennzeichen\\
-Block 06000\\ +
-sonst 160\\+
 Blocknummer 1 Byte\\ Blocknummer 1 Byte\\
 Daten 128 Bytes\\ Daten 128 Bytes\\
 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:
Zeile 62: Zeile 62:
  
 ===== Hardware ===== ===== Hardware =====
- 
  
 Bei  der  **Ausgabe ** jedes  Bits  wird  der  Kanal  0  des  CTC Bei  der  **Ausgabe ** jedes  Bits  wird  der  Kanal  0  des  CTC
Zeile 97: Zeile 96:
  
  
-====== 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.+====== Der FCB ======
  
-Deshalb benutzt der Z9001 im Prinzip das gleiche Kassettenaufzeichnungsformat wie auch die Mühlhauser Rechner HC900 und Nachfolger KC85/2..KC85/4Aber - leider nur im Prinzip:+Zum Laden und Speichern auf Kassette nutzt das Betriebssystem einen speziellen Speicherbereich, den **File Control Block (FCB)**.
  
-  * 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 FCB wird zur Beschreibung von Dateien auf einem externen Speicher (Kassette) verwendet. Vor 
-  * Der HC900 interpretiert den Kopfblock anders: Hier können bis zu 9 Parameter genutzt werden; beim Z9001 sind es 3 (AADR, EADR, SADR).+jedem Auslagern einer Datei muß der FCB initialisiert werden. Mit dem Systemruf 15 (OPENW) wird 
 +dieser FCB als Block 0 auf Kassette geschrieben, um die Datei bei erneutem Einlesen eindeutig 
 +identifizieren zu können. Zum Einlesen ist der Systemruf 13 (OPENR) zu verwenden. Die 
 +Anfangsadresse des FCBs ist 5CH. 
 + 
 +Aufbau des FCBs: 
 + 
 +^ Adresse  ^ Inhalt                                                              ^ Bemerkung 
 +| 005CH    | Dateiname 8 Zeichen mit Buchstaben beginnend ggf. mit 00 auffüllen  |            | 
 +| 0064H    | Dateityp 3 Zeichen mit Buchstaben beginnend ggf. mit 00 auffüllen   |            | 
 +| 0067H    | - frei für Erweiterungen                                            |            | 
 +| 0068H    | - frei für Erweiterungen                                            |            | 
 +| 0069H    | PSUM Blockprüfsumme                                                            | 
 +| 006AH    | ARB interne Arbeitszelle                                            |            | 
 +| 006BH    | BLNR Nummer zu schreibender Block oder Nummer gelesener Block                  | 
 +| 006CH    | LBLNR Nummer zu lesender Block                                      |            | 
 +| 006DH    | AADR Anfangsadresse der Datei                                                  | 
 +| 006FH    | EADR Endadresse der Datei                                                      | 
 +| 0071H    | SADR Startadresse eines Programms                                              | 
 +| 0073H    | SBY Schutzbyte                                                      |            | 
 +| 0074H    | 'N' - Laden ohne Kopfblock                                          | USB-OS     | 
 +| 0075H    | LEADR - letzte beschriebene Adresse                                 | USB-OS     | 
 + 
 +Hinweise: 
 +  * vor OEPNW sind durch den Anwender Dateiname, Dateityp, Anfangsadresse, Endadresse, Startadresse und Schutzbyte zu initialisieren 
 +  * die Startadresse einer Datendatei oder eines nicht selbst startenden Programmes auf FFFFH setzen (kein versehentliches Starten bei Einlesen im OS-Mode, da Sprung auf RET-Befehl) 
 +  * vor OPENR sind Dateiname und Dateityp zu initialisieren 
 +  * nach OPENR sind Anfangsadresse, Endadresse, Startadresse und Schutzbyte durch die von Kassette gelesenen aktualisiert (nicht bei 'file not found'
 +  * wird eine Datei mit Schutzbyte = 1 eingelesen, ist kein Schreiben auf Kassette mehr möglich 
 +  * Die Speicherzellen 0074..0076 werden von der EOS-Software genutzt (SD-OS, USB-OS, Disk-OS), s. [[..:..:erweiterungen:massenspeicher|]] 
 + 
 +====== Kopfblock ====== 
 + 
 +**Block 0:** Der FCB wird ab Adresse 005C auf Kassette als Block Nr. 0 (Kopfblock) gespeichert. In den Emulator-Dateien (*.KCC u.a.) wird ebenfalls der Kopfblock zuerst gespeichert. Damit ist dieser 1:1 zum FCB aufgebaut. 
 + 
 +Der Aufbau des Kopfblocks ist leider nicht komplett mit den Mühlhäuser Rechnern abgestimmt. Und selbst am Z9001 nutzt das BASIC nicht den Kopfblock mit der Blocknummer 0, sondern nutzt sein eigenes logisches Aufzeichnungsformat. 
 + 
 +  * Systemprogramme beginnen mit dem Block Nummer 0 und haben als Endekennung den Block Nummer 255 (0FFh). Beim HC900/KC85.2 ff.  beginnen Systemprogramme mit dem Block Nummer 1. Das übersehen leider viele Tools und Emulatoren
 +  * Andere Programme nutzen den Kopfblock auf eigene Weise, z.B. nur für den Dateinamen (z.B. Textdateien). Die Verwendung der weiteren Felder im Kopfblock ist programmspezifisch
 +  * Der HC900/KC85.2 ff. interpretiert den Kopfblock anders: Hier können bis zu 9 Parameter genutzt werden; beim Z9001 sind es 3 (AADR, EADR, SADR). Außerdem wird EADR+1 in den Kopfblock geschrieben. Beim Z9001 ist es die tatsächliche letzte belegte Adresse.
   * Basic-Programme beginnen mit dem Block Nummer 1.   * 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.   * 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.   * 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.
 +
 +In Tools wie [[:programme:tc_listtap|]] werden verschiedene Ausprägungen analysiert. Details entnimmt man bei Bedarf dem Quellcode.
  
 **Basic-Programme** **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).+Basic-Programme beginnen mit Block Nummer 1. Ab dem KC 87.2x werden Basic-Programme mit einem willkürlichen Block Nummer 0 davor geschrieben! Dieser Block wird beim Einlesen komplett ignoriert. 
 + 
 +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), 2 Zeichen Programmlänge, und dann das komprimierte BASIC-Programm (s. BASIC).
  
 Neben dem Standardformat zum Speichern aus Kassette gibt es eine Reihe weiterer Formate: Neben dem Standardformat zum Speichern aus Kassette gibt es eine Reihe weiterer Formate:
Zeile 118: Zeile 159:
   * [[z9001:software:turbo|verschiedene TURBO-Lader]]   * [[z9001:software:turbo|verschiedene TURBO-Lader]]
   * ...   * ...
 +
 +
 +====== 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>
  
  • z9001/software/os/kassetteninterface.1560518297.txt.gz
  • Zuletzt geändert: 2019/06/14 13:18
  • von volkerp