Gamoover

[move]Bienvenue sur Gamoover, portail francophone de l'arcade.

[WIP] Bricolage sur CPS1

Démarré par aje_fr, Dimanche 09 Juin 2013, 23:01:53 PM

aje_fr

Regarde les crédits sur dead battery society, tu verras que le 'mec' ne débarque pas de n'importe où  ;)
On lui doit plutôt le respect  <:)
Think different, don't purchase Apple !

dlfrsilver

Citation de: Iro le Samedi 22 Juin 2013, 20:09:38 PM
J'aime bien les mecs qui débarquent de n'importe où sur le forum et te mettent une claque :D
Chapeau <:)

Salut Iro, tu ne me connais pas, c'est vrai. Pourtant dans le monde du retrogaming mes faits d'armes sont connus :) :

Sur Micro :
J'ai récupéré et fait préserver des prototypes de jeux sur amiga (plus de 5 au total):
Snow bros, Vade retro Satanas, tecnoball, equality, tecnoball Z, light quest.

j'ai intégralement traduit en français eye of the beholder I et II sur amiga, et j'ai initié le projet de passage du jeu de 32 couleurs en 256 couleurs (C'est mon ami CFOU qui a intégralement ressourcé le code du jeu, qui l'a corrigé et crée les outils qui ont permis la traduction du jeu.

En arcade :
j'ai crée des sets sans pile pour les jeux CPS-1 protégés en version euro (knights of the round Euro, king of dragons 2 versions sur 3, the punisher euro, warriors of fate euro, 3 wonders euro et jap, et j'en ai d'autres en route :) )

après je poste pas souvent sur gamoover, et c'est normal, je suis déjà sur plusieurs autres forum, et ça me prend un max de temps.

Par contre des gens me sollicitent il y en a , et je tends la main, je l'ai toujours fait jusqu'ici.

Dans le cas d'Aje, je me suis montré un peu brusque, mais c'est pour la bonne cause. Ca ne sert à rien que je lui bourre la tête d'information si il s'emmêle les pinceaux avec les infos de base.   

C'est pareil dans tout apprentissage, faut y aller progressivement, et pour être honnête, idem pour moi, si je bute sur un truc, je me muscle sur ce que j'ai sous les yeux. Quand j'ai compris je passe à la suite. C'est comme ça que j'ai fais pour créer les sets. j'ai mis 3 semaines pour comprendre le fonctionnement de tout ça. Pas mal pour un non-programmeur non ? ;D

th_vador

je pense que vous vous méprenez, Iro dit qu'il aime bien pour dire tout simplement qu'il aime bien :)
En tout cas, ça prend une bonne tournure tout ça ^-
De l'arcade, de la console, des conneries, du Giga Wing 2. TomTom's Lair quoi!
Recherche : Altered Beast (Master System) | Streets of Rage (Megadrive) | Une borne DDR | Un flipper

olschool

Moi je suis FAN !!!

un grand merci à vous tous

^-^

Winner's Don't Use Drug mais ça aide quand même pour finir Ghost & Goblins.



Citation de: ducatman1098 le Lundi 05 Novembre 2018, 22:45:37 PM
En rentrant le camion au garage,  je me suis aperçu que j avais récupérer une after burner  ;D

kaneda56

Pareil, je n'entrave fichtre rien mais je kiffe ^-

"Arrête de te croire fort avec tes roll cancel!!!"
Paroles de Sac

Iro

#37
En fait , j'ai mal édité mon message, le "où" est resté
C'étais évidemment un encouragement :)
"Jet set 2, c'est avec Robert Garcia ?" Kaneda, Lapsus de sac Vol.1
Peter Shou Owner' Club

WIPs : Naomi - SEGA Rally - AB Cop - Lethal Enforcers - COMPUMI - Terminator 2 - Space Invaders - Artworks pour Boitiers K7 Naomi CF - Ma collec' de panels

LES TUTOS DE GAMO   

dlfrsilver

Citation de: Iro le Dimanche 23 Juin 2013, 19:17:40 PM
En fait , j'ai mal édité mon message, le "où" est resté
C'étais évidemment un encouragement :)

Viiiii, c'est cool tout ça :) pas de soucis les gars :)

d'ailleurs en parlant des sets CPS1, j'espère vraiment réussir à déplomber Capcom Quiz&dragons, j'ai bossé pas mal dessus, mais il est lourdement protégé. les registres principaux sont faciles à trouver.
mais les accès indirect....pfffouuu sans parler des checksums.

aje_fr

Salut,
Bon quelques avancements, j'ai trouvé beaucoup plus simple pour adapter la c board (enfin j'espère).
J'ai modifier les sources de mame pour y rajouter un jeu fonctionnant avec mes fichiers en test et la config de mon multi CPS1.
Je aussi modifier rajouter un espion pour voir tous les accès au PPU, je sais maintenant à quel endroit du code source sont modifiés les registres.
L'avantage est donc de pouvoir espionner les accès indirects.
Je peux aussi espionner les protections par multiplication  :-)=
Je vais me faire la main sur willow pour tester.
A bientôt
Think different, don't purchase Apple !

aje_fr

Exemple sur un willow original :

PC Type accès Type Data
PC 0000047c Ecriture layer_control 12e0
PC 00000484 Ecriture palette_control 003f
PC 000015c2 Ecriture palette_control 003f
PC 000018f2 Ecriture layer_control 12f8
PC 000018f2 Ecriture layer_control 12c0
PC 000018f2 Ecriture layer_control 13b8
PC 000018f2 Ecriture layer_control 1380
PC 00001902 Ecriture priority 0 0
PC 0000190a Ecriture priority 1 0
PC 0000190a Ecriture priority 1 003e
PC 00001912 Ecriture priority 2 0
PC 00001912 Ecriture priority 2 00fe
PC 0000191a Ecriture priority 3 0
PC 0000191a Ecriture priority 3 001e


PC est le program counter (il spécifie l'instruction suivante lors de l'accès)
Think different, don't purchase Apple !

aje_fr

#41
Bon alors j'avance encore un peu plus dans la compréhension, mais bon, c'est pas encore ça...
Willow ne marche toujours pas terrible (sous emulateur), j'ai les graphismes mais il m'en manque encore quelques uns).

Voilà pour le moment ce que j'ai compris grâce à mame :

CPS-B Registers
---------------
Unlike CPS-A registers, which are at fixed addresses, CPS-B registers move from game to game.
Following example strider

0x66-0x67   Layer control register
           bits 14-15 seem to be unused
               ghouls sets bits 15 in service mode when you press button 2 in
               the input test, with no apparent effect on the pcb.
               qtono2j sets them both at the game over screen.
           bits 6-13 (4 groups of 2 bits) select layer draw order
           bits 1-5 enable the three tilemap layers and the two starfield
               layers (the bit order changes from game to game).
               Only Forgotten Worlds and Strider use the starfield.
           bit 0 could be rowscroll related. It is set by captain commando,
               varth, mtwins, mssword, cawing while rowscroll is active. However
               kodj and sf2 do NOT set this bit while they are using rowscroll.
               Tests on the msword pcb show that even if this bit is not set,
               rowscroll still works. Therefore, the purpose of this bit is unclear.
0x68-0x69   Priority mask \   Tiles in the layer just below sprites can have
0x6a-0x6b   Priority mask |   four priority levels, each one associated with one
0x6c-0x6d   Priority mask |   of these masks. The masks indicate pens in the tile
0x6e-0x6f   Priority mask /   that have priority over sprites.
0x70-0x71   Palette control register. This indicates which palette
           pages to copy when the palette base register is written to.
           There is one CPS2 game (Slammasters II) setting this to 0x2f; all the other
           games normally set it to 0x3f, though in some cases different values are
           used during boot:
           ghouls  0x02 (and palette base is set to 9105; palette base is 9100 normally)
           strider 0x02 (and palette base is set to 9145; palette base is 9140 normally)
           1941    0x02 (and palette base is set to 9145; palette base is 9140 normally)
           unsquad 0x0f
           kod     0x0f
           mtwins  0x0f

           bit 0: copy page 0 (sprites)
           bit 1: copy page 1 (scroll1)
           bit 2: copy page 2 (scroll2)
           bit 3: copy page 3 (scroll3)
           bit 4: copy page 4 (stars1)
           bit 5: copy page 5 (stars2)

           An important quirk is that if the first bits are not set, page 0 in
           gfxram is not skipped but instead is copied to the first enabled page.
           For the other pages, if the bit is not set the gfxram page is skipped.
           Example: 0x0a
           bit 0 is not set so palette page 0 (sprites) is not updated
           bit 1 is set so palette page 1 (scroll1) is updated; since bit 0 was
           not set, it is taken from gfxram page 0
           bit 2 is not set so palette page 2 (scroll2) is not updated; gfxram
           page 1 is skipped
           bit 3 is set so palette page 3 (scroll3) is updated; it is taken from
           gfxram page 2

           bits 0-3 have been verified on a msword pcb, while bits 4-5 are only
           supposed.



Les CPS B sont relativement identiques selon la version, mais change surtout :

  • Les adresses d'accès aux registres des priority mask
  • L'adresse d'accès à la palette
  • L'adresse d'accès aux contrôles de layers
  • Les masques d'activation des layers
  • D'autres choses sur les protections de multiplication (non utile dans willow)

Par exemple, dans le CPS-B-03 de willow:

#define CPS_B_03      -1, 0x0000,          __not_applicable__,          0x30,{0x2e,0x2c,0x2a,0x28},0x26, {0x20,0x10,0x08,0x00,0x00}

Ce qu'il faut savoir c'est que l'adresse de base du CPS B est 0x800140 pour la majorité des jeux.

Pour les palettes, nous avons donc comme adresse :

0x800140 + 0x26  =  0x800166


Pour l'adresse d'accès aux contrôles de layers :

0x800140 + 0x30  =  0x800170


Pour les adresses des priority mask :

Priority mask 0 : 0x800140 + 0x2e   =   0x80016e
Priority mask 1 : 0x800140 + 0x2c   =   0x80016c
Priority mask 2 : 0x800140 + 0x2a   =   0x80016a
Priority mask 3 : 0x800140 + 0x28   =   0x800168


Jusque là vous allez me dire, c'est ce que dlfrsilver, mais bon, ce coup ci je comprends d'où sortent ces valeurs.

Par contre, pour ce qu'il faut écrire dans le registre d'ordre des layers, pour moi c'est légèrement différent, mais bon je ne suis pas sûr..
Exemple dans willow, il y a une écriture en 0x800170 de la valeur 0x13b8 de cette façon :

000018EA: 33ED 004A 0080  move.w  ($4a,A5), $800170.l
         0170

($4a,A5) est préchargé avant avec 0x13b8.

Ce que l'on peut voir dans mame c'est que dans le "Layer control register", seuls les bits 1 à 5 peuvent changer d'une révision de PPU à l'autre.

Et justement dans notre exemple, les autres bits doivent avoir une importance, il ne faudrait donc pas utiliser 0x12C0 comme valeur de base mais plutôt repartir de la valeur écrite dans la rom originale (0x13b8), y regarder quel layer sont activés, faire un masque pour mettre à 0 les bits 1 à 5 (faire un et binaire avec 0xFFC1) et ensuite, utiliser les masques de layers du nouveau PPU.

Exemple, pour utiliser avec la C board de SF2CE :

Valeur d'origine dans willow :

0x13B8 = 0b0001001110111000


Les masques d'activations des layer de willow :

11111100 00000000
54321098 76543210
layer1 0x20 = 00000000 00100000   ==>  D5
layer2 0x10 = 00000000 00010000   ==>  D4
layer3 0x08 = 00000000 00001000   ==>  D3
layer4 0x00 = 00000000 00000000
layer5 0x00 = 00000000 00000000


On voit donc que les layer 1, 2, 3 sont activées

On met à zero les bits

0x13b8 & 0xFFC1 = 0x1380


Sur la C board de SF2:

layer1 0x02 = 00000000 00000010  ==>  D1
layer2 0x04 = 00000000 00000100  ==>  D2
layer3 0x08 = 00000000 00001000  ==>  D3
layer4 0x30 = 00000000 00110000  ==>  D4+D5
layer5 0x30 = 00000000 00110000  ==>  D4+D5


Et pour obtenir la valeur finale, on passe à 1 les bits correspondants à l'activation des layers, donc

0x1380 | 0b00000000 00001110 = 0x138E


Qu'en pensez vous ?
Think different, don't purchase Apple !

nc333

Citation de: aje_fr le Mercredi 26 Juin 2013, 23:41:04 PMQu'en pensez vous ?
Tout a fait logique mon chère :D

Super boulot, juste une question, d'après toi, quelle serais le coups en eprom pour ce montage ?
"Bon, j'ai pas mal réfléchi. Quand la vie vous fait trébucher, ça ne suffit pas de se relever. Il faut lui péter les rotules, à cette grognasse ! Œil pour œil, dent pour dent ! « Essaie un peu de te relever, maintenant, traînée ! »" Caves Johnson, 1980


La présentation c'est ICI :)

aje_fr

#43
@nc333 en fait je crois qu'il ne vas pas falloir que des EPROM mais des composants plus chiadés, genre du CPLD ou autre pour le décodage des adresses de tous les jeux.

Sinon  :-)= :-)= :-)= :-)=
Willow semble fonctionner à 100% sous emulateur en le faisant fonctionner avec une c board de SF2CE !!!
Reste plus qu'à le claquer dans les EPROMS pour vérifier tout ça.

La théorie était bonne c'était la mise en pratique qui n'était pas tout à fait conforme  :-\
Voici ce que j'avais oublié.
En fait, dans le CPS1, le PPU semble être rafraichi à chaque nouvelle trame.
Mais par contre, les registres à lui affecter sont eux modifiés pendant cette trame dans une valeur temporaire.
Et au moment du passage à la nouvelle cette valeur temporaire est transféré au PPU.
Voici la fameuse instruction :

000018EA: 33ED 004A 0080  move.w  ($4a,A5), $800170.l
         0170


La valeur temporaire est donc ($4a,A5) qui correspond à l'adresse contenue dans A5 (il faut le prendre comme un pointeur) plus la valeur 0X4A. En fait on tombe sur une case de la RAM.

Maintenant il a fallu chercher dans tout le code où cette valeur temporaire était modifiée.

Un exemple simple, la valeur est affectée par une valeur fixe :

000005C8: 3B7C 12F8 004A  move.w  #$12f8, ($4a,A5)


Un exemple plus compliqué :

0002B794: 302D 004A       move.w  ($4a,A5), D0
0002B798: 3200            move.w  D0, D1
0002B79A: 0240 003F       andi.w  #$3f, D0
0002B79E: 323C 13B8       move.w  #$13b8, D1
0002B7A2: 8041            or.w    D1, D0
0002B7A4: 3B40 004A       move.w  D0, ($4a,A5)

On voit que la valeur temporaire est chargée dans D0 puis D0 est transféré dans D1 qui subit un ET binaire avec 0x3F, D1 est reaffecté à 0x13B8 et ensuite un ou binaire est fait entre D1 et D0. D0 qui est ensuite réaffecté à la valeur temporaire.
Ouf... Eh bien, il faut aussi modifier ça car l'affectation de D1 ne correspond pas entre une C board rev 3 et une C board rev 21.

Voilà voilà... Ca ne s'invente pas mais il y a en tout 36 octets à modifier dans le code.  :P

Je fais une vidéo dès que j'ai claqué willow en EPROM et recodé la GAL correspondante.

A+
Think different, don't purchase Apple !

dlfrsilver

Citation de: aje_fr le Jeudi 27 Juin 2013, 23:35:13 PM
@nc333 en fait je crois qu'il ne vas pas falloir que des EPROM mais des composants plus chiadés, genre du CPLD ou autre pour le décodage des adresses de tous les jeux.

Sinon  :-)= :-)= :-)= :-)=
Willow semble fonctionner à 100% sous emulateur en le faisant fonctionner avec une c board de SF2CE !!!
Reste plus qu'à le claquer dans les EPROMS pour vérifier tout ça.

La théorie était bonne c'était la mise en pratique qui n'était pas tout à fait conforme  :-\
Voici ce que j'avais oublié.
En fait, dans le CPS1, le PPU semble être rafraichi à chaque nouvelle trame.
Mais par contre, les registres à lui affecter sont eux modifiés pendant cette trame dans une valeur temporaire.
Et au moment du passage à la nouvelle cette valeur temporaire est transféré au PPU.
Voici la fameuse instruction :

000018EA: 33ED 004A 0080  move.w  ($4a,A5), $800170.l
         0170


La valeur temporaire est donc ($4a,A5) qui correspond à l'adresse contenue dans A5 (il faut le prendre comme un pointeur) plus la valeur 0X4A. En fait on tombe sur une case de la RAM.

Maintenant il a fallu chercher dans tout le code où cette valeur temporaire était modifiée.

Un exemple simple, la valeur est affectée par une valeur fixe :

000005C8: 3B7C 12F8 004A  move.w  #$12f8, ($4a,A5)


Un exemple plus compliqué :

0002B794: 302D 004A       move.w  ($4a,A5), D0
0002B798: 3200            move.w  D0, D1
0002B79A: 0240 003F       andi.w  #$3f, D0
0002B79E: 323C 13B8       move.w  #$13b8, D1
0002B7A2: 8041            or.w    D1, D0
0002B7A4: 3B40 004A       move.w  D0, ($4a,A5)

On voit que la valeur temporaire est chargée dans D0 puis D0 est transféré dans D1 qui subit un ET binaire avec 0x3F, D1 est reaffecté à 0x13B8 et ensuite un ou binaire est fait entre D1 et D0. D0 qui est ensuite réaffecté à la valeur temporaire.
Ouf... Eh bien, il faut aussi modifier ça car l'affectation de D1 ne correspond pas entre une C board rev 3 et une C board rev 21.

Voilà voilà... Ca ne s'invente pas mais il y a en tout 36 octets à modifier dans le code.  :P

Je fais une vidéo dès que j'ai claqué willow en EPROM et recodé la GAL correspondante.

A+

c'est super, tu as bien avancé :)

Par contre, là ou c'est pas bon, c'est par rapport à la valeur $13B8.

la valeur de base pour le layer CTRL c'est de base $12C0 auxquel tu rajoutes la valeur comme indiqué
dans le driver de mame. il est impossible d'avoir $13XX dans le layer control. regardes par toi même
dans le tableau du driver vidéo de mame, tu ne trouveras jamais cette valeur.

Il ne faut de fait en aucun cas la toucher. Si tu vas créer des erreurs graphiques, ou encore éléments n'apparaitront pas.

En tout cas, je suis très intéressé par ton sniffeur pour mame (contacte moi par PM).

aje_fr

Citation de: dlfrsilver le Vendredi 28 Juin 2013, 00:56:17 AM
c'est super, tu as bien avancé :)

Par contre, là ou c'est pas bon, c'est par rapport à la valeur $13B8.

la valeur de base pour le layer CTRL c'est de base $12C0 auxquel tu rajoutes la valeur comme indiqué
dans le driver de mame. il est impossible d'avoir $13XX dans le layer control. regardes par toi même
dans le tableau du driver vidéo de mame, tu ne trouveras jamais cette valeur.

Il ne faut de fait en aucun cas la toucher. Si tu vas créer des erreurs graphiques, ou encore éléments n'apparaitront pas.

En tout cas, je suis très intéressé par ton sniffeur pour mame (contacte moi par PM).

Salut,
Comme je l'ai noté plus haut, sur ce point, je ne suis pas tout à fait d'accord avec toi.
Pour moi 0x12C0 n'est pas du tout une référence à prendre, bien au contraire.
En effet, il ne faut pas raisonner en terme de valeur numérique mais en terme de bits de cette valeur.
Mame nous dit ceci :

0x66-0x67   Layer control register
            bits 14-15 seem to be unused
                ghouls sets bits 15 in service mode when you press button 2 in
                the input test, with no apparent effect on the pcb.
                qtono2j sets them both at the game over screen.
            bits 6-13 (4 groups of 2 bits) select layer draw order
            bits 1-5 enable the three tilemap layers and the two starfield
                layers (the bit order changes from game to game).
                Only Forgotten Worlds and Strider use the starfield.
            bit 0 could be rowscroll related. It is set by captain commando,
                varth, mtwins, mssword, cawing while rowscroll is active. However
                kodj and sf2 do NOT set this bit while they are using rowscroll.
                Tests on the msword pcb show that even if this bit is not set,
                rowscroll still works. Therefore, the purpose of this bit is unclear.

Seuls les bits de 1 à 5 changent en fonction de la révision du PPU. Donc uniquement ceux ci sont à adapter et modifier.
Il ne faut surtout pas toucher aux autres.
Si par exemple tu as une valeur 0x13XX envoyée au PPU, tu ne peux pas la remplacer par 0x12XX car tu viens modifier le bit 9 qui gère l'ordre d'affichage des layer.
Peut être que sur certains jeux l'ordre d'affichage est toujours le même dans tout le programme ce qui fait que tu retombes toujours sur 0x12C0 comme valeur de base mais ce n'est pas le cas de tous, willow en est la preuve.
A bientôt
Think different, don't purchase Apple !

Bonky0013

#46
Vous assurez les gars ^^

Je suis ça avec attention  ^-^


ps : dlfrsilver si tu peu me Mp sur AA , il y a des sets jap que j'ai testé sur hardware et qui fonctionne nickel ;)

aje_fr

Ca avance, ça avance  :D
Reprogrammation des eproms :


Varth US :



Varth Jap :



Area 88 jap :



Final Fight :



Capcom World Quiz 2 :




Il manque encore willow qui fonctionne avec la nouvelle PPU mais j'ai encore un soucis au niveau du GAL et peut être d'une incompatibilité avec la b board.

A bientôt pour la suite ;-)
Think different, don't purchase Apple !