Les Secrets du 80287

1. Caracteristiques

Le microprocesseur 80287 est le coprocesseur mathematique du microprocesseur 80286.

Il etend le nombre de registres et le jeu d'instructions du 80286. Les registres et instructions du 80287 sont specialises dans le calcul en virgule flottante, arithmetique et transcendantal.

Le coprocesseur mathematique 80287 fonctionne comme un peripherique du 80286. Il repond aux adresses Entrees/Sorties 00F1H, 00F8H, 00FAH, 00FCH de facon transparente pour l'utilisateur. Caracteristiques

  • horloge commune avec le 80286(-12) : 16 ou 24 MHz (divisee par trois en interne),
  • boitier standard DIL 40 broches,
  • technologie HMOS canal N,
  • alimentation unique +5V,
  • instructions compatibles avec celles du 8087 et de la famille 8086,
  • fonctionnement compatible avec le 80286 ou 80386 (mode reel et protege),
  • compatibilite format virgule flottante IEEE754,
  • le gain de temps pour l'execution d'une operation arithmetique est de l'ordre de 100 par rapport a la vitesse d'execution du 80286,
  • plus de 60 instructions supplementaires reparties en six groupes : transferts de donnees, arithmetiques, logiques, trigonometriques et logarithmiques, constantes, controle du processeur,
  • 8 registres supplementaires, 80 bits, organises en pile,
  • 7 types de donnees,
  • fonctionnement en mode reel et protege.

    2. Organisation interne

    Le 80287 se compose de deux parties qui travaillent en partie independamment :

    Le BIU (Bus Interface Unit = unite d'interface bus) et le NEU (Numeric Execution Unit = unite d'execution numerique).

  • BIU : Lorsque le 80286 decode une instruction de type mathematique, il transmet les informations necessaires (code operation, adresse des operandes,...) au 80287 a travers les ports d'entrees/sorties reserves 00F8H, 00FAH, 00FCH ; ces operations sont transparentes pour l'utilisateur. Si l'instruction est une instruction administrative, le BIU l'execute independamment du NEU. Le BIU genere les signaux BUSY* et ERROR* pour la synchronisation et la notification d'erreur respectivement.
  • NEU : Execute toutes les instructions concernant la pile des registres de calcul. Le decodage d'une instruction numerique du 80287 ne peut commencer tant que le NEU n'a pas termine l'operation en cours. Ceci necessite une synchronisation logiciel avec l'instruction WAIT (test de la sortie BUSY du 80287).

    Le 80287 ne peut pas executer plusieurs instructions a la fois. Quand une instruction de type mathematique survient, le 80286 test sa broche d'entree BUSY* et attend que le coprocesseur soit libre d'accepter cette instruction. Une fois l'instruction mathematique transmise au 80287, le 80286 continue l'execution de son programme tandis que le coprocesseur execute son instruction. L'instruction 80286 WAIT permet de synchroniser le programme 80286 avec la fin de l'execution de l'instruction du 80287 ; elle met le 80286 en etat d'attente tant que BUSY est actif ; elle est obligatoire et immediatement consecutive pour une instruction mathematique de transfert memoire (une autre instruction mathematique consecutive a le meme effet).

    3. Registres internes

    
              80286                         80287
                                            PILE                     etat
         15    8 7    0       79  78        64 63               0    1 0
         |------|------|    |----|------------|------------------|  |---|
       AX|  AH  |  AL  |  R1|SIGN|  EXPOSANT  |      MANTISSE    |  |   |
         ---------------    --------------------------------------  -----
       BX|  BH  |  BL  |  R2|    |            |                  |  |   |
         ---------------    --------------------------------------  -----
       CX|  CH  |  CL  |  R3|    |            |                  |  |   |
         ---------------    --------------------------------------  -----
       DX|  DH  |  DL  |  R4|    |            |                  |  |   |
         |------|------|    --------------------------------------  -----
         |-------------|  R5|    |            |                  |  |   |
       SI|Source Index |    --------------------------------------  -----
         ---------------  R6|    |            |                  |  |   |
       DI| Dest. Index |    --------------------------------------  -----
         |-------------|  R7|    |            |                  |  |   |
         |-------------|    --------------------------------------  -----
       BP|Base Pointeur|  R8|    |            |                  |  |   |
         ---------------    |----|------------|------------------|  |---|
       SP|Stack Point. |     15          0
         ---------------    |-------------|
       IP|Inst. Point. |    |REG. CONTROLE|
         |-------------|    ---------------
         |-------------|    | REG. D'ETAT |
       CS|             |    ---------------
         ---------------    |REG. INDICAT.|
       DS|             |    ---------------
         ---------------    |  POINTEUR   |
       ES|             |    --           --
         ---------------    |D'INSTRUCTION|
       SS|             |    ---------------
         |-------------|    |  POINTEUR   |
         |-------------|    --           --
    FLAGS| Indicateurs |    |  DE DONNEES |
         ---------------    |-------------|
      MSW| Mach. Status|
         |-------------|
    
              - Registres internes 80286/80287
    

    Le 80287 dispose des registres suivants :

    8 registres de calcul organises en pile (ST(0) a ST(7))

    Chaque registre comporte 80 bits. Le registre courant est celui qui est pointe par le pointeur de registre (voir registre d'etat) c'est lui qui contient le premier operande de l'instruction numerique.

    1 registre d'etat

    
    |---------------------------------------------------------------|
    |                  REGISTRE D'ETAT                              |
    ----|---|---|---|---|---|---|---|---|---|---|---|---|---|---|----
    |b15|b14|b13|b12|b11|b10|b9 |b8 |b7 |b6 |b5 |b4 |b3 |b2 |b1 |b0 |
    ------------|---|------------------------------------------------
    | B |C3 |    ST     |C2 |C1 |C0 |IR | X |PE |UE |OE |ZE |DE |IE |
    |---|---|-----------|---|---|---|---|---|---|---|---|---|---|---|
    

    Definition d'une exception : c'est un evenement particulier qui se produit au cours de l'execution d'une instruction numerique (concernant les registres de calculs).

    L'appellation "exception" n'implique pas forcement un aspect catastrophique a l'evenement.

    Les indicateurs suivants signalent par l'etat 1 une exception. Ces indicateurs restent a 1 tant qu'ils ne sont pas forces a zero par une des instructions destinees a cet usage.

  • IE : (Invalid operation Exception) indique une operation invalide.
  • DE : (Denormalised operand Exception) indique la presence d'un nombre denormalise.
  • ZE : (Zerodivide Exception) indique une division par 0
  • OE : (Overflow Exception) indique un depassement positif de capacite.
  • UE : (Underflow Exception) indique un depassement negatif de capacite.
  • PE : (Precision Exception) Indique qu'un arrondi a ete effectue en cours de calcul. Cet evenement peut etre frequent.
  • IR : (Interrupt Request) IR = 1 indique qu'une interruption est demandee ou va etre demandee au 80286.
  • C3, C2, C1, C0 : Indicateurs de conditions. Ils indiquent le resultat d'une instruction de comparaison ou de l'instruction FPREM. La signification des indicateurs depend de l'instruction realisee.
    |------------|--|--|--|--|---------------|
    |instruction |C3|C2|C1|C0| Interpretation|
    ------------------------------------------
    |            | 0| 0| X| 0|ST(0)>srce ou 0|
    |FCOM, FCOMP | 0| 0| X| 1|ST(0)<srce ou 0|
    |FCOMPP, FTST| 1| 0| X| 0|ST(0)=srce ou 0|
    |            | 1| 1| X| 1|non comparables|
    ------------------------------------------
    |  FPREM     |Q1| 0|Q0|Q2|si resultat    |
    |            |  |  |  |  |Q2-Q0=lsb mant.|
    ------------------------------------------
    |  FXAM      | 0| 0| 0| 0|non normalise>0|
    |            | 0| 0| 0| 1|pas un nombre>0|
    |            | 0| 0| 1| 0|non normalise<0|
    |            | 0| 0| 1| 1|pas un nombre<0|
    |            | 0| 1| 0| 0|normalise>0    |
    |            | 0| 1| 0| 1|+l             |
    |            | 0| 1| 1| 0|normalise<0    |
    |            | 0| 1| 1| 1|-l             |
    |            | 1| 0| 0| 0|0 positif      |
    |            | 1| 0| 0| 1|registre libre |
    |            | 1| 0| 1| 0|0 negatif      |
    |            | 1| 0| 1| 1|registre libre |
    |            | 1| 1| 0| 0|denormalise>0  |
    |            | 1| 1| 0| 1|registre libre |
    |            | 1| 1| 1| 0|denormalise>0  |
    |            | 1| 1| 1| 1|registre libre |
    |------------|--|--|--|--|---------------|
    
  • ST : (Stack Top) C'est le pointeur (de 3 bits) qui pointe sur le registre de calcul courant. Ce pointeur vaut entre 0 et 7. Son incrementation ou sa decrementation se fait circulairement. Les indicateurs suivants concernent les exceptions.
  • B : (Busy) indique qu'une instruction numerique (concernant les registres de calcul) est en cours d'execution (B=1), ou non (B=0).

    1 registre de contrôle

    |---------------------------------------------------------------|
    |                  REGISTRE DE CONTROLE                         |
    ----|---|---|---|---|---|---|---|---|---|---|---|---|---|---|----
    |b15|b14|b13|b12|b11|b10| b9| b8| b7| b6| b5| b4| b3| b2| b1| b0|
    ----|---|-----------|-------|------------------------------------
    |           | IC|   RC  |   PC  | M | X | PM| UM| OM| ZM| DM| IM|
    |-----------|-----------|-------|---|---|---|---|---|---|---|---|
    
  • IC : (Infinity Control) le 80287 gere les infinis selon un des deux modes :
    IC = 1 infinis signes (+infini et -infini sont distincts), ou IC = 0 infinis non signes (+infini et -infini ne sont pas distingues).
  • RC : (Rounding Control) au cours d'une instruction numerique l'eventuel arrondi du au nombre fini de bits de la mantisse, se fait selon l'un des quatre modes : -00 = arrondi au nombre representable le plus proche. -01 = arrondi au nombre representable inferieur. -10 = arrondi au nombre representable superieur. -11 = arrondi a l'entier inferieur en valeur absolue.
  • PC : (Precision Control) le nombre de bits significatifs de la mantisse est fixe comme suit : -11 = mantisse de 64 bits. C'est la precision qu'offre les registres du 80287. -10 = mantisse de 53 bits (les 11 autres a 0) -00 = mantisse de 24 bits (les 40 autres a 0)
    Ces deux derniers formats sont presents afin de repondre aux exigences de la norme IEEE, et pour conserver une comptabilite avec certains langages de programmations.
    La diminution de precision n'augmente pas significativement la vitesse d'execution du 80287.

    Les bits du registre de controle suivants sont les masques des exceptions. Si un masque est a 1, l'exception correspondante est ignoree par le systeme de demandes d'interruptions.

  • PM : (Precision Mask) masque de l'exception arrondi (PE)
  • UM : (Underflow Mask) masque de l'exception Underflow (UE)
  • OM : (Overflow Mask) masque de l'exception Overflow (OE)
  • ZM : (Zerodivide Mask) masque de l'exception Division par zero (ZE)
  • DM : (Denormalised operand Mask) masque de l'exception operande denormalise (DE)
  • IM : (Invalid operation Mask) masque de l'exception operation invalide (IE)

    1 registre indicateurs (TAGS)

    Il donne l'etat des registres de calcul.

    |---------------------------------------------------------------|
    |                  REGISTRE INDICATEURS TAGS                    |
    ----|---|---|---|---|---|---|---|---|---|---|---|---|---|---|----
    |b15|b14|b13|b12|b11|b10| b9| b8| b7| b6| b5| b4| b3| b2| b1| b0|
    ----|-------|-------|-------|-------|-------|-------|-------|----
    | TAG(7)| TAG(6)| TAG(5)| TAG(4)| TAG(3)| TAG(2)| TAG(1)| TAG(0)|
    |-------|-------|-------|-------|-------|-------|-------|-------|
    

    Valeurs des TAGS :

  • 00 : Contenu valide (nombre normalise ou non normalise). Registre en cours d'utilisation.
  • 01 : Contenu nul. Registre en cours d'utilisation.
  • 10 : Contenu "special" (Not A Number, l, ou nombre denormalise). Registre en cours d'utilisation.
  • 11 : Registre libre.

    1 registre pointeur d'instruction

  • 32 bits en mode protege. Il contient l'adresse virtuelle de l'instruction ESC en cours.
  • 20 bits en mode reel. Il contient l'adresse sur 20 bits de l'instruction ESC en cours. Les 12 bits restants contiennent le code instruction.
    
            Mode protege                     Mode reel
    15                        0    15      12   10              0
    |-------------------------|    |----------------------------| |
    |POINTEUR D'INSTRUCTION IP|    |  POINTEUR D'INSTRUCTION IP | |adresse
    ---------------------------    ----------|-|----------------- -instruction
    |       CS SELECTEUR      |    |P.D'I. IP|0|CODE INSTRUCTION| |
    ---------------------------    ----------|-|-----------------
    |    ADRESSE EFFECTIVE    |    |  POINTEUR D'ADRESSE        | |adresse
    ---------------------------    ----------|------------------- -donnee
    |         SELECTEUR       |    |P.D'ADRES|       0          | |
    |-------------------------|    |---------|------------------| |
    

    1 pointeur de donnee

  • 32 bits en mode protege. Il contient l'adresse virtuelle de l'operande.
  • 20 bits en mode reel. Il contient l'adresse sur 20 bits de l'operande. Les 12 bits restants sont a zero.

    4. Jeux d'instructions

    Le 80287 opere sur sept types de donnees :

    |------------|-------------|---------|--------------------------------|
    |            |Prec. en bits| Chiffres|         Plage de               |
    |     FORMAT -------|-------Signifi- |          calcul                |
    |            |Mantis|Exposa|catifs   |         (decimal)              |
    -------------|------|------|---------|---------------------------------
    |                   ENTIERS BINAIRES                                  |
    -------------|-------------|---------|---------------------------------
    |Entier court|      16     |   4-5   |      -32768<Xs32767            |
    |Entier moyen|      32     |   9-10  |      -2.10exp9<Xs2.10exp9      |
    |Entier long |      64     |  19-20  |      -9.10exp18<Xs9.10exp18    |
    -------------|-------------|---------|---------------------------------
    |                   ENTIERS DECIMAUX                                  |
    -------------|-------------|---------|---------------------------------
    |BCD         |      72     |    18   |      -99..99sXs+99..99         |
    -------------|-------------|---------|---------------------------------
    |                        REELS                                        |
    -------------|------|------|---------|---------------------------------
    |Reel court  |  24  |   8  |   6-7   |  1,2.10exp-38s|X|s3,4.10exp38  |
    |Reel long   |  53  |  11  |  15-16  | 2,3.10exp-308s|X|s1,7.10exp308 |
    |Reel tempor.|  64  |  15  |  19-20  |3,4.10exp-4932s|X|s1,1.10exp4932|
    |------------|------|------|---------|--------------------------------|
    

    Le coprocesseur comporte 69 instructions regroupees en six types :

  • transferts de donnees,
  • fonctions arithmetiques,
  • comparaisons,
  • constantes,
  • fonctions transcendantales,
  • controle du processeur.
    
    |-|--------------------------------------------------|
    |1|INSTRUCTIONS DE TRANSFERT                         |
    | -------------------|--------------------------------
    | |FLD,FST,FSTP,FXCH |Charg.,decharg.,echange        |
    ---------------------|--------------------------------
    |2|INSTRUCTIONS ARITHMETIQUES                        |
    | -------------------|--------------------------------
    | |FADD,FSUB         |Addition, soustraction         |
    | |FMUL,FDIV         |Multiplication, division       |
    | |FSQRT,FSCALE      |Racine carree,ST(0)*2ST1       |
    | |FPREM,FRNDINT     |Reste de ST(0)/ST(1),arrondi   |
    | |FXTRACT           |Exposant                       |
    | |FABS,FCHS         |Valeur absolue,change signe    |
    ---------------------|--------------------------------
    |3|INSTRUCTIONS DE COMPARAISON                       |
    | -------------------|--------------------------------
    | |FCOM              |Comparaison avec ST(0)         |
    | |FCOMPP            |Comparaison de ST(0) et ST(1)  |
    | |FTST,FXAM         |Compare ST(0) et 0, test ST(0) |
    ---------------------|--------------------------------
    |4|INSTRUCTIONS DE CHARGEMENT D'UNE CONSTANTE        |
    | -------------------|--------------------------------
    | |FLDZ,FLD1,FLDPI,  |0,1,c                          |
    | |FLDL2T,FLDL2E     |log210,log2e                   |
    | |FLDLG2,FLDLN2     |log10e,Loge2                   |
    ---------------------|--------------------------------
    |5|INSTRUCTIONS TRANSCENDANTALES                     |
    | -------------------|--------------------------------
    | |FPTAN,FPATAN      |Tangente,arctangente           |
    | |F2XM1,FYL2X       |2ST(0)-1,ST(1)*log2ST(0)       |
    | |FYL2XP1           |ST(1)*log2(ST(0)+1)            |
    ---------------------|--------------------------------
    |6|INSTRUCTIONS DE CONTROLE DU PROCESSEUR            |
    | -------------------|--------------------------------
    | |FINIT,FSETPM      |Initialise,mode protege        |
    | |FSTSWAX,FLDCW     |Sauveg. et charg. mot controle |
    | |FSTSW,FCLEX       |Sauveg. etat,efface exceptions |
    | |FSTENV,FLDENV     |Sauveg. et charg. environnement|
    | |FSAVE,FRSTOR      |Sauveg. et charg. generale     |
    | |FINCSTP,FDECSTP   |Incremente,decremente pile     |
    | |FFREE,FNOP        |Libere ST(i),pas d'operation   |
    |-|------------------|-------------------------------|
    

    5. Signaux d'entrees-sorties 80287

    
               |------| |------|
            nc -1     |-|    40-
            nc -2    80287   39- CKM
            nc -3            38- nc
            nc -4            37- nc
           D15 -5            36- PEACK*
           D14 -6            35- RESET
           D13 -7            34- NPCS1*
           D12 -8            33- NPCS2
           Vcc -9            32- CLK
           Vss -10           31- CMD1
           D11 -11           30- Vss
           D10 -12           29- CMD0
            nc -13           28- NPWR*
            D9 -14           27- NPRD*
            D8 -15           26- ERROR*
            D7 -16           25- BUSY*
            D6 -17           24- PEREQ
            D5 -18           23- D0
            D4 -19           22- D1
            D3 -20           21- D2
               |---------------|
    
               - Brochage du 80287
    
  • BUSY* : Cette sortie indique que le 80287 est en cours d'execution d'une instruction numerique (BUSY* =0). Ce signal est envoye sur l'entree BUSY* du 80286 afin de permettre la synchronisation logiciel avec une instruction de type ESCape ou WAIT.
  • CLK : Entree signal d'horloge (meme horloge que le 80286).
  • CKM : (CLocK Mode) Entree mode d'utilisation de l'horloge CLK. A zero CLK est divisee par trois ; a 1 elle est utilisee directement.
  • CMD0, CMD1 : (CoMmaD) Entrees de commande utilisees en conjonction avec les entrees de selection NPCS1* et NPCS2. Elles autorisent la commande du coprocesseur par le systeme.
  • D0 a D15 : Bus de donnees 16 bits bidirectionnel.
  • ERROR* : Cette sortie indique qu'une condition d'erreur non masquable est active ; ce signal reflete l'etat du bit ES dans le registre d'etat.
  • NPRD* : (Numeric Processor ReaD) Entree de commande de sortie d'une donnee du 80287.
  • NPCS1*, NPCS2 : (Numeric Processor Selects) Entrees de validation du coprocesseur.
  • NPWR* : (Numeric Processor Write) Entree de commande d'ecriture d'une donnee dans le 80287.
  • PEACK* : (Processor Extension data channel operand transfert ACKnowledge) Entree accuse reception de la prise en compte du signal PEREQ. Ce signal desactive la ligne PEREQ s'il n'y a plus d'autre transfert demande.
  • PEREQ : (Processor Extension data channel operand transfert REQuest) Cette sortie indique que le 80287 est pret pour le transfert d'une donnee.
  • RESET : Entree d'initialisation (4 cycles CLK minimum).
  • Vcc : Alimentation +5V.
  • Vss : Masse alimentation.

    6. Mise en oeuvre du 80287

    Le 80286 transmet automatiquement au 80287 les instructions de type ESC, si le bit MP du registre d'etat machine MSW est positionne a 1 ; dans le cas contraire, si le bit EM de ce meme registre est a 1, l'instruction peut etre emulee par le 80286 (si l'interruption INT07H est traitee).

    Le coprocesseur travaille en parallele avec le microprocesseur ; la synchronisation entre les processeurs est effectuee apres decodage de l'instruction WAIT par le 80286.
    L'execution de cette instruction provoque l'attente du processeur 80286 sur l'entree BUSY*.
    Cette broche est reliee a la borne BUSY* du 80287 ; il signale la fin de l'execution de l'instruction courante.

    Le coprocesseur detecte 6 conditions d'exception differentes qui peuvent se produire en cours d'execution.
    Si l'exception appropriee est validee (voir registre de controle du 80287), le 80287 active le signal NPERR* (sortie ERROR*). Ce signal genere une interruption du niveau IRQ13 et force le signal BUSY du coprocesseur a rester a l'etat BUSY. Une instruction 80286 OUT 00H a l'adresse 00F0H permet de remettre a zero ce signal en cas d'erreur du coprocesseur. Le traitement de l'interruption IRQ13 par le BIOS remet a zero le signal BUSY et se branche a l'adresse pointee par le vecteur d'interruption NMI (compatibilite PC/XT). La routine de traitement du NMI detecte l'origine du NMI 80287 et le traite en consequence.
    Un reset materiel ou une instruction OUT a l'adresse 00F1H met le coprocesseur en mode reel. Il peut etre place en mode protege avec l'instruction FSETPM du coprocesseur. Il retournera en mode reel par une instruction OUT 00H a l'adresse 00F1H.

    Instructions 80287

    
    octet|octet poids faible
    poids|    0      1      2      3      4      5      6      7
    fort -------|------|------|------|------|------|------|-------
         |FADD  |FMUL  |FCOM  |FCOMP |FSUB  |FSUBR |FDIV  |FDIVR |
       D8|mem4r |mem4r |mem4r |mem4r |mem4r |mem4r |mem4r |mem4r |
         ---------------------------------------------------------
         |FLD   |      |FST   |FSTP  |FLDENV|FLDCW |FSTENV|FSTCW |
       D9|mem4r |      |mem4r |mem4r |mem14 |mem2i |mem14 |mem21 |
         ---------------------------------------------------------
         |FIADD |FIMUL |FICOM |FICOMP|FISUB |FISUBR|FIDIV |FIDIVR|
       DA|mem4i |mem4i |mem4i |mem4i |mem4i |mem4i |mem4i |mem4i |
         ---------------------------------------------------------
         |FILD  |      |FIST  |FISTP |      |FLD   |      |FSTP  |
       DB|mem4i |      |mem4i |mem4i |      |mem10r|      |mem10r|
         ---------------------------------------------------------
         |FADD  |FMUL  |FCOM  |FCOMP |FSUB  |FSUBR |FDIV  |FDIVR |
       DC|mem8r |mem8r |mem8r |mem8r |mem8r |mem8r |mem8r |mem8r |
         ---------------------------------------------------------
         |FLD   |      |FST   |FSTP  |FRSTOR|      |FSAVE |FSTSW |
       DD|mem8r |      |mem8r |mem8r |mem94 |      |mem94 |mem2i |
         ---------------------------------------------------------
         |FIADD |FIMUL |FICOM |FICOMP|FISUB |FISUBR|FIDIV |FIDIVR|
       DE|mem2i |mem2i |mem2i |mem2i |mem2i |mem2i |mem2i |mem2i |
         ---------------------------------------------------------
         |FILD  |      |FIST  |FISTP |FBLD  |FILD  |FBSTP |FISTP |
       DF|mem2i |      |mem2i |mem2i |mem10d|mem8i |mem10d|mem8i |
    ------------|------|------|------|------|------|------|-------
    
    
    
    
    octet|octet poids faible
    poids|  C0+j     C8+j     D0+j   D8+j   E0+j     E8+j     F0+j     F8+j
    fort ---------|--------|------|------|--------|--------|--------|---------
         |FADD    |FMUL    |FCOM  |FCOMP |FSUB    |FSUBR   |FDIV    |FDIVR   |
       D8|ST,ST(i)|ST,ST(i)|ST(i) |ST(i) |ST,ST(i)|ST,ST(i)|ST,ST(i)|ST,ST(i)|
         ---------------------------------------------------------------------
         |FLD     |FXCH    |FNOP  |      |groupe 1|FLDcon  |groupeF0|groupeF8|
       D9|ST(i)   |ST(i)   |(D0)  |      |        |        |        |        |
         ---------------------------------------------------------------------
         |        |        |      |      |        |        |        |        |
       DA|        |        |      |      |        |        |        |        |
         ---------------------------------------------------------------------
         |        |        |      |      |Controle|        |        |        |
       DB|        |        |      |      |        |        |        |        |
         ---------------------------------------------------------------------
         |FADD    |FMUL    |      |      |FSUB    |FSUBR   |FDIV    |FDIVR   |
       DC|ST(i),ST|ST(i),ST|      |      |ST(i),ST|ST(i),ST|ST(i),ST|ST(i),ST|
         ---------------------------------------------------------------------
         |FFREE   |        |FST   |FSTP  |        |        |        |        |
       DD|ST(i)   |        |ST(i) |ST(i) |        |        |        |        |
         ---------------------------------------------------------------------
         |FADDP   |FMULP   |      |FCOMPP|FSUBRP  |FSUBP   |FDIVRP  |FDIVP   |
       DE|ST(i),ST|ST(i),ST|      |(D9)  |ST(i),ST|ST(i),ST|ST(i),ST|ST(i),ST|
         ---------------------------------------------------------------------
         |        |        |      |      |FSTSW AX|        |        |        |
       DF|        |        |      |      |(E0)    |        |        |        |
    --------------|--------|------|------|--------|--------|--------|---------
    
    
    
    |--------|------|-------|-------|-------|-------|-------|-------|-------|
    |j=      | 0    | 1     | 2     | 3     | 4     | 5     | 6     | 7     |
    -------------------------------------------------------------------------
    |controle|      |       |FCLEX  |FINIT  |FSETPM |       |       |       |
    |        |      |       |       |       |       |       |       |       |
    -------------------------------------------------------------------------
    |groupe 1|FCHS  |FABS   |       |       |FTST   |FXAM   |DIV    |IDIV   |
    |        |      |       |       |       |       |       |       |       |
    -------------------------------------------------------------------------
    |groupeF0|F2XM1 |FYL2X  |FPTAN  |FPATAN |FXTRACT|FDECSTP|FINCSTP|       |
    |        |      |       |       |       |       |       |       |       |
    -------------------------------------------------------------------------
    |groupeF8|FPREM |FYL2XP1|FSQRT  |       |FRNDINT|FSCALE |       |       |
    |        |      |       |       |       |       |       |       |       |
    |--------|------|-------|-------|-------|-------|-------|-------|-------|
    
    

    Transfert de donnees

    Ces instructions concernent principalement l'entree et la sortie des donnees dans le registre superieur ST(0) de la pile.
    FLD : Chargement d'un operande dans le registre courant de la pile.
                          1er OCTET          2eme OCTET        3e OCT. 4e OCT.
                        |---------------|----------------------|------|------|
    . Entier ou reel,   |ESCAPE  MF   1 | MOD  0  0  0   R/M   | LSB  | MSB  |
      memoire vers ST(0)|---------------|----------------------|------|------|
                        |---------------|----------------------|------|------|
    . Entier long,      |ESCAPE 1  1  1 | MOD  1  0  1   R/M   | LSB  | MSB  |
      memoire vers ST(0)|---------------|----------------------|------|------|
                        |---------------|----------------------|------|------|
    . Reel temporaire,  |ESCAPE 0  1  1 | MOD  1  0  1   R/M   | LSB  | MSB  |
      memoire vers ST(0)|---------------|----------------------|------|------|
                        |---------------|----------------------|------|------|
    . BCD,memoire vers  |ESCAPE 1  1  1 | MOD  1  0  0   R/M   | LSB  | MSB  |
      ST(0)             |---------------|----------------------|------|------|
                        |---------------|----------------------|
    . ST(i) vers ST(0)  |ESCAPE 0  0  1 |1  1  0  0  0   ST(i) |
                        |---------------|----------------------|
    
    FST : Stockage du registre courant
                        |---------------|----------------------|------|------|
    . Entier ou reel,   |ESCAPE  MF   1 | MOD  0  1  0   R/M   | LSB  | MSB  |
      ST(0) vers memoire|---------------|----------------------|------|------|
                        |---------------|----------------------|
    . ST(0) vers ST(i)  |ESCAPE 1  0  1 |1  1  0  1  0   ST(i) |
                        |---------------|----------------------|
    
    FSTP : Stockage du registre courant et incrementation du pointeur registre
    courant ST(0).
                        |---------------|----------------------|------|------|
    . Entier ou reel,   |ESCAPE  MF   1 | MOD  0  1  1   R/M   | LSB  | MSB  |
      ST(0) vers memoire|---------------|----------------------|------|------|
                        |---------------|----------------------|------|------|
    . Entier long,      |ESCAPE 1  1  1 | MOD  1  1  1   R/M   | LSB  | MSB  |
      ST(0) vers memoire|---------------|----------------------|------|------|
                        |---------------|----------------------|------|------|
    . Reel temporaire,  |ESCAPE 0  1  1 | MOD  1  1  1   R/M   | LSB  | MSB  |
      ST(0) vers memoire|---------------|----------------------|------|------|
                        |---------------|----------------------|------|------|
    . BCD, ST(0)        |ESCAPE 1  1  1 | MOD  1  1  0   R/M   | LSB  | MSB  |
      vers memoire      |---------------|----------------------|------|------|
                        |---------------|----------------------|
    . ST(0) vers ST(i)  |ESCAPE 1  0  1 |1  1  0  1  1   ST(i) |
                        |---------------|----------------------|
    
    FXCH : Echange des contenus du registre courant ST(0) avec ST(i)
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  0  0  1   ST(i) |
                        |---------------|----------------------|
    

    Instructions de comparaison :

    FCOM : Comparaison du contenu du registre courant ST(0) avec operande.
                        |---------------|----------------------|------|------|
    . Entier ou reel,   |ESCAPE  MF   0 | MOD  0  1  0   R/M   | LSB  | MSB  |
      memoire vers ST(0)|---------------|----------------------|------|------|
                        |---------------|----------------------|
    . ST(i) avec ST(0)  |ESCAPE 0  0  0 |1  1  0  1  0   ST(i) |
                        |---------------|----------------------|
    
    FCOMP : Identique a FCOM + incrementation du pointeur du registre courant.
                        |---------------|----------------------|------|------|
    . Entier ou reel,   |ESCAPE  MF   0 | MOD  0  1  1   R/M   | LSB  | MSB  |
      memoire avec ST(0)|---------------|----------------------|------|------|
                        |---------------|----------------------|
    . ST(i) avec ST(0)  |ESCAPE 0  0  0 |1  1  0  1  1   ST(i) |
                        |---------------|----------------------|
    
    FCOMPP : Identique a FCOM + double incrementation du pointeur du registre
    courant.
                        |---------------|----------------------|
    . ST(i)             |ESCAPE 1  1  0 |1  1  0  1  1  0  0  1| = DED9H
      avec ST(0)        |---------------|----------------------|
    
    FTST : Comparaison du registre courant avec  .
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  0  0  1  0  0| = D9E4H
                        |---------------|----------------------|
    
    FXAM : Examen des indicateurs du registre courant.
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  0  0  1  0  1| = D9E5H
                        |---------------|----------------------|
    
    

    Instructions de chargement d'une constantes : (en format reel temporaire)

    FLDZ : Chargement de 0.0 dans ST(0)
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  0  1  1  1  0| = D9EEH
                        |---------------|----------------------|
    
    FLD1 : Chargement de 1.0 dans ST(0)
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  0  1  0  0  0| = D9E8H
                        |---------------|----------------------|
    
    FLDPI : Chargement de PI dans ST(0)
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  0  1  0  1  1| = D9EBH
                        |---------------|----------------------|
    
    FLDL2T : Chargement de log2(10) dans ST(0)
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  0  1  0  0  1| = D9E9H
                        |---------------|----------------------|
    
    FLDL2E : Chargement de log2(e) dans ST(0)
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  0  1  0  1  0| = D9EAH
                        |---------------|----------------------|
    
    FLDLG2 : Chargement de log10(2) dans ST(0)
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  0  1  1  0  0| = D9ECH
                        |---------------|----------------------|
    
    FLDLN2 : Chargement de Loge(2) dans ST(0)
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  0  1  1  0  1| = D9EDH
                        |---------------|----------------------|
    

    Fonctions arithmetiques

    FADD, FADDP*, FIADD : Destination <-- (ST(0)) + operande
                        |---------------|----------------------|------|------|
    . Entier ou reel,   |ESCAPE MF    0 | MOD  0  0  0   R/M   | LSB  | MSB  |
     memoire avec ST(0) |---------------|----------------------|------|------|
                        |---------------|----------------------|
    . ST(j) <--         |ESCAPE d  P  0 |1  1  0  0  0   ST(i) |
      ST(0) + ST(i)     |---------------|----------------------|
    
    FSUB, FSUBR**, FSUBP*, FSUBRP, FISUB, FISUBR **:
    (destination) <-- ST(0) - (Source)
                        |---------------|----------------------|------|------|
    . Entier ou reel,   |ESCAPE MF    0 | MOD  1  0  R   R/M   | LSB  | MSB  |
    memoire avec ST(0)  |---------------|----------------------|------|------|
                        |---------------|----------------------|
    . (ST(j)) <--       |ESCAPE d  P  0 |1  1  1  0  R   ST(i) |
     (ST(i))-(ST(0))    |---------------|----------------------|
    
    FMUL, FMULTP*, FIMUL : (destination) <-- (source) x (ST(0))
                        |---------------|----------------------|------|------|
    . Entier ou reel,   |ESCAPE MF    0 | MOD  0  0  1   R/M   | LSB  | MSB  |
    memoire avec ST(0)  |---------------|----------------------|------|------|
                        |---------------|----------------------|
    . (ST(j)) <--       |ESCAPE d  P  0 |1  1  0  0  1   ST(i) |
     (ST(0))x(ST(i))    |---------------|----------------------|
    
    FDIV, FDIVR**, FDIVP*, FDIVRP* **, FIDIV, FIDIVR** :
     (destination) <-- (ST(0)) / (source)
                        |---------------|----------------------|------|------|
    . Entier ou reel,   |ESCAPE MF    0 | MOD  1  1  R   R/M   | LSB  | MSB  |
      memoire avec ST(0)|---------------|----------------------|------|------|
                        |---------------|----------------------|
    . (ST(j)) <--       |ESCAPE d  P  0 |1  1  1  1  R   R/M   |
     (ST(i))/(ST(0))    |---------------|----------------------|
    
    note : * = ST(0) est declare libre et le pointeur ST est incremente
          ** = les deux operandes sont inverses par rapport a l'operation.
    
    FSQRT : ST(0) <-- racine(ST(0))
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  1  1  0  1  0| = D9FAH
                        |---------------|----------------------|
    
    FSCALE : ST(0) <-- ST(0) x 2exp(partie entiere de (ST(1)))
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  1  1  1  0  1| = D9FDH
                        |---------------|----------------------|
    
    FPREM : ST(0) <-- reste de ST(0)/(ST(1))
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  1  1  0  0  0| = D9F8H
                        |---------------|----------------------|
    
    FRNDINT : Partie entiere : ST(0) <-- partie entiere de ST(0)
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  1  1  1  0  0| = D9FCH
                        |---------------|----------------------|
    
    FXTRACT : Extraction de la mantisse et de l'exposant du registre courant :
    incrementation du pointeur de pile : ST(1) contient l'exposant et ST(0) la
    mantisse.
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  1  0  1  0  0| = D9F4H
                        |---------------|----------------------|
    
    FABS : ST(0) <-- |ST(0)|= Valeur absolue
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  0  0  0  0  1| = D9E1H
                        |---------------|----------------------|
    
    FCHS : ST(0) <-- -ST(0) : changement de signe
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  0  0  0  0  0| = D9E0H
                        |---------------|----------------------|
    

    Fonctions transcendentales

    
    FPTAN : Calcul le sinus et cosinus du registre ST(0), incrementation du
    registre pointeur, sinus = ST(0) et cosinus = ST(1), la tangente est
    obtenue par FDIVP ST(1), ST(0).
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  1  0  0  1  0| = D9F2H
                        |---------------|----------------------|
            La tangente est obtenue par FDIVP ST(1), ST(0)
    
    FPATAN : Calcul de l'arctangente, incrementation du registre pointeur ;
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  1  0  0  1  1| = D9F3H
                        |---------------|----------------------|
    
    F2XM1 : ST(0) <-- 2exp(ST(0))  - 1
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  1  0  0  0  0| = D9F0H
                        |---------------|----------------------|
    
    FYL2X : Calcul de ST(1) x log2 |ST(0)|
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  1  0  0  0  1| = D9F1H
                        |---------------|----------------------|
    
    FYL2XP1 : Calcul de ST(1) x log2|ST(0)+1|
                        |---------------|----------------------|
                        |ESCAPE 0  0  1 |1  1  1  1  1  0  0  1| = D9F9H
                        |---------------|----------------------|
    

    Instruction de controle du processeur

    FINIT : initialisation du 80287, equivalent a RESET. Le pointeur de
    registre est force a 0.
                        |---------------|----------------------|
                        |ESCAPE 0  1  1 |1  1  1  0  0  0  1  1| = DBE3H
                        |---------------|----------------------|
    
    FSETPM : Passage en mode protege.
                        |---------------|----------------------|
                        |ESCAPE 0  1  1 |1  1  1  0  0  1  0  0| = DBE4H
                        |---------------|----------------------|
    
    FLDCW "source" : Chargement du registre de controle depuis la memoire a
    l'adresse "source".
                        |---------------|----------------------|------|------|
                        |ESCAPE 0  0  1 | MOD  1  0  1   R/M   | LSB  | MSB  |
                        |---------------|----------------------|------|------|
    
    FSTCW "destination" : Stockage du registre de controle a l'adresse
    destination.
                        |---------------|----------------------|------|------|
                        |ESCAPE 0  0  1 | MOD  1  1  1   R/M   | LSB  | MSB  |
                        |---------------|----------------------|------|------|
    
    FSTSW AX : Stockage du mot de controle.
                        |---------------|----------------------|
                        |ESCAPE 1  1  1 |1  1  1  0  0  0  0  0| = DFE0H
                        |---------------|----------------------|
    
    FSTSW "destination" : Stockage du registre d'etat a l'adresse
    "destination".
                        |---------------|----------------------|------|------|
                        |ESCAPE 1  0  1 | MOD  1  1  1   R/M   | LSB  | MSB  |
                        |---------------|----------------------|------|------|
    
    FCLEX : RAZ de tous les indicateurs d'exceptions, l'indicateur de demande
    d'interruption IR, et l'indicateur B (unite de calcul prete) : les broches
    INT et BUSY du 80287 deviennent inactives.
                        |---------------|----------------------|
                        |ESCAPE 0  1  1 |1  1  1  0  0  0  1  0| = DBE2H
                        |---------------|----------------------|
    
    FSTENV "destination" : Stockage des registres de controle, d'etat, de TAGs,
    et du pointeur d'exceptions a l'adresse "destination".
                        |---------------|----------------------|------|------|
                        |ESCAPE 0  0  1 | MOD  1  1  0   R/M   | LSB  | MSB  |
                        |---------------|----------------------|------|------|
    
    FLDENV "source" : Restauration des registres de controle, d'etat, de TAGs,
    et du pointeur d'exception depuis la memoire a l'adresse "source".
                        |---------------|----------------------|------|------|
                        |ESCAPE 0  0  1 | MOD  1  0  0   R/M   | LSB  | MSB  |
                        |---------------|----------------------|------|------|
    
    FSAVE "destination" : Stockage du contenu integral du 80287 (94 octets) a
    l'adresse "destination".
                        |---------------|----------------------|------|------|
                        |ESCAPE 1  0  1 | MOD  1  1  0   R/M   | LSB  | MSB  |
                        |---------------|----------------------|------|------|
    
    FRSTOR "source" : Restauration du contenu integral du 80287 (94 octets)
    depuis l'adresse "source".
                        |---------------|----------------------|------|------|
                        |ESCAPE 1  0  1 | MOD  1  0  0   R/M   | LSB  | MSB  |
                        |---------------|----------------------|------|------|
    
    b15b14                           b0
    |----------------------------------|      |
    |           exposant               |+ 92  |
    |           mantisse 48-63         |+ 90  |
    |           mantisse 32-47         |+ 88  - Registre ST(7)
    |           mantisse 16-31         |+ 86  |
    |           mantisse 0-15          |+ 84  |
    ------------------------------------      |
    |                                  |
    |                                  |
    ------------------------------------     |
    |           exposant               |+ 32 |
    |           mantisse 48-63         |+ 30 |
    |           mantisse 32-47         |+ 28 - Registre ST(1)
    |           mantisse 16-31         |+ 26 |
    |           mantisse 0-15          |+ 24 |
    ------------------------------------
    |           exposant               |+ 22 |
    |           mantisse 48-63         |+ 20 |
    |           mantisse 32-47         |+ 18 - Registre ST(0)
    |           mantisse 16-31         |+ 16 |
    |           mantisse 0-15          |+ 14 |
    ----------|-------------------------                          |
    |OP 16-19 |       0                |+ 12 |                    |
    ----------|-------------------------     -Pointeur operande   |
    |           OP 0-15                |+ 10 |                    |
    ----------|-------------------------                          -Pointeur
    |IP 16-19 |  Code operatoire       |+ 8  |                    |d'exception
    ----------|-------------------------     -Pointeur instruction|
    |           IP 0-15                |+ 6  |                    |
    ------------------------------------     |                    |
    |           registre de TAGS       |+ 4
    ------------------------------------
    |           registre d'etat        |+ 2
    ------------------------------------
    |           registre de controle   |Adresse physique
    |----------------------------------|
    
    FINCSTP : Incrementation du pointeur du registre courant. Pour liberer le
    haut de la pile, et declarer le registre courant libre, il faut utiliser
    l'instruction.
                       |---------------|----------------------|
                       |ESCAPE 0  0  1 |1  1  1  1  0  1  1  1| = DBE7H
                       |---------------|----------------------|
    
    FDECSTP : Decrement du pointeur du registre courant.
                       |---------------|----------------------|
                       |ESCAPE 0  0  1 |1  1  1  1  0  1  1  0| = D9F6H
                       |---------------|----------------------|
    
    FFREE ST(i) : Le registre ST(i) est declare libre.
                       |---------------|----------------------|
                       |ESCAPE 1  0  1 |1  1  0  0  0  ST(i)  |
                       |---------------|----------------------|
    
    FNOP : Pas d'operation (equivalent de FSI ST(0), ST(0)).
                       |---------------|----------------------|
                       |ESCAPE 0  0  1 |1  1  0  1  0  0  0  0| = D9D0H
                       |---------------|----------------------|
    
    Notations :. mod = 00    deplacement = 0
                       01    deplacement 8 bits (LSB) etendu a 16 bits signe
                       10    deplacement 16 bits (MSB LSB)
                       11    adressage d'un registre ST(i)
    
               . r/m = 000   AE = BX + SI + DEPlacement
                       001   AE = BX + DI + DEPlacement
                       010   AE = BP + SI + DEPlacement
                       011   AE = BP + DI + DEPlacement
                       100   AE = SI + DEPlacement
                       101   AE = DI + DEPlacement
                       110   AE = BP + DEPlacement
                       111   AE = BX + DEPlacement
    
               . ST(i) = ix registre de la pile circulaire de calcul
    
               . d = destination : 0 = destination ST(0)
                                   1 = destination ST(i)
               . P = incrementation pointeur : 0 = non incrementation
                                               1 = incrementation
    
               . R = inversion : 1 = destination vers source
                                 0 = source vers destination
    
               . MF (Memory Format) : 00 = reel 32 bits
                                      01 = entier 32 bits
                                      10 = reel 64 bits
                                      11 = entier 16 bits
    
               . ESCAPE = 11011