Cette section n'a subi que peu de modifications fondamentales par rapport à la version précédente . Les quelques changements apportés sont les suivants : Le test de piste formatée ou non à été déplacé en LITIDS . L'ordre des opérations à changé ! On recueille D'ABORD l'état d'erreur des secteurs avant de calculer la taille de format et du GAP . La routine VISESEC devient VISINST . Elle est plus rapide que la précédente , pointe le secteur demandé et éxécute l'instruction . L'ensemble forunit plus d'informations que la précédente selon l'état des flags renvoyés par le calcul des GAPS . Le fenétrage et l'impression ont été adaptés aux besoins de ce nouveau programme . Pour le reste , reportez vous au numéro précédent de SOS PROGRAMMEURS si vous n'avez pas tout compris . Le listing est ici fort peu commenté , la face FDC ne fait que 178K ! Voici la signification des bits de FLAGFNC : Bit 0 : L'octet de formatage à été trouvé dans un CR/DD Bit 1 : Le GAP#3 est différent de #4E Bit 2 : Le GAP est trop long . (Ne devrait plus se produire) Bit 3 : La piste n'est pas formatée Bit 4 : Présence CERTAINE de secteurs écrasés sur la piste Bit 5 : Présence POSSIBLE de secteurs écrasés sur la piste Bit 6 : Piste normale abimée Bit 7 : L'analyseur s'est planté ! (Ne devrait tpas arriver) ALGORHYTME GENERAL DE L'ANALYSE
Note : Ce schéma inclut les 3 sections suivantes annotées (P.S.) ; LIRE LES IDS ; Y-A T-IL DES IDS SUR LA PISTE ? ; ! +-------------------------< OUI NON >-------------------------+ ! ; ! +-----> LIRE LES SECTEURS ET TESTER LEUR ETAT D'ERREUR ! ; AFFICHER LES SECTEURS ; ! ; ! ;! DETERMINER LES GAPS ET LE FORMAT EXACT DE LA PISTE (P.S.) ! ; Y-A T-IL DES SECTEURS ECRASES ? (P.S.) ; ! ; ! ;! +-------------------------< OUI NON >-----------+ ;! ! ; ! NOTER NON FORMATEE +---------------> RECALCULER LE FORMAT (P.S) ! ;! ; ! ; ! ;! ; AFFICHER LES DONNEES PISTE <--+-------------+ ; IMPRIMER S'IL Y-A LIEU ET FINI ;----------------------- ;- ANALYSE DE LA PISTE - ;----------------------- ; ANAPIST XOR A LD (FLAGFNC),A ;Remise a zero du flag analyse piste ; LD A,#17 ;Effacer écran et ouvrir fenetres IDS CALL EFFLINE CALL FENIDE CALL FENIDE1A CALL FENIDL CALL FENIDL1A CALL FENRES CALL FENSCR ; CALL VERIID ;Aller lire les IDS JR C,PISTFORM ;Si NC la piste n'est pas formatee ; CALL FENSCR ;Pas formatee LD HL,TNOFORM ;Afficher CALL PRTINV1 ;En inverse LD A,(FLAGFNC) ;Memoriser ; SET 3,A LD (FLAGFNC),A ;Mettre le bit pas de format ; LD A,(FLAGIMP) ;Impression en cours ? OR A RET Z ;Non ; CALL SETIMP ;Oui CALL IMPPIST ;Imprimer numéro de piste LD HL,TPAFORM ;Et pas formatee CALL PRT CALL ASTERIQUE ;Affiche un '*' et reset de l'impression XOR A RET ; TPAFORM DB " NON FORMATEE",#80 ; PISTFORM CALL FENSCR ;Restaurer plein écran LD HL,TLITSECT ;Texte lit secteurs CALL PRTINV ;Afficher en inverse ; LD A,(NBSEC) ;Parametrer boucle analyse LD B,A XOR A LD (COUNT),A LD HL,LITFDC1 ;Lire sans stocker les données ; LD A,#46 ;Commande lire secteurs CALL SETCOM2 ; LD HL,LISTERR ;Pointer le debut de la liste des erreurs LD (POINTER),HL LD HL,IDINDRA ;Et le début de la zone des IDS ; ;-------------------- ;- BOUCLE D'ANALYSE - ;-------------------- ; NEXTVER CALL TRANS3ID ;Ignorer ID piste et recopier les autres INC HL CALL FIXLFF ;0 ou #FF selon taille secteur comme dernier PUSH HL ;paramètres des octets a envoyer au FDC PUSH BC CALL VISINST ;Viser et executer commande CALL TSTERRS ;Recuperer etats d'erreur LD A,(IY+0) ;Ranger et au suivant LD HL,(POINTER) LD (HL),A INC HL LD (POINTER),HL POP BC POP HL DJNZ NEXTVER ; ;--------------------- ;- AFFICHAGE ANALYSE - ;--------------------- ; LD HL,IDINDRA ;Afficher IDS CALL IDS4AFF ;BC est preserve ; LD HL,LISTERR ;Et erreurs LD (POINTER),HL ; CALL FENIDE1A ;COMME DANS PRECEDENTE VERSION BCLERRS PUSH HL PUSH BC CALL INV CALL SPACE LD A,(HL) CALL PRT3ER2 CALL INV POP BC CALL TSTC1 CALL NZ,CR CALL Z,FENIDL1A LD HL,COUNT INC (HL) POP HL INC HL DJNZ BCLERRS ; CALL FENSCR ; CALL FINDLEN ;Chercher GAPS (Ca c'est le gros morceau a digerer) ; CALL FIXPARA ;Initialiser parametres ; ; ;--------------------------------- ;- AFFICHAGE DU RESULTAT GENERAL - ;--------------------------------- ; CALL FENRES1 ;Afficher ; LD HL,TNBSEC ;Nombre secteurs CALL PRT LD A,(NBSEC) CALL PRTDECIA ; LD HL,TLEN ;Taille CALL PRT LD A,(LENSEC) CALL PRTHEX1 ; LD HL,TLONG ;Octets CALL PRT LD HL,(LONGSEC) LD (VALEUR),HL CALL CINQNB CALL PRTDECI CALL DEUXNB ; LD HL,TGAPF ;GAP CALL PRT LD A,(VALGAPF) CALL PRTHEX1 ; LD HL,TLGAPF CALL PRT LD A,(GAPFORM) CALL PRTHEX1 ; LD HL,TOCREMP ;Octet format CALL PRT LD A,(OCREMP) CALL PRTHEX1 ; LD A,(FLAGFNC) AND %01010000 ;Secteurs ecrases ou piste endommagee ? JR Z,NOFAUX ;NON ! ; LD HL,TFAUGAP ;Afficher le faux GAP CALL PRT LD A,(FAUXGAP) CALL PRTHEX1 ; LD HL,TLFAUGA ;Et sa longueur CALL PRT LD A,(FAUXLGF) CALL PRTHEX1 ; LD HL,TFAULEN ;Et la fausse taille de format CALL PRT LD A,(FAUXLEN) CALL PRTDECIA ; NOFAUX LD A,(FLAGFNC) ;Secteurs ecrases possibles ? AND %00100000 JR Z,PASDIF ;NON ; LD HL,TDIFLEN CALL PRT LD A,(LMIN) ;Afficher plus petite longueur possible CALL PRTDECIA LD A,"a" CALL #BB5A CALL SPACE LD A,(LMAX) ;Et plus grande longueur possible LD (FAUXLEN),A CALL PRTDECIA ; PASDIF CALL FENSCR ;Plein écran ; LD A,(FLAGIMP) ;Imprimer ? OR A JR NZ,IMPANAL ;Oui ! ;SCF RET ; ;------------------------------------------------ ;- IMPRESSION DE L'ANALYSE SI LE FLAG A ETE MIS - ;------------------------------------------------ ; IMPANAL CALL SETIMP ;Imprimer CALL DEUXNB CALL IMPPIST ;Piste ; LD HL,NBSECI ;Comme version precedente CALL PRT LD A,(NBSEC) CALL PRTDECIA CALL CR LD HL,IDINDRA ;IDS LD DE,LISTERR LD A,(NBSEC) LD B,A LD C,4 NEXTIMP DEC C CALL Z,CRIMP1 PUSH BC WAITIMP CALL #BD2E ;Attendre un peu pour ne pas perdre des caracteres JR C,WAITIMP CALL AFF4ID POP BC LD A,(DE) INC DE PUSH HL PUSH DE PUSH BC LD (FLAGERR),A CALL PRT3ERR LD HL,TSEPIMP CALL PRT POP BC POP DE POP HL DJNZ NEXTIMP CALL CR ; WAITIM1 CALL #BD2E JR C,WAITIM1 LD HL,TLENSI CALL PRT LD A,(LENSEC) CALL PRTHEX1 LD HL,TGAPI CALL PRT LD A,(VALGAPF) CALL PRTHEX1 LD HL,TLGAPI CALL PRT LD A,(GAPFORM) CALL PRTHEX1 LD HL,TOCFORI CALL PRT LD A,(OCREMP) CALL PRTHEX1 CALL ASTERIQUE ;SCF RET ; IMPPIST LD HL,TPIST ;Sub routine imprimer piste CALL PRT LD A,(PISTSEL) CALL PRTDECIA ; LD A,(FLAGFNC) ;Imprimer s'il y-a lieu les faux GAPS ou AND %01010000 ;fausses longueurs JR Z,PASF1 ; LD HL,TFAUGAI CALL PRT LD A,(FAUXGAP) CALL PRTHEX1 ; LD HL,TLFAUGI CALL PRT LD A,(FAUXLGF) JP PRTHEX1 ; PASF1 LD A,(FLAGFNC) AND %00100000 RET Z ; LD HL,TDIFLEI CALL PRT LD A,(LMIN) CALL PRTDECIA ; WAITA LD A,"a" CALL #BD2B JR NC,WAITA ; CALL SPACE LD A,(LMAX) JP PRTDECIA ; ASTERIQUE CALL CR ;Imprimer l'asterique final et reinitialiser le mode ;WAITAST ;programme normal LD A,"*" CALL #BD2B JR NC,WAITAST CALL CR JP RESIMP CRIMP1 LD C,3 JP CR ; TPIST DB "Piste: ",#80 ;TEXTES IMPRIMANTE TLENSI DB "Taille reelle : &",#80 TGAPI DB "GAP-F &",#80 TLGAPI DB "Longueur GAP : &",#80 TOCFORI DB "Octet formatage : &",#80 NBSECI DB "Nombre de secteurs : ",#80 TSEPIMP DB " > ",#80 ; SETIMP LD HL,#BD2B ;REMPLACER LES #BB5A DU PROGRAMME PAR UN VECTEUR LD A,#C9 ;IMPRIMANTE JR INIMP ; RESIMP LD HL,#BB5A ;FAIRE LE CONTRAIRE XOR A INIMP LD (CR1+1),HL LD (PRT2+1),HL LD (OKHEX+1),HL LD (IMPERR1+1),HL LD (CARRY+1),HL LD (PRTA+1),HL LD (RETIMP),A RET ; TRANS3ID INC HL ;Comme version precedente LD A,(HL) LD (QUATRID+1),A INC HL LD A,(HL) LD (QUATRID+2),A LD (DERSEC),A INC HL LD A,(HL) LD (QUATRID+3),A RET ; FIXPARA CALL ID4TRANS ;Comme version precedente LD A,(LENSEC) LD (QUATRID+3),A LD DE,-4 ADD HL,DE LD HL,QUATRID+2 LD A,(HL) LD (PREMSEC),A INC HL LD A,(NBSEC) LD HL,IDINDRA LD DE,4 DEC A PTDERSEC ADD HL,DE DEC A JR NZ,PTDERSEC INC HL INC HL LD A,(HL) LD (DERSEC),A LD A,(GAPFORM) ;SRL A JR NZ,OKGAPRW LD A,1 OKGAPRW LD (GAPRW),A ;SCF RET FIXLFF LD A,(QUATRID+3) OR A JR Z,NOTZERX LD A,#FF NOTZERX LD (LSZERO),A RET ; VISINST PUSH HL ;Ca c'est VISESEC modifie le principe est le meme CALL TSTDIDC ;mais c'est un peu plus rapide . On Vise aussi le POP HL ;premier secteur , dans certains cas c'est ; LD A,(COUNT) ;indispensable OR A JP Z,INSTRU9 ; PUSH BC LD B,A POINSEC CALL INSTRU2 CALL RESULT DJNZ POINSEC POP BC ; JP INSTRU9 ; ;- Afficher les erreurs a l'analyse - ; PRT3ERR1 LD HL,TERRS ;Comme version precedente CALL PRT ; PRT3ERR LD A,(FLAGERR) PRT3ER2 LD HL,TOK ; OR A JP Z,PRT ; PRTERR3 LD HL,TERRFDC LD DE,3 LD B,8 LOOKERR RLC A JR NC,NOBIT PUSH BC PUSH AF LD B,3 PRTERR1 LD A,(HL) IMPERR1 CALL #BB5A INC HL DJNZ PRTERR1 POP AF POP BC JR OUIBIT NOBIT ADD HL,DE OUIBIT DJNZ LOOKERR RETIMP DB 0 ;Retour imprimante LD A,8 CALL #BB5A ;Reculer une case si trop d'erreurs RET ; TOK DB "OK",8,#88 TERRS DB #1F,1,#16,7,#18 DB " Etat d'erreur ",#18," OK",8,#88 TERRFDC DB "EP HD CR ND CM DD MA DA " TNBSEC DB 31,1,3,"Nombre secteurs: ",#80 TLEN DB 31,1,4,"Taille reelle : &",#80 TLONG DB 31,1,5,"Nombre octets : ",#80 TGAPF DB 31,1,6,"Octet GAP-F : &",#80 TLGAPF DB 31,1,7,"Longueur GAP-F : &",#80 TOCREMP DB 31,1,8,"Octet formatage: &",#80 TFAUGAP DB 31,1,10 TFAUGAI DB "VALEUR FAUX GAP: &",#80 TLFAUGA DB 31,1,11 TLFAUGI DB "LONG. FAUX GAP: &",#80 TFAULEN DB 31,1,12,"FAUSSE TAILLE : ",#80 TDIFLEN DB 31,1,10 TDIFLEI DB "LONG. POSS. :",#80 TLITSECT DB 31,2,23," LECTURE SECTEURS",#80 ;Ici le listing 'lecture des IDS' . L'instruction 'HALT' résout le problème de blocage des versions précédentes . Pourquoi ce bogue ? Parce que dans ce cas précis , les interruptions restent actives lors de la lecture du résultat (Voir SOS2 lecture des IDS) . Si par malheur le Z80 relance son cycle d'interruption au moment précis où le FDC donne la phase résultat , il y-à un conflit entre 2 types d'interruptions et le programme bloque . Solution : L'instruction 'HALT' stoppe toute opération en cours TANT QUE LE Z80 N'A PAS GENERE UN NOUVEAU CYCLE D'INTERRUPTION . Il est donc évident que la position du HALT assure qu'au moment de la lecture du résultat une interruption vient de se produire et que nous disposons d'1/300ème de seconde avant la suivante . Le moment vital de la phase résultat étant exécuté dans un délai plus bref , il est alors certain que le résultat est toujours rendu entre 2 interruptions . C.Q.F.D.... ; ;- LIRE LES ID - ; VERIID LD HL,TLITIDS CALL PRT ; LIREID1 LD IX,IDINDRA ;Table IDS A PUSH IX POP HL CALL RAZIDS ;RAZ zone ID ; LD DE,IDINDRA LD (PTRIDS),DE LD HL,(#39) ;Petite modification PUSH HL ; CALL TSTDIDC ;Chercher densite et debut piste XOR A LD (NBFOIS),A ; DI LD HL,SUBROUT LD (#39),HL LD C,#FF ;#FF Parce qu'un secteur de plus est lu EI ; NEXTID INC C PUSH BC CALL INSTRU2 ; HALT ;** VOIR TEXTE EN TETE ** ; CALL RESU1 ;RESULT sans DI LD HL,ETPIST LD DE,(PTRIDS) LD BC,4 ;Range 4 octets du resultat LDIR LD (PTRIDS),DE LD A,(NBFOIS) CP 60 ;60 fois POP BC JR C,NEXTID ; DI POP HL LD (#39),HL EI ; LD A,C ;NOUVEAU ! Si aucun secteur piste non formatee LD (NBSEC),A OR A RET Z ; CALL ID4TRANS ; PUSH HL LD A,(COMMAND) ;Afficher densite CP #4A LD A,#FF LD HL,TDDENS JR Z,SETDENS LD A,%10111111 LD HL,TSDENS SETDENS CALL CHGD POP HL ;SCF RET ; ;- Ci dessous legere modification qui permet d'utiliser la meme routine ;- pour les 2 programmes presentes ; IDFORMAT LD DE,FENIDL ;Afficher la serie d'IDS pour format LD BC,FENIDL1 JR SORTID ; IDS4AFF LD DE,FENIDE ;Afficher la serie d'IDS pour analyse LD BC,FENIDL ; SORTID LD (XFEN+1),DE LD (XFEN1+1),BC PUSH IX POP HL LD A,(NBSEC) LD B,A LD C,0 PUSH BC ; XFEN CALL FENIDE CALL INV AFFIDS CALL AFF4ID XFEN1 CALL Z,FENIDE1 DJNZ AFFIDS CALL INV ; POP BC RET ; ;- Affichage des IDS en 2 colonnes - ; AFF4ID PUSH BC LD B,4 CALL SPACE BCLAFID LD A,(HL) ;Aff. et cop.Ids dans buf.format CALL PRTHEX1 INC HL DJNZ BCLAFID POP BC TSTC INC C LD A,C CP 16 ;Tester si 16 IDS sortis RET TSTC1 CALL TSTC RET Z CP 32 RET NZ LD A,11 CALL #BB5A ;Annuler le dernier CR sinon scroll FEN2 si 32 secteurs XOR A INC A ;SET NZ RET ; ID4TRANS LD HL,IDINDRA IDTRANS4 PUSH BC PUSH DE LD DE,QUATRID LD BC,4 LDIR POP DE POP BC RET ; SUBROUT DI PUSH HL LD HL,NBFOIS INC (HL) POP HL EI RET ; NBFOIS DB 0 PTRIDS DEFW 0 ;SOS Programmeurs n°4 ★ AMSTRAD CPC ★ DOWNLOAD ★ |
| Aucun fichier de disponible:
» Vous avez des fichiers que nous ne possédons pas concernent cette page ? | ★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser... |
CPCrulez[Content Management System] v8.7-desktop/c Page créée en 321 millisecondes et consultée 1901 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. |
|
|
|