Das ZX96 - Festplatteninterface

Mit dem -kurz- HDIF läßt sich fast jede IDE-Festplatte am ZX96 betreiben. Es ist ebenso möglich, das HDIF auch am unverbastelten ZX81 einzusetzen, sofern mit der POKE-Karte zusätzlich die erforderlichen Steuersignale für das HDIF bereitgestellt werden.

Das IF besteht aus zwei Teilen: IO-Teil und Speicherteil. Der IO-Teil wandelt den Datenbus auf die erforderliche Breite von 16 bit und erzeugt die Steuersignale für die Platte. Als IO Adressen sind B7h und BFh verwendet. Der Speicherteil stellt zum einen ein EPROM im Bereich 8-16k und zwei RAM-Bänke zwischen 48-64k zur Verfügung.

Für die Umschaltung der Speicherbänke sind drei POKE8-Befehle vorgesehen:
POKE 8,13 RAM-Bank 1 (Work-RAM, DOS Variablen etc.)
POKE 8,14 RAM-Bank 2 (File-RAM, Zwischenpuffer)
POKE 8,15 externes RAM, z.B. Megabytekarte
(siehe auch Speicheraufteilung des ZX96)

Das EPROM ist bei allen drei POKEs aktiv. Die externen Speicherbereiche werden über /RAMCS und /ROMCS ausgeblendet, diese Signale werden ebenfalls vom Giant ausgewertet. Die Megabytekarte wird bei Bedarf durch die Signale MODHI und MODLO deaktiviert. Mit gesetztem POKE8,15 kann damit direkt von Platte in die Megabytekarte geladen werden.

Für die Festplatte wurde ein völlig neues Betriebssystem entwickelt: MeFisDOS. Es zeichnet sich neben der absoluten Inkompatibilität zu allen existierenden DOSes vor allem durch seine besondere Unterstützung des ZX81 aus, wobei der bemerkenswert geringe Speicherbedarf gesondert betont werden muß: das DOS selbst ist keine 8kB groß und benötigt neben den 32k RAM auf dem IF selbst nur noch die üblichen 16k BASIC-Speicher des ZX81. MeFisDOS kann natürlich auch mit Verzeichnissen umgehen, erlaubt Dateiattribute und kann darüberhinaus auch direkt auf die Floppy zugreifen. Aufgrund des bestehenden Floppy-DOS wurde MeFisDOS jedoch dahingehend beschränkt, daß es nur Dateinamen bis zu 8 Zeichen Länge unterstützt. Die Plattengröße ist auf 130MB begrenzt, mehr als 40MB braucht man für den ZX81 ohnehin nicht. Größere Platten lassen sich am HDIF trotzdem betreiben, wenn man entsprechende Parameter (kleinere Zylinderzahl) einträgt.

Für die Arbeit mit MeFisDOS gibt es eine ausführliche Dokumentation. Diese möchte ich jedoch nicht ins Web stellen, da ich mich für Eure Resonanz interessiere. Wer sich daher das HDIF nachbauen möchte, bekommt die Dokumentation gegen eine kurze e-mail an mich zugeschickt.

Nachbau des HDIF

Es steht natürlich jedem frei, sich selbst eine Platine zu entwerfen oder eine fertige Platine zu bestellen. Ich kann dazu leider kein fertiges EAGLE-Layout anbieten, da die Platine mit einem älteren Programm entwickelt wurde und erst im Nachhinein der Schaltplan mit EAGLE gezeichnet worden ist. Die meiste Arbeit macht jedoch die Inbetriebnahme, weshalb sich unerfahrene Bastler auch lieber nicht mit dem HDIF abmühen sollten. Ich setze also ein wenig Geschick voraus und lasse Selbstverständlichkeiten großzügig weg, Vorsicht!

Wenn der Speicherteil funktioniert, muß zunächst versucht werden, die Platte überhaupt zur Zusammenarbeit mit dem HDIF zu bringen. Hier gibt es erfahrungsgemäß die größten Probleme, da manche Platten einfach nicht am HDIF laufen. Wir haben alles versucht, die Ursache haben wir nicht gefunden. Ein erster Test ist daher HDDETECT, welches den Parametersektor (Geometrie, Hersteller) der Platte ausliest. Bricht HDDETECT nach ein paar Sekunden mit Fehlermeldung 2/ ab, dann liegt ein schwerer Fehler vor - es können nicht einmal die Statusregister gelesen werden bzw. die Platte meldet ein busy, diese Platte ist kaum zum Laufen zu bringen. (Wer es dennoch versuchen will: mail an mich, ich habe eine leicht modifizierte Schaltung, die etwas zuverlässiger arbeitet, jedoch ein geändertes MeFisDOS benötigt.)

Zeigt HDETECT unsinnige Werte an (65535 Zylinder etc.), kann man mit einer Änderung im Timing Glück haben: einfach andere Werte für R1/C1/C3 versuchen. Sobald dieser Teil spielt, müssen die restlichen Parameter mit HDSCAN ermittelt werden. HDSCAN stellt die höchsten Werte für Zylinder und Köpfe durch Versuch fest, diese Werte können von den mit HDDETECT ermittelten abweichen. Es gilt, was HDSCAN anzeigt! Die Anzahl der Sektoren je Zylinder errechnet HDSCAN aus der Kapazität und zeigt in der Regel dann einen krummen Wert an. Anschließend führt HDSCAN einen kompletten Oberflächentest durch, der bei einer 40MB-Platte um die 20 Minuten dauert. Zuletzt wird die Nummer des höchsten verfügbaren Clusters angezeigt sowie eventuell defekte Cluster/Sektoren. Achtung: MeFisDOS arbeitet generell mit 4 Sektoren je Cluster = 2kB! Eine Platte mit defekten Clustern sollte zwar in's Regal gestellt werden, wer sie dennoch nutzen will: mail an mich.

Von HDSCAN sollte man sich nun folgende Werte notiert haben: Zylinderanzahl, Köpfe, Sektoren und höchster Cluster. Diese müssen jetzt im MeFisDOS eingetragen werden (es gibt kein Setup und kein Autodetect, die Geometrie steht im EPROM und ist damit ein für allemal fixiert!). Dazu müssen noch zwei Werte ausgerechnet werden:
Cluster je Zylinder ganzzahliger Rest von Sektoren geteilt /4
Bitstringlänge ganzzahliger Rest von Cluster geteilt /8
Der Bitstring ist die FAT von MeFisDOS und generell 8kB lang. Das sind genau 65535 bit und jedes Bit repräsentiert dabei einen Cluster. Ist das Bit=1, dann ist der entsprechende Cluster belegt. Der Bitstring wird in den ersten vier Clustern der Platte gespeichert. Ein Beispiel soll die Rechnerei verdeutlichen:

Angenommen eine Platte hat 804 Zylinder, 4 Köpfe und 17 Sektoren je Zylinder - eine gängige 30MB-Platte. Köpfe und Zylinder sollte HDSCAN so anzeigen, ein paar Zylinder weniger sind unproblematisch. Nach der Kapazität 30MB zeigt HDSCAN 17,005 Sektoren an. Abschließend müßte HDSCAN als höchsten Cluster etwa 12864 anzeigen: ganzer Rest von 17/4=4, wir haben 4 Cluster*4 Köpfe*804 Zylinder=12864 Cluster. Die Bitstringlänge ist schließlich 12864/8=1608 (ohne Rest). Dieser Wert wird von MeFisDOS benötigt, damit es weiß, wann die Platte voll ist! Von der Platte lassen sich nun effektiv 12864*2=rd.25,7 MB nutzen, wir haben ja einen ungenutzten Sektor je Zylinder und Kopf! Die Rundungen machen die Rechnerei in Assembler wesentlich schneller und ungenutzte Sektoren kann man schließlich auch für allerlei Unsinn gebrauchen.

Die Werte müssen nun im EPROM eingetragen werden:
Offset Beispiel Wert
0C09h 23h (35) Zylinder-1 Lo_Byte
0C0Ah 03h Zylinder-1 Hi_Byte
0C0Bh 04h Cluster je Zylinder
0C0Ch 04h Köpfe
0C0Dh 48h (72) Bitstringlänge Lo_Byte
0C0Eh 06h Bitstringlänge Hi_Byte

Wenn soweit alles funktioniert, kann das EPROM gesteckt und die Platte formatiert werden. Die Format-Routine ist eine Art Quickformat und schreibt lediglich ein leeres Rootverzeichnis auf die Platte. Damit ist das HDIF einsatzbereit und MeFisDOS kann erstmals mit POKE8,13 und RAND USR 8192 aufgerufen werden. Sollten jetzt Fehlermeldungen erscheinen (Plattenfehler, Prüfsummenfehler, Platte voll), dann funktioniert das Schreiben noch nicht hundertprozentig und es muß an C2 ein wenig geschraubt werden. Danach immer neu formatieren! Für experimentierfreudige Geister habe ich ein kleines Tool, mit dem man definiert Cluster lesen und schreiben kann. Zum Blockvergleich und zur Fehlersuche nutzt es allerdings den ASDIS, man kann es sich aber auch selbst noch erweitern. Wer in der Richtung basteln will: mail an mich!

Alle Programme sind unter XTENDER lauffähig und können mit TSCON (62k) in eine WAV-Datei gewandelt und auf Band gespielt werden:
EPROM-Binärfile 8k
HDDETECT 5k
HDSCAN 11k
MEMFREE 2k
FORMAT 2k
Schaltplan EAGLE-Format 19k (zip)
www.cadsoft.de EAGLE Freeware (rd. 4MB)

Ein Bild der fertigen Platine gibt es hier


letztes Update: 1/00, Kai Fischer