CODING ★ TEST DES DRIVES ★

Fdc - 04 - Test Drive (SOS Programmeurs)

Le chapitre précédent vous a prévenu ! Ce n'est pas simple si l'on tient compte qu'il peut y-en avoir 1 ou 2 (Ce qui est la moindre des choses ...)

Les tests ont été effectués sur 464 + 2 Drives . Les connections de l'interface drive 6128 ont été établies différement . Un test rapide sur 6128 révèle des résultats un peu plus cohérents ! (Sur 464 , les connexions du signal 'Ready' A & B sont reliées à la même broche) .

Dans le cas ou seul 1 drive est connecté il n'y-à pas de problème . Dans le second , on distingue 2 possibilités : B est branché et allumé , B est branché mais éteint . Cette petite différence est fondamentale ! Si vous avez un drive B connecté et allumé , tout va bien . S'il est éteint , LES VALEURS RENVOYEES PAR ET3 SONT FAUSSEES !

Si votre configuration comporte 2 drives , faites l'essai suivant depuis le BASIC : Enlevez la disquette de A , éteignez B et envoyez une commande "SAVE" quelconque . Rien ! Aucun message d'erreur ... Sans rien toucher , mettez une disquette dans A et ça repart !

Autre essai : A est allumé , actif et contient une disquette . B est allumé et contient une disquette . Enlevez la disquette de A et tapez 'ùB' . Vous obtiendrez le message : "Drive B Disc missing" . Tapez 'R'etry . Tiens ? Il est revenu !

Dernière tentative si vous disposez d'un programme de copie quelconque : Lancez une opération de copie sur B avec celui-ci éteint et constatez le plantage .

L'explication du phénomène rèside à la fois dans les connections électroniques et dans la lecture des états d'interruption (LE BIT 5 DE ET3 N'EST A 0 QUE DANS LE CAS D'UN DISQUE ABSENT ET PAS D'UN DRIVE HORS SERVICE)

Entrer dans le détail déborde largement du cadre de l'étude en cours . Notez simplement que un drive B eteint mais branché faussera tout programme d'exploitation directe du FDC . Ci dessous un exemple de résultat obtenu dans ce cas :

Commande 4 : Tester état drive avec B éteint et absence de disque dans A renvoie dans ET3 : A = Protégé écriture et B OK .

Le programme devra donc déterminer avec précision si :

  1. B est déconnecté ; : Interdire usage de B
  2. B est connecté mais éteint : Imposer l'allumage de B
  3. B est connecté et allumé : Tout va bien

Fonctionnement de la routine

On mémorise le drive utilisé actuellement puis on sélectionne le drive A qui ne peut qu'être connecté et allumé . On renvoie la tête en piste 0 . (Ce n'est pas indispensable) . Si la tête est déja sur la piste 0 la commande CALIBRE ne génère pas d'erreur il est donc inutile de tester où se trouve la tête avant la commande .

La routine TSTDRIV remet à zéro les causes d'interruption (ABSOLUMENT INDISPENSABLE !) , envoie la commande 4 et le numéro de drive au FDC , lit l'état d'interruption et range ET3 dans l'octet déterminé par INCPTE3 .

Ensuite on sélectionne le drive B et on essaye de placer la tête sur la piste 0 . C'EST OBLIGATOIRE : CALIBRE NOUS DIRA SI B EST ETEINT . La lecture des états après calibre nous dira :

  1. B Présent et allumé : ET0 = Opération réussie !
  2. B Absent ; : ET0 = Erreur équipement .
  3. B Présent et éteint : ET0 = #80 pour INVALID COMMAND .

Dans le 1er cas on continue . On ignore le second qui sera de toute manière traité par TSTDRIV . Pour le 3ème , on boucle sur le test de B tant qu'il n'est pas allumé ou débranché !

L'appel suivant à TSTDIRV pour le drive B verra tous les bits 7 à 2 de ET3 (Tous sauf le numéro de drive) à zéro si le drive B n'est pas branché .

La seconde partie de la routine est plus longue mais plus simple . On va rechercher l'état du drive A et on interprête les bits 6 & 5 . La tête étant mise sur la piste 0 par CALIBRE , le bit 4 ne nous interesse pas de même que 7 , 3, 2 inutilisables sur Amstrad . (Revoyez le chapitre signification des registres d'état) .

Un second tour est effectué pour le drive B et c'est fini .

NOTES : La routine PRT affiche la chaîne pointée par HL . Le dernier caractère doit avoir son bit 7 à 1 (+#80) . PRTDRIV affiche le drive en cours à une position donnée . Ces deux routines sont dans la section sous programmes .

; ;---------------------------
; ;- ROUTINE TESTER 2 DRIVES -
; ;---------------------------
TST2DR LD HL,TCOMDRV ;Afficher texte commande
CALL PRT
LD A,(DRSELEC) ;Preserver le drive en cours
PUSH AF
XOR A
LD (DRSELEC),A ;Selection drive A
;
; ; - Effectuer un test pour A et 1 pour B -
;
TST2DR1 CALL CALIBRE ;Initialiser en piste 0
CALL TSTDRIV ;Tester etat du drive dont le numéro est dans A
LD A,1
LD (DRSELEC),A ;Passer en drive B
RECALI CALL CALIBRE ;Tester si il est actif en essayant de trouver
CP #80 ;la piste 0 . Si le test d'etat apres CALIBRE
JR NZ,BALLUME ;renvoie #80 , B est connecte mais eteint
;
LD HL,TJEVEUB ;Interdire fonctionnement avec B:ETEINT
CALL AFFERR
JR RECALI
;
BALLUME CALL TSTDRIV ;Si ET3 = 1 , B est debranche
;
;- Afficher l'etat des 2 drives selon les flags -
;
AFRESDR LD A,"A" ;Drive A
LD DE,ETDRA ;ET3 pour drive A
;
LD HL,TETDRV1
BCLAFRD PUSH AF
PUSH AF
CALL PRT
POP AF
CALL INV
CALL #BB5A ;A ou B
CALL SPACE
CALL INV ;Video inverse
LD A,(DE) ;ETDRA ou B
CP #1 ;Si 1 Drive B hors service
JR Z,DRBHS
;BIT 5,A ;Si BIT 5 ET3=0 . Disque manque
JR NZ,DREADY
LD HL,TMISS
CALL PRT ;Afficher Disque manque et fini
JR FINDRIV
DREADY LD HL,TPROT
;BIT 6,A ;BIT 6 ET3 : 1=Protege ecriture , 0=Ouvert ecriture
JR NZ,OUIPROT
LD HL,TNOPROT
OUIPROT CALL PRT
LD HL,TECRIT
CALL PRT
LD HL,TPISTZ
DRBHS CALL PRT
;
FINDRIV CALL CR
POP AF
CP "B"
JR Z,FINDR1
INC DE
INC A
LD HL,TETDRIV
JR BCLAFRD
FINDR1 POP AF ;Recuperer drive en cours a l'entree
LD (DRSELEC),A
RET
;
;- Textes concernant l'etat des drives -
;
TCOMDRV DEFB " Tester Drives"," "+#80
TETDRV1 DEFB 31,1,1
TETDRIV DEFB 24," Etat lecteur : ",24,18+#80
DEFB " Pas de lecteur",7+#80
TMISS DEFB " Disque manque !",7+#80
TPROT DEFB " Prot","."+#80
TNOPROT DEFB " Read","y"+#80
TECRIT DEFB " Ecritur","e"+#80
TPISTZ DEFB " Sur piste : &0","0"+#80
TDRSELE DEFB 31,1,3,24," Drive choisi : A ",24+#80
TJEVEUB DEFB 24," ALLUMER DRIVE B ! ",24,7,13+#80

CHANGER DE DRIVE

Rien de plus simple mais il faut vérifier que le passage en drive B est possible !

; ; -----------------------------
; ; - CHANGER LE DRIVE EN COURS -
; ; -----------------------------
CHGDRIV LD A,(DRSELEC)
DEC A
JR Z,DR0 ;Si etait 1 , devient 0 , c'est bon
;
LD A,(ETDRB) ;TESTER SI B EST PRESENT
CP 1
RET Z
;
LD A,1 ;Si non etait 0 , passer en 1
DR0 LD (DRSELEC),A
LD HL,TCHGDR ;Afficher commande
CALL PRT
ADD A,#41 ;Decalage ASCII pour "A"ou"B"
LD HL,TDRSELE+20
LD (HL),A ;Modifier texte du drive en cours
;SUB #41 ;Revenir en numéro reel
JP PRTDRIV
;
TCHGDR DEFB " Change drive"," "+#80

SOS Programmeurs n°1

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

Page précédente : Fdc - 03 - Commandes du Fdc
★ AMSTRAD CPC ★ DOWNLOAD ★

Dump disquette:
» SOS  Programmeurs  1    FRENCHDATE: 2011-05-26
DL: 1006
TYPE: ZIP
SiZE: 95Ko
NOTE: 40 Cyls
.HFE: Χ

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Fdc - 07 - Routines Annexe (SOS Programmeurs)
» Coding » Fdc - 22 - Analyse de la Piste (SOS Programmeurs)
» Coding » Fdc - 30 - Fdc Exemple de Bidouilles (SOS Programmeurs)
» Coding » Fdc - 01 - Fonctionnement Fdc (SOS Programmeurs)
» Coding » Fdc - 24 - Reproduction (SOS Programmeurs)
» Coding » Fdc - 23 - Ecraser les Secteurs (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 265 millisecondes et consultée 1848 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.