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.