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 RET3 / 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 , finiMISE 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 MOTCOMROUTINE 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 RETSOS Programmeurs n°1 ★ AMSTRAD CPC ★ DOWNLOAD ★ |
|
CPCrulez[Content Management System] v8.7-desktop/c Page créée en 388 millisecondes et consultée 2026 foisL'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. |
|
|