--------------------- — 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 :- Si il y-a des secteurs CR/DD sur la piste .
- La taille ID du plus grand de ces CR/DD s'il y-en a
- Si plusieurs tailles de secteurs EFFECTIVEMENT ECRITS sont présentes
- La taille du plus grand secteur EFFECTIVEMENT ECRIT
- La taille du plus petit secteur EFFECTIVEMENT ECRIT
- 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 :
- Tous les secteurs OK sont de longueur identique
- 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
★ AMSTRAD CPC ★ DOWNLOAD ★ |
|
CPCrulez[Content Management System] v8.7-desktop Page créée en 372 millisecondes et consultée 1748 foisL'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. |
|
|