raphnet.net banner

Modification d'un NES pour les jeux d'arcade VS (11/14)

Patch pour la palette

Le PPU utilisé par la version arcade de Super Mario Bros (2c05) n'est pas le même. Ils sont compatibles mais la palette de couleurs est différente. Voici à quoi ressemble le jeu d'arcade avec un PPU de NES normal (2c02):
ecran titre sans patch fin de niveau sans patch

Les registres du PPU de $3f00 à $3f1f (se répètent en fait de $3f00 à $3fff) contiennent les 16 couleurs choisies pour l'arrière plan suivi des 16 couleurs choisies pour les sprites. Chaque octet représente un numéro de couleur. C'est ici qu'il y a une différence. Par exemple, la couleur $1a sur le PPU 2c05 est un bleu mais sur le PPU 2c02 c'est un vert!

Pour corriger ce problème, j'ai modifié le rom pour qu'il envoi les bonnes couleurs au PPU. Voici comment j'ai procédé:
  1. J'ai converti les fichiers des ROMS d'Unisystem en .NES pour pouvoir l'utiliser dans un émulateur et/ou déboggeur NES. (Note: Il faut utiliser le mapper 99)
  2. screenshot No$NES À l'aide de No$NES (un déboggeur pour NES), j'ai trouvé le code utilisé pour transférer la palette au PPU. Cette routine commence à l'addresse $914a. Elle utilise un pointeur (à l'addresse $0000) vers une structure de copie. Cette structure de copie contient l'addresse de destination (du PPU), la longueur et ensuite les donnés.
    La routine fonctionne comme suit:
    • L'addresse de destination est transmise au PPU.
    • Toutes les donnés sont transmises au PPU.
    • Retour
  3. J'ai repéré un endroit que je présume comme libre dans le ROM (que des $FF, à partir de $959C pendant 148 octets) assez gros pour mettre mon code de conversion des couleurs et la table de conversion des couleurs. Je me suis servi d'une table de conversion trouvée dans le code source de l'émulateur AdvanceMame.
  4. J'ai mis un saut (JMP) juste avant la boucle dans la routine de copie dont j'ai parlé au #1 de sorte que mon code est exécuté. Puisque la routine de copie ne sert pas seulement à copier la palette, mon code vérifie que l'addresse de destination dans la structure de copie est bien $3fxx. Si l'addresse n'est pas dans cette plage, je saute (JMP) à la boucle de copie originale. Si l'addresse est bonne, ma boucle de copie s'exécute, convertissant les valeurs au fur et à mesure à l'aide de la table de conversion.
Voici des images avant et après avoir appliqué le patch:
scores sans le patch scores avec le patch

Comment appliquer le patch:
Premièrement, voici un fichier binaire qu'il faut placer à l'addresse $159C du fichier mds-sm4.1d: fix_palette.bin
Ensuite, à l'addresse $116B du fichier mds-sm4.1d, remplacez les 3 octets $4A $4A $AA (lsr A, lsr A, txa) par $4C $9C $95 (jmp $959c).

Voici le code source de mon patch. J'utilise wla dx pour pouvoir compiler sous Linux:
fix_palette.asm

NOTE: Ce n'est pas la peine de me demander ou vous pouvez télécharger ces ROMS, ni me demander de vous les faire parvenir. Je ne réponderai pas.

goto top

Ensuite: Adaptation des rom < 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 >

Les marques de commerce utilisées dans ce site appartiennent à leurs propriétaires respectifs.
Copyright © 2002-2018, Raphaël Assenat
Site codé avecSite codé avec vimDernière mise à jour: 17 novembre 2014 (Lundi)