|
|||||||||||||||||||||||||||||||||||||||||||
|
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 :
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 :
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 :
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 :
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 :
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. Les champs de bits 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. Action des instructions PACK et UNPK 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.
|