CODING ★ FDC - ANALYSE DE LA PISTE ★

FDC - 23 - Etude de la Piste (SOS Programmeurs)

Cette section n'a subi que peu de modifications fondamentales par rapport à la version précédente . Les quelques changements apportés sont les suivants :

Le test de piste formatée ou non à été déplacé en LITIDS .
L'ordre des opérations à changé ! On recueille D'ABORD l'état d'erreur des secteurs avant de calculer la taille de format et du GAP .

La routine VISESEC devient VISINST . Elle est plus rapide que la précédente , pointe le secteur demandé et éxécute l'instruction .

L'ensemble forunit plus d'informations que la précédente selon l'état des flags renvoyés par le calcul des GAPS .

Le fenétrage et l'impression ont été adaptés aux besoins de ce nouveau programme .

Pour le reste , reportez vous au numéro précédent de SOS PROGRAMMEURS si vous n'avez pas tout compris . Le listing est ici fort peu commenté , la face FDC ne fait que 178K !

Voici la signification des bits de FLAGFNC :

Bit 0 : L'octet de formatage à été trouvé dans un CR/DD
Bit 1 : Le GAP#3 est différent de #4E
Bit 2 : Le GAP est trop long . (Ne devrait plus se produire)
Bit 3 : La piste n'est pas formatée
Bit 4 : Présence CERTAINE de secteurs écrasés sur la piste
Bit 5 : Présence POSSIBLE de secteurs écrasés sur la piste
Bit 6 : Piste normale abimée
Bit 7 : L'analyseur s'est planté ! (Ne devrait tpas arriver)


ALGORHYTME GENERAL DE L'ANALYSE

Note : Ce schéma inclut les 3 sections suivantes annotées (P.S.)

; LIRE LES IDS
; Y-A T-IL DES IDS SUR LA PISTE ?
; !
+-------------------------< OUI NON >-------------------------+
! ; !
+-----> LIRE LES SECTEURS ET TESTER LEUR ETAT D'ERREUR !
; AFFICHER LES SECTEURS ; !
; ! ;!
DETERMINER LES GAPS ET LE FORMAT EXACT DE LA PISTE (P.S.) !
; Y-A T-IL DES SECTEURS ECRASES ? (P.S.) ; !
; ! ;!
+-------------------------< OUI NON >-----------+ ;!
! ; ! NOTER NON FORMATEE
+---------------> RECALCULER LE FORMAT (P.S) ! ;!
; ! ; ! ;!
; AFFICHER LES DONNEES PISTE <--+-------------+
; IMPRIMER S'IL Y-A LIEU ET FINI
;-----------------------
;- ANALYSE DE LA PISTE -
;-----------------------
;
ANAPIST XOR A
LD (FLAGFNC),A ;Remise a zero du flag analyse piste
;
LD A,#17 ;Effacer écran et ouvrir fenetres IDS
CALL EFFLINE
CALL FENIDE
CALL FENIDE1A
CALL FENIDL
CALL FENIDL1A
CALL FENRES
CALL FENSCR
;
CALL VERIID ;Aller lire les IDS
JR C,PISTFORM ;Si NC la piste n'est pas formatee
;
CALL FENSCR ;Pas formatee
LD HL,TNOFORM ;Afficher
CALL PRTINV1 ;En inverse
LD A,(FLAGFNC) ;Memoriser
;
SET 3,A
LD (FLAGFNC),A ;Mettre le bit pas de format
;
LD A,(FLAGIMP) ;Impression en cours ?
OR A
RET Z ;Non
;
CALL SETIMP ;Oui
CALL IMPPIST ;Imprimer numéro de piste
LD HL,TPAFORM ;Et pas formatee
CALL PRT
CALL ASTERIQUE ;Affiche un '*' et reset de l'impression
XOR A
RET
;
TPAFORM DB " NON FORMATEE",#80
;
PISTFORM CALL FENSCR ;Restaurer plein écran
LD HL,TLITSECT ;Texte lit secteurs
CALL PRTINV ;Afficher en inverse
;
LD A,(NBSEC) ;Parametrer boucle analyse
LD B,A
XOR A
LD (COUNT),A
LD HL,LITFDC1 ;Lire sans stocker les données
;
LD A,#46 ;Commande lire secteurs
CALL SETCOM2
;
LD HL,LISTERR ;Pointer le debut de la liste des erreurs
LD (POINTER),HL
LD HL,IDINDRA ;Et le début de la zone des IDS
;
;--------------------
;- BOUCLE D'ANALYSE -
;--------------------
;
NEXTVER CALL TRANS3ID ;Ignorer ID piste et recopier les autres
INC HL
CALL FIXLFF ;0 ou #FF selon taille secteur comme dernier
PUSH HL ;paramètres des octets a envoyer au FDC
PUSH BC
CALL VISINST ;Viser et executer commande
CALL TSTERRS ;Recuperer etats d'erreur
LD A,(IY+0) ;Ranger et au suivant
LD HL,(POINTER)
LD (HL),A
INC HL
LD (POINTER),HL
POP BC
POP HL
DJNZ NEXTVER
;
;---------------------
;- AFFICHAGE ANALYSE -
;---------------------
;
LD HL,IDINDRA ;Afficher IDS
CALL IDS4AFF ;BC est preserve
;
LD HL,LISTERR ;Et erreurs
LD (POINTER),HL
;
CALL FENIDE1A ;COMME DANS PRECEDENTE VERSION
BCLERRS PUSH HL
PUSH BC
CALL INV
CALL SPACE
LD A,(HL)
CALL PRT3ER2
CALL INV
POP BC
CALL TSTC1
CALL NZ,CR
CALL Z,FENIDL1A
LD HL,COUNT
INC (HL)
POP HL
INC HL
DJNZ BCLERRS
;
CALL FENSCR
;
CALL FINDLEN ;Chercher GAPS (Ca c'est le gros morceau a digerer)
;
CALL FIXPARA ;Initialiser parametres
;
;
;---------------------------------
;- AFFICHAGE DU RESULTAT GENERAL -
;---------------------------------
;
CALL FENRES1 ;Afficher
;
LD HL,TNBSEC ;Nombre secteurs
CALL PRT
LD A,(NBSEC)
CALL PRTDECIA
;
LD HL,TLEN ;Taille
CALL PRT
LD A,(LENSEC)
CALL PRTHEX1
;
LD HL,TLONG ;Octets
CALL PRT
LD HL,(LONGSEC)
LD (VALEUR),HL
CALL CINQNB
CALL PRTDECI
CALL DEUXNB
;
LD HL,TGAPF ;GAP
CALL PRT
LD A,(VALGAPF)
CALL PRTHEX1
;
LD HL,TLGAPF
CALL PRT
LD A,(GAPFORM)
CALL PRTHEX1
;
LD HL,TOCREMP ;Octet format
CALL PRT
LD A,(OCREMP)
CALL PRTHEX1
;
LD A,(FLAGFNC)
AND %01010000 ;Secteurs ecrases ou piste endommagee ?
JR Z,NOFAUX ;NON !
;
LD HL,TFAUGAP ;Afficher le faux GAP
CALL PRT
LD A,(FAUXGAP)
CALL PRTHEX1
;
LD HL,TLFAUGA ;Et sa longueur
CALL PRT
LD A,(FAUXLGF)
CALL PRTHEX1
;
LD HL,TFAULEN ;Et la fausse taille de format
CALL PRT
LD A,(FAUXLEN)
CALL PRTDECIA
;
NOFAUX LD A,(FLAGFNC) ;Secteurs ecrases possibles ?
AND %00100000
JR Z,PASDIF ;NON
;
LD HL,TDIFLEN
CALL PRT
LD A,(LMIN) ;Afficher plus petite longueur possible
CALL PRTDECIA
LD A,"a"
CALL #BB5A
CALL SPACE
LD A,(LMAX) ;Et plus grande longueur possible
LD (FAUXLEN),A
CALL PRTDECIA
;
PASDIF CALL FENSCR ;Plein écran
;
LD A,(FLAGIMP) ;Imprimer ?
OR A
JR NZ,IMPANAL ;Oui !
;SCF
RET
;
;------------------------------------------------
;- IMPRESSION DE L'ANALYSE SI LE FLAG A ETE MIS -
;------------------------------------------------
;
IMPANAL CALL SETIMP ;Imprimer
CALL DEUXNB
CALL IMPPIST ;Piste
;
LD HL,NBSECI ;Comme version precedente
CALL PRT
LD A,(NBSEC)
CALL PRTDECIA
CALL CR
LD HL,IDINDRA ;IDS
LD DE,LISTERR
LD A,(NBSEC)
LD B,A
LD C,4
NEXTIMP DEC C
CALL Z,CRIMP1
PUSH BC
WAITIMP CALL #BD2E ;Attendre un peu pour ne pas perdre des caracteres
JR C,WAITIMP
CALL AFF4ID
POP BC
LD A,(DE)
INC DE
PUSH HL
PUSH DE
PUSH BC
LD (FLAGERR),A
CALL PRT3ERR
LD HL,TSEPIMP
CALL PRT
POP BC
POP DE
POP HL
DJNZ NEXTIMP
CALL CR
;
WAITIM1 CALL #BD2E
JR C,WAITIM1
LD HL,TLENSI
CALL PRT
LD A,(LENSEC)
CALL PRTHEX1
LD HL,TGAPI
CALL PRT
LD A,(VALGAPF)
CALL PRTHEX1
LD HL,TLGAPI
CALL PRT
LD A,(GAPFORM)
CALL PRTHEX1
LD HL,TOCFORI
CALL PRT
LD A,(OCREMP)
CALL PRTHEX1
CALL ASTERIQUE
;SCF
RET
;
IMPPIST LD HL,TPIST ;Sub routine imprimer piste
CALL PRT
LD A,(PISTSEL)
CALL PRTDECIA
;
LD A,(FLAGFNC) ;Imprimer s'il y-a lieu les faux GAPS ou
AND %01010000 ;fausses longueurs
JR Z,PASF1
;
LD HL,TFAUGAI
CALL PRT
LD A,(FAUXGAP)
CALL PRTHEX1
;
LD HL,TLFAUGI
CALL PRT
LD A,(FAUXLGF)
JP PRTHEX1
;
PASF1 LD A,(FLAGFNC)
AND %00100000
RET Z
;
LD HL,TDIFLEI
CALL PRT
LD A,(LMIN)
CALL PRTDECIA
;
WAITA LD A,"a"
CALL #BD2B
JR NC,WAITA
;
CALL SPACE
LD A,(LMAX)
JP PRTDECIA
;
ASTERIQUE CALL CR ;Imprimer l'asterique final et reinitialiser le mode
;WAITAST ;programme normal
LD A,"*"
CALL #BD2B
JR NC,WAITAST
CALL CR
JP RESIMP
CRIMP1 LD C,3
JP CR
;
TPIST DB "Piste: ",#80 ;TEXTES IMPRIMANTE
TLENSI DB "Taille reelle : &",#80
TGAPI DB "GAP-F &",#80
TLGAPI DB "Longueur GAP : &",#80
TOCFORI DB "Octet formatage : &",#80
NBSECI DB "Nombre de secteurs : ",#80
TSEPIMP DB " > ",#80
;
SETIMP LD HL,#BD2B ;REMPLACER LES #BB5A DU PROGRAMME PAR UN VECTEUR
LD A,#C9 ;IMPRIMANTE
JR INIMP
;
RESIMP LD HL,#BB5A ;FAIRE LE CONTRAIRE
XOR A
INIMP LD (CR1+1),HL
LD (PRT2+1),HL
LD (OKHEX+1),HL
LD (IMPERR1+1),HL
LD (CARRY+1),HL
LD (PRTA+1),HL
LD (RETIMP),A
RET
;
TRANS3ID INC HL ;Comme version precedente
LD A,(HL)
LD (QUATRID+1),A
INC HL
LD A,(HL)
LD (QUATRID+2),A
LD (DERSEC),A
INC HL
LD A,(HL)
LD (QUATRID+3),A
RET
;
FIXPARA CALL ID4TRANS ;Comme version precedente
LD A,(LENSEC)
LD (QUATRID+3),A
LD DE,-4
ADD HL,DE
LD HL,QUATRID+2
LD A,(HL)
LD (PREMSEC),A
INC HL
LD A,(NBSEC)
LD HL,IDINDRA
LD DE,4
DEC A
PTDERSEC ADD HL,DE
DEC A
JR NZ,PTDERSEC
INC HL
INC HL
LD A,(HL)
LD (DERSEC),A
LD A,(GAPFORM)
;SRL A
JR NZ,OKGAPRW
LD A,1
OKGAPRW LD (GAPRW),A
;SCF
RET
FIXLFF LD A,(QUATRID+3)
OR A
JR Z,NOTZERX
LD A,#FF
NOTZERX LD (LSZERO),A
RET
;
VISINST PUSH HL ;Ca c'est VISESEC modifie le principe est le meme
CALL TSTDIDC ;mais c'est un peu plus rapide . On Vise aussi le
POP HL ;premier secteur , dans certains cas c'est
;
LD A,(COUNT) ;indispensable
OR A
JP Z,INSTRU9
;
PUSH BC
LD B,A
POINSEC CALL INSTRU2
CALL RESULT
DJNZ POINSEC
POP BC
;
JP INSTRU9
;
;- Afficher les erreurs a l'analyse -
;
PRT3ERR1 LD HL,TERRS ;Comme version precedente
CALL PRT
;
PRT3ERR LD A,(FLAGERR)
PRT3ER2 LD HL,TOK
;
OR A
JP Z,PRT
;
PRTERR3 LD HL,TERRFDC
LD DE,3
LD B,8
LOOKERR RLC A
JR NC,NOBIT
PUSH BC
PUSH AF
LD B,3
PRTERR1 LD A,(HL)
IMPERR1 CALL #BB5A
INC HL
DJNZ PRTERR1
POP AF
POP BC
JR OUIBIT
NOBIT ADD HL,DE
OUIBIT DJNZ LOOKERR
RETIMP DB 0 ;Retour imprimante
LD A,8
CALL #BB5A ;Reculer une case si trop d'erreurs
RET
;
TOK DB "OK",8,#88
TERRS DB #1F,1,#16,7,#18
DB " Etat d'erreur ",#18," OK",8,#88
TERRFDC DB "EP HD CR ND CM DD MA DA "
TNBSEC DB 31,1,3,"Nombre secteurs: ",#80
TLEN DB 31,1,4,"Taille reelle : &",#80
TLONG DB 31,1,5,"Nombre octets : ",#80
TGAPF DB 31,1,6,"Octet GAP-F : &",#80
TLGAPF DB 31,1,7,"Longueur GAP-F : &",#80
TOCREMP DB 31,1,8,"Octet formatage: &",#80
TFAUGAP DB 31,1,10
TFAUGAI DB "VALEUR FAUX GAP: &",#80
TLFAUGA DB 31,1,11
TLFAUGI DB "LONG. FAUX GAP: &",#80
TFAULEN DB 31,1,12,"FAUSSE TAILLE : ",#80
TDIFLEN DB 31,1,10
TDIFLEI DB "LONG. POSS. :",#80
TLITSECT DB 31,2,23," LECTURE SECTEURS",#80
;

Ici le listing 'lecture des IDS' . L'instruction 'HALT' résout le problème de blocage des versions précédentes .

Pourquoi ce bogue ? Parce que dans ce cas précis , les interruptions restent actives lors de la lecture du résultat (Voir SOS2 lecture des IDS) .

Si par malheur le Z80 relance son cycle d'interruption au moment précis où le FDC donne la phase résultat , il y-à un conflit entre 2 types d'interruptions et le programme bloque .

Solution : L'instruction 'HALT' stoppe toute opération en cours TANT QUE LE Z80 N'A PAS GENERE UN NOUVEAU CYCLE D'INTERRUPTION . Il est donc évident que la position du HALT assure qu'au moment de la lecture du résultat une interruption vient de se produire et que nous disposons d'1/300ème de seconde avant la suivante . Le moment vital de la phase résultat étant exécuté dans un délai plus bref , il est alors certain que le résultat est toujours rendu entre 2 interruptions . C.Q.F.D....

;
;- LIRE LES ID -
;
VERIID LD HL,TLITIDS
CALL PRT
;
LIREID1 LD IX,IDINDRA ;Table IDS A
PUSH IX
POP HL
CALL RAZIDS ;RAZ zone ID
;
LD DE,IDINDRA
LD (PTRIDS),DE
LD HL,(#39) ;Petite modification
PUSH HL
;
CALL TSTDIDC ;Chercher densite et debut piste
XOR A
LD (NBFOIS),A
;
DI
LD HL,SUBROUT
LD (#39),HL
LD C,#FF ;#FF Parce qu'un secteur de plus est lu
EI
;
NEXTID INC C
PUSH BC
CALL INSTRU2
;
HALT ;** VOIR TEXTE EN TETE **
;
CALL RESU1 ;RESULT sans DI
LD HL,ETPIST
LD DE,(PTRIDS)
LD BC,4 ;Range 4 octets du resultat
LDIR
LD (PTRIDS),DE
LD A,(NBFOIS)
CP 60 ;60 fois
POP BC
JR C,NEXTID
;
DI
POP HL
LD (#39),HL
EI
;
LD A,C ;NOUVEAU ! Si aucun secteur piste non formatee
LD (NBSEC),A
OR A
RET Z
;
CALL ID4TRANS
;
PUSH HL
LD A,(COMMAND) ;Afficher densite
CP #4A
LD A,#FF
LD HL,TDDENS
JR Z,SETDENS
LD A,%10111111
LD HL,TSDENS
SETDENS CALL CHGD
POP HL
;SCF
RET
;
;- Ci dessous legere modification qui permet d'utiliser la meme routine
;- pour les 2 programmes presentes
;
IDFORMAT LD DE,FENIDL ;Afficher la serie d'IDS pour format
LD BC,FENIDL1
JR SORTID
;
IDS4AFF LD DE,FENIDE ;Afficher la serie d'IDS pour analyse
LD BC,FENIDL
;
SORTID LD (XFEN+1),DE
LD (XFEN1+1),BC
PUSH IX
POP HL
LD A,(NBSEC)
LD B,A
LD C,0
PUSH BC
;
XFEN CALL FENIDE
CALL INV
AFFIDS CALL AFF4ID
XFEN1 CALL Z,FENIDE1
DJNZ AFFIDS
CALL INV
;
POP BC
RET
;
;- Affichage des IDS en 2 colonnes -
;
AFF4ID PUSH BC
LD B,4
CALL SPACE
BCLAFID LD A,(HL) ;Aff. et cop.Ids dans buf.format
CALL PRTHEX1
INC HL
DJNZ BCLAFID
POP BC
TSTC INC C
LD A,C
CP 16 ;Tester si 16 IDS sortis
RET
TSTC1 CALL TSTC
RET Z
CP 32
RET NZ
LD A,11
CALL #BB5A ;Annuler le dernier CR sinon scroll FEN2 si 32 secteurs
XOR A
INC A ;SET NZ
RET
;
ID4TRANS LD HL,IDINDRA
IDTRANS4 PUSH BC
PUSH DE
LD DE,QUATRID
LD BC,4
LDIR
POP DE
POP BC
RET
;
SUBROUT DI
PUSH HL
LD HL,NBFOIS
INC (HL)
POP HL
EI
RET
;
NBFOIS DB 0
PTRIDS DEFW 0
;

SOS Programmeurs n°4

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

Page précédente : Fdc - 23 - Ecraser les Secteurs
★ AMSTRAD CPC ★ DOWNLOAD ★

Aucun fichier de disponible:
» Vous avez des fichiers que nous ne possédons pas concernent cette page ?
★ 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 - 04 - Test Drive (SOS Programmeurs)
» Coding » Fdc - 03 - Commandes du Fdc (SOS Programmeurs)
» Coding » Fdc - 12 - la Routine d'Ecriture de Secteurs (SOS Programmeurs)
» Coding » FDC - 26 - Sub Routines Pour le FDC (SOS Programmeurs)
» Coding » Fdc - 24 - Reproduction (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 321 millisecondes et consultée 1901 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.