CODING ★ LA ROUTINE DE LECTURE TOUS SECTEURS ★

Fdc - 11 - la Routine de Lecture Tous Secteurs (SOS Programmeurs)
Fonctionnement : Cette routine utilise de  nombreuses sous routines de la version précédente .  Le  première  partie  du  programme configure celles-ci selon les besoins de la cause :
1 - Mémoriser l'état d'analyse (ON/OFF)  et  forcer sur ON en annulant le RET de STOPANA .
2 - Interdire l'affichage du résultat d'analyse (RET en RETPHY) .
3 - Modifier le saut en cas de piste non formatée .
4 - Activer le saut permettant l'écriture du buffer .
5 - Détourner les sauts liés aux  flèches verticales de manière à lire un nouveau secteur à chaque fin de page .
6 - Utiliser FLAG pour piste non formatée (=#FF) ou formatée (=0);
1ère partie : Initialisation

 ;
;- Lire secteurs par ordre physique -
 ;
 LITPHY  LD A,(STOPANA)
  LD (STATANA),A  ;Mèmoriser ètat analyse prealable
  XOR A
  LD (STOPANA),A  ;Analyse préalable impérative
  LD A,#C9
  LD (RETPHY),A
  LD HL,RETPOINT ;Saute vers un POP suivi de RET au cas ou
  LD (PASFOR1+1),HL ;non formaté
 ;
  LD A,#CA
  LD (TSTWRIT),A
  LD HL,WRITSEC  ;Active saut écriture par CTRL+W dans routine
  LD (TSTWRIT+1),HL ;buffer
 ;
  LD HL,REMONT1 ;Modifier l'effet des flèches verticales
  LD (MODBUF+1),HL ;sur le buffer pour lire un nouveau secteur
  LD HL,AVANCE1 ;à chaque sortie de page .
  LD (MODBUF1+1),HL
 ;
  XOR A      ;Flag formaté ou non à 0
  LD (FLAG),A
 ;
  CALL ANAL1   ;Analyser toute la piste
  JR C,FRM     ;CARRY mis si piste formatée .
 ;
  LD A,#FF
  LD (FLAG),A  ;Pas formatee
;

Il faut maintenant connaître le contenu  des IDS seteurs pour pouvoir les reproduire . On passe par la routine  analyse  . On demande ensuite si il est  nécéssaire de formater la piste destination  selon  les  IDS  lus , si oui on  saute à la routine de copie de format ,  si non , on se contente de donner le  numéro de la piste ou doit se faire une éventuelle écriture .

Routine de formatage : Si le numéro  de piste à formater est différent de la piste source , on demande si il  faut le conformer . On vérifie ensuite la longueur de GAP lue par l'analyse  par  comparaison avec le contenu une table de valeurs . Si ce  dernier  n'est  pas  conforme  ,  on le rectifie avant de formater . (Description de  CALIGAP  plus  loin)  .  Ne  tient compte que des formats en double densité . Dans le cas ou la piste source n'est pas formatée on saute à une routine de déformatage qui détruit la piste destination .

 Seconde partie

;
;- Reproduction fornat -
 ;
 FRM  LD HL,TREPROD ;Reproduire ?
  CALL PRT
  CALL WAITREP
  JR C,FORMOU1 ;OUI
 ;
;- Ne pas reproduire format -
 ;
 RECOMP  LD HL,TOUPIST ;NON entrer piste ècriture
  CALL PRT     ;Afficher message
  CALL INPUNB  ;Entrer un ou deux chiffres
  LD A,(PISTMAX)
  LD B,A
  LD A,(VALEUR)
  CP B
  JR NC,RECOMP ;Vérifier piste valide (<42)
 ;
  LD (PISTW),A ;Stocker dans piste écriture .
  LD (ADID),IX ;Mémoriser le début de zone IDS .
  JP NOREPROD  ;Ignorer la routine de formatage
 ;
;- Aller piste/drive a formater -
 ;
 FORMOU1 CALL WRITPAR  ;Initialiser textes source destination .
  CALL PUTDEST  ;Afficher message insérer destination
  CALL GOPISTE  ;Aller sur piste source
  CALL PWRITE ;Initialiser piste écriture
  JR C,OKPIS
 ;
  CALL ERPFORM  ;Si NC , il n'y à sans doute pas de disquette
  JP ABANDON ;dans le lecteur demandé .
 ;
;- Conformer IDS si piste dest.<>source -
 ;
 OKPIS   LD A,(FLAG)    ;Voir si piste souce formatée
  CP #FF
  JP Z,DEFORM    ;Si non , aller déformater .
 ;
  CALL CPPIST    ;Piste lecture = Piste source ?
  PUSH IX     ;Début IDS dans HL
  POP HL
  JR Z,FOROK     ;Si P.L.=P.S. Sauter la question .
 ;
  PUSH HL
  LD HL,TIDCONF  ;Si P.L <> P.S. Demander conformer IDS ?
  CALL PRT
  CALL WAITREP
  PUSH AF     ;Preserver CARRY
  CALL EFFLB1
  POP AF
  POP HLX     ;IDS dans HL
  CALL C,CONFID  ;Conformer OUI ! Mettre piste destination dans IDS
 ;
;- Verifier le GAP lu -
 ;
 FOROK   PUSH HL     ;Préserver table IDS
  LD (ADID),HL
  CALL CALIGAP   ;Rectifier le GAP si il y-a lieu
  POP HL
  JR FOROK1   ;Aller formater .
 ;
;- Deformater piste -
 ;
 DEFORM  CALL RAZIDS    ;Remplacer tous les IDS par #FF
  LD A,#FF
  LD (LENSEC),A  ;Taille secteur = #FF aura pour effet
  LD A,1      ;de déformater la piste .
  LD (NBSEC),A
 ;
;- Formater la piste -
 ;
 FOROK1  CALL FORMATE ;Formater
  JR C,OKREPRO ;Si CARRY tout va bien
 ;
  LD A,(ET1)   ;Si non peut e^tre protégée en écriture
  LD BC,TPROT
  AND %00000010
  JR Z,OKREPRO
 ;
  CALL PRTERR  ;Rate
  JP ABANDON
 ;
 OKREPRO CALL EFFLB1  ;Effacer lignes du bas et tester si
  CALL SOURCE  ;drive source = drive dest.  Si oui remettre source
;

Il ne reste plus qu'à lire  le  premier  secteur  avant de passer en mode édition . Comme dans SOS2 , on utilisera  la routine VISESEC pour être sur de pointer le bon ID dans le cas ou  plusieurs IDS porteraient le même numéro de secteur . (Voir théorie ANALYSE dans SOS2) .

Détail important : L'ID Longueur Secteur ne correspond peut être pas à la taille du format (Voir SOS2) . Dans ce  cas on mémorise le contenu de l'octet LS et  on  le  remplace  par  LS  lu  dans  l'ID  afin  de  lire  le  secteur convenablement . Le contenu de LS sera  restauré en sortie de routine . (Voir LITPHYA à la suite) .

Il faudra aussi déterminer si  le  secteur  est  normal  ou 'effacé' , un simple test sur ET2 y pourvoit .

 3ème partie

 ;
;- Lire et afficher le 1er secteur -
 ;
 NOREPROD CALL FILLBUF ;Remettre tous les octets du buffer a #FF
  LD A,1     ;Intialiser compte secteurs
  LD (COUNT),A
  LD (POINTID),IX ;Initialiser pointeur IDS
  LD HL,LISTERR
  LD (POINTER),HL ;Mémoriser pointeur IDS
 ;
  CALL LITPHYA ;Lire le 1er
  CALL AFFBUF  ;Aller afficher et éditer le buffer .
  JP ABANDON   ;Retour d'édition .
 ;
;- Routine lecture physique (est appelée par AFFBUF à chaque page secteur) -
 ;
 LITPHYA PUSH HL   ;Copier les IDS à lire : HD,LS,NS . Ignorer piste qui
  PUSH DE   ;est déjà initialisé .
  LD HL,(POINTID)
  CALL TRANS3ID
  CALL DIFLENL ;Voir si LS ID <> LS réel , si oui , modifier .
 ;
  LD A,(COUNT) ;COUNT contient le numéro d'ordre du secteur
  CP 1      ;a lire (Position physique sur la piste)
  CALL NZ,VISESEC ;Si ce n'est pas le premier , viser juste .
 ;
  LD A,#46     ;Commande lire secteur
 LIRECM  LD HL,LITFDC ;Routine lire FDC et stocker octets dans (HL)
  CALL SETCOM2 ;initialiser commande
 ;
 RELITS  CALL INSTRSEC ;Exécuter commande
  LD A,(ET2)   ;Voir si secteur effacé
  AND %01000000 ;Tester CM
  LD A,#4C     ;Si CM , relire convenablement avec commande
  JR NZ,LIRECM ;appropriée .
 ;
 LENNO0  LD A,(VRAILEN)  ;Restaurer LS d'origine qui a peut-e^tre été modifiée
  LD (LENSEC),A ;par la routine DIFLENL
  CALL AFFRESL ;Afficher le détail de la lecture
  POP DE    ;C'est fini .
  POP HL
  RET
;

4ème partie

Sortie du mode édition  -  lecture  secteurs  ,  on restaure les adresses modifiées par la 1ère partie et c'est fini .

 ;
;- Fin de lecture -
 ;
ABANDON LD A,(STATANA)  ;Restaurer etat ANALYSE ON/OFF
  LD (STOPANA),A
  XOR A
  LD (RETPHY),A
  LD (TSTWRIT),A
  LD HL,0
  LD (TSTWRIT+1),HL
  LD HL,PASFORM
  LD (PASFOR1+1),HL
 ;
  LD HL,REMONTE ;Restaure l'effet des fleches verticales
  LD (MODBUF+1),HL ;sur le buffer
  LD HL,AVANCE
  LD (MODBUF1+1),HL
  XOR A
  LD (FLAG),A
  LD (RETANA),A
  RET
;

5ème partie

 ;
;- Afficher resultats lecture -
 ;
AFFRESL CALL FEN1    ;Plein écran pour affichage
  CALL EFFLB1  ;Effacer lignes du bas
 ;
  LD HL,TLITPHY ;Afficher numéro de secteur
  CALL PRT
  LD A,(QUATRID+2)
  CALL PRTHEX1
  CALL DEUXNB  ;Initialiser affichage decimal 2 chiffres
  LD HL,TLITPH1
  CALL PRT
  LD A,(COUNT) ;Et afficher position du secteur sur la piste
  CALL PRTDECIA
  LD HL,TLITPH2 ;Nombre octets lus
  CALL PRT
  LD HL,(NBLUS)
  LD (VALEUR),HL
  CALL CINQNB  ;Restaurer affichage 5 chiffres
  CALL PRTDECI ;Afficher nombre octets lus
  CALL DEUXNB
  LD HL,TLITPH3 ;Afficher taille IDS
  CALL PRT
  LD A,(QUATRID+3)
  CALL PRTDECIA
  LD HL,TLITPH4 ;Afficher taille reelle
  CALL PRT
  LD A,(LENSEC)
  CALL PRTDECIA
  LD HL,TLDR
  CALL PRT
  LD A,(DRSELEC)
  ADD A,#41
  CALL #BB5A   ;Afficher drive sélectionné
  LD HL,TWPIST
  CALL PRT
  LD A,(PISTSEL)  ;Et piste
  CALL PRTDECIA
  CALL CINQNB
  LD HL,(POINTER) ;Les etats d'erreur sont memorisés lors de l'analyse
  LD A,(HL)
  LD HL,TLITPH5
  CALL PRT
  CALL PRT3ER2 ;Afficher etat d'erreur
  JP AFFRES1  ;Et phase resultat
;

8ème partie : Calibrer le GAP

La longueur du GAP  de  formatage  peut  être  modifiée par une opération d'écriture et devenir quelque peu excessive  pour un formatage . Cette routine  teste si l'on est dans un cas où un GAP trop grand est possible . Si oui , on  vérifie la longueur de ce  dernier  et  on  rectifie  si  il y-à lieu . (Voir  théorie FDC3) .

 ;
;- Calibrer le GAP -
 ;
 CALIGAP LD A,(LENSEC) ;La série de comparaisons ci dessous met dans
  OR A      ;HL l'adresse de la table concernée et dans C
  LD HL,T0     ;le nombre de secteurs au dessus du quel un GAP
  LD C,15   ;trop grand peut poser un problème en fonction
  JR Z,GAPVERI ;de la taille du format .
 ;
  DEC A
  LD HL,T1    ;LS=1
  LD C,12
  JR Z,GAPVERI
  DEC A
 ;
  LD HL,T2    ;LS=2
  LD C,8
  JR Z,GAPVERI
  DEC A
  JR Z,GAPVERI
 ;
  LD HL,T3    ;LS=3
  LD C,5
  DEC A
  RET NZ   ;LS 4 & 5 admettent des GAPS à #FF donc pas de
;       ; problème .
;- Rectifier le GAP lu si trop grand -
 ;
GAPVERI LD A,(NBSEC) ;Voir si le nombre de secteurs est < que le nombre
  CP C     ;à problème .
  RET C    ;Oui , tout va bien .
 ;
 BCLGAPV CP C     ;Pointer valeur maximale du GAP en fonction
  JR Z,GAPVERI1  ;du nombre de secteurs trouvés .
  INC HL
  INC C
  JR BCLGAPV
 ;
GAPVERI1 LD A,(GAPFORM)  ;Voir si GAP trouvé > GAP autorisé
  LD B,A
  LD A,(HL)
  CP B
  RET NC    ;Non , tout va bien
 ;
  LD (GAPFORM),A  ;Oui , remplacer par la valeur lue dans la table
  RET
;

------------------------------------
7ème partie : Sous routines diverses
------------------------------------

 ;
;- Retour sur piste source -
 ;
 SOURCE  CALL CPDRIVE ;Voir si drive lecture <> drive écriture
  CALL Z,PUTSOUR  ;Sinon demander remise en place du disque source
 RESSOUR LD A,(PISTL) ;Restaurer paramètres lecture
  LD (PISTSEL),A
  CALL SETLECT
  CALL GOPIST1 ;Et revenir sur piste lecture
  JP AFFPIST
 ;
;- Remettre source -
 ;
 PUTSOUR LD HL,TREMET ;Afficher texte
  CALL PRT
  CALL #BB06   ;Attendre
  JP EFFLB1    ;Effacer textes
:
 WAITREP CALL #BB06   ;Attendre Oui ou Non . CARRY si Oui
  AND #DF
  CP "N"
  RET Z
  CP "O"
  JR NZ,WAITREP
  ;SCF
  RET
 ;
;- Messages source/destination -
 ;
 WRITPAR LD A,(DRW)     ;Mettre 'A' ou 'B' dans les textes concernant
  ADD A,#41   ;les drives .
  LD HL,TCOPDRV+43  ;Initialiser textes source destination .
  LD (HL),A
  LD HL,TREMET+40
  LD A,(DRL)
  ADD A,#41
  LD (HL),A
  JP SETWRIT     ;Initialiser paramètres write
 ;
 PUTDEST LD HL,TCOPDRV  ;Mettre destination
  CALL PRT
  CALL #BB06
  JP EFFLB1
 ;
 CPPIST  LD A,(PISTL)   ;Comparer pistes source/destination
  LD B,A
  LD A,(PISTW)
  CP B
  RET
 ;
 CONFID  LD A,(NBSEC)   ;Conformer IDS
  LD B,A      ;Mettre le numéro de piste écriture dans
  LD A,(PISTW)   ;les IDS de formatage
  LD DE,IDOUTDA
 ;
 BCLIDX  LD (DE),A
  INC HL
  INC DE
  PUSH BC
  LD BC,3
  LDIR
  POP BC
  DJNZ BCLIDX
  LD HL,IDOUTDA
  RET
 ;
 SETLECT LD A,(DRL)  ;Initialiser sélection en lecture .
  LD (DRSELEC),A ;Drive
  LD A,(HDL)  ;et te^te
  LD (HEAD),A
  RET
 ;
 SETWRIT LD A,(DRW)  ;La me^me pour lecture
  LD (DRSELEC),A
  LD A,(HDW)
  LD (HEAD),A
  RET
 ;
 PLECTUR LD A,(PISTSEL) ;Recopier piste sélectionnée dans piste lecture
  LD (PISTL),A
  RET
 PWRITE  LD A,(PISTSEL)
  LD (PISTW),A ;Ou piste écriture
  RET
 ;
 CPDRIVE LD A,(DRL)  ;Voir si drive source=drive destination
  LD B,A
  LD A,(DRW)
  CP B
  RET Z
  ;SCF
  RET
 ;
 INSTRSEC CALL SETLS ;Paramétrer avant exécution instruction
  CALL SETGRW
  JP INSTRU9
 ;
 SETLS   LD A,(QUATRID+3) ;Si taille secteur = 0 , dernier octet
  OR A    ;de la phase instruction = 0
  JR Z,SETLS0
  LD A,#FF   ;#FF sinon
 SETLS0  LD (LSZERO),A
  RET
 ;
 SETGRW  LD A,(GAPFORM) ;GAP R/W = GAP formatage / 2
  CP 1
  JR Z,SETGRW1
  ;RRC A
 SETGRW1 LD (GAPRW),A
  RET
 ;
 DIFLENL LD A,(LENSEC) ;Mémoriser longueur formatage
  LD (VRAILEN),A
  LD B,A
  LD A,(QUATRID+3)
  CP B
  RET Z
  LD (LENSEC),A ;et remplacer par longueur lue dans l'ID
  RET
VRAILEN DB 0
     ; - FIN DE SECTION . SUITE : ECRITURE SECTEUR -
;

SOS Programmeurs n°3

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

Page précédente : Fdc - 10 - Affichages Causes d'Interruptions Secondaires du Fdc
★ AMSTRAD CPC ★ DOWNLOAD ★

Dump disquette:
» SOS  Programmeurs  3    FRENCHDATE: 2003-03-29
DL: 1023
TYPE: ZIP
SiZE: 144Ko
NOTE: 40 Cyls
.HFE: Χ

★ 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 - 14 - Creation d'un Piste a Partir du Buffer (SOS Programmeurs)
» Coding » Fdc - 13 - Edition du Buffer (SOS Programmeurs)
» Coding » Fdc - 24 - Reproduction (SOS Programmeurs)
» Coding » Fdc - 30 - Fdc Exemple de Bidouilles (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 597 millisecondes et consultée 2421 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.