Une table de translation sert, comme le nom l'indique, à translater une valeur en un nibble pouvant être écrit sur la disquette. Les nibbles ont été détaillés dans la rubrique très astucieusement nommée Les "nibbles". Rubrique qui expliquait comment et pourquoi on obtient ce tableau des nibbles valides en DOS 3.3.



Mais ATTENTION en DOS 3.3 il y a DEUX TABLES DE TRANSLATION :
          < une table de translation pour l'écriture en $BA29
          < une table de translation pour la lecture en $BA96


LA TABLE DE TRANSLATION POUR L'ECRITURE
La méthode de l'écriture des données en DOS 3.3 peut être décomposée en 4 phases.

1. Transformation d'une page de 256 octets en deux buffers NBUF1 et NBUF2

Cette opération permet de transformer des octets en valeurs de la forme 00xx.xxxx donc avec une valeur maximale = $3F (Voir la rubrique : PRENIBBILIZATION)

2. Effectuer un EOR entre deux valeurs successives de données

On prend chaque valeur (de NBUF2 puis NBUF1) et on opère un calcul EOR entre la dite valeur et la précédante de façon à obtenir une valeur résultante. Pour la première valeur on fait l'EOR avec la valeur $00.
La valeur sera toujours de la forme 00xx.xxxx. Elle donc varie de $00 à $3F ce qui est précisément la taille de la table de translation en écriture (NIBL) qui sera utilisée. (Voir la rubrique : EORING DU CHAMP DE DONNEES) A noter que ce calcul permet de définir la valeur du checksum qui sera écrit comme dernier nibble du secteur juste avant les marqueurs de fin (DE AA EB)

3. Récupération du nibble en table NIBL

La valeur calculée de la façon décrite ci-dessus sera placée dans le registre d'index X qui contiendra alors une valeur comprise entre $00 et $3F. On se sert de X comme index pour charger dans A la valeur du nibble à écrire par la ligne d'instructions LDA NIBL,X
Cela permet de prendre dans la table de translation NIBL la valeur du nibble indexé par X. qui correspondra de fait à la valeur cet index.

La table de translation pour écrire se situe à l'adresse $BA29. Elle contient donc les valeurs suivantes dans cet ordre

96 97 9A 9B 9D 9E 9F A6 A7 AB AC AD AE AF B2 B3 B4 B5 B6 B7 B9 BA BB BC BD BE BF CB CD CE CF D3
D6 D7 D9 DA DB DC DD DE DF E5 E6 E7 E9 EA EB EC ED EE EF F2 F3 F4 F5 F6 F7 F9 FA FB FC FD FE FF


Ainsi quand X = 0 l'opération LDA NIBL,X charge A avec la valeur $96 qui est un nibble valide devant être écrit sur la disquette. Avec X = 1 ce sera le nibble $98, avec X = 3 ce sera le nibble $9A, avec X = 4 ce sera le nibble $9B et ainsi de suite.



4. Ecriture du nibble contenu dans A sur la disquette.

Le source de la routine d'écriture en DOS 3.3 est détaillée dans les deux rubriques :

          < ECRITURE DE L'ENTETE ADRESSE

          < ECRITURE DU CHAMP DES DONNEES

LA TABLE DE TRANSLATION POUR LA LECTURE
Cette table se trouve à l'adresse $BA96 pour le DOS 3.3. Pour des raisons de simplicité, il y a un IMPERATIF de positionnement de cette table. En effet on opére exactement à l'inverse de l'écriture mais cette fois les valeurs qui seront dans l'index seront des nibbles et par conséquent la plage des valeurs varie de $96 à $FF ... avec des impossiblités (exemple $98, $A8 etc... bref regardez le tableau ci-dessous pour les voir.)

Si la table est placée de $BA96 à $BAFF ce n'est donc pas neutre, cela permet de récupérer la valeur correspondant à un nibble lu par une simple instruction d'indexation sur la base $BA00. Voilà la raison de l'impératif de positionnement, mais on notera qu'elle pourrait tout aussi bien être à un autre endroit de la forme XX96.

Cependant si vous envisagiez de ne pas prendre une adresse de stockage de la forme XX96 vous allez certainement faire un changement de page de temps à autre lors de l'opération d'indexation, ce qui augmente d'un cycle chaque opération...pas gravissime en lecture mais pas nécessairement génial !

Voici la table en mémoire à partir de $BA96



Le fonctionnement pour la lecture est expliqué sur le schéma suivant



Notez bien que si par un mystère le nibble lu n'est pas un nibble valide, l'opération EOR se fera avec cette valeur elle-même. En examinant bien la table de translation de lecture, vous noterez que les valeurs d'index qui étaient utilisées pour l'écriture sont les valeurs que l'on retrouve positionnées exactement à la place du nibble qui leur correspondait (ce qui est assez heureux...)
EXEMPLES EN ECRITURE ET LECTURE


L'index $3F de la table de translation pour l'écriture renvoit le nibble $FF qui est alors écrit sur la disquette
Le nibble $FF lu sur la disquette et utilisé comme index pour l'opération EOR renvoit la valeur de l'adresse $BAFF dans la table de translation utilisée en lecture soit $3F... ce qui est parfaitement symétrique.



Si vous tripotez la table de translation, pensez bien à le faire sur les deux (ecriture et lecture) de façon SYMETRIQUE. Votre DOS modifié ne pourra pas lire les disquettes normales mais le DOS 3.3 ne pourra pas lire vos disquettes...

L'exemple le plus visible reste celui de la valeur $00 qui donne le nibble $96. Lorsque vous regardez une piste d'une disquette vierge initialisée en DOS 3.3 (au delà de la 2 si possible) avec un utilitaire qui vous affiche les pistes en format brut (BAG OF TRICK, CIA etc...) vous voyez de grandes zones de $96. C'est parce que le buffer des données à écrire étant rempli de 0, l'opération EOR $00 avec $00 donne toujours $00 et vous avez tous ces $96. Notez au passage que si vous voyez sur une disquette protégée des grandes zones avec une autre valeur, il n'est pas improbable que le malin ait modifié les tables de translation : pas une certitude, juse un indice.