J'ai conçu un lecteur/programmeur pour les cartouches de jeu et cartes pour l'écosystème
Sega Master System / Mark III / GameGear. Mon but avant tout était de pouvoir
programmer facilement les cartouches SMS et GameGear de ma conception, mais en tant que
lecteur, mon montage me permet également de transférer le contenu des ROMs des jeux
de ma collection vers mon PC pour y jouer à l'aide d'un émulateur.
Les fonctionnalités actuelles de mon projet sont les suivantes:
Support des cartouches SMS à 50 broches (Europe et Amériques)
Support des cartouches SMS-J/Mark-III à 44 broches (Japon)
Support des cartouches pour Game Gear (grâce à un adaptateur)
Support des cartes Sega / Mycard (à l'aide d'un "Card Catcher")
Support des cartouches SG-1000
Communication USB (type CDC-ACM, i.e. port série virtuel)
Auto-détection de la taille des jeux et téléchargement par XModem
Support du mapper style "Sega"
Programmation des cartouches flash basées sur la puce MX29F040
Il vous en faut un? Cet outil est disponible dans ma boutique en ligne.
Jeux SMS à 50 et 44 broches
Mon montage comporte deux fentes, une pour chaque type de cartouche. Il y a peu à dire. L'important est
d'insérer la cartouche dans la bonne fente!
Exemple avec une cartouche nord-américaine
Exemple avec un jeu japonais
Support Game Gear
Mon circuit ne comporte pas de connecteur dédié pour les jeux Game Gear, mais j'ai conçu un adaptateur
qui passe par le connecteur à 50 broches:
Exemple de lecture d'un jeu Game Gear
L'adaptateur pour jeux Game Gear
N'arrivant pas à me procurer des connecteurs Game Gear neufs (originaux ou pas) j'ai acheté
sur un site d'enchères une console en état "perte totale" ou presque. Crasse, rouille,
dégâts de piles, mauvais condensateurs... tout était au rendez-vous. Par chance, le connecteurs
de cartouche était récupérable!
Si vous connaissez un endroit où l'on peut se procurer des connecteurs de cartouche Game Gear
neufs (ou remis à neuf) veuillez m'en faire part! J'aimerais bien pouvoir offrir cet adaptateur
en version déjà assemblée.
En attendant, les circuits imprimés sans connecteur sont
disponibles dans ma boutique, pour ceux qui d'une manière ou d'une autre
sont en possession d'un connecteur Game Gear et aimerait se fabriquer un adaptateur.
Bare PCB, component side
Circuit, côté soudures
Support des cartes Sega / Mycard
Mon montage n'a pas de fente dédiée pour les cartes Sega / My Card, mais ces cartes peuvent
tout de même être lues en utilisant un Card Catcher:
Exemple utilisant un Card Catcher
Support SG-1000
La fente pour cartouche à 44 contacts permet également de lire les jeux SG-1000. (Et très probablement
les cartouches pour SC-3000 aussi)
Lecture d'un jeu SG-1000
Interface graphique en Python
Attention: Ne jamais changer les cartouches alors que le montage est sous tension (fil USB branché)
Il existe désormais une interface graphique construite à l'aide de PySimpleGUI. Pour l'instant, elle n'a
été testée que sous Linux et est distribuée sous forme de code source seulement, mais un jour je compte faire
quelque chose de plus facile en utilisant pyinstaller par exemple. Pour démarrer l'interface, assurez-vous
d'avoir les packages python requis d'installés et exécutez client/smsp.py.
En cette date, les caractéristiques de l'interface sont:
Peut lire les ROMs des cartouches de jeu
Peut effacer, programmer et vérifier les cartouches flash supportées
Affiche le contenu du fichier chargé ou lu depuis la cartouche en format hexdump
Affiche un MD5 pour aider à valider un dump.
Lire un ROM (méthode manuelle)
Attention: Ne jamais changer les cartouches alors que le montage est sous tension (fil USB branché)
Ce circuit se branche à un PC par un port USB et fonctionne en tant que port série virtuel. Sous Linux,
un character device tel que /dev/ttyACM0 devrait apparaître dès que vous branchez le montage. Sous Mac, c'est
le même principe, mais le character device portera un autre nom. Sous Windows 10, ce sera COM-quelque-chose.
Il s'agit ensuite de lancer votre logiciel de communication favori (par exemple, minicom sous Linux) et de le configurer
pour accéder au port série virtuel correspondant au montage. Vous pourrez alors interagir avec le firmware à l'aide
de commandes clavier simples. Tapez ? puis sur entrée afin d'obtenir de l'aide:
> ?
Supported commands:
boot Enter DFU bootloader
reset Reset the firmware
init Init. mapper hw, detect cart size, detect flash...
r addresshex [length]
dx Download the ROM with XModem
ux Upload and program FLASH with XModem
ce Perform a chip erase operation
>
Avant d'utiliser la commande dx qui permet de télécharger le contenu du ROM de la cartouche vers votre
PC, vous devez utiliser la commande init qui devrait détecter la taille du jeu.
La taille du jeu est déterminée en détectant à partir de quelle banque de 16 ko le contenu semble se répéter.
Pour le moment cela fonctionne avec tous les jeux que j'ai utilisé, mais je prévois permettre de forcer une
taille manuellement dans une version à venir du firmware. (Selon les demandes que je recevrai)
> init
54 4d 52 20 53 45 47 41 4d 57 eb 74 04 51 00 4c
Bank 0 CRC: c1b6, first byte f3
Bank 1 first byte: 45
Bank 2 first byte: 00
Bank 4 first byte: 00
Bank 8 CRC: c1b6
ROM size set to 131072
Cartridge type: ROM
>
> dx
Dumping the rom using XMmodem. 1024 blocks.
Please start the download... CTRL+C to cancel.
Il faut alors démarrer un téléchargement XModem dans votre logiciel de télécommunication. Sous Linux avec minicom, il suffit de faire CTRL+A, appuyer sur R, choisir le protocole XModem et donner un nom au fichier (p. ex: jeu.sms) pour lancer le téléchargement.
Lire un ROM (script python)
J'ai également écrit un petit script simple en python qui permet d'automatiser les étapes de la section
précédente. Le script est nommé dumpcart.py, et l'aide (argument -h) est en ce moment comme suit:
usage: dumpcart.py [-h] [-i] [-r OUTFILE] [-p INFILE] [-d DEVICE]
Dump/Program tool for smscprogr
optional arguments:
-h, --help show this help message and exit
-i, --info Provide information about the cartridge
-r OUTFILE, --read OUTFILE
Read the cartridge contents to a file.
-p INFILE, --prog INFILE
(Re)program the cartridge with contents of file
-d DEVICE, --device DEVICE
Use specified character device.
À titre d'exemple, voici la commande que je tape pour lire une cartouche sous Linux:
./dumpcart.py -d /dev/ttyACM0 -r superjeu.sms
Le script est plutôt bavard pour le moment, car je tiens à avoir le plus d'information
possible si jamais quelque chose ne fonctionne pas. Mais si tout va bien, à la fin le fichier
superjeu.sms sera créé, et il sera possible de la passer en argument à une émulateur,
tel que higan, meka ou autre...
Programmer un ROM (méthode manuelle)
Via votre logiciel de communication (par exemple, minicom sous Linux) il faut d'abord
taper la commande init, qui devrait détecter qu'il s'agit d'une cartouche reprogrammable
plutôt que d'un ROM. (La dernière ligne de l'extrait ci-dessous le confirme)
> init
init 54 4d 52 20 53 45 47 41 ff ff 51 8a 99 99 00 4c
Bank 0 CRC: da45, first byte f3
Bank 1 first byte: 78
Bank 2 first byte: dd
Bank 4 first byte: 44
Bank 8 CRC: da45
ROM size set to 131072
Cartridge type: FLASH. Manufacturer ID=0xc2, Device=0xa4 => MX29F040 (supported)
La taille détectée pourrait être inexacte (c'est le cas ici, puisqu'il s'agit d'une
cartouche de 512 ko, et pas seulement 128 ko) mais cela n'a pas d'importance pour l'upload.
Avant l'écriture, il faut effacer le contenu de la cartouche (de la puce flash qu'elle contient en fait)
en utilisant la commande ce (Chip Erase):
> ce
Erasing chip...
Done.
>
Cela prends normalement quelques secondes. Ensuite, il s'agit de télécharger un ROM (fichier .SMS ou .GG)
vers la cartouche. Pour ce faire, démarrez l'upload à l'aide de la commande ux:
> ux
READY. Please start uploading.
Ensuite lancez le téléchargement XModem à l'aide de votre logiciel de télécommunication. Par exemple,
avec minicom sous Linux, il s'agit de faire CTRL+A, ensuite S (pour Send), choisir XModem et puis le fichier.
La puce flash de la cartouche est programmée pendant le téléchargement. Lorsque celui-ci prends fin, la cartouche
est programmée.
Important: N'oubliez pas de débrancher le câble USB avant de retirer la cartouche!
Programmer un ROM (script python)
J'ai également écrit un petit script simple en python qui permet d'automatiser les étapes de la section
précédente. (Voir aussi la section "Lire un ROM (script python)")
Pour programmer un jeu, par exemple, mon homebrew donkey.sms, j'utilise simplement la commande
suivante:
./dumpcart.py -d /dev/ttyACM0 -p donkey.sms
Le script se charge d'effacer la flash (commande ce), de lancer l'upload (commande ux) et
de transférer le contenu du fichier passé en paramètre (ici donkey.sms) par le protocole XModem.
Sending command: ce
ce
Erasing chip...
Done.
>
Starting upload
Sending command: ux
Uploading
Upload completed with success.
Sending command:
Done.
Lorsque le script prends fin, la programmation est terminée. Essayez votre jeu!
Important: N'oubliez pas de débrancher le câble USB avant de retirer la cartouche!
Programmation d'une cartouche raphnet.
Le jeu programmé et fonctionnel!
Firmware
Mon souhait en fournissant un firmware open-source est de faciliter la vie à quiconque souhaiterait
améliorer ou modifier ce projet selon leurs besoins (supporter d'autre type de flash, un autre type de
mapper, etc) puisse le faire faire immédiatement et sans trop obstacles.
Cela dit, n'hésitez pas à me contacter s'il y a un problème ou une fonction que vous souhaiteriez avoir! Je verrai
ce que je peux faire.
Ce projet est aussi disponible sur GitHub! Pour suggérer de nouvelles fonctionnalités, signaler un problème ou contribuer au projet,
vous pouvez m'écrire ou utiliser le dépôt GitHub: https://github.com/raphnet/smscprogr
Mettre le firmware à jour
Le firmware est programmé dans le micro-contrôleur en utilisant le bootloader DFU d'atmel. Sous linux,
il suffit d'utiliser dfu-programmer. Cet exemple est basé sur Linux, mais dfu-programmer existe également
pour Windows.
Étape 1: Mettre le circuit en mode "boot loader"
dfu-programmer s'attends à communiquer avec le bootloader DFU d'atmel. Il faut donc transmettre la commande
boot pour demander au firmware d'exécuter le bootloader. Dès l'exécution de cette commande, le port
série virtual disparaîtrera et votre logiciel de communication affichera sans doute une erreur. Mais
pendant ce temps, le micro-contrôleur réapparaitrera sur le BUS USB sous une autre identité, celle
d'un micro-contrôleur Atmega32u2 en mode bootloader.
Étape 2: Effacer, programmer et démarrer l'application
Ignorez votre logiciel de communication s'il est en erreur, et ouvrez un terminal. Il s'agit alors
d'utiliser dfu-programmer pour effacer d'abord, reprogrammer ensuite, et puis démarrer le nouveau firmware.
Sur un système Windows 10 typique, le programmeur sera disponible sur COM3.
Je recommande d'utiliser le logiciel Tera Term pour communiquer avec le programmeur.
Tera Term est disponible ici: https://ttssh2.osdn.jp/index.html.en
Les commandes à taper (init, ce, ux, dx, etc...) sont telles qu'exposé plus haut. Lorsque vient le temps
de transférer un fichier (programmation ou lecture de cartouche) il suffit de faire démarrer le transfert
XMODEM dans la bonne direction à partir du menu File->Transfer->XMODEM:
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.