| avant | après |
| add.w <ea>,Dn |
[1] move.l Dn,temp [2] clr.w temp+4 [3] move.l <ea>,Dn [4] add.l Dn,temp+2 [5] move.w ccr,Dn [6] move.w Dn,ccr_temp [7] move.l temp,Dn [8] move.w ccr_temp,ccr |
Quelques explications:
[1] Le contenu du registre est sauvegardé dans la S-RAM.
[2] On efface les données placées après dans la S-RAM, ça va servir plus bas.
[3] La donnée à additionner est stockée dans Dn, car l'instruction d'addition
doit forcément avoir un registre de données comme source ou destination. Notez
le début de la bidoulle: seul 2 octets devraient être additionnés, mais on en charge
4, cela a pour effet de placer dans le mot de poids fort de Dn la donnée à
additionner et dans les 3 autres octets des données parasites.
[4] L'addition est effectuée. Suite de la bidouille: en effectuant l'addition
deux octets après le début de temp, le mot de poids fort précédemment dans le registre
(qui contient la donnée à additionner) est ajouté au mot de poids faible du registre
sauvegardé en mémoire (qui correspond également à la donnée à additionner). Les 2
octets de poids faibles sont additionnés aux zéros qui ont été placés à l'étape [2],
ce qui est sans influence sur le résultat utile, qui est dans l'octet de poids fort.
[5] Les codes-conditions du résultal sont sauverardés avant le move car ce dernier
modifie les valeurs du ccr (condition codes register).
[6] Comme le move depuis le ccr ne peut être fait que vers un registre de données,
la valeur est tranférée en deux étapes.
[6] Le contenu sauvegardé du registre, ainsi que l'octet de poids faible, qui
contient le résultat du add.b retournent dans le registre.
[7] Les codes-conditions sont restaurés.
Cette façon de procéder s'apparente à une addition en virgule fixe avec 8 bits de partie entière et 24 bits de partie décimale. Seule la partie entière est prise en compte pour le résultat. Cette façon de procéder permet d'obtenir des codes-condition valides sans calculs supplémentaires.
Note: Le fait de lire 3 octets inutiles peut entraîner des erreurs de bus quand
on est à la fin d'un bloc mémoire. Le trap de gestion des erreurs de bus doit être
à même de récupérer ce type d'erreur.