Old School is Beautiful

Quand écrire dans la mémoire vidéo de la Colecovision ?

Sur Coleco, le moment le plus délicat est le moment ou il faut écrire dans la mémoire vidéo. Si cela est fait au mauvais moment, cela peut entraîner des « glitchs » (caractères parasites aléatoires sur l'écran) voire des plantages.

Le rafraichissement de l'écran s'exécute en même temps que la NMI (non maskable interruption), et cela pose problème. Il existe 3 moyens pour faire ce que l'on veux dans la VRAM sans plantage.

Note : Les codes exemples données ci dessous se base sur la bibliothèque C Coleco de Daniel Bienvenu.

Méthode 1 : Je cache l'écran.

La méthode 1 est la plus simple, la plus fiable, mais la moins utile :) Pour écrire dans la VRAM, il suffit d'empécher la Coleco de montrer quoique ce soit à l'écran et d'empêcher l'exécution de la NMI (voir tuto précédent sur les sprites pour la NMI).

Cela ce fait ainsi :

disable_nmi(); // Empêche l'interruption
screen_off(); // Empêche la Coleco de tracer, met l'écran en noir

// Faire ici toutes les opérations VRAM

screen_on(); // Permet à la Coleco de tracer à l'écran
enable_nmi();

Cette méthode est très bien lorsque vous devez initialiser par exemple le tableau d'un jeu. Pour Pang par exemple, j'affiche la dedans, l'image de fond et je fais le tracé des plateformes.

Méthode 2 : J'écris dans la VRAM rapidement après le balayage écran.

Un endroit sur pour écrire dans la VRAM est juste après le « balayage écran ». La commande delay(1); permet d'atteindre le balayage écran.

Delay(1);
disable_nmi();

// Faire ici toutes les opérations VRAM

enable_nmi();

Problème, il faut que les traitement en VRAM se terminent avant le passage du prochain « balayage écran » sinon, risque de glitch. Par contre, ne truffez pas votre programme de delay(1) à chaque tracé, car c'est bien une commande "d'attente", qui va ralentir votre jeu !! Un delay(1) fera que votre jeu tournera à 50 images par secondes max, 2 delay(1), on descendra à 25 images secondes, etc etc ...

Méthode 3 : Tout faire dans la méthode NMI.

La, c'est carrément plus simple.

Void nmi()
{
// Ecrire les sprites en VRAM
// Décaler le scrolling en VRAM
etc etc ...
}

Pas de disable_nmi(), pas de problème de glitch. On peut même piloter le NMI à partir du programme principal.

Exemple :

byte nmiTrace;

void main(void)
{
   nmiTrace = 0;

   while(1)
   {
    if (joypad1_FIRE1) nmiTrace=1;
   }
}

void nmi(void)
{
   if (nmiTrace)
   {
    nmiTrace=0;
    center_string(0,''HELLO WORLD'');
   }
}

Il est important de mettre la variable nmiTrace à 0 dans la NMI car si la boucle principale du jeu est lente, le « HELLO WORLD » serait tracé plusieurs fois, en perte de performance inutile.

En effet la NMI est executé 50 fois par seconde sur une console PAL, si la boucle principale met le nmiTrace à 1, fait un traitement d'une seconde et met le nmiTrace à 0, le « HELLO WORLD » se serait afficher 50 fois au lieu d'une seule sans le nmiTrace=0 dans la NMI.

Voilà, il y à peut être d'autres moyens, mais pour le moment ces 3 moyens m'ont permit de contourner ces méchants problèmes de glitch. J'espère que ça pourra aider un débutant sur Coleco et qu'il évitera de ramer comme je l'ai fais :)

Retour aux tutoriaux Colecovision