< 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.