CODING ★ FDC: Analyse de la Piste ★

Fdc - 22 - Analyse de la Piste (SOS Programmeurs)

---------------------
— ETUDE DE LA PISTE -
---------------------

Nous présentons ici l'algorythme TRES simplififá des 3 sections suivantes

; R.A.Z DES VARIABLES
; !
MARQUER LA PRESENCE EVENTUELLE DE SECTEURS M.A.M OU CR/DD
; MEMORISER LA TAILLE DU PLUS GRAND SECTEUR OK
; MEMORISER LA TAILLE DU PLUS PETIT SECTEUR OK
; NOTER LA PRESENCE EVENTUELLE DE PLUSIEURS TAILLES OK
; !
; VOIR SI M.A.M EN TETE
; !
; +--------------< NON OUI >------+
; ! ; !
; ! ;UN SEUL SECTEUR ? <-+
; ! ; !
; ! +-----------< NON OUI >----------> PIFOMETRE ET FINI
; ! !
; ! +---> VOIR SI EXISTE UN CR/DD
; ! ; !
; +---!--------------< NON OUI >-------------+
; ! ! ; !
; ! +------> RECHERCHE PAR SOLUTION1 !
; ! ; REUSSIE ? ; !
; ! ; ! ; !
; ! +-------------< NON OUI >-------------!----+
; ! ! ; ! !
; ! +-> RECHERCHER TAILLE MAXI POSSIBLE <-+ !
; ! VOIR SI EXISTE UN CR/DD > LMAX ;!
; ! ; ! ; !
; ! +---------------< NON OUI >---------------+ !
; ! ! ; ! !
; ! ! VOIR SI CR/DD PROVOQUE OU ACCIDENTEL <-+ !
SOLUTION5 <--!--!--------< ACCIDENTEL / PROVOQUE >--+ !
POUR PISTE ! ! ; ! !
ABIMEE ! ! ;RECHERCHE PAR CR/DD <---+ !
ET FINI ! ! ;! ; !
; ! ! ;+--------------------+ !
; ! ! ;! !
; ! +-------> RECHERCHE PAR SOLUTION3 ! !
; ! ; REUSSI ? ; ! !
; ! ; ! ;! !
; ! +-------------< OUI NON >------+ ;! !
; ! ! ;! ;! !
; ! ! ;AUTRE RECHERCHE <--+ ;! !
; ! ! ; ! ;! !
; ! +------> NOTER SECTEURS ECRASES ! !
; ! TROUVER REMPLISSAGE SI POSSIBLE ! !
; ! ALLER ECRASER LES SECTEURS ET FINI ! !
; ! ;! !
; +----------> RECHERCHE PAR SOLUTION4 ! !
; PRESENCE ECRASES ? ;! !
; ! ;! !
ECRASER ET FINI <---------------< OUI NON >--------------+ ! !
^ ; ! ! !
! ; DETERMINER REMPLISSAGE SI POSSIBLE <-+-!-+
! ; TESTER PRESENCE ECRASES <--------+
! ; !
+------------------------< OUI NON >---------> FINI


-----------------------------------------------------------------------
— ANALYSE COMPLETE DES GAPS - LONGUEURS DE SECTEURS ET TYPE DE FORMAT -
-----------------------------------------------------------------------

Le gros , très gros morceau de ce trimestre . Tout le secret d'une copie efficace réside dans cette section ... Pas de baratin inutile , on entre derechef dans le vif du sujet avec la première section de cette série de routines .

— INFORMATION PISTE -

Quoique généralement efficace , le système présenté le trimestre dernier ne résout pas tous les cas de figure et il s'en faut ... La section INFORMATION PISTE recueille un maximum de données sur l'état global de la piste . En cas d'échec de la première recherche , l'étude de ces informations permettra de déterminer une réaction appropriée au cas rencontré .

En sortie de cette section on saura :
  1. Si il y-a des secteurs CR/DD sur la piste .
  2. La taille ID du plus grand de ces CR/DD s'il y-en a
  3. Si plusieurs tailles de secteurs EFFECTIVEMENT ECRITS sont présentes
  4. La taille du plus grand secteur EFFECTIVEMENT ECRIT
  5. La taille du plus petit secteur EFFECTIVEMENT ECRIT
  6. Si certains secteurs sont en MAM


La variable LMIN est un peu déroutante , elle doit en principe contenir la valeur de la plus petite longueur ID EFFECTIVEMENT écrite . Cette case mémoire ne sera pas initialisée et restera à #FF si :

  1. Tous les secteurs OK sont de longueur identique
  2. Aucun secteur n'est reconnu OK . (Dans ce cas LIDMAX reste à 0)

Cette petite complication permet de tester quelques points particuliers.

On commence par initialiser comme suit :

;
FINDLEN XOR A ;ON REMET TOUS LES PARAMETRES A 0
LD (GAPFORM),A ;GAP#3
LD (VALGAPF),A ;Longueur GAP#3
LD (FLGDIFID),A ;Marque si differents IDS OK (Secteurs ecrits)
LD (FLAGCRDD),A ;Marque si presence CR/DD
LD (FLAGMAM),A ;Marque presence secteur MAM
LD (FAUXGAP),A ;Eventuel faux GAP si ecrase
LD (FAUXLGF),A ;avec sa longueur
LD (LMAX),A ;Plus grande taille admissible par le format
LD (LIDMAX),A ;Taille du plus grand secteur ECRIT
DEC A ;Taille du plus petit secteur EFFECTIVEMENT
LD (LMIN),A ;ECRTI (a #FF pour ne pas ignorer le 0)
LD (LENCRDD),A ;Longueur du plus grand secteur en CR/DD
LD A,#E5 ;Octet fill fixe provisoirement
LD (OCREMP),A
LD A,(NBSEC) ;Copier nombre de secteurs trouves au cas ou
LD (NBSPROV),A ;mise en evidence de secteurs ecrases .
;

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

Ceci fait on balaie la liste des IDS longueur simultanément avec la liste des erreurs . HL contient l'ID LEN secteur , DE l'état d'erreur généré par la section ANALYSE . Dans les commentaires du listing , traduisez ID LEN OK par ID longueur d'un secteur vraiment écrit .

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

;
LD DE,LISTERR ;Chercher presence de CR/DD ou de MAM
LD HL,IDINDRA+3 ;Voir si les IDS LEN sont tous identiques
LD A,(NBSEC) ;memoriser le plus grand et le plus petit
LD B,A ;Comme d'habitude , le nombre de secteurs est dans B
;
SETFLAGS LD C,(HL) ;L'ID longueur secteur reste dans C jusqu'a la fin
LD A,(DE) ;Etat d'erreur
AND %00000011 ;MAM & DAM ?
JR Z,NOMAMDA ;NON , continuer
;
LD IY,FLAGMAM ;Oui marquer et sauter au suivant
INC (IY+0)
JR TESTOUT
;
NOMAMDA LD A,(DE) ;Reprendre etat d'erreur
AND %00100100 ;CR & DD
CP %00100100 ;IL nous faut VRAIMENT LES 2 ENSEMBLE !!
JR NZ,CRDDNOT ;NON continuer
;
LD IY,FLAGCRDD ;Mettre le plus grand CR/DD trouve dans le flag
;RES 7,(IY+0) ;Le bit 7 est mis pour eviter confusion avec
LD A,C ;un eventuel CR/DD de taille 0 . C contient toujours
CP (IY+0) ;LEN ID en cours . Si il est plus petit que celui
JR C,NOMEMOCR ;eventuellement stocke , il est inutile
;
LD (IY+0),A ;Sinon on stocke
NOMEMOCR SET 7,(IY+0) ;On remet le bit 7
JR TESTOUT ;Et on passe au suivant
;
CRDDNOT LD A,(DE)
AND %00110111 ;Ignorer EP HD CM . Si un seul des autres bits
JR NZ,TESTOUT ;est mis , le secteur n'est pas OK donc pas ecrit
;
LD A,C ;Chercher le plus grand ID LEN OK de la piste
LD IY,LIDMAX
CP (IY+0)
JR C,PLUPETI ;Pas plus grand voir si plus petit
;
LD (IY+0),A ;Memoriser l'ID OK le plus grand
JR TESTOUT
;
PLUPETI LD IY,LMIN
CP (IY+0)
JR NC,TESTOUT
;
LD (IY+0),A ;Memoriser le plus petit ID LEN OK
;
TESTOUT INC DE ;Avancer d'un etat d'erreur
INC HL ;Aller sur le prochain ID LEN
INC HL
INC HL
INC HL
DJNZ SETFLAGS ;Recommencer pour chaque secteur
;

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

A ce point , nous avons déjà l'essentiel de nos informations , reste une ambiguité : Si il n'y-à que des secteurs CR/DD ou secteurs non OKS , si les secteurs OK sont tous de taille identique , LMIN n'a pas été initialisé et reste à #FF . Ce fait ayant une signification précise pour ce qui suit , on le laisse à #FF et on considère provisoirement que si LMIN=#FF la taille de format minimum est de zéro .
Pour savoir si il y-a plusieurs tailles de secteurs OK déclarées sur la piste on soustrait LIDMAX de LMIN . La différence est stockée dans FLGDIFID . Si LMIN = #FF on estime possible la présence de taille 0 qui pourraient bien être en MAM ou CR/DD .

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

;
LD A,(LMIN)
CP #FF
JR NZ,LMINFIN
;
INC A ;Si LMIN reste a #FF aucun secteur n'est OK LMIN=0
;
LMINFIN LD B,A ;Ici FLGDIFID sera a 0 si pas d'ID OK <> sinon il
LD A,(LIDMAX) ;contiendra la difference de LMAX a LMIN
;SUB B
LD (FLGDIFID),A
;

Comme dit dans la section théorie de ce trimestre , la présence d'un MAM en 1er secteur interdit tout usage de lire piste ! C'est donc la première chose à tester . Si c'est le cas , on recherchera un éventuel CR/DD avec l'espoir d'y trouver le gap (SOLUTION2) . Si il n'y à qu'un seul secteur , on utilise le PIFOMETRE .

;
LD A,(LISTERR) ;Voir si MAM en 1er secteur
AND %00000011 ;Si oui , inanalisable par lire piste
CP %00000011
JR NZ,SOLUTION1 ;Si non sauter au 1er systeme d'analyse
;
CALL UNSEUL ;Met le carry si la piste n'a qu'un seul secteur
JP C,PIFOMETR ;fixer au pif ...
;
LD HL,TZMAM ;Traiter MAM en tete par recherche CRC
CALL PRT
JP SOLUTION2
;

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

Pour un bref instant nous retombons en 'terrae cognita' . Cette routine est celle du trimestre dernier à ceci près : Si la longueur du GAP excède #7E lire piste avec LENSEC+1 ignore la suite du GAP . Pour être tranquilles , on lit avec 7 comme indication D'ID LEN . La structure de la boucle à été modifiée pour permettre l'appel par 'CALL' des routines annexes . Comme dit dans la partie théorie , la réussite de ce test permet d'affirmer qu'il n'y a pas eu écrasement de secteurs et son échec affirme l'inverse et que tout est possible . Si le GAP renvoyé en cas de réussite n'est pas #4E on est quasiment certain qu'un FDC spécial a été utilisé . Cette version du programme se contente de signaler le fait . Si on trouve un GAP trop long , quelque chose ne va pas et on annonce l'échec de l'analyse par JECOINCE . On conclut en essayant de trouver l'octet de formatage (fill) dans un éventuel CR/DD .

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

;
SOLUTION1 LD HL,TFGAP ;Chercher vraie LS si possible
CALL PRT
LD HL,LITFDC2
CALL COMLIPI ;Initialiser commande lire piste
;
LD HL,128 ;On commence au plus petit possible
XOR A
CALL RANGLON ;HL dans LONGSEC , A dans QUATRID+3 et LENSEC
;
NEXTLON CALL INSTRU9 ;Lire Pis.
;
LD A,(ET1) ;MAM ?
;BIT 0,A ;Si oui , longueur pas trouvee
JR NZ,MAMFIND ;Continuer
;
LD HL,ET2 ;DD?
;BIT 5,(HL) ;Si pas DD longueur trouvee
JR NZ,MAMFIND ;Sinon continuer
;
CALL OKLONG ;Determiner valeur GAP
CALL FINDGAP ;Et longueur . NC en retour si pas bon
CALL NC,JECOINCE
;
CALL FINDREMP ;Chercher octet FILL
JP EXITGAP ;Fini
;
MAMFIND CALL INCLONG ;A=A+1 Dans QUATRID+3 et LS , HL=HL+HL dans LONGSEC
CP 6
JR NZ,NEXTLON ;Continuer tant que toute taille de 0 a 5 pas testees
;

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

Ici commencent les vrais problèmes ! Soit un MAM en 1er secteur nous y-a envoyé , soit la SOLUTION1 a lamentablement échoué . On est sur de rien et surtout pas de la taille de format ! En premier lieu on appelle MAXILEN . Cette routine calcule la taille de format (LEN ID) admissible en fonction du nombre de secteurs présents sur la piste . Cette nouvelle donnée nous permet de déterminer quelques points essentiels .

1 : Si un éventuel CR/DD est plus grand que MAXILEN . Dans ce cas on est sur d'y dénicher la vraie taille de format , le GAP et en prime l'octet de formatage .
2 : Si un éventuel CR/DD égale MAXILEN . On y-trouvera peut être les données précitées ou l'assurance qu'il s'agit d'une piste abimée .
3 : LENCRDD Contiendra la longueur du plus grand CR/DD de la piste .

Note : Le résultat de MAXILEN est rangé dans LMAX et dans C . Le registre C est préservé et sert de base pour tous les tests de la section .

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

;
SOLUTION2 CALL MAXILEN ;Retour avec plus grande taille ID possible dans C
;
;- LEN GAP 5 -
;
;- Recherche d'un CR/DD >= LMAX -
;
LD A,(FLAGCRDD) ;Si aucun CR/DD trouvé sur la piste , ca s'aggrave
;BIT 7,A ;passez un tour et rendez vous sur la case SOLUTION3
JP Z,SOLUTION3
;
AND %01111111 ;Eliminer bit 8 du flag CR/DD
LD (LENCRDD),A ;Stocker longueur du > CR/DD
;
CP C ;Comparer CR/DD avec LMAX ?
JR Z,TSTCRDD ;Si CR/DD = LMAX . Voir si IDS LEN differents
JR NC,POSICRDD ;Si CR/DD > LMAX , aller chercher le GAP
;
LD A,(LIDMAX) ;Ici le CR/DD est < que LMAX on regarde si le
CP C ;< ID LEN OK est aussi < que LMAX
JP NC,SOLUTION3 ;Non , rien a faire avec CR/DD
;
LD C,A ;OUI on reduit LMAX a la longueur de LIDMAX
LD A,(LENCRDD) ;Et on reteste si LEN CR/DD > = nouveau LMAX
CP C
JR Z,TSTCRDD ;Si LEN CR/DD = nouveau LMAX , encore un test
JP NC,SOLUTION3 ;Si LEN CR/DD > nouveau LMAX c'est bon et incurable
;par SOLUTION2 sinon
;

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

Arrivé ici on a la taille maximum du format donnée directement par MAXILEN ou celle prise dans LIDMAX . On à aussi la certitude d'un CR/DD égal à LMAX . Si en plus de ce CR/DD tous les IDS LEN OK sont de même taille , on a la certititude d'une piste régulière abimée . On signale le fait par un message et un bit dans FLAGFNC , on remet a zéro les flags concernant le CR/DD pour éviter toute confusion ultérieure et on saute en SOLUTION5 qui analyse ce genre de problème .
Si CR/DD = LMAX et que la piste n'est pas reconnue abimée , on utilise une partie de la routine de CR/DD pour le localiser et on saute à une annexe de la SOLUTION3 .

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

;
TSTCRDD LD A,(FLGDIFID) ;Si CR/DD = LEN et tous IDS LEN idem
OR A
JR Z,PISMORT
;
LD A,(LMIN) ;Si tous IDS identiques et <> 0 LMIN
CP #FF ;est reste a #FF
JR NZ,POSICRDD
;
PISMORT LD HL,TFOIREE
CALL PRT
XOR A ;Ignorer toute operation ulterieure sur CR/DD
LD (FLAGCRDD),A
DEC A
LD (LENCRDD),A
;
LD HL,FLAGFNC
SET 6,(HL)
JP SOLUTION5
;

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

Ici on cherche le GAP dans un CR/DD . On range LMAX dans son tiroir , on affiche le message correspondant , et on détermine la position physique du CR/DD voulu sur la piste .

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

;
POSICRDD LD A,C
LD (LMAX),A ;Ranger taille maxi possible
;
LD HL,TFGAP1A ;Message
CALL PRT
;
LD A,(NBSEC) ;Rechercher la position et l'ID du CR/DD > LMAX
LD B,A
LD IY,COUNT ;Compteur à zéro
LD (IY+0),0
;
LD DE,LISTERR ;Liste des états d'erreur
LD HL,IDINDRA+3 ;Longueur ID
;
VEUTCM LD A,(DE)
AND %00100100 ;Isoler CR/DD
CP %00100100 ;Tester si CR/DD il faut les 2 a la fois !
JR NZ,PACRDD ;Pas CR/DD
;
LD A,C ;C Contient toujours LMAX
CP (HL)
JR C,FINDCRDD ;On a trouve le CR/DD > que LMAX
JP Z,SOLUTIO3A ;Si le CR/DD=LMAX , ne pas y chercher le GAP !
;
PACRDD INC (IY+0) ;Compteur + 1
INC DE ;LISTERR+1
INC HL ;IDS LEN suivant
INC HL
INC HL
INC HL
DJNZ VEUTCM
;
;La boucle DJNZ ne va jamais jusqu'à B=0 donc ne sort jamais par ici

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

Maintenant que l'on est sur d'avoir un CR/DD plus grand que LMAX , sa lecture par LITFDC4 nous donnera tout ce qu'il faut savoir sur la taille de format , le GAP , etc ... LITFDC4 est une routine spéciale qui sera expliquée dans la section ROUTINES .

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

;
FINDCRDD DEC HL ;Repointer debut ID CR/DD
DEC HL
DEC HL
CALL TRANS3ID ;Et fixer parametres
;
LD HL,TFGAP1A ;Texte analyse CR/DD
CALL PRT
LD A,#46 ;Lit FDC4 donne l'octet de remplissage , le GAP
LD HL,LITFDC4 ;la longueur du GAP et la longueur reelle en
CALL SETCOM2 ;octets d'apres un CR/DD > que la normale
CALL VISINST ;Viser secteur et executer instruction
;
LD HL,FLAGFNC ;Secteur lu et stocke . Signaler octet formatage
SET 0,(HL) ;trouve
CALL FLENLON ;Convertir longueur en octets en taiile de 0 a 5
;
LD A,(VALGAPF)
CP #4E
CALL NZ,SETNOGAP ;GAP pas #4E simplement signaler .
JP EXITGAP ;C'est fini pour le cas CR/DD .
;

Nous venons d'en finir avec le type CR/DD . Les acharnés auront remarqué que l'éventuelle présence de secteurs écrasés avec des CR/DD n'est pas envisagée ! Le test se fait en EXIGAP (Beaucoup plus loin ...)

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

Voici maintenant le cas le plus épineux ou la taille réelle du format et des GAPS n'a pu être déterminée pour cause d'écrasement . On notera que le GAP est considéré comme normal (#4E) . Si un petit malin a bricolé une piste avec un FDC spécial ET un écrasement de secteurs , il est trop doué pour qu'on lui pique sa piste ...

On arrive en SOLUTIO3A si un CR/DD EGAL à LMAX a été detecté . Dans ce cas LMAX ne peut pas être égal au CR/DD . Comme d'autre part LMAX ne peut être augmenté , on ne peut que la diminuer de 1 et affiner un peu plus la recherche . Il faut quand même prévoir que la présence extrèmement rare d'un secteur LEN 0 abimé peur aussi renvoyer un CR/DD . Dans ce cas mieux vaut ne pas toucher à LMAX qui passerait à #FF !

En SOLUTION3 on teste LMIN . Si cette case à enregistré au passage une taille 0 OK , c'est forcément la vraie taille de format . Dans tout autre cas un secteur 0 renverait CR/DD ou MAM ! Dans le cas contraire , c'est la taille maximum calculée qui sert au test .

Pour réussir ce test , on utilise lire piste comme en SOLUTION1 mais comme le test sur ND échouera systématiquement en raison de la présence de différentes tailles écrites , on recherche un octet de valeur #4E à la position du GAP . Si on le trouve , on à déja une idée de la vraie taille de format employée . Si on ne le trouve pas , il reste possible que le secteur testé par lire piste (qui est le premier de la piste) , soit un secteur d'ecrasement PLUS GRAND que la taille maximum de format . On testera donc aussi ce cas . Si ceci échoue également , l'avertissement 'JECOINCE' sera activé , il ne reste plus qu'à prier pour que l'erreur se corrige d'elle même dans les routines qui suivent ...

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

;
SOLUTIO3A LD HL,TFGAP2A ;CR/DD=LMAX et plusieurs LENS OK
CALL PRT
;
LD A,(LMAX) ;Secteur 0 abime peut avoir CR/DD .
OR A ;Dans ce cas pas mettre #FF dans LMAX !!
JR Z,SOLUTION3
DEC C ;LMAX-1 si CR/DD = LMAX
;
SOLUTION3 LD A,(LMIN) ;Si trouve taille 0 OK c'est forcement la vraie !
OR A
JR Z,VRAITZER
;
LD A,C ;Plus grande taille utilisee par les IDS
VRAITZER LD (LMAX),A ;Ou taille maxi calculee si le > ID est > LMAX
;
; ;Echec analyse piste normale suvi de echec CR/DD
LD HL,TFGAP2 ;dans 99% des cas c'est une piste avec des secteurs
CALL PRT ;ecrases renvoyant un faux GAP on recherche donc un
; ;#4E pour avoir la taille du format avant ecrasement
LD A,(LISTERR) ;MAM en tete invalide lire piste
AND %00000011 ;Sauter en solution 4
CP %00000011
JP Z,SOLUTION4
;
LD HL,LITFDC2
CALL COMLIPI
LD IY,LMAX ;Limite de recherche a LMAX
;
XOR A ;Depart au minimum
LD HL,128
CALL RANGLON
;
NEXTLO1 LD A,#FF
LD (BUFGAPS),A
LD A,(QUATRID+3) ;Preserver parametre ID
PUSH AF
LD A,7 ;Lire piste sur LEN 7
LD (QUATRID+3),A
CALL INSTRU9
POP AF
LD (QUATRID+3),A ;Recuperer parametre ID
LD A,(BUFGAPS)
CP #4E ;Tester GAP
JR NZ,PASBON2
;
CALL FINDGAP ;Trouve octet #4E en position
JR C,FINAL ;Si longueur GAP OK c'est sans doute bon
;RES 2,(HL) ;Sinon c'est a revoir
;
PASBON2 LD A,(QUATRID+3) ;Voir si derniere longueur testee=LMAX+1
CP (IY+0)
JR Z,DURDUR ;Si oui probleme et tester sur longueur 1er secteur
;
CALL INCLONG
JR NEXTLO1
;
DURDUR LD A,(IDINDRA+3) ;Le 1er secteur ecrit est peut-etre plus grand
CALL ADDLON ;que la taille maxi possible , on renouvelle
LD A,7 ;l'operation sur cette base
LD (QUATRID+3),A
CALL INSTRU9 ;Retourner voir le GAP
LD A,(BUFGAPS)
CP #4E
CALL NZ,JECOINCE ;Rien a faire !
CALL FINDGAP
CALL NC,JECOINCE
;
LD A,(LMIN) ;On considere alors la plus petite taille
CP #FF ;possible comme la vraie
JR NZ,LMININI
INC A ;Si reste a #FF ce sera 0
LMININI PUSH AF
CALL ADDLON ;On parametre et on espere que ECRASER resoudra
POP AF ;le probleme .
CALL RANGLON
;

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

Ici on a trouvé a coup sur ou estimé la vraie taille du format . Si ce programme était moins astucieux , il aurait bêtement cherché le GAP avec un lire piste sur la taille maximum possible et se serait planté . Pour information , on effectue quand même cette opération afin de connaître la fausse taille et les valeurs trouvées par lire piste en lieu et place d'un GAP garanti sans colorant ! . Il est évident que dans le cas ou le programme est passé par DURDUR , ces valeurs se confondront avec les vraies valeurs .

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

;
FINAL LD A,(QUATRID+3) ;Preserver les vraies valeurs de format
PUSH AF
LD HL,(LONGSEC)
PUSH HL
LD A,(GAPFORM)
LD B,A
PUSH BC
;
CALL SETECRA ;Marquer et annoncer secteurs ecrases
;
LD A,(LIDMAX) ;Chercher valeurs du faux gap
LD (FAUXLEN),A
LD (QUATRID+3),A
CALL ADDLON
LD A,7
LD (QUATRID+3),A
;
NEXTLO CALL INSTRU9 ;Relire piste mais avec la fausse taille maxi
LD A,(BUFGAPS) ;des secteurs et stocker
LD (FAUXGAP),A
;
LD HL,SETBAD2 ;Ici c'est forcement un resultat faux , on
LD (SAUTBAD+1),HL ;annule une partie du test d'erreur
;
CALL FINDGAP2 ;Pour secteurs ecrits
;
LD HL,SETBADLEN ;Pour la restaurer aussitot .
LD (SAUTBAD+1),HL
;
LD A,(GAPFORM) ;Et on range les fausses valeurs
LD (FAUXLGF),A
;
POP BC ;Avant de recuperer les vraies
LD A,B
LD (GAPFORM),A
POP HL
LD (LONGSEC),HL
POP AF
LD (LENSEC),A
LD (QUATRID+3),A
LD A,#4E
LD (VALGAPF),A
CALL FINDREMP ;Chercher octet FILL
JP ECRASER ;Et aller au traitement des secteurs ecrases
;

SOLUTION4 est utilisée dans le cas ou un MAM en 1er secteur interdit toute opération sur lire piste . On considère provisoirement LMAX comme vraie longueur . Ensuite , si l'on détecte plusieurs LEN ID OK il est POSSIBLE que des secteurs aient été écrasés . Si de plus LIDMAX est supérieur à LMAX , cela devient CERTAIN . Après on met le GAP au maximum et CALIGAP le retaillera au maximum autorisé par LMAX . Si aucune possibilité d'écrasement n'a été detectée on arrête là . Dans le cas contraire , on met le GAP à l'ultime minimum et on passe à la routine d'écrasement .

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

;
SOLUTION4 LD HL,TGAPPIF
CALL PRT
;
LD A,(LMAX) ;Piste inanalisable par lire piste et pas de CR/DD
LD C,A
LD (LENSEC),A ;Aller plus simple en considerant la taille
CALL ADDLON ;maximum comme vraie taille de format
;
LD A,(FLGDIFID)
OR A
JR Z,NODIFID ;Voir si plusieurs IDS OK differents
;
LD HL,FLAGFNC
SET 5,(HL) ;Marquer plusieurs tailles format possibles
;
LD HL,TECRPOSS
CALL PRT
LD A,(LIDMAX) ;LIDMAX > LMAX
INC C
CP C
JR C,NODIFID
;
CALL SETECRA ;Ecrases certains .
;
NODIFID LD A,#FF ;Fixer GAP arbitrairement
LD (GAPFORM),A
CALL CALIGAP ;Par caligap
LD A,#4E
LD (VALGAPF),A
;
LD A,(FLAGFNC)
AND %00110000 ;Sur ou peut-etre ecrases ?
;SCF
JP Z,EXITGAP
;
LD A,3 ;GAP arbitraire pour ecrasement
LD (GAPFORM),A
JP ECRASER
;

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

SOLUTION5 Est uniquement dédiée au traitement des pistes considérées comme abimées . Dans ce cas les valeurs de GAP peuvent être fausses . On les notera pour information mais on utilisera une valeur arbitraire pour la reproduction .

;
SOLUTION5 LD A,C ;Tentative d'analyse sur piste VRAIMENT abimee
LD (LMAX),A
LD (LENSEC),A
CALL ADDLON
INC A
LD (QUATRID+3),A
LD HL,LITFDC2
CALL COMLIPI
;
CALL INSTRU9 ;Lire piste avec taille MAXI+1
LD A,(BUFGAPS) ;des secteurs
LD (FAUXGAP),A
CALL FINDGAP
LD A,(GAPFORM)
LD (FAUXLGF),A
LD (GAPFORM),A
LD A,#4E ;Vrai GAP SUPPOSE #4E
LD (VALGAPF),A
CALL CALIGAP
JP EXITGAP
;

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

Si on a qu'un seul secteur sur la piste et qu'il est en MAM , on fixe les valeurs au pifomètre .

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

;
PIFOMETR LD HL,TGAPPIF
CALL PRT
LD A,(QUATRID+3)
LD (LENSEC),A
LD A,#4E ;Un seul MAM taille 0 , fixer arbitrairement
LD (VALGAPF),A ;et fini
;SCF
RET
;

-----------------
— SOUS ROUTINES -
-----------------

;
JECOINCE LD HL,TCOINCE ;Analyse impossible !
CALL PRT
LD HL,FLAGFNC
SET 7,(HL)
LD A,(BUFGAPS)
LD (VALGAPF),A
LD A,#FF
LD (GAPFORM),A
RET
;
OKLONG LD A,4 ;Chercher le GAP par lire piste . Fonctionne
LD (RETENT),A ;comme dans la version précédente mais effectue
;
ENCOGAP LD A,(QUATRID+3) ;4 tentatives en cas d'echec car il arrive que
PUSH AF ;lire piste patine um peu ... La lecture se fait
LD A,7 ;sur une taille 7 . A part ca rien de neuf .
LD (QUATRID+3),A
CALL INSTRU9 ;Lire GAP
POP AF
LD (QUATRID+3),A
;
LD HL,BUFGAPS
LD A,(HL)
OKGAP1 LD (VALGAPF),A
CP #4E
RET Z
;
LD HL,RETENT ;Il arrive que lire piste patine ...
DEC (HL)
JR NZ,ENCOGAP
;
LD A,(FLAGDEN) ;GAP<>#4E . Peut etre en SD . Verifier
CP #FF
JP Z,SETNOGAP ;GAP<>#4E & SD
LD A,#4E ;Fixer arbitrairement
JR OKGAP1
;
FINDGAP CALL UNSEUL ;Si un seul secteur , GAP = #FF d'office
RET C ;1-2 = #FF et mise CARRY
;
LD HL,BUFGAPS+1 ;Compter la longueur du GAP dans le buffer
LD B,255 ;Fonctionne comme dans la version précédente
LD C,1 ;mais la possibilité d'un GAP 0 (256 octets)
BCLGAPS LD A,(HL) ;y-est maintenant prise en compte . En cas de
OR A ;longueur GAP trop grande , on effectue un second
JR Z,NEXTSYN ;test en FINDGAP2
CP #FF
JR Z,NEXTSYN
SUITGAP INC HL
INC C
DJNZ BCLGAPS
;
LD A,C ;Prise en compte d'un GAP de 256 octets
OR A
JR NZ,FINDGAP2 ;2 éme essai si échec
JR SETGAPL
;
NEXTSYN PUSH HL ;Test sur SYNC
INC HL
INC HL
INC HL
CP (HL)
POP HL
JR NZ,SUITGAP
;
SETGAPL1 LD A,C ;Longueur GAP trouvee
SETGAPL LD (GAPFORM),A
;SCF
RET
;

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

Si le secteur teste par lire piste à été écrit , la série d'octets prise dans BUFGAPS se présente différenment . Le test ne se fait plus sur la rencontre avec les octets 'SYNCHRO' qui ne sont plus lus par lire piste , mais sur le nombre de répétitions de l'octet qui suit l'octet de GAP #4E .

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

;
FINDGAP2 LD HL,BUFGAPS ;2eme tentative
INC HL ;Sauter l'octet à #4E
LD A,(HL)
LD C,1
;
CNTGAP CP (HL) ;Incrementer C tant que l'octet se repete
JR NZ,SETGAPL1
INC HL
INC C
JR NZ,CNTGAP
CP (HL) ;Tester GAP 256
SAUTBAD JP Z,SETBADLEN
JR SETGAPL1
;

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

Trouver l'octet de formatage dans un CR/DD (S'il y-en a un) . Rien de plus simple : On localise sa position dans la série d'IDS et on le lit comme un secteur normal . Le 1er octet lu est le bon .

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

;
FINDREMP LD A,(FLAGCRDD) ;Trouver octet remplissage dans eventuel CR/DD
AND %10000000
RET Z ;PAS DE CR/DD , Laisser tomber
;
LD HL,TFREMP
CALL PRT
;
LD HL,FLAGFNC
SET 0,(HL)
;
LD A,(NBSEC) ;Rechercher la position et l'ID du CR/DD
LD B,A
LD IY,COUNT
LD (IY+0),0
;
LD DE,LISTERR
LD HL,IDINDRA+3 ;Longueur ID
;
VEUTCM1 LD A,(DE)
AND %00100100 ;Isoler CR/DD
CP %00100100 ;Tester si CR/DD
JR Z,GOREMP ;Oui
;
INC (IY+0) ;Compteur + 1
INC DE ;LISTERR+1
INC HL ;IDS LEN suivant
INC HL
INC HL
INC HL
DJNZ VEUTCM1
;
;Ne devrait jamais sortir ici .
;
GOREMP DEC HL
DEC HL
DEC HL
CALL TRANS3ID
;
LD A,#46 ;Lit juste le 1er octet du secteur et le
LD HL,LITFDC3 ;range dans OCREMP
CALL SETCOM2
LD DE,1
LD HL,OCREMP
CALL VISINST ;Viser executer
;SCF
RET
;

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

Sortie de traitement normale ou CR/DD . On vérifie que LIDMAX n'est pas plus grand que LMAX . Si c'est le cas c'est fini sinon il y-a des secteurs écrasés et on doit les traiter .

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

;
EXITGAP LD A,(LIDMAX) ;Si > ID OK est > que taille format
LD B,A ;on a des ecrases a coup sur
LD A,(LENSEC)
CP B
JR NC,EXIG1
;
LD A,B
LD (FAUXLEN),A
CALL SETECRA
JP ECRASER
;
EXIG1 LD HL,IDINDRA ;Vraiment fini , recopier les IDS lus dans
LD DE,IDOUTDRA ;la zone des IDS a ecrire
LD BC,255
LDIR
;SCF
RET
;
RAZIDS LD B,255 ;Effacer la serie des IDS a lire
LD HL,IDINDRA
BCLRIDS LD (HL),#FF
INC HL
DJNZ BCLRIDS
RET
;
SETNOGAP LD HL,FLAGFNC ;Signaler GAP <> #4E
SET 1,(HL)
LD HL,TBADGAP
CALL PRT
RET
;
SETBADLEN LD HL,TGAPTL ;GAP trop long . Marquer l'erreur et fixer
CALL PRT ;provisoirement a #FF
LD HL,FLAGFNC
SET 2,(HL)
SETBAD2 LD A,#FF
LD (GAPFORM),A
XOR A
RET
;
SETECRA LD HL,FLAGFNC ;Marquer presence certaine de secteurs ecrases
SET 4,(HL)
LD HL,TSECECR
JP PRT
;
INCLONG LD HL,(LONGSEC) ;Incrementer d'une longueur de secteur
ADD HL,HL
LD A,(QUATRID+3)
INC A
;
RANGLON LD (LONGSEC),HL ;et ranger
LD (QUATRID+3),A
LD (LENSEC),A
RET
;
ADDLON LD HL,128 ;Calculer longueur en octets d'apres LEN format
ADDLON1 OR A
READD JR Z,ADDFIN
ADD HL,HL
DEC A
JR READD
ADDFIN LD (LONGSEC),HL
RET
;
FLENLON XOR A ;Calculer LEN ID d'apres
LD HL,128 ;longueur secteur donnee en octets
LD DE,(LONGSEC)
FVLEN PUSH HL
AND A
;SBC HL,DE
POP HL
JR Z,SETVLEN
INC A
ADD HL,HL
JR FVLEN
;
SETVLEN LD (LENSEC),A
RET
;
UNSEUL LD A,(NBSEC) ;Tester si un seul secteur sur la piste
DEC A
RET NZ ;CARRY non mis si plusieurs
DEC A
LD (GAPFORM),A ;Sinon longueur GAP=#FF et mise du CARRY
;SCF
RET
;

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

Ci-dessous la routine déterminant la taille maximum de secteurs en fonction de leur nombre . Le GAP est supposé au minimum de sa longueur , de toute manière il est recalculé par la suite en cas de problème .

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

;
MAXILEN LD HL,TFGAP1 ;Trouver la taille maxi possible d'apres
CALL PRT ;le nombre de secteurs
;
LD A,(NBSEC)
CP 20 ;Si nombre secteur plus grand que 20 la taille
LD C,0 ;est obligatoirement 0
RET NC
;
INC C
CP 11 ;Plus de 10 secteurs = taille 1
RET NC
;
INC C
CP 6 ;Plus de 5 secteurs ne peut etre taille 3
RET NC ;c'est donc 2
;
INC C
CP 3 ;Plus de 3 secteurs c'est taille 3
RET NC
;
INC C
CP 2 ;Plus de 1 secteur ne peut etre 5 donc c'est 4
RET NC
;
INC C ;Une taille 5 sinon rien !
RET
;
; — VARIABLES ET TEXTES -
;
RETENT DB 10
FAUXLEN DB 0
FAUXGAP DB 0
FAUXLGF DB 0
LMIN DB 0
LMAX DB 0
LIDMAX DB 0
LENCRDD DB 0
FLAGMAM DB 0
FLAGCRDD DB 0
FLGDIFID DB 0
;
TLITIDS DB 31,2,22,24," LECTURE DES IDS ",24,18,31,2,23,18,#80
TFGAP DB 31,2,22,24," RECHERCHE DU GAP ",24,#80
TBADGAP DB 31,21,23,24," GAP NON CONFORME ",24,#80
TGAPTL DB 31,40,23,24," GAP TROP GRAND ",24,#80
TCOINCE DB 31,59,23,24," JE COINCE !!!!!! ",24,#80
;
TZMAM DB 31,21,24,24," PREMIER EN MA/DA ",24,#80
TFGAP1 DB 31,40,24,24," RECHERCHE CR/DD ",24,#80
TFGAP1A DB 31,59,24,24," ANALYSE DU CR/DD ",24,#80
TFGAP2A DB 31,40,24,24," CR/DD = LEN MAXI ",24,#80
TFGAP2 DB 31,59,24,24," CR/DD PAS TROUVE ",24,#80
TFREMP DB 31,59,24,24," OCTET FIL.TROUVE ",24,#80
TFOIREE DB 31,59,24,24," PISTE ENDOMMAGEE ",24,#80
TGAPPIF DB 31,59,24,24," PIFOMETRE ACTIVE ",24,#80
TNOFORM DB 31,2,23
TNOFORMI DB " PAS DE FORMATAGE",#80
;
TSECECR DB 31,21,23,24," GAP REEL #4E MAIS SECTEURS ECRASES! ",24,#80
TECRPOSS DB 31,21,23,24," PRESENCE SECTEURS ECRASES POSSIBLE! ",24,#80
;

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

LE PENSUM N'EST PAS FINI ! LISEZ “ECRASEMENT SECTEURS” . C'EST UN ORDRE !!

SOS Programmeurs n°4

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

Page précédente : Fdc - 21 - Programme de Copie
★ 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 - 03 - Commandes du Fdc (SOS Programmeurs)
» Coding » Fdc - 13 - Edition du Buffer (SOS Programmeurs)
» Coding » Fdc - 21 - Programme de Copie (SOS Programmeurs)
» Coding » Fdc - 01 - Fonctionnement Fdc (SOS Programmeurs)
» Coding » Fdc - 08 - Test Interrupt (SOS Programmeurs)
» Coding » Fdc - 02 - Transmission 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.7-desktop
Page créée en 372 millisecondes et consultée 1748 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.