Les fonctions du GEMDOS

 

Appel au GEMDOS

Les fonctions du GEMDOS sont appelées via l'instruction TRAP #1 en assembleur ou par la fonction GEMDOS en GFABASIC.

Certaines de ces fonctions utilisent des handles pour accéder aux périphériques (A l'instar du monde Unix où tout est fichier). Voici la liste des handles utilisables:

Handle N°

Périphérique associé:

0

PRT: Imprimante

1

AUX: RS232

2

CON: Ecran

3

MIDI: …

4

IKBD: Clavier

D'autres handles sont ensuite disponible suivant les fichiers que vous ouvrirez.

 

D'autres fonctions accèdent aux unités de disques. Ces unités de disques sont différenciées les unes des autres par un numéro et non pas par une lettre comme on peut le voir sur le bureau par exemple.

La correspondance est alors la suivante:

Le lecteur A: à pour valeur 0

Le lecteur B: à pour valeur 1

Le lecteur C: à pour valeur 2

Et ainsi de suite.

Image non trouvée !(ou pour rappel):

Si physiquement, il n'y a qu'un lecteur de disquette, le système va créer un lecteur A: mais aussi un lecteur logique B: (pour faciliter les copies de fichiers par exemple) qui utilisera lui aussi le lecteur présent physiquement. Lors d'un accès à un de ces deux lecteurs logiques, il y aura éventuellement affichage d'un message du système demandant de changer la disquette A du lecteur par la B ou inversement (cf. code erreur BIOS n° -17).

GEMDOS a évolué dans le temps. Je ne donne ici que les fonctions concernant les ST et STF ou STE. Il existe un site répertoriant toutes les fonctions mais en anglais:http://www.fortunecity.com/skyscraper/apple/308/html/gemdos.htm

 

Codes erreur

Enfin, GEMDOS peut retourner des codes erreur dont voici la liste:

Nom

Valeur

Signification

EINVFN

-32

Numéro de fonction invalide

EFILNF

-33

Fichier non trouvé

EPTHNF

-34

Chemin incorrecte

ENHNDL

-35

Trop de fichiers ouverts (Plus de handles disponibles)

EACCDN

-36

Accès refusé

EIHNDL

-37

Handle invalide

ENSMEM

-39

Mémoire insuffisante

EIMBA

-40

Adresse du bloc mémoire invalide

EDRIVE

-46

Lecteur invalide

ENMFIL

-49

Pas plus de fichier !

ERANGE

-64

Range error (limite dépassée)

EINTRN

-65

Erreur GEMDOS interne

EPLFMT

-66

Format du fichier exécutable invalide

EGSBF

-67

Erreur de bloc mémoire

Liste des fonctions du GEMDOS:

00 Pterm0()

Cette fonction va mettre fin au programme en cours et rendre la main au programme appelant en retournant systématiquement 0 comme valeur en sortie (à traduire par: pas d'erreur rencontrée lors de l'exécution du code - voir tableau des codes). Il y a aussi libération de la mémoire allouée et fermeture des fichiers ouverts


VOID Pterm0( VOID )

Voir aussi Pterm() et Ptermres()

 

01 Cconin()

Cette fonction va attendre qu'un caractère soit récupérable sur le clavier. Lorsqu'un caractère sera présent, la fonction va le récupérer et nous le retourner.

WORD Cconin ( VOID )

En sortie, la fonction retourne dans D0.L le caractère ainsi que d'autres informations concernant l'état des touches préssées:

Bits 31-24

Bits 23-16

Bits 15-8

Bits 7-0

Etat des touches Shift/CTRL/ALT

Scancode de la touche

Non utilisés

Code ASCII

Remarque, il y a echo du caractère à l'écran. Si vous ne voulez pas l'écho, il faudra utiliser la fonction Cnecin() (GEMDOS 8) ou encore Crawcin() (GEMDOS(7)).

 

02 Cconout()

Cette fonction permet d'envoyer à l'écran un caractère.

VOID Cconout( WORD ch )

En entrée : Un word qui contient la valeur du caractère à envoyer. Seule la partie basse de ce mot est utilisée, la partie haute doit être à 0.


03 Cauxin()

Cette fonction va attendre qu'un caractère soit récupérable sur le port auxiliaire. Lorsqu'un caractère sera présent, la fonction va le récupérer et nous le retourner.

WORD Cauxin( VOID )

En sortie, la partie basse de D0.w contient le caractère.

Voir aussi : Cauxis(), Cauxout(), Bconin()

 

04 Cauxout()

Envoyer un caractère sur le port auxiliaire.

VOID Cauxout (WORD)

En entrée : Un word qui contient la valeur du caractère à envoyer. Seule la partie basse de ce mot est utilisée, la partie haute doit être à 0.

Voir aussi Cauxin(), Cauxis(), Cauxos(), Bconout()

 

05 Cprnout()

Envoyer un caractère sur le port imprimante.

WORD Cprnout( ch )

En entrée, un word qui contient la valeur du caractère à envoyer. Seule la partie basse de ce mot est utilisée, la partie haute doit être à 0.

En sortie, la fonction retourne 0 si problème.

Remarque, le caractère est envoyé brut de fonderie. Ce qui veut aussi dire que l'on pourra envoyer des séquences escape correspondant à votre imprimante pour imprimer du texte avec des fontes ou tailles particulières ou alors imprimer une image !

 

06 Crawio()

Fonction 2 en 1:cette fonction va permettre d'afficher à l'écran un caractère, ou alors de lire un caractère sur le clavier.

LONG Crawio( WORD )

En entrée, un word dont seule la partie basse sera utilisée. La partie haute sera à 0. La valeur de la partie basse pouvant être:

- Pour un affichage à l'écran, le code ASCII du caractère que l'on veut afficher

- Pour lire le clavier, la valeur 255.

 

En sortie uniquement dans le cas ou l'on veut lire le clavier (code 255 en entrée), le code de la touche:

Bits 31-24

Bits 23-16

Bits 15-8

Bits 7-0

Etat des touches Shift/CTRL/ALT

Scancode de la touche

Non utilisés

Code ASCII

Remarque: Dans le cas d'une lecture du clavier, il n'y aura pas d'attente d'un caractère et il n'y aura pas d'écho sur l'écran si un caractère est lu.

 

07 Crawcin()

Fonction de lecture d'un caractère avec attente au clavier sans echo à l'écran.

LONG Crawcin( VOID )

En sortie, le code de la touche:

Bits 31-24

Bits 23-16

Bits 15-8

Bits 7-0

Etat des touches Shift/CTRL/ALT

Scancode de la touche

Non utilisés

Code ASCII

 

08 Cnecin()

Cette fonction va attendre qu'un caractère soit récupérable sur le clavier. Lorsqu'un caractère sera présent, la fonction va le récupérer et nous le retourner.

Contrairement à la fonction Cconin, il n'y aura pas d'écho à l'écran

LONG Cnecin( VOID )

En sortie, la fonction retourne dans D0.L le caractère ainsi que d'autres informations concernant l'état des touches préssées:

Bits 31-24

Bits 23-16

Bits 15-8

Bits 7-0

Etat des touches Shift/CTRL/ALT

Scancode de la touche

Non utilisés

Code ASCII

 

09 Cconws()

Cette fonction permet d'afficher une chaîne de caractères à l'écran. Elle interprète les codes tel que BELL, line feed ainsi que les commandes d'un VT52. La chaîne de caractère devra se terminer par NULL (0) à la fin.

WORD Cconws( char *str )

Paramètre en entrée: Adresse du début de la chaîne de caractère à afficher.

En sortie, la fonction retournera 0 si problème, sinon le nombre de caractères affichés.

Remarque:

Image non trouvée ! Attention au CTRL-C qui peut parasiter l'affichage.

Voir aussi Cconout(), Cconrs()

 

 

0A Cconrs()

Cette fonction va lire une chaîne de caractères tout en faisant l'echo à l'écran.

VOID Cconrs( char *str )

Paramètre en entrée : Une adresse qui contiendra les caractères lus. str[0] contenant le nombre maximum de caractère à lire.

En sortie: L'adresse passée en entrée contient les informations suivantes:

str [1] contiendra le nombre de caractères lus.

&str [2] et le début de la chaîne de caractère

Image non trouvée ! Attention, cette fonction réagit à certaines combinaisons de touches:

Evidemment touche "return" ou "entrée" pour terminer la saisie (la valeur return n'étant pas dans la chaîne !)

Mais aussi:

ctrl-j pour fin de ligne

ctrl-h ou delete pour supprimer le dernier caractère saisi

ctrl-u: Laisse à l'écran la ligne précédemment saisie, mais recommence la saisie. Ce qui signifie que la chaîne saisie avant ctrl-u ne sera pas retournée dans la variable.

ctrl-x: Efface la saisie en cours y compris à l'écran et recommence la saisie.

ctrl-r: Echo de ce que l'on vient de saisir et continue

et enfin ctrl-c: fin de la saisie (abandon).

Voici un exemple en GFA BASIC: Image non trouvée !

Voir aussi les fonctions Cconin(), Cconws()

 

0B Cconis()

Cette fonction permet de vérifier qu'il y a ou non un caractère en provenance du clavier.

WORD Cconis( VOID )

En sortie, D0.W contient -1 si un caractère est présent, 0 sinon

Voir aussi Cconin(), Bconstat()

 

0E Dsetdrv()

Fonction permettant d'indiquer le lecteur courant à utiliser et retournant la liste des lecteurs qui sont actuellement présent.

LONG Dsetdrv( WORD drive )

En entrée : numéro du lecteur qui sera le lecteur par défaut pour la suite des opérations (0=A, 1=B, ...)

En sortie : Le bit 0 pour le lecteur A, si positionné, il est présent, le bit 1 pour le lecteur B, ...

Remarque, pour connaître simplement la liste des lecteurs présents sans pour autant changer le lecteur par défaut, il faudra au préalable utiliser la fonction Dgetdrv() pour connaître le lecteur par défaut et passer ce paramètre à la fonction Dsetdrv().

Voir aussi la fonction Dgetdrv()

 

10 Cconos()

Fonction permettant de vérifier qu'il est possible d'envoyer un caractère vers CON: (l'écran).

WORD Cconos( VOID )

En sortie, D0.w reçoit -1 si le périphérique est prêt, 0 sinon.

Voir aussi Cconout(), Bcostat()

 

11 Cprnos()

Fonction permettant de vérifier qu'il est possible d'envoyer un caractère vers PRN: (l'imprimante).

WORD Cprnos( VOID )

En sortie, D0.w reçoit -1 si le périphérique est prêt, 0 sinon.

Voir aussi Cprnout(), Bcostat()

12 Cauxis()

Fonction permettant de savoir s'il y a un caractère en attente sur le port auxiliaire.

WORD Cauxis( VOID )

En sortie, D0.w reçoit -1 si un caractère est présent, 0 sinon.

Voir aussi Cauxin(), Cauxout(), Cauxos(), Bconstat()

 

13 Cauxos()

Cette fonction va permettre de vérifier que le port auxiliaire est bien prêt à envoyer un caractère.

WORD Cauxos( VOID )

En sortie, D0.w reçoit -1 si un caractère est présent, 0 sinon.

Voir aussi Cauxin(), Cauxis(), Cauxout(), Bcostat().

 

19 Dgetdrv()

Cette fonction retourne le numéro du lecteur actuellement utilisé comme lecteur courant

WORD Dgetdrv( VOID )

En sortie, d0.w contient le numéro de lecteur. 0 représentant le lecteur A:, 1 pour le lecteur B:, ...

Voir aussi Dsetdrv()

Exemple GFA:Image non trouvée !

 

1A Fsetdta

Fixer l'adresse de la DTA (Disk Transfer Adress)

VOID Fsetdta(DTA * adr)

adr est un pointeur sur le nouveau tampon à utiliser pour la DTA.

Remarque, la DTA sert pour les fonctions Fsfirst() et Fsnext().

Voir aussi Fgetdta(), Fsfirst(), Fsnext()

 

20 Super()

Passer au mode utilisateur ou superviseur, ou tester le mode courant.

VOIDP Super( VOIDP stack )

Pour tester le mode courant:

En entrée, stack doit être positionné à -1L ($FFFFFFFF)

En sortie, D0.W sera positionné à 0 si le processeur est en mode utilisateur. Sinon la valeur est à 1 en mode superviseur.

 

Pour changer le mode:

En fait, la fonction passe automatiquement du mode utilisateur au mode superviseur et vis versa.

Lorsqu'un programme est lancé, il est automatiquement en mode utilisateur. Le premier appel à cette fonction va donc faire passer du mode utilisateur au mode superviseur.

Tandis qu'un second appel à cette fonction le fera de nouveau passer du mode superviseur au mode utilisateur.

Si le mode courant est le mode utilisateur:

En entrée, on pourra passer dans stack la valeur 0. Dans ce cas, la pile superviseur sera la même que la pile utilisateur. Sinon, si stack est différent de 0, alors la valeur de stack sera l'adresse qui sera utilisée pour la pile superviseur.

En sortie, D0.L reçoit l'adresse de l'ancienne pile (plus couremment appelé pile utilisateur). Il vous faudra conserver cette valeur car il faudra impérativement restaurer la pile avec cette ancienne valeur avant de terminer le programme en cours (c'est en effet dans cette pile que se trouve l'adresse de retour).

Si le mode courant est le mode superviseur:

En entrée, il faut passer la valeur de l'ancienne pile (pile utilisateur récupérée lors du premier appel à cette même fonction) dans stack pour pouvoir repasser dans le mode utilisateur.

Image non trouvée !Un appel au fonction AES va planter si vous êtes en mode superviseur.

Voir aussi Supexec()

 

2A Tgetdate()

Récupération de la date. Bon, personnellement, j'ai dû utiliser cette fonction qu'une fois, pour l'essayer...

En fait, le gros défaut ne vennait pas directement de cette fonction, mais plutôt du fait que l'heure ou la date etaient systèmatiquement perdues à partir du moment ou le ST etait arrêté. Par conséquent, à moins que vous ne saisissiez la date et l'heure à chaque rallumage de la machine, les informations ainsi récupérées étaient fausses et donc inutilisables. Par la suite, des batteries ont été semble-t-il ajoutées, mais je n'ai pas connu...

WORD Tgetdate()

En sortie, D0.L récupère une date au format DOS :

15 ...
... 9
8 ...
... 5
4 ...
... 0

Année:Valeur comprise entre 0 et 119 à ajouter à 1980

Mois:Valeur entre 1 et 12

Jour entre 1 et 31

Voir aussi Tsetdate(), Tgettime() et Tsettime()

 

2B Tsetdate()

Permet de positionner une date.

WORD Tsetdate(UWORD date)

En entrée, la date au format DOS (Voir la description du format dans la fonction Tgetdate()).

En sortie, D0.L vaut 0 si pas de problème, sinon, il y a erreur sur la format.

Remarques:

Bien que GEMDOS fasse une contrôle au niveau du format, il n'en sera pas de même concernant la date elle-même. Ainsi, il sera tout à fait possible de saisir un 31 février sans que cela ne le gêne plus que cela !

Image non trouvée !Le GEMDOS jusqu'à la version 0.13 ne prévient pas le BIOS que la date a changée et ne repositionne pas non plus la date au niveau du circuit clavier.

Voir aussi Tgetdate(), Tgettime() et Tsettime()

 

2C Tgettime()

Demander l'heure (Si vous désirez afficher l'heure comme horloge (un peu comme le fait le GFABASIC), alors même réflexion que pour la fonction Tgetdate...). Sinon, cette fonction pourrait être intéressant pour un jeu par exemple où la durée serait limitée.


WORD Tgettime()

En sortie, D0.L reçoit l'heure courante dans le format DOS:

15 ...
... 11
10 ...
... 5
4 ...
... 0

Heure entre 0 et 23

Minute entre 0 et 59

Seconde entre 0 et 28 !

Image non trouvée ! Cette fonction ne donne pas l'heure à la seconde près, mais toutes les deux secondes. Il faudra donc multiplier la valeur par 2.

Voir aussi Tgetdate(), Tsetdate() et Tsettime()

 

2D Tsettime()

Cette fonction permet de positionner l'heure.


WORD Tsettime(UWORD time)

En entrée, l'heure au format décrit dans la fonction Tgettime().

En sortie, D0.L vaut 0 si pas de problème, sinon, il y a erreur sur la format.


Image non trouvée !Le GEMDOS jusqu'à la version 0.13 ne prévient pas le BIOS que la date a changée et ne repositionne pas non plus la date au niveau du circuit clavier.

Voir aussi Tgetdate(), Tsetdate() et Tgettime()

2F Fgetdta()

Fonction permettant de récupérer l'adresse de début de la DTA.

DTA *Fgetdta( VOID )

En sortie, la fonction retourne dans D0.L l'adresse de la DTA.

Concernant la structure de la DTA, voir la chapitre concernant la DTA.

Voir aussi Fsetdta(), Fsfirst(), Fsnext().

 

30 Sversion()

Récupération de la version du GEMDOS (Désolé, jamais utilisé):

UWORD Sversion( VOID )

Concernant les valeurs possibles, voici un extrait de la page suivante : http://www.fortunecity.com/skyscraper/apple/308/html/gemdos.htm

Return Value TOS versions (normally) found in:
0x1300 (0.13) TOS 1.0, TOS 1.02
0x1500 (0.15) TOS 1.04, TOS 1.06
0x1700 (0.17) TOS 1.62
0x1900 (0.19) TOS 2.01, TOS 2.05, TOS 2.06, TOS 3.01, TOS 3.05, TOS 3.06
0x3000 (0.30) TOS 4.00, TOS 4.01, TOS 4.02, TOS 4.03, TOS 4.04,
MultiTOS 1.00, MultiTOS 1.08


31 Ptermres()

Terminer un programme mais laisse celui-ci résident en mémoire.


void Permres( LONG nbrest,WORD coderet)

En entrée, nbrest est le nombre d'octets à concerver. Sachant que cette zone mémoire commence à la page de base.

coderet et le code de sortie qui sera retourné au programme parent.

Remarque:

- Les fichiers ouverts sont fermés lors de la fin de processus.

- Il n'existe pas de fonction GEMDOS permettant de redéclencher le programme résident.

- La mémoire allouée ne sera plus jamais modifiable hors du programme.

En fait, ce type de code résident est intéressant si vous voulez modifier certains vecteurs du systèmes pour lancer vos propres routines à la place ou en complément de celles existantes.

Voici un exemple de programme qui s'exécute et rend la main tout en restant résident. Le code sera déclenché via l'interruption VBL pour modifier la couleur de fond. Peu importe la manière de faire, ceci prouvant simplement que ce programme est toujours résident en mémoire, et qu'il peut donc être appelé normalement.

Image non trouvée !

Voir aussi Pterm0(), Pterm()

 

36 Dfree()

Cette fonction permet de connaître la taille total d'un disque et le nombre d'octets non utilisés.


LONG Dfree( DISKINFO *buf, WORD drive )

En entrée, DISKINFO est un tampon qui recevra les informations concernant le disque.

typedef struct
{
/* Nombre de clusters non utilisés */
ULONG b_free;

/* Nombre total de clusters sur le disque */
ULONG b_total;

/* Nombre d'octets par secteur */
ULONG b_secsize;

/* Nombre de secteurs par cluster */
ULONG b_clsize;
} DISKINFO;

Pour plus d'informations, se reporter au chapitre concernant la structure d'un disque.

drive étant le disque pour lequel nous voulons les informations. Avec 0 pour le lecteur courant, 1 pour le lecteur A, 2 pour le B, ...

En sortie, D0.L est à 0 si tout est OK, sinon, cela indique une erreur GEMDOS.

Remarque: fonction plutôt lente avec un disque dur !

Pour calculer la place disponible sur un disque, il suffira donc de faire: b_free * b_secsize * b_clsize

Pour connaître la taille total d'un disque: b_total * b_secsize * b_clsize Cette valeur étant la place totale sur le disque, mais il ne faut pas oublier que des secteurs seront réservés par exemple pour le boot secteur, la FAT. La place réellement utilisable pour des fichiers est donc inférieure (structure d'un disque).

Exemple GFA:Image non trouvée !

 

39 Dcreate()

Création d'un répertoire.

LONG Dcreate( char *path )

En entrée, path est le chemin dans lequel on veut créer le répertoire (le chemin pouvant être relatif ou absolu).

Image non trouvée ! Attention, à l'exception du dernier répertoire (qui est celui à créer), tous les répertoires indiqués dans le chemin doivent exister.

En sortie, D0.L = E_OK (0) : Le répertoire est alors créé, sinon, un chemin incorrecte (-34), ou encore accès refusé Path not found (-36).

Voir aussi Ddelete()

 

3A Ddelete()

Suppression d'un répertoire.

LONG Ddelete( char *path )

En entrée, path est le chemin à partir duquel on veut supprimer le répertoire, le dernier nom indiqué étant le répertoire à supprimer.

En sortie, D0.L = E_OK (0) : Le répertoire est alors supprimé, sinon, un chemin incorrecte (-34), ou encore accès refusé Path not found (-36), ou erreur interne (-65)

Voir aussi Dcreate()

 

3B Dsetpath()

Cette fonction permet de définir un chemin qui sera utilisé par défaut pour le lecteur courant.


LONG Dsetpath( char *path )

En entrée, D0.L est à zéro si tout va bien, sinon code erreur GEMDOS.

Remarque: Pour modifier le chemin par défaut d'un lecteur précis, il est préférable d'utiliser la fonction Dsetdrv() pour se positionner d'abord sur le lecteur puis de passer le nouveau chemin. Evitez de passer le nom du lecteur dans le chemin, cela ne marche forcement bien avec toutes les versions du GEMDOS !

3C Fcreate()

Cette fonction permet la création d'un fichier.

LONG Fcreate( char *fname, WORD attr )

En entrée, fname est une chaine de caractères contenant le chemin et le nom du fichier à ouvrir. Cette chaine doit se terminer avec le caractère \000.

attr contient les attributs du fichier:

Nom

Bit

Fonction

FA_READONLY

0

Lecture seule

FA_HIDDEN

1

Fichier caché

FA_SYSTEM

2

Fichier système

FA_VOLUME

3

Nom du volume

...

4

Réservé

FA_ARCHIVE

5

Archive

Remarque: Il est inutile de faire un Fopen() ensuite, le fichier étant automatiquement ouvert via la fonction Fcreate(), vous obtenez donc un handle en sortie si d0.L est positif, D0.w contient le handle. Sinon, il s'agit d'une erreur, D0.L étant le code erreur.

Image non trouvée ! Attention: Si le fichier existe déjà, celui-ci perdra toutes les données qu'il avait et donc la taille du fichier reviendra à 0.

Voir aussi Fopen(), Fclose(), Fwrite(), Fseek()


3D Fopen()

Ouverture d'un fichier

LONG Fopen( char *fname, WORD mode )

En entrée, fname est une chaine de caractères contenant le chemin et le nom du fichier à ouvrir. Cette chaine doit se terminer avec le caractère \000.

mode précisant le type d'accès sur le fichier:
0 pour Read only access
1 pour Write only access
2 pour Read/Write access

En sortie:si D0.L est positif, alors D0.W contient le handle du fichier. Sinon, il s'agit d'une erreur, D0.L étant le code erreur.

Voir aussi Fclose(), Fcreate()

Exemple ici

 

3E Fclose()

Fermeture d'un fichier.

LONG Fclose( WORD handle )

En entrée, le handle du fichier à fermer.

En sortie, D0.L = 0 si pas d'erreur, -37 si le handle est invalide.

Image non trouvée ! Attention, cette fonction doit nécessairement être appelée si vous voulez avoir accès aux données enregistrées dans le fichier !

Voir aussi Fcreate(), Fopen()

Exemple ici

 

3F Fread()

Cette fonction va permettre de lire le contenu d'un fichier ouvert au préalable par la fonction Fseek() ou Fcreate() et à partir de la position courante du pointeur dans le fichier (Voir Fseek()).

LONG Fread( WORD handle, LONG length, VOID *buf )

En entrée, handle pour le handle du fichier

length pour le nombre d'octets à lire

buf pour le début d'un tampon qui recevra les données lues. Evidemment, il faut que la taille du tampon soit au moins égale au nombre d'octets que l'on veut lire !

En sortie, si D0.L est positif, alors D0.L reçoit le nombre d'octets effectivement lu. Si ce nombre est inférieur à la quantité (length) demandée, cela signifie que nous avons atteind la fin du fichier. Si D0.L est négatif, alors D0.L nous donne un code erreur GEMDOS (Handle invalide, Disquette altérée, ...)

Voir aussi Fcreate(), Fopen(), Fclose(), Fwrite(), Fseek()

Exemple ici

 

40 Fwrite()

Cette fonction va permettre d'écrire des données dans un fichier ouvert au préalable par la fonction Fopen() ou Fcreate() et à partir de la position courante du pointeur dans le fichier (Voir Fseek()).

LONG Fwrite( WORD handle, LONG length, VOID *buf )

En entrée, handle pour le handle du fichier

length pour le nombre d'octets à écrire.

buf pour le début d'un tampon qui contient les données à écrire.

En sortie, si D0.L est positif, alors D0.L reçoit le nombre d'octets écrits. Si D0.L est négatif, alors D0.L donne un code erreur GEMDOS (Handle invalide, Disquette altérée, ...)

Voir aussi Fcreate(), Fopen(), Fclose(), Fread(), Fseek()

 

41 Fdelete()

Fonction permettant la suppression (physique) du fichier sur le disque.

LONG Fdelete( char *fname )

En entrée, l'adresse d'un tampon contenant le nom du fichier à effacer (doit être terminé par \000).

En sortie, D0.L = 0 si pas d'erreur, sinon D0.L est négatif et correpond à un code erreur GEMDOS.

Remarque: On pourra supprimer des répertoires (qui seront vidés au préalable).

 

42 Fseek()

Cette fonction va permettre de nous repositionner dans un fichier afin de lire ou écrire à partir de cette nouvelle position.

LONG Fseek( LONG offset, WORD handle, WORD mode )

En entrée, offset correpondant au déplacement en octet,

handle, le handle du fichier,

mode, le mode de déplacement càd:

le mode 0 (SEEK_SET) : Dans ce cas, offset est un nombre positif est correspond a un déplacement n octet (ou n = offset) à partir du début du fichier.
le mode 1 (SEEK_CUR) : Dans ce cas, offset peut être aussi bien positif que négatif, et le déplacement se fera à partir de la position actuelle dans le fichier
Enfin le mode 2 (SEEK_END) : Dans ce cas, offset est un nombre positif est correspond a un déplacement n octet (ou n = offset) à partir de la fin du fichier (marche à arrière !).

En sortie, D0.L est positif, dans ce cas, il représente la nouvelle position du pointeur. Si D0.L est négatif, alors une erreur GEMDOS est remontée.

Remarque: Il est possible à partir de cette fonction de connaître la taille d'un fichier. Il suffit pour cela d'utiliser le mode SEEK_END avec un offset à 0. D0.L représentant la nouvelle position du pointeur, et étant à la fin du fichier, D0.L représentera ainsi la taille du fichier.

Exemple ici

 

43 Fattrib()

Lecture ou modification des attributs d'un fichier (ou répertoire, ce qui revient au même...)

LONG Fattrib( char *fname, WORD flag, WORD attr )

En entrée, fname est une chaine de caractères contenant le chemin et le nom du fichier à ouvrir. Cette chaine doit se terminer avec le caractère \000.

flag pour indiquer le type d'accès: En lecture, il faut utiliser FA_INQUIRE (0), en écriture ce sera FA_SET (1)

attr tampon contenant les attributs à positionner sur le fichier, ou qui recevra les attributs du fichier dans le cas d'une lecture.

Les différentes valeurs des attributs étant:

Nom

Bit

Fonction

FA_READONLY

0

Lecture seule

FA_HIDDEN

1

Fichier caché

FA_SYSTEM

2

Fichier système

FA_VOLUME

3

Nom du volume

FA_DIR

4

Répertoire

FA_ARCHIVE

5

Archive

En sortie, si D0.L est négatif, cela signifie qu'il y a une erreur, D0.L contenant la valeur de cette erreur GEMDOS.

 

45 Fdup()

Duplique un identificateur de fichier

LONG Fdup(WORD shandle);

En entrée, shandle est un identificateur standard (0 à 5).

En sortie, si D0.L est négatif, il s'agit alors d'une erreur GEMDOS:EIHNDL pour indiquer que shandle n'est pas standard, ou encore ENHNDL si plus d'identificateur disponible. Sinon D0.W est un identificateur non standard qui utilise les mêmes fichiers que le standard correspondant

Voir aussi Fforce()

 

46 Fforce ()

Force un identificateur de fichier standard (0 à 5) à pointer sur le même fichier qu'un identificateur non standard (>5 !).

LONG Fforce(WORD shandle,WORD nhandle);

En entrée, shandle pour le handle standard, nhandle pour le handle non standard

En sortie, D0.L est nul si tout est OK, sinon, code erreur GEMDOS.

Voir aussi Fdup()

 

47 Dgetpath()

Cette fonction permet de connaître le chemin par défaut utilisé sur une unité de disque.

LONG Dgetpath( char * buf, WORD drive )

En entrée, buf qui est l'adresse d'un tampon qui recevra la chaîne de caractères. Elle devra faire 128 octets car nous ne pouvons pas connaître la longueur en caractère que fait le chemin. 128 caractères étant la longueur maximum en caractère que peut faire un chemin.

drive représentant l'unité de disque pour lequel nous voulons connaître le chemin utilisé. 0 étant le lecteur par défaut, 1 représentant le lecteur A, 2 pour B, ...

 

En sortie, D0.L contient 0 si pas de problème, sinon un code erreur en principe -49 pour lecteur inexistant

Exemple GFA:Image non trouvée !

 

48 Malloc()

Cette fonction permet de faire une allocation mémoire.


VOIDP Malloc( LONG amount )

En entrée amount est la quantité de mémoire en octet que vous voulez réserver.

En sortie, D0.L pointe sur le début de la zone mémoire réservée ou contient 0 si le GEMDOS n'a pas trouvé de place en mémoire.

 

Remarque: En passant la valeur -1L en entrée, le système va alors réserver le maximum de mémoire qui est disponible.


Image non trouvée !Attention: n'oubliez pas de réorganiser la TPA avant de faire appel à cette fonction car au lancement d'un programme, toute la mémoire est réservée pour ce programme. il n'y a donc plus de place libre !

Image non trouvée ! Comme pour la pluspart des systèmes, il est préférable de faire une grosse allocation mémoire plutôt que de faire n petites allocations mémoires.

Voir aussi Mfree(), Mshrink()

Image non trouvée !Un programme ne doit pas avoir plus de 20 allocations mémoires à un instant T, car GEMDOS ne le "digère" pas bien...

 

49 Mfree()

Libération d'un bloc mémoire précédemment alloué par la fonction Malloc.

WORD Mfree( VOIDP startadr )

En entrée, adresse de début de la zone mémoire à libérer.

En sortie, D0.L est à 0 si la libération c'est bien déroulé, sinon un code erreur GEMDOS.

Voir aussi Malloc() et Mshrink()


4A Mshrink()

Diminuer la taille d'un bloc mémoire précédemment alloué par Malloc().

WORD Mshrink( VOIDP startadr, LONG newsize )

En entrée, startadr correspondant au début de la zone mémoire.
newsize étant la nouvelle taille.

Voir aussi Malloc() et Mfree()

 

4B Pexec()

Charger/Exécuter un programme

LONG Pexec( WORD mode, char *fname, char *cmdline, char *envstr )

En entrée et en sorite:

Les valeurs vont dépendre de la valeur de mode:

Mode

fname

cmdline

envstr

En sortie

0:PE_LOADGO:Charge et exécute

Nom du fichier à exécuter

La ligne de commande

La chaîne d'environnement

Un WORD représentant le code de sortie de programme

3:PE_LOAD: Charge en mémoire

Nom du fichier à exécuter

La ligne de commande

La chaîne d'environnement

Un LONG qui est l'adresse de la page de base du programme. Ce sera donc au parent de libérer la mémoire.

4:PE_GO: Exécute le programme

Rien (NULL)

Adresse de la page de base

Rien (NULL)

Exécute le programme dont la page de base est déjà initialisée

5:PE_BASEPAGE:Prépare une page de base

Rien (NULL)

La ligne de commande

La chaîne d'environnement

En sortie, une page de base est créée, de plus, le système alloue le plus grand bloc possible. Il faudra alors que le programme parent renseigne les zones de texte/données initialisées et non initialisées, charge et initialise le programme...

Image non trouvée ! fname, cmdline et envstr doivent se terminer par 0.

cmdline est la ligne de commandes est doit être composée de la manière suivante: Le premier octet correspond à la taille de la chaîne, suivi de la chaîne. récupération des paramètres)


envstr est soit NULL, soit pointe sur une structure qui devra est composée de la manière suivante:

"chaîne1\0"
"chaîne2\0"
etc...
"chaînen\0"
"\0"

Chaque chaîne doit être terminée par 0 pour indiquer la fin de la chaîne en cours.

La structure doit impérativement se terminer par une chaîne nulle "\0" pour indiquer la fin de la structure.

Si envstr est NULL, il y aura alors héritage de la chaîne du parent.

Un programme enfant hérite des descripteurs de fichiers standards de son parent. Il emploie en fait un appel de Fdup() et de Fforce() sur les identificateurs 0 à 5.

Image non trouvée !Attention: n'oubliez pas de réorganiser la TPA avant de faire appel à cette fonction car au lancement d'un programme, toute la mémoire est réservée pour ce programme. il n'y a donc plus de place libre !

 

En sortie, si D0.L est négatif, alors il y a une erreur.

Si D0.W est négatif, alors la fonction c'est bien lancée, mais le programme fils a retourné une erreur.

 

(Voir chapitre sur page de base)

 

4C Pterm()

Termine un programme ferme tous les fichiers ouverts, libère la mémoire allouée et rend la main au programme appelant en lui passant un code retour.

void Pterm(WORD retcode)

En entrée, retcode est la valeur du code à retourner au programme appelant.

Le programme appelant pourra ensuite interpréter le code comme il le veut. Cependant, il est de coutume d'utiliser certains codes retour .

 

4E Fsfirst()

Recherche la première occurence d'un fichier. Il est possible d'utiliser les caractères spéciaux ? ou * dans le nom du fichier (mais pas dans le chemin !)

WORD Fsfirst(char *fspec,WORD attribs)

En entrée, fspec est un pointeur sur un tampon contenant le chemin et le nom du fichier à rechercher.

attribs correspondant aux attributs des fichiers:

Nom

Valeur (en décimale)

Désignation

FA_NORMAL

0

Fichier normal

FA_READONLY

1

Fichier en lecture seule

FA_HIDDEN

2

Fichier caché

FA_SYSTEM

4

Fichier système

FA_VOLUME

8

nom du volume

FA_DIR

16

Fichier de type répertoire

FA_ARCHIVE

32

Fichier de type archive

On pourra donc rechercher la première occurence d'un fichier avec les différents attributs. Par exemple pour rechercher le premier fichier normal ou lecture seule, attribut sera à 0 + 1

Pour fichier normal ou lecture seule ou système : 0 + 1 + 4

...

En sortie, D0.L contient 0 si un fichier est trouvé et la DTA est alors renseignée avec les informations de ce fichier.

D0.L est différent de 0 si problème (Exemple -47 - EFILNF pour fichier non trouvé).

Image non trouvée !N'oubliez pas de changer l'emplacement de la DTA si vous ne voulez pas perdre la ligne de commande (voir chapitre sur DTA).

Voir aussi Fsnext(), Fsetdta() et Fgetdta()

 

4F Fsnext()

Recherche l'occurence suivante d'un fichier.

WORD Fsnext(VOID)

En sortie, D0.L contient 0 si un fichier est trouvé et la DTA est alors renseignée avec les informations de ce fichier.

D0.L est différent de 0 si problème (Exemple -47 - EFILNF pour fichier non trouvé).


Remarque : Cette fonction pourra être relancé autant de fois que l'on veut (et qu'il y a d'occurence), mais il faut avoir fait au moins un Fsfirst avant tout.

Cette fonction utilisant les informations stockées dans la DTA suite à un Fsfirst(), il ne sera pas possible de changer la position de la DTA avant l'appel à Fsnext().

Voir aussi Fsfirst(), Fsetdta() et Fgetdta()

 

56 Frename()

Renommer un fichier.


WORD Frename(0,char * ancnom,char * nouvnom)

En entrée, un word réservé, cette valeur ne sert à rien et doit être à 0.

Un pointeur sur le nom actuel du fichier (ancnom).

Un pointeur sur le nouveau nom du fichier (nouvnom).

En sortie, d0.L est à 0 si pas d'erreur, ou alors à EACCDN s'il existe déjà un fichier portant ce nouveau nom, ou encore ENSAME si vaut n'avez pas indiqué le même lecteur entre ancnom et nouvnom.

 

57 Fdatime()

Lire ou positionner la date de création d'un fichier

LONG Fdatime( DATETIME * timeptr, WORD handle, WORD flag ) d'après http://www.fortunecity.com/skyscraper/apple/308/html/gemdos.htm ou plutôt LONG Fdatime( WORD handle, DATETIME * timeptr, WORD flag ), j'ai un gros doute !!!

Flag contient FD_INQUIRE (0) Pour demander la date de création, FD_SET (1) pour la positionner

handle est le handle sur le fichier ouvert.

timeptr pointe sur une structure au format DOS:

typedef struct
{
unsigned hour:5;
unsigned minute:6;
unsigned second:5;
unsigned year:7;
unsigned month:4;
unsigned day:5;
} DATETIME;


D0.L étant NULL si tout est OK, négatif est erreur GEMDOS sinon...

N'ayant jamais utilisé cette fonction (pour les mêmes raisons que pour la lecture de la date et heure système, informations bidons:date et heure jamais positionnées car perdues à chaque redémarrage du ST), et n'ayant pas le courage de le faire maintenant, je n'en dirais pas plus...