CODINGSDCC TUT'S PAR STEPHBB75 ★ Utilisation de SDCC ★

Sdcc - 02 - Utilisation de SdccCoding Sdcc Tut's Par Stephbb75
Aller, vous allez installer SDCC, pour cela vous télécharger l'archive sur le site, vous exécutez sdcc-3.2.0a-setup.exe (quand j'ai écris cette page SDCC en était à la version 3.2a... mais prenez la dernière). Comme SDCC est un compilateur qui peut générer du code pour plusieurs CPU (et PIC), n'installez que ce qui concerne le Z80, de toute façon le reste on ne l'utiliseras pas pour développer sur CPC.

Une fois que c'est installé, y'a un truc super à faire, cela se nome "LIRE LA DOC", bon, ok, pas grand monde vas le faire ... c'est même super chiant ... je l'ai fait ... c'est super chiant je le confirme mais cela aide bien ;-).
SDCC s'utilise dans une fenêtre DOS, donc en ligne de commande ... mais bon, avec le CPC on y est habituer avec le basic ;-)

Bon, la je vais vous expliquer brièvement comment cela fonctionne, pour ceux que cela n'intéresse pas, vous pouvez aller plus bas, de toute façon je fournis en fin de page quelques "outil" pour faire la compilation ... mais en lisent cela vous permettras peut être de comprendre des choses....

Donc pour compiler on va utiliser la commande sdcc, mais toute seule elle ne fera rien !
Il faut lui passer des paramètres :

1 -mz80 pour lui dire que l'on veut compilé en Z80 ...
2 --code-loc 0x1A8 c'est le début de votre code en mémoire ... on y reviendras plus tard !
3 --data-loc 0 ça c'est pour l'adresse des DATA ...
4 --no-std-crt0 crt0_0x170.rel la cela se complique un peut, on fini puis on revient la dessus
5 hello.c ca c'est le fichier C que vous allez compiler...

Il peut y avoir d'autre chose à mettre mais on y reviendra au fur et à mesure....

On revient sur --no-std-crt0 crt0_0x170.rel, en fait SDCC n'est pas prévue pour faire du dev pour CPC, mais pour le microprocesseur Z80 !, bien que le CPC est un Z80, si on compile avec ce qu'il y a de base dans SDCC, bas cela ne fonctionnerais pas sur cpc. Il faut donc faire quelques modif des fichiers par défaut, le crt0 en fait parti. Je vous fournis un fichier qui permet de faire un programme CPC qui exécuteras à partir de l'adresse mémoire (la si vous suivez pas, faut regarder comment fonctionne le CPC !) 0x170.
Pourquoi cette adresse ... bas c'est la 1er adresse ou l'on peut exécuter un programme et de cette adresse on a 42Ko de mémoire pour faire notre programme, donc autant les prendre... pour ceux qui voudrais commencer à une autre adresse je vous explique cela.

Revenons au crt0.rel, en fait il faut faire un fichier crt0.s avec pleins de truc incompréhensible dedans ... si la preuve :
Le fichier ce n'est pas moi qui l'est modifié au dépars, je l'est utilisé et remodifié.

;; FILE: crt0.s ;; Generic crt0.s for a Z80
;; From SDCC..
;; Modified to suit execution on the Amstrad CPC!
;; by H. Hansen 2003
;; Original lines has been marked out!
.module crt0
.globl _main
.area _HEADER (ABS)
;; Reset vector
.org 0x170 ;; Start from address &170
jp init
.org 0x180
init:
;; Stack at the top of memory.
;; ld sp,#0xffff
;; I will use the Basic stack, so the program can return to basic!
;; Initialise global variables
call gsinit
call _main
jp _exit
;; Ordering of segments for the linker.
.area _HOME
.area _CODE
.area _GSINIT
.area _GSFINAL
.area _DATA
.area _BSS
.area _HEAP
.area _CODE
__clock::
ret
_exit::
ret
.area _GSINIT
gsinit::
.area _GSFINAL
ret

Alors ce qu'il y a d'important dans ce fichier c'est la ligne .org 0x170, c'est la que l'ont dit ou vas être notre adresse de départ.
Ensuite il y a la ligne .org 0x180, c'est la que l'ont vas trouver le "début" de notre programme, c'est du super simplifier la ;-)
Il faut donc compiler ce fichier pour pouvoir l'utilisé ensuite, on fait cela avec cette commande : sdasz80 -o crt0.s ce qui vas nous créer un fichier crt0.rel.
Tien, toi dans ton exemple il se nome crt0_0x170.rel ?
Bas oui, je me suis fait plusieurs fichier crt0.rel, donc je les est nommé différemment ;-)
Si vous voulez mettre une adresse de départ différente, par exemple 0x4000, il faut changer les deux lignes du crt0.s comme suit .org 0x4000 et .org 0x4010. Il faudra aussi changer le paramètre --code-loc 0x1A8 en --code-loc 0x4038, en fait il faut y mettre 0x38 de plus que l'adresse que vous avez mis pour .org 0x180

Bon, on en est ou la ...
On est prêt à faire une compilation, mais quoi compiler ?

On va se faire le super fabuleux "Hello World" bien sur !!!
(Promis, je tente de faire des exemple bien plus intéressent les prochaine fois ! )
Voici le fichier Hello.c
include

main()
{
printf("Hello world");
while(1) {};
}

le while(1) {}; c'est pour évité qu'une fois le programme fini on retourne aussitôt sur le CPC, car pour le moment quand vos programme se termine, le CPC reboot !!
A oui, mais avant il nous faut un autre fichier dans se cas la, effectivement si on compile comme cela, cela ne fonctionne pas car SDCC ne sais pas comment on affiche un caractère sur CPC, on va donc lui donner avec le fichier putchar_cpc.s, la je me suis vraiment pas foulé non plus il se trouve sur le net... (indice, il faut le compiler comme crt0 !) vous le trouverez à la fin de la page.
Mais il faut ajouter un argument à la ligne de commande, il faut dire à SDCC qu'il faut qu'il prenne notre putchar, cela se met en paramètre 5 "putchar_cpc.rel" (bien sur l'enceint 5 devient le 6 !).
La ligne de commande devient donc : sdcc -mz80 --code-loc 0x1A8 --data-loc 0 --no-std-crt0 crt0_cpc.rel putchar_cpc.rel Hello.c

On se retrouve avec pleins de fichier, celui qui nous intéresse c'est le Hello.ihx, c'est le binaire généré par SDCC, mais celui ci n'est pas exécutable comme cela sur CPC (et non, toujours pas !!!)
Il vas falloir le passer dans une moulinette hex2bin, qui lui aussi s'utilise en ligne de commande comme suit : "hex2bin Hello.ihx" ce qui vas nous créer un fichier Hello.bin.
Ce fichier est enfin exécutable sur CPC...

Pour mettre notre fichier sur une disquette virtuel on va utilisé CPCDiskXP comme suit : CPCDiskXP -File Hello.bin -AddAmsdosHeader 170 -AddToNewDsk Hello.dsk
Tien, on retrouve notre 170 dans cette ligne de commande, ceux qui on suivit ont comprit ;-)

La vous n'avez plus qu'a prendre votre émulateur préféré de charger la disquette, tapez "run Hello.bin" et voila ...

stephbb75

AUTEUR: Stephbb75

Page précédente : Developper en C pour CPC

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Sdcc - 05 - Ecrire du Text
» Coding » Sdcc - 22 - Afficher uneImage
» Coding » Sdcc - 17 - 3D - Trace Points
» Coding » Sdcc - 11 - Attaquer le Crtc
» Coding » Sdcc - 23 - Slide Show
» Coding » Sdcc - 09 - Cls Ultra Rapide
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 139 millisecondes et consultée 2993 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.