001
20.09.2010, 21:34 Uhr
jmueller
|
Vor fast 20 Jahren hatte ich das Format mal analysiert und auf dem Atari ST implementiert, um damit Dateien vom Atari auf den Z1013 übertragen zu können. Was ich davon noch weiß, möchte ich dir gern mitteilen:
Also eine auf Kassette gespeicherte Datei besteht aus Blöcken. Jeder Block besteht aus: 1. Vorton (bzw. Synchronisationston) 2. Trennschwingung 3. 2 Bytes Blocknummer bzw. Blockadresse 4. 32 Nutzbytes 5. 2 Bytes Prüfsumme (einfache Addition der vorherigen 34 Bytes)
Beim ersten Block ist der Vorton überlicherweise 1 bis 3 Sekunden lang, bei den weiteren Blöcken nur ganz kurz (praktich nicht einzeln hörbar).
Das originale Monitorprogramm schreibt die Blockanfangsadresse in das Feld Blocknummer (oder wie man das Feld auch immer bezeichnen soll). Diese Blocknummer bzw. Blockanfangsadresse wird beim Laden jedoch nicht ausgewertet. Man gibt ja die Ladeadresse eh manuell vor.
Dieses originale Z1013-Kassettenaufzeichnungsverfahren wurde später zum Headersave-Format weiterentwickelt, aber nicht vom Hersteller, sondern von einem Computerclub. Die 4K-Monitorprogramme sowie mein 2K-Monitorprogramm (JM 1992) beherrschen dieses Headersave-Format. Dabei wird vor die Datei ein Kopfblock mit Adressen, Dateityp und Dateiname gesetzt. Der Vorblock sowie der erste Datenblock haben einen langen Vorton, d.h.man kann diese beiden Teile akustisch gut auseinanderhalten. Damit ist es möglich, eine Headersave-Datei auch mit dem originalen Monitorprogramm einzulesen. Man startet (Drücken der Enter-Taste) ganz einfach das Einlesen erst nach dem Vorblock.
Ich glaube noch zu wissen, dass beim Headersave-Format in das Feld Blocknummer nicht mehr die Blockanfangsadresse, sondern eine echte Blocknummer hineingeschrieben wird (0: Vorblock, 1: erster Datenblock usw). Diese werden beim Einlesen auch geprüft, d.h. man kann auch zurückspulen, wenn ein Block nicht gelesen werden konnte, und versucht es nochmal.
Die Frequenzen für Vorton, Trennschwingung, 0-Bit und 1-Bit weiß ich leider nicht mehr. Die müsstest du dir selbst ermitteln, z.B. durch Auszählen der Taktzyklen der Block-Save-Routine (habe ich damals auch so gemacht).
Hier ist der Quellcode zum speichern eines Blocks:
Quellcode: | LD DE,<laenge_vorton> ; 2000h bzw. 0Dh BSMK: LD B,70H L40: DJNZ L40 CALL L56 DEC DE LD A,E OR D JR NZ,BSMK LD C,2 L41: LD B,35H L42: DJNZ L42 CALL L56 DEC C JR NZ,L41 PUSH IX POP DE LD B,12H L43: DJNZ L43 CALL L49 LD B,0FH L44: DJNZ L44 LD C,10H L45: LD E,(HL) INC HL LD D,(HL) ADD IX,DE INC HL PUSH BC CALL L49 POP BC DEC C JR Z,L47 LD B,0EH L46: DJNZ L46 JR L45 L47: PUSH IX POP DE LD B,10H L48: DJNZ L48 CALL L49 RET L49: LD C,10H L50: SRL D RR E JR NC,L52 LD B,3 L51: DJNZ L51 NOP JR L53 L52: CALL L56 L53: LD B,19H L54: DJNZ L54 CALL L56 DEC C RET Z LD B,15H L55: DJNZ L55 JR L50 L56: IN A,(2) XOR 80H OUT (2),A RET
|
L56 erzeugt einen Phasenwechsel am Kassettenrecorderanschluss.
MfG Jens |