Documentation sur le Mega CD
Introduction:
Cette fabuleuse console qu'est le MegaCD n'a pas connu beaucoup de succès lors de son existence.
De plus une émulation parait assez limitée tant qu'aucune information sur la constitution même d'un ISO n'est pas publiée, et c'est ce qu'il se passe pour elle! Après de nombreuses recherches, il n'y a que le programme SCDConv de Flavio (à Eidolon's Inn) qui peut manipuler et convertir les ISOs.
Pourquoi un manque de documentation si important? Aucune idée... :)
Il en restera que j'aurai pensé mettre beaucoup moins de temps pour récupérer toutes les informations que j'ai découvert et que vous allez découvrir, mais le entêtes des jeux MegaCD sont vraiment riches, et preuve en est qu'ils sont très aboutis par opposition aux quelques autres consoles qui allaient utiliser le format CD un peu plus tard...
Les protections territoriales(contrées: U(USA), E(Europe), J(Japon)):
Ici se trouve la seule et unique protection des jeux MegaCD, nul besoin de puces ou de switchs pour lancer un nouveau jeu sur votre console préférée, un "simple" changement dans l'entête de l'exécutable suffit à faire croire à la console que le jeu en question appartient bien à la même zone territoriale qu'elle.
Pis, une copie de sauvegarde d'un CD orginal va pouvoir, une fois gravée, foncionner sur une console(toujours non modifée) sans effort...
Les routines des différentes contrées:
Pour permettre à un exécutable de passer la protection territoriale, un code récurrent a été trouvé enfoui toujours dans ce fameux entête. Chaque contrée a une routine associée dont la taille et le contenu sont tous deux différents... C'est ici grâce à l'aide de Flavio que nous pourrons tirer parti de son travail pour injecter les routines spécifiées dans les ISOs MegaCD.
Mais que contient cet entête!!!:
Eheh, c'est en effet la question que tout le monde se pose(du moins ceux qui s'intéressent aux architectures de leur console...et nous allons tenter d'y répondre. Si vous avez une documentation *officielle* il serait plus que temps d'en parler! Sinon si vous décellez une erreur n'hésitez pas à me le signaler :)
Offset Identifiant Taille(octets) Description
0x000 Boot System 0x10 Doit être obligatoirement "SEGADISCSYSTEM "
0x010 CD Type 0xB Apparement les développeurs y mettent ce qu'ils veulent
0x01B Réservé 0x1
0x1C Volume System 0x2
0x1E Volume Type 0x2
0x20 System Name 0xB
0x2B Réservé 0x1
0x2C System Version 0x2
0x2E Réservé 0x2
0x030 Initial Pointer Address 0x4
0x034 Initial Pointer Load Size 0x4
0x038 Initial Pointer Entry 0x4
0x03C Initial Pointer Work Size 0x4
0x040 System Pointer Address 0x4
0x044 System Pointer Load Size 0x4
0x048 System Pointer Entry 0x4
0x04C System Pointer Work Size 0x4
0x050 Réservé 0xB0 Uniquement des espaces (0x20 en héxadécimal), il apparaitrait que les développeurs y mettent une date...
0x100 Needed System 0x10 Console requise, doit ici être "SEGA MEGA DRIVE ", en existe-t-il d'autres?
0x0110 Copyright 0x10 Année et mois du lancement du jeu
0x120 Domestic Name 0x30 Nom local du jeu, peut contenir des Kanji
0x150 Overseas Name 0x30 Nom du jeu distribué dans le monde entier
0x180 Game Type 0x3 Sa valeur est "GM " pour les jeux...
0x184 Reference 0x7 Référence du jeu comme sur la couverture
0x18A Version Header 0x2 Toujours " -", car va suivre le numéro de version
0x18C Version 0x2 Un nombre du type "XX"
0x18E Réservé 0x2
0x190 IO Data 0x10 J pour Joypad
4 pour MultiTap
6 pour Joypad-6
0 pour MasterSystem Joypad
K pour Keyboard
R pour Serial RS232C
P pour Printer
T pour Tablet
B pour TrackBall
V pour Paddle Controler
F pour Floppy Disk Drive
C pour CD Rom
L pour Activator
M pour Mouse
A pour Analog Joystick
0x1A0 Réservé 0x50
0x1F0 Country Code 0x10 "J" pour Japon
"E" pour Europe
et naturellement "U" pour USA
Où se situe ainsi le problème?
Nous apercevons très bien une variable de la structure qui se nomme Country, et l'on pourrait penser qu'un simple changement de ce caractère pourrait entraîner la reconnaissance du jeu dans la contrée voulue, mais il n'en est RIEN.
La preuve peut se faire par SCDConv, où tout changement de variable n'entraînera la reconnaissance du jeu dans son émulateur favori(qui a dit Gens :)), car graver un jeu qui ne marche pas n'est pas la meilleure chose à faire...
Je n'ai pas essayé de flancer sur ma console un jeu modifié avec une variable de contrée qui ne correspond pas(le comportement d'un émulateur ne peut en AUCUN cas nous en lever l'incertitude car le fonctionnement peut(et c'est souvent le cas) ne pas correspondre totalement), mais nul ne peut savoir s'il n'y a pas aussi ici une vérification.
Ainsi la protection va être sous la forme de routines, typiques à chaque contrées, que nous allons emprunter à l'utilitaire de Flavio, tout en regrettant le fait que la conversion Japonaise ne marche pas encore entièrement (10% d'après Izlude d'EmuArena)...
(Vous pourrez trouver sur dev-fr.com les routines sous forme de fichier binaire pour l'Europe, les USA et le Japon, pour étudier plus tranquillement ces routines.)
Comment les insérer:
En effet cela pose problème car après identification de l'origine de l'ISO, il va falloir remplacer la routine locale par celle qui correspond à la contrée voulue. Et que de malchance, les routines ne sont pas de la même taille...alors que faire?!
Il semblerait que la solution actuelle soit de remplir l'espace qui pourrait se trouver vide par n'importe quelle donnée arbitraire. Les conversions US<->Europe sont relativement simples, il n'y a pas à se soucier de l'écart relatif entre les données avant et après conversion(qui est faible), mais pour les conversions de type Reste du Monde<->Japon les données doivent être réallouées dans l'entête, car il y a un écart assez fort.
Nous ne nous étondrons pas sur cet étude qui peut s'avérer longue tant la routine Japonaise peut être complexe et différente par rapport aux deux autres. La préoccupation dans cet première étude reste de se familiariser avec ce format de fichiers pour s'outiller, et pourquoi pas créer un émulateur, un Boot CD (comme pour les jeux Dreamcast) et surtout faciliter la programmation amateur.
Et maintenant?
Je me pencherai sur le programme de conversion et distribuerai le résultat une fois les conversions possibles, en espérant trouver encore plus de choses intéressantes :)
Je remercie Izlude d'Emuarena pour son aide et son soutien, ainsi que toutes les personnes présentes sur la scène émulation et programmation amateur toutes consoles confondues.
Merci aussi à vous gentils lecteurs de m'avoir lu et j'espère que ce tutorial s'avère compréhensible(le soir c'est assez dur de penser lol).