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 tete source
CP "D"
JR Z,CHGTD ;Changer tete 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 ;deplacement 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-tete 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: 949
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 - 24 - Reproduction (SOS Programmeurs)
» Coding » Fdc - 06 - Entree Programme (SOS Programmeurs)
» Coding » Fdc - 04 - Test Drive (SOS Programmeurs)
» Coding » Fdc - 03 - Commandes du Fdc (SOS Programmeurs)
» Coding » FDC - 26 - Sub Routines Pour le FDC (SOS Programmeurs)
» Coding » Fdc - 08 - Test Interrupt (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 419 millisecondes et consultée 1747 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.