MC68000
Généralités
Le microprocesseur Motorola MC68000 (c) fait partie de la génération des processeurs CISC 16/32 bits asynchrones VLSI.
Au début de sa carrière, il fut considéré comme la Formule 1 des microprocesseurs, et a été fabriqué par Motorola qui en est à l'origine, mais aussi par exemple par Thomson sous la référence EF68000.
Bien que son bus de données externe soit de 16 bits, son architecture interne est totalement 32 bits et il se présente sous la forme d'un boitier DIL de 64 broches, ce qui en fait un circuit intégré vraiment impressionnant. Monté sur une carte simple europe, il tient à lui seul sur toute la largeur de la carte...
Il peut également adresser de façon linéaire un espace mémoire total de 16 méga-octets.
Cependant, cet espace mémoire peut être séparé en quatre espaces distincts (programme superviseur, données superviseur, programme utilisateur, données utilisateur) sans utilisation de circuit externes, mais par simple décodage de trois lignes d'état fournies par le processeur.
Ces trois bits apportent un grande sécurité matérielle des données et permettent d'étendre l'espace mémoire à 64 méga-octets.
Le 68000 est également particulièrement adapté à une configuration multiprocesseurs.
Il peut être aussi utilisé avec les circuit périphériques de première génération (PIA MC6821 par exemple) grâce à des signaux de synchronisation disponibles sur le bus. Cette caractéristique est très intéressante pour créer nos propres cartes car nous pourrons utiliser les périphériques déjà connus lors du développement pour le MC6800 ou le MC6809.
De plus, le 68000 est monotension, et s'alimente en 5V pour une puissance d'un peu plus d'un watt lorsqu'il est cadencé à 8 MHz.
Carte LISA 68K que j'ai développée en 1994 comme support d'étude du MC68000.
Son BIOS de trouve ici, compilable par Ed!
Cette carte comporte un MC68000 à 8MHz, une bank ROM, une bank RAM, un PIA, un ACIA, un PTM, un écran LCD, une interface pour clavier PC/AT et des sorties logiques sur Led.
Jeu d'instruction MC68000
La syntaxe des instructions assembleur MC68000 est la suivante:
Registres internes
Le processeur MC68000 comporte:
- 8 registre de données 32 bits : D0, D1, ..., D7
- 7 registres d'adresse 32 bits : A0, A1, ..., A6
- 1 registre d'adresse 32 bits A7 servant de registre de pile (USP ou SSP)
- 1 compteur programme PC 32 bits
- 1 registre d'état SR
- 1 registre de codes-condition CCR
Le registre d'adresse A7 tient un rôle particulier. En effet, il tient le rôle de pointeur de pile système où seront entre autre sauvegardées les adresses de retour de sous-programme.
Il sera nommé A7 lorsque le bit S du SR est à zéro (mode utilisateur) et sera donc le pointeur de pile utilisateur USP.
Il sera nommé A7' lorsque le bit S du SR est à un (mode superviseur) et sera donc le pointeur de pile superviseur SSP.
Les huit registres de données D0 à D7 sont des registres 32 bits, mais sont reconfigurables en registres 2x16 bits ou 4x8 bits pour y stocker et traiter des mots-longs, des mots ou des octets (Long, Word ou Byte).
Les sept registres d'adresses A0 à A6 peuvent quant à eux traiter des adresses sur 16 ou 32 bits.
Registre de Codes Condition CCR et Registre d'état SR
Le registre d'état SR 16 bits se compose de deux octets distincts:
Poids faible : Octet utilisateur (CCR).
Poids fort : Octet superviseur.
Ce registre reflète l'état du processeur après chaque instruction, ce qui permet d'autoriser ou interdire les interruptions, ou tester le résultat d'une opération pour un branchement conditionnel par exemple.
La totalité des 16 bits représentent le SR tandis que les 8 bits de poids faible représentent le CCR.
Détail du SR et du CCR:
b15 b0
T.S..III...XNZVC
________________
SR
________
CCR
Octet Superviseur:
T: Mode Trace
S: Etat Superviseur
I: Masque d'Interruption 2
I: Masque d'Interruption 1
I: Masque d'Interruption 0
Octet Utilisateur CCR:
X: Bit d'eXtension
N: Bit de signe (Negative)
Z: Bit de Zero
V: Bit de débordement (oVerflow)
C: Bit de retenue (Carry)
En mode Utilisateur, on ne peut écrire que dans le CCR.
En mode Superviseur, on peut écrire dans tout le SR.
Modes d'adressage
Le MC68000 comprend 14 modes d'adressage qui en font un processeur extrèmement puissant. Associés à un jeu d'instructions très complet, on dispose de plus d'un millier d'instructions disponibles ...
Adressage Immédiat:
MOVE.W #$E000, A0 La valeur $E000 est mise dans A0
ADD.B #$22, $2000 La valeur $22 est ajoutée au contenu de la case $2000
ADD.L #$12345678, $3000
La valeur 32 bits $12345678 est ajoutée au contenu de la case mémoire d'adresse $3000
Adressage Immédiat rapide (Quick):
ADDQ #$02, D0 Comme adressage Immédiat, mais sur 8 bits.
Ici, la valeur $02 est ajoutée au contenu du registre D0.
Adressage Registre de données:
MOVE.B D1, $1000 Un des opérandes est un registre Dn
NOT D0 On complémente le contenu du registre D0
Adressage Registre d'adresse:
MOVE A0, D0 Un des opérandes est un registre An
MOVE D0, A0
Adressage Registre Implicite:
RTS Aucun registre n'est spécifié
Adressage Absolu Court:
MOVE.B $1200, D0 Le contenu de la case $1200 est mis dans D0
Adressage Absolu Long:
MOVE.B $10000, D0 Le contenu de la case $10000 (32 bits) est mis dans D0
Adressage Indirect:
MOVE.B (A0), D0 Le contenu de la case mémoire dont l'adresse se trouve dans A0 est mis dans D0
Adressage Indirect avec Post Incrémentation:
MOVE.B D0, (A1)+ Le contenu de D0 est mis dans la case mémoire dont l'adresse se trouve dans A1.
Le registre A1 est ensuite incrémenté
Adressage Indirect avec Pré Décrémentation:
MOVE.B -(A1), D0 Le registre A1 est décrémenté puis le contenu de la case mémoire dont l'adresse se trouve dans A1 est mis dans D0
Adressage Indirect avec Déplacement:
MOVE $02(A0), D1 Le contenu de la case mémoire dont l'adresse est indiquée par A0+$02 est mis dans D1
Adressage Indirect avec Déplacement et Index:
MOVE $02(A1, D0.W), A2 Le contenu de la case mémoire dont l'adresse est indiquée par
A1+$02+[16 bits poids faible de D0] est mis dans A2
Adressage Relatif au PC:
BNE @Boucle L'adresse est indiquée par PC + Boucle
Adressage Indexé Relatif au PC:
MOVE @Label(A1), D0 Le contennu de la case mémoire dont l'adresse est donnée par A1+Label est mis dans D0
Instructions
Pour la description de ces instructions, Dx et Dy représentent un des huit registres D0 à D7. De même pour Ax et Ay qui représentent les registres d'adresse.
ABCD Addition décimale avec le bit d'extension X du CCR
Syntaxe: ABCD Dy, Dx
ou ABCD -(Ay),-(Ax)
Taille opérande: Byte
Addition BCD entre deux registres de données Dy,Dx ou entre deux cases mémoires adressées en -(Ay),-(Ax).
Modifications du registre CCR:
X: Idem à C V: Indéfini
N: Indéfini C: 1 si retenue décimale, sinon 0
Z: 0 si résultat<>0,
sinon inchangé
Exemple assembleur:
ABCD D2, D1
ABCD -(A0), -(A1)
ADD Addition binaire
Syntaxe: ADD <AE>, Dn ou ADD Dn, <AE>
Taille opérande: Byte, Word, Long word
Addition binaire entre un opérande et le contenu d'un registre de données D0-D7.
Modifications du registre CCR:
X: Idem à C V: 1 si débordement
N: 1 si résultat<0 C: 1 si retenue
Z: 1 si résultat=0
Exemple assembleur:
ADD.W #$1234, D0
ADD.L D0, -(A1)
ADDA Addition avec registre d'adresse
Syntaxe: ADDA <AE>, An
Taille opérande: Word, Long word
Addition binaire entre un opérande et le contenu d'un registre d'adresse.
Modifications du registre CCR:
Non affecté
Exemple assembleur:
ADDA.W #$1234, A0
ADDA.L -(A1), A0
ADDI Addition Immédiate
Syntaxe: ADDI #<donnée>, <AE>
Taille opérande: Byte, Word, Long word
Addition binaire entre la donnée Immédiate et l'opérande de destination.
Modifications du registre CCR:
X: Idem à C V: 1 si débordement
N: 1 si résultat<0 C: 1 si retenue
Z: 1 si résultat=0
Exemple assembleur:
ADDI.W #$1234, D5
ADDI.B #$03, (A4)+
ADDQ Addition rapide
Syntaxe: ADDQ #<donnée>, <AE>
Taille opérande: Byte, Word, Long word
Addition binaire entre la donnée Immédiate et l'opérande de destination.
La donnée est comprise entre $01 et $08.
Modifications du registre CCR:
X: Idem à C V: 1 si débordement
N: 1 si résultat<0 C: 1 si retenue
Z: 1 si résultat=0
Exemple assembleur:
ADDQ.B #$01, D0
ADDQ.L #$07, $02(A1)
ADDX Addition binaire avec le bit d'extension
Syntaxe: ADDX Dy, Dx
ou ADDX -(Ay), -(Ax)
Taille opérande: Byte, Word, Long word
Addition de la source et de la destination avec le bit d'extension X.
Modifications du registre CCR:
X: Idem à C V: 1 si débordement
N: 1 si résultat<0 C: 1 si retenue
Z: 0 si résultat<>0
sinon inchangé
Exemple assembleur:
ADDX.B D0, D1
ADDX.L -(A0), -(A1)
AND ET logique
Syntaxe: AND <AE>, Dn
ou AND Dn, <AE>
Taille opérande: Byte, Word, Long word
ET logique entre source et destination.
Modifications du registre CCR:
X: Non affecté V = 0
N: 1 si le MSB du résultat=1 C = 0
Z: 1 si résultat=0
Exemple assembleur:
AND.W #$1234, D0
AND.L -(A2), D3
ANDI ET logique Immédiat
Syntaxe: ANDI #<donnée>, <AE>
Taille opérande: Byte, Word, Long word
ET logique entre la donnée Immédiate et la destination.
Modifications du registre CCR:
X: Non affecté V = 0
N: 1 si le MSB du résultat=1 C = 0
Z: 1 si résultat=0
Exemple assembleur:
ANDI.W #$1234, D5
ANDI.B #$67, -(A2)
ANDI to CCR
Syntaxe: ANDI #<donnée 8 bits>, CCR
Taille opérande: Byte
ET logique entre une donnée 8 bits et le registre de Codes Conditions CCR
Modifications du registre CCR:
X, N, Z, V, C: résultat de l'opération CCR And #<donnée>
Exemple assembleur:
ANDI.B #$12, CCR
ANDI to SR
Syntaxe: ANDI #<donnée 16 bits>, SR
Taille opérande: Word
ET logique entre une donnée 16 bits et le registre d'Etat si le processeur est en mode Superviseur.
Modifications du registre CCR:
X, N, Z, V, C: résultat de l'opération SR And #<donnée b4..b0>
Exemple assembleur:
ANDI.L #$1234, SR
ASL Décalage arithmétique gauche
Syntaxe: ASL Dx, Dy
ou ASL #<donnée>, Dy
ou ASL <AE>
Taille opérande: Byte, Word, Long word
Décalage arithmétique gauche des bits de l'opérande.
Registre: Nombre de Décalages -> donnée Immédiate (0-7)
Stocké dans Dx
Case mémoire: Un seul Décalage, exclusivement sur un mot.
Modifications du registre CCR:
X: Idem C V: 1 si le MSB a été modifié
N: 1 si le MSB du résultat=1 C: Dernier bit sorti de l'opérande
Z: 1 si résultat=0
Exemple assembleur:
ASL.B D0, D1
ASL.W #$1234, D0
ASL (A1)+
ASR Décalage arithmétique droit
Syntaxe: ASR Dx, Dy
ou ASR #<donnée>, Dy
ou ASR <AE>
Taille opérande: Byte, Word, Long word
Décalage arithmétique droit des bits de l'opérande.
Registre: Nombre de Décalages -> donnée Immédiate (0-7)
Stocké dans Dx
Case mémoire: Un seul Décalage, exclusivement sur un mot.
Modifications du registre CCR:
X: Idem C V: 1 si le MSB a été modifié
N: 1 si le MSB du résultat=1 C: Dernier bit sorti de l'opérande
Z: 1 si résultat=0
Exemple assembleur:
ASR.B D0, D1
ASR.W #$1234, D0
ASR (A1)+
BCC .. BVS Branchements conditionnels
Les branchements conditionnels, ou sauts, sont effectués en fonction du contenu du Registre CCR.
Syntaxe: BEQ <étiquette>
BCS <étiquette>
Si la condition est vraie, l'exécution du programme se poursuit à l'adresse (PC) + Déplacement mentionné par l' étiquette.
Exemple assembleur:
BEQ $06
BNE @LaBas // Le @ est spécifique à l'assembleur Ed
Modifications du registre CCR:
Non affecté
Description des différents branchements Conditions CCR pour branchement
BCC: Branchement si retenue à zéro C=0
BCS: Branchement si retenue à un C=1
BEQ: Branchement si égal Z=1
BNE: Branchement si différent Z=0
BGE: Branchement si supérieur ou égal N xor V = 0
BGT: Branchement si supérieur Z + [N xor V] = 0
BHI: Branchement si supérieur C + Z = 0
BLE: Branchement si inférieur ou égal Z + [N xor V] = 1
BLS: Branchement si inférieur ou égal C + Z = 1
BLT: Branchement si inférieur N xor V = 1
BMI: Branchement si négatif N=1
BPL: Branchement si positif N=0
BVC: Branchement si pas de dépassement V=0
BVS: Branchement si dépassement V=1
BT: Branchement si vrai tout le temps
BF: Branchement si faux jamais
BCHG Test d'un bit et modification
Syntaxe: BCHG Dn, <AE>
ou BCHG #<donnée>, <AE>
Taille opérande: Byte, Long word
Un bit de la destination est testé pour permettre le positionnement du flag Z, puis ce bit est inversé.
Dans le cas d'une opération sur une case mémoire, les bits 0 à 7 peuvent être testés (octet).
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: 1 si résultat=0
Exemple assembleur:
BCHG.L D0, D1
BCHG.B #$02, -(A1)
BCLR Test d'un bit et remise à zéro
Syntaxe: BCLR Dn, <AE>
ou BCLR #<donnée>, <AE>
Taille opérande: Byte, Long word
Un bit de la destination est testé pour permettre le positionnement du flag Z, puis ce bit est mis à zéro.
Dans le cas d'une opération sur une case mémoire, les bits 0 à 7 peuvent être testés (octet).
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: 1 si résultat=0
Exemple assembleur:
BCLR.L D0, D1
BCLR.B #$02, -(A1)
BRA Branchement inconditionnel
Syntaxe: BRA <étiquette>
Taille opérande: Byte, Word
L'instruction suivante qui sera exécutée est située à l'adresse
(PC) + Etiquette
Modifications du registre CCR:
Non affecté
Exemple assembleur:
BRA $02
BRA @LaBas // Le @ est spécifique à Ed
BSET Test d'un bit et mise à un
Syntaxe: BSET Dn, <AE>
ou BSET #<donnée>, <AE>
Taille opérande: Byte, Long word
Un bit de la destination est testé pour permettre le positionnement du flag Z, puis ce bit est mis à un.
Dans le cas d'une opération sur une case mémoire, les bits 0 à 7 peuvent être testés (octet).
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: 1 si résultat=0
Exemple assembleur:
BSET.L D0, D1
BSET.B #$02, -(A1)
BSR Branchement sous-programme
Syntaxe: BSR <étiquette>
Taille opérande: Byte, Word
L'adresse 32 bit de l'instruction suivante est sauvegardée dans la pile puis l'exécution du programme se poursuit à l'adresse
(PC) + Etiquette
Modifications du registre CCR:
Non affecté
Exemple assembleur:
BSR $02
BSR @LàBas
BTST Test d'un bit
Syntaxe: BTST Dn, <AE>
ou BTST #<donnée>, <AE>
Taille opérande: Byte, Long word
Un bit de la destination est testé pour permettre le positionnement du flag Z du CCR. Le bit testé n'est pas modifié.
Dans le cas d'une opération sur une case mémoire, les bits 0 à 7 peuvent être testés (octet).
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: 1 si résultat=0
Exemple assembleur:
BTST.L D0, D1
BTST.B #$02, -(A1)
CHK Test des limites d'un registre
Syntaxe: CHK <AE>, Dn
Taille opérande: Word
Les 16 bits de poids faible du registre de données Dn sont comparées ainsi:
Si (Dn) < 0 ou (Dn) > (<AE>), le processeur génère l'exception Chk.
Modifications du registre CCR:
X: Non affecté V: Indéfini
N: 1 si (Dn)<0, 0 si (Dn)>(<AE>) C: Indéfini
Z: Indéfini
Exemple assembleur:
CHK.W D0, D1
CHK.W -(A1), D2
CHK.W #$1234, D2
CLR Remise à zéro d'un opérande
Syntaxe: CLR <AE>
Taille opérande: Byte, Word, Long word
Tous les bits de la destination sont mis à zéro.
Modifications du registre CCR:
X: Non affecté V: =0
N: =0 C: =0
Z: =1
Exemple assembleur:
CLR.L D1
CLR.B -(A1)
CMP Comparaison Registre Dn
Syntaxe: CMP <AE>, Dn
Taille opérande: Byte, Word, Long word
L'opérande source est soustrait de l'opérande destination afin de positionner les flags Registre CCR: .
Modifications du registre CCR:
X: Non affecté V: 1 si débordement
N: 1 si résultat<0 C: 1 si retenue
Z: 1 si résultat=0
Exemple assembleur:
CMP.L D0, D1
CMP.W #$1234, D2
CMP.L -(A1), D0
CMPA Comparaison Adresse An
Syntaxe: CMPA <AE>, An
Taille opérande: Word, Long word
L'opérande source est soustrait de l'opérande destination afin de positionner les flags Registre CCR.
Modifications du registre CCR:
X: Non affecté V: 1 si débordement
N: 1 si résultat<0 C: 1 si retenue
Z: 1 si résultat=0
Exemple assembleur:
CMP.L D0, A1
CMP.W #$1234, A5
CMP.L -(A1), A4
CMPI Comparaison Immédiate
Syntaxe: CMPI #<donnée>, <AE>
Taille opérande: Byte, Word, Long word
La donnée Immédiate est soustraite de l'opérande destination afin de positionner les flags Registre CCR.
Modifications du registre CCR:
X: Non affecté V: 1 si débordement
N: 1 si résultat<0 C: 1 si retenue
Z: 1 si résultat=0
Exemple assembleur:
CMPI.B #$02, D1
CMPI.W #$1234, (A1)+
CMPI.L #$12345678, -(A3)
CMPM Comparaison mémoire
Syntaxe: CMPM (Ay)+, (Ax)+
Taille opérande: Byte, Word, Long word
L'opérande source est soustrait de l'opérande destination afin de positionner les flags Registre CCR: .
Modifications du registre CCR:
X: Non affecté V: 1 si débordement
N: 1 si résultat<0 C: 1 si retenue
Z: 1 si résultat=0
Exemple assembleur:
CMPA.L (A1)+, (A0)+
CMPA.B (A2)+, (A1)+
DBCC .. DBVS
Test condition, Décrémentation et branchement.
Syntaxe: DBcc Dn, <étiquette>
Taille opérande: Word
Modifications du registre CCR:
Non affecté
- Si la condition est vérifiée (Dn=-1):
Pas d'opération.
- Si la condition n'est pas vérifiée (Dn<>-1):
- Dn=Dn-1
- Branchement à l'adresse (PC) + Déplacement mentionné par l' Etiquette.
Les conditions sont identiques à celles des instructions BCC .. BVS.
Exemple assembleur:
DBNE D0, $02
DBEQ D1, @LaBas
DIVS Division signée
Syntaxe: DIVS <AE>, Dn
Taille opérande: Word
Division de l'opérande destination 32 bits par l'opérande source 16 bits.
Le résultat 32 bits signé est organisé comme suit:
- Quotient : Mot de poids faible
- Reste : Mot de poids fort.
Le signe du reste est le même que celui du dividende, le débordement peut être positionné.
Modifications du registre CCR:
X: Non affecté V: 1 si débordement
N: 1 si quotient<0, Indéfini si V=1 C: =0
Z: 1 si quotient=0, Indéfini si V=1
Exemple assembleur:
DIVS.W #$1234, D0
DIVS.W -(A1), D2
DIVU Division non signée
Syntaxe: DIVU <AE>, Dn
Taille opérande: Word
Division de l'opérande destination 32 bits par l'opérande source 16 bits.
Le résultat 32 bits non signé est organisé comme suit:
- Quotient : Mot de poids faible
- Reste : Mot de poids fort.
Modifications du registre CCR:
X: Non affecté V: 1 si débordement
N: 1 si MSB quotient=1, Indéfini si V=1 C: =0
Z: 1 si quotient=0, Indéfini si V=1
Exemple assembleur:
DIVU.W #$1234, D0
DIVU.W -(A1), D2
EOR OU Exclusif XOR
Syntaxe: EOR Dn, <AE>
Taille opérande: Byte, Word, Long word
OU Exclusif XOR entre source et destination, le résultat est mis dans la destination.
Modifications du registre CCR:
X: Non affecté V: =0
N: 1 si MSB résultat=1 C: =0
Z: 1 si résultat=0
Exemple assembleur:
EOR.W D0, D1
EOR.B D1, $12345678
EOR.L D2, (A1)+
EORI OU Exclusif XOR Immédiat
Syntaxe: EORI #<donnée>, <AE>
Taille opérande: Byte, Word, Long word
OU Exclusif XOR entre donnée Immédiate et destination, le résultat est mis dans la destination.
Modifications du registre CCR:
X: Non affecté V: =0
N: 1 si MSB résultat=1 C: =0
Z: 1 si résultat=0
Exemple assembleur:
EORI.W #$1234, (A1)+
EORI.B #$12, $12345678
EORI to CCR
Syntaxe: EORI #<donnée 8 bits>, CCR
Taille opérande: Byte
OU Exclusif XOR entre les 8 bits de la donnée Immédiate et le registre de Code Conditions CCR.
Modifications du registre CCR:
X, N, Z, V, C: résultat de l'opération CCR XOR #<donnée>
Exemple assembleur:
EORI.B #$12, CCR
EORI to SR
Syntaxe: EORI #<donnée 16 bits>, SR
Taille opérande: Word
OU Exclusif XOR entre les 16 bits de la donnée Immédiate et le registre d'état SR si le processeur est en mode Superviseur.
Modifications du registre CCR:
X, N, Z, V, C:
(Recopie dans CCR du résultat de l'opération SR XOR #<donnée>)
Exemple assembleur:
EORI.W #$1234, SR
EXG Echange de registres
Syntaxe: EXG Rx, Ry
Taille opérande: Long word
Echange entre deux registres 32 bits.
Ces échanges peuvent être:
- Dn, An, Dn-An, An-Dn.
Modifications du registre CCR:
Non affecté
Exemple assembleur:
EXG D1, A2
EXT Extension du signe d'un registre de données
Syntaxe: EXT Dn
Taille opérande: Word, Long word
Sur un Mot: Recopie du bit 7 sur les bits 8 à 15.
Sur un Mot long: Recopie du bit 15 sur les bits 16 à 31.
Modifications du registre CCR:
X: Non affecté V: =0
N: 1 si résultat<0 C: =0
Z: 1 si résultat=0
Exemple assembleur:
EXT.W D1
ILLEGAL
Cette instruction codée $4AFC génère l'exception "Instruction Illégale"
de vecteur nø4.
Modifications du registre CCR:
Non affecté
JMP Saut de type Jump
Syntaxe: JMP <AE>
Taille opérande: Aucun
L'exécution se poursuit à l'adresse spécifiée dans l'instruction, qui peut être une Etiquette
Modifications du registre CCR:
Non affecté
Exemple assembleur:
JMP.L (A1)
JMP @LaBas
JSR Saut vers un sous programme
Syntaxe: JSR <AE>
Taille opérande: Aucun
L'exécution se poursuit à l'adresse spécifiée dans l'instruction, qui peut être une Etiquette.
L'adresse de l'instruction suivante est d'abord mise sur la pile.
Modifications du registre CCR:
Non affecté
Exemple assembleur:
JSR.L (A1)
JSR @LaBasAussi
LEA Chargement adresse effective
Syntaxe: LEA <AE>, An
Taille opérande: Long word
Les 32 bits de l'adresse effective sont chargés dans le registre d'adresse An.
Modifications du registre CCR:
Non affecté
Exemple assembleur:
LEA.L $12345678, A1
LEA.L $04(A0), A2
LINK Réalisation de liens Link
Syntaxe: LINK An, #<Déplacement 16 bits>
Taille opérande: Aucun
Le contenu de An est mis sur la pile, puis An est chargé avec la valeur du SP. Enfin, le Déplacement Immédiat est ajouté au SP avec extension sur 32 bits.
Modifications du registre CCR:
Non affecté
Exemple assembleur:
LINK A1, #$1234
LSL Décalage logique gauche
Syntaxe: LSL Dx, Dy
ou LSL #<donnée>, Dy
ou LSL <AE>
Taille opérande: Byte, Word, Long word
Décalage logique gauche des bits de l'opérande.
Registre: Nombre de Décalages -> donnée Immédiate (0-7)
Stocké dans Dx
Case mémoire: Un seul Décalage, exclusivement sur un mot.
Modifications du registre CCR:
X: Idem C V: =0
N: 1 si résultat<0 C: Dernier bit sorti de l'opérande
Z: 1 si résultat=0
Exemple assembleur:
LSL.B D0, D1
LSL.W #$1234, D0
LSL (A1)+
LSR Décalage logique droit
Syntaxe: LSR Dx, Dy
ou LSR #<donnée>, Dy
ou LSR <AE>
Taille opérande: Byte, Word, Long word
Décalage logique droit des bits de l'opérande.
Registre: Nombre de Décalages -> donnée Immédiate (0-7)
Stocké dans Dx
Case mémoire: Un seul Décalage, exclusivement sur un mot.
Modifications du registre CCR:
X: Idem C V: =0
N: 1 si résultat<0 C: Dernier bit sorti de l'opérande
Z: 1 si résultat=0
Exemple assembleur:
LSR.B D0, D1
LSR.W #$1234, D0
LSR (A1)+
MOVE Transfert de données
Syntaxe: MOVE <AE>, <AE>
Taille opérande: Byte, Word, Long word
Transfert de l'opérande Source vers la Destination
Modifications du registre CCR:
X: Non affecté V: =0
N: 1 si résultat < 0 C: =0
Z: 1 si résultat = 0
Exemple assembleur:
MOVE.W D0, D2
MOVE.B D1, $12345678
MOVE.L D2, (A4)+
MOVE to CCR Transfert vers le CCR
Syntaxe: MOVE <AE>, CCR
Taille opérande: Word
Transfert de l'opérande Source vers le Registre de Codes-Condition
Remarque: Seuls les 8 bits de poids faible sont pris en compte
Modifications du registre CCR:
X: Bit 4 de la source V: Bit 1 de la source
N: Bit 3 de la source C: Bit 0 de la source
Z: Bit 2 de la source
Exemple assembleur:
MOVE.W D0, CCR
MOVE.W #$1234, CCR
MOVE -(A0), CCR
MOVEA Transfert vers un registre d'adresse
Syntaxe: MOVE <AE>, An
Taille opérande: Word, Long word
Transfert de l'opérande Source vers un registre d'adresse.
Un opérande source 16 bits voit son signe étendu à 32 bits.
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: Non affecté
Exemple assembleur:
MOVEA.W $02(A1), A0
MOVEA.L #$12345678, A1
MOVE USP Transfert le pointeur de pile utilisateur USP
Syntaxe: MOVE USP, An
ou MOVE An, USP
Taille opérande: Long word
Le contenu du pointeur de pile utilisateur USP est transféré de ou vers le registre d'adresse An.
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: Non affecté
Exemple assembleur:
MOVE USP, A1
MOVE A0, USP
MOVE From SR Transfert depuis SR
Syntaxe: MOVE SR, <AE>
Taille opérande: Word
Le contenu du registre d'état est transféré à l'emplacement Destination
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: Non affecté
Exemple assembleur:
MOVE SR, D0
MOVE SR, $02(A1)
MOVE To SR Transfert vers le SR
Syntaxe: MOVE <AE>, SR
Taille opérande: Word
L'opérande Source est transféré dans le registre d'état SR.
On doit être en mode Superviseur, sinon "violation de privilège"
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: Non affecté
Exemple assembleur:
MOVE D0, SR
MOVE $02(A1), SR
MOVEM Transfert de registres multiples
non traité par Ed.
MOVEP Transfert de données périphériques
non traité par Ed.
MOVEQ Transfert rapide
Syntaxe: MOVEQ #<donnée>, Dn
Taille opérande: Long word
Transfert d'une donnée Immédiate dans un registre de données.
La données est de 8 bits et sera étendue à 32 bits.
Modifications du registre CCR:
X: Non affecté V: =0
N: 1 si résultat < 0 C: =0
Z: 1 si résultat = 0
Exemple assembleur:
MOVEQ #$12, D0
MULS Multiplication signée
Syntaxe: MULS <AE>, Dn
Taille opérande: Word
Multiplication 2 x 16 bits, résultat signé sur 32 bits dans Dn
Modifications du registre CCR:
X: Non affecté V: =0
N: 1 si résultat < 0 C: =0
Z: 1 si résultat = 0
Exemple assembleur:
MULS D0, D1
MULS #$1234, D2
MULS $1234, D3
MULU Multiplication non signée
Syntaxe: MULU <AE>, Dn
Taille opérande: Word
Multiplication 2 x 16 bits, résultat non signé sur 32 bits dans Dn
Modifications du registre CCR:
X: Non affecté V: =0
N: 1 si MSB résultat=1 C: =0
Z: 1 si résultat = 0
Exemple assembleur:
MULU D0, D1
MULU #$1234, D2
MULU $1234, D3
NBCD Complémentation décimale avec le bit d'extension
Syntaxe: NBCD <AE>
Taille opérande: Byte
L'opérande et le bit X du CCR sont soustraits à zéro, le résultat est mis dans l'opérande. Si X=0, on a un complément à 10, sinon il s'agit d'une complémentation à 9.
Modifications du registre CCR:
X: =1 si retenue décimale V: Indéfini
N: Indéfini C: =1 si retenue décimale
Z: 0 si résultat <> 0
Exemple assembleur:
NBCD D0
NBCD $1234
NEG Négation
Syntaxe: NEG <AE>
Taille opérande: Byte, Word, Long word
L'opérande est soustrait de zéro. Le résultat est remis dans l'opérande.
Modifications du registre CCR:
X: =1 si retenue décimale V: =1 si débordement
N: =1 si résultat < 0 C: =1 si retenue décimale
Z: =1 si résultat = 0
Exemple assembleur:
NEG.W D0
NEG.L $02(A0)
NEGX Négation avec le bit d'extension
Syntaxe: NEGX <AE>
Taille opérande: Byte, Word, Long word
L'opérande et le bit X sont soustraits de zéro.
Le résultat est remis dans l'opérande.
Modifications du registre CCR:
X: =1 si retenue décimale V: Indéfini
N: Indéfini C: =1 si retenue décimale
Z: =0 si résultat <> 0
Exemple assembleur:
NEGX.W D0
NEGX.L $02(A0)
NOP Pas d'opération
Syntaxe: NOP
Taille opérande: Aucun
Aucune opération ne se produit, l'état du processeur reste inchangé sauf pour le PC qui pointe sur l'instruction suivante.
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: Non affecté
Exemple assembleur:
NOP
NOT Complément à un
Syntaxe: NOT <AE>
Taille opérande: Byte, Word, Long word
Complément à un de l'opérande.
Modifications du registre CCR:
X: Non affecté V: =0
N: =1 si résultat < 0 C: =0
Z: =1 si résultat = 0
Exemple assembleur:
NOT.W D0
NOT.L $02(A0)
OR OU logique inclusif
Syntaxe: OR <AE>, Dn
ou OR Dn, <AE>
Taille opérande: Byte, Word, Long word
OU logique entre la source et la destination.
Modifications du registre CCR:
X: Non affecté V: =0
N: =1 si MSB résultat=1 C: =0
Z: =1 si résultat = 0
Exemple assembleur:
OR.W D1, D0
OR.L D1, $02(A3)
ORI OU logique inclusif Immédiat
Syntaxe: ORI #<donnée>, <AE>
Taille opérande: Byte, Word, Long word
OU logique entre la donnée Immédiate et la destination.
Modifications du registre CCR:
X: Non affecté V: =0
N: =1 si MSB résultat=1 C: =0
Z: =1 si résultat = 0
Exemple assembleur:
ORI.B #$03, (A1)+
ORI.W #$1234, D1
ORI to CCR OU logique inclusif avec le CCR
Syntaxe: ORI #<donnée>, CCR
Taille opérande: Byte
OU logique entre la donnée Immédiate 8 bits et le CCR.
Modifications du registre CCR:
X: =1 si bit 4 donnée =1 V: =1 si bit 1 donnée =1
N: =1 si bit 3 donnée =1 C: =1 si bit 0 donnée =1
Z: =1 si bit 2 donnée =1
Exemple assembleur:
ORI #$02, CCR
ORI to SR OU logique inclusif avec le SR
Syntaxe: ORI #<donnée 16 bits>, SR
Taille opérande: Byte
OU logique entre la donnée Immédiate 16 bits et le SR. Le processeur
doit être en mode Superviseur, sinon "violation de privilège".
Modifications du registre CCR:
X: =1 si bit 4 donnée =1 V: =1 si bit 1 donnée =1
N: =1 si bit 3 donnée =1 C: =1 si bit 0 donnée =1
Z: =1 si bit 2 donnée =1
Exemple assembleur:
ORI #$0002, SR
PEA Sauvegarde adresse effective
Syntaxe: PEA <AE>
Taille opérande: Long word
L'adresse effective est mise sur la pile.
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: Non affecté
Exemple assembleur:
PEA (A0)
PEA $1234
RESET Remise à zéro des circuits externes
Syntaxe: RESET
Taille opérande: Aucun
La sortie Hardware Reset est validée si on est en mode superviseur.
Sinon, violation de privilège.
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: Non affecté
Exemple assembleur:
RESET
ROL Rotation à gauche
Syntaxe: ROL Dx, Dy
ou ROL #<donnée>, Dy
ou ROL <AE>
Taille opérande: Byte, Word, Long word
Rotation à gauche de la destination. Le nombre de rotations est indiqué
par la source.
Si l'opérande est une case mémoire, il n'y a qu'une rotation.
Modifications du registre CCR:
X: Non affecté V: =0
N: =1 si MSB résultat =1 C: dernier bit hors de l'opérande
Z: =1 si résultat =0 ou 0 pour une rotation nulle.
Exemple assembleur:
ROL (A0)+
ROL #$01, D0
ROR Rotation à droite
Syntaxe: ROR Dx, Dy
ou ROR #<donnée>, Dy
ou ROR <AE>
Taille opérande: Byte, Word, Long word
Rotation à droite de la destination. Le nombre de rotations est indiqué
par la source.
Si l'opérande est une case mémoire, il n'y a qu'une rotation.
Modifications du registre CCR:
X: Non affecté V: =0
N: =1 si MSB résultat =1 C: dernier bit hors de l'opérande
Z: =1 si résultat =0 ou 0 pour une rotation nulle.
Exemple assembleur:
ROR (A0)+
ROR #$01, D0
ROLX Rotation à gauche avec le bit d'extension
Syntaxe: ROLX Dx, Dy
ou ROLX #<donnée>, Dy
ou ROLX <AE>
Taille opérande: Byte, Word, Long word
Rotation à gauche de la destination. Le nombre de rotations est indiqué par la source. La rotation se fait par le bit X du CCR.
Si l'opérande est une case mémoire, il n'y a qu'une rotation.
Modifications du registre CCR:
X: Idem C V: =0
N: =1 si MSB résultat =1 C: dernier bit hors de l'opérande
Z: =1 si résultat =0 ou 0 pour une rotation nulle.
Exemple assembleur:
ROLX (A0)+
ROLX #$01, D0
RORX Rotation à droite avec le bit d'extension
Syntaxe: RORX Dx, Dy
ou RORX #<donnée>, Dy
ou RORX <AE>
Taille opérande: Byte, Word, Long word
Rotation à droite de la destination. Le nombre de rotations est indiqué par la source. La rotation se fait par le bit X du CCR.
Si l'opérande est une case mémoire, il n'y a qu'une rotation.
Modifications du registre CCR:
X: Idem C V: =0
N: =1 si MSB résultat =1 C: dernier bit hors de l'opérande
Z: =1 si résultat =0 ou 0 pour une rotation nulle.
Exemple assembleur:
RORX (A0)+
RORX #$01, D0
RTE Retour d'exception
Syntaxe: RTE
Taille opérande: Aucun
Le registre SR et le PC sont restitués par la pile si le processeur est en mode superviseur, sinon il y a "violation de privilège".
Modifications du registre CCR:
X: Suivant mot dépilé V: Suivant mot dépilé
N: Suivant mot dépilé C: Suivant mot dépilé
Z: Suivant mot dépilé
Exemple assembleur:
RTE
RTR Retour de sous-programme et restitution des Codes Condition
Syntaxe: RTR
Taille opérande: Aucun
Le registre CCR et le PC sont restitués par la pile.
Le registre SR n'est pas affecté.
Modifications du registre CCR:
X: Suivant mot dépilé V: Suivant mot dépilé
N: Suivant mot dépilé C: Suivant mot dépilé
Z: Suivant mot dépilé
Exemple assembleur:
RTR
RTS Retour de sous-programme
Syntaxe: RTS
Taille opérande: Aucun
Le registre PC est restitué par la pile.
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: Non affecté
Exemple assembleur:
RTS
SBCD Soustraction décimale avec le bit d'extension
Syntaxe: SBCD Dy, Dx ou SBCD -(Ay), -(Ax)
Taille opérande: Byte
Soustraction de la Source et du bit X à la Destination. Le résultat
en décimal codé binaire est mis dans la Destination.
Modifications du registre CCR:
X: =1 si retenue décimale V: Indéfini
N: Indéfini C: =1 si retenue décimale
Z: =0 si résultat <> 0
Exemple assembleur:
SBCD D0, D1
SBCD -(A1), -(A0)
Scc Positionnement selon condition
Syntaxe: Scc <AE>
Taille opérande: Byte
La condition spécifiée est testée. Si la condition est vraie, l'octet
adressé par <AE> est mis à $FF. Sinon, il est mis à $00.
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: Non affecté
Exemple assembleur: SEQ @Etiquette
SNE @LaBas
STOP Chargement du SR et arrêt
Syntaxe: STOP #<donnée 16 bits>
Taille opérande: Aucun
La donnée Immédiate 16 bits est mise dans le SR.
Le PC est positionné sur la prochaine instruction et le processeur s'arrête. L'exécution reprend après une exception Trace, une interruption ou un Reset.
Le processeur doit être en mode Superviseur.
Modifications du registre CCR:
X: Suivant donnée Immédiate V: Suivant donnée Immédiate
N: Suivant donnée Immédiate C: Suivant donnée Immédiate
Z: Suivant donnée Immédiate
Exemple assembleur
STOP #$1234
SUB Soustraction binaire
Syntaxe: SUB <AE>, Dn
ou SUB Dn, <AE>
Taille opérande: Byte, Word, Long word
Soustraction de la Source et de la Destination.
Le résultat est mis dans la Destination.
Modifications du registre CCR:
X: =1 si retenue V: =1 si débordement
N: =1 si résultat < 0 C: =1 si retenue
Z: =1 si résultat = 0
Exemple assembleur
SUB.W D0, D1
SUB.W $02(A1), D0
SUBA Soustraction à un registre d'adresse
Syntaxe: SUBA <AE>, An
Taille opérande: Word, Long word
Soustraction de la Source et de la Destination.
Le résultat est mis dans la Destination et l'opérande source est étendu à 32 bits avant l'opération.
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: Non affecté
Exemple assembleur
SUBA.W D0, A1
SUBA.L $02(A1), A0
SUBI Soustraction Immédiate
Syntaxe: SUBI #<donnée>, <AE>
Taille opérande: Byte, Word, Long word
Soustraction de la donnée Immédiate et de la Destination.
Le résultat est mis dans la Destination.
Modifications du registre CCR:
X: =1 si retenue V: =1 si débordement
N: =1 si résultat < 0 C: =1 si retenue
Z: =1 si résultat = 0
Exemple assembleur:
SUBI.W #$1234, D1
SUBI.B #$12, (A1)+
SUBQ Soustraction rapide
Syntaxe: SUBQ #<donnée 8 bits>, <AE>
Taille opérande: Byte, Word, Long word
Soustraction de la donnée Immédiate et de la Destination.
La donnée peut prendre les valeurs 1 à 8. Le résultat est mis dans la Destination.
Le CCR n'est pas affecté dans le cas de la soustraction à un registre d'adresse.
Modifications du registre CCR:
X: =1 si retenue V: =1 si débordement
N: =1 si résultat < 0 C: =1 si retenue
Z: =1 si résultat = 0
Exemple assembleur:
SUBQ.B #$01, D0
SUBQ.L #$01, $02(A1)
SUBX Soustraction avec bit d'extension
Syntaxe: SUBX Dy, Dx
ou SUBX -(Ay), -(Ax)
Taille opérande: Byte, Word, Long word
Soustraction de la Source et du bit X à la Destination.
Le résultat est mis dans la Destination.
Modifications du registre CCR:
X: =1 si retenue V: =1 si débordement
N: =1 si résultat < 0 C: =1 si retenue
Z: =0 si résultat <> 0
Exemple assembleur:
SUBX.B D0, D1
SUBX.L -(A1), -(A0)
SWAP Echange interne
Syntaxe: SWAP Dn
Taille opérande: Word
Echange entre les 16 bits de poids faible et les 16 bits de poids fort d'un registre de données.
Modifications du registre CCR:
X: Non affecté V: =0
N: =1 MSB résultat = 1 C: =0
Z: =1 si résultat = 0
Exemple assembleur:
SWAP D3
TAS Test d'un octet et mise à 1 du bit 7
Syntaxe: TAS <AE>
Taille opérande: Byte
Test d'un octet par l'adresse effective dont le bit 7 est mis à 1.
Modifications du registre CCR:
X: Non affecté V: =0
N: =1 MSB résultat = 1 C: =0
Z: =1 si résultat = 0
Exemple assembleur:
TAS D0
TAS $02(A1)
TRAP Demande d'exception Trap
Syntaxe: TRAP #<numéro>
Taille opérande: Aucun
Le processeur entame une procédure d'exception.
Le numéro permet de disposer de 16 vecteurs propres à l'instruction TRAP.
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: Non affecté
Exemple assembleur:
TRAP #1
TRAPV Exception si débordement
Syntaxe: TRAPV
Taille opérande: Aucun
Si le bit V du CCR est positionné, il y a génération de l'exception
de vecteur nø 7. Sinon, l'exécution du programme se poursuit normalement.
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: Non affecté
Exemple assembleur:
TRAPV
TST Test d'un opérande
Syntaxe: TST <AE>
Taille opérande: Byte, Word, Long word
L'opérande est comparé à zéro. Les codes condition sont alors positionnés.
Modifications du registre CCR:
X: Non affecté V: =0
N: =1 si résultat < 0 C: =0
Z: =1 si résultat = 0
Exemple assembleur:
TST.W D0
TST.L $02(A1)
UNLK Déconnexion (UnLink)
Syntaxe: UNLK An
Taille opérande: Aucun
Le registre d'adresse An est transféré dans le pointeur de pile.
Le contenu de la pile est ensuite transféré dans An. Il s'agit du processus complémentaire de LINK.
Modifications du registre CCR:
X: Non affecté V: Non affecté
N: Non affecté C: Non affecté
Z: Non affecté
Exemple assembleur:
UNLK A2
Conclusion:
Nous avons donc passé toutes les instructions MC68000 en revue.
Ce jeu d'instructions est exttrèmement puissant, et permet en quelques lignes de réaliser des traitements nécessitant un code complexe sur d'autres coeurs de processeurs ayant un jeu d'instrucions plus réduit.
Certains modes d'adressage sont un peu plus complexes à assimiler, mais l'effort en vaut la chandelle...
Bibliographie:
MC68000 databook Motorola
Mise en oeuvre du 68000 par Catherine Viellefond (Sybex)