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)