< 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 <NOM-INTERNE>, 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 <<<<PHASE CRITIQUE DU SGF.
<
< DISCRIMINATION DU MODE D'APPEL
< (PAR NOM, OU PAR ETAT RECHERCHE) :
<
IF BITRFE-BITSIG,,XEIF%,
IF ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%: VAL ENDIF
JAGE E400 < BIT0(A)=K : APPEL PAR NOM-DIRECT.
<
< CAS DE L'APPEL AVEC RECHERCHE
< D'UN FICHIER D'ETAT DONNE :
<
RBT BITRFE < RAZ DU BIT D'APPEL PAR ETAT.
<
< ON A ICI :
< (A)=MASK+ETAT POUR LOOKF.
<
BSR ALOOKF < RENVOI DANS A LE NOM DIRECT
< DU 1ER FICHIER POSSEDNAT L'ETAT
< CHERCHE. SI AUCUN FICHIER NE COINCIDE
< COINCIDE, RAPPELONS QUE LOOKF
< BLOQUE LE DEMANDEUR JUSQU'A
< SATISFACTIOM, ET DEBLOQUE
< LA GESTION DE FICHIERS PAR
< LE SEMAPHORE SEXSGF.
E400: EQU $
CP NMFIL < VALIDATION DU NOM INTERNE...
JL E400XX < OK, IL EST DANS LES NORMES...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< LE MIEUX EST DE SORTIR AVEC (Y)=NSPVID, AINSI
< LE FICHIER DEMANDE N'EST PAS OUVERT...
<
LYI NSPVID < 'OPEN' IMPOSSIBLE...
JMP E402R < VERS LA SORTIE EN ERREUR...
E400XX: EQU $
<
< ON A ICI :
< (A)=NOM DIRECT D'UN FICHIER A OUVRIR.
<
LXI MTSGF
XR A,X
<
< ON A ICI :
< (A)=ARGUMENT DE DEMANDE D'ETAT,
< (X)=NOM DIRECT DU FICHIER DONT ON DESIRE L'ETAT.
<
BSR AMTEDF < RENVOI L'ETAT DU FICHIER DANS A.
<
< TEST DE L'ETAT DU FICHIER AVANT LA DEMANDE :
<
TBT XBITF1 < TEST OPEN (1) / CLOSE (K).
JNC E401 < OK LE FICHIER EST CLOSE.
<
< CAS D'UN FICHIER DEJA OUVERT :
<
LYI NSPVID < NSP NULLE A PRIORI.
XWOR%1: VAL BIT>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 <<<<PHASE CRITIQUE DU SGF.
BSR AACTP < ACCES A LA TP DU FICHIER, A NOTER
< QUE LE FICHIER NE PEUT ETRE
< INEXISTANT...
<
< ON A ICI :
< (W)=ADRESSE TP EN MEMOIRE.
<
DC NUSF,W < ET UN UTILISATEUR DE MOINS SUR
< CE FICHIER.
JG E404 < IL RESTE ENCORE AU MOINS UN
< UTILISATEUR.
<
< CAS OU PLUS PERSONNE N'UTILISE CE FICHIER :
<
BSR ADETP < ON SUPPRIME LA TP DE LA TABLE
< ASSOCIATIVE TATP.
<
< MISE A JOUR DE TEDF :
<
LR B,A < (A)=ETAT A DONNER.
PSR A,Y
CPI MCFR < EST-CE UNE DEMANDE DE DELETE ???
JE E404X < OUI, (Y)=1 (SET A 1 AVEC VERIF).
LYI FONRB < NON, (Y)=4 (RESET A 0 SANS VERIF).
E404X: EQU $
LAD ATADF < (A)=ADRESSE DU RELAI VERS 'TADF',
< (X)=NOM DIRECT DU FICHIER,
< (Y)=FONCTION SUR 'TADF'.
BSR ATMOBT < SI UN DELETE A ETE DEMANDE SUR LE
< FICHIER DE NOM INTERNE (X), ON MET
< SON BIT A 1 DANS 'TADF' EN VERIFIANT
< QU'IL ETAIT A 0 AU PREALABLE ; SINON,
< ON LE RAZE SANS VERIFICATION...
PLR A,Y < RESTAURE : (A)=ETAT A DONNER AU FICHIER,
< (Y)=1 POUR L'APPEL SUIVANT DE TMBOT.
BSR AMTEDF < (A)=ETAT/MASK A DONNER AU FICHIER.
E404: EQU $
<
< LIBERATION DE LA DCTF :
<
LX VAR+NSPF < RECUPERATION DU NSPDCTF.
STZ &ADCTSY < MEMORISATION DE LA FERMETURE
< PAR RAZ DE L'ENTREE DE DCTSY(X).
ADRI -NSPFIL,X < CALCUL DU NUMERO DE LA DCTF
< DANS L'ENSEMBLE DES DCTF /0.
LAD AODCTF < ADRESSE DU RELAI D'ACCES A
< LA TABLE D'OCCUPATION DES DCTF.
BSR ATMOBT < LIBERATION DCTF, RAPPELONS QUE
< (Y)=1 (FONCTION 'SET BIT').
LAD &ASDCTF
BSR ARLSE
<
< RELEASE DU BUFFER CONTENANT LA DCTF :
<
LA ARLBTP
LR A,W < (W)=@DEMANDE DE RELEASE BUFFER.
LR L,A < (A)=@MOT DU BUFFER ALLOUE A DCTF.
SLLS NOCMO=K < CONVERSION EN UNE ADRESSE OCTET.
STA ARGDEM+ASDEM < MISE EN ASDEM DE RELBTP.
LAD ARGDEM+ASDEM
STA ARGDEM+AMDEM < L'ADRESSE OCTET DU BUFFER EST
< RENVOYE PAR L'ASDEM DE RELBTP.
BSR ACHAND < DEMANDE DE RELEASE BUFFER.
BSR ACHANW
LAD &ASXSGF
BSR ARLSE
E444: EQU $
LYI ECZERO < CONDITION DE RETOUR OK.
E405: EQU $
PLR A,X,L,W
RSR
PAGE
<
<
< D C T D U R E L E A S E U R D E S
< C L E F S D ' U N F I C H I E R
< D E L E T E :
<
<
CALL #SISP CMS5 CHECK#
CALL #SISP CMS5 DOL1#
DCTRCF: EQU $
PSTRCF: WORD K;K;K;K;COM+DEPCS;DCTRCF;DEMRCF;PILRCF;HDLRCF;SMST;SO;SE
#@ASCI " RCF" < #SISP CMS5 ASCI#
<
< BLOC DE DEMANDE AU SGF :
<
DEMRCF: WORD NILK < NSPTYP.
WORD NILK < OPDEM.
DZS LDEM0+DEMRCF-$
<
< PILE DU RELEASEUR :
<
CALL #SISP CMS5 DOL2#
PILRCF: EQU $-DEPILE
XWPILE: VAL 40
CALL #SISP CMS5 GENPIL2#
CALL #SISP CMS5 CHECK#
PAGE
<
<
< R E L E A S E U R D E S C L E F S
< D ' U N F I C H I E R D E L E T E :
<
<
< FONCTION :
< CE HANDLER N'EST PAS ACCESSIBLE PAR 'CHAND',
< EST TOUJOURS ACTIF. IL EST BLOQUE EN GENERAL DANS
< LOOKF, EN ATTENTE DE FICHIERS A L'ETAT OPEN &
< INEXISTANT (SUITE DONC A UN CLOSE-DELETE). LORSQU'
< EN A TROUVE UN, IL RECUPERE SES CLEFS UNE A UNE
< EN MODE NEXT, ET LES DELETE, PUIS ENFIN DEMANDE
< LA FERMETURE EN MODE CLOSE & INEXISTANT, MODE
< SPECIAL QUI LUI EST RESERVE.
<
<
USE W,DEM0
HDLRCF: EQU $
LAI MCOI < RECHERCHE DE FICHIERS A L'ETAT
< OPEN & INEXISTANT.
SBT BITRFE < RECHERCHE PAR ETAT.
XWOR%1: VAL COSBT?XBITF3=FMASK(K=FCINST
XWOR%1: VAL COSBT?XBITF4=FMASK(K?XWOR%1=FCINST
LBI XWOR%1 < FICHIER DE TRAVAIL.
LYI NSPVID < FAUX NVP MINIMUM FORCANT LE
< PASSAGE DU SGF SUR 'DKB' EN
< TRANSPARENT POUR 'RCF' ; IL N'EST EN EFFE
< EN EFFET PAS UTILE QUE DE LA MEMOIRE
< VIRTUELLE SOIT IMMOBILISEE POUR
< LUI, CAR IL N'A PAS BESOIN D'ETRE
< RAPIDE...
BSR AOPFIL < OUVERTURE DU 1ER FICHIER
< COINCIDANT.
CPZR X < TEST DES CONDITIONS DE RETOUR...
JNE SYSRD4 < OK.
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< PROBABLEMENT FAIRE UN 'JMP HDLRCF'...
<
SYSRD4: EQU $
<
< T R A C E D U S Y S T E M E :
<
LAI NSPRCF
SWBR A,A < GENERATION D'UN FAUX NSPTYP.
BSR ATRACE
<
< ON A ICI :
< (X)=NSPDCTF.
<
<
< MISE A JOUR DU BLOC DE DEMANDE SGF :
<
SWBR X,A
STA NSPTYP < GENERATION DE L'EN-TETE DE LA
< DEMANDE AU SGF.
LYI FOFONX < FONCTION OPEN-NEXT ENREGISTREMENT
LBI FOFCR < FONCTION CLOSE-RELEASE ENREGISTRE-
< MENT.
<
< BOUCLE DE RELEASE DES ENREGISTREMENTS EN MODE NEXT :
<
E570: EQU $
STY ARGDEM+OPDEM < FONCTION OPEN-NEXT ENREGISTREMENT
BSR ACHAND < W A L'ADRESSE DU BLOC DE
< DEMANDE SGF.
WAIT WEIO < ATTENTE DE FIN D'OUVERTURE.
LA ARGDEM+ETADEM < TEST DES CONDITIONS DE RETOUR.
JANE E571 < SI (A)#0, C'EST QUE C'EST
< TERMINE : SOIT CATALOGUE
< DES CLEFS ENTIEREMENT EXPLORE,
< OU CATALOGUE VIDE...
STB ARGDEM+OPDEM < FONCTION CLOSE-RELEASE.
BSR ACHAND
BSR ACHANW < ATTENTE DE FIN DE CLOSE-RELEASE.
JMP E570 < NEXT CLEF.
<
< FERMETURE DU FICHIER :
<
E571: EQU $
LR X,A < (X)=A=NSPDCTF.
SBT BITCFN < MODE FERMETURE PAR NSP.
LBI MCIN < DEMANDE DE FERMETURE A L'ETAT
< CLOSE, INEXISTANT, ET SURTOUT
< NON PARATGEABLE, MEMORISANT
< AINSI QU'IL A DEJA ETE OUVERT
< AU MOINS UNE FOIS.
BSR ACLFIL < FERMETURE.
JMP HDLRCF < ALLONS CHERCHER LE FICHIER
< OPEN & INEXISTANT SUIVANT.
PAGE
<
<
< A L L O C A T I O N D ' U N D E S C R I P T E U R
< D ' E N R E G I S T R E M E N T :
<
<
< RESULTATS :
< AFILT (DCTF) =ADRESSE DU DESCRIPTEUR ALLOUE,
< AFILQ (DCTF) =ADRESSE+1 DU DESCRIPTEUR ALLOUE.
< MOT(DENI(DESCRIPTEUR)) <-- NOM INTERNE DU FICHIER,
< LE DESCRIPTEUR AYANT ETE NETTOYE AU PREALABLE...
<
<
< RAPPEL PHILOSOPHIQUE :
< A CHAQUE ENREGISTREMENT LOGIQUE EST ASSOCIE
< UNE CLEF ; DANS LE DESCRIPTEUR DE CLEF, LORSQUE
< CELLE-CI EST A L'ETAT IDLE, ON TROUVE LE
< DESCRIPTEUR DE L'ENREGISTREMENT, SOI LA
< LA TETE ET LA QUEUE DE LA LISTE DE SECTEURS
< CHAINES QUI LE CONSTITUENT. LORSQUE LA CLEF
< EST A L'ETAT IN USE, CE DESCRIPTEUR EST RENDU
< RESIDENT, ET C'EST LE ROLE DE CETTE ROUTINE
< DE LUI ALLOUER 2 MOTS EN MEMOIRE.
<
<
< I M P O R T A N T :
< LORS D'UNE REINITIALISATION DU SYSTEME
< ('SYSINI'), SI UN OU PLUSIEURS DESCRIPTEURS
< D'ENREGISTREMENT SONT DIFFERENTS DE 0,
< CELA SIGNIFIE QUE CERTAINEMENT DES ENREGISTRE-
< MENTS ETAIENT ENCORE OUVERTS LORS DU
< RECHARGEMENT DU SYSTEME ; CONNAISSANT AINSI
< LE NOM INTERNE DES FICHIERS EN CAUSE (VOIR
< LE MOT 'DENI' DES DESCRIPTEURS), ON PEUT
< CONNAITRE LEUR 'TP', PUIS LA LISTE DES
< CLEFS, ET DONC LA CLEF 'IN USE', ET DONC
< RESTAURER MANUELLEMENT LES CHAINAGES
< D'ENREGISTREMENT SI NECESSAIRE...
<
<
USE L,DCT0
ADESC: EQU $
<
< RECHERCHE D'UN DESCRIPTEUR LIBRE :
<
PSR A
LAD &ASXSGF
BSR ARLSE < POUR EVITER LES INTERBLOCAGES
PLR A
< DANS LE CAS OU AUCUN DESCRIPTEUR
< N'EST LIBRE.
RQST &ASEMDE < ALLOCATION D'UN DESCRIPTEUR,
< AVEC ATTENTE EVENTUELLE.
RQST &ASXSGF <<<<PHASE CRITIQUE DU SGF.
PSR A,X
LAD ATODE < ADRESSE DU RELAI VERS LA TABLE
< D'OCCUPATION DES DESCRIPTEURS.
NTRN
LXI X7/NBITMO
TRN
< (X)=NOMBRE DE MOTS DE LA TABLE D'OCCU-
< PATION DES DESCRIPTEURS.
BSR ASOBT < RECHERCHE DU 1ER LIBRE, DONT LE
< NUMERO EST RENVOYE DANS A.
JG SYSRD5 < OK, (X) EST CORRECT...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< ATTENTION, SI ON RELANCE LE
< SYSTEME, L'ADRESSE DU DESCRIPTEUR
< RENVOYEE SERA MAUVAISE, PUIS
< QUE CE DERNIER N'EXISTE PAS...
<
SYSRD5: EQU $
SLLS UDE=K < CONVERSION DU NUMERO DE DESCRIP-
< TEUR EN UN NUMERO DE MOT DANS
< LE POOL.
AD ATDE < (A)=@MOT DU DESCRIPTEUR ALLOUE.
XR A,W < (A)=SAVE W, (W)=ADRESSE DESCRIPTEUR...
DO UDE
STZ K=FCDO,W < NETTOYAGE AVANT UTILISATION...
LX VAR+FILNOM < (X)=NOM INTERNE DU FICHIER, QUE L'ON
STX DENI,W < DUPLIQUE DANS LE DESCRIPTEUR...
XR A,W < RESTAURE...
STA VAR+AFILT < ADRESSE DE L'ADRESSE DE LA
< TETE DE L'ENREGISTREMENT.
ADRI DEMO1-DEMO0,A
STA VAR+AFILQ < ADRESSE DE L'ADRESSE DE LA
< QUEUE DE L'ENREGISTREMENT.
PLR A,X
RSR
PAGE
<
<
< R E L E A S E D ' U N D E S C R I P T E U R
< D ' E N R E G I S T R E M E N T :
<
<
< ARGUMENT :
< AFILT (DCTF) =ADRESSE DESCRIPTEUR A RELEASER.
<
<
USE L,DCT0
RDESC: EQU $
<
<
< A T T E N T I O N :
< ON EST DANS UNE PHASE
< CRITIQUE DU 'SGF !!!
<
<
PSR A,X,Y
LA VAR+AFILT < RECUPERATION DE L'ADRESSE DU
< DESCRIPTEUR A RELEASER.
XR A,W < (A)=SAVE W, (W)=ADRESSE DESCRIPTEUR.
LX VAR+FILNOM < (X)=NOM INTERNE COURANT,
LY DENI,W < (Y)=NOM INTERNE D'OUVERTURE,
CPR X,Y < SONT-ILS IDENTIQUES ???
JE RDESC1 < OUI, OUFFF...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< ETRE PRUDENT, CAR EN RELANCANT
< LE SYSTEME, ON RISQUE D'EFFACER DES
< INFORMATIONS UTILISEES PAR UN AUTRE...
<
RDESC1: EQU $
DO UDE
STZ K=FCDO,W < NETTOYAGE POUR LA 'COPY'...
XR A,W < RESTAURE...
SB ATDE < CONVERSION EN UN NUMERO DE
< MOT DANS LE POOL.
SLRS UDE=K < (A)=NUMERO DU DESCRIPTEUR A RELEASER.
LR A,X < (X)=NUMERO DU DESCRIPTEUR A RELEASER.
LAD ATODE < ADRESSE DU RELAI D'ACCES A LA
< TABLE D'OCCUPATION DES DESCRIP-
< TEURS D'ENREGISTREMENT.
LYI FONSB1 < FONCTION SET BIT A 1.
BSR ATMOBT < RELEASE DU DESCRIPTEUR.
LAD &ASEMDE
BSR ARLSE < RELEASE D'UN DESCRIPTEUR
PLR A,X,Y
RSR
PAGE
<
<
< A T T E N T E V E V N E M E N T E T L I B E R A T I O N
< P R O V I S O I R E D U S G F :
<
<
< ARGUMENT :
< (W)=ADRESSE DE LA DEMANDE ASSOCIEE A L'EVENEMENT.
<
<
USE W,DEM0
WAITR: EQU $
PSR A
LAD &ASXSGF < LIBERATION DU SGF
BSR ARLSE
PLR A
BSR ACHANW < ATTENTE EVENEMENT.
RQST &ASXSGF < RETOUR SGF RE-ALLOUE.
RSR < RETOUR SGF RE-ALLOUE.
PAGE
<
<
< H A N D L E R D U S G F :
<
<
< DEFINITION :
< LE HANDLER SGF EST FAIT D'UN CERTAIN NBRE DE ROUTINES
< SPECIFIQUES, REALISANT DES FONCTIONS BIEN DETERMINEES :
<
< - OPEN NEW ENREGISTREMENT,
< (=INSERTION D'UNE NOUVELLE CLEF DANS LE CATALO-
< GUE DU FICHIER, AVEC INITIALISATION DE L'ENREGISTRE
< MENT)
< - OPEN OPLD ENREGISTREMENT,
< (REPRISE D'UN ANCIEN ENREGISTREMENT POUR
< POUR RELECTURE OU MISE A JOUR)
< - OPEN NEXT ENREGISTREMENT,
< (ACCES A L'ENREGISTREMENT DONT LA CLEF
< EST LA CLEF SUIVANT LA CLEF OUVERTE
< PRECEDEMMENT)
< - CLOSE RELEASE ENREGISTREMENT,
< (SUPPRESSION DE LA CLEF DU CATALOGUE ET DELETE
< DE L'ENREGISTREMENT)
< - CLOSE SAVE ENREGISTREMENT,
< (ABANDON PROVISOIRE DE L'ENREGISTREMENT, LA CLEF
< ETANT CONSERVEE DANS LE CATALOGUE)
< - LECTURE SEQUENTIELLE ENREGISTREMENT,
< (LECTURE EN SEQUENTIEL D'1 SECTEUR DE L'ENREGISTREMENT)
< - LECTURE SEQUENTIELLE ET DELETE ENREGISTREMENT,
< (LECTURE EN SEQUENTIEL D'1 SECTEUR DE L'ENREGISTRE-
< MENT ET RELEASE DU SECTEUR LU)
< - ECRITURE SEQUENTIELLE.
< (ECRITURE EN SEQUENTIEL D'1 SECTEUR DE L'ENRE-
< GISTREMENT)
<
<
< ARGUMENTS :
< 1- ECRITURE, LECTURE (-DELETE) :
< (AMDEM)=ADRESSE OCTET DU BUFFER DU DEMANDEUR,
< (CODEM)=NBRE D'OCTETS A ECHANGER+2
< POUR LE CHAINAGE SEQUENTIEL DES
< ENREGISTREMENTS PAR SGF (USAGE
< INTERNE MAIS PREVU PAR L'UTILISATEUR)
< 2- OPEN (NEW OU OLD) :
< (AMDEM)='PEK' DE LA CLEF,
< (CODEM)='PDK' DE LA CLEF.
< 3- AUTRES CAS : NEANT.
<
< DANS TOUS LES CAS, ON A DANS OPDEM LA FONCTION :
< BIT12-15=
< 0011 : OPEN NEXT,
< 0100 : OPEN NEW,
< 0101 : OPEN OLD,
< 0110 : CLOSE RELEASE,
< 0111 : CLOSE SAVE,
< 1000 : LECTURE,
< 1001 : LECTURE & DELETE,
< 0010 : ECRITURE.
< BIT0=0 : EN GENERAL,
< 1 : DANS LE CAS D'UNE ECRITURE DEMANDE DE
< DE PLUS EN CLOSE SAVE DE L'ENREGISTREMENT.
< (C'EST LE BIT 'EOF').
<
<
< NOTION D'ENREGISTREMENT LOGIQUE :
< ON APPELLE ENREGISTREMENT LOGIQUE UNE
< SUITE SEQUENTIELLE DE SECTEURS CHAINES. L'ACCES
< A UN ENREGISTREMENT LOGIQUE NE PEUT QU'ETRE
< QUE SEQUENTIEL.
< A CHAQUE ENREGISTREMENT LOGIQUE EST ASSOCIE
< UNE CLEF PERMETTANT UNE IDENTIFICATION BIUNIVOQUE.
< L'ACCES AUX CLEFS EST LUI DIRECT.
<
<
< RAPPEL :
< LE CHAINAGE SEQUENTIEL DES SECTEURS SE
< FAIT PAR LEUR MOT 0, LE NBRE D'OCTETS
< DISPONIBLES EST DONC DE 2*YY7*QUANTA-2.
<
<
< RESULTATS :
< AU RETOUR, ON TROUVE DANS 'ETAT0'
< LES CODES HEXA-DECIMAUX SUIVANTS :
<
< (CODES HEXADECIMAUX)
< 0000 : OK TOUT C'EST BIEN PASSE,
< 8000 : LA CLEF EXISTE DEJA, ALORS QU'UN OPEN NEW
< A ETE DEMANDE,
< 6000 : LA LISTE DES CLEFS EST VIDE, ALORS QU'UN
< CLOSE (SAVE/RELEASE), OU UN
< OPEN-OLD A ETE DEMANDE,
< OU FIN DE CATALOGUE DES CLEFS, ALORS
< QU'UN OPEN NEXT A ETE DEMANDE,
< 2000 : LA CLEF EST INEXISTANTE, ALORS QU'UN CLOSE
< (SAVE/RELEASE) OU UN OPEN-OLD A ETE
< DEMANDE,
< 4000 : LA CLEF N'EXISTE PAS, ET ON A PARCOURU
< TOUTE SA LISTE SEQUENTIELLE, ALORS QU'UN
< CLOSE (SAVE/RELEASE) OU UN OPEN-OLD A
< ETE DEMANDE,
< 0001 : OPEN ENREGISTREMENT (OLD/NEW) ALORS QU'IL
< Y EN A DEJA UN EN COURS,
< 0002 : CLOSE (RELEASE/SAVE) DEMANDE ALORS QU'IL
< N'Y A JAMAIS EU D'OPEN CORRESPONDANT,
< 0003 : ECRITURE DEMANDEE, ALORS QU'IL N'Y A
< PAS EU D'OPEN,
< 0004 : LECTURE DEMANDEE, ALORS QU'IL N'Y A PAS
< EU D'OPEN CORRESPONDANT,
< 0005 : DELETE DEMANDE, ALORS QU'IL N'Y A PAS
< EU D'OPEN,
< 0006 : LECTURE DEMANDEE, ALORS QUE L'ENREGISTREMENT
< EST SOIT VIDE, SOIT DEJA ENTIEREMENT LU.
< 0008 : UN OPEN (OLD/NEW) EST DEMANDE SUR UNE
< CLEF NEGATIVE OU NULLE.
< 0009 : OPEN-NEW DEMANDE AVEC UNE
< CLEF DE PDK IMPAIRE.
< 000A : DEMANDE SGF SUR UNE DCTF CREE PAR UNE
< AUTRE TACHE.
< 000B : L'OPEN ENREGISTREMENT DEMANDE EST IMPOS-
< SIBLE A REALISER ; IL S'AGIT D'UN CAS
< RARE CORRESPONDANT AU RECHARGEMENT DU
< SYSTEME (PLANTAGE, DEFSEC TROP LONG,...)
< ALORS QUE DES FICHIERS SONT OUVERTS : CES
< DERNIERS PEUVENT ETRE OUVERTS APRES
< RECHARGEMENT ; LES CLEFS RISQUENT ALORS
< DE CONTENIR NON PAS LES ADRESSES D'ENRE-
< GISTREMENT, MAIS LES ADRESSES DE DESCRIP-
< TEUR : ET C'EST CETTE ERREUR !!!
<
<
IF XXPL6-ECCED,,XEIF%,
IF ATTENTION : CODES ERRONNES !!!
XEIF%: VAL ENDIF
IF XXPL8-ECLV,,XEIF%,
IF ATTENTION : CODES ERRONES !!!
XEIF%: VAL ENDIF
IF XXPL9-ECCI2,,XEIF%,
IF ATTENTION : CODES ERRONES !!!
XEIF%: VAL ENDIF
IF XXPL10-ECCI1,,XEIF%,
IF ATTENTION : CODES ERRONES !!!
XEIF%: VAL ENDIF
<
<
< UTILISATION DE ETAT1 (ETAT+1) :
< ETAT1=K : IL N'Y A PAS EU D'OPEN ENREGISTREMENT
< (OLD/NEW),
< ETAT1=1 : UN OPEN ENREGISTREMENT (OLD/NEW) A EU
< LIEU.
<
<
< UTILISATION DE NSPDDR (ZONE VARIABLE) :
< - A L'OPEN FILE : NSPDDR<--(NS) DE LA TACHE
< FAISANT L'OPEN,
< - AU CLOSE FILE : NSPDDR<--0,
< - A TOUTE ENTREE DANS LE SGF :
< ON COMPARE (NS) & (NSPDDR).
<
<
< UTILISATION DU BIT15 DE PDK :
< A PRIORI UN PDK DOIT ETRE UN NBRE PAIR ;
< LE CATALOGUE DES CLEFS NE CONTIENT DONC QUE
< DES CLEFS PAIRES. LORSQUE L'ON VEUT RECHERCHER
< LA CLEF SUIVANTE D'UNE CLEF DONNE, IL
< SUFFIT DE CHERCHER A PLACER DANS LE CATALOGUE
< LA CLEF IMMEDIATEMENT SUPERIEURE A LA CLEF
< DONNEE ; AVEC CES CONVENTIONS DE PARITE,
< CETTE CLEF IMMEDIATEMENT SUPERIEURE S'OBTIENT
< EN RENDANT PDK IMPAIR...
<
<
< UTILISATION :
< (CLEFS,CLEFS+1) CONTIENT EN PERMANENCE LA
< CLEF COURANTE OU LA CLEF PRECEDENTE S'IL N'Y
< A PAS D'OPEN EN COURS.
< 1- OPEN-NEXT : ACCEDERA A LA CLEF SUIVANT CELLE
< CONTENUE DANS (CLEFS,CLEFS+1).
< OPEN-OLD AVEC UNE PDK IMPAIRE : DONNERA LA
< CLEF SUIVANT CELLE DONNEE EN ARG.
<
<
PAGE
<
<
< H A N D L E R G E N E R A L
< D E G E S T I O N D E F I C H I E R S :
<
<
< FONCTION :
< CE HANDLER EST CHARGE DE LA RECUPERATION
< DE LA FONCTION, ET DE L'APPEL DE LA ROUTINE SPECI-
< FIQUE. DE PLUS IL INITIALISE A ET B :
< (Y)=NOM DIRECT DU FICHIER.
< (A)=AMDEM (EVENTUEL PEK),
< (B)=CODEM (EVENTUEL PDK).
<
< DE PLUS, IL IGNORE NSPTYP QUI LUI EST TRANSMIS
< DANS A PAR HANDLR.
<
<
USE L,DCT0
USE W,DEM0
HDLFIL: EQU $
<
< TEST DE PROPRIETE DE LA 'DCTF' :
<
LA ARGDEM+ETADEM < ACCES NIVEAU DEMANDEUR.
CP VAR+NSPDDR < LE DEMANDEUR EST-IL CELUI QUI
< A FAIT L'OPEN...
JE E498 < OK, C'EST BON, ENTRONS DANS
< LE SGF.
<
< CAS OU LA TACHE DEMANDEUSE N'EST PAS CELLE QUI A FAIT
< L'OPEN DCTF, OU BIEN CAS D'UNE DEMANDE ARRIVANT APRES
< QUE CETTE MEME TACHE AIT FAIT UN CLOSE DCTF...
<
LYI ECEN
JMP E497
<
< ENTREE DANS LE SGF :
<
E498: EQU $
LXI MKESEF < MASQUE DE FONCTION.
LA ARGDEM+OPDEM
ANDR A,X < GENERATION D'UN INDEX D'AIGUILLAGE FONCTI
< FONCTION DE CE QUI EST DEMANDE.
LA ARGDEM+AMDEM
LB ARGDEM+CODEM
LY VAR+FILNOM < NOM DIRECT DU FICHIER DANS Y.
RQST &ASXSGF <<<<PHASE CRITIQUE DU SGF.
BSR &AFOFIL < EXECUTION DE LA FONCTION...
LAD &ASXSGF
BSR ARLSE
E497: EQU $
STY ETAT0 < LA CONDITION DE RETOUT (Y)
< EST SAUVEGARDEE DANS ETAT0.
RSR
PAGE
<
<
< F I L T R A G E E T S - F I L T R A G E D U S G F :
<
<
< FONCTION :
< CES ROUTINES SONT CHARGEES DE DE FILTRER LES
< DEMANDES QUI ARRIVENT SUR LE HANDLER SGF. EN
< EFFET DANS LE CAS OU UN ENREGISTREMENT EST VIDE,
< OU DANS LE CAS OU ON EST AU BOUT EN LECTURE,
< IL FAUT DIFFERER LES DEMANDES DE LECTURE,
< JUSQU'A CE QUE DES DEMANDES D'ECRITURE SOIENT
< APPARUES.
<
<
< ARGUMENT :
< (L)=ADRESSE DCTF.
<
<
USE L,DCT0
USE W,DEM0
FFILTR: EQU $
LA ARGDEM+OPDEM
ANDI MKESEF)MKOPDM < TEST DU BIT12.
JAE E411 < OK, PAS DE FILTRAGE (A=K),
< IL S'AGIT D'OPEN, CLOSE OU
< ECRITURE
<
< CAS D'UNE LECTURE OU D'UNE LECTUE-DELETE :
<
FSFILT: EQU $
<
< TEST DE PARTAGIBILITE DU FICHIER : EN
< EFFET SI LE FICHIER EST NON PARTAGEABLE
< IL NE FAUT PAS FILTRER, CAR UNE DEMANDE
< BLOQUEE LE SERAIT POUR L'ETERNITE, PERSONNE
< NE POUVANT LA DEBLOQUER.
<
LX VAR+FILNOM < (X)=NOM-DIRECT DU FICHIER.
LAI MTSGF < DEMANDE D'ETAT EN RETOUR.
BSR AMTEDF < RENVOIE : (A)=ETAT(FICHIER (X)).
TBT XBITF2 < TEST DU BIT PARTAGEABLE.
LAI NIL-ZERO < PAS DE FILTRAGE A PRIORI.
JC E411 < LE FICHIER ETANT NON PARTAGEABLE
< PAS DE FILTRAGE.
<
< CAS DES FICHIERS PARTAGEABLES :
<
LA VAR+NFILR < TEST DE L'ADRESSE DU PROCHAIN
< SECTEUR A LIRE.
AND INFINI
<
< ON A ICI :
< (A)=Q8000 : CELA SIGNIFIE QU'IL N'Y A PAS DE
< PROCHAIN SECTEUR A LIRE, IL FAUT DONC
< FILTRER LES DEMANDES DE LECTURE ET
< LECTURE-DELETE.
< (A)=K : CELA SIGNIFIE QU'IL Y A UN PROCHAIN
< SECTEUR A LIRE, DONC PAS DE FILTRAGE.
<
E411: EQU $
RSR < A EST OK (=K OU #0).
PAGE
<
<
< D E P L A C E M E N T D E S A R G U M E N T S
< D ' U N E D E M A N D E A U S G F V E R S
< U N E D E M A N D E D I S Q U E :
<
<
< FONCTION :
< TRANSFERT DES ARGUMENTS (AMDEM & CODEM) DE LA
< DEMANDE AU SGF VERS LA DEMANDE DISQUE DFILDK.
< DE PLUS EMPILE DE MANIERE CORRECTE W (@DEMANDE
< AU SGF) DANS LA PILE.
<
<
< ARGUMENT :
< (W)=ADRESSE DEMANDE AU SGF.
<
<
< RESULTAT :
< (W) DE LA DEMANDE AU SGF DANS LA PILE,
< (W)=ADRESSE DE DFILDK.
<
<
< A T T E N T I O N :
< DETRUIT LE REGISTRE 'A' !!!
<
<
USE L,DCT0
USE W,DEM0
DADF: EQU $
LA NSPTYP
TBT TYPAD < L'ADRESSE EST-ELLE BIEN EN OCTETS ???
JNC DADF1 < OUI, OK...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< VACHEMENT GAFFE (!?!??!), CAR EN
< EFFET A MAINTS ENDROITS, ON EXPLOITE
< 'AMDEM' EN LA SUPPOSANT A PRIORI EN
< ADRESSE OCTETS !!!
<
DADF1: EQU $
LA ARGDEM+AMDEM < ACCES A L'ADRESS D'OCTET DU
< BUFFER DEMANDEUR.
STA VAR+AFILDK+AMDEM
LRM A
WORD YY8Q < (A)=COMPTE D'OCTETS MAXIMUM.
CP ARGDEM+CODEM < VALIDATION DU CODEM...
JGE SYSRD6 < OK, CODEM<== YY7*2*QUANTA.
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< EN REALITE CE N'EST PAS UNE
< ERREUR, ON POURRA RELANCER
< LE SYSTEME, A CONDITION DE METTRE
< AU PREALABLE DANS LE 'CODEM' LA
< VALEUR 'YY8*QUANTA'='YY8Q'...
<
LRM A
WORD YY8Q
STA ARGDEM+CODEM < ET VOILA, C'EST PLUS SUR EN LE
< PROGRAMMANT...
SYSRD6: EQU $
LA ARGDEM+CODEM < (A)=COMPTE D'OCTETS ARGUMENT.
<
<
< A T T E N T I O N :
< 1 MOT (2 OCTETS) DOIT ETRE
< RESERVE EN TETE DE CHAQUE BUFFER SGF
< POUR LE MOT DE CHAINAGE SEQUENTIEL.
< CE MOT DOIT ETRE INCLU DANS LE COMPTE
< D'OCTETS DE LA DEMANDE SGF, MAIS DOIT
< ETRE LIBRE DE TOUTE INFORMATION, SOUS
< PEINE DE SA DESTRUCTION...
<
<
STA VAR+AFILDK+CODEM
LA ARGDEM+OPDEM < ACCES A LA FONCTION.
ANDI FGR?FGW < (A)=K SI LECTURE, (A)=2 SI ECRITURE.
STA VAR+AFILDK+OPDEM
PLR A < 'A' RECOIT LE 'P' DE RETOUR DE DADF.
PSR W < SAVE (W)=@DEMANDE AU SGF.
PSR A < REMISE DU 'P' DE RETOUR EN PILE.
LAD VAR+DFILDK
LR A,W < (W)=@DFILDK.
RSR
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 A V E C
< O U S A N S A T T E N T E :
<
<
< ARGUMENTS :
< (W)=ADRESSE DEMANDE D'E/S (DFILDK),
< (X)=ADRESSE DU SECTEUR A ECHANGER (SUR 'DKM').
< (Y)=K SI ATTENTE DE FIN D'ENTREE-SORTIE,
< =1 SI PAS D'ATTENTE.
<
<
XXGF2:: VAL K < ATTENTE DE FIN D'E/S,
XXGF3:: VAL XXGF2+I < PAS D'ATTENTE DE FIN D'E/S.
<
<
< PHILOSOPHIE DU MODE PRIORITAIRE :
< IL EST POSSIBLE DE RELEASER UN SECTEUR
< APRE AVOIR LANCER UNE E/S SANS ATTENTE
< SUR LUI, MAIS POUR EVITER QU'UNE
< AUTRE TACHE QUI SE L'AIT FAIT ALLOUER
< NE FASSE DESSUS UNE E/S PRIORITAIRE, IL
< FAUT QUE L'E/S PRECEDENT LE RELEASE SOIT
< ELLE-MEME PRIORITAIRE.
< C'EST POURQUOI ICI, LORSQU'UNE DEMANDE
< EST FAITE 'SANS ATTENTE', ON LUI DONNE
< LE MODE PRIORITAIRE.
<
<
USE W,DEM0
ELESS: EQU $
PSR A
<
< ENVOI DE LA DEMANDE :
<
STX ARGDEM+ASDEM < MISE EN PLACE DE L'ADRESSE
< SECTEUR DANS DFILDK
LBY NSPTYP < RECUPERATION DU NVP DKM/DKB.
XWOR%1: VAL MSPTYP=K < POSITION DU 'NSP'...
XWOR%1: VAL NBITMO-B-XWOR%1
SLLS PRIO-XWOR%1 < CADRAGE...
ADR Y,A < POSITIONNEMENT DU BIT DE MODE
< PRIORITAIRE A 0 OU 1 SUIVANT
< LA VALEUR DE Y
SLLS MSPTYP=K-PRIO+XWOR%1 < CADRAGE DU 'NSPTYP'.
STA NSPTYP
BSR ACHAND < ENVOI DE LA DEMANDE.
<
< TEST D'ATTENTE :
<
CPZR Y
JNE E413 < LE RETOUR IMMEDIAT EST DEMANDE.
<
< CAS OU L'ATTENTE EST DEMANDEE :
<
BSR AWAITR < ATTENTE AVEC DEBLOCAGE DU SGF.
E413: EQU $
<
< A PRIORI, ON INHIBE SYSTEMATIQUEMENT
< LA TRANSMISSION DE (SLO,SLE) PAR LE 'SGF' :
<
LA BITSEM
SBT BISOSE
STA BITSEM
PLR A
RSR
PAGE
<
<
< A L O C A T I O N - R E L E A S E
< S E C T E U R A V E C A T T E N T E :
<
<
< ARGUMENT :
< CODEM(DFILS)=NBRE DE SECTEURS A ALLOUER/RELEASER,
< BIT0(A)=K : RELEASER,
< =1 : ALLOUER,
XXGF1:: VAL L < DEFINITION DU BIT ALLOUER/RELEASER.
< BIT1-15(A)=ADRESSE MOT DE LA LISTE DES SECTEURS
< A ALLOUER/RELEASER.
<
<
< A T T E N T I O N :
< DETRUIT LE REGISTRE 'A' !!!
<
<
USE W,DEM0
USE L,DCT0
ELARS: EQU $
PSR W
TBT XXGF1 < TEST DU SENS ALLOUER/RELEASE.
RBT XXGF1 < RAZ DU BIT0 A PRIORI.
STA VAR+AFILS+AMDEM < MAJ DE DFILS.
LAD VAR+DFILS
LR A,W < (W)=@DEMANDE ALLOCATION/RELEASE.
LAI NSPREL
ADCR A < (A)=NSPGET/NSPREL SUIVANT QUE
< BIT0(A)=1 OU 0.
IF NSPGET-NSPREL-BIT,,XEIF%,
IF ATTENTION : LE 'ADCR' EST MAUVAIS !!!
XEIF%: VAL ENDIF
SWBR A,A
STA NSPTYP < MAJ DE LA DEMANDE.
BSR ACHAND < ENVOI DE LA DEMANDE.
BSR AWAITR < ATTENTE D'ALLOCATION/RELEASE
< AVEC DEBLOCAGE DU SGF.
PLR W
RSR
PAGE
<
<
< A C C E S A T P L O R S
< D ' U N O P E N - C L O S E
< E N R E G I S T R E M E N T :
<
<
< ARGUMENTS :
< (L)=ADRESSE DCTF.
<
<
< RESULTAT :
< (W)=ADRESSE DE LA TP DU FICHIER EN MEMOIRE.
<
<
USE L,DCT0
ACTP2: EQU $
PSR A,X
LX VAR+FILNOM < (X)=NOM-DIRECT DU FICHIER.
XWOR%1: VAL COSBT?XBITF3=FMASK(K=FCINST
XWOR%1: VAL COSBT?XBITF4=FMASK(K?XWOR%1=FCINST
LAI XWOR%1 < ETAT FICHIER 'TRAVAIL' POUR
< NE PAS AVOI D'ENNUIS.
BSR AACTP
<
< ON A ICI :
< (W)=ADRESSE DE LA TP DU FICHIER EN MEMOIRE.
<
PLR A,X
RSR
PAGE
<
<
< I N I T I A L I S A T I O N D ' U N O P E N
< E N R E G I S T R E M E N T :
<
<
< ARGUMENTS :
< (Y)=Q8000.OR.NOM-DIRECT SI OPEN NEW (INSERT),
< ='0800.OR.NOM-DIRECT SI OPEN OLD (TEST-OPEN),
< (L)=ADRESSE DCTF.
< (A,B)=LA CLEF.
<
<
< RESULTAT :
< (Y)=K SI OPEN AUTORISE,
< =1 SI OPEN IMPOSSIBLE UN OPEN AYANT
< DEJA EU LIEU.
< =8 SI OPEN IMPOSSIBLE CAR DEMANDE POUR UNE
< CLEF NEGATIVE OU NULLE.
< =11 : OPEN IMPOSSIBLE PARCEQUE LE FICHIER
< A DES PETITS PROBLEMES SUITE A UN
< RECHARGEMENT DU SYSTEME...
<
<
< A T T E N T I O N :
< DETRUIT LE REGISTRE 'X' !!!
<
<
< T R E S I M P O R T A N T :
< TANT QUE LA 'TP' DU FICHIER EST EN
< MEMOIRE, ON NE PEUT FAIRE DE RLSE
< SEXSGF DE DEBLOCAGE DU SGF...
< EN EFFET ON RISQUERAIT DE MODIFIER
< L'ETAT DES TP EN MEMOIRE...
<
<
USE L,DCT0
USE W,DEM0
OPN1: EQU $
<
< TEST D'UN EVENTUEL OPEN-ENREGISTREMENT EN COURS :
<
LX ETAT1
CPZR X
JE E414 < OK, ON PEUT OUVRIR.
<
< CAS OU IL Y A DEJA UN OPEN EN COURS :
<
LYI ECFC < ERREUR 'OPEN DEJA EN COURS'.
JMP E415XY
<
< VALIDATION DE LA CLEF (PEK) :
<
E414: EQU $
LXI K < INITIALISATION DU COMPTE DE BITS A 1.
TBT BXKE0 < BIT LIBRE/OCCUPE.
ADCR X
TBT BXKE1 < BIT DE DEBORDEMENT.
ADCR X
TBT BXKE2 < BIT DE DERNIER DESCRIPTEUR.
ADCR X
TBT NBITMO+BXKE4 < BIT IN USE/IDLE.
ADCR X
CPZR X < X-A-T'IL AU MOINS UN BIT A 1 ???
JE E466 < NON, ILS SONT TOUS A 0, LA CLEF
< PARAIT BONNE... (A NOTER QU'ELLE
< PEUT AVOIR UNE 'PEK' NULLE : CECI DANS
< LE CAS D'UN OPEN 'NEXT'...
LYI ECEC1 < ERREUR CLEF NEGATIVE OU NULLE.
JMP E415XY
<
< CAS OU L'OPEN EST POSSIBLE :
<
E466: EQU $
BSR AADESC < ALLOCATION D'UN DESCRIPTEUR
< D'ENREGISTREMENT.
LX VAR+AFILT < RECUPERATION DE L'ADRESSE
< DU DESCRIPTEUR D'ENREGISTREMENT
< ALLOUE.
STX TEST1 < POUR MISE A JOUR DU DESCRIPTEUR
< DE LA CLEF (A,B).
PSR W
BSR AACTP2 < ACCES A LA TP DU FICHIER DANS W.
BSR APLSC < ARGUMENTS : A,B,Y,W.
PLR W
<
< TEST DES CONDITIONS DE RETOUR DE PLSC :
<
CPZR Y
JE E415 < OK, L'OPEN EST BON.
<
< CAS OU L'OPEN NE PEUT AVOIR LIEU :
<
E415Y: EQU $
BSR ARDESC < RELEASE DU DESCRIPTEUR
< D'ENREGISTREMENT.
JMP E415XY < Y CONTIENT LE CODE ERREUR.
<
< CAS OU L'OPEN PEUT AVOIR LIEU :
<
E415: EQU $
LA PEK < EN FAIT PEK&PDK N'ONT ETE
< MODIFIES QUE SI L'ON A FAIT
< UN OPEN-NEXT.
LB PDK < (ALORS PLSC A MODIFI PEK ET PDK).
STA VAR+CLEFS+CLEFSE < SAUVEGADRE DE LA CLEF DANS LA
STB VAR+CLEFS+CLEFSD < 'DCTSGF'.
BXKE44:: VAL BXKE4 < BXKE44 PERMET DE PRECISER RAPIDEMENT
< LA VALEUR DE LA 'PDK' :
< 0 : (PDK)=K (CAS FREQUENT),
< 1 : (PDK)#0...
CPZR B < COMMENT EST LA 'PDK' ???
JE E415XX < NULLE, YOUPI...
SBT BXKE44 < NON, ALORS ON LE MENTIONNE DANS 'PEK'...
E415XX: EQU $
XR A,X
BSR ASTBOX < MISE EVENTUELLE DANS LA 'BOX' DE
< 'PEK' ET DE 'BXKE44'.
XR A,X
IF BXKE44-BXKE0,,XEIF%,
IF ATTENTION : 'BXKE44' EST MAL CHOISI !!!
XEIF%: VAL ENDIF
<
< MISE EN RESIDENT DU DESCRIPTEUR DE L'ENREGISTREMENT ASSOCIE
< A LA CLEF (A,B) :
<
LA TEST1
JAL E415X < ILS'AGIT BIEN D'UNE ADRESSE DE
< SECTEUR DISQUE 'DKM'...
CP NSMGB < L'ADRESSE PRESUMEE (A) EST-ELLE
< BIEN DANS L'ESPACE ALLOUABLE DE 'DKM' ???
IF XDKSYM,,XEIF%,
IF ATTENTION : LES 2 TESTS CI-DESSUS SONT MAUVAIS !!!
XEIF%: VAL ENDIF
JGE E415X < OUI, C'EST BIEN UNE ADRESSE DISQUE...
LYI ECDSYS < NON, 'OPEN' REFUSE...
JMP E415Y < ET ON ARRETE LA...
E415X: EQU $
IC ETAT1 < MEMORISATION D'UN OPEN ENREGIS-
< TREMENT EN COURS...
STA &VAR+AFILT < MAJ DE LA TETE DE L'ENREGISTREMENT.
LA TEST2
STA &VAR+AFILQ < MAJ DE LA QUEUE DE L'ENREGISTREMENT.
LA INFINI
STA VAR+NFILW < INITIALISATION DE L'ADRESSE DU
< PROCHAIN SECTEUR A ECRIRE.
E415XY: EQU $ < SORTIE...
RSR
PAGE
<
<
< O P E N - O L D 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)=LA CLEF.
<
<
USE L,DCT0
USE W,DEM0
OPNOK: EQU $
JALE OPNOK1 < POUAHHH... (PEK<=0)
CP C1FFF < VALIDATION SUPERIEURE...
JLE OPNOK3 < OK...
OPNOK1: EQU $
LYI ECEC1 < (Y)=CODE D'ERREUR...
JMP E416XX < VERS LA SORTIE...
OPNOK3: EQU $
TBT NBITMO+BXKE4 < LE BIT 'BXKE4' DE 'PDK' DOIT ETRE A 0 :
JNC OPNOK4 < EFFECTIVEMENT...
LYI ECEC2 < (Y)=CODE D'ERREUR...
JMP E416XX < VERS LA SORTIE...
OPNOK4: EQU $
<
< TRONC COMMUN "OPEN OLD" ET "OPEN NEXT" :
<
OPNONK: EQU $
XWOR%1: VAL COSBT?BXPL2=FMASK(K=FCINST
XWOR%2: VAL MOCG=K
XWOR%2: VAL -XWOR%2 < POUR UN DECALAGE A DROITE...
LXI XWOR%1>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'<EOF>, 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)<XXTP+NSTP : LE SECTEUR DEMANDE
< PARTIENT DONC A 'DKF'...
E262X2: EQU $
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< BIEN EXAMINER L'ADRESSE SECTEUR (X)...
<
E262X3: EQU $
<
<
< C A S D E S S E C T E U R S D E ' D K F ' :
<
<
CPI FGR < EST-CE UNE LECTURE ???
LAD RTP < OUI A PRIORI : (A)=ADRESSE(RTP).
JE E262X4 < OUI...
LAD WTP < NON, (A)=ADRESSE(WTP)...
E262X4: EQU $
LR A,W < (W)=ADRESSE D'UNE DEMANDE DE LECTURE
< OU D'ECRITURE D'UNE 'TP'...
LB PLSCAM < (B)=ADRESSE OCTET DU BUFFER,
STB ARGDEM+AMDEM < QUE L'ON TRANSFERE DANS LA DEMANDE
< DE 'TP' VERS 'DKF'.
STX ARGDEM+ASDEM < DE MEME, ON MET EN PLACE L'ADRESSE
< SECTEUR DE LA 'TP' SUR 'DKA'...
BSR ACHAND < ENVOI DE LA DEMANDE A 'DKA',
BSR ACHANW < ET ATTENTE DE FIN D'OPERATION...
JMP E262X7 < VERS LA SORTIE...
<
<
< C A S D E S S E C T E U R S ' D K M ' :
<
<
E262X1: EQU $
<
< GENERATION DE 'PLSCDK' :
<
STA PLSCDK+T+OPDEM < MISE A JOUR DE LA DEMANDE.
LR X,A < (A)=ADRESSE DU SECTEUR 'DKM'...
CP INFINI
JE E262X6 < DANS LE CAS DE L'INFINI, C'EST
< QU'IL Y A EU UNE ERREUR DE LECTURE
< DISQUE AU PREALABLE ; ON VA SIMULER
< UNE LECTURE TRUANDE...
STX PLSCAS < ADRESSE SECTEUR
LAI NSPDKB < DANS TOUS LES CAS, ON DEMANDE
< 'DKB' QUI SRRA PEUT-ETRE UTILISE
< EN TRANSPARENT.
XWOR%1: VAL MSPTYP=K
XWOR%1: VAL NBITMO-XWOR%1
SBT PRIO-XWOR%1 < MODE PRIORITAIRE.
SWBR A,A < LE NSP EST MIS DANS L'OCTET
< GAUCHE DE 'A',
STA PLSCDK+XXNSP < MISE A JOUR DE LA DEMANDE.
<
< VALIDATION "PRIMITIVE" DE
< CE QUE L'ON VA ECRIRE, S'IL
< S'AGIT D'UNE ECRITURE :
<
TBT TYPAD < L'ADRESSE DU BUFFER EST-ELLE D'OCTETS
< OU DE MOTS ???
LA PLSCDK+T+AMDEM < (A)=ADRESSE-MOT A PRIORI...
JC E262X5 < EFFECTIVEMENT...
SLRS NOCMO=K < (A)=ADRESSE-OCTET CONVERTIE EN MOTS...
E262X5: EQU $
LR A,W < (W)=ADRESSE DU PREMIER MOT DU BUFFER.
LA PLSCDK+T+OPDEM < (A)=FONCTION DEMANDEE :
CPI FGW < EST-CE UNE ECRITURE ???
JNE E262XA < NON, RIEN A VALIDER AVANT L'OPERATION...
IF XCHSGF-XXSFS,,XEIF%,
IF ATTENTION : LE CHAINAGE DE TYPE 'NEXT' DOIT ETRE
IF TOUJOURS A LA MEME PLACE (EN FAIT, CE TEST EST
IF INUTILE, CAR ON NE PASSE ICI QUE POUR DES
IF SECTEURS DE LISTE DE CLEFS...) !!!
XEIF%: VAL ENDIF
XWOR%1: VAL XCHSGF?XXSFS
LA XWOR%1,W < (A)=VALEUR DU CHAINAGE DE TYPE 'NEXT'
< DU SECTEUR COURANT A ECRIRE...
SLRS DECON < (A)=NUMERO PAR RAPPORT A 0 DE SON 'GB' :
CPI XDKSYM < NE SERAIT-CE PAS CELUI DE LA SIMULATION
< DE 'DKF' SUR 'DKM' ???
JNE E262XB < NON, ON ADMET QUE C'EST BON...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE ???
< ALLER EXAMINER LE BUFFER DONT
< L'ADRESSE EST DANS 'W', ET VOIR
< CE QU'IL CONTIENT, ET PEUT-ETRE
< LE CORRIGER !!!
<
E262XB: EQU $
E262XA: EQU $
LR W,B < (B)=SAUVEGARDE DE L'ADRESSE DU BUFFER...
<
< ENVOI DE LA DEMANDE 'PLSCDK' :
<
LAD PLSCDK
LR A,W < (W)=ADRESSE DE LA DEMANDE ARGUMENT.
BSR ACHAND < ENVOI DE LA DEMANDE A 'DKB', ET
BSR ACHANW < ATTENTE DE FIN D'OPERATION
< POUR LE COMPTE DU DEMANDEUR.
<
< VALIDATION "PRIMITIVE" DE
< CE QUE L'ON A LU, S'IL
< S'AGIT D'UNE LECTURE :
<
LA PLSCDK+T+OPDEM < (A)=FONCTION REMPLIE :
CPI FGR < FUSSE UNE LECTURE ???
JNE E262XC < NON, RIEN A VALIDER...
LR B,W < OUI :
< (W)=ADRESSE DU BUFFER :
LA XWOR%1,W < (A)=CHAINAGE 'NEXT' PRESUME,
SLRS DECON < (A)=NUMERO PAR RAPPORT A 0 DU 'GB'
< D'APPARTENANCE DE CE CHAINAGE :
CPI XDKSYM < NE SERAIT-CE PAS LE 'GB' DE SIMULATION
< DE 'DKF' SUR 'DKM' ???
JNE E262XD < NON, ON ADMET QUE C'EST BON...
BSR ASYSER < E R R E U R S Y S T E M E ...
<
< QUE FAIRE :
< ALLER VOIR LA MEMOIRE VIRTUELLE
< 'DKB' SI CE FICHIER Y AVAIT DROIT
< (VOIR LA LISTE 'TNSPF' INDEXEE PAR
< LE 'NSPF'), ET COMPARER LA PAGE
< VIRTUELLE ; SINON, ALLER VOIR CE
< QU'IL Y A SUR 'DKM' !!!
<
E262XD: EQU $
E262XC: EQU $
<
<
< S O R T I E C O M M U N E ' D K A ' / ' D K B ' :
<
<
E262X7: EQU $ < CAS DES SORTIES SIMULEES...
PLR A,B,W
RSR
<
<
< C A S D E S S U I T E S D ' U N E E R R E U R
< A N T E R I E U R E D E L E C T U R E :
<
<
E262X6: EQU $
PSR X,L
LA PLSCAM
SLRS NOCMO=K
LR A,L < (L)=ADRESSE MOT DU BUFFER DE LECTURE...
LAI K
XWOR%1: VAL MOCG=K
XWOR%2: VAL W>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 © Jean-François COLONNA, 2011-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2011-2024.