Titre Interleaving

INTRODUCTION

Le monde est très complexe et nous autres, bipèdes faits d'os, de chair et de sang, nous préférons le présenter sous une forme plus simple que nous appréhendons mieux. Que ce soit pour simplifier la communication, par abus de langage, par facilité (qui a dit fainéantise?), ou tout simplement par ignorance.

Par exemple les vendeurs de périphériques de stockage ne s'embarrassent pas des réalités informatiques de base.
Mettons nous dans la peau d'un d'entre eux qui veut vendre son matos à un client potentiel.
Allez faire comprendre au 1er quidam venu que la mesure de base dans l'informatique n'est pas 1000 mais 1024 et vous êtes foutu!!
La plupart des gens n'en savent rien. Tout ce qu'ils veulent, c'est stocker les photos du petit dernier en train de faire des pitreries.
Aussi qu'est-ce qu'ils en ont à faire de ces subtilités? Et surtout ne venez pas vous foutre de leur gueule en soulignant leur ignorance, ils feraient demi-tour aussi sec.
Vous connaissez votre métier: le client, c'est le type QUI A LE FRIC et il faut uniquement lui dire des choses compréhensibles à son niveau, de préférence en nivelant par le bas.

Que vous soyez d'accord ou pas, c'est une méthodologie couramment appliquée...

Pour un type qui utilise des unités qui sont des multiples de 1000 (les poids et les mesures), changer de base demande un effort ou nécessite de remettre en question des réflexes. Et c'est chiant, il faut bien le dire!!! (Combien d'entre nous comptent encore en francs et pas en euros??)

Bref pour le commercial qui veut fourguer un disque dur, il est plus facile de dire qu' 1 kilo-octet = 1000 octets, qu'un mega-octet = 1000 ko, qu'un giga-octet = 1000 megas, etc...
C'est faux, mais le mec en face a ainsi un ordre d'idée dans l'unité qu'il utilise couramment pour autre chose (et beaucoup de choses). Il y a aussi une variante qui consiste à exprimer la taille dans une autre unité plus proche du client. Puisque c'est pour stocker des photos, on va lui dire qu'il peut en stocker des milliers dans une proportion d'approximation "acceptable". Avec ça il sera content (de toute façon il ne va pas les compter pour vérifier et le truc c'est de rester flou sans donner la résolution et le niveau de compression des photos...) Dans les temps plus anciens la combine marchait déjà: sur Apple II, on parlait du nombre de pages de texte sauvegardables sur la disquette...

Et pour énormément de trucs, on se coltine ainsi des approximations réductrices.



Pour le lecteur de disquettes de l'Apple II, c'est exactement pareil.
Par exemple, prenez une disquette 5,25 pouces.
Et demandez à un ancien possesseur d'Apple II de vous dire où sont écrites les informations quand on enregistre des données sur la face 1. A presque tous les coups, il vous dira que c'est sur la face de dessus, là où il y a l'étiquette.
Manque de bol pour lui, dans le drive, la tête de lecture/écriture se trouve sous la disquette et de ce fait, les informations sont en réalité écrites sur la face arrière! Ce n'est que lorsque vous retournez la disquette dans le lecteur que les informations sont écrites sur la face avant.

Dans le même genre, quand vous demandez comment sont lues les informations, la plupart des gens s'imagine qu'il y a une tête de lecture qui avance sur la piste magnétique pour charger les informations. Tout ça parce qu'on s'identifie à la tête de lecture et pour aller du point A au point B, il faut bien que l'on avance.
Alors qu'en fait la tête de lecture ne bouge pas lors de la lecture d'une piste mais c'est le disque souple de mylar de la disquette qui tourne sur lui même.


Maintenant la question que je vous pose, c'est: qu'est ce que vous allez lire EXACTEMENT si vous demandez à la RWTS du DOS 3.3 de charger le secteur $0B de la piste $00?

Avec tout ce que je vous ai dit précédemment, vous allez vous dire qu'il y a un piège quelque part!
Pas faux, mais si vous ne donnez pas la bonne réponse, ce n'est pas entièrement de votre faute!
C'est un grand classique qu'on a dû vous apprendre à l'école en cours de philo.
D'abord vous méfiez du support de la communication et plus particulièrement du manque de précision dans le langage.
Car quand on parle de secteurs, il faut être plus précis.
S'agit-il de secteurs physiques ou de secteurs logiques?
KESAKO???

On distingue en effet 2 notions de secteurs. Je vous propose à présent quelques éclaircissements et la solution à la question.
Mon ami Jean-Pierre a déja écrit un cours théorique sur l'interleaving des disquettes 5,25" mais je souhaiterais faire un petit complément en adoptant une approche par travaux pratiques.
J'aime bien le concrêt et avec l'approche par cas réel, la compréhension n'en est que meilleure...
On y va...

TRAVAUX PRATIQUES

Sur votre Apple II, bootez un DOS 3.3 System master dans votre lecteur disk II.
Lorsqu'il vous a donné la main, introduisez une disquette vierge et tapez INIT TEST,S6,D1 pour que le DOS la formate et installe dessus une copie de lui-même.
Lors de cette phase de formatage, le DOS 3.3 a écrit sur la disquette 35 pistes*16 secteurs=560 champs adresses contenant la référence (entre autre) du numéro de piste et du numéro de secteur (je ne parle pas encore de notion de physique ou logique exprès!); ceci afin que lors des accès disques les programmes sachent toujours quel secteur se trouve dans les parages de la tête de lecture sans avoir à se baser sur une quelconque marque physique faisant la même chose. (L'Apple II fait  du soft-sectoring).
 
Une fois que c'est fait, mettez dans le drive une disquette utilitaire contenant le programme Nibbles Away ][ et lancez le. (Pour rappel, ce programme permet d'examiner sous forme de nibbles le contenu d'une disquette, c'est à dire toutes les informations sous leur forme non décodées).

Nibbles Away ][

Remettez dans le drive votre disquette nouvellement formatée et sélectionnez l'option T-TRACK/BIT EDITOR.
Tapez R pour que Nibbles Away ][ lise la piste $00.

La première chose que l'on va regarder, c'est dans quel ordre la commande de formatage INIT du DOS 3.3 a numéroté les secteurs dans les champs adresses.
On va donc aller à la recherche des 16 champs adresse de la piste $00.


Chaque champ adresse est précédé de gap ici sous forme de valeurs de nibbles $FF.
On va donc utiliser ces séries de $FF comme repères.
Chaque champ adresse suivant ces gaps est composé des éléments suivants:
Un header: $D5 $AA $96
Le numéro de volume sur 2 octets (codage 4-4)
Le numéro de piste sur 2 octets (codage 4-4)
Le numéro de secteur sur 2 octets (codage 4-4)
Le checksum sur 2 octets (codage 4-4)
Un trailer: $DE $AA $EB

Dans un champ adresse, le numéro de piste et le numéro de secteur sont codés sur 2 octets selon la méthode 4-4.
Voici la liste des équivalences:

Secteur Codage 4-4
$00     AA AA
$01     AA AB
$02     AB AA
$03     AB AB
$04     AA AE
$05     AA AF
$06     AB AE
$07     AB AF
$08     AE AA
$09     AE AB
$0A     AF AA
$0B     AF AB
$0C     AE AE
$0D     AE AF
$0E     AF AE
$0F     AF AF


Pour résumer:
- On se concentre sur une suite importante de $FF (gap).
- On recherche la série D5 AA 96 comme repère de début de champ adresse.
- On saute les numéros du volume et de piste qui sont toujours à FF FE (volume) et AA AA (piste 0).
- Les 2 octets qui arrivent ensuite sont ceux qui nous intéressent et on regarde quelle est la valeur correspondante dans la table donnée ci-dessus.

Nibbles Away ][ a chargé la piste à partir de $2200.
Utilisons la touche flèche droite pour avancer dans la mémoire et afficher le contenu de la piste $00 chargée.
J'ai colorié sur chaque écran le 1er digit du header adresse en bleu et le 1er digit du numéro du secteur codé 4-4 en rouge pour repérer tout ça plus facilement.

Pas de gap (valeurs $FF) sur le 1er écran débutant en $2200. Passons au suivant. Là il y en a.

1er champ adresse trouvé par Nibbles Away ][:

Nibbles Away ][

AEAB correspond au numéro de secteur $09.


2nd champ adresse trouvé par Nibbles Away ][:

Nibbles Away ][

AFAA correspond au numéro de secteur $0A.


3ème champ adresse trouvé par Nibbles Away ][:

Nibbles Away ][

AFAB correspond au numéro de secteur $0B.


4ème champ adresse trouvé par Nibbles Away ][:

Nibbles Away ][

AEAE correspond au numéro de secteur $0C.


5ème champ adresse trouvé par Nibbles Away ][:

Nibbles Away ][

AEAF correspond au numéro de secteur $0D.


6ème champ adresse trouvé par Nibbles Away ][:

Nibbles Away ][

AFAE correspond au numéro de secteur $0E.


7ème champ adresse trouvé par Nibbles Away ][:

Nibbles Away ][

AFAF correspond au numéro de secteur $0F.


8ème champ adresse trouvé par Nibbles Away ][:

Nibbles Away ][
Nibbles Away ][

AAAA correspond au numéro de secteur $00.


9ème champ adresse trouvé par Nibbles Away ][:

Nibbles Away ][

AAAB correspond au numéro de secteur $01.


10ème champ adresse trouvé par Nibbles Away ][:

Nibbles Away ][

ABAA correspond au numéro de secteur $02.


11ème champ adresse trouvé par Nibbles Away ][:

Nibbles Away ][

ABAB correspond au numéro de secteur $03.


12ème champ adresse trouvé par Nibbles Away ][:

Nibbles Away ][

AAAE correspond au numéro de secteur $04.


13ème champ adresse trouvé par Nibbles Away ][:

Nibbles Away ][

AAAF correspond au numéro de secteur $05.


14ème champ adresse trouvé par Nibbles Away ][<:

Nibbles Away ][

ABAE correspond au numéro de secteur $06.


15ème champ adresse trouvé par Nibbles Away ][:

Nibbles Away ][

ABAF correspond au numéro de secteur $07.


16ème champ adresse trouvé par Nibbles Away ][:

Nibbles Away ][

AEAA correspond au numéro de secteur $08.


17ème champ adresse trouvé par Nibbles Away ][:

Nibbles Away ][

AEAB correspond au numéro de secteur $09.


On va s'arrêter là.
Récapitulons ce que l'on a trouvé dans l'ordre:
$09 $0A $0B $0C $0D $0E $0F $00 $01 $02 $03 $04 $05 $06 $07 $08 $09...

Le DOS 3.3 a écrit des numéros de secteurs dans un ordre croissant.
Comme la lecture commence à un moment quelconque, la tête n'est pas nécessaire au dessus du secteur $00.
Dans notre cas de figure, la tête était au dessus du secteur $09.
Si vous appuyez plusieurs fois sur la touche R pour relire la piste, vous constaterez que vous commencez presqu'à chaque fois par un secteur différent.
Quand on atteint le secteur $0F, le suivant est le $00.
Nibbles Away ][ lisant et stockant plusieurs fois la piste en mémoire, en continuant à appuyer sur la touche flèche droite, on retombe sur les secteurs que l'on a déjà lu.

Cet ordre de plus bas niveau (celui enregistré au niveau du champ adresse) est appelé ordre physique.
UN NUMERO DE SECTEUR PHYSIQUE EST UN NUMERO ENREGISTRE DANS LE CHAMP ADRESSE.
AVEC UN DOS 3.3 STANDARD, LES SECTEURS PHYSIQUES SONT DANS UN ORDRE ASCENDANT DE $00 A $0F.

Je ne m'étendrais pas dessus, mais il faut savoir que d'anciennes versions du DOS avaient des programmes de formatage créant des champs adresses dont les numéros de secteurs physiques n'étaient pas ascendants. (et certains programmes underground utilisent aussi une autre numérotation).
Pour ce cours, on ne parle que de standard DOS 3.3.


Toujours avec Nibbles Away ][, recherchez à présent les secteurs physiques dont le champ data est rempli de valeurs $96.
Pour rappel, le début du champ data est séparé du champ adresse par quelques nibbles de valeur $FF (gap).
Puis on trouve:
Un header: $D5 $AA $AD
Les 342 nibbles de datas codés selon la méthode 6-2.
Un nibble de checksum
Un trailer: $DE $AA $EB

Pour simplifier la lecture, j'ai gardé les mêmes couleurs que tout à l'heure pour le champ adresse et j'ai colorié en jaune le 1er digit de l'header du champ data.
On trouve en tout et pour 2 secteurs physiques dont le champ data est rempli de $96: AFAA (=secteur physique $0A) et AEAA (=secteur physique $08).

Nibbles Away ][
Nibbles Away ][

Pour rappel, quand les 342 nibbles d'un champ data sont remplis de $96, cela signifie que le secteur est rempli en fait de 256 octets à zéros.


Continuons notre cours pratique.
A présent, bootez un éditeur de secteurs comme COPY II+ 5.x pour DOS 3.3 et lancez l'option de SECTOR EDITOR:

COPY II+

Puis nous allons charger les numéros de secteurs trouvés dans les champs adresse.

Chargez le secteur T$00 S$0A.
Cool, ça a une bonne tête: rempli de zéros!

COPY II+

Puis chargez la seconde référence: le secteur T$00 S$08.
"Merde alors!!" allez-vous me dire. Le secteur n'est pas rempli de zéro!!

COPY II+

Mais pourquoi donc?????

- Est-ce que cela veut dire que quand COPY II+ parle de secteurs, il ne s'agit pas de secteurs physiques?
- Pourquoi est-ce qu'il y a un secteur rempli avec des zéros et pas l'autre?
- Est-ce que COPY II+ est bogué???

Si vous n'avez pas confiance en COPY II+, retentez l'expérience autrement.
Créez un petit programme qui fait appel à la RWTS et chargez les secteurs $0A et $08.

Vous vous êtes donné du mal pour rien car vous trouverez exactement la même chose!!!

Déja, on peut dire que:

- COPY II+ n'est pas bogué (à ce niveau!)
- COPY II+ et la RWTS n'utilise pas la notion de secteur physique.

Mais à quoi correspondent ces numéros de secteurs et pourquoi Apple a introduit une autre numérotation?

Tout à l'heure, nous nous sommes mis à la place d'un vendeur de disque dur.
Mettons nous à présent dans la peau d'Apple Computer Inc. (Je sais que depuis peu il faut écrire Apple Inc. uniquement mais personnellement le seul Apple que je connaisse et respecte, c'est l'Apple qui a produit l'Apple II).
Apple doit faire face à une réalité technique.
DOS 3.3 met du temps à décoder un champ data quand il lit des secteurs (l'opération de denibblizing ou post-nibblizing).
Cas concrêt: la tête de lecture est en train de décoder le secteur physique $00.
Le temps que l'opération se fasse dans son intégralité, lorsque la tête reprend la lecture, le prochain champ adresse qu'elle rencontre n'est pas celui du secteur physique $01 (se trouvant juste après le secteur physique $00)!! Le champ adresse du secteur physique $01 est passé sous la tête quand l'Apple décodait et maintenant il faut attendre la prochaine rotation pour traiter ce secteur physique $01.
Alors qu'est ce qu'il faut faire? Attendre coute que coute ce secteur physique $01 et donc attendre la fin de la rotation???
NON! Car sinon il y aurait beaucoup de rotations pour lire une piste entière dans l'ordre physique des secteurs et chaque rotation prend du temps (l'utilisateur attend pendant ce temps là).
Alors la solution, c'est de traiter immédiatement le prochain secteur physique que rencontre la tête de lecture dans le champ adresse.
Donc, les secteurs physiques ne sont pas lus dans une séquence chronologique.
Ce numéro de secteur ne sera pas le secteur $01.

Seulement, il est psychologiquement beaucoup plus simple d'avoir une notion de secteurs chronologiques.
Quand vous prenez la voiture pour faire 16km, vous vous attendez à voir des bornes km 0, km 1, km 2, ... km 15.
Si je vous dis que vous allez avoir la séquence bizarre des bornes avec km 0, km 13, km 11, ... km 15, vous allez me rire au nez et gueulez en disant "qu'est ce que c'est que ce bordel"?

Aussi Apple a inventé une notion virtuelle de numération de secteurs pour masquer le fait que l'on n'a pas une séquence ascendante des secteurs physiques quand le DOS 3.3 lit une piste de la disquette.
C'est ce qu'on appelle un ordre LOGIQUE des secteurs.
Avec cet ordre logique, vous avez l'impression que les numéros de secteurs se suivent gentiment.
C'est pratique, plus simple et vous ne passez pas pour un con en disant qu'après le secteur n, nous ne lisez pas le secteur n+1.

COPY II+ et la RWTS ont des interfaces avec l'utilisateur ou le programmateur qui n'emploient que la notion de secteurs logiques.
L'équivalence entre secteur physique et secteur logique se fait pas le biais d'une ou deux tables en fonction de l'opération que l'on cherche à réaliser.
Par exemple si un programme cherche à savoir quel est le secteur qui passe actuellement sous la tête de lecture. Il lit le champ adresse et à partir du numéro de secteur physique trouvé, il va chercher son équivalent logique.
Vous pouvez aussi avoir le cas où vous savez que vous devez charger un secteur logique donné et il vous faut son équivalent physique pour le rechercher sur la disquette.

Pour résumer, en fonction du sens désiré, il est plus simple d'avoir une table adaptée triée sur l'index ascendant connu.
Pour désigner ces tables, on utilise comme vocabulaire indifférement le terme interleaving ou skewing. En français, on parle plus volontiers d'interfoliation des secteurs.
Voici ces tables VALABLES pour COPY II+ et la RWTS, tous les 2 se basant sur la logique du DOS 3.3:

Table numéro 1:                     Table numéro 2:
Interleaving secteur                Interleaving secteur
Physique => Logique                 Logique => Physique
   $00   =>   $00                     $00   =>   $00
   $01   =>   $07                     $01   =>   $0D
   $02   =>   $0E                     $02   =>   $0B
   $03   =>   $06                     $03   =>   $09
   $04   =>   $0D                     $04   =>   $07
   $05   =>   $05                     $05   =>   $05
   $06   =>   $0C                     $06   =>   $03
   $07   =>   $04                     $07   =>   $01
   $08   =>   $0B                     $08   =>   $0E
   $09   =>   $03                     $09   =>   $0C
   $0A   =>   $0A                     $0A   =>   $0A
   $0B   =>   $02                     $0B   =>   $08
   $0C   =>   $09                     $0C   =>   $06
   $0D   =>   $01                     $0D   =>   $04
   $0E   =>   $08                     $0E   =>   $02
   $0F   =>   $0F                     $0F   =>   $0F

Pour d'autres systèmes (PASCAL, CP/M et ProDOS), basez-vous sur les tables données par Jean-Pierre sur sa page (voir lien donné tout à l'heure).


Je reprends ma question initiale dans sa version complête: qu'est ce que vous allez lire EXACTEMENT comme secteur physique si vous demandez à la RWTS du DOS 3.3 de charger le secteur logique $0B de la piste $00?

Pour répondre, il suffit de se référer à la table 2. Le secteur logique $0B donne le secteur physique $08. Si vous le lisez, vous voyez bien qu'il est rempli de zéros comme nous l'avions constaté tout à l'heure avec Nibbles Away ][.

COPY II+

Il y avait aussi la question de savoir pourquoi quand avec COPY II+ on lisait le secteur logique $0A, on récupérait en fait aussi des zéros. Il suffit là encore de lire la table 2: le secteur logique $0A correspond tout simplement au secteur physique de même numéro.

Le secteur logique $08 lu avec COPY II+ correspondait lui au secteur physique $0E qui était remplis de valeurs pour la plupart différentes de zéro.

CONCLUSION ET COMPLEMENT

Pour finir comme je l'ai commencé...

On se contente de parler de secteur par fainéantise ou méconnaissance.
Il faudrait toujours mentionner secteur physique ou secteur logique pour clarifier la situation.

Les champs adresse des secteurs contiennent les numéros de secteurs physiques. Ils sont numérotés dans un ordre ascendant.

Quand le DOS doit charger plusieurs secteurs physiques à la suite, l'ordre de ces secteurs physiques trouvés n'est pas chronologique du fait du temps de post-nibblizing.
Pour optimiser, il lit le 1er secteur physique qu'il trouve après celui traité.

Pour rendre plus simple et mieux représentable à votre cerveau la suite des secteurs, la notion de secteurs logiques a été introduite. Vous avez l'impression d'avoir une suite ordonnée de numéros de secteurs logiques de $00 à $0F. Mais par derrière, le DOS 3.3 ou encore COPY II+ gèrent les tables d'équivalence entre les 2 notions physique et logique.
En dehors des programmes de très bas niveau qui lisent et écrivent directement les champs adresse (et donc les secteurs physiques), on ne parle que de secteurs logiques.


En complément, juste un petit mot sur ce que vous trouvez dans les programmes d'E/S en langage machine.
Comme nous l'avons vu, on part d'un secteur connu (physique ou logique) qui est la source et on cherche son équivalent, la cible. Il va de soi que les programmes pour faire cette équivalence n'ont pas besoin de stocker la séquence des secteurs sources (il s'agit toujours des valeurs $00, $01, $02, ... $0F). Ils mettent le numéro du secteur source dans un registre et lisent le secteur cible dans la table désirée (DOS 3.3).

Exemple:

LDX #secteur source
LDA Table1,X ou Table2,X ; l'accumulateur contient le secteur cible

* Source=secteur physique, cible=secteur logique
Table 1 DFB $00, $07, $0E, $06, $0D, $05, $0C, $04, $0B, $03, $0A, $02, $09, $01, $08, $0F


* Source=secteur logique, cible=secteur physique
Table 2 DFB $00, $0D, $0B, $09, $07, $05, $03, $01, $0E, $0C, $0A, $08, $06, $04, $02, $0F