Les sections précédentes ayant recueulli toutes les informations utiles , il est maintenant possible de lire et de stocker le contenu des secteurs accessibles . Si la piste n'est pas formatée , on se contentera de mémoriser le numéro et le flag d'état de la piste . Sinon , avant le stockage , on vérifiera que le nombre de secteurs et la taille du GAP calculés par les routines précédentes ne sont pas excessifs . Quoique très rare , cette éventualité peut survenir avec des pistes très spéciales . Il ne faut pas oublier qu'un passage par la routine ECRASER aura modifié le nombre des secteurs sur la piste . Dans ce cas , ces secteurs supplémentaires doivent être TOTALEMENT IGNORES car ils n'existeront que de manière éphémère lors du formatage de la copie ! ; ;- Stocker une piste complete . Si buffer plein retour avec NC - ; STOKPIST LD HL,TSTOKP ;Message stocke piste CALL PRT XOR A LD (FLAG),A ;FLAG ne sert que pour positionner un texte ; ;------------------- Après cette brève initialisation , on commence par ranger les paramètres généraux concernant la piste . ;------------------- ; LD HL,(POINPIS) ;Pointeur buffer debut piste LD A,(PISTSEL) ;Ranger piste et octet etat piste LD (HL),A ;Numéro de piste INC HL LD A,(FLAGFNC) ;Flag des erreurs piste LD (HL),A ;Ces deux donnees étant rangees , on stocke la INC HL ;position du nouveau pointeur . Si la piste n'est LD (POINPIS),HL ;pas formatee ce sera tout . ;------------------- Ici on recrée un nouvel octet d'information sur l'etat de la piste que l'on range dans une liste séparée pour pouvoir le relire en fin de copie . ------------------- ; ;- Composer etat piste - ; LD HL,(POINERP) ;Mettre le numéro de piste dans la serie LD A,(PISTSEL) ;des erreurs pistes LD (HL),A ;Piste INC HL LD (HL),0 ;RAZ au passage ; LD A,(FLAGFNC) ;BIT 3,A ;Formatee ? JR Z,PF ;OUI ; INC A ;Voir si FNC = #FF si oui piste a ne pas traiter JR NZ,TRAITE ;(Inutilise dans cette version du programme) LD (HL),#FF ; TRAITE SET 7,(HL) ;La piste n'est pas formatee , on laisse tomber INC HL LD (POINERP),HL XOR A RET ;Fini . Rien n'a ete stocke ; ;- Piste formatee a traiter . Continuer - ; PF CALL RECTINB ;Tester si le nombre de secteurs donnes est admissible JR C,OKNBSEC ;CARRY si OK NC si non et C contient NBSEC MAXI . Dans ; ;99% des cas c'est toujours OK grace au routines SET 6,(HL) ;precedentes . LD A,C ;Rectifier NBSEC pour ne pas planter le programme mais LD (NBSEC),A ;la copie sera ratee ; OKNBSEC LD A,(GAPFORM) ;Voir si la longueur du GAP est admissible pour LD B,A ;le format PUSH BC ;Preserver GAP#3 trouve PUSH HL ;Preserver pointeur etat piste CALL CALIGAP CALL SETGRW ;Refaire GAP RW au cas ou GAP#3 aurait ete change POP HL POP BC ; LD A,(GAPFORM) ;GAP#3 a change ? CP B JR Z,PARECTIF ;NON ; SET 3,(HL) ;Signaler que la taille du GAP a ete rectifiee ;------------------- Les paramètres du format testés , on recopie les indications utiles de FLAGFNC dans notre octet d'état piste . L'opération RLCA met le CARRY chaque fois que le bit le plus à gauche de l'octet est à 1 . ------------------- ; PARECTIF LD A,(FLAGFNC) ;Recopier les indications utiles de FLAGFNC ;RLCA ;dans la liste de erreurs possibles JR NC,PARATE SET 4,(HL) ;Analyse ratee . Personnellement ca m'etonnerait PARATE RLCA ;mais va savoir ... JR NC,PASREPA SET 0,(HL) ;Piste reparee plus ou moins bien PASREPA RLCA JR NC,PASMULT SET 1,(HL) ;Plusieurs tailles de format possibles (ecrases) PASMULT RLCA ;(Ambiguite assez rare .) JR NC,PAEC SET 2,(HL) ;Presence certaine de secteurs ecrases PAEC RLCA ;RLCA ;Les 2 bits suivants sont inutiles ;RLCA JR NC,CONF SET 5,(HL) ;GAP non conforme (Ca c'est mortel pour la copie) CONF INC HL ;C'est fini LD (POINERP),HL ;On range notre nouveau pointeur de liste . ;------------------- Tout est maintenant vérifié et les causes possibles d'une erreur de copie sont notées et rangées . On commence le stockage proprement dit . La structure du stockage a été décrite précédement . ------------------- ; ;- Memoriser les donnees pistes dans le buffer - ; LD HL,(POINPIS) ;Reprendre le pointeur buffer . LD DE,(LONGSEC) ;Stocker longueur de secteur en octets LD (HL),E INC HL LD (HL),D INC HL ; PAFLEN EX DE,HL ;Copier LENSEC - NBSEC - GAPFORM - OCREMP LD HL,LENSEC ;Le pointeur passe de HL dans DE pour les LDIR LD BC,4 LDIR ; LD A,(NBSEC) ;Copier les IDS LD C,A LD B,0 PUSH BC ;Preserver nombre secteurs dans BC pour LDIR ;SLA C ;C = C*4 puisqu'on a 4 IDS par secteur ;SLA C LD HL,IDINDRA ;On en profite pour initialiser le pointeur LD (POINTID),HL ;des IDS pour le stockage des donnees LDIR POP BC ; LD (STOKERR),DE ;La liste des etats d'erreur est stockee a la PUSH BC ;suite des IDS LD HL,LISTERR LDIR POP BC ;BC contient toujours le nombre de secteurs ; EX DE,HL ;Le pointeur des adresses buffer est remis dans HL PUSH HL ;et recopie dans IX POP IX ADD HL,BC ;Faire place pour adresses buffer ADD HL,BC ;2 fois car 2 octets par adresse INC HL ;Et encore 2 pour memo deépart prochaine piste INC HL LD (ADBUFF),HL ;C'est a partir de ADBUFF qu'on stocke ;------------------- Tout ce qui concerne la piste est ici stocké à l'exception des données . Bref rappel de la signification des pointeurs . POINPIS : Pointeur global ou devra reprendre le stockage suivant . POINTID : 1er octet des 4 IDS du secteur à stocker . STOKERR : Pointeur de la liste des erreurs . ADBUFF : Adresse de départ pour le stockage d'un secteur IX contient le début de la zone ou l'on mémorise les adresses de départ des données de chaque secteurs . Dans le cas d'une piste abimée , plusieurs tentatives de relecture peuvent parfois sauver les meubles ... RELIRE sera utile . ------------------- ; ;- Routine lecture physique - ; LD IY,RELIRE ;Nombre de relectures si secteur VRAIMENT abime XOR A LD (COUNT),A ;Compteur a zero pour viser les secteurs LD A,(NBSEC) LD B,A ; BCLLITP LD (IY+0),5 ;5 Relectures en cas de probleme ; LD HL,(ADBUFF) ;Adresse de stockage du secteur PUSH BC LD (IX+0),L ;Memoriser deépart des donnees du secteur en cours LD (IX+1),H ;dans la liste ; CALL #BB78 ;Memoriser position curseur texte PUSH HL ; LD HL,(POINTID) ;1er octet des 4 IDS a lire PUSH HL ; CALL TRANS3ID ;Les mettre dans la zone qui sert aux instructions INC HL ;de lecture sauf la piste . LD (POINTID),HL ;Ranger noveau pointeur ; LD HL,#1916 ;Afficher secteur en cours de lecture CALL #BB75 ;A la position voulue POP HL ;Reprendre les IDS en cours CALL AFF4ID ;et les afficher POP HL ;Reprendre la position du curseur texte CALL #BB75 ;et le remettre a sa place ; ------------------- Ci dessous on étudie d'après FLAGFNC la nécéssité de lire et stocker le secteur . On n'effectuera pas le stockage dans les cas suivants : CR/DD . Qui est toujours un secteur vierge . MAM/DAM . Secteur sinistré volontairement ou non . SECTEUR DE TAIILE 0 . toujours illisible et de toute manière ne peut être écrit convenablement . SECTEUR A ECRASER . Qui est un faux secteur créé par ECRASER et destiné à disparaître lors de la réécriture de la piste . Dans ce cas , on ne doit surtout pas avancer COUNT car ce secteur n'existera qu'après le formatage ! ------------------- ; LD A,(FLAGFNC) AND %01000000 ;Si piste sinistree , tenter reparation et essayer JR NZ,LIRE ;de lire quelque soit l'état d'erreur . ; LD HL,(STOKERR) ;Pointeur de la liste des erreurs . Peut avoir LD A,(HL) ;pris la valeur #7F si le secteur est un additif CP #7F ;cree par ECRASER . Ignorer totalement si oui ET JP Z,SAUTLIT ;NE PAS INCREMENTER LE COMPTEUR . ; AND %00110111 ;Si pas d'erreur PROVOQUEE sauf EP-HD-CM , c'est bon JP NZ,RIENLIRE ;Sinon ne pas stocker les donnees et INC. COMPTEUR ; LIRE LD A,(QUATRID+3) ;Taille 0 ignoree en lecture , juste avancer OR A ;compteur JP Z,RIENLIRE ;------------------- A ce point , on sait que le secteur peut être lu et stocké . On teste la présence du CM et on y va . Si une erreur de lecture se produit 5 fois de suite , on considère que c'est une cause perdue et l'erreur est affichée . ------------------- ; LD B,#46 ;CM or not CM ? LD HL,(STOKERR) LD A,(HL) AND %00001000 JR Z,CMNOT LD B,#4C ;OUI ; CMNOT LD A,B ;Commande lire secteur LD HL,LITFDC CALL SETCOM2 ; NEWLIT LD DE,(LONGSEC) CALL VISINST ;Viser et executer commande lecture ; LD DE,#0213 ;Locate pour erreur drive CALL TSTMISS ;Voir si erreur drive . NC si oui JR NC,NEWLIT ;Boucler tant que FDC pas content . ; PUSH IY ;IY est modifie par TSTERRS CALL TSTERRS ;Plus d'erreur drive , tester autres erreurs POP IY LD A,(FLAGERR) AND %00110111 ;Si pas d'erreur sauf EP-HD-CM , c'est bon JR Z,CESTLU ; DEC (IY+0) ;Si erreur . 5 essais de lecture pour secteur JR NZ,NEWLIT ;VRAIMENT endommage . ; LD A,(FLAG) ;Pas afficher le texte ERREUR plusieurs fois OR A JR NZ,PRSECER ; LD HL,TLECTER ;Texte erreur lecture CALL PRT LD A,#FF LD (FLAG),A ; PRSECER LD A,"&" ;Afficher le numéro de secteur en erreur CALL #BB5A LD A,(QUATRID+2) CALL PRTHEX1 ; LD HL,(STOKERR) ;Erreur imprevue apparue , modifier la liste des LD A,(FLAGERR) ;erreurs en consequence . LD (HL),A ;------------------- Avec ou sans erreur , le secteur à été lu et stocké . La routine de lecture renvoyant le nombre d'octets REELLEMENT LUS dans NBLUS , il suffit d'ajouter cette valeur à ADBUFF pour avoir la prochaine adresse de stockage des données . Dans le cas ou le secteur est vierge , c'est le même octet qui se répète . Inutile alors d'encombrer le buffer , seul un octet est stocké et on utilise encore la liste des états d'erreur pour signaler la chose . ------------------- ; CESTLU LD HL,(ADBUFF) ;Adresse buffer LD BC,(NBLUS) ;Nombre octets lus -1 DEC BC ; LD A,(HL) ;Voir si tous les octets du secteur sont identiques BCLIDEM CP (HL) ;Si oui on stocke sous forme compresse JR NZ,NONMEME ;Si non on saute INC HL DEC BC ;BIT 7,B ;Si mise a 1 du BIT 7 , BC vient de passer a 0 JR Z,BCLIDEM ; LD HL,(STOKERR) ;Tous les octets sont identiques . On utilise LD A,(HL) ;le pointeur d'erreurs pour signaler ce fait AND %00001000 ;et on ne stocke qu'un octet . XOR #FF ;NOTER Q'XOR #FF CONSERVE LE BIT CM LD (HL),A LD HL,(ADBUFF) INC HL JR SUITLIRE ; NONMEME LD HL,(ADBUFF) ;Sinon adresse buffer = adresse buffer + nombre lus LD DE,(NBLUS) ADD HL,DE ; SUITLIRE LD (ADBUFF),HL ;= Nouvelle adresse stockage pour prochain secteur ; RIENLIRE LD HL,COUNT ;Au suivant INC (HL) ; SAUTLIT LD HL,(STOKERR) ;Etat d'erreur suivant INC HL LD (STOKERR),HL INC IX ;Zone memmo adresse donnees suivante INC IX POP BC ;Nombre secteurs restant a lire DEC B ;-1 JP NZ,BCLLITP ;S'il en reste ;------------------- Le stockage de la piste est terminé , on met à jour les pointeurs et c'est fini . ------------------- ; LD HL,(ADBUFF) LD (POINPIS),HL ;Adresse debut stockage prochaine piste LD (IX+0),L ;Memoriser deépart des donnees prochaine piste LD (IX+1),H XOR A LD (FLAG),A ;SCF RET ; TSTOKP DB 31,2,21,24," STOCKAGE PISTE ",24 TSTOSEC DB 31,2,22,24," STOCKAGE SECTEUR ",24,#80 TLECTER DB 31,2,24,18,24," ERREUR LECTURE SUR SECTEUR : ",24," ",7,#80 RELIRE DB 0 POINTID DW 0 STOKERR DW 0 FLAG DB 0 ;SOS Programmeurs n°4
★ AMSTRAD CPC ★ DOWNLOAD ★ |
|
CPCrulez[Content Management System] v8.7-desktop/c Page créée en 275 millisecondes et consultée 1600 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. |
|
|