logo

0: Introduction
Specimens
1: Super Hits-2000 32 in 1 (51-121)
2: 12-IN-1 Ball collection (BC12B01)
3: SUPER 32 IN 1 (US4138)
4: SUPER 33 IN 1 (US996 ROM défoncé)
5: 1997 New collection 32-IN-1
6: Sachen 4B-005
7: SUPER 68-IN-1 (Longcart)
8: SUPER 50-IN-1
9: Noname 12-IN-1
10: SUPER 8-IN-1
11: Game Color Advance 36 in 1
12: Game New Color 32 in 1 (MW-017)
13: SUPER 150 IN 1
14: Game new color 32 in 1 (MW-012)
15: 32 IN 1 (HK5002)
16: Super 11 IN 1
Les derniers specimens sont ajoutés à la fin de cette liste.
Specimen 5: "32 IN 1"

J'ai mis la main sur une "32 IN 1" à 8€ dans une boutique, proposant visiblement Hercules, Hugo, du yoshi et Tetris 2.
Pas de numéro de produit, juste le design pirate classique claqué à l'arrache dans Corel draw (on est en 1997) avec des scans de boites ou des images trouvées je n'sais où.

Le texte en jaune est quasiment impossible à lire:
"With games directly from the... Those who like the hit movie will like game ... Even get to figure...". Surement copié depuis une review sur le jeu Hercules.


On peut voir que l'étiquette de la cartouche sort d'une presse offset, qui était certainement pas faite pour imprimer des formats si petits au départ.

Preuve que les "pirates" avaient des machines faites pour produire en masse, mais pas spécialement adaptées à cet usage.


L'éxterieur de la coque a été partiellement moulé depuis une vraie cartouche.

De l'exterieur tous les détails sont parfaitement conservés mis à part le texte "Gameboy" retiré sur l'avant et le numéro de modèle derrière. Seul le "PAT. PEND." reste, histoire de se moquer un peu.

Pas de vis sur cette cartouche, le moule a été modifié pour que les coques puissent être clipsées et collées. Le pas de vis d'origine a visiblement été limé et on peut voir le chemin en spirale de la fraiseuse pour obtenir l'épaisseur de plastique voulue.


En testant la cartouche sur une Gameboy color, j'ai été accueilli par un menu illisible tellement que les couleurs du texte et du fond étaient proches.
Ils n'avaient surement pas prévu le fait que la Gameboy Color (qui est sortie un an plus tard) allait pouvoir charger des palettes spéciales pour certains jeux en noir et blanc.
Il faut alors faire son choix à l'aide d'une liste de jeux en noir sur fond bleu marine.

La séléction se fait avec les flèches. Les touches A et B permettent de sauter de page (10 jeux par page). Cette fonction de saut peut porter à croire que le code du menu avait été conçu pour pouvoir lister beaucoup plus que 32 jeux, d'autant plus que le défilement avec les flèches est assez lent.

Comme c'est le cas avec de nombreuses cartouches pirates, il n'y a même pas la moitié des jeux annoncés. La liste est remplie avec des doublons aux noms inventés. Certaines cartouches donnent même des noms pour chaque niveau d'un jeu (techniquement plus poussé). Avec cette cartouche, on se retrouve avec 11 véritables jeux au lieu des 32 annoncés.

J'étais curieux de savoir comment ils s'y étaient pris pour programmer ce menu, et comment il dialoguait avec le mapper. La taille des ROMs téléchargés des 11 jeux totalise 1Mo, donc à moins d'avoir quelques ko de mémoire supplémentaire prévus dans le mapper (ça aurait été très surprenant), le code du menu ne peut qu'être inclu au milieu d'un jeu.


Le circuit est minimaliste: un ROM et un mapper tous les deux sous epoxy, aucun composant passif.
Rien de particulier à part sur le mapper: Deux connections laissées flottantes (le jumper et le via dans le cercle rouge), et une zone sans vernis sur A15 (rectangle).

Au départ, je ne connaissais pas la taille du ROM, ni le type du mapper. Cependant, c'était évident qu'il pouvait "décaler" l'adresse du ROM et avait les mêmes fonctionalités qu'un MBC1. C'est le seul mapper dont les jeux de la liste ont besoin pour fonctionner.

Le mapper est connecté à A15 A14 A13, D4 D3 D2 D1 D0, /WR, /CS, A0 (bizarre), et /RESET.
Il peut donc différencier 8 plages d'adresses différentes par pas de $2000.

Un bug dans mon lecteur de cartouches faisait que le /RESET était trop court pour que le faux mapper le prenne en compte. Il conservait alors presque à chaque fois sa dernière configuration (le dernier jeu lancé).


Après quelques moments de frustration, le lecteur a enfin donné un ROM propre des premiers 32Ko.

BGB indique que le checksum global est mauvais, mais que le logo et le checksum du header sont bons (ce sur quoi la Gameboy fait les vérifications).
Le nom interne est "ALLEY WAY", confirmation que le menu est certainement ajouté dans du "vide" du jeu Alley Way.

En essayant de lancer un jeu, le menu est affiché de nouveau. Le code execute alors certainement un simple JMP $100 après avoir configuré le mapper qui ici n'est pas émulé (et de toutes façons, je pouvais pas dumper le reste du ROM sans savoir comment lui parler).


La preuve que le code est inséré dans une copie d'Alley Way se trouve avec Tile Layer. En comparant simplement le ROM du vrai jeu et le dump de la cartouche pirate, on voit qu'une grosse zone vide est comblée avec un alphabet en 1BPP et du code (en rouge).

Cependant, il n'est pas sûr que ce soit la seule modification apportée à Alley Way.


Un petit utilitaire écrit à l'arrache avec mon Visual Basic adoré a mis en évidence les quelques autres différences. L'image fait 256x128 pixels, soit 32768 pixels qui représentent chaqu'un un octet des deux ROMs à comparer. Un pixel rouge est une différence.

On voit ici une petite différence au tout début (le JMP modifié à l'adresse $101, pour executer le menu au lieu du jeu), l'alphabet et le code ajouté précedement vu dans TL, et une seconde zone plus petite, qui est la liste des jeux et leur numéro de bank, également insérée dans du vide (elle ne tennait pas dans la première grosse zone).


Voici la memory map du ROM, déduite depuis la liste du menu avec les numéros de banks.
Il y a 8 jeux de 32Ko, 2 jeux de 128Ko et un jeu de 512Ko.

Les numéros de bank en noir sont ceux qui correspondent à la table de démarrage du menu. C'est la valeur qui est envoyé par paire de bits au mapper.

Je ne met pas à disposition le ROM entier de la cartouche puisqu'il contient des jeux commerciaux, mais voici la source commentée du menu:

Source du menu en assembleur Z80 (En RTF avec des jolies couleurs).

Contactez-moi si vous avez besoin du binaire propre, ou d'un dump avec les adresses corrigées.


 

Dump: ROM du menu (32Ko).

Trucs remarquables dans le code du menu:

Met la routine d'attente DMA classique en HRAM, mais ne s'en sert pas.
Active les interruption et la window, mais ne s'en sert pas non plus.
La window est mise hors-champ au lieu d'être désactivée.
L'écran est éteint deux fois au démarrage.
Utilise seulement $D000 et $D003 en RAM.
Les touches A et B sont lues deux fois, mais les touches haut/bas sont lues 8 fois.
Le déplacement dans le menu se fait avec une pause entre chaque lecture de touches.

Ca porte beaucoup à croire que le code est partiellement pompé depuis des vrais jeu.

Le changement de bank se fait depuis 128 octets de code copié et lancé en RAM.
Comme le menu est inséré dans une zone vide d'Alley Way et réside donc dans la bank 0, le code fait un JMP $150 au lieu d'un JMP $100 quand on choisit ce jeu.

Bank (*8Ko) Titre dans le menu Commentaire inutile
10
HERCULES
0C
HUGO
08
MARIO WORLD 4
01 DR. MARIO
00 ALLEY WAY
02 BATTLE CITY
03 OTHELLO
04 TENNIS
05 WORLD BOWLING
06 SNAKE
07 TETRIS
10 DECULUS // Limite obscène
0C HUGO SPACE // Un nouvel espace en maths
08 SUPER MARIO IV // J'ai cru qu'IV c'était 4
01
MR. DOCTOR
00 EASY ALLEY WAY // Aucune différence
02
BIG TANK
03 OTHELLO PRO
04 SUPER TENNIS // Super méga pro HD titanium
05
ROLL BALL // Au bowling, on ROLL sa BALL
06 KING EGG // N'importe quoi
07 CLOUMNS // Columns dyslexique
10
STRIVE II // Aucun rapport
0C HUGO II
08
MARIO OF DREAM // C'est charmant !
01 VIRUS
00 RUN AWAY
02 TANK VS TANK
03 OTHELLO 96
04 TENNIS MAN
05 ROLL BALL 2 // Manque d'inspiration sur la fin
06 SNAKE 2

 

Pour émuler le MBC1, il doit au moins gérer

Le menu sert à donner le "point de départ" dans le ROM. Le rôle du mapper va être de faire "voir" à la gameboy qu'une partie du ROM.

Le mapper implémente tous les registres du MBC1 et en fournit un supplémentaire, sur la plage $0000 à $2000. Le menu écrit dedans avec l'adresse $1000.
Au lieu de le charger bêtement avec le numéro de la première banque du jeu à lancer, il faut le charger 2 bits par 2 bits (peut être que 6 bits de pris en compte, pas 8).
Le format est le suivant: 0000PPVV, avec V les 2 bits et P leur poids.

0 dans $2000 (Reset latch)
0 dans $1000 (Première paire)
4 dans $1000 (Deuxième paire)
8 dans $1000 (Troisième paire)
16 dans $2000 (Clock latch)
0 dans $2000 (Reset latch, pas nécessaire, vérifié au Game Genie)

footer
symbol symbol symbol symbol symbol