Carte AdLib sur port parallèle

Pourquoi?

Les cartes de son AdLib furent une des premières cartes de son pour les PC. Elles s'installaient dans une fente ISA 8 bits, et utilisaient la puce YM3812 de Yamaha. Cette puce utilise le pricipe de synthèse du son par modulation de fréquence (FM) et est aussi connue sous le nom d'OPL2. Cette puce comportant 9 canaux a était supportée par plusieurs jeux DOS.

Cette carte a une sonorité particulière (écoutez les échantillons) dont je garde toujours de bons souvenirs, car ce fut ma première carte de son.

De nos jours, il n'est pas rare qu'un PC ne supporte pas les cartes ISA. Il n'est pas possible non plus d'utiliser une carte Adlib avec des machines qui ne sont pas d'architecture compatible IBM PC, comme les Mac et les postes de travail Sun. Il est également hors de question d'installer cette carte dans un ordinateur portable.

Il existe un émulateur open source capable de reproduire la même sonorité nommé Adplug. Adplug est disponible chez sourceforge: http://adplug.sourceforge.net/ et est utilisable en ligne de commande Unix, comme plugin xmms ou winamp, ou sous Dos.

Quelque part en 2005, alors que je trouvais dommage de ne plus me servir de ma carte AdLib originale.. Mais j'ai eu l'idée de concevoir un circuit pour la contrôler avec le port parallèle d'un PC. Pour pouvoir écouter de la musique prévue pour les cartes AdLib, j'ai modifié adplug afin que ce soit ma carte qui soit utilisée pour reproduire le son. Ainsi, la vingtaine de format de fichiers reconnus par adplug pouvaient être joués par ma carte Adlib, et ce sur mon poste de travail Sun Sparc et Amd64 :)

Mise à jour en 2019!

Depuis que j'ai réalisé ce projet en 2005, quelqu'un a eu l'excellente idée de concevoir un petit circuit regroupant l'OPL2 et les pièces de support (horloge, DAC, ampli..) nécessaires qui se branche directement à un port parallèle. Ce projet est nommé opl2lpt.

Je m'étais contenté d'utiliser mon montage via Adplug à l'éopque, mais le créateur de opl2lpt est allé plus loin: Le montage est compatible avec plusieurs jeux DOS grace à un pilote ou un outil capable de modifier l'exécutable d'un jeu.

De plus, depuis la parution du projet opl2lpt, quelques jeux nouvellement développés pour DOS supportent l'opl2lpt nativement.

J'ignore si c'est un hasard, mais il se trouve que la manière dont l'OPL2 est relié au port parallèle par le projet opl2lpt est équivalent à mon montage! Ce qui fonctionne avec l'opl2lpt fonctionne donc aussi avec mon montage original.

J'ai donc sorti le projet de sa boîte et j'en profite désormais d'une toute nouvelle manière!


Photos 2019

Cet ordinateur portable de l'époque Windows Me tourne sous DOS 6.22. Malheureusement, quoi que je fasse, la carte de son interne ne fonctionne pas. Mais à présent le silence n'est plus! Grâce au pilote résident « adlipt », les logiciels croient désormais qu'une carte Adlib est présente.

Voici le montage branché sur le portable:



Quelques tests rapides avec AdLib Jukebox:
En action avec AdLib Jukebox

En action avec AdLib Jukebox

En action avec AdLib Jukebox

En action avec AdLib Jukebox

En action avec AdLib Jukebox

En action avec AdLib Jukebox


adlipt

adlipt





Photos 2005

Tout d'abord, voici une vue d'ensemble de mon montage:
J'ai choisi d'utiliser un 'backplane' ISA pour ne pas abimer ma carte en soudant les fils directement dessus. L'alimentation provient de la source de courant d'un magnétoscope. Il a fallu des régulateurs pour les alimentations +12 et -12 volts car le power supply n'en donnait pas. Il y a un signal d'horloge de 14.318 mhz dans le bus ISA, et la carte Adlib en a besoin. J'ai donc construit un oscillateur avec un cristal récupéré d'une vieille carte maîtresse de PC (D'ailleurs, il servait probablement à la même chose).

Le montage vu sous d'autres angles:





Schémas

Voici le schéma principal:


Et voici le schéma de l'oscillateur:
schema oscillateur
Ceci est la première fois que je construisais un oscillateur à cristal. Je sais qu'il existe des façons plus simples de faire cela (sans le transistor) en utilisant seulement un inverseur, mais je n'y suis pas arrivé. Je crois qu'avec des 74hct04 c'aurait été plus facile, mais je n'en avais pas en stock. Vous pouvez construire ce circuit différamment si vous voulez.


Explications

Pour commencer, j'ai regardé de près la carte Adlib pour déterminer quels signaux ISA sont utilisés par la carte. Le tableau ci-dessous resume les signaux ISA qu'il est nécéssaire de gérer pour faire fonctionner la carte, avec quelques explications:
# Contacts ISA Nom Connecter à Direction Utilité
A2 D7 Port parallèle 9 (Data 7) Bi-directionnel Bit de données 7
A3 D6 Port parallèle 8 (Data 6) Bi-directionnel Bit de données 6
...Et ansi de suite...
A9 D0 Port parallèle 2 (Data 0) Bi-directionnel Bit de données 0
A11 AEN 0 volts Vers la carte Validation d'addresse, Utilisé en DMA. La carte adlib ne réponds pas si ce signal est haut.
A22, A23, A24 et A28 A9,A8,A7,A3 5 Volts Vers la carte Bits d'addresse 9,8,7 et 3 (Voir note 1)
A25, A26, A27 et A29 A6,A5,A4,A2 0 Volts Vers la carte Bits d'addresse 6,5,4 et 2 (Voir note 1)
A30 A1 Port parallèle 17 (Select) Vers la carte Bit d'addresse 1 (Voir note 2)
A31 A0 Port parallèle 1(Strobe) Vers la carte Bit d'addresse 0 (Voir note 1)
B1,B10,B31 Ground 0 Volts Alim.0 Volts
B3,B29 +5Vdc 5 Volts Alim.Alimentation 5 volts
B7 -12Vdc -12 Volts Alim.Alimentation -12 volts
B9 +12Vdc 12 Volts Alim.Alimentation 12 volts
B30 OSC Sortie de l'oscillateur Vers la carteHorloge de 14,31818 Mhz
B13 /IOW Port parallèle 16 (Init) Vers la carte Lorsque bas, provoque l'écriture de l'octet présent sur le BUS de données à l'addresse sur le BUS.
B14 /IOR Port parallèle 14 (Autofeed) Vers la carte Lorsque bas, la carte gérant l'addresse présente sur le BUS écrit un octet sur le BUS de donnés.
Voici une page résumant tout les signaux ISA et démontrant ou les signaux se situent sur le connecteur:
http://pinouts.ru/data/ISA_pinout.shtml

Explication de l'addressage.
La carte adlib utilise les addresses 0x388 et 0x389. Il y a donc un seul bit qui varie entre 388 et 389. Voici un tableau démontrant cela:
3 8 8
11 1000 1000
Bit 9Bit 8Bit 7 Bit 6Bit 5Bit 4 Bit 3Bit 2Bit 1 Bit 0
3 8 9
11 1000 1001
Bit 9Bit 8Bit 7 Bit 6Bit 5Bit 4 Bit 3Bit 2Bit 1 Bit 0

Ceci explique pourquoi le bit d'addresse #0 est connecté à un signal en sortie du port parallèle (Strobe).

Note 2: Puisqu'il restait encore un signal sortant du port parallèle, j'ai décidé de cabler le bit d'addresse #1, ce qui va me permettre de pouvoir controler une carte utilisant quatre ports d'IO consécutifs.



Logiciel

J'ai écrit une classe C++ qui est utilisable avec adplug pour faire jouer des fichiers adlib supportés par adplug avec ce montage.

Pour tester, j'ai écrit un petit lecteur de musique qui utilise adplug avec ma classe. Le tout fonctionne en ligne de commande.

Il est possible qu'un jour je décide de faire une version plus complexe (plugin xmms?) ou que j'essais d'intégrer ma classe dans adplug. En attendant, voici les sources:
paradlib.tar.gz

Mise à jour 2019: Comme ce montage est compatible avec opl2lpt, les pilotes et jeux supportant prévus pour être utilisé avec l'opl2lpt fonctionnent. Voir le Projet github.


Échantillons de musique

Voici quelques pièces de musiques jouées avec ma carte AdLib:
Fichier oggFichier originalDescription
adlibsp.ogg adlibsp.s3m Musique d'introduction de StarPort BBS, par Purple Motion
monkey1_theme.ogg mi1_theme.laa La musique thème de Monkey Island 1
monkey2_theme.ogg mi2_monkey_island_2_introduction.laa La musique thème de Monkey Island 2
madness-chipmunks.ogg madness-chipmunks.amd Je ne sais pas d'ou viens cette musique mais je l'aime bien.



Liens

Musique:
http://chiptunes.back2roots.org/ Une grande collection de musique de jeu sous plusieurs formats.
http://adlib.superfighter.com/ Captures en format .raw de la musique de plusieurs bons jeux.

Autres:
http://www.iki.fi/jrop/specials/digisnap/ Projet d'electronique permettant d'enregistrer le son sortant de la carte adlib en format digital, pour un maximum de qualité.
http://www.oplx.com/opl2.htm Informations sur la programmation de la puce OPL2.



Avertissement

Je ne saurais être tenu responsable pour les dommages que l'utilisation des informations ou la mise en œuvre des instructions présentées sur cette page pourrait causer à votre équipement, à vous-même ou à autrui. Aussi, je ne donne aucune garantie quant à l'exactitude des informations et à leur fonctionnement.