Messagerie


Programmer les consoles rétro.

Monos
2713 messages
Fusion 2.5 Dev
Fusion 2.5+ Exporteur Android Exporteur HTML5
mardi 4 juillet 2017 à 20:48
Old school powa, voici un topic pour parler de la programmation des vielles consoles. C'est un sujet qui m’intéresse de plus en plus, et je commence à tester des trucs à droite et à gauche et chose qui est génial, c'est que nous ne sommes pas obligé de faire de l'assembleur même sur les 8 bits.

La DreamCast
Console de chez séga.  Une des première "128" bits  être sorti sur la marché mais ça reste un processeur 32 kékétes. cadancé à 400 Mhz.
Au niveau de la mémoire c'est 16 MO en Ram,  8Mo en vidéo(V Ram), et 2MO pour les zic.

Sur machine réel, si vous avez une dreamcast, lancé un cd de musique, si le cd de musique se lance, vous pouvez tester des homebrew dessus  avec des cd gravés.

La console se programme "facilement" en C.  Elle utilise une bibliothèque spéciale (KOS) Lien. Ceci dit un monsieur français. Michel Louvet, à fait une passerelle simplifier. le GFX Engine qui permet de coder sur pc, de tester ses productions sur PC (Avec la librairie SDL) et d'exporter ensuite sur le dreamcast.(Librairie KOS)
La GFX permet de gérer les pad, afficher des images, des sprites (avec colision), jouer de musiques, donc tous pour faire un petit jeu. Pour d'autre truc plus pointu, (comme la sauvegarde) il faut repasser avec les fonctions du KOS.
Ce monsieur explique ça lib en vidéo.
Lien

Avec Lien de téléchargement, comment installer les outils pc et pour la dreamcast, des petis cours en C pour débuter.

L'installation est pas trop compliqué.

La Mégadrive
Console de Séga. C'est une machine "16 bits".  avec le motorola 6800 (7,6 MHz ) (16 bits avec des instruction en 32 bits)  avec un co proco 8 bits le Zilog 80 (3,58Mhz) (8 bits avec des instructions 16 bits)

Une palette de 512 couleurs, 61 couleurs simulatné d'aprés le wiki.

Elle se programme en assembleur comme toute machine de toute façon, il y a des bibliothèque en c que je vais bientôt testé, mais surtout elle peut aussi se programmer en basic avec un ide/compilateur pour windows qui s'installe facillement et exporte le fichier binaire de la mégadrive facilement.

BasiEgaXorz : Lien
Il faut quand même se documenter sur la machine.
Mais l'ide, tu télécharges, tu installes, tu codes, (mais tu regardes quand même le mode d'emploie pour connaitre les fonctions xd)

Voila deux programme pour deux consoles,  j'espére vous en présenter d'autre que j'arrive à installer et expliquer comment car des fois / souvent c'est le parcourt du combattant.

Megadrive en C
Il faut installer le SGDK
Lien
Voici le tuto en anglais pour code blocks. Lien
Utilisez la dernière version de CB (16.1 au minimum), et placez le SGDK dans un dossier à la racine du C. 

n'oubliez pas de définir les deux variables d'environnement :
GDK et GDK_WIN qui pointe sur le dossier ou est installé le SGDK.

Pour windows 7 c'est clique droit sur l'ordinateur, propriété,  paramètre  système avancés,variable d'événement.


Quand vous créez un projet, n'oubliez pas de placer le dossier inc, out, res,src dans celui si et ce morceau de code à la compilation fonctionne dans un émulateur.

#include <genesis.h>

int main()
{
VDP_drawText("Hello Genny World!", 10, 13);

while(1)
{
//read input
//move sprite
//update score
//draw current screen (logo, start screen, settings, game, gameover, credits...)

//wait for screen refresh
VDP_waitVSync();
}
return (0);
}

Sinon le tuto en anglais pour l'installation fonctionne bien.
Ps je n'ai rien touché dans projects build options/ "make" commandes
Cela semble bien fonctionner sans toucher ce truc la.

Dans mes tests, il y a deux compilation à faire, je ne sais pas encore pourquoi.
Voilou.

Yahou
Modifié le mercredi 5 juillet 2017 à 05:34 par Monos
Monos
2713 messages
Fusion 2.5 Dev
Fusion 2.5+ Exporteur Android Exporteur HTML5
mercredi 5 juillet 2017 à 05:33
Megadrive en C
Il faut installer le SGDK
Lien
Voici le tuto en anglais pour code blocks. Lien
Utilisez la dernière version de CB (16.1 au minimum), et placez le SGDK dans un dossier à la racine du C. 

n'oubliez pas de définir les deux variables d'environnement :
GDK et GDK_WIN qui pointe sur le dossier ou est installé le SGDK.

Pour windows 7 c'est clique droit sur l'ordinateur, propriété,  paramètre  système avancés,variable d'événement.


Quand vous créez un projet, n'oubliez pas de placer le dossier inc, out, res,src dans celui si et ce morceau de code à la compilation fonctionne dans un émulateur.

#include <genesis.h>

int main()
{
VDP_drawText("Hello Genny World!", 10, 13);

while(1)
{
//read input
//move sprite
//update score
//draw current screen (logo, start screen, settings, game, gameover, credits...)

//wait for screen refresh
VDP_waitVSync();
}
return (0);
}

Sinon le tuto en anglais pour l'installation fonctionne bien.
Ps je n'ai rien touché dans projects build options/ "make" commandes
Cela semble bien fonctionner sans toucher ce truc la.

Dans mes tests, il y a deux compilation à faire, je ne sais pas encore pourquoi.
Voilou.

Yahou
Monos
2713 messages
Fusion 2.5 Dev
Fusion 2.5+ Exporteur Android Exporteur HTML5
mercredi 5 juillet 2017 à 06:01
Lien
Je laisse l'image en lien, mais ça marche, une version écrite en basic avec bex sur megadrive et l'autre en C avec le SGDK.
Fiou apprendre à installer les SDK  en C des machines c'est quand même pas aisé et use friendly quand même.

890 messages

mercredi 5 juillet 2017 à 14:10
Merde... t'assure Monos :)
Au passage tu regarderas le titre tronqué de ton sujet dans le forum... moi çà m'a fait rire !! ;)
Bonne continuation !
Monos
2713 messages
Fusion 2.5 Dev
Fusion 2.5+ Exporteur Android Exporteur HTML5
mercredi 5 juillet 2017 à 17:49
lol. J'assurais quand j’arriverais à manipuler la megadrive xd c'est c'est qu'un truc simple.
Monos
2713 messages
Fusion 2.5 Dev
Fusion 2.5+ Exporteur Android Exporteur HTML5
jeudi 6 juillet 2017 à 06:17
La mégadrive peut mémoriser 4 palettes. Chaque palette possède 16 teintes. La teinte 0 est transparente. (Donc si j'ai bien compris sans bidouiller en langage machine pour faire des manipes à gogo, c'est une 60en de couleur affichable à l'écran simultané.

Une teinte est programmé sur 2 octets.  (16 bits) et chaque teinte (Rouge, Verte, Bleu) prend une valeur entre 0 et 7 donc 8 valeurs. Ce qui fait que la mégadrive possède une palette de 512 teintes.  (8*8*8)
L'amiga avec le chipset origine à 16 valeurs dans chaque teinte. (une palette de 4096 couleur)
si je ne me trompe pas le mégadrive possède le même nombre de couleur qu'un atari St. Enfin les premiers.

Au niveau du codage des teinte :
xxxxBBBxVVVxRRRx

x= obligatoirement 0
BBB,VVV,RRR c'est 0 ou 1 et donc si on réunnis les 3 BBB en binaire ça fait bien une valeur en 0 et 7.

le blanc devrais donc être codé :
0000111011101110 en Binaire
soit 0777 en hexadécimal la teinte 1911 en décimale.
En exa ça parle de lui même. 0777  le premier 7 pour le Rouge, le deuxième 7 pour le Vert, et le troisième jeu, set et match pour le bleu ! avec le 0 au début qui représente rien du coup.

J'ai pas la documentation de la snes. (Bientôt Bientôt, je devrais recevoir demain un everdrive snes, et ce week end je tente d'installer un SDK SNES), mais je crois que les couleurs sont encodé sur du 24 bits avec 256 couleurs affichable à l'écran mais comme la mégadrive, il y a une notion de multi palette.

Pour les personnes qui ne savent pas, l’hexadécimal c'est tous simplement une valeur entre 0 et 15. Une fois qu'on dépasse 9 on utilise des lettres.
A = 10
B = 11
C = 12
D = 13
E = 14
F = 15

C'est pratique pour lire du binaire. Car les 4 premiers valeurs d'un octets = 0 et 15 donc une valeur héxadécimal. Idem pour les 4 derniers.
Exemple :

1011-0110
1011= B en hex soit 11 en décimal
0110= 6 en hex soit 6 en décimal
Donc 10110110 en binaire = B6 en héxadécimale soit 182.

Donc 8 bits = 1 octet. Soit une case mémoire des systèmes informatiques. (Et ne pas confondre Bit et Byte, ni quequette d'ailleur).
Un Byte c'est fréquemment 8 bits donc 1 octet.

Caractéristique de la mégadrive !
Et oué, programmer une console rétro c'est connaitre ses caractéristiques.

D'aprés le guide officiel de la mégadrive
Processeur principale : Le Motorola 6800 cadencé à 8 Mhz.
C'est un proco 16/32 bits. C'est le même qui équipe les Atari ST et l'amiga 500.
C'est une  1 MO dédié à la Rom. (Pour les plus grosse rom il y a du bank management à faire je suppose)
64Ko de Ram ! C'est pour les calcules, donnée du jeu en mémoire. 64ko c'est peux ? Oui sauf que :

Il y a de la mémoire vidéo dédié.
64ko dédié en gros pour les graphismes dont
64 * 9 bits dédiés au couleur ! (les palettes)

La mégadrive posséde un Co processeur, le Z80 (processeur 8 bits avec des instructions codé sur 16bits)  (4 mhz) qui équipe la Game Boy, la master système, la Game Gear, au niveau des micro, on passe par l'amstrad, le Zx Spectrum, le MSX et j'en oublie d'autre.
Le Z80 permet de faire tourner les jeux de la Master Système avec la rétro compatibilité, et s'occupe du son avec 8 ko de mémoire dédié à celui si.

Voilou Voilou pour le moment.
conceptgame
429 messages
Fusion 2.5 Dev
Fusion 2.5+ Firefly Exporteur iOS Exporteur Android
jeudi 6 juillet 2017 à 07:37
Super intéressant, Monos!  :bravos
Je vais regarder cela de plus près.
Seyjin
1471 messages
Fusion 2.5 Dev
Exporteur Android Exporteur HTML5 Fusion 2.5+
jeudi 6 juillet 2017 à 08:39
À propos des palettes de couleurs, je crois que la Megadrive peut en changer en court de jeu. La transformation en Super Sonic en est un bel exemple.
890 messages

jeudi 6 juillet 2017 à 11:16
Pour les palettes, vous pouvez créer vos sprites sous GFX2 (si cela existe encore). Il faut juste vérifier que le positionnement de la couleur indexée 0 est bien en début de la palette (ou l'inverse je sais plus...). Sinon si tu as un amiga, ba le top du top c'est deluxe paint (Dpaint).
Quand vous bossez en palette, il faut la construire avant de dessiner. Par exemple :
index 0 : transparence
index 1 à 64 : les personnages
index 65 à 96 : les effets
index 97 à 255 : les décors...
De cette façon, changer de décors en changeant de palette n'est jamais risqué. Idem pour changer les couleurs des persos.
je ne me rappelle plus si on peut faire un merge de palette avec des tailles différentes ou si le plus simple est de carrément charger une nouvelle palette.
Bon courage en tout cas !
PS : mais tu fais chier quand même, çà nous rajeunit pas ton bazar !!! ;) J'ai l'impression d'avoir choper 50 ans ! note je les ais presque...
Monos
2713 messages
Fusion 2.5 Dev
Fusion 2.5+ Exporteur Android Exporteur HTML5
jeudi 6 juillet 2017 à 12:16
Il existe un autre log 'que je n'ai plus nom' pour découper une image png et sa palette et la transformer en donné c ou basic. Il est installé sur mon pc fixe. J'en parlerais ce week end.
Monos
2713 messages
Fusion 2.5 Dev
Fusion 2.5+ Exporteur Android Exporteur HTML5
jeudi 6 juillet 2017 à 18:48
Le logiciel que j'ai c'est imaGenesis 4000.
Monos
2713 messages
Fusion 2.5 Dev
Fusion 2.5+ Exporteur Android Exporteur HTML5
jeudi 6 juillet 2017 à 21:19
Un second logiciel pour mégadrive pour créer des jeux en Basic.
Lien
Monos
2713 messages
Fusion 2.5 Dev
Fusion 2.5+ Exporteur Android Exporteur HTML5
vendredi 7 juillet 2017 à 07:33
Le megadrive à trois plans. (3 calques/couche enfin appelé ça comme bon vous semble).
Plan A et Plan B qui est scrollable d’après les info. (Tiles par Tiles en horizontal et 2 tiles par 2 tiles verticalement) En sachant qu'un tiles c'est 8 points sur 8 !

Et le plan windows qui se superpose obligatoirement au plan A et B mais qui ne peux pas scroller. (Pratique pour l'affichage du hud ...)

Plus un "plan" pour les sprites machines.

Au niveau du codage un tiles semble prendre 64 octets.
8 octets par Lignes. Chaque octet semble être un point en fonction de l'idée de la couleur de la palette associé. En tout cas c'est le codage dans le SDGK.

Donc pour faire traditionnellement un tiles  de 16 points sur 16, il faut afficher 4 tiles.
Les coordonné avec le SDGK n'est pas en pixel ou point pour placer un tiles mais coordonné de cellule.
Une cellule c'est 8 points sur 8. Oh un tile !

En fonction des infos que je peux lire ont peux mémoriser 2048 tiles en même temps, soit 128 tiles de  16 points sur 16.

Points => Pixel ?
Je parle rarement en Pixel quand je touche à du rétro pour la simple et raison, qu'un pixel c'est le plus petit élément graphique que nous pouvons allumer sur un écran, et un point c'est un un point lumineux et logique qu'une machine allume. Et en fonction de la machine et de son mode, ce "point" logique peut prendre un certain nombre de pixel en largeur et en hauteur.

C'est vérifiable sur l'amstrad. Quand on demande en mode 0 de poser un point à l'écran, il affiche un point de 4px de largeur et 2 de hauteur.

2 sur 2 en mode 1

et 1 sur 2 en mode 2.
...


Monos
2713 messages
Fusion 2.5 Dev
Fusion 2.5+ Exporteur Android Exporteur HTML5
samedi 8 juillet 2017 à 07:39

Bon c'est anodin comme graphismes !  Mais voila, ça marche, j'ai réussis à comprendre comment mettre en mémoire un Tiles et surtout les poser sur un plan. Savoir poser un tiles c'est déjà le début pour faire certain type de jeu et ça c'est cool...

890 messages

samedi 8 juillet 2017 à 09:44
ouep pas mal ! :bravos
Monos
2713 messages
Fusion 2.5 Dev
Fusion 2.5+ Exporteur Android Exporteur HTML5
dimanche 9 juillet 2017 à 07:41
Je bute sur les sprites, M. Louvet va me donner de la doc bientôt <3
Alors je sais faire quoi sur mégadrive ? Pas grand chose. Afficher des tiles, savoir les mémoriser en la mémoire Vidéo, savoir les poser sur un plan, gestion des pad (ça c'est simple) utiliser une palette de couleur mais c'est encore la cata pour avoir la bonne couleur que je veux vu l'encodage. Ah un truc , l'encodage c'est pas Rouge, Vert Bleu , mais l'inverse,  Bleu, Vert, Rouge !  0x0BVR


890 messages

dimanche 9 juillet 2017 à 08:05
tu butes sur quoi sur les sprites ? Du temps où j'avais fait un peu de basic, on avait une bande de sprites et tu affiches une zone de ta bande, tu fais une translation en X, tu re-affiches etc... de tête tout était dans une boucle For avec une re-init à la valeur limite. reste juste à mettre en place un timer pour cadencer ton anim (le temps entre 2 images).
Monos
2713 messages
Fusion 2.5 Dev
Fusion 2.5+ Exporteur Android Exporteur HTML5
dimanche 9 juillet 2017 à 08:48
On va commencer à afficher un "sprite" ça sera déjà bien xd.
Monos
2713 messages
Fusion 2.5 Dev
Fusion 2.5+ Exporteur Android Exporteur HTML5
dimanche 9 juillet 2017 à 08:54
J'ai fais une erreur de calcule dans les posts précédent. Un tile de 8px prend bien 32 octets de place mémoire et non 64.

Un morceau de tiles est égale à 8px par 8px. Quand on mémorise dans un tableau un tiles :
....
0x11111111
0x13333333
0x13333333
0x13333333
0x13333333
0x13333333
0x13333333
0x13333333
....

Une entrée c'est une ligne de 8px codé sur 8 valeurs Hexadécimale qui représente un point sur l'écran et une couleur de la palette. Il faut "deux valeurs" hexadécimale pour faire un octet. (h00=>hFF => 0 à 256 soit 8 bits donc un octet, donc une case mémoire quoi !) donc 8/2 = 4 octets par ligne. Il y a 8 lignes donc 32 octets pour un tiles de 8 * 8. (128 octets pour un tile normale on va dire de 16 par 16.)
Monos
2713 messages
Fusion 2.5 Dev
Fusion 2.5+ Exporteur Android Exporteur HTML5
dimanche 16 juillet 2017 à 08:46
Second Baisc, un autre logiciel pour créer des jeux sur mégadrive.
Lien

Il a l’avantage d'être toujours en dev par apport à Bex. enfin sa dernier update date quand même d'un an. (Et il reprend bex en tous cas c'est un peu sa suite logique)

Ils fonctionne pas trop mal, facile à installer.  J'arrive à gérer un peu les tiles et sprites chose que j'ai pas réussis avec le SDK en C pour les sprites.

J'ai remarqué un truc rigolot, les 255em premier slot de la vidéo ram c'est de l'ascci ! si je remplace le bloc 65 par exemple par un autre graphismes et que je fais un print "A" ça affiche le nouveau "tiles".

Ce qui est finalement logique. Un tile c'est 8*8 points. Un lettre c'est 8*8. On peux placer un tile que sur les cellules, et pas au point prés. (les sprites oui)
Donc j'en déduit que print "..." c'est un DrawTile ASC("")x,y
x,y c'est le locate X,Y du print ah ah.

Bon ça ne sert à rien mais c'est rigolot de voir ça. Il y a peut être quand même une différence dans l’exécution.

Second Basic c'est fort sympa, j'ai un "débuger" avec la liste des variables, son type, et ou elle se trouve en mémoire.

SB à 4 types de variables.
- Les Unsigned Integer (16 bits soit  2 octets la variable)
- Les Unsigned Long (32 bits soit 4 octets la variable)
- String (rien à voir avec les sous vêtements)
- Arrays (Tableau)

Il n'y pas de variable signé donc il ne connais pas les valeurs négative.
Je viens de faire un test :
A=-50
Print A
et le résultat me donne 65486

Heum 65486+50 = 65536

Autre test avec un -1
65535

Allez fin du suspense, une valeur int permet de mémoriser un nombre entre 0 et 65535, donc si on ajoute 1, ça repart à 0 !
(2 octets donc 256*256 => 65536 donc 0 => 65535)

Un long codé sur 32 bits = 4 octets donc 256*256*256*256 : (4294967296)=> 0 à 4 294 967 295
C'est pour ça que les windows 32 bits ne peuvent pas adresser en mémoire plus de 4Go en même temps ! Car le "compteur de mémoire" c'est une variable de 32 bits pour mémoriser les adresses mémoire (je fais simple).

Cela d'un système 64 bits permet lui d'aller théoriquement jusque à 256 puissant 8 = 281 474 976 710 656 octets.
Les Consoles/micro ordi 8 bits avait 'souvent' un "bus" de mémoire de 16bits. Donc 65 535 octets adressable simultanément. Pour ça que nous avions souvent 64ko de mémoire maximum sur les vieux ordi, mais avec les échanges de partie de mémoire avec une autre, le CPC 6128 avait plus de mémoire indivisible mais pas en même temps... (Bank Memory)

Voilou pour le nouveau truc made in monos xd"








Utilisateurs en ligne
  • Aucun utilisateur en ligne
  • 28 visiteurs au total

Derniers messages