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: 828
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 - 13 - Edition du Buffer (SOS Programmeurs)
» Coding » Fdc - 05 - Deplacement Tete (SOS Programmeurs)
» Coding » Fdc - 07 - Routines Annexe (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 - 30 - Fdc Exemple de Bidouilles (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 416 millisecondes et consultée 1808 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.