Le jeu d'instructions du 68000
Page réalisée par:
Philippe Moreau
UPJV

Nous avons ici regroupé les instructions par types. On trouvera donc les opérateurs servant au transfert (et affectation), les opérateurs qui effectuent uniquement des tests (comparaison), les opérateurs arithmétiques, les opérateurs logiques, les instructions permettant décalages et rotations, les instructions permettant les ruptures de séquence (sauts et branchements) des opérateurs qui agissent sur des bits et enfin, des instructions plus spécifiques qui sont citées, mais dont on pourra se passer pour nos écritures de programmes.

Dans le tableau qui suit on trouvera:

- l'instruction (avec éventuellement [.f])

- le type d'opérande

- l'action réalisée

- Une colonne "Commentaires" qui permet de donner quelques précisions sur l'instruction, les formats possibles, les modes d'adressages autorisés etc...

Les opérateurs d'Affectation et Transfert
InstructionOpérandeActionCommentaires
CLR[.f]DestinationDestination ← 0- Destination étant différent de An, Imm, ..(PC).. (..(PC).. fait référence aux adressages relatifs au PC) (.f = .b ou .w ou .l)
MOVE[.f] Source,Destination Destination ← Source - Source peut prendre toutes les formes d'adressages possibles
- Destination étant différent de An, Imm, ..(PC).. (.f = .b ou .w ou .l)
MOVEA[.f]Source,AnAn ← Source- Source peut prendre toutes les formes d'adressages possibles. (.f = .w ou .l)
MOVEM[.f]Liste-Registres,<EA>1
<EA>,Liste-Registres2
1<EA> ← Liste-Registres
2Liste-Registres ← <EA>
1- <EA> ≠ Dn , An , (An)+ , Imm , ..(PC)..
2 - <EA> ≠ Dn , An , -(An) , Imm
(Liste-Registres sous la forme : Da-Db/Ac-Ad faisant référence à tous les registres de Données numérotés de a à b et tous les registres d'Adresses numérotés de c à d) (.f = .w ou .l)
MOVEQ#n,Dn Dn ← n L'opération se fait sur 32 bits. n est signé et est donné sur 8 bits (étendu à 32)
MOVE from CCRCCR,<EA><EA> ← CCR- avec <EA> ≠ An , Imm , ..(PC)..
MOVE to CCR<EA>,CCR CCR ← <EA>- avec <EA> ≠ An
MOVE from SRSR,<EA> <EA> ← SR - avec <EA> ≠ An , Imm , ..(PC)..
MOVE to SR<EA>,SRSR ← <EA>- avec <EA> ≠ An
EXG(EXchanGe)Dn,DmDn ↔ Dm- échange les contenus des deux registres de Données sur 32 bits
SWAP Dn - échange les 16 bits de poids forts avec les 16 bits de poids faibles dans le registre Dn
LEA<EA>,An An ← l'adresse donnée par EA (LEA pour: Load Effective Address) (toujours sur 32 bits)
- <EA> peut prendre les formes (An), d(An), d(An,Xn), Abs.w, Abs.l, d(PC), d(PC,Xn)
ATTENTION: An reçoit l'adresse donnée par EA et non le contenu
( LEA $2F78E,A0 ⇔ MOVE.L #$2F78E,A0 )
Les opérateurs de "Comparaison"
InstructionOpérandeActionCommentaires
CMP[.f] <EA>,Dn Dn - <EA>- cette action a pour effet d'affecter les bits du registre d'états
- <EA> peut prendre toutes les formes. (.f = .b ou .w ou .l)
CMPA[.f]<EA>,AnAn - <EA>- <EA> peut prendre toutes les formes. (.f = .w ou .l)
CMPI[.f]#n,<EA> <EA> - n - <EA> peut prendre toutes les formes sauf : An, Imm, ..(PC)..
CMPM[.f] (An)+,(Am)+ (Am)+ - (An)+ (CMPM pour: CoMPare Memory) (.f = .b ou .w ou .l)
TST[.f] <EA> <EA> - 0 Compare Destination à zéro (ce qui a pour effet positionner les bits N et Z du registre d'états V et C étant mis à 0).
- avec <EA> ≠ An, Imm, ..(PC)..
Les opérateurs Arithmétiques
InstructionOpérandeActionCommentaires
ABCD Source(S),Destination(D)D(DCB)← D(DCB)+S(DCB)+X - Où X est le bit du CCR (bit d'extension)
- le format (non spécifié) est toujours sur 1 Octet.
- Il n'existe que 2 écritures possibles pour le couple S,D : Dn,Dm ou -(An),-(Am)
SBCD Source(S),Destination(D)D(DCB)← D(DCB)-S(DCB)-X - X bit du CCR, format sur 1 Octet, mode d'adressages: Dn,Dm ou -(An),-(Am)
ADD[.f]<EA>,Dn ou
Dn,<EA>
Dn ← Dn + <EA> ou
<EA> ← <EA> + Dn
- dans le cas <EA>,Dn : <EA> peut prendre toutes les formes
- pour Dn,<EA> : <EA> prend toutes les formes exceptées Dn, An, Imm et ..(PC)..
Rmq: Ce sont les instructions suivantes ADDA et ADDI qui permettent de compléter le nombre de couples "S,D" possibles. Toutefois, le logiciel d'assemblage que nous utilisons, permet la frappe de ADD à la place ADDA ou ADDI. (.f = .b ou .w ou .l)
ADDA[.f]<EA>,AnAn ← An + <EA>- où <EA> peut prendre toutes les formes. (.f = .w ou .l)
ADDI[.f]#n,<EA><EA> ← <EA> + n - où <EA> ≠ An, Imm et ..(PC).. (.f = .b ou .w ou .l)
ADDQ[.f]#n,<EA><EA> ← <EA> + n - où <EA> ≠ Imm, ..(PC).. (attention: 1≤n≤8) (.f = .b ou .w ou .l)
ADDX[.f]Dn,Dm ou
-(An),-(Am)
Dm ← Dm + Dn + X ou
-(Am) ← -(Am) + -(An) + X
- X bit du CCR, (.f = .b ou .w ou .l)
SUB[.f]<EA>,Dn ou
Dn,<EA>
Dn ← Dn - <EA> ou
<EA> ← <EA> - Dn
- dans le cas <EA>,Dn : <EA> peut prendre toutes les formes
- pour Dn,<EA> : <EA> prend toutes les formes exceptées Dn, An, #Imm et ..(PC).. (.f = .b ou .w ou .l)
SUBA[.f]<EA>,AnAn ← An - <EA>- où <EA> peut prendre toutes les formes. (.f = .w ou .l)
SUBI[.f]#n,<EA><EA> ← <EA> - n - où <EA> ≠ An, Imm et ..(PC).. (.f = .b ou .w ou .l)
SUBQ[.f]#n,<EA><EA> ← <EA> - n - où <EA> ≠ Imm, ..(PC).. (attention: 1≤n≤8) (.f = .b ou .w ou .l)
SUBX[.f]Dn,Dm ou
-(An),-(Am)
Dm ← Dm - Dn - X ou
-(Am) ← -(Am) - -(An) - X
- X bit du CCR, (.f = .b ou .w ou .l)
MULU<EA>,DnDn(32bits) ← Dn(16bits) * <EA>(16bits) - avec <EA> ≠ An
- seuls les 16 bits de poids faible de Dn sont pris pour la multiplication, mais ensuite les 32 bits de Dn sont affectés.
- les nombres sont considérés comme non-signés (U=Unsigned)
MULS<EA>,DnDn(32bits) ← Dn(16bits) * <EA>(16bits) - idem MULU avec des nombres signés (S=Signed)
DIVU<EA>,DnDn(32bits) ← Dn(32bits) / <EA>(16bits) - avec <EA> ≠ An
- les 32 bits de Dn sont pris en compte pour la division, et ensuite les 16 bits de poids faible de Dn contiennent le Quotient, les 16 bits de poids fort contenant le Reste de la division entière.
- les nombres sont considérés comme non-signés (U=Unsigned)
DIVS<EA>,DnDn(32bits) ← Dn(32bits) / <EA>(16bits) - idem DIVU avec des nombres signés (S=Signed)
NEG[.f] <EA> <EA> ← - <EA> - avec <EA> ≠ An , Imm , ..(PC).. , (.f = .b ou .w ou .l)
NEGX[.f] <EA> <EA> ← - <EA> - X - avec <EA> ≠ An , Imm , ..(PC).. , (.f = .b ou .w ou .l)
NBCD <EA> <EA> ← - <EA>(DCB) - X - toujours sur 8 bits avec <EA> ≠ An , Imm , ..(PC)..
EXT[.f] Dn Dn(sur 2.f bits) ← Dn(sur f bits) - (.f = .w ou .l), EXTention de signe (de 8 à 16 bits ou de 16 à 32 bits)
Les opérateurs Logiques
InstructionOpérandeActionCommentaires
AND[.f]<EA>,Dn ou
Dn,<EA>
Dn ← Dn <EA> ou
<EA> ← <EA> Dn
- pour <EA>,Dn : <EA> ≠ An
- pour Dn,<EA> : <EA> ≠ Dn, An, Imm et ..(PC)..
Rmq: le ET logique () est fait bit à bit. (.f = .b ou .w ou .l)
ANDI[.f]#n,<EA><EA> ← <EA> n - où <EA> ≠ An, Imm et ..(PC).. (.f = .b ou .w ou .l)
ANDI to CCR#n,CCRCCR ← CCR n - format .b
ANDI to SR#n,SRSR ← SR n - format .w
OR[.f]<EA>,Dn ou
Dn,<EA>
Dn ← Dn <EA> ou
<EA> ← <EA> Dn
- pour <EA>,Dn : <EA> ≠ An
- pour Dn,<EA> : <EA> ≠ Dn, An, Imm et ..(PC)..
Rmq: le OU logique () est fait bit à bit. (.f = .b ou .w ou .l)
ORI[.f]#n,<EA><EA> ← <EA> n - où <EA> ≠ An, Imm et ..(PC).. (.f = .b ou .w ou .l)
ORI to CCR#n,CCRCCR ← CCR n - format .b
ORI to SR#n,SRSR ← SR n - format .w
EOR[.f]<EA>,Dn ou
Dn,<EA>
Dn ← Dn <EA> ou
<EA> ← <EA> Dn
- pour <EA>,Dn : <EA> ≠ An
- pour Dn,<EA> : <EA> ≠ Dn, An, Imm et ..(PC)..
Rmq: le OU Exclusif () est fait bit à bit. (.f = .b ou .w ou .l)
EORI[.f]#n,<EA><EA> ← <EA> n - où <EA> ≠ An, Imm et ..(PC).. (.f = .b ou .w ou .l)
EORI to CCR#n,CCRCCR ← CCR n - format .b
EORI to SR#n,SRSR ← SR n - format .w
NOT[.f]<EA> <EA> ← ¬ <EA> - NON logique bit à bit (¬) = complément à 1 = inversion de tous les bits
- avec <EA> ≠ An , Imm , ..(PC).. , (.f = .b ou .w ou .l)
Les Décalages et Rotations
InstructionOpérandeActionCommentaires
ASL[.f]<EA>
#n,Dn
Dm,Dn
<EA> ← <EA> << 1
Dn ← Dn << n (1≤n≤8)
Dn ← Dn << Dm
- Pour <EA>: <EA> ≠ Dn, An, Imm, et ..(PC).. , (.f = .b ou .w ou .l)
- Arithmetic Shift Left: Décalage Arithmétique à Gauche
ASR[.f]<EA>
#n,Dn
Dm,Dn
<EA> ← <EA> >> 1
Dn ← Dn >> n (1≤n≤8)
Dn ← Dn >> Dm
- Pour <EA>: <EA> ≠ Dn, An, Imm, et ..(PC).. , (.f = .b ou .w ou .l)
- Arithmetic Shift Right: Décalage Arithmétique à Droite
LSL[.f]<EA>
#n,Dn
Dm,Dn
<EA> ← <EA> << 1
Dn ← Dn << n (1≤n≤8)
Dn ← Dn << Dm
- Pour <EA>: <EA> ≠ Dn, An, Imm, et ..(PC).. , (.f = .b ou .w ou .l)
- Logical Shift Left: Décalage Logique à Gauche
LSR[.f]<EA>
#n,Dn
Dm,Dn
<EA> ← <EA> >>> 1
Dn ← Dn >>> n (1≤n≤8)
Dn ← Dn >>> Dm
- Pour <EA>: <EA> ≠ Dn, An, Imm, et ..(PC).. , (.f = .b ou .w ou .l)
- Logical Shift Right: Décalage Logique à Droite
ROL[.f]<EA>
#n,Dn
Dm,Dn
<EA> ← <EA> 1
Dn ← Dn n (1≤n≤8)
Dn ← Dn Dm
- Pour <EA>: <EA> ≠ Dn, An, Imm, et ..(PC).. , (.f = .b ou .w ou .l)
- ROtate Left: Rotation à Gauche
ROR[.f]<EA>
#n,Dn
Dm,Dn
<EA> ← <EA> 1
Dn ← Dn n (1≤n≤8)
Dn ← Dn Dm
- Pour <EA>: <EA> ≠ Dn, An, Imm, et ..(PC).. , (.f = .b ou .w ou .l)
- ROtate Right: Rotation à Droite
ROXL[.f]<EA>
#n,Dn
Dm,Dn
<EA> ← <EA> 1
Dn ← Dn n (1≤n≤8)
Dn ← Dn Dm
- Pour <EA>: <EA> ≠ Dn, An, Imm, et ..(PC).. , (.f = .b ou .w ou .l)
- ROtate with X Left: Rotation à Gauche avec X
ROXR[.f]<EA>
#n,Dn
Dm,Dn
<EA> ← <EA> 1
Dn ← Dn n (1≤n≤8)
Dn ← Dn Dm
- Pour <EA>: <EA> ≠ Dn, An, Imm, et ..(PC).. , (.f = .b ou .w ou .l)
- ROtate with X Right: Rotation à Droite avec X
Les Sauts et Branchements
InstructionOpérandeActionCommentaires
BRAAdr (souvent Label)PC ← Adr- BRanch Allways: Branchement sans Condition
BxxAdr (souvent Label)PC ← Adr (si xx vérifié) - Branchement sous condition. Le tableau ci-dessous reprend et complète les cas déjà vus.
Valeur
de xx
InterprétationCondition de Branchement Valeur
de xx
InterprétationCondition de Branchement
CCCarry Clear LSLess or Same
CSCarry Set LTLess Than
EQEQqual MIMInus
GEGreater or Equal NENot Equal
GTGreater Than PLPLus
HIHIgh VCoVerflow Clear
LELess or Equal VSoVerflow Set
JMPAdr (souvent Label)PC ← Adr- JuMP: Aller à Adresse
BSRAdr (souvent Label)-(SP) ← PC ; PC ← Adr- Branch Sub Routine: Aller exécuter le sous programme à l'adresse donnée
JSRAdr (souvent Label)-(SP) ← PC ; PC ← Adr- Jump Sub Routine: Aller exécuter le sous programme à l'adresse donnée
RTSrienPC ← (SP)+- ReTurn from Subroutine: Retour suite à l'appel d'un sous programme
DBRADn,Adr (souvent Label)Dn ← Dn-1
Si Dn ≠ -1 Alors
      Aller à Adresse
FinSi
- Decrement and BRAnch sans autre condition
- Remarque: DBRA ⇔ DBF (voir ci-dessous)
- DBRA est très utile pour implémenter les boucles définies
DBxxDn,Adr (souvent Label)Si xx n'est pas vérifié Alors
    Dn ← Dn-1
    Si Dn ≠ -1 Alors
              Aller à Adresse
    FinSi
FinSi
- Branchement sous condition et décrémentation.
Valeur
de xx
InterprétationCondition de Branchement Valeur
de xx
InterprétationCondition de Branchement
CCCarry Clear LSLess or Same
CSCarry Set LTLess Than
EQEQqual MIMInus
FFalse0 NENot Equal
GEGreater or Equal PLPLus
GTGreater Than TTrue1
HIHIgh VCoVerflow Clear
LELess or Equal VSoVerflow Set
TRAP#<N°vecteur>-(SSP) ← PC
-(SSP) ← SR
PC ← (vecteur)
- provoque une interruption, le N° de vecteur donne une référence à une adresse qui permet de choisir un morceau de programme à exécuter.
- Dans notre environnement de développement, on utilise TRAP #15 pour appeler les routines système déjà écrites.
Actions sur des Bits
InstructionOpérandeActionCommentaires
BCHGDn,<EA> ou
#n,<EA>
inverse un bit de destination (bit dont le N° est donné par source)- Bit CHanGe, le bit Z du registre CCR prend la valeur inverse du bit avant changement.
- <EA> ≠ An, Imm et ..(PC).. ; l'opération se fait sur 32 bits si <EA>=Dn et sur 8 bits si <EA>≠Dn
BCLRDn,<EA> ou
#n,<EA>
met à 0 un bit de destination (bit dont le N° est donné par source)- Bit CLeaR, le bit Z du registre CCR prend la valeur inverse du bit avant changement.
- <EA> ≠ An, Imm et ..(PC).. ; l'opération se fait sur 32 bits si <EA>=Dn et sur 8 bits si <EA>≠Dn
BSETDn,<EA> ou
#n,<EA>
met à 1 un bit de destination (bit dont le N° est donné par source)- Bit SET, le bit Z du registre CCR prend la valeur inverse du bit avant changement.
- <EA> ≠ An, Imm et ..(PC).. ; l'opération se fait sur 32 bits si <EA>=Dn et sur 8 bits si <EA>≠Dn
BTSTDn,<EA> ou
#n,<EA>
teste un bit de destination (bit dont le N° est donné par source)- Bit TeST, le bit Z du registre CCR prend la valeur inverse du bit.
- <EA> ≠ An, Imm ; l'opération se fait sur 32 bits si <EA>=Dn et sur 8 bits si <EA>≠Dn
Sxx<EA>Si xx est vérifié Alors
   les bits de <EA> ← 1
Sinon
   les bits de <EA> ← 0
FinSi
- l'opération se fait sur 8 bits, <EA> ≠ AN, Imm et ..(PC).. .
Valeur
de xx
InterprétationCondition de Branchement Valeur
de xx
InterprétationCondition de Branchement
CCCarry Clear LSLess or Same
CSCarry Set LTLess Than
EQEQqual MIMInus
FFalse0 NENot Equal
GEGreater or Equal PLPLus
GTGreater Than TTrue1
HIHIgh VCoVerflow Clear
LELess or Equal VSoVerflow Set
Instructions plus Spécifiques
InstructionOpérandeActionCommentaires
NOPrienrien- passe du temps
PEA<EA>-(SP) ← l'adresse donnée par EA - Push Effective Address: mettre une "adresse" sur la pile (toujours sur 32 bits)
- <EA> peut prendre les formes (An), d(An), d(An,Xn), Abs.w, Abs.l, d(PC), d(PC,Xn)
ATTENTION: <EA> est pris comme une adresse et non un mode d'adressage.
LINKAn,#d-(SP) ← An
An ← SP
SP ← SP+d
- d déplacement sur 16 bits
- avec un déplacement négatif cela peut permettre d'allouer un emplacement mémoire sur la pile tout en conservant les informations nécessaires au bon fonctionnement de la pile ultérieurement
UNLKAnSP ← An ; An ← (SP)+- UNLinK
RTD#dPC ← (SP)+ ; SP ← SP+d- ReTurn and Deallocate
- d déplacement sur 16 bits
RTRrienCC ← (SP)+ ; PC ← (SP)+- ReTurn and Restore Condition Code
TAS<EA>Teste <EA> et met le bit7 de <EA> à 1- Test And Set: agit sur N et Z
- <EA> ≠ An, Imm et ..(PC)..
CHK<EA>,DnSi Dn<0 OU Dn><EA> alors TRAP- CHecK, Trap de numéro prédéfini, <EA> ≠ An
MOVE (USP)USP,An
An,USP
si Superviseur alors
    An ← USP
    USP ← An
sinon TRAP
- Uniquement en mode Superviseur
MOVES[.f]<EA>,Dn
Rn,<EA>
si Superviseur alors
    Dn ← <EA>
    <EA> ← Dn
sinon TRAP
- Uniquement en mode Superviseur
- Rn = Dn ou An, <EA> ≠ Dn, An, Imm, ..(PC)..
- (.f = .b ou .w ou .l)
Egalement, d'autres instructions accessibles uniquement en mode superviseur : ILLEGAL, MOVEC, RESET, RTE, STOP, TRAPV