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
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.