mercredi 19 septembre 2012

Tutorial : Overlay Data et images sur PCEngine

NOTE : Tout les outils de création d'overlay data et de conversion d'images se trouvent à cette adresse : http://onorisoft.free.fr/pce/pce.htm 
 
Dans le 1er tuto, on a vu comment utiliser les Overlay d'execution.Voici maintenant comment utiliser les overlay de données.

Imaginons par exemple qu'on veut faire un slideshow de 20 images (16 couleurs les images). On va éviter de mettre ces images directement en statique dans le 1er overlay d'execution (En effet, si je ne dis pas de bétise, le 1er overlay est limité à 192 ko tandis que les autres à 256 ko.), et on va plutôt charger les images à partir du CDROM pour éviter de faire exploser la mémoire.

1) Convertir des images BMP en format PCEngine

Prenons l'exemple d'une image BMP 16 couleurs de résolution 256*224. On va passer ceci à la moulinette de BMP2PCE.
Sous DOS il faut taper :

bmp2pce BG monImage.bmp

Ceci va générer 3 fichiers :

monImage.pal
monImage.gfx
monImage.map

que l'on va renommer ainsi :

monImage_pal.bin --> Contient la palette de l'image
monImage_gfx.bin --> Contient des données graphiques
monImage_map.bin --> Contient la map de l'image

2) Un mot sur le mode graphique de la PCEngine

La PC engine utilise un mode graphique appelé PLANAR. Une image se découpe en petit bloc de 8*8 pixels. le fichier gfx contient ces petits blocs uniques.

Exemple j'ai une image ainsi :

AAAAAAA
BBBBBBB
CCAAACC

Le fichier gfx ne contiendra que les blocs graphique représentant A,B et C. On gagne donc en place graphique.

Le fichier MAP contiendra lui l'endroit ou affiche ces blocs.
Si A=1 B=2 C=3 la map contiendra pour simplifier

111111
222222
331133

avec pour fichier graphique ABC. Ce qui est moins lourd que de stocker tout l'image. (A = 8*8 word, et 1 = 1 word pour simplifier ... c'est un peu plus complexe.)

3) Réunir les fichiers images

Voilà, maintenant qu'on à nos 3 fichiers il faut les réunir dans un seul overlay, avec la commande DOS suivante :

pcecdpak.exe 0 imagesovl.bin imagesovl.h monImage_gfx.bin monImage_map.bin monImage_pal.bin

En gros, nos 3 fichiers vont se retrouver dans un seul fichier imagesovl.bin, et en bonus on aura un fichier imagesovl.h qui nous donnera l'endroit exact ou chercher les données.

4) Le fichier .h

Ce .h contient pour chaque fichier de l'ovl, l'adresse de départ ou se trouve le fichier,ainsi que sa taille. On pourra passer ça ensuite simplement en paramêtre des fonctions de chargement.

#define OFS_monImage_gfx_bin 0 --> Position du fichier monImage_gfx.bin
#define SIZE_monImage_gfx_bin 13664 --> Taille du fichier monImage_gfx.bin
#define OFS_monImage_map_bin 7 --> etc etc ...
#define SIZE_monImage_map_bin 1792
#define OFS_monImage_pal_bin 8
#define SIZE_monImage_pal_bin 32


5) Afficher les images.

D'abord dans notre programme on va inclure les .h qui vont bien à savoir :

#include "huc.h"
#include "imagesovl.h"


On va déclarer en RAM une zone tampon pour la palette :

char palTmp[32];

Et voici notre programme principal :

main() {
            /* On initialise la sortie graphique */
           set_screen_size(SCR_SIZE_32x32);
           init_satb(); disp_on(); /* Active la sortie ecran */

           /* On charge la palette dans la zone tampon RAM */
           cd_loaddata(2, OFS_monImage_pal_bin, palTmp, SIZE_monImage_pal_bin); /* On spécifie à la PC Engine qu'on utilise cette zone en RAM comme palette */
           set_bgpal(0, palTmp);

           /* On charge la map en vram à l'adresse 0X0000 = Adresse de la map en VRAM */
           cd_loadvram( 2,OFS_monImage_map_bin , 0x0000 , SIZE_monImage_map_bin); /*map*/

           /* On charge les tiles = données graphiques en vram à l'adresse 0X1000 = Adresse de la map en VRAM */
          cd_loadvram( 2,OFS_monImage_gfx_bin , 0x1000 , SIZE_monImage_gfx_bin); /*tile*/

          while (!(joy(0)&JOY_STRT)){}
          cls();
}


cd_loaddata va chercher dans le second overlay (le 1er étant ce programme) le fichier monImage_pal.bin pour le transférer dans le tableau palTmp. Ensuite on explique à la PCEngine que c'est cette palette qui va servir pour l'image. (set_bgpal)

cd_loadvram lui, charge directement les données en VRAM.

Par exemple :

          cd_loadvram( 2,OFS_monImage_map_bin , 0x0000 , SIZE_monImage_map_bin); /*map*/ va chercher dans l'overlay 2 le fichier monImage_map.bin et va le balancer à l'adresse VRAM 0x0000, à l'endroit ou la PCEngine va chercher ses maps.

Idem pour les gfx, sauf à l'adresse 0X1000.

6) Création de l'iso.

Comme dans le 1er tuto on va créer notre iso avec les commandes :

Compilation et création de l'overlay du programme principal

bin\huc.exe -over -cd testImage.c
bin\pceas.exe -over -cd testImage.s


Création de l'iso

bin\isolink.exe testImage.iso testImage.ovl imagesovl.bin

L'overlay d'execution principal doit être en 1ere position, puis vient les overlay de data. Les overlay de data doivent IMPERATIVEMENT avoir l'extension .bin. (et .ovl pour ceux d'execution).

7) Conclusion

Je sais que je fais des tutos rapide, mais si vous cherchez ce genre d'infos c'est que avez déja les mains dans le camboui, et de la graisse jusqu'au cou ! :) Donc je ne pense pas qu'il soit nécessaire de détailler plus, ou de vous prendre par la main, et que devriez être capable maintenant non seulement d'afficher des images, mais de stocker tout et n'importe quoi dans les overlays (fichiers textes, musique, ...). Si je trouve de nombreuses heures libres, je ferais peut-être un tuto plus générique pour démarrer la programmation PCEngine, mais on trouve ce genre de tuto je pense en grand nombre déja sur la toile.

8) Remerciements :

Merci à TOUKO pour sa patience face à mes incompréhesions. Sans lui je n'aurais pas pigé grand chose à l'affichage d'image à partir d'Overlay sur PCEngine ! Merci énormément !

2 commentaires:

  1. Tu parles,ca été un grand plaisir de t aider ;-)

    Mais à force de bosser sur la coleco,je suis obligé de refaire toutes ton éducation lol. ..

    TOUKO

    RépondreSupprimer
    Réponses
    1. Sans sans oublier aussi les soupers outils d orion que je remercie .

      Supprimer