Schlagwort: mega

Amigafloppy, erste Versuche

Für erste Versuche habe ich einen Arduino Mega benutzt. Ansteuerung der Floppy Mechanik funktionierte recht schnell, das Lesen gestalte sich Problematisch und ich hab schnell festgestellt das der Mega einfach zu wenig RAM hat um einen kompletten Track zu puffern. Ein Track einer Amiga Diskette besteht aus 11 Sektoren á 512 Bytes, klingt erstmal wenig, zu den 512 Bytes pro Sektor kommen noch 28 Bytes an Verwaltungsinformationen hinzu. Ein Sektor ist folgendermaßen aufgebaut:

struct Sector
{
 unsigned char format_type; // Beim Amiga immer 0xff
 unsigned char track; // Zu welchem logischen Track dieser Sektor gehört (0-159)
 unsigned char sector; //Sektor Nummer (0-10)
 unsigned char toGap; //Wieviel Sektoren noch kommen bevor der Trackgap kommt
 unsigned char os_recovery[16];// 16 Bytes die der Amiga nie benutzt hat, sind i.d.R mit Null gefüllt, außer bei Kopiergeschützten Sachen
 unsigned long header_chksum; // Checksumme der Daten im Header, wird mit Exklusiv Oder der MFM Daten generiert
 unsigned long data_chksum; // Checksumme der Daten im Datenblock, auch XOR der MFM Daten.
 unsigned char data[512]; // 512 Bytes Nutzdaten
};

Vor dem eigentlichen Sektor kommt noch das Syncword, das ist eine Reihenfolge von Bytes in MFM Stream der niemals durch normale Kodierung entstehen kann, beim Amiga sind das mehrfach „10“ bzw 0xA hintereinander, gefolgt von 0x44894489. Daran erkennt der Controller im Amiga das nun ein Sektor anfängt.

Da ein wechsel der Magnetisierung, auch Transition genannt zu einer unterschiedlichen länge von Bits entschlüsselt wird muss man auf Bitebene prüfen ob man gerade einen Sync gefunden hat, erst wenn man den Sync hat weiß man wo im Bitstream ein Byte anfängt.

8 µs -> 1000
6 µs -> 100
4 µs -> 10

Bei MFM codierung ist jedes zweite Bit ein Clock Bit damit der Controller nicht den Takt verliert, d.h. es ist eine 2:1 codierung, das bedeutet die hälfte der Bits wird beim decodieren weggeschmissen. Da aber die Checksummen mit den MFM Daten arbeiten muss man den MFM codierten Track bzw. Sektor im Speicher vorliegen haben. Und hier war der Arduino Mega am Ende mit seinen 8k Ram, das reicht zwar für einen Track im decodierten Zustand (5632 Bytes), aber nicht für die MFM Daten (11968 Bytes ohne Trackgap). On the Fly Decodierung und Checksummen berechnen geht leider auch nicht mit 16 MHz.
Es hätte vermutlich funktioniert jeweils nur immer einen Sektor zu lesen, decodieren und über die Serielle Schnittstelle an den PC zu schicken, aber das würde dann ewig brauchen um einen Track zu lesen.

Es muss also was neues her.