|
||||
Puisqu'il n'y a aucun systeme physique permettant de signaler � la tete de
lecture o� commence un "NIBBLE" �crit sur la disquette, quand la dite t�te de lecture
lit un bit, il n'y a absolument aucun moyen de savoir si elle est positionn�e au debut d'un octet valide sur
la disquette... c'est m�me rarement le cas.
En fait la synchronisation est fond�e sur le fait qu'un nibble valide doit obligatoirement commencer par un 1 et jamais un 0, et, qu'en ayant ajout� deux 0 suppl�mentaires lors de l'�criture des nibbles de synchronisation, la lecture va ainsi "d�raper" car on aura �crit des nibbles de synchronisation en 10 bits alors qu'on effectuera la lecture par groupes de 8 bits. En clair (les points sont l� uniquement pour faciliter la lecture des bits): un nibble $FF �crit normalement en 32 cycles (4*8) sera repr�sent� sur la disquette par 1111.1111 un nibble $FF �crit en 40 cycles sera repr�sent� sur la disquette par 1111.1111.00 Parce qu'il y a deux z�ros suppl�mentaire ce dernier $FF est dit "de synchronisation", l'explication suit.... |
CULTURE GENERALE
Wozniak a d�clar� dans une interview a Anaheim (californie) le 17 avril 1983 qu'il avait eu l'id�e de mettre le bit 7 obligatoirement � 1, pour d�finir des groupes de donn�es, en s'inspirant du bit de stop utilis� par les liaisons RS232. (source : Jim Sather) |
MAIS COMMENT CA MARCHE ? La lecture des bits sur la disquette se fait par groupe de 8. Immanquablement il y aura donc un moment ou certains de ces 0 se trouveront en t�te de groupe et ils seront ignor�s (car le bit 7 doit OBLIGATOIREMENT �tre � 1), ce qui permet ainsi de r�aliser de synchroniser la lecture sur les valeurs ad hoc par "d�rapage" de la lecture. L'explication technique de ce "d�rapage" est donn�e dans la rubrique"FONCTIONNEMENT DU LOGIC STATE SEQUENCER EN MODE READ" Le DATA REGISTER qui contient le nibble en cours de lecture n'a pas la bonne valeur imm�diatement, la lecture est rapide mais cela ne rel�ve pas de la magie non plus : C'est la raison m�me de l'instruction BPL que l'on trouve dans toutes les routines de lecture, cette instruction permet ainsi d'�tre s�r que le nibble lu et pr�sent dans le registre de lecture commence bien par un 1. En �crivant un nombre suffisant de ces nibbles de synchronisation, les valeurs cherch�es pourront �tre retrouv�es et ce sont les routines de lecture qui vont devoir d�terminer ce qu'il faut trouver... de l� ces merveilleux syst�mes de protection qui �crivent des valeurs non standard pour emp�cher la copie. Voici donc la s�quence normale de d�tection des valeurs recherch�es : | ||||
| LDA $C08C,X | |||
BPL LOOP | ; tant que le nibble ne commence pas par 1 on boucle | |||
CMP #$D5 | ; on fait le test ensuite de ce qui est recherch� | |||
BNE LOOP | ; si ce n'est pas $D5 on continue |
|||
Nota important :
On n'essaye pas de lire les valeurs de synchronisation en tant que telles mais la premiere valeur
ad hoc qui se trouve derri�re. Supposons que vous cherchiez les valeurs $D5 $AA $96, premiers marqueurs d'un d�but de
champ d'adresse, derri�re cinq $FF de synchronisation.
Sur votre disque vous aurez la suite FF FF FF FF FF D5 AA 96 etc... Comme les $FF sont des nibbles de synchronisation, ils sont �crits en 40 cycles et donc pr�sentent tous normalement 2 extrabits (les deux z�ros de fin), il y a en fait sur la disquette les bits suivants (les points . sont l� pour faciliter la lecture des bits par groupe de 4 et localiser les extrabits) |
1111.1111.00 | 1111.1111.00 | 1111.1111.00 | 1111.1111.00 | 1111.1111.00 | 1101.0100. | 1010.1010. | 1001.0101. | |
$FF et.00 | $FF et.00 | $FF et.00 | $FF et.00 | $FF et.00 | $D5 | $AA | $96 |
Ci dessous on repr�esente ce flux de nibbles d�compos�s en bits.
Comme dit plus haut les nibbles de synchronisation sont �crits en 40 cycles c'est pourquoi ils ont toujours
les 2 z�ros (les extrabits) derri�re les 8 bits repr�sentant leur propre valeur qui, pour
d'�videntes raisons de simplification sont $FF soit 11111111. Mais attention certaines protections, pour �viter que les programmes de copie "intelligents" (bitcopiers) trouvent le d�but de piste par d�tection de ces $FF, mettent d'autres valeurs �crites en 32 cycles, donc sans ces deux extrabits et l� le calcul de synchronisation devient un tantinet moins simple. Nota important : D�s que la synchronisation est obtenue, ELLE EST CONSERVEE JUSQU'A LA FIN DE LA LECTURE de l'objet lu (ent�te d'adresse ou secteur). ELLE N'EST PERDUE QU'EN CAS D'ERREUR DE MAGNETISATION !!! donc si votre disquette est ab�m�e.... o� si vous �tes sur une zone de recouvrement (voir la rubrique "format d'une disquette") EXPLICATION DETAILLEE DE LA SYNCHRONISATION PAR L'EXEMPLE Il n'y a que 10 possibilit�s pour commencer la lecture Ci dessous vous avez donc le m�me flux represent� 10 fois, et sous chaque flux on montre ce qui se passe au niveau de la lecture selon le premier bit lu par la tete de lecture. La ligne 1 c'est le cas ou la tete tombe immediatement sur le premier bit d'un octet de synchronisation, il va sans dire que la synchronisation est immediate. les �toiles (*) sous les bits indiquent que le mode lecture n'a encore pas commenc�. Quand la lecture commence effectivement, elle se fait : soit par acceptation ("a" = accept�) soit par ignorance ("I" = Ignor�) du bit rencontr�. En rouge et magenta (les 'a') ce sont les 8 bits lus pour constituer un nibble, En jaune les extrabits qui peuvent �tre soit accept�s dans un nibble (a), soit ignor�s � la lecture (I) quand ils sont en t�te de nibble (qui doit toujours commencer par un 1 pour �tre valide, on ne le dira jamais assez) En vert gras le premier nibble synchronis�, les suivants sont obligatoirement synchronis�s Les cas 9 et 10 sont les cas particuliers ou la t�te tombe directement sur l'un ou l'autre des extrabits, ce qui revient quasiment au m�me que de tomber sur le 1er bit d'un nibble valide | ||||
CAS 1 (synchronisation imm�diate) | ||||
1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 | ||||
a a a a a a a a I I Les deux 0 sont ignor�s car un nibble doit commencer par 1... | ||||
Les nibbles valides lus sont les suivants : | ||||
le 1er 1111 1111 =$FF le 2�me 1111 1111 =$FF et nous sommes synchronis�s | ||||
CAS 2 | ||||
1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 | ||||
* a a a a a a a a I Le z�ro est ignor� car un nibble doit commencer par 1... puis c'est Synchronis� | ||||
Les nibbles valides lus sont les suivants : | ||||
le 1er 1111 1110 =$FE le 2�me 1111 1111 =$FF et nous sommes synchronis�s | ||||
Comparez les cas 1 et 2 pour bien comprendre que les extrabits (dits de synchronisation) sont bien l� pour �tre soit absorb�s dans un nibble soit pour �tre ignor�s. L'objectif recherch� est d'avoir suffisament de nibbles avec ces zeros finaux pour faire "d�raper" la lecture de telle fa�on que l'on soit obligatoirement synchronis� apr�s un certain temps, qui d�pendra de l'endroit o� la t�te de lecture commence � effectivement lire les transitions magn�tiques de la disquette | ||||
CAS 3 | ||||
1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 | ||||
* * a a a a a a a a Les deux extrabits ont �t� absorb�s dans le nibble lu et maintenant c'est Synchronis� | ||||
Les nibbles valides lus sont les suivants : | ||||
le 1er 1111 1100 =$FC le 2�me 1111 1111 =$FF et nous sommes synchronis�s | ||||
Il est �galement important de comprendre que le programme de lecture n'essaye PAS de lire la valeur des nibbles
de synchronisation mais RECHERCHE UNIQUEMENT UN NIBBLE VALIDE SPECIFIQUE dont il conna�t la valeur,
par exemple $D5 pour le premier nibble d'un champ adresse. Dans le cas pr�sent la t�te de lecture ne s'est pas pos�e au d�but du $FF qui a �t� �crit avec ses deux extrabits et pourtant on est synchronis� imm�diatement comme si elle s'�tait pos�e au d�but du dit $FF ! | ||||
CAS 4 | ||||
1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 | ||||
* * * a a a a a a a a a a a a a a a a I Maintenant c'est Synchronis� | ||||
Les nibbles valides lus sont les suivants : | ||||
le 1er 1111 1001 =$F9 le 2�me 1111 1110 =$FE, le 3�me 1111 1111 =$FF et nous sommes synchronis�s | ||||
CAS 5 | ||||
1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 | ||||
* * * * a a a a a a a a a a a a a a a a Maintenant c'est Synchronis� | ||||
Les nibbles valides lus sont les suivants : | ||||
le 1er 1111 0011 =$F3 le 2�me 1111 1100 =$FC, le 3�me 1111 1111 =$FF et nous sommes synchronis�s | ||||
CAS 6 | ||||
1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 | ||||
* * * * * a a a a a a a a a a a a a a a a a a a a a a a a I Maintenant c'est Synchronis� | ||||
Les nibbles valides lus sont les suivants : | ||||
le 1er 1110.0111 =$E7 le 2�me 1111 1001 =$F9 , le 3�me 1111 1110 =$FE , le 4�me 1111 1111 =$FF et nous sommes synchronis�s | ||||
CAS 7 | ||||
1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 | ||||
* * * * * * a a a a a a a a a a a a a a a a a a a a a a a a Maintenant c'est Synchronis� | ||||
Les nibbles valides lus sont les suivants : | ||||
le 1er 1100.1111 =$CF le 2�me 1111 0011 =$F3 , le 3�me 1111 1100 =$FC , le 4�me 1111 1111 =$FF et nous sommes synchronis�s | ||||
CAS 8 | ||||
1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 | ||||
* * * * * * * a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a I Maintenant c'est Synchronis� | ||||
Les nibbles valides lus sont les suivants : | ||||
le 1er 1001.1111 =$9F le 2�me 1110 0111 =$E7 , le 3�me 1111 1001 =$F9 , le 4�me 1111 1110 =$FE , le 5�me 1111 1111 =$FF et nous sommes synchronis�s | ||||
CAS 9 (synchronisation quasi imm�diate) | ||||
1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 | ||||
* * * * * * * * I I Maintenant c'est Synchronis� | ||||
Dans ce cas particulier (et le suivant) la t�te de lecture ne d�tecte en fait rien car elle est "tomb�e" dans la zone des extrabits, qui sont donc ignor�s purement et simplement. La synchronisation est quasi imm�diate en ce sens que le premier nibble valide sera celui qui se trouve juste derri�re ces deux extrabits, un bon gros $FF bien normal. | ||||
CAS 10 (synchronisation quasi imm�diate) | ||||
1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 | ||||
* * * * * * * * * I Maintenant c'est Synchronis� | ||||
Vous comprennez maintenant pourquoi il faut au minimum 4 $FF de synchronisation (cf. cas 8)
avant d'�crire un marker d'ent�te, que ce soit du champ adresse ou du champ de donn�es.(si l'on exclut le cas particulier des sch�mas de protection qui peuvent en mettre plus avec moins d'extrabits.) Vous allez sans doute vous dire "oui mais si la lecture commence ailleurs que sur les octets de synchronisation ? Comme dirait le cerveau de Baker Street "El�mentaire mon cher Watson, on ne peut pas se synchroniser tant que l'on ne passe pas sur ces fameux nibbles de synchronisation! Les marqueurs d'adresse ont d'ailleurs des valeurs dont la combinaison NE PEUT PAS se retrouver dans les donn�es enregistr�es dans chaque secteur, ce qui �vite des tentatives de lecture quasi-infinies" ! | ||||
Ce � quoi ce m�me cerveau f�cond ajouterait "mais c'est d'ailleurs une astuce utilis�e par certains sch�mas de protection que de modifier ces octets de synchronisation et le nombre d'extrabits..." | Cela donne des syst�mes de protection tr�s efficaces contre la copie, d'autant que l'on peut le faire avec des formats tout � fait normaux... et cela d�route tous les newbies qui se lancent dans le piratage | |||
|
||||
|