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: 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 - 01 - Fonctionnement Fdc (SOS Programmeurs)
» Coding » FDC - 26 - Sub Routines Pour le FDC (SOS Programmeurs)
» Coding » Fdc - 12 - la Routine d'Ecriture de Secteurs (SOS Programmeurs)
» Coding » Fdc - 04 - Test Drive (SOS Programmeurs)
» Coding » Fdc - 10 - Affichages Causes d'Interruptions Secondaires du Fdc (SOS Programmeurs)
» Coding » Fdc - 07 - Routines Annexe (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 283 millisecondes et consultée 2022 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.