Pages vues depuis 25/07/2007 : 25 172 452
Index du forum »» Création-Développement »» Y-a-t'il possibilité de faire une library système en C sur Os4
The utility program idltool can be used to generate libraries as well, in a very convenient manner. All you have to do is provide the XML interface description file and invoke idltool with the command line
idltool -k <interfacefile>.xml
This will create a directory <interfacefile>_files in your current directory that contains a complete skeleton library with a Makefile and a README with additional instructions. Simply typing "make" should build the library. For more information, refer to the documentation that comes with idltool."
Et description du fichier XML :
http://wiki.amigaos.net/wiki/Libraries_and_Devices#Interface_Definition_Files
Merci de me dire si ca marche ou pas, ça m'intéresse !
>Je vois qu'un certain Alain a donné le source d'une lib ici : Simple library for sound/picture datatype
Effectivement créer une toto.library revient à
1) créer une liste propre de ses fonctions comme dans une "static library" faire tout particuliérement attention à éviter les variables globales (sauf les vraies bien sûr)
2) Y ajouter un "header" de .library : c'est incompréhensible parfois ça contient de l'asm il vaut mieux y toucher un minimum
Je suis parti de celui là
http://aminet.net/package/dev/c/CLib-SDI
Mais on peut utiliser un des miens comme celui de SimpleDT ou Wazp3D
3) Dans ce "header" standard juste quatre parties seront à adapter pour notre .library
a) nom,version,sous version, date = juste des #define à modifier
b) les fonctions de démarrage/fermeture de la .library
cad
libInit & libOpen
libClose & libExpunge
Là aussi il vaut mieux ne pas toucher au "header" et juste y appeler ses propres
LIB_Init(exec); LIB_Close(); LIB_Open(); LIB_Expunge(); définis dans un autre fichier
LIB_Init initialise pour la première fois la .library donc c'est là qu'on ouvre les autres .library dont on va se servir, alloue la mémoire,les structure et met les valeurs par défauts
LIB_Expunge c'est quand la .library est enlevée quand elle sert plus donc c'est là qu'on ferme les .library dont se servira plus,etc..
LIB_Open(); LIB_Close(); correspond à la simple ouverture/fermeture de la .library par un programme : elle est déjà en mémoire donc à priori rien à faire
Note: Effectivement avec une .library plusieurs progs ouvrent/ferment/utilisent votre .library le premier à s'en servir déclenche un LIB_Init, le dernier à la fermer provoque un LIB_Expunge
c) La jump table
C'est un tableau contenant l'adresse des fonctions à appeller car on appelle les fonctions dans une .library par leur offset
C'est un peu comme si on disait appelle moi la 3éme fonction donc il faut un tableau pour faire cela fonction=jumptable[3];
d) les glue functions
Sur Amiga OS3 les fonction sont appellées en assembleur avec les parametres dans les registres
Mais nous avons écrits des fonctions C avec les paramêtres dans la pile
Donc il faut une "glue function" qui fasse la conversion pour chaque fonction (=wrapper)
C'est les pointeurs de ces glue functions qui sont dans la jump table et non pas vos fonctions en C
Je mets dans Toto_functions_glue.h les glue functions et ma jump table
4) Le SDK
On croirais pas mais c'est la partie la plus pénible à faire
Quand on fait une .library il faut fournir tout les fichiers include pour l'utiliser en C
Au minimum il faut :
toto/toto.h qui décrit les structures,types,constantes utilisées dans toto
clib/toto_protos.h
toto.sfd qui permet de créer un toto.xml avec l'outil fdtrans
Avec le toto.xml et le clib/toto_protos.h qui définissent totalement nos fonctions on peut alors créer tout les include du SDK avec l'outil idltool y compris les glue functions
5) La compilation
Ce n'est pas un programme donc il faut le compiler sans libnix ni ixemul cad avec -nostartfiles sous GCC
Mais alors on a plus accès à plein de fonction C de base comme printf() qu'il faut émuler tant bien que mal sous OS3
Là il vaut mieux regarder mon code tout en sachant que c'est certainement pas optimal
Alain Thellier
@zzd10h
Effectivement idltool fais (presque) tout le boulot mais il travaille qu'avec un .xml
Heureusement en passant par un .sfd et l'outil fdtrans on peut créer ce .xml
Et faire un .sfd à la main c'est faisable par contre
Attention idltool crée un squelette de .library avec un header et avec un fichier source (vide, à remplir de code) par fonction ... donc pleins de fichiers. On peut ignorer tout ces fichiers (effacer) et avoir ses sources dans un ou qques fichiers (comme d'hab.) et avoir un seul fichier avec les function_glue
@Sharynn
Regarde plutôt les sources dans ma SimpleDT.library comme le suggére Elwood
car SDI_Libs c'est plutôt du 68k qui m'a donné ma base pour Wazp3D 68k OS3 même si le principe reste à peu près le même en OS4
On peut aussi partir d'un header donné par idltool et le modifier (a minima) comme j'ai indiqué...
Alain
@Sharynn
Laisse tomber le .xml fais le .sfd comme dans la SimpleDT.library
Il faut définir dans le .sfd l'usage registre/parametre cad les pointeurs seront dans des registres d'adresse (a0 a1 etc...) et les valeurs dans les registres de données (d0,d1,..) donc max 10 parametres environ
Après y a une option dans fdtrans qui créée un .xml (ou une option "all" qui fais tout)
Idem pour idltool y a une option "all" ou qque chose comme ça
Idem pour le tableau des jumps regarde dans SimpleDT_functions_glue_ppc.h = en OS4 y a rien de compliqué et en 68k j'utilise des macros comme A0() A1() ... D0() etc..
Alain
dans include/clib
#ifndef __CLIB_SIMPLEDT_PROTOS_H
#define __CLIB_SIMPLEDT_PROTOS_H
#include
ULONG SDT_Load(UBYTE* filename);
ULONG SDT_Play(ULONG id,ULONG replay,ULONG volume);
ULONG SDT_VolumeChange(ULONG id,LONG volumechange);
ULONG SDT_GetPicture(ULONG id,APTR picture);
ULONG SDT_Free(ULONG id);
#endif
dans le .sfd
==id $Id: SimpleDT_lib.sfd,v 1.0 2012/10/12 13:30:00 noname Exp $
==base _SimpleDTBase
==basetype struct Library *
==libname SimpleDT.library
==bias 30
==public
==include
ULONG SDT_Load(UBYTE* filename) (a0)
ULONG SDT_Play(ULONG id,ULONG replay,ULONG volume) (d0,d1,d2)
ULONG SDT_VolumeChange(ULONG id,LONG volumechange) (d0,d1)
ULONG SDT_GetPicture(ULONG id,APTR picture) (d0,a0)
ULONG SDT_Free(ULONG id) (d0)
==end
dans le function_glue_ppc.h
#include <clib/simpledt_protos.h>
LONG VARARGS68K LibSDT_Load(void *Self,UBYTE * filename) {return(SDT_Load(filename)); }
LONG VARARGS68K LibSDT_Play(void *Self,ULONG id,ULONG replay,ULONG volume) {return(SDT_Play(id,replay,volume)); }
LONG VARARGS68K LibSDT_VolumeChange(void *Self,ULONG id,LONG volumechange) {return(SDT_VolumeChange(id,volumechange)); }
LONG VARARGS68K LibSDT_GetPicture(void *Self,ULONG id, APTR picture) {return(SDT_GetPicture(id,picture)); }
LONG VARARGS68K LibSDT_Free(void *Self,ULONG id) {return(SDT_Free(id)); }
/*jump table */
STATIC CONST APTR main_vectors[] =
{
LibObtain,
LibRelease,
NULL,
NULL,
LibSDT_Load,
LibSDT_Play,
LibSDT_VolumeChange,
LibSDT_GetPicture,
LibSDT_Free,
(APTR)-1
};
dans le function_glue.h (library 68k)
#include <clib/simpledt_protos.h>
ASM(ULONG) LibSDT_Load(A0(UBYTE * filename)) {return(SDT_Load(filename)); }
ASM(ULONG) LibSDT_Play(D0(ULONG id),D1(ULONG replay),D2(ULONG volume)) {return(SDT_Play(id,replay,volume)); }
ASM(ULONG) LibSDT_VolumeChange(D0(ULONG id),D1(LONG volumechange)) {return(SDT_VolumeChange(id,volumechange)); }
ASM(ULONG) LibSDT_GetPicture(D0(ULONG id), A0(APTR picture)) {return(SDT_GetPicture(id,picture)); }
ASM(ULONG) LibSDT_Free(D0(ULONG id)) {return(SDT_Free(id)); }
/*jump table */
static const APTR LibVectors[] ={
(APTR) LibOpen,
(APTR) LibClose,
(APTR) LibExpunge,
(APTR) LibReserved,
(APTR) LibSDT_Load,
(APTR) LibSDT_Play,
(APTR) LibSDT_VolumeChange,
(APTR) LibSDT_GetPicture,
(APTR) LibSDT_Free,
(APTR) -1
};