CODING ★ Transmission FDC ★

Fdc - 02 - Transmission Fdc (SOS Programmeurs)
LES 4 ROUTINES ESSENTIELLES DU FDC

1 / Transmettre une commande : ENVOFDC

Cette partie du programmme constitue la phase commande (ou instruction) du fdc . Tout d'abord on interroge le registre d'état principal afin de déterminer si le FDC est prêt à communiquer avec le Z80 . Tant que ce n'est pas le cas , on attend son bon vouloir . Ensuite on vérifie si cette communication s'effectue bien dans le sens de l'écriture (Une erreur de programmation consistant à envoyer une commande pendant une phase de lecture de données reste possible) . Ce test réussi , on envoie la commandes sur le registre de données ; on attend quelques micro secondes que l'information soit assimilée et c'est fini .

; --------------------------------------------------------------------------
; - PHASE INSTRUCTION DU FDC . Attendre que FDC soit pret et envoyer octet -
; --------------------------------------------------------------------------
;      ; --- Attendre que le FDC soit pret ---
;
ENVOFDC PUSH BC
  LD BC,#FB7E ;Registre d'etat principal
  PUSH AF   ;Preserver l'octet de commande a 2 reprises
  PUSH AF
  DI    ;Interdire les interruptions
WAITFDC IN A,(C)
  ADD A,A   ;Tester bit 7 du Reg.Et.Princ.
  JR NC,WAITFDC ;Registre donn aes FDC pas pret a recevoir si pas mis
  ADD A,A   ;Registre pret a recevoir , tester bit 6 . Si ce
  JR NC,VEUTOCT ;bit est a 0 le FDC attend bien un octet
  EI    ;Si il est a 1 , le FDC veut envoyer un octet et il
  POP AF   ;y-a une erreur quelque part .
  POP AF
  POP BC
  RET
;    ; --- Transmettre un octet instruction au FDC ---
;
VEUTOCT POP AF   ;Le FDC veut un octet . On reprend l'octet instruction
  INC C    ;Passer de #FB7E au registre donnees #FB7F
  OUT (C),A   ;Expedier le colis
  DEC C    ;Et revenir sur registre d'etat .
  LD A,5
DIGERE DEC A    ;Petite temporisation pour assurer
  ;NOP    ;la bonne digestion du FDC
  JR NZ,DIGERE
  EI    ;Retablir les interruptions
  POP AF   ;Recuperer la valeur de l'octet transmis , cela
  POP BC
  RET    ;peut toujours servir .

2 / Lecture de la phase résultat : RESULT

C'est par cette routine que l'on saura si une opération donnée à réussi . Les regitres Z80 sont préservés , le compteur D est remis à zéro et on pointe sur le 1er octet du buffer résultat (En zone variables) .

On commence par interroger le registre d'état principal afin de tester si le FDC n'est pas en train de terminer une opération de lecture ou écriture . Ensuite on lit le 1er octet disponible sur le registre de données et on le range dans le buffer . Le bit 4 du registre d'état nous avertira quand tous les octets auront été lus .

La lecture terminée un AND sur les bits 6&7 de ET0 mettra le flag Z si le résultat indique une opération réussie . Dans ce cas , on mettra le carry pour signaler ce fait aux routines exploitant cette section .

Le nombre d'octets lus contenu dans D est rangé dans l'octet avant ET0 .

Pour finir , ont récupère les registres du Z80 et la valeur de ET0 qui à été modifiée par AND .

NOTE : La dénominaition des 7 octets de la zone stockage résultat correspond aux octets réellement transmis à 2 exceptions :

  • A - Commande 8 : Interroger cause d'interruption : Seuls 2 octets sont donnés par la phase résultat . ET0 qui sera à sa place , un numéro de piste qui sera dans l'octet ET1 .
  • B - Commande 4 : Interroger état drive : Seul ET3 est transmis . On le trouvera dans ET0 .

;    ------------------------------------------------------
;    - EXTRAIRE ET RANGER LES OCTETS DE LA PHASE RESULTAT -
;    ------------------------------------------------------
RESULT PUSH BC
  LD BC,#FB7E ;Registre etat principal
  PUSH HL
  PUSH DE   ;Il est utilse de preserver les 3 registres doubles
  LD D,0   ;Compteur des octets resultat
  LD HL,ET0
  PUSH HL   ;Preserver adresse du buffer resultat
  DI    ;Interdire interruptions
JEBOSSE IN A,(C)   ;Lire registre etat principal
  CP #C0   ;#C0 = 11000000 . Test bit 6&7 tant que les 2 ne sont
  JR C,JEBOSSE ;pas mis .
  INC C   ;Passer en registre donnees #FB7F .
  IN A,(C)   ;Lire 1 des octets du resultat
  LD (HL),A  ;le ranger
  INC HL   ;Et avancer d'un octet dans le buffer
  INC D   ;Un octet de plus a ete lu
  DEC C   ;Revenir en #FB7E regitre d'etat principal
  LD A,5
TEMPRES DEC A   ;Attendre un peu
  JR NZ,TEMPRES
  IN A,(C)   ;Lire registre d'etat principal
  AND #10   ;Tester Bit 4 pour voir si la phase resultat est
  JR NZ,JEBOSSE ;terminee .
  POP HL   ;Si oui reprendre 1er Octet du buffer resultat (ET0)
  LD A,(HL)
  AND #C0   ;RAZ de tous les de ET0 sauf bits 7&6
  DEC HL
  LD (HL),D  ;Ranger nombre octets lus en phase resultat
  POP DE
  POP HL   ;Recuperer les registres preserves
  POP BC
  EI    ;Retablir interruptions
  LD A,(ET0) ;Retour avec ET0 dans A
  RET NZ   AND signale si bits 7-6 ou les 2 de ET0 mis
  ;SCF    ;BITS 7&6 tous deux a zero donc instruction reussie
  RET

3 / Phase éxécution écrire données : WRITFDC

Les données à écrire devront au préalable avoir été stockées dans un buffer .
On commence au milieu de la routine et teste la disponibilité du FDC . Ensuite , le bit 5 du registre d'état principal nous dira si l'éxécution est terminée . Si ce n'est pas le cas , on écrit un octet sur le FDC qui l'enverra à la disquette .

; ------------------------------------------------------------------------
; - PHASE EXECUTION ECRITURE . ENVOYER LES OCTETS DE DONNEES NECESSAIRES -
; ------------------------------------------------------------------------
;     ; --- Envoyer un octet de donnee au FDC ---
;
WRITFDC LD HL,(ADBUFF) ;Debut de la zone de stockage des donnees
;
WRITFDC1 LD BC,#FB7E ;Selectionner registre d'etat
  DI    ;Interdire interruptions
  JR TESTFDC ;En 1er voir si FDC ready
;
BCLWRT INC C   ;Passer sur le registre de donnees
  LD A,(HL)  ;Prendre 1 octet dans le buffer
  OUT (C),A  ;et l'envoyer au FDC qui l'ecrira sur le disque .
  DEC C   ;Passer sur registre etat
  INC HL   ;Pointer octet buffer suivant et continuer
;
; --- Tester si FDC Ready on est ici sur #FB7E registre d'etat ---
;
TESTFDC IN A,(C)   ;Attend un autre octet ?
  JP P,TESTFDC ;Si bit 0 non mis attendre
  AND #20   ;#20 = 00100000 Test du bit 5 tant qu'il est mis , la
  JR NZ,BCLWRT ;phase execution est en cours . On ecrit
  EI    ;Si il est remis a 0 c'est fini on retablit les
  RET    interruptions et on peut passer en phase resultat
  ---------------------------------------------------------------

4 / Phase éxécution lire données : WRITFDC

Identique à la phase d'écriture . Les deux routines de la phase éxécution pouvant subir quelques variations des explications complémentaires seront données dans les prochains numéros de SOS PROGRAMMEURS .

; --------------------------------------------------------------------
; - PHASE EXECUTION LECTURE . LIRE TOUS LES OCTETS DE DONNEES VOULUS -
; --------------------------------------------------------------------
LITFDC LD HL,(ADBUFF)
LITFDC1 LD DE,(NBALIRE)
  LD BC,#FB7E  ;Registre d'etat principal
  DI     ;Interdire interruption
  JR TSTFDC1   ;En 1er voir si FDC ready
;
BCLLITF DEC DE    ;Nombre d'octets a lire -1
  LD A,E
  OR D
  JR Z,TSTFDC1
  INC C    ;Port ecriture
  IN A,(C)   ;Lire
  LD (HL),A   ;Ranger
  DEC C    ;Passer sur registre etat
  INC HL    ;Buffer + 1
TSTFDC1 IN A,(C)   ;Demande un autre octet ?
  JP P,TSTFDC1   ;Si bit 0 non mis attendre
  AND #20   ;Tester bit 5
  JR NZ,BCLLITF ;Si mis , continuer
  EI
  RET    ;Si enleve , fini

MISE EN MARCHE ET ARRET DU MOTEUR

Bien que le port moteur soit réputé indépendant du FDC , il semble bien que la mise en route ou l'arrêt de ce dernier provoque quelques états d'interruption au niveau du FDC . Il est donc très important de respecter la temporisation de 55 . Dans le cas contraire , et notament pour une absence de disquette dans le lecteur , après la remise en place de la disquette , une nouvelle tentative pourrait renvoyer la même erreur . Essayez de changer cette valeur pour voir ....

Un flag est mis à 1 ou 0 selon l'état du moteur .

;        ;--------------------
;        ;- COMMANDE MOTEUR -
;        ;--------------------
MOTON LD A,(FLAGMOT) ;Mise en route moteur
  CP 1
  RET Z    ;Deja en marche
  LD A,1
  CALL MOTCOM
  LD A,(TEMPMOT) ;Minimum a respecter 55 ou accepter d'avoir a
  JP TEMPAMS  ;redoubler certaines commandes en cas d'erreur .
MOTCOM LD (FLAGMOT),A ;LA ROUTINE TEMPAMS EST DANS UNE AUTRE SECTION
  LD BC,#FA7E ;DU PROGRAMME
  OUT (C),A
  RET
MOTOFF XOR A   ;Arret moteur
  JR MOTCOM

ROUTINE DE TEMPORISATION AMSDOS

Cette routine de temporisation est tirée de la ROM AMSDOS , elle attend autant de fois 27 millisecondes que contient A en entrée et saute à la routine LITSTAT (Lire cause d'interruption) . Activer systématiquement LITSTAT en sortie n'est pas toujours nécéssaire mais ce n'est pas nuisible et économise une série de tests .

;    ; ----------------------------------------------
;    ; - TEMPORISATION DE A*27 Ms . STANDARD AMSDOS -
;    ; ----------------------------------------------
TEMPAMS PUSH AF
  LD A,12
  CALL TEMPMIL
  POP AF
  DEC A
  JR NZ,TEMPAMS
  LD A,15
  CALL TEMPMIL
  JR LITSTAT
;
TEMPMIL PUSH AF
  LD A,#F6
BCLTEMP DEC A
  JR NZ,BCLTEMP
  POP AF
  DEC A
  JR NZ,TEMPMIL
  RET

SOS Programmeurs n°1

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

Page précédente : Fdc - 01 - Fonctionnement Fdc
★ AMSTRAD CPC ★ DOWNLOAD ★

Dump disquette:
» SOS  Programmeurs  1    FRENCHDATE: 2011-05-26
DL: 1219
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 - 06 - Entree Programme (SOS Programmeurs)
» Coding » Fdc - 08 - Test Interrupt (SOS Programmeurs)
» Coding » Fdc - 22 - Analyse de la Piste (SOS Programmeurs)
» Coding » Fdc - 21 - Programme de Copie (SOS Programmeurs)
» Coding » Fdc - 01 - Fonctionnement Fdc (SOS Programmeurs)
» Coding » Fdc - 11 - la Routine de Lecture Tous 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.732-desktop/c
Page créée en 684 millisecondes et consultée 2539 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.