FCare / Kronos

Kronos is a Sega Saturn emulator.
http://fcare.github.io
232 stars 21 forks source link

[Chaos Control (Europe) (En,Fr,De)] Le viseur n'est affiché qu'à moitié.... #1512

Open BenjaminSiskoo opened 8 months ago

BenjaminSiskoo commented 8 months ago

Kronos 2.6.0 Public

image

fafling commented 4 months ago

Présent dans la v2.6.1 publique et dans la dernière WIP. Apparaît dans Kronos v1.5.0. La v1.4.5 affiche le viseur entier.

Le viseur est affiché par le NBG1 sur un bitmap. image

Les coordonnées de scrolling de ce bitmap restent à [0, 0], quelle que soit la position du viseur. Il est donc probablement effacé puis redessiné par le CPU quand il bouge.

On voit de temps en temps brièvement la partie supérieure du viseur.

En mettant le viseur en haut à gauche de l'écran, on le voit dans l'éditeur de mémoire en VRAM VDP2 à partir de 05E62017. Un breakpoint sur le SH2 maître en écriture byte à cette adresse montre la boucle d'effacement en 0600970A-06009722, puis la boucle de dessin en 06009846-06009866. La boucle de dessin copie ses pixels à partir d'un buffer en low work ram dont l'adresse de départ est variable, et l'adresse où elle est lue varie également. Ces 2 boucles sont dans un même gestionnaire d'interrupt SCU (06000924 est dans leur pile d'appel), celui du vblank in (R0 à 0x100 lors du breakpoint en 06000924 qui précède les boucles).

Problème également présent dans Chaos Control Remix (Japan), où le bitmap se trouve sur le NBG0, mais pas dans Chaos Control (Japan), où le viseur est dessiné par le VDP1.

Testé avec le redump.

fafling commented 4 months ago

Les 2 boucles d'effacement et de dessin du viseur ne se chevauchent pas. Ce n'est pas changement en cours d'affichage sur le NBG1 qui provoque un affichage tronqué car si on saute la boucle d'effacement, on peut voir des viseurs sur toute sa surface.

La boucle d'effacement est sans doute assez longue (environ 400 pixels effacés un par un) et se produit pendant le vblank. Le plus probable est donc que Kronos prend les graphismes du VDP2 pour construire une frame en plein milieu de la boucle d'effacement.

La solution nécessiterait donc d'avoir les graphismes VDP2 calculés ligne par ligne.