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.
(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:
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
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:
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()
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.
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 !
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 ! |
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.
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()
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.
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).
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).
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 !
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.
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()
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
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.
Attention,
cette fonction doit nécessairement être appelée si vous
voulez avoir accès aux données enregistrées dans le
fichier !
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).
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
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.
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 !
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()
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()
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()
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... |
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.
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 .
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é).
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()
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...