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):
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é:
- 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)
-
À 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
- 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.
- 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:
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.
Retour en haut