| ★ CODING ★ CREER UNE PISTE A PARTIR DU BUFFER ★ |
| Fdc - 14 - Creation d'un Piste a Partir du Buffer (SOS Programmeurs) |
Principe de fonctionnement : Après l'initialisation du programme , un appel à la routine FORMIRR permet à l'utilisateur de créer son format sur une piste donnée . Le formatage effectué , la zone buffer est recopiée par tranches d'octets équivalente à la longueur ID de chaque secteur . Le résultat est affiché après chaque écriture .; ------------------------------------------------------ ; 1 : Demander si les secteurs doivent être écrits en CM ; ------------------------------------------------------ ; ;- Creer une piste - ; CREPIST LD HL,TCM ;Control Mark (O/N) ? CALL PRT TSTCM CALL #BB06 AND #DF CP "N" LD B,#45 ;Non : Commande écriture normale JR Z,NOCM CP "O" LD B,#49 ;Oui : Commande écriture C.M. Effacé JR NZ,TSTCM ; NOCM LD A,B LD (TYPSECT+1),A ;Adapter le programme en fonction du choix ; ;------------------------------- ;2 : Initialisation du programme ;------------------------------- ; LD HL,TLENBUF CALL PRT LD HL,(NBLUS) LD (VALEUR),HL LD (STOK),HL ;Préserver longueur buffer PUSH HL CALL DEUCON16 ;et aficher POP DE LD HL,20000 ADD HL,DE ;Préserver adresse de fin du buffer LD (LASTBUF),HL ; LD A,#CD ;Modifier FORMIRR en y ajoutant LD HL,CALIGAP ;un CALL CALIGAP en entrée . LD (RECTGAP),A ;La longueur du GAP sera rectifiée automatiquement LD (RECTGAP+1),HL ;en cas de mauvaise entrée par le menu . ; NEWPFRM LD HL,TPFRM ;Donner le numéro de la piste à créer CALL INPUPRT2 LD A,(PISTMAX) LD B,A LD A,(VALEUR) CP B JR NC,NEWPFRM ;et tester si pas > que 41 ; LD (PISTSEL),A ;Piste donnée = dernière piste à formater (1 seule) LD (DERPIST),A LD (PISTW),A ;et piste où écrire ; LD HL,TAVERT2 ;Avertir qu'il vaut mieux ne pas remodifier CALL PRT ;ce numéro à partir du menu . ; ;------------ ;3 : Formater ;------------ ; CALL FORMIRR ;Formater selon les paramètres fournis par l'utilisateur JP NC,SOURCE ;Erreur au formatage : Abandon ; CALL GOPIST1 ;En sortie , FORMIRR recalibre sur la piste 0 , il ; ;faut donc revenir une nouvelle fois sur la piste à écrire ; ;- Initialiser boucle d'écriture - ; LD A,(NBSEC) ;Nombre de secteurs dans B LD B,A LD HL,20000 LD (ADBUFF),HL LD (POINBUF),HL CALL WRITPAR ;Initialiser en écriture LD HL,IDOUTDA ;IDS secteurs LD A,1 LD (COUNT),A ;1er secteur sur la piste ; ;- Ecrire (Identique à WRITPHY vu précédement) - ; BCLCREE CALL IDTRANS4 ;Initialiser IDS WRITE PUSH HL PUSH BC LD A,(QUATRID+2) ;Premier secteur LD (DERSEC),A ;= Dernier . On en écrit qu'un à la fois CALL DIFLENL ;Tester rapport entre taille ID et taille réelle JR C,INFLEN JR Z,INFLEN ; LD HL,TECRASE ;Secteur > Taille CALL PRT CALL OUNO ;Confirmer ecrasement JR NC,SECNEXT ; INFLEN LD A,(COUNT) CP 1 CALL NZ,VISESEC ;Pointer secteur ; TYPSECT LD A,#45 ;#45 ou #49 selon état C.M. donné en entrée LD HL,WRITFDC CALL SETCOM2 CALL INSTRSEC ;Initialiser commande et ecrire ; LD A,(ET1) BIT 1,A JP NZ,ABANDON4 ;Etait protegee en ecriture ; CALL AFFRESW ;Affiche resultat ecriture (Me^me routine que WRTIPHY) ; LD HL,(ADBUFF) ;Tester si total ecrit >= contenu buffer LD DE,(NBLUS) ADD HL,DE LD (ADBUFF),HL LD DE,(LASTBUF) AND A SBC HL,DE JR C,SECNEXT ;Non continuer l'écriture sur secteur suivant . ; POP BC POP HL ABANDON5 LD HL,TPLURIE ;Oui : Avertir qu'il n'y a plus rien à écrire CALL PRT CALL #BB06 JR FINCREE ;et stopper ; SECNEXT LD A,(VRAILEN) ;Restaurer longueur LD (LENSEC),A POP BC POP HL ; LD A,(COUNT) ;Encore secteurs à écrire ? CP B JR Z,FINCREE ;Non INC A LD (COUNT),A JR BCLCREE ; FINCREE CALL EFFLB1 ;Effacer textes ; ;- Configurer routine analyse suivant les besoins - ; LD A,(STOPANA) ;Analyse ON . LD (STATANA),A XOR A LD (STOPANA),A LD A,#C9 LD (RETCREE),A ;Bloquer l'affichage du résultat LD (RETCRE1),A LD HL,RETCREE LD (PASFOR1+1),HL ;Modifier saut si non formaté ; ;- Analyser la nouvelle piste - ; CALL FEN2 LD A,(PISTW) LD HL,QUATRID CALL ANAL2 ;Sauter le début normal de l'analyse ; LD A,(STATANA) ;Restaurer les paramétres courants de analyse LD (STOPANA),A LD HL,PASFORM LD (PASFOR1+1),HL XOR A LD (RETCREE),A LD (RETCRE1),A LD HL,0 LD (RECTGAP),A ;et de FORMIRR LD (RECTGAP+1),HL ; ;- Afficher les données de la piste créée - ; CALL FEN1 LD HL,TRESCRE CALL PRT LD A,(LENSEC) ;LS CALL PRTHEX1 LD HL,TLSEC CALL PRT LD HL,(LONGSEC) ;Nombre d'octets LD (VALEUR),HL CALL DEUCON16 ; LD HL,TG1 ;GAP CALL PRT LD A,(VALGAPF) CALL PRTHEX1 LD HL,TG2 CALL PRT LD A,(GAPFORM) ;Longueur GAP CALL PRTHEX1 ; LD HL,TLENORG ;Origine buffer CALL PRT LD HL,(STOK) LD (NBLUS),HL ;Restaurer au passage les valeurs début LD (VALEUR),HL ;et longueur buffer CALL DEUCON16 LD HL,TLENEND ;Fin buffer CALL PRT LD HL,(ADBUFF) AND A LD DE,(POINBUF) ;SBC HL,DE LD (VALEUR),HL LD (ADBUFF),DE CALL DEUCON16 CALL #BB06 ;Attendre JP SOURCE ;Restaurer paramètres source et c'est fini ; ABANDON4 LD BC,TPROT1 ;Afficher protégé écriture et fini . CALL PRTERR POP BC POP HL JP SOURCE ; ;- Textes et variables - ; TCM DB 31,2,21,"Control mark (O/N) ? ",#80 TLENBUF DB 31,2,21,18,"Buffer : ",32+#80 TPFRM DB 31,2,22,"Donner le numéro de la piste a creer : ",7+#80 TAVERT2 DB 31,2,23,24," EVITEZ DE MODIFIER LE NUMERO DE PISTE ",24,7+#80 ; TRESCRE DB 31,2,22,24," VOTRE PISTE ... : ",24 TTSEC DB " Taille reelle :",32+#80 TLSEC DB "= ",#80 ; TLENORG DB 31,2,23,24," LONGUEUR ORIGINE : ",24,32+#80 TLENEND DB 31,40,23,24," LONGUEUR ECRITE : ",24,32+#80 TG1 DB 31,40,24,24," GAP : ",24,32,"&"+#80 TG2 DB 24," LONG : ",24,32,"&"+#80 ; TPLURIE DB 31,2,22,24," PLUS RIEN A ECRIRE : ABANDON !! ",24,7+#80 ; STOK DW 0 LASTBUF DW 0 ; ; ----------------------------------- ;- ROUTINES SAUVER ET CHARGER BUFFER - ; ----------------------------------- ; ;- Sauver buffer - ; SAVEBUF CALL FICHIER ;Entrer le nom de fichier LD A,(DRW) ;Y ajouter le drive écriture ADD A,#41 LD (BUFFNOM),A CALL #BC8C ;Openout JR NC,ERRDRIV JR Z,ERRDRIV LD HL,20000 ;Adresse de départ LD DE,(NBLUS) ;Longueur du fichier LD A,2 CALL #BC98 ;Sauver JR NC,ERRDRIV JR Z,ERRDRIV CALL EFFLB1 ;Effacer textes JP #BC8F ;Closeout ; ;- Charger buffer - ; LOADBUF CALL FILLBUF ;Effacer le buffer CALL FICHIER ;Entrer le nom de fichier LD A,(DRL) ;Y ajouter le drive lecture ADD A,#41 LD (BUFFNOM),A CALL #BC77 ;Openin JR NC,ERRDRIV JR Z,ERRDRIV LD (NBLUS),BC ;Longueur du buffer LD HL,20000 ;Forcer tout chargement en début de buffer CALL #BC83 ;Load JR NC,ERRDRIV JR Z,ERRDRIV CALL EFFLB1 ;Effacer texte CALL #BC7A ;Closein JP AFFBUF ;Afficher - Editer buffer ; FICHIER LD HL,TFICHIER ;Edition d'un nom de fichier CALL PRT CALL EDITNOM ;Limité à 12 caractères ; LD HL,TTXEDIT ;Recopier dans BUFFNOM LD DE,BUFFNOM+2 PUSH BC ;Longueur du nom dans B LD C,B LD B,0 LDIR POP BC INC B ;+2 pour le drive suivi de ':' INC B ; LD HL,#0101 ;Pour ne pas avoir scrolling en cas de message CALL #BB75 ;d'erreur du drive . LD HL,BUFFNOM LD DE,17000 ;Buffer disquette RET ; ERRDRIV LD HL,TERDRIV CALL PRT CALL #BC7D ;Closein ! JP #BC92 ;Closeout ! ; EFFLB1 LD HL,TEFFLB1 JP PRT ; BUFFNOM DB "A:" ;Drive choisi ;DS 12 ;Nom du fichier ; TFICHIER DB 31,2,22,"Nom du fichier :"," "+#80 TERDRIV DB 31,2,22,18,24," ERREUR FICHIER ! ",24,7+#80 ; |
| ![]() |
| Page précédente : Fdc - 13 - Edition du Buffer |
|