Projet Zephyr - Interface cassette
Conception d'une interface cassette pour le projet Zephyr
Arnaud LE COSSEC
5/8/20245 min read


Interface cassette réalisé sous la forme d'une carte d'extension
Des données sur une cassette !?
Pour être d'une quelconque utilité, mon petit ordinateur 8-bit se doit de posséder d'au moins une forme de stockage de masse. Cependant, les formes modernes de stockage comme les disques durs présentent un chalenge important, tant du point de vue de l'interface matérielle que du système de fichiers qui serait à implémenté dans le système d'exploration.
Une option plus réaliste pourrait venir des micro-ordinateurs des années 70-80. À cette époque les prix des disques durs étaient bien au-delà de la portée du commun des mortels, et la cassette audio s'est révélé comme un moyen simple et peu couteux de stocker des données.
Ce qu'on appelle une interface cassette pourrait aussi bien s’appeler interface audio : n'importe quel appareil capable de lire et d'enregistrer un signal audio peut devenir un média de stockage. Cela constitue l'un de ses principal avantage. En revanche, l'interface cassette présente certains désavantages comme la lenteur et l'impossibilité d’accéder à n'importe quel fichier à n'importe quel moment.


Lecteur-enregistreur de cassette MK 97-070 pour le micro-ordinateur Thomson TO7/70
Principe de fonctionnement
Pour stocker des données digitales sur un support prévu pour un signal audio, nous devons les préparer au préalable. En effet un signal audio a une amplitude moyenne nulle. Cela n'est pas le cas d'un flux binaire où le nombre de 1 et de 0 n'est pas homogène.
Pour mon interface, j'ai opté pour une modulation FM inspiré du Kansas City Standard, mais simplifié. Le résultat prend la forme d'un flux série (1 bit de "start", 8 bits de données, 2 bits de "stop"), où les 1 sont représentés par une période d'un signal carré à 440 Hz, et les 0 par une période à 880 Hz. Une propriété intéressante de cette méthode est que la vitesse de transmission est variable : un fichier composé majoritairement de 0 sera transmis plus vite et prendra moins de place.
Les fréquences utilisées ont été choisis pour être suffisamment lente pour être (dé)modulées en logiciel, m'épargnant une interface matérielle complexe, couteuse et peu évolutive.


Au début de chaque transmission, une série de 10 périodes à 440 Hz (ou 10 "1" logiques) permet de calibrer la vitesse de démodulation et palier les variations entre les lecteurs/enregistreurs.
Exemple de transmission
Implantation matérielle
La (dé)modulation étant effectuée en logiciel, la partie matérielle de l'interface est par conséquent assez simple.




Schéma complet de l'interface cassette
Test du prototype sur plaque d'essais
Implantation logicielle
Le code est bien entendu écrit dans l'assembleur du Zilog Z80. Au moment de l'écriture de cet article, seule la démodulation a été implantée avec succès.
La démodulation repose sur la mesure de la partie positive du signal. Un seuil défini au moment de la calibration permet ensuite de discriminer les fréquences basses (440 Hz), des fréquences hautes (880 Hz)


Sous-routine de la démodulation : mesure de la partie positive du signal


Sous-routine de la démodulation : Lecture d'un octet
Les esprits attentifs auront remarqué que le diagramme de la dernière figure semble bien plus long que le code assembleur qui lui est rattaché ! En effet pour gagner en temps d’exécution, j'ai usé d'une petite astuce propre au jeu d'instructions du Z80. L'instruction cp met à jour tous les drapeaux du processeur lorsque nous comparons la sortie de notre sous-routine de mesure et le seuil. Parmi ces drapeaux, le carry flag peut nous indiquer si la mesure est au-dessus du seuil ou non. Au lieu de tester ce drapeau comme dans le diagramme, je l'utilise directement dans le décalage avec l'instruction rr.


Une grande partie du circuit est liée à l'interface d'extension et permet à l'ordinateur de sélectionner la carte correctement. Concentrons-nous dans cet article sur le circuit de réception. La partie émission sera traitée dans un prochain article.


Schéma de la partie réception
La partie réception des données est réalisée simplement avec un amplificateur opérationnel en montage comparateur. Les signaux d'une sortie audio sont assez faibles (> 1Vpp) et l'ampli-OP permet de les ramener à des tensions compréhensibles par le système (0-5V).
Un filtre passe-haut avait été placé en amont du comparateur mais il s'est avéré complètement inutile. À l'avenir, il serait même préférable d'ajouter un filtre passe-bande ou passe-bas pour retirer les fréquences parasites. En attendant, le condensateur C3 sur le schéma a été court-circuité et l'interface fonctionne sans perte de données.




Résultat :
Le code complet est disponible sur ma page Github.




La réception des données avec l'interface cassette a été réalisée avec succès et implanter dans ROM-OS, le système d'exploitation de mon micro-ordinateur ! Il reste désormais à travailler sur la sauvegarde de données.
Chargement de données via l'interface cassette avec la commande /CLOAD dans ROM-OS
L'interface cassette en action !
Contacts
lecossec.arnaud@gmail.com


Copyright
2024-2025 Arnaud LE COSSEC