CODING ★ FDC - ECRASER LES SECTEURS ★

Fdc - 23 - Ecraser les Secteurs (SOS Programmeurs)
ATTENTION . Pour fonctionner en simple densité , toutes les valeurs mises dans les tables TB... et les valeurs de comparaisons devront être modifiées.
La section pourra être beaucoup plus  courte  car  en  SD , il n'y à plus grand chose à écraser ...

Si vous n'avez toujours pas compris ce qu'est un secteur écrasé , revoyez donc la section théorie ...

Dans presque tous les cas  où  la  routine  SOLUTION1  aura échoué et que plusieurs tailles de secteurs vraiment écrits auront été trouvés sur une même piste , il y-aura  au  moins  une  sérieuse  suspiscion  sur  le  bon aloi du formatage . L'expérience ayant  démontré  qu'écraser  sans nécéssité est sans effet nocif sur la  copie  alors  que  l'inverse  produit  souvent des copies ne fonctionnant pas . Dans le doute , on écrase d'abord et on discute après !

Ce n'est pas vraiment simple  ,  mais  la  structure  en cascade de cette routine est un peu plus claire que celle des routines d'analyse .

Les sections d'analyse sont censées nous  avoir  donné la vraie taille du format .  Dans  le  pire  des  cas  ,  on  dispose  de  LMIN  qui  sera alors considérée comme taille du format d'origine .

La vraie longueur du GAP :  Elle  a  été  déterminée , ou mise au minimum admissible . Ce n'est pas vraiment un problème .

A ce point ,  nos  perfectionnistes  favoris  auront observé que quelques routines et variables font double  emploi  , les moins chevronnés préféreront snas doute cete structure qui leur  évite de rechercher variables et routines dans les fichiers précédents ...

Alors en premier , quelques mémorisations indispensables car le nombre de secteurs à formater sera plus grand que  celui  trouvé lors de l'analyse . Il faut aussi penser à  'équilibrer'  la  liste  des  erreurs  ,  sinon gare aux surprises lors des opérations de lecture ecriture !

;
;-Routine de recreation de piste avec secteurs ecrases -
;
 ECRASER LD HL,IDINDRA+3 ;1er ID LEN de la liste des IDS
  LD DE,LERPROV ;Zone de transfert pour la liste des erreurs
  LD (PERPROV),DE ;et son pointeur
  LD DE,LISTERR ;Vraie liste des erreurs
  LD (POINTER),DE ;et son pointeur
  LD IX,LISTIDS ;Début d'une liste qui ne contiendra que les IDS LEN
  LD A,(NBSPROV)  ;Nombre provisoire de secteurs qui à été initialisé
  LD B,A    ;à la valeur NBSEC dans les routines précédentes
 ;
  PUSH BC   ;Du début à la fin , B contiendra toujours NBSEC
 RANGEOK LD C,#FF     ;Ranger toutes les longueurs de secteurs OK à la suite
  LD A,(DE)    ;si le secteur n'est pas OK , mettre #FF
  AND %00111111 ;Ignorer EP HD qui ne sont pas de vraies erreurs
  JR NZ,BADSEC ;Si pas OK , laisser #FF dans C pour marquer le fait
  LD C,(HL)    ;Si OK ranger l'octet LENSEC dans la liste
 BADSEC  LD (IX+0),C
  INC HL    ;Avancer de 4 octets pour pointer prochain ID LEN
  INC HL
  INC HL
  INC HL
  INC DE    ;Avancer dans la liste des erreurs
  INC IX    ;Et dans la liste LENSEC en cours de création
  DJNZ RANGEOK
  POP BC    ;Reprendre NBSEC
;

Ici vient d'être  crée  une  liste  de  toutes  les  longueurs de secteur figurant sur la piste . Les secteurs non  OK  ne pouvant être écrits , ils ne peuvent pas en écraser un autre .  Leur  emplacement dans la liste est marqué  par un #FF qui ne risque pas d'être confondu avec un longueur .

Le contenu de la liste  pourrait  ressembler à ceci : 0,2,2,2,2,#FF,2,2,2 où 1 secteur de taille 0 est OK , 7 secteurs de taille 2 écrasent un nombre X de secteurs et le 6ème secteur  de  la  piste renvoyant une erreur quelconque doit être ignoré par le programme .

Ceci étant fait , il faut en  fonction  de  la taille recouvrante , de la taille à recouvrir (Vraie taille de  formatage)  et  de  la longueur du GAP , déterminer le nombre de secteurs à ajouter  à notre formatage . Ceci est fait à l'aide de tables pour les  GAPS  ,  d'une  cascade de comparaisons pour les longueurs et d'une  bonne  brouette  de  pointeurs  divers  pour  gérer cette panique .
Quelque soit la taille à écraser , le principe est le même . Seule le cas de la taille 0 est commenté .

;
  LD IY,IDOUTDRA  ;Liste des IDS A ECRIRE LORS DE LA REPRODUCTION
  LD IX,IDINDRA ;Liste des IDS LUS SUR LA VERSION D'ORIGINE
  LD DE,LISTIDS ;Liste des longueurs venant d'etre creee
 ;
  LD A,(LMIN)  ;On prend LMIN comme vraie longueur
  CP #FF    ;Est peut-être encore a #FF
  JR NZ,XXXX
  INC A     ;Si oui c'est 0
  LD (LMIN),A  ;Et cette fois c'est definitif !
 XXXX LD (LENSEC),A ;Et aussi la vraie taille du format d'origine
 ;
  OR A
  JR Z,ECRA0   ;Ecraser taille 0
  DEC A
  JP Z,ECRA1   ;Ecraser taille 1
  DEC A
  JP Z,ECRA2   ;Ecraser taille 2
  DEC A
  JP Z,ECRA3   ;Ecraser taille 3
 ;
 RET  ;Ne devrait jamais passer ici (Il  faut un taille 5 pour écraser une taille 4 et dans ce cas il n'y à plus qu'un secteur T5 . C'est donc inutile, quand à écraser un secteur de taille 5 , à la bonne votre !)
 ;
;- ECRASER TAILLE 0 -
 ;
 ECRA0   LD A,(DE) ;Longueur du secteur recopiée dans la liste provisoire
  OR A     ;Est-ce 0 ?
  JR Z,RECOP0 ;Oui donc taille identique . Pas de changement
  CP #FF   ;Est-ce un secteur en erreur ?
  JR Z,RECOP0 ;Oui , il n'est pas a ecrire . Pas de changement
 ;
  DEC A     ;Est plus grand ET a ecrire . On change .
  JR NZ,PAS1S0 ;Est-ce une taille 1 ?
 ;
  LD A,(GAPFORM) ;Oui . Taille 1 ecrase  Taille 0 . Encore faut-il
  CP #77   ;savoir combien on en ecrase ! Ici , si le GAP est
  JR NC,RECOP0 ;plus grand que #76 , il s'intercale sans toucher
  LD C,1   ;au suivant  .  Sinon  il  faut  ajouter  au nombre
  CALL PLUSIDS ;total de secteurs celui qui sera ecrase lors de
  JR ECRA0A   ;l'ecriture et on va tester le suivant
 ;
 PAS1S0  DEC A    ;Pas taille 1 . Est-ce taille 2 ?
  JR NZ,PAS2S0 ;Non .
 ;
  LD HL,TB02 ;Oui . Taille 2 sur taille 0
  LD C,1     ;La même cuisine que precedement , mais comme il y-a
  CALL FGAPTB ;plus de possibilites on met le nombre minimum de
  JR ECRA0A  ;secteurs a ecraser dans C et on utilise une table
 ;
 PAS2S0  DEC A   ;Taille 3 ?
  JR NZ,PAS3S0
 ;
  LD HL,TB03 ;Oui T3 sur T0
  LD C,2     ;et ca continue tant que toutes les combinaisons
  CALL FGAPTB ;possibles ne sont pas epuisees .
  JR ECRA0A
 ;
 PAS3S0  DEC A
  JR NZ,PAS4S0
 ;
  LD HL,TB04 ;T4 sur T0
  LD C,4
  CALL FGAPTB
  JR ECRA0A
 ;
 PAS4S0  LD HL,TB05
  LD C,9
  CALL FGAPTB
  JR ECRA0A
 ;
 RECOP0  CALL COP4ID ;Le secteur en cours n'ecrase rien et est recopie .
 ;
 ECRA0A  INC DE   ;Les secteurs a ecrases ont ete pris en compte et
  DJNZ ECRA0  ;on continue
  JP EXIECRA
 ;
;- ECRASER TAILLE 1 -
 ;
 ECRA1   LD A,(DE) ;NO COMMENT , AVANCEZ DANS LE TEXTE JUSQU'AU POINT
  CP 2     ;STRATEGIQUE
  JR C,RECOP1
  CP #FF
  JR Z,RECOP1
 ;
  DEC A
  DEC A
  JR NZ,PAS2S1
 ;
  LD A,(GAPFORM)
  CP #FA
  JR NC,RECOP1
  LD C,1
  CALL PLUSIDS
  JR ECRA1A
 ;
 PAS2S1  DEC A
  JR NZ,PAS3S1
 ;
  LD HL,TB13
  LD C,1
  CALL FGAPTB
  JR ECRA1A
 ;
 PAS3S1  DEC A     ;AVANCEZ ENCORE ....
  JR NZ,PAS4S1
 ;
  LD HL,TB14
  LD C,3
  CALL FGAPTB
  JR ECRA1A
 ;
 PAS4S1  LD HL,TB15
  LD C,7
  CALL FGAPTB
  JR ECRA1A
 ;
 RECOP1  CALL COP4ID
 ECRA1A  INC DE
  DJNZ ECRA1
  JP EXIECRA
 ;
;- ECRASER TAILLE 2 -
 ;
 ECRA2   LD A,(DE)    ;TOUT A UNE FIN , PERSEVEREZ ....
  CP 3
  JR C,RECOP2
  CP #FF
  JR Z,RECOP2
 ;
  ;SUB 3
  JR NZ,PAS3S2
 ;
  LD C,1
  CALL PLUSIDS
  JR ECRA2A
 ;
 PAS3S2  DEC A
  JR NZ,PAS4S2
 ;
  LD HL,TB24
  LD C,2
  CALL FGAPTB
  JR ECRA2A
 ;
 PAS4S2  LD C,5
  CALL PLUSIDS
  JR ECRA2A    ;COURAGE VOUS APPROCHEZ ...
 ;
 RECOP2  CALL COP4ID
 ECRA2A  INC DE
  DJNZ ECRA2
  JP EXIECRA
 ;
;- ECRASER TAILLE 3 -
 ;
 ECRA3   LD A,(DE)
  CP 4
  JR C,RECOP3
  CP #FF
  JR Z,RECOP3
 ;
  ;SUB 4
  JR NZ,RECOP3
 ;
  LD C,1
  CALL PLUSIDS
  JR ECRA2A
 ;
 RECOP3  CALL COP4ID
 ECRA3A  INC DE
  DJNZ ECRA3  ;VOUS Y ETES !

------------------------

Ici les 2 routines essentielles . La  première  , COP4ID , se contente de  recopier les IDS de la zone lecture  vers  la zone écriture . L'état d'erreur  est recopié dans dans la seconde liste d'erreurs qui servira à l'écriture .

La seconde s'occupe de l'écrasement . Le secteur à écrire est recopié par COP4ID , ensuite , on  augmente  le  nombre  total  de  secteurs sur la piste en fonction du nombre de secteurs qui seront écrasés par l'écriture . Il faut  évidement augmenter la liste des IDS à  écrire  d'autant , comme ces IDS sont  destinés à une fin rapide et  ne  seront  jamais  lus  ni  écrits , on peut y  mettre n'importe quoi . Reste  la  liste  des  erreurs . Quoique peu utilisée  jusqu'ici , elle est vitale pour  la  suite  des  opérations . C'est elle qui  décide si il faut lire ,  écrire  ou  ignorer  un  secteur . Pas question d'y  mettre n'importe  quoi  !  Il  faut  un  octet  spécifique  qui  signalera au  programme d'ignorer ce secteur  sans  être  confondu  avec  un véritable état  d'erreur . #7F (01111111) est tout à  fait  convenable . Il faudrait au moins  massacrer le drive à la hache et en plein vol pour obtenir un tel résultat .

 -----------------------

;
 COP4ID  PUSH BC   ;Preserver NBSEC
  LD B,4    ;Copier 4 IDS de IN vers OUT
 BCLCOP  LD A,(IX+0)
  LD (IY+0),A
  INC IX
  INC IY
  DJNZ BCLCOP
  POP BC
 ;
  LD HL,(POINTER) ;Avancer le pointeur etat d'erreur
  LD A,(HL)
  INC HL
  LD (POINTER),HL
 ;
  LD HL,(PERPROV) ;Et recopier cet etat d'erreur dans la
  LD (HL),A    ;liste provisoire tout en avancant le pointeur
  INC HL    ;de celle-ci
  LD (PERPROV),HL
  RET
 ;
;- DETERMINE ET AJOUTE
 ;
 FGAPTB  LD A,(GAPFORM)  ;HL Contient le 1er octet de la table concernée
 FGAPTB1 CP (HL)   ;Determiner le nombre de secteurs qui seront
  JR NC,PLUSIDS ;ecrases en fonction du GAP
  INC C     ;Pas trouve en table donc un secteur de plus
  INC HL    ;et octet suivant de la table
  JR FGAPTB1
 ;
 PLUSIDS CALL COP4ID  ;Ajouter des IDS . On recopie l'ID d'origine
  LD A,(NBSPROV)
  ADD A,C   ;On augmente le nombre de secteurs
  LD (NBSPROV),A  ;et on le range
 ;
 REBOUCH PUSH BC   ;Preserver NBSEC
  LD B,3
  LD A,(PISTSEL)
  LD (IY+0),0  ;On met en place la serie d'IDS qui sera ecrasee
  INC IY
 BOUCHE  LD (IY+0),0
  INC IY
  DJNZ BOUCHE
  POP BC
 ;
  LD HL,(PERPROV) ;Marque invraissemblable  dans liste provisoire
  LD (HL),#7F  ;pour invalider lecture ecriture
  INC HL
  LD (PERPROV),HL
  DEC C
  JR NZ,REBOUCH
  RET
;

--------------------

EXIECRA est le point de  sortie  du  programme  .  Dans 99% des cas c'est enfin fini . Il reste hélas  un  dernier  point  à  vérifier : Que le nouveau nombre de secteurs déterminé par 'ECRASER' puisse effectivement tenir sur une piste ! Logiquement ça devrait  .  Pourtant  ,  si  on  s'amuse à formater en taille 0 et a tout écraser sous des  tailles diverses sans laisser un seul ID LEN à 0 . Certaines combinaisons ne permettront pas aux routines d'analyse la vraie taille de format . Exemple  :  Un  formatage  de  taille 0 écrasé de la manière suivante : 1,2,2,2,2,2,2,2,2,2,1 renverra systématiquement un LMIN de 1 . Dans la  mesure  ou  le  rapport  d'écrasement  est différent pour chaque taille , un écrasement sur la base  1 calculera un nouveau nombre de secteurs excessif . Pas  de  panique  ,  RECTINB1  fait  le  gendarme  à  la sortie de l'autorute ! Si le nombre de secteurs  est  convenable , on prend la bretelle de sortie , sinon P.V. et retour à  la  case départ avec un point de longueur en moins .

 ---------------------

;
 EXIECRA LD A,(NBSPROV)  ;Voir si le nombre maximum de secteurs toleres par
  LD B,A    ;la taille de format est depasse .
  CALL RECTINB1 ;RECTINB1 fait les comptes
  JR C,FINECRA ;Si c'est juste , c'est fini .
 ;
  LD A,(LMIN)  ;On deborde . Si LMIN etait zero on a vraiment
  OR A      ;un probleme et on laisse tomber ! (Cas inconnu
  JR Z,FINECRA ;a ce jour)
 ;
  DEC A
  LD (LMIN),A  ;Sinon on recommence avec la taille en dessous
  CALL ADDLON  ;Refaire LONGSEC
  LD A,3    ;Dans ce cas le GAP a 99% de chances d'etre
  LD (GAPFORM),A  ;faux ! On le met au minimum
  CALL SETGRW  ;sans oublier le GAP R/W
  LD A,(NBSEC) ;Le nombre de secteurs doit etre reinitialise
  LD (NBSPROV),A  ;a son nombre initial
  JP ECRASER
 ;
 FINECRA LD A,B    ;Nouveau nombre de secteurs calcules comme
  LD (NBSEC),A ;nombre a formater
  LD HL,IDOUTDRA  ;Recopier les nouveaux IDS dans la zone ID LUS
  LD DE,IDINDRA ;pour ne pas avoir de problemes lors du stockage
  LD BC,256
  LDIR
  LD B,0
  LD C,A    ;A=NBSEC
  LD HL,LERPROV ;Et recopier la nouvelle liste des erreurs avec
  LD DE,LISTERR ;ses octets a #7F correspondant aux IDS
  LDIR      ;qui seront detruits par la suite
  RET
 ;
 TB02 DB #5D,0
 TB03 DB #A3,#48,#1A,0
 TB04 DB #E7,#A1,#6F,#49,0
 TB05 DB #E1,#BC,#9C,#82,#6B,#57,#46,#38,#29,#1D,#12,#08,0
 ;
 TB13 DB #DD,#2A,0
 TB14 DB #D0,#67,#21,0
 TB15 DB #C9,#90,#62,#3C,#1C,0
 ;
 TB24 DB #80,0
 ;
 RECTINB LD A,(NBSEC) ;Juste une suite de comparaisons qui s'assure
 RECTINB1 LD B,A   ;du bon rapport entre nombre de secteurs et
;         ;taille du format . Ici la taille du GAP n'a pas
  LD A,(LENSEC) ;a etre prise en compte car la routine de formatage
  OR A      ;passe par CALIGAP (SOS3) .
  LD C,32
  JR Z,NBMAX ;L0
  DEC A
  LD C,19
  JR Z,NBMAX ;L1
  DEC A
  LD C,10
  JR Z,NBMAX ;L2
  DEC A
  LD C,5
  JR Z,NBMAX ;L3
  DEC A
  LD C,2
  JR Z,NBMAX ;L4
  LD C,1
 ;
 NBMAX   LD A,B   ;Trop de secteurs lus pour la taille . Ca arrive si
  DEC A    ;on ecrase des tailles 0 sous plusieurs tailles
  CP C     ;differentes NC si oui .
  RET
 LIST
 NBSPROV DB 0
 PERPROV DW 0
 LERPROV DS 40
 LISTIDS DS 40
 NOLIST
;

---------------------------

Vous venez de  vivre  le  pire  .  Toutes  les  informations  utiles sont  maintenant mémorisées . Il ne reste plus qu'à stocker , formater , reproduire  simple formalité que l'on trouvera  dans  la  section  REPRODUCTION . (Pas de  mauvaises pensées , ce type de reproduction n'a rien à voir avec BLOOD) .

SOS Programmeurs n°4

★ ANNÉE: ???
★ AUTEUR: MICHEL MAIGROT

Page précédente : Fdc - 22 - Analyse de la Piste
★ AMSTRAD CPC ★ DOWNLOAD ★

Dump disquette:
» SOS  Programmeurs  4    FRENCHDATE: 2003-03-28
DL: 1187
TYPE: ZIP
SiZE: 128Ko
NOTE: 40 Cyls
.HFE: Χ

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Fdc - 24 - Reproduction (SOS Programmeurs)
» Coding » Fdc - 22 - Analyse de la Piste (SOS Programmeurs)
» Coding » Fdc - 01 - Fonctionnement Fdc (SOS Programmeurs)
» Coding » Fdc - 13 - Edition du Buffer (SOS Programmeurs)
» Coding » Fdc - 25 - Formatage et Ecriture Piste (SOS Programmeurs)
» Coding » Fdc - 30 - Fdc Exemple de Bidouilles (SOS Programmeurs)
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.732-desktop/c
Page créée en 514 millisecondes et consultée 2086 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.