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 ?