CODING ★ FDC - REPRODUCTION ★

Fdc - 24 - Reproduction (SOS Programmeurs)

 Les sections précédentes ayant recueulli toutes les informations utiles , il est maintenant possible de lire et de stocker le contenu des secteurs accessibles .

 Si la piste n'est pas formatée , on se contentera de mémoriser le numéro et le flag d'état de la piste . Sinon , avant le stockage , on vérifiera que le nombre de secteurs et la taille du GAP calculés par les routines précédentes ne sont pas excessifs . Quoique très rare , cette éventualité peut survenir avec des pistes très spéciales .

 Il ne faut pas oublier qu'un passage par la routine ECRASER aura modifié le nombre des secteurs sur la piste . Dans ce cas , ces secteurs supplémentaires doivent être TOTALEMENT IGNORES car ils n'existeront que de manière éphémère lors du formatage de la copie !

;
;- Stocker une piste complete . Si buffer plein retour avec NC -
;
STOKPIST LD HL,TSTOKP ;Message stocke piste
  CALL PRT
  XOR A
  LD (FLAG),A  ;FLAG ne sert que pour positionner un texte
;
         ;-------------------
 Après cette brève initialisation , on commence par ranger les paramètres
généraux concernant la piste .
         ;-------------------
;
  LD HL,(POINPIS) ;Pointeur buffer debut piste
  LD A,(PISTSEL) ;Ranger piste et octet etat piste
  LD (HL),A   ;Numéro de piste
  INC HL
  LD A,(FLAGFNC) ;Flag des erreurs piste
  LD (HL),A   ;Ces deux donnees étant rangees , on stocke la
  INC HL    ;position du nouveau pointeur . Si la piste n'est
  LD (POINPIS),HL ;pas formatee ce sera tout .
;

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

 Ici on recrée un nouvel octet d'information sur l'etat de la piste que l'on range dans une liste séparée pour pouvoir le relire en fin de copie .

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

;
;- Composer etat piste -
;
  LD HL,(POINERP) ;Mettre le numéro de piste dans la serie
  LD A,(PISTSEL) ;des erreurs pistes
  LD (HL),A   ;Piste
  INC HL
  LD (HL),0   ;RAZ au passage
;
  LD A,(FLAGFNC)
  ;BIT 3,A   ;Formatee ?
  JR Z,PF   ;OUI
;
  INC A    ;Voir si FNC = #FF si oui piste a ne pas traiter
  JR NZ,TRAITE ;(Inutilise dans cette version du programme)
  LD (HL),#FF
;
TRAITE SET 7,(HL)   ;La piste n'est pas formatee , on laisse tomber
  INC HL
  LD (POINERP),HL
  XOR A
  RET    ;Fini . Rien n'a ete stocke
;
;- Piste formatee a traiter . Continuer -
;
PF   CALL RECTINB ;Tester si le nombre de secteurs donnes est admissible
  JR C,OKNBSEC ;CARRY si OK NC si non et C contient NBSEC MAXI . Dans
;       ;99% des cas c'est toujours OK grace au routines
  SET 6,(HL) ;precedentes .
  LD A,C   ;Rectifier NBSEC pour ne pas planter le programme mais
  LD (NBSEC),A ;la copie sera ratee
;
OKNBSEC LD A,(GAPFORM) ;Voir si la longueur du GAP est admissible pour
  LD B,A    ;le format
  PUSH BC   ;Preserver GAP#3 trouve
  PUSH HL   ;Preserver pointeur etat piste
  CALL CALIGAP
  CALL SETGRW  ;Refaire GAP RW au cas ou GAP#3 aurait ete change
  POP HL
  POP BC
;
  LD A,(GAPFORM) ;GAP#3 a change ?
  CP B
  JR Z,PARECTIF ;NON
;
  SET 3,(HL)   ;Signaler que la taille du GAP a ete rectifiee
;

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

 Les paramètres du format testés , on recopie les indications utiles de FLAGFNC dans notre octet d'état piste . L'opération RLCA met le CARRY chaque fois que le bit le plus à gauche de l'octet est à 1 .

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

;
PARECTIF LD A,(FLAGFNC) ;Recopier les indications utiles de FLAGFNC
  ;RLCA    ;dans la liste de erreurs possibles
  JR NC,PARATE
  SET 4,(HL)   ;Analyse ratee . Personnellement ca m'etonnerait
PARATE RLCA    ;mais va savoir ...
  JR NC,PASREPA
  SET 0,(HL)   ;Piste reparee plus ou moins bien
PASREPA RLCA
  JR NC,PASMULT
  SET 1,(HL)   ;Plusieurs tailles de format possibles (ecrases)
PASMULT RLCA    ;(Ambiguite assez rare .)
  JR NC,PAEC
  SET 2,(HL)   ;Presence certaine de secteurs ecrases
PAEC RLCA
  ;RLCA    ;Les 2 bits suivants sont inutiles
  ;RLCA
  JR NC,CONF
  SET 5,(HL)   ;GAP non conforme (Ca c'est mortel pour la copie)
CONF INC HL    ;C'est fini
  LD (POINERP),HL ;On range notre nouveau pointeur de liste .
;

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

 Tout est maintenant vérifié et les causes possibles d'une erreur de copie sont notées et rangées . On commence le stockage proprement dit . La structure du stockage a été décrite précédement .

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

;
;- Memoriser les donnees pistes dans le buffer -
;
  LD HL,(POINPIS) ;Reprendre le pointeur buffer .
  LD DE,(LONGSEC) ;Stocker longueur de secteur en octets
  LD (HL),E
  INC HL
  LD (HL),D
  INC HL
;
PAFLEN EX DE,HL   ;Copier LENSEC - NBSEC - GAPFORM - OCREMP
  LD HL,LENSEC ;Le pointeur passe de HL dans DE pour les LDIR
  LD BC,4
  LDIR
;
  LD A,(NBSEC) ;Copier les IDS
  LD C,A
  LD B,0
  PUSH BC   ;Preserver nombre secteurs dans BC pour LDIR
  ;SLA C    ;C = C*4 puisqu'on a 4 IDS par secteur
  ;SLA C
  LD HL,IDINDRA ;On en profite pour initialiser le pointeur
  LD (POINTID),HL ;des IDS pour le stockage des donnees
  LDIR
  POP BC
;
  LD (STOKERR),DE ;La liste des etats d'erreur est stockee a la
  PUSH BC   ;suite des IDS
  LD HL,LISTERR
  LDIR
  POP BC    ;BC contient toujours le nombre de secteurs
;
  EX DE,HL ;Le pointeur des adresses buffer est remis dans HL
  PUSH HL  ;et recopie dans IX
  POP IX
  ADD HL,BC ;Faire place pour adresses buffer
  ADD HL,BC ;2 fois car 2 octets par adresse
  INC HL   ;Et encore 2 pour memo deépart prochaine piste
  INC HL
  LD (ADBUFF),HL ;C'est a partir de ADBUFF qu'on stocke
;

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

 Tout ce qui concerne la piste est ici stocké à l'exception des données .
Bref rappel de la signification des pointeurs .

 POINPIS : Pointeur global ou devra reprendre le stockage suivant .
 POINTID : 1er octet des 4 IDS du secteur à stocker .
 STOKERR : Pointeur de la liste des erreurs .
 ADBUFF : Adresse de départ pour le stockage d'un secteur
 IX contient le début de la zone ou l'on mémorise les adresses de départ des données de chaque secteurs .

 Dans le cas d'une piste abimée , plusieurs tentatives de relecture
peuvent parfois sauver les meubles ... RELIRE sera utile .

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

;
;- Routine lecture physique -
;
  LD IY,RELIRE ;Nombre de relectures si secteur VRAIMENT abime
  XOR A
  LD (COUNT),A ;Compteur a zero pour viser les secteurs
  LD A,(NBSEC)
  LD B,A
;
BCLLITP LD (IY+0),5  ;5 Relectures en cas de probleme
;
  LD HL,(ADBUFF) ;Adresse de stockage du secteur
  PUSH BC
  LD (IX+0),L  ;Memoriser deépart des donnees du secteur en cours
  LD (IX+1),H  ;dans la liste
;
  CALL #BB78   ;Memoriser position curseur texte
  PUSH HL
;
  LD HL,(POINTID) ;1er octet des 4 IDS a lire
  PUSH HL
;
  CALL TRANS3ID ;Les mettre dans la zone qui sert aux instructions
  INC HL    ;de lecture sauf la piste .
  LD (POINTID),HL ;Ranger noveau pointeur
;
  LD HL,#1916 ;Afficher secteur en cours de lecture
  CALL #BB75  ;A la position voulue
  POP HL   ;Reprendre les IDS en cours
  CALL AFF4ID ;et les afficher
  POP HL   ;Reprendre la position du curseur texte
  CALL #BB75  ;et le remettre a sa place
;

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

 Ci dessous on étudie d'après FLAGFNC la nécéssité de lire et stocker le secteur . On n'effectuera pas le stockage dans les cas suivants :

 CR/DD . Qui est toujours un secteur vierge .
 MAM/DAM . Secteur sinistré volontairement ou non .
 SECTEUR DE TAIILE 0 . toujours illisible et de toute manière ne peut être écrit convenablement .
 SECTEUR A ECRASER . Qui est un faux secteur créé par ECRASER et destiné à disparaître lors de la réécriture de la piste . Dans ce cas , on ne doit surtout pas avancer COUNT car ce secteur n'existera qu'après le formatage !

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

;
  LD A,(FLAGFNC)
  AND %01000000 ;Si piste sinistree , tenter reparation et essayer
  JR NZ,LIRE  ;de lire quelque soit l'état d'erreur .
;
  LD HL,(STOKERR) ;Pointeur de la liste des erreurs . Peut avoir
  LD A,(HL)   ;pris la valeur #7F si le secteur est un additif
  CP #7F    ;cree par ECRASER . Ignorer totalement si oui ET
  JP Z,SAUTLIT ;NE PAS INCREMENTER LE COMPTEUR .
;
  AND %00110111 ;Si pas d'erreur PROVOQUEE sauf EP-HD-CM , c'est bon
  JP NZ,RIENLIRE ;Sinon ne pas stocker les donnees et INC. COMPTEUR
;
LIRE LD A,(QUATRID+3) ;Taille 0 ignoree en lecture , juste avancer
  OR A    ;compteur
  JP Z,RIENLIRE
;

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

 A ce point , on sait que le secteur peut être lu et stocké . On teste la présence du CM et on y va . Si une erreur de lecture se produit 5 fois de suite , on considère que c'est une cause perdue et l'erreur est affichée .

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

;
  LD B,#46   ;CM or not CM ?
  LD HL,(STOKERR)
  LD A,(HL)
  AND %00001000
  JR Z,CMNOT
  LD B,#4C   ;OUI
;
CMNOT LD A,B    ;Commande lire secteur
  LD HL,LITFDC
  CALL SETCOM2
;
NEWLIT LD DE,(LONGSEC)
  CALL VISINST ;Viser et executer commande lecture
;
  LD DE,#0213  ;Locate pour erreur drive
  CALL TSTMISS ;Voir si erreur drive . NC si oui
  JR NC,NEWLIT ;Boucler tant que FDC pas content .
;
  PUSH IY   ;IY est modifie par TSTERRS
  CALL TSTERRS ;Plus d'erreur drive , tester autres erreurs
  POP IY
  LD A,(FLAGERR)
  AND %00110111 ;Si pas d'erreur sauf EP-HD-CM , c'est bon
  JR Z,CESTLU
;
  DEC (IY+0)   ;Si erreur . 5 essais de lecture pour secteur
  JR NZ,NEWLIT ;VRAIMENT endommage .
;
  LD A,(FLAG)  ;Pas afficher le texte ERREUR plusieurs fois
  OR A
  JR NZ,PRSECER
;
  LD HL,TLECTER ;Texte erreur lecture
  CALL PRT
  LD A,#FF
  LD (FLAG),A
;
PRSECER LD A,"&"   ;Afficher le numéro de secteur en erreur
  CALL #BB5A
  LD A,(QUATRID+2)
  CALL PRTHEX1
;
  LD HL,(STOKERR) ;Erreur imprevue apparue , modifier la liste des
  LD A,(FLAGERR) ;erreurs en consequence .
  LD (HL),A
;

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

 Avec ou sans erreur , le secteur à été lu et stocké . La routine de lecture renvoyant le nombre d'octets REELLEMENT LUS dans NBLUS , il suffit d'ajouter cette valeur à ADBUFF pour avoir la prochaine adresse de stockage des données . Dans le cas ou le secteur est vierge , c'est le même octet qui se répète . Inutile alors d'encombrer le buffer , seul un octet est stocké et on utilise encore la liste des états d'erreur pour signaler la chose .

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

;
CESTLU LD HL,(ADBUFF) ;Adresse buffer
  LD BC,(NBLUS) ;Nombre octets lus -1
  DEC BC
;
  LD A,(HL)   ;Voir si tous les octets du secteur sont identiques
BCLIDEM CP (HL)   ;Si oui on stocke sous forme compresse
  JR NZ,NONMEME ;Si non on saute
  INC HL
  DEC BC
  ;BIT 7,B   ;Si mise a 1 du BIT 7 , BC vient de passer a 0
  JR Z,BCLIDEM
;
  LD HL,(STOKERR) ;Tous les octets sont identiques . On utilise
  LD A,(HL)   ;le pointeur d'erreurs pour signaler ce fait
  AND %00001000 ;et on ne stocke qu'un octet .
  XOR #FF   ;NOTER Q'XOR #FF CONSERVE LE BIT CM
  LD (HL),A
  LD HL,(ADBUFF)
  INC HL
  JR SUITLIRE
;
NONMEME LD HL,(ADBUFF) ;Sinon adresse buffer = adresse buffer + nombre lus
  LD DE,(NBLUS)
  ADD HL,DE
;
SUITLIRE LD (ADBUFF),HL ;= Nouvelle adresse stockage pour prochain secteur
;
RIENLIRE LD HL,COUNT ;Au suivant
  INC (HL)
;
SAUTLIT LD HL,(STOKERR) ;Etat d'erreur suivant
  INC HL
  LD (STOKERR),HL
  INC IX    ;Zone memmo adresse donnees suivante
  INC IX
  POP BC    ;Nombre secteurs restant a lire
  DEC B    ;-1
  JP NZ,BCLLITP ;S'il en reste
;

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

 Le stockage de la piste est terminé , on met à jour les pointeurs et
c'est fini .

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

;
  LD HL,(ADBUFF)
  LD (POINPIS),HL ;Adresse debut stockage prochaine piste
  LD (IX+0),L  ;Memoriser deépart des donnees prochaine piste
  LD (IX+1),H
  XOR A
  LD (FLAG),A
  ;SCF
  RET
;
TSTOKP DB 31,2,21,24," STOCKAGE PISTE ",24
TSTOSEC DB 31,2,22,24," STOCKAGE SECTEUR ",24,#80
TLECTER DB 31,2,24,18,24," ERREUR LECTURE SUR SECTEUR : ",24," ",7,#80
RELIRE DB 0
POINTID DW 0
STOKERR DW 0
FLAG DB 0
;

SOS Programmeurs n°4

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

Page précédente : FDC - 23 - Etude 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 - 30 - Fdc Exemple de Bidouilles (SOS Programmeurs)
» Coding » Fdc - 10 - Affichages Causes d'Interruptions Secondaires du Fdc (SOS Programmeurs)
» Coding » Fdc - 13 - Edition du Buffer (SOS Programmeurs)
» Coding » Fdc - 06 - Entree Programme (SOS Programmeurs)
» Coding » FDC - 26 - Sub Routines Pour le FDC (SOS Programmeurs)
» Coding » Fdc - 03 - Commandes du Fdc (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 956 millisecondes et consultée 2012 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.