Kassetteninterface

Zur Aufzeichnung der Information wird ein Frequenzmodulationsverfahren benutzt. Dabei existieren drei Zustände: Vorton (Trennzeichen), logisch „0“ und logisch „1“. Jeder Zustand wird durch eine Periode mit bestimmter Dauer charakterisiert.

Die Übertragungsrate beträgt etwa 1800 Baud.

Typ Frequenz Periode CTC-Konstante
Trennzeichen 600 Hz 1667 µs 80h
0-Bit 1200 Hz 833 µs 40h
1-Bit 2400 Hz 417 µs 20h

Zeitkonstantenberechnung: 2,4576 Mhz (Takt) / 16 (CTC-Vorteiler) / 2 (DL074) / 600 Hz = 80h

Jedes Zeichen wird durch eine volle Periode aufgezeichnet.

Die Übertragung erfolgt blockweise, jeder Block hat 128 Bytes. Vor jedem Block wird ein langer Vorton gesendet. Innerhalb eines Blockes werden die Bytes durch kurze Vortöne getrennt. Die Organisation der Blöcke sowie die Umwandlung der Information in Perioden bestimmter Dauer wird softwaremäßig realisiert.

a) Dateiaufbau:

Block 0 Dateikopf
Inhalt ist der komplette FCB (siehe 2.3.4.)
Block 1, …, n Daten der Datei
Block FFH letzter Datenblock der Datei
Endeblock

Block 0 Block 1 Block 2 Block n Block FF ...

b) Blockaufbau:

Vorton Folge von 1 - Bit mit abschließendem Trennzeichen
Block 0: 6000
sonst 160
Blocknummer 1 Byte
Daten 128 Bytes
Prüfsumme 1 Byte (durch Addition aller Datenbytes gewonnen)

Vorton Blocknummer Datenbereich Pruefsumme

c) Byteaufbau:

Information 8 Zeichen
Trennzeichen 1 Zeichen

Bei der Ausgabe jedes Bits wird der Kanal 0 des CTC (21D) initialisiert. Der Ausgang dieses Kanals steuert den Takteingang des D-Flip-Flops (19D), welches aus dem CTC-Signal einen Rechteckimpuls formt. Die Flanken dieses Impulses werden durch die RC-Kombination (R25, C70) abgeschliffen. Der nachfolgende Spannungsteiler (R26, R27) verringert den Pegel des Ausgabesignals auf max. 45 mV an RL = 10 kOhm. Dieses Signal wird dann über die Diodenbuchse X5 dem Kassettengerät zugeführt.

Beim Lesen vom Kassettengerät wird das Signal über ein Filter zum Operationsverstärker (24A) geführt, der das Signal in einen Rechteckimpuls umformt, der durch den nachfolgenden Widerstand und Diode (R24, V4) in ein TTL-Signal umgewandelt wird.

Die jetzt folgende Verzögerungskette mit dem Exklusiv-Oder (20A) am Schluss liefert bei jedem Flankenwechsel einen kurzen Impuls, der im Monoflop (22A) ein Signal von ca. 2 µs Länge erzeugt, welches über den Eingang ASTB der PIO1 (24D) einen Interrupt erzeugt. Softwaremäßig wird jetzt die Zeitdauer zwischen den PIO-Interrupts gemessen und der ermittelte Wert den entsprechenden Zuständen logisch „0“, „1“ oder Vorton zugeordnet.


Audiosignal Eingang und hinter OPV, rechts Nulldurchgangsimpulse an Monoflop 22A/4

Kassettenformate

Das Kassetten-Magnetband-Interface des Z9001, ein Diphase-Verfahren, wurde von Dr. Ulrich Kordon entwickelt, als ausreichend sicher gefunden und auf alle DDR-HC übernommen.

Deshalb benutzt der Z9001 im Prinzip das gleiche Kassettenaufzeichnungsformat wie auch die Mühlhauser Rechner HC900 und Nachfolger KC85/2..KC85/4. Aber - leider nur im Prinzip:

  • Systemprogramme beginnen mit dem Block Nummer 0 und haben als Endekennung den Block Nummer 255 (0FFh). Beim HC900 beginnen Systemprogramme mit dem Block Nummer 1. Das übersehen leider viele Tools und Emulatoren.
  • Der HC900 interpretiert den Kopfblock anders: Hier können bis zu 9 Parameter genutzt werden; beim Z9001 sind es 3 (AADR, EADR, SADR).
  • Basic-Programme beginnen mit dem Block Nummer 1.
  • Ab dem KC 87.2x werden Basic-Programme mit einem willkürlichen Block Nummer 0 begonnen, dann folgt das BASIC-Programm, dann folgt manchmal noch ein willkürlicher Block Nummer 255. Diese Außenblöcke stören nur und können gefahrlos entfernt werden.
  • Es gibt Programme, die nicht die Systemroutinen zum Speichern nutzen und die aufeinanderfolgende Blocknummerierung durcheinanderwirbeln. Hierzu gehören z.B. relokatible Programme wie OS-SAVE.

Basic-Programme

Basic-Programme haben am Anfang 3x dasselbe Zeichen: 0D3h für Basic-Programme, 0D4h für Basic-Data-Feld-Dateien, 0D5h für ASCII-Listings. Wurde ein SAVE-Schutz mittels POKE 861,<>0 eingeschaltet, erhalten die BASIC-Programme die Codenummern 0D7h, 0D8h bzw. 0D9h. Dann folgen 8 Zeichen für den Dateinamen (mit Leerzeichen aufgefüllt).

Neben dem Standardformat zum Speichern aus Kassette gibt es eine Reihe weiterer Formate:

Implementierung

Das Betriebssystem stellt keine Funktion zum Speichern eines kompletten Speicherbereichs bereit. Diese muss als Programm nachgeladen werden (OS-SAVE, ZM30). Es gibt nur die drei Systemrufe (via CALL 5) zum Öffnen für Kassette schreiben, Schreiben eines BLocks, Schließen.

Auszug aus dem Betriebssystem Version OS 1.2. Die einzelnen Puzzlestücke aus dem OS sind hier zusammengefasst und erweitert kommentiert.

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