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: 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 - 13 - Edition du Buffer (SOS Programmeurs)
» Coding » Fdc - 23 - Ecraser les Secteurs (SOS Programmeurs)
» Coding » Fdc - 04 - Test Drive (SOS Programmeurs)
» Coding » Fdc - 06 - Entree Programme (SOS Programmeurs)
» Coding » Fdc - 07 - Routines Annexe (SOS Programmeurs)
» Coding » FDC - 23 - Etude de la Piste (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 269 millisecondes et consultée 1597 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.