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

 

07 Getbpb

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

 

09 Mediach

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

...

Exemple GFA:Image non trouvée !

 

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