Eigenbau Floppykarte...

  • Hallo.


    Ich möchte für meinen RC2014 eine Floppycontrollerkarte bauen. Diese soll das IBM 3740 Format lesen können, so dass ich meine 8" SSSD Floppys lesen und beschreiben kann und außerdem den HXC FloppyEmulator mit den dementsprechenden DSK bzw. HEF Images verwenden kann.

    Die Adresslogik des Schalplans wurde bereits im Nachbarthread ausführlich besprochen und das sollte jetzt klar sein. Noch nicht klar, aber momentan vernachlässigbar, ist die Umschaltung zwischen den Laufwerken. Der Controller ist dazu nicht in der Lage. Vorerst helfe ich mir da mit einem 2-4 decoder, an dem man mittels 2 Jumpern einstellen kann, welches Laufwerk selektiert wird. Ein 2-4 decoder deshalb, weil die Backplane des RC2014 frei benutzbare Pins hat für eigene Anwendungen. Diese sind von Slot zu Slot durchgeschliffen. Allerdings sind nur 3 vorhanden. Diese werde ich dann später mittels einer anderen Karte ansteuern. Bei s100 computers hat das jemand mit einer PIO gelöst, das hat mir eigentlich ganz gut gefallen. Außerdem sind die RC2014 Karten, im Gegensatz zu Karten bei "richtigen" Computern platztechnisch doch sehr begrenzt und es wird jetzt schon sehr knapp. Deswegen denke ich, dass das letzten Endes mit einer zweiten Karte doch vernünftig ist.

    Eine andere Möglichkeit wäre natürlich eine zweite, baugleiche Controllerkarte. Nur anders gejumpert..... Mal schauen...


    Was mir noch nicht klar ist - ich weiß nicht, was ich mit den Pins INTRQ und DRQ machen soll. Im Netz habe ich eine Apple 2 Floppykarte zur Ansteuerung von 8" Laufwerken unter CP/M gefunden. Diese hat den gleichen Controller, aber diese Pins sind nicht belegt. Ich glaube, das hat etwas mit der Steuerung der Waitstates zu tun. Damit dürfte ich bei einem Z80 mit 7,3 MHZ doch dann keine Probleme haben ?!


    Das ist meine allererstes eigenes Hardware Projekt. Ich habe bis dato zwar schon viele Rechner repariert und restauriert, aber mit der Entwicklung eigener Hardware hatte ich nie zu tun. Ich würde mich darüber freuen, wenn ihr euch den Schaltplan mal anschauen könntet und eure Meinung schreiben könntet ! Vielen Dank !!





    Gruß Jan

  • Ich hatte den Schaltplan noch etwas abgeändert, ein Layout erstellt, die Platine herstellen lassen und zusammengebaut. Wenn sie vollends funktioniert, werde ich den aktuellen Schaltplan hier veröffentlichen.

    Eins vorab. Den Comparator 74688N hatte ich, wie man sieht, als vorkonfiguriertes Bauteil in Eagle eingesetzt. Die Spannungsversorgung hat gefehlt, das habe ich im Layout letzten Endes übersehen und musste mit 2 Kabeln eine Spannungsversorgung herstellen.

    Diese Diskselect-Geschichte funktioniert so nicht. Ich hatte ja nach dem Comarator eine Leitung an die Diskselect Logic geführt. Diese muß low sein, damit überhaupt irgendein Laufwerk selektiert wird bzw. an dem 50pol Stecker dementsprechend auf low ist. Da muß ich die Leiterbahn trennen und auf Masse bzw. low legen. Dann kann ich mit 2 Jumpern erstmal zwischen 4 Laufwerken wählen über den 74139n. Später werde ich mit einer separaten "Diskselectorkarte" über Userpin1 und Userpin2 (das sind 2 freie Pins auf der Backplane) in der Lage sein, im laufenden Betrieb zwischen den Floppys um zu schalten. "In der Not" hab ich jetzt erstmal den 74139 entfernt und DSK0 auf Masse gelegt. Um diese Disk-Select-Geschichte kann ich mich später immer noch kümmern.


    Ich betreibe die Karte an dem RC2014 mit ROMWBW. Ein passendes Bios habe ich noch nicht geschrieben. ROMWBW hat zwar eine Floppyunterstützung, allerdings arbeitet diese mit dem 8272 Controller, welcher überhaupt nicht mit dem WDC2797 kompatibel ist. Der 8272 Controller wäre zwar auch IBM 3740 kompatibel, aber zu dem Zeitpunkt, als ich die Karte konstruiert hatte, hatte ich noch kein ROMWBW bzw. ich wusste sogar überhaupt nicht, dass es das gibt.

    Wie dem auch sei, das Bios des ROMWBW ist etwas komplexer als ein normales Bios von einem CP/M Rechner von damals. Es besteht aus mehreren Sources und wird dann später über ein Skript komplett assembliert und gelinkt werden. Der Floppyteil besteht aus der Datei fd.asm. Diese muß ich jetzt komplett neu programmieren. Ich stehe mit dem Entwickler von ROMWBW in Kontakt.


    Die Register bei dem WDC2797 sehen wie folgt aus:


    Code
    A1    A0    READ(RE#)    WRITE(WE#)
    0      0    Status        Command
    0      1    Track Reg    Track Reg
    1      0    Sector Reg    Sector Reg
    1      1    Data Reg     Data Reg


    Die Karte liegt an Port 60.


    Dementsprechend sollte es doch so sein:


    Code
    status      equ    060h
    command     equ    060h
    track       equ    061h
    sector      equ    062h
    data        equ    063h


    Wenn ich in CP/M das Programm "Survey" starte, zeigt es auch die Ports 60-63 an.


    Ich habe momentan ein Lotharek HXC mit 50 zu 34 Pin Adapter mit der Karte verbunden. Da kann ich auf dem Display sehen, welcher Track gerade "aktiv" ist. In ROMWBW ist ein Monitorprogramm enthalten. Mit diesem kann man einen Wert bzw. in dem Fall ein Befehl an einen Port schicken.


    Als Beispiel nehme ich folgende Werte bzw. Befehle:


    Code
    restoretrack00        equ    0Ah
    trackseek             equ    1eh

    Theoretisch sollte es also so sein. Ich sende zuerst den Wert 4Dh (für Track 77) an den Port 61h. Dann sende ich den Wert 1Eh an den Commandoport 60h. Dann sollte der Controller Track 77 anfahren... das macht er aber nicht.


    Praktisch ist es so. Ich sende zuerst den Wert 4Dh (für Track 77) an den Port 63h !!!!!!! Dann sende ich den Wert 1Eh an den Commandoport 60h. Dann fährt er einwandfrei und am HXC ersichtlich den Track 77 an.


    Schicke ich dann den Wert 0Ah (für restore to track00) an den Commandoport 60h, fährt er auch sauber nochmal zurück auf Track00.


    Ich verstehe einfach nicht, warum er den anzufahrenden Track in 63h erwartet und nicht in 61h ?! Vielleicht hat da einer eine Idee.



    Zu meiner nächsten Frage.


    Ich habe auf dem Board 2 Spindepotentiometer und einen einstellbaren Kondensator verbaut. Den Testpin des Controllers habe ich auf low gejumpert, um die Einstellarbeiten durchführen zu können.


    1. Den Potentiometer TR1 habe ich auf 500 nanosekunden eingestellt, dieser hängt am RPW-Pin. Das ist der Phasencomparator in dem Data Separator.


    2. Den Potentiometer TR2 habe ich nicht eingestellt, dieser ist nur für doubledensity und das möchte ich (momentan) nicht. Er hängt am WPW-Pin, also write precompensation mode.


    3. Den Drehko TC1 habe ich auf 250khz eingestellt, dieser hängt am VCO-Pin und reguliert die VCO Frequenz.



    Die Werte dafür habe ich irgendwo im Internet geklaut. Aber ich bin ganz ehrlich, ich weiß nicht, was sie bedeuten. Bezieht sich das alles auf die Schreibdichte ? Warum ist das überhaupt einstellbar ?



    Vielen Dank !



    Gruß Jan


    • Offizieller Beitrag

    Ich verstehe einfach nicht, warum er den anzufahrenden Track in 63h erwartet und nicht in 61h ?! Vielleicht hat da einer eine Idee.

    RTFM !!!

    Versuch's doch mal mit dem Lesen der Doku.


    SEEK

    This command assumes that the Track Register con-

    tains the track number of the current position of the

    Read-Write head and the Data Register contains the

    desired track number.

  • Ich hab mir das Datasheet natürlich mehrmals durchgelesen und bin jetzt gerade auch noch am Suchen, wo das steht, aber vielen Dank für die Info !


    Gruß Jan

  • Die anderen Werte hab ich jetzt im Datasheet gefunden.


    Singledensity:

    RPW 500ns

    VCO 250khz


    Doubledensity

    ROW 250ns

    VCO 500 khz


    Gruss Jan

    • Offizieller Beitrag

    Ich hab mir das Datasheet natürlich mehrmals durchgelesen

    Kenn ich. Die meisten Informationen kann man anfangs noch gar nicht zuordnen und filtert sie erstmal als unrelevant raus.

    Aber bei einem Problem mit genau einem Befehl/Kommando darf man das Kapitel intensiv lesen, teilweise mehrmals. Und hin und wieder wird selbst dann nicht alles 100% eindeutig. Dann hilft nur probieren und testen.

  • So, ich bin jetzt mal wieder dazu gekommen, weiter zu machen. Ich habe ein kleines Programm geschrieben, um einen Sektor zu lesen und die 128 Bytes desselben an Speicherstelle 1000h ab zu legen. Den Track muß ich ja im Data Register festlegen, wie bereits oben besprochen. Mit dem Seek Befehl fährt der Lesekopf diese an. Dann definiere ich den Sektor und führe den Read Sektor Befehl aus. Er liest dann von Diskette. Allerdings legt er an 1000h 128 Mal die Tracknummer ab, anstatt Daten. Außerdem legt er im Statusregister den Wert 06 ab, was bedeutet "Lost data" und "data request". Die ganze Geschichte scheint sich also nicht zu synchronisieren. Den DRQ-Pin und den INTRQ-Pin habe ich als Steckpin rausgeführt. Dh., ich könnte hier leicht etwas nach verdrahten. Außerdem habe ich anscheinend ein Timing Problem mit der Readycheck Routine. Auf Grund meiner Routine schreibt er immer Drive not Ready, fährt aber den Track sauber an. Das ist erkennbar an dem Lotharek HXC Display.


    Hier mal der Code:


    Vielleicht hat ja einer von euch eine Idee, wie ich das synchronisiert kriege.... Wie gesagt, das is mein erster Floppycontroller... bin am kämpfen.. :D



    Vielen Dank !


    Gruß Jan

  • So, nachdem ich mit Interrupts und all möglichem Gedöhns rumprobiert habe, musste ich feststellen, dass die Lösung doch so "einfach" war...

    Die Floppykarte funktioniert und ich kann Sektoren fehlerfrei lesen !

    Dass es an der Synchronisation lag, war mir ja bekannt, aber wie ich das am einfachsten, mit 4 Zeilen Code lösen kann, hab ich erst die Tage rausgefunden.


    Hier ein die Read-Subroutine mit der Änderung:


    Wenn man weiß wie, ist es eigentlich einfach und vollkommen logisch. Aber wenn man es nocht nie gemacht hat, man von niemandem geholfen bekommt und man sich durch etliche Bücher, Schaltpläne, Sources usw. wälzen muss, dann dauert es halt länger... Na ja, umso cooler, dass es funktioniert ! :)


    Als nächstes muß ich jetzt das BIOS komplettieren und in das ROMWBW einbetten... das wird auch wieder ein gutes Stück Arbeit..


    Gruß Jan

    • Offizieller Beitrag

    Sei mir nicht boese, aber les' dir das Buch mit der 8080 Assembler Programmierung bitte auch noch mal durch.


    (Ich kenn die Intel Mnemonics nicht so gut, falls ich da Zilog Mnemonics schreibe, darfst du das korrigieren. ;)


    Zeile 8 + 9 geht schneller mit ANI 2

    Opcode + Operand ist i.a. schneller als 2 Opcodes. Allerdings ist Zeitoptimierung in einer Warteschleife selten noetig.


    Der Knaller ist bei Zeile 15 - 21.

    Der mov a,b (Z. 16) setzt keine Flags, das jz endread (Z.17) funxt wegen dem dcr b (Z. 14).

    Das push psw (Z. 15) hat durch jz endread (Z.17) das pop psw (Z. 19) verloren.

    Dafuer liest du in mit pop b (Z. 21) nicht deinen Zaehler fuer Leseversuche, sondern holst das push psw vom Stack. Das push b (Z. 3) liegt dann immer noch auf dem Stack.

    Wo springt den dann das ret hin?

    Und wie wird die Routine nach dem fehlerfreien lesen des Sektors beendet?

  • Ja, die Routine ist nicht perfekt ! Das stimmt ! Natürlich überarbeite ich das noch. Es ging mir jetzt rein nur darum, überhaupt mal einen Sektor lesen zu können. Das Programm läuft ins Leere.

    Jetzt weiss ich, dass die Hardware funktioniert. Jetzt schreibe ich eine saubere read und write Routine.

    Das Programm ist schon in Arbeit. Man kann dann damit einen bestimmten Track und einen bestimmten Sektor lesen und dieser wird hex auf dem Bildschirm ausgegeben. Den Grundstock dafür habe ich bereits fertig.

    Deine Anmerkungen zu dem Source schau ich mir heut Abend am PC an. Am Handy ist das schwierig.


    Gruss Jan

  • ergänzend: INTRQ und DRQ braucht man in erster Linie wenn man die Übertragung per DMA machen möchte. Da initialisiert und startet man die DMA-Übertragung, welche dann für jedes Byte über DRQ ausgelöst wird und schickt die CPU z.B. in HLT. Am Ende der Übertragung - egal ob ok oder nok - wird dann ein INT ausgelöst und die CPU nimmt die Arbeit mit Sprung in den INT-Handler wieder auf um mit Erfolgs- / Fehlermeldung in die übergeordnete Routine (BDOS) zurück zu kehren.

    Im "Polling" Betrieb steuert man die Übertragung über Auswertung der Bits im Statusregister.

  • Da es für den RC2014 schon einen Floppy Controller gibt (http://www.smbaker.com/z80-ret…-floppy-controller-boards), welcher auch von Wayne Wartens ROMWBW direkt unterstützt wird, lohnt sich vielleicht ein Blick in der dortigen Sourcecode, (https://github.com/wwarthen/Ro…aster/Source/HBIOS/fd.asm) den man natürlich auch für seine speziellen Bedürfnisse anpassen könnte.


    Ich habe den Controller bei mir im Einsatz; funktioniert einwandfrei (https://retrocmp.de/hardware/rc2014/smbaker-fdc.htm).

  • Hallo.


    Ja, das ist bereits alles in Arbeit. Leider liegt das Projekt seit ein paar Wochen aus zeitlichen Gründen auf Eis. Evtl komme ich Mitte nächster Woche wieder dran.



    Gruss Jan