CODING ★ FDC ★

Fdc - 21 - Programme de Copie (SOS Programmeurs)
----------------------------------
— PROGRAMME DE COPIE . 1ERE PARTIE -
----------------------------------

 Nous présentons ici le principe et l'algorythme général du copieur de
disquettes UTIL-SOFT . A la fin de ce chapitre figure le listing commenté de
la section de programme gérant l'ensemble du copieur .

 Le principe d'ensemble est le suivant .

 +------------------> ALLER SUR LA PISTE A COPIER
 !          ;ANALYSER
 !          ;STOCKAGE
 ! VOIR SI ON A ENCORE DE LA PLACE POUR STOCKER LA PROCHAINE PISTE
 !
 !        ;PLUS DE PLACE >----------------------+
 !                                   ; !
 !    ; ENCORE DE LA PLACE TESTER PISTE SUIVANTE    !
 !    ; VOIR SI C'EST LA DERNIERE PISTE A COPIER    !
 !                                   ; !
 +-----------------< IL RESTE DES PISTES A COPIER     ; !
 !                                   ; !
 !     ; IL N'Y-A PLUS DE PISTES A COPIER >------------+
 !                                   ; !
 !       ; INITIALISER ECRITURE <-----------------+
 !   +-----> VOIR SI ON EST SUR LA DERNIERE PISTE LUE
 !   !
 !   !         ; NON >--------------------------+
 !   !                            ;!
 !   ^   ;OUI : REINITIALISER BUFFER ET LECTURE    ;!
 !-------------------------< ET CONTINUER       ;!
   ;^                            ;!
   ;!     ; REPRODUIRE LE FORMAT <------------------+
   ;!   ECRIRE LES SECTEURS SI IL Y-A UN FORMATAGE
   ;!     ; AVANCER D'UNE PISTE
   ;!     ; EST-CE LA DERNIERE ?
   ;!
   ;+------------------------< NON
                ; OUI
              ; THATS'END !

 Avant d'aller plus loin , étudions la manière de mémoriser le contenu complet d'une piste .

 Comme plusieurs pistes seront stockées à la suite , on commence par le numéro de la piste en cours . Ensuite viendra un octet nommé FLAGFNC dont chaque bit contiendra une information vitale sur le résultat global de l'analyse . La longueur des secteurs exprimée en octets peut toujours servir , on la met à la suite . Il faut bien sur conserver toutes les données afférentes au format pour reproduire cette piste , on ajoute LENSEC , NBSEC , GAPFORM , OCREMP . Bien évidement , les IDS sont vitaux , ils suivent . Pour une bonne reproduction des secteurs il nous faut encore la liste de l'état de lecture de chacun d'eux et cela commence à faire du monde . Pour éviter des calculs à chaque opération on ajoute l'adresse de début de stockage des données pour chaque secteurs , dans le même but on ponctue le tout par l'adresse ou devra commencer le prochain stockage . Ceci nous donnera :

 Numéro de piste lue    ;: PISTL  : 1 Octet
 Flag état piste     ; : FLAGFNC : 1 Octet
 Longueur secteurs en octets  : LONGSEC : 2 Octets
 Longueur secteur a formater  : LENSEC : 1 Octet
 Nombre de secteurs sur la piste : NBSEC  : 1 Octet
 GAP pour formatage    ; : GAPFORM : 1 Octet
 Octet de remplissage secteur : OCREMP : 1 Octet
 La série des IDS secteurs   : IDINDRA : 4 Octets * Nb.Secteurs
 La série des états d'erreur  : LISTERR : 1 Octet * Nb.Secteurs
 Les adresses de stockage      ;: 2 Octets * Nb.Secteurs
 L'adresse de stockage de la prochaine série : 2 Octets

 Le contenu des secteurs ....
;
 FLAGFNC Nous dira entre autre si la piste à reproduire est ou non formatée .
 LISTERR Informera le programme si il doit ou non réécrire le secteur , et de quelle manière le faire .
 Le détail de ces flags sera vu petit à petit .

 Dans ce qui suit : POINPIS contient toujours l'adresse de stockage de la piste à mémoriser . Un second pointeur POINERP est indépendant du buffer . Il désigne une liste de 2 octets * nombre de piste traitées et permet de mémoriser les pistes présentant des cas particuliers . Cette zone de stockage permet de présenter un résumé d'analyse en fin de programme .

 Dans la mesure ou les routines réellement complexes figurent dans d'autres sections , il n'y à plus grand chose à dire sur le listing suivant qui est abondamment commenté .

;
         ;-------------------------
         ;- INITIALISER PROGRAMME -
         ;-------------------------
;
  XOR A    ; INITIALISER VARIABLES
  LD (DRL),A    ;Drive lecture
  LD (DRW),A    ;Drive ecriture
  LD (HDL),A    ;Tete lecture
  LD (HDW),A    ;Tete ecriture
  LD (PREMPIS),A   ;Premiere piste
  LD (FLAGMOT),A   ;Flag moteur OFF
  LD (FLAGIMP),A   ;Flag imprimante OFF
  ADD A,#41
  LD (TSOUDES+20),A ;Modifier textes drives
  LD (TSOURCE+33),A
  LD (TSOUDES+47),A
  LD (TDESTIN+38),A
  CALL DEUXNB   ;Conversions numeriques sur 2 nombres
;
  LD BC,0   ;INITIALISER MODE & COULEURS
  CALL #BC38   ;Border 0
  LD BC,0
  XOR A
  CALL #BC32   ;Ink 0,0
  LD A,1
  LD BC,#0F0F
  CALL #BC32   ;Ink 1,15
  XOR A
  CALL #BB96   ;Paper 0
  LD A,1
  CALL #BB90   ;Pen 1
  LD A,2
  CALL #BC0E   ;Mode 2
;
  LD HL,TUS   Afficher texte introduction
  CALL PRT
;
           ;- TESTER LES DRIVES -
;
  CALL MOTON   ;Moteur en route
RETST CALL EFFSCR  ;Effacer écran
;
NEWTST LD A,#C9   ;Invalider routine erreur drive pour
  LD (RETTSDR),A ;ne pas bloquer en cas de disc missing
  CALL TST2DR ;Tester drives comme dans versions precedentes
  LD HL,#2206  ;Locate pour CONFIRM
  CALL CONFIRM ;Drives OK ?
  JR NC,NEWTST ;Non !
  XOR A
  LD (RETTSDR),A
;
NEWCHG LD HL,TMENCHG ;MENU PRINCIPAL
  CALL PRT
  LD HL,TIMPRIM
  CALL PRT
;
TSTCHG LD HL,TSOUDES
  CALL PRT
  CALL #BB06
  AND #DF
;
  CP "A"
  JR Z,CHGS   ;Changer drive source
  CP "B"
  JR Z,CHGDRV  ;Changer drive destination
  CP "C"
  JR Z,CHGTS   ;Changer tête source
  CP "D"
  JR Z,CHGTD   ;Changer tête destination
  CP "E"
  JP Z,CHGIMP  ;Imprimante ON/OFF
  CP 13
  JR Z,DONPIST ;Fin de selection
  JR TSTCHG
;
CHGS LD A,(DRL)    ;CHANGE DRIVE SOURCE
  CALL CHANGE   ;Bascule 0-1 ou 1-0
  LD (DRL),A
  ADD A,#41    ;Numero drive en ASCII
  LD (TSOUDES+20),A ;Modifier textes
  LD (TSOURCE+33),A
  JR TSTCHG
;
CHGDRV LD A,(DRW)    ;CHANGE DRIVE DESTINATION
  CALL CHANGE
  LD (DRW),A
  ADD A,#41
  LD (TSOUDES+47),A
  LD (TDESTIN+38),A
  JR TSTCHG
;
CHGTS LD A,(HDL)    ;CHANGE TETE SOURCE
  CALL CHANGE
  LD (HDL),A
  LD HL,TSOUDES+21
  JR CHGHD
;
CHGTD LD A,(HDW)    ;CHANGE TETE DESTINATION
  CALL CHANGE
  LD (HDW),A
  LD HL,TSOUDES+48
CHGHD ADD A,"0"
  LD (HL),A
  JR TSTCHG
;
CHGIMP LD A,(FLAGIMP)   ;IMPRIMANTE ON/OFF
  CALL CHANGE
  LD HL,TNON    ;Texte 'NON'
  OR A
  JR Z,IMPOFF
;
  CALL #BD2E    ;Si imprimante pas ready , BIP et abandon
  JR NC,IMPON
  LD A,7
  CALL #BB5A
  JP TSTCHG
;
IMPON LD HL,TOUI    ;Texte 'OUI'
  LD A,1
IMPOFF LD (FLAGIMP),A
;
IMPSET LD DE,TIMPRIM+30 ;Modifier texte imprimante
  LD BC,3
  LDIR
  LD HL,TIMPRIM
  CALL PRT
  JP TSTCHG
;
CHANGE INC A    ;Si A etait 1,A devient 0. Si etait 0 devient 1
  CP 1
  RET Z
  XOR A
  RET
;
DONPIST LD A,41   ;Initialiser dernieres pistes au maximum
  CALL SETDER
  LD HL,TPIST1 ;Donner piste de debut
  CALL INPUPRT2
  LD (PREMPIS),A ;Premiere piste
  LD (MEMODEB),A ;Memoriser pour reprise
  LD (PISTL),A ;Pour lecture
  LD (PISTW),A ;et pour ecriture
;
  LD HL,TPIST2 ;Donner piste de fin
  CALL INPUPRT2
  CALL SETDER  ;MEMOEND=DERPIST , PISTMAX=DERPIST+1
  CALL VERIPIS
  JR NC,DONPIST
;
  LD HL,#2215
  CALL CONFIRM ;Ca vous va ?
  JR NC,DONPIST ;NON !
;
      ;----------------------------------------
      ;- POINT DE REPRISE POUR MEME OPERATION -
      ;----------------------------------------
;
MEMEOP CALL EFFSCR ;Effacer de la ligne 5 a la fin de l'ecran
  LD A,41   ;Temporisation GOPISTE au maximum sinon un
  LD (WAITPIS),A ;déplacement important ne trouve pas la piste
;
  XOR A    ;Afficher textes destination-source
  CALL REINIT ;RAZ Buffer et pointeurs SETLECT , PISTSEL=PISTL
;
  CALL CPDRIVE ;Voir si 2 drives ?
  JR Z,UNDRIV ;NON
;
  LD HL,#2919 ;2 Drives . Attendre disque destination
  CALL #BB75
  LD HL,TDESTIN
  CALL PRT
;
    ;-------------------------------------------------
    ;- ANALYSE , INTERPRETATION , LECTURE , STOCKAGE -
    ;-------------------------------------------------
;
UNDRIV CALL #BB06
  LD HL,LISTERP ;Mise a zero de la liste des erreurs piste
  LD (POINERP),HL
;
    ;- POINT DE REPRISE APRES INTERRUPTION ESC -
;
REPRISE LD BC,#0101 ;Boucle pour une piste
  CALL #BC38 ;Bord bleu
;
  LD A,66   ;Stopper si ESC presse
  CALL #BB1E
  JP NZ,FINISH
;
  LD HL,TLITPIS ;Afficher piste en cours de lecture
  CALL PRT
  LD A,(PISTL)
  CALL PRTDECIA
;
  CALL GOPISTE ;ALLER PISTE
  CALL ANAPIST ;ANALYSER
;
  LD BC,#0909
  CALL #BC38   ;Bord vert
  CALL STOKPIST ;STOCKER
;
WAITSPA LD A,47   ;Attendre si espace presse
  CALL #BB1E
  JR NZ,WAITSPA
;
  LD HL,(POINPIS) ;POINPIS contient l'adresse de fin de stockage + 1
  LD DE,6000   ;Tester si il y-a de la place pour le prochain
  ADD HL,DE   ;stockage
  LD DE,30000  ;1er octet occupe par le programme
  AND A
  ;SBC HL,DE
  JR NC,COPIER ;Ca coince ! Aller copier et vidanger le buffer
;
LITENCOR CALL INCPIST ;Ca passe . Aller piste suivante
  LD A,(PISTSEL) ;et memoriser piste lecture en cours
  LD (PISTL),A ;Si il reste des pistes a traiter INCPIST met le
  JR C,REPRISE ;CARRY si NC c'est fini on reproduit ce qui reste
;
       ;-----------------------
       ;- RECOPIER LES PISTES -
       ;-----------------------
;
COPIER LD A,21   ;Reproduire si buffer plein ou derniere piste
  CALL EFFBAS  ;Effacer bas d'ecran
  LD HL,1000   ;Pointer 1er octet du buffer
  LD (POINPIS),HL
  CALL SETWRIT ;Parametrer drive-tête ecriture
  LD A,(PISTW) ;Recuperer piste ecriture
  LD (PISTSEL),A ;Initialiser piste ecriture
;
  CALL CPDRIVE ;2 drives ?
  LD HL,TDESTIN
  CALL Z,WAITDISC ;Si un seul drive, message destination et attendre
;
  LD A,#41   ;Recalibrer sur piste 0 c'est plus prudent
  LD (WAITPIS),A ;Temporisation GOPISTE au MAXI
  CALL CALIBRE
  LD BC,#0606
  CALL #BC38   ;Bord rouge
;
REWRITE LD A,(PISTL) ;Si piste ecriture = derniere piste
  INC A    ;lue + 1 , retourner lire
  LD B,A
  LD A,(PISTSEL)
  CP B
  JR C,NEXTWRI ;CARRY = continuer ecriture
;
  CALL REINIT1 ;RAZ Buffer et pointeurs SETLECT PISTSEL=PISTL
  JR LITENCOR  ;Retourner aux operations de lecture
;
NEXTWRI PUSH AF   ;OPERATIONS DE REPRODUCTION
  LD HL,TWRIPIS ;Afficher piste ecriture
  CALL PRT
  POP AF
  CALL PRTDECIA
;
  CALL GOPISTE ;ALLER PISTE
  CALL FORMATER ;FORMATER
  CALL C,ECRIRE ;ECRIRE Si pas deformatee
;
  CALL INCPIST ;Piste ecriture suivante
  LD A,(PISTSEL)
  LD (PISTW),A
  JR C,REWRITE ;Si INCPIST ne met pas le CARRY c'est fini
;
           ;-------------------
           ;- SORTIE DE COPIE -
           ;-------------------
;
FINISH CALL ANAEND  ;Tester LISTERP et afficher analyse globale
FINISH1 LD BC,0
  CALL #BC38   ;Border 0
  LD HL,TMENUEND ;Afficher options de fin de copie
  CALL PRT
;
TSTEND CALL #BB06
;
  AND #DF
  CP "Q"
  JR Z,FINPRG  ;QUITTER
  CP "R"
  JP Z,REPRISE ;REPRENDRE ou l'on avait interrompu la lecture
  CP "N"
  JP Z,RETST   ;NOUVELLE OPERATION
  CP "M"
  JR NZ,TSTEND
;
  LD A,(MEMODEB) ;MEME OPERATION
  LD (PREMPIS),A ;Recuperer les parametres d'origine
  LD (PISTL),A
  LD (PISTW),A
  LD A,(MEMOEND)
  LD (DERPIST),A
  CALL EFFSCR
  JP MEMEOP   ;et recommencer
;
FINPRG CALL SETLECT ;Recalibrer les 2 drives
  CALL CALIBRE
  CALL SETWRIT
  CALL CALIBRE
  JP MOTOFF   ;Arreter moteur et c'est fini
;
         ;--------------------------
         ;- SUB ROUTINES DIVESRSES -
         ;--------------------------
;
FENRES LD HL,TFENRES ;Effacer fenetre resultat
  JP PRT
;
FENRES1 CALL FENRES
  LD HL,TDENSIT
  JP PRTINV1
;
FENSCR LD HL,TFENSCR ;Effacer fenetre écran
  JP PRT
;
CHGD LD (FLAGDEN),A ;Change densite . N'a valeur que d'information
  LD DE,TDENSIT+4 ;l'ensemble du programme ne fonctionnant qu'en
  LD BC,6   ;double densite .
FINDEN1 LDIR
  RET
;
EFFSCR LD A,5    ;Effacer bas écran depuis ligne 5
  JP EFFBAS
;
WAITDISC PUSH HL   ;Attendre disc source ou destination
  LD HL,#0219
  CALL #BB75
  POP HL
  CALL PRT
  JP #BB06
;
SETDER LD (DERPIST),A ;Fixer limites derniere piste
  LD (MEMOEND),A
  INC A
  LD (PISTMAX),A
  RET
;
       ;--------------------------------
       ;- ANALYSE FINALE SELON LISTERP -
       ;--------------------------------
;
ANAEND LD A,21   ;Effacer écran
  CALL EFFBAS
  CALL FENRES
;
  LD HL,(POINERP) ;POINERP contient ici la derniere adresse occupee
  LD (HL),#FF  ;par la liste + 1 . Marquer la fin de la liste
  INC HL    ;avec #FF comme numéro de piste
  LD (HL),#FF
;
  LD HL,TFENEND ;Fenetre fin de programme
  CALL PRT
;
  LD HL,#0301
  CALL #BB75
;
  LD HL,TREPAR-31 ;Dans cette section , les textes sont de longueurs
  LD B,8    ;identiques .
;
SEPTFOI LD DE,31
  ADD HL,DE   ;On avance dans la serie de texte en faisant suivre
  PUSH HL   ;le curseur texte
  PUSH BC
;
PRANAEND CALL PRT
  LD HL,TNIET
  CALL PRT
  LD HL,LISTERP
;
NXTTEST PUSH HL
  CALL #BB78  ;Ou est curseur texte ?
  LD A,L   ;Si trop loin descendre d'une ligne
  CP 52
  JR C,OKLOC
  LD H,3
  INC L
  CALL #BB75   ;Relocate curseur
OKLOC POP HL
;
  INC HL    ;Faire tourner la case FLAG de LISTERP . Si un bit
  ;RRC (HL)   ;mis est trouve pointer le numéro de piste concerne
  JR NC,NOTPR  ;et l'afficher en face du texte correspondant .
;
  DEC HL    ;Se souvenir que RRC (HL) affecte l'octet pointe
  LD A,(HL)
  CALL PRTDECIA
  INC HL
;
NOTPR INC HL
  LD A,(HL)   ;Si (HL) <> #FF on continue
  INC A
  JR NZ,NXTTEST
;
  CALL #BB78   ;Sinon replacer curseur
  LD H,3
  INC L
  CALL #BB75
;
  POP BC
  POP HL
  DJNZ SEPTFOI ;Et recommencer avec le texte suivant
  JP FENSCR
;
;
REINIT1 LD A,21   ;Reinitialiser le buffer de copie et les pistes
  CALL EFFBAS  ;lecture ecriture
  CALL CPDRIVE ;2 drives , pas de message
;
REINIT LD HL,TSOURCE
  CALL Z,WAITDISC
  LD HL,1000
  LD (POINPIS),HL ;Pointeur buffer au debut
;
  LD BC,28999
RAZSTOK LD (HL),#FF  ;Vider le buffer
  INC HL
  DEC BC
  LD A,B
  OR C
  JR NZ,RAZSTOK
;
  LD A,(PISTL) ;Initialiser parametres lecture
  LD (PISTSEL),A
  JP SETLECT
;
      ;------------------------------
      ;- VARIABLES ET TEXTES DIVERS -
      ;------------------------------
;
MEMODEB DB 0
MEMOEND DB 0
POINPIS DW 1000
LIST
LISTERP DS 100
NOLIST
POINERP DW 0
;
TUS  DB 24," SOS PROGRAMMEURS - Etude du FDC - (C) M.MAIGROT Août 89 ",24
  DB " ",24," U T I L - S O F T ",24
TSTATDR DB 24," DRIVE A0 : ",24," ",31,34,2,24," DRIVE B0 : ",24;#80
TSOUDES DB 31,1,3,24," DRIVE SOURCE : A0 ",31,34,3," DRIVE DESTINATION : A0 "
  DB 24+#80
TMENCHG DB 24,31,26,7," [A] Change le drive source "
  DB 31,26,8," [B] Change drive destination "
  DB 31,26,9," [C] Change la tete source "
  DB 31,26,10," [D] Change tete destination "
  DB 31,26,12,"   [ENTER] = Arret   ",24+#80
TIMPRIM DB 31,26,11,24," [E] Imprimer l'analyse NON ",24,#80
TOUI DB "OUI"
TNON DB "NON"
TPIST1 DB 31,26,7,20," Donner la piste de debut : ",8,8+#80
TPIST2 DB 31,26,8," Donner la derniere piste : ",8,8+#80
TSOURCE DB 24," Placer disquette source dans : A ",7,24+#80
TDESTIN DB 24," Placer disquette destination dans : A ",7,24+#80
TLITPIS DB 31,2,24,"Lecture piste: ",20,#80
TWRIPIS DB 31,2,24,"Ecriture piste: ",20,#80
;
TREPAR DB 24," PISTE REPAREE A VERIFIER ",24,32,#80
;
  DB 24," PLUSIEURS TAILLES FORMAT ",24,32,#80
  DB 24," PRESENCE SECTEURS ECRASES ",24,32,#80
  DB 24," TAILLE DU GAP3 RETOUCHEE ",24,32,#80
;
  DB 24," L'ANALYSEUR S'EST PLANTE ",24,32,#80
  DB 24," FORMATEE AVEC FDC SPECIAL ",24,32,#80
  DB 24," NOMBRE SECTEURS DIMINUE ",24,32,#80
  DB 24," PISTES NON FORMATEES ",24,32,#80
;
TNIET DB " NON",8,8,8,#80
;
TMENUEND DB 31,2,16,24," OPERATIONS TERMINEES ",10,13,10,13
  DB 9,"   [Q]uitte   ",10,13
  DB 9,"   [R]eprends   ",10,13
  DB 9," [M]eme operation ",10,13
  DB 9," [N]ouvelle operation ",24,7+#80
TDENSIT DB 31,3,1," DOUBLE DENSITE",#80
TDDENS DB "DOUBLE"
TSDENS DB "SIMPLE"
TFENRES DB #1A,1,#17,4,20,12,#80
TFENSCR DB 26,0,79,0,24,#80
TFENEND DB 26,24,79,4,25,12,#80
;

SOS Programmeurs n°4

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

Page précédente : Fdc - 14 - Creation d'un Piste a Partir du Buffer
★ AMSTRAD CPC ★ DOWNLOAD ★

Dump disquette:
» SOS  Programmeurs  4    FRENCHDATE: 2003-03-28
DL: 1161
TYPE: ZIP
SiZE: 128Ko
NOTE: 40 Cyls
.HFE: Χ

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

Lien(s):
» Coding » Fdc - 30 - Fdc Exemple de Bidouilles (SOS Programmeurs)
» Coding » Fdc - 11 - la Routine de Lecture Tous Secteurs (SOS Programmeurs)
» Coding » Fdc - 25 - Formatage et Ecriture Piste (SOS Programmeurs)
» Coding » Fdc - 04 - Test Drive (SOS Programmeurs)
» Coding » Fdc - 14 - Creation d'un Piste a Partir du Buffer (SOS Programmeurs)
» Coding » Fdc - 05 - Deplacement Tete (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 068 millisecondes et consultée 2230 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.