Une cartouche regroupant
toutes les cartouches MO5 existantes et même plus.
Tout ceci avec un menu de sélection intégré.
Au commencement il
s'agissait de recréer les cartouches MEMO5, parce que les cartouches
originales
sont devenues très rares à trouver.
Tracé d'un PCB reproduisant les MEMO5 originales, et après les tests
fonctionnels, je me suis dit pourquoi pas créer une cartouche
regroupant tous les softs MEMO5.
Donc création d'un
prototype multirom.
Premier
test avec une 27512 partitionnée en 4 banques, ça fonctionne impeccablement.
Techniquement
c'est très simple :
J'utilise un CPLD pour décoder l'adresse $A8FF et paginer sur l'EEPROM.
Cela permet de réduire le nombre de composants et donc la taille de la
carte.
Je suis loin d'être un expert et de tout maîtriser, mais j'arrive à
réaliser ce dont j'ai besoin.
Quand j'ai découvert les CPLD j'utilisais la partie schématique, ça
fonctionne très bien mais demande beaucoup plus de temps.
Ensuite j'ai commencé à me former au VHDL et maintenant je l'utilise
plus facilement surtout lorsqu'il s'agit de seulement décoder et
paginer sur une eeprom.
J'ai
donc programmé le CPLD avec du code VHDL.
C'est très simple, il suffit de commencer par déclarer les signaux
utiles, qui seront évidemment connectés au I/O du CPLD.
Dans le cas présent on a besoin des ADRESSE, des DATA, du signal E, du signal RW et des signaux que j'ai
nommé PAGE pour
paginer sur l'eeprom, bien entendu il faut indiquer si ce sont des
signaux IN, OUT ou INOUT et leur format.
On aurait pu tout aussi bien pour les adresses et datas déclarer un à
un les signaux A0,A1,A2 ... D0,D1.. mais ce serait vraiment trop long
et inutile.
La
partie déclaration des divers signaux :
--
MO5 Multirom
-- (c) 2021 by 6502man
--
-- entity MO5_MultiRom is PORT (
adrs
: in std_logic_vector(15 downto
0); -- [A15-A00}
data
: inout std_logic_vector(4
downto 0); -- [D4-D0]
E
: in
std_logic;
RW
: in
std_logic;
page
: out std_logic_vector(4 downto 0)
); end;
Après
les déclarations il nous faut passer par la partie principale, qui
consiste à décrire le comportement du CPLD.
Une simple ligne de code suffit à décoder l'adresse et réalise la
pagination sur l'EEPROM.
Le
corps principal du programme :
architecture
behavioral of MO5_MultiRom is begin page <= data when ((adrs = x"A8FF") and
(RW = '0') and (E = '1')) ; end behavioral;
Imaginez la version schématique de ce code VHDL et vous comprendrez
l'avantage d'utiliser la version codée en VHDL ;)
Puisque
le prototype est fonctionnel, l'étape suivante est de créer un PCB
définitif.
L'objectif est de réaliser un PCB le plus compact possible, avec
seulement 2 composants mais cela nécessite beaucoup de pistes partagées
avec le bus MO5 pour les 16 adresses et 8 datas.
Il y a aussi 2 condensateurs CMS placés de l'autre côté du PCB.
Finalement,
le PCB est légèrement plus grand que les MEMO5 16Ko originaux.
Un aperçu de la taille des PCB comparativement à l'original (au milieu):
Ensuite
il me faut programmer un menu pour le MO5.
Je choisis de faire
une sélection par menu, classée par type de logiciel, jeux, educatif,
langage,...
Avec une petite animation de couleurs ;)
Le catalogue complet des cartouches MO5 existantes est inclus sur
l'EEPROM (29) et j'y ajoute 2 jeux que j'ai converti pour l'occasion
en version trainer :)
Comme
je trouve que le nombre de jeux en version cartouche est très limité,
je me lance dans la conversion de plusieurs jeux k7 en version ROM 16Ko.
La première difficulté est la taille limitée de la cartouche (16 Ko),
ensuite le plus compliqué est de trouver l'adresse d'entrée du
programme assembleur.
Comme beaucoup de jeux utilisent les 32Ko de RAM, il m'a fallu
compresser les données pour pouvoir les stocker dans les 16Ko de ROM,
pour ça j'utilise exomizer, et pour la décompression j'ai repris le
code du groupe PULS fourni avec exomizer, merci à eux.
Ensuite certains jeux chargent un "décor" écran avant le jeu et donc
situé en RAM vidéo (2 x 8ko) il m'a fallu là aussi ruser pour pouvoir
rentrer tout ça dans les 16ko et encore une fois compresser 8Ko (le
résultat est très bon sur les données images).
Tout en ayant seulement 16Ko au total pour chaque ROM donc le programme
+ les données écrans (pour quelques jeux) c'est très très juste
mais j'y suis arrivé.
Et pour finir je me suis dit pourquoi pas faire une version trainer
pour certains jeux (cela me rappelle ma grande époque C64), je n'ai
d'ailleurs rien trouvé sur le net concernant des versions avec vies
infinies ou autre pour les jeux Thomson !!!
L'émulateur DCmoto m'a bien aidé dans toutes ces tâches, encore merci
à Daniel pour ces excellents émulateurs.
Pourquoi
ne pas proposer un utilitaire qui nous permettra de réaliser notre
propre sélection de ROMs.
J'ai
donc créé un petit programme windows nous permettant de sélectionner
jusqu'à 31 logiciels ROMs en incluant un menu qui sera
adapté à notre sélection.
Une fois la sélection terminée on peut créer un fichier eeprom qu'il
suffit de graver sur l'eeprom W27C040 de la cartouche MULTIROM, et
ensuite il ne nous reste plus qu'à profiter de ces logiciels sur notre MO5.
Attention : les fichiers à
utiliser ne sont pas les ROM que l'on trouve sur internet, mais le
format doit être celui des EPROMs, que vous pouvez trouver plus bas sur
cette page.
Cet utilitaire intègre un menu pour sélectionner les 31 ROMs, il sera
évidemment inclus dans le fichier EPROM produit et chaque choix
contiendra le nom de la ROM, comme présenté dans l'utilitaire réparti
en 3 pages.
Pour
finir voici 2 vidéos vous présentant le fonctionnement de cette
cartouche MEMO5 MULTIROM :
Conclusion: Ça a été l'occasion encore une fois de mettre en œuvre un CPLD sur
nos vieux micros :)
Et je dois dire que j'ai quand même été surpris que mon prototype
avec des fils volants fonctionne du premier coup.
Je m'attendais à débugger à coup d'oscillo et d'analyseur logique, mais
non même pas un faux contact :)
J'aurais
pu très simplement rajouter 512Ko de RAM et d'autres fonctionnalités
sur la cartouche assez facilement, il reste des I/O de libres, mais ce
sera pour un autre projet ;)
Et puis comme aucun soft n'utilise ni l'extension de RAM ni d'autres
fonctionnalités, ça n'aurait pas servi de toute manière.