ProgrammationDC

  

 

 

 

Utilisation de Visual C++ pour faire du Dev sur DC avec KOS

Utilisation de Visual C++ pour faire du Dev sur DC avec KOS

par JMD // Mai 2003

 

Ce document a pour but de montrer comment configurer un environnement de développement pour Dreamcast sous Windows avec Visual C++ 6.  Tout d'abord, il est préférable d'avoir une connexion rapide car il y a un certain nombre de fichiers volumineux à télécharger.

Note légale

Bien sûr, ce document n'engage que moi et vous utilisez son contenu à vos risques et péril. Ce document est librement distribuable. Toutefois, si vous utilisez une partie ou l'ensemble du document, merci de me le signaler et de ne pas oublier de me citer.

Installation

On s'appuie sur la méthode de Thepernproject.com

La première chose à faire est de se munir d'une version de visual C++ . Une version 'd'apprentissage' était fournit avec certains journaux (Un hors série de PC Team par exemple) ou avec certains bouquins sur VC++.

Une fois l'appli installée, il faut télécharger le compilateur et KOS. Le plus simple est de récupérer la 'toolchain' déjà pré-configurée fournie sur le site : www.thepernproject.com. C'est un fichier (DKDC_Setup.exe) qui pèse un peu plus de 16 MO et qui comprend le compilateur GCC, certains outils et une version (assez vieille) de KOS pré compilée. Installez ce package. Je vous conseille de l'installer dans DevkitDC tel que c'est proposé.

Tant qu'on y est, on va télecharger l'assistant de création de programme DC qui est fournit sur le site (DC_DK_AW_Setup.exe). Il suffit de l'installer.

Tout est maintenant prêt pour commencer.

 

Mise au goût du jour de l'ensemble

Malheureusement tout n'est pas si rose car vous pouvez effectivement commencer comme ça mais vous avez une configuration qui date déjà pas mal et vous allez vous priver de pas mal de choses sympas (nouvelles fonctions de KOS et Sdl par exemple)

La première chose à mettre à jour est KOS. La version la plus rapide est d'aller sur le site de Cryptic Allusion (http://sourceforge.net/projects/cadcdev/) pour télécharger la dernière version de KOS (version 1.1.9 pour ce doc) . Choisir la version des binaires (pas les sources car il vous faudrait les recompiler) et décompacter là dans votre répertoire DevKitDC. Vous allez écraser votre vieille version de KOS pas belle par une super nouvelle.

 

Un nouveau programme... C'est bien beau, mais quand ça marche pas ...

Maintenant que tout est OK, vous ouvrez fébrilement votre Visual C++, vous créer un nouveau projet en choisissant dans la liste 'Dreamcast Project' et en remplissant bien le nom et le Path. Vous ne lisez pas ce qu'il y a écrit et vous vous précipitez sous OK.

Là, vous avez un nouveau Workspace avec un main qui a été écrit dans lequel il y a plein de baratin.

Vous faites un Built/Built All et là ....

fatal error U1081: 'ÜXX€T\bin\gcc' : program not found

Et oui ... Par défaut, le path du compilateur n'est pas écrit correctement dans le Makefile ! Il faut donc aller le rajouter à la main. Aller dans le fichier .mak et remplacer la ligne

DEVDIR = ÜXX€T##

par DEVDIR = c:\DevKitDC

 

Biens surs, si vous n'avez pas suivi mes conseils, mettez y le nom du répertoire dans lequel vous avez GCC et KOS.

De plus, changer la ligne :

        LDFLAGS = -L $(LIBDIR) -L $(LIBDIR2) -lgl -ldcutils -lkallisti -lgcc -Ttext=0x8c010000

par

        LDFLAGS = -L $(LIBDIR) -L $(LIBDIR2) -lgl -ldcutils -lSDL -lm -lkallisti -lgcc -Ttext=0x8c010000

Ceci vous permettra de compiler la librairie SDL (vous verrez, vous l'utiliserez :). Bon, c'est tout pour le fichier mak. Dans tous les cas, il y a plein de baratin en anglais, assez facile à comprendre qui vous guiderons si vous avez besoins de rajouter des fichiers où autre.

On y va, on compile ... Et bam ... ça marche pas ... Je sais, c'est énervant.

l'erreur doit être un truc du genre :

    `ALL_ENABLE' undeclared (first use in this function)

En effet, l'assistant crée un début de programme pour une vieille version de KOS. Hors depuis, le principe de l'initialisation a changé.

Il vous faut donc enlever les lignes :

kos_init_all(ALL_ENABLE, ROMDISK_NONE);

et kos_shutdown_all();

Pour les remplacer par une version plus récentes (et plus efficace !). Ajouter donc avant le main() la ligne suivante :

KOS_INIT_FLAGS(INIT_DEFAULT);

Il existe tout un tas de possibilité pour 'shutter down' la DC (des fois, vous regretterez d'ailleurs:) mais une qui marche bien et qui est bien pratique est : arch_reboot(); qui fait un reset de la DC.

On a donc le petit programme suivant :

#define _arch_dreamcast
#include <kos.h>

// Initialisation de KOS : Options par défaut
KOS_INIT_FLAGS(INIT_DEFAULT);

int main(int argc, char **argv){
// on reboote la DC

arch_reboot();
return 0;
}

Ce programme ne fait rien. En fait si, il reboote la Dreamcast ... C'est déjà quelque chose.

Tout est maintenant prés pour que vous commenciez.

Bonjour le monde .... Un bon début

si vous avez un câble DC-PC (Coder Câble) , vous pouvez déjà commencer à vous amuser.

Le programme le plus simple est le classique Hello World.

 

#define _arch_dreamcast
#include <kos.h>

// Initialisation de KOS : Options par défaut

KOS_INIT_FLAGS(INIT_DEFAULT);

int main(int argc, char **argv){

// Bonjour le monde

printf(« Bonjour le monde .... »);

// on reboote la DC

arch_reboot();
return 0;
}

On compile et hop ... on a deux fichiers en plus : HelloWorld.bin et HelloWorld.elf

On va chercher le CD de DCLoad 1.0.3 et la petite appli DC-TOOL et on passe sous DOS.

On lui passe :

dc-tool -x " HelloWorld.bin" -t COM2

J'ai rajouté -t COM2 car mon câble est branché sur mon 2nd port COM.

On attend un peu et la Dreamcast reboote. Quand on regarde à nouveau la console DOS, on voit qu'un tas de trucs sont écrit et qu'au milieu il y a Bonjour le monde.

C'est vraiment chouette ça comme 1er programme (Il y a des conventions comme ça ...).


Bonjour tout le monde

Jusqu'à présent, seul le PC avait droit à son petit bonjour. On va arranger ça en écrivant la même chose sur l'écran de la DC.

#define _arch_dreamcast
#include <kos.h>

KOS_INIT_FLAGS(INIT_DEFAULT);

int main(int argc, char **argv){

printf("Bonjour le monde ....");
bfont_draw_str(vram_s+20*640+20, 640,0, "Bonjour tout le monde");

while(1200)
{// rien ne vaut une bonne boucle infinie
}
return 0;
}

Même manip que précédemment et un bonjour s'écrit devant vos yeux. Vous êtes émus. Non ?! Vous devriez ...

Utilisation d'un Romdisk

Utiliser un Romdisk est bien pratique. Un Romdisk est un périphérique virtuel attaché au programme. Quand on utilise un câble, il est bien pratique de mettre des infos dans un Romdisk pour ne pas avoir à graver un CD qui stocke uniquement les images par exemples. Allez voir la doc de KOS pour plus d'infos.

Le premier truc à faire est d'aller chercher bin2oDC sur mon site : http://jm1200.ifrance.com/jm1200/

Ce programme a pour but de transformer un Romdisk en objet linkable. Il vous faut le copier dans le répertoire C:\DevKitDc\utils (il doit aussi il y avoir un fichier genromf livré avec KOS).

Ensuite, il faut créer un répertoire Romdisk dans le répertoire du projet. On y déposera tous les fichiers à inclure dans le Romdisk. Attention, ne pas oublier que ce sera monté en mémoire de la Dreamcast donc pas de vidéos du petit cousin ...

Enfin, il faut rajouter les infos suivantes dans le makefile :

 

# ------------------------------------------
# Exemple of a Romdisk creation;
# -------------------------------------------

UTILSDIR = $(DEVDIR)\utils
all : romdisk.o
romdisk.img:

$(UTILSDIR)\genromfs.exe -f "$(SRCDIR)\romdisk.img" -d "$(SRCDIR)\romdisk" -v

romdisk.o:romdisk.img

$(UTILSDIR)\bin2odc.exe "$(SRCDIR)\romdisk.img" "$(SRCDIR)\romdisk.o"

après la partie qui s'appelle # Define the flags for the compilers;

Notes pour la fin

Cette méthode n'est sans doute pas la seule et reste assez artisanale. Il existe, par exemple, un AppWizard pour VC++ plus récent crée par Vorrtexx pour lequel on peut trouver un peu plus d'infos (pas beaucoup quand même) sur les forums DCEmulation ou Consolevision.

Personnellement, après des premiers essais enthousiastes, je n'ai jamais réussi a faire fonctionner le Romdisk correctement. Je suis donc revenu à ma bonne vieille méthode qui a fait ses preuves.