<        S I S   C M S 5   14
         PAGE
         PAGE
<
<
<        O P E N   D ' U N   F I C H I E R  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME PERMET
<                    L'OUVERTURE D'UN FICHIER ;
<                    POUR CE FAIRE, ELLE ALLOUE
<                    AU DEMANDEUR (SI CELA EST
<                    POSSIBLE) UNE 'DCT' APPAR-
<                    TENANT AU POOL DU 'SGF',
<                    PUIS ELLE ACTIVE LA TACHE
<                    'SGF' REENTRANTE CORRESPON-
<                    DANTE.
<                      L'ACCES A UN FICHIER PEUT
<                    SE FAIRE SOIT EN EN DONNANT
<                    LE , SOIT EN
<                    RECHERCHANT UN FICHIER D'UN
<                    TYPE DONNE (LIBRE PAR EXEM-
<                    PLE...).
<
<
<        ARGUMENTS :
<                    (A)=
<                        1- BIT0=K : BIT1-15=NOM-DIRECT DU FICHIER,
<                        2- BIT0=1 : BIT1-15=MASK-ETAT RECHERCHE.
<                    (B)=
<                        BIT0-12=K,
<                        BIT13=K : FICHIER PARTAGEABLE,
<                             =1 : FICHIER NON PARTAGEABLE,
<                        BIT14-15=K1 : FICHIER IN,
<                                =10 : FICHIER OUT,
<                                =11 : FICHIER DE TRAVAIL.
<                    (Y)=NVP DU FUTUR FICHIER.
<
<
<        A T T E N T I O N  :
<                      LE 'NVP' DU FUTUR FICHIER
<                    (Y) EST RECUPERE DANS LA PILE
<                    PAR UN DEPLACEMENT CALCULE A
<                    L'ASSEMBLAGE...
<
<
<        REMARQUE :
<                      LORS D'UN "OPEN-NEW", ON
<                    RECHERCHE UN FICHIER LIBRE,
<                    CE QUI SE FAIT EN DONNANT :
<                                    (A)='B0 (=CLOSE & INEXISTANT).
<
<
<        RESULTATS :
<                    (X)=NSP DE LA DCTF ALLOUEE, OU
<                        0 SI L'OPEN N'A PU SE FAIRE.
<
<
         USE         L,DCT0
         USE         W,DEM0
OPNFIL:  EQU         $
XKREG:   VAL         K               < INITIALISATION DU CUMUL DES REGISTRES.
       #@PSR         A,B,Y           < #SISP CMS5 KREG# A CAUSE DU MICRO-CANAL..
       #@PSR         W,L             < #SISP CMS5 KREG# A CAUSE DU MICRO-CANAL..
XREGTG:: VAL         -XKREG          < NOMBRE DE REGISTRES EMPILES A L'ENTREE.
         LR          A,Y             < SAVE PROVISOIRE DE L'ARGUMENT
                                     < D'APPEL (A) DANS Y, POUR SAVOIR
                                     < ULTERIEUREMENT SI L'APPEL A EU
                                     < LIEU PAR NOM-DIRECT OU PAR ETAT.
         RQST        &ASXSGF         <<<NBITEF-N    < MASQUE D'ETAT DU FICHIER.
XWOR%2:  VAL         CORBT?XBITF1=FMASK(K?XWOR%1=FCINST
         ANDI        XWOR%2          < AFIN DE NE TESTER QUE LES BITS
                                     < PARTAGEABLE (13) ET ETAT (14-15).
         CPI         XEF1
XWOR%2:  VAL         COSBT?XBITF1=FMASK(K=FCINST
         ORI         XWOR%2          < RESTAURATION DU BIT OPEN (12).
         JG          E402R           < OPEN IMPOSSIBLE : LE FICHIER
                                     < EST DEJA OUVERT, NON PARTAGEABLE
                                     < ET EXISTANT.
                                     < A NOTER : (Y)=NSPVID !!!
<
< CAS OU L'OUVERTURE DU FICHIER EST POSSIBLE :
<
E401:    EQU         $
<
<        ON A ICI :
<                    (X)=NOM-DIRECT DU FICHIER,
<                    (A)=ETAT DU FICHIER AVANT CETTE DEMANDE.
<                    (Y)=K : FICHIER DEJA OUVERT, OU APPEL AVEC
<                            LE NOM-DIRECT=K,
<                       >=K : APPEL PAR NOM-DIRECT,
<                       <  0 : APPEL PAR ETAT.
<
         CPZR        Y
         JL          Z239            < APPEL PAR ETAT.
<
< CAS DE L'APPEL PAR NOM-DIRECT (LE CAS FICHIER DEJA
< OUVERT QUI AMENE AUSSI ICI, SERA
< DISCRIMINE PAR LA SUITE) ; DANS LE CAS DE L'APPEL
< PAR NOM-DIRECT, ON VERIFIE QUE LE FICHIER
< DEMANDE EST EXISTANT :
<
XWOR%1:  VAL         BIT>NBITEF-N    < MASQUE DE L'ETAT...
XWOR%2:  VAL         CORBT?XBITF2=FMASK(K?XWOR%1=FCINST
         LYI         XWOR%2          < ON VA IGNORER LE BIT PARTAGEABLE.
         ANDR        A,Y             < (Y)=K SI LE FICHIER ETAIT (ETAT
                                     <     DANS A) CLOSE ET INEXISTANT.
         CPZR        Y
         JE          E402R           < ERREUR : L'OPEN NE PEUT AVOIR
                                     < LIEU DANS LE CAS OU LE FICHIER
                                     < DEMANDE PAR NOM EST CLOSE ET
                                     < INEXISTANT.
                                     < A NOTER : (Y)=K.
<
<
<        O U V E R T U R E   D U   F I C H I E R  :
<
<
<
Z239:    EQU         $
<
< RECHERCHE D'UNE DCT LIBRE :
<
         PSR         A
         LA          &ASDCTF
         BSR         ABETA           < (A)=BETA(SDCTF),
                                     <    =NOMBRE DE 'DCTF' LIBRES...
         IF          XXFICD-W,,,XEIF%
         IF          ATTENTION : IL FAUT QUE LE SEUIL UTILISE
         IF          PAR LE 'CCI' SOIT SUPERIEUR A 'W' POUR DES
         IF          RAISONS LIEES A DES DEMANDES SIMULTANEES
         IF          D'OUVERTURE DE FICHIERS !!!
XEIF%:   VAL         ENDIF
         CPI         W               < Y-EN-A T'IL AU MOINS UNE ???
         JGE         Z239X1          < OUI, AU MOINS UNE...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      IL N'Y A PAS DE 'DCTF' DE LIBRES ;
<                    AUTREFOIS, ON FAISAIT :
<
<        LAD         &ASXSGF
<        BSR         ARLSE           < SORTIE DE LA PHASE CRITIQUE 'SGF',
<        RQST        &ADCTF          < ATTENTE D'ALLOCATION D'UNE 'DCTF',
<        RQST        &ASXSGF         < PUIS, RE-RENTREE EN PHASE CRITIQUE...
<
<                    MALHEUREUSEMENT, L'ETAT DU FICHIER
<                    DANS 'TEDF' N'INDIQUE PAS ENCORE
<                    L'OUVERTURE (QUI A LIEU A LA SORTIE
<                    DE 'OPNFIL') ; OR EN PARTICULIER DANS
<                    LE CAS DE L'OPEN 'NEW', SI PAR MALHEUR
<                    2 OPENS 'NEW' ONT LIEU SIMULTANEMENT, IL
<                    SE PEUT QU'IL TOMBE SUR LE MEME FICHIER
<                    INTERNE !!!
<                      ALORS QUE FAIRE ??? ET BIEN JE NE SAIS PAS
<                    CAR IL Y A UN RISQUE TEL QUE CELUI EVOQUE
<                    CI-DESSUS !!!
<
         LAD         &ASXSGF
         BSR         ARLSE           < ON SORT DE LA PHASE CRITIQUE,
         RQST        &ASXSGF         < ET ON Y RE-RENTRE...
Z239X1:  EQU         $
         PLR         A
         RQST        &ASDCTF         < ATTENTE D'UNE DCTF.
                                     < (ON SAIT QU'IL EN EXISTE AU MOINS
                                     < UNE...)
<
< CAS OU AU MOINS UNE DCTF EST LIBRE :
<
         BSR         AACTP           < ACCES A LA TP : (W)=@TP DU FICHIER.
<
<
<        A T T E N T I O N  :
<                      A PARTIR D'ICI, LA 'TP' DU
<                    FICHIER EST RESIDENTE EN ME-
<                    MOIRE CENTRALE...
<
<
         IC          NUSF,W          < ET 1 UTILISATEUR DE PLUS SUR
                                     < CE FICHIER (C'EST PEUT-ETRE LE 1ER).
         PSR         A,X             < SAVE L'ETAT AVANT LA DEMANDE,
         NTRN
         LXI         X8/NBITMO       < (X)=NOMBRE DE MOTS OCCUPES PAR (TODCTF'.
         TRN
         LAD         AODCTF          < ADRESSE DU RELAI VERS LA TABLE
                                     < D'OCCUPATION DES DCTF.
         BSR         ASOBT           < RECHERCHE ET OCCUPATION DE
                                     < LA 1ERE DCTF LIBRE.
         JG          SYSRD1          < OK, (X) EST CORRECT...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      ATTENTION, SI L'ON RELANCE LE
<                    SYSTEME, LE NUMERO DE 'DCTF'
<                    ALLOUEE EST FORCEMENT MAUVAIS
<                    ET RISQUE DE PERTURBER 'DCTSY'...
<
SYSRD1:  EQU         $
<
<        ON A ICI :
<                    (A)=NUMERO PAR RAPPORT A 0 DE LA 1ERE DCTF LIBRE.
<
         LR          A,X
         PSR         X               < SAVE NUMERO DE DCTF / A 0.
         ADRI        NSPFIL,X        < (X)=NSP DE LA DCTF ALLOUEE.
<
< ALLOCATION D'UN BUFFER D'IMPLANTATION DE LA DCTF :
<
         PSR         W               < SAVE @TP.
         LA          AALBTP          < ETANT DANS UNE PHASE CRITIQUE
                                     < DU SGF, ON PEUT UTILISER LE
                                     < BLOC NON REENTRANT D'ALLOCATION
                                     < DES BUFFERS DE TP.
         LR          A,W             < (W)=@DEMANDE ALLOCATION BUFFER.
         STZ         ARGDEM+OPDEM    < RAZ DU BIT WAITB DE L'OPDEM.
         LAD         ARGDEM+ASDEM
         STA         ARGDEM+AMDEM    < L'ADRESSE OCTET DU BUFFER ALLOUE
                                     < SERA RENVOYE PAR ASDEM.
         BSR         ACHAND          < DEMANDE D'ALLOCATION 1 BUFFER.
         LA          &ADCTSY         < TEST DE DCTSY.
         JAE         SYSRD2          < OK, DCTSY(NSPF)=K.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      JE NE SAIS PAS, MAIS EN TOUT
<                    CAS ALLER VOIR QUELLE ET LA
<                    TACHE QUI OCCUPE DCTSY(X).
<
         JMP         SYSRD2          < ET OUI...
E402R:   JMP         E402            < RELAI VERS 'E402'...
SYSRD2:  EQU         $
         SBT         WAITB           < RESTAURATION DE L'OPDEM DE
                                     < ALBTP (AVEC WAITB POSITIONNE) ; A
                                     < NOTER QU'ICI, ON A : (A)=K.
         BSR         ACHANW          < ATTENTE DE FIN D'ALLOCATION.
         STA         ARGDEM+OPDEM    < RESTAURATION DE L'OPDEM DE ALBTP.
<
< RECUPERATION DU BUFFER ALLOUE POUR DCTF :
<
         LA          ARGDEM+ASDEM
         SLRS        NOCMO=K         < CONVERSION EN UNE ADRESSE MOT.
         PLR         W               < RESTAURE (W)=@TP.
         LR          A,L             < (L)=@DCTF.
<
< INITIALISATION DE LA DCTF :
<
         LR          X,Y             < (Y)=NSP DE LA DCTF.
         LXI         LDCTF           < (X)=LONGUEUR D'UN BUFFER.
E441:    EQU         $
         STZ         O,L             < MISE A 0 DE TOUT LE BUFFER CONTE-
         ADRI        P,L             < LA FUTURE 'DCTSGF'.
         JDX         E441
         ADRI        -LDCTF+PFIL+DEPILE,L
                                     < POSITIONNEMENT SUR LE PREMIER MOT
                                     < DE LA PILE DE LA 'DCTSGF'.
         LXI         LPILEH+XXPFIL+XXPILI
                                     < (X)=LONGUEUR D'UNE PILE DE 'DCTSGF'.
E441X:   EQU         $
         LR          L,A
         STA         O,L             < ON INITIALISE TOUTE LA PILE DE LA
         ADRI        P,L             < 'DCTSGF' AVEC LE '$', AFIN D'ETRE
         JDX         E441X           < COMPATIBLE AVEC 'SI CMS5 GENPIL2'.
         ADRI        -LPILEH-XXPFIL-XXPILI-PFIL-DEPILE,L
                                     < RESTAURE : (L)=ADRESSE 'DCTSGF'.
XWOR%1:  VAL         XLNSGF=FCBA(MOCD
         LRM         A,X
         BYTE        XWOR%1;KF       < POUR UN NOM TYPE "HANDLER-SGF"...
         WORD        COSBT?BISOSE=FMASK(K=FCINST
         STA         HNAME           < RANGEMENT 2 PREMIERS CARACTERES DU NOM
                                     < DE CE HANDLER TYPE "SGF"...
         STX         BITSEM          < ON POSITIONNE 'BISOSE' DANS 'BITSEM' DE
                                     < LA 'DCTSGF' ; AINSI LE 'SGF' NE TRANSMET
                                     < JAMAIS LE COUPLE (SLO,SLE) SAUF EXCEP-
                                     < TION (DANS 'ELESS' LORSQU'IL S'AGIT DES
                                     < LECTURES-ECRITURES DES SECTEURS D'UN
                                     < ENREGISTREMENT DE FICHIER...
         PLR         X               < (X)=NUMERO DE DCTF PAR RAPPORT A 0.
         ADRI        I,X             < (X)=NUMERO DE DCTF PAR RAPPORT A 1.
         XR          B,X             < SAVE B DANS X, ET :
                                     < (B)=NUMERO DE DCTF PAR RAPPORT A 1.
         LAI         K               < NETTOYAGE DE A.
         DV          DIX             < (A)=DIZAINES ; (B)=UNITES.
         ADRI        HZERO,A         < CONVERSION ASCI DES DIZAINES.
         ADRI        HZERO,B         < CONVERSION ASCI DES UNITES.
         STB         HNAME+LHNAME-Z  < RANGEMENT CHIFFRE DES UNITES.
         STBY        HNAME+LHNAME-Z  < RANGEMENT CHIFFRE DES DIZAINES.
         LR          X,B             < RESTAURE (B)=ETAT DEMANDE APRES
                                     < L'OPEN DU FICHIER.
         IF          SPHEX0-I,,XEIF%,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         IC          SPHEX           < LE SEMAPHORE D'EXCLUSION DE
                                     < PHASE CRITIQUE DE CETTE DCT
                                     < EST MIS A 1.
         IF          XXNTRY-I,,XEIF%,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         IC          NTRIES          < LE NBRE MAX D'ESSAIS EST FIXE A 1.
         LRM         A,X
         WORD        TRYVID
         WORD        XSGFON
         STA         FRETRY          < POUR FAIRE UNE 'SYSER' !!!
         STX         DCTFON          < LISTE DES FONCTIONS RECONNUES.
         LRM         A,X
         WORD        SMST
         WORD        XSGFUP
         STA         PST+RS          < REGISTRE 'S' : MODE MAITRE...
         STX         DCTFUP          < ET LISTE DES "ALTITUDES" DES FONCTIONS...
XWOR%1:  VAL         MOCG=K
XWOR%2:  VAL         XNVPF>XWOR%1
         IF          XWOR%2-Q8000,,XEIF%,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         STA         IOID            < ON MET LE CODE '80 DANS LA PARTIE
                                     < 'IO' DE IOID (MODE FICHIER).
         IF          K,,XEIF%,
         IF          ATTENTION : L'INITIALISATION DE 'ETAT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
         LR          L,A
         STA         PST+RL          < REGISTRE L.
         ADRI        PFIL,A
         STA         PST+RK          < REGISTRE K.
         LR          C,A
         STA         PST+RC          < REGISTRE C.
         LRM         A,X
         WORD        SO
         WORD        SE
         STA         PST+RSLO        < INITIALISATION DE 'SLO',
         STX         PST+RSLE        < ET DE 'SLE' (PLUS PROPRE QU'UTILE...).
         LRM         A,X
         WORD        FFILTR
         WORD        FSFILT
         STA         FILTRE          < ROUTINE DE FILTRAGE,
         STX         SFLITR          < ROUTINE DE S-FILTRAGE.
         LRM         A,X
         WORD        HANDLR
         WORD        HDLFIL
         STA         PST+RP          < REGISTRE P,
         STX         ES              < HANDLER DE GESTION DE FICHIERS.
         XR          W,K             < W BASE LA PILE...
         LA          -XREGTG+DEPILE,W  < RECUPERATION DU FUTUR 'NVP' DU FICHIER.
         XR          W,K
         LXI         FONSB           < FONCTION 'SET BIT A 1 SANS VERIF'.
         CPBY        MEMV            < COMPARAISON DU NVP AU SEUIL...
         JGE         E441Y           < NVP>=SEUIL ==> SGF SUR DKB...
         LXI         FONRB           < FONCTION 'SET BIT A 0 SANS VERIF'.
E441Y:   EQU         $
         LAI         NSPDKB          < DANS TOUS LES CAS ON DEMANDE
                                     < 'DKB' QUI SERA PEUT-ETRE UTILISEE
                                     < EN TRANSPARENT...
         STBY        VAR+DFILDK+XXNSP      < ON GENERE LE NSPTYP DE LA DEMANDE
                                     < D'E/S DISQUE UNE FOIS POUR TOUTE...
         XR          X,Y             < (X)=NSP(DCTF), (Y)=FONCTION.
         LAD         ATNSPF          < (A)=ADRESSE DU RELAI VERS 'TNSPF'.
         BSR         ATMOBT          < MEMORISATION DE LA POSITION DU
                                     < 'NVP' DU FICHIER PAR RAPPORT AU
                                     < SEUIL ACTUEL...
         LR          L,A             < (A)=ADRESSE DE LA 'DCTSGF',
         STA         &ADCTSY         < ET ENFIN MISE A JOUR DE 'DCTSY' PAR
                                     < INSERTION DE CETTE NOUVELLE 'DCTSGF'.
         XR          X,Y
XWOR%1:  VAL         YAPILS-DCTF0-DAPILS
         ADRI        DAPILS+XWOR%1,A < BASE DE LA PILE DES SECTEURS
                                     < A RELEASER.
         SBT         BITX            < BIT D'INDEXATION.
         STA         VAR+APILS       < POINTEUR DE LA PILE DES SECTEURS.
         STY         VAR+NSPF        < SAVE NSP DE LA DCTF.
         LAD         AESTF           < ADRESSE DU RELAI VERS 'ESTF'.
         LR          Y,X             < (Y)=NSPDCTF.
         ADRI        NSNSP0,X        < (X)=NIVEAU SOFT DE LA DCTF.
         BSR         ASMMK           <<< MASQUAGE GENERAL IT
         LYI         FONSB           < FONCTION DE MISE A 1 D'UN
                                     < BIT SANS VERIFICATION.
<
<
<        P H A S E   I N I N T E R R U P T I B L E  :
<
<
         BSR         ATMOBT          < BISE A 1 DU BIT DE CTTE TACHE DANS
                                     < LA FILE ESTF.
         BSR         ASMDK           <<< DEMASQUAGE GENERAL IT
         LY          VAR+NSPF        < RESTAURE (Y)=NSPDCTF.
<
<
<        A T T E N T I O N  :
<                      L'ARMEMENT DU HANDLER 'SGF' AURA
<                            LIEU AU COURS DE LA 1ERE DEMANDE
<                            QUI LUI SERA ADRESSEE.
<
<
         PLR         A,X             < RESTAURE ETAT AVANT (A) ET NOM
                                     < DIRECT (X).
         STX         VAR+FILNOM      < MISE DU NOM DIRECT DANS LA DCTF.
<
<        ON A ICI :
<                    (A)=ETAT AVANT LA DEMANDE D'OPEN,
<                    (B)=ETAT DEMANDE POUR LE FICHIER APRES L'OPEN,
<                    (X)=NOM DIRECT DU FICHIER,
<                    (Y)=NSP DE LA DCTF ALLOUEE,
<                    (L)=ADRESSE DCTF,
<                    (W)=ADRESSE TP DU FICHIER.
<
<
< MISE A JOUR DE TEDF :
<
         SBT         NBITMO+XBITF1   < ON FORCE LE BIT OPEN DANS
                                     < L'ETAT DEMANDE POUR LE FICHIER.
XWOR%1:  VAL         COSBT?XBITF1=FMASK(K=FCINST
         ANDI        XWOR%1          < DE L'ETAT AVANT LA DEMANDE, ON
                                     < NE CONSERVE QUE LE BIT
                                     < OPEN/CLOSE (BIT 12).
         SLLS        NBITEF+XBITF1-XBITF2 < CE BIT OPEN/CLOSE EST POSITIONNE
                                     < EN FACE DU BIT DE MASQUE DU BIT
                                     < PARTAGEABLE/NON PARTAGEABLE.
<
<
<        A T T E N T I O N  :
<                      SI LE FICHIER ETAIT 'OPEN' (1),
<                    ET QUE LE PASSAGE EN 'NON PARTAGEA-
<                    BLE' SOIT DEMANDE, IL FAUT ALORS
<                    IGNORER CE BIT, LE MASQUE DE L'ETAT
<                    A DONNER AU FICHIER EST DONC CONS-
<                    TRUIT A PARTIR DU BIT OPEN/CLOSE
<                    DE L'ETAT AVANT...
<
<
         IBT         XBITF1-NBITEF-XBITF1+XBITF2
                                     < INVERSION DE L'ANCIEN BIT OPEN/CLOSE.
XWOR%1:  VAL         BIT>NBITEF-N    < MASQUE DE L'ETAT FICHIER.
XWOR%2:  VAL         CORBT?XBITF2=FMASK(K?XWOR%1=FCINST
XWOR%2:  VAL         XWOR%2>NBITEF   < CADRAGE...
         ORI         XWOR%2
<
<        ON A ICI :
<                    (A)=MASQUE, ET :
<                                    (A)='B0 SI LE FICHIER ETAIT OPEN,
<                                    (A)='F0 SI LE FICHIER ETAIT CLOSE.
<
         ORR         B,A             < DANS A ON A L'ARG DE MTEDF.
<
< ELIMINATION DES DEMANDES D'ETAT INEXISTANT :
<
         RBT         NBITMO+XBITF1   < RAZ DU BIT OPEN FORCE CI-DESSUS.
         RBT         NBITMO+XBITF2   < RAZ BIT PARTAGEABLE A PRIORI.
         CPZR        B
         JNE         E410            < ETAT DEMANDE :
                                     < IN, OUT, OU TRAVAIL.
<
< CAS OU L'ETAT DEMANDE EST 'INEXISTANT',
< ON FORCE L'ETAT 'TRAVAIL' :
<
XWOR%1:  VAL         COSBT?XBITF3=FMASK(K=FCINST
XWOR%1:  VAL         COSBT?XBITF4=FMASK(K?XWOR%1=FCINST
         ORI         XWOR%1          < MISE A 1 DES BITS 14 & 15 DE A.
E410:    EQU         $
         BSR         AMTEDF          < MAJ DE L'ETAT DU FICHIER.
<
< MISE DANS LA DCTF DU NIVEAU DE LA TACHE FAISANT L'OPEN :
<
         BSR         ACANSP          < RENVOIE (A)=NSP DEMANDEUR OU NSPACT.
         STA         VAR+NSPDDR      < NSPDDR DE DCTF = DCT DE L'OUVREUR
E402:    EQU         $
         LR          Y,X             < RESTAURE NSPDCTF DANS X.
         LAD         &ASXSGF
         BSR         ARLSE
         PLR         W,L             < A CAUSE DU MICRO-CANAL.
         PLR         A,B,Y           < A CAUSE DU MICRO-CANAL.
         RSR                         < ...OUF...
         PAGE
<
<
<        C L O S E   D ' U N   F I C H I E R  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME A POUR BUT
<                    DE FERMER UN FICHIER, C'EST-A-
<                    DIRE DE LIBERER LES RESSOURCES
<                    QU'IL UTILISAIT ('DCTF', BUFFER
<                    DE SA 'TP',...). CETTE FERMETURE
<                    EST REFUSEE DANS LE CAS OU LE
<                    TRAVAIL EN COURS EST INACHEVE
<                    ('OPEN ENREGISTREMENT' SANS LE
<                    'CLOSE' ASSOCIE).
<
<
<        ARGUMENTS :
<                    (A)=
<                        SI BIT0=K : BIT1-15=NOM DIRECT DU FICHIER A FERMER,
<                        SI BIT0=1 : BIT1-15=NSP DE LA DCTF ALLOUEE
<                                            AU FICHIER LORS DE L'OPEN.
<                    (B)=
<                        BIT8-11=K011 : DELETE (METTRA LE FICHIER A L'ETAT
<                                       OPEN & INEXISTANT).
<                               =1000 : SAVE. (ETAT CLOSE).
<                               =1011 : MODE SPECIAL RESERVE AU
<                                       RELEASEUR DES CLEFS D'UN FICHOIER
<                                       DELETE (METTRA LE FICHIER A L'ETAT
<                                       CLOSE & INEXISTANT).
<                        (LE RESTE DE B ETANT A 0 ; CECI EST UN
<                        ETAT/MASK A DONNER AU FICHIER AU CLOSE).
<                    (L)=ADRESSE DCTF, SI BIT0(A)=K.
<
<
<        RESULTATS :
<                    (Y)=K SI CLOSE OK, OU SI ENCORE AU MOINS UN UTI-
<                        LISATEUR SIMULTANE.
<                       =1 SI LE FICHIER ETAIT DEJA FERME,
<                       =2 SI CLOSE NON REALISE, UN 'OPEN ENREGISTREMENT'
<                       AYANT ETAIT FAIT (SANS LE CLOSE ASSOCIE),
<                       =NIVEAU DE LA TACHE AYANT FAIT L'OPEN SI LE
<                       DEMANDEUR DE CLOSE N'EST PAS L'OUVREUR...
<
<
ECFC:    VAL         ECFC
ECEO:    VAL         ECEO
         USE         L,DCT0
CLSFIL:  EQU         $
         PSR         A,X,L,W
         LX          C7FF            < MASQUE DE NOM-DIRECT.
         ANDR        A,X             < (X)=NOM DIRECT OU NSP.
<
< DISCRIMINATION DU MODE D'APPEL :
<
         JAG         E403            < BIT0(A)=K : APPEL PAR NOM-DIRECT.
<
< CAS D'UN APPEL PAR NSP : IL FAUT CALCULER L'ADRESSE DE LA DCT :
<
         JAE         E444            < < SI NSP=K, C'EST HDLVID, RIEN
                                     < A FAIRE.
         LYI         ECFC            < POSITIONNEMENT DU CODE ERREUR
                                     < 1 DANS Y.
         LA          &ADCTSY         < RECUPERATION DE L'@DCTF DANS A.
                                     < NOTA : ON N'UTILISE PAS CADCT,
                                     < CAR SI LE FICHIER N'EXISTE PAS,
                                     < ON A DCTSY(X)=K, ET EN FAIT,
                                     < IL N'Y A PAS DE RECOVERY A FAIRE.
         JAE         E405            < ERREUR : LA DCTF N'EXISTE PAS,
                                     < LE CLOSE NE PEUT DONC AVOIR LIEU.
         JAG         SYSRD3          < OK : LA DCTF EXISTE.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      ETRE PRUDENT, CAR L'ADRESSE
<                    RECUPEREEE N'EST PAS CELLE NI
<                    D'UN BUFFER, NI D'UNE 'DCT',
<                    CAR ELLES SONT POSITIVES...
<
SYSRD3:  EQU         $
         LR          A,L             < (L)=@DCTF.
<
< TEST D'UN DEBORDEMENT DES PILES 'SGF' :
< MALHEUREUSEMENT APRES QUE CE DEBORDEMENT
< AIT EU LIEU !!!
<
         LAD         LDCTF-Z,L       < ACCES AU DERNIER MOT DE LA 'DCTSGF',
         CP          LDCTF-Z,L       < COMME IL S'AGIT DU DERNIER MOT DE LA
                                     < PILE, IL DOIT ENCORE CONTENIR SA
                                     < PROPRE ADRESSE (C'EST UN GARDE-FOUS...).
         JE          E403X1          < C'EST BON...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      EVALUER L'AMPLITUDE DU DEBORDEMENT,
<                    ET VOIR OU CELA C'EST PRODUIT, ET QUE
<                    FAIRE POUR QUE LES 'DCTSGF' RESTENT
<                    IMPLANTEES DANS UN BUFFER !!!
<
E403X1:  EQU         $
<
<        ON A ICI :
<                    (L)=ADRESSE DCTF,
<                    (X)=NSPF.
<
<
< TEST D'OUVREUR-FERMEUR :
<
         BSR         ACANSP          < RENVOIE (A)=NSP FERMEUR (OU NSPACT)
         LY          VAR+NSPDDR      < ACCES AU NSP DE L'OUVREUR
         CPR         A,Y
         JNE         E405            < CLOSE REFUSE : (Y)=NIVEAU-OUVREUR.
         LX          VAR+FILNOM      < RECUPERATION DU NOM DIRECT DU
                                     < FICHIER A FERMER.
E403:    EQU         $
         BSR         ABETA1          < CACUL (A)=BETA(SCHVID(DCTF))).
         JAL         Z221            < OK : HDLSGF EN ATTENTE SUR SCHVID
         LRM         A
         WORD        HANDLR          < DANS LE CAS OU HDLSGF N'EST PAS
                                     < EN ATTENTE SUR SCHVID, TESTONS
                                     < SON REGISTRE P POUR SAVOIR
                                     < S'IL A 'BOUGE' DEPUIS L'OPEN...
         CP          PST+RP          < VALEUR INITIALE DE P.
         JE          Z221            < OK : HDLSGF N'A PAS 'BOUGE'...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
Z221:    EQU         $
<
< TESTS DE VALIDITE DU CLOSE :
<
<
<        ON A ICI :
<                    (X)=NOM DIRECT DU FICHIER.
<
         LY          ETAT1           < Y-A-T'IL UN OPEN ENREGISTREMENT
                                     < EN COURS...
         ADR         Y,Y
         IF          ECEO-2,,XEIF%,
         IF          ATTENTION : 'ECEO' EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
         CPZR        Y
         JNE         E405            < OUI, LE CLOSE EST REFUSE,
                                     < NOTONS AU PASSAGE QUE : (Y)=2.
<
< TEST SUR L'ETAT DU FICHIER :
<
         LYI         FONSB1          < (Y)=1 A PRIORI, S'IL IL N'Y A PAS
                                     <     D'ERREUR, CE (Y)=1 SERA UTILISE
                                     <     PAR ATMOBT PAR LA SUITE.
         IF          ECFC-FONSB1,,XEIF%,
         IF          ATTENTION : 'ECFC' EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
         LAI         MTSGF           < ARGUMENT DE DEMANDE D'ETAT.
         BSR         AMTEDF
<
<        ON A ICI, AU RETOUR :
<                    (A)=ETAT DU FICHIER DE NOM DIRECT (X).
<
         TBT         XBITF1          < TEST DU BIT OPEN (1) / CLOSE (K).
         JNC         E405            < DEJA FERME : (Y)=1.
<
< CAS OU LE FICHIER ETAIT OUVERT :
<
         RQST        &ASXSGF         <<<XWOR%2
         SWBR        X,X             < (X)='0800 (FONCTION TEST-OPEN).
         ORR         X,Y             < (Y)=TEST-OPEN.OR.NOM-DIRECT.
         BSR         AOPN1           < DEMANDE D'OUVERTURE DE
                                     < L'ENREGISTREMENT.
<
< TEST DES CONDITIONS DE RETOUR :
<
         CPZR        Y
         JNE         E416XX          < Y CONTIENT DEJA LE CODE-ERREUR.
<
< CAS OU L'OPEN A EU LIEU :
<
         LA          &VAR+AFILT      < ACCES A LA TETE DE L'ENREGISTREMENT.
         STA         VAR+NFILR       < INITIALISATION DE L'ADRESSE DU
                                     < PROCHAIN SECTEUR A LIRE AVEC LA
                                     < TETE DE L'ENREGISTREMENT.
E416XX:  EQU         $
         RSR                         < (Y)=K, OK.
         PAGE
<
<
<        O P E N - N E W   E N R E G I S T R E M E N T  :
<
<
<        ARGUMENTS :
<                    (Y)=NOM-DIRECT DU FICHIER AUQUEL APPARTIENT
<                        L'ENREGISTREMENT,
<                    (L)=ADRESSE DCTF.
<                    (A,B)=CLEF.
<
<
         USE         L,DCT0
         USE         W,DEM0
OPNNK:   EQU         $
         JALE        OPNNK1          < VALIDATION DE 'PEK'...
         CP          C1FFF           < IL FAUT QUE BIT0=BIT1=BIT2=K
         JLE         E499
OPNNK1:  EQU         $
         LYI         ECEC1           < ERREUR : 'PEK' INVALIDE
         JMP         E417XX
<
< CAS D'UNE 'PEK' VALIDE :
<
E499:    EQU         $
         TBT         NBITMO+BXKE5    < TEST PARITE DE PDK DANS LE
         JC          E4991           < CAS D'UN OPEN-NEW: IL EST
                                     < INTERDIT D'INSERER DES CLES
                                     < IMPAIRES SI L'ON VEUT QUE
                                     < LE FONCTIONNEMENT DU MODE NEXT
                                     < SOIT CORRECT
         TBT         NBITMO+BXKE4    < DE PLUS, PDK DOIT ETRE > 0
         JNC         E478
E4991:   EQU         $
         LYI         ECEC2           < ERREUR PDK
         JMP         E417XX
<
< CAS D'UN PDK CORRECT LORS D'UN OPEN NEW
<
E478:    EQU         $
         LX          INFINI          < (X)=FONCTION INSERT.
         ORR         X,Y             < (Y)=FONCTION-INSERT.OR.NOM-DIRECT.
         BSR         AOPN1           < DEMANDE D'OUVERTURE.
<
< TEST DES CONDITIONS DE RETOUR :
<
         CPZR        Y
         JE          E417            < OK, L'OPEN A LIEU.
<
< CAS OU L'OPEN N'A PU AVOIR LIEU :
<
         JMP         E417XX          < Y CONTIENT DEJA LE CODE-ERREUR.
<
< CAS OU L'OPEN A EU LIEU :
<
E417:    EQU         $
         LA          INFINI
         STA         VAR+NFILR       < INITIALISATION DE L'ADRESSE DU
                                     < PROCHAIN SECTEUR A LIRE AVEC
                                     < L'INFINI.
E417XX:  EQU         $               < SORTIE...
         RSR                         < (Y)=K, OK.
         PAGE
<
<
<        O P E N - N E X T   E N R E G I S T R E M E N T  :
<
<
<        ARGUMENTS :
<                    (L)=ADRESSE DCTF.
<                    (CLEFS,CLEFS+1)=CLEF PRECEDENTE,
<                    (Y)=NOM-DIRECT DU FICHIER.
<
<
         USE         L,DCT0
         USE         W,DEM0
OPNEXT:  EQU         $
         LA          VAR+CLEFS+CLEFSE < RECUPERATION DE LA
         LB          VAR+CLEFS+CLEFSD < CLEF COURANTE...
         SBT         NBITMO+BXKE5    < POSITIONNEMENT DU MODE NEXT.
         JMP         OPNONK          < ON EST RAMENE A OPEN-OLD...
         PAGE
<
<
<        I N I T I A L I S A T I O N   D ' U N   C L O S E
<                    E N R E G I S T R E M E N T  :
<
<
<        ARGUMENTS :
<                    (Y)='6800.OR.NOM-DIRECT SI CLOSE-SAVE,
<                       ='6000.OR.NOM-DIRECT SI DELETE-RELEASE,
<                    (L)=ADRESSE DCTF.
<
<
<        RESULTAT :
<                    (Y)=K SI CLOSE AUTORISE,
<                       =2 SI CLOSE IMPOSSIBLE, AUCUN OPEN N'AYANT
<                          EU LIEU.
<
<
         USE         L,DCT0
         USE         W,DEM0
CLO1:    EQU         $
<
< TEST SUR OPEN EN COURS :
<
         LX          ETAT1
         ADRI        -I,X
         CPZR        X
         JE          E418            < OK, ETAT1=1, IL Y A DONC EU
                                     < UN OPEN AVANT.
<
< CAS OU IL N'Y A PAS EU D'OPEN AVANT :
<
         LYI         ECEO            < CODE ERREUR CLOSE DEMANDE SANS
                                     < OPEN.
         JMP         E418XX
<
< CAS OU IL Y A EU UN OPEN AVANT LA DEMANDE DE CLOSE :
<
E418:    EQU         $
<
< SAUVEGARDE DU DESCRIPTEUR D'ENREGISTREMENT
< DANS LE DESCRIPTEUR DE CLEF :
<
         LX          &VAR+AFILT      < RECUPERATION DE LA TETE DE
                                     < L'ENREGISTREMENT.
         STX         TEST1
         LX          &VAR+AFILQ      < RECUPERATION DE LA QUEUE DE
                                     < L'ENREGISTREMENT.
         STX         TEST2
         LA          VAR+CLEFS+CLEFSE < RECUPERATION DE LA
         LB          VAR+CLEFS+CLEFSD < CLEF COURANTE...
         XR          B,X
         BSR         ASTBOX          < RENVOI EVENTUEL DE 'PDK' DANS LA BOX...
         XR          B,X
         PSR         W
         BSR         AACTP2          < MISE EN MEMOIURE DE LA TP
                                     < DU FICHIER.
         BSR         APLSC           < Y POSSEDE LA FONCTION DEMANDEE.
         PLR         W
<
< TEST DES CONDITIONS DE RETOUR :
<
         CPZR        Y
         JE          SYSRD7          < OK.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      PEUT-ETRE UN 'JMP E418XX'...
<
SYSRD7:  EQU         $
         DC          ETAT1           < ETAT1=K, ON MEMORISE
                                     < AINSI QU'IL N'Y A PLUS
                                     < D'OPEN EN COURS.
E418XX:  EQU         $
         RSR                         < (Y)=K, OK.
         PAGE
<
<
<        C L O S E   S A V E   D ' U N   E N R E G I S T R E M E N T  :
<
<
<        ARGUMENTS :
<                    (Y)=NOM-DIRECT DU FICHIER,
<                    (L)=ADRESSE DCTF.
<
<
         USE         L,DCT0
         USE         W,DEM0
CLOSK:   EQU         $
         LA          VAR+NFILW       < TEST DU PROCHAIN SECTEUR A ECRIRE.
         CP          INFINI          < EXISTE-T-IL?
         JNE         E465            < OUI, IL EXISTE
<
< CAS OU LE PROCHAIN SECTEUR A ECRIRE N'EXISTE PAS (Q8000) :
<
XWOR%1:  VAL         MXPL1=K
XWOR%2:  VAL         XXPL2>XWOR%1    < CADRAGE DE LA FONCTION DE DELETE.
XWOR%3:  VAL         COSBT?BXPL2=FMASK(K?XWOR%2=FCINST
XWOR%4:  VAL         MOCG=K
XWOR%4:  VAL         -XWOR%4         < POUR UN CADRAGE A DROITE...
         LXI         XWOR%3>XWOR%4
         SWBR        X,X             < (X)='6800=FONCTION DE DELETE-CLOSE.
         ORR         X,Y             < (Y)='6800.OR.NOM-DIRECT.
         BSR         ACLO1           < DEMANDE DE FERMETURE DE
                                     < L'ENREGISTREMENT EN SAVE.
<
< TEST DES CONDITIONS DE RETOUR :
<
         CPZR        Y
         JNE         E419            < ERREUR, LE CLOSE EST REFUSE.
         BSR         ARDESC          < DANS LE CAS OU LE CLOSE EST
                                     < ACCEPTE ON RELEASE LE DESCRIPTEUR
                                     < D'ENREGISTREMENT.
E419:    EQU         $
         RSR                         < OK, Y EST CORRECT.
<
< CAS OU LE PROCHAIN SECTEUR A ECRIRE EXISTE :
<
E465:    EQU         $
<
< TRANSFORMATION DE LA DEMANDE DE CLOSE
< SAVE EN UNE DEMANDE D'ECRITURE AVEC EOF ;
< LE SECTEUR QUE L'ON VA ECRIRE EN
< QUEUE DE L'ENREGISTREMENT CONTIENT
< 2 CARACTERES 'EOT' CONSECUTIFS.
<
         LAI         FGW             < FONCTION ECRITURE.
         SBT         EOF             < AVEC 'EOF'.
         STA         ARGDEM+OPDEM    < MAJ DE L'OPDEM DE LA DEMANDE
                                     < ARGUMENT DU CLOSK.
         LAI         K
XKREG:   VAL         K               < INITIALISATION DU CUMUL DES REGISTRES...
       #@PSR         A               < #SISP CMS5 KREG#
                                     < LE MOT COURANT EST LE PREMIER MOT DU
                                     < DERNIER BUFFER (IL DONNERA UN CHAINAGE
                                     < 'INFINI'...).
         LR          K,A             < (A)=@MOT DU MOT DE CHAINAGE SGF.
         SLLS        NOCMO=K
         STA         ARGDEM+AMDEM    < @OCTET DU DERNIER SECTEUR
                                     < DE L'ENREGISTREMENT.
KEOF::   VAL         KEOT            < CARACTERE DOUBLE DE FIN D'ENREGISTREMENT.
         LAI         KEOF            < 4 OCTETS ET CODE DU 'EOF'.
         STA         ARGDEM+CODEM    < 4 OCTETS : 1 MOT DE CHAINAGE
                                     < DU SGF, PLUS LES 2 'EOT'.
         SWBR        A,A
         ORI         KEOF            < (A)='0404='EOF''EOF'.
       #@PSR         A               < #SISP CMS5 KREG#
                                     < LE MOT SUIVANT DE LA PILE CONTIENT
                                     < 2 CARACTERES 'EOF'.
XKREG:   VAL         -XKREG          < NOMBRE DE MOTS DU BUFFER DE FERMETURE
                                     < DE L'ENREGISTREMENT...
         IF          XKREG*NOCMO-KEOF,,XEIF%,
         IF          ATTENTION, LES OPTIMISATIONS SIOUX QUI
         IF          PRECEDENT SONT IDIOTES !!!
XEIF%:   VAL         ENDIF
         BSR         AELWS           < ECRITURE DU SECTEUR CONTENU
                                     < DANS LA PILE K.
         ADRI        -XKREG,K        < DESTRUCTION DU BUFFER
                                     < REENTRANT DU SECTEUR.
         JMP         E419            < GO BACK.
         PAGE
<
<
<        C L O S E - R E L E A S E   D ' U N
<        E N R E G I S T R E M E N T  :
<
<
<        ARGUMENTS :
<                    (Y)=NOM-DIRECT DU FICHIER,
<                    (L)=ADRESSE DCTF.
<
<
         USE         L,DCT0
         USE         W,DEM0
CLORK:   EQU         $
XWOR%1:  VAL         MXPL1=K
XWOR%2:  VAL         XXPL2>XWOR%1    < CADRAGE DE LA FONCTION DE DELETE.
XWOR%4:  VAL         MOCG=K
XWOR%4:  VAL         -XWOR%4         < POUR UN CADRAGE A DROITE...
         LXI         XWOR%2>XWOR%4
         SWBR        X,X             < (X)='6000=FONCTION DELETE-DELETE.
         ORR         X,Y             < (Y)='6000.OR.NOM-DIRECT.
         BSR         ACLO1           < DEMANDE DE FERMETURE.
<
< TEST DES CONDITIONS DE RETOUR :
<
         CPZR        Y
         JNE         E424XX          < Y CONTIENT LE CODE-ERREUR.
<
< CAS D'UN CLOSE ACCEPTE :
<
<
< RELEASE DE L'ENREGISTREMENT :
<
         LAD         VAR+BFILDE      < 'BFILDE' EST PRIS COMME BUFFER.
         SLLS        NOCMO=K         < CONVERSION EN UNE ADRESSE-OCTET.
         STA         VAR+AFILDK+AMDEM
         LAI         NOCMO           < DEMANDE LECTURE 2 OCTETS, JUSTE
                                     < SUFFISANT POUR OBTENIR L'EN-
                                     < TETE DE CHAINAGE SEQUENTIEL.
         STA         VAR+AFILDK+CODEM
         STZ         VAR+AFILDK+OPDEM  < DEMANDE DE LECTURE (K).
         LX          &VAR+AFILT      < INITIALISATION DE L'ADRESSE
                                     < DISQUE DANS X AVEC LA TETE
                                     < DE L'ENREGISTREMENT.
         BSR         ARDESC          < ON PEUT MAINTENANT RELEASER
                                     < LE DESCRIPTEUR D'ENREGISTREMENT.
         LB          VAR+NFILW       < (B)=ADRESSE DU PROCHAIN SECTEUR
                                     <     A ECRIRE POUR TEST DE FIN DU
                                     <     PARCOURS DE L'ENREGISTREMENT EN
                                     <     SEQUENTIEL.
<
< LIBERATION DES SECTEURS : POUR ACCELERER LE
< PROCESSUS DE LIBERATION DES SECTEURS,ILS
< SONT GROUPES PAR PAQUET DE 16 DANS L 'PILS'.
< LE NBRE DE SECTEURS CONTENUS DANS CETTE
< PILE EST MIS DANS 'AFILS+CODEM'.
<
         STZ         VAR+AFILS+CODEM
         PSR         W               < SAVE @DEMANDE DE CLOSE-RELEASE.
         LAD         VAR+DFILDK
         LR          A,W             < (W)=@DEMANDE DFILDK.
<
< BOUCLE DE RELEASE DES SECTEURS :
<
E421:    EQU         $
<
< TEST DE FIN D'ENREGISTREMENT :
<
         LY          INFINI
         CPR         Y,X
         LYI         XXGF2           < DEMANDE AVEC ATTENTE A PRIORI
         JE          E422            < SI (X)=Q8000, C'EST LA FIN
         CPR         X,B
         JE          E422            < (X)=PROCHAIN SECTEUR A ECRIRE,
                                     < C'EST LA FIN AUSSI.
         LA          VAR+AFILS+CODEM < INDEX SECTEUR DANS LA PILE.
XWOR%1:  VAL         LLPILS=K
         TBT         NBITMO-B-XWOR%1
         ADCR        Y               < SI LA PILE EST PLEINE (A)=LLPILS
                                     < ET ALORS (Y)=1, ET LA DEMANDE SERA
                                     < SANS ATTENTE.
         BSR         AELESS          < LECTURE DE L'EN-TETE DU SECTEUR
                                     < D'ADRESSE (X) AVEC ATTENTE
                                     < EN GENERAL. DANS LE CAS OU LA
                                     < PILE EST PLEINE ON PROFITE DE LA
                                     < LECTURE (QUI SERA PRIORITAIRE)
                                     < POUR RELEASER LA PILE DE SECTEURS.
<
< PENDANT LA LECTURE ON VA METTRE EN PILE LE SECTEUR (X),
< ET EVENTUELLEMENT RELEASER LA PILE.
<
         CPI         LLPILS          < PILS FAIT LLPILS MOTS MAX
         JL          E423            < LA PILE N'EST APS PLEINE.
<
< CAS OU LA PILE DE BLOCAGE DES BUFFERS EST PLEINE :
<
         LA          VAR+APILS
         RBT         XXGF1           < (A)=@DE LA PILE DES SECTEURS
                                     <     A RELEASER.
         BSR         AELARS          < DEMANDE RELESAE (BIT0(A)=K)
                                     < DE LLPILS SECTEURS.
                                     < ET ATTENTE DE FIN DE RELEASE,
                                     < AFIN DE LIBERER LA PILE DE BLOCAGE.
         STZ         VAR+AFILS+CODEM
         LAI         K               < INDEX DU 1ER SECTEUR DE LA PILE.
<
< MISE EN PILE DE BLOCAGE :
<
E423:    EQU         $
         IC          VAR+AFILS+CODEM < ET 1 SECTEUR DE PLUS DANS LA PILE.
         XR          A,X
<
<        ON A ICI :
<                    (X)=INDEX COURANT DE LA PILE,
<                    (A)=ADRESSE DU SECTEUR A RELAESER.
<
         STA         &VAR+APILS      < MISE EN PILE.
         CPZR        Y               < L'ATTENTE DE FIN DE LECTURE EST-ELLE
                                     < DEJA FAITE...
         JE          E462            < OUI...
         BSR         AWAITR          < ATTENTE DE FIN DE LECTURE.
E462:    EQU         $
<
< RECUPERATION DU CHAINAGE DES SECTEURS :
<
         LX          VAR+BFILDE      < LE BUFFER CONTIENT L'EN-TETE DU
                                     < SECTEUR QUE L'ON VIENT DE LIRE.
         JMP         E421
<
< RENCONTRE DE LA FIN D'ENREGISTREMENT :
<
E422:    EQU         $
         LA          VAR+AFILS+CODEM
         JAE         E424            < LA PILE EST VIDE.
<
< CAS OU LA PILE EST NON VIDE A LA FIN DE L'ENREGISTREMENT :
<
         LA          VAR+APILS
         RBT         XXGF1
         BSR         AELARS          < RELEASE DES SECTEURS PRESENTS
                                     < DANS LA PILE ET ATTENTE DE FIN DE RELEASE
                                     < DE RELEASE.
E424:    EQU         $
         PLR         W               < RESTAURE @DEMANDE DE CLOSE-RELEASE.
E424XX:  EQU         $               < SORTIE...
         RSR                         < (Y)=K, OK.
         PAGE
<
<
<        V A L I D A T I O N   D E S   L E C T U R E S  :
<
<
<        ARGUMENTS :
<                    (W)=ADRESSE DE DEMANDE DE LECTURE,
<                    (L)=ADRESSE DCTF.
<
<
<        RESULTAT :
<                    (X)=ADRESSE DU SECTEUR A LIRE.
<                    (Y)=K SI LECTURE POSSIBLE,
<                       =4 SI LECTURE IMPOSSIBLE, AUCUN OPEN N'AYANT
<                          EU LIEU,
<                       =6 SI LECTURE IMPOSSIBLE L'ENREGISTREMENT ETANT
<                          VIDE OU ENTIEREMENT LU.
<
<
<        A T T E N T I O N  :
<                      DETRUIT LE REGISTRE 'A' !!!
<
<
         USE         L,DCT0
         USE         W,DEM0
ELR1:    EQU         $
<
< TEST SUR UN OPEN-ENREGISTREMENT EN COURS :
<
         LY          ETAT1
         ADRI        -I,Y
         CPZR        Y
         JE          E425            < OK, ETAT1=1, IL Y A UN OPEN
                                     < ENREGISTREMENT EN COURS.
<
< CAS D'UNE DEMANDE DE LECTURE, ALORS QU'IL N'Y A PAS D'OPEN :
<
         LYI         ECRPO           < CODE-ERREUR.
         JMP         E426
<
< CAS D'UNE DEMANDE DE LECTURE AVEC OPEN PREALABLE :
<
E425:    EQU         $
         LX          VAR+NFILR       < RECUPERATION DU SECTEUR SUIVANT.
                                     < A LIRE.
         LY          INFINI
         CPR         X,Y             < CE SECTEUR EXISTE-T-IL?
         LYI         ECZERO
         JNE         E426            < OUI, IL EXISTE, ON PEUT DONC
                                     < LE LIRE...
<
< CAS D'UNE DEMANDE DE LECTURE ALORS QUE
< L'ENREGISTREMENT EST SOIT VIDE, SOIT
< DEJA ENTIEREMENT LU :
<
         LYI         ECLEV
E426:    EQU         $
         RSR                         < A NOTER QUE SI LA LECTURE
                                     < EST POSSIBLE, ON (Y)=K.
         PAGE
<
<
<        R E C U P E R A T I O N   D U   C H A I N A G E
<        S E Q U E N T I E L   D E S   S E C T E U R S
<                    L O R S   D ' U N E   L E C T U R E  :
<
<
<        ARGUMENT :
<                    (W)=ADRESSE DFILDK.
<                    (SLO,SLE)=DEFINISSENT L'ESPACE DE
<                              TRAVAIL QUI EST UTILISE
<                              TEL QUEL, CONTRAIREMENT A 'ELCH'...
<
<
<        RESULTAT :
<                    (X)=CHAINAGE VERS LE SECTEUR SUIVANT DE
<                        L'ENREGISTREMENT,
<                    NFILR=ADRESSE DU SECTEUR SUIVANT (CF. X).
<
<
<        A T T E N T I O N  :
<                      DETRUIT LE REGISTRE 'A' !!!
<
<
         USE         L,DCT0
         USE         W,DEM0
ELR2:    EQU         $
         PSR         Y
         LA          ARGDEM+AMDEM    < RECUPERATION DE L'ADRESSE
                                     < OCTET DU BUFFER DE LECTURE.
         SLRS        NOCMO=K         < CONVERSION EN UNE ADRESSE-MOT.
                                     < RAPPEL : LES BUFFERS DISQUE
                                     < SONT TOUJOURS A DES FRONTIERES
                                     < DE MOTS (CF. ADM).
         LR          A,Y             < (Y)=ADRESSE ABSOLUE DU PREMIER MOT DU
                                     <     BUFFER DANS LA PAGE DONNEE PAR 'SLO'.
         IF          XCHSGF-O,,XEIF%,
         ADRI        XCHSGF,Y        < POUR ATTEINDRE LE CHAINAGE...
XEIF%:   VAL         ENDIF
<
<
<        A T T E N T I O N  :
<                      CETTE ROUTINE NE PEUT ETRE APPELEE QU'APRES
<                    QUE LA LECTURE SE SOIT ACHVEE, PUISQU'ELLE
<                    RECUPERE DE L'INFORMATION DE CHAINAGE DANS
<                    LE SECTEUR LU...
<
<
         LAR                         < RECUPERATION DANS 'A' DU CHAINAGE VERS
                                     < LE SECTEUR SUIVANT DE L'ENREGISTREMENT.
<
< TRUANDAGE PARESSEUX
<
         LR          A,X             < (X)=ADRESSE DU SECTEUR SUIVANT OU
                                     <     L'INFINI SI LE SECTEUR COURANT
                                     <     EST LE DERNIER...
         CP          INFINI
         JE          E460X           < FIN D'ENREGISTREMENT...
         IF          NLSTS-K,,XEIF%,
         IF          ATTENTION : DE NOMBREUX PROGRAMMES UTILISATEURS
         IF          VONT MERDER (TEL 'EDITS'...) !!!
XEIF%:   VAL         ENDIF
         LAI         NLSTS
         STAR                        < AINSI, LE PREMIER MOT DU BUFFER
                                     < EST TOUJOURS NUL, SAUF DANS LE
                                     < CAS DE LA FIN D'ENREGISTREMENT...
E460X:   EQU         $
<
<
<        A T T E N T I O N  :
<                      LE PROCHAIN SECTEUR (X) EST PEUT-ETRE
<                    EN FAIT LE PROCHAIN SECTEUR A ECRIRE QUI N'EXISSTE PAS
<                    ENCORE :
<
<
         LA          VAR+NFILW       < ACCES PROCHAIN SECTEUR A ECRIRE.
         CPR         A,X             < COMPARAISON DU SECTEUR SUIVANT
                                     < (X) ET DU PROCHAIN SECTEUR A
                                     < ECRIRE (A).
         JNE         E460            < ILS DIFFERENT, OK.
<
< CAS OU L'ON EST CHAINE SUR LE PROCHAIN SECTEUR A ECRIRE :
<
         LX          INFINI          < LE PROCHAIN SECTEUR A LIRE
                                     < N'EXISTE PAS JUSQU'A CE QUE
                                     < LE PROCHAIN SECTEUR A ECRIRE
                                     < SOIT ECRIT.
E460:    EQU         $
         STX         VAR+NFILR       < (X) EST LE PROCHAIN SECTEUR
                                     < A LIRE.
         PLR         Y
         RSR
         PAGE
<
<
<        L E C T U R E   D ' U N   S E C T E U R
<        D ' U N   E N R E G I S T R E M E N T  :
<
<
<        ARGUMENTS :
<                    (W)=ADRESSE DE LA DEMANDE DE LECTURE,
<                    (L)=ADRESSE DCTF.
<
<
         USE         L,DCT0
         USE         W,DEM0
ELRS:    EQU         $
         BSR         AELR1           < PREPARATION DE LA LECTURE.
<
< LA LECTURE EST-ELLE POSSIBLE :
<
         CPZR        Y
         JNE         E427XX          < Y EST CORRECT.
<
< CAS OU LA LECTURE EST POSSIBLE :
<
<
<        ON A ICI :
<                    (Y)=K,
<                    (X)=ADRESSE DU SECTEUR A LIRE.
<
         BSR         ADADF           < PREPARATION DE L'EXECUTION
                                     < LA DEMANDE DE LECTURE,
                                     < TRES IMPORTANT : SAVE W...
         LA          BITSEM          < ATTENTION : POUR 'ELESS' QUI VA SUIVRE,
         RBT         BISOSE          < ON AUTORISE LA TRANSMISSION DE (SLO,SLE)
         STA         BITSEM          < AFIN D'ACCEDER A L'ESPACE UTILISATEUR...
         BSR         AELESS          < DEMANDE LECTURE AVEC ATTENTE
                                     < (CF. (Y)=K, PUISQUE OK) DU SECTEUR
                                     < D'ADRESSE (X) ; A LA FIN DE LA LECTURE
                                     < ON INHIBE LA TRANSMISSION DE (SLO,SLE).
         BSR         AELR2           < RECUPERATION DU PROCHAIN
                                     < SECTEUR A LIRE DANS CET
                                     < ENREGISTREMENT.
         PLR         W               < RESTAURE @DEMZNDE DE LECTURE SGF,
                                     < RAPPELONS QUE LE PSR AVAIT ETE
                                     < FAIT PAR AADF.
E427XX:  EQU         $               < SORTIE...
         RSR                         < RETOUR OK, AVEC (Y)=K.
         PAGE
<
<
<        L E C T U R E   E T   D E L E T E
<                    D ' U N   S E C T E U R
<        D ' U N   E N R E G I S T R E M E N T  :
<
<
<        ARGUMENTS :
<                    (W)=ADRESSE DE LA DEMANDE DE LECTURE-DELETE,
<                    (L)=ADRESSE DCTF.
<
<
         USE         L,DCT0
         USE         W,DEM0
ELRDS:   EQU         $
         BSR         AELR1           < VALIDATION DE LA DEMANDE DE
                                     < LECTURE.
<
< LA LECTURE EST-ELLE POSSIBLE :
<
         CPZR        Y
         JNE         E428XX          < Y EST CORRECT.
<
< CAS OU LA LECTURE EST POSSIBLE :
<
<
<        ON A CI :
<                    (X)=ADRESSE DU SECTEUR A LIRE,
<                    (Y)=0.
<
         BSR         ADADF           < PREPARATION DE LA DEMANDE
                                     < LECTURE.
         LYI         XXGF2           < DEMANDE DE LECTURE AVEC ATTENTE.
         LA          BITSEM          < ATTENTION : POUR 'ELESS' QUI VA SUIVRE
         RBT         BISOSE          < ON AUTORISE LA TRANSMISSION DE (SLO,SLE)
         STA         BITSEM          < AFIN D'ACCEDER A L'ESPACE UTILISATEUR...
         BSR         AELESS          < LECTURE DU SECTEUR (X) AVEC ATTENTE ;
                                     < EN FIN DE LECTURE, ON INHIBE LA TRANS-
                                     < MISSION DE (SLO,SLE).
<
< RELEASE DU SECTEUR LU (X) :
<
         LAD         ARGDEM+ASDEM    < ADRESSE DE L'ADRESSE
                                     < SECTEUR A RELEASER.
         STY         VAR+AFILS+CODEM < DEMANDE DE RELEASE 1 SECTEUR.
         BSR         AELARS          < DEMANDE DE RELEASE (BIT0(A)=K),
                                     < AVEC ATTENTE DE FIN DE RELEASE.
<
< MISE A JOUR DE LA CHAINE DE L'ENREGISTREMENT :
<
         BSR         AELR2           < RECUPERATION DU PROCHAIN SECTEUR
                                     < A LIRE.
<
<        ON A ICI :
<                    (X)=ADRESSE DU PROCHAIN SECTEUR A LIRE.
<
         STX         &VAR+AFILT      < MISE A JOUR DE LA TETE DE
                                     < L'ENREGISTREMENT.
         LY          INFINI
         CPR         X,Y
         JNE         E428            < OK, L'ENREGISTREMENT N'EST PAS
                                     < VIDE
<
< CAS OU ON A RENCONTRE LA FIN DE L'ENREGISTREMENT :
<
         STX         &VAR+AFILQ      < ON MET AUSSI A JOUR LA QUEUE DE
                                     < CHAINE QUI EST VIDE MAINTENANT.
E428:    EQU         $
         PLR         W               < RESTAURE @DEMANDE LECTURE-DELETE.
                                     < LE PSR CORRESPONDANT AYANT ETE
                                     < FAIT PAR ADADF.
         LYI         ECZERO          < RETOUR OK.
E428XX:  EQU         $
         RSR
         PAGE
<
<
<        C H A I N A G E   D E S   S E C T E U R S
<        L O R S   D ' U N E   E C R I T U R E  :
<
<
<        ARGUMENTS :
<                    (W)=ADRESSE DE LA DEMANDE 'DFILDK',
<                    (L)=ADRESSE DCTF,
<                    (B)=ADRESSE DU SECTEUR SUIVANT (A METTRE EN TETE DU
<                        SECTEUR COURANT AVANT SON ENVOI SUR DISQUE).
<                    BISOSE(BITSEM)=1 : ON UTILISE (SLO,SLE)=(SO,SE), CE
<                                       QUI SIGNIFIE QUE L'ON TRAVAILLE
<                                       DANS LA PAGE 0 (CAS DE "EOF" PAR
<                                       EXEMPLE...),
<                                  =0 : ON UTILISE (SLO,SLE) TELS QUELS
<                                       AFIN DE TRAVAILLER DANS L'ESPACE
<                                       ARGUMENT (C'EST LE CAS COURANT, OU
<                                       EN COURS D'ENREGISTREMENT, ON CHAINE
<                                       LES SECTEURS ENTRE EUX...).
<
<
<        A T T E N T I O N  :
<                      DETRUIT LE REGISTRE 'A' !!!
<
<
         USE         L,DCT0
         USE         W,DEM0
ELCH:    EQU         $
         PSR         B,Y
         LR          B,Y             < (Y)=ADRESSE DU SECTEUR SUIVANT...
         CALL        #SISP CMS5 PSRSLO#
                                     < SAUVEGARDE DE (SLO,SLE) A PRIORI...
         LA          BITSEM
         TBT         BISOSE          < DANS QUELLE PAGE DE 32K FAUT-IL ALLER ???
         JNC         ELCH1           < DANS CELLE QUI EST DEFINIE PAR (SLO,SLE)
                                     < ARGUMENT (MODE NORMAL "UTILISATEUR"...).
         CALL        #SISP CMS5 PAGE0#
ELCH1:   EQU         $
         LR          Y,B             < (B)=ADRESSE DU SECTEUR SUIVANT...
         LA          ARGDEM+AMDEM    < RECUPERATION DE L'ADRESSE OCTET
                                     < DU BUFFER.
         SLRS        NOCMO=K         < CONVERSION EN UNE ADRESSE-MOT.
         LR          A,Y             < (Y)=ADRESSE ABSOLUE DU PREMIER MOT DU
                                     <     BUFFER DANS LA PAGE DEFINE PAR 'SLO'.
         IF          XCHSGF-O,,XEIF%,
         ADRI        XCHSGF,Y        < POUR ATTEINDRE LE CHAINAGE...
XEIF%:   VAL         ENDIF
         LR          B,A             < (A)=CHAINAGE VERS LE SECTEUR SUIVANT,
         STAR                        < CHAINAGE DU SECTEUR COURANT VERS LE
                                     < SECTEUR SUIVANT...
                                     < RESTAURATION DE (SLO,SLE) A PRIORI :
         CALL        #SISP CMS5 PLRSLO#
         LR          Y,A             < ON REMET L'ADRESSE ABSOLUE DANS 'A' POUR
                                     < RESTER COMPATIBLE AVEC L'ANCIENNE VER-
                                     < SION DU SYSTEME ?!???!
         PLR         B,Y
         RSR
         PAGE
<
<
<        E C R I T U R E   D ' U N   S E C T E U R  :
<
<
<        ARGUMENTS :
<                    (W)=ADRESSE DE LA DEMANDE DE LECTURE,
<                    (L)=ADRESSE DCTF.
<
<
         USE         L,DCT0
         USE         W,DEM0
ELWS:    EQU         $
         LA          ARGDEM+OPDEM
         TBT         EOF             < EST-CE LA FERMETURE DU FICHIER ???
         JC          E430X           < OUI, PAS DE TEST SUR 'NSL' ALORS ;
                                     < EN EFFET, CE RETOUR EN ERREUR, PROVO-
                                     < QUERAIT UN REFUS DE FERMETURE DU FICHIER,
                                     < D'OU UNE 'SYSER' DANS LE 'CCI'...
         LA          NSL             < (A)=NOMBRE DE Q-SECTEURS LIBRES,
         SLRS        S               < ON DECALE, CAR EN GENERAL 'NSL' EST
                                     < UN NOMBRE SUR 16 BITS...
XWOR%9:  VAL         -S
         IF          XXSGNT>XWOR%9-NDCTF,,,XEIF%
         IF          ATTENTION, POUR NE PAS AVOIR D'ENNUIS, IL
         IF          FAUT QUE LE SEUIL UTILISE POUR 'NSL'
         IF          SOIT STRICTEMENT SUPERIEUR AU NOMBRE
         IF          DE FICHIERS OUVRABLES A UN INSTANT
         IF          DONNE !!!
XEIF%:   VAL         ENDIF
         CPI         XXSGNT>XWOR%9   < ON UTILISE LE SEUIL ARBITRAIRE
                                     < DE 'HDLSTN'...
         JGE         E430X           < OK, ON PEUT ECRIRE...
         LYI         ECEPOV          < ET NON, ON NE DEMANDE PAS DE Q-SECTEUR,
                                     < ET ON N'ECRIT DONC PAS...
         JMP         E436XX          < ET ON SORT EN ERREUR...
E430X:   EQU         $
<
< VALIDATION DE L'ECRITURE :
<
         LA          ETAT1
         CPI         W
         JE          E430            < OK, IL Y A EU UN OPEN.
<
< CAS OU IL N'Y A PAS EU D'OPEN, LA LECTURE EST IMPOSSIBLE :
<
         LYI         ECEPO           < CODE LECTURE DEMANDEE, ET
                                     < OPEN NON EN COURS.
         JMP         E436XX
<
< CAS OU L'ECRITURE PEUT AVOIR LIEU,  UN OPEN AYANT EU LIEU :
<
E430:    EQU         $
         STA         VAR+AFILS+CODEM < POUR DEMANDE D'ALLOCATION
                                     < D'UN SECTEUR.
         LX          VAR+NFILW       < ACCES A L'ADRESSE DU PROCHAIN
                                     < SECTEUR A ECRIRE.
         LR          X,A
         CP          INFINI          < EXISTE-T-IL SEULEMENT?
         JNE         E434            < OUI, C'EST BON...
<
< CAS OU LE PROCHAIN SECTEUR A ECRIRE N'EXISTE PAS :
<
         LAD         VAR+NFILW       < ADRESSE MEMOIRE OU METTRE
                                     < L'ADRESSE DU SECTEUR ALLOUE.
         SBT         XXGF1           < BIT0 DE DEMANDE D'ALLOCATION.
         BSR         AELARS          < DEMANDE D'ALLOCATION D'1SECTEUR
                                     < AVEC ATTENTE.
         LX          &VAR+AFILQ      < TEST DE LA QUEUE DE L'ENREGISTRE-
                                     < MENT.
         LR          X,A
         CP          INFINI
         JE          E431            < L'ENREGISTREMENT EST VIDE...
<
< CAS D'UNE MISE A JOUR D'UN ENREGISTREMENT DEJA EXISTANT
< EN EFFET, LE NFILW N'EXISTE PAS CELA SIGNIFIE
< QUE L'ON A FAIT UN OPEN-OLD SUR L'ENREGISTREMENT,
< CE QUI EST VERIFIE PAR LE FAIT QUE L'ENREGISTREMENT
< N'EST PAS VIDE.
<  ON EST DONC OBLIGER DE RECCHAINER LE DERNIER SECTEUR
< DE L'ENREGISTREMENT (QUEUE) SUR LE SECTEUR QUE
< L'ON VA ECRIRE ; IL FAUT DONC RELIRE LA QUEUE ET POUR
< CELA, IL FAUT DEMANDER UN BUFFER ; A NOTER QUE
< CELA EST POSSIBLE, CAR EN EFFET LE SECTEUR QUE
< L'ON RELIT NE CONTIENT QUE LE CHAINAGE 'INFINI'
< ET LE CODE "EOF""EOF"...
<
         PSR         W
         LAD         VAR+DFILS       < ON VA UTILISER LA DEMANDE
                                     < D'ALLOCATION SECTEUR POUR
                                     < L'ALLOCATION BUFFER.
         LR          A,W             < (W)=@DFILS.
         LAI         NSPALB
XWOR%1:  VAL         MSPTYP=K
XWOR%1:  VAL         NBITMO-XWOR%1
         SBT         PRIO-XWOR%1     < FUTUR BIT DE MODE PRIORITAIRE.
         SWBR        A,A             < GENERATION DU NSP D'ALLOCATIO
                                     < BUFFER.
         STA         NSPTYP
         LAD         VAR+AFILDK+AMDEM
                                     < ON VA METTRE L'ADRESSE DU BUFFER
                                     < ALLOUE DIRECTEMENT DANS DFILDK.
         STA         ARGDEM+AMDEM    < (W)=@DFILS.
         BSR         ACHAND          < ENVOI DE LA DEMANDE.
         LAI         YY7
         SLLS        NOCMO=K         < (A)=YY8 OCTETS A LIRE.
         STA         VAR+AFILDK+CODEM
         STZ         VAR+AFILDK+OPDEM  < DEMANDE DE LECTURE (K).
         LAD         VAR+DFILDK
         LYI         XXGF2           < DEMANDE DE LECTURE AVEC ATTENTE.
         BSR         AWAITR          < ARRIVE ICI, ON EST OBLIGE
                                     < LA FIN D'ALLOCATION BUFFER.
<
< ARRIVE ICI, ON UN BUFFER ALLOUE :
<
         LR          A,W             < (W)=@DEMANDE DFILDK.
         BSR         AELESS          < LECTURE AVEC ATTENTE DU SECTEUR
                                     < D'ADRESSE (X).
<
< ARRIVE ICI, ON A DANS LE BUFFER ALLOUE, LE SECTEUR
< DE QUEUE D'ENREGISTREMENT.
<
         LB          VAR+NFILW       < RECUPERATION DU PROCHAIN SECTEUR
                                     < AECRIRE DANS B.
         BSR         AELCH           < CHAINAGE DE LA QUEUE VERS NFILW.
         LAI         FGW
         STA         ARGDEM+OPDEM    < DEMANDE D'ECRITURE.
         BSR         AELESS          < REECRITURE DU SECTEUR DE
                                     < QUEUE D'ENREGISTREMENT (X)
                                     < AVEC ATTENTE (Y VAUT ENCORE 0).
<
< RELEASE DU BUFFER DE TRAVAIL : EN EFFET LORSQU'ON
< ARRIVE ICI, C'EST QUE LE SECTEUR DE QUEUE A ETE REECRIT :
<
         LAD         VAR+DFILS
         LR          A,W             < (W)=@DFILS.
         LAI         NSPRLB
         SWBR        A,A
         STA         NSPTYP          < GENERATION DU NSPTYP DE
                                     < RELEASE BUFFER.
         BSR         ACHAND          < ENVOI DE LA DEMANDE.
         BSR         AWAITR          < ATTENTE DE FIN DE RELEASE.
         PLR         W               < RESTAURE @DEMANDE D'ECRITURE.
<
< ECRITURE DU SECTEUR COURANT (X) :
<
E431:    EQU         $
         LX          VAR+NFILW       < LE PROCHAIN SECTEUR A ECRIRE
                                     < DEVIENT LE SECTEUR COURANT (CELUI
                                     < QUE L'ON VA ECRIRE.
E434:    EQU         $
         LA          ARGDEM+OPDEM
         TBT         EOF             < TEST DU BIT EOF DANS LA DEMANDE
                                     < D'ECRITURE SGF.
         JC          E432            < OUI, C'EST DONC LE DERNIER
                                     < SECTEUR DE L'ENREGISTREMENT.
<
< CAS OU CE N'EST PAS LE DERNIER SECTEUR DE L'ENREGISTREMENT
< QUE L'ON ECRIT :
<
         LAD         VAR+NFILW       < ADRESSE OU METTRE L'ADRESSE DU
                                     < SECTEUR ALLOUE.
         SBT         XXGF1           < POSITIONNEMENT DU BIT
                                     < DEMANDE D'ALLOCATION.
         BSR         AELARS          < ALLOCATION D'1 SECTEUR ET
                                     < ATTENTE.
         LB          VAR+NFILW       < RECUPERATION DANS B DU SECTEUR
                                     < ALLOUE.
         LYI         XXGF2           < SI CE N'EST PAS LE DERNIER SECTEUR
                                     < DEMANDE AVEC ATTENTE.
         JMP         E433
<
< CAS DE L'ECRITURE DU DERNIER SECTEUR DE L'ENREGISTREMENT :
<
E432:    EQU         $
         LB          INFINI          < IL N'Y A PAS A ALLOER DE DERNIER
                                     < SECTEUR.
         STB         VAR+NFILW       < MAJ DE NFILW.
         LYI         XXGF3           < DANS LE CAS DU DERNIER SECTEUR
                                     < LA DEMANDE EST SANS ATTENTE,
                                     < ET DONC PRIORITAIRE ; LE TEMPS
                                     < D'ECRITURE SERA UTILISE POUR
                                     < FERMER (CLOSK) L'ENREGISTREMENT.
E433:    EQU         $
         CPZR        Y               < EST-CE LE DERNIER SECTEUR ???
         IF          XXGF3-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST SUIVANT EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
         JNE         E461X1          < OUI, IL EST ECRIT A PARTIR DE LA PILE
                                     < DU 'HDLSGF', EN CONSEQUENCES, IL FAUT
                                     < RESTER DANS LA PAGE 0 !!!
         LA          BITSEM          < ATTENTION : POUR 'ELESS' QUI VA SUIVRE,
         RBT         BISOSE          < ON AUTORISE LA TRANSMISSION DE (SLO,SLE),
         STA         BITSEM          < AFIN D'ATTEINDRE L'ESPACE RELATIF...
E461X1:  EQU         $
         BSR         AELCH           < CHAINAGE DU SECTEUR COURANT
                                     < VERS NFILW.
<
<        ON A ICI :
<                    (X)=ADRESSE DU SECTEUR A ECRIRE,
<                    (Y)=K SI CE N'EST PAS LE DERNIER SECTEUR,
<                       =1 SI C'EST LE DERNIER SECTEUR (EOF).
<
         BSR         ADADF           < MAJ DE LA DEMANDE D'ECRITURE DISQUE
                                     < DFILDK.
<
<
<        A T T E N T I O N  :
<                      'ADADF' A FAIT UN 'PSR''W' !!!
<
<
         BSR         AELESS          < ECRITURE DU SECTEUR (X) ; EN FIN D'ECRI-
                                     < TURE, LA TRANSMISSION DE (SLO,SLE) EST
                                     < INHIBEE...
         LA          VAR+NFILR       < TEST DE L'ADRESSE DU PROCHAIN
                                     < SECTEUR A LIRE.
         CP          INFINI
         JNE         E461            < C'EST BON, IL EXISTE DEJA
<
< (RE-)INITIALISATION DU PROCHAIN SECTEUR A LIRE AVEC LE SECTEUR QUE
< L'ON VIENT D'ECRIRE :
<
         STX         VAR+NFILR
E461:    EQU         $
         STX         &VAR+AFILQ      < MAJ DE LA QUEUE DE L'ENREGISTREMENT.
         LA          &VAR+AFILT      < ACCES A LA TETE DE L'ENREGISTREMENT.
         CP          INFINI
         JNE         E435            < C'EST BON, IL N'ETAIT PAS VIDE
<
< CAS OU L'ENREGISTREMENT ETAIT VIDE AVANT CETTE ECRITURE :
<
         STX         &VAR+AFILT      < MAJ DE LA TETE DE L'ENREGISTREMENT.
E435:    EQU         $
<
<        RAPPEL :
<                      DANS LE CAS OU CE N'EST
<                    PAS L', ON A :
<                                    (Y)=0 (RETOUR OK...).
<
         CPZR        Y               < TEST EOF OU PAS EOF...
         JE          E436            < CE N'EST PAS EOF, A NOTER
                                     < AU PASSAGE QUE L'ATTENTE DE FIN
                                     < D'ECRITURE EST DEJA FAITE.
<
< CAS OU L'EOF EST DEMANDE :
<
         LY          VAR+FILNOM      < RECUPERATION DU NOM-DIRECT DU
                                     < FICHIER.
         BSR         ACLOSK          < DEMANDE DE CLOSE-SAVE DE
                                     < L'ENREGISTREMENT.
         CPZR        Y               < TEST DES CONDITIONS DE RETOUR.
         JE          SYSRD8          < OK.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
SYSRD8:  EQU         $
         BSR         AWAITR          < ATTENTE DE FIN D'ECRITURE.
E436:    EQU         $
         PLR         W               < RESTORE (W)=@DEMANDE ECRITURE SGF.
E436XX:  EQU         $
         RSR
         PAGE
<
<
<        A L L O C A T I O N   D ' U N   S E C T E U R
<        P O U R   E X T E N S I O N   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  :
<
<
<        ARGUMENT :
<                    (A)=ADRESSE DU MOT OU METTRE L'ADRESSE SECTEUR ALLOUE
<
<
<        A T T E N T I O N  :
<                      DETRUIT LE REGISTRE 'A' !!!
<
<
         USE         W,DEM0
ALSC:    EQU         $
         PSR         X,W
<
< TEST SUR L'ETAT DU STOCK DE SECTEURS DE PLSC :
<
         LX          NSTOCS
         CPZR        X
         JE          E320            < PAS DE SECTEURS EN STOCK, IL VA
                                     < DONC FALLOIR PASSER PAR
                                     < L'ALLOCATEUR DISQUE.
<
< CAS OU IL Y A AU MOINS UN SECTEUR EN STOCK :
<
         DC          NSTOCS          < ET UN SECTEUR DE MOINS...
         LR          A,W             < (W)=@ DU MOT OU METTRE L'@ SECTEUR
                                     <     ALLOUE.
         LA          &ASTOCS         < (A)=1ER SECTEUR DE LA PILE.
         STA         O,W             < RENVOI AU DEMANDEUR.
<
< RETOUR :
<
E321:    EQU         $
         PLR         X,W
         RSR
<
< CAS OU LE STOCK DE SECTEURS EST VIDE,
< PASSONS PAR L'ALLOCATEUR DISQUE :
<
E320:    EQU         $
         STA         RASCAM          < MAJ DE LA DEMANDE.
         LAI         NSPGET
XWOR%1:  VAL         MSPTYP=K
XWOR%1:  VAL         NBITMO-XWOR%1
         SBT         PRIO-XWOR%1     < BIT PRIORITAIRE (FUTUR BIT8(A).
         SWBR        A,A             < GENERATION DE L'EN-TETE DE LA
                                     < DEMANDE A CHAND.
         STA         RALSC
         LAD         RALSC
         LR          A,W             < (W)=ARG DE CHAND.
         BSR         ACHAND
         BSR         ACHANW          < ATTENTE DE FIN D'ALLOCATIOPN.
         JMP         E321            < LE SECTEUR EST ALLOUE, ON S'EN VA.
         PAGE
<
<
<        I N I T I A L I S A T I O N   D ' U N   S E C T E U R
<        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  :
<
<
<        EN-TETE D'UN SECTEUR :
<                    MOT0=CHAINAGE VERS LE SECTEUR SUIVANT,
<                    MOT1=CHAINAGE VERS LE SECTEUR PRECEDENT,
<                    MOT2=K SI CE N'EST PAS UN SECTEUR DE DEBORDEMENT,
<                         DEPLACEMENT DU DESCRIPTEUR DE DEBORDEMENT CHAI-
<                         NANT CE SECTEUR DANS L'AUTRE CAS.
<                    MOT3=NBRE DE DESCRIPTEURS UTILISES DANS LE SECTEUR.
<
<
<        ARGUMENT :
<                    BIT0-7(A)=NBRE DE DESCRIPTEURS UTILISES INITIALIEMENT,
<                    BIT8-15(A)=DANS LE CAS OU CE SECTEU EST UN SECTEUR
<                               DE DEBORDEMENT, ON A ICI, LE DEPLACEMENT
<                               DU DESCRIPTEUR QUI A DEBORDE DANS SON
<                               SECTEUR,
<                    (L)=ADRESSE DU BUFFER CONTENANT LE SECTEUR
<                        A INITIALISER.
<                    (X)=ADRESSE SECTEUR PRECEDENT (POUR CHAINAGE ARRIERE).
<                    MOT D'ADRESSE (L)=ADRESSE DU SECTEUR A INITIALISER.
<
<
<        RESULTAT :
<                    (X)=ADRESSE SECTEUR INITIALISE,
<                    (W)=ADRESSE DU PREMIER DESCRIPTEUR DU SECTEUR=(L)+XSFL.
<
<
<        A T T E N T I O N  :
<                      DETRUIT LE REGISTRE 'A' !!!
<
<
INITS:   EQU         $
         PSR         B
         STX         XXSFB,L         < CONSTITUTION DU CHAINAGE ARRIERE
                                     < DU SECTEUR A INITIALISER VERS LE
                                     < SECTEUR PRECEDENT.
         LX          XXSFS,L         < (X)=@SECTEUR A INITIALISER.
         LBI         K
         SCLD        NBITOC          < DECONCATENATION DES 2 OCTETS DE A.
         SWBR        A,A             < CADRAGE DE A ET B A DROITE.
         STA         XXSFD,L         < DEPLACEMENT DANS LE CAS D'UN
                                     < SECTEUR DE DEBORDEMENT.
         STB         XXSFK,L         < NBRE DE DESCRIPTEURS UTILISES.
         LA          INFINI          < IL N'Y A PAS ENCORE DE SECTEUR SUI
                                     < SUIVANT.
         STA         XXSFS,L         < CONSTITUTION DU CHAINAGE AVANT
                                     < DU SECTEUR A INITIALISER VERS
                                     < LE SECTEUR SUIVANT (INFINI).
         LR          L,W             < (W)=@BUFFER.
         ADRI        XXSFL,W         < (W)=@1ER DESCRIPTEUR.
         PSR         X,W
         LXI         YY7-XXSFL       < (X)=NOMBRE DE MOTS A REMETTRE A '0000,
INITS1:  EQU         $
         STZ         O,W             < ET ON REMET LE RESTE DU SECTEUR A '0000.
         ADRI        P,W             < AU MOT SUIVANT,
         JDX         INITS1          < S'IL EXISTE...
         PLR         X,W
         PLR         B
         RSR
         PAGE
<
<
<        I N I T I A L I S A T I O N   D ' U N
<        D E S C R I P T E U R   D E   C L E F  :
<
<
<        FORMAT D'UN DESCRIPTEUR DE CLEF :
<                    MOT0 :
<                          BIT0=INDICATEUR LIBRE (1) / OCCUPE (K),
<                          BIT1=INDICATEUR DE DEBORDEMENT (1),
<                          BIT2=INDICATEUR DE DERNIER DESCRIPTEUR DE
<                               LA SEQUENCE (1),
<                          BIT3-15=PEK,
<                    MOT1 :
<                          BIT0 : BIT IN USE (1) / IDLE (K) ; CE
<                          BIT N'A DE SENS QUE SI :
<                                    BIT0(MOT0)=BIT1(MOT0)=K,
<                          C'EST-A-DIRE SI ON EST DANS UN DESCRIPTEUR
<                          DE CLEF (OCCUPE & NON EN DEBORDEMENT).
<                          BIT1-15=PDK.
<
<                    ET, LORSQUE LA CLEF EST A L'ETAT 'IDLE' :
<
<                    MOT2=ADRESSE SECTEUR DE DEBORDEMENT, OU ADRESSE 1ER SECTEUR
<                         DE L'ENREGISTREMENT,
<                    MOT3=ADRESSE DERNIER SECTEUR DE L'ENTREGISTREMENT.
<                         (EVENTUEL)
<
<
<        ARGUMENTS :
<                    BIT8-15(A)=ETAT DU DESCRIPTEUR (DERNIER, LIBRE...)
<                    (W)=ADRESSE DESCRIPTEUR.
<
<
<        A T T E N T I O N  :
<                      DETRUIT LE REGISTRE 'A' !!!
<
<
<        NOTA :
<                      LORS DE SA CREATION, UNE CLEF EST AUTOMATIQUEMENT
<                    MISE A L'ETAT 'IN USE', C'EST DONC DE PLUS UN OPEN.
<                      DE PLUS ON FAIT :
<                                    (MOT2,MOT3)<--(TEST1,TEST2),
<                                    (TEST1,TEST2)<--(Q8000,Q8000).
<
<
<        IMPORTANT :
<                      LORS D'UNE DUPLICATION DE DESCRIPTEUR POUR
<                    DEBORDEMENT, LA VERSION DUPLIQUEE POSSEDE LA
<                    PROPRIETE 'IN USE/IDLE' DE LA VERSION EN DEBORDEMENT.
<
<
INITK:   EQU         $
         SWBR        A,A             < L'ETAT EST MIS DANS L'OCTET
                                     < GAUCHE DE A.
         OR          PEK             < GENERATION DU 1ER MOT DU DESCRIPTEUR
                                     < BIT0-2=ETAT,
                                     < BIT3-15=PEK.
         STA         XXKE1,W         < MOT0.
         LA          PDK
         TBT         BXKE5           < EST-CE UNE CLEF MODE NEXT...
         JNC         SYSRD9          < NON, OK
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      PEUT-ETRE NE PAS FAIRE L'INITIALISATION,
<                    OU MIEUX, VOIR POURQUOI ON A LE
<                    BIT BXKE5'...
<
SYSRD9:  EQU         $
         SBT         BXKE4           < PASSAGE AUTOMATIQUE A L'ETAT
                                     < 'IN USE'.
         STA         XXKE2,W         < MOT1.
<
< OPEN DU DESCRIPTEUR :
<
         LA          TEST1
         STA         XXKE3,W         < INITIALISATION DU MOT2.
         LA          TEST2
         STA         XXKE4,W         < INITIALISATION DU MOT3.
<
< INITIALISATION DE LA CHAINE DES
< ENREGISTREMENTS DANS 'TEST1' ET 'TEST2' :
<
         LA          INFINI
         STA         TEST1           < CHAINE VIDE.
         STA         TEST2           < CHAINE VIDE.
         RSR
         PAGE
<
<
<        I N S E R T I O N   D ' U N E   C L E F
<        D A N S   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 :
<                    (L)=ADRESSE DU BUFFER DU SECTEUR COURANT,
<                    (A)=RESULTAT DU PARCOURS DE LA LISTE SEQUENTIELLE
<                        A LA QUELLE APPARTIENT LA CLEF QUE L'ON VA
<                        INSERER.
<                    (X)=ADRESSE DU SECTEUR COURANT DE LA LISTE.
<
<
         USE         W,DEM0
INSERT:  EQU         $               < ARRIVE ICI, ON SAIT QUE L'INSERTION ES
                                     < EST POSSIBLE.
         XR          A,X
         CP          INFINI          < TEST DE LISTE VIDE
         XR          A,X
         JE          E330            < LA LISTE EST VIDE
<
< CAS OU LA LISTE DE LA CLEF N'EST PAS VIDE :
<
         SLLS        LXKE=K          < CONVERSION EN UNE ADRESSE DE MOT
                                     < DU DESCRIPTEUR PRECEDENT.
XWOR%1:  VAL         XXPL8(XXPL10    < ON RECHERCHE LE BIT COMMUN ENTRE
                                     < LES CODES DE RETOUR 'CLEF NON CERNEE'.
         IF          XXPL9(XWOR%1,,XEIF%,
         IF          ATTENTION : ANOMALIE DANS LES CODES !!!
XEIF%:   VAL         ENDIF
XWOR%2:  VAL         XWOR%1=K
XWOR%3:  VAL         NBITMO-B-XWOR%2 < NUMERO DU BIT COMMUN DES FONCTIONS
                                     < 'CLEF NON CERNEE'.
XWOR%4:  VAL         LXKE=K
         TBT         XWOR%3-XWOR%4   < DISCRIMINATION CLEF NON CERNEE (1)
                                     < - CLEF CERNEE (K).
         RBT         XWOR%3-XWOR%4   < RAZ BIT0 DE A.
         LR          A,W             < (W)=@ DU DESCRIPTEUR PRECEDENT.
         JNC         E340            < LA CLEF EST CERNEE.
<
< CAS D'UNE CLEF NON CERNEE :
<
         LB          XXKE1,W         < ACCES A L'ETAT DU DESCRIPTEUR PRE
                                     < PRECEDENT.
         RBT         NBITMO+BXKE2    < LA CLEF N'ETANT PAS CERNEE, CELA
                                     < SIGNIFIE QUE LE DESCRIPTEUR (W)
                                     < EST LE DERNIER DE LA LISTE, AVEC
                                     < L'INSERTION C'EST LA NOUVELLE CLEF
                                     < (PEK,PDK) QUI DEVIENT LA DERNIERE.
         STB         XXKE1,W         < LE DESCRIPTEUR PRECEDENT
                                     < N'EST PLUS LE DERNIER DE LA LISTE.
         SBR         L,A             < CALCUL DE (W)-(L), AVEC (A)=(W).
         CPI         YY7-XXSFL       < LE DESCRIPTEUR PRECDENT EST-IL
                                     < EN BOUT DE SECTEUR...
         JGE         E335            < OUI, IL FAUT DONC CHANGER DE
                                     < SECTEUR.
<
< CAS OU L'ON PEUT RESTER DANS LE MEME SECTEUR :
<
E336:    EQU         $
         ADRI        LXKE,W          < PASSAGE AU DESCRIPTEUR SUIVANT.
E337:    EQU         $
XWOR%1:  VAL         COSBT?BXKE2=FMASK(K=FCINST
XWOR%2:  VAL         MOCG=K
XWOR%2:  VAL         -XWOR%2         < POUR UN CADRAGE A DROITE...
         LAI         XWOR%1>XWOR%2   < INDICATION DE DERNIER DESCRIPTEUR
                                     < (FUTUR BIT2 DU DESCRIPTEUR DE LA
                                     < CLEF).
E338:    EQU         $
         BSR         AINITK          < INITIALISATION DU DESCRIPTEUR DE
                                     < LA CLEF INSEREE.
         IC          XXSFK,L         < ET UN DESCRIPTEUR OCCUPE DE PLUS
                                     < DANS CE SECTEUR.
         BSR         AWSDK           < ECRITURE DU SECTEUR COURANT (X),
                                     < ET ATTENTE.
<
< RETOUR :
<
         BR          RETCID
<
< CAS OU LA CLEF N'EST PAS CERNEE, ET OU POUR LA RAJOUTER
< IL FAUT UN NOUVEAU SECTEUR :
<
E335:    EQU         $
         LR          L,A             < ON DEMANDE AINSI QUE L'ADRESSE DU
                                     < SECTEUR SUIVANT SOIT MISE DANS LE
                                     < MOT0 DU SECTEUR COURANT POUR
                                     < GENERE AUTOMATIQUEMENT LE CHAINAGE
                                     < AVANT.
         BSR         AALSC           < ALLOCATION 1 SECTEUR, ATTENTE
                                     < EVENTUELLE ET CHANAGE AVANT DES SECTEURS
                                     < SECTEURS.
         BSR         AWSDK           < ECRITURE DU SECTEUR COURANT (X).
         LAI         K               < INDIQUONS AINSI QU'IL Y A
                                     < 0 DESCRIPTEURS UTILISES ET
                                     < QUE LE NOUVEAU SECTEUR N'EST PAS
                                     < SECTEUR DE DEBORDEMENT.
         BSR         AINITS          < INITIALISATION DU NOUVEAU SECTEUR.
                                     < (X A ENCORE L'@SECTEUR PRECEDENTE).
         JMP         E337
<
< CAS OU LA LISTE EST VIDE :
<
E330:    EQU         $
         LR          L,A             < ON DEMANDE QUE L'@ DU SECTEUR ALLOUE
                                     < SOIT MISE DANS LE MOT0 DU BUFFER
                                     < MAIS CELA SERVIRA UNIQUEMENT
                                     < A 'INITS'...
         BSR         AALSC           < ALLOCATION 1 SECTEUR.
         LX          INFINI          < INDIQUONS AINSI QU'IL N'Y A PAS DE SECTEU
                                     < DE SECTEURS PRECEDENTS.
         LAI         K
XWOR%1:  VAL         MOCG=K
XWOR%2:  VAL         W>XWOR%1=K      < '1' CADRE A GAUCHE...
         SBT         NBITMO-B-XWOR%2 < (A)='100 : ON INDIQUE AINSI QU'IL
                                     < Y A 1 DESCRIPTEUR UTILISE
                                     < ET PAS DE DEBORDEMENT.
         BSR         AINITS          < INITIALISATION DU SECTEUR.
<
<        NOTA SUR LA PREMIERE CLEF D'UNE LISTE SEQUENTIELLE :
<                      POUR NE PAS AVOIR DE PROBLEMES AVEC DES
<                    DELETES DE LISTES NE CONTENANT QU'UN SEUL
<                    DESCRIPTEUR, ON CREE A PRIORI EN TETE
<                    DE CHAQUE LISTE UNE CLEF BIDON (K,-1).
<
         STZ         XXKE1,W
         LA          INFINI          < ON NE SAIT JAMAIS...
XWOR%1:  VAL         COSBT?BXKE4=FMASK(K=FCINST
         IF          XWOR%1-Q8000,,XEIF%,
         IF          ATTENTION : L'INITIALISATION DE 'XXKE2' EST MAUVAISE
         IF          EN UTILISANT 'INFINI' !!!
XEIF%:   VAL         ENDIF
         STA         XXKE2,W         < CLEF (K,Q8000).
         STA         XXKE3,W         < CHAINE VIDE.
         STA         XXKE4,W         < CHAINE VIDE.
         JMP         E336
<
< CAS OU LA CLEF EST CERNEE :
<
E340:    EQU         $
         LR          X,A
         CP          PLSCAS          < LE DESCRIPTEUR PRECEDENT EST-IL
                                     < EN MEMOIRE...
         JE          E341            < OUI, OK.
<
< CAS OU LE DESCRIPTEUR PRECEDENT N'EST PLUS EN MEMOIRE : IL FAUT RELIRE SON
< SON SECTEUR :
<
         BSR         ARSDK           < LECTURE DU SECTEUR DU DESCRIPTEUR
                                     < PRECEDENT (X).
E341:    EQU         $
         LA          XXKE1,W         < ACCES AU MOT0 DU DESCRIPTEUR
                                     < PRECEDENT.
         JAGE        E342            < TEST DE SON BIT0 (LIBRE) : LE
                                     < DESCRIPTEUR PRECEDENT N'EST APS
                                     < LIBRE.
<
< CAS OU LE DESCRIPTEUR PRECEDENT EST LIBRE :
< C'EST BON, ON PEUT DONC L'UTILISER...
<
         LAI         K               < INDIQUONS AINSI QUE LE DESCRIPTEUR
                                     < EST OCCUPE ET QU'IL N'EST PAS
                                     < LE DERNIER.
         JMP         E338
<
< CAS OU LE DESCRIPTEUR PRECEDENT EST OCCUPE :
< IL VA FALLOIR FAIRE DU DEBORDEMENT...
<
E342:    EQU         $
<
< SAUVEGARDE DU DESCRIPTEUR PRECEDENT POUR LE RESTAURER
< LORSQU'ON AURA OBTENU UN SECTEUR DE DEBORDEMENT :
< (ON A DEJA : (A)=MOT0).
<
         LB          XXKE2,W         < ACCES MOT1.
         PSR         A,B             < SAVE MOT0,MOT1 DU DESCRIPTEUR PRECEDENT
                                     < PRECEDENT.
         SBT         BXKE1           < LE DESCRIPTEUR PRECEDENT DEVIENT
                                     < DEVIENT UN DESCRIPTEUR DE
                                     < DEBORDEMENT.
         STA         XXKE1,W
         LA          XXKE3,W         < MOT2.
         LB          XXKE4,W         < MOT3.
         PSR         A,B             < SAVE MOT2,MOT3.
<
< CALCUL DU DEPLACEMENT DU DESCRIPTEUR DE DEBORDEMENT
< DANS SON SECTEUR :
<
         LR          W,A             < (A)=@DESCRIPTEUR DE DEBORDEMENT.
         SBR         L,A             < (L)=@BUFFER.
         PSR         A               < SAVE DEPLACEMANT : A NOTER
                                     < QUE L'ON SAVE LE DEPLACEMENT ET NON PAS
                                     < ET NON PAS L'@ POUR DES RAISONS
                                     < DE TRANSLATABILITE DES BUFFERS EN MEMOIRE
                                     < MEMOIRE.
         LR          W,A
         ADRI        XXKE3-XXKE1,A   < ON DEMANDE QUE L'@ DU SECTEUR ALLOUE
                                     < SOIT MISE DANS LE MOT2 DU
                                     < DESCRIPTEUR DE DEBORDEMENT.
         BSR         AALSC           < ALLOCATION DU SECTEUR DE
                                     < DEBORDEMENT.
         BSR         AWSDK           < ECRITURE DU SECTEUR COURANT (X),
                                     < ET ATTENTE
<
< GENERATION DE L'EN TETE DU SECTEUR DE DEBORDEMENT :
<
         PLR         A               < RESTAURE DEPLACEMENT DU
                                     < DESCRIPTEUR DE DEBORDEMENT.
XWOR%1:  VAL         MOCG=K
XWOR%2:  VAL         W>XWOR%1=K      < '1' CADRE A GAUCHE...
         SBT         NBITMO-B-XWOR%2 < INDIQUONS AINSI QU'IL Y A
                                     < UN DESCRIPTEUR UTILISE.
         LY          XXKE3,W         < SAVE @SECTEUR DE DEBORDEMENT DANS Y.
                                     < DANS Y.
         BSR         AINITS          < INITIALISATION DU SECTEUR DE
                                     < DEBORDEMENT (X=@SECTEUR
                                     < PRECEDENT).
         LR          Y,X             < GENERATION DE (X)=@SECTEUR DEBORDE-
                                     < MENT, CAR AINITS A RENVOYE :
                                     < (X)=@SECTEUR SUIVANT DU PRECEDENT.)
<
< RESTAURATION DU DESCRIPTEUR COMME 1ER
< DESCRIPTEUR DU SECTEUR DE DEBORDEMENT :
<
         PLR         A,B             < RESTAURE MOT2,MOT3.
         STA         XXKE3,W         < MOT2.
         STB         XXKE4,W         < MOT3.
         PLR         A,B             < RESTAURE MOT0,MOT1.
         STA         XXKE1,W         < MOT0.
         STB         XXKE2,W         < MOT1.
         JMP         E336
         PAGE
<
<
<        D E L E T E   U N E   C L E F   D A N S   U N E
<        L I S T E   S E Q U E N T I E L L E  :
<
<
<        ARGUMENTS :
<                    (L)=ADRESSE DU BUFFER DU SECTEUR COURANT,
<                    (X)=ADRESSE DU SECTEUR COURANT,
<                    (A)=RESULTAT DU PARCOURS DE LA LISTE SEQUENTIELLE.
<                    (B)=ARGUMENT D'APPEL DE PLSC.
<                                    BIT4(B)=K : DELETE DESCRIPTEUR,
<                                    BIT4(B)=1 : CLOSE DESCRIPTEUR (IDLE).
<
<
         USE         W,DEM0
DELETE:  EQU         $
         SLLS        LXKE=K          < CONVERSION EN UNE ADRESSE DE MOT
                                     < DU DESCRIPTEUR DE LA CLEF
                                     < A DELETER.
XWOR%1:  VAL         XXPL6=K
         RBT         NBITMO-B-XWOR%1
         LR          A,W             < (W)=@DU DESCRIPTEUR DE LA CLEF A
                                     < DELETER.
         LA          XXKE2,W         < ACCES AU MOT1 DU DESCRIPTEUR.
         TBT         BXKE4           < TEST BIT IN USE/IDLE.
         JC          SYSRDA          < IN USE, OK.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      ETRE PRUDENT...
<
SYSRDA:  EQU         $
         TBT         NBITMO+BXPL2    < DISCRIMINATION DELETE/CLSE.
         JC          E372            < UN CLOSE EST DEMANDE.
<
< TRAITEMENT DES DELETE-DELETE :
< LORS D'UN DELETE-DELETE, LE DESCRIPTEUR EST LIBERE, LE
< BIT IN USE/IDLE N'AYANT PLUS AUCUN SENS.
<
E350:    EQU         $
         DC          XXSFK,L         < ET UN DESCRIPTEUR DE MOINS
                                     < DANS LE SECTEUR.
         JE          E355            < IL N'Y A PLUS AUCUN DESCRIPTEUR
                                     < OCCUPES DANS LE SECTEUR, IL
                                     < ALLONS LE LIBERER.
<
< CAS OU LE SECTEUR COURANT CONTIENT ENCORE AU MOINS
< UN DESCRIPTEUR OCCUPE :
<
         LA          XXKE1,W         < ACCES A L'ETAT DU DESCRIPTEUR DE
                                     < DE LA CLEF QUE L'ON DELETE.
         TBT         BXKE2           < EST-CE LE DERNIER DESCRIPTEUR
                                     < DE LA LISTE SEQUENTIELLE.
         JC          E352            < ET OUI, C')ST LE DERNIER.
<
< CAS OU LE DESCRIPTEUR DELETE N'EST PAS LE DERNIER
< DE LA SEQUENCE :
<
         SBT         BXKE0           < MEMORISATION DE LA LIBERATION DE CE
                                     < CE DESCRIPTEUR.
E362:    EQU         $
         STA         XXKE1,W         < ET MISE A JOUR DU DESCRIPTEU.
         JMP         E359            < ET C'EST TOUT...
<
< CAS OU LE DESCRIPTEUR DELETE EST LE DERNIER DE LA LISTE :
<
E352:    EQU         $
         ADRI        -LXKE,W         < PASSAGE AU DESCRIPTEUR PRECEDENT.
E353:    EQU         $
         LA          XXKE1,W         < TEST DE L'ETAT LIBRE DU
                                     < DESCRIPTEUR PRECEDENT.
         JAL         E352            < LE DESCRIPTEUR PRECEDENT EST
                                     < LIBRE (BIT0=1), CONTINUONS DONC
                                     < A REMONTER DANS LE SECTEUR.
<
< ARRETONS NOUS SUR LE 1ER DESCRIPTEUR OCCUPE (PAR UNE
< CLEF OU UN DEBORDEMENT).
< A NOTER, QU'IL Y A FORCEMENT AU MOINS UN DESCRIPTEUR
< OCCUPE DANS CE SECTEUR PUISQU LE NBRE DE BLOCS
< UTILISES EST DIFFERENT DE 0 (CF. 3,L).
<
         SBT         BXKE2           < LE 1ER DESCRIPTEUR OCCUPE
                                     < DEVIENT LE DERNIER DE LA LISTE.
         JMP         E362            < ET C'EST TOUT...
<
< CAS OU ON TROUVE UN SECTEUR VIDE, ON VA DONC LE LIBERER :
<
E355:    EQU         $
         LAD         RALSC
         LR          A,W             < (W)=@DEMANDE DE RELEASE SECTEUR,
                                     <     A NOTER, QUE CETTE INITIALISATION
                                     <     EST FAITE QUELQUE SOIT LA FACON
                                     <     DONT ON LIBERERA LE SECTEUR.
<
< TEST SUR LE STOCK DE SECTEURS DE PLSC :
<
         LA          NSTOCS
         CPI         MSTOCS          < A-T'ON UN STOCK SUFFISANT...
         JGE         E360            < OUI...
<
< CAS OU LE STOCK DE SECTEURS DE PLSC EST INSUFFISANT :
<
         ADRI        I,A
         STA         NSTOCS          < ET UN SECTEUR DE PLUS EN STOCK...
         XR          A,X
<
<        ON A ICI :
<                    (A)=ADRESSE SECTEUR A LIBERER.
<                    (X)=NUMERO DE CE SECTEUR DANS LA PILE.
<
         STA         &ASTOCS         < MISE EN PILE...
         IC          WEIO            < AINSI WEIO>0, DONC LE WAIT
                                     < NE NOUS BLOQERA PAS TOUTE A
                                     < L'HEURE...
         JMP         E361
<
< CAS OU LE STOCK DE SECTEURS EST SUFFISANT :
<
E360:    EQU         $
<
< LE SECTEUR ETANT LIBRE ON VA UTILISER SON MOT4
< POUR RENVOYER A 'RELEASE SECTEUR' L'@
< DU SECTEUR A RELEASER.
<
         LR          L,A
         ADRI        XXSFL,A
         STA         RASCAM          < MAJ DE LA DEMANDE DE RELEASE.
         STX         XXSFL,L         < RANGEMENT DE L'@SECTEUR A
                                     < RELEASER DANS MOT4 DU SECTEUR.
         LAI         NSPREL
XWOR%1:  VAL         MSPTYP=K
XWOR%1:  VAL         NBITMO-XWOR%1
         SBT         PRIO-XWOR%1     < FUTUR BIT PRIORITAIRE DE L'EN-
                                     < TETE DE DEMANDE
         SWBR        A,A             < GENERATION DE L'EN-TETE DE
                                     < DEMANDE.(NSPREL,PRIORITAIRE).
         STA         RALSC
         BSR         ACHAND          < ON A (W)=@DEMANDE DE RELEASE.
<
<        NOTA :
<                      L'ATTENTE DE FIN DE RELEASE
<                    EST REPOUSSEE LE PLUS TARD
<                    POSSIBLE...
<
E361:    EQU         $
<
<        ON A ICI :
<                    (L)=ADRESSE BUFFER,
<                    (W)=ADRESSE DE LA DEMANDE DE RELEASE.
<
<
< RECONSTITUTION DES CHAINAGES APRES LE RELEASE
< D'UN SECTEUR :
<
         LX          XXSFS,L         < (X)=@SECTEUR SUIVANT.
         LB          XXSFB,L         < (B)=@SECTEUR PRECEDENT.
         LY          INFINI
         CPR         X,Y             < TEST PRESENCE SECTEUR SUIVANT
         LY          XXSFD,L         < (Y)=INDICATEUR DE DEBORDEMENT
         JE          E356            < IL N'Y A PAS DE SECTEUR SUIVANT
<
< CAS OU IL Y A UN SECTEUR SUIVANT :
<
         BSR         ARSDK           < LECTURE DU SECTEUR SUIVANT,
                                     < ET ATTENTE.
<
< MISE A JOUR DE L'EN-TETE DU SECTEUR SUIVANT :
<
         STB         XXSFB,L         < CHAINAGE VERS LE SECTEUR PRECEDENT
                                     < (C'EST LE PRECEDENT DU SECTEUR
                                     < LIBERE).
         STY         XXSFD,L         < L'INDICATEUR DE DEBORDEMENT
                                     < DU SECTEUR LIBERE EST REPORTE
                                     < SUR LE SECTEUR SUIVANT.
         BSR         AWSDK           < REECRITURE DU SECTEUR SUIVANT.
E356:    EQU         $
<
<
<        A T T E N T I O N  :
<                      IL Y A TOUJOURS UN PRECEDENT, CAR
<                    UNE FOIS QU'UNE LISTE SEQUENTIELLE
<                    A ETE CREE, ON NE PEUT PLUS LA
<                    VIDER COMPLETEMENT, CE QUI
<                    CE QUI SIGNIFIE QUE LE 1ER SECTEUR
<                    NE PEUT JAMAIS ETRE VIDE, DONC
<                    JAMAIS RELEASE (CF CLEF (K,-1)).
<
<
         XR          B,X
<
<        ON A ICI :
<                    (X)=ADRESSE DU SECTEUR PRECEDENT,
<                    (B)=ADRESSE DU SECTEUR SUIVANT.
<
         BSR         ARSDK           < LECTURE DU SECTEUR PRECEDENT
                                     < ET ATTENTE.
<
< ATTENTE EVENTUELLE DE FIN DE RELEASE SECTEUR :
<
         BSR         ACHANW          < C'EST WEIO DU RELEASE SECTEUR.
         LR          L,W             < (W)=@BUFFER.
<
< LE SECTEUR RELEASE ETAIT-IL UN SECTEUR DE DEBORDEMENT :
<
         CPZR        Y               < TEST INDICATEUR DE DEBORDEMENT.
         JNE         E357            < LE SECTEUR RELEASE ETAIT UN SECTEUR
                                     < DE DEBORDEMENT.
<
< CAS OU LE SECTEUR RELEASE N'EATAIT PAS UN SECTEUR DE DEBORDEMENT :
<
         STB         XXSFS,L         < RECONSTITUTION DU CHAINAGE AVANT
                                     < DU SECTEUR PRECEDENT VERS LE
                                     < SECTEUR SUIVANT DU SECTEUR
                                     < RELEASE.
         XR          B,A
         CP          INFINI          < MAIS,AU FAIT, LE SECTEUR SUIVANT
                                     < DU SECTEUR RELEASE EXISTE-T-IL?
         XR          B,A
         JNE         E359            < OUI, LE SUIVANT EXISTE
<
< CAS OU LE SECTEUR SUIVANT DU SECTEUR RELEASE N'EXISTE PAS :
< CELA SIGNIFIE AU PASSAGE QUE LA CLEF DELETEE ETAIT LA
< DERNIERE DE SA LISTE...
<   NOUS VOILA DONC DANS L'OBLIGATION DE PARCOURIR LE SECTEUR
< PRECEDENT (X) POUR DETERMINER QUEL EST LE DERNIER
< DESCRIPTEUR DE LA LISTE (APRE DONC LE DELETE DE LA CLEF ARG. )
<
         ADRI        YY7-XXSFL,W     < (W)=@DU DERNIER DESCRIPTEUR DU SECTEUR
                                     < SECTEUR (X).
         JMP         E353
<
< CAS OU LE SECTEUR RELEASE ETAIT EN DEBORDEMENT :
<
E357:    EQU         $
         ADR         Y,W             < (W)=@ DU DESCRIPTEUR DE DEBORDEMENT.
         XR          B,A
         CP          INFINI          < LE SECTEUR SUIVANT DU SECTEUR
                                     < RELEASE EXISTE-T-IL?
         XR          B,A
         JE          E350            < NON, DONC LE DESCRIPTEUR DE
                                     < DEBORDEMENT EST LIBRE A SON TOUR
<
< CAS OU LE SECTEUR SUIVANT DU SECTEUR RELEASE EXISTE : IL FAUT RECONSTITUER
< LE CHAINAGE DU DESCRIPTEUR DE DEBORDEMENT VERS CE SECTEUR SUIVANT.
<
         STB         XXKE3,W         < (B)=@SECTEUR SUIVANT,
                                     < (W)=@DESCRIPTEUR DE DEBORDEMENT.
<
< RETOUR : IL FAUT METTRE A JOUR LE SECTEUR COURNAT (X) SUR DISQUE :
<
E359:    EQU         $
         BSR         AWSDK           < REECRITURE DU SECTEUR COURANT (X).
         BR          RETCID          < OUF...
<
< TRAITEMENT D'UN DELETE-CLOSE :
< DANS CE CAS LA CLEF PASSE A L'ETAT IDLE.
<
E372:    EQU         $
         RBT         BXKE4           < LA CLEF PASSE A L'ETAT IDLE.
         STA         XXKE2,W         < MAJ DU DESCRIPTEUR.
<
< ON FAIT DE PLUS :
<                    (MOT2,MOT3)<--(TEST1,TEST2).
<
         LA          TEST1
         STA         XXKE3,W
         LA          TEST2
         STA         XXKE4,W
         JMP         E359            < ET C'EST TOUT...
         PAGE
<
<
<        L E C T U R E - E C R I T U R E
<        D ' U N  S E C T E U R  S U R  D K M
<        E T   A T T E N T E   D E   F I N   D ' E / S.
<
<
<        ARGUMENT :
<                    (X)=ADRESSE DU SECTEUR.
<
<
         USE         W,DEM0
<
< ECRITURE D'UN SECTEUR :
<
WSDK:    EQU         $
         PSR         A,B,W
         LAI         FGW             < DEMANDE D'ECRITURE.
         JMP         E262
<
< LECTURE D'UN SECTEUR :
<
RSDK:    EQU         $
         PSR         A,B,W
         LAI         FGR             < DEMANDE DE LECTURE.
<
< TRONC COMMUN LECTURE/ECRITURE :
<
E262:    EQU         $
         IF          NUQFM,,,XEIF%
         IF          LA ZONE DE SIMULATION DE 'DKF' SUR 'DKM'
         IF          EST INCOMPATIBLE AVEC LES TESTS DE
         IF          DISCRIMINATION QUI SUIVENT !!!
XEIF%:   VAL         ENDIF
         CPZR        X
         JL          E262X1          < CAS DES ADRESSES 'DKM' SUPERIEURES
                                     < A L'INFINI, ELLES APPARTIENNENT
                                     < FORCEMENT A 'DKM'...
         LRM         B
         WORD        NUQFM
         CPR         B,X
         JGE         E262X1          < (X)>=B : LE SECTEUR DEMANDE EST AUSSI
                                     < HORS DE 'NUQFM' : IL APPARTIENT A 'DKM'.
         LRM         B
         WORD        XXTP+NSTP
         CPR         B,X
         JGE         E262X2          < (X)>=XXTP+NSTP : 'SYSER'...
         LRM         B
         WORD        XXTP
         CPR         B,X
         JGE         E262X3          < XXTP<=(X)XWOR%1=K
         SBT         NBITMO-B-XWOR%2 < POSITIONNEMENT DU FUTUR "1 DESCRIP-
                                     < TEUR" PRESENT DANS LE SECTEUR...
         LX          INFINI          < (X)=FAUX CHAINAGE ARRIERE...
         STX         O,L             < QUE L'ON MET EN TETE DU BUFFER,
         BSR         AINITS          < INITIALISATION DU BUFFER, COMME S'IL
                                     < NE CONTENAIT QU'UN SEUL DESCRIPTEUR,
                                     < ET SANS CHAINAGES...
         LAI         K
         SBT         BXKE2           < INDICATEUR "DERNIER DESCRIPTEUR".
         STA         XXKE1,W         < GENERATION D'UNE FAUSSE 'PEK',
         STZ         XXKE2,W         < D'UNE FAUSSE 'PDK',
         STX         XXKE3,W         < ET DE FAUX CHAINAGES
         STX         XXKE4,W         < D'ENREGISTREMENT.
         PLR         X,L
         JMP         E262X7          < C'EST TOUT, ET ON ESPERE QUE CA
                                     < VA MARCHER...



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