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 même 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 - 26 - Sub Routines Pour le FDC (SOS Programmeurs)
» Coding » Fdc - 02 - Transmission Fdc (SOS Programmeurs)
» Coding » Fdc - 05 - Deplacement Tete (SOS Programmeurs)
» Coding » Fdc - 11 - la Routine de Lecture Tous Secteurs (SOS Programmeurs)
» Coding » Fdc - 12 - la Routine d'Ecriture de Secteurs (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 142 millisecondes et consultée 2312 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.