Suivez-nous sur X
|
|
|
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
|
|
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
|
|
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
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Assembleur - le registre VBR
(Article écrit par Frédéric Delacroix et extrait d'Amiga News - juin 1997)
|
|
Aujourd'hui, une fois n'est pas coutume, nous allons moins nous intéresser au système qu'au coeur matériel de l'Amiga :
le processeur, plus particulièrement le fameux registre VBR, ce qui devrait achever de convaincre les quelques irréductibles
qu'il n'est pas bien de taper aveuglément aux adresses 0-$400.
Tout ce qui sera dit dans cet article ne concernera que les Amiga équipés d'un processeur 68010 ou supérieur. En effet, le simple
68000 ne dispose pas de VBR et sa table d'exception reste toujours à l'adresse 0.
Vous l'avez compris, il s'agit ici des exceptions du processeur. Une telle exception est un événement "inattendu" qui dérange le
processeur pendant l'exécution normale des instructions. Ce peut être une interruption, une instruction TRAP, une erreur du style
adresse impaire ou autre. Lorsqu'un tel événement se produit, sans entrer dans les détails, disons que le processeur empile son
contexte (compteur de programme, registre d'état) et passe en mode superviseur. Il saute alors à l'adresse indiquée par le vecteur
d'exception qui l'oriente vers la routine de traitement de l'interruption (sur l'Amiga, ce peut être le Guru). Une fois le
traitement de l'exception terminé par l'instruction rte (Return from exception), le contexte est dépilé et le cours normal des
opérations reprend.
Le sujet d'intérêt est ici le vecteur d'exception : ils sont tous regroupés (un par type d'exception) dans une table, nommée la
table d'exception. Cette table se situe en mémoire à l'adresse pointée par le registre VBR (Vector Base Register) du processeur.
Ce registre est toujours nul après une réinitialisation, mais il peut être modifié par la suite.
Revenons à l'Amiga. Le système ne touche absolument pas à ce vecteur, ce qui fait que la table d'exception se trouve à l'adresse 0,
c'est-à-dire en mémoire Chip. C'est un inconvénient car le processeur doit partager l'accès à cette mémoire avec les circuits
spécialisés qui font des accès DMA. L'idée est donc de mettre à profit ce registre pour déplacer la table en mémoire Fast,
là où le processeur règne en maître. L'avantage saute aux yeux : un gain de rapidité significatif (n'oubliez pas que le système
se sert abondamment des exceptions, par exemple pour la commutation des tâches).
Le programme que je vous propose fait exactement cela : après avoir vérifié le type de processeur, il détermine le contenu du
registre VBR pour voir s'il est déjà ou non en mémoire Fast. Au passage, cela nécessite l'emploi de la fonction Supervisor()
(sur laquelle je ne m'étendrai pas outre mesure), car on a besoin de MOVEC, qui est une instruction privilégiée, pour accéder
au VBR. Puis 1 ko de mémoire Fast est alloué et la table d'exception y est recopiée. Enfin, le contenu du VBR est modifié pour
signaler la nouvelle table.
Tout programme "propre" n'y verra que du feu. En revanche, certains jeux qui écrivent directement dans les adresses 0-$400 afin
de placer leurs propres interruptions sans tenir compte du VBR en seront pour leurs frais, puisque la table ne sera plus à cet
endroit. Au mieux, le jeu ne marchera pas, au pire le Guru viendra.
Pour l'assemblage du programme, HiSoft Devpac 3.50 est nécessaire. N'oubliez pas la directive MACHINE pour signaler la génération
de code 68010 (MOVEC n'existe pas sur 68000).
|