Fonctionnement : Cette routine utilise de nombreuses sous routines de la version précédente . Le première partie du programme configure celles-ci selon les besoins de la cause : 1 - Mémoriser l'état d'analyse (ON/OFF) et forcer sur ON en annulant le RET de STOPANA . 2 - Interdire l'affichage du résultat d'analyse (RET en RETPHY) . 3 - Modifier le saut en cas de piste non formatée . 4 - Activer le saut permettant l'écriture du buffer . 5 - Détourner les sauts liés aux flèches verticales de manière à lire un nouveau secteur à chaque fin de page . 6 - Utiliser FLAG pour piste non formatée (=#FF) ou formatée (=0); 1ère partie : Initialisation
; ;- Lire secteurs par ordre physique - ; LITPHY LD A,(STOPANA) LD (STATANA),A ;Mèmoriser ètat analyse prealable XOR A LD (STOPANA),A ;Analyse préalable impérative LD A,#C9 LD (RETPHY),A LD HL,RETPOINT ;Saute vers un POP suivi de RET au cas ou LD (PASFOR1+1),HL ;non formaté ; LD A,#CA LD (TSTWRIT),A LD HL,WRITSEC ;Active saut écriture par CTRL+W dans routine LD (TSTWRIT+1),HL ;buffer ; LD HL,REMONT1 ;Modifier l'effet des flèches verticales LD (MODBUF+1),HL ;sur le buffer pour lire un nouveau secteur LD HL,AVANCE1 ;à chaque sortie de page . LD (MODBUF1+1),HL ; XOR A ;Flag formaté ou non à 0 LD (FLAG),A ; CALL ANAL1 ;Analyser toute la piste JR C,FRM ;CARRY mis si piste formatée . ; LD A,#FF LD (FLAG),A ;Pas formatee ; Il faut maintenant connaître le contenu des IDS seteurs pour pouvoir les reproduire . On passe par la routine analyse . On demande ensuite si il est nécéssaire de formater la piste destination selon les IDS lus , si oui on saute à la routine de copie de format , si non , on se contente de donner le numéro de la piste ou doit se faire une éventuelle écriture .
Routine de formatage : Si le numéro de piste à formater est différent de la piste source , on demande si il faut le conformer . On vérifie ensuite la longueur de GAP lue par l'analyse par comparaison avec le contenu une table de valeurs . Si ce dernier n'est pas conforme , on le rectifie avant de formater . (Description de CALIGAP plus loin) . Ne tient compte que des formats en double densité . Dans le cas ou la piste source n'est pas formatée on saute à une routine de déformatage qui détruit la piste destination . Seconde partie ; ;- Reproduction fornat - ; FRM LD HL,TREPROD ;Reproduire ? CALL PRT CALL WAITREP JR C,FORMOU1 ;OUI ; ;- Ne pas reproduire format - ; RECOMP LD HL,TOUPIST ;NON entrer piste ècriture CALL PRT ;Afficher message CALL INPUNB ;Entrer un ou deux chiffres LD A,(PISTMAX) LD B,A LD A,(VALEUR) CP B JR NC,RECOMP ;Vérifier piste valide (<42) ; LD (PISTW),A ;Stocker dans piste écriture . LD (ADID),IX ;Mémoriser le début de zone IDS . JP NOREPROD ;Ignorer la routine de formatage ; ;- Aller piste/drive a formater - ; FORMOU1 CALL WRITPAR ;Initialiser textes source destination . CALL PUTDEST ;Afficher message insérer destination CALL GOPISTE ;Aller sur piste source CALL PWRITE ;Initialiser piste écriture JR C,OKPIS ; CALL ERPFORM ;Si NC , il n'y à sans doute pas de disquette JP ABANDON ;dans le lecteur demandé . ; ;- Conformer IDS si piste dest.<>source - ; OKPIS LD A,(FLAG) ;Voir si piste souce formatée CP #FF JP Z,DEFORM ;Si non , aller déformater . ; CALL CPPIST ;Piste lecture = Piste source ? PUSH IX ;Début IDS dans HL POP HL JR Z,FOROK ;Si P.L.=P.S. Sauter la question . ; PUSH HL LD HL,TIDCONF ;Si P.L <> P.S. Demander conformer IDS ? CALL PRT CALL WAITREP PUSH AF ;Preserver CARRY CALL EFFLB1 POP AF POP HLX ;IDS dans HL CALL C,CONFID ;Conformer OUI ! Mettre piste destination dans IDS ; ;- Verifier le GAP lu - ; FOROK PUSH HL ;Préserver table IDS LD (ADID),HL CALL CALIGAP ;Rectifier le GAP si il y-a lieu POP HL JR FOROK1 ;Aller formater . ; ;- Deformater piste - ; DEFORM CALL RAZIDS ;Remplacer tous les IDS par #FF LD A,#FF LD (LENSEC),A ;Taille secteur = #FF aura pour effet LD A,1 ;de déformater la piste . LD (NBSEC),A ; ;- Formater la piste - ; FOROK1 CALL FORMATE ;Formater JR C,OKREPRO ;Si CARRY tout va bien ; LD A,(ET1) ;Si non peut e^tre protégée en écriture LD BC,TPROT AND %00000010 JR Z,OKREPRO ; CALL PRTERR ;Rate JP ABANDON ; OKREPRO CALL EFFLB1 ;Effacer lignes du bas et tester si CALL SOURCE ;drive source = drive dest. Si oui remettre source ; Il ne reste plus qu'à lire le premier secteur avant de passer en mode édition . Comme dans SOS2 , on utilisera la routine VISESEC pour être sur de pointer le bon ID dans le cas ou plusieurs IDS porteraient le même numéro de secteur . (Voir théorie ANALYSE dans SOS2) .
Détail important : L'ID Longueur Secteur ne correspond peut être pas à la taille du format (Voir SOS2) . Dans ce cas on mémorise le contenu de l'octet LS et on le remplace par LS lu dans l'ID afin de lire le secteur convenablement . Le contenu de LS sera restauré en sortie de routine . (Voir LITPHYA à la suite) . Il faudra aussi déterminer si le secteur est normal ou 'effacé' , un simple test sur ET2 y pourvoit . 3ème partie ; ;- Lire et afficher le 1er secteur - ; NOREPROD CALL FILLBUF ;Remettre tous les octets du buffer a #FF LD A,1 ;Intialiser compte secteurs LD (COUNT),A LD (POINTID),IX ;Initialiser pointeur IDS LD HL,LISTERR LD (POINTER),HL ;Mémoriser pointeur IDS ; CALL LITPHYA ;Lire le 1er CALL AFFBUF ;Aller afficher et éditer le buffer . JP ABANDON ;Retour d'édition . ; ;- Routine lecture physique (est appelée par AFFBUF à chaque page secteur) - ; LITPHYA PUSH HL ;Copier les IDS à lire : HD,LS,NS . Ignorer piste qui PUSH DE ;est déjà initialisé . LD HL,(POINTID) CALL TRANS3ID CALL DIFLENL ;Voir si LS ID <> LS réel , si oui , modifier . ; LD A,(COUNT) ;COUNT contient le numéro d'ordre du secteur CP 1 ;a lire (Position physique sur la piste) CALL NZ,VISESEC ;Si ce n'est pas le premier , viser juste . ; LD A,#46 ;Commande lire secteur LIRECM LD HL,LITFDC ;Routine lire FDC et stocker octets dans (HL) CALL SETCOM2 ;initialiser commande ; RELITS CALL INSTRSEC ;Exécuter commande LD A,(ET2) ;Voir si secteur effacé AND %01000000 ;Tester CM LD A,#4C ;Si CM , relire convenablement avec commande JR NZ,LIRECM ;appropriée . ; LENNO0 LD A,(VRAILEN) ;Restaurer LS d'origine qui a peut-e^tre été modifiée LD (LENSEC),A ;par la routine DIFLENL CALL AFFRESL ;Afficher le détail de la lecture POP DE ;C'est fini . POP HL RET ;4ème partieSortie du mode édition - lecture secteurs , on restaure les adresses modifiées par la 1ère partie et c'est fini . ; ;- Fin de lecture - ; ABANDON LD A,(STATANA) ;Restaurer etat ANALYSE ON/OFF LD (STOPANA),A XOR A LD (RETPHY),A LD (TSTWRIT),A LD HL,0 LD (TSTWRIT+1),HL LD HL,PASFORM LD (PASFOR1+1),HL ; LD HL,REMONTE ;Restaure l'effet des fleches verticales LD (MODBUF+1),HL ;sur le buffer LD HL,AVANCE LD (MODBUF1+1),HL XOR A LD (FLAG),A LD (RETANA),A RET ;
5ème partie
; ;- Afficher resultats lecture - ; AFFRESL CALL FEN1 ;Plein écran pour affichage CALL EFFLB1 ;Effacer lignes du bas ; LD HL,TLITPHY ;Afficher numéro de secteur CALL PRT LD A,(QUATRID+2) CALL PRTHEX1 CALL DEUXNB ;Initialiser affichage decimal 2 chiffres LD HL,TLITPH1 CALL PRT LD A,(COUNT) ;Et afficher position du secteur sur la piste CALL PRTDECIA LD HL,TLITPH2 ;Nombre octets lus CALL PRT LD HL,(NBLUS) LD (VALEUR),HL CALL CINQNB ;Restaurer affichage 5 chiffres CALL PRTDECI ;Afficher nombre octets lus CALL DEUXNB LD HL,TLITPH3 ;Afficher taille IDS CALL PRT LD A,(QUATRID+3) CALL PRTDECIA LD HL,TLITPH4 ;Afficher taille reelle CALL PRT LD A,(LENSEC) CALL PRTDECIA LD HL,TLDR CALL PRT LD A,(DRSELEC) ADD A,#41 CALL #BB5A ;Afficher drive sélectionné LD HL,TWPIST CALL PRT LD A,(PISTSEL) ;Et piste CALL PRTDECIA CALL CINQNB LD HL,(POINTER) ;Les etats d'erreur sont memorisés lors de l'analyse LD A,(HL) LD HL,TLITPH5 CALL PRT CALL PRT3ER2 ;Afficher etat d'erreur JP AFFRES1 ;Et phase resultat ; 8ème partie : Calibrer le GAP
La longueur du GAP de formatage peut être modifiée par une opération d'écriture et devenir quelque peu excessive pour un formatage . Cette routine teste si l'on est dans un cas où un GAP trop grand est possible . Si oui , on vérifie la longueur de ce dernier et on rectifie si il y-à lieu . (Voir théorie FDC3) . ; ;- Calibrer le GAP - ; CALIGAP LD A,(LENSEC) ;La série de comparaisons ci dessous met dans OR A ;HL l'adresse de la table concernée et dans C LD HL,T0 ;le nombre de secteurs au dessus du quel un GAP LD C,15 ;trop grand peut poser un problème en fonction JR Z,GAPVERI ;de la taille du format . ; DEC A LD HL,T1 ;LS=1 LD C,12 JR Z,GAPVERI DEC A ; LD HL,T2 ;LS=2 LD C,8 JR Z,GAPVERI DEC A JR Z,GAPVERI ; LD HL,T3 ;LS=3 LD C,5 DEC A RET NZ ;LS 4 & 5 admettent des GAPS à #FF donc pas de ; ; problème . ;- Rectifier le GAP lu si trop grand - ; GAPVERI LD A,(NBSEC) ;Voir si le nombre de secteurs est < que le nombre CP C ;à problème . RET C ;Oui , tout va bien . ; BCLGAPV CP C ;Pointer valeur maximale du GAP en fonction JR Z,GAPVERI1 ;du nombre de secteurs trouvés . INC HL INC C JR BCLGAPV ; GAPVERI1 LD A,(GAPFORM) ;Voir si GAP trouvé > GAP autorisé LD B,A LD A,(HL) CP B RET NC ;Non , tout va bien ; LD (GAPFORM),A ;Oui , remplacer par la valeur lue dans la table RET ;------------------------------------ 7ème partie : Sous routines diverses ------------------------------------ ; ;- Retour sur piste source - ; SOURCE CALL CPDRIVE ;Voir si drive lecture <> drive écriture CALL Z,PUTSOUR ;Sinon demander remise en place du disque source RESSOUR LD A,(PISTL) ;Restaurer paramètres lecture LD (PISTSEL),A CALL SETLECT CALL GOPIST1 ;Et revenir sur piste lecture JP AFFPIST ; ;- Remettre source - ; PUTSOUR LD HL,TREMET ;Afficher texte CALL PRT CALL #BB06 ;Attendre JP EFFLB1 ;Effacer textes : WAITREP CALL #BB06 ;Attendre Oui ou Non . CARRY si Oui AND #DF CP "N" RET Z CP "O" JR NZ,WAITREP ;SCF RET ; ;- Messages source/destination - ; WRITPAR LD A,(DRW) ;Mettre 'A' ou 'B' dans les textes concernant ADD A,#41 ;les drives . LD HL,TCOPDRV+43 ;Initialiser textes source destination . LD (HL),A LD HL,TREMET+40 LD A,(DRL) ADD A,#41 LD (HL),A JP SETWRIT ;Initialiser paramètres write ; PUTDEST LD HL,TCOPDRV ;Mettre destination CALL PRT CALL #BB06 JP EFFLB1 ; CPPIST LD A,(PISTL) ;Comparer pistes source/destination LD B,A LD A,(PISTW) CP B RET ; CONFID LD A,(NBSEC) ;Conformer IDS LD B,A ;Mettre le numéro de piste écriture dans LD A,(PISTW) ;les IDS de formatage LD DE,IDOUTDA ; BCLIDX LD (DE),A INC HL INC DE PUSH BC LD BC,3 LDIR POP BC DJNZ BCLIDX LD HL,IDOUTDA RET ; SETLECT LD A,(DRL) ;Initialiser sélection en lecture . LD (DRSELEC),A ;Drive LD A,(HDL) ;et te^te LD (HEAD),A RET ; SETWRIT LD A,(DRW) ;La me^me pour lecture LD (DRSELEC),A LD A,(HDW) LD (HEAD),A RET ; PLECTUR LD A,(PISTSEL) ;Recopier piste sélectionnée dans piste lecture LD (PISTL),A RET PWRITE LD A,(PISTSEL) LD (PISTW),A ;Ou piste écriture RET ; CPDRIVE LD A,(DRL) ;Voir si drive source=drive destination LD B,A LD A,(DRW) CP B RET Z ;SCF RET ; INSTRSEC CALL SETLS ;Paramétrer avant exécution instruction CALL SETGRW JP INSTRU9 ; SETLS LD A,(QUATRID+3) ;Si taille secteur = 0 , dernier octet OR A ;de la phase instruction = 0 JR Z,SETLS0 LD A,#FF ;#FF sinon SETLS0 LD (LSZERO),A RET ; SETGRW LD A,(GAPFORM) ;GAP R/W = GAP formatage / 2 CP 1 JR Z,SETGRW1 ;RRC A SETGRW1 LD (GAPRW),A RET ; DIFLENL LD A,(LENSEC) ;Mémoriser longueur formatage LD (VRAILEN),A LD B,A LD A,(QUATRID+3) CP B RET Z LD (LENSEC),A ;et remplacer par longueur lue dans l'ID RET VRAILEN DB 0 ; - FIN DE SECTION . SUITE : ECRITURE SECTEUR - ;SOS Programmeurs n°3
★ AMSTRAD CPC ★ DOWNLOAD ★ |
|
CPCrulez[Content Management System] v8.7-desktop Page créée en 382 millisecondes et consultée 1813 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. |
|
|