Obligement - L'Amiga au maximum

Vendredi 24 mai 2019 - 05:12  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

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

 · Articles in english
 · Articles en d'autres langues


Twitter

Suivez-nous sur Twitter




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


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


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


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


Dossier : Cycles, registres et modes d'adressage du 68030
(Article écrit par Emmanuel Hocdet et extrait d'Amiga News Tech - mars 1992)


Mettez un turbo dans votre Amiga ! Non, ce n'est pas là une publicité pour une quelconque carte accélératrice, ni une boutade destinée à faire rire les heureux possesseurs d'A3000...

Enfin un domaine technologique où les Japonais ne peuvent inquiéter le marché mondial. Pourtant, la mise en oeuvre de ces merveilles de la miniaturisation que sont les microprocesseurs est un véritable travail de fourmi (ah, ah !). De l'heureux père de la famille des 68xxx, Monsieur Motorola, vous connaissez déjà le 68000 et peut-être même les 68008, 68010 et 68012. Si ce n'est pas le cas, reportez-vous vite aux premiers Amiga News Tech ou par exemple, à l'ouvrage Mise En Oeuvre Du 68000 (éditions Sybex).

Mais depuis quelques années, la famille s'est agrandie avec les microprocesseurs 32 bits de la seconde génération : les 68020 et 68030, avec leurs coprocesseurs arithmétiques 68881 et 68882. Sans oublier bien sûr le petit dernier (et premier de la troisième génération) : le 68040. La compatibilité étant ascendante, nous n'étudierons que les améliorations des différents microprocesseurs par rapport au 68000 de base.

Présentation

Le nom du premier microprocesseur de la série vient, pour la petite histoire, du nombre de transistors le composant, c'est-à-dire 68000. Le 68020 quant à lui, en comporte 200 000 et a été développé en technologie HCMOS, permettant de regrouper vitesse de travail, faible consommation et optimisation des fonctions intégrées. Il opère entre 2 et 3 MIPS (Millions d'Instructions Par Seconde), contre 0,5 pour le 68000 et possède un cache d'instructions de 256 octets.

Le 68030 regroupe l'équivalent d'un 68020 et de trois caches fonctionnant en parallèle : une unité de gestion mémoire par pagination (PMMU) et deux caches de 256 octets chacun, l'un de données et l'autre d'adresses.

Enfin, le 68040 fait encore plus fort puisqu'il intègre, en plus d'une unité de traitement 68030 à 13,5 MIPS, d'un cache de données et d'un cache d'instructions de 4 ko chacun et d'une PMMU améliorée, une unité de calcul en virgule flottante du type 68881/68882. Un incontournable pour les logiciels d'imagerie.

En clair, le 68030 dispose des caractéristiques suivantes :
  • Compatibilité avec ses prédécesseurs, du 68000 au 68020.
  • Fréquence de travail allant de 20 à 50 MHz.
  • Bus de données et d'adresses 32 bits, avec un adressage atteignant 4 Go (gigaoctets).
  • Nouveaux registres de contrôle.
  • Nouveaux modes d'adressage (18 en tout).
  • Cache de données et d'adresses indépendants.
  • Jeu d'instructions étendu (identique à celui du 68020, sans les instructions de gestion de modules).
  • Dialogue possible avec le 68881 et le 68882.
  • Échanges asynchrones et synchrones avec l'extérieur.
Les caches fonctionnent par défaut en transparent et ne sont donc pas un obstacle, dans un premier temps, à la compréhension de la programmation du microprocesseur. Je les garde en réserve, avec les modes spéciaux du 68030, dont les exceptions et le dialogue avec les coprocesseurs arithmétiques, pour un prochain article.

Les cycles de bus

La première chose que j'ai faite en ouvrant des ouvrages traitant du 68030 a été de chercher la table des cycles des instructions, afin de comparer avec celle du 68000. Mais à ma plus grande surprise, je n'ai rien trouvé... En effet, on peut comprendre cette absence par la difficulté de faire correspondre à chaque instruction son temps d'exécution en fonction des multiples modes du 68030 : les accès mémoire nécessaires peuvent aussi bien se faire en mode cache (très rapide) qu'en mode statique, ou même les deux ; les échanges avec l'extérieur varient, de plus, d'entre un et trois cycles ; et il n'y a pas moins de 18 modes d'adressage. Je peux simplement vous dire que le nombre de cycles utilisés par le processeur lors des accès mémoire ou l'exécution d'une instruction a été amélioré par rapport au 68000. Les multiplications et les divisions ne prennent plus qu'une poignée de cycles, et les instructions à adressage direct, d'un à deux cycles.

La plus impressionnante amélioration concerne sans aucun doute les instructions de décalage, du type LSL, ROR, etc., qui s'effectuent en un seul cycle, et cela quel que soit le nombre de décalages demandés, grâce à l'implantation d'un système matériel de décaleur à barillet. L'instruction CLR a également été modifiée (en fait, depuis le 68010) : elle efface directement son opérande, sans cycle de lecture préliminaire, comme sur les processeurs précédents.

Le principe des échanges synchrones et asynchrones entre le processeur et l'extérieur est une notion fondamentale des processeurs 32 bits. Il permet une compatibilité totale des échanges, même avec des circuits externes travaillant sur 16 ou 8 bits et facilite grandement la tâche des programmeurs.

Le 68030 travaille essentiellement en 32 bits, à la manière du 68000 en 16 bits, et permet en mode synchrone des transferts de 32 bits en un seul cycle de bus. Dans ce mode, la donnée à traiter doit se trouver à une adresse multiple de 4 (elle est alors dite alignée). Le 68000, lui, avait besoin que chaque donnée 16 bits soit située à une adresse paire. Le mode rafale ("burst" en anglais) peut, ici, être utilisé pour des transferts 32 bits très rapides.

Dans le cas où la donnée n'est pas alignée, le 68030 évoluera en mode asynchrone : il se débrouillera alors tout seul pour effectuer le transfert (en plusieurs cycles de bus, tout de même). En comparaison avec le 68000, cela revient par exemple, à vouloir lire un mot à partir d'une adresse impaire, ce qui déclenche irrémédiablement un erreur de bus. Au contraire, le 68030 est capable de gérer la donnée. En regardant le tableau des cycles mémoire, vous remarquerez pourquoi les mémoire 32 bits augmentent la vitesse de traitement des données. Attention cependant, les instructions doivent obligatoirement se situer à des adresses paires.

Registres

En mode utilisateur, on retrouve tous les registres du 68000, à savoir huit registres de données 32 bits D0 à D7, huit registres d'adresses 32 bits A0 à A7 dont un pointeur de pile et le CCR (Condition Codes Register, soit en français, Registre des Codes de Condition). Par contre, le mode superviseur a subi de nombreux changements.

Le registre d'état

Le registre SR a été modifié dès la deuxième génération de processeurs : en plus des cinq bits de drapeaux (X, N, Z, V et C), des trois bits de masquage de priorité des interruptions (I2, I1 et I0), du bit de trace (T) et du bit d'état utilitateur/superviseur (S), le registre d'état gère trois nouveaux bits.

SR 	T1 T0 S M 0 I2 I1 I0   0 0 0 X N Z V C
bits	15                 8   7             0

T1 et T0 sont les deux bits d'extension de T en 68000/68010, où T0 n'existe pas. En plus du mode trace normal I0, la combinaison 0I permet de générer une trace uniquement lors d'un branchement (BRA, JMP, etc). 00 correspond au mode sans trace (encore une nouvelle lessive !) et I1 est réservé.

M est le bit Maître. Il permet de distinguer deux nouveaux modes : le mode interruption (M=0) et le mode maître (M=1). Si le processeur est en mode superviseur, le système à alors accès à deux nouveaux pointeurs de pile, en plus de USP et SSP : MSP et ISP.

Le MSP (Master Stack Pointer) est le pointeur de pile système, sélectionné lorsque S=1 et M=1.

L'ISP (Interrupt Stack Pointer) est un pointeur de pile particulier, utilisé lors des interruptions. Il est sélectionné lorsque S=1 et M=0.

Les registres de contrôle

Le VBR (Vector Base Register), présent depuis le 68010, est le registre de base des vecteurs. Il permet de changer l'adresse du début de la table des vecteurs d'exception. Ainsi, le programmeur peut définir sa propre table sans modifier celle d'origine, située en $0. Ceci est plus particulièrement utile pour les systèmes d'exploitation multitâche (à noter cependant que l'Amiga n'utilise absolument pas cette facilité).

Le SFC (Source Function Codes) et le DFC (Destination Function Codes), tous deux également présents depuis le 68010, sont les registres des codes fonctions source et destination. Seuls les trois bits de poids faible, nommés FC2, FC1 et FC0, de chaque registre sont utilisés. Ils sont modifiables par l'instruction MOVEC et n'ont de rôle qu'avec l'instruction MOVES.

Le CACR (Cache Control Register) et le CAAR (Cache Address Register) servent à la configuration du cache. Six registres (CRP, SRP, TC, 170, 171 et MMUSR) sont apparus dans le 68030 et qui servent à configurer la PMMU.

Les modes d'adressage

Le 68020 et le 68030 possèdent un nombre important de modes d'adressage. L'on y retrouve tous les modes du 68000 en plus complets (32 bits obligent) ainsi que de nouveaux modes, de type adressage indirect par mémoire. Il ne fait aucun doute que le développement de tels modes a été motivé par l'utilisation fréquente, dans les langages évolués, d'indirections à plusieurs niveaux.

Un petit récapitulatif de tous ces modes ne fera certainement pas de mal. Mettons juste au point toutes les annotations utilisées dans le tableau ci-dessous :
  • "Xn" désigne un registre quelconque, avec X=D pour un registre de données et X=A pour un registre d'adresses.
  • Les déplacements "bd" et "od" sont deux valeurs signées codées suivant le nombre de bits b et o (16 ou 32).
  • "E" correspond à un entier de valeur 1, 2, 4 ou 8.
  • "T" désigne une taille en W (mot) ou L (long mot). Pour T=W, le registre est étendu à 32 bits.
  • Les modes d'adressage spécifiques au 68020 et 68030 seront signalés par un astérisque (*).
Direct par registre de donnée : Dn
Exemple : ADDX .W D0,D0
Description : Triviale (ADDX est plus rapide que ROXL #1).

Direct par registre d'adresse : An
Exemple : MOVEA.L D0,A0
Description : No comment !

Indirect (par registre d'adresse) : (An)
Exemple : CLR.W (A0)
Description : Le registre contient l'adresse de l'opérande à traiter.

Indirect post-incrémenté : (An)+
Exemple : CMPM.B (A0)+,(A1)+
Description : Idem, mais une fois l'opération effectuée, le registre est incrémenté de 1, 2 ou 4 suivant la taille de l'instruction.

Indirect prédécrémenté : -(An)
Exemple : MOVEM.L D0-D7/A0-A6,-(A7)
Description : Le registre d'adresse est d'abord décrémenté de 1, 2 ou 4 suivant la taille de l'instruction, puis sa nouvelle valeur est utilisée comme pointeur sur l'opérande.

Indirect avec déplacement 16 bits : (d16,An) ou d16(An) en 68000
Exemple : OR.L D0,(1024,A0) ou OR.L D0,1024(AO)
Description : La valeur du registre est additionnée à la donnée 16 bits. Le résulat pointe sur l'opérande.

(*) Indirect indexé avec déplacement 8 bits : (d8,An,Xn.T*E)
Exemple : TST.L (-4,A1,D1.W*4)
Description : La valeur du registre Xn est multipliée par E puis additionnée au contenu de An et au déplacement 8 bits (d8+An+Xn*E). Le résultat est un pointeur sur l'opérande à traiter.

(*) Indirect indexé avec déplacement 16 ou 32 bits : (bd,An,Xn.T*E)
Exemple : JMP ($FACEFE,A1,A0.L*8)
Description : Idem que précédemment, si ce n'est que le déplacement est codé sur 16 ou 32 bits au lieu de 8.

(*) Indirect par mémoire post-indexé : ([bd,An],Xn.T*E,od)
Exemple : MOVE.L D6,([$BEBE,A0],D1.W*2,$AFECACA)
Description : Le long mot pointé par l'adresse An+bd est additionné au déplacement od et au registre Xn multiplié par E. Le résultat est un pointeur sur l'opérande à traiter.

(*) Indirect par mémoire pré-indexé : ([bd,An,Xn.T*E]od)
Exemple : AND.L D4,([$BAC,A1],$CFE)
Description : Le résultat de l'opération An+Xn*E+bd est un pointeur sur un long mot. Ce dernier, additionné au déplacement od, est lui-même un pointeur sur l'opérande. Encore une double indirection !

Relatif au PC avec déplacement 16 bits : (d16,PC) ou d16(PC) en 68000
Exemple : MOVE.W ($BAFF,PC),D7 ou MOVE.W $BAFF(PC),D7
Description : L'adresse de l'opérande est le résultat de la somme effectuée entre le compteur programme et le déplacement 16 bits d16.

(*) Relatif indexé avec déplacement 8 bits : (d8,PC,Xn.T*E)
Exemple : MULS.L (7,PC,D7.L*8),D2
Description : Le résultat de l'opération d8+PC+Xn*E est un pointeur sur l'opérande.

(*) Relatif indexé avec déplacement 16 ou 32 bits : (bd,PC,Xn.T*E)
Exemple : DIVUL.L ($FAC,PC,A2.W*2),D0:D1
Description : Idem que ci-dessus, si ce n'est que le déplacement bd est codé sur 16 ou 32 bits au lieu de 8.

(*) Relatif indirect par mémoire post-indexé : ([bd,PC],Xn.T*E,od)
Exemple : BFEXTU.L ([$FEE,PC],D2.L*4,$FFF),{5 :24},D0
Description : La somme PC+bd est un pointeur sur un long mot qui, additionné à Xn*E et le déplacement od, représente l'adresse de l'opérande.

(*) Relatif indirect par mémoire pré-indexé : ([bd,PC,Xn.T*E],od)
Exemple : CMPA.W ([$CAFF,PC,D0.L*1]),A0
Description : Le résultat de l'addition entre le long mot pointé par PC+Xn*E+bd, et le déplacement od, est un pointeur sur l'opérande.

Absolu court : adresse.W
Exemple : MOVEA.L 4.w,A6
Description : Le signe de la donnée 16 bits est étendu à 32 bits et représente une adresse mémoire.

Absolu long : adresse.L
Exemple : CLR.L $DFF180
Description : La donnée représente directement une adresse mémoire.

Immédiat : #valeur
Exemple : RTD #$CABA
Description : La donnée est la valeur à traiter.

La double indirection s'avère très utile pour l'utilisation de tableaux de pointeurs. Par exemple, je désire connaître la couleur du cinquième élément (d0=5-1) du tableau deux, avec A0 pointeur sur le premier pointeur du tableau. En 68000, cela donne :

MOVE.L 4 (a0),a1	; a1=pointeur deuxième table
MOVE.L d0,d1		; sauvegarde de d0
LSL.L #3,d1		; *E
MOVE.W 6 (a1,d1),d1	; d1=élément recherché

Une instruction et un seul registre d'adresse pour la version 68030 :

MOVE.W ([4,a0],d0.L*8,6),d1

Ce résultat peut aussi être remarqué lors de la compilation de programmes C ou autres langages évolués, d'où une optimisation du code non négligeable.


[Retour en haut] / [Retour aux articles]