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 .........
- KMOD
- SGDK
- Projets

Dans le dossier SGDK pas grand chose à faire normalement

Nous allons voir notre dossier projets
Je refais dedans un dossier avec le nom du projet.
Dans celui si je place un dossier que je nomme src pour placer mon code source, puis res pour placer mes ressources à travaillé par le SGDK. Enfin un dossier bin ou je vais déplacer et modifier le nom du fichier bin généré par SGDK. Plus pratique après à retrouver que dans le bordel du dossier out qui sera généré automatiquement par le SGDK.
Dans le dossier SRC, un dossier boot sega rénéré par le SGDK. Perso je fais un dossier header pour placer tout mes fichiers .h

Les Fichier bat, je fais plusieurs fichier bat. Débutons par le simple fichier que je nomme compilation_lunch.bat
Il me permet de compiler le projets mais seulement les fichiers qui ont été modifié.

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 /...
rem * copy *
copy "out\rom.bin" "bin\prisonnier.bin"
Modifier le nom prisonnier par le nom de votre jeu. Cette fonction permet de copier le bin généré par SGDK dans le dossier bin avec le nom que vous voulez.

set Lgens=..\..\kmod\gens.exe
L'adresse de l'émulateur gens tout simplement.

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
Encore une fois modifier le nom prisonnier par votre jeu.

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