Comme nous avons déjà parlé de HBL et de palettes,
j'ai trouvé judicieux de faire une petite "Demo du samedi" sur le principe des rasters.
Les rasters sont apparus rapidement sur les premiers ordinateurs personnels 8bits (par ex: Décruncher des Atari Xl/XE).
Le fait de modifier la palette en HBL permettant de dépasser le nombre maximum de couleurs affichables à l'écran.
Au millieux des années 80 on vit donc apparaître de plus en plus de jeux découpés horizontalement, avec par exemple un tableau de bord dans une palette pour 1/3 vertical de l'écran et un playfield dans une autre palette pour les 2/3 tiers restant. (éventuellement scrollant)
Ces proportions pouvant même être inversées (The last V8, Red Max ou les 1ers jeux de type flight simulator de l'époque).
Mais le mouvement raster prit toute son ampleur sur la fin des années 80, la puissance des processeurs 16/32bits, permettant le calcul précis de la position du balayage écran (raster), on vit apparaître les premiers plasmas.
Il est à noter que l'interruption HBL permit aussi l'Overscan :
En modifiant la valeur de base de la mémoire vidéo pendant la HBL il devint possible de dépasser la limite de la résolution prévue à la base pour le hardware.
Au début des années 90, les rasters, plasmas et autres overscans devinrent le passage obligé de toute démo underground respectable.
Ce qui fût sévèrement décrié par la très moyenne, mais notable : "Démo des fêlés" (Amiga).
(Je ne me suis toujours pas remis de la pub pour la souris à ventouses Atari)
Ma petite démo est assez simple et elle se base sur les précédentes démos.
Elle se contente de faire rouler un raster barre, de haut en bas de l'écran.
Elle fonctionne légèrement mieux sous émulateur que sur DS.
http://sentinel.minastirith.free.fr/download/RasterDS.rarTout l'art du code en HBL étant normalement de compter le nombre de cycles CPU exact afin d'obtenir le temps réel que votre code prend pour être exécuté par le processeur. Afin de savoir où en est le balayage (début, fin, milieu de la ligne...).
Pour faire simple : lors de votre interruption, le "PA_GetVcount()" vous permet d'obtenir le "Y", mais seule la durée de votre code vous donne le "X".
Il faut bien comprendre que la seule vraie limite de l'interruption HBL est le temps.
En effet, à chaque HBL votre code doit avoir fait son job avant la ligne suivante.
Et à 60 Hz et 192 lignes, vous avez 1/192ème de 1/60ème de seconde... c'est peu.
Bien sûr, il faudrait coder directement en assembleur pour pouvoir obtenir le temps réel de notre code.
Mais le principe du raster, ou la simple possibilité de modifié la HBL, nous ouvre de vastes horizons sur DS.
Bon, sinon le code parle de lui-même... Il vous suffit normalement de remplacer le main.c de la précédente démo sur les palettes, par le mien.
(c):
// Includes
#include <PA9.h> // Include for PA_Lib
// Converted using PAGfx
#include "gfx/all_gfx.c"
#include "gfx/all_gfx.h"
#define RED 31
#define GREEN (31<<5)
#define BLUE (31<<10)
u16 vblpal[256]; // Palette VBL
u16 hblpal[256]; // Palette HBL
s16 start=0; // 1re ligne d'affichage du raster
bool down=true; // Flag pour savoir si le raster monte ou descend.
// Couleurs du raster
u16 Rcol[6]={26,31,24,20,18,0};
void CopyPal(u16 *SrcPal, u16 *DstPal){
u16 i; for(i=0; i<256; i++){ DstPal[i] = SrcPal[i];}
}
void HBL_function(void){
s16 vcount = PA_GetVcount();
// On commence par copier la palette préparée lors de la HBL précédente.
// pour être sûr d'avoir fini avant le départ du balayage.
PA_LoadBgPal(1, 3, (void*)hblpal);
if(vcount > 192) vcount = 0; // Loop
// Affichage du raster, par modification de la palette.
switch(vcount-start)
{
case 1: { hblpal[1]=Rcol[0]; break;}
case 2: { hblpal[1]=Rcol[1]; break;}
case 3: { hblpal[1]=Rcol[2]; break;}
case 4: { hblpal[1]=Rcol[3]; break;}
case 5: { hblpal[1]=Rcol[4]; break;}
case 6: { hblpal[1]=vblpal[1]; break;}
}
}
// Function: main()
int main(int argc, char ** argv)
{
PA_Init(); // Initialisation de PA_Lib
PA_InitVBL(); // Initialisation de la VBL standard
// Load Backgrounds with their palettes !
PA_EasyBgLoad(1, 3, test); // Background name, used by PAGfx...
PA_InitText(1, 0); // Initialisation du système de texte
PA_OutputText(1, 5, 19, "A la mode des 90's...");
// Duplication de la palette du gif dans nos palettes de travail
CopyPal((u16*)test_Pal, (void*)hblpal);
CopyPal((u16*)test_Pal, (void*)vblpal);
// Init palette
PA_LoadBgPal(1, 3, (void*)vblpal);
// Init HBL
irqSet(IRQ_HBLANK, HBL_function);
irqEnable(IRQ_HBLANK);
// Infinite loop to keep the program running
u16 loop=0;
while (1)
{
// Le pad change la couleur du fond
if(Pad.Newpress.Up){
vblpal[1]=RED;
}
if(Pad.Newpress.Left){
vblpal[1]=BLUE;
}
if(Pad.Newpress.Right){
vblpal[1]=GREEN;
}
if(Pad.Newpress.Down){
vblpal[1]=0;
}
// mouvement du raster
// avec rebond de haut en bas
// 191-6 => hauteur de l'ecrant moin celle du raster
if(down) {
start++;
if(start>(191-6)) down=false;
} else {
start--;
if(start<1) down=true;
}
// Rotation du raster
// avec une petite temporisation
// pour qu'il ne tourne pas trop vite
if(++loop>4)
{
loop=0;
if(down) {
Rcol[5]=Rcol[4];
Rcol[4]=Rcol[3];
Rcol[3]=Rcol[2];
Rcol[2]=Rcol[1];
Rcol[1]=Rcol[0];
Rcol[0]=Rcol[5];
} else {
Rcol[5]=Rcol[0];
Rcol[0]=Rcol[1];
Rcol[1]=Rcol[2];
Rcol[2]=Rcol[3];
Rcol[3]=Rcol[4];
Rcol[4]=Rcol[5];
}
}
PA_WaitForVBL();
PA_LoadBgPal(1, 3, (void*)vblpal);
}
return 0;
} // End of main()