                                - ANALYSE 1 -
                                 -------------
 
     Si la lecture des 3 1ers volets vous a {chauff{ les m{ninges , un conseil 
 @ suivre imp{rativement : Attendez le  retour @ une temp{rature normale avant 
 de lire ce chapitre  !  (M{thode  RIKA  ZARAI  contre  indiqu{e) Cela devient 
 vraiment difficile @ suivre ... N'esp{rez pas tout dig{rer en une seule fois. 
                  -------------------------------------------
 
     Maintenant voyons comment effectuer l'analyse  compl}te  d'une piste . Le 
 postulat de d{part {tant bien sur :  On  ignore tout du formatage de la piste 
 concern{e .
 
     Tout d'abord , beaucoup de th{orie : 
 
     1 - Structure d'une piste :  Pour  connai^tre  tous les d{tails , reportez 
 vous au livre du lecteur de disquette  de  'Micro application' . Je ne prends 
 ici en compte , que les {l{ments r{ellement utilisables .
 
     Tout d'abord , un trou dans la  disquette  . Ce dernier est nomm{ orifice 
 d'index . Un rayon lumineux  frappe  une  cellule photo-{lectrique lorsque la 
 rotation du disque am}ne ce trou en coincidence avec le rayon . Une impulsion 
 est ainsi d{clench{e informant le  FDC  qu'il  se  trouve  sur le d{but de la 
 piste .
 
     Lors d'un formatage , le FDC {crit  146  octets @ la suite de cet orifice 
 d'index . Ces derniers concernent l'ensemble de la piste et @ ma connaissance 
 personne n'@ jamais pu les lire et  encore moins les modifier ! Donc ignorons 
 les ...
     Viennent ensuite les  octets  aff{rents  aux  secteurs  .  Ils  sont plus 
 int{ressants car on peut les  lire  en  utilisant  certaines astuces (Dans ce 
 num{ro) voire les modifier (dans les num{ros suivants) .
 
     Pour le premier secteur on aura  tout  de  suite  apr}s les 146 octets de 
 d{but de piste :
 
     12 Octets de synchronisation   - A 0 (Fr{quence d'horloge du FDC) .
      3 Octets                      - Index Data Adress Mark .
      1 Octet                       - Invariable , toujours = #FE .
      4 Octets                      - 4IDS Piste - Head - Num.Sect. - L.Sec.
      2 Octets                      - Cyclic Redundanc Check .
     22 Octets                      - Gap 2 Valeur #4E invariable .
     12 Octets de synchronisation    - A 0
      3 Octets                      - Data Adress Mark .
      1 Octet                       - Invariable , toujours = #FB
     ----------
     60 Octets au total
     ----------
     Suivent ici les octets de donn{es  du  secteur  ,  variable de 128 @ 4096 
 selon la taille de secteur demand{e
     
     2 Octets                       - 2}me CRC
     
     Et pour finir les octets  du  GAP3  de  formatage  dont le nombre (82) en 
 format standard peut varier en fonction du bon vouloir du programmeur .
 
     Cette me^me s{rie se r{p}te pour chaque secteur format{ . Apr}s le dernier 
 secteur la suite de la disquette est remplie avec des octets @ &4E jusqu'@ ce 
 que l'orifice d'index soit @ nouveau rencontr{ .
 
     Les valeurs IDAM - DAM - CRC sont des sommes de contro^le calcul{es par le 
 FDC afin  de  d{tecter  d'{ventuelles  erreurs  de  lecture  .  Les  m{thodes 
 employ{es pour d{terminer ces  valeurs  rel}vent  de comp{tences d{passant de 
 loin les capacit{s c{r{brales de l'auteur ...
 
                  ------------------------------------------
                  - LA LEGENDE DE L'INSTRUCTION LIRE PISTE -
                  ------------------------------------------
 
     Contrairement aux affirmations de certains programmeurs , l'instruction : 
 'Lire piste' ne permet pas de lire une piste enti}re depuis l'index de d{part 
 jusqu'@ la fin et  de  r{cup{rer  ainsi  la  totalit{  des  GAPS et octets de 
 synchronisation ! Qu'on se le dise :  Le  ro^le d{volu @ cette instruction est 
 de lire les octets  de  DONNEES!!  du  1er  au  dernier  secteur {crit sur la 
 piste.Cette instruction aura donc  des  effets  similaires  @ l'instruction : 
 'Lire secteurs' . 
     Les acharn{s de la ROM  AMSDOS  auront  not{  que 'Lire piste', n'est pas 
 employ{e  par  l'AMSDOS  .  C'est  sans  doute  pour  cette  raison  que  les 
 connections du FDC sont un  peu  bizarres  sur  ce  point  . On peut en effet 
 transmettre @  peu  pr}s  n'importe  quel  param}tre  erron{  dans  la  phase 
 instruction . Les  phases  ex{cution  et  r{sultat  ne  ignorent  les erreurs 
 commises ! C'est en fin  de  compte  ce  bogue  ,  qui  permettra (grce @ de 
 savantes bidouilles) de lire UNE PARTIE de ces octets cach{s .
 
     NOTE : Le parti @ tirer de  ces 'bidouilles' est expliqu{ dans la section 
 'Mode d'emploi' , qui vous montre quelques  exemples qu'il faut voir pour les 
 croire ... D'autres astuces seront d{crites  dans le commentaire du programme 
 . 
 
                 ---------------------------------------------
                 - POSER CLAIREMENT LE PROBLEME DE L'ANALYSE -
                 ---------------------------------------------
 
     Il faudra d{terminer : 
     
     1 / La densit{ d'{criture de la piste                 : (Facile)
     2 / Lire les IDS secteurs dans leur ordre physique    : (Pas {vident)
     3 / Le nombre de secteurs sur la piste                : (Encore pire)
     4 / La longueur de secteur  (ID peut e^tre falsifi{)   : (Simple)
     5 / La longueur du GAP3 de formatage                  : (Pervers)
 ;
                     ------------------------------------
                     - DETERMINER LA DENSITE D'ECRITURE -
                     ------------------------------------
 
     Il suffit  de  lancer  n'importe  quelle  instruction  dans  l'une  des 2 
 densit{s . Si aucune erreur n'est  renvoy{e  par  la  phase r{sultat , on est 
 donc @ la bonne densit{  .  Si  au  contraire  on  enregistre une erreur , on 
 change de densit{ et on recommence .  Comme il n'y-a que 2 densit{s possibles 
 , le 2}me essai  sera  le  bon  !  Cette  m{thode  de l'exp{rimentation et de 
 l'erreur sera utilis{e pour d{terminer d'autres param}tres du formatage . 
 
              --------------------------------------------------
              - LIRE LES IDS SECTEURS DANS LEUR ORDRE PHYSIQUE -
              --------------------------------------------------
 
     On utilisera bien sur la fonction : 'Lire IDS secteurs' ! Mais si l'on se 
 r{f}re @ SOS1 th{orie FDC , on  se  souvient que cette instruction lit le 1er 
 ID qui lui tombe sous la dent  sans  tenir compte de l'orifice d'index ! Donc 
 probl}me @ r{soudre : Commencer IMPERATIVEMENT  la lecture par le 1er secteur 
 de la piste .
 
     Solution : Provoquer syst{matiquement  une  erreur  avant  de commencer @ 
 lire les IDS . Dans  ce  cas  la  phase  r{sultat  est rendue sito^t l'orifice 
 d'index rencontr{ . On dispose  alors  du  temps  de passage des 146 premiers 
 octets de la disquette pour r{agir et lancer  la lecture IDS avant que le 1er 
 ID secteur soit rencontr{ ! Autant prendre le TGV en marche ...
 
     Algorythme : 1 - Lancer une instruction lire ID en SIMPLE DENSITE .
                  2 - Lire r{sultat .
                  3 - Voir si erreur .
                  4 - Si oui c'est gagn{ , initialiser en DOUBLE DENSITE
                  5 - Et lire les IDS
 
                  6 - Pas d'erreur alors lire ID en DOUBLE DENSITE
                  7 - Lire r{sultat .
                  8 - L'erreur se produit n{c{ssairement .
                  9 - Initialiser en SIMPLE DENSITE et lire les IDS .
 
     Ce me^me algorythme permet simultan{ment  de connai^tre la densit{ employ{e 
 lors du formatage . C'est  la  routine  TSTIDC  en section 'ROUTINES FDC' qui 
 accomplit ce travail . Pour bien vous p{n{trer de l'importance de la rapidit{ 
 de r{action , ajoutez une s{rie de  LD  A,1 apr}s LD A,(COMMAND) en RANGCOM . 
 Il en faudra fort peu pour que le 1er  secteur soit saut{ et que le 1er ID lu 
 soit celui du second secteur sur la piste .
 
            -------------------------------------------------------
            - DETERMINER LE NOMBRE EXACT DE SECTEURS SUR LA PISTE -
            -------------------------------------------------------
 
     'Lire IDS secteurs'  ne  s'arre^te  pas  sur  l'orifice  d'index  .  Il ne 
 provoque ni End Of Track ou Overrun  en r{sultat si cet orifice est rencontr{ 
 plusieurs fois . En cons{quence , l'arre^t  de  la  lecture est @ la charge du 
 programmeur .
 
     Probl}me : Arre^ter la lecture de IDS sito^t le nombre d'IDS format{s lus. 
     Solution {vidente mais fausse : M{moriser le  num{ro du 1er ID secteur et 
 comparer aux num{ros lus par la suite .  Sito^t que l'ID num{ro lu est {gal au 
 num{ro m{moris{ on relit le 1er ID et on doit s'arre^ter .
 
  Implacablement logique et  fonctionne  parfaitement  dans  les cas ci-contre 
 :C1,C2,C3,C4,C5,C6,C7,C8,C9   -   41,45,32,FF,A1,00,45,23,23,23
        Car le num{ro du 1er secteur n'est jamais r{p{t{ dans la s{rie
                        Mais dans les cas de ce type :
 
        C1,C2,C3,C4,C5,C6,C1,C8,C9   -   C1,C1,C1,C1,C3,C1,C1,C1,C2,C1
        ^                 ^              ^  ^  ^  ^     ^  ^  ^     ^
                    Il est {vident que ce n'est pas viable
 
     Donc solution pas du tout {vidente mais juste : Stopper l'op{ration sito^t 
 qu'une rotation compl}te  de  disque  est  effectu{e  et  ceci  sans filet ni 
 indication transmise par le FDC . Il  ne  reste  plus qu'@ jouer sur le temps 
 d'une r{volution compl}te du disque .
 
     Le principe d{crit ci-dessous n'@ exig{ aucun calcul compliqu{ . Rien que 
 du pifom}tre , de la logique ,  de  l'empirisme . Le tout piment{ d'{pith}tes 
 cornus de nature @ faire bouillir l'eau  des b{nitiers dans un rayon de 5253m 
 @ chaque plantage ...
 
     Le temps de rotation du disque est constant . L'Amstrad dispose de cycles 
 d'horloge interne .
     M{thode empirique : Etablir une  routine sous interruption qui incr{mente 
 un compteur .
 
     Pendant que le FDC lit 1  ID  ,  le compteur est r{guli}rement incr{ment{ 
 par le cycle d'horloge interne au  CPC  .  Apr}s  avoir  lu 1 ID secteur , on 
 regarde si ce compteur d{passe un maximum  donn{  . Si le maximum est d{pass{ 
 on @ effectu{ une rotation compl}te  et  tous  les  IDS  sont lus . Si non on 
 continue .
 
     La valeur (presque) id{ale du compteur est  de  60 . On lit en r{alit{ un 
 ID secteur de trop (Relecture du 1er mais il est facile de le supprimer) . Si 
 on diminue cette valeur on ne lira pas le dernier ID de la piste !
 
     Dernier probl}me , le temps : On  doit  attraper au vol le 1er ID secteur 
 (Voir paragraphe pr{c{dent) . Le temps  manque pour initialiser une v{ritable 
 routine d'interruption ! Heureusement ,  @  l'adresse  &39  de tous les CPC'S 
 figure un vecteur d'interruption  (INTERRUPT  ENTRY  CONT'D) vers &B939 (464) 
 &B941 (6128) . En 2 br}ves instructions  , on remplace ce vecteur par SUBROUT 
 et c'est le syst}me Amstrad qui  s'occupera de l'incr{mentation du compteur . 
 Ce vecteur doit bien sur e^tre restaur{ apr}s usage .
 
       Les 3 probl}mes pos{s par la lecture des IDS sont enfin r{solus .
 
                  -------------------------------------------
                  - DETERMINER LA VRAIE LONGUEUR DE SECTEUR -
                  -------------------------------------------
 
     On peut parfaitement formater une piste avec  N secteurs de taille X puis 
 fournir des IDS longueur tous diff{rents  de  la taille r{elle de formatage . 
 On ne peut donc se baser sur  la  lecture des IDS pour d{terminer la longueur 
 r{elle d'un secteur .
 
     La solution est des plus simple . Toute instruction de lecture - {criture 
 demande entre autre , la transmission de la taille secteur (Voir SOS1 Th{orie 
 FDC) en phase instruction .  Si  cette  valeur  n'est  pas  {gale @ la taille 
 r{elle du secteur lu , la  phase  r{sultat  renverra le message Data Error in 
 Data Field (DD pour les intimes) . On en d{duit le principe suivant :
 
     1 - Taille envoy{e dans la phase instruction = 0 (+ Petite possible)
        2 - Lancer instruction de lecture   <-------------------------!
        3 - Lire r{sultat                                             !
        4 - R{sultat renvoie flag DD ?                                !
        5 - NON on vient de trouver la taille r{elle et c'est fini .  !
        6 - OUI on augmente la taille de 1 et on recommence en 2 >----!
 
     Une nouvelle fois la m{thode de l'essai et de l'erreur est payante !
 
                  -------------------------------------------
                  - TROUVER LA LONGUEUR DU GAP DE FORMATAGE -
                  -------------------------------------------
 
     Dernier point @ traiter , mais pas  le moindre . C'est un d{tournement de 
 l'instruction lire piste qui est employ{ .
 
     En cas d'erreur , les instructions  'Lire  - Ecrire secteurs' mettent les 
 flags {quivalents et stoppent imm{diatement la phase instruction en cours .
 
     Dans  les  me^mes  conditions  ,  'Lire   piste'  met  les  bits  d'erreur 
 correspondants mais continue l'op{ration  comme  si  de  rien n'{tait . Seule 
 l'erreur Over  run  l'interrompt  .  L'Over  run  est  le  flag  des  grandes 
 catastrophes . Il signifie que le  FDC  est compl}tement d{synchronis{ et est 
 incapable d'interpr{ter ce qu'il lit .
     
  Il faudra donc {tablir une routine sp{ciale le lecture pour ce cas pr{cis :
               1 - D{terminer le nombre exact d'octets @ lire .
               2 - Lire un octet en phase instruction . <-----!
               3 - Le stocker                                 !
               4 - D{cr{menter le nombre @ lire .             !
               5 - Si pas 0 recommencer  >--------------------!
               6 - Si 0 attendre l'Over Run 
               7 - Over run apparu , c'est fini .
 
     Faute de cette pr{caution , la  quantit{  d'octets lus et stock{s dans le 
 buffer d{passerait de tr}s loin la totalit{ de la m{moire disponible !
 
        Voyons un peu plus en d{tail le fonctionnement de lire piste .
 
  Soit une piste tout @ fait normale de 9 secteurs de taille 2 (512 octets) .
  En transmettant des param}tres exacts @ 'Lire piste' on aura dans l'ordre :
 
     1 - Reconnaissance de l'orifice d'index .
     2 - Test des octets d'en te^te de la piste . (Interne au FDC)
 
     3 - Contro^le Sync et IDAM 1er secteur .     (Interne au FDC)
     4 - Contro^le des IDS et du CRC .            (Interne au FDC)
     5 - GAP2 qui laisse le temps au FDC de finir le contro^le ci-dessus
     6 - 12 Octets pour synchro avec horloge interne
     7 - Lecture de la DAM                       (Interne au FDC)
     8 - Lecture des 512 octets de donn{es       (Disponibles au programmeur)
     9 - Lecture et contro^le du CRC
    10 - GAP3 de formatage pour temps de calcul CRC DAM (DD si incorrect)
    11 - Retour en 3 pour secteur suivant .
 
     Comme on le voit , l'instruction  est  bien  con\ue  pour ne lire QUE LES 
 OCTETS DE DONNEES .
     Conservant la me^me piste , transmettons @ cette instruction 'miracle' les 
 me^mes param}tres @ l'exception de  la  taille  secteur  que nous mettrons @ 3 
 soit 1024 octets .
 
      SOIT TAILLE REELLE + 1 = LE DOUBLE DE LA LONGUEUR REELLE DE SECTEUR
 
     Que va faire le FDC ? Pour  le  d{but  de  la piste et le premier secteur 
 tout se passera comme ci-dessus de 1  @  8  .  Mais apr}s , croyant qu'il y-@ 
 encore 512 octets de donn{es , il lira : 9 - Les 2 octets  CRC du 1er secteur 
 (qui ne nous int{ressent pas) ,  10  -  Les  Octets du GAP3 de formatage (que 
 l'on veut) , de 3 @ 8  les  octets  d'en te^te du secteur suivant ainsi qu'une 
 partie des donn{es . Apr}s quoi le FDC  cherchera @ lire des octets synchro - 
 CRC , etc... Au beau milieu de la  zone de donn{es du second secteur .Il s'en 
 trouvera fort perturb{ et renverra des  choses plus o| moins coh{rentes avant 
 de sombrer dans la folie et crier @ l'over run !
 
   NOTE 1 : Quelque soit la  taille  de  formatage  , ce proc{d{ reste valable 
 sauf dans le cas d'un secteur  de  taille  5  !  Dans  ce  cas il n'y a qu'un 
 secteur sur la piste et on ne peut lire le GAP entre 2 secteurs ! Dans ce cas 
 , le GAP sera fix{ arbitrairement @ #FF .
 
   NOTE 2 : Si on effectue un  essai  de ce type sur une disquette normalement 
 format{e tous les octets seront conformes @  la  th{orie  . Si on a affaire @ 
 une disquette enregistr{e , tout est chamboul{ ! Une rotation un peu lente et 
 la longueur du GAP3 est r{duite . Un peu  rapide , le GAP3 est allong{ . Seul 
 le 1er octet du GAP3 conserve la valeur  &4E . Les autres sont modifi{s ! Les 
 12 octets SYNC initialement @ 0 peuvent passer @  &FF et se r{duire @ 9 ou 10 
 L'ID du secteur suivant n'est  pas  forc{ment  lisible  , etc... Tout ceci en 
 raison des travaux internes effectu{s  par  le  FDC  sur  la disquette et des 
 probl}mes de synchronisation complexes inh{rents @ ce d{tournement d'usage .
 
   NOTE 3 : Quoi qu'il en soit ,  une  certitude : Les 2 1ers octets lus apr}s 
 la zone de donn{es  sont  le  CRC2  du  secteur  en  cours  . L'octet suivant 
 contient la valeur de l'octet GAP3  (&4E  sauf formatage avec FDC sp{cial) et 
 marque le d{but du GAP3 . La premier octet d'une s{rie de #FF ou 00 marque la 
 fin du GAP3 . Ceci  nous  suffit  pour  d{terminer  la  longueur du GAP et en 
 calculer la longueur . Le dernier probl}me  a  trouv{ sa solution et ce n'est 
 pas dommage .
 
     FIN DE LA SECTION LA PLUS PENIBLE DE SOS2 : A SUIVRE DANS 'ANALYSE 2'
