<        S I S   C M S 5   13
         PAGE
         PAGE
<
<
<        N O Y A U   D E   L A   G E S T I O N
<                    D E S   F I C H I E R S  :
<
<
<        PHILOSOPHIE :
<                      LE SGF POSSEDE UN NOYAU, DONT LA DESCRIPTION SUIT
<                    AU NIVEAU DU NOYAU DU SGF ('NSGF'), LE SYSTEME
<                    DISTINGUE LES FICHIERS A L'AIDE DE LEUR
<                    'NOM-DIRECT'. LE 'NOM-DIRECT' EST UN NUMERO
<                    ASSOCIEE AU FICHIER, ET ALLOUE BIUNIVOQUEMENT
<                    AU MOMENT DE SA CREATION.
<                      UNE TABLE 'TEDF' OU TABLE DES ETATS FICHIERS
<                    EST LE COEUR DE CE SYSTEME. ELLE CONTIENT SUR 4 BITS
<                    ET DE MANIERE RESIDENTE, L'ETAT DE CHACUN DES FI-
<                    CHIERS. LA CAPACITE DE 'TEDF' DONNE LE NBRE MAXIMUM DE
<                    DE FICHIERS DU SYSTEME. IL EST A NOTER QUE
<                    TOUS LE FICHIERS DU SYSTEME, ETANT DONNE
<                    LEUR 'NOM-DIRECT' SONT ACCESSIBLES,MEME
<                    S'ILS SONT INEXISTANTS...
<                      LES ENTREES DANS 'TEDF' SONT DE 2 TYPES :
<
<                                    - ENTREE PAR 'NOM-DIRECT' : ON
<                                    DONNE LE 'NOM-DIRECT' DU FICHIER,
<                                    OBTIENT EN RETOUR SON ETAT,
<                                    - ENTREE PAR ETAT : ON DONNE
<                                    UN ETAT RECHERCHE, ET UN MASQUE
<                                    INDIQUANT QUELS SONT LES BITS
<                                    D'ETAT SIGNIFICATIFS, ET ON
<                                    OBTIENT EN RETOUR LE 'NOM-DIRECT'
<                                    DU 1ER FICHIER COINCIDANT. IL
<                                    EST A NOTER QU'AINSI ON PEUT OBTE-
<                                    NIR LES ENTREES LIBRES DE TEDF, EN
<                                    RECHERCHANT LES FICHIERS D'ETAT
<                                    INEXISTANTS...
<
<                      UN FICHIER NON UTILISE EST DIT A L'ETAT 'CLOSE',
<                    UN FICHIER UTILISE EST DIT A L'ETAT 'OPEN'. UN FICHIER
<                    FICHIER INEXISTANT EST DONC 'CLOSE '. LORSQU'UN
<                    FICHIER EST 'OPEN' ON LUI ALLOUE (DANS LA MESURE
<                    DU POSSIBLE UNE DCT DE GESTION DE FICHIER, ET
<                    DONC UN NSPXXX. TOUS LES ACCES SE FERONT PAR
<                    L'INTERMEDIAIRE DE CE NSPXXX, ET DONC D'UN
<                    HANDLER DE GESTION DE FICHIER.
<
<
<        NOTA :
<                      LES 'NOMS-DIRECTS' COMMEN-
<                    CENT A 0, MAIS CE PREMIER
<                    FICHIER N'EST PAS UTILISABLE...
<
<
         PAGE
<
<
<                    C O M P T A G E   O U
<        R E C H E R C H E   D ' U N   F I C H I E R
<                    D ' E T A T   D O N N E  :
<
<
<        FONCTION :
<                      SUIVANT LA VALEUR DU BIT ARGUMENT
<                    'XXBKFE' DANS 'A', 'LOOKF', SOIT
<                    RECHERCHE UN FICHIER POSSEDANT L'ETAT
<                    DEMANDE, SUIVANT LE MASQUE DONNE,
<                    SOIT COMPTE TOUS LES FICHIERS Y
<                    REPONDANT.
<
<
<        ARGUMENTS :
<                    (A)=MASQUE ET ETAT RECHERCHE :
<                                    BIT0(XXBKFE)=RECHERCHE (0), OU
<                                                 COMPTAGE (1),
<                                    BIT12-15=ETAT RECHERCHE,
<                                    BIT8-11=MASQUE DES BITS SIGNIFICATIFS
<                                            (LA RECHERCHE NE PORTENT QUE SUR
<                                            LES BITS QUI SONT A 1 DANS LE
<                                            MASQUE).
<
<
<        RESULTAT :
<                    (A)=NOM DIRECT DU FICHIER COINCIDANT SI XXBKFE=0,
<                       =NOMBRE DE FICHIERS COINCIDANT SI XXBKFE=1.
<
<
<        NOTA :
<                      DANS LE CAS OU AUCUNE
<                    COINCIDENCE N'EST TROUVEE
<                    LE DEMANDEUR EST BLOQUE
<                    JUSQU'A SATISFACTION...
<
<
         USE         L,DCT0
         USE         W,DEM0
<
<
<        A T T E N T I O N  :
<                      EN ENTRANT ICI, ON EST A
<                    L'ETAT 'RQST &ASXSGF', CE QUI
<                    SIGNIFIE QUE L'ON EST EN PHASE
<                    CRITIQUE 'SGF'...
<
<
LOOKF:   EQU         $
         PSR         B,X,Y
         IF          NBITMO=K-NBITEF,,XEIF%,
         IF          ATTENTION : 'SEPAR' NE VA PAS FONCTIONNER CORRECTEMENT !!!
XEIF%:   VAL         ENDIF
         BSR         ASEPAR
<
<        ON A DONC AU RETOUR :
<                    (A)=MASQUE DE RECHERCHE,
<                    (B)=ETAT RECHERCHE.
<
         ANDR        A,B             < ON TROUVE DANS B :
                                     < (B)=(ETAT CHERCHE)&(MASQUE).
         TBT         XXBKFE+NBITEF   < RECHERCHE OU COMPTAGE ???
         RBT         XXBKFE+NBITEF
         LR          A,Y             < (Y)=MASQUE.
         JC          E178X           < COMPTAGE...
<
<
<        R E C H E R C H E   D E   L A   P R E M I E R E
<                    C O I N C I D E N C E  :
<
<
E178:    EQU         $
         LXI         LTEDF           < POUR PARCOURS PAR MOT DE TEDF.
E175:    EQU         $
         LA          &ATEDF          < ACCES A 1 MOT DE TEDF, C'EST-
                                     < A-DIRE AUX ETAS DE 4 FICHIERS.
         PSR         X               < SAVE INDEX-MOT DE TEDF.
         LXI         NBITMO/NBITEF   < INDEX DES ETATS DU MOT COURANT
                                     < DE TEDF.
E176:    EQU         $
         PSR         A               < SAVE LE MOT COURANT DE TEDF.
         ANDR        Y,A             < ON NE CONSERVE QUE L'ETAT COURANT,
                                     < ET DANS L'ETAT COURANT, ON
                                     < NE CONSERVE QUE LES BITS SIGNIFICATIFS
                                     < -CATIFS.
         CPR         A,B             < COMPARAISON DE L'ETAT RECHERCHE
                                     < ET ETAT COURANT...
         PLR         A               < RESTAURATION DU MOT COURANT
                                     < DE TEDF.
         JE          E177            < OK, IL Y A COINCIDENCE.
<
< CAS OU IL N'Y A PAS COINCIDENCE :
<
         SLRS        NBITEF          < ACCES A L'ETAT DE 4 BITS
                                     < PRECEDENT DANS LE MOT COURANT.
         JDX         E176            < ETAT PRECEDENT DE 4 BITS.
         PLR         X               < RESTAURATION DE L'INDEX MOT
                                     < DE TEDF.
         JDX         E175            < ACCES A L'ENTREE MOT PRECEDENTE
                                     < DE TEDF.
<
< CAS OU L'ON N'A TROUVE AUCUNE COINCIDENCE :
<
E178XX:  EQU         $
         LAD         &ASXSGF
         BSR         ARLSE
         RQST        &ASAST          < LE CHERCHEUR SE MET EN ATTENTE
                                     < D'UN EVENEMENT QUI MODIFIE L'ETAT
                                     < D'UN FICHIER, ET POUVANT PEUT-ETRE
                                     < ETRE AINSI LE SATISFAIRE...
         RQST        &ASXSGF         <<<NBITEF-N    < ON NE CONSERVE QUE LES 4 BITS.
         JMP         E180
<
< DEBLOCAGE DES TACHES EN ATTENTE DANS LOOKF, A CHAQUE FOIS
< QU'UN ETAT FICHIER EST MODIFIE :
<        MASQUE#0...
<
RTRY1:   EQU         $
         LAD         &ASAST
         BSR         ARLSE
         JMP         RTRY
RTRY2:   EQU         $
         LAD         &ASAST
         BSR         ARLSE
         JMP         RTRY3           < INUTILE DE RETESTER SAST...
         PAGE
<
<
<        A C C E S   A   L A   T A B L E   D E S
<        P A R T I T I O N S   D ' U N   F I C H I E R   :
<
<
<        ARGUMENTS :
<                    (X)=NOM-DIRECT DU FICHIER DONT ON DESIRE LA TP,
<                    (A)=ETAT DU FICHIER CORRESPONDANT A LA TP.
<
<        RESULTAT :
<                    (W)=ADRESSE DE LA TP DU FICHIER EN MEMOIRE.
<
<
<        A T T E N T I O N  :
<                      ON EST EVIDEMMENT A L'INTERIEUR
<                    D'UNE PHASE CRITIQUE...
<
<
<        FORMAT D'UNE TP :
<                    MOT0-111 : ADRESSE SECTEUR DES LISTES SEQUENTIELLES
<                    DES PARTITIONS DE CLEFS,
<                    MOT112-YM7 : LIBRES POUR LA DESCRIPTION DU FICHIER,
<                    EN PARTICULIER, LE DERNIER MOT CONTIENT LE NBRE D'UTIL-
<                    SATEURS SIMULTANES SUR CE FICHIER.
<
<
XXTP1::  MOT         O               < PREMIER MOT DE LA LISTE DES PARTITIONS.
XXTP2::  MOT         112             < PREMIER MOT LIBRE (PATCH,...).
XXTP1L:: VAL         XXTP2-D         < NUMERO DE LA PLUS GRANDE CLASSE...
XXTP3::  MOT         YM7             < NOMBRE D'UTILISATEURS SIMULTANES.
<
<
         USE         W,DEM0
ACTP:    EQU         $
         PSR         B,X,Y
         PSR         A               < SAVE A PART L'ETAT DU FICHIER.
         LA          AALBTP          < (A)=@DEMANDE ALLOCATION 1 BUFFER.
         LR          A,W             < (W)=@DEMANDE ALLOCATION POUR CHAND.
                                     <     ('W' EST INITIALISE AVEC LA
                                     <     DEMANDE D'ALLOCATION BUFFER, MEME
                                     <     S'IL N'Y A RIEN A ATTENDRE...)
         IC          WEIO            < DE PLUS ON MET LE 'BETA' A 1,
                                     < AFIN D'EVITER DES BLOCAGES
                                     < DANS LE CAS OU IL N'Y AURAIT RIEN A
                                     < RIEN A ATTENDRE.
         STZ         ARGDEM+ETADEM   < A CAUSE DE 'CHANW', SI 'CHAND'
                                     < N'A PAS LIEU...
         LR          X,B             < (B)=NOM DIRECT.
         LXI         K               < INITIALISATION DE L'INDEX
                                     < DOUBLE-MOT DE TATP.
         LY          LTATP           < ACCES A LA LONGUEUR CORANTE
                                     < DE TATP.
         CPZR        Y               < TEST DE TATP VIDE :
         JE          E249            < LA TABLE ASSOCIATIVE ETANT
                                     < VIDE INUTILE DE CHERCHER.
<
< CAS OU IL Y A AU MOINS UNE ENTREE OCCUPEE DANS TATP :
<
         ADR         Y,Y             < TATP ETANT UNE TABLE DE DOUBLE-MOTS
                                     < LE DOUBLE DE SA LONGUEUR DONNE
                                     < UNE BORNE SUPERIEURE DE SON
                                     < INDEX X.
         IF          UTATP-2,,XEIF%,
         IF          ATTENTION : LE 'ADR Y,Y' EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
E222:    EQU         $
<
< PARCOURS DE LA TABLE ASSOCIATIVE :
<
         LA          &ATATP0         < ACCES A UN NOM-DIRECT DANS A.
<
<        NOTA :
<                      LE PARCOURS DE TATP SE FAIT DE SA TETE (X=K)
<                    VERS SA QUEUE (X=2*LTATP-2), C'EST-A-DIRE
<                    DANS L'ORDRE DES USAGES MOINDRES DES TP (CF. LRU).
<
         CPR         A,B             < LE NOM-DIRECT TROUVE EST-IL
                                     < CELUI CHERCHE...
         JE          E221            < OUI, TOUT EST BON...
<
< CE N'EST PAS LE NOM DIRECT, REGARDONS SI CETTE ENTREE
< DE LA TABLE ASSOCIATIVE CONTIENT EN FAIT UN BUFFER
< STOCKE A L'AVANCE :
<
         JAL         E229            < CE N'EST PAS LA PEINE D'ALLER PLUS
                                     < LOIN (A=-1), LE NOM DIRECT CHERCHE
                                     < N'EST APS DANS LA TABLE ASSOCIATIVE
                                     < ON VA LE METTRE EN CORRESPONDANCE
                                     < AVEC LE BUFFER D'AVANCE.
<
< NON RIEN DE TOUT CELA, PASSONS
< A L'ENTREE SUIVANTE DE 'TATP' :
<
         ADRI        UTATP,X         < TATP EST UNE TABLE DE DOUBLE-MOTS.
         CPR         X,Y             < EST-ON AU BOUT DE TATP...
         JNE         E222            < NON
<
< CAS OU LE NOM DIRECT CHERCHE N'EST PAS DANS TATP,
< ET OU IL N'Y A PAS DE BUFFER EN STOCK :
<
         LA          LTATP
         CPI         LMTATP          < A-T'ON DEJA ALLOUE UN MAX DE BUFFER
         JE          E223            < OUI, IL FAUT UTILISER CE QU'ON
                                     < A DEJA.
<
< CAS OU A ENCORE LE DROIT DE DEMANDER UN BUFFER :
<
E249:    EQU         $
<
<        RAPPEL :
<                      'X' POINTE LA PREMIERE
<                    ENTREE SUIVANT LA QUEUE DE
<                    'TATP'.
<
<
< CALCUL DE L'ADRESSE OU METTRE
< L'EVENTUELLE ADRESSE DU BUFFER ALLOUE :
<
         LA          ATATPI          < ACCES A L'ADRESSE DE TATP+1.
         ADR         X,A             < ON AJOUTE L'INDEX DE LA 1ERE
                                     < ENTREE LIBRE.
         STA         ARGDEM+AMDEM    < MAJ DE LA DEMANDE.
<
< CHOIX ENTRE FAIRE ATTENDRE LE HANDLER OU NE PAS LE
< FAIRE ATTENDRE S'IL N'Y A RIEN DE LIBRE DANS LE
< POOL DES BUFFERS :
<
         LA          ARGDEM+OPDEM
         CPZR        Y               < A-T'ON AU MOINS UNE ENTREE
                                     < DANS TATP, SI OUI ON POURRA LA
                                     < RECUPEREER SI RIEN N'EST LIBRE,
                                     < SI NON, IL FAUT ATTENDRE UN BUFFER
                                     < QU'IL Y EN AIT OU QU'IL N'Y EN AIT
                                     < AIT PAS...
         JNE         E225            < OUI AU MOINS UN BUFFER, ON EST
                                     < PAS OBLIGE DE FAIRE ATTENDRE
                                     < LE HANDLER.
         RBT         WAITB           < DANS LE CAS CONTRAIRE, ON LUI DEMN
                                     < ON LUI DEMANDE D'ATTENDRE.
         STA         ARGDEM+OPDEM
E225:    EQU         $
         BSR         ACHAND          < ENVOI DE LA DEMANDE DE BUFFER.
         WAIT        WEIO            < ATTENTE DE LA REPONSE DE MALOC.
         SBT         WAITB           < RETOUR A PRIORI A L'ETAT
                                     < NE PAS FAIRE ATTENDRE LE HANDLER.
         STA         ARGDEM+OPDEM
<
< ANALYSE DES CONDITIONS DE RETOUR DE MALOC :
<
         LA          ARGDEM+ETADEM   < (A)=NBRE DE BUFFERS ENCORE
                                     <     A ALLOUER : 0 OU 1.
         STZ         ARGDEM+ETADEM   < A CAUSE DE 'CHANW' SI PAS 'CHAND'...
         IC          WEIO            < REMISE A 1 DU 'BETA'.
         JANE        E223            < ET NON RIEN N'EST DISPONIBLE...
<
< CAS OU UN BUFFER AU MOINS ETAIT
< DISPONIBLE DANS LE POOL :
<
         IC          LTATP           < ET UN BUFFER DE PLUS.
         LA          &ATATP1
         SLRS        NOCMO=K         < L'ADRESSE OCTET DU BUFFER EST
                                     < CONVERTIE EN UNE ADRESSE DE MOT.
         STA         &ATATP1
E224:    EQU         $
<
<        ON A ICI :
<                    (X)=INDEX DE L'ENTREE ALLOUEE AU NOM DIRECT DANS TATP.
<
         PLR         A               < RESTAURE ETAT-FICHIER.
         PSR         A               < AND SAVE IT...
         JAE         E226            < DANS LE CAS OU LE FICHIER N'A
                                     < JAMAIS ETE OUVERT (ETAT 0000),
                                     < ON INITIALISE SA TP EN MEMOIRE.
                                     < NOTA : LE BIT13 INDICATEUR DE
                                     < LA PARTAGEABILITE, DISCRIMINE
                                     < UN FICHIER QUI A DEJA ETE OUVERT
                                     < AU MOINS UNE FOIS, D'UN QUI NE
                                     < L'A JAMAIS ETE...
<
< CAS D'UN FICHIER DEJA EXISTANT: IL FAUT LIRE SA TP SUR DKF
<
         LAD         RTP
         LR          A,W             < (W)=@DEMANDE DE LECTURE DE LA TP.
         LR          B,A             < (A)=NOM DIRECT DU FICHIER.
         DO          XXXMOY
         ADRI        XXTP/XXXMOY,A   < CALCUL DE L'ADRESSE ABSOLUE
                                     < DE SA TP SUR DKF
         STA         ARGDEM+ASDEM    < MISE EN ASDEM.
         LA          &ATATP1         < LA TABLE ASSOCIATIVE DONNE
                                     < L'ADRESSE DU BUFFER.
         SLLS        NOCMO=K         < ADRESSE OCTET
         STA         ARGDEM+AMDEM    < MISE EN AMDEM.
         BSR         ACHAND          < ENVOI DE LA DEMANDE DE LECTURE.
         SLRS        NOCMO=K
E227:    EQU         $
         STB         &ATATP0         < LE NOM DIRECT DU FICHIER ARGUMENT
                                     < EST ENTRE DANS LA TABLE ASSOCIATIVE.
         CPZR        X               < EST-CE LA 1ERE ENTREE DE TATP...
         JE          E244            < OUI, INUTILE DE FAIRE CIRCULER
                                     < LA TABLE ASSOCIATIVE TATP.
<
< CIRCULATION LRU DE TATP :
<
E228:    EQU         $
<
<        ON A ICI :
<                    (A)=ADRESSE DU BUFFER ALLOUE AU NOM DIRECT,
<                    (B)=NOM DIRECT,
<                    (X)=INDEX DE L'ENTREE ALLOUEE AU NOM DIRECT.
<
         PSR         A,B
         LA          ATATP           < ACCES A L'ADRESSE DE TATP.
         LR          A,B
         ADRI        UTATP,B
<
<        ON A ICI :
<                    (A)=ADRESSE ZONE EMETTRICE,
<                    (B)=ADRESSE ZONE RECEPTRICE,
<                    (X)=NBRE DE MOTS A TRANSFERER.
<
         MOVE
<
<        RAPPEL :
<                      ON A DONC ICI, APRES LE
<                    'MOVE' : (X)=0...
<
         PLR         A,B             < RESTAURE :
                                     < (A)=ADRESSE DU BUFFER,
                                     < (B)=NOM-DIRECT.
         STB         &ATATP0         < LE NOM DIRECT DU FICHIER
                                     < ARGUMENT ENTRE EN TETE DE TATP.
         STA         &ATATP1         < DE MEME LE BUFFER QUI LUI EST
                                     < ALLOUE.
E244:    EQU         $
<
< ATTENTE D'EVENTUELLES E/S :
<
         BSR         ACHANW          < ATTENTE DE FIN...
         LR          A,W             < RENVOI DU RESULTAT AU DEMANDEUR
                                     < DANS W : (W)=@BUFFER ALLOUE A LA TP.
         PLR         A
         PLR         B,X,Y
         RSR
<
< CAS OU LA TATP EST PLEINE, OU BIEN OU L'ALLOCATION
< D'UN BUFFER EST IMPOSSIBLE :
<
E223:    EQU         $
<
< RETOUR SUR LA QUEUE DE TATP, C'EST EN EFFET THEORIQUEMENT
< LE NOM DIRECT LE MOINS UTILISE PARMI CEUX QUI
< SONT EN MEMOIRE :
<
         ADRI        -UTATP,X        < RETOUR SUR LA QUEU DE TATP.
         LA          &ATATP0         < ACCES AU NOM DIRECT DE LA QUEUE.
         BSR         ARWTP           < ENVOI D'1NE DEMANDE D'ECRITURE
                                     < SUR DKF
         JMP         E224            < ALLONS TESTER L'ETAT DU FICHIER..
<
< CAS OU L'ON A TROUVE UN BUFFER EN STOCK DANS TATP :
< (CE QUI SIGNIFIE QUE LE NOM-DIRECT CHERCHE N'Y EST PAS)
<
E229:    EQU         $               < CAS BUFFER EN STOCK :
         DC          NBATP           < ET UN BUFFER EN STOCK DE MOINS.
         JGE         SYSRC1          < OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      FAIRE ATTENTION A L'ADRESSE DU BUFFER
<                    EN STOCK RECUPERE DANS 'B', ELLE DOIT
<                    ETRE MAUVAISE...
<
SYSRC1:  EQU         $
         STB         &ATATP0         < LE NOM DIRECT EST MIS EN CORRES-
                                     < PONDANCE AVEC LE BUFFER EN STOCK.
         JMP         E224            < ALLONS ACCEDER A LA TP
                                     < DU FICHIER, SI CELLE-CI EXISTE.
<
< CAS OU ON A TROUVE LE NOM-DIRECT DANS TATP :
<
E221:    EQU         $               < CAS OU ON ATROUVE LE NOMDIRECT.
         LA          &ATATP1         < ACCES A L'ADRESSE DU BUFFER ALLOUE.
         CPZR        X               < EST-ON TOMBE SUR LA 1ERE ENTREE...
         JE          E244            < SI ON EST DEJA EN TETE INUTILE
                                     < DE FAIRE UNE CIRCULATION DE TATP.
         JMP         E228            < ALLONS FAIRE CIRCULER TATP.
<
< CAS D'UN FICHIER ENCORE JAMAIS OUVERT :
<
E226:    EQU         $
<
< INITIALISATION DE LA TP DU FICHIER, EN MEMOIRE :
<
         LA          &ATATP1         < ACCES A L'ADRESSE DU BUFFER.
         ADRI        -IJIJDX,A       < POUR INDEXATION / A 1.
         SBT         BITX            < POSITIONNEMENT DE L'INDEX.
         STA         AINITP          < GENERATION D'UN RELAI D'INITIALISATION
                                     < NON REENTRANT.
         LAI         K               < INIT. DE TP.
         PSR         X
         LXI         YY7             < UNE TP FAIT YY7 MOTS.
         BSR         ACHANW          < ATTENTE EVENTUELLE D'UNE FIN
                                     < ECRITURE DISQUE.
E230:    EQU         $
         XR          A,X
         CPI         XXTP1L+IJIJDX   < EN EST-ON A LA LISTE DES CLEFS ???
         XR          A,X
         JNE         E230X           < NON, (A)=K...
         LA          INFINI          < OUI, ON FAIT A <-- (INFINI)...
         IF          XXTP1-K,,XEIF%,
         IF          ATTENTION : CETTE INITIALISATION EST IDIOTE !!!
XEIF%:   VAL         ENDIF
E230X:   EQU         $
         STA         &AINITP         < INITIALISATION DE LA 'TP'...
         JDX         E230
         IF          XXTP3-XXTP2,,,XEIF%
         IF          ATTENTION : CE QUI PRECEDE EST IDIOT !!!
XEIF%:   VAL         ENDIF
         PLR         X
         IC          WEIO            < EN EFFET UN WAIT DE LECTURE SUR
                                     < DKF VA SUIVRE...
         STZ         ARGDEM+ETADEM   < A CAUSE DE 'CHANW' SI PAS 'CHAND'...
         LA          &ATATP1         < RESTAURE : (A)=@BUFFER ALLOUE.
         JMP         E227
         PAGE
<
<
<        D E L E T E   D ' U N   N O M   D I R E CT
<        D A N S   L A   T A B L E   A S S O C I A T I V E   T A T P  :
<
<
<        ARGUMENT :
<                    (X)=NOM DIRECT DU FICHIER.
<
<
DETP:    EQU         $
         PSR         A,B,X,Y
         LR          X,A             < (A)=NOM DIRECT.
         LY          LTATP           < ACCES A LA LONGUEUR COURANTE DE
                                     < LA TABLE ASSOCIATIVE.
         CPZR        Y               < TATP EST-ELLE VIDE...
         JE          E240            < OUI, RIEN A FAIRE...
         LXI         K               < INITIALISATION DE L'INDEX DE
                                     < PARCOURS DE TATP.
         ADR         Y,Y             < DOUBLEMENT DE LA LONGUEUR PUISQUE
                                     < TATP EST EN DOUBLE-MOTS.
E242:    EQU         $
<
< RECHERCHE DU NOM DIRECT DANS TATP :
<
         CP          &ATATP0         < COMPARAISON AVEC LE NOM
                                     < DIRECT COURANT DE TATP.
         JE          E241            < OK TROUVE.
         ADRI        UTATP,X         < PASSONS A L'ENTREE SUIVANTE
                                     < DANS TATP.
         CPR         X,Y
         JNE         E242
<
< CAS OU LE NOM DIRECT N'ETAIT PAS DANS TATP, RIEN A FAIRE :
<
E240:    EQU         $
         PLR         A,B,X,Y
         RSR
<
< CAS OU ON TROUVE LE NOM DIRECT DANS LA TABLE ASSOCIATIVE :
<
E241:    EQU         $
<
<        ON A ICI :
<                    (A)=NOM DIRECT DU FICHIER,
<                    (X)=INDEX DE L'ENTREE CONTENANT LE FICHIER DANS TATP.
<
         BSR         ARWTP           < ECRITURE DE SA TP SUR DKF
         PSR         A               < RAPPEL : RWTP RENVOIE DANS A
                                     < L'ADRESSE DU BUFFER DONT ON
                                     < DELETE L'ENTREE DANS TATP.
         LA          ATATP           < ACCES A L'ADRESSE DE TATP.
         ADR         X,A             < CALCUL DE L'ADRESSE DE L'ENTREE
                                     < DU NOM DIRECT RELEASE.
         SBR         Y,X
         NGR         X,X             < CALCULE DU NBRE DE MOTS DE L'ENTREE
                                     < DU NOM DIRECT JUSQU'A LA QUEUE DE TATP.
         ADRI        -UTATP,X        < CACUL DU NBRE DE MOTS A DEPLACER.
         CPZR        X
         JE          E248            < ON EST DEJA EN QUEUE DE TATP,
                                     < INUTILE DE FAIRE LE MOVE.
         LR          A,B             < (B)=@ZONE RECEPTRICE,
         ADRI        UTATP,A         < (A)=@ZONE EMETTRICE.
         XR          A,X
         SLRS        UTATP=K         < LE NBRE DE MOTS A DEPLACER
         IF          UTATP-2,,XEIF%,
         IF          ATTENTION : LE 'SLRS' PRECEDENT EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
                                     < EST DIVISE PAR 2.
         XR          A,X
<
<        ON A ICI :
<                    (X)=NBRE DE DOUBLE-MOTS A DEPLACER,
<                    (A)=ADRESSE ZONE EMETTRICE,
<                    (B)=ADRESSE ZONE RECEPTRICE.
<
<
<        A T T E N T I O N  :
<                      UN 'MOVE' SE FAISANT PAR ADRESSE DECROISSANTE,
<                    ON NE PEUT FAIRE REMONTER TATP EN UN SEUL MOVE,
<                    IL FAUT EN FAIRE AUTANT QU'IL Y A DE DOUBLE-MOTS...
<
E247:    EQU         $
         PSR         X               < SAVE NBRE DE DOUBLE-MOTS ENCORE
                                     < A DEPLACER.
         LXI         UTATP           < 1 DOUBLE-MOT=2 MOTS.
         MOVE                        < DEPLACEMENT D'UN DOUBLE-MOT.
         ADRI        UTATP,A         < DEPLACEMENT DE L'EMETTEUR DE
                                     < 2 MOTS.
         ADRI        UTATP,B         < DEPLACEMENT DU RECEPTEUR
                                     < DE 2 MOTS.
         PLR         X               < RESTAURE NBRE DE DOUBLE-MOTS
                                     < ENCORE A DEPLACER.
         JDX         E247            < DOUBLE-MOT SUIVANT (EVENTUELLEMENT...)
E248:    EQU         $
         PLR         B               < RESTAURE @BUFFER DONT L'ENTREE
                                     < DANS TATP VIENT D'ETRE RELEASEE.
                                     < (ANCIEN A).
         LR          Y,X
         ADRI        -UTATP,X        < (X)=INDEX DE LA QUEUE DE TATP.
         STB         &ATATP1         < LE BUFFER DONT L'ENTRRE EST
                                     < RELEASEE EST MIS EN QUEUE DE TATP
                                     < EN VUE D'UN EVENTUEL STOCKAGE...
<
< TEST SUR LE STOCK DES BUFFERS :
<
         LA          NBATP
         CPI         NMBA            < A-T'ON UNE RESERVE SUFFISANTE..
                                     < DE BUFFERS...
         JG          E243            < OUI.
<
< LE BUFFER DONT L'ENTREE A ETE
< RELEASEE EST MIS EN RESERVE :
<
         IC          NBATP           < ET UN BUFFER DE PLUS DANS LE STOCK.
         LAI         MFFFF
         STA         &ATATP0         < LE NOM DIRECT D'UN BUFFER EN
                                     < STOCK EST 'FFFF.
         BSR         ACHANW          < ATTENTE DE LA FIN D'ECRITURE DE TP.
         JMP         E240            < ET C'EST FINI.
<
< CAS OU LA RESERVE DE BUFFERS EST SUFFISANTE :
<
E243:    EQU         $
         DC          LTATP           < ON DIMINUE LA LONGUEUR DE TATP.
         LA          &ATATP1
         SLLS        NOCMO=K         < L'ADRESSE MOT DU BUFFER EST
                                     < CONVERTIE EN UNE ADRESSE OCTET.
         STA         &ATATP1
<
< PREPARATION DU RELEASE DU BUFFER :
<
         LA          ATATPI          < ACCES A L'ADRESSE DE TATP+1.
         ADR         X,A             < ADRESSE DE LA ZONE OU SE TROUVE
                                     < L'ADREESE DU BUFFER.
         LB          ARLBTP          < (B)=@DEMANDE RELEASE 1 BUFFER.
         BSR         ACHANW          < ATTENTE DE FIN D'ECRITURE DE TP
                                     < SUR DKF AVANT DE RENDRE LE
                                     < BUFFER
         LR          B,W             < (W)=@DEMANDE RELEASE 1 BUFFER.
         STA         ARGDEM+AMDEM    < MAJ DE LA DEAMNDE.
         BSR         ACHAND
         BSR         ACHANW          < ATTENTE DE FIN DE RELEASE.
         JMP         E240            < ET C'EST FINI...
         PAGE
<
<
<        E C R I T U R E   U N E   T P   S U R   D K  :
<
<
<        ARGUMENT :
<                    (A)=NOM DIRECT DE LA TP A ECRIRE,
<                    (X)=INDEX DE L'ENTREE.
<
<        RESULTAT :
<                    (A)=ADRESSE DU BUFFER QU'ON
<                        ENVOIE SUR DKF
<
<
RWTP:    EQU         $
         DO          XXXMOY
         ADRI        XXTP/XXXMOY,A   < CALCUL DE L'ADRESSE ABSOLUE
                                     < DU NOM DIRECT SUR DKF
         STA         WTPAS           < MAJ DE LA DEMANDE.
         LAD         WTP
         LR          A,W             < (W)=ARG DE CHAND.
         LA          &ATATP1         < ACCCES A L'ADRESSE DU BUFFER.
         SLLS        NOCMO=K
         STA         ARGDEM+AMDEM    < MISE EN AMDEM.
         BSR         ACHAND
         SLRS        NOCMO=K
         RSR
         PAGE
<
<
<        P H I L O S O P H I E   D E S   F I C H I E R S
<                    E T   D E   L E U R S   C L E F S  :
<
<
<        DEFINITIONS :
<                    1 - UN FICHIER EST CONSIDERE
<                    COMME UN ENSEMBLE ORDONNE DE
<                    CLEFS, LE CRITERE DE CE TRI
<                    ETANT L'ORDRE NUMERIQUE.
<
<                    2 - LA CLEF, EST LE NOM DONNE
<                    A UN ENREGISTREMENT LOGIQUE.
<
<                    3 - UN ENREGISTREMENT LOGIQUE,
<                    EST UNE SUITE SEQUENTIELLE DE
<                    Q-SECTEURS OU ENREGISTREMENTS
<                    PHYSIQUES.
<
<
<        ACCES A L'INFORMATION :
<                    1- ON DONNE UN NOM DIRECT DE FICHIER,
<                    2- ON ACCEDE A LA TABLE DES PARTITIONS DES CLEFS
<                    DE CE FICHIER,
<                    3- ON CHERCHE LA CLEF,
<                    4- ON ACCEDE A L'INFORMATION.
<
<
<        G E S T I O N   D E S   C L E F S  :
<                      ON VA DISPOSER POUR CHAQUE FICHIER D'UN CATALOGUE DES
<                    DES CLEFS. L'IDEAL SERAIT QUE CE CATALOGUE
<                    SOIT ENTIEREMENT A ACCES DIRECT, MAIS LE NBRE ELEVE
<                    DES CLEFS POSSIBLES REND IMPOSSIBLE LA CONSTITUTION
<                    D'UNE FONCTION BIJECTIVE DE RECHERCHE. LA SOLUTION
<                    ADOPTEE EST DONC LA SUIVANTE : UNE CLEF ETANT DONNEE
<                    ON DETERMINERA UNE CLASSE D'EQUIVALENCE A LAQUELLE
<                    ELLE APPARTIENDRA ; DANS CETTE CLASSE LA RECHERCHE
<                    SERA SEQUENTIELLE.
<                      DE PLUS UNE ETUDE EXPERIMENTALE MONTRE
<                    QUE LES 1ERES COMBINAISONS NUMERIQUES SONT TOUJOUTS
<                    LES PLUS UTILISEES (1,2,3,...20...). PAR CONSEQUENT
<                    LES CLASSES D'EQUIVALENCE DOIVENT ETRE DETERMINEES
<                    EN TENANT COMPTE DE CETTE REMARQUE  : LES CLASSES
<                    DE RANG FAIBLE CORRESPONDRONT A DES INTERVALLES
<                    NUMERIQUES FAIBLES.
<                      A CHAQUE FICHIER ON VA DONC ASSOCIER UNE TABLE
<                    DE YY7 MOTS (1 SECTEUR), DITES TABLE DES
<                    PARTITIONS TP. L'ENSEMBLE DE TOUTES LES TP
<                    S'APPELERA AUSSI TP. LA TABLE TP NE PEUT
<                    EVIDEMMENT ETRE RESIDENTE, PAR CONSEQUENT ELLE
<                    ELLE EST GEREE EN OVERLAY, LES TP LES PLUS
<                    UTILISEES AYANT LE PLUS DE CHANCE DE SE TROUVER
<                    RESIDENTE. LA GESTION DE CE RECOUVREMENT EST FAIT
<                    EN LRU, A L'AIDE D'UNE TABLE ASSOCIATIVE TATP,
<                    METTANT EN CORRESPONDANCE UN NOM DIRECT ET L'ADRESSE
<                    D'UN BUFFER ALLOUE A LA TP DE CE FICHIER.
<                      LA POLITIQUE DES BUFFERS EST LA SUIVANTE D
<                    DES BUFFERS SONT ALLOUES JUSQU'A CONCURENCE D'UN
<                    MAXIMUM (LMTATP), TANT QU'IL N'EST PAS ATTEINT
<                    ON DEMANDE L'ALLOCATION DE BUFFERS MAIS SANS ATTENTE
<                    S'ILS NE SONT PAS DISPONIBLES. LORS DU RELEASE D'UNE
<                    D'UNE ENTREE DE TATP ON STOCKE UN NBRE DE BUFFERS
<                    EN VUE D'UNE ALLOCATION ULTERIEURE.
<
<
<        F O R M A T   D ' U N E   C L E F :
<                      UNE CLEF EST CONSTITUEE DE 2 MOTS :
<                                    1- SA PARTIE ENTIERE PEK,
<                                    2- SA PARTIE DECIMALE PDK.
<
         PAGE
<
<
<        F O R M A T   D ' U N   S E C T E U R   D E   L I S T E
<        S E Q U E N T I E L L E   D E   C L E F S  :
<
<
XXSFS::  MOT         O               < MOT CONTENANT L'ADRESSE DU SECTEUR
                                     < SUIVANT DANS LA LISTE.
XXSFB::  MOT         XXSFS+D         < MOT CONTENANT L'ADRESSE DU SECTEUR
                                     < PRECEDENT DANS LA LISTE.
XXSFD::  MOT         XXSFB+D         < MOT CONTENANT '0000 S'IL NE S'AGIT
                                     < PAS D'UN SECTEUR DE DEBORDEMENT, ET
                                     < UN DEPLACEMENT VERS LE MOT LE CHAINANT
                                     < PAR DEBORDEMENT DANS UN SECTEUR QUI
                                     < DEBORDE DANS LE CAS CONTRAIRE.
XXSFK::  MOT         XXSFD+D         < MOT CONTENANT LE NOMBRE DE DESCRIP-
                                     < TEURS DE CLEFS OCCUPES.
XXSFL::  MOT         XXSFK+D         < LONGUEUR DE L'EN-TETE, ET ACCES AU
                                     < PREMIER MOT LIBRE POUR LES DESCRIP-
                                     < TEURS DES CLEFS.
         PAGE
<
<
<        F O R M A T   D ' U N   D E S C R I P T E U R
<                    D E   C L E F  :
<
<
XXKE1::  MOT         O               < MOT CONTENANT LES INDICATEURS
                                     < SUIVANTS :
BXKE0::  VAL         L               < - BIT LIBRE(1) / OCCUPE(K),
BXKE1::  VAL         BXKE0+I         < - BIT DE DEBORDEMENT(1),
BXKE2::  VAL         BXKE1+I         < - DERNIER DESCRIPTEUR DE LA LISTE (1),
BXKE3::  VAL         BXKE2+I         < - EN FAIT BIT DU REGISTRE 'B' INDI-
                                     < QUANT QU'UNE MISE A JOUR (1) DE
                                     < 'AAD' EST NECESSAIRE,
MXKE1::  VAL         M1FFF           < - ZONE CONTENANT 'PEK'.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?BXKE0=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?BXKE1=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?BXKE2=FMASK(K?XWOR%1=FCINST
         IF          XWOR%1(MXKE1-K,,XEIF%,
         IF          ATTENTION : IL Y A UN RECOUVREMENT ENTRE LE
         IF          MASQUE 'MXKE1' ET LES BITS 'BXKE' !!!
XEIF%:   VAL         ENDIF
EMXKE1:  EQU         ZERO+MXKE1      < POUR REFERENCE EN AVANT...
XXKE2::  MOT         XXKE1+D         < MOT CONTENANT LES INDICATEURS
                                     < SUIVANTS :
BXKE4::  VAL         L               < - BIT IN USE(1) / IDLE(K),
MXKE2::  VAL         M7FFF           < - ZONE CONTENANT 'PDK',
XWOR%1:  VAL         COSBT?BXKE4=FMASK(K=FCINST
         IF          XWOR%1(MXKE2-K,,XEIF%,
         IF          ATTENTION : 'BXKE4' RECOUVRE 'MXKE2' !!!
XEIF%:   VAL         ENDIF
BXKE5::  VAL         NBITMO-B        < - BIT DU MODE NEXT(1).
XXKE3::  MOT         XXKE2+D         < MOT CONTENANT L'ADRESSE DU PREMIER
                                     < SECTEUR DE L'ENREGISTREMENT.
XXKE4::  MOT         XXKE3+D         < MOT CONTENANT L'ADRESSE DU DERNIER
                                     < SECTEUR DE L'ENREGISTREMENT.
LXKE::   VAL         XXKE4-XXKE1+Z   < LONGUEUR D'UN DESCRIPTEUR.
         PAGE
<
<
<        C A L C U L   D E   L A   C L A S S E
<        D ' E Q U I V A L E N C E   D ' U N E  C L E F  :
<
<
<        RAPPEL PHILOSOPHIQUE :
ZY7::    VAL         YY7             < NOMBRE DE CLASSE D'EQUIVALENCES.
ZM7::    VAL         YM7
<                      IL EXISTE ZY7 CLASSES D'EQUIVALENCE POUR LES
<                    CLEFS : NUMEROTEES DE 0 A ZM7. L'APPARTENANCE D'UNE
<                    CLEF A UNE CLASSE EST FONCTION DE SA PARTIE
<                    ENTIERE PEK :. ON A :
<                    1- CLASSES 0 A 63 :
<                                    K EST DANS LA CLASSE N, SI :
<                                    PEK=2*N OU PEK=2*N+1,
UKEY::   VAL         2               < POUR LE CALCUL DES CLASSES...
<                    2- CLASSES 64 A ZM7 :
<                                    K EST DANS LA CLASSE M, SI :
<                                    SOIT J=M/8-1 (QUOTIENT ENTIER),
<                                    ALORS :
<                                    2**J<=PEK<=2**(J+1)-1.
<
<
<        REMARQUE :
<                      LES CLASSES D'EQUIVALENCE DE 0 A 63
<                    SONT D'AMPLITUDE FIXE (2), ALORS QUE CELLES DE
<                    64 A ZM7 SONT D'AMPLITUDE VARIABLE ET CROISSANTES
<                    (=A LA PUISSANCE DE 2 CONTENUE DANS L'INTERVALLE,
<                    PAR EXEMPLE SI UNE CLASSE VA DE 1024 A 2047, ON
<                    VOIT QUE L'AMPLITUDE EST 1024).
<
<
<        ARGUMENT :
<                    (X)=ADRESSE DU 1ER SECTEUR DE LA LISTE SEQUENTIELLE
<                        DE CETTE PARTITION, SI BIT1(A)=1,
<                    (W)=DE LA TP DU FICHIER CONSIDERE EN MEMOIRE,
<                    (A)=PEK DE LA CLEF DONT ON CHERCHE LA CLASSE.
<                        (VOIR LES BITS BXKE6, BXKE7 ET BXKE8)
<                    (B)='PDK',
<                    BIT15(B)=0 : MODE STANDARD,
<                            =1 : MODE NEXT.
<
<
<        RESULTAT :
<                    (X)=
<                        SI BIT0(A)=1 : (X)=NUMERO DE LA PARTITION DE LA
<                                           CLEF,
<                        SI BIT0(A)=K :
<                          SI BIT1(A)=K :
<                                SI BIT2(A)=K : (X)=ADRESSE 1ER SECTEUR DE LA
<                                                   LISTE SEQUENTIELLE DE LA
<                                                   CLEF, OU @ DU 1ER SECTEUR
<                                                   DE LA 1ERE LISTE
<                                                   SEQUENTIELLE NON VIDE
<                                                   SUIVANT CELLE DE
<                                                   LA CLEF SI CELLE-CI
<                                                   EST VIDE
<                                                   EN MODE NEXT.
<                                SI BIT2(A)=1 : (X)=ADRESSE 1ER SECTEUR DE LA
<                                                   LISTE SEQUENTIELLE DE
<                                                   LA 1ERE PARTITION NON
<                                                   VIDE SUIVANT LA
<                                                   PARTITION NON VIDE
<                                                   TROUVEE PRECEDEMMENT.
<                                    (ON PEUT DONC AINSI LORS D'UN
<                                    MEME APPEL DE PLSC, PARCOURIR LA
<                                    EN PLUSIEURS COUPS...)
<
<
<        NOTA :
<                      SI BIT1(A)=1, ALORS, 'X' N'EST PAS MODIFIE...
<
<
BXKE6::  VAL         BXKE0           < DEMANDE DU NUMERO DE LA PARTITION
                                     < DE LA CLEF (1).
BXKE7::  VAL         BXKE1           < MISE A JOUR DE LA 'TP'.
BXKE8::  VAL         BXKE2           < POUR SAVOIR OU COMMENCER...
<
<
CLAS:    EQU         $
         PSR         Y
         PSR         A
         LR          X,Y             < SAVE X DANS Y, DANS LE CAS
                                     < OU IL SERAIT ARGUMENT ET NON PAS
                                     < RESULTAT.
         AND         C1FFF           < RECUPERATION DE LA PEK.
         CPI         ZY7             < CHOIX ENTRE LES 2 GRANDS GROUPES
                                     < DE CLASSES D'EQUIVALENCE.
         JGE         E250            < CAS PEK>ZM7.
<
< CAS OU PEK=ZY7 : LE CALCUL EST PLUS DELICAT...
<
E250:    EQU         $
         PSR         B
<
< REGARDONS D'ABORD ENTRE QUELLE ET
< QUELLE PUISSANCE DE 2 SE TROUVE 'PEK' :
<
         DBT                         < RECHERCHE 1ER BIT A 1,
                                     < SOIT N SON RANG.
         LBI         K
         SBT         NBITMO+L,X      < CALCUL DANS B DE LA PUISSANCE
                                     < DE 2 IMMEDIATEMENT INFERIEURE OU
                                     < EGALE A PEK.
         SBR         B,A             < (A)=DISTANCE DE CETTE PUISSANCE
                                     <     DE 2 A PEK.
XWOR%1:  VAL         CORBT?BXKE3=FMASK(K?MXKE1=FCINST
XWOR%1:  VAL         XWOR%1)MMOT=K
XWOR%1:  VAL         NBITMO-XWOR%1
         ADRI        XWOR%1-NBITMO,X < (X)=N-12.
         NGR         X,X             < (X)=12-N.
         SLRS        L,X             < CETTE DISTANCE EST DECALEE DE 12-N A DROI
                                     < A DROITE.
         XR          A,X
         ADRI        XWOR%1,A        < (A)=16-N.
         SLLS        ZY7/NBITMO=K    < (A)=(16-N)*8.
         ADR         X,A             < (A)=CLASSE CALCULEE,
         JAGE        E250XX          < OK, ELLE EST POSITIVE...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      LE MIEUX EST DE FORCER LE MAX !!!
<
         JMP         E250XY
E250XX:  EQU         $
         CPI         XXTP1L          < LA CLASSE CALCULEE EST-ELLE TROP GRANDE ?
         JLE         E250X           < NON, ON LA CONSERVE...
E250XY:  EQU         $
         LAI         XXTP1L          < OUI, ON LA MINORE...
E250X:   EQU         $
         LR          A,X             < (X)=NUMERO DE LA PARTITION...
         PLR         B
         JMP         E251
         PAGE
<
<
<        P A R C O U R S   D ' U N E   L I S T E
<        S E Q U E N T I E L L E   D E   C L E F S  :
<
<
<        ARGUMENTS :
<                    (A,B)=LA CLEF QUE L'ON RECHERCHE.
<                    BIT15(B)=0 : MODE NORMAL,
<                            =1 : MODE NEXT.
<                    (W)=ADRESSE DU BUFFER ALLOUE A LA TP DU FICHIER
<                        EN CAUSE,
<                    (Y)=
<                        BIT0-2=FONCTION DEMANDEE,
<                                    000=TEST D'EXISTENCE & OPEN
<                                        SI BIT4=1,
<                                    011=DELETER,
<                                    100=INSERT.
<                        BIT3=K ; UTILISE PAR LA SUITE AVEC LA CONVENTION
<                                 SUIVANTE :
<                                    0=BUFFER DE TP UTILISE,
<                                    1=BUFFER ALLOUE.
<                        BIT4 :
<                        1- POUR TEST :
<                              1.1- BIT4=K : SI LA CLEF EXISTE, RENVOIE
<                              DANS TEST1 & TEST2 LES MOTS2 & 3 DU DESCRIP
<                              TEUR DE CELLE-CI,
<                              1.2- BIT4=1 : SI LA CLEF EXISTE :
<                                    1.2.1- SI ELLE EST A L'ETAT 'IDLE',
<                                    ELLE PASSE A L'ETAT 'IN USE', ET
<                                    IL Y A ECHANGE DE (TEST1,TEST2)
<                                    AVEC (MOT2,MOT3) DU DESCRIPTEUR,
<                                    1.2.2- SI ELLE EST A L'ETAT 'IN USE',
<                                    ON FAIT COMME SI BIT4 ETAIT A 0.
<                        2- POUR DELETE :
<                              2.1- BIT4=K : DELETE LE DESCRIPTEUR,
<                              2.2- BIT4=1 : LE DESCRIPTEUR PASSE A L'ETAT
<                              'IDLE', ET LES MOT2 & 3 DU DESCRIPTEUR
<                              SONT MIS A JOUR AVEC TEST1 & TEST2.
<                        BIT4-15=NOM DIRECT DU FICHIER,
<
<
MXPL1::  VAL         ME000           < DEFINITION DE LA FONCTION ::
         IF          VALBAC-MXPL1,,XEIF%,
         IF          ATTENTION : 'CE000' NE PEUT ETRE
         IF          UTILISE POUR MODIFIER 'SRCOTO' !!!
XEIF%:   VAL         ENDIF
AMXPL1:  EQU         ZERO+MXPL1      < POUR UNE REFERENCE EN AVANT...
         IF          MXPL1-Q8000,XEIF%,,XEIF%
         IF          ATTENTION : 'CE000' EST UTILISE AUSSI PAR LE 'CCI',
         IF          ET IL DOIT ETRE DIFFERENT DE 'Q8000' !!!
XEIF%:   VAL         ENDIF
XXPL1::  VAL         0               < FONCTION DE TEST EXISTENCE ET OPEN,
XXPL2::  VAL         3               < FONCTION DE DELETE,
XWOR%1:  VAL         MXPL1=K         < POUR CADRER LA FONCTION...
XWOR%1:  VAL         -XWOR%1         < POUR UN DECALAGE A DROITE...
XWOR%2:  VAL         MXPL1>XWOR%1    < CADRAGE DU MASQUE DE LA ZONE...
XWOR%3:  VAL         XXPL1?XXPL2)XWOR%2
XXPL3::  VAL         XWOR%3          < FONCTION D'INSERT.
XWOR%1:  VAL         -XWOR%1         < POUR DECALAGE A GAUCHE...
XWOR%2:  VAL         XXPL3>XWOR%1=K  < RECHERCHE DU BIT SIGNIFICATIF.
BXKE9::  VAL         NBITMO-B-XWOR%2 < BIT DISCRIMINANT L'INSERT...
BXPL1::  VAL         BXKE3           < BIT INDIQUANT SI UN BUFFER A ETE
                                     < ALLOUE (A).
BXPL2::  VAL         4               < (VOIR LES COMMENTAIRES CI-DESSUS)
XXPL4::  VAL         M0FFF           < ZONE CONTENANT LE NOM DIRECT.
XWOR%5:  VAL         CORBT?BXPL2=FMASK(K?XXPL4=FCINST
BXXPL4:  EQU         ZERO+XWOR%5     < POUR UNE REFERENCE EN AVANT...
<
<
<        RESULTATS :
<
<        1- CAS INSERT/DELETE :
<                    (Y)='0000 : OK,
<                    (Y)=Q8000 : CLEF EXISTE DEJA & INSERT DEMANDE,
<                    (Y)='6000 : LISTE VIDE & DELETE DEMANDE,
<                    (Y)='2000 : CLEF NON RENCONTREE APRES LE PARCOURS DE
<                                LA LISTE ENTIERE & DELETE DEMANDE,
<                    (Y)='4000 : CLEF INEXISTANTE, MAIS CERNEE & DELETE
<                                DEMANDE.
<
<        2- CAS TEST :
<                    (Y)=Q8000 : CLEF EXISTANTE A L'ETAT IDLE,
<                    (Y)='8001 : CLEF EXISTANTE A L'ETAT 'IN USE',
<                    (Y)='0000 : CLEF EXISTANTE ET PASSEE DE L'ETAT 'IDLE'
<                                A L'ETAT 'IN USE' LORS D'UN 'TEST-OPEN'.
<                                (C'EST-A-DIRE : BIT4(Y ARG)=1).
<                    (Y)='6000 : CLEF INEXISTANTE ET LISTE VIDE,
<                                OU FIN DE CATALOGUE DES CLEFS EN
<                                MODE NEXT,
<                    (Y)='2000 : CLEF INEXISTANTE ET LISTE ENTIERE EXPLOREE.
<                    (Y)='4000 : CLEF INEXISTANTE ET CLEF CERNEE,
XXPL5::  VAL         K               < OK,
XXPL6::  VAL         ECCED
XXPL7::  VAL         '8001
XXPL8::  VAL         ECLV
EXXPL8:  EQU         ZERO+XXPL8      < POUR REFERENCE EN AVANT...
XXPL9::  VAL         ECCI2
XXPL10:: VAL         ECCI1
<                    2.1- SI LA CLEF N'EXISTE PAS :
<                    TEST1=RESULTAT DE PARCOURS (CF. A),
<                    TEST2=ADRESSE SECTEUR (CF. X).
<
<                    2.2- SI LA CLEF EXISTE & SI BIT4(Y)=K :
<                    TEST1=MOT2 DU DESCRIPTEUR DE CLEF,
<                    TEST2=MOT3 DU DESCRIPTEUR DE CLEF.
<
<
<        P H I L O S O P H I E   D E   IN USE/IDLE  :
<
<
<                    1- A L'INSERTION D'UNE CLEF, ON CREE SON DESCRIPTEUR,
<                    ELLE PASSE AUTOMATIQUEMENT A L'ETAT 'IN USE' ; DE PLUS :
<                                    (MOT2,MOT3)<--(TEST1,TEST2),
<                                    (TEST1,TEST2)<--(Q8000,Q8000).
<                    2- AU DELETE-CLOSE (BIT4(Y)=1) : LE DESCRIPTEUR PASSE A
<                    L'ETAT 'IDLE', ET :
<                                    (MOT2,MOT3)<--(TEST1,TEST2).
<                    3- AU TEST-OPEN (BIT4(Y)=1) : LE DESCRIPTEUR PASSE A L'ETAT
<                    'IN USE', ET
<                                    (MOT2,MOT3)<-->(TEST1,TEST2).
<                    4- AU DELETE-DELETE (BIT4(Y)=K) : LE DESCRIPTEUR EST LIBERE
<                    LE BIT IN USE N'A ALORS PLUS AUCUN SENS.
<
<
<        NOTA SUR LES ADRESSES-SECTEURS :
<                      LES ADRESSES SECTEURS UTILISEES SONT CELLES
<                    FOURNIES PAR L'ALLOCATEUR DISQUE.
<
<
         USE         W,DEM0
PLSC:    EQU         $               < PARCOURS LISTE SEQUENTIEL CLEF.
         PSR         X
         STZ         LIST0           < INITIALISATION DE LIST0, EN
                                     < INDIQUANT QU'IL N'Y A PAS
                                     < ENCORE DE POINT DE REPRISE.
         BSR         ACLAS           < BIT0(A)=BIT1(A)=K : ACLAS RENVOIE
                                     < DANS X L'ADRESSE DU 1ER SECTEUR
                                     < DE LA LISTE SEQUENTIELLE A LA
                                     < QUELLE APPARTIENT LA CLEF ARGUMENT.
                                     < OU DE LA 1ERE LISTE NON VIDE
                                     < EN MODE NEXT.
                                     < A NOTER QUE TP EST EN MEMOIRE.
<
< TEST DE LISTE VIDE :
<
         XR          A,X
         CP          INFINI
         XR          A,X
         JNE         E260            < LA LISTE CONTIENT AU MOINS
                                     < UN SECTEUR
<
< CAS OU LA LISTE SEQUENTIELLE EST VIDE :
<
         CPZR        Y               < TEST DU BIT0 DE Y, POUR SAVOIR SI
                                     < C'EST LA FONCTION INSERT QUI A ETE
                                     < DEMANDEE.
         JL          E260            < C'EST LA FONCTION INSERT ; LA LISTE
                                     < ETANT VIDE, LA CLEF N'EXISTE
                                     < PAS, IL FAUT L'INSERER...
         LY          C6000           < RETOUR DU RESULTAT.
         PLR         X
         JMP         E301XR          < ET C'EST TOUT, VERS LA SORTIE...
<
< CAS OU LA LISTE SEQUENTIELLE N'EST PAS VIDE :
< OU CAS OU LA LISTE SEQUENTIELLE EST VIDE MAIS INSERT DEMANDE.
<
E260:    EQU         $
         STA         PEK             < SAVE PEK DE LA CLEF A CHERCHER.
         STB         PDK             < SAVE PDK DE LA CLEF  A CHERCHER.
         PSR         A,B,L
         LR          W,L             < SAVE @TP DANS L.
         PSR         W               < SAVE @TP DANS LA PILE.
         LA          INFINI
         STA         NEXPE           < INITIALISATION : PAS DE BORNE
                                     < SUPERIEURE COURANTE.
E475:    EQU         $
<
< DEMANDE D'ALLOCATION D'UN BUFFER : LA DEMANDE EST FAITE
< SANS ATTENTE ; S'IL N'Y A PAS DE BUFFERS DISPONIBLES DANS
< LE POOL ON UTILISERA LE BUFFER ALLOUE A TP (MALHEUREUSEMENT...) :
<
         LA          AALBTP
         LR          A,W             < (W)=ARG DE CHAND.
         LAD         PLSCAM          < ADRESSE DU MOT OU METTRE L'
                                     < ADRESSE DU BUFFER ALLOUE.
         STA         ARGDEM+AMDEM    < MAJ. DEMANDE ALLOC. BUFFER.
         BSR         ACHAND          < ENVOI DE LA DEMANDE.
         WAIT        WEIO            < ATTENTE DE LA REPONSE DE MALOC.
<
<        ATTENTION, ON A ICI :
<                    (L)=ADRESSE DU BUFFER ALLOUE A LA 'TP'.
<
         LA          ARGDEM+ETADEM   < TEST DU NBRE DE BUFFER ENCORE
                                     < A ALLOER (K OU 1).
         JAE         Z1700           < OK, 1 BUFFER LIBRE A ETE ALLOUE.
<
< CAS OU IL N'Y A PAS DE BUFFER LIBRE, ON VA
< VOLER CELUI DE TP, ET POUR CELA, IL
< FAUT LA SAUVEGARDER AU PREALABLE...
<
         PSR         X               < SAVE LE RESULTAT DE 'ACLAS'.
         LR          L,X             < (X)=@MOT DU BUFFER DE LA TP.
         ADR         X,X
         STX         PLSCAM          < (X)=@OCTET DU BUFFER DE LA TP.
         LX          C7FF
         ANDR        Y,X             < (X)=NOM DIRECT DU FICHIER.
         DO          XXXMOY
         ADRI        XXTP/XXXMOY,X   < (X)=@SECTEUR DE LA TP SUR DK1.
         BSR         AWSDK           < ECRITURE DU SECTEUR (X),
                                     < C'EST-A-DIRE LA TP, ET
                                     < ATTENTE DE FIN D'E/S.
         PLR         X               < RESTAURE LE RESULTAT DE 'ACLAS'.
         JMP         E261            < VERS L'UTILISATION DU BUFFER TP.
<
< CAS OU UN BUFFER LIBRE A ETE ALLOUE :
<
Z1700:   EQU         $
         SBT         BXPL1           < NOTA : (A)=K.
         ORR         A,Y             < LE BIT3 DE Y EST MIS A 1 POUR
                                     < MEMORISER QU'UN BUFFER A ETE
                                     < ALLOUE.
         LA          PLSCAM          < RECUPERATION DE L'ADRESSE OCTET
                                     < DU BUFFER ALLOUE.
         SLRS        NOCMO=K         < CONVERSION EN UNE ADRESSE-MOT.
         LR          A,L             < QUE L'ON S'EMPRESSE DE METTRE DANS
                                     < DANS L.
<
< ARRIVE ICI, ON A UN BUFFER DE TRAVAIL, ET :
<                    (L)=ADRESSE DU BUFFER DE TRAVAIL,
<                    BIT3(Y)=K : LE BUFFER DE TP VA ETRE UTILISE,
<                    BIT3(Y)=1 : UN BUFFER A ETE ALLOUE.
<                    (CF. LE BIT 'BXPL1')
<
E261:    EQU         $
         LA          C6000           < AU CAS OU LA LISTE SERAIT VIDE.
         PSR         Y               < SAVE NATURE DU BUFFER DE
                                     < TRAVAIL, FONCTION, ET,
                                     < NOM DIRECT DU FICHIER.
         LY          INFINI
         CPR         X,Y             < LA LISTE ETAIT-ELLE VIDE?
         JE          E280            < OUI, DONC PAS DE RECHERCHE
         EORR        W,W             < INITIALISATION DE W A 0.
<
< LECTURE DU 1ER SECTEUR DE LA LISTE :
<
<
<        ON A ICI :
<                    (X)=ADRESSE DU 1ER SECTEUR DE LA LISTE.
<
         BSR         ARSDK           < LECTURE DU 1ER SECTEUR.
                                     < (ET ATTENTE DE FIN DE LECTURE...)
         LY          PLSCAS          < DANS Y ON TROUVERA L'ADRESSE DU
                                     < SECTEUR COURANT, IL SERA REMIS
                                     < A JOUR EN MEME TEMPS QUE AADD.
         LBI         K               < INITIALISATION DE B DE TELLE
                                     < SORTE QUE L'ON NE SAUTE PAS
                                     < L'INITIALISATION DE AADD APRES
                                     < E290.
E263:    EQU         $
         LX          INFINI          < INDIQUONS AINSI QUE LE
                                     < DESCRIPTEUR PRECEDENT N'ETAIT PAS
                                     < UN DEXCRIPTEUR DE DEBORDEMENT
                                     < PUIQU'IL N'EXISTE PAS.
E273:    EQU         $
         LR          W,A             < SAUVEGARDE DE W AVANT REINITIALI
                                     < SATION...
         LR          L,W             < REINITIALISATION DE W AVEC L'ADR
                                     < L'ADRESSE DU BUFFER (L).
E264:    EQU         $
<
<        UTILISATION DU BIT 3 DU REGISTRE B PRECEDENT :
<                      ON TROUVE DANS B UN INDICATEUR PERMETTANT DE
<                    SAVOIR S'IL FAUT METTRE A JOUR AADD.
<                    L'INTERET DE CECI EST DANS LA RECUPERATION DE
<                    SUITE DE DESCRIPTEURS LIBRES PAR
<                    ADRESSE CROISSANTE, ET AINSI DIMINUER
<                    LE TAUX DE DEBORDEMENT. AINSI LORSQU'ON RENCONTRE
<                    UNE SUITE DE DESCRIPTEURS LIBRES AADD N'EST MIS A JOUR QU'A
<                    A JOUR QU'AVEC LE 1ER DE CEUX-CI, MEME S'IL
<                    Y A CHANGEMENT DE SECTEUR...
<
         TBT         NBITMO+BXKE3    < DOIT-ON METTRE A JOUR AADD...
         JC          E299            < NON, CELA SIGNIFIE QUE L'ON
                                     < VIENT DE RENCONTERE AU MOINS
                                     < 2 DESCRIPTEURS LIBRES CONSECUTIFS.
<
< CAS OU LA MISE A JOUR DE 'AADD' ET 'AADS' EST DEMANDEE :
<
         STA         AADD
         STY         AADS
E299:    EQU         $
         ADRI        LXKE,W          < PASSONS AU DESCRIPTEUR SUIVANT,
                                     < OU DANS LE CAS D'UN NOUVEAU SECTEUR
                                     < DEPASSONS SON EN-TETE.
         TBT         NBITMO+BXKE0    < TEST POUR SAVOIR SI LE DESCRIPTEUR
                                     < PRECEDENT ETAIT LIBRE...
         LB          XXKE1,W         < (B)=MOT0 DU DESCRIPTEUR COURANT.
         RBT         NBITMO+BXKE3    < A PRIORI...
         JNC         E300            < NON, LE PRECEDENT ETAIT OCCUPE,
                                     < PAR UNE CLEF OU UN DEBORDEMENT.
         SBT         NBITMO+BXKE3    < CAS OU LE PRECEDENT ETAIT LIBRE.
E300:    EQU         $
         TBT         NBITMO+BXKE0    < TEST POUR SAVOIR SI LE DESCRIPTEUR
                                     < COURANT (W) EST LIBRE...
         JC          E272            < OUI, IL FAUT LE SAUTER...
<
< CAS D'UN DESCRIPTEUR OCCUPE :
<
         RBT         NBITMO+BXKE3    < LE DESCRIPTEUR COURANT EST OCCUPE.
         LA          XXKE1,W         < (A)=MOT0 D'UN DESCRIPTEUR.
         AND         C1FFF           < (A)='PEK' DU DESCRIPTEUR COURANT (W),
         CP          PEK             < EST-CE LA 'PEK' DE LA CLEF CHERCHEE ???
         JL          E265            < NON
         JNE         E266            < TOUJOURS PAS, MAIS, ON LUI A TROUVE
                                     < TROUVE UNE BORNE SUPERIEURE.
<
< LES PEK ETANT EGALES, TESTONS LES PDK :
<
         LA          XXKE2,W         < ACCES A LA PDK DU DESCRIPTEUR COURANT
                                     < COURANT.
         RBT         BXKE4           < RAZ BIT 'IN USE' A PRIORI.
         CP          PDK             < ALORS...
         JL          E265            < ET BIEN NON...
         JE          E267            < OUI, ON A TROUVE LA CLEF CHERCHEE...
<
< CAS OU LA CLEF COURANTE LE LA CLEF CHERCHEE SONT DIFFERENTES :
<
E266:    EQU         $
<
< IL FAUT REVENIR SUR LE DESCRIPTEUR PRECEDENT :
<
         LR          X,A
         CP          INFINI          < ETAIT-CE UN DESCRIPTEUR DE
                                     < DEBORDEMENT?
         JE          AE268           < NON (X=Q8000), DONC LA CLE
                                     < CHERCHEE N'EXISTE PAS
<
< CAS OU LE DESCRIPTEUR PRECEDENT ETAIT
< UN DESCRIPTEUR DE DEBORDEMENT :
<
<
<        ON A ICI :
<                    (X)=ADRESSE DU SECTEUR DE DEBORDEMENT.
<
         LA          PDK
         TBT         BXKE5           < TEST DU MODE NEXT.
         JNC         E490            < NON, C'EST LE MODE STANDARD.
<
< CAS DU MODE NEXT :
<
         LA          XXKE1,W
         AND         C1FFF
         STA         NEXPE           < MEMORISATION DE LA PEK DE LA
                                     < BORNE SUPERIEURE COURANTE DE
                                     < LA CLEF CHERCHEE.
         LA          XXKE2,W
         STA         NEXPD           < MEMORISATION DE LA PDK DE LA
                                     < BORNE SUPERIEURE COURANTE DE LA
                                     < CLEF CHERCHEE.
         LA          PLSCAS
         STA         NEXAS           < MEMORISATION DU SECTEUR DE LA
                                     < BORNE SUPERIEURE COURANTE.
         LR          W,A
         STA         NEXW            < MEMORISATION DE L'ADRESSE DU
                                     < DESCRIPTEUR DE LA BORNE
                                     < SUPERIURE COURANTE.
E490:    EQU         $
         BSR         ARSDK           < LECTURE DU SECTEUR DE DEBORDE-
                                     < MENT ET ATTENTE.
         LX          INFINI          < RAZ SECTEUR DE DEBORDEMENT.
         LR          L,W             < REINITIALISATION DE W AVEC
                                     < L'ADRESSE DU BUFFER.
         JMP         E299            < ET C'EST REPARTI, EN SAUTANT LA
                                     < MISE A JOUR DE AADD ET AADS.
E301XR:  JMP         E301XX          < RELAI VERS LA SORTIE...
<
< CAS OU ON A TROUVE LA CLEF : MAIS CE N'EST PEUT-ETRE
< QU'UN DESCRIPTEUR DE DEBORDEMENT :
<
E267:    EQU         $
         TBT         NBITMO+BXKE1    < TEST DE L'INDICATEUR DE
                                     < DEBORDEMENT.
         JNC         E270            < NON C'EST BON, ON A TROUVE
                                     < LA CLEF, UN VRAI MIRACLE.
E495:    EQU         $
<
< CAS OU L'ON CROYAIT AVOIR TROUVE LA CLEF, MAIS
< EN FAIT CE N'EST QU'UN DESCRIPTEUR DE DEBORDEMENT
< QUI CONTIENT LA CLEF ; LA CLEF CHERCHEE N'EST PEUT-ETRE
< PLUS DANS LE CATALOGUE, ELLE A PEUT ETRE
< ETE DELETEEE, BIEN QU'ON LA RENCONTER ENCORE :
<
         LY          PLSCAS          < MEMORISATION DE L'ADRESSE DU SECTEUR
                                     < LU EN DERNIER.
         LX          XXKE3,W         < ACCES A L'ADRESSE DU SECTEUR DE D
                                     < DEBORDEMENT.
         BSR         ARSDK           < LECTURE DU SECTEUR DE
                                     < DEBORDEMENT ET ATTENTE.
         JMP         E263            < ET C'EST REPARTI AVEC CE NOUVEAU SECTEUR
                                     < SECTEUR.
<
< CAS OU L'ON N'A PAS ENCORE REUSSI A CERNER LA CLEF :
<
E265:    EQU         $
         LY          PLSCAS          < MEMORISATION DE L'ADRESSE DU
                                     < DERNIER SECTEUR LU.
         LX          INFINI          < A PRIORI : PAS DEBORDEMENT...
         TBT         NBITMO+BXKE1    < EST-CE UN DESCRIPTEUR DE
                                     < DEBORDEMENT...
         JNC         E272            < NON X EST BON.
<
< CAS OU LE DESCRIPTEUR COURANT (W) EST UN UN DESCRIPTEUR DE DEBORDEMENT :
<
         LX          XXKE3,W         < RECUPERATION DE L'ADRESSE DE SON
                                     < SECTEUR DE DEBORDEMENT POUR
                                     < UN EVENTUEL USAGE ULTERIEUR.
E272:    EQU         $
         TBT         NBITMO+BXKE2    < EST-CE LE DERNIER DESCRIPTEUR
                                     < DE LA LISTE SEQUENTILLE (PRINCIPA
                                     < PALE OU DE DEBORDEMENT)..
         JNC         E298            < NON, IL Y A ENCORE DES CLEFS DANS
                                     < LA LISTE COURANTE.
<
< CAS OU L'ON A RENCONTRE LE DERNIER DESCRIPTEUR D'UNE
< LISTE (PRINCIPALE OU DE DEBORDEMENT ) :
<
         XR          X,A
         CP          INFINI          < LE DERNIER DESCRIPTEUR (W)
                                     < N'ETAIT-IL PAS UN DESCRIPTEUR
                                     < DE DEBORDEMENT?
         XR          X,A
         JE          E271            < NON, CELA SIGNIFIE QUE LA CLEF
                                     < CHERCHEE N'EXISTE PAS
<
< CAS OU LE DERNIER DESCRIPTEUR D'UNE LISTE EST EN DEBORDEMENT :
<
         BSR         ARSDK           < LECTURE DU SECTEUR D'ADRESSE (X).
         JMP         E263            < ET C'EST REPARTI AVEC LE
                                     < SECTEUR DE DEBORDEMENT.
<
< CAS OU IL Y A ENCORE DES CLEFS DANS LA LISTE :
<
E298:    EQU         $
<
< EST-ON AU BOUT DU SECTEUR :
<
         LR          W,A
         SBR         L,A             < CALCUL DE L'ADRESSE RELATIVE
                                     < DANS LE SECTEUR.
         CPI         YY7-XXSFL
         LR          W,A             < SAVE ADRESSE DU DESCRIPTEUR
                                     < COURANT DANS A.
         JL          E264            < NON, ON N'EST PAS AU BOUT DU SECTEUR.
                                     < SECTEUR.
<
< CAS OU A ON A EXPLORE TOUT UN SECTEUR, PASSONS AU SUIVANT
< PAR CHAINAGE :
<
         PSR         X               < SAVE X..
         LX          XXSFS,L         < LE CHAINAGE AU SECTEUR SUIVANT EST LE
                                     < EST LE 1ER MOT DU SECTEUR.
         BSR         ARSDK           < LECTURE DU SECTEUR SUIVANT
                                     < ET ATTENTE.
         PLR         X
         JMP         E273            < ET C'EST REPARTI SUR LE SECTEUR SUIVANT
                                     < SUIVANT.
<
< CAS OU ON A TROUVE LA CLEF DANS LA LISTE :
< OU SA SUIVANTE EN MODE NEXT :
<
E270:    EQU         $
         LR          W,A             < RECUPERATION DE L'ADRESSE DE
                                     < SON DESCRIPTEUR.
         SLRS        LXKE=K          < ET CONVERSION EN UNE ADRESSE DE
                                     < QUADRUPLES MOTS.
         IF          LXKE-4,,XEIF%,
         IF          ATTENTION : IL NE S'AGIT PAS DE QUADRUPLE-MOTS !!!
XEIF%:   VAL         ENDIF
XWOR%1:  VAL         XXPL6=K         < RECUPERATION BIT SIGINFICATIF...
         SBT         NBITMO-B-XWOR%1 < POSITIONNEMENT BIT 0.
E282:    EQU         $
         LX          PLSCAS          < RECUPERATION DE L'ADRESSE DE
                                     < SON SECTEUR DANS LE  BLOC DE DEMAN
                                     < DEMANDE SUR DK.
E280:    EQU         $
<
<
<        R E S U L T A T   D E   P A R C O U R S   D E   L A
<        L I S T E   S E Q U E N T I E L L E  :
<
<
<        ON A ICI :
<                    (W)=ADRESSE D'UN DESCRIPTEUR DE CLEF.
<
<                    1- LA CLEF EXISTE :
<                                    (X)=ADRESSE DU SECTEUR DE LA LISTE QUI
<                                    QUI LA CONTIENT,
<                                    (A)=ADRESSE DE QUADRUPLE-MOT DE
<                                      SON DESCRIPTEUR,
<                                    BIT0 DE A=1.
<                    2- LA CLEF N'EXISTE PAS ET LA LISTE EST VIDE :
<                                    (X)=Q8000,
<                                    (A)='6000 (BIT1=BIT2=1).
<                    3- LA CLEF N'EXISTE PAS ET ON A PARCOURU TOUTE
<                    LA LISTE :
<                                    (X)=ADRESSE DU DERNIER SECTEUR EXPLORE,
<                                    (A)=ADRESSE DE QUADRUPLE-MOT DU
<                                      DERNIER DESCRIPTEUR DE LA LISTE.
<                                    BIT2 DE A=1,
<                    4- LA CLEF N'EXISTE PAS ET ON A REUSSI A LA
<                    CERNER :
<                                    (X)=ADRESSE DU SECTEUR DU DESCRIPTEUR
<                                      PRECEDENT,
<                                    (A)=ADRESSE DE QUADRUPLE-MOT DU
<                                      DESCRIPTEUR PRECEDENT,
<                                    BIT1 DE A=1.
<
<
<        RAPPEL :
<                      LES DESCRIPTEURS SONT A
<                    DES FRONTIERES DE QUADRU-
<                    PLES-MOTS.
<
<
         PLR         B               < RESTAURE 'Y' ARGUMENT DANS 'B'...
<
<
<        E X E C U T I O N   D E   L A   F O N C T I O N  :
<
<
         LY          CE000
         ANDR        B,Y             < TEST SUR LA FONCTION DEMANDEE.
         CPZR        Y               < EST-CE UN 'TEST'.
         JE          E303            < C'EST UN TEST, PRESQUE RIEN
                                     < A FAIRE.
<
< CAS OU LA FONCTION DEMANDEE EST INSERT OU DELETE :
<
         ANDR        A,Y             < TEST SUR LE RESULTAT D'EXISTENCE.
         CPZR        Y
         JNE         E305            < LE RESULTAT DE PARCOURS ET LA
                                     < LA FONCTION DEMANDEE SONT
                                     < INCOMPATIBLES.
<
< CAS OU L'EXECUTION EST POSSIBLE :
<
         PSR         A,B
<
<        ON A ICI :
<                    (A)=RESULTAT DE PARCOURS DE LISTE SEQUENTIELLE,
<                    (X)=ADRESSE SECTEUR.
<                    (X=Q8000 SI LA LISTE EST VIDE).
<                    (B)=ARGUMENT DE L'APPEL DE PLSC.
<
         TBT         NBITMO+BXKE9    < DISCRIMINATION INSERT/DELETE.
         JC          E304            < INSERT DEMANDE.
         BR          ADELET          < DELETE DEMANDEE.
E304:    EQU         $
         BR          AINSER          < INSERT DEMANDE.
<
< RETOUR COMMUN D'INSERT & DELETE :
<
<
<        ON A ICI :
<                    (X)=ADRESSE DU SECTEUR D'INSERTION DE
<                        LA CLEF DANS LE CAS D'UN 'INSERT'.
<
E302:    EQU         $
         LYI         XXPL5           < CODE EXECUTION OK.
         PLR         A,B
E305:    EQU         $
<
< ARRIVE ICI, 'Y' EST PRET POUR LE RETOUR...
<
         TBT         NBITMO+BXPL1    < TEST DU BIT3 DE B (Y ARGUMENT).
         JC          E281            < CAS OU UN BUFFER AVAIT ETE ALLOUE,
                                     < ALLONS LE LIBERER.
<
< CAS OU ON A UTILISE LE BUFFER DE TP, IL FAUT RESTAURER TP :
<
         PSR         X               < SAVE @SECTEUR SI INSERT.
         LX          C7FF
         ANDR        B,X             < RECUPERATION DU NOM DIRECT
                                     < PAR RAZ DES BITS 0,1,2,3 DANS B (
                                     < (Y ARGUMENT).
         DO          XXXMOY
         ADRI        XXTP/XXXMOY,X   < CONVERSION EN UNE ADRESSE
                                     < SECTEUR SUR LE DISQUE 0 SOIT DK1.
         BSR         ARSDK           < LECTURE DE LA TP.
         PLR         X
E294:    EQU         $
         PLR         W               < RESTAURE (W)=@TP.
<
< MISE A JOUR EVENTUELLE DE TP :
<
         TBT         NBITMO+BXKE9    < EST-CE UNE FONCTION INSERT...
                                     < CE TEST EST RENDU OBLIGATOIRE PAR
                                     < L'INTRODUCTION DU MODE NEXT.
         JNC         E301            < NON, DELETE OU TEST.
         CP          C6000           < C'EST UN INSERT : LA LISTE
                                     < ETAIT-ELLE VIDE...
         JNE         E301            < NON...
<
< CAS OU LA TP DOIT ETRE MISE A JOUR :
<
         LA          PEK             < RESTAURATION DANS A DE LA PARTIE
                                     < ENTIERE DE LA CLEF ARGUMENT.
         SBT         BXKE7           < BIT0(A)=K ; BIT1(A)=1.
         BSR         ACLAS           < ON MET A JOUR AVEC LE CONTENU
                                     < DE X QUI DONNE LE 1ER SECTEUR DE
                                     < LA LISTE QUI ETAIT VIDE A
                                     < L'ENTREE.
E301:    EQU         $
         PLR         A,B,L
         PLR         X
E301XX:  EQU         $               < SORTIE...
         RSR
<
< CAS OU ON A EU UN BUFFER ALLOUE : ON LE REND :
<
E281:    EQU         $
         PSR         A               < SAVE RESULTATS DE PARCOURS.
         LA          ARLBTP
         LR          A,W             < ARGUMENT DE CHAND.
         LAD         PLSCAM          < ADRESSE DU MOT OU SE TROUVE
                                     < L'ADRESSE DU BUFFER A RELESAER.
         STA         ARGDEM+AMDEM    < MAJ. DEMANDE RELEASE BUFFER.
         BSR         ACHAND
         PLR         A
         BSR         ACHANW          < ATTENTE DE FIN DE RELEASE.
         JMP         E294            < ET C'EST FINI...
<
< CAS OU AU BOUT D'UNE EXPLORATION SEQUENTIELLE ON N'A PAS TROUVE
< LA CLEF :
<
E271:    EQU         $
         LB          PDK
         TBT         NBITMO+BXKE5    < TEST DU MODE NEXT/STANDARD.
         JNC         E471            < C'EST LE MODE STANDARD : LA
                                     < CLEF N'EXISTE PAS, OK GO BACK.
<
< CAS DU MODE NEXT :
<
         LA          NEXPE           < TEST DE L'EVENTUELLE BORNE
                                     < SUPERIEURE DE LA CLEF ARG.
         JAL         E472            < C'EST COMPLET, CETTE BORNE
                                     < SUPERIEURE N'EXISTE PAS...
<
< CAS OU ON A TROUVE UNE BORNE SUPERIEURE : C'EST LA CLEF SUIVANTE
< CHERCHEE :
< (A MOINS QUE CETTE BORNE NE SOIT EN DEBORDEMENT...)
<
         LX          NEXW
         LR          X,W             < (W)=@DESCRIPTEUR DE LA CLEF
                                     <     SUIVANTE.
         LX          NEXAS           < (X)=@SECTEUR DU DESCRIPTEUR DE
                                     <     LA CLEF SUIVANTE.
         BSR         ARSDK           < RELECTURE DU SECTEUR (X) ; A
                                     < NOTER QUE CE NE PEUT ETRE
                                     < LE SECTEUR COURANT.
         LB          XXKE1,W         < RECUPERATION DU MOT0 DE LA
                                     < BORNE SUPERIEURE.
         JMP         E473
<
< CAS OU L'ON N'A PAS TROUVE DE BORNE SUPERIEURE : CELA
< SIGNIFIE SOIT QUE CETTE BORNE N'EXISTE REELLEMENT
< PAS (ON EST AU BOUT DU CATALOGUE DE CLEFS), OU QUE
< CELLE-CI APPARTIENT A UNE AUTRE PARTITION :
<
E472:    EQU         $
         PLR         A               < RESTAURE LA FONCTION ARGUMENT
                                     < (Y) DANS A.
         LR          A,Y             < RESTAURE (Y)=FONCTION ARGUMENT.
         TBT         BXPL1           < TEST SUR LA NATURE DU BUFFER
                                     < DE TRAVAIL.
         JC          E474            < OK, ON AVAIT UN BUFFER ALLOUE,
                                     < ON LE GARDE.
<
< CAS OU ON AVAIT UTILISE LE BUFFER DE TP, IL
< FAUT RESTAURER TP AVANT DE RENTRER DANS ACLAS :
<
         LX          C7FF
         ANDR        Y,X             < (X)=NOM-DIRECT DU FICHIER.
         DO          XXXMOY
         ADRI        XXTP/XXXMOY,X   < CONVERSION EN UNE ADRESSE
                                     < SECTEUR SUR LE DISQUE 0.
         BSR         ARSDK           < RE-LECTURE DE TP.
E474:    EQU         $
<        ARRIVE ICI, TP EST EN MEMOIRE :
         LA          PEK
         SBT         BXKE8           < DEMANDE D'ACCES A LA CLASSE
                                     < SUIVANTE (OU PLUTOT A LA 1ERE
                                     < NON VIDE SI ELLE EXISTE...)
<
<        ON A ICI :
<                    (A)=PEK AVEC DEMANDE D'ACCES A LA CLASSE SUIVANTE,
<                    (B)=PDK (BIT15(B)=1 : MODE NEXT).
<
         PLR         W               < RESTAURE : (W)=@TP.
         BSR         ACLAS           < ACCES A LA CLASSE SUIVANTE.
         PSR         W               < SAVE @TP.
         LR          Y,A
         TBT         BXPL1           < TEST DANS LA FONCTION DE LA
                                     < NATURE DU BUFFER DE TRAVAIL :
         JNC         E491            < ON AVAIT UTILISE LE BUFFER DE TP.
         BR          AE261           < UN BUFFER AVAIT ETE ALLOUE,
                                     < GARDONS-LE
AE268:   JMP         E268            < RELAI...
E491:    EQU         $
                                     < ON A TOUJOURS : (L)=@BUFFER.
         BR          AE475           < DANS LE CAS OU IL N'Y AVAIT PAS DE
                                     < DE BUFFER ALLOUE, ON PEUT
                                     < ESSAYER D'EN OBTENIR UN
                                     < DE NOUVEAU...
<
< CAS DU MODE STANDARD :
<
E471:    EQU         $
         LR          W,A             < RECUPERATION DE L'ADRESSE DU
                                     < DERNIER DESCRIPTEUR,
         SLRS        LXKE=K          < QUE L'ON CONVERTIT EN UNE ADRESSE
                                     < DE QUADRUPLE-MOT.
XWOR%1:  VAL         XXPL10=K        < POUR AVOIR LE BIT SIGNIFICATIF...
         SBT         NBITMO-B-XWOR%1
         JMP         E282
<
< CAS OU LA CLEF N'EXISTE PAS, MAIS OU ON A REUSSI A LA CERNER :
<
E268:    EQU         $
         LA          PDK
         TBT         BXKE5           < TEST DU MODE NEXT.
         JNC         E481            < NON, C'EST LE MODE STANDARD.
E473:    EQU         $
<
< CAS OU LE MODE DEMANDE EST NEXT :
<
         TBT         NBITMO+BXKE1    < LE DESCRIPTEUR (W) EST-IL
                                     < EN DEBORDEMENT...
         JC          E495            < OUI, IL FAUT DONC PARCOURIR
                                     < LA LISTE DE DEBORDEMENT.
<
< CAS OU LE DESCRIPTEUR (W) N'EST PAS EN DEBORDEMENT :
< ON VA METTRE DANS (PEK,PDK), LA CLEF
< SUIVANTE DE LA CLEF ARGUMENT, EN VUE
< DE SON UTILISATION PAR LES 'OPEN EN-
< REGISTREMENT' :
<
<
<        RAPPEL :
<                    (W)=POINTE LA CLEF SUIVANTE.
<
         LA          C1FFF
         AND         XXKE1,W
         STA         PEK             < PEK DE LA CLEF SUIVANTE
         LA          XXKE2,W
         STA         PDK             < PDK DE LA CLEF SUIVANTE.
         JMP         E270            < ET ON FAIT COMME SI ON AVAIT
                                     < TROUVE LA CLEF...
<
< CAS DU MODE STANDARD :
<
E481:    EQU         $
         LA          AADD            < RECUPERATION DE L'ADRESSE
                                     < DE L'AVANT DERNIER DESCRIPTEUR.
         SLRS        LXKE=K          < CONVERSION EN UNE ADRESSE QUADRUPLE
                                     < MOT.
XWOR%1:  VAL         XXPL9=K         < RECHERCHE DU BIT SIGNIFICATIF...
         SBT         NBITMO-B-XWOR%1
         LX          AADS            < RECUPERATION DE L'ADRESSE DU
                                     < SECTEUR CONTENANT LE DESCRIPTEUR
                                     < D'ADRESSE AADD.
         JMP         E280
<
<
<        E X E C U T I O N   D ' U N E   F O N C T I O N   D E   T E S T  :
<
<
E303:    EQU         $
<
< TEST D'EXISTENCE DE LA CLEF :
<
         JAL         E370            < LA CLEF EXISTE.
                                     < (BIT0(A)=1).
<
< CAS D'UNE FONCTION DE TEST OU LA CLEF N'EXISTE PAS :
<
         STA         TEST1           < RESULTAT DE PARCOURS.
         STX         TEST2           < ADRESSE SECTEUR,
                                     < AINSI, LE DEMANDEUR PEUT LES RECUPERER
                                     < AU RETOUR DANS (TEST1,TEST2)...
         LY          CE000
         ANDR        A,Y             < (Y)=RESULTAT DE PARCOURS.
         JMP         E305            < GO BACK...
<
< CAS D'UNE FONCTION DE TEST OU LA CLEF EXISTE :
<
<
<        ON A ICI :
<                    (W)=ADRESSE DESCRIPTEUR DE LA CLEF.
<
E370:    EQU         $
         PSR         X
         LA          XXKE2,W         < ACCES AU MOT1 DU DESCRIPTEUR.
         DBT                         < SI ON TROUVE A LA SUITE DU DBT
                                     < (X)=K, C'EST QUE BIT0(MOT1)=1,
                                     < C'EST-A-DIRE QUE LA CLEF EST
                                     < A L'ETAT 'IN USE'.
         ADCR        X               < PAR EXTREME PRUDENCE...
         LY          INFINI          < (Y)=Q8000 INITIALEMENT.
         CPZR        X               < TEST DE L'ETAT IN USE/IDLE.
         JNE         E373            < (X)#0, DONC CLEF A L'ETAT 'IDLE'.
<
< CAS D'UNE CLEF A L'ETAT 'IN USE' :
<
         ADRI        XXPL7-XXPL6,Y   < (Y)='8001.
E375:    EQU         $
<
< RENVOI DES MOT2 & 3 DU DESCRIPTEUR DANS TEST1 & TEST2 :
<
         LA          XXKE3,W         < ACCES MOT2.
         STA         TEST1
         LA          XXKE4,W         < ACCES MOT3.
         STA         TEST2
         PLR         X
         JMP         E305            < GO BACK...
<
< CAS D'UNE CLEF A L'ETAT 'IDLE' :
<
E373:    EQU         $
         TBT         NBITMO+BXPL2    < EST-CE UN TEST-OPEN...
         JNC         E375            < NON JUSTE UNE DEMANDE D'ACCES
                                     < AUX MOT2 & 3 DU DESCRIPTEUR.
<
< CAS D'UN TEST OPEN OU LA CLEF ESTA L'ETAT 'IDLE' :
<
         LYI         XXPL5           < (Y)='0000.
         SBT         BXKE4           < POSITIONNEMENT DU BIT 'IN USE'
                                     < DANS LE MOT1.
         STA         XXKE2,W         < MAJ MOT1.
<
< ECHANGE DE (MOT2,MOT3) & (TEST1,TEST2) :
<
         LX          TEST1
         LA          XXKE3,W
         STA         TEST1
         STX         XXKE3,W
         LX          TEST2
         LA          XXKE4,W
         STA         TEST2
         STX         XXKE4,W
         PLR         X               < RESTAURE @SECTEUR DE LA CLEF
                                     < SUR LAQUELLE ON VIENT DE
                                     < FAIRE UN TEST-OPEN.
         PSR         A,W
         LA          XXKE3,W
         LR          A,W             < (W)=ADRESSE DU DESCRIPTEUR COURANT,
         STX         DEMO2,W         < ON Y INSCRIT L'ADRESSE DU SECTEUR
                                     < CONTENANT LA CLEF COURANTE, ET CECI POUR
                                     < FACILITER UN EVENTUEL RESTART...
         PLR         A,W
         BSR         AWSDK           < REECRITURE DE SON SECTEUR APRES
                                     < LA MAJ QU'IL A SUBIT.
         JMP         E305            < MAINTENANT LA CLEF EST A
                                     < L'ETAT 'IN-USE', GO BACK...



Copyright (c) Jean-François Colonna, 2011-2013.
Copyright (c) CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2011-2013.