Obligement - L'Amiga au maximum

Mercredi 12 août 2020 - 00:34  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Quizz
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Trucs et astuces
 · Articles divers

 · Articles in english


Twitter

Suivez-nous sur Twitter




Liste des jeux Amiga

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


Trucs et astuces

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


Glossaire

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


Galeries

 · Menu des galeries

 · BD d'Amiga Spécial
 · Caricatures Dudai
 · Caricatures Jet d'ail
 · Diagrammes de Jay Miner
 · Images insolites
 · Fin de jeux (de A à E)
 · Fin de Jeux (de F à O)
 · Fin de jeux (de P à Z)
 · Galerie de Mike Dafunk
 · Logos d'Obligement
 · Pubs pour matériels
 · Systèmes d'exploitation
 · Trombinoscope Alchimie 7
 · Vidéos


Téléchargement

 · Documents
 · Jeux
 · Logiciels
 · Magazines
 · Divers


Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Logiciels
 · Jeux
 · Scène démo
 · Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


Dossier : Les nouvelles instructions du 68030
(Article écrit par Emmanuel Hocdet et extrait d'Amiga News Tech - avril 1992)


Après avoir vu les dix-huit modes d'adressage dont dispose le 68030, attaquons-nous maintenant à ses nouvelles instructions dont certaines, vous le verrez, sont réellement très puissantes.

Pour une plus grande clarté, les instructions sont ici classées par type (dix au total) et concernent les processeurs descendant du 68020, sauf précision. Il est à noter que toutes les instructions et les modes d'adressage ont une compatibilité ascendante. L'abréviation "<ae>" signifie "adresse effective" et exprime la possibilité d'utiliser différents modes d'adressage, précisés si nécessaire. Les nouveaux modes d'adressage, expliqués dans l'article précédent, s'appliquent aux instructions du 68000, en continuité avec les modes d'adressage alors autorisés. Par exemple, l'instruction MOVE <ae>,<ae> accepte sur le 68000 tous les adressages indirects. Elle acceptera donc les nouveaux modes du 68020 déclinant de celui-ci, c'est-à-dire toutes les indirections et doubles indirections.

Instructions de transfert et d'échange

LINK

Syntaxe : LINK.L An, #<déplacement>

Le déplacement peut maintenant s'effectuer sur 32 bits (la possibilité de déplacement 16 bits est bien sûr toujours présente).

Instructions arithmétiques

CMP2

Syntaxe : CMP2 <ae>,Rn

Cette instruction permet de déterminer si la valeur du registre Rn se trouve à l'intérieur ou à l'extérieur de deux limites contenues en mémoire. La limite inférieure L sera stockée avant la limite supérieure U. Tous les modes d'adressage permettant un accès à la mémoire sont autorisés, sauf les modes d'incrémentation et de décrémentation. L'opération peut s'effectuer sur un octet, un mot ou un mot long. Si Rn est un registre de données, l'opérande détermine la taille sur laquelle sera réalisé le test. Par contre, si Rn est un registre d'adresse, le test sera effectué sur 32 bits et l'opérande concerne uniquement la taille des deux limites (leur signe sera étendu lors de l'opération).

Si L<Rn<U, C=0 sinon C=1 ; si Rn=L ou Rn=U, Z=1 sinon Z=0. D'où les conditions HI (C or Z=0) si Rn est à l'intérieur strictement et "LS" (C or Z=1) si Rn est à l'extérieur.

DIVS/DIVU

Syntaxe : DIVU.L <ae>,Dg ou DIVU.L <ae>,Dr:Dq

Ces instructions sont des améliorations de DIVS.W et DIVU.W (S pour une division signée et U pour une division non-signée) qui se contentent de diviser un opérande 32 bits situé dans Dn, par un opérande 16 bits. Le résultat est stocké dans un registre de données Dn (16 bits de poids fort pour le reste et 16 bits de poids faible pour le quotient).

"DIVS.L <ae>,Dq" permet d'effectuer une division 32 bits, le quotient se retrouvant alors dans Dq.

"DIVS.L <ae>,Dr:Dq" réalise une division d'un opérande 64 bits, les 32 bits de poids fort dans Dr et les 32 bits de poids faible dans Dq, par un opérande 32 bits. Le résultat est réparti dans les deux registres de données, Dr pour le reste et Dq pour le quotient.

Les drapeaux :
  • C mis à 0.
  • X non affecté.
  • N à 1 si quotient négatif. Mis à 0 sinon. Indéfini si V=1.
  • Z à 1 si quotient nul. Mis à 0 sinon. Indéfini si V=1.
  • V à 1 si le quotient ne peut pas être déterminé dans la taille demandée. Mis à 0 sinon.
DIVSL/DIVUL

Syntaxe : DIVSL.L <ae>,Dr:Dg

Cette opération réalise une division d'un opérande 32 bits contenu dans Dq, par un opérande 32 bits. Le résultat est réparti dans les deux registres de donnée, Dr pour le reste et Dq pour le quotient. Les drapeaux sont affectés comme précédemment, sauf qu'ici il n'y a pas d'indétermination (V=1).

EXTB

Syntaxe : EXTB.L Dn

EXTB étend le signe d'un opérande 8 bits directement sur 32 bits. En 68000, il fallait effectuer deux opérations, "EXT.W Dn" puis "EXT.L Dn". L'affectation des drapeaux correspond à celle de EXT.

MULS/MULU

Syntaxe : MULS.L <ae>,Dg ou MULS.L <ae>,Dr:Dg

Ces instructions sont des améliorations de MULS.W et MULU.W (S pour une multiplication signée et U pour une multiplication non-signée) qui multiplient un opérande 16 bits situé dans un registre de données Dn par un opérande 16 bits. Le résultat est stocké dans Dn sur 32 bits.

"MULU.L <ae>,Dq" permet d'effectuer une multiplication 32 bits, les 32 bits de poids faible du résultat se retrouvent alors dans Dq.

"MULU.L <ae>,Dr:Dq" réalise la multiplication de l'opérande 32 bits Dq par un opérande 32 bits. Les 32 bits de poids fort du résultat sont stockés dans Dr et les 32 bits de poids faible dans Dq. Si Dq=Dr le résultat est indéfini.

Les drapeaux :
  • C mis à 0.
  • X non affecté.
  • N à 1 si résultat négatif. Mis à 0 sinon.
  • Z à 1 si résultat nul. Mis à 0 sinon.
  • V à 1 dans le cas 32x32->32, si les 32 bits de poids fort ne sont pas à 0. Mis à 0 sinon.
Instructions logiques et instructions de manipulation de bits

Rien de changé...

Instructions de décalage et de rotation

Grâce à l'implantation d'un système matériel de décaleur à barillet, toutes les instructions de ce type s'effectuent maintenant en un seul cycle, et cela quel que soit le nombre de décalages.

Instructions de manipulation de champs de bits

Elles forment un nouveau type, comportant huit nouvelles instructions, qui permettent d'effectuer des opérations sur une série de bits. Leur utilisation est très avantageuse dans les compacteurs de données. Les schémas d'accompagnement vous aideront à comprendre leur fonctionnement, pas toujours évident. Dans ce qui suit, L indique un déplacement signé à partir de l'adresse effective et le tout spécifie le début du champ de largeur I à traiter.

BFCHG

Syntaxe : BFCHG <ae>{L:I}

Cette instruction permet de tester un champ de bits de largeur I, à partir de la position <ae> + L, puis d'inverser les bits de ce champ. Les modes autorisés sont l'adressage direct par registre de donnée, tous les adressages indirects sauf incrémentation et décrémentation, et l'adressage absolu. L peut être une valeur immédiate variant de 0 a 31, ou bien un registre de données contenant une valeur 32 bits signée. I prend les valeurs de 1 à 32. Celles-ci sont stockées en valeur immédiate ou dans un registre de donnée (un modulo 32 sera alors effectué, le résultat à 0 correspond à une valeur de 32).

Les drapeaux :
  • X non affecté.
  • V et C à 0.
  • N à 1 si le bit le plus significatif du champ et à 1, mis à 0 sinon.
  • Z à 1 si tous les bits du champ sont à 0, mis à 0 sinon.
BFCLR

Syntaxe : BFCLR <ae>{L:I}

Cette instruction permet de tester un champ de bits de largeur I, à partir de la position <ae> + L, puis de mettre à 0 tous les bits de ce champ. Les autres remarques sont identiques à BFCHG.

BFSET

Syntaxe : BFSET <ae>{L:I}

Fonctionne de la même façon que BFCLR, mais positionne les bits du champ considéré à 1 au lieu de 0.

BFTST

Syntaxe : BFTST <ae>{L:I}

Le champ de bits est ici simplement testé. En plus des modes habituellement utilisés pour ce type d'instructions, l'adressage relatif au PC est autorisé.

Les drapeaux :
  • X non affecté.
  • V et C à 0.
  • N à 1 si le bit le plus significatif du champ et à 1, mis à 0 sinon.
  • Z à 1 si tous les bits du champ sont à 0, mis à 0 sinon.
BFEXTS

Syntaxe : BFEXTS <a.e>{L:I},Dn

Non, celle-ci ne sert pas à faire la vaisselle (et c'est bien dommage !) mais permet d'extraire un champ de bits de la source, d'étendre son signe à 32 bits par le bit le plus significatif du champ, et de placer le résultat dans un registre de donnée (rien que ça...). L'accès au champ de bits s'effectue comme précédemment.

Tous les modes d'adressage sont autorisés sauf l'adressage immédiat, l'adressage direct par registre d'adresse ainsi que l'adressage indirect post-incrémenté et prédécrémenté. Pour l'affectation des drapeau, voir BFCHG.

BFEXTU

Syntaxe : BFEXTU <ae>{L: I},Dn

Cette instruction est la petite soeur de la précédente. Elle fonctionne exactement de la même façon, mais n'étend pas le signe du champ de bits.

BFFFO

Syntaxe : BFFFO <ae>{L:I},Dn

Cette instruction un peu bizarre permet de repérer le premier bit à 1 de la partie haute du champ de bit considéré. Le déplacement relatif à <ae> permettant de pointer sur ce bit est alors sauvegardé dans le registre Dn. Si aucun bit à 1 n'est trouvé, Dn contiendra alors la valeur L+I. Les modes d'adressage autorisés sont les mêmes que ceux de BFEXTS.

Les drapeaux :
  • X non affecté.
  • V et C à 0.
  • N à 1 si le bit le plus significatif du champ et à 1, mis à 0 sinon.
  • Z à 1 si tous les bits du champ sont à 0, mis à 0 sinon.
BFINS

Syntaxe : BFINS Dn,<ae>{L:I}

A l'inverse de BFEXTS, cette instruction permet l'insertion d'un champ de bits de largeur I contenu dans Dn (pris à partir du bit 0) à la position <ae>+L. Étrangement, les modes d'adressage ne sont pas les mêmes que ceux de BFEXTS : les modes relatif au PC ne sont pas autorisés. La modification des drapeaux reste similaire à celle de l'instruction BFEXTS.

68030
Les champs de bits

Instructions arithmétiques en binaire code decimal (BCD)

PACK

Syntaxe : PACK Dx,Dy,#<ajust> ou PACK -(Ax),-(Ay),#<ajust>

Cette instruction ressemble au compactage de données par demi-octet : elle permet, après un ajustement, d'extraire les 4 bits de poids faible de chacun des deux octets considérés, afin de ranger le résultat dans un autre octet.

Pour une opération entre registres de données, l'ajustement sur 16 bits est additionné en arithmétique BCD à l'opérande source Dx (16 bits), les bits 0 à 3 et 8 à 11 sont alors placés dans les bits 0 à 7 de la destination (Dy). Les bits 8 à 15 ne sont pas modifiés. Si l'opération a lieu en mémoire, Ax est décrémenté de deux et Ay de un ; les 2 octets pointés par Ax sont d'abord concaténés, puis, après l'ajout de l'ajustement, le résultat est compacté et placé en mémoire. Les drapeau ne sont pas modifiés.

UNPK

Syntaxe : UNPK Dx,Dy,#<ajust> ou UNPK -(Ax),-(Ay),#<ajust>

Cette instruction effectue l'opération inverse de PACK : les deux chiffres de l'octet source sont répartis dans les 4 bits de poids faible de l'octet supérieur et inférieur de la destination, et additionnés en arithmétique BCD à l'ajustement. Les drapeaux ne sont pas modifiés.

68030
Action des instructions PACK et UNPK

Instructions de contrôle de programme

Bcc

Syntaxe : Bcc.L <étiquette>

Eh oui, le déplacement conditionel peut maintenant s'effectuer sur 32 bits !

BRA

Syntaxe : BRA.L <étiquette>

Idem.

BSR

Syntaxe : BSR.L <étiquette>

Itou.

RTD

Syntaxe : RTD #d16

Cette instruction est un RTS plus complet, puisqu'elle permet en plus un déplacement sur 16 bits du pointeur de pile : (A7)->PC et A7 +=4+d16. Déjà présent dans le 68010.

CALLM et RTM

Attention ! Ces deux instructions sont apparues dans le 68020 et ont disparu dès le 68030, alors ne les utilisez pas.

Instructions de contrôle de système

MOVE.W from SR

Cette instruction 68000 a été modifiée dès le 68010 : on ne peut y avoir accès qu'en mode superviseur. Encore une entorse à la règle de la compatibilité ascendante...

MOVE.W from CCR la remplace. Elle ne modifie que l'octet de poids faible du SR.

MOVEC

Syntaxe : MOVEC.L Rc,Rn ou MOVEC.L Rn,Rc

Cette instruction privilégiée transfère les 32 bits d'un registre de contrôle vers un registre de données ou d'adresses, et réciproquement. Re peut être SFC, DFC, CACR, USP, VBR, CAAR, MSP ou ISP (SFC, DFC, USP ou VBR pour le 68010). Les drapeaux ne sont pas modifiés.

MOVES

Syntaxe : MOVES Rn,<ae> ou MOVES <ae>,Rn

Encore une instruction privilégiée, déjà présente sur le 68010. Elle est utilisée lors d'un accès dans l'espace d'adressage identifié par le registre DFC pour une écriture et SFC pour une lecture. L'opération s'effectue sur 8, 16 ou 32 bits. Rn est un registre de données ou d'adresses et <ae>, un mode d'adressage permettant un accès mémoire, relatif au PC excepté. Les drapeaux ne sont pas affectés.

BKPT

Syntaxe : BRPT #numéro

Cette instruction déclenche un cycle de reconnaissance d'un point d'arrêt. Elle permet de partir en exception (vive les excursions) au bout de N passages dans une boucle par exemple. Très pratique pour les débogueurs.

TRAPcc

Syntaxe : TRAPcc ou TRAPcc.W #d16 ou TRAPcc.L #d32

Cette instruction correspond à TRAPV, mais avec un code condition quelconque. La donnée optionnelle 16 ou 32 bits sert à passer un paramètre à l'exception numéro 7.

RTE

Syntaxe : RTE

Cette instruction a été modifiée pour pouvoir incrémenter la pile suivant le nombre d'informations empilées par le processeur lors du traitement des exceptions.

CHK2

Syntaxe : CHR2 <ae>,Rn

Fonctionne comme CMP2, mais déclenche un TRAP #6 si le cas L<Rn<U n'est pas vérifié. Les modes d'adressage autorisés sont ceux permettant l'accès à une zone mémoire, sauf les modes post-incrémentés et prédécrémentés.

Instructions d'opération dans un environnement multiprocesseur

Attention ! Les instructions CAS et CAS2, tout comme TAS, utilisent un cycle de lecture-modification-écriture indivisible, et ne doivent pas être utilisées sur l'Amiga du fait du conflit possible avec la DMA du système.

CAS

Syntaxe : CAS Dc,Du,<ae>

L'opérande A spécifié par <ae> est comparé à Dc (A-Dc). Si Z=1, Du est copié dans A, sinon A est copié dans Dc. L'opérande est l'octet, le mot ou le mot long et les modes d'adressages concernent tous ceux ayant un accès à la mémoire, sauf ceux relatif au PC. Les drapeaux sont affectés comme lors d'une comparaison CMP "normale".

CAS2

Syntaxe : CAS2 DC1:DC2,Du1:Du2,(Rn1):(Rn2)

Ça, c'est de l'instruction ! Elle effectue l'équivalent de CMP Dc1,(Rn1). Si Z=1, Du1 est recopié dans (Rn1) et Du2 dans (Rn2). Si Z=0 (Rn1) est recopié dans Dc1 et (Rn2) dans Dc2. L'opérande est soit un mot, soit un mot long.

Les instructions coprocesseur de type cp<instruction> seront traitées ultérieurement.

Ouvrages 68030

Pour les références, vous pouvez facilement trouver en français : Mise En Oeuvre Du 68030 par Christine Vieillefond, aux éditions Sybex (sur toutes les versions que j'ai vues, la page 40 reste désespérément blanche), et bien sûr en anglais MC68030: Enhanced 32-bit Microprocessor User's Manual de Motorola.


[Retour en haut] / [Retour aux articles]