Tape Input Decoding

ZX-Team Forum
Antworten
Werner
User
Beiträge: 24
Registriert: 14.09.2014, 21:29

Tape Input Decoding

Beitrag von Werner » 04.04.2018, 23:36

Hallo,
kann mir jemand im Detail erklären wie der ZX81 aus dem analogen Audiosignal die Nullen und Einsen erkennt und nach Eingang von 8 Bits in seinem RAM als Zeichen abspeichert?
Welche HW (/SW) erkennt die 4 Pulse für die Null und die neun Pulse für die Eins und wie und wo wird die jeweilige "Erkenntnis“ dann so weiterverarbeitet, dass am Input-Port ($FE) Bit 7 low oder high ist?

Grüße
Werner

Benutzeravatar
siggi
User
Beiträge: 2433
Registriert: 06.12.2005, 08:34
Wohnort: D, Hessen, tiefste Werreraa
Kontaktdaten:

Re: Tape Input Decoding

Beitrag von siggi » 05.04.2018, 10:26

Hallo Werner
die Hardware, die die Pulse erkennt, ist die ULA. Über den Port $FE wird auch der Zustand am Audio-Eingang eingelesen. Die Software dazu findet sich im ROM (siehe hier: https://k1.spdns.de/Vintage/Sinclair/80 ... ra%29.html )

Innerhalb der LOAD-Routine wird ein Byte über "CALL IN-BYTE" eingelesen. Und bei Label "IN-PROG" das gelesene Byte (hier: des auf Tape gefundenen Programmes) ins Ram geschrieben. Hier ist der Code der LOAD-Routine:

Code: Alles auswählen

THE 'LOAD' COMMAND ROUTINE

The bytes collected from the tape are matched against the program name and then the program is loaded into RAM.

0340 LOAD	CALL	03A8,NAME
		RL	D
		RRC	D
0347 NEXT-PROG	CALL	034C,IN-BYTE
		JR	0347,NEXT-PROG
034C IN-BYTE	LD	C,+01
034E NEXT-BIT	LD	B,+00
0350 BREAK-3	LD	A,+7F
		IN	A,(+FE)
		OUT	(+FF),A
		RRA
		JR	NC,03A2,BREAK-4
		RLA
		RLA
		JR	C,0385,GET-BIT
		DJNZ	0350,BREAK-3
		POP	AF
		CP	D
0361 RESTART	JP	NC,03E5,INITIAL.
		LD	H,D
		LD	L,E
0366 IN-NAME	CALL	034C,IN-BYTE
		BIT	7,D
		LD	A,C
		JR	NZ,0371,MATCHING
		CP	(HL)
		JR	NZ,0347 NEXT-PROG
0371 MATCHING	INC	HL
		RLA
		JR	NC,0366,IN-NAME
		INC	(E-LINE-hi.)
		LD	HL, + VERSN
037B IN-PROG.	LD	D,B
		CALL	034C,IN-BYTE
		LD	(HL),C
		CALL	01FC,LOAD/SAVE
		JR	037B,IN-PROG
0385 GET-BIT	PUSH	DE
		LD	E,+94
0388 TRAILER	LD	B,+1A
038A COUNTER	DEC	E
		IN	A,(+FE)
		RLA
		BIT	7,E
		LD	A,E
		JR	C,0388,TRAILER
		DJNZ	038A,COUNTER
		POP	DE
		JR	NZ,039C,BIT-DONE
		CP	+56
		JR	NC,034E,NEXT-BIT
039C BIT-DONE	CCF
		RL	C
		JR	NC,034E,N EXT-BIT
		RET
03A2 BREAK-4	LD A,D
		AND	A
		JR	Z,0361,RESTART
Hoffe das hilft Dir weiter.

Gruß
Siggi
Mein ZX81-Web-Server: online seit 2007
http://zx81-siggi.endoftheinternet.org/index.html

Datenkraken bitte nicht füttern!

Benutzeravatar
ZX-Heinz
User
Beiträge: 1574
Registriert: 05.12.2011, 14:45

Re: Tape Input Decoding

Beitrag von ZX-Heinz » 05.04.2018, 16:05

Werner hat geschrieben:
04.04.2018, 23:36
Welche HW (/SW) erkennt die 4 Pulse für die Null und die neun Pulse für die Eins und wie und wo wird die jeweilige "Erkenntnis“ dann so weiterverarbeitet, dass am Input-Port ($FE) Bit 7 low oder high ist?
Du musst diese Pulse anders interpretieren, sonst kannst Du das nicht verstehen. Es sei t die Zeitdauer für die Übertragung eines Bits ( ich weiß den Wert für t beim ZX81 momentan nicht.) Alle t Sekunden wechselt das Signal von High zu Low oder umgekehrt, damit ein speicherfähiges NF-Signal für das Datentape überhaupt entsteht. Die erste, an der ULA eintreffende Flanke wird nun zur Synchronisation benutzt, nach einer Zeit von t/2 fragt die ULA erneut ab. Gibt es zu diesem Zeitpunkt einen extra Flankenwechsel, so interpretiert die CPU das als 1, gibt es keinen, so ist das eine 0. Nach einer weiteren Zeit von t/2 kommt auf jeden Fall eine Flanke (s.o). Diese dient der Synchronisation für das nächste Bit. Zusammenfassend steckt die Information also nicht in High oder Low, sondern in den Flankenwechseln nach halber Zeit. Somit wird das Byte 0 aus vier lang gezogenen Wellenzügen bestehen, die 255 (nicht die 1) aus 8 kurzen Wellenzügen. (Vielleicht wird vorher auch noch ein Starbit geschickt, das weiß ich jetzt nicht so genau). Ich hoffe, dass ich mich deutlich machen konnte.
Gruß, Heinz

Benutzeravatar
bodo
User
Beiträge: 319
Registriert: 14.02.2007, 17:21
Kontaktdaten:

Re: Tape Input Decoding

Beitrag von bodo » 07.04.2018, 22:59

Heinz, wenn ich deine Ausführungen richtig verstanden habe, beschreiben sie eine Art der Manchester-Kodierung. Diese wurde beim ZX81 aber nicht benutzt, obwohl sie sehr ausgefuchst ist. Tatsächlich gab es auch eine "Supertape"-Implementierung für unseren Zeddy, die ähnlich arbeitete und 4800 Bit pro Sekunde schaffte. Irgendwo habe ich wohl auch noch eine Papierkopie vom entsprechenden Artikel, falls jemand Interesse hat.

Soweit ich aber weiß, ist das Standardverfahren beim ZX81 anders. Denn es ist beim Einlesen die Zeit relevant, die in der Summe mit 1-Pegeln pro Bit verbracht wird. Kodierte 0-Bits und 1-Bits haben verschieden lange Zeiten, dagegen ist die Zeit mit "längerem" 0-Pegel immer gleich. Daraus folgt auch, dass die Bitrate nicht konstant ist, sondern von den Werten der Bits abhängt - und im Mittel nur rund 300 Bit pro Sekunde erreicht. Mit dem längeren 0-Pegel werden die Bits voneinander getrennt.

Im Gegensatz zu vielen anderen Formaten gibt es keinen Vorspann. Die ersten Pulse gehören bereits zum ersten aufgezeichneten Bit.

Eine Invertierung durch den Rekorder erscheint mir deshalb unkritisch, weil (siehe Schaltplan) ein statischer Pegel durch den Pulldown-Widerstand als 0-Pegel erkannt wird. Sobald dann die Pulse kommen, treten entsprechende 1-Pegel intermittierend auf.

Vor vielen Jahren habe ich mal Programme für Atari-ST-, DOS- und Unix-PCs geschrieben, die über die serielle Schnittstelle die Audioschnittstelle nachgeahmt haben - die sind im Gegensatz zu den allermeisten anderen Lösungen unabhängig vom Prozessortakt und funktionieren heute noch. Für Neugierige habe ich das Projektarchiv mal angehängt, darin gibt es u.a. Quelltexte in C und minimale Dokumentation. Leider habe ich nichts zur Kodierung selbst notiert…
Dateianhänge
loadsave.zip
(192.21 KiB) 36-mal heruntergeladen
B0D0: Real programmers do it in hex.

Benutzeravatar
ZX-Heinz
User
Beiträge: 1574
Registriert: 05.12.2011, 14:45

Re: Tape Input Decoding

Beitrag von ZX-Heinz » 08.04.2018, 11:42

Bodo hat natürlich vollkommen recht! Ich bin eben ZX-Spectrum sozialisiert, und bei dem ist es so (Manchester-Kodierung). Daher:
1. Ich widerrufe alles oben zum ZX81 Gesagte, der Zeddy sendet einzelne Bytes mit zwischen geschalteten Pausen, wie man z.B. beim EightyOne mit zugeschaltetem "Soundoutput" (unter tools zu finden) sehen kann.
2. Für den ZX Spectrum stimmt mein früher Gesagtes "fast", nur wird eine Flanke bei t/2 als 0 und nicht als 1-Bit (wie früher behauptet) interpretiert. Die Bytes rasseln einfach als lange Bit-Folge durch. Daher braucht man zum Schluss auch ein Prüfbyte (XOR-Wippe) zur Kontrolle.
SAVE_LOAD_Signale.jpg
SAVE_LOAD_Signale.jpg (64.59 KiB) 724 mal betrachtet

Antworten