L'interruption de la cassette
L'interruption de cassette (interruption 15h) est un vestige de l'époque où les PC utilisaient des enregistreurs de cassette exclusivement comme périphériques d'entreposage de données. Cette interruption fournissait quatre fonctions (numérotées de 0 à 3) pour activer et désactiver le moteur de l'enregistreur à cassette, lire et écrire sur la bande magnétique. Au fur et à mesure que le PC gagnait du terrain dans le monde des affaires, l'unité de disque est devenu populaire. Par conséquent, la popularité du lecteur de cassette s'est estompée.
Les quatre fonctions d'interruption de cassette font toujours partie du ROM-BIOS du PC. Le XT n'a pas d'interface d'enregistrement de cassette. De plus, l'interruption de la cassette XT consiste en une courte routine définissant le drapeau de retenue et entrepose un code d'erreur dans le registre AH pour indiquer au programme que la fonction appelée n'est pas disponible.
L'AT et l'interruption cassette
L'interruption de la cassette est revenue avec l'introduction de l'AT. De nouvelles fonctions peuvent être appelées n'ayant rien à voir avec la commande du magnétophone. Ce qui suit décrit ces fonctions, disponibles uniquement sur les modèles AT.
Entre autres choses, l'interruption met à disposition deux fonctions basées sur la mesure du temps de l'horloge temps réel AT embarquée. La première d'entre elles est la fonction 83h. Il est utile dans les situations où le processeur est engagé dans une tâche chronophage (par exemple, le calcul d'une formule compliquée), mais d'autres tâches doivent être effectuées en même temps, par exemple, la vérification du clavier pour déterminer si l'utilisateur veut mettre fin à l'opération ).
Fonction 83h : Drapeau de temps
La fonction 83h appelle l'adresse d'un drapeau (un octet dans le programme utilisateur) dans lequel le bit de niveau le plus élevé est défini après qu'un certain laps de temps s'est écoulé. Dans un programme en cours d'exécution, ce drapeau peut être testé après un certain laps de temps. Seules deux instructions en langage d'assemblage sont nécessaires pour cela, de sorte que le test nécessite peu de temps. Le numéro de fonction 83h transmet des informations au registre AH. L'adresse de segment du drapeau est chargée dans le registre ES et l'adresse de déplacement dans le registre BX. Le temps devant s'écouler jusqu'à ce qu'au drapeau soit défini est transmis aux registres CX et DX. Les deux registres forment un nombre de 32 bits indiquant le nombre de microsecondes à attendre (1 seconde = 1 000 000 microsecondes).
Le registre CX représente les 16 bits supérieurs de ce nombre. Pour calculer le temps total, le contenu du registre CX doit être multiplié par 65 536 et le registre DX doit ensuite être ajouté au total. Si la période d'attente est connue en microsecondes, la valeur des registres CX et DX peut être calculée :
CX = int(Période d'attente / 65 536) DX = Période d'attente mod 65 536 |
Cette fonction ne peut être appelée que si le précédent appel de cette fonction est terminé (le temps indiqué est écoulé). Si ce n'est pas le cas, la fonction revient immédiatement avec le drapeau de retenue défini.
Fonction 86h : Attendre l'heure de fin
La deuxième fonction temporelle, la fonction 86h, diffère de la fonction 83h en ce qu'elle attend que le temps indiqué soit écoulé. Pour cette raison le numéro de fonction doit passer dans le registre AH, et le temps d'attente dans les registres CX et DX lors de l'appel de la fonction. Pour convertir le temps d'attente en deux valeurs pour les registres CX et DX, la formule ci-dessus peut être utilisée. Cette fonction ne peut être appelée que si la fonction 83h n'a pas été appelée précédemment, et si la durée fixée lors de son appel n'est pas encore écoulée. Dans un tel cas, la fonction revient immédiatement avec un drapeau de retenue défini au programme appelant.
Mémoire étendue
L'AT accepte plus de 640 Ko de mémoire. Cette mémoire supplémentaire (appelée étendue) commence à 1 mégaoctet et n'est pas accessible en mode réel, dans lequel le microprocesseur 80286 fonctionne comme un microprocesseur 8086. La fonction 88h détermine la disponibilité et la taille de cette mémoire. Placer une valeur de 88h dans le registre AH renvoie la taille de la RAM au-delà de la limite de 1 mégaoctet (à l'exclusion de la RAM de 0 à 640K) par incréments de 1 Ko dans le registre AX.
Fonction 87h : Déplacer le bloc mémoire
La fonction 87h déplace des blocs de mémoire dans l'espace mémoire total. Cela signifie que des blocs de mémoire peuvent être déplacés de la zone en dessous de la limite de 1 mégaoctet vers la zone au-dessus de la limite de 1 mégaoctet, et inversement. La fonction ne doit pas être utilisée pour ce dernier, car son appel est compliqué et présente d'autres inconvénients. Pour accéder à la mémoire au-delà de la barrière de 1 mégaoctet, le microprocesseur doit être mis en mode protégé (mode 80286 complet). La fonction 87h nécessite des informations très complètes, car le microprocesseur 80286 est plus difficile à programmer en mode protégé qu'en mode réel (émulation 8086 sous DOS).
Le numéro de fonction 87h doit d'abord être transmis au registre AH, puis le nombre de mots à déplacer (mots seuls, pas d'octets) doit être transmis au registre CX. Une valeur maximale de 8000h correspond à une valeur maximale de 64 Ko.
Tableau des descripteurs globaux (Global Descriptor Table)
La paire de registres ES:SI reçoit l'adresse de la GDT (Global Descriptor Table), devant être installée dans le programme utilisateur. Le GDT décrit les segments de mémoire individuels du 80286 en mode protégé. Les segments en mode protégé sont exemptés des limitations faites en mode réel. Alors que les segments ne peuvent démarrer qu'à des emplacements de mémoire divisibles par 16 en mode réel, les segments en mode protégé peuvent démarrer à n'importe quel emplacement de mémoire. De plus, les segments en mode protégé peuvent avoir n'importe quelle taille de 1 octet à 64 Ko.
Autre innovation du mode protégé, le code d'accès défini pour chaque segment. Il indique si le segment décrit est un segment de données ou un segment de code (seuls les segments de code peuvent être exécutés). Le code d'accès contient également des informations sur la priorité d'accès, et si l'accès est même autorisé. Chaque descripteur de segment se compose de 8 octets chacun. La fonction 87h s'attend lors de son appel à ce que six descripteurs de segment aient été préparés dans le GDT (c'est-à-dire l'espace mémoire leur étant réservé). La figure ci-dessous illustre les descripteurs de segment impliqués, ainsi que la construction d'un descripteur de segment :
Seuls les descripteurs de segment désignés comme début et destination nous intéressent ici, puisque les fonctions BIOS complètent les autres descripteurs. Le premier décrit le segment d'où proviennent les données. Le descripteur de destination décrit le segment dans lequel les données sont copiées. La longueur des deux segments peut être de 0FFFFh (64 Ko décimal), même si moins d'octets (ou de mots) sont copiés au cours du processus. Si une valeur inférieure est indiquée, ne laissez pas le nombre d'octets (nombre de mots multiplié par 2) à copier dépasser ce montant. Sinon, le processeur remarque un accès à travers une limite de segment pendant la copie, ce qui déclenche une erreur. L'adresse des deux zones mémoire doit être convertie en une adresse (physique) 24 bits. Les 16 bits inférieurs de cette adresse entrent dans le deuxième champ du descripteur de segment et les 8 bits supérieurs entrent dans le troisième champ. Comme code d'accès 92h peut être utilisé, signalant au microprocesseur que le segment décrit est un segment de données avec la priorité la plus élevée ; que le segment existe en mémoire ; et que le segment peut être écrit. Le dernier champ du descripteur existe pour des raisons de compatibilité avec le microprocesseur 80386, et doit toujours contenir la valeur 0.
Alors que l'adresse du tampon du programme utilisateur reste fixe, l'adresse au-delà de la limite de 1 mégaoctet vers laquelle les données doivent être copiées peut être librement sélectionnée (sous réserve de la disponibilité de la RAM). Le tableau suivant montre les adresses des différents blocs de 1 Ko au-delà de la frontière de 1 mégaoctet sous forme d'adresses 24 bits.
Mémoire | Adresse | Mémoire | Adresse |
---|---|---|---|
0 Ko | 100000h | 124 Ko | 11F000h |
1 Ko | 100400h | 125 Ko | 11F400h |
2 Ko | 100800h | 126 Ko | 11F800h |
3 Ko | 100C00h | 127 Ko | 11FC00h |
4 Ko | 101000h | 128 Ko | 120000h |
5 Ko | 101400h | 129 Ko | 120400h |
6 Ko | 100800h | 130 Ko | 120800h |
7 Ko | 100C00h | 131 Ko | 120C00h |
8 Ko | 102000h | 132 Ko | 121000h |
9 Ko | 102400h | 133 Ko | 121400h |
60 Ko | 10F000h | 252 Ko | 13F000h |
61 Ko | 10F400h | 253 Ko | 13F400h |
62 Ko | 10F800h | 254 Ko | 13F800h |
63 Ko | 10FC00h | 255 Ko | 13FC00h |
64 Ko | 110000h | 256 Ko | 140000h |
65 Ko | 110400h | 257 Ko | 140400h |
66 Ko | 110800h | 258 Ko | 140800h |
67 Ko | 110C00h | 259 Ko | 140C00h |
68 Ko | 111000h | 260 Ko | 141000h |
69 Ko | 111400h | 261 Ko | 141400h |
Après l'appel de la fonction, le drapeau de retenue indique le succès de l'appel de la fonction. Si le drapeau de retenue est défini, une erreur s'est produite. La valeur dans le registre AH indique la cause de l'erreur :
Valeur | Description |
---|---|
AH=0 | Pas d'erreur (réinitialisation du drapeau de retenue) |
AH=1 | Erreur de parité RAM |
AH=2 | GDT défectueux à l'appel de la fonction |
AH=3 | Le mode protégé n'a pas pu être initialisé correctement |
Un inconvénient de cette fonction est que lorsque le microprocesseur est en mode protégé, toutes les interruptions doivent être supprimées. La raison en est que pendant le mode protégé, les interruptions du BIOS (par exemple, la minuterie ou le clavier) peuvent être appelées, mais ces routines ont été développées pour un fonctionnement en mode réel uniquement. Ces interruptions peuvent ne pas fonctionner correctement en mode protégé. L'inconvénient peut être clairement vu lorsque vous appelez la minuterie. Comme ses interruptions sont supprimées, le mode protégé n'effectue aucune mesure de temps et le temps reste figé pendant un moment. Si les programmes appellent fréquemment la fonction 87h, l'horloge peut ralentir de 20 ou 30 secondes en une journée. L'horloge peut être facilement remise à l'heure avec un logiciel, de sorte que le logiciel peut contourner la plupart des inconvénients.
Fonction 89h : Mode protégé
La fonction 89h fait passer l'AT en mode protégé. Seule une personne développant son propre système d'exploitation peut être intéressée par cette fonction. Tout système capable de multitraitement doit fonctionner en mode protégé.
Fonction 84h : Lecture de la manette de jeudx
La fonction 84h lit deux manettes de jeux connectés à l'AT. Deux sous-fonctions opèrent au sein de cette fonction : Les deux renvoient un indicateur de report défini si l'adaptateur auquel les manettes doivent être connectées n'existe pas.
La première sous-fonction s'exécute en passant le numéro de fonction au registre AH et la valeur 0 au registre DX. Il renvoie l'état des boutons de tir de manette de jeux dans les bits 4 à 7 du registre AL.
La deuxième sous-fonction s'exécute en transmettant le numéro de fonction au registre AH et la valeur 1 au registre DX. Il renvoie les positions actuelles de la manette de jeux à l'aide des coordonnées X et Y. La coordonnée X de la première manette de jeux se trouve dans le registre AX et la coordonnée Y dans le registre BX. Pour la deuxième manette de jeux, le registre CX contient la coordonnée X et le registre DX la coordonnée Y.
Fonction 85h : Lire la touche SysReq
La touche System Request du clavier AT déclenche une interruption sans produire de code de caractère. Il ne peut pas être testé avec les fonctions de lecture du clavier du BIOS. La fonction 85h lit le clavier pour la touche System Request. Le passage du numéro de fonction au registre AH exécute la fonction. La version actuelle du BIOS n'implémente pas cette fonction dans l'interruption de la cassette. Habituellement, la touche System Request ne fait rien lorsque l'utilisateur appuie dessus. Cependant, une routine en langage machine peut affecter une application spéciale à la touche System Request. Ce programme doit uniquement "dévier" l'interruption 15h vers sa propre routine. S'il est appelé par un programme utilisateur ou par le système, une routine utilisateur s'exécute à la place de l'interruption de la cassette. Il peut tester si le registre AH contient le numéro de fonction 85h. Si ce n'est pas le cas, il appelle l'interruption de l'ancienne cassette. Si le registre AH contient ce numéro de fonction, la routine utilisateur exécute l'action souhaitée.
Le contenu du registre AL est également important pour cette routine utilisateur car il indique si l'utilisateur a appuyé ou relâché la touche System Request : 0 signifie activé, 1 signifie relâché.