Annonces Google
Serveur IRC
Serveur : irc.portlane.se
Canal : #AmigaNG
Activité du Site

Pages vues depuis 25/07/2007 : 25 172 452

  • Nb. de membres 187
  • Nb. d'articles 1 270
  • Nb. de forums 19
  • Nb. de sujets 20
  • Nb. de critiques 24

Top 10  Statistiques

Index du forum »»  Création-Développement »» Y-a-t'il possibilité de faire une library système en C sur Os4

Y-a-t'il possibilité de faire une library système en C sur Os4#1975

9Contributeur(s)
SharynnsinisrusElwoodzzd10hthellierastrofrabigdancritonsgate
3 Modérateur(s)
K-LElwoodcorto
Sharynn Sharynnicon_post
Salut les amis,

Je cherche un truc pour pouvoir compiler une librairie système pour OS4.x.

J'avais cela sous Os3.9 en ASM mais sur OS4 ?!!!

Je voudrais faire un test avec une partie de mon AmOS4 pour voir.



Projet AmOS4 - Retour vers l'Amos sous OS4...

SAM440EP - A1200 3.1 de base

Message édité par : Sharynn / 17-11-2014 22:27
sinisrus sinisrusicon_post
Désolé j'ai pas de réponse. Tu pourais nous dire ou tu en es sur ton amos4?
--
Coin coin... amitheme.amiga-ng.org
Sam460 1,15Ghz - OS4.1FE - Radeon Saphir HD7750 R7 250E - 2Go de ram

Message édité par : sinisrus / 18-11-2014 14:25
Elwood Elwoodicon_post
c'est une question qui revient souvent. Si quelqu'un veut donner un exemple avec la permission de le mettre dans le SDK, je me ferai un joie de le remercier au nom de tous les développeurs :-) 

Je vois qu'un certain Alain a donné le source d'une lib ici : Simple library for sound/picture datatype
--
Philippe Ferrucci
Avec une Sam460 et AmigaOS 4.1, je suis eco-responsable. Cool !

Message édité par : Elwood / 17-11-2014 23:13
icon_post
http://krashan.ppa.pl/articles/libmaker/

Pour un debut?

Kamelito
[addsig]
zzd10h zzd10hicon_post
@Kamelito :
C'est un pgm MOS, non ?

@Sharyyn
Je n'y connais rien mais....

Apparemment, tu pourrais utiliser l'outil idltool en lui passant un fichier XML explicitant tes fonctions. Et il te ferait tous tes fichiers, magique !


"Using idltool

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 !

Sharynn Sharynnicon_post
Je vais potasser tout cela !!!!

Merci pour ces réponses qui me dirige sur la route des libraries.

@sinisrus:
Le projet avance doucement, il est stable, mais je me heurte a des soucis d'ordre "Copper".
La librairie est compilable et utilisable, j'ai fait des test qui fonctionne chez moi.
Il y a encore des essais à faire sur d'autre machine et je pense avoir des soucis de "VBL Wait" sur certaine machine.

Passez voir le site: http://sharynn.free.fr

Il y a des petites démos de testes.
Ce site est presque à jour :)

La librairie commande à avoir beaucoup de commande et la structure squelette de l'exécutable fait 200Ko.

C'est pour cela que je souhaite tester une librairie système cela dans le but de réduire la taille de l'exécutable.

Je prépare aussi un remake d'ANTIRIAD programmé sous AmOS4 et ça prend forme..

"ScreenShot" ou mini démo bientôt...

Désolé pour le temps de mise en place de mon projet AmOS4 qui a maintenant 2 à 3 ans mais au final je ne suis pas un programmeur :)



Projet AmOS4 - Retour vers l'Amos sous OS4...

SAM440EP - A1200 3.1 de base
thellier thelliericon_post

>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

Sharynn Sharynnicon_post
Wouaaahou !!! Merci bien pour toutes ces explications...

J'ai télécharger SDI_Libs pour voir..
Je vais faire des testes et surtout comprendre où mettre mes variables et/ou mes fonctions.

@thellier:
As-tu un exemple un peu plus détailler pour le tableau des jumps qui pourrait me donner des directions de recherches avec les fichier du SDI-lib..

un exemple du ficher XML.. juste pour avoir un aperçu de ce qui il y a fournir

Merci !!



Message édité par : Sharynn / 18-11-2014 13:59
thellier thelliericon_post

@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

thellier thelliericon_post

@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
};


 


Message édité par : thellier / 18-11-2014 14:34
Petites Annonces

0 annonce(s) publiée(s)

Consulter

AmigaOS 4.1

Laissez-vous tenter par
AmigaOS 4.1
AmiTheme

AmiTheme