SFD-700 Controleur de Disquette Multi-Hote
Mise a jour fevrier 2024 - Le materiel v1.2 est pleinement fonctionnel et a ete teste sur mon MZ-80A, MZ-700 et MZ-1500 avec l'adaptateur EXT700 et dans l'unite d'extension MZ-2000. Des problemes ont ete signales avec le MZ-1U06 qui doivent etre investigues, il semble s'agir d'un probleme de timing du CPLD. La logique CPLD (VHDL) est complete et toute la logique de pagination ROM/RAM et de mode hote fonctionne correctement. Le logiciel ROM Filing System porte sur le SFD-700 est fonctionnel pour les operations FDC de base (demarrage floppy via la commande 'F') mais n'inclut pas encore la suite complete d'outils de moniteur de disquette; ceci est en developpement continu. La charge de travail client a ralenti les progres - veuillez consulter le depot Gitea pour l'etat actuel. La carte n'a pas encore ete testee sur d'autres machines de la serie MZ; cela sera fait en temps voulu.
L'un des accessoires les plus necessaires pour la serie Sharp MZ est le venerable controleur de disquette. Ceux-ci sont relativement rares car peu de personnes les utilisaient, principalement en raison du cout durant l'ere Sharp MZ.
Sharp a concu et commercialise plusieurs cartes d'extension de disquette, certaines integrees dans la machine de base, comme la serie MZ-2500/2800/3500/5600/6500, d'autres necessitaient une carte enfichable. Ils ont initialement commence avec un controleur personnalise dans la serie MZ-80K, puis avec l'avenement de la machine professionnelle MZ-80B, Sharp a standardise l'architecture Western Digital Floppy Disk Controller et a concu et produit son propre circuit controleur, le MB8866.
La conception du MZ-80B supposait que tout le firmware de controle de disquette serait stocke dans l'IPL (Initial Program Loader) de la machine, ce qui s'est perpetue dans les conceptions MZ-800/MZ-1500/MZ-2000/MZ-2200, maintenant la compatibilite du controleur avec ces machines plus recentes.
Malheureusement, pour les modeles inferieurs, comme le MZ-80A/MZ-700, les disquettes n'avaient pas ete envisagees lors de la conception et necessitaient donc le developpement de nouvelles cartes d'extension de controleur avec ROM embarquee pour fournir le firmware de bootstrap de disquette necessaire. De plus, comme le MZ-80A fonctionnait a 2 MHz, il n'etait pas assez rapide pour lire le drapeau DRQ puis lire les donnees disponibles en flux continu, donc Sharp a du faire en sorte que la ligne DRQ bascule une ligne d'adresse ROM pour accelerer le traitement afin de gerer le flux de donnees.
Les cartes d'extension de disquette Sharp etaient couteuses, creant une opportunite pour des tiers de produire des offres moins cheres. Une entreprise en Allemagne, K&P Partners GmbH, etait une telle entreprise et proposait deux produits : le SFD-800 pour les machines MZ-800, qui etait egalement compatible avec les hotes MZ-80B/MZ-1500/MZ-2000/MZ-2200, et le SFD-700 qui ciblait le MZ-700.
J'ai initialement, comme pour le SFD-800, envisage une conception replique, mais apres avoir etudie les differents circuits, j'ai observe un defaut fatal dans le K&P SFD-700 : la pagination memoire. La carte etait concue pour fonctionner dans l'unite d'extension MZ-1U06 qui avait une logique de pagination pour desactiver l'acces a la memoire de la carte d'extension selon les registres d'etat de pagination du MZ-700. Si cette carte etait utilisee dans une unite d'extension personnalisee, elle ne fonctionnait pas. J'avais aussi des MZ-80A qui avaient besoin d'un controleur de disquette, j'en suis donc venu a la conclusion qu'une carte unique, qui fonctionnerait dans tous les MZ depuis le MZ-80A (excluant ceux avec des controleurs integres) serait la voie a suivre. Ainsi est ne le concept du SFD-700 mkII - meme nom que le produit K&P mais avec plus de fonctionnalites.
Ce document presente le nouveau schema, la logique programmable et tous les problemes decouverts sur chaque machine.
Compatibilite Hote
Le SFD-700 v1.2 prend en charge toutes les machines de la serie Sharp MZ a partir du MZ-80A (excluant les machines avec controleurs de disquette integres). L'hote cible est selectionne par un cavalier MODE a 3 bits sur le PCB qui est verrouille lors du reset. Le tableau ci-dessous liste les machines prises en charge et la valeur de cavalier correspondante.
| MODE | Machine Hote |
|---|---|
| 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 |
Sur le MZ-80A/MZ-1200, le CPU fonctionne a 2 MHz, ce qui est insuffisant pour interroger le drapeau DRQ du WD1773 et lire le registre de donnees avant l'arrivee de l'octet suivant. Le CPLD gere cela en routant le signal DRQ vers le bit d'adresse A10 de la Flash ROM, de sorte que le code firmware duplique apparait dans chaque segment de 1 Ko de la ROM. Cela elimine le besoin d'interrogation logicielle - la ligne DRQ selectionne directement le chemin de lecture ou d'attente correct dans le bootstrap ROM.
Schema

Logique Programmable
v1.0 / v1.1 -- Conception a base de GAL
Les premieres revisions utilisaient deux dispositifs GAL : un Lattice GAL26CV12 comme decodeur d'adresse I/O principal et controleur de gestion memoire MZ-700, et un Lattice GAL16V8 comme decodeur d'adresse ROM et selecteur de mode hote. Les conceptions etaient ecrites en CUPL (Compiler for Universal Programmable Logic) et compilees avec la chaine d'outils originale Logical Devices CUPL v4.0.
Malgre ces obstacles, v1.0 et v1.1 etaient fonctionnels sur le MZ-700 pour les operations de base de disquette. Le nombre de registres du GAL26CV12 etait neanmoins une contrainte limitante : le dispositif n'a qu'un seul cluster de sortie registre et un pool d'expansion limite, il n'etait donc pas possible d'implementer simultanement un suivi complet de l'etat de gestion memoire MZ-700 et les registres de page ROM/RAM independants necessaires pour le ROM Filing System - cette limitation est la raison principale pour laquelle v1.2 est passe a un CPLD.
v1.2 -- CPLD (VHDL)
La version 1.2 a remplace les deux dispositifs GAL par un seul Altera MAX7000S EPM7128SLC84-15 CPLD (PLCC-84, 128 macrocellules), implemente en VHDL et compile avec Quartus II 13.0.1 SP1. Les fichiers source VHDL (
sfd700.vhd, sfd700_Toplevel.vhd, sfd700_pkg.vhd) se trouvent dans le repertoire CPLD/v1.2/ du depot Gitea.
Configuration et build automatises (recommande)
La logique CUPL/GAL historique (v1.0 / v1.1) et le bitstream CPLD/VHDL actuel (v1.2) peuvent tous deux etre compiles a partir d'un unique script de configuration autonome propre a votre plateforme. Le script installe les chaines d'outils requises — DOSBox pour la logique CUPL et Altera Quartus II 13.0sp1 pour le CPLD — clone le depot et peut lancer l'un ou l'autre des builds, voire les deux, le tout de maniere interactive avec des valeurs par defaut sensees que vous pouvez accepter en appuyant sur Entree. C'est la methode de compilation la plus simple ; les sections detaillees GAL et CPLD qui suivent sont conservees pour les utilisateurs avances qui veulent compiler a la main ou effectuer des rebuilds partiels.
macOS / Linux — setup_SFD700.sh
chmod +x setup_SFD700.sh ./setup_SFD700.sh
Ceci installe
git, curl/wget et DOSBox (pour la chaine d'outils CUPL) et configure Quartus II 13.0sp1 pour le CPLD. Sous Linux, Quartus est installe nativement dans ~/altera/13.0sp1 (~1,6 Go) ; sous macOS — ou aucun Quartus natif n'existe — la chaine d'outils CPLD s'execute a partir d'une image Docker (sfd700-quartus:13.0sp1). Le paquet de la famille de composants MAX7000S est recupere automatiquement.
Windows 10 / 11 — setup_SFD700_windows_native.ps1 (Git Bash natif, sans WSL). Depuis PowerShell :
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass .\setup_SFD700_windows_native.ps1
Ceci utilise winget pour installer Git for Windows (qui fournit
bash) et DOSBox, puis installe Quartus II 13.0sp1 nativement dans C:\altera\13.0sp1 avec le paquet MAX7000S. Les scripts de build s'executent sous Git Bash. Pour utiliser Docker pour la chaine d'outils CPLD au lieu du Quartus natif, definissez $env:SFD700_CPLD_METHOD = "docker" avant de lancer le script.
Chaque invite a une valeur par defaut securisee entre crochets — la lettre majuscule est la valeur par defaut, donc appuyer sur Entree l'accepte. La configuration demande l'URL du depot (par defaut le depot public
https://git.eaw.app/eaw/SFD700.git) et un repertoire d'installation, puis propose de compiler la logique CUPL/GAL (./build_cupl.sh) et le bitstream CPLD/VHDL (./build_cpld.sh). Le build CUPL ecrit SFD700_1.JED et SFD700_2.JED dans CUPL/ pour un programmateur TL866 / XGecu ; le build CPLD ecrit CPLD/v1.2/build/output_files/sfd700.pof pour la programmation JTAG avec un USB-Blaster.
CPLD
Dispositif
Le CPLD du SFD-700 v1.2 est un Altera MAX7000S EPM7128SLC84-15 dans un boitier PLCC 84 broches. C'est un CPLD base EEPROM tolerant 5 V avec un delai de propagation maximal de 15 ns et une programmabilite in-system via JTAG. L'utilisation des ressources apres une compilation reussie est la suivante :
| Ressource | Utilise | Disponible | Utilisation |
|---|---|---|---|
| Macrocells | 72 | 128 | 56% |
| Registers | 37 | 128 | 29% |
| I/O pins | 65 | 68 | 96% |
| Product terms | 179 | – | – |
| Global clocks | 2 | 2 | 100% |
Registre I/O
Le CPLD decode le bus d'adresse I/O du Z80 pour implementer l'ensemble de registres suivant. Le WD1773 utilise des donnees inversees; le CPLD gere l'inversion de maniere transparente.
| Port | R/W | Description |
|---|---|---|
| 0xD8-0xDB | R/W | Registres FDC WD1773 (Status, Command, Track, Sector, Data). |
| 0xDC | W | Lecteur & moteur : bits [2:0] selectionnent le lecteur (4=A, 5=B, 6=C, 7=D, 0=aucun); bit [7] controle le moteur. |
| 0xDD | W | Cote de tete : D0=0 -> cote 1, D0=1 -> cote 0. |
| 0xDE | W | Debit de donnees : D0=0 -> double densite, D0=1 -> simple densite. |
| 0xDF | W/R | Interruption : ecriture -> activer INT WD1773 vers l’hote; lecture -> desactiver INT WD1773. |
| 0x60 | R/W | Registre de page EXXX : D7 selectionne le stockage (0=Flash ROM, 1=RAM); bits [6:0] selectionnent une page de 4 Ko mappee sur E300:EFFF. |
| 0x61 | R/W | Registre de page FXXX : D7 selectionne le stockage (0=Flash ROM, 1=RAM); bits [6:0] selectionnent une page de 4 Ko mappee sur F000:FFFF. |
| 0x63 | R | Registre de mode : renvoie la valeur du cavalier MODE (0-6). |
| 0xE1 | W | MZ-700/MZ-1500 uniquement : desactiver la ROM embarquee (l’hote mappe la DRAM sur D000:FFFF). |
| 0xE3, 0xE4 | W | MZ-700/MZ-1500 uniquement : reactiver la ROM embarquee. |
| 0xE5 | W | MZ-700/MZ-1500 uniquement : inhiber tout acces ROM/RAM embarquee. |
| 0xE6 | W | MZ-700/MZ-1500 uniquement : lever l’inhibition ROM, reactiver ROM/RAM embarquee. |
Carte Memoire
Le CPLD rend la Flash ROM et la RAM statique embarquees visibles a l'hote a travers deux fenetres paginees dans l'espace d'adressage superieur.
| Fenetre | Plage d’adresses | Registre de page | Notes |
|---|---|---|---|
| EXXX | E300:EFFF | 0x60 | E000:E2FF est reserve pour les I/O mappees en memoire MZ-700/MZ-1500. |
| FXXX | F000:FFFF | 0x61 | Fenetre complete de 4 Ko. Page 0 par defaut contient la ROM AFI MZ-80A; page 1 par defaut contient la ROM AFI MZ-700. |
Carte
Carte v1.1

Carte v1.2

Manuels
La documentation detaillee du SFD-700 mkII est disponible en trois manuels separes :
| Manuel | Description |
|---|---|
| Manuel Utilisateur | Apercu de la carte, configuration du cavalier MODE, installation des lecteurs, utilisation du ROM Filing System et depannage |
| Guide Technique | Architecture materielle, conception CPLD, registre I/O, carte memoire et procedures de build/programmation |
| Guide du Developpeur | Revue complete du code source VHDL avec VHDL explique pour les non-programmeurs VHDL, analyse processus par processus et guide de modification CPLD |
Documentation
Le lien ci-dessus telecharge le manuel utilisateur original K&P SFD-800 qui est pertinent pour cette conception. Il est en allemand.
Fichiers
Veuillez consulter Gitea pour tous les fichiers du projet.
Les Gerbers du PCB v1.2 sont disponibles dans le repertoire releases/ du depot Gitea. Six cartes v1.2 de rechange sont disponibles - contactez via le site web si interesse, frais de port uniquement.
Credits
La conception originale du SFD-700 est copyright 1985 Kersten & Partners GmbH d'Aix-la-Chapelle, Allemagne, une entreprise qui a depuis cesse ses activites.
Le SFD-700 mkII est une nouvelle conception inspiree du concept original. Le routage PCB, le schema et la logique programmable (CUPL pour v1.0/v1.1; VHDL pour v1.2) ont ete ecrits de zero. Il ne s'agit pas d'une replique directe - la logique de mode hote, la pagination ROM/RAM et l'adaptation DRQ-vers-ligne-d'adresse du MZ-80A sont des ajouts originaux absents du produit K&P.
Le SFD-700 mkII est une nouvelle conception inspiree du concept original. Le routage PCB, le schema et la logique programmable (CUPL pour v1.0/v1.1; VHDL pour v1.2) ont ete ecrits de zero. Il ne s'agit pas d'une replique directe - la logique de mode hote, la pagination ROM/RAM et l'adaptation DRQ-vers-ligne-d'adresse du MZ-80A sont des ajouts originaux absents du produit K&P.
Licences
Cette conception, materiel et logiciel, est sous licence GNU Public Licence v3.
La GNU General Public License v3
Les fichiers source et binaires de ce projet marques comme GPL v3 sont des logiciels libres : vous pouvez les redistribuer et/ou les modifier selon les termes de la Licence Publique Generale GNU telle que publiee par la Free Software Foundation, soit la version 3 de la Licence, soit (a votre choix) toute version ulterieure.
Les fichiers source sont distribues dans l'espoir qu'ils seront utiles, mais SANS AUCUNE GARANTIE; sans meme la garantie implicite de COMMERCIALISATION ou d'ADEQUATION A UN USAGE PARTICULIER. Voir la Licence Publique Generale GNU pour plus de details.
Vous devriez avoir recu une copie de la Licence Publique Generale GNU avec ce programme. Si ce n'est pas le cas, voir http://www.gnu.org/licenses/.
Les fichiers source sont distribues dans l'espoir qu'ils seront utiles, mais SANS AUCUNE GARANTIE; sans meme la garantie implicite de COMMERCIALISATION ou d'ADEQUATION A UN USAGE PARTICULIER. Voir la Licence Publique Generale GNU pour plus de details.
Vous devriez avoir recu une copie de la Licence Publique Generale GNU avec ce programme. Si ce n'est pas le cas, voir http://www.gnu.org/licenses/.