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: 1161
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 - 03 - Commandes du Fdc (SOS Programmeurs)
» Coding » Fdc - 06 - Entree Programme (SOS Programmeurs)
» Coding » Fdc - 22 - Analyse de la Piste (SOS Programmeurs)
» Coding » Fdc - 05 - Deplacement Tete (SOS Programmeurs)
» Coding » Fdc - 01 - Fonctionnement Fdc (SOS Programmeurs)
» Coding » Fdc - 12 - la Routine d'Ecriture de Secteurs (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 187 millisecondes et consultée 2006 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.