Les fonctions du BIOS
Les fonctions du BIOS seront appelées grâce à l'instruction TRAP #13 en assembleur ou par la fonction BIOS en GFABASIC.
Certaines de ces fonctions utilisent des handles pour les périphériques. 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 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.
A noter (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 demandant de changer la disquette A du lecteur par la B ou inversement (cf. code erreur BIOS n° -17).
Et ceci m'amène justement à parler des différents codes erreurs du BIOS:
Code |
Définition |
Libellé |
0 |
E_OK |
Tout est OK |
-1 |
ERROR |
Erreur |
-2 |
EDRVNR |
Lecteur de disquette non prêt |
-3 |
EUNCMD |
Commande inconnue |
-4 |
E_CRC |
Erreur de CRC |
-5 |
EBADRQ |
Mauvaise requète |
-6 |
E_SEEK |
Erreur durant le déplacement des têtes |
-7 |
EMEDIA |
Média inconnu |
-8 |
ESECNF |
Secteur non trouvé |
-9 |
EPAPER |
Plus de papier |
-10 |
EWRITF |
Erreur en écriture |
-11 |
EREADF |
Erreur en lecture |
-12 |
? |
? |
-13 |
EWRPRO |
Média protégé en écriture |
-14 |
E_CHNG |
Détection d'un changement de média |
-15 |
EUNDEV |
Périphérique inconnu |
-16 |
EBADSF |
Erreur durant le formatage |
-17 |
EOTHER |
Insérez un autre disque |
Liste des fonctions du BIOS:
00 Getmpb
Récupération du MPB.
VOID GetMPB(void *ptr);
En entrée:
Long : Pointeur sur une zone mémoire pouvant recevoir une copie du MPB
En sortie:
La zone mémoire est renseignée.
01 Bconstat
Donne l'état d'un périphérique en lecture. Permet de savoir si le périphérique est prêt à nous envoyer des données.
long Bconstat (int device);
En entrée:
Word : Le handle sur le périphérique
En sortie: D0.L =-1 si prêt, 0 sinon
02 Bconin
Lire un caractère d'un périphérique. Utilisez la fonction 1 du BIOS pour tester que le périphérique a un caractère en attente de lecture.
long Bconin (int device);
En entrée:
Word : Le handle du périphérique
En sortie: D0.L contient le caractère lu.
Bits 31-24 |
Bits 23-16 |
Bits 15-8 |
Bits 7-0 |
Status des touches Shift-ctrl-alt (Voir ici les différentes valeurs possibles) |
Scan Code clavier |
Réservé (0) |
Code ASCII |
03 Bconout
Envoyer un caractère sur un périphérique.
VOID Bconout (int device, int char);
En entrée:
Word: Le handle du périphérique.
Word: Le caractère à envoyer.
En sortie: Rien
04 Rwabs
Lecture/écriture d'un ou plusieurs secteurs d'un disque.
long Rwabs( int rwflag, void *buffer, int count, int begin, int drive );
En entrée:
WORD rwflag = 0: lecture, 1: écriture
LONG buffer : adresse qui va contenir les données à lire ou contenant les données à écrire
WORD count : Nombre de secteurs à lire ou à écrire
WORD begin : Numéro du secteur où va commencer la lecture ou l'écriture
WORD drive : 0 pour A, 1pour B, ...
En sortie:
D0.L contient un numéro d'erreur ou E_OK (0) si pas d'erreur.
05 Setexc
Lecture ou modification d'un vecteur d'exception.
long Setexc( num, newvec );
En entrée:
num pour le numéro du vecteur à lire ou écrire
et newvec étant la nouvelle adresse du vecteur ou -1 pour faire une lecture de l'adresse du vecteur.
En sortie, D0.L contient l'adresse du vecteur.
Deux vecteurs particuliers:
0x101 Critical error handler
Ce vecteur est celui qui va gérer les incidents sur le disque comme disque non prêt, erreur en écriture...
Si vous détournez ce vecteur, l'erreur sera récupérable sur la pile en WORD. N'oubliez pas de sauvegarder les registres d3-d7 et a3-a7
Pour ignorer une erreur, positionnez D0.L à 0 puis RTS.
Pour recommencer, D0.L doit être à 0x10000 puis RTS.
Pour abandonner, positionnez l'erreur sur D0.L (il faut le signer de .W en .L) puis RTS...
0x102 Terminate handler
Autorise ou non la terminaison d'un processus.
Pour terminer, il suffira de faire un RTS, sinon il faudra faire un JMP sur le code du processus.
06 Tickcal
Retourne le nombre de millisecondes qui servent à calibrer l'horloge système.
LONG Tickcal( VOID );
En entrée: rien
En sortie: D0.L = le nombre de millisecondes
Récupération du 'BIOS Parameter Block' d'une unité. Cette fonction récupère en fait les informations du secteur boot. Ceci implique qu'une disquette doit être présente dans le lecteur interrogé. Il sera alors possible de connaître les capacités de la disquette. Ces capacités pouvant changer d'une disquette à une autre…
BPB *Getbpb( dev );
En entrée : Le numéro du disque
En sortie : D0.L pointeur sur le BPB du disque.
Voici une structure en C du BPB:
typedef struct
{
WORD recsiz; /* Nombre d'octets par secteur */
WORD clsiz; /* Nombre de secteur par cluster */
WORD clsizb; /* Nombre d'octets par cluster */
WORD rdlen; /* Taille de la "root directory" */
WORD fsiz; /* Nombre de secteur par FAT */
WORD fatrec; /* Secteur de départ de la seconde FAT */
WORD datrec; /* Secteur de départ des données */
WORD numcl; /* Nombre de cluster sur le disque */
WORD bflags; /* bit 0=1 => FAT 16 bit, FAT 12 bit */
} BPB;
08 Bcostat
Donne l'état d'un périphérique en écriture. Permet de savoir si le périphérique est prêt à recevoir des données.
ATTENTION: les handles 3 et 4 sont inversés dans cette fonction (et uniquement pour cette fonction):
3 IKBD, clavier
4 MIDI
long Bcostat (int handle);
En entrée:
Word : Le handle sur le périphérique
En sortie: D0.L =-1 si prêt, 0 sinon
Changement de média.
Pour les lecteurs de disquettes :
Cette fonction est censée indiquer qu'une disquette a été changé ou non.
Cependant, il n'existe pas de capteur de présence (ou non) d'une disquette dans le lecteur de disquette. Il s'avère donc difficile de dire si une disquette a été changé ou non. Donc cette fonction ne sert pas selon moi...
Ils ont quand même prévu cette impossibilité de le savoir puisque la fonctionne peut retourner "est peut-être changée..." !
LONG Mediach( int drive );
En entrée:
Word : Drive 0 pour A, 1 pour B, ...
En sortie: D0.L est renseigné avec:
0 : Le média n'a pas changé depuis le dernier accès.
1 : Peut-être que le média à changé...
2 : C'est certain, le média est changé !
0A Drvmap
ULONG Drvmap( VOID );
Indique la présence ou non d'un lecteur.
Remarque: sur les ST n'ayant qu'un lecteur de disquette, le système va créer une unité virtuelle rattachée à B:
Cette fonction indiquera donc l'existence d'un second lecteur.
La représentation est la suivante:
Le bit 0 pour le lecteur A
Le bit 1 pour le lecteur B
Le bit 2 pour le lecteur C
...
0B Kbshift
LONG Kbshift( flag );
Lecture ou positionnement de l'état des touches shift, control, alt et caps lock.
En entrée:
Flag = -1 pour une lecture, une autre valeur implique une modification de l'état.
En sortie: D0.L contient l'état des touches.
Que ce soit en entrée ou en sortie, l'assignation des touches est la suivante:
4 |
3 |
2 |
1 |
0 |
Caps lock |
Alt |
Control |
shift gauche |
shift droit |