---------------------------------- — 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
★ AMSTRAD CPC ★ DOWNLOAD ★ |
|
CPCrulez[Content Management System] v8.7-desktop/c Page créée en 351 millisecondes et consultée 1751 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. |
|
|