SFD-700 Multi-Host Floppy-Disk-Controller

English
  Update Februar 2024 - Die v1.2-Hardware ist voll funktionsfaehig und wurde auf meinem MZ-80A, MZ-700 und MZ-1500 mit dem EXT700-Adapter sowie in der MZ-2000-Erweiterungseinheit getestet. Es wurden Probleme bei der Verwendung des MZ-1U06 gemeldet, die untersucht werden muessen - es scheint ein CPLD-Timing-Problem zu sein. Die CPLD-Logik (VHDL) ist vollstaendig und alle ROM/RAM-Paging- und Host-Mode-Logik funktioniert korrekt. Die auf den SFD-700 portierte ROM Filing System-Software ist fuer grundlegende FDC-Operationen (Floppy-Boot ueber den 'F'-Befehl) funktionsfaehig, enthaelt aber noch nicht die vollstaendige Suite von Floppy-Disk-Monitor-Tools; dies wird laufend weiterentwickelt. Kundenauftraege haben den Fortschritt verlangsamt - bitte pruefen Sie das Gitea-Repository fuer den aktuellen Stand. Die Platine wurde noch nicht in anderen MZ-Serien-Maschinen getestet; dies wird zu gegebener Zeit erfolgen.
Eines der am meisten benoetigten Zubehoerteile fuer die Sharp MZ-Serie ist der altbewaehrte Floppy-Disk-Controller. Diese sind relativ selten, da nicht viele Leute sie benutzten, hauptsaechlich aufgrund der Kosten waehrend der Sharp MZ-Aera.
Sharp entwarf und veroeffentlichte mehrere Floppy-Disk-Erweiterungskarten, einige in die Basismaschine integriert, wie die MZ-2500/2800/3500/5600/6500-Serie, andere erforderten eine Steckkarte. Anfangs begann man mit einem benutzerdefinierten Controller innerhalb der MZ-80K-Serie, dann mit dem Erscheinen des MZ-80B-Geschaeftscomputers standardisierte Sharp auf die Western Digital Floppy Disk Controller-Architektur und entwarf und produzierte einen eigenen Controller-IC, den MB8866.
Das MZ-80B-Design ging davon aus, dass alle Floppy-Disk-Steuerungs-Firmware im IPL (Initial Program Loader) der Maschine gespeichert wuerde, was sich in die MZ-800/MZ-1500/MZ-2000/MZ-2200-Designs fortsetzte und die Controller-Kompatibilitaet mit diesen neueren Maschinen beibehielt.
Leider wurden bei guenstigeren Modellen wie dem MZ-80A/MZ-700 Floppy-Disks in der Entwurfsphase nicht beruecksichtigt, sodass neuere Controller-Erweiterungskarten mit Onboard-ROM entwickelt werden mussten, um die notwendige Floppy-Disk-Bootstrap-Firmware bereitzustellen. Da der MZ-80A mit 2 MHz lief, war er zudem nicht schnell genug, um das DRQ-Flag zu lesen und dann die verfuegbaren Daten in einem stetigen Strom zu lesen, sodass Sharp die DRQ-Leitung eine ROM-Adressleitung umschalten lassen musste, um die Verarbeitung des Datenflusses zu beschleunigen.
Sharps Floppy-Disk-Erweiterungskarten waren teuer und schufen so ein Zeitfenster fuer Drittanbieter, guenstigere Angebote zu produzieren. Ein Unternehmen in Deutschland, die K&P Partners GmbH, war ein solches Unternehmen und bot zwei Produkte an: den SFD-800 fuer MZ-800-Maschinen, der auch mit MZ-80B/MZ-1500/MZ-2000/MZ-2200-Hosts kompatibel war, und den SFD-700, der auf den MZ-700 ausgerichtet war.
Zunaechst erwog ich, wie beim SFD-800, ein Replikat-Design, aber nach dem Studium der verschiedenen Schaltungen bemerkte ich einen fatalen Fehler im K&P SFD-700: das Speicher-Paging. Die Karte war fuer den Einsatz in der MZ-1U06-Erweiterungseinheit konzipiert, die ueber Paging-Logik verfuegte, um den Zugriff auf den Erweiterungskartenspeicher gemaess den Paging-Statusregistern des MZ-700 zu deaktivieren. Wenn diese Karte in einer benutzerdefinierten Erweiterungseinheit verwendet wurde, funktionierte sie nicht. Ich hatte auch MZ-80As, die einen Floppy-Controller benoetigten, und kam daher zu dem Schluss, dass eine einzelne Karte, die in allen MZ-Serien ab dem MZ-80A funktioniert (mit Ausnahme derer mit eingebauten Controllern), der richtige Weg waere. So entstand das Konzept eines SFD-700 mkII - gleicher Name wie das K&P-Produkt, aber mit groesserer Funktionalitaet.
Dieses Dokument beschreibt den neuen Schaltplan, die programmierbare Logik und alle auf jeder Maschine entdeckten Probleme.

Host-Kompatibilitaet

Der SFD-700 v1.2 unterstuetzt alle Sharp MZ-Serien-Maschinen ab dem MZ-80A (mit Ausnahme von Maschinen mit eingebauten Floppy-Controllern). Der Zielhost wird durch einen 3-Bit-MODE-Jumper auf der Platine ausgewaehlt, der beim Reset gespeichert wird. Die folgende Tabelle listet die unterstuetzten Maschinen und den entsprechenden Jumperwert auf.
MODE Host-Maschine
0 Sharp MZ-80A / MZ-1200
1 Sharp MZ-700
2 Sharp MZ-80B
3 Sharp MZ-800
4 Sharp MZ-1500
5 Sharp MZ-2000
6 Sharp MZ-2200
Beim MZ-80A/MZ-1200 laeuft die CPU mit 2 MHz, was nicht ausreicht, um das DRQ-Flag des WD1773 abzufragen und das Datenregister zu lesen, bevor das naechste Byte eintrifft. Das CPLD handhabt dies, indem es das DRQ-Signal auf das Flash-ROM-Adressbit A10 leitet, sodass duplizierter Firmware-Code in jedem 1-KB-Segment des ROM erscheint. Dies macht Software-Polling ueberfluessig - die DRQ-Leitung waehlt direkt den korrekten Lese- oder Wartepfad im ROM-Bootstrap.

Schaltplan

Schaltplan

Programmierbare Logik

v1.0 / v1.1 -- GAL-basiertes Design
Die fruehen Revisionen verwendeten zwei GAL-Bausteine: einen Lattice GAL26CV12 als primaeren I/O-Adressdekoder und MZ-700-Speicherverwaltungscontroller sowie einen Lattice GAL16V8 als ROM-Adressdekoder und Host-Modus-Waehler. Die Designs wurden in CUPL (Compiler for Universal Programmable Logic) geschrieben und mit der originalen Logical Devices CUPL v4.0-Toolchain kompiliert.
Der GAL26CV12 wurde gewaehlt, weil er genuegend Produktterme und registrierte Ausgaenge bot, um den breiten I/O-Adressbereich zu dekodieren und den MZ-700-Speicher-Paging-Status zu verwalten, der mehr Makrozellen erforderte, als ein Standard-16V8 oder 22V10 bieten konnte. Leider brachte der 26CV12 zwei praktische Probleme mit sich. Erstens Tool-Unterstuetzung: Als Microchip Technology Atmel uebernahm (die Logical Devices und die CUPL-Toolchain uebernommen hatten), wurde das Nachfolgeprodukt WinCUPL aktualisiert, um nur Atmel-kompatible Geraete zu unterstuetzen, und die Unterstuetzung fuer den Lattice 26CV12 wurde eingestellt. Die Kompilierung fuer v1.0/v1.1 erfordert daher das originale DOS-aera CUPL v4.0 oder eine aequivalente Toolchain anstelle von WinCUPL. Zweitens Programmer-Unterstuetzung: Kein aktueller handelsueblicher Programmer wie der TL-866 II+ unterstuetzt den 26CV12 ohne einen PLCC-zu-DIP-Adapter und eine benutzerdefinierte Geraetekonfigurationsdatei fuer Minipro.
Trotz dieser Huerden waren v1.0 und v1.1 auf dem MZ-700 fuer grundlegende Floppy-Operationen funktionsfaehig. Die Registerzahl des GAL26CV12 war dennoch eine bindende Einschraenkung: das Geraet hat nur ein registriertes Ausgangscluster und einen begrenzten Erweiterungspool, sodass es nicht moeglich war, gleichzeitig eine vollstaendige MZ-700-Speicherverwaltungs-Statusverfolgung und die unabhaengigen ROM/RAM-Seitenregister zu implementieren, die fuer das ROM Filing System benoetigt werden - diese Einschraenkung ist der Hauptgrund, warum v1.2 auf ein CPLD umgestiegen ist.
v1.2 -- CPLD (VHDL)
Version 1.2 ersetzte beide GAL-Bausteine durch ein einzelnes Altera MAX7000S EPM7128SLC84-15 CPLD (PLCC-84, 128 Makrozellen), implementiert in VHDL und kompiliert mit Quartus II 13.0.1 SP1. Dies loeste die Registerzahl-Beschraenkungen des GAL26CV12 und ermoeglichte vollstaendige MZ-700/MZ-1500-Speicherverwaltungslogik neben unabhaengigem ROM/RAM-Paging ueber zwei Speicherfenster. Die VHDL-Quelldateien (sfd700.vhd, sfd700_Toplevel.vhd, sfd700_pkg.vhd) befinden sich im Verzeichnis CPLD/v1.2/ des Gitea-Repositorys. Die frueheren CUPL-Dateien fuer v1.0/v1.1 verbleiben im Verzeichnis CUPL/ als Referenz.

Automatisiertes Setup und Build (empfohlen)

Sowohl die alte CUPL/GAL-Logik (v1.0 / v1.1) als auch der aktuelle CPLD/VHDL-Bitstream (v1.2) koennen mit einem einzigen, in sich geschlossenen Setup-Skript fuer Ihre Plattform gebaut werden. Das Skript installiert die benoetigten Toolchains - DOSBox fuer die CUPL-Logik und Altera Quartus II 13.0sp1 fuer das CPLD -, klont das Repository und kann einen oder beide Builds ausfuehren, alles interaktiv mit sinnvollen Standardwerten, die Sie durch Druecken von Enter uebernehmen koennen. Dies ist der einfachste Weg zum Bauen; die nachfolgenden ausfuehrlichen Abschnitte GAL und CPLD bleiben fuer fortgeschrittene Benutzer erhalten, die von Hand bauen oder Teil-Builds durchfuehren moechten.

macOS / Linux — setup_SFD700.sh

chmod +x setup_SFD700.sh
./setup_SFD700.sh
Dies installiert git, curl/wget und DOSBox (fuer die CUPL-Toolchain) und richtet Quartus II 13.0sp1 fuer das CPLD ein. Unter Linux wird Quartus nativ nach ~/altera/13.0sp1 installiert (~1,6 GB); unter macOS - wo kein natives Quartus existiert - laeuft die CPLD-Toolchain stattdessen aus einem Docker-Image (sfd700-quartus:13.0sp1). Das MAX7000S-Geraetepaket wird automatisch geholt.

Windows 10 / 11 — setup_SFD700_windows_native.ps1 (natives Git Bash, kein WSL). In PowerShell:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\setup_SFD700_windows_native.ps1
Dies verwendet winget, um Git for Windows (das bash bereitstellt) und DOSBox zu installieren, und installiert dann Quartus II 13.0sp1 nativ nach C:\altera\13.0sp1 zusammen mit dem MAX7000S-Paket. Die Build-Skripte laufen unter Git Bash. Um Docker fuer die CPLD-Toolchain anstelle des nativen Quartus zu verwenden, setzen Sie $env:SFD700_CPLD_METHOD = "docker", bevor Sie das Skript ausfuehren.
Jede Eingabeaufforderung hat einen sicheren Standardwert in Klammern - der Grossbuchstabe ist der Standard, sodass Druecken von Enter ihn uebernimmt. Das Setup fragt nach der Repository-URL (Standard ist das oeffentliche https://git.eaw.app/eaw/SFD700.git) und einem Installationsverzeichnis und bietet dann an, die CUPL/GAL-Logik (./build_cupl.sh) und den CPLD/VHDL-Bitstream (./build_cpld.sh) zu bauen. Der CUPL-Build schreibt SFD700_1.JED und SFD700_2.JED nach CUPL/ fuer einen TL866 / XGecu-Programmer; der CPLD-Build schreibt CPLD/v1.2/build/output_files/sfd700.pof fuer die JTAG-Programmierung mit einem USB-Blaster.

GAL (v1.0 / v1.1)

Bausteine
Zwei Lattice GAL-Bausteine implementieren die gesamte programmierbare Logik auf v1.0- und v1.1-Platinen. GAL-Bausteine sind EEPROM-basierte PLDs (Programmable Logic Devices) - sie implementieren Summe-von-Produkten-Logik in einem Fuse-Array und unterstuetzen sowohl kombinatorische als auch registrierte (Flip-Flop) Ausgaenge. Im Gegensatz zum spaeteren CPLD ist jeder GAL ein einstufiger Baustein: Es gibt kein Routing-Gewebe zwischen den Bausteinen, sodass Signale, die beide GALs umfassen muessen, auf der Platine geroutet werden muessen.
Baustein Gehaeuse Makrozellen Registrierte Ausgaenge Rolle
GAL26CV12 28-pin DIP 12 12 I/O-Dekoder, FDC-Steuerung, MZ-700-Speicherverwaltung
GAL16V8 20-pin DIP 8 8 ROM-Adressdekodierung, Modusauswahl, DRQ-Multiplexer

GAL1 -- GAL26CV12 (I/O-Dekoder)
Der GAL26CV12 (SFD700_GAL1) ist der primaere Logikbaustein. Er dekodiert den Z80-I/O-Adressbus, um alle FDC-Steuersignale zu erzeugen, verwaltet den bidirektionalen Datenbus-Puffer, verfolgt den MZ-700-Speicher-Paging-Status und steuert das Interrupt-Enable-Flag.
I/O-Adressdekodierung
Acht Adressleitungen (A0-A7) werden mit den IORQn-, RDn- und WRn-Steuereingaengen kombiniert, um jeden Registerzugriff zu identifizieren. Separate Lese- und Schreib-Selects werden fuer den WD1773-FDC-Registerblock erzeugt, damit der bidirektionale Bustreiber in die richtige Richtung geschaltet werden kann: IOBUSDIRn geht nur bei FDC-Lesevorgaengen auf Low (Z80->FDC-Richtung), und der FDCn-Chip-Select wird bei Lese- und Schreibvorgaengen aktiviert.
FDC-Peripheriesteuerung
Schreibzugriffe auf 0xDC, 0xDD und 0xDE erzeugen Einzelzyklus-Strobe-Ausgaenge (DRIVEn, SIDEn, DDENn), die die Laufwerksauswahl-, Kopfseiten- und Datendichte-Latches auf der Platine takten. Der FDCRESETn-Ausgang ist direkt mit dem Z80-RESET-Signal verbunden, sodass der WD1773 bei jedem Systemstart oder Hardware-Reset zurueckgesetzt wird.
MZ-700-Speicherverwaltung
Der MZ-700 verwendet I/O-Schreibzugriffe auf die Ports 0xE1-0xE6, um seinen internen DRAM und CGROM in den oberen Adressraum ein- und auszublenden. Der GAL verfolgt zwei unabhaengige Statusbits mithilfe seiner registrierten Ausgaenge, getaktet durch die dekodierten Port-Strobes:
  • DISROM - gesetzt durch Schreibzugriffe auf 0xE3/0xE4, geloescht durch 0xE1 und durch RESET. Wenn gesetzt, signalisiert es, dass der Host seinen DRAM ueber das ROM-Fenster der Karte abgebildet hat.
  • INHROM - gesetzt durch Schreibzugriffe auf 0xE5, geloescht durch 0xE6 und durch RESET. Wenn gesetzt, unterdruckt es das ROM der Karte vollstaendig, unabhaengig vom DISROM-Status.
Beide Statusbits werden als Active-Low-Strobes (DISROMSET/DISROMCLR und INROMHSET/INHROMCLR) ausgegeben, die Set/Clear-Eingaenge diskreter Flip-Flops auf der Platine ansteuern - das einzelne registrierte Ausgangscluster des GAL26CV12 reichte nicht aus, um beide Bits als echte registrierte Werte innerhalb des Bausteins zu halten, was eine der limitierenden Einschraenkungen des Designs war.
Interrupt Enable
Der registrierte INTEN-Ausgang wird durch den INTCLK-Strobe getaktet, der durch einen Zugriff auf Port 0xE7 erzeugt wird. Ein Schreibzugriff setzt das Enable (INTEN.D folgt !WRn); ein Lesezugriff loescht es. INTEN wird durch den System-RESET-Eingang asynchron zurueckgesetzt. Der INTCLK-Ausgang speist den Takteingang eines externen Flip-Flops auf der Platine.
Pin Signal Richtung Beschreibung
1 CLK In Takt fuer registrierte Ausgaenge
2-6, 8-11 A0-A7 In Z80-I/O-Adressbus
11 IORQn In Z80 I/O Request (Active Low)
12 WRn In Z80 Write Strobe (Active Low)
13 RDn In Z80 Read Strobe (Active Low)
28 RESET In System-Reset (Active High)
15 DISROMSET Out ROM-Disable Set Strobe (Active Low)
16 DISROMCLR Out ROM-Disable Clear Strobe (Active Low)
17 INTCLK Out Interrupt Enable Flip-Flop-Takt
18 INROMHSET Out ROM-Inhibit Set Strobe (Active Low)
19 INTEN Out Interrupt Enable registrierter Ausgang (Active Low)
20 IOBUSDIRn Out Bustreiber-Richtung - Low = Z80->FDC
22 INHROMCLR Out ROM-Inhibit Clear Strobe
23 SIDEn Out Kopfseiten-Auswahl-Strobe (Active Low)
24 FDCRESETn Out WD1773-Reset (Active Low, verbunden mit RESET)
25 DDENn Out Doppeldichte-Enable-Strobe (Active Low)
26 DRIVEn Out Laufwerksauswahl-Strobe (Active Low)
27 FDCn Out WD1773 Chip Select (Active Low)

GAL2 -- GAL16V8 (ROM-Dekoder)
Der GAL16V8 (SFD700_GAL2) uebernimmt die speicherseitige Adressdekodierung: Er erzeugt den ROM-Chip-Select, wenn der Z80 das Firmware-Fenster bei 0xF000-0xFFFF adressiert, und multiplext Adressleitungen auf das ROM, um die richtige Firmware-Seite auszuwaehlen und den MZ-80A-DRQ-Trick zu handhaben.
ROM Chip Select
MREQn und RDn werden mit den hohen Adressleitungen (A12-A15) kombiniert, um Zugriffe auf 0xF000-0xFFFF zu erkennen. Der ROMCSn-Ausgang ist ein registrierter Wert, sodass Chip-Select-Glitches, die durch das Einschwingen des Adressbusses verursacht werden, unterdrueckt werden - der Select wird nur an der Taktflanke weitergeleitet.
ROM-Adress-Multiplexing
Zwei zusaetzliche Ausgaenge steuern ROM-Adressleitungen ueber A9 hinaus:
  • ROMA15 - angesteuert durch den MODESEL1-Jumper-Eingang, waehlt es zwischen zwei Firmware-Images (MZ-700-Seite und MZ-80A-Seite), die in der oberen und unteren Haelfte des ROM-Adressraums gespeichert sind.
  • ROMA10 - dies ist der komplexeste Ausgang. Bei MZ-80A-Zielen (MODESEL1 Low) wird er mit dem WD1773-DRQ-Signal multiplext: Wenn das ROM ausgewaehlt und DRQ aktiviert ist, waehlt ROMA10 einen 1-KB-Spiegel der Leseroutine; wenn DRQ nicht aktiviert ist, waehlt er den anderen Spiegel mit dem Warte-/Wiederholungspfad. Dies ermoeglicht dem 2-MHz-Z80, FDC-Datentransfers ueber einen einfachen linearen Sprung durch das ROM zu bedienen, anstatt einer gepoliten Software-Schleife, die er nicht schnell genug ausfuehren kann. Bei MZ-700-Zielen (MODESEL1 High) wird ROMA10 direkt von DRQ ohne Adressqualifikation angesteuert.
Zwei maschinenspezifische Varianten existieren im CUPL-Quellbaum:
  • SFD700_2.PLD.MZ700 - vereinfachte ROMA10-Logik: Ausgang folgt DRQ direkt.
  • SFD700_2.PLD.MZ80A - vollstaendiges multiplextes ROMA10 mit Adressqualifikation und auskommentierten Output-Enable-Steuerungen, die waehrend der Entwicklung verwendet wurden.
Pin Signal Richtung Beschreibung
1 CLK In Takt fuer registrierte Ausgaenge
2-7 A10-A15 In Z80 hoher Adressbus
8 MREQn In Z80 Memory Request (Active Low)
9 RDn In Z80 Read Strobe (Active Low)
12 MODESEL0 In Modus-Jumper Bit 0
13 MODESEL1 In Modus-Jumper Bit 1 - waehlt ROM-Seite / DRQ-Logik
14 ROMINH In ROM-Inhibit-Status von GAL1
15 ROMDIS In ROM-Disable-Status von GAL1
16 DRQ In WD1773 Data Request
17 ROMA15 Out ROM-Adressbit 15 (Firmware-Seitenauswahl)
18 ROMA10 Out ROM-Adressbit 10 (DRQ-Multiplexer bei MZ-80A)
19 ROMCSn Out ROM Chip Select (Active Low, registriert)

Erstellen mit CUPL
Die PLD-Quelldateien werden mit der Logical Devices CUPL v4.0 (auch als CUPL 5.0a in Compiler-Ausgabekoepfen bezeichnet) DOS-aera-Toolchain kompiliert. Diese Version ist erforderlich, da WinCUPL - der Windows-aera-Nachfolger - nur Atmel-kompatible GAL-Bausteine unterstuetzt und den Lattice GAL26CV12 nicht unterstuetzt. Die CUPL v4.0-Binaerdatei kann unter DOSBox oder einem aehnlichen DOS-Emulator auf einem modernen Host ausgefuehrt werden. Alternativ koennen die vorkompilierten JEDEC-Dateien im Verzeichnis CUPL/ direkt ohne Neukompilierung verwendet werden.
Zum Neukompilieren aus dem Quellcode verwenden Sie die im Verzeichnis CUPL/ enthaltenen Batch-Skripte:
# GAL1 (GAL26CV12) kompilieren - im CUPL-Verzeichnis ausfuehren
cupl -j -f -a g26cv12 SFD700_1

# GAL2 (GAL16V8) kompilieren
cupl -j -f -a g16v8 SFD700_2
Das -j-Flag erzeugt JEDEC-Ausgabe (.JED), -f erzeugt den Fuse-Plot (.DOC), und -a <device> gibt den Zielbaustein an. Kompilierte Ausgaben werden in dasselbe Verzeichnis geschrieben:
  • SFD700_1.JED - JEDEC-Fuse-Datei fuer GAL1, bereit zum Programmieren.
  • SFD700_2.JED - JEDEC-Fuse-Datei fuer GAL2, bereit zum Programmieren.
  • SFD700_1.DOC / SFD700_2.DOC - menschenlesbare Fuse-Plots und Chip-Diagramme zur Verifikation.
  • SFD700_1.ABS / SFD700_2.ABS - binaere Zwischendateien, die von einigen Programmer-Utilities verwendet werden.

Programmierung der GALs
GAL16V8 (GAL2)
Der GAL16V8 wird nativ von praktisch allen modernen Geraeteprogrammern unterstuetzt. Mit einem TL-866 II+ oder aehnlichem mit dem Open-Source-Utility minipro:
minipro -p GAL16V8 -w SFD700_2.JED
Eine Minipro-Format-JED (SFD700_G.JED) ist ebenfalls im Verzeichnis CUPL/ fuer die direkte Verwendung bereitgestellt. Verifizieren Sie nach der Programmierung mit:
minipro -p GAL16V8 -v SFD700_2.JED
GAL26CV12 (GAL1)
Der GAL26CV12 ist ein 28-Pin-PLCC/DIP-Baustein, der nicht in der Standard-TL-866 II+-Bausteindatenbank aufgefuehrt ist. Die Programmierung erfordert einen PLCC-28-zu-DIP-28-Adapter und einen benutzerdefinierten Bausteineintrag in der Minipro-infoic.xml-Datenbank - eine vorkonfigurierte infoic.xml ist im Verzeichnis CUPL/ enthalten. Mit eingesetztem Adapter und benutzerdefinierter Datenbank:
minipro -p GAL26CV12 -w SFD700_1.JED
Wenn Sie einen aelteren dedizierten GAL-Programmer verwenden (z.B. BP Microsystems, Data I/O), verwenden Sie die Standard-JEDEC-.JED-Datei direkt - alle konformen GAL-Programmer akzeptieren das JEDEC-3C-Format, das CUPL erzeugt.
Beide GAL-Bausteine behalten ihre programmierte Konfiguration im EEPROM und sind sofort beim Einschalten ohne Ladeverzoegerung betriebsbereit. Sie koennen im eingebauten Zustand geloescht und neu programmiert werden, wenn JTAG-Testpunkte vorhanden sind, oder fuer die Bench-Programmierung aus ihren Sockeln entfernt werden.

CPLD

Baustein
Das SFD-700 v1.2 CPLD ist ein Altera MAX7000S EPM7128SLC84-15 in einem 84-Pin-PLCC-Gehaeuse. Es ist ein 5-V-tolerantes EEPROM-basiertes CPLD mit einer maximalen Verzoegerung von 15 ns und In-System-Programmierbarkeit ueber JTAG. Die Ressourcenauslastung nach einem erfolgreichen Build ist wie folgt:
Ressource Verwendet Verfuegbar Auslastung
Macrocells 72 128 56%
Registers 37 128 29%
I/O pins 65 68 96%
Product terms 179
Global clocks 2 2 100%

Architektur
Die 72 Makrozellen sind in acht funktionale Bloecke unterteilt. Zwei Signale sind dedizierten globalen Routing-Ressourcen zugewiesen: CLK_16M (der primaere Takt) und Z80_RESETn (synchroner Reset), wodurch Takt- und Reset-Versatz im gesamten Baustein minimiert wird.
Takterzeugung
Der On-Board 16-MHz-Quarzoszillator treibt den globalen Takteingang CLK_16M. Eine einzelne registrierte Toggle-Makrozelle teilt diesen durch zwei und erzeugt CLK_FDC, den 8-MHz-Takt, der direkt an den WD1773-FDC-Chip-Clock-Eingang gefuehrt wird.
I/O-Adressdekoder
Rein kombinatorische Logik dekodiert Z80-I/O-Zyklen (IORQn aktiviert mit RDn oder WRn) ueber drei Adressbloecke: die WD1773-FDC-Register bei 0xD8-0xDB, die FDC-Steuerregister bei 0xDC-0xDF und die Paging- und Modusregister bei 0x60-0x63. Bei MZ-700- und MZ-1500-Zielen (MODE 1 und 4) erfasst der Dekoder auch Schreibzugriffe auf die I/O-Ports 0xE0-0xE6, um den Host-Speicherverwaltungsstatus zu verfolgen. Der Knoten mit dem maximalen Fan-Out im Design stammt vom Adressdekodierungsbaum und steuert 67 Makrozelleneingaenge an.
Speicher-Adressdekoder
Dekodiert Z80-Speicherzyklen (MREQn mit RDn oder WRn) zur Erzeugung von Active-Low-Chip-Select-Ausgaengen fuer das On-Board Flash-ROM (ROM_CSn) und statisches RAM (RAM_CSn). Zwei unabhaengige 7-Bit-Seitenregister - EXXX_PAGE (geladen ueber 0x60) und FXXX_PAGE (geladen ueber 0x61) - werden auf die Adressbits ROM_A10 und RAM_A10 gelegt und schalten 4-KB-Fenster innerhalb von bis zu 512 KB adressierbarem Speicher um.
Laufwerks- und Motorsteuerung
Ein Schreibzugriff auf I/O-Port 0xDC laedt einen 8-Bit-registrierten Wert, der die vier Active-Low-Laufwerksauswahl-Ausgaenge (DRVSAn-DRVSDn) und die Motor-Enable-Leitung (MOTOR) ansteuert. Bits [2:0] kodieren das ausgewaehlte Laufwerk (Werte 4-7 waehlen Laufwerke A-D; 0 deselektiert alle); Bit 7 steuert den Spindelmotor. Kopfseiten-Auswahl (0xDD) und Doppeldichte-Modus (0xDE) werden durch separate Einzelbit-Register verwaltet.
Datenbus-Invertierung und Multiplexing
Der WD1773 erfordert bitweise invertierte Daten. Das CPLD verbindet sich mit einem dedizierten 8-Bit-invertierten Datenbus (ID[7:0]) und handhabt die Polaritaetsinvertierung transparent in beiden Lese- und Schreibrichtungen. Bei einem Z80-Lesen eines FDC-Registers wird der invertierte Bus zurueck-invertiert auf den Z80-Datenbus gelegt; bei einem Schreiben auf ein FDC-Register wird der Z80-Datenbus auf ID[7:0] invertiert. Wenn ein Seitenregister vom Host zurueckgelesen wird, steuert das CPLD den gespeicherten Seitenwert stattdessen direkt auf den Z80-Datenbus.
Bei MZ-80A- und MZ-1200-Zielen (MODE 0) wird das WD1773-DRQ-Signal auf das Flash-ROM-Adressbit A10 (ROM_A10) multiplext. Jedes 1-KB-Segment des Boot-ROMs enthaelt eine gespiegelte Kopie der Leseroutine; der DRQ-Status waehlt direkt die richtige Kopie aus, wodurch die Software-Polling-Schleife umgangen wird, die der 2-MHz-Z80 nicht schnell genug ausfuehren kann, um die FDC-Datenrate zuverlaessig zu bedienen.
Interrupt-Steuerung
Der WD1773-INTRQ-Ausgang wird durch ein einzelnes registriertes Enable-Bit gegated. Ein Schreibzugriff auf I/O-Port 0xDF aktiviert die Weiterleitung von INTRQ an die Z80-INT-Leitung; ein Lesezugriff von 0xDF loescht das Enable. Ein sekundaerer Ausgang, Z80_EXWAITn, ist verfuegbar, um externe Wait-States waehrend des FDC-Registerzugriffs einzufuegen, falls vom Host-Timing erforderlich.
MZ-700 / MZ-1500 Speicherverwaltung
Der MZ-700 und MZ-1500 verwenden I/O-Schreibzugriffe auf 0xE0-0xE6, um ihren internen DRAM und ROM in den oberen Adressraum ein- und auszublenden. Das CPLD ueberwacht diese Schreibzugriffe und verwaltet ein Zwei-Bit-Statusregister: Das Schreiben auf 0xE5 setzt den Inhibit-Status und unterdrueckt ROM_CSn und RAM_CSn unabhaengig vom Inhalt der Seitenregister; das Schreiben auf 0xE3, 0xE4 oder 0xE6 loescht den Inhibit und aktiviert die Erweiterungskartenfenster wieder.
Modusregister
Drei Modus-Jumper-Eingaenge (MODE[2:0]) werden bei der steigenden Flanke von Z80_RESETn abgetastet und in einem registrierten Wert gespeichert. Das Lesen des I/O-Ports 0x63 gibt diesen Wert zurueck, sodass die Boot-Firmware den Host-Maschinentyp automatisch erkennen kann, ohne DIP-Schalter oder manuelle Konfiguration.

Pin-Zuordnung
Wichtige Pin-Zuordnungen fuer den EPM7128SLC84-15 (84-Pin PLCC). Alle I/O sind 3,3 V LVTTL; die MAX7000S-Familie ist 5-V-eingangstolerant und damit direkt kompatibel mit dem 5-V-Sharp-MZ-Bus.
Signal Pin Richtung Beschreibung
CLK_16M 83 In 16-MHz-Quarzoszillator - Globaler Takt
CLK_FDC 81 Out 8-MHz-Takt zum WD1773
CLK_BUS0 2 In Host-Z80-Bustakt
Z80_RESETn In Active-Low-Reset - Globale Ressource, speichert MODE
A[15:0] 4-25 In Z80-Adressbus
D[7:0] 27-35 Bidir Z80-Datenbus
ID[7:0] 64-74 Bidir Invertierter Datenbus (WD1773-Seite)
M1n 36 In Z80-M1-Maschinenzyklusanzeige
RDn 37 In Z80 Read Strobe
WRn 39 In Z80 Write Strobe
IORQn 40 In Z80 I/O Request
MREQn 41 In Z80 Memory Request
Z80_INT 44 Out Interrupt-Ausgang zum Z80 (gegatedetes INTRQ)
Z80_EXWAITn 45 Out Externer Wait-Request zum Z80
FDCn 63 Out WD1773 Chip Select (Active Low)
INTRQ 61 In WD1773 Interrupt Request
DRQ 60 In WD1773 Data Request
DDENn 58 Out Doppeldichte-Enable zum WD1773 (Active Low)
SIDE1 57 Out Kopfseiten-Auswahl
MOTOR 56 Out Spindelmotor-Enable
DRVSAn 55 Out Laufwerk A Select (Active Low)
DRVSBn 54 Out Laufwerk B Select (Active Low)
DRVSCn 52 Out Laufwerk C Select (Active Low)
DRVSDn 51 Out Laufwerk D Select (Active Low)
ROM_CSn 77 Out Flash-ROM Chip Select (Active Low)
RAM_CSn 76 Out Statisches RAM Chip Select (Active Low)
ROM_A10 80 Out ROM-Seitenbit / DRQ-Mux (MZ-80A MODE)
RAM_A10 79 Out RAM-Seitenbit
MODE[2:0] 49,48,50 In Host-Maschinen-Modus-Jumper

Erstellen des CPLD-Bitstreams
Der CPLD-Bitstream wird mit Quartus II 13.0.1 SP1 Web Edition kompiliert. Diese spezifische Version ist erforderlich, da Quartus-Releases nach 13.x die Unterstuetzung fuer die MAX7000S-Geratefamilie eingestellt haben. Die Web Edition ist kostenlos im Intel FPGA Software Archive erhaeltlich.
Klonen Sie das Repository und oeffnen Sie das Projekt:
git clone https://git.eaw.app/eaw/SFD700
cd SFD700/CPLD/v1.2/build
Zum Kompilieren von der Kommandozeile:
quartus_map --read_settings_files=on sfd700   # Analyse & Synthese
quartus_fit --read_settings_files=on sfd700   # Fitter (Platzierung & Routing)
quartus_asm --read_settings_files=on sfd700   # Assembler - erzeugt sfd700.pof
quartus_sta sfd700                            # Timing-Analyse (optional)
Alternativ oeffnen Sie CPLD/v1.2/build/sfd700.qpf in der Quartus-II-GUI und verwenden Processing -> Start Compilation. Bei einem erfolgreichen Build wird die Ausgabe-Programmierdatei geschrieben nach:
CPLD/v1.2/build/output_files/sfd700.pof
Erwartete Ressourcenauslastung: 72/128 Makrozellen (56%), 65/68 Pins (96%), 37 Register. Jede signifikante Abweichung weist auf eine Syntheseeinstellungsdiskrepanz hin - bestaetigen Sie, dass der Baustein in den Quartus-Projekteinstellungen auf EPM7128SLC84-15 (MAX7000S-Familie) eingestellt ist.

Programmierung des CPLD
Der EPM7128SLC84-15 wird ueber seinen Vier-Pin-JTAG-Port (TDI, TDO, TMS, TCK) mit einem Altera USB-Blaster oder einem kompatiblen Klon programmiert. Verbinden Sie den USB-Blaster mit dem 10-Pin-JTAG-Header auf der SFD-700-Platine und mit einem USB-Port am Programmierhost.
Zum Programmieren von der Kommandozeile:
quartus_pgm -c "USB-Blaster" -m JTAG \
  -o "p;CPLD/v1.2/build/output_files/sfd700.pof"
Oder verwenden Sie die Quartus II Programmer-GUI:
  1. Oeffnen Sie Tools -> Programmer.
  2. Klicken Sie Hardware Setup und waehlen Sie USB-Blaster.
  3. Klicken Sie Add File und waehlen Sie output_files/sfd700.pof.
  4. Setzen Sie ein Haekchen bei Program/Configure und optional Verify.
  5. Klicken Sie Start. Die Programmierung ist in wenigen Sekunden abgeschlossen.
Der MAX7000S verwendet EEPROM-Zellen fuer die Konfigurationsspeicherung. Der programmierte Zustand bleibt ohne Stromversorgung unbegrenzt erhalten und ist bei jedem nachfolgenden Einschalten sofort verfuegbar - es tritt keine Bitstream-Ladeverzoegerung auf.

I/O-Registeruebersicht

Das CPLD dekodiert den Z80-I/O-Adressbus zur Implementierung des folgenden Registersatzes. Der WD1773 verwendet invertierte Daten; das CPLD handhabt die Invertierung transparent.
Port R/W Beschreibung
0xD8-0xDB R/W WD1773-FDC-Register (Status, Command, Track, Sector, Data).
0xDC W Laufwerk & Motor: Bits [2:0] waehlen Laufwerk (4=A, 5=B, 6=C, 7=D, 0=keines); Bit [7] steuert Motor.
0xDD W Kopfseite: D0=0 -> Seite 1, D0=1 -> Seite 0.
0xDE W Datenrate: D0=0 -> Doppeldichte, D0=1 -> Einzeldichte.
0xDF W/R Interrupt: Schreiben -> WD1773 INT zum Host aktivieren; Lesen -> WD1773 INT deaktivieren.
0x60 R/W EXXX-Seitenregister: D7 waehlt Speicher (0=Flash ROM, 1=RAM); Bits [6:0] waehlen eine 4-KB-Seite, abgebildet auf E300:EFFF.
0x61 R/W FXXX-Seitenregister: D7 waehlt Speicher (0=Flash ROM, 1=RAM); Bits [6:0] waehlen eine 4-KB-Seite, abgebildet auf F000:FFFF.
0x63 R Modusregister: liest den MODE-Jumper-Wert zurueck (0-6).
0xE1 W Nur MZ-700/MZ-1500: Onboard-ROM deaktivieren (Host bildet DRAM auf D000:FFFF ab).
0xE3, 0xE4 W Nur MZ-700/MZ-1500: Onboard-ROM wieder aktivieren.
0xE5 W Nur MZ-700/MZ-1500: Alle Onboard-ROM/RAM-Zugriffe sperren.
0xE6 W Nur MZ-700/MZ-1500: ROM-Sperre aufheben, Onboard-ROM/RAM wieder aktivieren.

Speicheruebersicht

Das CPLD macht das Onboard Flash-ROM und statische RAM fuer den Host ueber zwei gepaged Fenster im oberen Adressraum sichtbar. Jedes Fenster ist 4 KB gross und seine physische Seite wird unabhaengig ueber I/O-Ports 0x60 und 0x61 eingestellt, was bis zu 128 x 4 KB = 512 KB adressierbaren Flash- oder RAM-Speicher ermoeglicht.
Fenster Adressbereich Seitenregister Hinweise
EXXX E300:EFFF 0x60 E000:E2FF ist fuer MZ-700/MZ-1500 speicherabgebildete I/O reserviert, sodass nur 3,75 KB der 4-KB-Seite von der Firmware (RFS) genutzt werden koennen.
FXXX F000:FFFF 0x61 Volles 4-KB-Fenster. Standardseite 0 enthaelt das MZ-80A-AFI-ROM; Standardseite 1 enthaelt das MZ-700-AFI-ROM.
Beim MZ-80A und MZ-1200 leitet das CPLD das WD1773-DRQ-Signal auf die Flash-ROM-Adressleitung A10. Beide Seiten der Adressleitung enthalten Spiegelkopien der Leseroutine, wobei der kurze Pfad genommen wird, wenn DRQ aktiviert ist. Dies eliminiert die Notwendigkeit von Software-Polling und ermoeglicht zuverlaessige Datenuebertragung bei 2 MHz.

Platine

v1.1 Platine

Die Platine ist komplexer als der SFD-800, da sie ein CPLD, ROM/RAM-Speicher und zusaetzliche Unterstuetzungsschaltungen erfordert (fruehere v1.0/v1.1-Revisionen verwendeten zwei GAL-Bausteine anstelle des CPLD).

Platine Oberseite Platine Unterseite

v1.2 Platine

Platine Oberseite Platine Unterseite Platine 3D Oberseite Platine 3D Unterseite

Handbuecher

Detaillierte Dokumentation fuer den SFD-700 mkII ist in drei separaten Hanbuechern verfuegbar:
Handbuch Beschreibung
Benutzerhandbuch Platinenueberblick, MODE-Jumper-Einstellung, Laufwerksinstallation, ROM Filing System-Nutzung und Fehlerbehebung
Technischer Leitfaden Hardwarearchitektur, CPLD-Design, I/O-Registeruebersicht, Speicheruebersicht und Build-/Programmierverfahren
Entwicklerhandbuch Vollstaendige VHDL-Quellcode-Durchsicht mit VHDL erklaert fuer Nicht-VHDL-Programmierer, Prozess-fuer-Prozess-Analyse und CPLD-Modifikationsanleitung

Dokumentation

K&P SFD800 Handbuch

Der obige Link laedt das originale K&P SFD-800-Benutzerhandbuch herunter, das fuer dieses Design relevant ist. Es ist auf Deutsch.

Dateien

Bitte besuchen Sie Gitea fuer alle Projektdateien.

Die v1.2-PCB-Gerbers sind im Verzeichnis releases/ des Gitea-Repositorys verfuegbar. Sechs Ersatzplatinen v1.2 sind vorhanden - kontaktieren Sie uns ueber die Website bei Interesse, nur Portokosten.


Danksagungen

Das urspruengliche SFD-700-Design ist urheberrechtlich geschuetzt von Kersten & Partners GmbH aus Aachen, Deutschland, einem Unternehmen, das inzwischen den Geschaeftsbetrieb eingestellt hat. Es wurden Versuche unternommen, sie an ihrer letzten bekannten Adresse zu kontaktieren, um eine Genehmigung zur Reproduktion einzuholen, aber es wurde keine Antwort erhalten.

Der SFD-700 mkII ist ein neues Design, das vom urspruenglichen Konzept inspiriert ist. Das PCB-Layout, der Schaltplan und die programmierbare Logik (CUPL fuer v1.0/v1.1; VHDL fuer v1.2) wurden von Grund auf geschrieben. Es handelt sich nicht um eine direkte Nachbildung - die Host-Modus-Logik, das ROM/RAM-Paging und die MZ-80A DRQ-zu-Adressleitung-Anpassung sind originale Ergaenzungen, die im K&P-Produkt nicht vorhanden waren.

Lizenzen

Dieses Design, Hardware und Software, ist unter der GNU Public Licence v3 lizenziert.

Die GNU General Public License v3

Die Quell- und Binaerdateien in diesem Projekt, die als GPL v3 gekennzeichnet sind, sind freie Software: Sie koennen sie unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veroeffentlicht, weitergeben und/oder modifizieren, entweder Version 3 der Lizenz oder (nach Ihrer Wahl) jede spaetere Version.

Die Quelldateien werden in der Hoffnung verbreitet, dass sie nuetzlich sind, aber OHNE JEDE GEWAEHRLEISTUNG; sogar ohne die stillschweigende Gewaehrleistung der MARKTFAEHIGKEIT oder EIGNUNG FUER EINEN BESTIMMTEN ZWECK. Weitere Einzelheiten finden Sie in der GNU General Public License.

Sie sollten eine Kopie der GNU General Public License zusammen mit diesem Programm erhalten haben. Falls nicht, siehe http://www.gnu.org/licenses/.