Carte AdLib sur port parallèle
Contenu
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:
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:

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 carte | Horloge 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
|
1 | 1 |
1 | 0 | 0 | 0 |
1 | 0 | 0 | 0 |
Bit 9 | Bit 8 | Bit 7 |
Bit 6 | Bit 5 | Bit 4 |
Bit 3 | Bit 2 | Bit 1 |
Bit 0 |
3
| 8
| 9
|
1 | 1 |
1 | 0 | 0 | 0 |
1 | 0 | 0 | 1 |
Bit 9 | Bit 8 | Bit 7 |
Bit 6 | Bit 5 | Bit 4 |
Bit 3 | Bit 2 | Bit 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 ogg | Fichier original | Description |
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.