Lecteur/programmeur de cartouche de jeu SMS / Mark-III

Résumé

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 une cartouche nord-américaine

Exemple avec un jeu japonais

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

Exemple de lecture d'un jeu Game Gear

L'adaptateur pour jeux 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

Bare PCB, component side

Circuit, côté soudures

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

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

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.

Programmation d'une cartouche raphnet.

Le jeu programmé et fonctionnel!

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.

Version 1.0
5 février 2021 (Vendredi)
  • Première publication
Fichier(s):
smscprogr-1.0.hex (32.8 KB)
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.
dfu-programmer atmega32u2 erase
dfu-programmer atmega32u2 flash smscprogr-1.0.hex
dfu-programmer atmega32u2 start



Windows

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:

Tera Term upload/download menu


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.