Kronos
Kronos copied to clipboard
[True Pinball] Affichage des tables des flippers incorrect
Dans la dernière WIP (bios réel ou émulé), l'affichage des tables des flippers est toujours corrompu de cette manière :
Le même problème est présent dans les version européenne et japonaise (les copies d'écran sont faites avec la version japonaise). Il existait déjà en v1.5.0 et v1.6.0 mais avec un affichage un peu différent.
Les tables de flipper sont affichées sur la couche NBG0 avec des pixels 16 bits sur un bitmap de 1024x256.
Ce bitmap fait donc 512 ko et occupe toute la VRAM du VDP2. Or il est insuffisant pour contenir toute l'image du flipper car l'affichage est en double-interlaced, et comme le montre cette capture de la console, la résolution verticale du flipper est effectivement doublée. L'image complète de la table est donc affichée sur 2 champs successifs. Même en excluant le tableau à LED affiché par le VDP1 en haut sur 64 lignes, il reste 416 lignes de l'écran occupées par la table en NTSC.
Chaque champ nécessite donc une image de 416/2=213 lignes dans la VRAM du VDP2, et elles doivent donc être chargées au moins en partie à chaque frame : il est possible de stocker en permanence 256-213=43 lignes de chaque champ en permanence dans la VRAM (des lignes du milieu de l'image qui sont toujours à l'écran), et il reste à transférer 213-43=170 lignes à chaque frame. En supposant qu'il n'y ait pas d'autre optimisation, cela fait 170x2x1024=348160 octets à transférer à chaque frame vers la VRAM du VDP2.
L'intervalle du VBLANK ne peut pas suffire à un tel transfert, il doit donc déborder sur la période d'affichage actif du VDP2, probablement au moins sur les lignes du tableau à LED. Une telle copie pendant la période active doit nécessiter soit de n'activer le NBG0 qu'en bas du tableau à LED par un interrupt, voir de désactiver en haut de l'écran l'accès au VDP2 à une de ses 2 moitiés de VRAM pour ne l'activer par interrupt que quand le transfert de l'image est fini (voir p. 36 de la doc du VDP2). Une telle manip sur les timings peut être nécessaire si la copie du bas de l'image de la table n'est pas terminée quand le VDP2 arrive en bas du tableau à LED. En effet, le NBG0 occupe les 4 temps d'accès à la VRAM disponibles par cycle en haute résolution, donc quand le NBG0 est actif, aucun transfert vers la VRAM n'est possible sur les banks utilisés par le VDP2 pour lire les pixels à afficher sur cette couche.
La combinaison des éléments suivants rend nécessaire des changement des coordonnées de scrolling par interrupt à chaque ligne de l'écran sur le NBG0 :
- Taille verticale insuffisante du bitmap.
- Absence d'upscale vertical (le coordinate increment y est à 1).
- Pas d'utilisation du line scrolling du NBG0.
- Probable présence de lignes stockées en permanence dans la VRAM pour chaque champ.
- Possible manipulation des timings d'accès à la VRAM en cours d'affichage.
L'affichage incorrect dans Kronos peut donc venir :
- D'un problème de transfert des données vers la VRAM.
- D'une mauvaise gestion des interrupts nécessaires en cours d'affichage.