Pourquoi un codage ?
Nous avons vu dans la partie relative aux nibbles que les valeurs qui peuvent être écrites sur la disquette doivent respecter un certain nombre de contraintes et que conséquent la plage des valeurs de $00 à $FF ne peut physiquement pas être écrite (et relue) il faut donc opérer ce que l'on appelle un codage pour translater les valeurs des octets de données en nibbles. Bien évidement on écrit les données par blocs de 256 octets, ce qui est la taille d'un secteur quand il est en mémoire... mais plus grand quand il est sur la disquette.

Il y a en fait trois types de codages standards:

          LE CODAGE 4.4
          LE CODAGE 5.3
          LE CODAGE 6.2
LE CODAGE 4.4
Nous avons vu que la contrainte générale est d'avoir une densité de signaux suffisante et qu'en particulier le bit 7 doit être à 1 : le principe du codage 4.4 répond à ces exigences en imposant de ne JAMAIS rencontrer deux 0 de suite.

Pour cela un octet donné est écrit avec deux nibbles, chacun comportant la moitié des bits de l'octet de donnée que l'on intercale entre des 1. Pour comprendre voici le mode opératoire :

Soit un octet de valeur xyxy.xyxy et on se fiche que x et y représentent des 1 ou des 0
on fait d'abord une opération ORA avec la valeur $AA (soit 1010.1010)

on obtiendra alors un résultat Y= 1y1y.1y1y ce qui permet d'isoler les y

ensuite on décale les bits de xyxy.xyxy vers la droite avec LSR le résultat sera 0xyx.yxyx
puis on procède à un AND entre ce résultat et $AA (soit 1010.1010)
on obtiendra alors un résultat X= 1x1x.1x1x ce qui permet cette fois d'isoler les x.

Les deux résultats Y et X sont des valeurs de nibble TOUJOURS valables car elles ont le bit 7 à 1 et n'auront JAMAIS deux 0 de suite c'est mathématiquement impossible du fait des opérations logiques qui viennent d'être effectuées. On constate donc que notre octet de donnée se trouve maintenant placé au sein de deux nibbles par séparation de ses bits en deux groupes de 4.

Prenons l'exemple avec le pire des cas : $00

C'est bien là le pire exemple car nous avons le maximum de 0 qui se suivent et qu'il n'est pas possible d'écrire (et surtout de relire) sur une disquette APPLE II. Pour comprendre et permettre une bonne visualisation de ce qui se passe avec les bits de l'octet de donnée, ils ont été colorés.

"0 0 0 0 .0 0 0 0" ORA "1010.1010" donnera "1 0 1 0 .1 0 1 0"

LSR "0 0 0 0 .0 0 0 0 " donnera "0 0 0 0 .0 0 0 0" Le premier 0 (bit 7) vient de l'opération LSR elle-même.

et cette dernière valeur ORA "1010.1010" donnera "1 0 1 0 .1 0 1 0"

Les deux valeurs obtenues à savoir "1 0 1 0 .1 0 1 0" et "1 0 1 0 .1 0 1 0" sont des valeurs parfaitement autorisées. On retrouve notre octet de donnée codé en 4.4 car il y a 4 bits dans chaque nibble (subtile désignation à l'évidence... qui permet de comprendre le terme "nibble" qui signifie "grignoter")



Le processus inverse pour retrouver la valeur de la mémoire à partir des deux nibbles écrits sur la disquette est aussi très simple, le schéma suivant vous montre comment cela se passe avec d'autres opérations booléennes.



POURQUOI CE CODAGE EST-IL INTERESSANT ?

Certes l'inconvénient majeur de ce codage est de nécessiter 2 nibbles pour écrire un octet... et à ce rythme la disquette serait remplie rapidement ! Cependant les intérêts du codage 4.4 sont multiples
Il est sûr
Il ne nécessite pas de table de translation (voir les deux autres codages)
Il peut être décodé à la volée en lisant la disquette.

C'est pour cette raison que le numéro de volume, le numéro de piste, le numéro de secteur et le checksum du champ d'entête de secteur sont ainsi codés, cela évite de laisser passer la zone des données si le programme devait faire un décodage de ces informations par un système plus lent.
Hacking corner

Attention ce codage est utilisé par de nombreux systèmes de protection qui alternent joyeusement les décalages à droite ou à gauche, mais cela reste toujours aisé à comprendre. Pour les éditeurs de jeux qui ne sont pas obligatoirement très soucieux de la place à utiliser cela permet surtout des chargements rapides avec des routines parfaitement minimalistes.

LE CODAGE 5.3
Le codage 5.3 permet au moyen de l'utilisation d'une table de translation d'écrire plus de valeurs possibles sur la disquette Nous venons de voir que le codage 4.4 malgré tous ces avantages avait l'inconvénient majeur de consommer de la place sur la disquette. En effet pour coder un secteur de 256 octets il faut écrire 512 nibbles! En clair la table de translation si elle existait serait de 16 octets (indexation sur des valeurs à 4 bits maximum)

Le DOS 3.2 augmente la taille de cette table à 32 ce qui permet de stocker les 256 octets de données avec moins de nibbles et en l'occurence 410. Soit un gain de (512-410) /512 = 19,92% bref 20%
LE CODAGE 6.2
Avec des restrictions moins grandes que le précédent, le DOS 3.3 augmente la taille de la table à 64 valeurs ce qui permet de stocker les 256 octets de données avec 342 nibbles soit un gain de 49,71% par rapport au codage 4.4 et de 24,90% par rapport au codage 5.3... pas rien tout de même !
Soit BUFFER la zone où se trouvent les octets de données, on utiliser deux autres buffers astucieusement nommés BUF1, buffer principal de 256 octets, et BUF2, buffer secondaire de 86 octets. La technique est alors simple il suffit de faire glisser 2 bits de chacun des octets de donnée de BUFFER dans BUF2 et de placer les 6 restant dans BUF1. C'est le rôle de la routine de prénibbilization expliquée par le graphique suivant. Le source particulièrement lumineux est expliqué ensuite.

PRENIBBILIZATION ET NIBBILIZATION
Le source de la routine de prénibbilization utilisée par le DOS 3.3 est la suivante :PRENIB

Le source de la routine de postnibbilization utilisée par le DOS 3.3 est la suivante :POSTNIB

Attention : PRODOS utilise bien le codage 6.2, écrit sur la disquette EXACTEMENT la même chose que ce que ferait le DOS 3.3 pour enregistrer une page de données MAIS les routines sont TOTALEMENT DIFFERENTES, beaucoup plus rapides et plus flexibles au sens où la page mémoire à écrire peut êt à cheval sur deux pages en mémoire. Ces routines sont expliquées dans la rubrique LA METHODE PRODOS