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-etre 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 meme 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: 949
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 - 07 - Routines Annexe (SOS Programmeurs)
» Coding » Fdc - 22 - Analyse de la Piste (SOS Programmeurs)
» Coding » FDC - 23 - Etude de la Piste (SOS Programmeurs)
» Coding » Fdc - 21 - Programme de Copie (SOS Programmeurs)
» Coding » Fdc - 08 - Test Interrupt (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.7-desktop/c
Page créée en 189 millisecondes et consultée 1568 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.