Maintenant que nous avons vu la base de la vérification des ROMs, rentrons dans le détails. Cet article va vous permettre de comprendre la structure d'une ROM, de savoir comment les "réparer", y compris lorsqu'il y a de petites subtilités.
1/ Composition d'une ROM
Avant de voir comment réparer une ROM, voyons comment celles-ci sont construites. C'est finalement assez simple, puisqu'il s'agit d'un fichier zip. Il s'agit donc d'une archive compressée.
A l'intérieur de cette archive se trouve l'ensemble des éléments de la ROMs. Ils se trouvent tous tout simplement au premier niveau.
Parce que c'était trop simple jusqu'ici, regardons les subtilités relatives aux clones et aux parents. Les fichiers des ROMs s'organisent selon 3 catégories : merged, split merged et non merged.
- merged : Toutes les ROMs clones sont regroupées dans la ROM parente. Chaque clone dispose de son propre sous-dossier. Dans l'idéal, les clones ne contiennent que les éléments qui diffèrent de la ROM parente.
- split merged : C'est un peu le format historique. Chaque ROM parente contient l'ensemble de ses fichiers. Chaque clone, est lui, composé uniquement des éléments qui diffèrent de la ROM parente. Mais le clone dispose de son propre fichier.
- non merged : Les parents, ainsi que les clones, disposent tous de l'ensemble des fichiers nécessaires à leur bon fonctionnement.
Le format "non merged" est pratique lorsque l'on ne souhaite que quelques jeux dans sa collection de MAME, et qu'en tant qu'amateur avisé, on recherche une version particulière de l'un ou l'autre des jeux. Ainsi on ne se pose pas la question de savoir si l'on a bien la bonne ROM parente etc.
Cependant dès que l'on souhaite une collection un peu plus grande, ce format peut vite prendre de la place sur les disques car tous les éléments sont dupliqués. Dans ce cas, il est préférable de passer sur le format slip merged. Ainsi, on va économiser beaucoup d'espace disque.
Enfin, avec les années passant, le nombre de ROMs acceptées par MAME se multiplient. Avec près de 40000 jeux supportés, cela peut rapidement faire beaucoup de fichiers dans un seul dossier. Si cela ne pose aucun soucis à macOS, pour nous cela peut être compliqué de trouver une ROM. Pour palier un peu à ce soucis, il est préférable d'adopter le format merged.
Mais ne prenez pas peur, si votre collection contient des ROMs aux 3 formats différents, cela fonctionnera aussi. C'est juste… un peu moins bien rangé. Attention cependant, il peut arriver que l'on possède une version merged et une autre version split d'un même clone. Si je ne me trompe pas, MAME vérifie les deux versions pour récupérer celle considérée comme correcte. Attention en nettoyant les ROMs de ne pas jeter la bonne version.
Enfin, il existe un 4ème format, qui n'est utilisé que pour les mises à jour de ROMs.
- diff : ce format, un peu particulier, ne contient que les éléments qui changent entre 2 versions. Cela peut être utile lors d'un changement de version pour mettre à jour sa collection sans télécharger les ROMs complètes. Il faudra cependant les fusionner pour qu'elles fonctionnent. Il existe des outils qui font ce travail, mais le but, ici est de savoir comment le faire manuellement. De plus, n'ayant pas encore testé ces outils, je ne saurai lequel vous conseiller.
2/ Réparer les ROMs
Réparer une ROM consiste à en fusionner plusieurs versions en ne conservant, à chaque fois, que les bons éléments afin d'obtenir une version finale correcte.
Que ce soit en récupérant une mise à jour de ROMs diff ou à force de chercher les ROMs sur Internet, vous disposerez de plusieurs versions d'un même jeu. Si aucune des versions n'est correcte, il est possible qu'en combinant les éléments des différentes ROMs, vous puissiez arriver à réparer et donc à utiliser la ROM.
Réparer une ROMs à partir de plusieurs versions nécessite un peu de rigueur. En effet, on va disposer de plusieurs fois des mêmes éléments et il ne faudra pas se tromper et ne garder que les bons.
La première chose à faire est de trouver les éléments manquants, endommagés ou obsolètes. C'est assez facile car il s'agit de toutes les lignes affichées avant le résultat lorsque l'on effectue un verifyroms, nous l'avions dans la première partie de l'article. Ainsi si on teste la ROM sf2cems6b
mame -verifyroms sf2cems6b
et que l'on obtient
sf2cems6b : ms6_gal20v8a.u104 (343 bytes) - NOT FOUND
romset sf2cems6b [sf2ce] is bad
1 romsets found, 0 were OK.
Il faudra que je trouve le morceau ms6_gal20v8a.u104. Si je dispose d'une autre ROM et que le résultat de la vérification me donne
sf2cems6b : ms6_gal20v8.u234 (343 bytes) - NOT FOUND
romset sf2cems6b [sf2ce] is bad
1 romsets found, 0 were OK.
Malgré leur similitude dans le nom, il s'agit bien de deux éléments différents. Il suffit de prendre un morceau de l'une pour le mettre dans l'autre ou vice-versa.
Pour cela, il suffit de décompresser les deux fichiers, de copier l'élément en question, puis de recompresser la ROM. La recompression peut se faire avec l'outil intégré à macOS, avec un clic-droit sur le dossier > Compresser.
Il est préférable de mettre de côté les ROMs originales pour deux raisons. La première est que si vous vous trompez, vous disposerez toujours de vos sources. La seconde est qu'à la recompression, macOS ajoutera un "2" à la suite du titre de la ROM et donc ne sera pas pris en compte par MAME.
Basiquement, je vous invite à créer un dossier dédié à l'édition des ROMs. Cela peut paraitre fastidieux, mais la petite gymnastique que cela nécessite vous limitera de bon nombre d'erreurs.
3/ Petites subtilités
Maintenant, regardons les petites subtilités qui pourraient vous poser problème.
Lorsqu'une ROM n'est pas fonctionnelle, il faut être très attentif à l'erreur obtenue.
Ainsi, si le résultat de la vérification suivante
mame -verifyroms knightsb2
est
knightsb2 : sound.code.512 (65536 bytes) - NOT FOUND (knights)
romset knightsb2 [knights] is bad
1 romsets found, 0 were OK.
La ROM knightsb2 est un clone de knights et en regardant la ligne relative au fichier non trouvé, on voit en bout de ligne, qu'entre parenthèse se trouve le nom de la rom parente. Cela veut dire que l'erreur vient du parent, et pas du clone.
Le principe est identique pour les BIOS, ainsi, si la vérification de la ROM neodrift
mame -verifyroms neodrift
nous renvoit l'erreur suivante
neodrift : sfix.sfix (131072 bytes) - NOT FOUND (neogeo)
romset neodrift [neogeo] is bad
1 romsets found, 0 were OK.
il faudra regarder au niveau du BIOS neogeo.
Regardons un nouveau cas avec le test suivant :
mame -verifyroms popn1
dont le résultat chez moi est
popn1 : 803jaa11 - NOT FOUND
romset popn1 is bad
1 romsets found, 0 were OK.
Vous pouvez récupérer toutes les roms popn1.zip que vous n'aurez jamais l'élément 803jaa11 dedans. Tout simplement parce que le fichier 803jaa11 est un CHD et qu'il doit se trouver dans le dossier CHD.
Pour corriger ce soucis, il est nécessaire de placer le fichier CHD dans le bon dossier.
4/ Trouver les éléments dans vos ROMs existantes
Voici une petite astuce non négligeable. Parfois, il est possible de corriger une ROM en récupérant l'élément dans une ROM très proche.
Par exemple, reprenant l'exemple précédent
mame -verifyroms sf2cems6b
avec le résultat
sf2cems6b : ms6_gal20v8.u234 (343 bytes) - NOT FOUND
romset sf2cems6b [sf2ce] is bad
1 romsets found, 0 were OK.
Il suffit de fouiller dans les ROMs adjacentes pour parfois trouver l'élément qui se trouve être identique pour les deux.
Ainsi, si je récupère le morceau ms6_gal20v8.u234 dans la ROM sf2cems6a et que je le place dans sf2cems6b, j'obtiens le résultat escompté :
mame -verifyroms sf2cems6b
romset sf2cems6b [sf2ce] is good
1 romsets found, 1 were OK.
La méthode peut paraitre un peu brute ici mais il est possible de faire cela avec plus de rigueur et d'efficacité en utilisant les commandes de MAM, et quelques astuces du terminal. Voici une petite marche à suivre.
Premièrement récupérons la liste des composants de notre ROM non fonctionnelle
mame -listroms sf2cems6b
Le résultat est une liste complète
ROMs required for driver "sf2cems6b".
Name Size Checksum
ms6b.u0 262144 CRC(b6f3724b) SHA1(aa8eea819fdaf205ca068067a4624715a8cf6c8c)
ms6b.44 279 CRC(5f05a861) SHA1(26b8cab0e66b596ef54768b2811c1c1939d3135c)
ms6b.u196 1048576 CRC(435153d5) SHA1(3f6f318a9b3def8d62ee576dbaaef623d55c1c64)
ms6b.u10 262144 CRC(c812b7b2) SHA1(23ed0e1bd8b2015b39ad5e452dff0e372df0d5c9)
ms6.u70 1048576 CRC(baa0f81f) SHA1(5e55a5c4ad64be17089670a3d73c1c0d9082351b)
ms6.u68 1048576 CRC(8edff95a) SHA1(8db35c5940dcc1f09f11be26051b2f98445d10e7)
ms6.u69 1048576 CRC(468962b1) SHA1(fdfd2a7cbbcafaa37e972da425446d471e1e1dae)
ms6.u64 1048576 CRC(8165f536) SHA1(8178fe2240c73c7283592aa31dd24aec5bf9429b)
ms6.u19 1048576 CRC(39d763d3) SHA1(a2a0bddecaca6046785ccddfd20b8356a6ec36f0)
ms6.u18 1048576 CRC(2ddfe46e) SHA1(517a76166d387375a75a36b2785de86898bdc777)
ms6.u31 262144 CRC(35486f2d) SHA1(abdcfc73d2d42a7f3523e1a383c1ce5563c4fbd7)
ms6.u29 262144 CRC(e4eca601) SHA1(acee4988f12a037a3b50f3923892fdac65f35805)
ms6.u191 65536 CRC(08f6b60e) SHA1(8258fcaca4ac419312531eec67079b97f471179c)
ms6.u210 262144 CRC(6cfffb11) SHA1(995526183ffd35f92e9096500a3fe6237faaa2dd)
ms6.u133 65536 CRC(13ea1c44) SHA1(5b05fe4c3920e33d94fac5f59e09ff14b3e427fe)
ms6_pal16l8.u173 260 NO GOOD DUMP KNOWN
ms6_pal16l8.u176 260 NO GOOD DUMP KNOWN
ms6_pal16l8.u177 260 NO GOOD DUMP KNOWN
ms6_pal16l8.u178 260 NO GOOD DUMP KNOWN
ms6_pal16l8.u183 260 NO GOOD DUMP KNOWN
ms6_pal16l8.u198 260 NO GOOD DUMP KNOWN
ms6_pal16l8.u218 260 NO GOOD DUMP KNOWN
ms6_pal16l8.u231 260 NO GOOD DUMP KNOWN
ms6_gal16v8.u6 279 NO GOOD DUMP KNOWN
ms6_gal16v8.u95 279 NO GOOD DUMP KNOWN
ms6_gal16v8.u96 279 NO GOOD DUMP KNOWN
ms6_gal16v8.u107 279 NO GOOD DUMP KNOWN
ms6_gal16v8.u125 279 NO GOOD DUMP KNOWN
ms6_gal16v8.u139 279 NO GOOD DUMP KNOWN
ms6_gal16v8.u151 279 NO GOOD DUMP KNOWN
ms6_gal16v8.u245 279 NO GOOD DUMP KNOWN
ms6_gal20v8.u15 343 NO GOOD DUMP KNOWN
ms6_gal20v8.u16 343 NO GOOD DUMP KNOWN
ms6_gal20v8.u20 343 NO GOOD DUMP KNOWN
ms6_gal20v8.u21 343 NO GOOD DUMP KNOWN
ms6_gal20v8.u39 343 NO GOOD DUMP KNOWN
ms6_gal20v8.u40 343 NO GOOD DUMP KNOWN
ms6_gal20v8.u104 343 CRC(67b56d29) SHA1(261ae6e968100d5a9c1ee68ea684bb2b1eef3cf8)
ms6_gal20v8.u131 343 NO GOOD DUMP KNOWN
ms6_gal20v8.u135 343 NO GOOD DUMP KNOWN
ms6_gal20v8.u140 343 NO GOOD DUMP KNOWN
ms6_gal20v8.u232 343 NO GOOD DUMP KNOWN
ms6_gal20v8.u233 343 NO GOOD DUMP KNOWN
ms6_gal20v8.u234 SHA1(f73ad0253a861d5306a09b1f97dfce622b19cdcf)
ms6_gal20v8.u235 343 NO GOOD DUMP KNOWN
ms6_gal22v10.u50 741 CRC(dc665408) SHA1(a7161a03add24a01d547189e9bfaf11474bbe878)
ms6_gal22v10.u134 741 CRC(b66848bb) SHA1(edef02bc7fc0195f56cf815c1b862bee095951c8)
Comme vous pouvez le voir, l'élément ms6_gal20v8.u234 ne dispose pas de taille ni de CRC mais elle dispose bien d'un SHA1. Pour rappel, c'est ce SHA1 que MAME compare pour vérifier que les composants de la ROMs sont bien ceux attendus et sont corrects.
Maintenant utilisons la même commande pour regarder dans sf2cems6a. Vous devriez trouver le fameux élément ms6_gal20v8.u234. S'il dispose d'une taille et d'un CRC c'est qu'il est bien présent. Si le SHA1 est identique pour les deux, c'est que nous pourrons le copier pour faire fonctionner la ROM défectueuse.
Maintenant utilisons les fonctionnalités du terminal de macOS pour simplifier la recherche. Avec la commande grep nous ne sommes plus obligé de récupérer toutes les lignes. Laissons le Mac faire la recherche pour nous. Voici la commande
mame -listroms sf2cems6a | grep ms6_gal20v8.u234
pour information le caractère | se fait avec alt+maj+L. Et voici le résultat
ms6_gal20v8.u234 343 CRC(2c16b7c6) SHA1(f73ad0253a861d5306a09b1f97dfce622b19cdcf)
grep nous a renvoyé uniquement la ligne contenant le texte ms6_gal20v8.u234.
Et par ce que l'on est encore plus fainéant on ne souhaite pas rechercher dans toutes les ROMs une à une mais laisser faire le Mac ce travail désagréable. Pour cela il suffit d'utiliser le caractère * comme joker. Ce caractère va se substituer à un ou plusieurs caractères dans le nom des ROMs. Ainsi je peux lui faire rechercher dans toutes les ROMs qui commencent par sf2ce.
mame -listroms "sf2ce*" | grep ms6_gal20v8.u234
Noter les doubles apostrophes autour de sf2ce*. Malheureusement, le résultat n'est pas très satisfaisant
ms6_gal20v8.u234 343 CRC(2c16b7c6) SHA1(f73ad0253a861d5306a09b1f97dfce622b19cdcf)
ms6_gal20v8.u234 SHA1(f73ad0253a861d5306a09b1f97dfce622b19cdcf)
ms6_gal20v8.u234 343 CRC(2c16b7c6) SHA1(f73ad0253a861d5306a09b1f97dfce622b19cdcf)
Certes l'élément a été trouvé mais on ne sait pas dans quelle ROM. On sait cependant que la seconde ligne correspond à notre ROM défectueuse car l'élément n'y est pas présent.
Améliorons la commande telle que
mame -listroms "sf2ce*" | grep "ms6_gal20v8.u234|driver"
Ainsi on cherche, soit l'élément soit la première ligne de la réponse contenant le mot "driver".
ROMs required for driver "sf2ce".
ROMs required for driver "sf2ceb".
ROMs required for driver "sf2ceblp".
ROMs required for driver "sf2cebltw".
ROMs required for driver "sf2ceds6".
ROMs required for driver "sf2ceea".
ROMs required for driver "sf2ceja".
ROMs required for driver "sf2cejb".
ROMs required for driver "sf2cejc".
ROMs required for driver "sf2cems6a".
ms6_gal20v8.u234 343 CRC(2c16b7c6) SHA1(f73ad0253a861d5306a09b1f97dfce622b19cdcf)
ROMs required for driver "sf2cems6b".
ms6_gal20v8.u234 SHA1(f73ad0253a861d5306a09b1f97dfce622b19cdcf)
ROMs required for driver "sf2cems6c".
ms6_gal20v8.u234 343 CRC(2c16b7c6) SHA1(f73ad0253a861d5306a09b1f97dfce622b19cdcf)
ROMs required for driver "sf2cet".
ROMs required for driver "sf2ceua".
ROMs required for driver "sf2ceub".
ROMs required for driver "sf2ceuc".
ROMs required for driver "sf2ceupl".
Ainsi on sait dans quelles ROMs la recherche a été effectuée et dans lesquelles il a été trouvé.
Vous pouvez effectuer les recherches comme bon vous semble en utilisant le wildcard n'importe ou dans le nom de la ROM, y compris au début ou au milieu du nom.
Il faut juste garder à l'esprit que plus vous élargirez la recherche sur de nombreuses ROMs plus cela prendra du temps. A l'extrême, vous pouvez lancer la recherche sur toutes les ROMs disponibles, mais si vous disposez d'une collection plutôt complète, il faudra compter sur plusieurs minutes voire plusieurs dizaines de minutes avoir de voir le bout de la commande. De plus, vous obtiendrez la liste complète de vos ROMs parsemée d'un ou deux résultats qu'il faudra retrouver.
Dans le cas précédent, les éléments se trouvaient dans des ROMs quasi identiques. Mais il faut savoir que certains composants sont génériques et se trouvent dans une multitude de ROMs qui n'ont rien à voir les unes avec les autres.
Une fois trouvés, vous pouvez les mettre de côté pour les récupérer à chaque fois que nécessaire. Voici ma petite liste de ces éléments :
- 317-0034.key
- 75585130_gal20v8c.ic29
- ioc1.ic1
- ioc1.ic7
- u01508001100b.u20f
Je n'hésiterai pas à mettre cette liste à jour si je tombe sur d'autres composants que l'on retrouve dans plusieurs ROMs.
5/ Vérification multiple
Si vous tenez le coup, voici la dernière étape de notre vérification avancée. Nous allons voir ici comment réaliser des vérifications groupées afin de gagner encore un peu plus de temps.
En lançant la commande suivante
mame -verifyroms
vous allez effectuer la vérification de toutes vos ROMs. Et cela va prendre un certain temps.
Comme les ROMs fonctionnelles ne m'intéressent pas dans le cas présent, voici une commande modifiée pour ne récupérer que les ROMs défectueuses.
mame -verifyroms | grep 'is bad'
Enfin, comme je ne compte corriger toutes mes ROMs en une fois et que je ne souhaite pas relancer la commande à chaque fois, je vais enregisrter le résultat dans un fichier.
mame -verifyroms | grep 'is bad' > verif_roms.txt
Les résultats seront écrits dans le fichier texte verif_roms.txt, dans le dossier courant. Et le seul résultat que vous obtenez dans le terminal est le décompte final qui devrait ressembler à quelque chose comme cela
36691 romsets found, 36601 were OK.
Avec ce résultat j'ai 90 ROMs qui ne sont plus valides et que je dois corriger. Je n'ai plus qu'à prendre les ROMs des 90 lignes du fichier pour les vérifier et les corriger une à une. N'oubliez pas de retirer les lignes correspondantes au fur et à mesure, pour ne pas refaire les mêmes vérifications plusieurs fois.
Peut-on encore optimiser cela et gagner un peu de temps ? La réponse est oui.
Il y a deux choses à voir dans notre liste. La première est que MAME a tendance à tendance à ne vérifier les bios qu'après les ROMs. Bien souvent, en mettant les BIOS à jour, les ROMs les utilisant re-deviennent fonctionnelles.
Vous le trouverez facilement en fin de fichier. Les ROMs sont testées par ordre alphabétique du nom du fichier, tout comme les BIOS. Ainsi les BIOS se trouvent après une cassure de l'ordre alphabétique.
Vous pouvez d'ailleurs tester toutes les ROMs reliées à un BIOS en même temps, pour gagner du temps. Si par exemple, vous venez de corriger votre BIOS neogeo, vous pouvez tester tous les jeux de votre liste dont la ligne finit par [neogeo].
mame -verifyroms garou mslug mslug2 neodrift
avec comme résultat si tout se passe bien
romset garou [neogeo] is good
romset mslug [neogeo] is good
romset mslug2 [neogeo] is good
romset neodrift [neogeo] is good
4 romsets found, 4 were OK.
vous pouvez donc retirer les lignes correspondant à ces 4 jeux.
Ensuite dans le même style il faut chercher les clones et parents. S'ils sont nombreux à être présents, c'est bien souvent que le parent est défectueux et le corriger réparera aussi de nombreux si ce n'est tous les clones.
Et voilà, vous disposez désormais de toutes les armes pour maintenir votre collection de ROMs MAME.