Les bibliothèques partageables sont à la base de tout le système d'exploitation de l'Amiga, et une de ses principales forces. En plus de celles fournies par Commodore ( Exec, Dos, Graphics, ... ), le DPs permet de nous faciliter. la vie ( La majorité. des Shells n'existeraient. pas sans l'Arp.libraries). Choses promises, choses dues .... - musique angoissante soulignant le suspense intenable - voici l'utilisation de ces bibliothèques avec Dice.
Chaque distribution programmeur d'une librairie devrait - doit - être accompagne des fichiers suivant :
Je vais commencer par le plus simple : La PowerPacker.libraries V35.344 de la FredFish 678.
Les fichiers includes concernant Dice sont les suivants :
Les répertoires pragmas & proto concernent les autres compilateurs, nous les oublierons donc. Dice nous permet de stocker ces fichiers dans un répertoire spécial nommé pd. Ceci facilite une mise à niveau future ...
Pour une installation 'propre' une hiérarchie. identique à celle d'Amiga20 doit être créé :
|
Le fait de faire #include
<libraries/ppbase.h>
ne suffit pas pour que le compilateur
utilise les nouvelles fonctions : Il lui faut aussi un 'glue-code'
qui n'est en fait qu'une sorte de mode d'emploi pour le compilateur
( où trouver ces fonctions, comment leur passer des
arguments, ... ).
Pour une fois, des glues sont fournies pour Dice
mais on vas se dépecher de les remplacer par les notres car
ils ne sont pas suffisants. Regardons dans DLIB:; on vois que chaques
.lib
existent en plusieurs exemplaires: amigal20.lib amigapl20.lib
amigarl20.lib amigarpl20.lib amigas20.lib amigasp20.lib
amigasr20.lib amigasrp20.lib
par exemples en ce qui concerne
simplement la bibliothèque Amiga. Chaques versions
concernent un groupe d'options de Dcc
FDTOLIB permet de créer les glues codes facilement à partir des fichiers .fd, avec la possibilité que les librairies soit ouvertes et fermées automatiquement
|
Les fichiers crées (
PPs.lib & PPsp.lib ) sont à copier dans Dlib:. N'oubliez
pas de créer aussi les PPsr.lib & PPsrp.lib si vous
utilisez les passages par registres. Enfin un -lPP
permettra à
Dcc de linker notre glue.
Pour ceux qui utilise DiceConfig, ajouter
|
Passons à un peut plus difficile : la
Req.library.
Ici, nous ne pouvons pas utiliser FDTOLIB car beaucoup
de fonctions ne sont que des macros ( SimpleRequest()
ne fait
qu'appeler TwoGadRequest()
mais en ne demandant qu'un gadget ). Par
contre, des glues sont fournis pour d'autres compilateurs...
On vas
oublier tous de suite ceux de l'Aztec car le format de son code objet n'est pas
standard. Ceux du Lattice sont par contre parfait. Les anciennes versions
serviront à ceux qui utilisent un code long ( le copier en
dlib:Reql.lib ) alors que les nouvelles concernent le code court (
dlibs:Reqs.lib ).
Le seul problèmes est que l'ouverture ne
sera pas automatique. FDTOLIB nous permet de créer seulement
ce code avec l'option -AUTO
. Ma version ne contenant pas de fichier
.fd nous allons en créer un :
|
Vraiment très court !!
En fait FDTOLIB n'a besoin que de ##base _ReqBase
.
|
Problèmes de compatibilité avec les autres compilateurs : Les fichiers includes fournis sont généralement destinés à d'autres compilateurs ce qui nous demande quelques adaptations.
#Pragras
, un #define NO_PRAGMAS
suffit généralement à les éliminer.
#define
ne suffit pas. Prenons
l'exemple du premier prototype de
reqproto.h
void __stdargs SimpleRequest __PROTO((char *,...));
void __stkargs SimpleRequest (char *,...);
DC1: Warning Line 14 "dinclude:pd/clib/reqproto.h" 68:expected semicolon
__stkargs void SimpleRequest __PROTO((char *,...));
#define __stdargs
Enfin, on va finir par le
plus compliqué : L'Arp.librarie.
Vous pouvez trouver la distribution de cette bibliothèque. sur les disquettes de ...
l'Aztec C !! Allez donc chez votre voisin qui a ce compilateur &
copiez l'archive de l'Arp. Ceci n'a rien d'illégal., & CE
N'EST PAS DU PIRATAGE car cette archive est du DP et donc librement
copiable ... Ce n'est pas le cas du reste de l'Aztec donc on ne
prend que l'Arp, & d'autres DPs si l'on veut, mais certainement
pas le reste !!
Donc l'Arp est une des bibliothèques qui a
aidé le plus les programmeurs sur Amiga.
Pour l'utilisateur moyen, l'Arp fournit un requester puissant depuis longtemps, devenu
inutile avec le 2.0 ( mais je rappelle que de nombreux Amigas sont
toujours sous 1.3 ). Des rumeurs concernant l'Arp & les nouveaux
OS Amiga ont tenter de faire croire a des incompatibilités.
En réalité, l'Arp fournit deux choses distinctes :
Tous n'est pas rose cependant car elle contient aussi quelques Buggues mais que le premier programme parfait lui jette la premiere disquette !!
Les points étant mis sur les i, il est temps de l'ajouter a notre environnement de programmation. D'abord., évidemment FDtoLib va nous créer le glue... Cette bibliothèque. devrait être la plus compliquée avais-je dit, mais pour le moment, rien que de très. classique !. Ouai, attendez, ça arrive !
Comment diminuer la taille de nos programmes ?
Souvenez-vous ( on se croirait chez Drucker !!), Anews vous avait parlé d'une manière. de diminuer sensiblement la taille de nos exécutables. en remplaçant les routines de codage du printf par une fonction de la ROM. Et bien, je vous propose mieux : Totalement suprimer les f/s/printf, puts de notre code en utilisant ceux de l'Arp.
Première fonction : le puts.
C'est la plus simple car le code du glue est largement suffisant. Un
simple
#define puts Puts
réglera le problème.
Pour les autres fonctions a base de printf, un bout de code assembleur s'avère indispensable. Dans le printf de dice, ( et aussi dans les versions 5.xx du LATTICE ), les arguments du printf sont poussés dans la pile alors que pour celui d'Arp, un registre ( A4 ) pointe sur les arguments, il correspond donc au vprintf de Dice. En plus, et c'est normal, le fprintf, qui, je le rappelle, écrit en direction d'un fichier, demande un FileHandler du Dos comme premier argument au lieu d'une structure FILE ( équivalent au fhprintf de Dice ). Je ne vais parler que de printf & sprinf, mais ceci peut aussi se généraliser à fprintf.
Ce qui rend la chose plus compliquée que pour les autres
bibliothèques est que nous allons devoir créer le glue
nous même ... et en assembleur ! Certains prôneraient.
d'utiliser les mêmes noms que les fonctions a remplacer, de
manière. a les écraser, mais je préfère.
pouvoir accéder aux 2 fonctions, donc les 'nouvelles'
fonctions auront comme préfixe LF, pour flatter ma mégalo !!
Voici donc l'appel de LFPrintf
|
|
Je rappelle que seul A6 doit
être restauré, D0,D1, & A0 sont considéré
comme des registres de scratch. Compiler le tous avec DAS.
Lors de l'utilisation, n'oubliez pas de 'linker' ce code avec l'option -lmes_fonctions.o
.
Il faut aussi penser a prototyper nos fonctions:
|
La prochaine fois, nous créerons notre propre bibliothèque de fonctions (.lib) grâce. a LibMake.
Remarque très
importante : Attention, certaines librairies utilisent une fonction
de la Rom pour faire leur affichage ( l'Arp pour la série.
des Printf & la Req pour ces requesters ). Le point important
est que pour ces fonctions les entiers sont sur 16 Bits par défaut,
alors que Dice utilise 32 Bits lors du passage de paramètres
( même pour les shorts pour le moment ). Il faut donc
l'indiquer a la routine d'affichage en changeant les %d
, %x
& %u
en %ld
, %lx
& %lu
. Ceci est très. important sinon le Guru risquera de ce réveiller. ...