 100 ' ** UNDEL **
 101 ' Pour récupérer un fichier effacé par DEL (Sedoric 3.0)
 102 ' Le fichier sera restauré sous le nom SANSNOM.COM et devra être renommé
 103 ' avant de relancer le programme pour restaurer un autre fichier
 104 ' (c) André Chéramy 2012
 105 ' V 0609-2044
 106 '
 107 'Initialisations 
 110 'ERR SET @@@
 120 'ERRGOTO 2300 @@@
 160 K=0:Y=0:F1=0:F2=0:F3=0:F4=0:NZ=0:W=222
 161 'K variable locale, index des boucles FOR TO 
 162 'Y index pour écriture et lecture dans les tableaux TI() et SI()
 163 'F1 flag nombre de descripteurs principaux qui ont été cherchés 
 164 'F2 flag à 1 si création d'un nouveau secteur de directory 
 165 'F3 flag à 1 si fichier Window, séquentiel ou direct 
 166 'F4 flag de bypass de l'affichage d'un message d'erreur 
 167 'NZ nombre total de secteurs du fichier, descripteurs inclus (directory) 
 168 'W durée de la temporisation après affichage de certains messages
 190 DIM PL(128):DIM SL(128):DIM TI(715):DIM SI(715)
 191 'PL() numéros de Piste des secteurs à charger, Listés dans le descrip 
 192 'SL() Numéros de Sect des secteurs à charger, Listés dans le descrip 
 193 'TI() Numéros de piste des secteurs Inapropriés (TI car PI interdit) 
 194 'SI() Numéros de Secteur des secteurs Inapropriés car les secteurs FP,FS 
 195 'sont laissés "occupés" pour éviter que CRESEC ne retombe dessus. Ils 
 196 'seront libérés ultérieurement
 197 '-----------------------------------------------------------------------
 200 'Programme proprement dit
 210 GOSUB 2020
 211 'Ce S/P Affiche l'écran d'accueil initial 
 212 'On recherche d'abord le premier descripteur principal du fichier éffacé 
 213 'C'est obligatoirement le premier secteur libre indiqué sur la bitmap, 
 214 'sauf si aucun DEL n'a été éffectué ou si quelque chose a été écrit sur 
 215 'la disquette après le DEL ou si la disquette n'est pas saine. Dans tous  
 216 'ces cas la restauration est compromise 
 220 GOSUB 2520:PMAP:CRESEC:SMAP
 221 'Le S/P 2520 affiche un écran de progression de la restauration
 222 'PMAP charge la bitmap. CRESEC cherche le 1er secteur libre, marque ce 
 223 'secteur "occupé", décrémente le nombre de secteurs libres et retourne 
 224 'ses coordonnées dans FP et FS. Ce secteur est le descripteur principal 
 225 'd'un fichier supprimé, sinon il n'y a pas (plus) de fichier à restaurer 
 226 'SMAP met a jour la bitmap sur la disquette: Le premier descripteur 
 227 'principal du fichier effacé est maintenant restauré. On va ouvrir ce 
 228 'descripteur pour avoir les informations sur ce fichier et restaurer le 
 229 'reste: Secteurs de données, directory et bitmap
 230 GOSUB 3010:GOSUB 3110
 231 'Le S/P 3010 ouvre le tampon 10 pour un descripteur principal
 232 'Le S/P 3110 vérifie qu'il s'agit bien d'un descripteur principal et en 
 233 'récupère les données: 
 234 'Copie le champ PDSUIV (Piste Descr SUIV,1 octet) dans la variable P1 
 235 'Copie le champ SDSUIV (Sect Descript SUIV, 1 octet) dans variable S1 
 236 'Les NS paires de coordonnées piste/secteur des secteurs Listés dans le 
 237 'descripteur sont copiées dans les tableaux PL() et SL(), qui conservent 
 238 'les coordonnées des secteurs Listés qu'il faudra restaurer 
 240 GOSUB 3220
 241 'Ce S/P restaure avec CRESEC les NS secteurs indiqués dans PL() et SL() 
 242 'CRESEC est la seule commande pour ce faire, or elle n'accepte pas de 
 243 'paramètres et il faut donc travailler en aveugle: récupérer un à un "le 
 244 'prochain secteur libre" et vérifier que chacun de ces secteurs est le 
 245 'bon. Les Secteurs restaurés par CRESEC de façon Inapropriée sont listés 
 246 'dans TI(),SI() en vue de leur libération ultérieure
 250 GOSUB 3320
 251 'Ce S/P libére les secteurs inappropriés listés dans TI() et SI()
 252 '-----------------------------------------------------------------------
 253 'A ce stade, le premier descripteur principal et les secteurs qui vont 
 254 'avec ont été restaurés. Les variables P1 et S1 contiennent le numéro de 
 255 'piste et le numéro de secteur du descripteur suivant. La variable NR
 256 'indique le nombre de secteurs du fichier en cours qui n'ont pas pu 
 257 'être listés dans le descripteur principal, faute de place 
 258 '-----------------------------------------------------------------------
 259 'Stratégie "Stop ou encore":
 260 IF S1=0 THEN PRINT"Il n'y a pas  de descripteur suivant":GOTO 360
 261 'Si le numéro de Secteur du Descripteur SUIVant est nul alors il n'y a 
 262 'AUCUN descripteur suivant, ni descripteur secondaire, ni descripteur 
 263 'principal de fichier mergé. Il ne reste plus qu'à finaliser l'entrée de 
 264 'directory et la bitmap en continuant en 360. 
 265 'Sinon S1<>0, il existe un lien vers un descripteur suivant et... 
 270 IF NR=0 THEN 330
 271 'Si le Nombre de secteurs Restants pour le fichier en cours est nul, 
 272 'c'est fini pour ce fichier: il n'y a pas de descripteur secondaire qui 
 273 'suit. Mais puisque S1<>0, c'est qu'il a le descripteur principal d'un 
 274 'fichier mergé qui suit et qu'il faut rechercher en sautant en 330 
 275 'Sinon NR<>0, il reste des sect à restaurer dans un descript secondaire 
 276 '-----------------------------------------------------------------------
 277 'Recherche du descripteur secondaire qui suit 
 278 'La dernière paire P1,S1 correspond au lien vers ce descripteur 
 279 'secondaire. A priori, cette info est correcte et à ce stade il n'y a 
 280 'aucun moyen de vérifier 
 290 PRINT"   Descripteur  secondaire trouv{   ":GOSUB 3420:GOSUB 3510
 291 'Le S/P 3420 ouvre le tampon 20 et en définit les champs pour un 
 292 'descripteur secondaire 
 293 'Le S/P 3510 récupére les données de ce descripteur secondaire (lien 
 294 'vers le descripeur suivant & suite de la liste des secteurs du fichier) 
 295 'et ajoute ce descripteur au nombre total de fichiers NZ 
 310 GOSUB 3220:GOSUB 3320:GOTO 260
 311 'Le S/P 3220 restaure les NS secteurs indiqués dans PL() et SL() 
 312 'Le S/P 3320 libére les secteurs inappropriés listés dans TI(),SI() 
 313 'Reboucle en 260 (Stratégie "Stop ou encore") pour décider de la suite 
 314 '-----------------------------------------------------------------------
 315 'Recherche du descripteur principal d'un fichier mergé. 
 316 'La dernière paire de coordonnées P1,S1 correspond au lien vers 
 317 'le secteur suivant, c'est à dire vers ce descripteur principal 
 330 GOSUB 3010:GOSUB 4410
 331 'Le S/P 3010 ouvre le tampon 10 et défini des champs correspondants à 
 332 'un descripteur principal 
 333 'Le S/P 4410 charge le secteur FP,FS et vérifie qu'il s'agit bien du 
 334 'descripteur principal d'un fichier mergé, puis en récupère les données 
 335 'notamment P1 (Piste du Descripteur SUIVant), S1 (Secteur du Descripteur 
 336 'SUIVant) et les tableaux PL() et SL() avec les coordonnées des secteurs 
 337 'listés dans le descripteur et qui sont à restaurer 
 340 GOSUB 3220:GOSUB 3320:GOTO 260
 341 'Le S/P 3220 restaure les NS secteurs indiqués dans PL() et SL() 
 342 'Le S/P 3320 libére les sect inappropriés indiqués dans TI() et SI()
 343 'Reboucle en 260  (Stratégie "Stop ou encore") pour décider de la suite 
 344 '-----------------------------------------------------------------------
 345 '**Finalisation de l'entrée de directory 
 360 GOSUB 4220
 361 'Le S/P 4220 recherche la 1e entrée de directory libre et la finalise 
 362 '-----------------------------------------------------------------------
 363 '** Finalisation de la bitmap
 370 GOSUB 3720
 371 'Le S/P 3720 copie dans le tampon 40 successivement le 1e puis le 2e 
 372 'secteur de bitmap, l'édite et le sauve sur la disquette 
 373 '-----------------------------------------------------------------------
 374 '** Etape finale
 380 GOTO 2620
 381 'Ce S/P affiche les résultats de la récupération
 382 '
 383 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 2000 '
 2010 'S/P Affiche l'écran d'accueil initial 
 2020 CLS:PAPER 3:INK 0:ACCENT SET:Y1=5:Y2=10:Y3=17
 2021 'Papier jaune, encre noire
 2030 POKE#26A,(PEEK(#26A)AND#FE):PRINT""
 2031 'Curseur  TEXT off (b0=0)
 2040 PLOT 1,Y1,4:PLOT 2,Y1,10:PLOT 18,Y1,"UNDEL"
 2041 'Attribut 4 = Encre bleue, Attribut 10 = double hauteur 
 2050 PLOT 1,Y1+1,1:PLOT 2,Y1+1,10:PLOT 18,Y1+1,"UNDEL"
 2051 'Attribut 1 = Encre rouge, Attribut 10 = double hauteur 
 2060 PLOT 2,Y2+0,"           Pour r{cup{rer           "
 2070 PLOT 2,Y2+1,"     un fichier  effac{ par DEL     "
 2080 PLOT 2,Y2+2,"           (Sedoric  3.0)           "
 2090 PLOT 2,Y2+3,"       (c) 2020 Andr{ Ch{ramy       "
 2100 PLOT 2,Y2+4,"         & Club Europe Oric         "
 2110 PLOT 2,Y3+0,"   Ce programme peut etre relanc{   "
 2120 PLOT 23,Y3+0,126
 2121 'accent circonflexe
 2130 PLOT 2,Y3+1,"   plusieurs fois  pour restaurer   "
 2140 PLOT 2,Y3+2,"         plusieurs fichiers         "
 2150 PLOT 2,Y3+3,"     ayant {t{ supprim{s  apr}s     "
 2160 PLOT 2,Y3+4,"        la derni}re {criture        "
 2170 PLOT 2,Y3+5,"          sur la disquette          "
 2180 PLOT 2,Y3+8,"                            <touche>"
 2190 GET R$:RETURN
 2191 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 2200 '
 2210 'Affiche message d'erreur "Descript princip fichier mergé pas trouvé"
 2220 GOSUB 3320:SMAP:CLOSE:CLS:PAPER 3:INK 0:Y1=7:Y2=11
 2221 'A ce point, il devait y avoir un descripteur principal de fichier 
 2222 'mergé, mais le secteur fléché par le lien n'est pas un descripteur
 2223 'Il y a donc un problème rédibitoire. Avant de quitter, il faut 
 2224 'exécuter le S/P 3320 de libération des secteurs TI(),SI() puis CLOSE 
 2225 'qui libère tous les tampons. Enfin UNDEL affiche un écran d'erreur
 2230 PLOT 1,Y1,4:PLOT 2,Y1,10:PLOT 18,Y1,"UNDEL"
 2231 'Attribut 4 = Encre bleue, Attribut 10 = double hauteur 
 2240 PLOT 1,Y1+1,1:PLOT 2,Y1+1,10:PLOT 18,Y1+1,"UNDEL"
 2241 'Attribut 1 = Encre rouge, Attribut 10 = double hauteur 
 2250 PLOT 2,Y2+0,"Le programme a rencontr{ un probl}me"
 2252 PLOT 2,Y2+2," Il y a une rupture  dans la chaîne "
 2254 PLOT 2,Y2+3,"     des liens des descripteurs     "
 2256 PLOT 2,Y2+5,"    La disquette a  probablement    "
 2258 PLOT 2,Y2+6,"      {t{ utilis{e en {criture      "
 2260 PLOT 2,Y2+7,"    apr}s le DEL fatidique et la    "
 2262 PLOT 2,Y2+8,"    restauration est impossible!    "
 2264 PLOT 2,25  ,"                        <touche>    "
 2266 PRINT@2,22;"":POKE#26A,(PEEK(#26A)OR#01):PRINT"":GET R$
 2268 'Curseur  TEXT ON (b0=1)
 2270 PAPER 0:INK 7:DIR:END
 2271 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 2272 '
 2273 'Affiche message d'erreur "Descripteur principal pas trouvé"
 2300 PRINT:PRINT
 2310 PRINT"        UNDEL n'a pas trouv{        "
 2320 PRINT"      de descripteur principal.     "
 2330 PRINT"       D{sol{, la restauration      "
 2340 PRINT"          est impossible !          ":PRINT
 2350 PRINT"                        <touche>    "
 2360 GOSUB 3320
 2361 'Le S/P 3320 libère les secteurs inappropiés
 2370 GOTO 2266
 2371 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 2400 '
 2401 'Affiche message d'avertissement
 2402 'Le secteur libre trouvé par CRESEC n'est pas un descripteur, mais 
 2403 'probablement un reste de fichier ayant été supprimé avec DEl puis 
 2404 'partiellement écrasé par le SAVE d'un fichier plus petit. On le garde 
 2405 'pour l'instant avec son status "occupé", mais il faudra le libérer 
 2406 'ultérieurement pour avoir un nombre de secteurs libres exact 
 2410 F1=F1-1:Y=Y+1:IF Y>714 THEN Y=714:GOTO 2300
 2411 'Repositionne F1, nombre de descripteurs principaux qui ont été chargés 
 2412 'Puis ajuste l'index Y et copie FP et FS dans les tableaux TI(Y) et 
 2413 'SI(Y) qui sauvegardent les coordonnées des secteurs inappropriés 
 2415 TI(Y)=FP:SI(Y)=FS:IF F4>0 THEN 2478
 2416 'Bypasse l'affichage de cet écran si scrutation répétitive
 2420 CLS:PAPER 3:INK 0:Y1=3:Y2=8
 2421 'Papier jaune, encre noire, Y1 et Y2, ordonnées pour affichage
 2430 PLOT 1,Y1,4:PLOT 2,Y1,10:PLOT 18,Y1,"UNDEL"
 2431 'Attribut 4 = Encre bleue, Attribut 10 = double hauteur 
 2440 PLOT 1,Y1+1,1:PLOT 2,Y1+1,10:PLOT 18,Y1+1,"UNDEL"
 2441 'Attribut 1 = Encre rouge, Attribut 10 = double hauteur 
 2450 PLOT 2,Y2+0,"Le programme a rencontr{ un probl}me"
 2452 PLOT 2,Y2+2," Le premier secteur libre n'est pas "
 2454 PLOT 2,Y2+3,"un descripteur, mais probablement le"
 2456 PLOT 2,Y2+4,"reste d'un fichier supprim{ avec DEL"
 2458 PLOT 2,Y2+5,"  puis partiellement {cras{ par le  "
 2460 PLOT 2,Y2+6,"    SAVE d'un fichier plus petit    "
 2462 PLOT 2,Y2+7," A moins qu'il n'y ait pas (ou plus)" 
 2464 PLOT 2,Y2+8,"       de fichier @ restaurer.      "
 2466 PLOT 2,Y2+10,"     Faut-il abandonner (O/N)?      "
 2468 GET R$:IF R$="O" THEN 2264
 2470 'En 2264 on quitte le programme
 2472 'Si "N", on continue pour explorer 190 secteurs supplémentaire
 2474 GOSUB 2520:PRINT"    UNDEL reprend la recherche      "
 2476 'Le S/P 2520 affiche l'écran de progression de la restauration
 2478 F4=F4+1:IF F4>190 THEN F4=0:GOTO 2466
 2480 'F4>0 inhibe le reaffichage récurent lors des passages suivants
 2482 PMAP:CRESEC
 2484 'Reprend la bitmap et cherche le secteur libre suivant
 2486 SMAP:PRINT".";:RETURN
 2488 'Sauve la bitmap, affiche l'avancement de la recherche
 2490 'Retour pour examiner le secteur libre trouvé par CRESEC
 2492 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 2500 '
 2510 'S/P Affiche un écran de progression de la restauration 
 2520 CLS:PAPER 3:INK 0:ACCENT SET:Y1=3:Y2=7
 2521 'Papier jaune, encre noire
 2530 POKE#26A,(PEEK(#26A)AND#FE):PRINT""
 2531 'Curseur  TEXT off (b0=0)
 2540 PLOT 1,Y1,4:PLOT 2,Y1,10:PLOT 18,Y1,"UNDEL"
 2541 'Attribut 4 = Encre bleue, Attribut 10 = double hauteur 
 2550 PLOT 1,Y1+1,1:PLOT 2,Y1+1,10:PLOT 18,Y1+1,"UNDEL"
 2551 'Attribut 1 = Encre rouge, Attribut 10 = double hauteur 
 2560 PLOT 2,Y2+0," Patience, r{cup{ration en cours... "
 2570 PRINT@2,Y2+1;""
 2580 RETURN
 2581 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 2600 '
 2610 'Affichage des résultats de la récupération
 2620 CLS:PAPER 3:INK 4:ACCENT SET:Y1=7:Y2=12:Y3=17
 2630 PLOT 1,Y1,1:PLOT 2,Y1,10:PLOT 10,Y1,"RECUPERATION REUSSIE"
 2631 'Attribut 1 = Encre rouge, Attribut 10 = double hauteur
 2640 PLOT 1,Y1+1,0:PLOT 2,Y1+1,10:PLOT 10,Y1+1,"RECUPERATION REUSSIE"
 2641 'Attribut 0 = Encre noire, Attribut 10 = double hauteur
 2650 PLOT 2,Y2+0,"    Fichier SANSNOM.COM r{cup{r{    " 
 2660 IF F1<2 THEN 2680
 2661 'Saute en 2680 si pas de fichiers mergés
 2670 F1$=RIGHT$(STR$(F1),1):PLOT 2,Y2+1,"         ("+F1$+" fichiers merg{s)"
 2680 PLOT 2,Y2+2,"      Utilisez RENAME avant de      "
 2690 PLOT 2,Y2+3,"     relancer le programme UNDEL    "
 2700 IF F1<2   THEN PLOT 2,Y3+0,"          Type de fichier:          "
 2710 IF F1>1   THEN PLOT 2,Y3+0,"         Fichier principal:         "
 2720 IF TF=128 THEN PLOT 2,Y3+1,"           Programme Basic          "
 2730 IF TF=129 THEN PLOT 2,Y3+1,"        Programme Basic auto        "
 2740 IF TF=64  THEN PLOT 2,Y3+1,"     Bloc de donn{es ou Code LM     "
 2750 IF TF=65  THEN PLOT 2,Y3+1,"  Bloc de donn{es ou Code LM auto   "
 2760 IF TF=96  THEN PLOT 2,Y3+1,"               Window               ":F3=1
 2770 IF TF=16  THEN PLOT 2,Y3+1,"     Fichier @ acc}s s{quentiel     ":F3=1
 2780 IF TF=8   THEN PLOT 2,Y3+1,"       Fichier @ acc}s direct       ":F3=1
 2781 'F3 Flag à 1 si fichier window, séquentiel ou direct
 2790 IF F3=1 THEN 2850
 2800 DE$=HEX$(DE):DE$="000"+RIGHT$(DE$,LEN(DE$)-1):DE$="#"+RIGHT$(DE$,4) 
 2810 FI$=HEX$(FI):FI$="000"+RIGHT$(FI$,LEN(FI$)-1):FI$="#"+RIGHT$(FI$,4)
 2820 EX$=HEX$(EX):EX$="000"+RIGHT$(EX$,LEN(EX$)-1):EX$="#"+RIGHT$(EX$,4)
 2830 IF EX=0  THEN PLOT 2,Y3+2,"       D{but "+DE$+", Fin "+FI$+"       "
 2840 IF EX<>0 THEN PLOT 2,Y3+2," D{but "+DE$+", Fin "+FI$+", Ex{c "+EX$+" "
 2850 PLOT 6,Y3+3,"Nombre total de secteurs:":PRINT@32,Y3+3;NZ
 2860 PLOT 2,Y3+8,"                            <touche>"
 2870 GET R$:CLS:PRINT:PRINT
 2880 IF F1<2 THEN 2900
 2890 PRINT"Composition des fichiers merg{s:":LOAD"SANSNOM",V
 2900 PAPER 0:INK 7:DIR
 2910 POKE#26A,(PEEK(#26A)OR#01):PRINT"":END
 2911 'Curseur TEXT on (b0=1)
 2912 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 3000 '
 3001 'Le S/P ouvre le tampon 10 pour un descripteur principal 
 3002 'En entrée: Rien de spécial 
 3003 'En sortie: Les 256 octets du tampon sont completement "labellisés" et 
 3004 'le tampon 10 reste ouvert 
 3010 OPEN D,10: FIELD 10, PDSUIV TOO, SDSUIV TOO, FDESCR TOO, TYPFIC TOO,
 3011 'OPEN réserve le tampon 10 de 256 octets en vue de charger un 
 3012 'descripteur principal. Ce tampon est prédécoupé en plusieurs 
 3013 'champs correspondant à la structure d'un descripteur principal: 
 3014 'Champ PDSUIV (1 octet) Piste du Descripteur SUIVant
 3015 'Champ SDSUIV (1 octet) Secteur du Descripteur SUIVant
 3016 'Champ FDESCR (1 octet) flag #FF si DESCRipteur principal
 3017 'Champ TYPFIC (1 octet) type de fichier (Basic, bloc de données, etc.)
 3020 FIELD 10, LDEBFI TOO, HDEBFI TOO, LFINFI TOO, HFINFI TOO, 
 3021 'Champ LDEBFI (1 octet) LL de l'adresse de DÉBut du FIChier
 3022 'Champ HDEBFI (1 octet) HH de l'adresse de DÉBut du FIChier
 3023 'Champ LFINFI (1 octet) LL de l'adresse de FIN du FIChier
 3024 'Champ HFINFI (1 octet) HH de l'adresse de FIN du FIChier
 3030 FIELD 10, LEXEFI TOO, HEXEFI TOO, NBRSEC TO%,
 3031 'Champ LEXEFI (1 octet) LL de l'adresse d'EXÉcution si AUTO
 3032 'Champ HEXEFI (1 octet) HH de l'adresse d'EXÉcution si AUTO
 3033 'Champ NBRSEC (1 octet) NomBRe de SECteurs du fichier (sans inclure
 3034 'le ou les secteurs descripteurs, car il s'agit des secteurs à charger) 
 3040 FOR K=1 TO 122:FIELD 10, PDSACH(K) TOO, SDSACH(K) TOO,:NEXT
 3041 'Attribue la fin du tampon à 122 paires d'octets correspondant à la 
 3042 'liste des coord piste/secteur des secteurs du fichier. 
 3043 'Champ indexé PDSACH() = Piste Du Secteur A CHarger (1 octet) 
 3044 'Champ indexé SDSACH() = Secteur Du Secteur A CHarger (1 octet) 
 3045 'Ces champs sont indexés de 1 à 122. Si le nombre de secteurs à charger 
 3046 'dépasse 122, il faudra chercher le descripteur secondaire suivant 
 3050 RETURN
 3051 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 
 3100 '
 3101 'Ce S/P Récupère les données du premier descripteur principal 
 3102 'En entrée: F1, FP, FS et tampon 10 ouvert avec champs appropriés 
 3103 'En sortie: F1, PZ, SZ, FD, P1, S1, TF, DE, FI, EX, NB, NS, NR, PL(), 
 3104 'SL() et le tampon 10 est libéré
 3110 F1=F1+1 : PZ=FP : SZ=FS : TAKE 10,FP,FS : FDESCR > FD
 3111 'F1 indique le nombre de descripteurs principaux qui ont été chargés 
 3112 'FP et FS numéros de piste et de secteur du premier descripteur 
 3113 'principal ont été fournis par CRESEC et seront placés dans l'entrée 
 3114 'de directory grâce aux variables PZ et SZ. 
 3115 'TAKE prend le descripteur de coordonn FP,FS dans le tampon 10. 
 3116 'Le champ FDESCR est copié dans la variable FD (Flag Descripteur) pour 
 3117 'vérifier que le secteur charge est bien un descripteur principal
 3120 IF FD<>#FF THEN GOSUB 2410:GOTO 3110
 3121 'Si ce n'est pas un descripteur principal, affiche un message 
 3122 'd'avertissement et gère le problème. Reprend au début du S/P
 3124 PRINT:PRINT"    Descripteur principal trouv{    "
 3125 F4=0 : PDSUIV > P1 : SDSUIV > S1 
 3126 'F4 annule l'inhibition de l'affichage de l'écran d'erreur
 3127 'Copie le champ PDSUIV (1 octet) dans la variable P1 (Piste Descr SUIV) 
 3128 'Copie le champ SDSUIV (1 octet) dans variable S1 (Sect Descript SUIV) 
 3130 TYPFIC>TF:LDEBFI > LD:HDEBFI > HD:LFINFI > LF:HFINFI > HF:DE=HD*#100+LD
 3131 'Copie le champ TYPFIC (1 octet) dans la variable TF (TYPe de FIChier)
 3132 'Copie le champ LDEBFI (1 octet) dans la variable LD (ll adr de DÉBut)
 3133 'Copie le champ HDEBFI (1 octet) dans la variable HD (HH adr de DÉBut)
 3134 'Copie le champ LFINFI (1 octet) dans la variable LF (ll adr de FIN)
 3135 'Copie le champ HFINFI (1 octet) dans la variable HF (HH adr de FIN)
 3136 'Calcule DE, l'adresse de DEbut du fichier
 3140 FI=HF*#100+LF : LEXEFI > LE : HEXEFI > HE : EX=HE*#100+LE
 3141 'Calcule FI l'adresse de FIn du fichier
 3142 'Copie le champ LEXEFI (1 octet) dans la variable LE (ll adr EXEcution)
 3143 'Copie le champ HEXEFI (1 octet) dans la variable HE (HH adr EXEcution)
 3144 'Calcule EX l'adresse d'EXécution du fichier
 3150 NBRSEC > NB:IF NB < 123 THEN NS=NB ELSE NS=122
 3151 'Copie le champ NBRSEC dans la variable NB qui est le nombre total de 
 3152 'secteurs du fichier à charger en mémoire. NS est le nombre de secteurs 
 3153 'listés dans le descripteur en cours, soit 122 au maximum dans un 
 3154 'descripteur principal.
 3160 NR=NB-122: IF NR < 0 THEN NR=0
 3161 'NR est le Nombre de secteurs qui Resteront à lister après avoir écrit 
 3162 'le descripteur en cours 
 3163 'Si NR>0, il y aura au moins un descript secondaire à traiter 
 3170 FOR K=1 TO NS:PDSACH(K) > PL(K):SDSACH(K) > SL(K):NEXT
 3171 'Pour chacun des NS secteurs listés dans ce descripteur, on copie les
 3172 'coordonnées piste,secteur dans PL() et SL() 
 3180 CLOSE 10:NZ=NZ+NB+1
 3181 'CLOSE libère le tampon 10, ainsi que les noms de champs associés 
 3182 'NZ, nombre total de secteurs du fichier, descripteurs inclus est 
 3183 'calculé avec NB, plus un pour ce premier descripteur principal
 3190 RETURN
 3191 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 3200 '
 3210 'Ce S/P restaure les NS secteurs indiqués dans PL() et SL() 
 3211 'En entrée: PL(),SL() contiennent coordonnées des NS sect à restaurer 
 3212 'En sortie: Les NS secteurs du dernier descript ont été restaurés et Y 
 3213 'pointe sur la dernière paire de coord des Secteurs Inappropriés listés 
 3214 'dans TI() et SI(). Si un secteur recherché n'est pas trouvé, ses 
 3215 'coord sont copiées dans TI(),SI() et CRESEC poursuit sa recherche. Si 
 3216 'tous les secteurs libres de la disquette ont été explorés sans succès 
 3217 'un "DISK FULL ERROR" s'affiche. La dimension des tableaux TI(),SI() a 
 3218 'été limitée à 714 (42 pistes de 17 sect), ce qui est déjà beaucoup 
 3219 'pour un nombre de secteurs inappropiés
 3220 PMAP
 3221 'Charge la bitmap 
 3230 FOR K=1 TO NS:CRESEC
 3231 'Pour chacun des NS secteurs, CRESEC cherche le 1er secteur libre et le 
 3232 'marque "occupé", décrémente le nombre de secteurs libres et retourne 
 3233 'les coordonnées FP et FS de ce secteur. Mais est-ce le sect recherché? 
 3240 IF FP=PL(K) AND FS=SL(K) THEN 3260 
 3241 'Si coordonnées identiques, c'est le bon secteur, continue en 3260
 3250 Y=Y+1:TI(Y)=FP:SI(Y)=FS
 3251 'Sinon, Ajuste l'index Y et copie FP et FS dans les tableaux TI() et 
 3252 'SI() qui sauvegardent les coordonnées des secteurs inappropriés 
 3260 NEXT
 3261 'Cherche le suivant
 3270 SMAP:PRINT" Ses secteurs ont tous {t{ restaur{s"
 3271 'Enregistre la bitmap et affiche la progression de la restauration
 3272 'Y pointe sur les coordonnées du dernier secteur inapproprié
 3280 RETURN
 3281 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 3300 '
 3310 'S/P de libération des Y secteurs inappropriés indexés dans TI(),SI()
 3311 'En entrée: Y pointe sur la dernière paire de coordonnées 
 3312 'En sortie: Les secteurs ont été libérés, la bitmap a été mise à jour 
 3313 'et Y a été mis à 0 pour indiquer qu'il n'y a plus de secteur à libérer 
 3320 IF Y<1 THEN 3370
 3321 'Y est l'index des tableaux TI() et SI() contenant les coordonnées des 
 3322 'secteurs trouvés par CRESEC mais qui n'étaient pas ceux cherchés, et 
 3323 'qu'on a laissés "occupés" afin que CRESEC ne retombe pas dessus sans 
 3324 'arrêt. Ils vont être libérés maintenant. Si Y indique que ces tableaux 
 3325 'sont vides, on retourne tout de suite à l'appelant 
 3330 PMAP
 3331 'Charge la bitmap 
 3340 FOR K=1 TO Y:FRSEC TI(K),SI(K):NEXT
 3341 'Pour chacune des Y paires de coordonnées, FRSEC libère les secteurs 
 3342 'dont les coordonnées sont indiquées dans les tableaux TI() et SI() 
 3350 SMAP
 3351 'SMAP met à jour (sauve) la bitmap sur la disquette 
 3360 Y=0
 3361 'Réinitialise l'index Y au début des tableaux TI() et SI(), indiquant 
 3362 'qu'il n'y a plus de secteur à libérer 
 3370 PRINT:RETURN
 3371 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 3400 '
 3410 'Ce S/P réserve le tampon 20 pour un descripteur secondaire 
 3411 'En entrée: Rien de spécial
 3412 'En sortie: Les 256 octets du tampon sont completement "labellisés" et 
 3413 'le tampon 20 reste ouvert
 3420 OPEN D,20:FIELD 20,PDSUIV TOO, SDSUIV TOO,
 3421 'OPEN réserve le tampon 20 pour configurer un descripteur secondaire
 3422 'Ce tampon est prédécoupé en plusieurs champs correspondant à la 
 3423 'structure d'un descripteur secondaire: 
 3424 'Champ PDSUIV (1 octet) numéro de Piste du Descripteur SUIVant 
 3425 'Champ SDSUIV (1 octet) numéro de Secteur du Descripteur SUIVant 
 3430 FOR K=1 TO 127:FIELD 20, PDSACH(K) TOO, SDSACH(K) TOO,:NEXT 
 3431 'Attribue la fin du tampon aux coordonnées de 127 secteurs au maximum 
 3432 'peuvant être listés dans un descripteur secondaire 
 3433 'Champ PDSACH() (1 octet) numéro de piste du secteur de data du fichier
 3434 'Champ SDSACH() (1 octet) numéro de sect du secteur de data du fichier 
 3440 RETURN
 3441 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 3500 '
 3501 'Ce S/P récupère les données d'un descripteur secondaire (tampon 20) 
 3502 'En entrée: P1, S1, NR, NZ et le tampon 20 ouvert avec champs appropriés
 3503 'En sortie: P1, S1, NR, NS, NZ, PL(), SL() et le tampon 20 est libéré 
 3504 'Note. Les descript secondaires ne portent aucune "signature" et donc 
 3505 'on ne peut pas vérifier que le secteur chargé est bien un descripteur 
 3506 'secondaire. Mais la chaîne des liens qui unissent tous les descript  
 3567 'd'un fichier est suffisament fiable (si la disquette est saine) 
 3510 GOSUB 4510 
 3511 'Ce S/P restaure le descripteur P1,S1 car ses coordonnées n'ont pas été 
 3512 'fournies par CRESEC, mais par le lien P1,S1 du descripteur précédent 
 3513 'et il n'a donc pas encore été restauré 
 3520 TAKE 20,P1,S1:PDSUIV > P1:SDSUIV > S1
 3521 'TAKE charge dans le tampon 20 le descripteur secondaire P1,S1 
 3522 'Copie champ PDSUIV (Piste Descr SUIVant, 1 octet) dans la variable P1 
 3523 'Copie champ SDSUIV (Sect Descr SUIVant, 1 octet) dans la variable S1 
 3524 'P1 et S1 deviennent les coordonnées du nouveau descripteur suivant 
 3530 IF NR < 127 THEN NS=NR ELSE NS=127
 3531 'Si NR le nombre de secteur restants à lister est inférieur à la 
 3532 'capacité d'un descripteur secondaire, alors NS le nombre de paires de 
 3533 'coordonnées à copier est forcé à NR. Sinon 127 paires de coordonnées 
 3534 'seront copiées dans le secteur secondaire 
 3540 NR=NR-127:IF NR < 0 THEN NR=0
 3541 'Nouveau nombre de secteurs de data qui resteront à lister après avoir 
 3542 'écrit le descripteur en cours. Si NR>0 il y aura encore un autre 
 3543 'descripteur secondaire qui suivra 
 3550 FOR K=1 TO NS:PDSACH(K) > PL(K):SDSACH(K) > SL(K):NEXT
 3551 'PL() numéro de Piste des sect Listés dans le descript d'un fichier 
 3552 'SL() numéro de Secteur des sect Listés dans le descript d'un fichier 
 3553 'Copie les coordonnées pistes/secteur dans PL() et SL() pour chacun des 
 3554 'NS secteurs restants du fichier (sect pas pris au tour précédent par 
 3555 'manque de place). Après avoir récupéré toutes les données du descript
 3556 'secondaire dans P1, S1, PL() et SL() 
 3560 CLOSE 20
 3561 'CLOSE libère le tampon 20 
 3570 NZ=NZ+1
 3571 'Ajoute ce descripteur secondaire au nombre total de secteurs 
 3580 RETURN
 3581 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 3600 '
 3610 'Ce S/P réserve le tampon 40 pour un secteur de bitmap 
 3611 'En entrée: Rien de spécial
 3612 'En sortie: Les 256 octets du tampon sont completement "labellisés" et 
 3613 'le tampon 40 reste ouvert 
 3620 OPEN D,40:FIELD 40, SIGNAT TO%, SECLIB TO%, NBFICH TO%, 
 3621 'Les 240 derniers octets de chacun des 2 sect de bitmap correspondent 
 3622 'à la bit map proprement dite et sont mis à jour par CRESEC et FRSEC. 
 3623 'Seule l'entête de 16 octets doit être mise à jour ici. Le tampon 40 
 3624 'est donc prédécoupé en plusieurs champs selon les modalités suivantes: 
 3625 'Champ SIGNAT (2 octets) champ d'identification d'un secteur de bitmap
 3626 'Champ SECLIB (2 octets) nombre de secteurs libres (pour le 1e secteur
 3627 'de bitmap) ou nombre de secteurs totaux dûs au formatage (pour le 2e 
 3628 'secteur de bitmap (c'est la seule différence entre les 2 entêtes) 
 3629 'Champ NBFICH (2 octets) nombre de fichiers sur la disquette
 3630 FIELD 40, PPFSPP TO%, NBRDIR TOO, ETCETC TO$7
 3631 'Champ PPFSPP (2 octets) Pistes Par Face et Secteurs Par Piste
 3632 'Champ NBRDIR (1 octets) NomBRe de secteurs de DIRectory
 3633 'Champ ETCETC (7 octets) sans utilité pour aujourd'hui
 3640 RETURN
 3641 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 3700 '
 3710 'Ce S/P édite dans le tampon 40 les 2 secteurs de bitmap et les sauve 
 3711 'En entrée: Rien de spécial
 3712 'En sortie: Les 2 sect de bitmap sont à jour et le tampon 40 est libéré 
 3713 'Dans les 2 secteurs de bitmap, les entêtes, (16 premiers octets) sont 
 3714 'identiques, sauf NBRDIR (1er secteur) qui est remplacé dans le 2e 
 3715 'secteur par le nombre total de secteurs de la disquette, valeur qui ne 
 3716 'change plus après formatage. la partie bitmap proprement dite (240 
 3717 'octets) est gérée par CRESEC et FRSEC (heureusement car c'est coton!) 
 3720 GOSUB 3620:TAKE 40,20,2:NBFICH > NF:NF=NF+1:LSET NBFICH < NF
 3721 'Le SP 3620 réserve le tampon 40 pour mettre un sect de bitmap à jour 
 3722 'TAKE prend dans ce tampon le 1er secteur de bitmap 
 3723 'Copie le champ NBFICH dans la variable NF (Nombre de Fichiers de la 
 3724 'disquette), incrémente NF (+1 pour le fichier restauré) et remet en 
 3725 'place la valeur actualisée 
 3730 NBRDIR > ND:ND=ND+F2:LSET NBRDIR < ND
 3731 'Copie le champ NBRDIR dans variable ND (nombre de sect de directory) 
 3732 'Ajuste ND avec F2 (Flag F2=0 si nombre de sect de directory inchangé 
 3733 'ou F2=1 si un sect a été créé) et remet en place la valeur actualisée 
 3734 'NB. Le champ SECLIB est mis à jour par CRESEC et FRSEC, on n'a pas à 
 3735 's'en occuper
 3750 PUT 40,20,2:CLOSE 40
 3751 'Réécrit le tampon 40 dans le 1er secteur de bitmap
 3760 GOSUB 3620:TAKE 40,20,3:LSET NBFICH < NF:LSET NBRDIR < ND
 3761 'Ce S/P réserve le tampon 40 pour mettre un secteur de bitmap à jour
 3762 'TAKE prend le 2e secteur de bitmap dans le tampon, actualise les champs
 3763 'NBFICH et NBRDIR. Les autres champs sont inchangés
 3770 PUT 40,20,3:CLOSE 40
 3771 'Réécrit le tampon 40 dans le 2e secteur de bitmap
 3780 PRINT"    Secteurs de bitmap restaur{s    ":WAIT W:RETURN
 3781 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 3800 '
 3810 'Ce S/P réserve le tampon 30 pour un secteur de directory 
 3811 'En entrée: Rien de spécial
 3812 'En sortie: Les 256 octets du tampon sont completement "labellisés" et 
 3813 'le tampon 30 reste ouvert
 3820 OPEN D,30:FIELD 30, PDSUIV TOO, SDSUIV TOO, ENTLIB TOO, INUTIL TO$13, 
 3821 'OPEN réserve le tampon 30 de 256 octets pour charger un secteur de 
 3822 'directory. Ce tampon est prédécoupé en plusieurs champs selon les 
 3823 'modalites suivantes: Pour les 16 premiers octets (entête): 
 3824 'champ PDSUIV (1 octet) Piste du Directory SUIVant (#00 il n'y en a pas) 
 3825 'champ SDSUIV (1 octet) Sect. du Directory SUIVant (#00 il n'y en a pas) 
 3826 'champ ENTLIB  (1 octet) Offset de la 1e ENTrée LIBre (#00 si plein) 
 3827 'champ INUTIL (13 octets) Contient toujours des #00 (INUTILisés) 
 3828 'Pour chacune des 15 lignes de directory, attribue les champs suivants: 
 3830 FOR K=1 TO 15:FIELD 30, NMFICH(K) TO$12, PDPFIC(K) TOO, SDPFIC(K) TOO, 
 3831 'champ NMFICH() (12 octets=9+3 caractères sans point) NoM du FICHier 
 3832 'champ PDPFIC() (1 octet) Piste du Descripteur Principal du FIChier 
 3833 'champ SDPFIC() (1 octet) Secteur du Descripteur Principal du FIChier 
 3840 FIELD 30, NBTSEC(K) TOO, ATTPRT(K) TOO,:NEXT
 3841 'champ NBTSEC() (1 octet) NomBre Total de SECt du fichier, descr inclus
 3842 'champ ATTPRT() (1 octet) ATRibut de PROTection du fichier
 3850 RETURN
 3851 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 3900 '
 3901 'Ce S/P édite l'entrée EL du directory PD,SD dans le tampon 30
 3902 'En entrée: Le directory PD, SD doit déjà avoir été chargé dans le 
 3903 'tampon 30. Les variables P2 (Piste du directory suivant), S2 (Secteur 
 3904 'du directory suivant) et EL doivent déjà avoir été récupérées 
 3905 'EL est l'offset de l'entrée libre que ce S/P va éditer et qui 
 3906 'correspond à la Kième entrée 
 3907 'En sortie: L'entrée EL a été éditée, la valeur de EL (entrée suivante) 
 3908 'mise à jour, le secteur réécrit sur la disquette et le tampon libéré 
 3910 K=EL/16:LSET NMFICH(K)<"SANSNOM  COM":LSET PDPFIC(K) < PZ
 3911 'L'offset EL correspond à la Kième entrée de directory. Copie le nom du 
 3912 'fichier "SANSNOM  COM" dans le champ NMFICH(). Copie PZ le numéro de 
 3913 'Piste du Descripteur Principal du FIChier dans le champ PDPFIC() 
 3920 LSET SDPFIC(K) < SZ:HH=INT(NZ/#100):LL=NZ-(HH*#100):HH=HH OR #C0
 3921 'Copie SZ le numéro de Secteur du Descripteur Principal du FIChier dans 
 3922 'le champ SDPFIC(). LL devient l'octet de poids faible et HH l'octet de 
 3923 'poids fort du nombre total de secteurs du fichier, descripteurs inclus 
 3924 'Les bits 6 et 7 de HH sont forcés à 1 (attribut de protection) 
 3925 'NB. Un fichier PROTégé peut quand même être renommé 
 3930 LSET NBTSEC(K) < LL:LSET ATTPRT(K) < HH
 3931 'Copie LL, octet de poids faible du nombre total de secteurs du 
 3932 'fichier, descripteurs inclus dans le champ NBTSEC(). Copie HH, octet 
 3933 'de poids fort du nombre total de secteurs du fichier, descripteurs 
 3934 'inclus, plus bits de protection du fichier dans le champ ATTPRT() 
 3940 EL=EL+#10:IF EL>#FF THEN EL=#00
 3941 'Mise à jour de l'offset de la 1e entrée libre du secteur de directory 
 3942 'actuel PD,SD. Après un DEL, il y a remaniement des entrées dans les 
 3943 'secteurs de directory pour boucher les trous, sauf si l'offset du trou 
 3944 'vaut EL=#FO. Il peut donc exister des secteurs de directory dont la 
 3945 'dernière entrée est libre. Le fait qu'un secteur de directory soit 
 3946 'plein (EL=#00) n'implique, ni d'en créer un nouveau, ni de chercher la 
 3947 'prochaine entrée libre. Les valeurs P2 et S2 (coordonnées du secteur 
 3948 'de directory suivant) restent donc inchangées et peuvent même être 
 3949 'nulles s'il n'y a pas de directory suivant 
 3950 LSET ENTLIB < EL
 3951 'Copie EL, l'offset, mis à jour, de la 1e entrée libre, dans le champ 
 3952 'ENTLIB du secteur de directory actuel PD,SD
 3960 PUT 30,PD,SD:CLOSE 30:IF F2=0 THEN 3990
 3961 'Sauve le secteur de directory corrigé sur la disquette, libère le 
 3962 'tampon 30 et si aucun nouveau secteur de directory n'a été créé 
 3963 'continue en 3990. Si F2=1, il existe un nouveau secteur de directory 
 3964 'dont les coordonnées doivent être indiquées dans le lien du secteur 
 3965 'de directory précédent 
 3970 GOSUB 3820:TAKE 30,P3,S3
 3971 'Mise à jour du lien de l'avant-dernier secteur de directory vers le 
 3972 'secteur de directory qui a été crée. Le S/P 3820 réserve le tampon 30 
 3973 'pour un secteur de directory. Ce tampon 30 reste ouvert. TAKE copie 
 3974 'l'avant-dernier secteur de directory P3,S3 dans le tampon 30
 3980 LSET PDSUIV < PD:LSET SDSUIV < SD:PUT30,P3,S3:CLOSE 30
 3981 'Les coordonnées PD,SD du secteur de directory nouvellement créé sont 
 3982 'copiées dans les champs PDSUIV et SDSUIV de l'avant-dernier 
 3983 'Le secteur corrigé est sauvé sur la disquette et le tampon libéré
 3990 PRINT"Entr{e de directory & lien restaur{s":RETURN
 3991 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 4100 '
 4110 'Ce S/P crée un nouveau secteur de directory
 4111 'En entrée: Rien de spécial
 4112 'En sortie: F2=1, EL=#10, PD=FP et SD=FS. Le tampon 30 est libéré 
 4120 PMAP:CRESEC:SMAP:PD=FP:SD=FS
 4121 'PMAP charge la bitmap. CRESEC cherche le 1er secteur libre, marque ce 
 4122 'secteur "occupé", décrémente le nombre de sect libres et retourne ses 
 4123 'coordonnées dans FP et FS. SMAP met a jour la bitmap sur la disquette
 4124 'PD Piste du Dernier secteur de directory utilisé (ou connu) 
 4125 'SD Secteur du Dernier secteur de directory utilisé (ou connu)
 4130 OPEN D,30:FOR K=0 TO 255:FIELD 30, OCTETS(K) TOO, :NEXT
 4131 'OPEN réserve le tampon 30 de 256 octets pour en faire un secteur de 
 4132 'directory vierge. Ce tampon est prédécoupé en 256 champs de 1 octet 
 4140 TAKE 30,PD,SD
 4141 'Prend le secteur libre PD,SD trouvé par CRESEC dans le tampon 30
 4150 FOR K=0 TO 255:LSET OCTETS(K) < #00:NEXT
 4151 'Dans ce secteur de directory vierge, tous les octets sont mis à zéro
 4160 LSET OCTETS(2) < #10
 4161 'Sauf le 3e qui pointe sur la première entrée libre (offset #10)
 4170 F2=1:PUT 30,PD,SD:CLOSE 30:RETURN
 4171 'F2 indique qu'un nouveau secteur de directory a été créé. Il s'agit 
 4172 'soit d'un secteur créé avec CRESEC, soit d'un secteur réservé mais non 
 4173 'utilisé. F2 va servir à rétablir le lien vers ce nouveau secteur de 
 4174 'directory et à mettre à jour le champ NBRDIR (nombre de secteurs de 
 4175 'directory) de la bitmap. Sauve ce nouveau secteur de directory sur la 
 4176 'disquette et libère le tampon 30
 4180 PRINT"    Secteur de directory  recr{{    ":WAIT W:RETURN
 4181 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 
 4200 '
 4210 'Ce S/P cherche la 1e entrée libre et édite le sect de directory trouvé 
 4211 'En entrée: Rien de spécial
 4212 'En sortie: P2, S2, EL et le tampon 30 est libéré 
 4220 PD=#14:SD=#04
 4221 'Ici PD,SD sont les Piste,Secteur du premier secteur de Directory 
 4222 'par la suite PD,SD ciblent le dernier secteur de directory connu 
 4223 'Tous les sect de directory de la piste #14, c'est à dire les secteurs 
 4224 '#04, #07, #0A, #0D et #10 (4, 7, 10, 13 et 16), sont réservés dans 
 4225 'la bitmap. A part ça, ils fonctionnent normalement. Au départ ils sont 
 4226 'remplis de #00 (sauf le 3e octet du premier secteur qui est à #10, 
 4227 'offset de la 1e Entrée Libre EL) 
 4230 GOSUB 3820
 4231 'Le S/P 3820 réserve le tampon 30 pour un sect de directory dont tous 
 4232 'les champs ont été correctement définis (pas comme lors de la création 
 4233 'd'un nouveau sect de directory cf S/P 4120). Le tampon 30 reste ouvert 
 4240 TAKE 30,PD,SD : PDSUIV > P2 : SDSUIV > S2 : ENTLIB > EL
 4241 'Copie le secteur de directory PD,SD dans le tampon 30
 4242 'Copie champ PDSUIV Piste du Directory SUIVant dans variable P2
 4243 'Copie champ SDSUIV Secteur du Directory SUIVant dans variable S2
 4244 'Copie ENTLIB offset de la première ENTrée LIBre dans variable EL
 4250 IF EL<>0 THEN GOSUB 3910:RETURN
 4251 'Il reste au moins une entrée libre dans le secteur de directory PD,SD 
 4252 'Le S/P 3910 édite l'entrée libre de ce secteur, réécrit Le tampon 30 
 4253 'sur la disquette, puis le libére. Si un nouveau secteur de directory 
 4254 'a été crée, le lien avec le secteur précédent est mis à jour 
 4260 IF EL=0 AND S2<>0 THEN PD=P2:SD=S2:GOTO 4240
 4261 'Si le sect de directory PD,SD est plein, mais qu'il existe un secteur 
 4262 'de directory suiv, ajuste les coord PD,SD sur ce sect suivant et 
 4263 'reboucle en 4240 (Le tampon 30 est toujours ouvert et valide)
 4270 IF EL=0 AND S2=0 THEN P3=PD:S3=SD:CLOSE 30
 4271 'Le sect de directory PD,SD est plein et il n'y a pas de sect suivant 
 4272 'Il faut en créer un. P3,S3 gardent les coordonnées PD,SD du dernier 
 4273 'secteur de directory pour pouvoir le recharger et metttre à jour le 
 4274 'lien vers le nouveau secteur de directory créé. CLOSE Libère le 
 4275 'tampon 30. Deux cas possibles pour créer un nouveau directory: 
 4276 '1) Tous les sect réservés sont utilisés, on peut donc utiliser CRESEC 
 4277 '2) Si tous les secteurs réservés n'ont pas été utilisés, on ne peut 
 4278 'pas utiliser CRESEC car il ne peut pas trouver un secteur réservé 
 4279 '**Création d'un nouveau secteur de directory
 4280 PRINT"  Pas d'entr{e  de directory libre  "
 4285 PRINT"            Patience ...            "
 4290 IF PD>20 THEN GOSUB 4120:GOTO 4230
 4291 'Tous les secteurs réservés sont situés sur la piste 20. Si la liste 
 4292 'des secteurs réservés est épuisée, le S/P 4120 va créer un nouveau 
 4293 'secteur de directory avec CRESEC, le mettre complétement à zéro (sauf 
 4294 'EL=#10), le sauver et fermer le tampon. Puis reboucle en 4230
 4300 SD=SD+3:IF SD>16 THEN GOSUB 4120:GOTO 4230
 4301 'Sinon, on passe au sect de directory réservé suivant. Si SD>16 tous 
 4302 'les secteurs de directory réservés ont déjà été utilisés, on retombe 
 4303 'dans le cas précédent. 
 4304 'Si SD n'est pas >16, le secteur réservé ciblé par SD=SD+3 est valide 
 4305 'Cependant, même si le lien précédent était nul, ce sect de directory 
 4306 'peut déjà avoir été utilisé et contenir d'anciennes infos périmées 
 4307 'qu'il faut supprimer, ce que va faire le S/P 4130 qui suit
 4310 GOSUB 4130:GOTO 4230
 4311 'Le S/P 4130 réserve le tampon 30 dont les champs sont configurés pour 
 4312 'réinitialiser un secteur de directory, puis il y copie le secteur 
 4313 'PD,SD dont il met tous les octets à zéro (sauf le 3e qui est mis à 
 4314 '#10 pour cibler le première entrée libre), enfin il sauve ce secteur 
 4315 'de directory vierge et ferme le tampon 30. Reboucle pour réserver le 
 4316 'tampon 30 reconfiguré cette fois pour y recevoir un sect de directory 
 4317 'La 1e entrée libre du secteur PD,SD est alors recherchée puis éditée 
 4318 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 4400 '
 4401 'Ce S/P récupère les données du descript principal d'un fichier mergé 
 4402 'En entrée: P1, S1, F1 et tampon 10 ouvert avec les champs appropriés 
 4403 'En sortie: FD, P1, S1, TF, DE, FI, EX, NB, NS, NR, PL(), SL() et le 
 4404 'tampon 10 est libéré 
 4405 'En principe, les coordonnées P1,S1 en entrée sont celles d'un 
 4406 'descripteur principal de fichier mergé, mais il faut vérifier 
 4410 F1=F1+1 : TAKE 10,P1,S1 : FDESCR > FD
 4411 'F1 indique le nombre de descripteurs principaux qui ont été chargés 
 4412 'TAKE prend le descripteur de coordonnées P1,S1 dans le tampon 10 
 4413 'Copie le champ FDESCR (1 octet) dans la variable FD (Flag Descripteur) 
 4414 'pour vérifier que le secteur chargé est bien un descripteur principal 
 4420 IF FD<>#FF THEN POP:GOTO 2220
 4421 'Si ce n'est pas un descripteur principal, sort du programme et affiche 
 4422 'un message d'erreur. 
 4430 GOSUB 4510:PRINT"Descripteur principal f.merg{ trouv{"
 4431 'Le S/P 4510 restaure le secteur de descripteur P1,S1 en cours car ses 
 4432 'coordonnées n'ont pas été fournies par CRESEC, mais par le lien du 
 4433 'descripteur précédent et il n'a donc pas encore été restauré 
 4440 PDSUIV > P1 : SDSUIV > S1
 4441 'Copie le champ PDSUIV (1 octet) dans la variable P1 (Piste Descr SUIV) 
 4442 'Copie le champ SDSUIV (1 octet) dans variable S1 (Sect Descript SUIV) 
 4443 'P1,S1 sont donc les nouvelles coordonnées du descripteur suivant
 4450 NBRSEC > NB:IF NB < 123 THEN NS=NB ELSE NS=122
 4451 'Copie le champ NBRSEC dans la variable NB qui est le nombre total de 
 4452 'secteurs du fichier à charger en mémoire. NS est le nombre de secteurs 
 4453 'listés dans le descripteur en cours, soit 122 au maximum dans un 
 4454 'descripteur principal
 4460 NR=NB-122: IF NR < 0 THEN NR=0
 4461 'NR est le Nombre de sect Restants à lister après ceux du descripteur 
 4462 'en cours. Si NR>0, il y aura encore au moins un descripteur secondaire 
 4470 FOR K=1 TO NS:PDSACH(K) > PL(K):SDSACH(K) > SL(K):NEXT
 4471 'Pour chacun des NS secteurs listés dans ce descripteur, on copie les
 4472 'coordonnées piste,secteur dans PL() et SL() en attente de restauration
 4480 CLOSE 10:NZ=NZ+NB+1
 4481 'CLOSE libère le tampon 10, ainsi que les noms de champs associés 
 4482 'NZ, nombre total de secteur, descripteurs inclus est actualisé avec NB 
 4483 'plus un pour ce descripteur principal de fichier mergé 
 4490 RETURN
 4491 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 
 4500 '
 4501 'Ce S/P  restaure un seul secteur: celui du descripteur en cours
 4502 'En entrée: P1 et S1 les coordonnées du secteur à restaurer
 4503 'En sortie: Le secteur a été restauré et la bitmap mise à jour
 4504 'Note: Seul le premier descripteur est recherché avec l'aide de CRESEC 
 4505 'Or CRESEC a non seulement fourni sa localisation FP et FS, mais a 
 4506 'aussi restauré ce premier descripteur. Ce n'est pas le cas pour les 
 4507 'autres descript dont la localisation est fournie par le descripteur 
 4508 'précédent (lien P1,S1). Il faut donc restaurer le descripteur en cours 
 4510 PMAP
 4511 'Charge la bitmap 
 4520 CRESEC
 4521 'CRESEC cherche le 1er secteur libre et le marque "occupé", décrémente 
 4522 'le nombre de secteurs libres et retourne les coordonnées FP et FS de 
 4523 'ce secteur. Mais est-ce le descripteur recherché? 
 4530 IF FP=P1 AND FS=S1 THEN 4550 
 4531 'Si coordonnées identiques, c'est le bon secteur, continue en 4550
 4540 Y=Y+1:TI(Y)=FP:SI(Y)=FS:GOTO 4520
 4541 'Sinon, Ajuste l'index Y et copie FP et FS dans les tableaux TI() et 
 4542 'SI() qui sauvegardent les coordonnées des secteurs inappropriés et 
 4543 'reboucle pour que CRESEC recherche le secteur libre suivant. Si 
 4544 'tous les secteurs libres de la disquette ont été explorés sans succès, 
 4545 'un "DISK FULL ERROR" s'affiche (échec de la restauration) 
 4550 SMAP:PRINT"   Le descripteur a {t{  restaur{   ";
 4551 'Enregistre la bitmap et affiche la progression de la restauration
 4552 'Y pointe sur les coordonnées du dernier secteur inapproprié 
 4560 GOSUB 3320:RETURN
 4561 '3320 est un S/P qui libère les Y secteurs inappropriés listés dans 
 4562 'TI() et SI()
 4563 'oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
