Obligement - L'Amiga au maximum

Mercredi 20 septembre 2017 - 03:55  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Hit Parade
 · 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 in other languages


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Moteurs de recherche
 · Pages de liens
 · Constructeurs matériels
 · Matériel
 · Autres sites de matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Développeurs logiciels
 · Logiciels
 · Développeurs de jeux
 · Jeux
 · Autres sites de jeux
 · Scène démo
 · Divers
 · Informatique générale


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

 


Programmation : Assembleur - Hide Dir-Cache
(Article écrit par Lionel Guillang et extrait d'Amiga News - décembre 1993)


Comment lire sous AmigaOS 2.0 les disquettes "cache" d'AmigaOS 3.0 ?

Quel possesseur d'Amiga antérieur au système 3.0 n'a jamais pesté contre un ami distrait ou ignorant lui apportant des disquettes formatées avec un cache ? En effet, que ce soit en 1.3 ou en 2.0, l'AmigaDOS vous dira, et répètera si vous insistez, qu'elles ne sont pas DOS... Gasp ! Pourquoi tant d'intolérance ? Heureusement, voici un tout petit utilitaire, mais ô combien précieux pour résoudre ce problème douloureux.

Filesystems = imbroglio ?

Avant l'avènement du système 3.0, les choses étaient relativement simples puisque seuls deux systèmes de fichiers (filesystems) existaient (je ne parle pas des émulations) : l'OFS ou ancien système de fichiers (standard jusqu'au système 1.3) et le FFS ou système de fichiers rapide (apparu avec le système 1.3).

Là où ça s'est un peu compliqué (mais pas tant que ça, vous allez voir), c'est lorsque sont venus s'ajouter le cache pour les répertoires et le mode international. Ce n'est pas si difficile que parce que, contrairement à l'OFS et au FFS qui sont des systèmes de fichiers à part entière, le cache et le mode international ne sont, eux, que des implémentations. En effet, la façon dont sont stockées les données sur une disquette est toujours rigoureusement la même, avec ou sans cache, ce qui n'est pas le cas lorsqu'on passe de l'OFS au FFS.

Le cache de répertoires n'est donc pas un nouveau système de fichiers ; on comprend alors aisément qu'il puisse être utilisé avec des disquettes OFS comme FFS. Il était utile de (re)préciser tout ça, parce que notre utilitaire ne se préoccupera pas de savoir pour quel système de fichiers telle ou telle disquette a été formatée ; seule la présence d'un cache le fera entrer en action.

Concrètement

Il est des moments où il faut savoir se pencher sur des réalités bassement matérielles ; c'en est un ! Que se passe-t-il lorsqu'on insère une disquette dans un lecteur ? Tout d'abord, c'est le bloc d'amorce (bootblock) qui est lu, parce qu'il contient, dans ses quatre premiers octets, l'identificateur de format de la disquette ; celui-ci est comparé aux identificateurs du (ou des) système(s) de fichiers dont le (les) handler(s) est (sont) attaché(s) au lecteur (DF0: par exemple). S'il ne correspond à aucun identificateur connu, la disquette est marquée NDOS (non-DOS) et aucun accès AmigaDOS dessus ne sera possible.

C'est donc à ce moment-là qu'il faudra intervenir et donner à l'AmigaDOS ce qu'il attend, c'est-à-dire un identificateur connu. La disquette sera alors reconnue et vous pourrez donc y lire tout ce que vous désirez. Miraculeux ? Non, cela s'explique très simplement par le fait que les données sont agencées sur la disquette de la même façon, avec ou sans cache ; le système de fichiers approprié (OFS ou FFS) parviendra donc à ses fins si on lui, oserai-je le dire, cache le cache.

Trop beau...

Les plus pessimistes d'entre vous l'avaient senti : il y a quelques petits inconvénients. Le premier, c'est que si vous avez l'intention de réutiliser ultérieurement votre disquette sous système 3.0, vous ne devez en aucun cas écrire dessus sous votre ancien système : en effet, en cas d'écriture, le cache ne sera pas mis à jour (ce qui devrait pourtant être fait), et la disquette deviendra de fait corrompue aux yeux du système 3.0, pouvant entraîner un plantage total de la machine.

Le second, c'est qu'en cas d'insertion d'une disquette dont le format n'est pas connu. Il n'y aura aucun moyen de savoir si elle a un cache ou non : en effet, le correctif trompera toutes les tâches, y compris un éditeur de secteurs.

Le troisième inconvénient est, lui, vraiment mineur, mais il existe tout de même : les secteurs utilisés par le cache ne seront pas restitués. Ceux-ci deviendront inutilisés mais resteront alloués, d'où une perte (légère) au niveau de la capacité de la disquette.

Le programme

Le but de la manoeuvre, rappelons-le, est de donner à l'AmigaDOS l'identificateur de format qui nous arrange, au moment où il lit le bloc d'amorce ; cela peut être réalisé très simplement en modifiant le trackdisk, et plus précisément la fonction BeginIO(). Il n'y aura plus alors qu'à intercepter les accès en lecture au démarrage et à masquer les bits signalant un éventuel cache (ainsi que le mode international).

L'identificateur, pour une disquette AmigaDOS, a l'allure suivante : "DOSx". La chaîne "DOS" est constante, seul l'octet "x" varie. Le format est codé dans les trois premiers bits :

bit 0 : 0=OFS, 1=FFS
bit 1 : 1=international
bit 2 : 1=cache

Il suffira donc de masquer les bits 1 et 2 pour leurrer l'AmigaDOS. Naturellement, cela ne marchera que si le système de fichiers de base est reconnu (inutile d'essayer avec une disquette cache FFS si votre Amiga ne reconnaît déjà pas le FFS simple).

Le correctif se déroule de la façon suivante : on reçoit l'adresse de la structure IORequest dans a1 ; on peut alors facilement déterminer quel(s) secteur(s) est(sont) adressé(s) et quel ordre est demandé, en examinant respectivement les champs IO_OFFSET et IO_COMMAND ; on ne filtre que les accès au bloc de démarrage (IO_OFFSET nul) en lecture ; le test sur IO_COMMAND est fait sur les 8 bits de poids faible, ce qui permet de prendre aussi en compte les commandes étendues (voyez les docs spécialisées pour plus de détails).

Lorsqu'on est sûr de notre coup (lecture sur le bloc de démarrage), on appelle la fonction BeginIO() normale qui va déclencher la lecture. C'est là que se trouve la plus grosse difficulté, s'il en est, du programme : la fonction BeginIO() déclenche des opérations asynchrones, ce qui signifie, dans notre cas, que la lecture a peu de chance d'avoir été faite lorsqu'on récupère la main.

Il va donc falloir attendre avant de pouvoir altérer le tampon mémoire de lecture, sans quoi ce sera un coup d'épée dans l'eau. On vérifie tout de même que la lecture n'est pas encore accomplie en appelant la fonction CheckIO() : si par un heureux hasard elle répond "TRUE", pas besoin d'attendre, tout est déjà terminé ; dans le cas contraire, il faut attendre manuellement ; je dis manuellement parce qu'on ne peut pas utiliser la fonction WaitIO() étant donné qu'elle retire les structures IORequest des ports de réponse, et on ne le veut pas (ceci est normalement effectué par la tâche qui a appelé BeginIO()). La solution consiste à attendre avec WaitPort() que le message de réponse du trackdisk arrive et ceci, c'est important, sans toucher à quoi que ce soit (pas de GetMsg() ni de ReplyMsg()), la tâche qui a appelé BeginIO() trouvant ainsi les choses telles qu'elles sont habituellement.

Il reste alors à modifier le bloc d'amorce, ce qui ne pose aucun problème : on vérifie d'abord que la lecture s'est bien passée (IO_ERROR), et que la disquette est au format AmigaDOS (on ne va pas s'amuser par exemple à modifier les disquettes MS-DOS). Enfin, on peut masquer les bits importuns, mais ce n'est pas tout : si la disquette est installée, il faut encore recalculer la somme de contrôle (sous réserve que le démarrage ait été complètement lu (deux secteurs au moins)).

Le reste n'appelle aucune remarque particulière, si ce n'est que le correctif restera actif tant qu'un redémarrage ne sera pas effectué. Il y a deux améliorations qui seraient intéressantes : la première consisterait à ajouter une tâche qui neutraliserait le correctif lorsqu'on presserait une touche, qu'on activerait un menu... La seconde, à signaler l'insertion d'une disquette ayant un cache, avec une requête par exemple, de façon à ce que l'utilisateur ne soit pas, lui aussi, leurré.

Assembleur
Assembleur


[Retour en haut] / [Retour aux articles]