Accueil | Articles | Qui-suis-je | Archives | Palette |Collection |card flash|Revendeurs|Homebrew|Programmation|Annuaire | ||
Programmation de la mégadrive
Voici une petite page sur mes recherches dans la programmation de la mégadrive.
SDK/Logiciel :
BasiEgaXorz, Programmation en langage Basic.Second Basic , un autre ide en langage Basic. SGDK, programmation en langage C.Tuto pour l'installation du SGDK Mon Workflow avec le SGDK sur windows
L'installation du SGDK n'est pas bien compliqué. Je l'utilise simplement à coup de fichier .bat voici un peu mon organisation du SGDK. Mon organigrame est simple, j'ai une partition de mon disque dur dédié au SGDK et qui porte le nom SGDK. Dans celui si je place le dossier du devkit téléchargé sur le site du SGDK. Sois vous téléchargez la version "stable" ou en cours de dev donc le git. La je renomme mon dossier SGDK au lieu de SGDK-master. Et si je dois remplacer le SDK, l'ancien je le renomme SGDK-old en cas ou et je le garde. Toujours à la racine de ma partition, je place l'émulateur gens avec le kmod. J'ai réalisé d'autre dossier comme Tool pour placer divers utilitaires, ou doc bref . Et important, je fais aussi un dossier projet ou je place mes projets réalisé avec le SGDK.
........Dossier SGDK ......... Dans le dossier SGDK pas grand chose à faire normalement Nous allons voir notre dossier projets Les Fichier bat, je fais plusieurs fichier bat. Débutons par le simple fichier que je nomme compilation_lunch.bat echo off echo ========================================= echo * Compilation pour la megadrive/genesis * echo ========================================= Rem ====================================================== Rem * Configuration des liens vers le dossier du SGDK * Rem * Attention le GDK_WIN utilise des \ et le GDK des / * Rem ====================================================== set GDK_WIN=W:\SGDK set GDK=W:/SGDK set Lgens=..\..\kmod\gens.exe set Lprojet=..\projets\prisonnier\out\rom.bin Rem =========================== Rem * Commande de compilation * Rem =========================== %GDK_WIN%\bin\make -f %GDK_WIN%\makefile.gen rem * copy * copy "out\rom.bin" "bin\prisonnier.bin" Rem ============================ Rem * Lancement de l'émulateur * Rem ============================ echo ======================= echo * lancement emulateur * echo ======================= pause %Lgens% %Lprojet% pause Le script n'est pas parfait, par exemple j'ai pas mis en variable le nom du jeu, et d'autre truc de configuration, mais en le regardant, il est facile de le modifier pour l'adapter à votre projets. Attentions avec set GDK_WIN=W:\SGDK etset GDK=W:/SGDK à bien respecter le sens des \ et /... set Lgens=..\..\kmod\gens.exe J'utilise aussi un script pour effacer les fichiers généré par SGDK. (Fichier .o et autre) je nomme mon fichier compilation_clean.bat car après je re compile directos. Voici le script. rem del out\res\resources.o rem compilation_lunch.bat set GDK_WIN=W:\SGDK set GDK=W:/SGDK set Lgens=..\..\kmod\gens.exe set Lprojet=..\projets\prisonnier\out\rom.bin Rem =========================== Rem * Commande de compilation * Rem =========================== %GDK_WIN%\bin\make -f %GDK_WIN%\makefile.gen clean compilation_lunch.bat Rien de bien particulier. Si vous avez un everdrive de chez krizz avec branchement usb sur le pc, vous pouvez envoyer la rom du PC à la megadrive facilement. Personnement dans le bin, j'ai placé le programme mega-usb.exe et j'ai fais un fichier bat avec ceci :
bin\mega-usb.exe bin\prisonnier.bin Voila, rien de sorcier finalement pour installer le SGDK pour une utilisation à la mano, après on peux encore automatiser la compilation avec les ide mais la ce n'est pas ma came !!! Caractéristique Nom official : Sega Megadrive (1 et 2) /Sega Genesis (1 et 2) Microprocesseur :Motorola 68000 (8Mhz) et Zilog Z80A (4 Mhz) Mémoire Ram :64Ko Mémoire Vidéo :64Ko Mémoire Sonore : 8 Ko Graphismes : -4 Palettes de 16 couleurs qui sont programmables. -Nuancier de 512 teintes. (8 niveaux de rouge, 8 niveaux de vert, 8 niveaux de bleu) -320x224px (40x28 tiles) et 256*224px (32*28 tiles) en NTSC (60 hz) -320*240px (40x30 tiles) et 256*240 px(32*30 tiles) en PAL (50 hz) -Sprite machine (80) / Plan Windows / Plan A / Plan B Sonore : -PSG Ti 76489 Chip -FM Chip Yamaha YM 2612 (6 canaux stéréo) Encodage des couleurs
Poids d'un tiles de 8*8
Espace pris d'un tiles de 8*8 : 32 octets(soit 128 octets pour un tiles de 16*16) Explication Un tiles c'est 8 points de largeur et 8 points de hauteur. La mémorisarion d'un tiles se fait avec 8 valeurs hexadécimal répété 8 fois. Un octet c'est une valeur entre 0 et 255 soit deux valeurs haxadécimale. (8 bits) Ce qui fait donc par ligne 8/2 = 4 octets par ligne répété sur 8 lignes soit 32 octets par tiles. Un tiles "Standard" de 16px est égale à 4 tiles. Soit 128 octets de mémoire. Exmple d'un carré
const u32 tile[8]=
{ 0x11111111, 0x10000001, 0x10000001, 0x10000001, 0x10000001, 0x10000001, 0x10000001, 0x11111111 }; Affichage d'un tile avec le SGDK
// Placer les chevrons avant et aprés genesis.h.
#include genesis.h // Permet d'initier le nombre de Tiles dans la mémoire en define. #define NUM_TILES_TILESET 4 // Permet de définire l'adresse d'un morceau de Tiles. // Un tile est égale à 8*8px, il faut donc 4 tiles pour faire un tiles "normalisé" de 16px. #define VRAM_POS_TILE_A TILE_USERINDEX + 0 #define VRAM_POS_TILE_B TILE_USERINDEX + 1 #define VRAM_POS_TILE_C TILE_USERINDEX + 2 #define VRAM_POS_TILE_D TILE_USERINDEX + 3 // Mise en mémoire "Rom" des tiles dans un tableau. // Chaque Tile possède 8 lignes, chaque valeur est un point placé sur l'écran et qui corespond à l'index d'une palette. const u32 exemple_tile[NUM_TILES_TILESET*8] = { // TILE A 0x11111111,0x13333333,0x13333333,0x13333333,0x13333333,0x13333333,0x13333333,0x13333333, // TILE B 0x11111111,0x33333331,0x33333331,0x33333331,0x33333331,0x33333331,0x33333331,0x33333331, // TILE C 0x13333333,0x13333333,0x13333333,0x13333333,0x13333333,0x13333333,0x13333333,0x11111111, // TILE D 0x33333331,0x33333331,0x33333331,0x33333331,0x33333331,0x33333331,0x33333331,0x11111111 }; // Mise en mémoire "Rom" dans un tableau, une palette de couleur const u16 exemple_palette[16] = { 0x0000,0x06CE,0x0291,0x0412,0x0214,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 }; int main() { // En charge en mémoire vidéo la palette du tableau background_palette de la "rom" en PAL0. VDP_setPalette(PAL0, exemple_palette); // En charge en mémoire vidéo, les tiles du tableau "exemple_tile". VDP_loadTileData(exemple_tile, TILE_USERINDEX, NUM_TILES_TILESET, 0); // En affichage sur le Plan_A les 4 tiles de 8px pour reformer un tile de 16px. // Les coordonnée X et Y sont en Cellule et non en pixel, Attention à ça. VDP_setTileMapXY( PLAN_A, VRAM_POS_TILE_A , 0,0); VDP_setTileMapXY( PLAN_A, VRAM_POS_TILE_B , 1,0); VDP_setTileMapXY( PLAN_A, VRAM_POS_TILE_C , 0,1); VDP_setTileMapXY( PLAN_A, VRAM_POS_TILE_D , 1,1); // Une boucle pour le fun ! while(1) { VDP_waitVSync(); } } |
||
Site réalisé par Jean Monos |