Schlagwort: Diskette

ADF-Copy auf dem ESP32

In den letzten Wochen hab ich ein wenig mit dem ESP32 rumgebastelt, dies ist ein Mikrocontroller mit 2 CPUs, ne Menge RAM und integrierten WiFi. Mittlerweile läuft die ADF-Copy Firmware auf dem kleinen Ding :)

Verkompliziert wurde die Portierung durch mehrere Faktoren:

  • auf dem Ding läuft RTOS, steht für Real Time Operating System, dies wird u.a. benötigt damit die 2 CPUs zusammen laufen können und das WiFi funktioniert, leider verkompliziert das die Sache ein wenig.
  • die Interruptlatenz ist gigantisch, teilweise bis zu 700ns. Das ist zwar für einen Menschen eine unfaßbar kleine Zeitspanne, aber wenn man bedenkt das die Transitionen bei einer HD Diskette einen Abstand von 2µs (2000ns) haben können ist das schon gewaltig. Und die Interrupt Routinen die das Arduino Framework zur Verfügung stellt machens nur noch schlimmer.
  • die Timer können kein Input Capture. Bei einem Input Capture weißt man einem Timer einen Eingang des Chips zu der bei einem Wechsel (z.B. LO->HI) des Eingangspegels einen Interrupt auslöst und gleichzeitig den Zähler des Timers in ein spezielles Register sichert während der Timer weiterlaufen kann oder von Null neu startet.
  • zum Schreiben einer Diskette benutzte ich auch einen Timer der alle 2/4µs (HD/SD) einen Interrupt auslöst, mit der Latenz von bis zu 700ns natürlich auch keine Lösung.
  • Erschwerend kam noch hinzu das das RTOS alle 1ms den SystemTick (Uhrzeit) aktualisiert und mir dazwischen gehackt hat.

Bisherige Lösung ist es alles von Hand zu machen ohne Interrupts zu benutzen, ist nicht schön aber bisher die einzige Lösung die ich gefunden habe.Grob gesagt mache ich folgendes:

  1. Das Multitasking abstellen
  2. Alle Interrupts abstellen
  3. Timer starten
  4. Warten bis die Leseleitung auf High wechselt (Read ist negiert und somit low aktiv)
  5. Warten bis die Leseleitung auf Low wechselt (Transition der Magnetisierung der Diskette)
  6. Auslesen des Timers, Zähler auf Null setzen und neu starten
  7. Auswerten des Zähler -> 4,6,8µs Transition (oder 2,3,4µs bei HD) und ablegen im Streambuffer
  8. Auswerten ob gerade ein Sektoranfang vorliegt (Magicbytes) und merken.
  9. Prüfen ob der Streambuffer voll ist, wenn nein weiter bei 4.
  10. Interrupt wieder anstellen
  11. Multitasking erlauben.

Hiernach wird der Streambuffer anhand der gemerkten Sektoranfänge decodiert.

Ähnlich läuft das schreiben ab, bloss das ich dort ständig den Timer auslese ob 4µs (2µs bei HD) vergangen sind und ich das nächste Bit schreiben kann.

Ich hab noch nicht geprüft ob die WiFi Verbindung dadurch abbricht da ich den ESP32 für 200ms „dumm“ stelle, aber erstmal mussten die Grundfunktionen laufen.

Ziel ist es ein Standalone Gerät zu haben auf das man mit einem Webbrowser zugreifen kann um ADFs zu lesen/schreiben, Disketten formatieren, vielleicht sogar einen FTP Server drauf laufen zu lassen.

Mal sehen wie weit ich komme.

Erster Release

So nun ist es soweit, ich entlasse die erste einigermaßen brauchbare Version meines Amiga Disketten Lese und Schreib Programms „ADF-Copy“ in die Wildnis unter der GNU Public License v3. D.h. jeder darfs benutzen, weiter entwickeln und kopieren solange die Copyright Informationen erhalten bleiben und darauf hingewiesen wird das eine Weiterentwicklung auf meinem Werk beruht. Ebenso müssen Weiterentwicklungen daraus auch unter der GPLv3 lizensiert werden.

Hier der Download:

ADF-Copy_v0.8

Ist alles noch recht Beta und hat kaum Fehlerabfragen, wenn ihr also eurer Superseltenes Retro Game überschreibt weil ihr den Writeprotect Nupsi vergessen habt und das falsche klickt, nicht mein Fehler McFly! ;)

Zur Hardware

Das ganze lässt sich auf einem Steckbrett mit ein paar Strippen aufbauen. Ansonsten kann man auch anhand der Pin Definitionen im Sourcecode des Arduino Sketches arbeiten.

 

Pinout_small

Als Bauteile werden benötigt:

  • Teensy 3.2 – ganz wichtig das es die 3.2 Version ist, denn nur diese ist 5V tolerant!
  • ein Micro USB Kabel, denn beim Teensy wird keines mitgeliefert.
  • ein Steckbrett, das kleine aus dem Conrad Weihnachtskalender reicht vollkommen aus.
  • 14 Steckbrettkabel mittlerer Länge mit Male/Female, es reicht wenn ein Masse Pin der Floppy mit dem Teensy verbunden ist. Im Layout sind alle verbunden weil man das eben so macht. :)
  • von einem alten Netzteil ein Kabel mit Floppy Stromstecker, man muss nur Masse an Schwarz und 5V an Rot anlegen, die gelbe 12V Strippe wird nicht benötigt.
  • ein 5V Netzteil für die Stromversorgung der Floppy was mindestens 1A liefert, wenn der Steppermotor loslegt zieht der kurz 0,7A und wenn die Spannung zusammenbricht kommt die Floppy durcheinander und Steppt in die falsche Richtung (Schon erlebt und Stunden nach dem Fehler gesucht)

Über USB reicht der Strom leider nicht für die Floppy, naja, man kann nicht alles haben.

Über Feedback würde ich mich freuen und ansonsten: Have fun and keep the Amiga alive!

Funzt :)

Da der Schreibmodus mittlerweile funktioniert und auf dem trockenen schwimmen keinen Spass macht hab ich mal meinen Amiga 4000 aufgebaut, einige Disketten geschrieben und am lebenden Objekt getestet. Da ich ja auch ein Diagnoseprogramm brauchte hab ich mit dem Amiga Emulator (WinUAE) ein ADF erstellt und dort das Programm DiskSalv4 von Dave Haynie aufgespielt, dann mit meinem ADF Writer auf eine Disk geschrieben und in den Amiga geworfen.

Die Diskette hat der Amiga mit seinem 20 Jahre alten Laufwerk ohne murren gelesen :)

Mit Hilfe von Disksalv hab ich dann einige andere Disketten die ich geschrieben hatte überprüft, lies sich alles ohne Probleme lesen, kein einziger Retry bei einem Track, ich bin zufrieden.

Einzig HD Disketten die ich als DD beschrieben hatte waren teilweise unlesbar, ich hatte natürlich das HD Loch abgeklebt. Ich hab dann mal so eine Diskette mit zugeklebten Loch mit meinem ADF Writer beschrieben, und siehe da, einwandfrei lesbar. Scheinbar verhält sich das Floppy Laufwerk unterschiedlich wenn das HD Loch zu oder offen ist, aber wenn man das weiß kann man darauf achten.

Jetzt gehts daran das Frontend auf dem PC etwas aufzuhübschen und Nutzerfreundlicher zu machen, und vielleicht Verify einzubauen :)