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: 1009
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 - 14 - Creation d'un Piste a Partir du Buffer (SOS Programmeurs)
» Coding » Fdc - 07 - Routines Annexe (SOS Programmeurs)
» Coding » Fdc - 05 - Deplacement Tete (SOS Programmeurs)
» Coding » Fdc - 30 - Fdc Exemple de Bidouilles (SOS Programmeurs)
» Coding » FDC - 23 - Etude de la Piste (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 086 millisecondes et consultée 2334 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.