Bonjour,
Est-ce qu'il existe une version de " PinMame " avec un debugger et une fenêtre pour visualiser la ram d'un sys80 et tracer du code ? Un peu comme Snes9x Geiger's pour ceux qui connaissent et sur la photo suivante une version pour WPC:
J'ai bien testé la version " PinMAME_210_MAMEDebug " mais rien n'a faire, quand j'appuie sur F5 pour basculer en mode debug rien ne s'affiche! Même en ligne de commande "CMD" avec l'option -debug
Merci par avance de votre réponse.
Debugger PinMame
-
- Dept: 49
- Rech/Achete: 0 flip
- Messages : 638
- Enregistré le : 12/04/2018
- Niveau : Initié
- Pro / revendeur : non
- Localisation : Angers

Re: Debugger PinMame
J'ai trouvé!
Version 1.6, exécuter en ligne de commande:
"c:\monDossier\PinMAME_VC2008md.exe c:\monDossier\roms\rom.zip --debug"
Mon erreur était de mettre l'option debug avec un seul tiret du 6.
J'ai bien la console de "debug" qui s'affiche a l’exécution.
Pour exécuter la rom, c'est la commande G, puis on peut rebasculer sur la console de débogage
en pressant la touche " ² ".
Version 1.6, exécuter en ligne de commande:
"c:\monDossier\PinMAME_VC2008md.exe c:\monDossier\roms\rom.zip --debug"
Mon erreur était de mettre l'option debug avec un seul tiret du 6.
J'ai bien la console de "debug" qui s'affiche a l’exécution.
Pour exécuter la rom, c'est la commande G, puis on peut rebasculer sur la console de débogage
en pressant la touche " ² ".
Flipper actuel : Black rose, Flash Gordon, Black Knight, Fathom
- brice
- Dept: 81
- Collec Perso: 3 flips
- Rech/Achete: 6 flips
- Messages : 71
- Enregistré le : 29/06/2018
- Pas vu depuis 3 mois
- Niveau : Initié
- Pro / revendeur : non
- Localisation : Castres
- Contact :


Re: Debugger PinMame
Bonjour,
il y a la 2.2 avec option debug dispo aussi si besoin : https://sourceforge.net/projects/pinmam ... nmame/2.2/
Je fais quelques tests pour analyser un jeu mais pas si simple a bien interpréter toutes les infos.
il y a la 2.2 avec option debug dispo aussi si besoin : https://sourceforge.net/projects/pinmam ... nmame/2.2/
Je fais quelques tests pour analyser un jeu mais pas si simple a bien interpréter toutes les infos.
https://retrohappygames.fr/
-
- Dept: 49
- Rech/Achete: 0 flip
- Messages : 638
- Enregistré le : 12/04/2018
- Niveau : Initié
- Pro / revendeur : non
- Localisation : Angers

Re: Debugger PinMame
Merci ! (mieux vaut tard que jamais.) Sinon,
Ce qu'il faut c'est être sûr d'avoir à faire à du code, car là comme ça devant un éditeur hexadécimal on ne peut pas faire la différence entre le code pur(instructions) et les données.
Par exemple,
Lors de mon analyse de la rom de ma carte SoundSpeech MA-216 à base de processeur 6502, on sait que le pointeur qui donne l'adresse (l'offset) du code d'un évènement IRQ est stocker sur 2 octets en fin de rom.
Le pointeur IRQ en fin de rom: C'est pas fini! Il faut maintenant retrancher $F000, ce qui donne F56D - F000 = 56D.
Cette fois c'est bon!
La routine IRQ : Maintenant on sait que l'on est en début de code et non sur des données, on peut le vérifier facilement.
Un IRQ est un évènement qui peut subvenir à tout moment, avant de le traiter il faut sauvegarder
les données en cours et notamment les registres A,Y et X.
On devrait donc trouver la sous-routine qui s'occupe de ça en tout début de code.
Comme ceci : De même, en fin de code les valeur des registres A, Y et X doivent être restituées avant de sortir de évènement IRQ.
On peut le vérifier comme ceci :
Pour aller plus loin,
Voici mon analyse pour trouver dans la rom les fameux messages vocaux de nos chers flipper en version parlant
avec carte MA-216.
C'est juste de l'analyse que je partage !
Au début je me suis dit, " Tiens cela serait sympa de personnaliser mon flipper en modifiant ses messages vocaux ".
Puis finalement non, même si cela reste possible
Le SC-01 de chez Votrax qui équipe la carte MA-216 est le chip qui permet de traiter les messages vocaux.
Cette puce est un vocaliser assez complexe, il faut juste savoir qu'elle fonctionne avec des codes dit " Phonème "
dont leurs valeur hexadécimal vont de 00 à 3F.
Voici une partie du dictionnaire SC-01 (les valeurs hexa dans la colonne verte) : Entrons maintenant dans le vif du sujet, comment trouver les messages dans la rom !?
Je vais vous montrez, pour cela je vais prendre exemple pour le message " VOLCANO " du flipper du même nom.
Premier chose à faire, avec le mode debugg de PinMame on va mettre l’exécution du code en pause
pendant la diffusion du message.
Voici ce que cela donne : La colonne de gauche correspond au code assembleur du 6502 et à droite les données en ram.
En regardant la colonne du code assembleur une ligne est intéressante : L'instruction LDA($51), y est intéressant car on voit que à l'adresse ram $51 il y à une valeur et le Y nous indique
probablement que c'est une boucle.
Voici à quoi correspond cette instruction : Charge dans le registre A la valeur qui se trouve à l'adresse $51 en
lui ajoutant la valeur de Y.
A = valeur de l'adresse $51 + Y.
Regardons maintenant ce qui se trouve à l'adresse $51 : On trouve la valeur AD, suivit de F7.
Peut être un pointeur 16 bits !?
On va appliquer à ces deux octets la méthode du pointeur IRQ décrit plus haut.
On a donc ADF7.
On inverse F7AD.
On retranche $F000.
Ce qui nous donne 7AD.
Allons voire ce que l'on peut trouver à cette adresse dans la rom : Alors, on trouve la valeur 03, suivit de 8F, 30 ect...
Pour savoir si nous somme sur le code du message, on va temporairement modifier les valeurs 03, 8F, 30 en 04, 90, 31
et voire si cela change.
Et bien dans ce cas, après cette modification temporaire, notre message est bien déformé !
Remettons les valeurs d'origines et poursuivons l'analyse.
Comment savoir si c'est le début du code du message et ou s'arrête t'il
Jetons à nouveaux un œil sur le code assembleur et plus particulièrement sur ces lignes : Pour commencer l'instruction LDY #$00 met la valeur du registre Y à 0.
Reprenons l'instruction LDA ($51) +Y
On comprend qu'en début de boucle/cycle on a LDA ($51) + Y = LDA AD + 0 = LDA #$03.
Donc A = 03.
On peut en déduire que 03 est bien le début du message.
Maintenant la fin du message, continuons avec CMP #$FF
Cette instruction compare la valeur de A à FF. Intéressant, peut-être la condition de fin de message !?.
Retournons voir dans la rom : Quelques octets plus loin on trouve la valeur FF. Faisons une modification temporaire en plaçant une valeur FF
quelques octets avant celle-ci.
Effectivement, dans ce cas après exécution cela tronque le message . Remettons la valeur d'origine !
On peut en déduire que le message commence à 03 et s'arrête à FF donc de 7AD à 7B8.
Voilà la chaine complète du message " VOLCANO " : La suite du code, BEQ #F2AA, en gros cette instruction sert à faire un saut dans le code à l'adresse $F2AA si
A == FF. (drapeau d'égalité positionné à 1 par l'instruction précédente CMP #$FF si A == FF sinon le drapeau est à 0).
Juste un point la dessus // En fait l'instruction CMP est une simple soustraction entre A et FF. Si le résultat est 0
alors le drapeau d'égalité est positionné à 1 sinon l'égalité est faux et le drapeau est positionné à 0.
On poursuit avec l'instruction suivante, EOR #$3F.
Alors c'est quoi EOR #$3F
Cette instruction permet de faire un " ou binaire exclusif " sur la valeur du registre A.
//Table de vérité du Ou exclusif.
A B logique
0 0 0
1 0 1
1 1 0
0 1 1
Donc par exemple :
3F en binaire 00111111
03 en binaire 00000011
Résultat EOR 00111100
On peut constater que les 6 derniers bits sont inversés. Mais pourquoi inversé les 6 derniers bits !?
A vrai dire je ne sais pas trop mais peut être une hypothèse :
Tout d'abord le dictionnaire de phonème s'arrête à 3F donc en binaire 00111111, les deux premiers bit de poids
fort ne prendrons jamais 1.
Dans le circuit de la carte MA-216, juste avant que les bits du codes phonème soient envoyés au SC-01 il y
a un autre composant, un 74LS05 porte "non" logique (appelez aussi porte inverse).
Si il y à un 1 en entrée, ce sera un 0 en sortie et si il y a un 0 entrée, se sera un 1 en sortie.
On peut voire qu'il ne prend seulement que 6 bits. On peut donc dire que les bits inversés par l'instruction EOR, sont restitués par le 74ls05.
Autre chose, 3F d’après le dictionnaire Votrax du SC-01 veut dire " STOP ". Ce code " 3F " est utilisé pour dire au SC-01 que c'est la fin du message.
Souvenez-vous de cette ligne : BEQ #F2AA
Cette instruction veut dire : Poursuivre l’exécution/fait un saut à l'adresse F2AA si A == FF.
Voyons ce qu'on trouve à F2AA : On peut y voire la ligne suivante :
EOR #$FF En d'autre terme, fait un ou exclusif entre la valeur de A et FF.
Donc à ce moment de l’exécution A = FF .
A = en binaire 11111111
FF = en binaire 11111111
Résultat EOR 00000000
cette instruction met la valeur de A à 0.
Maintenant L'instruction STA $2000, c'est l'instruction qui sert à envoyer le code phonème vers le sc-01.
Donc on envoie la valeur de A vers l'adresse $2000. Comme A vaut 0 en envoie donc 8 bits à 0
Souvenez-vous, le 74ls05, l’inverseur ! il va inverser les bits donc le SC-01 va recevoir les 6bits de poids faible 111111
ce qui donne 3F en hexadécimal donc "STOP". Fin du message!
L'organisation des données dans la rom : En gros un pointeur pointe vers un autre pointeur qui lui pointe sur le message.
Pointeur1 ---> pointeur2 ---> Message.
Pour modifier le message il faudrait déjà le déplacer dans la rom (sur la plage $0000 à $FFFF) pour gagner de la place,
puis recalculer le pointeur 1 et 2 ainsi que le checksum.
A suivre...
Oui j’avoue !! Pas simpleJe fais quelques tests pour analyser un jeu mais pas si simple a bien interpréter toutes les infos.

Ce qu'il faut c'est être sûr d'avoir à faire à du code, car là comme ça devant un éditeur hexadécimal on ne peut pas faire la différence entre le code pur(instructions) et les données.
Par exemple,
Lors de mon analyse de la rom de ma carte SoundSpeech MA-216 à base de processeur 6502, on sait que le pointeur qui donne l'adresse (l'offset) du code d'un évènement IRQ est stocker sur 2 octets en fin de rom.
Le pointeur IRQ en fin de rom: C'est pas fini! Il faut maintenant retrancher $F000, ce qui donne F56D - F000 = 56D.
Cette fois c'est bon!
La routine IRQ : Maintenant on sait que l'on est en début de code et non sur des données, on peut le vérifier facilement.
Un IRQ est un évènement qui peut subvenir à tout moment, avant de le traiter il faut sauvegarder
les données en cours et notamment les registres A,Y et X.
On devrait donc trouver la sous-routine qui s'occupe de ça en tout début de code.
Comme ceci : De même, en fin de code les valeur des registres A, Y et X doivent être restituées avant de sortir de évènement IRQ.
On peut le vérifier comme ceci :
Pour aller plus loin,
Voici mon analyse pour trouver dans la rom les fameux messages vocaux de nos chers flipper en version parlant
avec carte MA-216.
C'est juste de l'analyse que je partage !
Au début je me suis dit, " Tiens cela serait sympa de personnaliser mon flipper en modifiant ses messages vocaux ".
Puis finalement non, même si cela reste possible

Le SC-01 de chez Votrax qui équipe la carte MA-216 est le chip qui permet de traiter les messages vocaux.
Cette puce est un vocaliser assez complexe, il faut juste savoir qu'elle fonctionne avec des codes dit " Phonème "
dont leurs valeur hexadécimal vont de 00 à 3F.
Voici une partie du dictionnaire SC-01 (les valeurs hexa dans la colonne verte) : Entrons maintenant dans le vif du sujet, comment trouver les messages dans la rom !?

Je vais vous montrez, pour cela je vais prendre exemple pour le message " VOLCANO " du flipper du même nom.
Premier chose à faire, avec le mode debugg de PinMame on va mettre l’exécution du code en pause
pendant la diffusion du message.
Voici ce que cela donne : La colonne de gauche correspond au code assembleur du 6502 et à droite les données en ram.
En regardant la colonne du code assembleur une ligne est intéressante : L'instruction LDA($51), y est intéressant car on voit que à l'adresse ram $51 il y à une valeur et le Y nous indique
probablement que c'est une boucle.
Voici à quoi correspond cette instruction : Charge dans le registre A la valeur qui se trouve à l'adresse $51 en
lui ajoutant la valeur de Y.
A = valeur de l'adresse $51 + Y.
Regardons maintenant ce qui se trouve à l'adresse $51 : On trouve la valeur AD, suivit de F7.
Peut être un pointeur 16 bits !?
On va appliquer à ces deux octets la méthode du pointeur IRQ décrit plus haut.
On a donc ADF7.
On inverse F7AD.
On retranche $F000.
Ce qui nous donne 7AD.
Allons voire ce que l'on peut trouver à cette adresse dans la rom : Alors, on trouve la valeur 03, suivit de 8F, 30 ect...
Pour savoir si nous somme sur le code du message, on va temporairement modifier les valeurs 03, 8F, 30 en 04, 90, 31
et voire si cela change.
Et bien dans ce cas, après cette modification temporaire, notre message est bien déformé !
Remettons les valeurs d'origines et poursuivons l'analyse.
Comment savoir si c'est le début du code du message et ou s'arrête t'il

Jetons à nouveaux un œil sur le code assembleur et plus particulièrement sur ces lignes : Pour commencer l'instruction LDY #$00 met la valeur du registre Y à 0.
Reprenons l'instruction LDA ($51) +Y
On comprend qu'en début de boucle/cycle on a LDA ($51) + Y = LDA AD + 0 = LDA #$03.
Donc A = 03.
On peut en déduire que 03 est bien le début du message.
Maintenant la fin du message, continuons avec CMP #$FF
Cette instruction compare la valeur de A à FF. Intéressant, peut-être la condition de fin de message !?.
Retournons voir dans la rom : Quelques octets plus loin on trouve la valeur FF. Faisons une modification temporaire en plaçant une valeur FF
quelques octets avant celle-ci.
Effectivement, dans ce cas après exécution cela tronque le message . Remettons la valeur d'origine !
On peut en déduire que le message commence à 03 et s'arrête à FF donc de 7AD à 7B8.
Voilà la chaine complète du message " VOLCANO " : La suite du code, BEQ #F2AA, en gros cette instruction sert à faire un saut dans le code à l'adresse $F2AA si
A == FF. (drapeau d'égalité positionné à 1 par l'instruction précédente CMP #$FF si A == FF sinon le drapeau est à 0).
Juste un point la dessus // En fait l'instruction CMP est une simple soustraction entre A et FF. Si le résultat est 0
alors le drapeau d'égalité est positionné à 1 sinon l'égalité est faux et le drapeau est positionné à 0.
On poursuit avec l'instruction suivante, EOR #$3F.
Alors c'est quoi EOR #$3F

Cette instruction permet de faire un " ou binaire exclusif " sur la valeur du registre A.
//Table de vérité du Ou exclusif.
A B logique
0 0 0
1 0 1
1 1 0
0 1 1
Donc par exemple :
3F en binaire 00111111
03 en binaire 00000011
Résultat EOR 00111100
On peut constater que les 6 derniers bits sont inversés. Mais pourquoi inversé les 6 derniers bits !?
A vrai dire je ne sais pas trop mais peut être une hypothèse :
Tout d'abord le dictionnaire de phonème s'arrête à 3F donc en binaire 00111111, les deux premiers bit de poids
fort ne prendrons jamais 1.
Dans le circuit de la carte MA-216, juste avant que les bits du codes phonème soient envoyés au SC-01 il y
a un autre composant, un 74LS05 porte "non" logique (appelez aussi porte inverse).
Si il y à un 1 en entrée, ce sera un 0 en sortie et si il y a un 0 entrée, se sera un 1 en sortie.
On peut voire qu'il ne prend seulement que 6 bits. On peut donc dire que les bits inversés par l'instruction EOR, sont restitués par le 74ls05.
Autre chose, 3F d’après le dictionnaire Votrax du SC-01 veut dire " STOP ". Ce code " 3F " est utilisé pour dire au SC-01 que c'est la fin du message.
Souvenez-vous de cette ligne : BEQ #F2AA
Cette instruction veut dire : Poursuivre l’exécution/fait un saut à l'adresse F2AA si A == FF.
Voyons ce qu'on trouve à F2AA : On peut y voire la ligne suivante :
EOR #$FF En d'autre terme, fait un ou exclusif entre la valeur de A et FF.
Donc à ce moment de l’exécution A = FF .
A = en binaire 11111111
FF = en binaire 11111111
Résultat EOR 00000000
cette instruction met la valeur de A à 0.
Maintenant L'instruction STA $2000, c'est l'instruction qui sert à envoyer le code phonème vers le sc-01.
Donc on envoie la valeur de A vers l'adresse $2000. Comme A vaut 0 en envoie donc 8 bits à 0
Souvenez-vous, le 74ls05, l’inverseur ! il va inverser les bits donc le SC-01 va recevoir les 6bits de poids faible 111111
ce qui donne 3F en hexadécimal donc "STOP". Fin du message!
L'organisation des données dans la rom : En gros un pointeur pointe vers un autre pointeur qui lui pointe sur le message.
Pointeur1 ---> pointeur2 ---> Message.
Pour modifier le message il faudrait déjà le déplacer dans la rom (sur la plage $0000 à $FFFF) pour gagner de la place,
puis recalculer le pointeur 1 et 2 ainsi que le checksum.
A suivre...
Flipper actuel : Black rose, Flash Gordon, Black Knight, Fathom