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