| Nächste Überarbeitung | Vorhergehende Überarbeitung |
| z9001:software:os:kassetteninterface [2013/05/30 16:44] – angelegt volkerp | z9001:software:os:kassetteninterface [2025/12/16 14:28] (aktuell) – [Logisches Aufzeichnungsformat] volkerp |
|---|
| ====== 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 ===== |
| |
| 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 | 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. | Periode mit bestimmter Dauer charakterisiert. |
| | |
| | Die Übertragungsrate beträgt etwa 1800 Baud. |
| |
| ^ Typ ^ Frequenz ^ Periode ^ CTC-Konstante ^ | ^ Typ ^ Frequenz ^ Periode ^ CTC-Konstante ^ |
| |
| Zeitkonstantenberechnung: 2,4576 Mhz (Takt) / 16 (CTC-Vorteiler) / 2 (DL074) / 600 Hz = 80h | 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. | Die Übertragung erfolgt blockweise, jeder Block hat 128 Bytes. |
| eines Blockes werden die Bytes durch kurze Vortöne getrennt. | 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. | 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 FCB)\\ |
| | Block 1, ..., n Daten der Datei\\ |
| | Block FFH letzter Datenblock der Datei\\ |
| | Endeblock |
| | |
| | <a2s> |
| | #---------#---------#---------# #---------#----------# |
| | | Block 0 | Block 1 | Block 2 | ... | Block n | Block FF | |
| | #---------#---------#---------# #---------#----------# |
| | </a2s> |
| | |
| | b) Blockaufbau: |
| | |
| | Vorton Folge von 1 - Bit mit abschließendem Trennzeichen: Block 0 - 6000 Trennzeichen, sonst 160 Trennzeichen\\ |
| | Blocknummer 1 Byte\\ |
| | Daten 128 Bytes\\ |
| | Prüfsumme 1 Byte (durch Addition aller Datenbytes gewonnen) |
| | |
| | <a2s> |
| | #--------#-------------#--------------#------------# |
| | | Vorton | Blocknummer | Datenbereich | Pruefsumme | |
| | #--------#-------------#--------------#------------# |
| | </a2s> |
| | |
| | c) Byteaufbau: |
| | |
| | Information 8 Zeichen\\ |
| | Trennzeichen 1 Zeichen |
| | |
| | ===== 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 |
| | |
| | |
| | |
| | ====== Der FCB ====== |
| | |
| | Zum Laden und Speichern auf Kassette nutzt das Betriebssystem einen speziellen Speicherbereich, den **File Control Block (FCB)**. |
| | |
| | Der FCB wird zur Beschreibung von Dateien auf einem externen Speicher (Kassette) verwendet. Vor |
| | 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. |
| | * 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. |
| | |
| | In Tools wie [[:programme:tc_listtap|]] werden verschiedene Ausprägungen analysiert. Details entnimmt man bei Bedarf dem Quellcode. |
| | |
| | **Basic-Programme** |
| | |
| | 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: |
| | |
| | * BASICODE |
| | * [[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> |
| | |