Suivez-nous sur X
|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Dossier : Registres, exceptions et instructions du 68000
(Article écrit par Loïc Far et extrait d'Amiga News Tech - avril 1991)
|
|
Après avoir lu cet article, vous saurez tout sur le MC68000 qui équipe votre Amiga chéri, depuis les
modes d'adressages jusqu'aux temps d'exécution en passant par une description détaillée de chaque
instruction. Je vous l'ai dit : un véritable petit bijou.
Organisation des registres
Le MC68000 dispose de 18 registres internes, à savoir :
- Huit registres de données 32 bits : D0, D1, D2, D3, D4, D5, D6 et D7.
- Huit registres d'adresses 32 bits : A0, A1, A2, A3, A4, A5, A6 et A7.
- Un compteur de programme 32 bis : PC.
- Un registre d'état 16 bits : SR.
Le registre d'état SR est en fait composé de deux sous-registres 8 bits. L'octet de poids fort
est appelé "octet superviseur", l'octet de poids faible "octet utilisateur" ou "condition codes
register" (CCR).
Description des bits de CR
Bit |
Nom |
Signification |
15 |
T |
Trace |
14 |
- |
Non utilisé |
13 |
S |
Mode superviseur |
12 |
- |
Non utilisé |
11 |
- |
Non utilisé |
10 |
I2 |
Masque d'interruption |
9 |
I1 |
Masque d'interruption |
8 |
I0 |
Masque d'interruption |
7 |
- |
Non utilisé |
6 |
- |
Non utilisé |
5 |
- |
Non utilisé |
4 |
X |
Extend (bit d'extension) |
3 |
N |
Negative (bit de signe) |
2 |
Z |
Zero (bit de zéro) |
1 |
V |
Overflow (bit de dépassement de capacité) |
0 |
C |
Carry (bit de retenue) |
Note : en mode utilisateur, on ne peut écrire que dans l'octet utilisateur (CCR) ;
en mode superviseur, on peut écrire dans le mot entier.
Le registre A7 joue un rôle particulier : le 68000 l'utilise comme pointeur de pile système
pour la sauvegarde du PC lors des sauts aux sous-programmes. En mode superviseur,
A7 devient A7', pointeur de pile superviseur.
Organisation de la mémoire
Le MC68000 dispose d'un bus d'adresse de 24 bits. Les 8 bits de poids fort ne sont pas utilisés.
Ce bus lui permet d'adresser 16 méga-octets de mémoire en ligne. Une adresse d'octet peut être
indifféremment paire ou impaire, mais une adresse de mot ou de mot long doit obligatoirement être
paire. Une instruction étant constitué de mois, elle aura nécessairement une adresse paire.
Les registres de données Dn peuvent être lus ou écrits sur leur octet de poids faible, sur leur mot
de poids faible ou sur leur mot long tout entier : les registres d'adresse An ne peuvent être lu
ou écrits que sur leur mot de poids faible ou sur leur mot long tout entier.
Les exceptions
Le processeur travaille dans deux modes :
- Le mode utilisateur.
- Le mode superviseur.
En mode superviseur, caractérisé par la mise à 1 du bit "S" de SR, toutes les instructions
peuvent être utilisées et le pointeur de pile est A7', également appelé SSP (Supervisor Stark Pointer).
En mode utilisateur, le jeu d'instructions est restreint et le pointeur de pile est A7,
également appelé USP (User Stock Pointer).
L'intérêt de l'existence de deux modes, est de permettre au système d'exploitation
d'assurer la pérennité de son espace de données. Le passage du mode superviseur au mode utilisateur
peut se réaliser de deux manières :
- Au retour d'une exception.
- Et invalidant le bit "S" de SR au moyen d'instructions spécialisés (MOVE to SR, ANDI to SR ou EORI to SR).
Toutes les exceptions sont exécutées en mode superviseur.
Lorsque le processeur détecte une
exception (interruption. erreur dans le programme, instruction TRAP...), il génère de manière
interne un numéro d'exception qui, une fois multiplié par 4, donne l'adresse du vecteur
d'exception. Le 68000 y trouve l'adresse de la routine à exécuter pour traiter l'exception.
Il existe 256 vecteurs d'exceptions, qui occupent le premier kilo-octet de mémoire.
Vecteur |
Adresse |
Exception concernée |
0 |
$0000 |
Reset : initialisation de SSP |
1 |
$0004 |
Reset : initialisation de PC |
2 |
$0008 |
Erreur bus |
3 |
$000C |
Erreur d'adresse |
4 |
$0010 |
Instruction illégale |
5 |
$0014 |
Division par zéro |
6 |
$0018 |
Instruction CHK |
7 |
$001C |
Instruction TRAPV |
8 |
$0020 |
Violation de privilège |
9 |
$0024 |
Mode Trace |
10 |
$0028 |
Line A (instruction $Axxx) |
11 |
$002C |
Line F (instruction $Fxxx) |
12-14 |
$0030-38 |
Réservés |
15 |
$003C |
Interruption non initialisée |
16-23 |
$0040-5C |
Réservés |
24 |
$0060 |
Interruption parasite |
25 |
$0064 |
Interruption niveau 1 |
26 |
$0068 |
Interruption niveau 2 |
27 |
$006C |
Interruption niveau 3 |
28 |
$0070 |
Interruption niveau 4 |
29 |
$0074 |
Interruption niveau 5 |
30 |
$0078 |
Interruption niveau 6 |
31 |
$007C |
Interruption niveau 7 |
32-47 |
$0080-BC |
Intructions TRAP |
48-63 |
$00C0-FC |
Réservés |
64-255 |
$0100-3FC |
Vecteurs d'interruptions utilisateurs |
Traitement d'une exception
Lorsqu'il détecte une exception, le 68000 procède en quatre étapes :
- Copie du registre d'état SR dans un registre interne, mise à 1 du bit "S" et mise à 0 du bit
"T" (TRACE étant elle-même une exception). Si l'exception est RESET ou une interruption,
le masque d'interruption de SR (bits I2 à I0) est positionné en conséquence (niveau 7 pour RESET).
- Le numéro du vecteur d'exception est déterminé par la logique interne.
- Le 68000 sauvegarde son contexte actuel (sauf dans le cas du RESET).
- La valeur du PC et la copie interne de SR sont placés dans la pile superviseur.
PC pointe généralement l'instruction suivant immédiatement celle ayant déclenché
l'exception, mais dans le cas d'une erreur Bus ou d'une erreur d'adresse,
la valeur de PC est imprévisible (à cause du phénomène d'anticipation). Dans ces deux
cas-là, des informations supplémentaires sont également empilées dans SSP.
- Le PC est chargé avec le contenu du vecteur d'exception dont l'adresse a été déterminée
dans la phase 2 et le processeur reprend l'exécution des instructions.
Les modes d'adressage
La partie logicielle du MC68000 distingue 14 modes d'adressages, regroupés sous six
rubriques (chaque mode d'adressage est suivi d'un exemple de syntaxe et d'une rapide description) :
Adressage absolu
- Adressage absolu court : TST.L $4.W
L'adresse sur 16 bits est étendue à 32 bits avant d'être traitée comme opérande.
- Adressage absolu long : TST.L $40000
L'adresse sur 32 bits est directement traitée comme opérande.
Adressage direct de registres
- Adressage direct de registres de données : TST D0
Le registre est un des 8 registres de données Dn.
- Adressage direct de registres d'adresses : TST.L A0
Le registre est l'un des 8 registres de données An.
- Adressage direct du registre d'état : ANDI #$20,SR
Le registre d'état est directement traité comme opérande.
Ces instructions sont privilégiées.
Adresse immédiat
- Adressage immédiat "simple" : MOVE.W #$1010,D4
L'opérande 16 ou 32 bits est contenu dans le mot suivant celui de l'instruction,
ou dans le mot long suivant. Si un registre d'adresse est utilisé et si la taille est le mot,
l'opérande subit une extension de signe avant le transfert.
- Adressage immédiat "rapide" : MOVEQ #S10,D4
L'opérande 8 bits est directement contenu dans le mot d'instruction. Seuls les registres de
données Dn peuvent être utilisés.
Note : les données immédiates sont notées #donnée.
Adressage indirect de registres
- Adressage indirect de registre "simple" : MOVE.W (A1),D0
Le registre d'adresse spécifié contient l'adresse de la donnée à transférer.
- Adressage indirect postincrémenté : MOVE.W (A1)+,D0
Le registre d'adresse spécifié contient l'adresse de la donnée à transférer.
Il est ensuite incrémenté de un si la taille est l'octet, de deux si la taille est le mot ou de quatre si
la taille est le mot long.
- Adressage indirect prédécrémenté : MOVE.W -(A1),D0
Le registre d'adresse spécifié est d'abord décrémenté avant de contenir l'adresse de la donnée
à transférer. La décrémentalion est de un si la taille est l'octet, de deux si la taille est le mot
ou de quatre si la taille est le mot long.
- Adressage indirect avec déplacement : MOVE.W dd(A1),D0
L'adresse de l'opérande est calculée en additionnant le déplacement dd 16 bits au contenu du registre
d'adresse.
- Adressage indirect indexé avec déplacement : MOVE d(A1,D1),D0
L'adresse de l'opérande est calculée en additionnant le déplacement d 8 bits, le contenu du
registre d'index et le contenu du registre d'adresse.
Adressage relatif au PC
- Adressage relatif au PC avec déplacement : MOVE.W dd(PC),D0
L'adresse de l'opérande est calculée en additionnant le déplacement dd 16 bits au
contenu du PC.
- Adressage indexé relatif au PC : MOVE.W d(PC,D1.L),D0
L'adresse de l'opérande est calculée en additionnant le déplacement d 8 bits,
le contenu du registre d'index et le contenu du PC.
Note : dans tous les modes d'adressage indexés, le registre utilisé comme index
peut être indifféremment un registre de données Dn ou un registre d'adresses An,
et l'on peut spécifier la taille de l'index (mot ou mot long).
Codage des instructions
Les codes opératoires du MC68000 suivant presque tous le même schéma : un mot d'instruction
pouvant être suivi d'un maximum de deux mots longs d'extension. La plus grande taille pour
une instruction est donc de 10 octets.
Les 4 bits de poids fort (bits 15 à 12) du mot d'instruction spécifient le type de l'instruction :
0000 |
Manipulation de bits, MOVEP, immédiat |
0001 |
MOVE sur des octets |
0010 |
MOVE sur des mots longs |
0011 |
MOVE sur des mots |
0100 |
Autres instructions |
0101 |
ADDQ, SUBQ, Scc, DBcc |
0110 |
Bss, BSR |
0111 |
MOVEQ |
1000 |
OR, DIV, SBCD |
1001 |
SUB, SUBX |
1010 |
Non utilisé (line A) |
1011 |
CMP, EOR |
1100 |
AND, MUL, ABCD, EXG |
1101 |
ADD, ADDK |
1110 |
Décalages et rotations |
1111 |
Non utilisé (line F) |
Les modes d'adressages sont codés sur 3 bits dans le mot d'instruction. Dans le tableau ci-dessous,
la colonne "Registre" contient sur 3 bits également, soit le numéro du registre utilisé dans
l'instruction (de 0 à 7), soit un code distinctif du mode d'adressage. Quand un déplacement ou
un registre d'index est utilisé, il est codé dans le mot d'extension de l'instruction.
Mode |
Code-Op |
Registre |
Dn |
000 |
Numéro du registre |
An |
001 |
Numéro du registre |
(An) |
010 |
Numéro du registre |
(An)+ |
011 |
Numéro du registre |
-(An) |
100 |
Numéro du registre |
dd(An) |
101 |
Numéro du registre |
d(An,Ri) |
110 |
Numéro du registre |
xx.W |
111 |
000 |
xx.L |
111 |
001 |
dd(PC) |
111 |
010 |
d(PC,Ri) |
111 |
011 |
#xx, SR |
111 |
100 |
Temps d'exécution des instructions
Conventions : dans les tableaux qui suivent, la notation x(y/z) représente la durée totale
en cycles d'horloge de l'instruction. x, y et z sont définis comme suit :
- x = nombre total de cycles d'horloge.
- y = nombre de cycles de lecture.
- z = nombre de cycles d'écriture.
Un cycle de lecture ou d'écriture prenant en général 4 cycles d'horloge, y et z doivent
chacun être multipliés par 4 puis additionnés pour donner x. Si une différence subsiste,
elle indique le nombre de cycles d'horloges nécessaires au fonctionnement interne. Les
temps donnés dans ces tableaux sont calculés pour une horloge à 8 MHz, avec laquelle un
cycle dure exactement 125 ns.
Calcul des adresses effectives
Mode |
.B, .W |
.L |
Dn |
0(0/0) |
0(0/0) |
An |
0(0/0) |
0(0/0) |
(An) |
4(1/0) |
8(2/0) |
(An)+ |
4(1/0) |
8(2/0) |
-(An) |
6(1/0) |
10(2/0) |
d(An) |
8(2/0) |
12(3/0) |
d(An,Ri) |
10(2/0) |
14(3/0) |
xx,W |
8(2/0) |
12(3/0) |
xx,L |
12(3/0) |
16(4/0) |
d(PC) |
10(2/0) |
14(3/0) |
#xx |
4(1/0) |
8(2/0) |
La taille du registre d'index n'influence pas le temps d'exécution.
Source et destination de Move (octet et mot)
La taille du registre d'index ne modifie pas le temps d'exécution.
Source et destination de Move (mot long)
La taille du registre d'index ne modifie pas le temps d'exécution.
Instructions usuelles
Instructions |
Taille |
<ea>,An |
<ea>,Dn |
Dn,<M> |
ADD |
.B, .W |
8(1/0) |
4(1/0) |
8(1/1) |
|
.L |
6(1/0)** |
6(1/0)** |
12(1/2) |
AND |
.B, .W |
- |
4(1/0) |
8(1/1) |
|
.L |
- |
6(1/0)** |
12(1/2) |
CMP |
.B, .W |
6(1/0) |
4(1/0) |
- |
|
.L |
6(1/0) |
6(1/0) |
- |
DIVS |
- |
- |
158(1/0)* |
- |
DIVU |
- |
- |
140(1/0)* |
- |
EOR |
.B, .W |
- |
4(1/0)*** |
8(1/1) |
|
.L |
- |
8(1/0)*** |
2(1/2) |
MULS |
- |
- |
70(1/0)* |
- |
MULU |
- |
- |
70(1/0)* |
- |
OR |
.B, .W |
- |
4(1/0) |
8(1/1) |
|
.L |
- |
6(1/0)** |
12(1/2) |
SUB |
.B, .W |
8(1/0) |
4(1/0) |
8(1/1) |
|
.L |
6(1/0)** |
6(1/0)** |
12(1/2) |
Notes :
- Additionner aux présents temps, les temps de calcul de l'adresse effective.
- "*" indique le temps maximum.
- "**" indique si le mode d'adressage est indirect de registre ou immédiat, le temps de base est de 6 périodes.
- "***" indique seulement si le mode d'adressage est direct de registre.
- DIVS, DIVU : l'algorythrre de division engendre une marge de 10% entre le meilleur et le pire cas.
- MULS, MULU : l'algorythrne de multiplication requiert 38+2n cycles, où "n" vaut :
- Dans le cas de MULU : le nombre de bits à 1 dans <ea>.
- Dans le cas de MULS : le nombre de combinaisons de bits à 10 et 01 dans la source.
Instructions immédiates
Instructions |
Taille |
#x,Dn |
#x,An |
#x,M |
ADDI |
.B, .W |
8(2/0) |
- |
12(2/1)+ |
|
.L |
16(3/0) |
- |
20(3/2)+ |
ADDQ |
.B, .W |
4(1/0) |
8(1/0)* |
8(1/1)+ |
|
.L |
8(1/0) |
8(1/0)* |
12(1/2)+ |
ANDI |
.B, .W |
8(2/0) |
- |
12(1/2)+ |
|
.L |
16(3/0) |
- |
20(3/1)+ |
CMPI |
.B, .W |
8(2/0) |
- |
8(2/0)+ |
|
.L |
14(3/0) |
- |
12(3/0)+ |
EORI |
.B, .W |
8(2/0) |
- |
12(2/1)+ |
|
.L |
16(3/0) |
- |
20(3/2)+ |
MOVEQ |
.L |
4(1/0) |
- |
- |
ORI |
.B, .W |
8(2/0) |
- |
12(2/1)+ |
|
.L |
16(3/0) |
- |
20(3/2)+ |
SUBI |
.B, .W |
8(2/0) |
- |
12(2/1)+ |
|
.L |
16(3/0) |
- |
20(3/2)+ |
SUBQ |
.B, .W |
4(1/0) |
8(1/0)* |
8(1/1)+ |
|
.L |
8(1/0) |
8(1/0)<*/td>
| 12(1/2)+ |
Notes :
- "*" indique le mot seulement.
- "+" indique ajouter le temps de calcul de l'adresse effective.
Instructions à l'opérande
Instructions |
Taille |
Registre |
Mémoire |
CLR |
.B, .W |
4(1/0) |
8(1/1)+ |
|
.L |
6(1/0) |
12(1/2)+ |
NBCD |
.B |
6(1/0) |
8(1/1)+ |
NEG |
.B, .W |
4(1/0) |
8(1/1)+ |
|
.L |
6(1/0) |
12(1/2)+ |
NEGX |
.B, .W |
4(1/0) |
8(1/1)+ |
|
.L |
6(1/0) |
12(1/2)+ |
NOT |
.B, .W |
4(1/0) |
8(1/1)+ |
|
.L |
6(1/0) |
12(1/2)+ |
Scc |
.B, False |
4(1/0) |
8(1/1)+ |
|
.B, True |
6(1/0) |
8(1/1)+ |
TAS |
.B |
4(1/0) |
10(1/1)+ |
TST |
.B .W |
4(1/0) |
4(1/0)+ |
|
.L |
4(1/0) |
4(1/0)+ |
Notes :
- "+" indique d'ajouter le temps de calcul de l'adresse effective.
Décalage/Rotations
Instructions |
Taille |
Registre |
Mémoire |
ASL,ASR |
.B, .W |
6+2n(1/0) |
8(1/1)+ |
|
.L |
8+2n(1/0) |
- |
LSL,LSR |
.B, .W |
6+2n(1/0) |
8(1/1)+ |
|
.L |
8+2n(1/0) |
- |
ROL,ROR |
.B, .W |
6+2n(1/0) |
8(1/1)+ |
|
.L |
8+2n(1/0) |
- |
ROXL,ROXR |
.B, .W |
6+2n(1/0) |
8(1/1)+ |
|
.L |
8+2n(1/0) |
- |
Notes :
- "n" représente le nombre de décalages/rotations.
- "+" indique d'ajouter le temps de calcul de l'adresse effective.
Manipulations de bits
Instructions |
Taille |
Registre dynamique |
Mémoire |
Registre statique |
Mémoire |
BCHG |
.B |
- |
8(1/1)+ |
- |
12(2/1)+ |
|
.L |
8(1/0)* |
- |
12(2/0)* |
- |
BCLR |
.B |
- |
8(1/1)+ |
- |
12(2/1)+ |
|
.L |
10(1/0)* |
- |
14(2/0)* |
- |
BSET |
.B |
- |
8(1/1)+ |
- |
12(2/1)+ |
|
.L |
8(1/0)* |
- |
12(2/0)* |
- |
BTST |
.B |
- |
4(1/0)+ |
- |
8(2/0)+ |
|
.L |
6(1/0)* |
- |
10(2/0)* |
- |
Notes :
- "*" indique le temps maximum.
- "+" indique d'ajouter le temps de calcul de l'adresse effective.
Instructions de branchement
Instructions |
Taille |
Saut |
Pas saut |
Bcc |
.S |
10(2/0) |
8(1/0)+ |
|
.L |
10(2/0) |
12(2/0)+ |
BRA |
.S |
10(2/0) |
- |
|
.L |
10(2/0) |
- |
BSR |
.S |
18(2/2) |
- |
|
.L |
18(2/2) |
12(2/0)+ |
DBcc |
cc True |
- |
12(2/0)+ |
|
cc False |
10(2/0) |
14(3/0)+ |
Source et destination de JMP, JSR, LEA, PEA et MOVEM
Notes :
- "n" représente le nombre de registres. La taille du registre d'index de modifie pas le temps d'exécution.
Instructions en multiprécision
Instructions |
Taille |
Dn,Dn |
M,M |
ADDX |
.B, .W |
4(1/0) |
18(3/1) |
|
.L |
8(1/0) |
30(5/2) |
CMPM |
.B, .W |
- |
12(3/0) |
|
.L |
- |
20(5/0) |
SUBX |
.B, .W |
4(1/0) |
18(3/1) |
|
.L |
8(1/0) |
30(5/2) |
ABCD |
.B |
6(1/0) |
18(3/1) |
SBCD |
.B |
6(1/0) |
30(3/1) |
Instructions diverses
Instructions |
Taille |
Registre |
Mémoire |
ADDI to CCR |
.B |
20(3/0) |
- |
ANDI to SR |
.W |
20(3/0) |
- |
CHK |
|
10(1/0)+ |
- |
EORI to CCR |
.B |
20(3/0) |
- |
EORI to SR |
.W |
20(3/0) |
- |
ORI to CCR |
.B |
20(3/0) |
- |
ORI to SR |
.W |
20(3/0) |
- |
MOVE from SR |
|
6(1/0) |
8(1/1) |
MOVE to CCR |
|
12(2/0) |
12(2/0) |
EXG |
|
6(1/0) |
- |
EXT |
.W |
4(1/0) |
- |
|
.L |
4(1/0) |
- |
LINK |
|
16(2/2) |
- |
MOVE from USP |
|
4(1/0) |
- |
MOVE to USP |
|
4(1/0) |
- |
NOP |
|
4(1/0) |
- |
RESET |
|
132(1/0) |
- |
RTE |
|
20(5/0) |
- |
RTS |
|
16(4/0) |
- |
STOP |
|
4(0/0) |
- |
SWAP |
|
4(1/0) |
- |
TRAPV |
|
4(1/0) |
- |
UNLK |
|
4(1/0) |
- |
Note :
- "+" indique d'ajouter le temps de calcul de l'adresse effective.
MOVEP
Instructions |
Taille |
R->M |
M->R |
MOVEP |
.W |
16(2/2) |
16(4/0) |
|
.L |
24(2/4) |
24(6/0) |
Procédures d'exceptions
Exception |
Périodes |
Adress Error |
50(4/7) |
Bus Error |
50(4/7) |
CHK Instruction |
44(5/4)+ |
Divide by zero |
42(5/4) |
Illegal instruction |
34(4/3) |
Interrupt |
44(5/3)* |
Privilege violation |
34(4/3) |
RESET** |
40(6/0) |
Trace |
34(4/3) |
TRAP Instruction |
38(4/4) |
TRAPV Instruction |
34(4/3) |
Notes :
- "+" indique d'ajouter le temps de calcul de l'adresse effective.
- "*" indique le cycle de reconnaissance de l'interruption est considéré prenant 4 périodes d'horloge.
- "**" indique le temps passé entre l'instant où RESET et HALT sont affirmés et le début de l'instruction.
Le mois prochain, nous vous proposerons une liste complète et détaillée de toutes les
instructions du 68000 : syntaxe, mode(s) d'adressage, codage de l'instruction, drapeaux
modifiés...
|