[NES] Etendre la taille d'un jeu avec mapper MMC3

Foire aux questions et tutoriels
Avatar de l’utilisateur
rid
Dieu Suprême du flood
Messages : 2020
Inscription : 04 janv. 2005, 22:17
Contact :

[NES] Etendre la taille d'un jeu avec mapper MMC3

Message non lu par rid » 05 déc. 2009, 10:18

Alors, voilà une petite description de la manipulation que je viens de réaliser avec succès pour étendre la taille d'une ROM NES de jeu utilisant un mapper MMC3 (ce qui signifie qu'elle ne s'appliquera a priori que sur les jeux présentant le même type de mapper).

Tout d'abord, trouver un jeu utilisant le mapper sus-mentionné. Pour cela, deux manières :
  • Ouvrir le jeu à tester avec FCEUX SP et aller directement dans le menu Help >> Message Log. Si dans les infos, vous voyez marqué "Mapper: 4", BINGO, vous avez trouvé votre ROM!
  • Analyser l'entête iNES de la ROM avec un éditeur hexadécimal. Je vais pas faire le cours complet sur l'iNES, mais sachez qu'il suffit de prendre les 4 bits de poids faible du 7ème octet, et de les associer au 4 bits de poids fort du 8ème octet. Cela donne un index dans la liste des mappers. Pour le MMC3, il faut que l'association des 8 bits forme l'octet 04 ou %00000100 en binaire.
Pour mon exemple, je me base sur la ROM "Cat Ninden Teyandee (J).nes".
Si on analyse l'entête iNES avec un éditeur hexadécimal, on remarque qu'on a 8 au niveau du 5ème octet. Cela signifie simplement que le jeu comporte 8 banks de PRG (programme) de 16Ko. En allant, un peu plus loin, c'est-à-dire au niveau du 6ème octet, on lit 10. Cela signifie que le jeu comporte aussi 16 banks de CHR (graphismes) de 8Ko.

L'objectif de la manoeuvre est détendre la partie PRG.

Bref, une chose important à savoir quand on s'amuse à bankswitcher la PRG avec un mapper MMC3, c'est qu'il utilise toujours les deux dernières banks de 8Ko de PRG. Elles sont toujours présentes dans l'espace d'adressage du CPU, on dit qu'elles sont fixes, bien qu'elles peuvent se trouver à des adresses CPU différentes. Mais bref, il faut simplement retenir que :
  • Le MMC3 utilise deux banks de PRG de 8Ko fixes
  • C'est deux banks sont toujours les deux dernières banks de 8Ko de PRG
C'est tout ce que vous aurez à savoir sur le MMC3, maintenant la pratique :D.

Comme je l'ai dit plus tôt, Cat Ninden Teyandee possède 8 banks de 16Ko de PRG. Par conséquent, si on ouvre la ROM avec un éditeur hexadécimal. On sait d'office qu'on trouvera l'intégralité du code PRG entre les offsets 0x000010 et 0x02000F (si on tient compte de la présence du header iNES) (Le reste des octets correspond donc au code CHR pour la petite histoire).
Si l'on divise l'espace du code PRG en zone de 16Ko (les banks), on obtient :
  • Bank 0: de 0x000010 à 0x004010
  • Bank 1: de 0x004010 à 0x008010
  • ....
  • Bank 7: de 0x01C010 à 0x02000F
Et comme vous êtes malin et que vous savez que 16Ko == 8Ko * 2, vous aurez certainement compris que les deux dernières banks de 8Ko de PRG se trouve dans la dernière bank de 16Ko!!!

PETITE CHOSE A SAVOIR SUR LA NES:
Les puces ROM doivent avoir une taille d'une puissance de deux : 8Ko, 16Ko, 32Ko, ..., 128Ko, 256Ko, 512Ko. On ne peut pas aller au dessus de 512Ko pour une puce ROM PRG avec le MMC3. C'est la limite de taille à ne pas dépasser!!!

Par conséquent, comme j'ai envie d'augmenter ma partie PRG qui fait actuellement 128Ko (16 Ko*8 banks), il faut donc que je double sa taille pour obtenir 256Ko.
Alors c'est partie, on prend un éditeur hexadecimal, et on se débrouille pour insérer 128Ko à l'offset 0x020010! Vous avez deux minutes.

--2 min plus tard...

Bon ça y est, la taille de votre ROM a été augmentée de 128Ko. Si vous avez rajouté des 00 lors de l'insertion, vous vous retrouvez maintenant avec une belle série d'octets 00 entre les offsets 0x020010 et 0x4000F. Et si tout s'est bien passé, à l'offset 0x40010, vous vous trouvez au début de la partie PRG qui aura été décalée par l'insertion.

Augmentez le nombre de banks de 16Ko de PRG dans l'iNES. On est passé de 8 banks à 16($10 en hexa)!
Pour info, l'iNES header ne sert à rien sur une vraie cartouche, il est simplement utilisé par les émulateurs pour préciser les infos concernant la ROM. Si je vous demande d'augmenter le nombre de banks, c'est simplement pour faire les choses bien :)

Lancez la ROM avec un émulateur....
Et non, je vous ai eu, ça ne marche toujours pas! :tomate: :fouet: ! C'est simplement, parce que pour l'instant, quand le CPU charge les deux dernières banks de 8Ko de PRG dans son espace d'adressage, il ne va plus chercher la bank 7 (de 0x01C010 à 0x02000F) mais la bank 15(de 0x03C010 à 0x04000F) qui est pour l'instant remplie de 00!!!!

Vous avez donc compris : copiez la bank 7 dans la bank 15. Si vous aimez le travail bien fait, videz la bank 7 en la remplissant de 00.

Lancez la rom... ça marche?! J'espère pour vous, sinon ça veut dire que vous avez mal écouté :fouet:

Et voili, voilà, une jolie ROM bien agrandie et tout ça sans trop d'effort. Il ne vous reste plus qu'à jouer avec vos banks maintenant pour faire ce que vous voulez :-o

NB: J'espère avoir été clair dans mes explications. Je n'ai pas eu envie d'aller trop dans le technique car je maîtrise pas suffisamment, et je ne pense pas que ça vous intéresse de toute façon. L'augmentation de la taille est assez conséquente, je vous l'accorde, 128Ko en plus... mais c'est l'unique manière de faire pour ce type de mapper pour faire fonctionner le résultat final sur une vraie NES.

NBB: La manipulation présentée ci-dessus ne peut pas être transposée pour augmenter la CHR. En effet, le mapper n'utilise pas de bank fixes CHR lors du bankswitching. Grosso modo, pour augmenter la CHR, il faut non seulement doubler la taille de la CHR (les puces ROM doivent avoir une taille de puissance de 2), et modifier le code ASM pour sélectionner les nouvelles banks à charger. Je pourrai faire un petit tutorial d'extension de CHR pour un MMC3 si les gens le demande...

Répondre