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 - Disk Compare
(Article écrit par Xavier Leclercq et extrait d'Amiga News - octobre 1991)
|
|
Disk_Compare est une commande CLI/Shell pour comparer deux disquettes.
Autrefois (je vous parle de la préhistoire sur C64) on trouvait facilement des copieurs qui permettaient de
comparer rapidement une disquette à sa copie. Sur Amiga, même la disquette Workbench contient un utilitaire
pour réaliser une copie de sauvegarde (DiskCopy). Mais c'est une copie + une vérification qui sont réalisées.
Même si l'on peut retirer l'option "Verify", ce que d'ailleurs de nombreux copieurs permettent, il est
frustrant de ne pouvoir vérifier le contenu piste par piste de deux disquettes sans
faire la copie. Ce n'est pas non plus vraiment un "CheckDisk", mais cela peut remplir le même rôle.
Bref, sur Amiga je n'ai pas eu connaissance d'un utilitaire permettant cette comparaison... Sauf évidemment
celui que je vous propose et qui est écrit entièrement en assembleur et largement commenté.
Quel assembleur ?
J'ai choisi l'A68K et le Blink classique comme éditeur de liens disponibles dans le DP (sur de très
nombreuses disquettes Fish). Mais le programme est très facilement transposable sur n'importe quel assembleur
(il suffit de changer les "DS" en "BLK" pour le Seka par exemple).
Quelques remarques concernant l'A68K
Toutes les commandes doivent être précédées d'une tabulation ou bien d'espaces.
Il est important de différencier les majuscules des minuscules sinon l'assembleur ne trouvera pas la référence.
Par exemple, si l'étiquette est "Erreur:" et que vous voulez faire "lea erreur(pc),a0" l'assembleur ne pourra
traduire (car "E" est différent de "e").
Une fois l'encodage du programme terminé (Compare.S), vous devez l'Assembler et l'éditeur de lien.
L'assembleur "traduit" le programme source Compare.S et crée alors un programme objet.
Ensuite, il faut effectuer le lien qui relie une séquence de démarrage au programme objet pour le rendre
exécutable.
Optimisations
Le Seka accepte les "move.l $4.w,a6" mais l'A68K ne l'accepte pas.. Si vous travaillez avec Seka
pensez à modifier les lignes utilisant cette séquence pour une meilleure optimisation.
Pour éviter les adressages en absolu devant être placés à des endroits différents de la mémoire,
AmigaDOS utilise les segments ("hunks"). Il s'agit donc d'une reconstruction d'adresse absolue à partir du
"registre de base" depuis lequel le programme est chargé.
Cela prend de la place et du temps. Pour ne pas tomber dans ce piège, il suffit d'utiliser des
instructions à adressages relatifs :
Ou bien :
pea MSG(pc),a0
move.l (a7)+,d0
|
A la place de...
Même remarque pour les instructions de branchements : "BSR" à la place des "JSR".
Concernant les branchements, un saut court "BSR.S" à la place d'un saut long "BSR.L"
permet une optimisation certaine.
Pour une portabilité maximale du programme, j'ai préféré mettre directement les valeurs des décalages des
fonctions des bibliothèques plutôt que d'utiliser les EQU, =, et autres signes cabalistiques dont
on peut très bien se passer si le programme est correctement commenté. A plus.
|