Les Secrets du BIOS PC/AT

1. Generalites

Le BIOS (Basic Input Output System) constitue le logiciel de base pour le fonctionnement du systeme ; il assure la compatibilite avec le standard du marche.

Le BIOS est un ensemble de programmes residents ; il est situe dans la memoire morte PROM entre les adresses 0F0000H et 0FFFFFH (64 ko) ; cette memoire est accessible egalement dans le champs FF0000H - FFFFFFH afin de garder une compatibilite entre le mode protege et le mode reel (a l'initialisation, le processeur est en mode reel : l'adresse de depart est FFFFF0H car les bits A19-A23 (bus adresses), non utilises, sont a 1).

Certaines extensions du BIOS peuvent etre situee dans le champ d'adresses 0C8000H a 0DFFFFH ; ces extensions, situees sur des cartes extensions, sont reconnues automatiquement.

Le BIOS comprend : - Le programme d'initialisation dont l'adresse de depart est FFFFF0H (adresse de branchement apres RESET), - Les programmes de controle, charges d'assurer toutes les taches elementaires d'entrees- Sorties (primitives du BIOS), - Les tables de donnees.

Le BIOS utilise environ 1,5 ko en debut de la memoire vive RAM, de 000000H a 000500H compris.

Cette partie de la memoire vive est utilisee pour pointer :

  1. Des programmes elementaires du BIOS. Ces programmes sont appeles par les vecteurs des interruptions materielles (IRQ des deux 8259), par des instructions de branchement de type INTxx ou par des exceptions 80286.
  2. Des zones de stockage de donnees.

/------------------------\        \              \
|   64ko BIOS            |FFFFFFH |              |
|   carte mere           |FF0000H |zone dupliquee|
|------------------------|        | de 0E0000H   |
|Libre extension         |FEFFFFH |  a 0FFFFFH   |
|BIOS carte mere         |FE0000H |              | 
|------------------------|        /              |
|                        |FDFFFFH                |
|     Libre              |                       |
|  extension RAM systeme |                       |
|                        |100000H                |
|------------------------|                       /
|       128ko BIOS       |0FFFFFH                \
|      ROM carte mere    |                       |
|                        |0E0000H                |
|------------------------|                       |
|    Libre extension     |0DFFFFH                |
|    BIOS cartes ext     |0C8000H                |
|------------------------|                       |
|          32ko          |0C7FFFH                | 1Mo
|    extension BIOS      |                       |
|    ROM video VGA       |                       |
|                        |0C0000H                |
|------------------------|                       |
|         256ko          |0BFFFFH                |
|       RAM video        |                       |
|                        |0A0000H                |
|------------------------|                       |
|        128ko           |09FFFFH                |
|   extension RAM systeme|                       |
|                        |080000H                |
|------------------------|                       |
|   512ko RAM Systeme    |07FFFFH                |
|                        |000500H\               |
|                        |       | Reserve BIOS  |
\------------------------/000000H/               /

2. Initialisation du systeme (en general)

 /--------------\/-----------------\/--------------\                   
 |RESET MATERIEL||MISE SOUS TENSION||RESET LOGICIEL|                   
 \-------|------/\-------|---------/\-------|------/                   
         \---------------|------------------/                          
                  -------|---------    oui                             
                < TEST RESET CHAUD ?>------------------\               
                  -------|---------                    |               
                         |non                          |               
             /|----------|-----------|\    /|----------|-------------|\
             || AUTOTESTS CARTE MERE ||    ||TRAITEMENT ORIGINE RESET||
             \|----------|-----------|/    \|-------|-----|----------|/
                         |--------------------------/     |            
             /|----------|-----------|\                 SHUTDOWN       
             ||INITIALISATION PHASE 1||                                
             ||     BANNIERE BIOS    ||                                
             \|----------|-----------|/                                
                  -------|---------    non                             
                < TEST RESET HARD ?> -----\                            
                  -------|---------       |                            
                         |oui             |                            
               /---------|-----------\    |                            
               |BANNIERE TEST MEMOIRE|    |                            
               \---------|-----------/    |                            
Interruption /|----------|-----------|\   |                            
clavier  /---||     TEST MEMOIRE     ||   |                            
INT09H   |   \|----------|-----------|/   |                            
         |      /--------|--------\       |                            
         |      |BANNIERE TESTS OK|       |                            
         |      \--------|--------/       |                            
         \---------------|----------------/                            
             /|----------|-----------|\                                
             ||INITIALISATION PHASE 2||                                
             ||   BANNIERE "x MHz"   ||                                
             \|----------|-----------|/                                
        /|---------------|-------------------|\                        
        ||VERIFICATION CONFIGURATION MACHINE ||                        
        \|---------------|-------------------|/                        
         /|--------------|------------------|\                         
         ||CHARGEMENT SYSTEME D'EXPLOITATION||                         
         \|---------------------------------|/                         
Lors d'un RESET du systeme, la premiere instruction executee par le microprocesseur est celle situee a l'adresse FFFFF0H. A cet endroit, se trouve le debut du programme d'initialisation du systeme ; celui-ci effectue les operations suivantes dans l'ordre de l'organigramme de la page precedente :

a) TEST RESET CHAUD : Si le bit SF (b2) du registre d'etat du controleur clavier 8742 est a zero (lecture en E/S 0064H), il s'agit d'un reset materiel et les autotests de la carte mere sont effectues ; dans le cas contraire, l'origine du reset est analys ee.

b) TRAITEMENT ORIGINE DU RESET : lecture du registre 0FH de la RAM CMOS, et suivant la valeur lue traite l'origine du reset.

c) AUTOTESTS AUTOMATIQUES : Ces tests contiennent une phase d'initialisation propre aux tests a effectuer ; une erreur detectee entraine le blocage du systeme, apres l'emission eventuelle de 2 bip long (15ms) et d'un message d'erreur 20,21,23,25,28,30,29 . Ces tests sont realises dans l'ordre :

  • - PICs 8259
  • - Compteur sequenceur programmable 8254
  • - Premiers 64 ko de memoire
  • - Vecteurs d'interruption
  • - Video
  • - DMAs
  • - Horloge Dateur CMOS 146818
  • - Interface clavier 8742
  • - Clavier (test non fatal, message d'erreur 35 et 3 bip long)

    d) TEST RESET HARD : Si le mot a l'adresse 000472H est 1234H, l'origine est un reset logiciel ; les tests automatiques ne sont pas effectues. Dans le cas contraire ils sont effectues.

    e) INITIALISATION PHASE 1 : L'initialisation est realisee dans l'ordre suivant :

  • - Masque NMI parite memoire
  • - Reset du 80287
  • - 8254 canal 0 (refresh)
  • - RAZ memoire 64 ko
  • - Chargement des vecteurs d'interruption en RAM
  • - Controleurs d'interruptions PICs 8259
  • - Video
  • - Banniere BIOS : "XXXX SYSTEM BIOS VERSION xxxx"
  • - Controleur interface clavier 8742
  • - Clavier (test non fatal, message d'erreur 35)

    g) TEST MEMOIRE : Test de la memoire RAM systeme ; ce test etant assez long (21 secondes), il peut etre arrete par l'action sur une touche du clavier.

    h) BANNIERE TEST MEMOIRE : "xxx K PASS Y STOP TEST ESC" "640 K PASS 6 TEST OK" i) INITALISATION PHASE 2 : L'initialisation est realisee dans l'ordre suivant :

  • - DMA esclave (8 bits)
  • - DMA maitre (16 bits)
  • - Pages DMA
  • - Validation INT relais PIC maitre
  • - Interfaces serie
  • - Interfaces imprimantes
  • - Interface disquette
  • - Interface disque
  • - 80287
  • - ROM BIOS supplementaires. Le programme d'initialisation reconnait les eventuelles extensions du BIOS sur les memoires mortes des cartes en option. A cet effet, il detecte entre les adresses 0C8000H et 0DFFFFFFH, par pas de 2 ko, les trois premiers octe ts ; s'il existe une extension du BIOS, le contenu de ces octets doit etre le suivant :
  • .Octet nx0 = 55H
  • .Octet nx1 = AAH
  • .Octet nx2 = Longueur de la memoire extension en nombre de blocs de 512 octets.

    .La somme, sur un octet, de tous les octets, de tous les blocs valides, de la memoire ext. doit etre egale a 00H (le dernier octet du dernier bloc de 512 ko contient un octet de complement a 0).

    Dans ce cas, le programme d'initialisation se branche a l'adresse de l'octet nx3 de cette extension. Le programme d'extension execute alors son cycle d'initialisation propre et redonne le controle au programme principal.

    - Validation INT relais PIC esclave - Initialisation memoire d'expansion (par module de 64 ko consecutifs au dela de 1 Mo) Parfois, sur les PCAT, le BIOS ext. video est utilise de fa^Gon particuliaire pour diminuer les temps d'acces, par un transfert en memoire RAM.

    j) VERIFICATION CONFIGURATION MACHINE : Test de la memoire RAM CMOS avec le resultat des autotests (messages d'erreur 71,72,70,74,75).

  • - Affichage video tty (fonction 0EH de INT10H)
  • - Demasque NMI parite memoire

    k) CHARGEMENT SYSTEME D'EXPLOITATION : Mise en route du systeme d'exploitation : appel de la primitive INT19H pour le chargement du systeme d'exploitation (messages d'erreur 80,81,"Appuyez sur une touche pour un reesai / Press a key for retry").

    3. MESSAGES DU BIOS

    La date de version du BIOS est situee en F000:FFF5H.

    EXEMPLE DE BANNIERES DU BIOS

    XXXX BIOS SYSTEM VERSION : xxxx
    640K BASE MEMORY TEST OK :
    512K EXTENSION MEMORY TEST OK :
    

    EXEMPLE DE MESSAGES D'ERREUR BIOS

     / DMA FAILURE 8 bits
     / DMA FAILURE 16 bits
     / DMA PAGE FAILURE
     / RAM CMOS FAILURE
     / 8742 FAILURE
     / KEYBOARD LINES ERROR
     / KEYBOARD ERROR
     / BASE MEMORY ERROR
     / EXTENDED MEMORY ERROR
     / Hard disk controller error
     / Hard disk format error
     / Diskette controller error :
     / Clock error :
     / Battery error :
     / Checksum error :
     / Memory size error :
     / Configuration error :
     / Boot sector error
     / System loading failure
    Appuyez sur une touche pour un reessai /Press a key for retry
     / Erreur telechargement
    

    4. Primitives du BIOS

    Ce sont tous les programmes fondamentaux necessaires au fonctionnement de l'ordinateur. Ces programmes sont appeles par l'intermediaire de la table situee dans la memoire RAM, dans la zone des interruptions.

    Cette table est chargee a l'initialisation du systeme ; elle contient les adresses des programmes elementaires du BIOS ; elle est normalisee pour toutes les unites centrales compatibles, afin de permettre au programmeur de rediger des programmes transpor tables sur d'autres machines compatibles ; de plus cette procedure permet d'intercepter certains sous-programmes comme par exemple le programme d'interruption clavier (INT09H), afin de pouvoir utiliser des claviers de differentes nationalites (ex. : utilitaire "KEYB.COM/FR" sous MS-DOS pour l'utilisation du clavier AZERTY Français).

    La liste de ces programmes est donnee dans le � 5.a). Chaque programme est affecte a un numero de type d'interruption nxxx correspondant au vecteur d'interruption xx ou a une instruction de type INTxx.

    Les interruptions (INT00H a INTFFH) comprennent plusieurs categories :

  • a) Les exceptions du microprocesseur (INT00H a INT09H, INT0DH, INT10H). Elles sont generees par le microprocesseur 80286 lui-meme, quand il rencontre des conditions inhabituelles.

  • b) Les interruptions systeme, generees par les controleurs d'interruption 8259 maitre (INT08H a INT0FH) et esclave (INT70H a INT77H) : Ce sont les interruptions BIOS proprement dites ; elles sont liees a l'architecture et a la programmation du systeme.
  • c) Les interruptions libres
    Utilisees par le BIOS pour la gestion des ressources du systeme, par les systemes d'exploitation et les logiciels comme point d'appel d'un sous-programme particulier : on distingue par exemple les interruptions du MS-DOS 3.x : de 20H a 62H. Les interruptions 0H a 65H sont resevees. Celles de 66H a FFH sont en principe libres ou reservees pour l'utilisations.

    Certaines interruptions sont en fait des pseudo-interruptions : les emplacements ne pointent pas vers de veritables procedures, mais stockent simplement l'adresse de parametres utilises par une autre procedure (par exemple l'adresse pointee par INT1DH, INT1EH, INT1FH sont des emplacements de stockage d'informations sur le mode video, le type de disquette ou les caracteres graphiques).

    5. Emplacement des primitives (mode reel)

    a) Generalites

    L'emplacement reserve dans la memoire pour chaque type d'interruption contient l'adresse du programme de gestion de l'interruption. Cet emplacement contient quatre octets qui sont affectes comme indique ci-dessous :
           /---------------------------|------------\\
    000000H|Registre IP (Poids faibles)|            ||
           |---------------------------|Deplacement ||
    000001H|Registre IP (Poids forts)  |            || INT00H ou
           |---------------------------|------------|| vecteur 00H
    000002H|Registre CS (Poids faibles)|            ||
           |---------------------------|Segment     ||
    000003H|Registre CS (Poids forts)  |            ||
           |---------------------------|------------|/
    000004H|                           |            |
    etc...                                             INTFFH ou 
           |                           |            || vecteur FFH
    0003FFH|                           |            ||
           \---------------------------|------------//
    
    Quand une instruction type INTxxH est executee, le microprocesseur sauvegarde dans la pile les registres FLAGS, CS, IP, positionne IF et TF a zero, et charge dans ses registres IP et CS la valeur contenue dans l'emplacement pointe par le vecteur d'interruption INTxxH. Cette instruction est equivalente a une instruction CALL excepte qu'elle doit etre terminee par une instruction IRET (au lieu de RET pour l'instruction CALL).

    CS:IP sauvegarde dans la pile pointe l'instruction qui a genere l'interruption ou sur celle que le microprocesseur allait executer lorsqu'une interruption est survenue.

    b) Tableau des primitives

    TABLEAU DES PRIMITIVES BIOS
    /-------|---|-------------------------|-------------------------\
    |Adresse| nx|                         |       Traitement        |
    | RAM   |   |         Objet           |         par le          |
    |       | IT|                         |          BIOS           |
    |-------|---|-------------------------|-------------------------| \
    |000000H|00H|Division par zero        |Non traite               | |
    |-------|---|-------------------------|-------------------------| | Exceptions
    |000004H|01H|Mode pas a pas           |Non traite               | | 80286
    |-------|---|-------------------------|-------------------------| /
    |000008H|02H|Erreur de parite         |Arret systeme            |NMI
    |-------|---|-------------------------|-------------------------| \
    |00000CH|03H|Point d'arret            |Non traite               | |
    |-------|---|-------------------------|-------------------------| | Exceptions
    |000010H|04H|Debordement (INTO)       |Non traite               | | 80286
    |-------|---|-------------------------|-------------------------| /
    |000014H|05H|Impression d'ecran       |Impression d'ecran       | 
    |       |   |-------------------------|-------------------------| 
    |       |   |+Exception instruc BOUND |Non traite               |Exception 286
    |-------|---|-------------------------|-------------------------| \
    |000018H|06H|Code op non valide       |Non traite               | |
    |-------|---|-------------------------|-------------------------| | Exceptions
    |00001CH|07H|Processeur ext non dispo |Non traite               | | 80286
    |-------|---|-------------------------|-------------------------| /   \
    |       |   |Interruption horloge     |Mise                     |     |
    |000020H|08H|temps reel (8254)        |a jour                   |IRQ0 |
    |       |   |18,2 tops/s              |compteur                 |     |
    |       |   |-------------------------|-------------------------|     |
    |       |   |+Exception double faute  |Non traite               |Excep|
    |-------|---|-------------------------|-------------------------|     |
    |       |   |                         |Prise en compte du code  |     |
    |000024H|09H|Interruption clavier     |geographique de la touche|IRQ1 |
    |       |   |                         |clavier et decodage      |     |
    |       |   |-------------------------|-------------------------|     |
    |       |   |+Except debord seg coproc|Non traite               |Excep|
    |-------|---|-------------------------|-------------------------|     |
    |000028H|OAH|Chainage 8259 esclave    |Chainage 8259 esclave    |IRQ2 | 8259
    |-------|---|-------------------------|-------------------------|     | PIC
    |00002CH|OBH|Reserve communications   |Non traite               |IRQ3 | maitre
    |-------|---|-------------------------|-------------------------|     |
    |000030H|OCH|Reserve communications   |Non traite               |IRQ4 |
    |-------|---|-------------------------|-------------------------|     |
    |000034H|0DH|Reserve imprimante nx2   |Non traite               |IRQ5 |
    |       |   |-------------------------|-------------------------|     |
    |       |   |+Except debord segment   |Non traite               |Excep|
    |-------|---|-------------------------|-------------------------|     |
    |000038H|0EH|Interruption disquette   |Prise en compte          |IRQ6 |
    |-------|---|-------------------------|-------------------------|     |
    |00003CH|0FH|Interrupt. Imprimante nx1|Non traite               |IRQ7 |
    \-------|---|-------------------------|-------------------------/     /
    TABLEAU DES PRIMITIVES BIOS (suite)
    /-------|---|-------------------------|-------------------------\
    |Adresse| nx|                         |       Traitement        |
    | RAM   |   |         Objet           |         par le          |
    |       | IT|                         |          BIOS           |
    |-------|---|-------------------------|-------------------------|
    |000040H|10H|Video                    |Affichage video          |
    |-------|---|-------------------------|-------------------------|
    |000044H|11H|Configuration du systeme |Lecture de la            |
    |       |   |                         |configuration du systeme |
    |-------|---|-------------------------|-------------------------|
    |000048H|12H|Memoire RAM              |Lecture de la            |
    |       |   |                         |taille memoire RAM       |
    |-------|---|-------------------------|-------------------------|
    |00004CH|13H|Traitement               |Gestion entrees/sorties  |
    |       |   |disques et disquettes    |de la memoire de masse   |
    |-------|---|-------------------------|-------------------------|
    |000050H|14H|Communications           |Gestion d'une voie       |
    |       |   |                         |serie asynchrone V24     |
    |-------|---|-------------------------|-------------------------|
    |000054H|15H|Mode protege + divers    |Mode protege + divers    |
    |-------|---|-------------------------|-------------------------|
    |000058H|16H|Clavier                  |Gestion clavier          |
    |-------|---|-------------------------|-------------------------|
    |00005CH|17H|Imprimante               |Gestion imprimante       |
    |-------|---|-------------------------|-------------------------|
    |000060H|18H|Si INT19H sans resultat  |Test usine               |
    |-------|---|-------------------------|-------------------------|
    |-------|---|-------------------------|-------------------------|
    |000068H|1AH|Heure et jour            |Donne heure et jour      |
    |-------|---|-------------------------|-------------------------|
    |00006CH|1BH|Interruption clavier     |Non traite               |
    |       |   |"break"                  |                         |
    |-------|---|-------------------------|-------------------------|
    |000070H|1CH|Application liee a INTO8H|Non traite               |
    \-------|---|-------------------------|-------------------------/
    
    
    TABLEAU DES PRIMITIVES BIOS (suite)
    /-------|---|-------------------------|-------------------------\
    |Adresse| nx|                         |       Traitement        |
    | RAM   |   |         Objet           |         par le          |
    |       | IT|                         |          BIOS           |
    |-------|---|-------------------------|-------------------------|
    |000074H|1DH|Parametres video 6845    |Pointe zone de donnees   |
    |-------|---|-------------------------|-------------------------|
    |000078H|1EH|Parametres disquette     |Pointe zone de donnees   |
    |-------|---|-------------------------|-------------------------|
    |       |   |                         |Pointe le tableau des 128|
    |00007CH|1FH|Caracteres graphiques    |caracteres graphiques    |
    |       |   |                         |extensions, modes 4,5& 16 |
    |-------|---|-------------------------|-------------------------|
    |000100H|40H|Traitement disquette     |Si disque en INT13H      |
    |-------|---|-------------------------|-------------------------|
    |000104H|41H|Parametres disque nx0    |Pointe zone de donnees   |
    |-------|---|-------------------------|-------------------------|
    |000108H|42H|Redirection de INT10H    |Affichage video          |
    |-------|---|-------------------------|-------------------------|
    |       |   |                         |Pte tableau 128 premiers |
    |00010CH|43H|Caracteres graphiques    |pour modes 4,5& 16 et 256 |
    |       |   |                         |carac pour modes D,E,F,10|
    |       |   |                         |12 et 13                 |
    |-------|---|-------------------------|-------------------------|
    |000118H|46H|Parametres disque nx1    |Pointe zone de donnees   |
    |-------|---|-------------------------|-------------------------|
    |000128H|4AH|Reser. alarme utilisateur|Non traite               |
    |-------|---|-------------------------|-------------------------|     \
    |0001C0H|70H|Horl. dateur programmable|Gestion calendrier       |IRQ8 |
    |-------|---|-------------------------|-------------------------|     |
    |0001C4H|71H|Reserve   relais         |Non traite               |IRQ9 |
    |-------|---|-------------------------|-------------------------|     |
    |0001C8H|72H|Reserve                  |Non traite               |IRQ10|
    |-------|---|-------------------------|-------------------------|     |
    |0001CCH|73H|Reserve                  |Non traite               |IRQ11| 8259
    |-------|---|-------------------------|-------------------------|     | PIC
    |0001D0H|74H|Reserve                  |Non traite               |IRQ12|esclave
    |-------|---|-------------------------|-------------------------|     |
    |0001D4H|75H|Interr. processeur 80287 |Gestion 80287            |IRQ13|
    |-------|---|-------------------------|-------------------------|     |
    |0001D8H|76H|Int. controleur disque   |Int15H                   |IRQ14|
    |-------|---|-------------------------|-------------------------|     |
    |0001DCH|77H|Reserve int.SCSI         |Non traite               |IRQ15|
    \-------|---|-------------------------|-------------------------/     /
    

    c) Modification et installation d'interruptions

    Les routines d'interruption generalisent la notion de bibliotheques de procedures externes. La seule contrainte a laquelle elles sont assujetties consiste en leur installation, qui doit etre prealable a leur utilisation. Cette installation correspond en fait a trois phases : - 1) Sauvegarder le vecteur d'interruption present si necessaire.

    - 2) Charger en memoire centrale le programme correspondant a l'interruption que l'on veut creer et/ou modifier.

    - 3) Indiquer au systeme d'exploitation l'emplacement de la routine : ecriture du double mot situe a l'emplacement du vecteur d'interruption. Ce double mot contient le contenu des registres IP et CS qui seront charges au moment de l'appel de la procedure .

    - 4) Proteger la routine d'interruption pour empecher qu'un autre programme puisse venir recouvrir intempestivement le premier.

    - 5) Restituer l'ancien vecteur d'interruption si necessaire.

    Sous MS-DOS, les phases 2) et 3) peuvent etre realisees par les fonctions 35H et 25H de l'interruption 21H.

    6. zone de donnees du BIOS

    Cette zone est situee en memoire vive a partir de l'adresse 000400H. Elle contient les parametres utilises par le BIOS pour toutes les fonctions du systeme.

    INTERFACES V24/RS232C

    000400H a 000407H = adresses Entree- Sortie (2 octets)pour les voies COM1, COM2, COM3, COM4, respectivement :
    - 000400H = adresse Entree/Sortie voie logique nx0 = COM1
    - 000402H = adresse Entree/Sortie voie logique nx1 = COM2
    - 000404H = adresse Entree/Sortie voie logique nx2 = COM3
    - 000406H = adresse Entree/Sortie voie logique nx3 = COM4
    
    Attention! : l'affectation du numero des voies COM1 et COM2 est realisee par le BIOS dans l'ordre des voies effectivement presentes aux adresses 03F8H, 02F8H, 02E8H. Par exemple s'il n'existe qu'une interface a l'adresse 02F8H, celle-ci est affectee a CO M1.

    00047CH a 00047FH = Time out (1 octet) des voies V24 nx0, nx1, nx2, nx3 respectivement.

    INTERFACES IMPRIMANTES

    000408H a 00040FH = adresses entree- Sortie (2 octets) pour les interfaces paralleles LPT1, LPT2, LPT3, LPT4 respectivement.

    - 000408H = adresse Entree/Sortie voie logique nx0 = LPT1
    - 00040AH = adresse Entree/Sortie voie logique nx1 = LPT2
    - 00040CH = adresse Entree/Sortie voie logique nx2 = LPT3
    - 00040EH = adresse Entree/Sortie voie logique nx3 = LPT4
    
    Attention! : l'affectation du numero de la voie (LPTx) est realisee par le BIOS dans l'ordre des voies effectivement presentes aux adresses 03BCH, 0378H, 0278H. Par exemple s'il n'existe qu'une interface a l'adresse 0278H, celle-ci est affectee a LPT1.

    000478H a 00047BH = Time-out (1octet) des imprimantes nx0, nx1, nx2, nx3 respectivement.

    DONNEES DIVERSES

    000410H = Configuration equipement ecrite pendant la phase d'initialisation du systeme.

    /---------------------------------------------------------------\
    |            Configuration equipement 000410H                   |
    |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
    |b15|b14|b13|b12|b11|b10|b9 |b8 |b7 |b6 |b5 |b4 |b3 |b2 |b1 |b0 |
    \---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---/
    b15, 14 : nombre d'imprimantes (00=0 a 11=3)
    b13, 12 : non utilises
    b11, 10, 9 : nombre de voies serie V24/RS232
    b8 : inutilise
    b7-6 : nombre de lecteur disquette (00=1 a 11=4), seulement si le bit b0 est a 1.
    

    b5, 4 : mode initial de la visu 00 : non utilise 01 : utilisation du mode couleur en 40 x 25 VGA 10 : utilisation du mode couleur en 80 x 25 VGA 11 : utilisation du mode monochrome en 80 x 25 VGA b3, 2 : non utilises b1 : presence du coprocesseur 80287 (1 = present) b0 : a 1, ce bit indique qu'il y a au moins un lecteur de disquette dans le systeme.

    000412H = drapeau d'initialisation.

    000413H = 2 octets = capacite memoire vive systeme en nombre de blocs de 1 ko contigu s.

    000500H = Drapeau copie ecran (INT05H).

    000467H = Pointeur de l'offset de retour apres un reset.

    000469H = Pointeur du registre segment de retour de reset.

    00046BH = indique qu'une interruption a eu lieu.

    000472H = (2 octets) ; Drapeau reset ; pas d'autotest a l'initialisation si le mot est 1234H (warm boot). Cet octet est force a 1234H en cas de reset logiciel.

    007C00H = Adresse de chargement de l'amorce (BOOT).

    DONNEES CLAVIER

    000417H = etat de verrouillage des touches de fonction du clavier.

    /----------------------------------------------------------------\
    | ETAT DE VERROUILLAGE DES TOUCHES DE FONCTION DU CLAVIER 000417H|
    |-------|--------|-------|-------|-------|-------|-------|-------|
    |  b7   |   b6   |  b5   |   b4  |  b3   |  b2   |  b1   |  b0   |
    |-------|--------|-------|-------|-------|-------|-------|-------|
    |INSER  |   MAJ  |  NUM  |ARR DEF|  ALT  |  CTRL | SHIFT | SHIFT |
    |       |  LOCK  |  LOCK |  LOCK |       |       |GAUCHE | DROIT |
    \-------|--------|-------|-------|-------|-------|-------|-------/
    \----------------|---------------/\--------------|---------------/
            Etat de la bascule                   Etat de la touche
            (1=fonction active)                    (1=enfoncee)   
            (0=fonction inactive)                  (0=relachee)   
    
    000418H = Etat physique des touches de fonction du clavier.

    /---------------------------------------------------------------\
    |   ETAT PHYSIQUE DES TOUCHES DE FONCTION DU CLAVIER 000418H    |
    |-------|-------|-------|-------|-------|-------|-------|-------|
    |  b7   |  b6   |  b5   |   b4  |   b3  |  b2   |   b1  |  b0   |
    |-------|-------|-------|-------|-------|-------|-------|-------|
    |INSER  |  MAJ  |  NUM  |ARR DEF| PAUSE |APP SYS|   ALT |  CTRL |
    |       |  LOCK |  LOCK |  LOCK |       |       | GAUCHE| GAUCHE|
    \-------|-------|-------|-------|-------|-------|-------|-------/
    \---------------|---------------/\--------------|---------------/
             Etat de la touche             Etat de la bascule        
                (1=enfoncee)                (1=fonction active)      
                (0=relachee)                (0=fonction inactive)    
    
    000419H = ALT-INPUT ; Valeur temporaire de la fonction ALT "code ASCII" : - ALT"X" : ALT-INPUT = X - ALT"X,Y" : ALT-INPUT = (ALT-INPUTx10)+Y = (10xX)+Y - ALT"X,Y,Z" : ALT-INPUT = (ALT-INPUTx10)+Z = ((10xX)+Y)x10)+Z 00041AH = Pointeur de debut du buffer-clavier (2 octets).

    ex. : si (00041AH) = 001EH = le pointeur pointe le debut du buffer clavier situe en 00041EH.

    00041CH = Pointeur de la fin du buffer clavier (2 octets).

    00041EH a 00043DH = Buffer clavier = 15 touches max (30 octets).

    000471H = Drapeau (b7) si la touche "break" (ou Attn) a ete enfoncee. INT1BH est alors executee.

    000480H = Adresse debut buffer clavier, pointe le debut du buffer clavier, entre 00041EH et 00043DH.

    000482H = Adresse fin buffer clavier.

    000496H =
    - b0 : le dernier code clavier etait E0H,
    - b1 : le dernier code clavier etait E1H,
    - b2 : touche Ctrl droite enfoncee,
    - b3 : touche Alt droite enfoncee,
    - b4 : clavier 101/102 touches installe,
    - b5 : positionne Num Lock
    - b6 : le dernier caractere etait le premier ID caractere
    - b7 : lecture ID en cours 000497H =
    - b0,b1,b2 : bit led (allume a 1 : b0 = MAJ-LOCK, b1 = NUM-LOCK, b2 = ARRET-DEFIL).

    - b3 : type de clavier (84 touches (0) ou 101/102 touches (1)).

    - b4 : accuse reception donnee clavier.

    - b5 : indicateurs de retransmission en reception.

    - b6 : mise a jour indicateurs en cours.

    - b7 : erreur de transmission clavier/systeme.

    DONNEES UNITES DE DISQUETTE

    00043EH = les unites de disquette necessitent un recalibrage avant l'acces suivant si respectivement les bits b0 a b3 pour les unites 0 a 3 sont a 0.

    00043FH = etat moteur des unites de disquette : les bits b0 a b3 sont l'image des bits b4 a b7 du registre selection unite a l'adresse E/S 03F2H.

    /---------------------------------------\
    |  ETAT MOTEUR DES UNITES DE DISQUETTE  |
    |----|----|----|----|----|----|----|----|
    | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 |
    \----|----|----|----|----|----|----|----/
    \-|-/     \----|----/\---------|---------/
    a 1 si         |    Etat du moteur des
    l'operation    |    unites 0 a 3 respectivement
    courante est   |    pour les bits b0 a b3 (mis a 0
    une ecriture   |    par INT08H sur arret unite en cours)
                   |    
                   \ Unite selectionnee
    
    000440H = compteur temporisation pour arret moteur (decremente par l'horloge temps reel INT08H). Ce compteur est charge par le parametre trouve dans INT1EH (ici 35H soit environ 3 secondes) apres chaque acces disquette.

    000441H = etat du controleur de disquette apres la derniere operation sur une unite de disquette (fonction 01H de INT13H). Ce code est retourne dans le registre AH apres tout acces disquette.

    000442H = 7 octets de la phase resultat du controleur FDC9268. Cette zone permet au BIOS de calculer l'octet en 000441H (code simplifie).

    00048BH = Memorise taux de transfert de la derniere operation.

    /-------------------------------\
    |   Taux de transfert utilise   |
    |---|---|---|---|---|---|---|---|
    |b7 |b6 |b5 |b4 |b3 |b2 |b1 |b0 |
    \---|---|---|---|---|---|---|---/
    \---|---/       \---|---/
        |               |   /-----------\
        |               |   |  en cours |
        |           /---|---|-----------|
        |           | 0 | 0 |500 kb/s   |
        |           | 0 | 1 |300 kb/s   |
        |           | 1 | 0 |250 kb/s   |
        |           | 1 | 1 |non utilise|
        |           \---|---|-----------/
        |   /-----------\
        |   |derniere op|
    /---|---|-----------|
    | 0 | 0 |500 kb/s   |   les bits b5,b4,b1,b0 sont reserves
    | 0 | 1 |300 kb/s   |
    | 1 | 0 |250 kb/s   |
    | 1 | 1 |non utilise|
    \---|---|-----------/
    
    000490H = etat du couple disquette/type d'unite : unite nx0 000491H = etat du couple disquette/type d'unite : unite nx1 000492H = etat precedent du couple disq/unite : unite nx0 000493H = etat precedent du couple disq/unite : unite nx1
    /-------------------------------\
    | Couple disquette/type d'unite |
    |---|---|---|---|---|---|---|---|
    |b7 |b6 |b5 |b4 |b3 |b2 |b1 |b0 |
    \---|---|-|-|-|-|---|---|---|---/
    \---|---/ |   |     \-----|-----/
        |     |   |           |     /-------|------|----------\
        |     |   |           |     |support| unite|   acces  |
        |     |   | /---|---|-|-|---|-------|------|----------|
        |     |   | | 0 | 0 | 0 | 0 |360 ko |360 ko|          |
        |     |   | | 0 | 0 | 0 | 1 |360 ko |1,2 Mo|          |
        |     |   | | 0 | 0 | 1 | 0 |1,2 Mo |1,2 Mo|          |
        |     |   | | 1 | 0 | 0 | 0 |720 ko |720 ko|non etabli|
        |     |   | | 1 | 0 | 0 | 1 |720 ko |1,4 Mo|          |
        |     |   | | 1 | 0 | 1 | 0 |1,4 Mo |1,4 Mo|          |
        |     |   | |---|---|---|---|-------|------|----------|
        |     |   | | 0 | 0 | 1 | 1 |360 ko |360 ko|          |
        |     |   | | 1 | 1 | 0 | 0 |360 ko |1,2 Mo|          |
        |     |   | | 1 | 1 | 0 | 1 |1,2 Mo |1,2 Mo|          |
        |     |   | | 1 | 0 | 1 | 1 |720 ko |720 ko|  etabli  |
        |     |   | | 1 | 1 | 0 | 0 |720 ko |1,4 Mo|          |
        |     |   | | 1 | 1 | 0 | 1 |1,4 Mo |1,4 Mo|          |
        |     |   | \---|---|---|---|-------|------|----------/
        |     |   \------ 0 = non etabli, 1 = etabli
        |     \---------- 0 = simple stepping, 1 = double stepping
        |   /-----------\
        |   |vit transf |
    /---|---|-----------|
    | 0 | 0 |500 kb/s   | 1,2/1,2 &  1,4/1,4
    | 0 | 1 |300 kb/s   | 360/1,2
    | 1 | 0 |250 kb/s   | 720/720 &  720/1,4 &  360/360
    | 1 | 1 |non utilise|
    \---|---|-----------/
    
    000494H = position piste courante unite nx0 000495H = position piste courante unite nx1

    DONNEES VIDEO

    000449H = Mode d'affichage initialise par la fonction 00H de INT10H.

    00044AH = Nombre de colonnes affichees (2 octets).

    00044CH = Longueur d'une page ecran en octets (2 octets).

    00044EH = Sauvegarde de l'adresse de debut dans la page video active (2 octets).

    000450H = Position curseur pour les 8 pages video : -000450H numero colonne page 1.

    -000451H numero ligne page 1.

    - etc. pour les pages 2, 3, 4, ..., 8.

    000460H = Registre CRT fin curseur (03x5H, pointeur 0BH).

    000461H = Registre CRT debut curseur (03x5H, pointeur 0AH).

    000462H = Numero de la page video active : max 8 en 40 x 25 et 4 en 80 x 25.

    000463H = Adresse entree/sortie de l'interface video active : 03B4H pour monochrome et 03D4H pour couleur (2 octets).

    000465H = Registre controle mode de l'interface couleur (03D8H) ou monochrome (03B8H).

    000466H = Stockage de la couleur de fond et du choix de la palette en mode couleur. Reflete l'etat du port 03D9H (registre selection couleur).

    000484H = Nombre de lignes sur l'ecran (-1).

    000485H = Nombre d'octets par caractere (2 octets).

    000487H = Controle de la video 000488H = Controle de la video 0004A8H = Pointeur parametres video

    DONNEES TIMER

    00046CH = Compteur horloge systeme (poids faibles).

    00046EH = Compteur horloge systeme (poids forts).

    1 seconde = 12H. 1 minute = 444H (1092,39).

    1 heure = 10007H (65.543,33).

    1 jour = 1800B0H (1.573.040).

    Cette horloge est decrementee par INT08H avec une periode de 54,9 ms.

    000470H = Drapeau depassement 24 heures (initialise a 0 par le BIOS).

    DONNEES DISQUES

    000474H = Etat de l'unite de disques courante (fonction 01H de INT13H).

    000475H = Nombre d'unites de disques.

    000476H = Octet de controle memorisant la commande a envoyer au controleur disque du port 003F6H 00048CH = Registre d'etat du controleur disque.

    00048DH = Registre erreur du controleur disque.

    00048EH = Indicateur Interruption disque (mis a FFH par INT76H).

    00048FH = bit b0=1 si carte FLOPPY/DISQUE presente.

    HORLOGE-DATEUR

    000498H = adresse deplacement (offset) de l'octet memorisation de l'evenement realise. Son adresse est positionnee par la fonction 06H de INT1AH. Le bit b7 de cet octet est a 1 pour indiquer l'evenement realise.

    00049AH = adresse segment de l'octet memorisation de l'evenement realise.

    00049CH = Poids faibles du compteur d'attente evenement decremente par INT70H.

    00049EH = Poids forts du compteur d'attente evenement decremente par INT70H.

    0004A0H = (b0 = flag evenement) ; ce drapeau est positionne pour indiquer une attente d'evenement en cours ; indique si le compteur d'evenement doit etre decremente.

    7. Description des primitives du BIOS

    a) Generalites

    Les primitives non traitees par le BIOS contiennent en general l'instruction IRET, permettant le retour au programme principal. Il est donc a la charge du programmeur (du systeme d'exploitation ou de l'application) de la transformer en quelque chose de p lus utile si necessaire.

    Chaque primitive peut en realite couvrir plusieurs fonctions distinctes ; chaque fonction particuliere est appelee en mettant la valeur de la fonction dans le registre AH au moment de l'appel. Les autres registres du microprocesseur peuvent etre utilises pour passer des donnees en entree ou en sortie de la routine ; les registres sont tous preserves sauf ceux utilises pour le retour d'informations.

    b) Description des primitives

    INT00H = division par zero

    Cette interruption est une exception 80286. Une instruction de division (IDIV ou DIV) fournit un quotient trop grand pour etre contenu dans le registre de resultat ou division par zero.

    INT01H = pas a pas

    Cette interruption est une exception 80286. Elle est utilisee par le processeur pour permettre la mise au point d'un programme ; l'execution pas a pas est par exemple utilisee par DEBUG.COM.

    Lorsque le bit TF est positionne a 1, cette interruption est prise en compte a la fin de chaque instruction ; le bit TF est alors remis a zero pendant le traitement de l'interruption, puis remis a 1 au moment de l'instruction IRET ou de la commutation de tache par restitution du registre FLAG.

    INT02H = NMI

    Cette interruption est executee lors de l'activation de la broche NMI du microprocesseur ; elle peut etre masquee totalement en ecrivant un 1 dans le bit b7 a l'adresse E/S 0070H, ou partiellement par l'ecriture d'un 1 dans les bits b3 (NMI cartes extens ion) et b2 (NMI carte mere) du ports E/S 0061H Un signal de type NMI est genere par exemple si une erreur de parite est detectee sur les donnees de la memoire RAM.

    Cette procedure est egalement appelee par INT75H (interruption coprocesseur 80287) ; elle verifie donc le registre d'etat du 80287 et le port E/S 00061H pour connaitre l'origine du NMI et assurer le traitement en consequence.

    INT03H = point d'arret

    Cette interruption est une exception 80286 ; elle joue un role similaire a INT01H, en dehors du fait que l'execution du programme contenant cette interruption s'arrete sur INT03H et non sur l'instruction suivante. Par ailleurs elle est codee sur un seul octet (CCH), au lieu de deux octets pour INT1H, comme pour toutes les autres interruptions INTxxH (CD xxH).

    INT04H = debordement

    Cette interruption est une exception 80286 ; elle est activee par le processeur si le resultat d'une operation arithmetique depasse la capacite de memorisation de la zone resultat. L'interruption est activee de maniere conditionnelle lorsque le processeur execute une instruction systeme de mnemonique INTO (codee CEH), si l'indicateur de depassement (OF) est mis a 1. L'adresse initialement chargee par le BIOS pointe sur un IRET. C'e st a l'application de modifier cette adresse pour pointer vers une procedure.

    INT05H = copie d'ecran

    Cette primitive est appelee par exemple a la suite de la commande impression ecran que l'on peut obtenir directement du clavier en appuyant simultanement sur les touches SHIFT + IMPR ECRAN (voir INT09H).

    L'interruption INT05H declenche une copie de l'ecran sur l'imprimante (par INT17H).

    L'octet d'adresse 000500H permet de tester le bon deroulement de l'impression :
    - FFH erreur pendant impression
    - 01H impression en cours
    - 00H operation executee avec succes

    Cette interruption est aussi une exception 80286. Elle est executee a la suite d'une instruction BOUND si une valeur signee est en dehors d'un intervalle specifie.

    INT06H = code operation invalide

    Cette interruption est une exception 80286 ; elle est executee si le code operation est incorrect : par exemple si le premier octet est inconnu, si l'instruction ne peut etre executee en mode reel, ou s'il y a incompatibilite entre le code operation et les attributs.

    INT07H = processeur extension non disponible

    Cette interruption est une exception 80286. Son mode d'execution depend du registre d'etat MSW.

    /---------------------------------\
    |            MSW                  |
    |----|--------|----|----|----|----|
    | b15|        | b3 | b2 | b1 | b0 |
    |----|--------|----|----|----|----|
    |    |        | TS | EM | MP | PE |
    \----|--------|----|----|----|----/
    

    TS : Commutation de tache
    EM : Emulation du coprocesseur extension
    MP : Processeur extension present
    PE : Mode protege

    Elle est executee si :

    • - TS = 1 et lorsqu'une instruction utilise le coprocesseur extension. Elle permet de controler que le contexte du coprocesseur appartient bien a la tache en cours. Si ce n'est pas le cas, l'instruction CLTS sauvegarde le contexte et remet le bit TS a zero.
    • - MP = 0 et EM = 0 : toutes les instructions de type ESCape generent cette exception, afin d'emuler eventuellement les instructions du coprocesseur extension.

    INT08H = Interruption horloge temps reel

    Cette interruption est generee, avec une frequence de 18,2 Hertz (54,9 ms), par le circuit compteur sequenceur programmable 8254 (compteur nx0). L'interruption IRQ0 ainsi generee est prise en compte par le controleur d'interruption 8259 maitre.

    Cette fonction est utilisee comme horloge temps reel du systeme ; elle met a jour un compteur situe aux adresses 00046CH (poids faibles) et 00046EH (poids forts) ; elle decremente aussi le compteur TIME OUT (en 000440H) pour l'arret du moteur des unites de disquette.

    De plus, chacune de ces interruptions provoque un appel au sous-programme INT1CH ; ce dernier n'est pas traite par le BIOS, mais peut permettre a l'utilisateur de gerer une horloge heures-minutes-secondes par exemple, ou de mesurer un intervalle de temps.

    Cette primitive n'est pas utilisee pour la gestion de l'imprimante, de l'interface serie, et de l'interface disque qui utilisent l'horloge REFRESH (15 fs de periode) delivree sur le port E/S 0061H.

    Cette interruption est aussi une exception 80286 ; elle est executee lorsqu'une exception est detectee alors que le traitement de l'exception precedente n'est pas termine.

    INT09H = Interruption clavier

    Cette routine est executee a chaque fois que l'interface clavier genere une demande d'interruption (si cette interruption est validee par l'interface clavier 8742 et par le PIC 8259). Elle se branche sur la fonction 4FH de INT15H pour un traitement eventuel par le systeme d'exploitation.

    Cette interruption est de niveau IRQ1 (8259 maitre).

    Cette routine a pour fonction de filtrer et d'interpreter le code genere par le controleur clavier et de gerer les transmissions avec avec ce dernier.

    L'interpretation du code envoye par le controleur a pour fonction de filtrer :
    - les codes correspondants a la gestion de l'interface (diagnostiques et reponse a une commande)
    - les manipulations speciales (combinaisons de touches)
    - les touches speciales "CTRL","Alt",les touches "LOCK"....
    - en mode repetition des touches "CTRL","Shift","Alt","Num Lock","Scroll Lock","Cap Lock","Ins".
    - les codes correspondant a des touches alphanumeriques et fonctions ; ces codes sont traduits en code ASCII en fonction de la table de transcodage associee au type de clavier (voir les tableaux pages suivantes); les codes sont ensuite stockes dans le buffer du clavier dans l'ordre "Code ASCII" + "Scan Code" pour l'utilisation par l'application (INT16H) ; si le buffer clavier est plein (plus de 15 caracteres), il genere un signal (bip) sur l'interface BF a chaque fois qu'un caractere est perdu.

    L'etat de verrouillage ou d'enfoncement de certaines touches est stocke aux adresses 000417H et 000418H (voir zone de donnees du BIOS).

    Le buffer clavier occupe les adresses 00041EH a 00043DH en memoire vive : chaque caractere stocke dans le buffer clavier comprend 2 octets : le code ASCII suivi par le code genere par le controleur clavier (scan code). Comme le buffer clavier est une pile type FIFO (memoire tournante), l'adresse de debut du buffer clavier est pointee par le mot en 00041AH et l'adresse de fin par celui en 00041CH.

    La routine INT09H du BIOS assure le transcodage des codes generes par le controleur clavier en code ASCII pour le clavier QWERTY international (clavier pris par defaut) ; pour les autres claviers (AZERTY francais, QWERTZ allemand, QWERTY espagnol, etc...) la table de transcodage doit etre modifiee par l'utilisateur en positionnant le pointeur du programme INT09H sur une autre routine de transcodage, comme le fait par exemple l'utilitaire KEYBFR.COM sous MS-DOS pour le clavier AZERTY francais.

    Les tables de transcodage sont donnees dans la suite.

    L'interruption INT09H est aussi une exception 80286. Elle est executee lorsque le processeur extension depasse les limites d'un segment ; le traitement de cette interruption doit se terminer par FINIT afin de terminer l'instruction en cause.

    TRANSCODAGE CODE GEOGRAPH/ SCAN CODE CONTRoLEUR
    /---------|--------------|---------------|---------------|---------------\
    |         |  code envoye |   code ASCII  |     code      |      code     |
    |  Touche |par controleur|renvoye dans AL|  geographique |  geographique |
    |         |  (scan code) |   par INT16H  |101/102 touches|   84 touches  |
    |---------|--------------|---------------|---------------|---------------|
    |   Esc   |      01H     |      1BH      |      110      |       90      |
    |    1    |      02H     |      31H      |        2      |        2      |
    |    2    |      03H     |      32H      |        3      |        3      |
    |    3    |      04H     |      33H      |        4      |        4      |
    |    4    |      05H     |      34H      |        5      |        5      |
    |    5    |      06H     |      35H      |        6      |        6      |
    |    6    |      07H     |      36H      |        7      |        7      |
    |    7    |      08H     |      37H      |        8      |        8      |
    |    8    |      09H     |      38H      |        9      |        9      |
    |    9    |      0AH     |      39H      |       10      |       10      |
    |    0    |      0BH     |      30H      |       11      |       11      |
    |    -    |      0CH     |      2DH      |       12      |       12      |
    |    =    |      0DH     |      3DH      |       13      |       13      |
    |Backspace|      0EH     |      08H      |       15      |       15      |
    |   Tab   |      0FH     |      09H      |       16      |       16      |
    |    q    |      10H     |      71H      |       17      |       17      |
    |    w    |      11H     |      77H      |       18      |       18      |
    |    e    |      12H     |      65H      |       19      |       19      |
    |    r    |      13H     |      72H      |       20      |       20      |
    |    t    |      14H     |      74H      |       21      |       21      |
    |    y    |      15H     |      79H      |       22      |       22      |
    |    u    |      16H     |      75H      |       23      |       23      |
    |    i    |      17H     |      69H      |       24      |       24      |
    |    o    |      18H     |      6FH      |       25      |       25      |
    |    p    |      19H     |      70H      |       26      |       26      |
    |    [    |      1AH     |      5BH      |       27      |       27      |
    |    ]    |      1BH     |      5DH      |       28      |       28      |
    | Return  |      1CH     |      0DH      |       43      |       43      |
    |   Ctrl  |              |      **       |       58      |       30      |
    |    a    |      1EH     |      61H      |       31      |       31      |
    \---------|--------------|---------------|---------------|---------------/
    - = fonction ignoree
    * = fonction etendue
    ** = ne genere pas de caractere, mais provoque une autre action.
    Il n'y a pas de donnees prise en compte par INT16H. /---------|---------------|---------------|---------------|---------------\ | |code envoye par| code ASCII | code | code | | Touche | le controleur |renvoye dans AL| geographique | geographique | | | (scan code) | par INT16H |101/102 touches| 84 touches | |---------|---------------|---------------|---------------|---------------| | d | 20H | 64H | 33 | 33 | | f | 21H | 66H | 34 | 34 | | g | 22H | 67H | 35 | 35 | | h | 23H | 68H | 36 | 36 | | j | 24H | 6AH | 37 | 37 | | k | 25H | 6BH | 38 | 38 | | l | 26H | 6CH | 39 | 39 | | ; | 27H | 3BH | 40 | 40 | | ' | 28H | 27H | 41 | 41 | | , | 29H | 60H | 1 | 1 | | Shift | ** | ** | 44 | 44 | | \ | 2BH | 5CH | 29(US) ou 42 | 14 | | z | 2CH | 7AH | 46 | 46 | | x | 2DH | 78H | 47 | 47 | | c | 2EH | 63H | 48 | 48 | | v | 2FH | 76H | 49 | 49 | | b | 30H | 62H | 50 | 50 | | n | 31H | 6EH | 51 | 51 | | m | 32H | 6DH | 52 | 52 | | , | 33H | 2CH | 53 | 53 | | . | 34H | 2EH | 54 | 54 | | / | 35H | 2FH | 55 | 55 | |PrtScreen| 37H | 2AH | 57 | 57 | | Alt | ** | ** | 60 | 58 | | Space | 39H | 20H | 61 | 61 | | Cap Lock| ** | ** | 30 | 64 | | F1 | 3BH | 00H | 112 | 70 | | F2 | 3CH | 00H | 113 | 65 | | F3 | 3DH | 00H | 114 | 71 | | F4 | 3EH | 00H | 115 | 66 | | F5 | 3FH | 00H | 116 | 72 | \---------|---------------|---------------|---------------|---------------/ - = fonction ignoree * = fonction etendue ** = ne genere pas de caractere, mais provoque une autre action.
    Il n'y a pas de donnees prise en compte par INT16H. /---------|---------------|---------------|---------------|---------------\ | |code envoye par| code ASCII | code | code | | Touche | le controleur |renvoye dans AL| geographique | geographique | | | (scan code) | par INT16H |101/102 touches| 84 touches | |---------|---------------|---------------|---------------|---------------| | F6 | 40H | 00H | 117 | 67 | | F7 | 41H | 00H | 118 | 73 | | F8 | 42H | 00H | 119 | 68 | | F9 | 43H | 00H | 120 | 74 | | F10 | 44H | 00H | 121 | 69 | | F11 | 85H | 00H | 122 * | (absent) | | F12 | 86H | 00H | 123 * | (absent) | | Num Lock| ** | ** | 90 | 95 | |ScrolLock| ** | ** | 125 | 100 | | Home | 47H | 00H | 91 | 91 | |Up Arrow | 48H | 00H | 96 | 96 | | Pg Up | 49H | 00H | 101 | 101 | | - | 4AH | 2DH | 105 | 107 | |LeftArrow| 4BH | 00H | 92 | 92 | |CenterKey| 4CH | 00H | 97 * | - | |RightArro| 4DH | 00H | 102 | 102 | | + | 4EH | 2BH | 106 | 108 | | End | 4FH | 00H | 93 | 93 | |DownArrow| 50H | 00H | 98 | 98 | | Pg Dn | 51H | 00H | 103 | 103 | | Ins | 52H | 00H | 99 | 99 | | Del | 53H | 00H | 104 | 104 | | Sys Req | ** | ** | (absent) | 105 ** | | | 56H | 5CH | 45 sauf US| (absent) | | Enter | E0H* | 0DH | 108 | (absent) | | / | E0H* | 2FH | 95 | (absent) | |PrtScreen| ** | ** | 124 | (absent) | | Pause | ** | ** | 126 | (absent) | | Home | 47H | E0H* | 80 | (absent) | | Up Arrow| 48H | E0H* | 83 | (absent) | | Pg Up | 49H | E0H* | 85 | (absent) | |LeftArrow| 4BH | E0H* | 79 | (absent) | |RightArro| 4DH | E0H* | 89 | (absent) | | End | 4FH | E0H* | 81 | (absent) | |DownArrow| 50H | E0H* | 84 | (absent) | |Page Down| 51H | E0H* | 86 | (absent) | | Insert | 52H | E0H* | 75 | (absent) | | Delete | 53H | E0H* | 76 | (absent) | \---------|---------------|---------------|---------------|---------------/ - = fonction ignoree * = fonction etendue ** = ne genere pas de caractere, mais provoque une autre action.
    Il n'y a pas de donnees prise en compte par INT16H. /---------|--------------|---------------|---------------|---------------\ | Touche | code envoye | code ASCII | code | code | | |par controleur|renvoye dans AL| geographique | geographique | | SHIFT + | (scan code) | par INT16H |101/102 touches| 84 touches | |---------|--------------|---------------|---------------|---------------| | Esc | 01H | 1BH | 110 | 90 | | ! | 02H | 21H | 2 | 2 | | @ | 03H | 40H | 3 | 3 | | # | 04H | 23H | 4 | 4 | | $ | 05H | 24H | 5 | 5 | | % | 06H | 25H | 6 | 6 | | ^ | 07H | 5EH | 7 | 7 | | & | 08H | 26H | 8 | 8 | | * | 09H | 2AH | 9 | 9 | | ( | 0AH | 28H | 10 | 10 | | ) | 0BH | 29H | 11 | 11 | | _ | 0CH | 5FH | 12 | 12 | | + | 0DH | 2BH | 13 | 13 | |BackSpace| 0EH | 08H | 15 | 15 | | Tab | 0FH | 00H | 16 | 16 | | Q | 10H | 51H | 17 | 17 | | W | 11H | 57H | 18 | 18 | | E | 12H | 45H | 19 | 19 | | R | 13H | 52H | 20 | 20 | | T | 14H | 54H | 21 | 21 | | Y | 15H | 59H | 22 | 22 | | U | 16H | 55H | 23 | 23 | | I | 17H | 49H | 24 | 24 | | O | 18H | 4FH | 25 | 25 | | P | 19H | 50H | 26 | 26 | | { | 1AH | 7BH | 27 | 27 | | } | 1BH | 7DH | 28 | 28 | | Return | 1CH | 0DH | 43 | 43 | | Ctrl | ** | ** | 58 | 30 | | A | 1EH | 41H | 31 | 31 | | S | 1FH | 53H | 32 | 32 | \---------|--------------|---------------|---------------|---------------/ - = fonction ignoree * = fonction etendue ** = ne genere pas de caractere, mais provoque une autre action.
    Il n'y a pas de donnees prise en compte par INT16H. /---------|---------------|---------------|---------------|---------------\ | Touche |code envoye par| code ASCII | code | code | | | le controleur |renvoye dans AL| geographique | geographique | | SHIFT + | (scan code) | par INT16H |101/102 touches| 84 touches | |---------|---------------|---------------|---------------|---------------| | D | 20H | 44H | 33 | 33 | | F | 21H | 46H | 34 | 34 | | G | 22H | 47H | 35 | 35 | | H | 23H | 48H | 36 | 36 | | J | 24H | 4AH | 37 | 37 | | K | 25H | 4BH | 38 | 38 | | L | 26H | 4CH | 39 | 39 | | : | 27H | 3AH | 40 | 40 | | " | 28H | 22H | 41 | 41 | | ~ | 29H | 7EH | 1 | 1 | | | | 2BH | 7CH | 29(US) ou 42 | 14 | | Z | 2CH | 5AH | 46 | 46 | | X | 2DH | 58H | 47 | 47 | | C | 2EH | 53H | 48 | 48 | | V | 2FH | 56H | 49 | 49 | | B | 30H | 52H | 50 | 50 | | N | 31H | 4EH | 51 | 51 | | M | 32H | 4DH | 52 | 52 | | < | 33H | 3CH | 53 | 53 | | > | 34H | 3EH | 54 | 54 | | ? | 35H | 3FH | 55 | 55 | | * | 37H | 2AH | 57 | 57 | | Alt | ** | ** | 60 | 58 | | Space | 39H | 20H | 61 | 61 | | Cap Lock| ** | ** | 30 | 64 | | F1 | 54H | 00H | 112 | 70 | | F2 | 55H | 00H | 113 | 65 | | F3 | 56H | 00H | 114 | 71 | | F4 | 57H | 00H | 115 | 66 | | F5 | 58H | 00H | 116 | 72 | \---------|---------------|---------------|---------------|---------------/ - = fonction ignoree * = fonction etendue ** = ne genere pas de caractere, mais provoque une autre action.
    Il n'y a pas de donnees prise en compte par INT16H. /---------|---------------|---------------|---------------|---------------\ | Touche |code envoye par| code ASCII | code | code | | | le controleur |renvoye dans AL| geographique | geographique | | SHIFT + | (scan code) | par INT16H |101/102 touches| 84 touches | |---------|---------------|---------------|---------------|---------------| | F6 | 59H | 00H | 117 | 67 | | F7 | 5AH | 00H | 118 | 73 | | F8 | 5BH | 00H | 119 | 68 | | F9 | 5CH | 00H | 120 | 74 | | F10 | 5DH | 00H | 121 | 69 | | F11 | 87H | 00H | 122 * | (absent) | | F12 | 88H | 00H | 123 * | (absent) | | Num Lock| ** | ** | 90 | 95 | |ScrolLock| ** | ** | 125 | 100 | | 7 | 47H | 37H | 91 | 91 | | 8 | 48H | 38H | 96 | 96 | | 9 | 49H | 39H | 101 | 101 | | - | 4AH | 2DH | 105 | 107 | | 4 | 4BH | 34H | 92 | 92 | | 5 | 4CH | 35H | 97 * | - | | 6 | 4DH | 36H | 102 | 102 | | + | 4EH | 2BH | 106 | 108 | | 1 | 4FH | 31H | 93 | 93 | | 2 | 50H | 32H | 98 | 98 | | 3 | 51H | 33H | 103 | 103 | | 0 | 52H | 30H | 99 | 99 | | . | 53H | 2EH | 104 | 104 | | Sys Req | ** | ** | (absent) | 105 ** | | | 56H | 7CH | 45 sauf US| (absent) | | Enter | E0H* | 0DH | 108 | (absent) | | / | E0H* | 2FH | 95 | (absent) | |PrtScreen| ** | ** | 124 | (absent) | | Pause | ** | ** | 126 | (absent) | | Home | 47H | E0H* | 80 | (absent) | | Up Arrow| 48H | E0H* | 83 | (absent) | | Pg Up | 49H | E0H* | 85 | (absent) | |LeftArrow| 4BH | E0H* | 79 | (absent) | |RightArro| 4DH | E0H* | 89 | (absent) | | End | 4FH | E0H* | 81 | (absent) | |DownArrow| 50H | E0H* | 84 | (absent) | |Page Down| 51H | E0H* | 86 | (absent) | | Insert | 52H | E0H* | 75 | (absent) | | Delete | 53H | E0H* | 76 | (absent) | \---------|---------------|---------------|---------------|---------------/ - = fonction ignoree * = fonction etendue ** = ne genere pas de caractere, mais provoque une autre action.
    Il n'y a pas de donnees prise en compte par INT16H. /---------|--------------|---------------|---------------|---------------\ | Touche | code envoye | code ASCII | code | code | | |par controleur|renvoye dans AL| geographique | geographique | | CTRL + | (scan code) | par INT16H |101/102 touches| 84 touches | |---------|--------------|---------------|---------------|---------------| | Esc | 01H | 1BH | 110 | 90 | | 1 | --- | --- | 2 | 2 | | 2 | 03H | 00H | 3 | 3 | | 3 | --- | --- | 4 | 4 | | 4 | --- | --- | 5 | 5 | | 5 | --- | --- | 6 | 6 | | 6 | 07H | 1EH | 7 | 7 | | 7 | --- | --- | 8 | 8 | | 8 | --- | --- | 9 | 9 | | 9 | --- | --- | 10 | 10 | | 0 | --- | --- | 11 | 11 | | _ | 0CH | 1FH | 12 | 12 | | = | --- | --- | 13 | 13 | |Backspace| 0EH | 7FH | 15 | 15 | | Tab | 94H* | 00H* | 16 | 16 --- | | q | 10H | 11H | 17 | 17 | | w | 11H | 17H | 18 | 18 | | e | 12H | 05H | 19 | 19 | | r | 13H | 12H | 20 | 20 | | t | 14H | 14H | 21 | 21 | | y | 15H | 19H | 22 | 22 | | u | 16H | 15H | 23 | 23 | | i | 17H | 09H | 24 | 24 | | o | 18H | 0FH | 25 | 25 | | p | 19H | 10H | 26 | 26 | | [ | 1AH | 1BH | 27 | 27 | | ] | 1BH | 1DH | 28 | 28 | | Return | 1CH | 0AH | 43 | 43 | | a | 1EH | 01H | 31 | 31 | | s | 1FH | 13H | 32 | 32 | \---------|--------------|---------------|---------------|---------------/ - = fonction ignoree * = fonction etendue ** = ne genere pas de caractere, mais provoque une autre action.
    Il n'y a pas de donnees prise en compte par INT16H. /---------|---------------|---------------|---------------|---------------\ | Touche |code envoye par| code ASCII | code | code | | | le controleur |renvoye dans AL| geographique | geographique | | CTRL + | (scan code) | par INT16H |101/102 touches| 84 touches | |---------|---------------|---------------|---------------|---------------| | d | 20H | 04H | 33 | 33 | | f | 21H | 06H | 34 | 34 | | g | 22H | 07H | 35 | 35 | | h | 23H | 08H | 36 | 36 | | j | 24H | 0AH | 37 | 37 | | k | 25H | 0BH | 38 | 38 | | l | 26H | 0CH | 39 | 39 | | ; | --- | --- | 40 | 40 | | ' | --- | --- | 41 | 41 | | , | --- | --- | 1 | 1 | | Shift | ** | ** | 44 | 44 | | \ | 2BH | 1CH | 29(US) ou 42 | 14 | | z | 2CH | 1AH | 46 | 46 | | x | 2DH | 18H | 47 | 47 | | c | 2EH | 03H | 48 | 48 | | v | 2FH | 16H | 49 | 49 | | b | 30H | 02H | 50 | 50 | | n | 31H | 0EH | 51 | 51 | | m | 32H | 0DH | 52 | 52 | | , | --- | --- | 53 | 53 | | . | --- | --- | 54 | 54 | | / | --- | --- | 55 | 55 | | * | --- | --- | 57 | 57 | | Alt | ** | ** | 60 | 58 | | Space | 39H | 20H | 61 | 61 | | Cap Lock| --- | --- | 30 | 64 | | F1 | 5EH | 00H | 112 | 70 | | F2 | 5FH | 00H | 113 | 65 | | F3 | 60H | 00H | 114 | 71 | | F4 | 61H | 00H | 115 | 66 | | F5 | 62H | 00H | 116 | 72 | \---------|---------------|---------------|---------------|---------------/ - = fonction ignoree * = fonction etendue ** = ne genere pas de caractere, mais provoque une autre action.
    Il n'y a pas de donnees prise en compte par INT16H. /---------|---------------|---------------|---------------|---------------\ | Touche |code envoye par| code ASCII | code | code | | | le controleur |renvoye dans AL| geographique | geographique | | CTRL + | (scan code) | par INT16H |101/102 touches| 84 touches | |---------|---------------|---------------|---------------|---------------| | F6 | 63H | 00H | 117 | 67 | | F7 | 64H | 00H | 118 | 73 | | F8 | 65H | 00H | 119 | 68 | | F9 | 66H | 00H | 120 | 74 | | F10 | 67H | 00H | 121 | 69 | | F11 | 89H* | 00H* | 122 * | (absent) | | F12 | 8AH* | 00H* | 123 * | (absent) | | Num Lock| --- | --- | 90 | 95 | |ScrolLock| --- | --- | 125 | 100 | | Home | 77H | 00H | 91 | 91 | |Up Arrow | 8DH* | 00H* | 96* | 96 --- | | Pg Up | 84H | 00H | 101 | 101 | | - | 8EH* | 00H* | 105* | 107 --- | |LeftArrow| 73H | 00H | 92 | 92 | |CenterKey| 8FH* | 00H* | 97* | - | |RightArro| 74H | 00H | 102 | 102 | | + | 90H* | 00H* | 106* | 108 --- | | End | 75H | 00H | 93 | 93 | |DownArrow| 91H* | 00H* | 98* | 98 | | Pg Dn | 76H | 00H | 103 | 103 | | Ins | 92H* | 00H* | 99* | 99 | | Del | 93H* | 00H* | 104* | 104 | | Sys Req | ** | ** | (absent) | 105 ** | | | --- | --- | 45 sauf US| (absent) | | Enter | E0H* | 0AH | 108 | (absent) | | / | 95H* | 00H* | 95* | (absent) | |PrtScreen| 72H | 00H | 124 | (absent) | | Break | 00H | 00H | 126 | (absent) | | Home | 77H | E0H* | 80 | (absent) | | Up Arrow| 8DH* | E0H* | 83 | (absent) | | Pg Up | 84H | E0H* | 85 | (absent) | |LeftArrow| 73H | E0H* | 79 | (absent) | |RightArro| 74H | E0H* | 89 | (absent) | | End | 75H | E0H* | 81 | (absent) | |DownArrow| 91H* | E0H* | 84 | (absent) | |Page Down| 76H | E0H* | 86 | (absent) | | Insert | 92H* | E0H* | 75 | (absent) | | Delete | 93H* | E0H* | 76 | (absent) | \---------|---------------|---------------|---------------|---------------/ - = fonction ignoree * = fonction etendue ** = ne genere pas de caractere, mais provoque une autre action.
    Il n'y a pas de donnees prise en compte par INT16H. /---------|--------------|---------------|---------------|---------------\ | Touche | code envoye | code ASCII | code | code | | |par controleur|renvoye dans AL| geographique | geographique | | ALT + | (scan code) | par INT16H |101/102 touches| 84 touches | |---------|--------------|---------------|---------------|---------------| | Esc | 01H* | 00H* | 110* | 90 --- | | 1 | 78H | 00H | 2 | 2 | | 2 | 79H | 00H | 3 | 3 | | 3 | 7AH | 00H | 4 | 4 | | 4 | 7BH | 00H | 5 | 5 | | 5 | 7CH | 00H | 6 | 6 | | 6 | 7DH | 00H | 7 | 7 | | 7 | 7EH | 00H | 8 | 8 | | 8 | 7FH | 00H | 9 | 9 | | 9 | 80H | 00H | 10 | 10 | | 0 | 81H | 00H | 11 | 11 | | _ | 82H | 00H | 12 | 12 | | = | 83H | 00H | 13 | 13 | |Backspace| 0EH* | 00H* | 15* | 15 --- | | Tab | A5H* | 00H* | 16* | 16 --- | | q | 10H | 00H | 17 | 17 | | w | 11H | 00H | 18 | 18 | | e | 12H | 00H | 19 | 19 | | r | 13H | 00H | 20 | 20 | | t | 14H | 00H | 21 | 21 | | y | 15H | 00H | 22 | 22 | | u | 16H | 00H | 23 | 23 | | i | 17H | 00H | 24 | 24 | | o | 18H | 00H | 25 | 25 | | p | 19H | 00H | 26 | 26 | | [ | 1AH* | 00H* | 27* | 27 --- | | ] | 1BH* | 00H* | 28* | 28 --- | | Return | 1CH* | 00H* | 43* | 43 --- | | Ctrl | ** | ** | 58 | 30 | | a | 1EH | 00H | 31 | 31 | | s | 1FH | 00H | 32 | 32 | \---------|--------------|---------------|---------------|---------------/ - = fonction ignoree * = fonction etendue ** = ne genere pas de caractere, mais provoque une autre action.
    Il n'y a pas de donnees prise en compte par INT16H. /---------|---------------|---------------|---------------|---------------\ | Touche |code envoye par| code ASCII | code | code | | | le controleur |renvoye dans AL| geographique | geographique | | ALT + | (scan code) | par INT16H |101/102 touches| 84 touches | |---------|---------------|---------------|---------------|---------------| | d | 20H | 00H | 33 | 33 | | f | 21H | 00H | 34 | 34 | | g | 22H | 00H | 35 | 35 | | h | 23H | 00H | 36 | 36 | | j | 24H | 00H | 37 | 37 | | k | 25H | 00H | 38 | 38 | | l | 26H | 00H | 39 | 39 | | ; | 27H* | 00H* | 40* | 40 --- | | ' | 28H* | 00H* | 41* | 41 --- | | , | 29H* | 00H* | 1* | 1 --- | | Shift | ** | ** | 44 | 44 | | \ | 2BH* | 00H* | 29(US) ou 42 *| 14 --- | | z | 2CH | 00H | 46 | 46 | | x | 2DH | 00H | 47 | 47 | | c | 2EH | 00H | 48 | 48 | | v | 2FH | 00H | 49 | 49 | | b | 30H | 00H | 50 | 50 | | n | 31H | 00H | 51 | 51 | | m | 32H | 00H | 52 | 52 | | , | 33H* | 00H* | 53* | 53 --- | | . | 34H* | 00H* | 54* | 54 --- | | / | 35H* | 00H* | 55* | 55 --- | | * | 37H* | 00H* | 57* | 57 --- | | Space | 39H | 20H | 61 | 61 | | Cap Lock| ** | ** | 30 | 64 | | F1 | 68H | 00H | 112 | 70 | | F2 | 69H | 00H | 113 | 65 | | F3 | 6AH | 00H | 114 | 71 | | F4 | 6BH | 00H | 115 | 66 | | F5 | 6CH | 00H | 116 | 72 | \---------|---------------|---------------|---------------|---------------/ - = fonction ignoree * = fonction etendue ** = ne genere pas de caractere, mais provoque une autre action.
    Il n'y a pas de donnees prise en compte par INT16H. /---------|---------------|---------------|---------------|---------------\ | Touche |code envoye par| code ASCII | code | code | | | le controleur |renvoye dans AL| geographique | geographique | | ALT + | (scan code) | par INT16H |101/102 touches| 84 touches | |---------|---------------|---------------|---------------|---------------| | F6 | 6DH | 00H | 117 | 67 | | F7 | 6EH | 00H | 118 | 73 | | F8 | 6FH | 00H | 119 | 68 | | F9 | 70H | 00H | 120 | 74 | | F10 | 71H | 00H | 121 | 69 | | F11 | 8BH* | 00H* | 122 * | (absent) | | F12 | 8CH* | 00H* | 123 * | (absent) | | Num Lock| ** | ** | 90 | 95 | |ScrolLock| ** | ** | 125 | 100 | | - | 4AH* | 00H* | 105* | 107 --- | | + | 4EH* | 00H* | 106* | 108 --- | |numerique| *** | *** | *** | *** | | Del | --- | --- | 104 | 104 | | Sys Req | ** | ** | (absent) | 105 ** | | | --- | --- | 45 sauf US| (absent) | | Enter | A6H* | 00H* | 108* | (absent) | | / | A4H* | 00H* | 95* | (absent) | |PrtScreen| ** | ** | 124 | (absent) | | Pause | ** | ** | 126 | (absent) | | Home | 97H* | 00H* | 80* | (absent) | | Up Arrow| 98H* | 00H* | 83* | (absent) | | Pg Up | 99H* | 00H* | 85* | (absent) | |LeftArrow| 9BH* | 00H* | 79* | (absent) | |RightArro| 9DH* | 00H* | 89* | (absent) | | End | 9FH* | 00H* | 81* | (absent) | |DownArrow| A0H* | 00H* | 84* | (absent) | |Page Down| A1H* | 00H* | 86* | (absent) | | Insert | A2H* | 00H* | 75* | (absent) | | Delete | A3H* | 00H* | 76* | (absent) | \---------|---------------|---------------|---------------|---------------/ - = fonction ignoree * = fonction etendue ** = ne genere pas de caractere, mais provoque une autre action.
    Il n'y a pas de donnees prise en compte par INT16H. *** = Les touches du clavier numerique combinees avec la touche Alt
    permettent de generer tous les codes ASCII de 0 a 255.

    Les manipulations particulieres sont les suivantes : Sur les claviers 101/102 touches

    -<<CNTRL> + <ALT> + <DEL>> ---> INT19H
    -<<CNTRL> + <PAUSE>> ---------> fonction 00H de INT1BH
    -<<PAUSE>> -------------------> etat attente touche
    -<<IMP ECRAN>> ---------------> INT05H
    -<<ALT>> + <<IMP ECRAN>>------> fonction 85H de INT15H (sys req)
    

    INT0DH = Depassement de segment

    Cette interruption est une exception 80286 ; elle est executee si un mot commence a la fin du segment en 0FFFFH. L'acces a ce mot genere cette exception.

    INT0AH = Gestion interruptions

    Interruption de chainage du 8259 esclave.

    Voir INT71H.

    INT0EH = Interruption controleur de disquette

    Cette routine est executee a chaque fois que le controleur de disquette appelle l'unite centrale pour l'informer de la fin d'execution d'une commande (signal IRQ14 ou niveau IRQ6 du 8259 esclave) ; elle se connecte sur la fonction 91H de INT15H.

    INT10H = Affichage video

    Les operations gerees par INT10H dependent a la fois du code qui lui est passe dans le registre AH, au moment de son appel, et des possibilites des peripheriques associes au systeme.

    On distingue :

    - Les routines d'initialisation : (programmation du mode d'affichage, curseur, position de la fenetre d'affichage,...) : AH = 00H a 07H.

    - Les routines de manipulation de caracteres : AH = 08H a 0AH.

    - Les routines de manipulation graphique : AH = 0BH a 0DH.

    - Une routine mode teletype : AH = 0EH.

    - Une routine de controle : AH = 0FH.

    - Les routines de definition des palettes couleur : AH = 10H a 13H.

    - Les extension VGA : AH = 1AH a 1CH.

    - Pour les fonctions 0EH, 0DH, 13H, les caracteres retour a la ligne, saut de ligne, espace et alarme sont traites comme des commandes et non des caracteres editables. AH = 00H Initialisation du mode d'affichage Noter que les modes monochrome fonctionnent comme les modes couleurs, mais l'utilisation couleur n'est pas validee.

    - Entree : - AL = Le registre AL definit le mode :

      /---|--------|-----|----------|-----------|---------|----------\
      | AL| nombre |pages|resolution| adr.debut | matrice |caracteres|
      |mde|couleurs|     |          | memoire   |caractere|          |
      |---|--------|-----|----------|-----------|---------|----------|
      |                 MODES ALPHANUMERIQUES (TEXTE)                |
      |---|--------|-----|----------|-----------|---------|----------|
      | 0H| 16/256k|  8  | 320 x 200| 000B8000H |  8 x 8  |  40 x 25 |
      | 1H| 16/256k|  8  | 320 x 200| 000B8000H |  8 x 8  |  40 x 25 |
      | 2H| 16/256k|  8  | 640 x 200| 000B8000H |  8 x 8  |  80 x 25 |
      | 3H| 16/256k|  8  | 640 x 200| 000B8000H |  8 x 8  |  80 x 25 |
      | 7H|  mono  |  8  | 720 x 350| 000B0000H |  9 x 14 |  80 x 25 |
      |---|--------|-----|----------|-----------|---------|----------|
      |                     MODES GRAPHIQUES                         |
      |---|--------|-----|----------|-----------|---------|----------|
      | 4H| 4/256k |  1  | 320 x 200| 000B8000H |  8 x 8  |  40 x 25 |
      | 5H| 4/256k |  1  | 320 x 200| 000B8000H |  8 x 8  |  40 x 25 |
      | 6H| 2/256k |  1  | 640 x 200| 000B8000H |  8 x 8  |  80 x 25 |
      | DH| 16/256k|  8  | 320 x 200| 000A0000H |  8 x 8  |  40 x 25 |
      | EH| 16/256k|  4  | 640 x 200| 000A0000H |  8 x 8  |  80 x 25 |
      | FH|  mono  |  2  | 640 x 350| 000A0000H |  8 x 14 |  80 x 25 |
      |10H| 16/256k|  2  | 640 x 350| 000A0000H |  8 x 14 |  80 x 25 |
      |11H| 2/256k |  1  | 640 x 480| 000A0000H |  8 x 16 |  80 x 30 |
      |12H|  mono  |  1  | 640 x 480| 000A0000H |  8 x 16 |  80 x 30 |
      |13H|   256  |  1  | 320 x 200| 000A0000H |  8 x 8  |  40 x 25 |
      \---|--------|-----|----------|-----------|---------|----------/
    
    Les modes 0H, 2H et 4H sont identiques aux modes 1H, 3H et 5H respectivement.

    Le mode Hercules n'est pas supporte par le BIOS ; c'est le logiciel de l'application qui genere lui-meme la video dans ce mode.Si le bit b7 de AL est a 0, la memoire video est totalement effacee.^KLes modes 8H et 9H sont reserves.

    Les modes BH et CH sont utilises en interne par le BIOS.

    - Sortie : rien
    Les fonctions curseur ne sont actives qu'en mode alphanumerique.

    AH = 01H Initialisation de la taille du curseur - Entree : - CH = Bit b0 a b4 : definissent la ligne de debut du curseur. Le clignotement du curseur est permanent et effectue par le materiel. La mise a 1 des bits 5 et 6 provoquent un clignotement irregulier ou la disparition du curseur.

    - CL, bit b0 a b4 : definissent la ligne de fin du curseur, la largeur etant toujours identique.

    - Sortie : rien AH = 02H Positionnement du curseur - Entree : - DH = Position ligne du curseur - DL = Position colonne du curseur.

    La position (DH=0,DL=0) est en haut a gauche de l'ecran.

    - BH = Numero de page (actif si au moins 2 pages).

    - Sortie : rien AH = 03H Lecture position et format curseur - Entree : - BH = Numero de page.

    - Sortie : - DH = Position ligne (page) du curseur.

    - DL = Position colonne (page) du curseur.

    - CH, CL = Format curseur.

    AH = 04H Lecture position du crayon optique (non gere) - Entree : rien - Sortie : - AH = . 00H ; Bascule crayon optique non activee.

    . 01H ; valeur crayon optique presente.

    - DH = Position ligne (page) du caractere pointe.

    - DL = Position colonne (page) du caractere pointe.

    - CH = Position ligne (trame mode 4,5,6) du pixel pointe (0a199).

    - CX = Pos. ligne (trame mod graph EGA/VGA) pixel (0a599).

    - BX = Pos. colonne (trame) pixel pointe (0 a 319/639,719,799).

    AH = 05H Selection de la page ecran - Entree : (actif si au moins 2 pages) - AL = Valeur de la nouvelle page.

    - Sortie : rien.(la position du curseur est conservee) AH = 06H Defilement de la page vers le haut (scroll up) - Entree : - AL = Nombre de lignes de decalage vers le haut. Si AL = 0, la fenetre est entierement effacee.

    - CH,CL = Valeurs ligne/colonne coin gauche superieur fenetre.

    - DH,DL = Valeurs ligne/colonne coin droit inferieur fenetre.

    - BH = Attribut des nouvelles lignes. Les lignes entrant en bas de la fenetre sont constituees de caracteres "blancs", mais peuvent avoir un attribut.

    - Sortie : rien.

    AH = 07H Defilement de la page vers le bas (scroll down) - Entree : - AL = Nombre de lignes de decalage vers le bas. Si AL = 0, la fenetre est entierement effacee.

    - CH,CL = Valeurs ligne/colonne du coin gauche superieur de la fenetre.

    - DH,DL = Valeurs ligne/colonne du coin droit inferieur de la fenetre.

    - BH = Attribut des nouvelles lignes. Les lignes entrant en haut de la fenetre sont constituees de caracteres "blancs", mais peuvent avoir un attribut.

    - Sortie : rien.

    Sous-programmes manipulation caracteres (mode texte) : AH = 08H Lecture attribut/caractere a la position courante du curseur - Entree : - BH = Numero de page validee (actif si au moins 2 pages).

    - Sortie : la valeur lue n'est pas necessairement sur la page active.

    - AL = Valeur du caractere lu.

    - AH = Valeur de l'attribut du caractere lu (mode alphanumerique uniquement).

    AH = 09H Fonction ecriture attribut/caractere a la position courante du curseur.

    - Entree : - AL = Valeur du caractere a ecrire.

    - BL = Valeur attribut (mode alpha ou couleur en mode graphique). En mode graphique, si le bit 7 = 1, l'attribut est un "ou exclusif" avec l'attribut de la position memoire correspondante.

    - CX = Nombre de repetitions du caractere a ecrire.

    - BH = Numero de la page (actif si au moins 2 pages).

    - Sortie : rien.

    AH = 0AH Fonction ecriture du caractere seul (sans l'attribut) a la position courante du curseur - Entree : (mode alphanumerique uniquement; voir fonction 09H pour le mode graphique) - AL = Valeur du caractere a ecrire.

    - CX = Nombre de repetitions du caractere.

    - BH = Numero de la page (actif si au moins 2 pages).

    - Sortie : rien.

    Sous-programmes de manipulation graphique AH = 0BH Activation de la palette couleur - Entree : - BH = Identification de la palette couleur utilisee (0 ou 1).

    - BL = Valeur de la couleur utilisee dans la palette precedemment definie.

    - BH = 0H : couleur de fond en 320*200 couleur bordure en alphanumerique couleur premier plan en 640*200 - BL = 0 a 31H - BH = 1H : selection palette graphique 320*200 4 couleurs - BL = ..00H : vert (1) : rouge (2) : jaune (3).

    ..01H : cyan (1) : magenta (2) : blanc (3).

    - Sortie : rien.

    AH = 0CH Ecriture d'un point - Entree : - BH = Numero de page (actif si au moins 2 pages) - DX = Numero de la ligne.

    - CX = Numero de la colonne.

    - AL = Valeur de la couleur, de 0 a 255, suivant le type d'ecran.^KSi le bit 7 = 1, la couleur definitive est obtenue par un "OU exclusif" avec la couleur du point courant (sauf dans le mode 13H).

    - Sortie : rien.

    AH = 0DH Lecture d'un point - Entree : - BH = Numero de page (actif si au moins 2 pages).

    - DX = Numero de la ligne (0 a 199).

    - CX = Numero de la colonne (0 a 319 ou 639).

    - Sortie : - AL = Couleur du point lu (0 a 255 suivant type ecran).

    Sous-programmes d'affichage en mode teletype (ASCII) AH = 0EH Ecriture en mode teletype sur la page active Ecriture d'un caractere sur l'ecran avec avance du curseur. L'ecran est considere comme un simple terminal. La taille de l'ecran est commandee par la fonction 00H.

    - Entree : - BH = Page active (actif si au moins 2 pages).

    - AL = Valeur du caractere a ecrire.

    - BL = Couleur fond caractere en mode graphique ou attribut.

    - Sortie : rien.

    Sous-programme de controle AH = 0FH Lecture de la programmation video (initialisation) - Entree : rien - Sortie : - AL = Mode d'initialisation (voir fonction 00H).

    - AH = Nombre de colonnes de caracteres sur l'ecran.

    - BH = Page active.

    AH = 10H : Registres de selection palette.

    - Entree : - AL =0 Initialisation individuelle des registres palette.

    - BL = Numero du registre palette a initialiser (0 a 15).

    - BH = Valeur de la palette.

    - AL =1 Initialisation du registre de preselection.

    - BH = Valeur a enregistrer.

    - AL =2 Initialisation de tous les registres palette et du registre preselection couleur.

    - (ES:DX) Pointe une table de 17 octets, 0-15 qui sont les valeurs des registres palette et l'octet 16 la valeur du registre de preselection couleur.

    - AL =3 Bit de commutation intensite/clignotement.

    - BL = . 00H Valide l'intensite.

    . 01H Valide le clignotement.

    - AL =7 lecture registre palette - BL = Numero du registre palette a lire (0 a 15).

    - Sortie : BH = Valeur de la palette.

    - AL =8 lecture registre de preselection - Sortie : BH = Valeur lue.

    - AL =9 lecture de tous les registres palette - Sortie : (ES:DX) Pointe une table de 17 octets, 0-15 qui sont les valeurs des registres palette et l'octet 16 la valeur du registre de preselection couleur.

    - AL =10 ecriture registre couleur individuel - BX = numero du registre couleur.

    - DH = Valeur rouge.

    - CH = Valeur vert.

    - CL = Valeur bleu.

    - AL =12 ecriture du bloc de registres couleur - (ES:DX) Pointe la table de la valeur des couleurs (rouge,vert,bleu,........,rouge,vert,bleu).

    - BX = Premier registre couleur a ecrire.

    - CX = Nombre de registres couleur a ecrire.

    - AL =13 selection page couleur (sauf mode 13H) - BL = 0 : Mode page.

    - BH = 0 : selection de 4 blocs de registres de 64 registres, 1 : selection de 16 blocs de registres de 16 registres,.

    - BL = 1 : selection page.

    - BH = nombre de pages :

                  /-----------------------------------------------\
                  |        pour les blocs de 64 registres         |
                  |-----|-----------------------------------------|
                  | 00H | selection premier bloc de 64 registres  |
                  | 01H | selection deuxieme bloc de 64 registres |
                  | 02H | selection troisieme bloc de 64 registres|
                  | 03H | selection quatrieme bloc de 64 registres|
                  |-----|-----------------------------------------|
                  |        pour les blocs de 16 registres         |
                  |-----|-----------------------------------------|
                  | 00H | selection premier bloc de 16 registres  |
                  | 01H | selection deuxieme bloc de 16 registres |
                  | 0FH | selection seixieme bloc de 16 registres |
                  \-----|-----------------------------------------/
    
    - AL =15 lecture registre couleur individuelle - BX = Numero du registre couleur.

    - Sortie : - DH = Valeur rouge.

    - CH = Valeur vert.

    - CL = Valeur bleu.

    - AL =17 lecture du bloc de registres couleur - (ES:DX) Pointe la table destination de la valeur des couleurs (rouge,vert,bleu,........,rouge,vert,bleu).

    - BX = Premier registre couleur a ecrire.

    - CX = Nombre de registres couleur a ecrire.

    - AL =1A selection page couleur (sauf mode 13H) - BL = Mode page.

    - BH = page courante.

    - AL =1B valeur de la somme des couleurs pour les niveaux de gris (30% rouge, 59% vert, 11% bleu) - BX = Premier registre couleur a additionner.

    - CX = Nombre de registres couleur a additionner.

    AH = 11H : Sous-programme generateur de caracteres En mode graphique 4, 5 ou 6, le dessin des 128 premiers caracteres du code ASCII sont dessines dans la ROM BIOS.

    Pour les 128 suivants, l'utilisateur doit passer par l'intermediaire de l'interruption 1FH (INT1FH) qui pointe sur une table de 1 ko contenant les dessins des caracteres 128 a 255.

    En mode graphique, le facteur de recopie contenu dans le registre CX en entree n'est significatif que sur la meme ligne.

    Pour les nouveaux modes graphiques , 256 caracteres graphiques sont memorises dans la ROM BIOS .

    - Entree : - AL =0 Chargement police utilisateur.

    - (ES:BP) Pointe sur la table utilisateur (generateur de caracteres).

    - CX = Compte du transfert.

    - DX = offset caractere dans la table.

    - BL = Bloc a charger.

    - BH = Nombre d'octets par caractere.

    - AL =1 Chargement de la police standard Alphanum. (8x14) - BL = Bloc a charger.

    - AL =2 Chargement de la police 8 x 8.

    - BL = Bloc a charger.

    - AL =3 Chargement du bloc specifie.

    - BL = Generateur caractere bloc specifie.

    D3-D2 = Attribut Bit 3=1 Generateur caractere 0-3. D1-D0 = Attribut Bit 3=0 Generateur caractere 0-3.

    - Les fonctions suivantes (AL=1X) sont identiques aux fonctions AL=0X aux differences suivantes : - La page 0 est active - Les points (octets/caracteres) sont recalcules .

    - Les lignes sont recalculees suivant INT [(200 ou 350 ou 400)/points] - 1 .

    - La definition est recalculee suivant (lignes + 1) x colonne x 2 .

    - Le CRT est programme, registre R09 , R0A , R0B , R12 , R14 .

    - Si b3 (attribut) egal 0, les b4,1,0 de BL selectionnent le bloc.

    - Si b3 (attribut)=1 : b2,3,5 de BL selectionnent le bloc.

    - Les fonctions 10H,11,12,14,20,21,22,24 doivent etrent appelees immediatement apres une selection de mode.

    - AL =10H Signifie AL =01 .

    - AL =11H Signifie AL =01 .

    - AL =12H Signifie AL =02 .

    - AL =20H caracteres graphiques utilisateur INT1FH (8 x 8).

    - (ES:BP) Pointe sur la table generateur de caracteres. Ce vecteur est copie dans celui de INT1FH.

    - AL =21H Caracteres graphiques utilisateur.

    - (ES:BP) Pointe sur la table generateur de caracteres. Ce vecteur est copie dans celui de INT1FH.

    - CX = nombre d'octets par caractere.

    - BL = Ligne : 0 : Utilisateur DL=lignes.

    1 : 14 (0EH).

    2 : 25 (19H).

    3 : 43 (26H). - AL =22H Jeu de caracteres ROM 8 x 14.

    - BL = Ligne.

    - AL =23H Jeu de caracteres ROM 8 x 8.

    - BL = Ligne.

    - AL =30H Informations sur les tables.

    - BH = 0 Retour pointeur courant INT1FH : 1 Retour pointeur courant INT43H.

    2 Retour pointeur ROM 8 x 16.

    3 Retour pointeur ROM 8x8.

    4 Retour pointeur ROM 8x8 (debut).

    6 Retour pointeur ROM 8 x 16.

    - Sortie : - CX = Points.

    - DL = Lignes.

    - (ES:BP) Pointeur vers la table.

    AH = 12H : Selections complementaires.

    - Entree : - BL = 10H Retour des informations EGA.

    - BH = 0 Mode couleur selectionne (3DX).

    - BH = 1 Mode monochrome selectionne (3BX).

    - BL = Valeur de la taille memoire : 00 pour 64 ko 01 pour 128 ko 10 pour 192 ko 11 pour 256 ko - CH = Etat des bits speciaux de l'interface.

    - CL = Etat des switchs configuration.

    - BL =20H Selection sous-programme d'impression ecran.

    - BL =30H reserve AL= 0 (200 lignes), 1 (350 lignes), 2 (400 lignes) - BL =31H Palette par defaut (AH=00H) - AL = 0 palette par defaut validee, - AL = 1 palette par defaut inactive, les registres 256 couleurs ne sont pas alteres - BL =32H video (E/S et buffers) - AL = 0 active, - AL = 1 inactive.

    - BL =33H Somme des niveaux de gris - AL = 0 active, - AL = 1 inactive.

    - Sortie : rien - AL = 12H : fonction supportee.

    AH = 13H Ecriture d'une chaine de caracteres

    • Entree :
      - (ES:BP) = Pointe sur la chaine de caracteres a ecrire
      - CX = Longueur de la chaine de caracteres
      - DX = Position ligne/colonne du premier caractere a ecrire
      - BH = Numero de la page (actif si au moins 2 pages)
      - AL =
      - 00H : BL = attribut : La chaine se compose (caractere, caractere,...) et le curseur n'est pas deplace.
      - 01H : BL = attribut : La chaine se compose (caractere, caractere,...) et le curseur est deplace.
      - 02H : La chaine se compose (caractere, attribut, caractere, attribut,...) et le curseur n'est pas deplace.
      - 03H : La chaine se compose (caractere, attribut, caractere, attribut,...) et le curseur est deplace.
    • - Sortie : rien

    Fonctions VGA

    AH = 1AH Code combinaison affichage

    • Entree :
      - AL =0 Lecture code combinaison affichage
      - AL = 1AH, fonction supportee
      - BL = code ecran actif
      - BH = code ecran alterne
      - AL =1 Ecriture code combinaison affichage
      - BL = code ecran actif
      - BH = code ecran alterne
    • Sortie :
      - AL = 1AH, fonction supportee (signification des codes ecran):
      00H = pas d'ecran
      01H = MDA avec ecran monochrome
      02H = CGA avec ecran couleur
      04H = EGA avec ecran couleur
      05H = EGA avec ecran mono
      06H = PGC
      07H = VGA avec ecran analogique mono
      08H = VGA avec ecran analogique couleur
    AH = 1BH Informations d'etat et fonctions
    • Entree :
      - BX = type
      - (ES:DI) = pointeur buffer retour informations
    • Sortie :
      - AL = 1BH fonction supportee

    AH = 1CH Enregistrer/reprendre etat video

    • Entree :
      - AL = 00H taille de l'etat a reprendre
      - CX = etat a reprendre
    • Sortie :
      - AL = 1CH fonction supportee
      - BX = taille du buffer (en nombre de blocs de 64 octets)
    • Entree :
      - AL = 01H sauvegarde etat
      - CX = etat a sauvegarder
      - (ES:BX) = pointeur buffer sauvegarde etat
    • Sortie :
      - AL = 1CH fonction supportee
      - AL = 02H reprise d'un etat
      - CX = etat a reprendre
      - (ES:BX) = pointeur buffer etat a reprendre
    • Sortie :
      - AL = 1CH fonction supportee

      Etat sauvegarde/repris
      - b15 a b0 = reserve (0),
      - b2 = 1 : etat du DAC et des registres couleur,
      - b1 = 1 : zone de donnees video du BIOS,
      - b0 = 1 : etat materiel de l'interface video.

    INT11H = Lecture de la configuration du systeme

    Cette routine determine quelles options possede le systeme, et retourne cette information dans le registre AX. Lors de l'initialisation (RESET), la configuration est stockee a l'adresse 0410H ; INT11H ne fait que lire ce mot, et le charger dans AX.

    Le systeme ne tient compte du contenu de cette donnee qu'au moment de l'initialisation du systeme. En cas de modification de son contenu il faut donc faire appel a la routine INT19H qui assure la reinitialisation du systeme.

    - Entree : rien.

    - Sortie : le registre AX contient le mot d'equipement (en 000410H)

    /---------------------------------------------------------------\
    |            Configuration equipement 000410H                   |
    |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
    |b15|b14|b13|b12|b11|b10|b9 |b8 |b7 |b6 |b5 |b4 |b3 |b2 |b1 |b0 |
    \---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---/
    
    b15, 14 : nombre d'imprimantes (00=0 a 11=3) b13, 12 : non utilises b11, 10, 9 : nombre de voies serie V24/RS232 b8 : inutilise b7-6 : nombre de lecteur disquette (00=1 a 11=4), seulement si le bit b0 est a 1.

    b5, 4 : mode initial de la visu 00 : non utilise 01 : utilisation du mode couleur en 40 x 25 VGA 10 : utilisation du mode couleur en 80 x 25 VGA 11 : utilisation du mode monochrome en 80 x 25 VGA b3, 2 : non utilises b1 : presence du coprocesseur 80287 (1 = present) b0 : a 1, ce bit indique qu'il y a au moins un lecteur de disquette dans le systeme.

    INT12H = Determination de la taille memoire RAM

    Cette memoire doit etre contigu et ne peut depasser 640 ko.

    Sa taille est determinee a la mise sous tension.

    - Entree : rien.

    - Sortie : - AX = Nombre de blocs de 1 ko contigu de memoire. Cette taille n'est pas donnee par un examen direct de la memoire, mais par la lecture de la configuration materielle du systeme en 000413H.

    INT13H = Traitement disque/disquette

    Cette primitive est la routine de gestion des unites de disquette et de disques : elle se compose de deux parties : - gestion des unites a blocs de donnees connectees sur une interface disquette de type SA450 et utilisant un circuit controleur type fPD765 (NEC) ou equivalent (FDC9266/9268), - gestion des unites de disques connectees sur une interface type ST506/412 et utilisant un circuit controleur de type WD2010.

    Si le systeme ne comprend pas d'unite de disques, la primitive de gestion des unites de disques n'est pas utilisee ; dans ce cas, INT13H correspond uniquement a la gestion des unites de type disquette. Dans le cas contraire, si le systeme comprend une un ite de disques, INT13H deroute la gestion des unite de disquette sur l'INT40H, tandis que INT13H traite la gestion des disques.

    En effet, le BIOS contient une procedure d'initialisation qui effectue les operations suivantes si une unite de disques est detectee : -transfert du pointeur INT13H a l'emplacement INT40H, -positionnement du pointeur gestion disques en INT13H, -verifie le fonctionnement du controleur de disques.

    La primitive INT13H est donc commune aux unites type disques et disquettes. La difference se fait en fonction du numero de l'unite qui est placee dans le registre DL : - DL = 00H, 01H pour les unites type disquette nx 0, 1 - DL = 80H, 81H pour les unites type disques nx 0, 1 Dans la suite, et afin de bien decouper dans la documentation ces deux traitements, INT13H decrit les routines de gestion des unites de disques ; pour les unites de disquette, on se reportera a l'INT40H, meme si, en absence de disque, la gestion des disq uette est bien placee en INT13H.

    Le BIOS n'est capable de gerer que deux unites de disques dont le type est declare dans les registres 12H,19H et 1AH de la RAM CMOS. Pour d'autres types d'unites, il faudra utiliser un utilitaire particulier.

    GESTION DES UNITES TYPE DISQUES Cette routine comprend 20 fonctions : La table des parametres des unites de disques internes est pointee par le vecteur INT41H pour l'unite 0 et par le vecteur INT46H pour l'unite 1. Elles sont chargees a partir des tables standards situees en memoire morte en fonction du type de l'unite de disques declaree dans la configuration (RAM CMOS).

    REMARQUE sur l'organisation des disques : Ce sont generalement des disques de technologie Winchester (inamovibles ou fixes) 5"1/4. Chaque unite de disques comprend un ou plusieurs plateaux ; l'organisation de l'unite de disques est structuree en cylindre ; chaque cylindre est constitue par toutes les pistes portant le meme numero : par exemple s'il y a 2 plateaux, un cylindre comprend 4 pistes (1 piste par face).

    Le premier secteur du disque est l'enregistrement du "master boot" (amorce principale) qui contient une table des partitions du disque. Le boot ordinaire se contente de charger le systeme d'exploitation tandis que le "master" boot regarde quelle partitio n est indiquee comme active, puis passe la main a l'enregistrement de boot de cette partition. On peut changer la partition active a n'importe quel moment avec la commande FDISK du systeme d'exploitation.

    REMARQUE sur le registre CX : Lorsque le registre CX est utilise pour donner les numeros de cylindre et secteur : - le numero de cylindre est donne sur 10 bits : . b8 a b15 = poids faibles . b6 et b7 = poids forts - le numero du secteur dans le cylindre est donne par les 6 bits de poids faibles (b0 a b5).

    /-------------------------------|-------------------------------\
    |              CH               |              CL               |
    |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
    |b15|b14|b13|b12|b11|b10|b9 |b8 |b7 |b6 |b5 |b4 |b3 |b2 |b1 |b0 |
    \---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---/
    \---------------|--------------/\---|---/\----------|-----------/
               numero du cylindre     numero      numero du secteur
               poids faibles        du cylindre
                                    poids forts
    
    AH = 00H : Initialisation du controleur de disque - Entree : rien.

    - Sortie : Cette fonction initialise le controleur de disques de la carte disque. Les parametres pointes par le vecteur INT41H pour le disque 0 ou INT46H pour le disque 1 sont charges tandis que la tete de lecture/ecriture est placee sur la piste 0.

    AH = 01H : Lecture de l'etat du controleur disque - Entree : rien.

    - Sortie : - AH = etat du controleur apres la derniere operation (octet en 00048CH).

    Si le drapeau CF est a 1, le code erreur est retourne dans AL.

    /----|----------------------------------------------------------------------\
    |Code|                   Signification                                      |
    |----|----------------------------------------------------------------------|
    | 00H|Pas d'erreur                                                          |
    | 01H|Commande inconnue                                                     |
    | 02H|Identificateur (marque d'adresse) non trouve                          |
    | 04H|Secteur non trouve                                                    |
    | 05H|Echec de la reinitialisation                                          |
    | 07H|Le controleur n'accepte pas les parametres fournis.                   |
    | 09H|Transfert des donnees sur un segment superieur a 64 K (err limite DMA)|
    | 0AH|Indicateur de secteur mauvais                                         |
    | 0CH|Type disque inconnu                                                   |
    | 10H|Mauvais ECC en lecture                                                |
    | 11H|donnees en erreur, corrigees par l'ECC.                               |
    | 20H|Erreur du controleur disques                                          |
    | 40H|Piste non trouvee                                                     |
    | 80H|Time-out commande depasse                                             |
    | AAH|disque non pret                                                       |
    | BBH|erreur inconnue                                                       |
    | CCH|erreur d'ecriture sur disque selectionne                              |
    | E0H|etat d'erreur sans type d'erreur identifie                            |
    \----|----------------------------------------------------------------------/
    
    AH = 02H : Lecture multi-secteurs - Entree : - AL = nombre de secteurs a lire - (ES:BX) = adresse du tampon memoire reception donnees - CX = numero cylindre (0 a 1023)/numero 1x secteur (1 a 17) - DH = numero de la tete (00H a 0FH) - DL = numero du lecteur (80H ou 81H) - Sortie : Le drapeau de retenue CF du registre d'etat du 80286 est a zero si l'operation s'est bien deroulee ; sinon il est a 1 et le registre AH contient le code d'erreur (voir fonction 01H).

    - AL = nombre de secteurs lus effectivement AH = 03H : Ecriture multi-secteurs Fonctionnement identique a la fonction 02H avec (ES:BX) = adresse du tampon memoire ou sont stockees les donnees a ecrire sur le disque.

    AH = 04H : Verification multi-secteurs Fonctionnement identique a la fonction 02H ou 03H ; (ES:BX) n'est pas utilise ; cette fonction permet de controler les marques d'adresses, et les CRC (lecture sans transfert).

    AH = 05H : Formatage d'une piste Dans cette operation, une zone memoire (contenant une table de formatage) pointee par (ES:BX) doit etre initialisee. Cette zone contient tous les champs d'adresses d'une piste.

    Chaque champ est compose de 4 octets d'identification : 1 : numero de piste (C) 2 : numero de face (H) 3 : numero de secteur (R) 4 : nombre d'octets par secteur (N) : 00H = 128 octets 01H = 256 octets 02H = 512 octets 03H = 1024 octets AH = 08H : Lecture des parametres de l'unite disque - Entree : - DL = numero du lecteur (80H ou 81H) - Sortie : Retourne certains parametres du type de disque : (parametres lus dans la table pointee par INT41H ou INT46H).

    - DH = nombre de tetes de lecture/ecriture - CX = nombre de cylindres max./nombre de secteurs maximal - DL = nombre d'unite de disques dans le systeme -Si le type declare dans la CMOS est valide - (ES:DI) = pointeur de la table des parametres - BH = 00H - BL = b4 a b7 = 0 b0 a b3 = type de l'unite declaree dans la CMOS -Si le type declare dans la CMOS est inconnu (type ou CMOS invalide) ou si le lecteur est invalide - ES = AX = BX = CX = DX = DI = 00H - DL = nombre d'unites - S'il n'y a aucune unite de disque - ES = AX = BX = CX = DX = DI = 00H AH = 09H : Initialisation des parametres du disque Cette fonction assure la programmation du controleur en fonction de la table des parametres pointee par INT41H ou INT46H (la fonction 09H est executee pendant la fonction 00H).

    - Entree : - DL = numero du lecteur (80H ou 81H) - Sortie : voir fonction 01H AH = 0AH : Lecture multi-secteur avec ECC AH = 0BH : Ecriture multi-secteur avec ECC Permet de lire ou d'ecrire des secteurs longs, c'est-a-dire de lire des donnees d'un secteur, plus les quatre octets ECC.

    Dans ce cas, il faut un tampon memoire de 516 octets par secteur. Le controleur n'assure pas la correction automatique des donnees en fonction de l'ECC. Les parametres sont identiques aux fonctions 02H et 03H.

    AH = 0CH : Positionnement de la tete sur un cylindre - Entree : - CX = numero cylindre (0a1023)/numero 1x secteur (1a17) - DH = numero de la tete (00H a 0FH) - DL = numero du lecteur (80H ou 81H) - Sortie : Le drapeau de retenue CF du registre d'etat du 80286 est a zero si l'operation s'est bien deroulee ; sinon il est a 1 et le registre AH contient le code d'erreur (voir fonction 01H).

    AH = 0DH : Reinitialisation disque - Entree : - DL = numero du lecteur (80H ou 81H) - Sortie : Le drapeau de retenue CF du registre d'etat du 80286 est a zero si l'operation s'est bien deroulee ; sinon il est a 1 et le registre AH contient le code d'erreur (voir fonction 01H).

    AH = 10H : Test disque pret - Entree : - DL = numero du lecteur (80H ou 81H) - Sortie : Le drapeau de retenue CF du registre d'etat du 80286 est a zero si l'operation s'est bien deroulee ; sinon il est a 1 et le registre AH contient le code d'erreur (voir fonction 01H).

    AH = 11H : Recalibrage sur piste 0 - Entree : - DL = numero du lecteur (80H ou 81H) - Sortie : Le drapeau de retenue CF du registre d'etat du 80286 est a zero si l'operation s'est bien deroulee ; sinon il est a 1 et le registre AH contient le code d'erreur (voir fonction 01H).

    AH = 15H : Lecture du type du disque - Entree : - DL = numero du lecteur (80H ou 81H) - Sortie : - AH = . 00H pas de disque . 01H reserve . 02H reserve . 03H disque dur

    INT14H = Controle des voies communications asynchrones

    Cette interface de communication gere des voies de transmission serie asynchrone.

    En entree, DX contient le numero de la voie logique ; ce numero peut-etre 0 pour la voie 0 (COM1) en 03F8H.

    En sortie, AX est modifie en fonction du sous-programme appele ; tous les autres registres sont sauvegardes.

    TIME OUT : Le temps mis par une operation d'entree- Sortie est controle par le logiciel afin d'empecher un blocage.

    La temporisation d'attente est fixee par le parametre TIME-OUT dont la valeur est stockee a une adresse determinee. Cette valeur peut etre modifiee pour s'adapter au peripherique concerne ; si le TIME-OUT est de 01H, et si une operation prend plus de une seconde, une erreur de time-out est detectee.

    /-------------------------------\
    |        VOIE ASYNCHRONE        |
    |-------|-------|-------|-------|
    |  Nx0  |  Nx1  |  Nx2  |  Nx3  |
    |-------|-------|-------|-------|-----------------\
    |00047CH|00047DH|00047EH|00047FH|    Adresse      |
    |-------|-------|-------|-------|-----------------|
    |  01H  |  01H  |  01H  |  01H  |Valeur par defaut|
    \-------|-------|-------|-------|-----------------/
    
    Les temporisations sont calculees a partir de l'horloge REFRESH (periode 30 fs), lue sur le bit b4 du port d'E/S 0061H.

    L'adresse de la voie est pointee par les donnees aux adresses 000400H a 000407H de la zone de donnees du BIOS.

    AH = 00H : Initialisation du port de communication - Entree : - DX = Numero logique de la voie.

    Le registre AL contient les parametres d'initialisation.

    /-----------------------------------------------------------------------\
    |   AL = PARAMETRES D'INITIALISATION DU PORT DE COMMUNICATION           |
    |--------|--------|--------|--------|--------|--------|--------|--------|
    |  b7    |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |   b0   |
    |--------|--------|--------|--------|--------|--------|--------|--------|
    |  Vitesse de transmission |     Parite      |bit stop|  Taille du mot  |
    |--------------------------|-----------------|--------|-----------------|
    |      000 =  110 bauds    |X0=sans parite   |0= 1bit |   10 = 7 bits   |
    |      001 =  150 bauds    |01=parite impaire|1= 2bits|   11 = 8 bits   |
    |      010 =  300 bauds    |11=parite paire  |        |                 |
    |      011 =  600 bauds    |                 |        |                 |
    |      100 = 1200 bauds    |                 |        |                 |
    |      101 = 2400 bauds    |                 |        |                 |
    |      110 = 4800 bauds    |                 |        |                 |
    |      111 = 9600 bauds    |                 |        |                 |
    \--------------------------|-----------------|--------|-----------------/
    
    - Sortie : - AX = Etat du port de communication (voir fonction 03H) AH = 01H : Emission d'une donnee - Entree : - DX = Numero logique de la voie.

    - AL = Donnee a transmettre par la ligne de communication (AL est sauvegarde).

    - Sortie : - AX = Etat du port de communication (voir fonction 03H). Le bit 7 du registre AH est active si le sous-programme est incapable de transmettre l'octet de donnees sur la ligne. Si le bit 7 du registre AH n'est pas active, les sept autres bits refletent l 'etat courant du port de communication (voir fonction 03H).

    AH = 02H : Reception d'une donnee - Entree : - DX = Numero logique de la voie.

    - Sortie : - AL = Donnee recue par la ligne de communication.

    - AX = Etat du port de communication (voir fonction 03H). AH contient la valeur de l'etat courant de la ligne activee par la routine, excepte pour les cinq bits (b7, b4, b3, b2, b1) qui sont les bits d'erreur. Si le bit 7 de AH est active (erreur time-o ut), les autres bits ne sont pas significatifs.

    AH = 03H : Lecture de l'etat du port de communication - Entree : - DX = Numero logique de la voie.

    - Sortie : La valeur de l'etat du port de communication est retournee dans le registre AX.

    /-------------------------------|-------------------------------\
    |               AH              |               AL              |
    |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
    |b15|b14|b13|b12|b11|b10|b9 |b8 |b7 |b6 |b5 |b4 |b3 |b2 |b1 |b0 |
    \---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---/
    
    - AH = registre d'etats de la ligne.

    . b15= Time-out* (temps depasse) . b14= Registre de sortie de transmission vide (TSRE) . b13= Registre du tampon de transmission vide (THRE) . b12= Detection d'un Break (BI) . b11= Erreur trame (FE) . b10= Erreur parite (PE) . b9 = Transmission trop rapide, ecrasement des donnees (OR) . b8 = Donnees pretes a la transmission (DR) - AL = registre d'etats des signaux modem.

    . b7 = Detection d'une donnee en reception (RLSD) . b6 = Indicateur d'appel (RI) . b5 = Poste de donnees pret (DSR) . b4 = Pret a emettre (CTS) . b3 = Detection d'un changement d'etat de la ligne detection d'une donnee en reception (DSLSD) . b2 = Transition sur la ligne indicateur d'appel (TERI) . b1 = Transition sur la ligne (DSR) . b0 = Transition sur la ligne (CTS).

    INT15H = Mode protege + divers

    Les fonctions 00H a 82H, 84H, 90H, 91H ne sont pas traitees par le BIOS (sortie avec AH=86H et CF=1).

    AH = 4FH : Traitement speciale touches clavier - Entree : Cette fonction est appelee par INT09H, avec : - AL = code touche controleur - Sortie : (pas de traitement par le BIOS, CY=1) - CF = 1 : traitement a continuer par INT09H - CF = 0 : sortir de INT09H AH = 80H : Open device AH = 81H : Close device AH = 82H : Fin programme Ces fonctions ne sont pas traitees par le BIOS.

    AH = 83H : Attente evenement (voir INT70H) - Entree : - (ES:BX) = pointe l'octet evenement (drapeau b7 a 1 apres evenement) - CX:DX = duree d'attente en ms - Sortie : - CF = 1 erreur (attente en cours), = 0 attente terminee AH = 84H : Manette de jeux (joystick) - Entree : - DX = . 0 lecture des cavaliers de configuration de la carte supportant l'interface manette de jeux (adresse 0201H) . 1 lecture des coordonnees - Sortie : - DX = 00H ..AL = lecture des cavaliers (b7 a b4) - DX = 01H ..AX = A(y) ..BX = a(y) ..CX = A(y) ..DX = b(y) - CF = 1 s'il n'y a pas de carte AH = 85H : Traitement SYSREQ clavier Cette fonction est appelee par INT09H lorsque la touche SYSREQ change d'etat.

    - Entree : - AL = 00H : touche enfoncee - AL = 01H : touche relachee - Sortie : Pas de traitement assure par le BIOS (IRET).

    AH = 86H : Attente - Entree : - CX,DX = temps d'attente en ms avant le retour systeme (CX poids forts,DX poids faibles) charges dans le compteur d'evenement en 00049CH et 00049EH.

    - Sortie : - CF = 1 erreur (attente en cours), 0 attente terminee AH = 87H : Transfert memoire/memoire au-dela de l'espace adressable 1Mo en mode protege - Entree : - CX = Longueur en mot du bloc memoire a transferer (<8000H ou 32 kmots) - (ES:SI) = Pointeur vers la table (GDT) des descripteurs sources et destination.

    - Sortie : - AH = ..00H : succes ..01H : erreur parite memoire ..02H : erreur interruption exception ..03H : erreur de verrouillage de la ligne d'adresse A20 - CF = 1 erreur - ZF = 1 succes AH = 88H : Taille memoire d'extension au-dela de 1 Mo - Entree : rien - Sortie : - AX = nombre de blocs de 1ko AH = 89H : Basculement en mode protege - Entree : - BH = positionnement decalage vecteur d'interruption 8259 maitre - BL = positionnement decalage vecteur d'interruption 8259 esclave - (ES:SI) = pointe la table GDT construite par le programme appelant - Sortie : rien AH = C0H : Acquisition de l'adresse de la table des parametres de configuration de la machine - Entree : rien - Sortie : - AH = 00H et CF =0 si table presente, - (ES:BX) = pointeur de l'adresse de la table.

    ..mot nx1 = 0008H : longueur de la table suivante (en octets) ..octet nx3 = Modele de machine ..octet nx4 = Type de machine ..octet nx5 = Version du BIOS ..octet nx6 = Configuration machine ..octet nx7 a 10 = reserve AH = 90H : Busy device loop Non traite AH = 91H : Interrupt complete flag set Appele par INT0EH (Non traite).

    INT17H = Gestion imprimante

    Cette primitive permet de piloter jusqu'a quatre imprimantes ; elle possede trois fonctions : AH = 00H : Impression d'un caractere - Entree : - AL = code ASCII du caractere a imprimer.

    - DX = numero de l'imprimante (de 00 a 03H).

    - Sortie : - AH = 01H si le caractere n'a pas pu etre imprime (TIME -OUT). Sinon AH = registre d'etat de l'imprimante (voir fonction 02H) AH = 01H : Initialisation de l'imprimante - Entree : - DX = numero de l'imprimante (de 00 a 03H) - Sortie : - AH = registre d'etat de l'imprimante apres execution de la routine (voir fonction 02H) AH = 02H : Lecture du registre d'etat de l'imprimante - Entree : - DX = numero de l'imprimante (de 00 a 03H).

    - Sortie : - AH = registre d'etat de l'imprimante.

    /-----------------------------------------------\
    |          REGISTRE D'ETAT DE L'IMPRIMANTE      |
    |-----|-----|-----|-----|-----|-----|-----|-----|
    | b7  | b6  | b5  | b4  | b3  | b2  | b1  | b0  |
    |-----|-----|-----|-----|-----|-----|-----|-----|
    |N BUS| ACK | OOP | SEL | IOER|  X  |  X  |T OUT|
    \-----|-----|-----|-----|-----|-----|-----|-----/
    
    N BUS = Not BUSy : imprimante prete(=1) ACK = ACKnowledge : accuse de reception OOP = Out Of Paper :palpeur fin de papier actif SEL = SELected : imprimante selectionnee (=1) IOER = I/O ERror : erreur entree/sortie T OUT = TIME-OUT* : Le temps mis par une operation d'entree/sortie est controle par le logiciel afin d'empecher un blocage.

    La temporisation d'attente est fixee par le parametre TIME-OUT dont la valeur est stockee a une adresse determinee. Cette valeur peut etre modifiee pour s'adapter au peripherique concerne, si l'unite de TIME-OUT est de 14H, et si une operation prend plus de 20 secondes, une erreur de time-out est detectee.

    /-------------------------------\
    |     TIME-OUT IMPRIMANTE       |
    |-------|-------|-------|-------|
    |  Nx0  |  Nx1  |  Nx2  |  Nx3  |
    |-------|-------|-------|-------|-----------------\
    |000478H|000479H|00047AH|00047BH|    Adresse      |
    |-------|-------|-------|-------|-----------------|
    |  14H  |  14H  |  14H  |  14H  |Valeur par defaut|
    \-------|-------|-------|-------|-----------------/
    
    Les temporisations sont calculees a partir de l'horloge REFRESH (periode 15 fs), lue sur le bit b4 du port d'E/S 0061H.

    L'adresse du coupleur imprimante est pointee par les donnees presentes aux adresses 000408H a 00040FH de la zone de donnees du BIOS.

    INT18H = Reserve usine

    Telechargement des tests de production.

    INT19H = Chargement systeme

    Cette primitive a pour fonction de charger le systeme d'exploitation.

    Il s'effectue de la maniere suivante : lecture du secteur 1, piste 0 du premier lecteur de disquette. Cet enregistrement est appele "boot strap loader" (amorce de chargement) ou encore "boot" ; il est charge en memoire vive a l'adresse 07C00H.

    Une fois charge, le programme d'initialisation se branche a l'adresse 07C00H. Le "boot" est alors execute : le "boot" a pour fonction de charger les fichiers systeme du systeme d'exploitation ; a cet effet, le "boot" va chercher a un endroit determine de la disquette les fichiers systeme et les charge en memoire vive : la main est ensuite donnee au systeme d'exploitation qui se charge de la suite des operations.

    Sous MS-DOS, le premier fichier charge par le "boot" est IO.SYS ; une fois charge, c'est ce fichier qui a pour fonction de charger le reste du systeme d'exploitation : MSDOS.SYS, etc...

    REMARQUE : Si le systeme possede une unite de type disque, et si le chargement a partir de la disquette echoue, alors la routine d'amorcage vient lire le "boot" de la premiere unite de disques ; le programme verifie la signature du "boot disque" (2 derni ers octets a 55AAH) : si une erreur est detectee, un message d'erreur apparait.

    Si les 10 premiers octets de l'amorce sont identiques, un message d'erreur "Erreur controleur disque" apparait.

    Dans le cas ou le disque possede une partition, le master boot est charge en premier en 07C00H. Celui-ci permet de determiner la partition active et le premier cylindre de cette partition. Le boot de la partition active est ensuite charge par le "master boot" (ce dernier etant ecrase).

    La routine de chargement systeme appelle systematiquement INT18H si le chargement echoue.

    SOUS MS-DOS (3.x standard) Le boot existe sur toutes disquettes et disques formates MS-DOS : - Si les deux premiers fichiers de la disquette sont les fichiers systemes (IO.SYS et MSDOS.SYS dans cet ordre), le chargement est execute normalement.

    - Si la disquette n'est pas formatee, le chargement est tente a partir du disque dur, sinon un message d'erreur BIOS apparait.

    - Si la disquette est formatee et si elle ne contient pas les fichiers systemes, le message suivant apparait : "Systeme absent ou Erreur disque." "Remplacer la disquette et taper une touche." La structure d'une unite de disque ou de disquette comprend : - le "boot", - les FAT (File Allocation Table), - le repertoire principal, les fichiers et les sous-repertoires.

    LE BOOT Le "boot" ou "boot strap loader" est un programme qui permet le chargement du systeme d'exploitation ou parfois d'une application. Il commence toujours au meme endroit du disque (piste 0, tete 0, secteur 1) pour permettre au BIOS d'y acceder directement.

    Ce "boot" est charge en memoire par le BIOS, puis il est execute comme des instructions machines. La taille du boot (generalement 1 secteur) est fixee par la parametre Nombre de secteurs reserves pour le boot a l'offset 0EH.

    La structure du "boot" est la suivante :

    /----------|-----------------------------------------------|-----------------\
    |  Offset  |       Designation de la zone                  |Taille (octets)  |
    |----------|-----------------------------------------------|-----------------|
    |   00H    |Instruction de saut au programme a executer    |        3        |
    |   03H    |Nom du constructeur et numero de version       |        8        |
    |   0BH    |Nombre d'octets par secteur                    |        2        |
    |   0DH    |Nombre de secteurs par Cluster                 |        1        |
    |   0EH    |Nombre de secteurs reserves pour le boot       |        2        |
    |   10H    |Nombre de FAT (FAT principale + FAT securite)  |        1        |
    |   11H    |Taille du repertoire (en nombre d'entrees)     |        2        |
    |   13H    |Nombre total de secteurs utilises sur volume   |        2        |
    |   15H    |Type de disque (voir tableau ci-dessous)       |        1        |
    |   16H    |Nombre de secteurs utilises                    |        2        |
    |   18H    |Nombre de secteurs par piste                   |        2        |
    |   1AH    |Nombre de tetes                                |        2        |
    |   1CH    |Nombre de secteurs caches (partitions)         |        2        |
    \----------|-----------------------------------------------|-----------------/
    /--------------|----------------------------------------------------\
    |Type disquette|                                                    |
    |      5"1/4   |                                                    |
    |--------------|----------------------------------------------------|
    |     FFH      |Double face, 8 secteurs/piste, 40 pistes, DD        |
    |     FEH      |Simple face, 8 secteurs/piste, 40 pistes, DD        |
    |     FDH      |Double face, 9 secteurs/piste, 40 pistes, DD        |
    |     FCH      |Simple face, 9 secteurs/piste, 40 pistes, DD        |
    |     FBH      |Double face, 8 secteurs/piste, 80 pistes, DD        |
    |     F9H      |Double face, 9 secteurs/piste, 80 pistes, DD        |
    |     F9H      |Double face, 15 secteurs/piste, 80 pistes, HD       |
    |     F8H      |Disque dur                                          |
    \--------------|----------------------------------------------------/
    
    L'unite d'allocation de fichiers sur les disques est le CLUSTER. Un CLUSTER est compose de plusieurs secteurs.

    Exemple : Si le boot du disque contient les octets suivants : EBH, 34H, 90H, 42H, 55H, 4CH, 4CH, 33H, 2EH, 32H, 31H, 00H, 02H, 04H, 01H, 00H, 02H, 00H, 02H, 99H, FFH, F8H, 40H, 00H, 11H, 00H, 07H, 00H, 11H, 00H, ...

    L'interpretation est la suivante : EBH,34H,90H = JMP 34H, NOP. A l'offset 34H du boot se trouve la suite du programme a executer.

    xxH,xxH,xxH,xxH,xxH,xxH,xxH,xxH = wxyzn.ml. (version) 00H,02H = 0200H (512) octets par secteurs.

    04H = 4 secteurs par Cluster.

    01H,00H = 0001H secteur reserve pour le boot.

    02H = 02H FAT.

    00H,02H = 0200H (512) entrees par repertoire.

    99H,FFH = FF99H (65433) secteurs disponibles sur le disque.

    F8H = Type disque.

    40H,00H = 0040H secteurs par FAT.

    11H,00H = 0011H (17) secteurs par piste.

    07H,00H = 0007H (7) tetes de lecture/ecriture.

    11H,00H = 0011H (17) secteurs caches.

    Dans le cas d'un disque dur, sa structure peut etre partitionnee. Le "boot" vient donc lire la table de partitionnement dont la structure est indiquee ci-dessous. Cette table est situee a l'offset 1BEH dans le secteur du master-boot (ne pas confondre ave c le boot du systeme qui est different dans ce cas). Elle se termine a l'offset 1FDH et est suivie par la signature du boot 55AAH.

    Il existe quatre partitions, consecutives, dont la structure est la suivante (chaque parametre est contenu dans un octet) :

    /----------|-----------------------------------------------\
    |Numero du |       Designation du parametre                |
    |parametre |         pour chaque partition                 |
    |----------|-----------------------------------------------|
    |   01H    | Indicateur d'activite                         |
    |   02H    | Numero de tete debut partition                |
    |   03H    | Numero de secteur debut partition             |
    |   04H    | Numero de cylindre debut partition            |
    |   05H    | Indicateur systeme                            |
    |   06H    | Numero de tete fin partition                  |
    |   07H    | Numero de secteur fin partition               |
    |   08H    | Numero de cylindre fin partition              |
    \----------|-----------------------------------------------/
    
    L'indicateur d'activite est : - 00H = partition non active, - 80H = partition active.

    L'indicateur systeme est : - 00H = systeme autre que MS-DOS, - 01H = MS-DOS version < 3, - 04H = MS-DOS autre version.

    Les Numeros de secteurs et cylindres ont le format suivant :

    /-------------------------------|-------------------------------\
    |        Numero cylindre        |        Numero secteur         |
    |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
    |b15|b14|b13|b12|b11|b10|b9 |b8 |b7 |b6 |b5 |b4 |b3 |b2 |b1 |b0 |
    \---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---/
    \---------------|--------------/\---|---/\----------|-----------/
               numero du cylindre     numero      numero du secteur
               poids faibles        du cylindre
                                    poids forts
    
    Pour la structure des FAT, des fichiers, des repertoires et l'utilisation des disques et disquettes par MS-DOS, se reporter au Manuel de Reference du programmeur MS-DOS.

    INT1AH = Gestion horloge

    Cette routine travaille en partie en liaison avec l'horloge temps reel decrite dans la primitive INT08H, et d'autre part avec le circuit horloge dateur programmable 146818 (146818).

    Elle comprend 6 fonctions : -Fonctions liees a l'horloge temps reel : L'horloge temps reel fonctionne a raison de 18,2 impulsions par seconde.

    00H : lecture d'un intervalle de temps 01H : initialisation de l'horloge -Fonctions liees a l'horloge dateur programmable : 02H : lecture de l'heure 03H : ecriture de l'heure 04H : lecture de la date 05H : ecriture de la date 06H : armer une alarme 07H : desarmer une alarme AH = 00H : Lecture de l'horloge temps reel.

    - Entree : rien.

    - Sortie : - CX = poids forts (1 octet poids fort) - DX = poids faibles (2 octets poids faibles) - AL = 00H : s'il ne s'est pas passe 24 heures depuis la derniere lecture ou la mise sous tension.

    AH = 01H : Initialisation de l'horloge temps reel - Entree : - CX = poids forts - DX = poids faibles - Sortie : rien.

    AH = 02H : Lecture de l'heure - Entree : rien.

    - Sortie : - CH = heure en BCD - CL = minute en BCD - DH = seconde en BCD - CF active si pas d'horloge CMOS AH = 03H : Initialisation de l'heure - Entree : - CH = heure en BCD - CL = minute en BCD - DH = seconde en BCD - DL = 01H pour l'option HEURE D'ETE, sinon 0 - Sortie : rien.

    AH = 04H : Lecture de la date - Entree : rien.

    - Sortie : - CH = siecle en BCD (19 ou 20) - CL = annee en BCD - DH = mois en BCD - DL = jour en BCD - CF active si pas d'horloge CMOS AH = 05H : Initialisation de la date - Entree : - CH = siecle en BCD (19 ou 20) - CL = annee en BCD - DH = mois en BCD - DL = jour en BCD - Sortie : rien.

    AH = 06H : Armer une alarme L'alarme geree par l'horloge CMOS declenche une interruption IRQ8 (INT70H) qui appelle la routine INT4AH ou doit se trouver le programme de traitement de l'alarme.

    - Entree : - CH = heure en BCD - CL = minute en BCD - DH = seconde en BCD - Sortie : - CF positionne si pas d'horloge CMOS AH = 07H : Desarmer l'alarme - Entree : rien - Sortie : rien

    INT1BH = Gestion du break

    Cette interruption est executee quand la fonction BREAK est demandee au clavier (touches CTRL + BREAK ou CTRL + PAUSE). Cette interruption n'est pas utilisee par le BIOS. C'est a l'application d'intercepter ce vecteur pour executer un traitement particul ier.

    INT1CH = Utilisateur

    Cette interruption est appelee par INT08H.

    La routine de traitement INT1CH peut etre utilisee par une application.

    Elle est constituee de l'instruction IRET par defaut.

    INT1DH = Parametres video

    Ce pointeur fournit l'adresse de la table des parametres requis pour la programmation du controleur 6845 en fonction du mode graphique selectionne.

    Il y a quatre tables correspondant aux quatres modes de la fonction 00H de INT10H. Ces parametres correspondent aux 16 registres du 6845 pour des cartes extension classiques de type MDA ou CGA. Pour une interface de type EGA, voir programmation de l'inte rface EGA ^U3.16.

    mode 40x25 couleur :
    38H, 28H, 2DH, 0AH, 1FH, 06H, 19H, 1CH, 02H, 07H, 06H, 07H, 00H, 00H, 00H, 00H
    mode 80x25 monochrome :
    71H, 50H, 5AH, 0AH, 1FH, 06H, 19H, 1CH, 02H, 07H, 06H, 07H, 00H, 00H, 00H, 00H
    mode graphique couleur (320 x 200) :
    38H, 28H, 2DH, 0AH, 7FH, 06H, 64H, 70H, 02H, 01H, 06H, 07H, 00H, 00H, 00H, 00H
    mode 80x25 couleur :
    61H, 50H, 52H, 0FH, 19H, 06H, 19H, 19H, 02H, 0DH, 0BH, 0CH, 00H, 00H, 00H, 00H
    
    A l'initialisation, le vecteur d'interruption pointe la zone des tables situees en memoire morte.

    L'utilisateur peut pointer une autre zone ou changer les parametres de la video.

    INT1EH = Parametres disquette

    Ce pointeur fournit l'adresse des parametres requis pour le fonctionnement de l'unite de disquette.

    Le vecteur pointe une zone memoire contenant les parametres de la disquette.

    A la mise sous tension du systeme, le vecteur est initialise pour pointer la zone des parametres situee en memoire morte.

    Pour modifier ces parametres, il faut creer une autre table en memoire puis placer le pointeur a l'emplacement du vecteur INT1EH.

    Liste des parametres du BIOS (disquette 360ko/unite 360ko) :

    DFH : SRT = 0DH, HUT = 0FH.
    

    02H : HLT = 1, mode DMA = ND.

    35H : Temporisation arret moteur apres operation sur disquette
    (en multiple de 54,6ms, soit environ 3s pour 35H).

    02H : N = 512 octets/secteur.

    09H : SC = nombre maximum de secteurs par piste.

    2AH : GPL = Longueur de l'intervalle GAP3 en acces lecture/ecriture.

    FFH : DTL Longueur donnees reellement lues/ecrites par secteur.

    50H : Longueur de l'intervalle GAP3 en formatage.

    F6H : Remplissage octet pour formatage.

    0FH : Temps de positionnement tete (en milli-secondes).

    08H : Temps demarrage moteur (en multiple de 1/8 seconde).

    27H : Nombre maximum de cylindre.

    Pour une description plus detaillee de ces parametres se reporter a la description du controleur FDC9268 et en particulier des registres SRT-HUT, HLT-ND,... (^U 3.12.8.).

    /----------|----------|----------|----------|----------|----------|----------\
    |Parametres|Unite360ko|Unite1,2Mo|Unite1,2Mo|Unite720ko|Unite1,4Mo|Unite1,4Mo|
    |          |Media360ko|Media1,2Mo|Media360ko|Media720ko|Media1,4Mo|Media720Mo|
    |----------|----------|----------|----------|----------|----------|----------|
    |SRT/HUT   |   DFH    |   DFH    |   DFH    |   DFH    |   AFH    |   DFH    |
    |HLT/DMA   |   02H    |   02H    |   02H    |   02H    |   02H    |   02H    |
    |Temp arMOT|   25H    |   25H    |   25H    |   25H    |   25H    |   25H    |
    |octets/sec|   02H    |   02H    |   02H    |   02H    |   02H    |   02H    |
    |EOT nb sec|   09H    |   0EH    |   09H    |   09H    |   12H    |   09H    |
    |GAP3 L/E  |   2AH    |   1BH    |   2AH    |   2AH    |   1BH    |   2AH    |
    |DTL       |   FFH    |   FFH    |   FFH    |   FFH    |   FFH    |   FFH    |
    |GAP3 formt|   50H    |   54H    |   50H    |   50H    |   6CH    |   50H    |
    |octetformt|   F6H    |   F6H    |   F6H    |   F6H    |   F6H    |   F6H    |
    |T pos tete|   0FH    |   0FH    |   0FH    |   0FH    |   0FH    |   0FH    |
    |T dmr mot |   08H    |   08H    |   08H    |   08H    |   08H    |   08H    |
    |nb cyl max|   27H    |   4FH    |   27H    |   4FH    |   4FH    |   4FH    |
    \----------|----------|----------|----------|----------|----------|----------/
    

    INT1FH = Table caracteres graphiques

    Ce pointeur n'est pas utilise par le BIOS de base ; a charge pour l'utilisateur de creer cette table et de la pointer par le vecteur INT1FH.

    Cette table doit etre utilisee pour les caracteres d'extension graphique (code ASCII de 128 a 255), en mode graphique 320 x 200 ou 640 x 200 ; un caractere est forme par une matrice 8 x 8 : chaque caractere ASCII est donc represente par 8 x 8 octets dans la table.

    La premiere partie de la table des caracteres (code ASCII de 0 a 127) est situee en memoire morte. La deuxieme partie (code ASCII de 128 a 255) est pointee par INT1FH.

    Le pointeur INT1FH peut etre modifie par exemple sous le systeme d'exploitation MS-DOS par la routine GRAFTABL pour l'affichage graphique 320 x 200 ou 640 x 200.

    INT40H = traitement disquette

    Cette interruption est appelee par le programme de traitement des disque/disquette (INT13H), lorsque le systeme comprend une unite de disques ; dans ce cas, la gestion des unites de disquette est deroutee de INT13H vers INT40H en fonction du numero de l' unite contenu dans le registre DL (00H et 01H pour les unites de disquette, 80H et 81H pour les unites de disques).

    Le BIOS n'est capable de gerer que deux unites de disquette dont le type est declare dans le registre 10H de la RAM CMOS.

    GESTION DES UNITES TYPE DISQUETTE : Cette routine comprend 6 fonctions : AH = 00H : Initialisation du controleur de disquette Cette fonction initialise le controleur de disquette FDC9268. Les parametres pointes par le ES:DI sont charges tandis que la tete de lecture/ecriture est placee sur la piste 0 pour toutes les unites de disquette.

    - Entree : - (ES:DI) = pointeur de la table des parametres - Sortie : Le drapeau de retenue CF du registre d'etat du 80286 est a zero si l'operation s'est bien deroulee ; sinon il est a 1 et le registre AH contient le code d'erreur (voir fonction 01H).

    AH = 01H : Lecture de l'etat du controleur - Entree : rien.

    - Sortie : - AH = etat de la derniere operation (octet en 000441H).

    Si le drapeau CF est a 1, le code erreur est retourne dans AL.

    /----|----------------------------------------------------------------------\
    |Code|                   Signification                                      |
    |----|----------------------------------------------------------------------|
    | 00H|Pas d'erreur                                                          |
    | 01H|Commande inconnue                                                     |
    | 02H|Identificateur (marque d'adresse) non trouve                          |
    | 03H|Essai d'ecriture sur disquette protegee en ecriture                   |
    | 04H|Secteur non trouve                                                    |
    | 06H|Changement de disquette                                               |
    | 08H|Mauvaise transmission de donnees par DMA                              |
    | 09H|Transfert des donnees sur un segment superieur a 64 K (err limite DMA)|
    | 0CH|Type disquette inconnu                                                |
    | 10H|Mauvais CRC en lecture                                                |
    | 20H|Erreur du controleur FDC9268                                          |
    | 40H|Piste non trouvee                                                     |
    | 80H|Time-out commande non executee apres le temps imparti                 |
    \----|----------------------------------------------------------------------/
    
    Ce code est l'octet d'etat disquette a l'adresse 000441H de la zone des parametres systeme ; cet octet est une synthese des 7 octets d'etat du controleur FDC9268 situes a l'adresse 000442H qui sont renvoyes par le controleur apres une operation sur une d isquette.

    AH = 02H : Lecture multi-secteurs - Entree : - AL = nombre de secteurs a lire - (ES:BX) = adresse du tampon de reception des donnees - CH = numero du cylindre - CL = numero du premier secteur a lire - DH = numero de la face (00H ou 01H) - DL = numero du lecteur (00H ou 01H) - Sortie : Le drapeau de retenue CF du registre d'etat du 80286 est a zero si l'operation s'est bien deroulee ; sinon il est a 1 et le registre AH contient le code d'erreur (voir fonction 01H).

    - AL = nombre de secteurs lus effectivement AH = 03H : Ecriture multi-secteurs Fonctionnement identique a la fonction 02H avec (ES:BX) = adresse de la zone de donnees a ecrire sur la disquette.

    AH = 04H : Verification multi-secteurs Fonctionnement identique a la fonction 02H ou 03H ; (ES:BX) n'est pas utilise ; cette fonction permet de controler les marques d'adresses, et les CRC (lecture sans transfert).

    AH = 05H : Formatage d'une piste Dans cette operation, une zone memoire (contenant une table de formatage) pointee par (ES:BX) doit etre initialisee. Cette zone contient tous les champs d'adresses d'une piste.

    Chaque champ est compose de 4 octets d'identification : 1 : numero de piste (C) 2 : numero de face (H) 3 : numero de secteur (R) 4 : nombre d'octets par secteur (N) : 00H = 128 octets 01H = 256 octets 02H = 512 octets 03H = 1024 octets Les registres utilises pour cette fonction sont les memes que pour les fonctions precedentes, excepte CL qui n'est pas utilise. Les caracteristiques du formatage sont celles de la table pointee par INT1EH.

    Si l'unite est capable d'utiliser plusieurs types de disquette, un appel de la fonction 17H ou 18H doit etre fait, sinon la disquette est formatee avec la capacite maximum.

    - Sortie : Le drapeau de retenue CF du registre d'etat du 80286 est a zero si l'operation s'est bien deroulee ; sinon il est a 1 et le registre AH contient le code d'erreur (voir fonction 01H).

    AH = 08H : Lecture des parametres de l'unite disquette - Entree : - DL = nx de l'unite de disquette - Sortie : -Si le type declare dans la CMOS est valide - (ES:DI) = pointeur de la table des parametres - AX = 00H - CX = . b8 a b15 : poids faibles nombre de pistes max . b6 et b7 : poids forts nombre de pistes max . b0 a b5 : nombre max de secteurs/piste - DH = nombre de tetes max - DL = nombre d'unites reconnues - BH = 00H - BL = b4 a b7 = 0 b0 a b3 = type de l'unite declaree dans la CMOS -Si le type declare dans la CMOS est inconnu (type ou CMOS invalide) ou si le lecteur est invalide - ES = AX = BX = CX = DX = DI = 00H - DL = nombre d'unites -S'il n'y a aucune unite de disquette - ES = AX = BX = CX = DX = DI = 00H AH = 15H : Lecture type de l'unite - Entree : rien - Sortie : Le drapeau de retenue CF du registre d'etat du 80286 est a zero si l'operation s'est bien deroulee ; sinon il est a 1 et le registre AH contient le code d'erreur (voir fonction 01H).

    - CF = 0 et AH = . 00H si pas d'unite . 01H unite sans temoin de changement disquette (DSKCHG) . 02H unite avec temoin de changement disquette (DSKCHG) AH = 16H : Etat de la ligne temoin DSKCHG (changement disquette) - Entree : rien - Sortie : - CF = 0 et AH = 00H si ligne inactive - CF = 1 et AH = 06H si ligne active (nouvelle disquette).

    AH = 17H : Declaration du type de couple disquette/unite pour formatage - Entree : - DL = nx de l'unite (0 ou 1) - AL = . 1 : disquette 320/360 ko dans unite 360 ko . 2 : disquette 360 ko dans unite 1,2 Mo . 3 : disquette 1,2 Mo dans unite 1,2 Mo . 4 : disquette 720 ko dans unite 720 ko - Sortie : Le drapeau de retenue CF du registre d'etat du 80286 est a zero si l'operation s'est bien deroulee ; sinon il est a 1 et le registre AH contient le code d'erreur (voir fonction 01H).

    AH = 18H : Declaration du type disquette pour formatage - Entree : - DL = nx de l'unites (0 ou 1) - CX = . b8 a b15 : poids faibles nombre de pistes max . b6 et b7 : poids forts nombre de pistes max . b0 a b5 : nombre max de secteurs/piste - Sortie : . CF = 0 et AH = 00H : la valeur de CX en entree est geree et (ES:DI) = pointeur de la table des parametres interne . CF = 1 et AH = 0CH : la valeur de CX en entree n'est pas geree

    INT42H = Reserve

    Le BIOS utilise l'interruption 42H pour revectoriser la fonction INT10H.

    INT43H = Table des caracteres graphiques

    Quand la video de la carte mere est validee, le BIOS utilise ce vecteur pour pointer la zone donnees contenant les caracteres en mode graphique. Cette table est utilisee pour les 128 premiers caracteres pour les modes 4, 5 et 6. Cette table est aussi uti lisee pour les 256 caracteres dans les modes D, E, F, 10, 11 et 13.

    INT41H = Parametres 1xunite de disques interne

    INT46H = Parametres 2xunite de disques interne

    Ce pointeur fournit l'adresse des parametres necessaires pour le fonctionnement de l'unite de disques.

    A la mise sous tension du systeme, le vecteur est initialise pour pointer la zone de parametres dans la ROM, si la CMOS est valide.

    Le code du type d'unite de disques contenu dans la RAM CMOS est utilise pour selecter le pointeur.

    L'utilisation d'un type de disque non repertorie necessite la modification de ces parametres.

    Table des parametres : 00 1 mot Nombre maximum de cylindres 02 1 octet Nombre maximum de tetes 03 1 mot Non utilise 05 1 mot Cylindre de depart de la precompensation en ecriture 07 1 octet Longueur maximum de l'ECC 08 1 octet Octet de controle 09 3 octets Non utilise 12 1 mot Zone d'atterrissage tete 14 1 octet Nombre de secteurs par piste 15 1 octet Reserve pour une utilisation future Pour modifier ces parametres, il faut construire une table et placer l'adresse de la table dans la zone memoire pointee par le vecteur INT41H ou INT46H.

    INT4AH = traitement alarme utilisateur

    Cette interruption est appelee par le programme de traitement de l'interruption materielle IRQ8 (INT70H), provoquee par l'alarme (armee par la fonction 06H de INT1AH).

    Cette interruption pointe sur IRET a la mise sous tension.

    INT70H = Interruption horloge-dateur (IRQ8)

    Cette routine est appelee par l'horloge-dateur 146818 ; a chaque detection d'alarme un signal d'interruption IRQ8 est genere ; l'alarme est armee par la fonction 06H de INT1AH.

    Pour une alarme de type evenement, un compteur (aux adresses 00049CH et 00049DH) est decremente a chaque interruption de type evenement ; un drapeau b7 de l'octet pointe par l'adresse en 000498H:00049AH est positionne a la fin du comptage.

    Cette interruption appelle l'interruption INT4AH.

    INT71H = Interruption relais nx2 du 8259 esclave

    Cette routine est appelee par une interruption de type IRQ9 (niveau IRQ1 du 8259 esclave) ; elle se connecte sur INT0AH (gestion de l'interruption IRQ2 du 8259 maitre).

    Elle permet d'emuler l'interruption IRQ2 des unites centrales de type PCXT, afin d'assurer la compatibilite des logiciels utilisant cette interruption.

    INT75H = Interruption du 80287

    Cette routine est appelee par une interruption de type IRQ13 (niveau IRQ5 du 8259 esclave) ; elle se connecte sur INT02H pour executer le programme de gestion NMI, afin d'assurer une compatibilite du traitement coprocesseur avec les machines 8086 de type PCXT ou equivalent.

    INT76H = Interruption controleur disque

    Cette routine est appelee par une interruption de type IRQ14 (niveau IRQ6 du 8259 esclave) ; elle se connecte sur la fonction 91H de INT15H pour un traitement eventuel multi-tache.