<        S I S   C M S 5   5
         PAGE
         PAGE
<
<
<        D C T   D E   D I A L O G U E
<        M A I T R E  -->  E S C L A V E  :
<
<
DCTPR1:  EQU         $
DCTPP1:  EQU         DCTPR1          < CREE POUR DES RAISONS D'ASSEMBLAGE
                                     < ET D'EDITION DE LIENS.
PSTPR1:  WORD        K;K;K;K;COM+DEPCS;DCTPR1;NIL;PILPR1;HANDLR;SMST;SO;SE
       #@ASCI        " PR1"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR          < FILTRE.
         WORD        FILTRS          < S-FILTRE.
         WORD        XTALOC          < ETALOC.
         WORD        XXLOC0          < SEMLOC.
         DZS         LSEM
         WORD        NIL             < TETE.
         WORD        NIL             < QUEUE.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLPR1          < HANDLER DE DIALOGUE MAITRE --> ESCLAVE.
         WORD        ITPR1           < TRAITEMENT DES IT (PAR 'IPI').
         WORD        K;K             < ETAT.
         WORD        XBITS0          < BITSEM.
         WORD        XXNTRY;TRYVID   < NTRIES & FRTRY.
         WORD        K               < HSTATS.
         WORD        8               < TESTO#0 : TESTER LES TIME-OUT...
         WORD        XXDCTF          < 'DCT' NON CONNECTABLE...
         WORD        XFONBA          < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
<        Z O N E   V A R I A B L E  :
<
<
VARPR1:  EQU         $
         IF          VARPR1-DCTPR1-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
< FONCTIONS RECONNUES :
<
XWOR%1:  VAL         K               < INITIALISATION DU CUMUL.
FPRIN::  VAL         FGR             < FONCTION 'MVTM' : MOUVEMENT DE ZONES
                                     < RELATIVES VERS DES ZONES ABSOLUES.
XWOR%1:  VAL         COSBT?FPRIN=FMASK(K?XWOR%1=FCINST
FPROUT:: VAL         FGW             < FONCTION 'MVTS' : MOUVEMENT DE ZONES
                                     < ABSOLUES VERS DES ZONES RELATIVES.
XWOR%1:  VAL         COSBT?FPROUT=FMASK(K?XWOR%1=FCINST
         WORD        XWOR%1
PRFON::  VAL         $-D-VARPR1      < LISTE DES FONCTIONS DE DIALOGUE
                                     < MAITRE --> ESCLAVE RECONNUES.
         WORD        PRSP,X
APRSP::  VAL         $-D-VARPR1      < LISTE DES MODULES SPECIFIQUES.
<
< SYNCHRONISATION MAITRE --> ESCLAVE :
<
XXRAF0:: VAL         K               < CODE "RIEN A FAIRE POUR L'ESCLAVE"...
         IF          XXRAF0-K,,XEIF%,
         IF          ATTENTION : CA VA MERDER !!!
XEIF%:   VAL         ENDIF
         WORD        XXRAF0          < 0 : RIEN A FAIRE POUR L'ESCLAVE,
                                     < -1 : FIN DE SERVICE NON ENCORE
                                     <      ACQUITTE PAR LE MAITRE,
                                     < +1 : QUELQUE CHOSE A FAIRE POUR
                                     <      L'ESCLAVE (DEMANDE DE TETE).
PRIND::  VAL         $-D-VARPR1      < MOT DE SYNCHRONISATION DU MAITRE
                                     < ET DE L'ESCLAVE.
         WORD        NIL
PRSAVW:: VAL         $-D-VARPR1      < POUR TRANSMETTRE L'ADRESSE DE LA
                                     < DEMANDE DE TETE...
<
< SYNCHRONISATION DE L'ESCLAVE SUR L'HORLOGE :
<
         WORD        EATCOP
FATCOP:: VAL         $-D-VARPR1      < RELAI VERS LA PATTERN CYCLIQUE DE
                                     < L'HORLOGE INDIQUANT LE TYPE DE COPY
                                     < A FAIRE A L'INSTANT T.
         WORD        NILK
SATCOP:: VAL         $-D-VARPR1      < SAUVEGARDE DE LA PATTERN CYCLIQUE
                                     < PRECEDENTE.
<
< ACCES AU 'CBJ' DU SYSTEME
< 'TV' MOYENNE DEFINITION :
<
         WORD        ACCBJ?FPHIN
PRCBJ::  VAL         $-D-VARPR1      < LECTURE DU MOT D'ETAT2 DU 'CBJ'.
         WORD        ACCBJ?FPHETB
PRCBJI:: VAL         $-D-VARPR1      < LECTURE DU MOT D'ETAT1 DU 'CBJ'.
         WORD        ACCBJ?FPHCMD
PRCBJC:: VAL         $-D-VARPR1      < ENVOI D'UNE COMMANDE AU 'CBJ'.
<
< PREPARATION DU 'IM' MAITRE :
<
         WORD        RIMMST
PIMMST:: VAL         $-D-VARPR1      < ADRESSE DE LA VALEUR DU REGISTRE 'IM'
                                     < DU PROCESSEUR MAITRE ; EN GENERAL, SEUL
                                     < LE PUPITRE EST MASQUE, MAIS IL SE PEUT
                                     < AUSSI QUE LE 'CBJ' LE SOIT, S'IL EST
                                     < ABSENT OU EN DEFAUT...
<
< ACCES AU 'CBM' DU SYSTEME
< 'TV' BASSE DEFINITION :
<
         WORD        ACCBM?FPHIN
PRCBM::  VAL         $-D-VARPR1      < LECTURE DU MOT D'ETAT2 DU 'CBM'.
         WORD        ACCBM?FPHETB
PRCBMI:: VAL         $-D-VARPR1      < LECTURE DU MOT D'ETAT1 DU 'CBM'.
         WORD        ACCBM?FPHCMD
PRCBMC:: VAL         $-D-VARPR1      < ENVOI D'UNE COMMANDE AU 'CBM'.
<
< TRAITEMENT DES 'SYSERS' SUR LE PROCESSEUR ESCLAVE :
<
         WORD        SYSEP
ASYSEP:: VAL         $-D-VARPR1      < SOUS-PROGRAMME DES SYSERS ESCLAVE...
<
< TRAITEMENT DU DEFAUT SECTEUR, ET COPY :
<
         WORD        PRDEF
APRDEF:: VAL         $-D-VARPR1      < SOUS-PROGRAMME DE TEST DES DEFAUTS
                                     < SECTEUR EN ATTENTE ET TRAITEMENT DE
                                     < CELUI-CI PUIS RESTART DE L'ESCLAVE.
         WORD        PRDEF1
APRDE1:: VAL         $-D-VARPR1      < BRANCHEMENT AU CAS OU IL N'Y A PAS
                                     < DE DEFAUT SECTEUR EN ATTENTE...
         WORD        PILPT1
PRSAVK:: VAL         $-D-VARPR1      < ZONE DE SAUVEGARDE DU REGISTRE 'K'
                                     < LORS D'UN DEFAUT SECTEUR, ET VALEUR
                                     < INITIALE DU REGISTRE 'K' DE L'ESCLAVE
                                     < POUR LE PREMIER RESTART.
XWOR%1:  VAL         COSBT?MS=FMASK(K=FCINST
XWOR%1:  VAL         COSBT?WARNG=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?IOM=FMASK(K?XWOR%1=FCINST
SAVST0:: VAL         XWOR%1          < BITS OBLIGATOIREMENT A 1 DANS 'ST' APRES
                                     < UN DEFAUT SECTEUR SUR LE PROCESSEUR
                                     < ESCLAVE.
         WORD        SAVST0
PRSAVS:: VAL         $-D-VARPR1      < VALEUR DE 'ST' LORS D'UN DEFAUT SECTEUR.
         WORD        KOPY
APCOPY:: VAL         $-D-VARPR1      < SOUS-PROGRAMME DE PREPARATION DES
                                     < INFORMATIONS DE COPY.
<
< DONNEES DES 'MOVE' :
<
K64::    VAL         XX64K           < DEFINIE LA CONSTANTE 64K...
KSIMS::  VAL         XX64K/2+XX64K   < DEFINITION DU DEBUT DE LA ZONE DE
                                     < SIMULATION DU SWAPPING EN MEMOIRE.
XWOR%1:  VAL         XPESC           < TAILLE EN 'K-MOTS' DES STACKS UTILISES
                                     < POUR LA MEMOIRE...
         WORD        KSIMS>DADR*LK
XWOR%7:  VAL         KSIMS
         NTRN
XWOR%8:  VAL         XWOR%7/XPESC
         TRN
         IF          XWOR%8*XPESC-XWOR%7,,XEIF%,
         IF          ATTENTION : LE DEBUT DE LA ZONE DE SWAPPING
         IF          SUR 'PR1' DOIT AU MOINS ETRE A UNE FRONTIERE
         IF          DE 32K, AFIN QUE LES ESPACES UTILISATEURS EN
         IF          MEMOIRE HAUTE NE SOIENT PAS A CHEVAL SUR DES
         IF          FRONTIERES DE 64K !!!
XEIF%:   VAL         ENDIF
PRMEM::  VAL         $-D-VARPR1      < PREMIERE ADRESSE MEMOIRE SUPERIEURE
                                     < A 64K DISPONIBLE POUR LE SWAPPING
                                     < MEMOIRE-MEMOIRE EN MULTIPLE DE 16 MOTS.
         IF          KSIMS-K64,,XEIF%,XEIF%
         IF          ATTENTION : LA DEFINITION DU DEBUT DE LA ZONE
         IF          DE SIMULATION DU SWAPPING EN MEMOIRE EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
         WORD        XKMEMX>DADR*LK
PRMAX::  VAL         $-D-VARPR1      < ADRESSE PRESUMEE DE LA PREMIERE
                                     < MEMOIRE INEXISTANTE ; CETTE VALEUR
                                     < EST EN FAIT DETERMINEE LORS DE LA
                                     < PROCEDURE DE RESTART...
         WORD        LK
PR1K::   VAL         $-D-VARPR1      < 1K MOTS...
         WORD        NILK
PRLON::  VAL         $-D-VARPR1      < 'YY7' MOTS OU 1K MOTS...
         WORD        TCPROG*YY7>DADR
PRLZE::  VAL         $-D-VARPR1      < LONGUEUR EN DADR-MOTS DE LA ZONE DE
                                     < SWAPPING D'UN ESCLAVE.
         WORD        TZSWAP
TASWAP:: VAL         $-D-VARPR1      < NOMBRE DE SECTEURS OCCUPES PAR LA ZONE
                                     < DE SWAPPING D'UN UTILISATEUR SUR 'DKS',
         WORD        TCPROG
TAPROG:: VAL         $-D-VARPR1      < NOMBRE DE SECTEURS OCCUPES PAR LA ZONE
                                     < DE SWAPPING D'UN UTILISATEUR SUR 'PR1'.
<
< LISTE DES SOUS-PROGRAMMES SPECIFIQUES (FONCTIONS) :
<
PRSP:    EQU         $
         IF          $-PRSP-FPRIN,,XEIF%,
         IF          ATTENTION : LA VALEUR 'FPRIN' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
         WORD        PRMOV           < 'FPRIN'
         WORD        PRDEF
         IF          $-PRSP-FPROUT,,XEIF%,
         IF          ATTENTION : LA VALEUR 'FPROUT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
         WORD        PRMOV           < 'FPROUT'
         WORD        PRDEF
         WORD        PRDEF
         WORD        PRDEF
         WORD        PRDEF
         WORD        PRDEF
         WORD        PRDEF
         WORD        PRDEF
         WORD        PRDEF
         WORD        PRDEF
         WORD        PRDEF
         WORD        PRDEF
         WORD        PRDEF
         WORD        PRDEF
<
<
<        P I L E   D U   D I A L O G U E
<        M A I T R E   -->   E S C L A V E  :
<
<
         CALL        #SISP CMS5 DOL2#
PILPR1:  EQU         $-DEPILE
XWPILE:  VAL         LPILEH+8
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        D I A L O G U E   M A I T R E  -->  E S C L A V E  :
<
<
<        FONCTION :
<                      CE HANDLER RECOIT LES DEMANDES DE
<                    SERVICE QUE LE PROCESSEUR MAITRE DESIRE
<                    SOUMETTRE AU PROCESSEUR ESCLAVE ; SA
<                    FONCTION EST SIMPLE : IL POSITIONNE
<                    UN INDICATEUR ('PRIND') SUR LEQUEL LE
<                    PROCESSEUR ESCLAVE VIENT SE SYNCHRONISER,
<                    PUIS SE MET EN ATTENTE DE FIN DE SERVICE
<                    (SUR 'SIT'), ET C'EST TOUT.
<                      SI LE PROCESSEUR ESCLAVE EST
<                    ABSENT ('PRINEX'), C'EST 'HDLPR1'
<                    QUI EXECUTE DIRECTEMENT LES
<                    MODULES SPECIFIQUES CONCERNES.
<
<
<        FONCTIONS RECONNUES :
<                    FPRIN : MOVE 'MVTM' ; IL PERMET DE SIMULER
<                            EN MEMOIRE LES SWAPPINGS 'IN'.
<                    FPROUT : MOVE 'MVTS' ; IL PERMET DE SIMULER
<                             EN MEMOIRE LES SWAPPINGS 'OUT'.
<
<
<        RESULTAT :
<                    ETAT0=K : TOUT EST OK...
<                          -1 : TIME OUT SUR L'ESCLAVE (IL DOIT
<                               ETRE ABSENT, LE PAUVRE...).
<                          +1 : FONCTION INEXISTANTE...
<
<
<        PASSAGE DES ARGUMENTS MAITRE --> ESCLAVE :
<                      L'ESCLAVE PREND SES ARGUMENTS DANS
<                    LA DEMANDE DE TETE SUR 'HDLPR1', DONT
<                    L'ADRESSE EST TRANSMISE PAR 'PRSAVW'
<                    PLUTOT QUE PAR 'TETE', ON NE SAIT JAMAIS...
<
<
         USE         L,DCT0
         USE         W,DEM0
HDLPR1:  EQU         $
         STZ         ETAT0           < REINITIALISATION A PRIORI (A CAUSE
                                     < DE LA DETECTION DES TIME OUT).
<
< DEFINITION DES CODES DE SYNCHRONISATION :
<
XPRCSI:: VAL         K               < L'ESCLAVE EST 'IDLE'...
         IF          XPRCSI-K,,XEIF%,
         IF          ATTENTION : 'XPRCSI' DOIT ETRE NUL !!!
XEIF%:   VAL         ENDIF
XPRCSA:: VAL         1               < L'ESCLAVE A DU TRAVAIL ('ACTIF').
XPRCSF:: VAL         -1              < L'ESCLAVE A FINI (NON ACQUITTE).
<
< VALIDATION DE LA DEMANDE :
<
         LA          VAR+PRFON       < LISTE DES FONCTIONS RECONNUES,
         LX          ARGDEM+OPDEM    < (X)=FONCTION DEMANDEE,
         TBT         L,X             < EXISTE-T'ELLE ???
         JC          PR0001          < OUI, C'EST BON...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
         JMP         PR0003          < ET ON ARRETE LA...
<
< SYNCHRONISATION MAITRE --> ESCLAVE :
<
PR0001:  EQU         $
         LXI         PROESC
         CPZ         &SYSPRO         < LE PROCESSEUR ESCLAVE EXISTE-T'IL ???
         IF          PRINEX-K,XEIF%,,
         IF          ATTENTION : 'PRINEX' DOIT ETRE NEGATIF !!!
XEIF%:   VAL         ENDIF
         JGE         PR0010          < OUI...
<
<
<        P R O C E S S E U R   E S C L A V E   A B S E N T  :
<
<
         LX          ARGDEM+OPDEM    < (X)=FONCTION DEMANDEE,
         BSR         &VAR+APRSP      < VERS LES MODULES SPECIFIQUES...
         JMP         PR0004          < VERS LA SORTIE...
<
<
<        P R O C E S S E U R   E S C L A V E   P R E S E N T  :
<
<
PR0010:  EQU         $
         CPZ         VAR+PRIND       < L'ESCLAVE EST-IL BIEN LIBRE ???
         JE          PR0002          < OUI, OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
         STZ         VAR+PRIND       < REINITIALISATION DE L'INDICATEUR.
PR0002:  EQU         $
         LR          W,A             < (A)=ADRESSE DE LA DEMANDE ARGUMENT,
         STA         VAR+PRSAVW      < QUE L'ON TRANSMET A L'ESCLAVE...
         LAI         XPRCSA
         STA         VAR+PRIND       < +1 : ON AVERTIT L'ESCLAVE, QUI
                                     < PRENDRA SES ARGUMENTS DANS LA
                                     < DEMANDE DE TETE.
         RQST        SIT             < ET ON ATTEND : SOIT LA FIN DE SERVCE
                                     < (INTERUPTION 'IPI'), SOIT UNE
                                     < DETECTION DE TIME OUT...
<
< SORTIES DIVERSES :
<
PR0004:  EQU         $
         RSR
PR0003:  EQU         $
EPFI::   VAL         '01             < FONCTION INEXISTANTE.
         LAI         EPFI
         STA         ETAT0           < CODE D'ERREUR...
         JMP         PR0004          < ET C'EST TOUT...
<
<
<        R O U T I N E   D E S   I N T E R R U P T I O N S  :
<
<
<        FONCTION :
<                      CETTE ROUTINE EST APPELEE PAR
<                    DEUX MODULES DIFFERENTS :
<                    1 - PAR L'HORLOGE, SUR DETECTION DE
<                    TIME OUT ET ALORS (B)=1,
<                    2 - A CHACUNE DES SORTIES DE 'TH0'
<                    QU'ELLE AIT DETECTE UN 'IPI' OU
<                    PAS, ET CECI AFIN D'EVITER UN ALEAS
<                    DU A LA GESTION DES INTERRUPTIONS
<                    'IPI' ET ALORS (B)=K.
<                      CETTE ROUTINE REVEILLE LE
<                    HANDLER SI CELA EST NECESSAIRE
<                    (L'ESCLAVE A TERMINE UN SERVICE
<                    NON ENCORE ACQUITTE PAR LE MAITRE).
<
<
<        ARGUMENT :
<                    (B)=1 : APPEL POUR TIME OUT (HORLOGE),
<                      0 : APPEL NORMAL POUR 'IPI' (TH0).
<
<
ITPR1:   EQU         $
         CPZR        B               < EST-CE UN TIME OUT (B=K) ???
         JNE         PR0006          < OUI, ON REVEILLE DONC LE HANDLER DE
                                     < DIALOGUE QUELQUE SOIT 'PRIND'...
                                     < (NORMAL PARCEQUE L'ESCLAVE N'EST
                                     < PAS LA...)
         LA          VAR+PRIND       < ACCES A LA VARIABLE DE SYNCHRO,
         JAGE        PR0005          < L'ESCLAVE N'A RIEN A FAIRE (K),
                                     < OU BIEN IL EST EN COURS DE SERVICE (1).
PR0006:  EQU         $
         STZ         VAR+PRIND       < ACQUITTEMENT DE FIN DE SERVICE.
         BSR         ARVHDL          < ET REVEIL DU HANDLER...
PR0005:  EQU         $
         RSR
         PAGE
<
<
<        P I L E   P R O C E S S E U R   E S C L A V E  :
<
<
<        FONCTION :
<                      CETTE PILE CONTRAIREMENT A SON
<                    NOM NE SERT PAS A ALIMENTER LE
<                    PROCESSEUR ESCLAVE EN ELECTRICITE...
<                      ELLE CONTIENT DES VALEURS INI-
<                    TIALES PERMETTANT D'ASSIMILER LA
<                    PREMIERE INITIALISATION A UNE
<                    REAPPARITION DU SECTEUR...
<
<
         CALL        #SISP CMS5 CHECK#
PILPS1:  EQU         $
         WORD        PRESC2          < (P)=ADRESSE DE RETOUR (EN VUE D'UN 'RSR')
                                     < LORS DE LA PREMIERE INITIALISATION.
         WORD        K               < A,
         WORD        K               < B,
         WORD        K               < X,
         WORD        K               < Y,
         WORD        COM+DEPCS       < (C)=BASE DU SYSTEME.
         WORD        DCTPR1          < (L)=BASE DE LA DCT DE DIALOGUE.
         WORD        NIL             < W,
         WORD        NIL;NIL         < SLO & SLE.
PILPT1:  EQU         $-DEPILE        < VALEUR INITIALE A DONNER AU REGISTRE 'K'
                                     < DU PROCESSEUR ESCLAVE A LA PREMIERE
                                     < INITIALISATION.
XWPILE:  VAL         20-XXPILI       < ON TRICHE UN PEU POUR GENERER LA
                                     < PILE DU PROCESSEUR ESCLAVE ; ON UTILISE
                                     < 'GENPIL2' QUI GENERE UNE ZONE A L'USAGE
                                     < DU DEFAUT SECTEUR DU PROCESSEUR MAITRE
                                     < C'EST POURQUOI, ON RETRANCHE 'XXPILI'...
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        S Y S E R S   E S C L A V E  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME BLOQUE SUR LE
<                    TEST DU DEFAUT SECTEUR LE PROCESSEUR
<                    ESCLAVE LORSQUE CELUI-CI SE DETECTE
<                    EN DEFAUT ; LE DEBLOQUAGE ETANT MANUEL ;
<                    DE PLUS, LORSQUE LE PROCESSEUR ESCLAVE
<                    EST AUSSI L'"IOP", ON MASQUE TOUTES
<                    LES INTERRUPTIONS, AFIN QUE LE
<                    PROCESSEUR MAITRE DETECTE LE DEFAUT...
<                      DANS LE CAS OU LE PROCESSEUR ESCLAVE
<                    EST ABSENT, C'EST QU'ON SUR LE PROCESSEUR
<                    MAITRE SUR 'HDLPR1' ; C'EST ALORS UNE
<                    VRAIE 'SYSER' QUE L'ON FAIT...
<
<
<        NOTA :
<                      IL EST DES "JMP $" QUI SUBSISTENT :
<                    IL S'AGIT DE CEUX QUI SONT SITUES DANS
<                    LE SOUS-PROGRAMME 'PRDEF' LUI-MEME
<                    BIEN ENTENDU...
<
<
SYSEP:   EQU         $
         PSR         A,B,X
         LBI         K               < A PRIORI, (B)=K...
         LXI         PROESC
         LA          &SYSPRO
         IF          PRINEX-K,XEIF%,,
         IF          ATTENTION : 'PRINEX' DOIT ETRE NEGATIF !!!
XEIF%:   VAL         ENDIF
         JAL         SYSEP4          < LE PROCESSEUR ESCLAVE EST ABSENT...
<
< CAS OU LE PROCESSEUR ESCLAVE EST PRESENT :
<
         LXI         PROIOP
         CP          &SYSPRO         < L'ESCLAVE EST-IL L'"IOP" ???
         JNE         SYSEP3          < NON, (B)=K...
         SBT         NBITMO+IPM      < OUI,
         SBT         NBITMO+LCM      < ON FORCE 'IPM' ET 'LCM'...
SYSEP3:  EQU         $
         LR          B,A
         SST                         < MASQUAGE EVENTUEL DES 'IPI' ET 'LDC'...
                                     < (SI L'ESCLAVE EST L'"IOP" AFIN DE CREER
                                     < UN DEFAUT SUR LE MAITRE...)
SYSEP1:  EQU         $
         BSR         VAR+APRDEF      < TEST DU DEFAUT SECTEUR...
SYSEP2:  EQU         $               < ADRESSE DE DEBLOCAGE MANUEL...
         JMP         SYSEP1          < ET ON SE BLOQUE...
         LR          B,A             < (A)=LISTE DES BITS A DEMASQUER,
         RST                         < ET ON EFFACE EVENTUELLEMENT LE MASQUAGE
                                     < DES INTERRUPTIONS 'IPI' ET 'LDC'.
SYSEP5:  EQU         $
         PLR         A,B,X
         RSR
<
< CAS OU LE PROCESSEUR ESCLAVE EST ABSENT :
<
SYSEP4:  EQU         $
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
         JMP         SYSEP5          < VERS LA SORTIE...
         PAGE
<
<
<        T E S T   D E S   D E F A U T S   S E C T E U R S
<                  S U R   U N   E S C L A V E  :
<
<
<        FONCTION :
<                      TOUS LES PROCESSEURS DE CMS5 ONT
<                    LA MEME MEMOIRE DEBANALISEE AFIN
<                    D'ASSURER LEUR DIALOGUE, EN CONSEQUENCE
<                    DE QUOI, UN SEUL D'ENTRE EUX PEUT
<                    UTILISER LES CONTEXTES (TACHES SOFTS,
<                    ET INTERRUPTIONS) : C'EST LE PROCESSEUR
<                    MAITRE. LES PROCESSEURS ESCLAVES NE
<                    SERONT DONC PAS AVERTIS DES DEFAUTS
<                    SECTEUR (LEURS INTERRUPTIONS SONT
<                    MASQUEES) : ILS DEVRONT EUX-MEMES
<                    LES DETECTER, ET LES TRAITER !!!
<                      CE SOUS-PROGRAMME REGARDE DONC SI
<                    UN DEFAUT SECTEUR EST EN ATTENTE ;
<                    SI OUI, IL PREPARE LE RESTART, PUIS
<                    ARRETE SES CANAUX, EN PARTICULIER LES
<                    CANAUX 'HDC' (MEME S'ILS SONT DEJA
<                    INACTIFS...), ET ENFIN SE MET EN
<                    ATTENTE ('HALT')...
<
<
<        ATTENTION :
<                      CE SOUS-PROGRAMME DEVRA DONC
<                    ETRE APPELE REGULIEREMENT (AU MOINS
<                    TOUTES LES 5MS) !!!
<
<
PRDEF:   EQU         $
XKREG:   VAL         K               < INITIALISATION DU CUMUL DU NOMBRE
                                     < DES REGISTRES EMPILES.
       #@PSR         A               < #SISP CMS5 KREG#
         CPZ         DEFOK           < Y-A-T'IL DEFAUT SECTEUR ???
         JNE         PRDEFF          < OUI, ON LE TRAITE...
         BR          VAR+APRDE1      < NON, ON S'EN VA...
PRDEFF:  EQU         $
         CALL        #SISP CMS5 RST# < OUI, ON LIT 'ST',
         STA         VAR+PRSAVS      < QUE L'ON SAUVE IMMEDIATEMENT...
<
<        D E F A U T   S E C T E U R  :
<
XWOR%1:  VAL         COSBT?LCM=FMASK(K=FCINST
XWOR%1:  VAL         COSBT?IPM=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?IOM=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?DEBUG=FMASK(K?XWOR%1=FCINST
         LRM         A
         WORD        XWOR%1
         SST                         < ON FORCE LES BITS 'LCM', 'IPM', 'IOM', ET
                                     < 'DEBUG' POUR FAIRE COMME SI UN DEFAUT
                                     < SECTEUR AVAIT ETE VERITABLEMENT DETECTE
                                     < AINSI, ON BLOQUE LE CANAL 'LDC', ET
                                     < 'WARNG'+'DEBUG' INDIQUE QU'IL Y A
                                     < DEFAUT SECTEUR EN TRAITEMENT...
       #@PSR         B,X,Y,C,L,W     < #SISP CMS5 KREG#
         RDOE
       #@PSR         A,B             < #SISP CMS5 KREG#
         LRM         L
         WORD        DCTPR1          < A PRIORI : (L)=BASE DCTPR1.
         LR          K,A
         STA         VAR+PRSAVK      < SAUVEGARDE DE LA PILE 'K'.
XKREG:   VAL         -XKREG
         IF          PILPT1-PILPS1+DEPILE-D-XKREG,,XEIF%,
         IF          ATTENTION : LA PILE INITIALE 'PILPS1' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
< ARRET EVENTUEL DES CANAUX 'HDC' DE L'ESCLAVE :
<
NRHDC::  VAL         2               < NOMBRE DE JEUX DE REGISTRES 'HDC'.
XWOR%1:  VAL         COSBT?0=FMASK(K=FCINST
XWOR%1:  VAL         CORBT?4=FMASK(K?XWOR%1=FCINST
         LXI         NRHDC           < NOMBRE DE CONTEXTES.
PRDEFA:  EQU         $
         PSR         X
         LR          X,A
         SLLS        S               < DECALAGE POUR LE 'ROMB'...
         LR          A,X             < ON INDIQUE DANS 'X' QUEL EST LE
                                     < CONTEXTE 'HDC' A INHIBER...
         LRM         A,B,Y
         WORD        PRDEFB          < EN EFFET 'A' ET 'P' SONT ECHANGES !!!
         WORD        XWOR%1          < (B)=MOT D'INVALIDATION CANAL 'HDC'.
         WORD        ISPIE           < (Y)=ADRESSE DU MICRO-PROGRAMME.
         ROMB                        < ET ON ARRETE LES CANAUX 'HDC'...
PRDEFB:  EQU         $               < ADRESSE DE L'INSTRUCTION SUIVANT
                                     < LE 'ROMB'...
         PLR         X
         JDX         PRDEFA          < AU SUIVANT...
<
< ATTENTE DE LA DISPARITION DU COURANT :
<
         CALL        #SISP CMS5 RST#
         STA         VAR+PRSAVS      < ON SAUVEGARDE 'ST' JUSTE AVANT LE 'HALT'
                                     < AINSI, ON L'A SAUVEGARDE 2 FOIS DE
                                     < SUITE; LES DIFFERENCES DE BITS A 1 PER-
                                     < METTENT DE SAVOIR SI TOUT S'EST BIEN
                                     < PASSE...
         LXI         K               < (X)=INFINI...
PRDEFC:  EQU         $
         HALT                        < ET ON ATTEND LE DEFAUT SECTEUR,
         JMP         PRDEFC          < ???!??!??
<
<        R E S T A R T   O U   I N I T I A L I S A T I O N :
<
RESPR1:  EQU         $
<
< PREPARATION DU REGISTRE
< 'IM' DU MAITRE :
<
         LA          INFINI
         IF          BITPUP-BITSIG,,XEIF%,
         IF          ATTENTION : CE QUI PRECEDE EST IDIOT !!!
XEIF%:   VAL         ENDIF
         STA         &VAR+PIMMST     < ET TRANSMISSION...
<
< MISE EN OEUVRE DU 'CBJ' :
< (COUPLEUR DU SYSTEME DE
< TELEVISION MOYENNE DEFINITION)
<
SLOCBM:: VAL         'FF00           < VALEUR D'UN 'SLO' SPECIAL DESTINE A
                                     < POSITIONNER LE FILTRE D'ADRESSE DU 'CBM',
SLECBM:: VAL         SLOCBM+I        < ET VALEUR DU 'SLE' ASSOCIE...
         LRM         A,B
         WORD        SLOCBM          < (A)='SLO' SPECIAL DU 'CBM',
         WORD        SLECBM          < (B)='SLE' SPECIAL DU 'CBM',
         WOE                         < POSITIONNEMENT DE 'SLO' ET 'SLE'.
PRDEGH:  EQU         $               < ITERATION SUR ATTENTE DE JONCTION...
         SIO         VAR+PRCBJ       < LECTURE DU MOT D'ETAT2.
CBMDIS:: VAL         '00F0           < ARGUMENT D'UN ORDRE DE DISJONCTION,
         LAI         CBMDIS
         SIO         VAR+PRCBJC      < ON DISJOINT LE 'CBJ'.
CBMJON:: VAL         K               < ARGUMENT D'UN ORDRE DE JONCTION,
         LAI         CBMJON
         SIO         VAR+PRCBJC      < ON JOINT LE 'CBJ'.
         SIO         VAR+PRCBJ       < LECTURE DU MOT D'ETAT2,
         TBT         ETAOPE          < LE 'CBJ' EST-IL JOINT ET PRESENT ???
         JC          PRDEGG          < OUI, OK...
         JMP         $               < NON, ATTENTE DE PASSAGE EN AUTOMATIQUE
                                     < S'IL EST PRESENT...
         JMP         PRDEGH          < ET LORSQU'IL EST PASSE EN AUTOMATIQUE,
                                     < ON RETENTE LA JONCTION...
<*******************************************************************************
         LA          &VAR+PIMMST     < SI ON VEUT SAUTER LE 'STAR', ON VA
XWOR%1:  VAL         '0000000@@@@    < (RECUPERATION DU CODE GENERE)
<*******************************************************************************
LAIMST:  EQU         ZERO+XWOR%1     < (INSTRUCTION EN AVANT...)
         SBT         NIVCBJ          < DECLARER LE 'CBJ' ABSENT, EN LE
         STA         &VAR+PIMMST     < MASQUANT DANS LE REGISTRE 'IM' DU
                                     < MAITRE...
         JMP         PRDEGI          < OU ALORS ON SAUTE LE 'STAR' POUR
                                     < EVITER LES ALARMES, LORSQU'IL EST
                                     < ABSENT...
PRDEGG:  EQU         $
         LAI         K               < (A)=VALEUR ARBITRAIRE...
         LYI         K               < (Y)=ADRESSE RELATIVE DANS (SLO,SLE),
         STAR                        < ON ECRIT AINSI LE FILTRE D'ADRESSE...
         SIO         VAR+PRCBJI      < LECTURE DU MOT D'ETAT1 AFIN DE DESARMER
                                     < UNE EVENTUELLE INTERRUPTION PUPITRE...
         SIO         VAR+PRCBJ       < ON RELIT LE MOT D'ETA2 :
         RBT         ETAOPE          < A PRIORI, CE N'EST PAS UN DEFAUT...
         JANE        $               < BIZARRE ???
PRDEGI:  EQU         $               < CAS DU 'CBJ' ABSENT...
<
< NETTOYAGE DES PARITES MEMOIRE AU DELA
< DE 64K, LA MICRO-MACHINE NE LE FAISANT PAS :
<
<
< MISE EN OEUVRE DU 'CBM' :
< (COUPLEUR DU SYSTEME DE
< TELEVISION BASSE DEFINITION)
<
         LRM         A,B
         WORD        SLOCBM          < (A)='SLO' SPECIAL DU 'CBM',
         WORD        SLECBM          < (B)='SLE' SPECIAL DU 'CBM',
         WOE                         < POSITIONNEMENT DE 'SLO' ET 'SLE'.
PRDEFH:  EQU         $               < ITERATION SUR ATTENTE DE JONCTION...
         SIO         VAR+PRCBM       < LECTURE DU MOT D'ETAT2.
         LAI         CBMDIS
         SIO         VAR+PRCBMC      < ON DISJOINT LE 'CBM'.
         LAI         CBMJON
         SIO         VAR+PRCBMC      < ON JOINT LE 'CBM'.
         SIO         VAR+PRCBM       < LECTURE DU MOT D'ETAT2,
         TBT         ETAOPE          < LE 'CBM' EST-IL JOINT ET PRESENT ???
         JC          PRDEFG          < OUI, OK...
         JMP         $               < NON, ATTENTE DE PASSAGE EN AUTOMATIQUE
                                     < S'IL EST PRESENT...
         JMP         PRDEFH          < ET LORSQU'IL EST PASSE EN AUTOMATIQUE,
                                     < ON RETENTE LA JONCTION...
         JMP         PRDEFI          < OU ALORS ON SAUTE LE 'STAR' POUR
                                     < EVITER LES ALARMES, LORSQU'IL EST
                                     < ABSENT...
PRDEFG:  EQU         $
         LAI         K               < (A)=VALEUR ARBITRAIRE...
         LYI         K               < (Y)=ADRESSE RELATIVE DANS (SLO,SLE),
         STAR                        < ON ECRIT AINSI LE FILTRE D'ADRESSE...
         SIO         VAR+PRCBMI      < LECTURE DU MOT D'ETAT1 AFIN DE DESARMER
                                     < UNE EVENTUELLE INTERRUPTION PUPITRE...
         SIO         VAR+PRCBM       < ON RELIT LE MOT D'ETA2 :
         RBT         ETAOPE          < A PRIORI, CE N'EST PAS UN DEFAUT...
         JANE        $               < BIZARRE ???
<
< MISE DE L'ESCLAVE EN MODE DEBUG :
< (POUR EVITER LES ALARMES...)
<
PRDEFI:  EQU         $               < CAS DU 'CBM' ABSENT...
         LAI         COSBT?DEBUG=FMASK(K=FCINST
         SST                         < MODE DEBUG DANS 'ST'.
<
< METTONS EN SERVICE LA TELEVISION NUMERIQUE A PRIORI :
< (SI NECESSAIRE, ON PEUT FAIRE ULTERIEUREMENT
< LORS DU PASSAGE DANS 'TH0' UN PATCH LE RE-
< EFFACANT...)
<
         LA          ETASYS
         SBT         TVEXIS          < A PRIORI...
         STA         ETASYS
<
< PREMIER TOUR DE BALAYAGE DE LA MEMOIRE :
< (CE PREMIER TOUR NE TRAVAILLE QU'AU-DELA
< DE 64K, AFIN DE FAIRE CE QUE L''INI'
< PUPITRE, C'EST-A-DIRE CALCULER UNE BONNE
< PARITE POUR CHAQUE MOT DE LA MEMOIRE, NE
< FAIT PAS MEME SI LE CONTENU DE CELUI-CI
< EST ALEATOIRE, ET FIXE PAR UNE MISE SOUS
< TENSION...)
<
         LRM         A,B,X
XWORK1:  VAL         1               < LONGUEUR EXPRIMEE EN K-MOTS DES BLOCS
                                     < MEMOIRE EXPLORES A CHAQUE ITERATION.
XWOR%1:  VAL         XWORK1*LK>DADR  < DISTANCE (SLE)-(SLO).
XWOR%2:  VAL         XKMEMX>DADR*LK  < DERNIERE MEMOIRE A TESTER.
         WORD        XWOR%2-XWOR%1   < VALEUR INITIALE DE 'SLO',
         WORD        XWOR%2          < VALEUR INITIALE DE 'SLE',
         WORD        XWOR%1          < DECREMENT DE 'SLO' ET 'SLE'.
         STB         VAR+PRMAX       < ON REINITIALISE A PRIORI L'ADRESSE
                                     < DE LA PREMIERE MEMOIRE INEXISTANTE...
         JMP         PRDEF8          < VERS L'INITIALISATION 'SLO'/'SLE'...
PRDEF4:  EQU         $
         LRM         Y
XWOR%3:  VAL         XWORK1*LK-N
         IF          XWOR%3,,,XEIF%
         IF          ATTENTION : L'ADRESSE DU DERNIER MOT EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
         WORD        XWOR%3          < ADRESSE RELATIVE A (SLO,SLE) DU
                                     < DERNIER MOT DU BLOC MEMOIRE COURANT.
PRDEF5:  EQU         $
         DBP                         < RECHERCHE DE LA PREMIERE PARITE,
                                     < OU DE LA PREMIERE MEMOIRE INEXISTANTE.
         JNCV        PRDEF6          < C=V=Y=K : FIN DU BLOC COURANT...
         JNV         PRDEFD          < V=K, ON AURA CERTAINEMENT C=1,
                                     < C'EST-A-DIRE UNE PARITE MEMOIRE...
         RDOE                        < V=1 : IL S'AGIT D'UNE MEMOIRE INEXIS-
                                     < TANTE, ON MET DONC 'PRMAX' A JOUR...
         LR          A,B             < (B)=(SLO),
         LR          Y,A             < (A)=ADRESSE MOT DE LA MEMOIRE INEXISTANTE
                                     <     RELATIVEMENT A 'SLO'.
         SLRS        -DADR           < (A)=ADRESSE 16-MOTS DE LA MEMOIRE
                                     < INEXISTANTE EN VALEUR INFERIEURE,
         ADR         A,B             < (B)=ADRESSE 16-MOTS ABSOLUE DE LA
                                     <     MEMOIRE INEXISTANTE,
         STB         VAR+PRMAX       < QUI PERMET DE METTRE 'PRMAX' A JOUR...
<
< LA TELEVISION NUMERIQUE EST-ELLE POSSIBLE ???
<
         LA          TVMEM1-ZERO,W
         CPR         A,B
         JL          PRDEF7          < L'ADRESSE INEXISTANTE EST INFERIEURE
                                     < A 'TVMEM1', OK...
         LRM         A
         WORD        MEMTVE          < (A)=PREMIERE ADRESSE INACCESSIBLE
                                     <     A LA TELEVISION NUMERIQUE,
         CPR         A,B
         JGE         PRDEF7          < L'ADRESSE INEXISTANTE EST SUPERIEURE
                                     < A LA PREMIERE ADRESSE INACCESSIBLE, OK...
         LA          ETASYS          < ET BIEN, L'ADRESSE INEXISTANTE EST
         RBT         TVEXIS          < DANS LA MEMOIRE DE TELEVISION NUMERIQUE,
         STA         ETASYS          < ON INHIBE DONC CELLE-CI...
         JMP         PRDEF7          < PASSONS AU MOT PRECEDENT...
PRDEFD:  EQU         $               < PASSONS AUX PARITES...
         JNC         $               < ????
         RBP                         < ON EFFACE LA PARITE DU MOT COURANT
                                     < D'ADRESSE RELATIVE (Y).
PRDEF7:  EQU         $
         SIO         VAR+PRCBMI      < ELIMINATION D'EVENTUELLES INTERRUPTIONS
                                     < MANUELLES SUR LE 'CBM'...
         SIO         VAR+PRCBM       < LECTURE DU MOT D'ETAT DU 'CBM' :
         RBT         ETAOPE          < ON EFFACE LE BIT 'CBM' OPERATIONNEL ;
                                     < LES BITS 2 ET 3 SIGNIFIENT EN PARTICULIER
                                     < 'MEMOIRE INEXISTANTE'...
DEFCBM:  JANE        $               < OUAHHH... IL FAUT DECONNECTER LE
                                     < 'CBM' MANUELLEMENT AVANT DE RELANCER !!!
         ADRI        -P,Y            < SAUTONS LE MOT QUE L'ON VIENT
                                     < DE TRAITER...
         CPZR        Y               < A-T'ON FINI LE BLOC COURANT ???
         JGE         PRDEF5          < NON, IL EN RESTE...
<
< PASSAGE AU BLOC PRECEDENT :
<
PRDEF6:  EQU         $
         RDOE                        < RECUPERATION DE 'SLO' ET 'SLE'.
         SBR         X,A             < ET PASSAGE AU
         SBR         X,B             < BLOC PRECEDENT...
PRDEF8:  EQU         $
         WOE                         < ON MODIFIE 'SLO' ET 'SLE'.
         BSR         ASMPUO          < VISUALISATION DE (SLO).
         LR          B,A             < (A)=(SLE),
         SLRS        LK=K+DADR       < CONVERSION DE (SLE) EN UN NOMBRE DE K.
         CPI         K64             < A-T'ON FINI...
         JG          PRDEF4          < NON, ON RECOMMENCE...
<
< DETERMINATION DE 'PRMAX', ET DU
< NOMBRE D'UTILISATEURS POUVANT
< ACCEDER A 'PR1' POUR LE SWAPPING :
<
         LA          TVMEM1-ZERO,W   < ADRESSE DE LA PEMIERE MEMOIRE DE 'TV',
         CP          VAR+PRMAX       < Y-A-T'IL UN TROU ???
         JG          PRDEFE          < OUI, 'PRMAX' EST BON...
         STA         VAR+PRMAX       < NON, DONC IL FAUT REDUIRE 'PRMAX'...
PRDEFE:  EQU         $
         LA          VAR+PRMAX
         SB          VAR+PRMEM       < (A)=ESPACE DISPONIBLE POUR LE SWAPPING
                                     <     SUR 'PR1'...
         JAL         $               < B I Z A R R E ...
         SARD        NBITMO          < EFFECTIVEMENT, SANS CE 'SARD' CELA
                                     < NE MARCHE PAS !!!
         DV          VAR+PRLZE
         STA         NUSEP1          < (A)=NOMBRE PAR DEFAUT D'UTILISATEURS
                                     <     POUVANT ACCEDER A 'PR1' POUR LE
                                     <     SWAPPING...
<
< DEUXIEME TOUR DE BALAYAGE DE LA MEMOIRE :
< (CE DEUXIEME TOUR PORTE SUR LA TOTALITE
< DE LA MEMOIRE AFIN DE DETECTER CETTE FOIS-CI
< LES DEFAUTS REELS DE LA MEMOIRE, ET NON
< PLUS CEUX CAUSES PAR LA MISE SOUS-TENSION
< DE CELLE-CI...)
<
         LRM         A,B,X
XWORK1:  VAL         1               < LONGUEUR EXPRIMEE EN K-MOTS DES BLOCS
                                     < MEMOIRE EXPLORES A CHAQUE ITERATION.
XWOR%1:  VAL         XWORK1*LK>DADR  < DISTANCE (SLE)-(SLO).
XWOR%2:  VAL         XKMEMX>DADR*LK  < DERNIERE MEMOIRE A TESTER.
         WORD        XWOR%2-XWOR%1   < VALEUR INITIALE DE 'SLO',
         WORD        XWOR%2          < VALEUR INITIALE DE 'SLE',
         WORD        XWOR%1          < DECREMENT DE 'SLO' ET 'SLE'.
         JMP         PQDEF8          < VERS L'INITIALISATION 'SLO'/'SLE'...
PQDEF4:  EQU         $
         LRM         Y
XWOR%3:  VAL         XWORK1*LK-N
         IF          XWOR%3,,,XEIF%
         IF          ATTENTION : L'ADRESSE DU DERNIER MOT EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
         WORD        XWOR%3          < ADRESSE RELATIVE A (SLO,SLE) DU
                                     < DERNIER MOT DU BLOC MEMOIRE COURANT.
PQDEF5:  EQU         $
         DBP                         < RECHERCHE DE LA PREMIERE PARITE,
                                     < OU DE LA PREMIERE MEMOIRE INEXISTANTE.
         JNCV        PQDEF6          < C=V=Y=K : FIN DU BLOC COURANT...
         JV          PQDEF1          < V=1 : MEMOIRE INEXISTANTE, ON LA SAUTE...
         JC          $               < PARITE DANS LE MOT D'ADRESSE (Y) RELA-
                                     < TIVEMENT A (SLO)...
         SIO         VAR+PRCBMI      < ELIMINATION D'EVENTUELLES INTERRUPTIONS
                                     < MANUELLES SUR LE 'CBM'...
         SIO         VAR+PRCBM       < LECTURE DU MOT D'ETAT DU 'CBM' :
         RBT         ETAOPE          < ON EFFACE LE BIT 'CBM' OPERATIONNEL ;
                                     < LES BITS 2 ET 3 SIGNIFIENT EN PARTICULIER
                                     < 'MEMOIRE INEXISTANTE'...
DEFCBN:  JANE        $               < OUAHHH... IL FAUT DECONNECTER LE
                                     < 'CBM' MANUELLEMENT AVANT DE RELANCER !!!
PQDEF1:  EQU         $               < CAS DES MEMOIRES INEXISTANTES...
         ADRI        -P,Y            < SAUTONS LE MOT QUE L'ON VIENT
                                     < DE TRAITER...
         CPZR        Y               < A-T'ON FINI LE BLOC COURANT ???
         JGE         PQDEF5          < NON, IL EN RESTE...
<
< PASSAGE AU BLOC PRECEDENT :
<
PQDEF6:  EQU         $
         RDOE                        < RECUPERATION DE 'SLO' ET 'SLE'.
         SBR         X,A             < ET PASSAGE AU
         SBR         X,B             < BLOC PRECEDENT...
PQDEF8:  EQU         $
         WOE                         < ON MODIFIE 'SLO' ET 'SLE'.
         LR          B,A             < (A)=(SLE),
         BSR         ASMPUO          < VISUALISATION DE (SLE).
XWOR%7:  VAL         LK=K+DADR       < POUR CONVERTIR UNE ADRESSE EN UN
                                     < NOMBRE DE K...
         SLRS        XWOR%7          < CONVERSION DE (SLE) EN UN NOMBRE DE K.
XWOR%8:  VAL         -XWOR%7         < POU DECALER A DROITE...
XWOR%9:  VAL         ZERO-ZERO>XWOR%8
         CPI         XWOR%9          < A-T'ON FINI (DANS CETTE DEUXIEME BOUCLE
                                     < ON BALAYE TOUTE LA MEMOIRE) ???
         JG          PQDEF4          < NON, ON RECOMMENCE...
         CALL        #SISP CMS5 PAGE0# < COMME CA, PAR PROPRETE...
<
< OUI, ANNULATION DU MODE DEBUG :
<
BLOCK1:  EQU         $               < ADRESSE DE BLOCAGE LORS DE LA RELANCE
                                     < SUITE A UN DEFAUT SECTEUR NON PRIS EN
                                     < COMPTE...
         LAI         COSBT?DEBUG=FMASK(K=FCINST
         RST                         < ON EFFACE LE BIT DEBUG DE 'ST'...
<
< EST-ON EN REALITE SUR LE MAITRE ???
<
         LXI         PROESC
         CPZ         &SYSPRO         < L'ESCLAVE EXISTE-T'IL ???
         JGE         PRDEF9          < OUI, ON EST DESSUS...
         ACQ                         < NON, ON EST DONC SUR LE MAITRE,
                                     < ON QUITTE DONC LA FAUSSE 'TH0', AFIN
                                     < DE POURSUIVRE LE 'RESTART' APRES CE
                                     < NETTOYAGE DE LA MEMOIRE HAUTE.
         JMP         $               < ON NE SAIT JAMAIS...
PRDEF9:  EQU         $
<
< REDEMARRAGE DE L'ESCLAVE :
<
         LRM         A,B
         WORD        PSTH00          < (A)=VALEUR REELLE DU RELAI DES 'PSTH'.
         WORD        SAVST0          < (B)=BITS OBLIGATOIRES DANS 'PRSAVS'.
         STA         ALPSTH-ZERO,W   < MISE EN PLACE DU RELAI REEL VERS
                                     < LES 'PSTH' QUI A ETE DETRUIT POUR
                                     < METTRE LE PROCESSEUR ESCLAVE SUR
                                     < LE NIVEAU TH0 ; A NOTER QUE
                                     < (W)=ZERO...
         LA          VAR+PRSAVS      < 'ST' AVANT LE PRECEDENT DEFAUT SECTEUR,
         ANDR        B,A
         CPR         A,B             < Y-A-T'IL TOUS LES BITS NECESSAIRES ???
         JNE         $               < E R R E U R   S Y S T E M E ...
         STZ         VAR+PRSAVS      < OK...
         STZ         DEFOK           < ET ON SYNCHRONISE LE MAITRE S'IL
                                     < ATTENDAIT...
         LA          VAR+PRSAVK      < 'L' EST BONNE (CF. LE RESTART).
         LR          A,K             < RESTAURATION DE LA PILE 'K'.
                                     < RESTAURATION DE (SLO,SLE) :
         CALL        #SISP CMS5 PLRSLO#
         LA          INFINI          < BIT0=1, BITS1-15=K.
         IF          BITPUP-BITSIG,,XEIF%,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         XIMR        A               < MASCAGE DU PUPITRE.
         LBI         K
         SBT         NBITMO+LCM      < BIT DU MASQUE INTERRUPTIONS 'LDC'.
         LXI         PROESC
         LA          &SYSPRO         < (A)=NUMERO DE L'ESCLAVE,
         LXI         PROIOP
         CP          &SYSPRO         < EST-IL AUSSI UN 'IOP' ???
         LAI         K
         JNE         PRDEF2          < NON,
         SBT         NBITMO+IPM      < OUI, IL FAUT DONC MALHEUREUSEMENT
                                     < DEMASQUER LES INTERRUPTIONS 'IPI',
                                     < POUR PERMETTRE L'INITIALISATION
                                     < DES CANAUX...
         SBT         MAINT           < C'EST DOMMAGE, MAIS IL FAUT BIEN LE
                                     < FAIRE : SI 'IOP'='ESC', ALORS ON
                                     < INHIBE LES DEFAUTS DE PARITE SUR LE
                                     < PROCESSEUR ESCLAVE AFIN QU'IL NE
                                     < PASSE PAS EN ALARME !!! MAIS ALORS PLUS
                                     < AUCUNE PARITE NE SERA DETECTEE... DE
                                     < PLUS, SI LE MAITRE ETAIT L'IOP, ON
                                     < NE LE FERAIT PAS, CAR IL FAUT BIEN
                                     < POUVOIR DETECTER LES PARITES MEMOIRE
                                     < SI ELLES EXISTENT, MALGRE LE RISQUE
                                     < QUE LE MAITRE A DE PASSER EN ALARME
                                     < AUSSI LORS D'UNE PARITE, SI PAR
                                     < MALHEUR L'ECHANGE A LIEU ALORS
                                     < QU'IL EST SOUS 'TH0'...
PRDEF2:  EQU         $
         SST                         < FORCONS EVENTUELLEMENT LE BIT 'MAINT'
                                     < D'INHIBITION DES PARITES MEMOIRE SI
                                     < 'IOP'='ESC'...
         LR          B,A             < (A)=MASQUE DE DEMASQUAGE DES IT...
         RST                         < DEMASQUAGE DES APPELS 'LDC' ET 'IPI' SI
                                     < L'ON EST SUR UN 'IOP' (=ESCLAVE).
         PLR         B,X,Y,C,L,W     < SUITE DE LA RESTAURATION...
<
< RETOUR :
<
PRDEF1:  EQU         $
         PLR         A
         RSR
         PAGE
<
<
<        P R O C E S S E U R   E S C L A V E  :
<
<
<        FONCTION :
<                      ETANT DONNEE LA MICRO-PROGRAMMATION
<                    MERDIQUE DU SOLAR QUE CE SOIT EN
<                    CONTEXTE MONO (CONTEXTES PARTIELS,
<                    DEMASQUAGE DES INTERRUPTIONS INTEM-
<                    PESTIFS,...) OU MULTI (PAS DE MEMOIRE
<                    DEBANALISEE COMMUNE,...) LE PROCESSEUR
<                    ESCLAVE NE PEUT TRAVAILLER QU'AVEC SES
<                    INTERRUPTIONS MASQUEES, NE PEUT UTILISER
<                    LES INSTRUCTIONS MODIFIANT LA MEMOIRE
<                    DEBANALISEE (MICRO-SCHEDULER,...),
<                    NE PEUT FAIRE DE CHANGEMENTS DE CONTEXTES,
<                    ET DOIT DONC DETECTER DE LUI-MEME
<                    LES DEFAUTS SECTEURS.
<                      UN PROCESSEUR ESCLAVE NE PEUT DONC
<                    EXECUTER QUE DES TRAITEMENTS SIMPLES,
<                    SEQUENTIELS, ET SURTOUT PERIODIQUEMENT
<                    TESTER LES DEFAUTS SECTEUR EN ATTENTE !!!
<                      DE PLUS POUR EVITER QUE LORS D'ALARMES
<                    EVENTUELLES (PARITE MEMOIRE,...) LE
<                    PROCESSEUR NE FASSE UN CHANGEMENT DE
<                    CONTEXTE (VERS LA TACHE ALARME TH0),
<                    A L'INITIALISATION ON LUI FORCE LE
<                    BIT0(HV) LUI FAISANT AINSI CROIRE QU'IL
<                    EST DEJA SOUS NIVEAU TH0 !!!
<
<
<        SYNCHRONISATION MAITRE :
<                      LA VARIABLE 'PRIND' DE LA DCT 'DCTPR1'
<                    SUIVANT SA VALEUR INDIQUE A L'ESCLAVE
<                    QUE LE MAITRE VEUT LUI SOUMETTRE QUEL-
<                    QUE CHOSE :
<                    PRIND=K : RIEN A FAIRE,
<                    PRIND=+1 : L'ESCLAVE A DU TRAVAIL,
<                    PRIND=-1 : L'ESCLAVE A FINI SON TRAVAIL,
<                               MAIS LE MAITRE N'A PAS ACQUITTE...
<                      EN FIN DE SERVICE, L'ESCLAVE ENVOIE UN 'IPI'
<                    AU MAITRE, QUI NOTONS-LE, TESTE A CHAQUE
<                    SORTIE DE 'TH0' DE TELS 'IPI'...
<                      ENFIN ON NOTERA QUE POUR LES RAISONS
<                    EVOQUES PREALABLEMENT, LE MAITRE NE
<                    PEUT ENVOYER D'IPI A L'ESCLAVE (CF. LES
<                    CHANGEMENTS DE CONTEXTE)...
<
<
<        ARGUMENT :
<                      LES ARGUMENTS SONT DANS LA DEMANDE
<                    DE TETE SUR 'DCTPR1' QUE L'ON RECUPERE
<                    DANS 'PRSAVW' ET NON DANS 'TETE', ON
<                    NE SAIT JAMAIS...
<
<
PRESC1:  EQU         $
         BSR         VAR+APRDEF      < TEST CYCLIQUE D'UN DEFAUT SECTEUR
                                     < ET ATTENTE DE RESTART S'IL Y A LIEU.
PRESC2:  EQU         $
<
< DEFINITION DES INSTANTS CYCLIQUES DE COPY :
<
<*******************************************************************************
XWOR%1:  VAL         -I              < INITIALISATION DU GENERATEUR DES 'PATXXX'
PATMF1:: VAL         '0@@@@+I        < COPY 1 : MEMOIRE --> DKF,
PATF::   VAL         '0@@@@+I        < LECTURE SECTEUR COURANT 'DKF',
PATMF2:: VAL         '0@@@@+I        < COPY 2 : MEMOIRE --> DKF,
PATM::   VAL         '0@@@@+I        < ECRITURE SECTEUR COURANT SUR 'DKM',
<*******************************************************************************
                                     < NOTA : 'PATMF1' ET 'PATMF2' CONSTITUENT
                                     < DEUX ZONE DE 'COPY' EN BASCULE UTILISEES
                                     < POUR S'AUTO-VALIDER...
NSCOPY:: VAL         2               < NOMBRE DE ZONES DE 'COPY'.
<
< SYNCHRONISATION APPROXIMATIVE SUR LE MAITRE :
< (ON ATTEND D'UNE PART, SI LA COPY EST ON,
< QUE LA PATTERN CYCLIQUE AIT CHANGE, MAIS
< AUSSI, ON ESSAYE D'EVITER LES INSTANTS DE
< COPY MEMOIRE --> DKF, C'EST-A-DIRE 'PATMF1'
< ET 'PATMF2', AFIN QUE LA GENERATION DE LA
< ZONE DE COPY NE SOIT PAS EN RECOUVREMENT AVEC
< L'ENTREE-SORTIE ELLE-MEME QUI CRERAIT AINSI
< UNE COPY AVEC UN MAUVAIS CHECK-SUM...)
<
         LA          ETASYS
         TBT         OTOCOP          < LA COPY EST-ELLE ON ???
         JC          PRESC6          < NON, RIEN A FAIRE, MAIS QUEL DANGER !!!
         LA          &VAR+FATCOP     < (A)=PATTERN CYCLIQUE COURANTE,
         CP          VAR+SATCOP      < EST-CE CELLE DU TEST PRECEDENT ???
         JE          PRESC6          < OUI, ON NE FAIT RIEN...
         STA         VAR+SATCOP      < NON, ELLE A CHANGE, DONC ON LA
                                     < MEMORISE, ET ON VA PREPARER LA
                                     < COPY DU SYSTEME.
         TBT         PATMF1
         JC          PRESC6          < ON EVITE LES INSTANTS D'ECRITURE
         TBT         PATMF2
         JC          PRESC6          < DE LA COPY SUR LE 'DKF'...
         BSR         VAR+APCOPY      < PREPARATION DES INFORMATIONS DE
                                     < COPY DU SYSTEME.
PRESC6:  EQU         $
         LRM         X
TEMPO1:  WORD        -'400           < (X)=-NOMBRE DE THALT-MICRO-SECONDES
                                     <     D'ATTENTE DANS LE HALT.
         BSR         ADODO           < ATTENTE VOLONTAIRE DE QUELQUES MICRO-
                                     < SECONDES DESTINEE A NE PAS SURCHARGER
                                     < LE BUS MEMOIRE...
<
< TEST DES DEMANDES DE SERVICE SUR CET ESCLAVE :
<
         LA          VAR+PRIND       < ACCES AU MOT DE SYNCHRONISATION...
         JALE        PRESC1          < RIEN A FAIRE (K), OU SERVICE
                                     < PRECEDENT NON ENCORE ACQUITTE (-1)
                                     < PAR LE MAITRE.
         CPI         XPRCSA          < PETITE VALIDATION...
         JE          SYSE01          < OK...
         BSR         VAR+ASYSEP      < E R R E U R   S Y S T E M E  : A NOTER
                                     < QU'ON NE PEUT FAIRE DE 'SYSER' A CAUSE
                                     < DES CHANGEMENTS DE CONTEXTES...
SYSE01:  EQU         $
<
< PRISE EN COMPTE D'UNE DEMANDE DE SERVICE :
<
         LA          VAR+PRSAVW
         JANE        SYSE02          < OK...
         BSR         VAR+ASYSEP      < E R R E U R   S Y S T E M E ...
SYSE02:  EQU         $
         LR          A,W             < (W)=ADRESSE DE LA DEMANDE COURANTE.
         LX          ARGDEM+OPDEM    < (X)=FONCTION DEMANDEE (A NOTER QU'ELLE A
                                     <     DEJA ETE VALIDEE PAR LE MAITRE...).
         BSR         &VAR+APRSP      < APPEL DU MODULE D'EXECUTION SPECIFIQUE.
<
< TRAITEMENT DES FINS DE SERVICE :
<
         LAI         XPRCSF          < MODIFICATION DE LA
         STA         VAR+PRIND       < VARIABLE DE SYNCHRONISATION...
         LXI         PROMST
         LA          &SYSPRO         < (A)=NUMERO DU MAITRE,
         JAGE        SYSE03          < OK...
         BSR         VAR+ASYSEP      < E R R E U R   S Y S T E M E ...
SYSE03:  EQU         $
         LRM         W
         WORD        BOXIPI          < (W)=ADRESSE DES BOITES AUX LETTRES.
         ADR         A,W             < (W)=ADRESSE DE LA BOITE DU MAITRE.
         LAI         VLOCK
PRESC4:  EQU         $
         BSR         VAR+APRDEF      < TEST DU DEFAUT SECTEUR...
         XM          XVEROU,W        < ON TENTE DE VERROUILLER L'ACCES A
                                     < LA BOITE AUX LETTRES...
         JANE        PRESC4          < IMPOSSIBLE, ON ATTEND...
         LAD         CCBIPI          < (A)=ADRESSE DE 'INFINI', QUI EST AUSSI
                                     <     UN 'CCB' INTER-PROCESSEUR...
         STA         O,W             < QUE L'ON MET DANS LA BOITE DU MAITRE...
         IPI                         < AVERTISSEMENT DU MAITRE...
PRESC5:  EQU         $
         BSR         VAR+APRDEF      < TEST DU DEFAUT SECTEUR...
         CPZ         VAR+PRIND       < LE MAITRE A-T'IL ACQUITTE ???
         JL          PRESC5          < -1 : NON, DONC ON L'ATTEND...
         STZ         XVEROU,W        < OUI, DONC ON PEUT DEVERROUILLER
                                     < SA BOITE AUX LETTRES...
         JMP         PRESC1          < VERS L'ATTENTE D'UN NOUVEAU SERVICE...
         PAGE
<
<
<        S I M U A L T I O N   D U   D I S Q U E   F I X E
<        D A N S   L A   M E M O I R E   H A U T E  :
<
<
<        FONCTION :
<                      CE MODULE INCLUE LES FONCTIONS 'FPRIN'
<                    ET 'FPROUT' ; ELLE PERMET DE SIMULER
<                    LE SWAPPING PAR BLOC DE 1K MOTS DANS LA
<                    MEMOIRE HAUTE DU SYSTEME ; CE PROCEDE A
<                    DEUX AVANTAGES :
<                    1 - LE DEPLACEMENT DE ZONES PAR DES MOVES
<                    ('MVTM' ET 'MVTS') EST 2 FOIS PLUS RAPIDE
<                    QUE LES ECHANGES DISQUE FIXE.
<                    2 - LORS DE LEUR SWAPPING OUT, SI CELUI-CI
<                    EST FAIT EN MEMOIRE, LES PROGRAMMES PEUVENT
<                    Y ETRE EXECUTES...
<
<
<        ARGUMENT :
<                    (W)=ADRESSE DE LA DEMANDE DONT LE
<                      FORMAT EST IDENTIQUE A CELUI
<                      UTILISE POUR 'DKF'.
<
<
PRMOV:   EQU         $
         CALL        #SISP CMS5 PSRSLO#
                                     < SAUVEGARDE DU (SLO,SLE) COURANT...
<
< PREPARATION DE L'ADRESSE "MEMOIRE" :
<
         LA          NSPTYP
         TBT         TYPAD           < EST-CE UNE AMDEM DE MOT (1) OU OCTET (K).
         LA          ARGDEM+AMDEM
         JC          PRMOV1          < (A)=ADRESSE DE MOT,
         SLRS        NOCMO=K         < (A)=ADRESSE D'OCTET.
         JNC         SYSE04          < OK...
         BSR         VAR+ASYSEP      < E R R E U R   S Y S T E M E  : L'AMDEM
                                     < N'EST PAS A UNE FRONTIERE DE MOT.
SYSE04:  EQU         $
PRMOV1:  EQU         $
         PSR         A               < SAUVEGARDE DE L'ADRESSE "MEMOIRE".
<
< PREPARATION DE L'ADRESSE "SECTEUR" :
<
         LA          ARGDEM+ASDEM    < (A)=ADRESSE SECTEUR REELLE,
         SB          ASYS            < A LAQUELLE ON RETRANCHE L'ADRESSE DE CMS5
XWOR%2:  VAL         XXXMOY
XWOR%1:  VAL         TZSWAP/XWOR%2
         IF          XWOR%1*XWOR%2-TZSWAP,,XEIF%,
         IF          ATTENTION : TZSWAP NON DIVISIBLE PAR 2 !!!
XEIF%:   VAL         ENDIF
         DO          XWOR%2*M
         ADRI        -XWOR%1,A
                                     < PUIS LA TAILLE D'UN UTILISATEUR
                                     < (A)=DEPLACEMENT EN SECTEUR PAR RAPPORT
                                     <     AU '0 DE L'UTILISATEUR D'IDESC=K.
         SARD        NBITMO          < CADRAGE DANS (A,B) :
         DV          VAR+TASWAP      < ON RECUPERE :
                                     < (A)=NUMERO DE PARTITION (CF. 'IDESC'),
                                     < (B)=DEPLACEMENT DANS CETTE PARTITION
                                     <     (EXPRIME EN SECTEURS).
         PSR         B               < ON SAUVEGARDE CE DEPLACEMENT (RESTE DE
                                     < LA DIVISION...).
         MP          VAR+TAPROG      < ON RAMENE AINSI UN ESPACE DE SWAPPING
                                     < AVEC ZONE SCRATCH (SUR 'DKS'), A UN
                                     < ESPACE SANS (SUR 'PR1').
         PLR         A
         ADR         B,A             < (A)=DEPLACEMENT EN SECTEURS PAR RAPPORT
                                     <     A L'UTILISATEUR D'"IDESC"=0, DANS
                                     <     UN ESPACE SANS ZONE SCRATCH...
XWOR%5:  VAL         XKMEMX          < TAILLE MAX DE LA MEMOIRE EN K.
XWOR%4:  VAL         YY7             < TAILLE D'UN SECTEUR.
XWOR%1:  VAL         XWOR%4>DADR     < PARCEQUE 'SLO' & 'SLE' CONTIENNENT
                                     < DES ADRESSES MULTIPLES DE 'FADR'.
         SLLS        XWOR%1=K        < CONVERSION EN UN DEPLACEMENT EN
                                     < MULTIPLE DE 'FADR' MOTS.
         AD          VAR+PRMEM       < (A)=ADRESSE ABSOLUE EN MEMOIRE EN
                                     < MULTIPLE DE 'FADR' MOTS.
XWOR%3:  VAL         LK/XWOR%4       < NOMBRE DE SECTEURS PAR K-MOTS.
         IF          M+NESCLA*TCPROG/XWOR%3+KSIMS-XWOR%5,XEIF%,,
         IF          LA MEMOIRE EST TROP PETITE POUR SIMULER
         IF          LE SWAPPING DE TOUS LES UTILISATEURS !!!
XEIF%:   VAL         ENDIF
         LR          A,B
         PSR         A,B
         LA          ARGDEM+CODEM    < (A)=NOMBRE D'OCTETS A ECHANGER,
XWOR%1:  VAL         -DADR
XWOR%2:  VAL         NOCMO=XWOR%1
         ADRI        FADR*NOCMO-E,A  < (A)=NOMBRE D'OCTETS MAJORES POUR
                                     <     UNE DIVISION PAR EXCES :
         SLRS        XWOR%2          < (A)=NOMBRE DE DADR-MOTS A ECHANGER,
         ADRI        -E,A            < (SANS OUBLIER QUE 'SLO' ET 'SLE' SONT
                                     < DANS L'ESPACE QU'ILS DELIMITENT...)
         LR          A,Y             < QUE L'ON MET DANS 'Y',
         PLR         A,B
         ADR         Y,A             < (A)=FUTUR 'SLE' :
         CP          VAR+PRMAX       < VALIDATION DE 'SLE' :
         JL          SYSE05          < OK...
         BSR         VAR+ASYSEP      < E R R E U R   S Y S T E M E  :
                                     < (SLE)>=PREMIERE MEMOIRE INEXISTANTE !!!
SYSE05:  EQU         $
         XR          A,B             < (A)=ADRESSE DE DEBUT DE LA ZONE,
                                     < (B)=ADRESSE DE FIN MAJOREE (LES 2 EN
                                     <     MULTIPLES DE 'FADR' MOTS).
         WOE                         < QUE L'ON MET DANS 'SLO' & 'SLE' AFIN
                                     < DE PERMETTRE L'EXECUTION DES INSTRUC-
                                     < TIONS 'MVTM' & 'MVTS'.
<
< CALCUL DU NOMBRE DE BLOCS DE 1K MOTS :
<
         LA          ARGDEM+CODEM    < (A)=NOMBRE D'OCTETS DEMANDES.
         LBI         K               < CLEAR DE 'B'.
XWOR%1:  VAL         NOCMO=K
XWOR%1:  VAL         LK=XWOR%1       < AFIN DE CONVERTIR EN UN NOMBRE
                                     < DE K-MOTS.
         SLRD        XWOR%1          < (A)=NOMBRE DE 1K-MOTS, ET
                                     < (B)=NOMBRE D'OCTETS RESIDUELS...
         LY          VAR+PR1K        < (Y)=1K A PRIORI (LONGUEUR DES BLOCS
                                     <     UNITAIRES).
         JANE        PRMOVN          < IL Y A AU MOINS 1K DE DEMANDE...
<
< CAS OU MOINS D'UN K-MOTS EST DEMANDE :
<
         LYI         YY7             < (Y)=LONGUEUR D'UN BUFFER A PRIORI...
         SLRD        NOCMO=NBITMO-XWOR%1 < (B)=NOMBRE DE MOTS RESIDUELS (A NOTER
                                     < QUE LE CONTENU ETAIT NUL).
         LAI         W               < (A)=POUR FAIRE UN ECHANGE D'UN BUFFER.
         JC          PRMOVO          < OH !!! LE NOMBRE D'OCTETS EST IMPAIR !!!
         CPR         B,Y             < OK, MAIS EST-CE UN BUFFER QUI A ETE
                                     < DEMANDE ???
         JE          PRMOVP          < OUI (C'EST DONC 'HDLJE' POUR L'INITIA-
                                     < LISATION DE L'ESPACE DE SWAPPING).
PRMOVO:  EQU         $
         BSR         VAR+ASYSEP      < E R R E U R   S Y S T E M E ...
         JMP         PRMOVP
<
< CAS OU PLUS D'UN K-MOTS EST DEMANDE :
<
PRMOVN:  EQU         $
         CPZR        B               < DANS CE CAS Y-A-T'IL DES OCTETS
                                     < RESIDUELS ???
         JNE         PRMOVO          < OUI, TRES TRES MAUVAIS...
<
< CAS OU L'ECHAGE DEMANDE EST VALIDE :
<
PRMOVP:  EQU         $
         STY         VAR+PRLON       < PRLON=NOMBRE DE MOTS A ECHANGER...
         LR          A,X             < (X)=NOMBRE DE BLOCS DE 1K-MOTS.
<
< PRISE EN COMPTE DU SENS :
<
         LA          ARGDEM+OPDEM    < (A)=FONCTION,
         LR          A,Y             < SAUVEGARDEE DANS 'Y'.
         CPI         FPRIN           < EST-CE UN SWAPPING IN ???
         PLR         A               < A PRIORI (A)=EMETTEUR ABSOLU SI OUT...
         LBI         ZERO-ZERO       < ET (B)=RECEPTEUR RELATIF...
         JNE         PRMOV5          < NON, SWAPPING OUT...
         XR          A,B             < OUI, SWAPPING IN :
                                     < (A)=EMETTEUR RELATIF,
                                     < (B)=RECEPTEUR ABSOLU.
PRMOV5:  EQU         $
<
< BOUCLE D'ECHANGE DES BLOCS DE 1K-MOTS :
<
PRMOV2:  EQU         $
         PSR         X               < SAUVEGARDE DU NOMBRE D'ITERATIONS.
         LX          VAR+PRLON       < (X)=NOMBRE DE MOTS (1K OU YY7 MOTS).
         XR          A,Y             < (A)=FONCTION DEMANDEE,
         CPI         FPRIN           < IN ???
         XR          A,Y             < RESTAURE A ET Y.
         JE          PRMOV3          < OUI, IN...
         MVTS
                                     < NON, OUT...
         JMP         PRMOV4
PRMOV3:  EQU         $
         MVTM
                                     < IN...
PRMOV4:  EQU         $
         XR          A,B
         AD          VAR+PRLON       < PROGRESSION DU RECEPTEUR,
         XR          A,B
         AD          VAR+PRLON       < PROGRESSION DE L'EMETTEUR.
         LXI         PROESC
         CPZ         &SYSPRO         < MAIS AU FAIT, 'PROESC' EST-IL LA ???
         PLR         X
         IF          PRINEX-K,XEIF%,,
         IF          ATTENTION : 'PRINEX' DOIT ETRE NEGATIF !!!
XEIF%:   VAL         ENDIF
         JL          PRMOVQ          < NON, ON EST DONC DANS 'HDLPR1', ET IL
                                     < N'Y A PAS DE TEST DE DEFAUT SECTEUR
                                     < A FAIRE...
         BSR         VAR+APRDEF      < OUI, DONC ATTENTION, TOUS LES 1K-MOTS,
                                     < IL FAUT TESTER LE DEFAUT SECTEUR,
                                     < ET QUI SAIT S'ARRETER...
PRMOVQ:  EQU         $
         JDX         PRMOV2          < AU 1K-MOTS SUIVANTS...
<
< FIN DU MODULE DE SIMULATION :
<
                                     < RESTAURATION DE (SLO,SLE) :
         CALL        #SISP CMS5 PLRSLO#
         RSR
         CALL        #SISP CMS5 CHECK#
         CALL        #SISP CMS5 DOL1#
         PAGE
<
<
<        D A T E   E X P R I M E E   E N   A S C I  :
<
<
XWOR%7:  VAL         MOCG=K
XWOR%7:  VAL         -XWOR%7         < POUR UN DECALAGE A DROITE...
XWOR%4:  VAL         -NOCMO          < POUR CALCULER 'XWOR%2',
XWOR%3:  VAL         XWOR%4+NOCMO-E  < POUR CALCULER 'XWOR%1'.
DATE:    EQU         $               < MESSAGE DE DATE ET HEURE.
<*******************************************************************************
         WORD        " J"
XWOR%8:  VAL         '0000000@@@@    < RECUPERATION DU CODE GENERE...
<*******************************************************************************
XWOR%1:  VAL         XWOR%8(MOCG>XWOR%7-KJ=FCSIGN(BIT*XWOR%3
XWOR%2:  VAL         XWOR%8(MOCD-KJ=FCSIGN(BIT*XWOR%4
XWOR%5:  VAL         XWOR%1-XWOR%2=FCSIGN(BIT)BIT*XWOR%4
XXDATJ:: VAL         $-DATE*NOCMO+XWOR%1+XWOR%2+XWOR%5
         WORD        "J/"
<*******************************************************************************
         WORD        "MM"
XWOR%8:  VAL         '0000000@@@@    < RECUPERATION DU CODE GENERE...
<*******************************************************************************
XWOR%1:  VAL         XWOR%8(MOCG>XWOR%7-KM=FCSIGN(BIT*XWOR%3
XWOR%2:  VAL         XWOR%8(MOCD-KM=FCSIGN(BIT*XWOR%4
XWOR%5:  VAL         XWOR%1-XWOR%2=FCSIGN(BIT)BIT*XWOR%4
XXDATN:: VAL         $-DATE*NOCMO+XWOR%1+XWOR%2+XWOR%5
         WORD        "/1"
XXDAT9:: VAL         $-DATE          < VALEUR UTILISEE PAR 'TH0'...
<*******************************************************************************
         WORD        "9A"
XWOR%8:  VAL         '0000000@@@@    < RECUPERATION DU CODE GENERE...
<*******************************************************************************
XWOR%1:  VAL         XWOR%8(MOCG>XWOR%7-KA=FCSIGN(BIT*XWOR%3
XWOR%2:  VAL         XWOR%8(MOCD-KA=FCSIGN(BIT*XWOR%4
XWOR%5:  VAL         XWOR%1-XWOR%2=FCSIGN(BIT)BIT*XWOR%4
XXDATA:: VAL         $-DATE*NOCMO+XWOR%1+XWOR%2+XWOR%5
         WORD        "A-"
<*******************************************************************************
         WORD        "HH"
XWOR%8:  VAL         '0000000@@@@    < RECUPERATION DU CODE GENERE...
<*******************************************************************************
XWOR%1:  VAL         XWOR%8(MOCG>XWOR%7-KH=FCSIGN(BIT*XWOR%3
XWOR%2:  VAL         XWOR%8(MOCD-KH=FCSIGN(BIT*XWOR%4
XWOR%5:  VAL         XWOR%1-XWOR%2=FCSIGN(BIT)BIT*XWOR%4
XXDATH:: VAL         $-DATE*NOCMO+XWOR%1+XWOR%2+XWOR%5
<*******************************************************************************
         WORD        "/M"
XWOR%8:  VAL         '0000000@@@@    < RECUPERATION DU CODE GENERE...
<*******************************************************************************
XWOR%1:  VAL         XWOR%8(MOCG>XWOR%7-KM=FCSIGN(BIT*XWOR%3
XWOR%2:  VAL         XWOR%8(MOCD-KM=FCSIGN(BIT*XWOR%4
XWOR%5:  VAL         XWOR%1-XWOR%2=FCSIGN(BIT)BIT*XWOR%4
XXDATM:: VAL         $-DATE*NOCMO+XWOR%1+XWOR%2+XWOR%5
         WORD        "M/"
<*******************************************************************************
         WORD        "SS"
XWOR%8:  VAL         '0000000@@@@    < RECUPERATION DU CODE GENERE...
<*******************************************************************************
XWOR%1:  VAL         XWOR%8(MOCG>XWOR%7-KS=FCSIGN(BIT*XWOR%3
XWOR%2:  VAL         XWOR%8(MOCD-KS=FCSIGN(BIT*XWOR%4
XWOR%5:  VAL         XWOR%1-XWOR%2=FCSIGN(BIT)BIT*XWOR%4
XXDATS:: VAL         $-DATE*NOCMO+XWOR%1+XWOR%2+XWOR%5
<*******************************************************************************
         BYTE        KCR;KLF
XWOR%1:  VAL         '000000000@@=FCSIGN-SIGNP
<*******************************************************************************
LKDATE:: VAL         $-DATE*NOCMO+XWOR%1
         IF          LBUFES*NOCMO-LKDATE,,XEIF%,XEIF%
         IF          ATTENTION : 'LODATE' NE PEUT ETRE EMIS SUR
         IF          ATTENTION LE PERIPHERIQUE 'OUT' !!!
XEIF%:   VAL         ENDIF
MKLOM::  VAL         COSBT?BITPAR=FMASK(K=FCINST
                                     < AFIN DE FORCER LE BIT DE PARITE SUR LA
                                     < LONGUEUR DES MESSAGES AFIN D'EVITER DES
                                     < AMBIGUITES SUR LES AUTO-RELAIS...
LODATE:: VAL         LKDATE?MKLOM
         PAGE
<
<
<        D C T   H O R L O G E  :
<
<
FXHOR::  VAL         10              < FREQUENCE DE L'HORLOGE EN HERTZ.
DCTHOR:  EQU         $
PSTHOR:  WORD        K;K;K;K;COM+DEPCS;DCTHOR;NIL;PILHOR;HANDLR;SMST;SO;SE
       #@ASCI        " HOR"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR          < FILTRE.
         WORD        FILTRS          < S-FILTRE.
         WORD        XTALOC          < ETALOC.
         WORD        XXLOC0          < SEMLOC.
         DZS         LSEM
         WORD        NIL             < TETE.
         WORD        NIL             < QUEUE.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLHOR          < HANDLER HORLOGE.
         WORD        ITHOR
         WORD        K;K             < ETAT.
         WORD        XBITS0          < BITSEM.
         WORD        XXNTRY;TRYVID   < NTRIES & FRTRY.
         WORD        K               < HSTATS.
         WORD        XTESTO          < TESTO...
         WORD        XXDCTF          < 'DCT' NON CONNECTABLE...
         WORD        XFONBA          < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
<        Z O N E   V A R I A B L E   D E   L ' H O R L O G E  :
<
<
VARHOR:  EQU         $
         IF          VARHOR-DCTHOR-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
< REARMEMENT EVENTUEL DE HANDLERS :
<
         WORD        NILK            < CONTIENT EVENTUELLEMENT LE NSP
                                     < D'UN HANDLER A ARMER ; CE MOT
                                     < EST UTILISE CONJOINTEMENT AVEC
                                     < LE BIT0(SPHEX) DE CE HANDLER.
                                     < PERMET AUSSI D'ARMER LE SYSTEME
                                     < DE VISUALISATION VIDEO SI CELUI-
                                     < CI EXISTE...
                                     < A NOTER QUE S'IL N'EXISTE PAS,
                                     < SON RELAI DE DCT EST NUL, ET
                                     < QUE L'ON VA TOMBER DANS LE
                                     < RESTART D'OU UN 'ACTD'...
NSPUP::  VAL         $-D-VARHOR      < NSP HANDLER A ARMER.
<
< CONSTANTES DE FREQUENCE DE L'HORLOGE :
<
         WORD        NILK
FREHOR:: VAL         $-D-VARHOR      < FREQUENCE COURANTE DE L'HORLOGE.
         WORD        K
NBITH::  VAL         $-D-VARHOR      < COMPTEUR DES INTERRUPTIONS.
         WORD        -FXHOR
KMSHOR:: VAL         $-D-VARHOR      < DECOMPTEUR DE MILLI-SECONDES,
                                     < PASSE PAR 0 A CHAQUE SECONDE.
         WORD        YECFRE,X
DECFRE:: VAL         $-D-VARHOR      < TABLE DES FREQUENCES REELLES
                                     < DE L'HORLOGE, EXPRIMEES EN
                                     < MULTIPLE DE 100 MS
YECFRE:  EQU         $
         BYTE        FXHOR/1;FXHOR/2;FXHOR/5;FXHOR/10;0;0
<
< COMPOSANTES DE LA DATE :
<
         WORD        LTIME-IJIJDX,X  < INDEXATION A PARTIR DE 1.
DATHOR:: VAL         $-D-VARHOR      < TABLE CONTENANT EN BINAIRE
                                     < LA DATE ET L'HEURE AVEC LA
                                     < VALEUR MAX DE CHAQUE COMPOSANTE.
<
<        A T T E N T I O N  : LE 1ER OCTET INDIQUE LA VALEUR QUE
<        NE PEUT ATTEINDRE LE 2EME OCTET.
<
XXMAXT:: VAL         MOCG            < OCTET CONTENANT LE MAXIMUM D'UNE
                                     < COMPOSANTE.
XXDX::   VAL         XXMAXT=K/NBITOC < POUR ATTEINDRE LA VALEUR COURANTE.
         IF          XXMAXT)MMOT-MOCD,,XEIF%,
         IF          ATTENTION : LA VALEUR COURANTE DOIT ETRE SUR 'MOCD' !!!
XEIF%:   VAL         ENDIF
LTIME:   EQU         $               < ADDRESSE DES 6 COMPOSANTES DE
                                     < LA DATE/HEURE POUR NSPDAT.
XXDAT0:: VAL         K               < NUMEROS COMMENCANT A 0...
XXDAT1:: VAL         K+I             < NUMEROS COMMENCANT A 1...
         BYTE        98;XXDAT0       < ANNEE.
XXHANE:: VAL         $-D-LTIME       < INDEX DES ANNEES.
XXNMOI:: VAL         12              < ET OUI, IL Y A 12 MOIS DANS L'ANNEE...
         BYTE        XXNMOI+I;XXDAT1 < MOIS.
XXHMOI:: VAL         $-D-LTIME       < INDEX DES MOIS.
         BYTE        K;XXDAT1        < LA VALEUR MAX DES JOURS EST
                                     < VARIABLE ET FONCTION DU MOIS
                                     < DANS LEQUEL ON SE TROUVE (CF.
                                     < LA TABLE 'TMOIS' QUI DONNE LE
                                     < NBRE DE JOURS DE CHAQUE MOIS).
XXHJOU:: VAL         $-D-LTIME       < INDEX DES JOURS.
         BYTE        24;XXDAT0       < HEURE.
XXHHEU:: VAL         $-D-LTIME       < INDEX DES HEURES.
HEURE::  VAL         60              < NOMBRE DE MINUTES DANS UNE HEURE.
         BYTE        HEURE;XXDAT0    < MINUTE.
XXHMIN:: VAL         $-D-LTIME       < INDEX DES MINUTES.
         BYTE        MINUTE;XXDAT0   < SECONDE.
XXHSEC:: VAL         $-D-LTIME       < INDEX DES SECONDES.
LOTIME:: VAL         $-LTIME         < LONGUEUR DE LA TABLE 'LTIME'.
<
< TABLE DES NOMBRES DE JOURS DE CHAQUE MOIS :
<
         WORD        TMOIS,X
MOIHOR:: VAL         $-D-VARHOR      < TABLE DONNANT POUR CHAQUE MOIS
                                     < LE NOMBRE DE JOURS+1 DE CELUI-CI;
                                     < LE NUMERO DU MOIS (1-12) EST
                                     < L'INDEX D'OCTET DE CETTE TABLE).
FEVRIE:: VAL         2               < FEVRIER EST LE DEUXIEME MOIS...
FEVR28:: VAL         28+I            < FEVRIER (ANNEE NORMALE),
FEVR29:: VAL         29+I            < FEVRIER (ANNEE BISSEXTILE).
BISSEX:: VAL         4               < LES ANNEES BISSEXTILES SONT DIVISIBLES
                                     < PAR 'BISSEX'...
XWOR%1:  VAL         BISSEX=K
         IF          BIT>XWOR%1-BISSEX,,XEIF%,
         IF          ATTENTION : 'BISSEX' DOIT ETRE UNE PUISSANCE DE 2 !!!
XEIF%:   VAL         ENDIF
XWOR%1:  VAL         XXHMOI+IJIJDX+NBITOC
XWOR%2:  VAL         XXHJOU+IJIJDX+NBITOC
XWOR%3:  VAL         COSBT?XWOR%1=FMASK(K=FCINST
XWOR%3:  VAL         COSBT?XWOR%2=FMASK(K=FCINST?XWOR%3
XXX30::  VAL         30+I            < POUR LES MOIS DE 30 JOURS,
XXX31::  VAL         31+I            < ET CEUX DE 31 JOURS...
TMOIS:   EQU         $
         BYTE        XWOR%3;XXX31
         BYTE        FEVR28;XXX31
         BYTE        XXX30;XXX31
         BYTE        XXX30;XXX31
         BYTE        XXX31;XXX30
         BYTE        XXX31;XXX30
         BYTE        XXX31
         IF          $-TMOIS-D*NOCMO-XXNMOI,,XEIF%,
         IF          ATTENTION : LA LONGUEUR DE 'TMOIS' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
MINHOR:: VAL         TMOIS-VARHOR    < L'OCTET0 DE TMOIS CONTIENT
                                     < LES VALEURS D'INITIALISATION
                                     < DE CHAQUE COMPOSANTE DE LA DATE :
                                     < A LA COMPOSANTE DE NUMERO (X),
                                     < EST ASSOCIE LE BIT DE RANG (X) :
                                     < OCTET0=K0110000 (SEULS LES MOIS
                                     < ET LES JOURS SONT INITIALISES
                                     < A 1, LES AUTRES A 0).
         IF          NBITOC-LOTIME,,XEIF%,XEIF%
         IF          ATTENTION : LA LISTE DES BITS DANS 'XWOR%3'
         IF          NE TIENT PAS SUR UN OCTET !!!
XEIF%:   VAL         ENDIF
<
< DATE EXPRIMEE EN ASCI :
<
         WORD        DATE,X
ADATE::  VAL         $-D-VARHOR      < RELAI VERS LE MESSAGE ASCI DE
                                     < LA DATE ET DE L'HEURE (CF. CCI).
         WORD        YEDATE,X
EDATE::  VAL         $-D-VARHOR      < POSITION DES DIFFERENTES
                                     < COMPOSANTES DE LA DATE ET DE
                                     < L'HEURE DANS LE MESSAGE
                                     < (EXPRIME EN NUMERO DE CARACTERES)
         NLS
         WORD        SECRET
PASSD::  VAL         $-D-VARHOR      < RELAI D'ACCES AU CARACTERE
                                     < VARIABLE DU MOT DE PASSE
                                     < SOUS :SYS.
         LST
<
< CONSTANTES DIVERSES ET RELAIS :
<
         WORD        SPBIS
ASPBIS:: VAL         $-D-VARHOR      < MODULE DE TRAITEMENT SPECIFIQUE DES
                                     < CHANGEMENTS DE MOIS, D'ANNEES...
         WORD        E707
AE707::  VAL         $-D-VARHOR      < ROUTINE D'ARRET DE L'HORLOGE.
         WORD        BETA3
ABETA3:: VAL         $-D-VARHOR      < ROUTINE DE CALCUL DU BETA
                                     < DU SEMAPHORE SDODO.
         WORD        CFHOR
ACFHOR:: VAL         $-D-VARHOR      < ROUTINE DE CALCUL DE LA FRQUENCE
                                     < EN MULTIPLE DE 100 MS
         WORD        ACHOR?FPHCMD    < SORTIE COMMANDE SUR L'HORLOGE;
                                     < IL NE PEUT S'AGIR QUE D'UNE
                                     < VALIDATION OU D'UNE DEVALIDATION
                                     < DES IT HORLOGES.
OPHOR::  VAL         $-D-VARHOR      < OPERANDE DE LA SIO DE FONCTION.
         WORD        ACHOR?FPHETA    < ENTREE ETAT SUR L'HORLOGE
ETAHOR:: VAL         $-D-VARHOR      < UTILISE POUR FAIRE RETOMBER
                                     < L'IT DANS L'ARIT HORLOGE
         WORD        ATSUSP
OTSUSP:: VAL         $-D-VARHOR      < AUTOMATE DE SUSPENSION DES
                                     < ESCLAVES.
XC3FF::  VAL         '03FF           < POUR LE RAZ DES BITS 0 A 5.
         WORD        XC3FF
C3FF::   VAL         $-D-VARHOR      < RAZ BIT 0-5.
<
< CONSTANTES DE TIMED-OUT :
<
IFRETO:: VAL         2               < PERIODE EN SECONDES DES TESTS
                                     < SUR LES TIMED OUT DE CERTAINS
                                     < HANDLERS PERIPHERIQUES.
         WORD        IFRETO
FRETO::  VAL         $-D-VARHOR      < GENERATEUR DE LA PERIODE DES
                                     < TESTS DE TIMED OUT ; CE
                                     < DECOMPTEUR EST DECREMENTE A
                                     < CHAQUE SECONDE.
         WORD        SPTO
ASPTO::  VAL         $-D-VARHOR      < SOUS-PROGRAMME DE DETECTION ET DE
                                     < TRAITEMENT DES TIME-OUT.
<
< DEMANDE D'INITIALISATION DE L'ORLOGE POUR 'SYSINI' :
<
HORINI:  EQU         $
         BYTE        NSPHOR;XDSYM    < DEMANDE D'INITIALISATION DE
                                     < L'HORLOGE.
         WORD        E               < INITIALISATION.
         WORD        XXHINI          < 100 MILLI-SECONDES
         DZS         LDEM0+HORINI-$
<
< DONNEES NECESSAIRES A LA COPY PERIODIQUE DU SYSTEME :
<
         WORD        KOPY
AHCOPY:: VAL         $-D-VARHOR      < SOUS-PROGRAMME DE PREPARATION DES
                                     < INFORMATIONS DE COPY.
DCOPY2:: VAL         $-VARHOR
         BYTE        NSPDKF;XDSYM?XTYPAD < SYMBOLIQUE ET ADRESSE MOT.
         WORD        FGW             < DEMANDE D'ECRITURE.
         WORD        BCOPY
         WORD        LCOPY2
         WORD        SCOPY           < ADRESSE DISQUE DE 'COPY' (1 OU 2)...
         DZS         LDEM0+VARHOR-$+DCOPY2
PCOPY::  VAL         2*FXHOR/10      < DEFINITION DE LA PERIODE DES COPY
                                     < EXPRIMEE EN UNITE 'QUANTUM DE TEMPS
                                     < UTILISATEUR' ; CETTE PERIODE EST
                                     < DONC FONCTION DE LA CHARGE DU SYSTEME ;
                                     < ENFIN, CETTE CONSTANTE EST MODULEE
                                     < A L'AIDE DU CHAMP 'MKCOP' DE 'ETASYS'.
XWOR%1:  VAL         MKCOP=K
XWOR%1:  VAL         -XWOR%1         < POUR UN DECALAGE A DROITE...
XWOR%1:  VAL         MKCOP>XWOR%1    < MAJORANT DE LA PLUS GRANDE CONSTANTE
                                     < QUE L'ON PEUT METTRE DANS 'MKCOP'.
         IF          PCOPY,,,XEIF%
         IF          A T T E N T I O N  : 'PCOPY' DOIT ETRE POSITIF !!!
XEIF%:   VAL         ENDIF
         IF          PCOPY-XWOR%1,,,XEIF%
PCOPY:   VAL         PCOPY+XWOR%1    < AFIN DE GARANTIR UNE PERIODE DE
                                     < COPY STRICTEMENT POSITIVE...
XEIF%:   VAL         ENDIF
         WORD        PCOPY
CCOPY::  VAL         $-D-VARHOR      < GENERATEUR DE LA PERIODE DES COPY
                                     < DU SYSTEME SUR 'DKF'.
         WORD        '1111
PATCOP:: VAL         $-D-VARHOR      < PATTERN CYCLIQUE INDIQUANT A CHAQUE
                                     < PERIODE DE COPY, QUELLE TYPE DE
                                     < COPY DOIT ETRE FAITE, SUIVANT LES
                                     < BITS QUI SUIVENT :
EATCOP:  EQU         VARHOR+PATCOP   < ADRESSE REFERENCEE PAR LE
                                     < PROCESSEUR ESCLAVE.
         WORD        K
VALCFM:: VAL         $-D-VARHOR      < CETTE CONSTANTE PERMET DE SAVOIR SI
                                     < UNE LECTURE 'DKF' A EU LIEU, ET EST
                                     < EXPLOITEE PAR L'ECRITURE SUR 'DKM' :
                                     < =0 : PAS DE LECTURE 'DKF' (DONC NE PAS
                                     <      FAIRE D'ECRITURE 'DKM',
                                     < =1 : IL Y A EU LECTURE 'DKF'...
         WORD        NIL
COPS1::  VAL         $-D-VARHOR      < ADRESSE DU PREMIER SECTEUR DE 'DKF'
                                     < A LIRE,
         WORD        NSDKF-Z+I
COPS2::  VAL         $-D-VARHOR      < ADRESSE DU PREMIER SECTEUR DE 'DKF' A
                                     < A NE PAS SAUVEGARDER SUR 'DKM'.
         CALL        #SISP CMS5 DOL2#
BUFCOP:  EQU         $
         DZS         YY7             < BUFFER DE TRANSIT DKF --> DKM.
DCOPYF:: VAL         $-VARHOR        < DEMANDE DE LECTURE SUR 'DKF' ::
         BYTE        NSPDKF;XDSYM?XTYPAD < ADRESSE MOT...
         WORD        FGR             < LECTURE,
         WORD        BUFCOP
         WORD        YY8             < 1 SECTEUR,
         WORD        NSDKF-I         < ADRESSE DU SECTEUR COURANT.
         WORD        NILK
         WORD        XXSEM0+I        < WEIO : AFIN DE COMMENCER PAR UN 'WAIT'...
         WORD        NIL
DCOPYM:: VAL         $-VARHOR        < DEMANDE D'ECRITURE SUR 'DKM' ::
         BYTE        NSPDKM;XDSYM?XTYPAD < ADRESSE MOT...
         WORD        FGWQ            < ECRITURE AVEC QUANTA=1,
         WORD        BUFCOP
         WORD        YY8             < 1 SECTEUR DE QUANTA=1,
         WORD        NILS            < ADRESSE DU SECTEUR COURANT.
         WORD        NILK
         WORD        XXSEM0+I        < WEIO : AFIN DE COMMENCER PAR UN 'WAIT'...
         WORD        NIL
         CALL        #SISP CMS5 DOL1#
<
< PURGE DE LA MEMOIRE VIRTUELLE :
<
DPURGE:: VAL         $-VARHOR        < DEMANDE DE PURGE...
         BYTE        NSPDKB;K        < DE LA MEMOIRE VIRTUELLE DKB.
FOPURG:: VAL         '05             < FONCTION DE PURGE DE 'DKB'.
         WORD        FOPURG          < 'OPDEM'.
         DZS         LDEM0+VARHOR-$+DPURGE
         WORD        PURGE
APURGE:: VAL         $-D-VARHOR      < SOUS-PROGRAMME DE PURGE ; C'EST
                                     < UN SOUS-PROGRAMME POUR EVITER LES
                                     < SAUTS DE LA MORT (>YY7 MOTS...).
<
< PREVENTION DES INTER-BLOCAGES SUR ATTENTE DE BUFFERS :
<
NPREBB:: VAL         8               < NOMBRE MAXIMUM DE BUFFERS QUE
                                     < L'HORLOGE PEUT STOCKER.
NPREB0:: VAL         NPREBB/XXXMOY   < NOMBRE MAXIMUM DE BUFFERS QUE L'HORLOGE
                                     < EST AUTORISEE A NE PAS LIBERER ; CECI
                                     < AFIN DE DEBLOQUER D'EVENTUELS INTER-
                                     < BLOCAGE DU SYSTEME : PAR EXEMPLE LORS-
                                     < QU'IL Y A BEAUCOUP DE FICHIERS OUVERTS,
                                     < UNE NOUVELLE DEMANDE D'OPEN, QUI A LIEU
                                     < FORCEMENT EN MEMOIRE BASSE, SI ELLE EST
                                     < EMISE PAR UN GROS PROGRAMME PEUT BLOQUER
                                     < LE SYSTEME ; LA SOLUTION EST ALORS DE
                                     < FAIRE :
                                     < 1 - UN ABORT SUR QUELQUES VISUS (PAR
                                     < 'ALT-MODE'),
                                     < 2 - MODIFIER LE MOT 'CPIB0' (EN REDUI-
                                     < SANT LA VALEUR DU PARAMETRE 'NPREB0),
                                     < 3 - LE SYSTEME DOIT ALORS SE DEBLOQUER
                                     < DE LUI-MEME...
         IF          NPREB0-NPREBB,XEIF%,,
         IF          ATTENTION : LES PARAMETRES 'NPREBB' ET
         IF          'NPREB0' SONT INCOMPATIBLES !!!
XEIF%:   VAL         ENDIF
         WORD        K
KPREBB:: VAL         $-D-VARHOR      < COMPTEUR DES BUFFERS EN STOCK.
DPREBB:: VAL         $-VARHOR        < DEMANDE D'ALLOCATION/RELEASE BUFFER.
         BYTE        NSPRLB;K
         WORD        COSBT?WAITB=FMASK(K=FCINST
                                     < OPDEM : CONTIENT LE BIT 'WAITB'
                                     < AFIN QUE LE RETOUR AIT LIEU SI
                                     < LA DEMANDE NE PEUT ETRE SATISFAITE.
         WORD        PPREBB-P        < CE MOT EST VARIABLE ET POINTE L'ADRESSE
                                     < DU BUFFER ALLOUE AU COUP PRECEDENT.
         WORD        W               < ON DEMANDE/RELEASE 1 BUFFER A LA FOIS.
         DZS         LDEM0+VARHOR-$+DPREBB
<
< PILE DES BUFFERS MIS AU CHAUD PAR L'HORLOGE :
<
PPREBB:  EQU         $
         DZS         NPREBB
YEDATE:  EQU         $
         BYTE        K;XXDATA;XXDATN;XXDATJ;XXDATH;XXDATM;XXDATS;K
<
< AUTOMATE D'INTERRUPTION HORLOGE DES ESCLAVES :
<
EOTO7:   WORD        SWAPO;RLMESC;RUNO;ALMESC;SWAPI;ISLOE
ATSUSP:  WORD        EOTO7-$
<
<
<        P I L E   D E   L ' H O R L O G E  :
<
<
<        NOTA :
<                      C'EST DONC UNE HORLOGE
<                    ELECTRIQUE...
<
<
         CALL        #SISP CMS5 DOL2#
PILHOR:  EQU         $-DEPILE
XWPILE:  VAL         LPILEH+8+8
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        H A N D L E R   H O R L O G E  :
<
<
<        FONCTION :
<                      CE HANDLER EST CHARGE DE GERER
<                    L'HORLOGE (ET EN PARTICULIER LA
<                    LA DATE ET L'HEURE), ET TOUTES
<                    LES ACTIONS PERIODIQUES (LES
<                    COPYS, LES TESTS DE MANQUE DE
<                    BUFFERS,...).
<
<
         USE         L,DCT0
         USE         W,DEM0
HDLHOR:  EQU         $
         LA          ARGDEM+OPDEM    < RECUPERATION DE LA FONCTION A
                                     < REALISER SUR L'ORLOGE.
         JANE        E702
         IF          E-K,XEIF%,,XEIF%
         IF          ATTENTION : LA FONCTION 'INITIALISATION EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
<        D E S A R M E M E N T   D E   L ' H O R L O G E  :
<
E707:    EQU         $
         LAI         K               < MOT DE COMMANDE DEVALIDATION
                                     < DES IT HORLOGE
         SIO         VAR+OPHOR       < SIO DE COMMANDE
         RSR                         < ET C'EST TOUT...
<
<
<        ( R E - ) I N I T I A L I S A T I O N   D E   L ' H O R L O G E  :
<
<
<        FONCTION :
<                      ON VALIDE D'ABORD LES INTER-
<                    RUPTIONS D'HORLOGE, ET ON INI-
<                    TIALISE A 0 LE COMPTEUR 'NBITH' ;
<                    CELUI-CI SERA UTILISE POUR COMP-
<                    TABILISER MODULO 'N' LES INTER-
<                    RUPTIONS D'HORLOGE, ET AINSI PAL-
<                    LIER AU FAIT QUE LA FREQUENCE DE
<                    L'HORLOGE N'EST PAS PROGRAMMABLE...
<                      LA CONSTANTE 'N' EST FONCTION
<                    DE LA FREQUENCE COURANTE 'FREQI'
<                    QUE L'ON SOUHAITE ; LORS DE LA
<                    RECEPTION D'UNE INTERRUPTION
<                    D'HORLOGE PAR 'ITHOR', ON FERA :
<
<                                    NBITH <-- (NBITH)+1,
<                                    SI (NBITH)=N, ALORS ON TRANSMET CETTE
<                                                  INTERRUPTION D'HORLOGE
<                                                  A 'HDLHOR' COMME INTER-
<                                                  RUPTION DE FIN DE PERIODE.
<
<
E702:    EQU         $
         BSR         VAR+ACFHOR      < RENVOIE : (A)=FREQUENCE EXPRIMEE
                                     < EN UNITE MULTIPLE DE 100 MS
E729:    EQU         $
         STA         VAR+FREHOR      < SAVE POUR LE DECOMPTE DE LA
                                     < DATE ET DE L'HEURE.
         STZ         VAR+NBITH       < RAZ COMPTEUR D'IT
         LAI         -FXHOR
         STA         VAR+KMSHOR      < REINITIALISATION DU DECOMPTEUR
                                     < DE SECONDES.
E703:    EQU         $
<
<
<        V A L I D A T I O N   D E S   I T   H O R L O G E
<
<
<        NOTA :
<                      ON VALIDE LES INTERRUPTIONS A CHAQUE FOIS QU'UNE
<                    INTERRUPTION A ETE RECUE ET TRAITEE ; EN EFFET, LA
<                    LA LECTURE DU MOT D'ETAT DANS 'ARIT' FAIT RETOMBER
<                    LE SOUS-NIVEAU, MAIS AUSSI DEVALIDE LES INTER-
<                    RUPTIONS !!!
<                      MAIS ATTENTION, A LA SORTIE DE 'ITHOR',
<                    ON LES REVALIDE AUSSI, AFIN DE DETECTER
<                    LES BLOCAGES DE L'HORLOGE (PAR EXEMPLE EN
<                    ATTENTE SUR UN DISQUE EN TIME-OUT, ALORS
<                    QUE LE SYSTEME NE PASSE JAMAIS EN 'IDLE'...
<
<
         LAI         MOMINT          < MOT DE COMMANDE DE VALIDATION
                                     < DES IT HORLOGE
         SIO         VAR+OPHOR       < SIO DE COMMANDE
<
<
<        T E S T   D ' A R R E T   D U   C A L C U L A T E U R  :
<
<
<        NOTA :
<                      ETANT DONE LA FREQUENCE ET SURTOUT
<                    LA PERIODICITE IMPLACABLE DES IT
<                    DE L'ORLOGE, IL FAUT PRENDRE
<                    MILLE PRECAUTIONS POUR ARRETER
<                    LE CALCULATEUR : L'ARRET SERA
<                    PROGRAMME : EN POSITIONNANT LA CLEF 0
<                    DU PUPITRE, HDLHOR POURRA DECIDER
<                    CET ARRET ; ALORS IL STOPERA L'
<                    HORLOGE, ET PASSERA LA MAIN
<                    AU RECOVERY ; AU RETOUR, IL REINITIALISERA
<                    L'HORLOGE.
<
<
         BSR         ASMPUI          < LECTURE PUPITRE RENVOIE
                                     < (A)=MOT LU
                                     < (B)=ETAT PUPITRE
                                     < (CARY)=INFORMATION VALIDE (1).
         JNC         E730            < NON, RIEN A FAIRE...
         BSR         VAR+APURGE      < PEUT-ETRE FAUT-IL PURGER LE BEBE ???
         JAGE        E730            < EN TOUT CAS, IL NE FAUT PAS ARRETER
                                     < LE SYSTEME...
<
< ARRET DU CALCULATEUR : BIT0=1 :
<
         BSR         VAR+AE707       < ARRET DE L'HORLOGE.
<
< BOUCLE DE BLOCAGE DES TACHES DU SYSTEME
< DE PRIORITE INFERIEURE A CELLE DE L'HORLOGE :
<
E730XX:  EQU         $
         LXI         K
         HALT                        < ON LAISSE AINSI TOUTES LES ENTREES-
                                     < SORTIES EN COURS SE TERMINER TRAN-
                                     < QUILLEMENT...
         CPZR        X               < S'EST-IL PASSE QUELQUECHOSE?
         JNE         E730XX          < OUI ALORS IL POURRAIT S'EN
                                     < PASSER ENCORE...
<
< BLOCAGE DE TOUT LE SYSTEME :
<
         BSR         ASYSER
<
< RELANCE DU SYSTEME :
<
         JMP         E702            < RELANCE DU CALCULATEUR.
<
< ATTENTE DES IT 'HORLOGE' :
<
E730:    EQU         $
<
<        A NOTER QU'AVANT L'ATTENTE DE L'IT-HORLOGE, ON
<        A ICI :
<                    A>=K !!!
<
         RQST        SIT             < ATTENTE IT.
         JAL         Z800            < (A)<0 : C'EST UNE FAUSSE IT
                                     <     HORLOGE, PROVOQUEE SOIT PAR
                                     <     'TEST & SET' NEGATIF, SOIT
                                     <     PAR 'RESET' POSITIF (CF. LE
                                     <     RECOVERY).
<
<
<        T R A I T E M E N T   D E S   I T   H O R L O G E  :
<
<
<        NOTA :
<                      ON SE SOUVIENT QUE LA FREQUENCE
<                    DE L'HORLOGE N'EST PAS PROGRAMMABLE ;
<                    CETTE PROGRAMMABILITE EST SIMULE A
<                    L'AIDE DU COMPTEUR 'NBITH', QUI PASSE
<                    PAR 0 LORSQUE L'INTERRUPTION REELLE-
<                    MENT GENEREE PAR L'HORLOGE PEUT ETRE
<                    CONSIDEREE COMME UNE FIN DE PERIODE
<                    PROGRAMMEE...
<
<
         CPZ         VAR+NBITH       < FIN DE PERIODE ???
         JNE         E703            < NON
         LA          HORIDC          < ACCES A LA PATTERN CYCLIQUE
                                     < COURANT DES ESCLAVES A SWAPPER
                                     < OUT A PRIORI.
         SCRS        S               < MODIFICATION CIRCULAIRE DE
                                     < CET INDICATEUR,
         STA         HORIDC          < ET MISE A JOUR.
         RQST        &ASEMSO         <<<<PHASE CRITIQUE AVEC LE
                                     < SWAPPER OUT.
         OR          SOCYCL          < MODIFICATION DE LA LISTE
                                     < CYCLIQUE DES ESCLAVES A
                                     < SWAPPER OUT A PRIORI.
         STA         SOCYCL          < ET MAJ.
         LAD         &ASEMSO
         BSR         ARLSE
<
< DECOMPTE DU TEMPS ECOULE :
<
         LA          VAR+FREHOR      < (A)=FREQUENCE DE L'HORLOGE.
         AD          VAR+KMSHOR      < DECOMPTE DES 1/10 DE SECONDES
         JAL         E704            < 1 SECONDE NE S'EST PAS ENCORE
                                     < ECOULEE.
<
<
<        1   S E C O N D E   S ' E S T   E C O U L E E  :
<        M A J   D A T E   &   H E U R E  :
<
<
         LXI         LOTIME          < POUR PARCOURS DE LA TABLE
                                     < DATHOR EN COMMENCANT PAR LES
                                     < SECONDES.
         IC          HTIME+D         < COMPTABILISATION JOURNALIERE
                                     < DES SECONDES.
         JNE         E904
         IC          HTIME           < PASSAGE DE HTIME+1 A 0.
E904:    EQU         $
         LA          &VAR+DATHOR
         ADRI        I,A             < COMPTABILISATION.
         SWBR        A,B             < (B)=OCTETS DE A INVERSES.
         CPR         A,B             < SI (A)=(B) C'EST QUE LES 2 OCTETS
                                     < DE A SONT EGAUX ET QUE DONC CETTE
                                     < ENTREE A ATTEINT SON MAX.
         JNE         E903            < NON, ELLE N'A PAS ATTEINT
                                     < SON MAX.
<
< CAS OU L'ENTREE COURANTE A ATTEINT SON
< MAX, IL FAUT LA REINITIALISER,
< ET PASSER A LA PRECEDENTE :
<
         SLLS        XXMAXT=K        < OCTET0(A)=MAX DE L'ENTREE (X).
                                     < ET OCTET1(A)=K.
         LB          VAR+MINHOR      < ACCES A LA TABLE DES VALEURS
                                     < D'INITIALISATION DES COMPOSANTES
                                     < DE LA DATE.
         TBT         NBITMO+L,X      < LE BIT DE RANG (X) DONNE LA
                                     < VALEUR INITIALE DE LA COMPO-
                                     < SANTE DE RANG (X).
         ADCR        A               < OCTET1(A)=VALEUR INITIALE (K/1).
         STA         &VAR+DATHOR     < REINITIALISATION ENTREE COURANTE.
         JDX         E904            < ENTREE PRECEDENTE.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      SURTOUT NE PAS CONTINUER EN SEQUENCE,
<                    CAR EN EFFET : (X)=K... PEUT-ETRE
<                    FAIRE UN 'JMP Z402'...
<
E903:    EQU         $
         STA         &VAR+DATHOR     < MAJ ENTREE COURANTE.
         BSR         VAR+ASPBIS      < TRAITEMENT DES FINS DE JOUR, DE MOIS
                                     < ET D'ANNEE...
Z402:    EQU         $
<
< CONVERSION EN ASCI DE LA DATE POUR
< LA GRAMMAIRE DU CCI, EN NE MODIFIANT
< DANS LE MESSAGE 'CCI' QUE LA PARTIE
< DE LA DATE/HEURE QUI A ETE MODIFIEE :
<
         LA          RINI            < OU EN EST-ON DE L'INITIALISQATION
                                     < DU SYSTEME ????
         JAG         E905            < C'EST FAIT.
         JAE         SYSR31          < OK.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      PEUT-ETRE UN 'JMP Z402', AU CAS
<                    OU 'RINI' AURAIT ETE MODIFIE
<                    A LA MAIN...
<
         JMP         Z402            < ATTENDONS L'ENTREE DE LA DATE...
SYSR31:  EQU         $
<
< CAS OU LA DATE EST BONNE, MAIS NON CONVERTIEE EN ASCI :
<
         IC          RINI            < MISE DE RINI A 1.
         LXI         I               < TOUTE LA DATE EST A CALCULER
                                     < EN ASCI.
         IF          I-IJIJDX,,XEIF%,
         IF          ATTENTION : LE 'LXI' CI-DESSUS EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
         IF          XXHANE+IJIJDX-I,,XEIF%,
         IF          ATTENTION : LE MEME INDEX NE PEUT SERVIR POUR
         IF          'EDATE' ET 'DATHOR' SIMULTANEMENT !!!
XEIF%:   VAL         ENDIF
E905:    EQU         $
         LBY         &VAR+EDATE
         LR          A,Y             < (Y)=RANG DU 1ER CARACTERE DE
                                     <     L'ENTREE COURANTE DANS LE
                                     <     MESSAGE DATE & HEURE.
         LA          &VAR+DATHOR     < ENTREE COURANTE DATE & HEURE.
         ANDI        XXMAXT)MMOT     < ON NE CONSERVE QUE LA PARTIE
                                     < COMPTABILITE (RAZ DU MAX).
         LR          A,B             < (B)=COMPTABILITE.
         LAI         K
         DV          DIX             < (A)=QUOTIENT, (B)=RESTE DE LA
                                     <     DIVISION PAR 10 DE LA COMPTABILITE
         ORI         HZERO           < CONVERSION ASCI DU QUOTIENT.
         XR          X,Y             < (X)=RANG DU QUOTIENT CODE EN ASCI
                                     <     DANS LE MESSAGE DATE & HEURE.
         STBY        &VAR+ADATE      < MAJ DATE & HEURE.
         ADRI        I,X             < CARACTERE SUIVANT DU MESSAGE.
         LR          B,A
         ORI         HZERO           < CONVERSION ASCI DU RESTE.
         STBY        &VAR+ADATE      < ET MISE DANS LE MESSAGE DATE &
                                     < HEURE.
         LR          Y,X             < RESTAURE INDEX DE DATHOR.
         ADRI        I,X             < ENTREE SUIVANTE EVENTUELLE.
         LYI         LOTIME+E
         CPR         X,Y
         JNE         E905            < BOUCLAGE JUSQU'A L'ENTREE
                                     < DES SECONDES (ENTREE 6).
         PAGE
         NLS
<
<
<        G E N E R A T I O N   D U   T O M   E D   E S S A P
<        D Y N A M I Q U E   S O U S   : S Y S  :
<
<
         LXI         XXDATM+I        < INDEX DU 2EME CIFFRE DES MINUTES.
         LBY         &VAR+ADATE      < RECUPERATION DU 2EME
                                     < CHIFFRE DU NOMBRE DE MINUTES.
XWOR%2:  VAL         M0001           < MASQUE FACULTATIF D'INVERSION DES
                                     < BITS CORRESPONDANT A LA VALEUR BAINAIRE
                                     < DU CHIFFRE DES UNITES.
         IF          BIT>NBITCX-N-XWOR%2,,XEIF%,XEIF%
         IF          ATTENTION : LE MASQUE FACULTATIF EST TROP GRAND !!!
XEIF%:   VAL         ENDIF
         EORI        HZERO?XWOR%2    < AINSI, SIMULTANEMENT, ON DECODE L'ASCI,
                                     < ET ON INVERSE DES BITS DE LA VALEUR
                                     < BINAIRE...
         BSR         ACHIFR          < CHIFFRAGE DU CHIFFRE DES UNITES...
         CPI         BASE10-Z        < LA CONVERSION EST-ELLE EN CHIFFRE ?
         JLE         E905X1          < OUI, C'EST UN CHIFFRE.
         ADRI        HA-HNEUF-Z,A    < CAS D'UNE LETTRE.
XWOR%6:  VAL         BASE10-Z+HZERO
XWOR%7:  VAL         BASE10-Z?HZERO
         IF          XWOR%6-XWOR%7,,XEIF%,
         IF          ATTENTION : ICI ET AILLEURS (CF. HEXEX)
         IF          LES CODAGES BINAIRES --> ASCI VONT MERDER !!!
XEIF%:   VAL         ENDIF
E905X1:  EQU         $
         ADRI        HZERO,A         < QUE L'ON RECODE EN ASCI...
         STBY        &VAR+PASSD      < QUE L'ON MET DIRECTEMENT COMME
                                     < 3EME CARACTERE DU TOM ED
                                     < ESSAP DE LOGIN SOUS :SYS !!!!
         LST
<
<
<        R E A R M E M E N T   E V E N T U E L
<        D ' U N   H A N D L E R  :
<
<
<        PHILOSOPHIE :
<                      UTILISE CONJOINTEMENT AVEC
<                    AVEC LE BIT0(SPHEX) D'UN HANDLER ;
<                    ON FERA DANS L'ORDRE :
<                    1- BIT0(SPHEX)<--0,
<                    2- NSPUP<--NSP(HANDLER).
<                      ON PEUT DONC AINSI PERMUTER LES
<                    NIVEAUX DES HANDLERS EN LES
<                    DESARMANT, PUIS EN LES RE-ARMANT
<                    A L'AIDE DE L'HORLOGE.
<
<
         LX          VAR+NSPUP       < (X)=NSP EVENTUEL.
         CPZR        X               < Y-A-T'IL UN HANDLER A REARMER ???
         JLE         Z704            < NON.
         ARM         NSNSP0,X        < OUI, REARMONS LE HANDLER
                                     < DE NSP=(X).
         STZ         VAR+NSPUP       < MEMORISATION DU REARMENT
                                     < EFFECTUE.
<
<
<        T E S T   D E S   T I M E D   O U T  :
<
<
Z704:    EQU         $
         DC          VAR+FRETO       < GENERATION DE LA PERIODE DE
                                     < TEST DES TIMED-OUT.
         JE          Z1250           < C'EST LE MOMENT DE TESTER
                                     < LES TIMED-OUT...
Z1251:   EQU         $               < PAS ENCORE DE TEST DE TIMED OUT,
                                     < OU RETOUR DE CE MEME TEST.
<
<
<        T R A C E   D U   T O P   1   S E C O N D E  :
<
<
         LXI         K
         XR          X,W             < SAVE & RAZ W.
         LAI         FNTOP           < NIVEAU D'IT 1 (FAUX NIVEAU TOP
                                     < 1 SECONDE).
         BSR         ATRACE
         LR          X,W             < RESTAURE (W)=@DEMANDE HORLOGE.
<
<
<        A T T E N T I O N  :
<                      MANQUE LA COMPTABILITE DES ESCLAVES...
<                    JE N'AURAI JAMAIS EU LE COURAGE
<                    DE L'IMPLEMENTER !!!
<
<
         LAI         -FXHOR
E704:    EQU         $
         STA         VAR+KMSHOR      < M-A-J DU DECOMPTEUR DE 1/10 SEC
<
<
<        T E S T   D E   S U S P E N S I O N
<        D E   L ' E C L A V E   C O U R A N T  :
<
<
<        CONVENTION :
<
<                      DCTSY(NSPACT) DONNE EN PERMANENCE L'ADRESSE
<                    DE LA DCT DE L'ESCLAVE ACTIF. SI CETTE ADRESSE
<                    EST NULLE, CELA SIGNIFIE QU'IL N'Y A PAS
<                    D'ESCLAVE ACTIF...
<                      MAIS, ATTENTION, TOUTES LES
<                    RECIPROQUES DE CETTE PROPOSI-
<                    TION SONT FAUSSES !!!
<
<        DCTSY(NSPACT)<--ADRESSE DCTESC : PAR LE 'RUNNER',
<        DCTSY(NSPACT)<--0              : PAR 'RUNSVC',
<        DCTSY(NSPACT)<--0              : PAR 'HDLHOR'.
<        DCTSY(NSPACT)<--0              : PAR 'DOWN' LORSQU'UN ESCLAVE
<                                         DESCEND DE LA MEMOIRE HAUTE.
<
<
<        A T T E N T I O N  :
<                      ETANT DONNE QUE L'ON NE PEUT MASQUER LES
<                    INTERRUPTIONS DANS LE SCHEDULER DE TELLE
<                    FACON QUE LE 'STA &ADCTSY' ET LE
<                    'ARM NSNSP0+NSPACT' SOIENT INDISSOCIABLES,
<                    LE TEST A FAIRE SUR LA L'ACTIVITE DES
<                    ESCLAVES PORTERA SUR 'ASTF'...
<
<
         LYI         FONTB           < FONCTION TEST BIT.
         LXI         NSNSP0+NSPACT   < NIVEAU SOFT DES ESCLAVES.
         LAD         AASTF           < @ DU RELAI D'ACCES A ASTF.
         BSR         ATMOBT          < CETTE PHASE EST INTERRUPTIBLE,
                                     < CAR ON NE FAIT QUE TESTER ASTF,
                                     < ET ENCORE POUR UN NIVEAU MOINS
                                     < PRIORITAIRE.
         JNC         E705            < LE NIVEAU D'EXECUTION ESCLAVE
                                     < EST INACTIF, IL N'Y A DONC
                                     < RIEN A FAIRE...
<
< CAS OU LE NIVEAU ESCLAVE EST ACTIF :
<
<
< TEST D'UN RUN ESCLAVE JUSTE INITIALISE :
<
         DC          BHRUN
         IF          XBHRUN-I,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         JGE         E705            < SI BHRUN>=K, ON CONSIDERE QUE
                                     < RUNER VIENT JUSTE D'INTIALISER
                                     < L'ESCLAVE QUI EST ACTIF, ET
                                     < ON ATTEND L'IT SUIVANTE POUR
                                     < AGIR EVENTUELLEMENT (EN EFFET,
                                     < ENTRE TEMPS CET ESCLAVE PEUT
                                     < OU EST DEJA EN 'SVC').
<
< CAS D'UN 'TEST & SET' NEGATIF,
< OU D'UN 'RESET' POSITIF :
<
Z800:    EQU         $
<
< CAS DE LA 2EME IT HORLOGE POUR
< UN MEME ESCLAVE (BHRUN=-1),
< OU CAS DES FAUSSES INTERRUPTIONS
< D'HORLOGE ('TH0' OU 'HDLSER') :
<
         LB          VAR+OTSUSP
         PSR         L               < SAVE @DCT-HORLOGE.
         LXI         NSPACT
         BSR         ACADCT          < (L)=@DCT-ESCLAVE (OU RECOVERY
                                     <     DANS LES AUTRES CAS...
         LA          RS+XXPSTD,L     < TEST DU REGISTRE S DE L'ESCLAVE
                                     < COURANT.
         JAL         E706            < L'ESCLAVE ETANT EN MODE MAITRE,
                                     < C'EST QU'IL EST DANS SVCESC,
                                     < 'SVCESC' ET 'RUNSVC' VONT
                                     < DESARMER LE NIVEAU ET METTRE A
                                     < JOUR DCTSY.
         LAI         NSPHOR          < NSP BIDON QUE L'ON MET DANS
                                     < DEMESC, AFIN QUE SWAPO NE SE
                                     < TRANSFORME PAS EN SWAPOP, POUR
                                     < 'FAUX SERVICE IMMEDIAT'...
         STBY        DEMESC-DCTESC+XXNSP,L
         STZ         DEMESC-DCTESC+T+CODEM,L
                                     < (EN VUE DU PASSAGE DANS SWAPO...)
<
< SUSPENSION DE L'ESCLAVE COURANT (MODE ESCLAVE) :
<
<        ON A ICI :
<                    (X)=NSPACT,
<                    (L)=ADRESSE DCT(ESCLAVE) ACTIF (EN EXECUTION).
<                    (B)=ADRESSE AUTOMATE DE SUSPENSION.
<
< DESARMEMENT DU NIVEAU D'EXECUTION ESCLAVE :
<
         LYI         FONRB0          < FONCTION RESET (A 0).
         LAD         AASTF           < RELAI D'ACCES A ASTF.
         BSR         ASMMK           <<<< MASQUAGE GENERAL DES IT
<
<        P H A S E   I N I N T E R R U P T I B L E  :
<
         STZ         &ADCTSY         < EN RAZANT DCTSY(NSPACT), ON
                                     < MEMORISE QU'IL N'Y A PLUS
                                     < D'ESCLAVE EN EXECUTION.
         LXI         NSNSP0+NSPACT   < (X)=NIVEAU SOFT D'EXECUTION-ESCLAVE.
         BSR         ATMOBT          < ASTF(NSNSP0+NSPACT)=K.
         BSR         ASMDK           <<<< DEMASQUAGE GENERAL DES IT
         BSR         ADOWN           < OU EST L'ESCLAVE ???
         JE          E706            < IL EST EN MEMOIRE DE SWAPPING HAUTE,
                                     < DONC, IL A DEJA UN NIVEAU DE SERVICE
                                     < QUE 'ADOWN' A D'AILLEURS REVEILLE...
         BSR         AALOHS          < DEMANDE D'ALLOCATION D'UN
                                     < HANDLER DE SERVICE POUR L'ESCLAVE
                                     < EN EXECUTION :
                                     < (L)=@DCT-ESCLAVE,
                                     < (B)=@AUTOMATE DE SUSPENSION.
E706:    EQU         $
         PLR         L               < RESTAURE (L)=@DCT-HORLOGE.
E705:    EQU         $
<
<
<        A T T E N T I O N  :
<                      LA SEQUENCE QUI SUIT EST EXECUTEE
<                    QU'IL S'AGISSE D'UNE VRAIE INTERRUP-
<                    TION D'HORLOGE, OU QU'IL S'AGISSE D'UNE
<                    FAUSSE (VOIR L'ACTION DE 'TH0' SUR LA
<                    TACHE HORLOGE) !!!
<
<
         BSR         VAR+ACFHOR      < RENVOIE :
                                     < (A)=FREQUENCE EXPRIMEE EN UNITES MUL-
                                     <     TIPLES DE 100 MS...
         CP          VAR+FREHOR      < EST-CE LA FREQUENCE D'INITIALISATION.
         JNE         E729            < NON, C'EST DONC QU'UNE RE-
                                     < INITIALISATION DE L'HORLOGE A
                                     < ETE DEMANDEE.
         CPZ         VAR+CCOPY       < FAUT-IL FAIRE UNE COPY DU SYSTEME ???
         JLE         Z1250A          < ET OUI...
Z1250B:  EQU         $
         JMP         E703            < VERS LA REVALIDATION DES IT HORLOGE
                                     < ET L'ATTENTE DE L'IT SUIVANTE
         RSR                         < ...NE SERA JAMAIS EXECUTE...
         PAGE
<
<
<        T R A I T E M E N T   D E S   C H A N G E M E N T S
<        D E   J O U R S ,   D E   M O I S   E T   D ' A N N E E S  :
<
<
<        FONCTION :
<                      CE MODULE MIS EN SOUS-PROGRAMME POUR
<                    EVITER DES PROBLEMES DE SAUTS SUPERIEURS
<                    A 128 MOTS, A POUR FONCTION :
<                    1 - SI UNE ANNEE S'EST ECOULEE, ON REGARDE
<                    SI LA NOUVELLE EST BISSEXTILE, AFIN DE
<                    PREVOIR LE CAS DU MOIS DE FEVRIER.
<                    2 - SI UN MOIS S'EST ECOULE, ON MET EN
<                    PLACE LE NOMBRE DE JOURS DU NOUVEAU MOIS.
<                    3 - SI UN JOUR S'EST ECOULE, ON REINI-
<                    TIALISE LE COMPTEUR QUOTIDIEN.
<                    4 - SI UNE MINUTE S'EST ECOULE,
<                    ELLE DEBLOQUE SYSTEMATIQUEMENT
<                    LES UTILISATEURS QUI SE TROUVE-
<                    RAIENT BLOQUES SUR 'SEMCDA' ; LA
<                    DUREE DU "TIME-OUT" SUR 'SEMCDA'
<                    EST DONC EXTREMENT VARAIBLE (DE
<                    0 A 59 SECONDES...) MAIS C'EST
<                    COMME CELA ET PAS AUTREMENT POUR
<                    DES RAISONS EVIDENTES DE SIMPLI-
<                    CITE...
<
<
<        ARGUMENT :
<                    (X)=NUMERO DE LA DERNIERE COMPOSANTE DE LA
<                        DATE MISE A JOUR (LA MISE A JOUR SE
<                        FAISANT DES SECONDES VERS LES ANNEES).
<
<
SPBIS:   EQU         $
XKREG:   VAL         K               < INITIALISATION DU CUMUL DES REGISTRES...
       #@PSR         X               < #SISP CMS5 KREG#
                                     < (PAR COMPATIBILITE AVEC 'TOCDAG'...)
REGBIS:: VAL         -XKREG          < NOMBRE DE REGISTRES EMPILES...
         LR          X,A             < (A)=NUMERO DE LA DERNIERE COMPOSANTE MODI
                                     <     FIEE DANS LA DATE COURANTE (N'OUBLION
                                     <     PAS QU'ON MODIFIE LA DATE A REBROUSSE
                                     <     POILS : DES SECONDES VERS LES ANNEES.
         CPI         XXHMIN+IJIJDX   < UNE MINUTE S'EST-ELLE ECOULEE ???
         JE          TOCDA1          < OUI, ALLONS EMETTRE UN TIME-OUT SUR LA
                                     < SYNCHRONISATION SUR 'CDAG0'...
                                     < EN FAIT, ON NE SE CASSE PAS LA
                                     < NENETTE... A CHAQUE CHANGEMENT
                                     < DE MINUTE, ON REVEILLE A PRIORI
                                     < LES UTILISATEURS (VIA 'HDLSER')
                                     < QUI SONT BLOQUES SUR 'SEMCDA'...
<
< TRAITEMENT DES JOURS, MOIS ET ANNEES :
<
         CPI         XXHJOU+IJIJDX   < UN JOUR S'EST-IL ECOULE ???
         JG          SPBIS4          < NON, C'EST FINI...
         IF          XXHJOU-XXHANE,,,XEIF%
         IF          ATTENTION : LES TESTS SONT MAUVAIS !!!
XEIF%:   VAL         ENDIF
         IF          XXHJOU-XXHMOI,,,XEIF%
         IF          ATTENTION : LES TESTS SONT MAUVAIS !!!
XEIF%:   VAL         ENDIF
<
< CAS D'UN JOUR (OU UN MOIS, OU UNE ANNEE) QUI S'EST ECOULE :
<
         STZ         HTIME           < REINITIALISATION
         STZ         HTIME+D         < DU COMPTEUR QUOTIDIEN...
         CPI         XXHANE+IJIJDX   < UNE ANNEE S'EST-ELLE ECOULEE ???
         JG          SPBIS1          < NON, MAIS PEUT-ETRE UN MOIS...
<
< CAS DU "NOUVEL AN" (BONNE ANNEE LA "SEMS"...) :
<
         PSR         A,X
         LXI         XXHANE+IJIJDX*NOCMO+XXDX
         LBY         &VAR+DATHOR     < (A)=NOUVELLE ANNEE,
XWOR%1:  VAL         BISSEX=K
         SLLS        NBITMO-XWOR%1
         CPI         K               < EST-ELLE BISSEXTILE ???
         LAI         FEVR29          < OUI A PRIORI...
         JE          SPBIS2          < ET OUI...
         LAI         FEVR28          < ET NON...
SPBIS2:  EQU         $
         LXI         FEVRIE
         STBY        &VAR+MOIHOR     < DANS TOUS LES CAS, ON MODIFIE LE NOMBRE
                                     < DE JOURS DU MOIS DE FEVRIER...
         PLR         A,X
SPBIS1:  EQU         $
         CPI         XXHMOI+IJIJDX   < UN MOIS S'EST-IL ECOULE ???
         JG          SPBIS3          < NON...
<
< CAS OU UN MOIS (OU UNE ANNEE) S'EST ECOULE :
<
         PSR         A,X
         LXI         XXHMOI+IJIJDX*NOCMO+XXDX
         LBY         &VAR+DATHOR     < (A)=MOIS COURANT,
         LR          A,X
         LBY         &VAR+MOIHOR     < (A)=NOMBRE DE JOURS DU MOIS (X),
XWOR%1:  VAL         XXMAXT)MMOT=K/NBITOC
         IF          XXMAXT-MOCG,,XEIF%,
         IF          ATTENTION : 'XXMAXT' DOIT ETRE 'MOCG' !!!
XEIF%:   VAL         ENDIF
         LXI         XXHJOU+IJIJDX*NOCMO+XWOR%1
         STBY        &VAR+DATHOR     < QUE L'ON MET EN LIMITATION DU NUMERO
                                     < DU JOUR...
         PLR         A,X
SPBIS3:  EQU         $
<
< SORTIE :
<
SPBIS4:  EQU         $
         PLR         X               < (PAR COMPATIBILITE AVEC 'TOCDAG'...)
         RSR
         PAGE
<
<
<        D E B L O Q U A G E   A   P R I O R I   D E
<        L A   S Y N C H R O N I S A T I O N   S U R
<                    L E   M O T   ' C D A G 0 '  :
<
<
<        FONCTION :
<                      CE MODULE EST REFERENCE PAR
<                    DEUX DEMANDEURS DISTINCTS :
<                    1 - L'HORLOGE A CHAQUE CHAN-
<                    GEMENT DE MINUTES ;
<                    2 - LE 'CCI' SUITE A LA COMMANDE
<                    "!CDAX".
<                      CE MODULE DEBLOQUE A PRIORI
<                    LES TACHES EN ATTENTE DES VALEURS
<                    POSITIVES DE 'CDAG0', QUELQUE
<                    SOIT LA VALEUR DE 'CDAG0'...
<
<
<        A T T E N T I O N  :
<                      AUX 'PSR' EFFECTUES A
<                    L'ENTREE DE 'SPBIS' QUI
<                    DOIVENT CORRESPONDRE A
<                    CEUX DE 'TOCDAG !!!
<
<
TOCDAG:  EQU         $
XKREG:   VAL         K               < INITIALISATION DU CUMUL DES REGISTRES.
       #@PSR         X               < #SISP CMS5 KREG#
                                     < SAVE L'INDEX DE LA GRAMMAIRE 'CCI'...
XWOR%7:  VAL         -XKREG          < NOMBRE DE REGISTRES EMPILES...
         IF          REGBIS-XWOR%7,,XEIF%,
         IF          ATTENTION : IL Y A INCOMPATIBILITE ENTRE
         IF          LES POINTS D'ENTREE DE 'SPBIS' ET 'TOCDAG' !!!
XEIF%:   VAL         ENDIF
<
< POINT D'ENTREE DE 'SPBIS' :
<
TOCDA1:  EQU         $
<
< DEBLOCAGE DE 'SEMCDA' :
<
         BSR         ASMMK           < M A S Q U A G E   I N T E R R U P T I O N
                                     < (A CAUSE DE 'ITHOR' QUI EXECUTE LE
                                     < 'SVC' MAITRE 'SVCM9'...).
TOCDA6:  EQU         $
         LA          &ASEMCD         < (A)=MOT0 DE 'SEMCDA',
         BSR         ABETA           < (A)=BETA(SEMCDA) :
         IF          XXSEM0-K,,XEIF%,
         IF          ATTENTION : LE TEST QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         JAGE        TOCDA7          < ET BIEN, IL N'Y A RIEN A FAIRE PUISQUE
                                     < PERSONNE N'EST BLOQUE DESSUS...
         LAD         &ASEMCD         < IL Y A AU MOINS UN UTILISATEUR BLOQUE,
         BSR         ARLSE           < ON FAIT UN RELASE DU SEMAPHORE 'SEMCDA',
                                     < DONT L'ADRESSE EST DANS 'A'...
         JMP         TOCDA6          < VERS L'EVENTUEL UTILISATEUR BLOQUE
                                     < SUIVANT SUR 'SEMCDA'...
TOCDA7:  EQU         $
         BSR         ASMDK           < D E M A S Q U A G E...
<
< SORTIE DU MODULE :
<
         PLR         X               < RESTAURE 'X'...
         RSR                         < THAT'S ALL FOLK ??!?!
         PAGE
<
<
<        T E S T   D E S   T I M E D - O U T  :
<
<
<        FONCTION :
<                      CE MODULE IMPLEMENTE ICI POUR DES
<                    RAISONS D'ASSEMBLAGE (SAUTS RELATIFS
<                    LIMITES A YY7 MOTS), PERMET DE
<                    TESTER LES TIMED-OUT SUR CERATINS
<                    HANDLERS PERIPHERIQUES. SI LE TEST
<                    DE TIMED OUT N'EST PAS INHIBE POUR UN
<                    HANDLER (TESTO#0) ; LORSQU'A CHQUA PASSAGE
<                    LE BETA(SIT) DE CE HANDLER EST NEGATIF,
<                    ELLE DECREMENTE LE COMPTEUR COURANT DE
<                    TIMED OUT (TIMOUT), ET LORSQUE CELUI-CI
<                    PASSE PAR 0, ELLE PROVOQUE UNE FAUSSE
<                    INTERRUPTION SUR CE HANDLER, AFIN
<                    DE LE REVEILLER.
<
<
Z1250:   EQU         $
<
< TEST DES TIME-OUT :
<
         LAI         IFRETO
         STA         VAR+FRETO       < REINITIALISATION DU GENERATEUR
                                     < DE LA PERIODE DE TEST DES
                                     < TIMED OUT.
         BSR         VAR+ASPTO       < DETECTION ET TRAITEMENT DES TIME-OUT.
<
< FAUT-IL METTRE EN PLACE LE BIT 'MAINT' DANS 'ST', OU L'ENLEVER ???
< (IL S'AGIT, RAPPELONS-LE DU BIT QUI
< PERMET D'IGNORER LES DEFAUTS DE PARITE
< RENCONTRES ; ON POURRA DONC LE FORCER
< A LA MAIN POUR PASSER UN CAP DIFFICILE
< SUR 'MEMTV' EN PARTICULIER...)
<
         RDSI
         ANDI        MSBOOT
XWOR%1:  VAL         MSBOOT=K
         SLRS        XWOR%1          < (A)=POSITION DU SELECTEUR DE BOOTSTRAP...
         CPI         HORROM          < FAUT-IL FORCER 'MAINT' ???
         LAI         COSBT?MAINT=FMASK(K=FCINST
         JNE         Z1250U          < NON, IL FAUT RAZER 'MAINT'...
         PSR         A               < OUI,
         LA          MEMV
         TBT         MEMXXX          < MAIS EST-CE AUTORISE ???
         PLR         A
         JNC         Z1250U          < NON, DONC ON LE RAZE (NE PAS OUBLIER QUE
                                     < 'SVCM3' TESTE AUSSI 'HORROM' SUR LE SE-
                                     < LECTEUR DE BOOTSTRAP LORS DE LA SIMULA-
                                     < TION DES ENTREES...).
         SST                         < OUI, QUEL DANGER, MAIS N'OUBLIONS PAS
                                     < QUE 'IDLE' VISUALISE CE FAIT AU
                                     < PUPITRE COMME 'MEMXXX' !!!
         JMP         Z1251           < VERS LA SUITE DU TRAITEMENT DES
                                     < INTERRUPTIONS DE SECONDE...
Z1250U:  EQU         $               < OUI,
         RST                         < ET ON EFFACE 'MAINT' DANS 'ST'...
         JMP         Z1251           < VERS LA SUITE DU TRAITEMENT
                                     < DES INTERRUPTIONS DE SECONDE.
         PAGE
<
<
<        C O P Y   P E R I O D I Q U E   D U   S Y S T E M E  :
<
<
Z1250A:  EQU         $
XWOR%5:  VAL         K               < A PRIORI LA CONSTANTE CONTENUE DANS
                                     < MKCOP(ETASYS) EST PRISE TELLE QUELLE.
         IF          FXHOR/10-4,XEIF%,,
XWOR%5:  VAL         S               < SI LA FREQUENCE REELLE DE L'HORLOGE EST
                                     < TROP ELEVEE, LA CONSTANTE MKCOP(ETASYS)
                                     < SERA DECALEE DE XWOR%5...
XEIF%:   VAL         ENDIF
         LA          ETASYS
         ANDI        MKCOP           < (A)=CONSTANTE MAL CADREE,
XWOR%1:  VAL         MKCOP=K
XWOR%2:  VAL         BIT>XWOR%1-N)MFFFF
XWOR%3:  VAL         MKCOP)MFFFF(XWOR%2
XWOR%4:  VAL         XWOR%3=K
         SLLS        NBITMO-XWOR%4   < CADRAGE DE RECUPERATION DU BIT DE SIGNE,
         SARS        NBITMO-XWOR%4+XWOR%1-XWOR%5
                                     < (A)=MODULATION SIGNEE DE LA PERIODE
                                     < DES COPY...
Z1250Q:  EQU         $
         ADRI        PCOPY,A         < (A)=PERIODE DES COPY EXPRIMEE EN UNITE
                                     < 'QUANTUM DE TEMPS UTILISATEUR'.
         JAG         Z1250R          < OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
         JMP         Z1250Q          < ET PUIS ON ITERE...
Z1250R:  EQU         $
         STA         VAR+CCOPY       < REINITIALISATION DU GENERATEUR DES
                                     < PERIODE DE COPY DU SYSTEME.
         PSR         W
         LB          ETASYS
         TBT         OTOCOP+NBITMO   < LA COPY EST-ELLE ON ???
         JC          Z1250K          < NON (MAIS QUEL DANGER !!!).
<
< ROTATION DE L'INDICATEUR
< 'PATCOP' ET AIGUILLAGE :
<
         LA          VAR+PATCOP
         SCRS        S               < ROTATION DE LA PATTERN CYCLIQUE...
         STA         VAR+PATCOP
         LRM         Y
         WORD        SCOPY1          < (Y)=ADRESSE 'DKF' DE LA PREMIERE ZONE
                                     <     DE 'COPY'.
         TBT         PATMF1          < ???
         JC          Z1250M          < C'EST LA COPY 1 MEMOIRE --> DKF...
         TBT         PATF            < ???
         JC          Z1250O          < C'EST LA LECTURE 'DKF'...
         LRM         Y
         WORD        SCOPY2          < (Y)=ADRESSE 'DKF' DE LA DEUXIEME ZONE
                                     <     DE 'COPY'.
         TBT         PATMF2          < ???
         JC          Z1250M          < C'EST LA COPY 2 MEMOIRE --> DKF...
         TBT         PATM            < ???
         JC          Z1250N          < C'EST L'ECRITURE SUR 'DKM'...
         JMP         Z1250K          < RIEN QUELLE JOIE...
<
< LECTURE DU SECTEUR COURANT DE 'DKF' :
<
Z1250O:  EQU         $
         STZ         VAR+VALCFM      < A PRIORI PAS DE LECTURE 'DKF'...
         TBT         OTOCFM+NBITMO   < LA COPY 'DKF' --> 'DKM' EST-ELLE ON ???
         JC          Z1250K          < NON, RIEN A FAIRE...
         TBT         NSPDKF-NSPDK+NBITMO < DKF PRESENT ???
         JNC         Z1250K          < NON, DONC PAS DE COPIE DKF --> DKM...
         IC          VAR+VALCFM      < IL Y A LECTURE 'DKF'...
         LRM         W
         WORD        VARHOR+DCOPYM   < OUI,
         BSR         ACHANW          < ATTENTE EVENTUELLE DU 'DKM'...
         ADRI        DCOPYF-DCOPYM,W < PASSAGE SUR LA DEMANDE 'DKF',
         LA          ARGDEM+ASDEM
         ADRI        I,A             < PASSAGE AU SECTEUR SUIVANT,
         CP          VAR+COPS2       < MAIS EST-IL VALIDE ???
         JL          Z1250P          < OUI, IL EST BON...
         LA          VAR+COPS1       < NON, ON RECOMMENCE AU DEBUT...
Z1250P:  EQU         $
         STA         ARGDEM+ASDEM    < MISE EN PLACE DU SECTEUR COURANT...
         BSR         ACHAND          < ET ENVOI DE LA DEMANDE...
         JMP         Z1250K          < ET C'EST TOUT...
<
< ECRITURE DU SECTEUR COURANT SUR 'DKM' :
<
Z1250N:  EQU         $
         CPZ         VAR+VALCFM      < Y-A-T'IL EU LECTURE 'DKF' ???
         JE          Z1250K          < NON, DONC PAS D'ECRITURE 'DKM'...
         TBT         NSPDKF-NSPDK+NBITMO < DKF PRESENT ???
         JC          Z1250T          < OUI, DONC COPIE DKF --> DKM...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      VOIR POURQUOI IL Y A EU UNE LECTURE
<                    SUR 'DKF', ALORS QUE LE VRAI 'DKF'
<                    EST ABSENT (VOIR 'ETASYS') !!!
<
         JMP         Z1250K          < ET ON NE FAIT RIEN...
Z1250T:  EQU         $
         LRM         W
         WORD        VARHOR+DCOPYF   < OUI,
         LA          ARGDEM+ASDEM    < (A)=ADRESSE DU SECTEUR COURANT,
         BSR         ACHANW          < ATTENTE DU 'DKF' EVENTUELLEMENT...
         ADRI        DCOPYM-DCOPYF,W < PASSAGE SUR LA DEMANDE A 'DKM',
         JMP         Z1250P          < VERS LA MISE A JOUR DE L'ADRESSE
                                     < DU SECTEUR COURANT A ECRIRE SUR 'DKM', ET
                                     < L'ENVOI DE LA DEMANDE...
Z1250S:  JMP         Z1250B          < RELAI...
<
< COPY MEMOIRE --> 'DKF' :
<
Z1250M:  EQU         $
         LXI         PROESC
         CPZ         &SYSPRO         < Y-A-T'IL UN PROCESSEUR ESCLAVE ???
         JGE         Z1250D          < OUI, C'EST LUI QUI PREPARE LES
                                     < INFORMATIONS DE COPY.
         BSR         VAR+AHCOPY      < NON, C'EST A L'HORLOGE DE LE FAIRE.
Z1250D:  EQU         $
         LAD         VAR+DCOPY2
         LR          A,W             < (W)=ADRESSE DE LA DEMANDE DE COPY.
         LA          NSPTYP          < ACCES A SON 'NSPTYP',
         TBT         ENFILE          < NE SERAIT-ELLE PAS ENCORE EN FILE
                                     < D'ATTENTE ??? CELA PEUT SE PRODUIRE
                                     < DANS LE CAS OU 'DKF' SERAIT EN
                                     < TRAIN D'ITERER SUR UN DEFAUT...
         JC          Z1250K          < ET OUI, ON PASSE LA MAIN...
         STY         ARGDEM+ASDEM    < SELECTION DE LA ZONE DE 'COPY'...
         BSR         ACHAND          < ENVOI DE LA DEMANDE DE COPY, MAIS
                                     < SANS ATTENTE, C'EST INUTILE DE
                                     < BLOQUER L'HORLOGE !!!
Z1250K:  EQU         $
<
<
<        P R E V E N T I O N   D E S   I N T E R B L O C A G E S
<        S U R   A T T E N T E   D E   B U F F E R S  :
<
<
<        PHILOSOPHIE :
<                      A LA FREQUENCE DES COPIES DU SYSTEME,
<                    L'HORLOGE EXAMINE BETA(SCHVID(HDLALB)) ; SI
<                    ELLE VOIT QUE CETTE TACHE N'A RIEN A
<                    FAIRE (BETA=-1), ET SI ELLE N'A PAS
<                    EMMAGASINEE UN MAXIMUM ('NPREBB') DE BUFFERS,
<                    ELLE ENVOIE UNE DEMANDE A 'HDLALB' AVEC
<                    ATTENTE ; SI LE BUFFER N'EST PAS DISPONIBLE,
<                    ON DEMANDE UN RETOUR IMMEDIAT AFIN DE
<                    NE PAS BLOQUER LE SYSTEME. ENFIN LE TEST
<                    DU 'BETA', ET LE DEBUT DE L'ENVOI DE LA
<                    DEMANDE PAR 'CHAND' SE FAIT AVEC LES
<                    INTERRUPTIONS MASQUEES AFIN DE GARANTIR
<                    LA DISPONIBILITE DE 'HDLALB' (ELLES SE
<                    RETROUVENT DEMASQUEES LORS DU PREMIER
<                    'RQST SPHEX' FAIT PAR 'CHAND' !!!).
<                      A CETTE MEME FREQUENCE, SI ON VOIT QUE
<                    DES DEMANDES SONT EN ATTENTE DE BUFFERS
<                    (BETA>=K), ALORS ON LIBERE UN BUFFER DE LA
<                    PILE DE STOCKAGE SI CELA EST POSSIBLE.
<
<
         PSR         L
         LAD         VAR+DPREBB
         LR          A,W             < (W)=@DEMANDE ALLOCATION/RELEASE.
         LXI         NSPALB
         BSR         ACADCT          < RENVOIE : (L)=@DCT(HDLALB).
         BSR         ASMMK           < MASQUAGE DES INTERRUPTIONS AFIN
                                     < DE GARANTIR LA VALEUR DE BETA...
         BSR         ATEC            < Y-A-T'IL DES DEMANDES CHAINEES ???
         PLR         L
         JNE         Z1250E          < CAS DEFAVORABLE... YA DU MONDE...
<
< CAS FAVORABLE : 'HDLALB' EST LIBRE ;
< SI ON N'A PAS ASSEZ DE BUFFERS EN
< STOCK, ON VA EN DEMANDER UN...
<
         LA          VAR+KPREBB      < COMBIEN EN A-T'ON ???
         CPI         NPREBB          < LE MAXIMUM ???
         JE          Z1250F          < OUI, RIEN A FAIRE ON SORT...
         JL          Z1250I          < NON, ON PEUT EN REDEMANDER.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
         JMP         Z1250F          < ET ON ABANDONNE...
Z1250I:  EQU         $
         LAI         NSPALB
         STBY        NSPTYP          < DEMANDE D'ALLOCATION.
         IC          ARGDEM+AMDEM    < PROGRESSION DE L'ADRESSE STOCKAGE.
         BSR         ACHAND          < DEMANDE D'ALLOCATION D'UN BUFFER SANS
                                     < BLOCAGE SI NON DISPONIBLE...
<
<
<        A T T E N T I O N  :
<                      ON NE DEMASQUE PAS LES INTERRUPTIONS,
<                    CAR LE MICRO-SCHEDULER L'A DEJA FAIT (!!!)
<                    LORS DE L'APPEL DE 'CHAND'...
<
<
         WAIT        WEIO            < ATTENTE DE FIN DE SERVICE...
         LA          ARGDEM+ETADEM   < TEST DES CONDITIONS DE RETOUR.
         JAE         Z1250J          < OK, UN BUFFER A ETE ALLOUE.
         DC          ARGDEM+AMDEM    < ET NON, ON ANNULE CE QU'ON AVAIT FAIT.
         JMP         Z1250F          < ET C'EST TOUT...
Z1250J:  EQU         $
         IC          VAR+KPREBB      < ET UN BUFFER DE PLUS...
         JMP         Z1250F          < C'EST FINI...
<
< CAS DEFAVORABLE : 'HDLALB' EST TRES
< OCCUPE, ON VA EN RENDRE UN :
<
Z1250E:  EQU         $
         BSR         ASMDK           < DEMASQUAGE DES INTERRUPTIONS...
         LA          VAR+KPREBB      < (A)=NOMBRE DE BUFFERS "AU CHAUD" :
         JAGE        Z1250H          < OK, (A) EST VALIDE...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
         STZ         VAR+KPREBB      < ET ON CLEAR 'KPREBB'...
         JMP         Z1250F          < VERS LA SORTIE...
Z1250H:  EQU         $
CPIB0:   CPI         NPREB0          < PEUT-ON EN LIBERER UN ???
         JLE         Z1250F          < NON, DONC ON SORT...
         DC          VAR+KPREBB      < OUI, ET UN BUFFER DE MOINS...
         LAI         NSPRLB
         STBY        NSPTYP          < DEMANDE DE RELEASE 1 BUFFER,
         BSR         ACHAND          < ENVOI DE LA DEMANDE...
         WAIT        WEIO            < ATTENTE DE FIN DE RELEASE.
         DC          ARGDEM+AMDEM    < ET DEPILEMENT DE L'ADRESSE
                                     < DU BUFFER RENDU...
<
< FIN :
<
Z1250F:  EQU         $
         BSR         ASMIT           < LES INTERRUPTIONS SONT-ELLES RESTEES
                                     < MASQUEES ???
         JAE         Z1250L          < NON, ELLES SE SONT DEMASQUEES PAR UN
                                     < CHANGEMENT DE CONTEXTE (VOIR LE MICRO-
                                     < SCHEDULER), ET NON PAR 'DMMK' ; EN
                                     < EFFET, ON VEUT GARANTIR LE BETA DE
                                     < 'HDLALB'...
         BSR         ASMDK           < OUI, ALORS ON DEMASQUE...
Z1250L:  EQU         $
         PLR         W
         JMP         Z1250S          < ET C'EST TOUT...
         PAGE
<
<
<        P R E P A R A T I O N   D E   L A   C O P Y  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME, EN FONCTION
<                    DE LA LISTE POINTEE PAR 'NSPSAV',
<                    REGROUPE DANS LE BUFFER 'BCOPY'
<                    LES INFORMATIONS A COPIER.
<                      IL EST APPELE PERIODIQUEMENT PAR
<                    LE PROCESSEUR ESCLAVE S'IL EXISTE,
<                    ET PAR L'HORLOGE SINON, ET ENFIN
<                    PAR LE 'SVC' MAITRE 'SVCM7' QUI
<                    FORCE DES COPIES SYNCHRONES...
<
<
<        ATTENTION : DETRUIT LE REGISTRE 'X' !!!
<
<
KOPY:    EQU         $
MOPY:    EQU         KOPY            < A CAUSE DE L'ASSEMBLEUR...
         PSR         Y,L,W           < PRUDENCE...
         LRM         Y
         WORD        BCOPY           < (Y)=ADRESSE DU BUFFER DE COPY.
         IF          MNUBUS?MNUPRO=K-K,,XEIF%,
         IF          ATTENTION : ICI ET AILLEURS, IL MANQUE UN
         IF          DECALAGE DE RECADRAGE DU NUMERO DE PROCESSEUR !!!
XEIF%:   VAL         ENDIF
         RDSI
         ANDI        MNUBUS?MNUPRO   < (A)=IDENTITE DU PROCESSEUR COURANT,
         LXI         PROESC
         CP          &SYSPRO         < EST-CE L'ESCLAVE ???
         JE          KOPY7           < OUI, 'L' GARDE SA VALEUR ('DCTPR1')...
         EORR        L,L             < NON, POUR LE MAITRE : 'L'=K...
XWOR%1:  VAL         '1234           < ???!???!?!!!???!
         IF          XWOR%1)XWOR%1-K,,XEIF%,
         IF          ET BIEN CA ALORS !!!
XEIF%:   VAL         ENDIF
KOPY7:   EQU         $
<
<
<        A T T E N T I O N  :
<                      DANS LE CAS DU PROCESSEUR MAITRE, LA BASE
<                    'L' EST MISE A 0 AFIN DE DISCRIMINER LE
<                    MAITRE DE L'ESCLAVE (L=ADRESSE DCTPR1) ;
<                    DANS CES CONDITIONS, 'L' NE DOIT PAS ETRE
<                    UTILISEE POUR ACCEDER 'DCTHOR' PAR EXEMPLE !!!
<
<
<
< TEST DE VERROUILLAGE DU BUFFER LORS DE
< L'INITIALISATION DU SYSTEME : EN EFFET,
< SI LE PROCESSEUR ESCLAVE PART AVANT LE
< MAITRE, IL ECRIT DANS LE BUFFER DE COPY
< LES VALEURS INITIALES (D'ASSEMBLAGE),
< ALORS QUE LE MAITRE SIMULTANEMENT RELIT
< LA ZONE 'DKF' DE COPY, D'OU UN CONFLIT...
<
         LR          Y,W             < (W)=ADRESSE DU BUFFER DE COPY.
SYNCOP:: MOT         -D              < DEPLACEMENT PAR RAPPORT A L'ORIGINE
                                     < DU BUFFER DE COPY PERMETTANT L'ACCES
                                     < AU MOT D'EXCLUSION DU MAITRE ET DE
                                     < L'ESCLAVE A L'INITIALISATION DU
                                     < SYSTEME.
KOPY3:   EQU         $
         CPZ         SYNCOP,W        < L'INITIALISATION EST-ELLE FINIE ???
         JE          KOPY4           < OUI, ON PEUT PREPARER LA COPIE...
         CPZR        L               < EST-CE LE PROCESSEUR ESCLAVE ???
         JE          KOPY3           < NON, DONC LES INTERRUPTIONS SONT
                                     < DEMASQUEE, ON PEUT SE METTRE DANS
                                     < UNE BOUCLE D'ATTENTE...
         BSR         VAR+APRDEF      < DANS LE CAS DU PROCESSEUR ESCLAVE,
                                     < ON EST CONTRAINT DE TESTER LE DEFAUT
                                     < SECTEUR EN ATTENTE...
         JMP         KOPY3           < PUIS ON REBOUCLE...
KOPY4:   EQU         $
         PSR         L               < SAUVEGARDE DE 0/'DCTPR1'...
         LXI         NSPSAV
         BSR         ACADCT          < RENVOIE DANS 'L' L'ADRESSE DE LA
                                     < LISTE DE 'NSP'=NSPSAV.
         LR          L,W             < (W)=ADRESSE DE LA LISTE DE SAUVEGARDE.
         PLR         L               < RESTAURE LE DISCRIMINATEUR MAITRE/
                                     < ESCLAVE...
<
< BOUCLE DE RECUPERATION DES ELEMENTS DE LA LISTE :
<
XCOPAD:: MOT         O               < RANG DU MOT CONTENANT L'ADRESSE,
XCOPLO:: MOT         XCOPAD+D        < RANG DU MOT CONTENANT LA LONGUEUR.
XLCOPY:: VAL         XCOPLO-XCOPAD+Z < LONGUEUR D'UNE ENTREE DE LA LISTE.
KOPY1:   EQU         $
         LA          XCOPAD,W        < (A)=ADRESSE DE L'ELEMENT COURANT,
         JAE         KOPY2           < 0=FIN DE LISTE...
         LR          Y,B             < (B)=ADRESSE DE SAUVEGARDE COURANTE.
         LX          XCOPLO,W        < (X)=NOMBRE DE MOTS DE L'ELEMENT COURANT.
         CPZR        X               < CET ELEMENT SERA-T'IL A VALIDER ???
         JGE         KOPY5           < OUI, (X)>=K...
         NGR         X,X             < NON, ALORS (X)<0...
KOPY5:   EQU         $
         ADR         X,Y             < PREPARATION DE LA SAUVEGARDE SUIVANTE.
         MOVE                        < SAUVEGARDE DE L'ELEMENT COURANT...
         ADRI        XLCOPY,W        < PASSAGE A L'ELEMENT SUIVANT...
         CPZR        L               < MAITRE OU ESCLAVE ???
         JE          KOPY1           < MAITRE : ON CONTINUE LA COPIE...
         BSR         VAR+APRDEF      < ESCLAVE : IL FAUT TESTER LE DEFAUT
                                     < SECTEUR EN ATTENTE...
         JMP         KOPY1
<
< CALCUL DU CHECKSUM DE LA COPY :
<
KOPY2:   EQU         $
         LRM         X,W
         WORD        LCOPY1-D        < (X)=NOMBRE DE MOTS SUR LESQUELS PORTE
                                     <     LE CALCUL DU CHECKSUM,
         WORD        BCOPY           < (W)=ADRESSE DU BUFFER DE COPY.
         LAI         K               < (A)=CUMUL DU CHECKSUM...
KOPY6:   EQU         $
         EOR         O,W             < CALCUL DU CHECKSUM PAR 'EOR',
         ADRI        D,W             < PASSAGE AU MOT SUIVANT
         JDX         KOPY6           < S'IL EXISTE...
         STA         O,W             < LE CHECKSUM EST MIS AU BOUT DU BUFFER.
<
< RETOUR DU SOUS-PROGRAMME :
<
         PLR         Y,L,W
         RSR
         PAGE
<
<
<        P U R G E   D E   L A   M E M O I R E
<        V I R T U E L L E   D K B  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME, APRES AVOIR FAIT
<                    QUELQUES VERIFICATIONS D'USAGE ESSAYE
<                    DE RECUPERER LES INDICATEURS DE 'MEMV'
<                    AU PUPITRE, PUIS, LORSQUE TOUT LE MONDE
<                    EST D'ACCORD, IL ENVOIE UNE DEMANDE DE
<                    PURGE A 'DKB'.
<                      ON NOTERA QUE DES DEMANDES D'ACCES
<                    A 'DKB' PEUVENT MALGRE TOUT SUIVRE LA
<                    DEMANDE DE PURGE, MALGRE TOUTES LES
<                    PRECAUTIONS (PAR EXEMPLE VENANT DE 'RCF'...) ;
<                    C'EST POURQUOI, 'DKB' TESTE LUI-MEME
<                    'MEMV', PUIS TRANSMET D'UNE MANIERE TRANS-
<                    PARENTE LES DEMANDES QUI POURRAIENT ETRE
<                    MASQUEES PAR UN BIT DE 'MEMV'...
<
<
<        ATTENTION :
<                      LE BIT 'MEMXXX' DE 'MEMV' AUTORISE
<                    LORSQU'IL EST A 1 CETTE FONCTION DE
<                    PURGE, ET SURTOUT DE MODIFICATION
<                    DE 'MEMV' LUI-MEME !!!
<
<
PURGE:   EQU         $
         PSR         A               < SAVE 'MEMV' DEMANDE...
         LA          MEMV            < (A)='MEMV' COURANT :
         TBT         MEMXXX          < A-T'ON DROIT A CETTE FONCTION ???
         PLR         A
         JNC         PURGE3          < NON, RIEN N'EST FAIT...
         JAL         PURGE1          < BIT0=1 : C'EST EN FAIT UNE DEMANDE
                                     < D'ARRET DU SYSTEME...
         CP          MEMV            < DEMANDE-T'ON CE QUE L'ON A DEJA ???
         JE          PURGE1          < RIEN A FAIRE...
<
< BOUCLE D'ATTENTE D'UN MEMV DE QUALITE :
<
         LR          A,X             < (X)=SAUVEGARDE DU 'MEMV' PRESUME...
         BSR         ASMPUO          < ON LE REAFFICHE...
PURGE4:  EQU         $
         BSR         ASMPUI          < LECTURE D'UN ACQUITTEMENT.
                                     < CARY=INFORMATION VALIDE (1)...
         JNC         PURGE4          < PAS ENCOIRE...
         JAE         PURGE5          < OK, ON PREND (X)...
PURGE7:  EQU         $
         BSR         ASMPUI          < NON, IL FAUT DONC RELIRE...
                                     < (CARY)=INFORMATION VALIDE (1)...
         JNC         PURGE7          < NON, ON ATTEND...
         JMP         PURGE           < OK, ON RECOMMENCE LES VALIDATIONS...
<
< PURGE PROPREMENT DITE (C'EST BEAUCOUP DIRE...) :
<
PURGE5:  EQU         $
         STX         MEMV            < MISE EN PLACE DES INDICATEURS...
         LAD         VAR+DPURGE
         XR          A,W
         BSR         ACHAND          < ENVOI DE LA DEMANDE DE PURGE...
         BSR         ACHANW          < ET ON ATTEND QUE CELA SOIT FAIT...
         XR          A,W
<
< RETOURS DIVERS :
<
PURGE3:  EQU         $
         LAI         K               < AFIN DE NE PAS ARRETER LE SYSTEME.
PURGE1:  EQU         $
         RSR
         PAGE
<
<
<        T R A I T E M E N T   D E S   T I M E - O U T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME DETECTE ET TRAITE
<                    LES TACHES EN TIME-OUT; IL EST EN GENE-
<                    RAL REFERENCE PAR L'HORLOGE, MAIS IL PEUT
<                    ARRIVER QUE L'HORLOGE SOIT BLOQUEE EN
<                    ATTENTE DE 'DKF' OU 'DKM' (EUX-MEMES EN
<                    DEFAUT...) ; EN CONSEQUENCES, LA TACHE
<                    'IDLE' PEUT DETECTER CE PHENOMENE, ET TRAITER
<                    LES TIME-OUT, DEBLOQUANT AINSI LE SYSTEME...
<
<
SPTO:    EQU         $
         PSR         A,B,X,Y
         PSR         L,W
         CALL        #SISP CMS5 W TRACE# < (W)=0, AU CAS OU UNE TRACE
                                     < D'UN TIMED OUT SERAIT FAITE.
         LXI         NSPPER          < (X)=NSP DU DERNIER HANDLER
                                     <     PERIPHERIQUE A TESTER.
<
< BOUCLE DE TEST DES HANDLERS PERIPHERIQUES :
<
Z1247:   EQU         $
         LA          &ADCTSY         < ACCES A DCTSY SANS PASSER PAR
                                     < LA ROUTINE CADCT, CAR EN EFFET
                                     < SI LA VIDEO EST ABSENTE, ON
                                     < VA RENCONTERER SON RELAI A 0 !!!
         JAE         Z1246           < ON ESTIME QU'IL S'AGIT DU
                                     < RELAI DE LA VIDEO ET QU'ELLE
                                     < EST ABSENTE !!!
         LR          A,L             < SINON, (L)=@DCT(HANDLER(X)).
         CPZ         TESTO           < LE TIMED OUT EST-IL A TESTER
                                     < SUR LE HANDLER COURANT ???
         JE          Z1246           < NON, AU PRECEDENT...
         BSR         ABETA2          < SI OUI, CALCULONS :
                                     < (A)=BETA(SIT(HANDLER(X))).
         JAGE        Z1246           < OK, BETA(SIT)>=K, PAS D'IT
                                     < EN ATTENTE...
         DC          TIMOUT          < DANS LE CAS OU UNE IT EST
                                     < ATTENDUE (BETA(SIT)<0), ON
                                     < DECREMENTE LE COMPTEUR COURANT
                                     < DE TIMED OUT.
         JG          Z1246           < CELUI-CI N'EST PAS ENCORE A 0.
<
<
<        C A S   D ' U N   T I M E D   O U T   D E T E C T E  :
<
<
XTOSIT:: VAL         XXSIT0-I        < VALEUR DE 'ETAT0' LORS D'UN TIME-OUT.
         PSR         A               < SAUVEGARDE DE 'XTOSIT' !!!
         LA          TESTO
         STA         TIMOUT          < RE-INITIALISATION DU COMPTER
                                     < COURANT DE TIMED OUT, AU
                                     < CAS OU LE HANDLER CONCERNE
                                     < NE FERAIT PAS UNE FIN DE
                                     < SERVICE A LA RECEPTION DE L'IT,
                                     < MAIS RE-ITERER L'OPERATION.
         LAI         FNTO            < (A)=FAUX NIVEAU DE TRACE (TO).
         BSR         ATRACE          < TRACE DU TIMED OUT (W=K).
         LBI         TYPITX          < ON SIMULE DES IT EXCEPTION.
         BSR         ASMMK           < ON MASQUE LES INTERRUPTIONS AFIN QUE
                                     < 'ARIT' ET LA MODIFICATION DE 'ETAT0'
                                     < AIENT LIEU SIMULTANEMENT...
         BSR         ARIT            < SIMULATION D'UNE IT SUR CE
                                     < HANDLER AFIN DE LE REVEILLER.
         PLR         A               < AFIN DE MODIFIER 'ETAT0' ; ON LE FAIT
                                     < APRES 'ARIT', CAR IL EST SUR QUE 'ARIT'
                                     < MODIFIE 'ETAT0'...
         STA         ETAT0           < ETAT0<--(BETA(SIT)) ; ON
                                     < MEMORISE AINSI PAR ETAT0<0
                                     < QUE L'IT QUE L'ON VA PROVOQUER
                                     < EST EN FAIT UN TIMED-OUT...
         BSR         ASMDK           < DEMASQUAGE DES INTERRUPTIONS...
<
< PASSAGE AU HANDLER PRECEDENT :
<
Z1246:   EQU         $
         JDX         Z1247           < AU PRECEDENT.
         PLR         L,W
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        F R E Q U E N C E   D E   L ' H O R L O G E
<        E N   M U L T I P L E   D E   L A   P E R I O D E  :
<
<
<        RESULTAT :
<                    (A)=FREQUENCE EXPRIMEE EN MULTIPLE DE 100 MS
<                    (X)=NUMERO - 6 DU PREMIER BIT A 1
<
<
CFHOR:   EQU         $
         LA          ARGDEM+AMDEM    < RECUPERATION DE LA FREQUENCE
                                     < DEMANDEE (EN MS.).
         AND         VAR+C3FF        < RAZ DES BITS 0-5.
         JAG         SYSR32          < OK.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      LA CONSTANTE 'C3FF' EST SUREMENT
<                    MAUVAISE, IL FAUT DONC LA CORRIGER,
<                    PUIS FAIRE 'JMP CFHOR'...
<
SYSR32:  EQU         $
         DBT                         < RECHERCHE DU 1ER BIT A 1 :
                                     < (X)=6,7,...,14,15.
XWOR%1:  VAL         XC3FF)MFFFF=K
         ADRI        XWOR%1-NBITMO,X
         LBY         &VAR+DECFRE     < (A)=FREQUENCE REELLE DE L'HORLOGE
                                     <     EXPRIMEE EN MULTIPLE DE 100 MS
         JAE         CFHOR1          < NULLE, ERREUR...
         CPI         FXHOR           < VALIDATION SUPERIEURE :
         JLE         CFHOR2          < OK, LA FREQUENCE DEMANDEE EST DANS
                                     < LES LIMITES RECONNUES...
CFHOR1:  EQU         $
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE COMMENT LA FREQUENCE
<                    DEMANDEE EST MAUVAISE : SOIT LA
<                    DEMANDE 'HORINI' A ETE MODIFIEE,
<                    SOIT LA TABLE 'TFREQ' !!!
<
         LAI         FXHOR           < ET ON FORCE UNE VALEUR ARBITRAIRE...
CFHOR2:  EQU         $
         RSR
         PAGE
<
<
<        R O U T I N E   D E S   I T   H O R L O G E  :
<
<
ITHOR:   EQU         $
         SIO         VAR+ETAHOR      < ENTREE MOT D'ETAT HORLOGE POUR
                                     < FAIRE RETOMBER L'IT
         BSR         ARVHDL          < REVEIL SYSTEMATIQUE DU HANDLER
                                     < HORLOGE
<
<        RAPPEL :
<                      LA FREQUENCE DE L'HORLOGE N'ETANT
<                    PAS PROGRAMMABLE, ON SIMULE LA PRO-
<                    GRAMMABILITE A L'AIDE DU COMPTEUR
<                    'NBITH' ; TOUTES LES 100MS, IL EST
<                    INCREMENTE, LORSQU'IL ATTEINT SON
<                    MAXIMUM ('FREHOR'), ON LE REMET A
<                    0, ET 'HDLHOR' TRAITERA CETTE IN-
<                    TERRUPTION COMME IL SE DOIT...
<
         IC          VAR+NBITH       < COMPTAGE DES IT
         LA          VAR+FREHOR      < FREQUENCE COURANTE EN
                                     < MULTIPLE DE 100 MS
         CP          VAR+NBITH       < FIN DE PERIODE?
         JG          E932
                                     < FIN DE PERIODE
         STZ         VAR+NBITH       < RAZ COMPTEUR D'IT HORLOGE.
         DC          VAR+CCOPY       < GENERATION DES PERIODE DE COPY
                                     < DU SYSTEME...
<
<
<        S Y N C H R O N I S A T I O N   S U R   L E S   V A L E U R S
<                    P O S I T I V E S   D E   ' C D A G 0 '  :
<
<
         SVC         SVCM9           < ET VOILA LE TRAVAIL ; EN EFFET IL NE
                                     < SUFFIT PAS DE LA FAIRE DANS 'IDLE', CAR
                                     < EN EFFET UN PROGRAMME FAISANT BEAUCOUP
                                     < DE PROCESS INHIBE L'IDLE, ET DONC PAR LA
                                     < MEME OCCASION CETTE SYNCHRONISATION...
                                     < D'OU SA PLACE DANS 'ARIT' DE L'HORLOGE...
<
<
<        T E S T   D E S   H A N D L E R S   E N   D O D O  :
<
<
<        A T T E N T I O N  :
<                      CE REVEIL NE PEUT SE FAIRE DANS
<                    'HDLHOR' : EN EFFET, LE 'RLSE'
<                    SUR LE SEMAPHORE 'SDODO', LORS-
<                    QU'IL PORTE SUR DES TACHES PLUS
<                    PRIORITAIRES QUE 'HDLHOR' RISQUE-
<                    RAIT DE CREER UN BOUCLAGE AU CAS
<                    OU CES DERNIERES SE REMETTRAIENT
<                    IMMEDIATEMENT EN 'DODO'...
<
<
         LA          VAR+KMSHOR
         CPI         -FXHOR          < ON REGARDE SI LE DECOMPTEUR
                                     < VAUT -FXHOR, AUQUEL CAS IL S'EST
                                     < ECOULE UNE SECONDE
         JNE         E932            < ET NON...
<
< CAS D'UNE IT DE 'SECONDE' :
<
         BSR         VAR+ABETA3      < RENVOIE (A)=BETA(SDODO).
         JAE         E932            < BETA(SDODO)=K : PERSONNE (OU
                                     < PLUS PERSONNE) A REVEILLER.
         JAL         SYSR33          < IL Y A AU MOINS UN HANDLER
                                     < EN DODO A REVEILLER.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      LE MIEUX PARAIT DE FAIRE UN 'JMP E932'...
<
SYSR33:  EQU         $
         LR          A,X             < (X)=BETA(SDODO) SUR 16 BITS.
E933:    EQU         $
         LAD         &ASDODO
         BSR         ARLSE           < REVEIL D'UN HANDLER
         JIX         E933            < AU SUIVANT...
E932:    EQU         $
         LAI         MOMINT
         SIO         VAR+OPHOR       < ON REVALIDE LES INTERRUPTIONS TOUT DE
                                     < SUITE, AU CAS OU 'HDLHOR' SERAIT
                                     < BLOQUEE !?!??!?
         RSR
         PAGE
<
<
<        R E I N I T I A L I S A T I O N   D E   L ' H O R L O G E
<        E T   D E   L A   P A T T E R N   C Y C L I Q U E
<        D E   S W A P P I N G   O U T  :
<
<
<        FONCTION :
<                      CETTE ROUTINE A 2 POINTS D'ENTREE EST
<                    APPELEE A CHAQUE FOIS QUE LA CHARGE
<                    DU SYSTEME EN UTILISATEURS ACTIFS
<                    CHANGE :
<                    1- AVWAIT :
<                                    AVANT LA COMMANDE '!W',
<                                    AVANT LA COMMANDE '!BYE'/'!F'.
<                    2- APWAIT :
<                                    APRES LA COMMANDE '!W',
<                                    APRES LA COMMANDE '!LOGIN'.
<                      ELLE CALCULE LE NBRE D'ESCLAVES ACTIFS
<                    (NUSERA), PUIS RE-INITIALISE EVENTUEL-
<                    LEMENT LA FREQUENCE DE L'HORLOGE, ET
<                    ENFIN MODIFIE LA PATTERN CYCLIQUE DE
<                    SWAPPING OUT.
<
<
<        D I M I N U T I O N   D E   N U S E R A  :
<
<
AVWAIT:  EQU         $
         DC          NUSERA          < ON DECREMENTE D'UNE UNITE
                                     < LE NBRE D'ESCLAVES ACTIFS.
         JMP         INITH           < VERS LES RE-INITIALISATIONS.
<
<
<        A U G M E N T A T I O N   D E   N U S E R A  :
<
<
APWAIT:  EQU         $
         IC          NUSERA          < ON INCREMENTE D'UNE UNITE LE
                                     < NOMBRE D'ESCLAVES ACTIFS.
<
<
<        R E I N I T I A L I S A T I O N S   E V E N T U E L L E S  :
<
<
INITH:   EQU         $
         PSR         A,X
         LA          NUSERA          < ACCES AU NBRE D'ESCLAVES ACTIFS.
         JAL         Z901            < ERREUR NUSERA EST NEGATIF.
         CPI         NESCLA          < VALIDATION DE NUSERA.
         JLE         SYSR34          < OK, NUSERA EST DANS LES
                                     < LIMITES (K,NESCLA).
Z901:    EQU         $
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      LE MIEUX PARAIT DE FAIRE UN 'JMP Z901X'...
<
SYSR34:  EQU         $
         LR          A,X             < (X)=NOMBRE D'ESCLAVES ACTIFS.
         LA          &ATFREQ         < (A)=FREQUENCE DE RE-INITIALISATION
                                     <     DE L'HORLOGE.
         STA         &FREQI          < MAJ EVENTUELLE DE HORINI DANS
                                     < SYSINI ; SI CETTE FREQUENCE EST
                                     < DIFFERENTE DE LA FREQUENCE
                                     < PRECEDENTE, ON SAIT QUE HDLHOR
                                     < VA CHANGER LA FREQUENCE DE
                                     < L'HORLOGE.
         ADRI        NMESCL+Z,X      < TRANSLATION DE L'INDEX POUR
                                     < ACCEDER A LA TABLE DES REINITIA-
                                     < LISATIONS DE LA PATTERN CYCLIQUE
                                     < DE SWAPPING OUT.
         LA          &ATFREQ         < (A)=NOUVELLE PATTERN CYCLIQUE
                                     <     DE SWAPPING OUT.
         STA         HORIDC          < MISE EN PLACE DE LA NOUVELLE
                                     < PATTERN CYCLIQUE DE SWAPPING OUT.
         EORI        MMOT            < INVERSION DU BIT15 (ENTRE AUTRE).
         ANDI        XBHRUN          < (A)=.NOT.BIT15(HORIDC), SOIT :
                                     < (A)=K SI NUSERA>1,
                                     < (A)=1 SI NUSERA=K OU 1.
         STA         IBHRUN          < MISE A JOUR DYNAMIQUE DE
                                     < 'IBHRUN' EN FONCTION DE LA
                                     < CHARGE DU SYSTEME.
                                     < IBHRUN=1 : NUSERA=K OU 1,
                                     < IBHRUN=K : NUSERA>1.
Z901X:   EQU         $
         PLR         A,X
         RSR
         PAGE
<
<
<        R O U T I N E   D E   M I S E   E N   S O M M E I L
<        D ' U N   H A N D L E R   P O U R    U N E
<        D U R E E   D E T E R M I N E E  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME BLOQUE LE
<                    DEMANDEUR POUR UNE DUREE DETER-
<                    MINEE EXPRIMEE EN SECONDES (SI (X)>0),
<                    OU 'THALT'-MICRO-SECONDES (SI (X)<0).
<
<
<        ARGUMENT :
<                    (X)=NBRE DE SECONDES SI (X)>0,
<                    (X)=-NOMBRE DE 'THALT'-MICROSECONDES SI (X)<0.
<
<
<        A T T E N T I O N  :
<                      CE SOUS-PROGRAMME DETRUIT 'X' !!!
<
<
DODO:    EQU         $
         CPZR        X               < VALIDATION DU NBRE DE SECONDES.
         JE          Z385            < 0 SECONDE DEMANDE, IL N'Y A
                                     < DONC RIEN A FAIRE.
         PSR         X
         JG          E931            < COMPTAGE EN SECONDES...
<
< CAS D'UNE TEMPORISATION EXPRIMEE EN 'THALT'-MICROSECONDES :
<
         NGR         X,X
E931X:   EQU         $
         HALT                        < ON ATTEND...
         CPZR        X               < LE TEMPS DEMANDE S'EST-IL ECOULE ???
         JNE         E931X           < NON, CE QUI EST POSSIBLE A CAUSE DES
                                     < INTERRUPTIONS ET DES APPELS 'LDC'...
         JMP         E931Y           < ET C'EST FINI...
<
< CAS DES TEMPORISATIONS EXPRIMEES EN SECONDES :
<
E931:    EQU         $
         RQST        &ASDODO         < MISE EN SOMMEIL DU HANDLER
                                     < APPELANT POUR 1 SECONDE.
         JDX         E931            < BOUCLAGE A CHAQUE SECONDE,
                                     < JUSQU'A CE QUE LE QUANTUM DE
                                     < TEMPS DEMANDE SOIT EPUISE.
E931Y:   EQU         $
         PLR         X
Z385:    EQU         $
         RSR                         < LE QUANTUM EST EPUISE...
         PAGE
<
<
<        D C T   E N D - J O B  :
<
<
         CALL        #SISP CMS5 CHECK#
         CALL        #SISP CMS5 DOL1#
DCTEJ:   EQU         $
PSTEJ:   WORD        K;K;K;K;COM+DEPCS;DCTEJ;WRLBEJ;PILEJ;DISPAT;SMST;SO;SE
       #@ASCI        " EJ "          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR
         WORD        FILTRS
         WORD        XTALOC          < ETALOC.
         WORD        XXLOC0          < SEMLOC.
         DZS         LSEM
         WORD        NIL
         WORD        NIL
         WORD        XXCHV0
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLEJ           < DISPATCHER END-JOB.
         WORD        NIL
         WORD        K;K             < ETAT.
         WORD        XBITS0          < BITSEM.
         WORD        XXNTRY;TRYVID
         WORD        K               < HSTATS.
         WORD        XTESTO          < TESTO.
         WORD        XXDCTF          < 'DCT' NON CONNECTABLE...
         WORD        XFONBA          < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
< ZONE VARIABLE :
<
VAREJ:   EQU         $
         IF          VAREJ-DCTEJ-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
         WORD        NIL
ADCTEJ:: VAL         $-D-VAREJ       < MOT CONTENANT L'ADRESSE DU BUFFER
                                     < AYANT CONTENU LA DCT-ESCLAVE.
         WORD        TBU-IJIJDX,X
ATBUEJ:: VAL         $-D-VAREJ       < RELAI VERS TBU, INDEXE
                                     < PAR RAPPORT A 1.
WRLBEJ:  BYTE        NSPRLB;XDSYM    < BLOC DE RELEASE BUFFER.
RLBEJ::  VAL         $-D-VAREJ       < BLOC DE RELEASE BUFFER.
         WORD        K
         WORD        VAREJ+ADCTEJ    < ADRESSE DE L'ADRESSE OCTET DU
                                     < BUFFER A RELEASER.
         WORD        W               < 1 BUFFER A RELEASER.
         DZS         LDEM0+VAREJ-$+RLBEJ
         BYTE        NSPTYS;XDSYM
EJTYS::  VAL         $-D-VAREJ       < DEMANDE D'E/S SUR TTYS AU EJ.
         WORD        FGW             < ECRITURE.
         WORD        NIL             < AMDEM.
XLNHDL:: VAL         LHNAME*NOCMO-NOCMO+I < LONGUEUR DES NOMS DES HANDLERS.
                                     < (+I A CAUSE DE LA LONGUEUR EN TETE)
         WORD        XLNHDL          < LE NOM DU PERIPH.IN FAIT 3 OCTETS.
         DZS         LDEM0+VAREJ-$+EJTYS
EOTO8:   WORD        RGAM;RLMESC;EOTO8-$
OTOEJ:   EQU         $-D             < AUTOMATE DE 'LOG-OUT'...
OTOFIN:: VAL         $-D-VAREJ       < AUTOMATE DE END-JOB.
<
< PILE :
<
         CALL        #SISP CMS5 DOL2#
PILEJ:   EQU         $-DEPILE
XWPILE:  VAL         LPILED+16
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        E N D - J O B  :
<
<
<        FONCTION :
<                      'EJ' EST UN DISPATCHER SYNCHRO-
<                    NISE PAR CHAQUE 'SVC' 'END-JOB' ;
<                    IL A SA CHARGE DE RELEASER L'IDEN-
<                    TIFICATEUR 'ID' ET LE BUFFER
<                    'BUFESC'.
<                      LE OU LES UTILISATEURS A RELEASER
<                    SONT INDIQUES PAR LE BIT 'BITX'
<                    DE LEUR ENTREE DE LA TABLE 'TBU'
<                    A 1.
<
<
<        NOTA :
<                      LORSQUE L'UTILISATEUR EST INTERACTIF,
<                    C'EST-A-DIRE QU'IL TRAVAILLE SUR UNE
<                    VISU, ON REGARDE S'IL N'Y A PAS UN AUTRE
<                    UTILISATEUR "EMPILE" PAR "!U" SUR CETTE
<                    VISU ; SI OUI, ON LE DEPILE, ET IL SE
<                    RETROUVE DANS UNE ETAT IDENTIQUE A CELUI
<                    QU'IL AURAIT A LA SUITE D'UNE COMMANDE
<                    "!W"...
<
<
         USE         L,DCT0
         USE         W,DEM0
HDLEJ:   EQU         $
         LXI         NESCLA          < INDEX DE PARCOURS DE TBU
                                     < JUSQU'A 1.
E763:    EQU         $
         LA          &VAR+ATBUEJ
         JAL         E764            < OK, ON A TROUVE UNE ENTREE
                                     < NEGATIVE, C'EST LA (OU UNE DES
                                     < ) DCT A RELEASER.
         JDX         E763            < SUIVANTE.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      LE MIEUX PARAIT DE FAIRE UN 'JMP E764X'...
<
<
< CAS OU ON A TROUVE UN ESCLAVE A RELEASER :
<
E764:    EQU         $
         STZ         &VAR+ATBUEJ     < MAJ DE TBU.
         SLLS        NOCMO=K         < CONVERSION DE L'@DCT-ESCLAVE
                                     < EN UNE ADRESSE D'OCTET, ET AU
                                     < PASSGE RAZ DU BIT0.
         STA         VAR+ADCTEJ      < EN VUE DU RELEASE DE BUFFER, SON
                                     < ADRESSE OCTET EST MEMORISEE.
         SLRS        NOCMO=K         < (A)=@MOT DE LA DCT-ESCLAVE.
         LR          A,B             < SAVE (B)=@DCT-ESCLAVE.
         LAD         VAR+OTOFIN      < (A)=@AUTOMATE DE END-JOB.
         PSR         L               < SAVE @DCTEJ.
         LR          B,L             < (L)=@DCT-ESCLAVE.
         LR          A,B             < (B)=@AUTOMATE DE END-JOB.
<
< MISE A JOUR DE LA DCT(NSPIN) :
<
         LXI         PHIN
         LBY         &TASSGN-DCTESC,L
         LXI         NSPDUM-N        < MASQUE LE BIT 8 DE A.
         ANDR        A,X             < (X)=NSPIN.
         PSR         L               < SAVE @DCT-ESCLAVE.
         BSR         ACADCT          < (L)=@DCT(NSPIN).
         LBY         IOID            < (A)=NSPOUT ASSOCIE AU NSPIN.
         CPR         A,X             < EST-CE UN ESCLAVE INTERACTIF ???
                                     < (SOIT NSPIN=NSPOUT ???)
         JNE         E764X1          < NON...
<
< CAS D'UN UTILISATEUR INTERACTIF :
<
         LY          VAR+APILID      < (Y)=ADRESSE DE LA PILE DE RECURSION "!U",
         PULL                        < ET TENTATIVE DE DEPILEMENT D'UN
                                     < UTILISATEUR :
         JV          E764X4          < IL N'Y EN A PAS D'AUTRES SUR CETTE
                                     < CONSOLE DE VISUALISATION...
<
< CAS D'UN UTILISATEUR EMPILE PAR "!U" :
<
         STA         IOID            < ET RESTAURATION DE 'IOID', ET DONC DE
                                     < L'AUTRE UTILISATEUR...
         JMP         E764X3
<
< CAS OU IL N'Y A PLUS D'UTILISATEURS
< EMPILES SUR UNE VISU : ON VA REINITIA-
< LISER CERTAINES CHOSES : CECI EST
< MAINTENANT RENDU NECESSAIRE PAR LA
< DEMANDE DU TOM ED ESSAP APRES LES
< COMMANDES "!W..." ET "!U" LORS D'UN
< LOGIN INITIAL SOUS ":SYS", OR SI LE TOM ED
< ESSAP DONNE EST MAUVAIS, IL Y A UNE COMMANDE
< "!F" EMISE IMPLICITEMENT, SANS REPASSER
< AU 'CCI' QUI FAIT D'HABITUDE CES
< OPERATIONS...
<
E764X4:  EQU         $
         LYI         KALTM
         STY         VAR+CARALT      < REINITIALISATION DU 'CARALT' COURANT,
         STZ         TESTO           < INHIBITION DU TIME-OUT SUR ENTREES,
         STZ         VAR+INEXEX      < ET AUTORISATION DES EXTENSIONS ET
                                     < DES EXPANSIONS...
         IF          NMAGIC-K,,XEIF%,
         IF          ATTENTION : LE 'STZ' EST IDIOT !!!
XEIF%:   VAL         ENDIF
         STZ         VAR+VMAGIC      < INHIBITION DU CODE MAGIQUE...
<
< CAS D'UN UTILISATEUR 'BATCH' (OU DONC
< D'UN UTILISATEUR VISU "NON EMPILE") :
<
E764X1:  EQU         $
         SWBR        A,A             < BIT0-7(A)=NSPOUT,
                                     < BIT8-15(A)=K.
         STA         IOID            < RESTAURE IO, ET RAZ ID DANS
                                     < LA DCT(NSPIN).
E764X3:  EQU         $
         LR          L,Y             < (Y)=@DCT-PERIPH.IN.
         PLR         L               < RESTAURE (L)=@DCT-ESCLAVE.
<
< SUPPRESION DE LA REACTIVATION DE L'ESCLAVE
< PAR MISE A 1 DE L'OPDEM DE DEMSER :
<
         IC          DEMSER-DCTESC+T+OPDEM,L
         BSR         AALOHS          < ENVOI DE LA DEMANDE DE SERVICE
                                     < DE END-JOB POUR L'ESCLAVE.
                                     < (=RELEASE DE L'ESPACE MEMOIRE
                                     < SANS REACTIVATION).
<
< RELEASE DE L'ID DE L'ESCLAVE :
<
         LX          IDESC-DCTESC,L
         LAI         MKIDES
         ANDR        A,X             < (X)=ID. ESCLAVE.
         LAD         ATOESC          < RELAI VERS LA TABLE D'ALLOCATION
                                     < DES ID ESCLAVES.
         PSR         Y               < SAVE @DCT-PERIPH.IN.
         LYI         FONSB1          < FONCTION SET A 1.
         RQST        &ASIDES         <<<<PHASE CRITIQUE.
         BSR         ATMOBT          < RELEASE DE L'ID.
         LAD         &ASIDES
         BSR         ARLSE
         LAD         &ASAESC
         BSR         ARLSE           < RELEASE ID AVEC DEBLOCAGE
                                     < EVENTUEL DE JOB ENTRY.
         PLR         Y               < RESTAURE (Y)=@DCT-PERIPH.IN.
<
< ATTENTE DE FIN DE SERVICE : EN EFFET, HDL-SERVICE
< TRAVAILLE AVEC LA DCT-ESCLAVE, ET IL FAUT DONC
< ATTENDRE LA FIN DE SERVICE, POUR POUVOIR RELESAER
< LE BUFFER CONTENANT DCT-ESCLAVE.
<
         WAIT        DEMSER-DCTESC+X18,L
<
< LAISSONS PASSER EVENTUELLEMT LE SCHEDULER :
< EN EFFET, LE SCHEDULER A BESOIN DE DCTESC
< SI LA DEMSCH N'EST PAS ENCORE DECHAINEE, DE
< PLUS IL NE FAUDRAIT PAS QUE LE BUFFER
< CORRESPONADNT SOIT REALLOUE POUR FAIRE UNE
< NOUVELLE DCTESC ALORS QUE LE SCHEDULER N'EST
< PAS ENCORE PASSE, CAR ON AURAIT DANS SA FILE
< D'ATTENTE 2 DEMANDES DE MEME ADRESSE !!!!!
<
         WAIT        DEMSCH-DCTESC+X18,L
<
< RELEASE DU BUFFER CONTENANT DCT-ESCLAVE :
<
         BSR         ACHAND          < ON A : (W)=@WRLBEJ (DEMANDE DE
                                     < RELEASE BUFFER).
         PLR         L               < RESTAURE (L)=@DCTEJ.
         BSR         ACHANW          < ATTENTE DE FIN DE RELEASE DU
                                     < BUFFER.
<
< ENVOI DU MESSAGE '!!EJVIX' SUR TTYS :
<
         PSR         W               < SAVE @DEMANDE DE RELB.
         LAD         VAR+EJTYS
         LR          A,W             < (W)=@DEMANDE D'ECRITURE SUR TTYS.
<        ON A ICI :
<                    (Y)=ADRESSE DCT(PERIPHERIQUE-IN).
         BSR         AMJEEJ          < ENVOI DU MESSAGE A TTYS.
         PLR         W               < RESTAURE (W)=DEMANDE RELB.
E764X:   EQU         $
         RSR                         < ET C'EST TOUT...
         PAGE
<
<
<        D C T   J O B   E N T R Y  :
<
<
         CALL        #SISP CMS5 CHECK#
         CALL        #SISP CMS5 DOL1#
DCTJE:   EQU         $
PSTJE:   WORD        K;K;K;K;COM+DEPCS;DCTJE;NIL;PILJE;HANDLR;SMST;SO;SE
       #@ASCI        " JE "          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR          < FILTRE.
         WORD        FILTRS          < S-FILTRE.
         WORD        XTALOC          < ETALOC.
         WORD        XXLOC0          < SEMLOC.
         DZS         LSEM
         WORD        NIL             < TETE.
         WORD        NIL             < QUEUE.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLJE           < HANDLER DE JOB ENTRY.
         WORD        NIL             < PAS DE RIT.
         WORD        K;K             < ETAT.
         WORD        XBITS0          < BITSEM.
         WORD        XXNTRY;TRYVID   < NTRIES & FRTRY.
         WORD        K               < HSTATS.
         WORD        XTESTO          < TESTO.
         WORD        XXDCTF          < 'DCT' NON CONNECTABLE...
         WORD        XFONBA          < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
< ZONE VARIABLE :
<
VARJE:   EQU         $
         IF          VARJE-DCTJE-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
         WORD        NIL
ADCTES:: VAL         $-D-VARJE       < @OCTET DE LA DCT ESCLAVE,
                                     < DESTINEE A L'ALLOCATEUR MEMOIRE.
         BYTE        NSPALB;XDSYM    < DEMANDE D'ALLOCATION BUFFER,
                                     < EN VUE DE GENERER LA DCT ESCLAVE.
ALBJE::  VAL         $-D-VARJE       < DEMANDE D'ALLOCATION BUFFER.
         WORD        K
         WORD        VARJE+ADCTES    < AMDEM DE LA DEMANDE.
         WORD        W               < DEMANDE D'1 BUFFER.
         DZS         LDEM0+VARJE-$+ALBJE
         BYTE        NSPTYS;XDSYM
JETYS::  VAL         $-D-VARJE       < DEMANDE D'ECRITURE SUR TTYS
                                     < DU NUMERO DU PERIPH.IN EN JE.
         WORD        FGW             < ECRITURE.
         WORD        NIL             < AMDEM.
         WORD        XLNHDL          < 'HNAME' DU PERIPH. IN.
         DZS         LDEM0+VARJE-$+JETYS
EOTO9:   WORD        RGAM;ALMESC;SWAPI;ISLOE;IMEMES;RZMEM;EOTO9-$
OTOJE:   EQU         $-D             < AUTOMATE DE 'LOG-IN'...
OTOINI:: VAL         $-D-VARJE       < AUTOMATE D'INITIALISATION DE
                                     < L'ESCLAVE.
<
< DONNEES DE CLEAR DE L'ESPACE DISQUE UTILISATEUR :
<
XWOR%1:  VAL         MSPTYP=K        < POUR CADRER LE 'NSPDKF'...
XWOR%2:  VAL         NSPDKF>XWOR%1
XWOR%2:  VAL         COSBT?TYPAD=FMASK(K?XWOR%2=FCINST
         WORD        XWOR%2
DDKFJE:: VAL         $-D-VARJE       < DEMANDE D'ECRITURE POUR NETTOYER LA
                                     < ZONE 'DKF' ATTRIBUEE A L'UTILISATEUR...
         WORD        FGW
         WORD        NIL             < ADRESSE MOT (VARIABLE) DU BUFFER DE
                                     < NETTOYAGE, QUI EST EN FAIT LA DCT-
                                     < ESCLAVE ELLE-MEME AVANT INITIALISATION.
         WORD        LDCTES*NOCMO
         WORD        NILS            < ADRESSE DISQUE (VARIABLE).
         DZS         LDEM0+VARJE-$+DDKFJE
         WORD        NILK
IDESJE:: VAL         $-D-VARJE       < 'IDESC' ATTRIBUE A L'UTILISATEUR...
<
< PILE :
<
         CALL        #SISP CMS5 DOL2#
PILJE:   EQU         $-DEPILE
XWPILE:  VAL         LPILEH+10
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        H A N D L E R   J O B   E N T R Y  :
<
<
<        FONCTION :
<                      CE HANDLER ('HANDLR') EST CHARGE
<                    DE L'INITIALISATION DES UTILISATEURS
<                    DU SYSTEME, EN LEUR ATTRIBUANT UN
<                    'ID', UNE 'DCTESC' (ET EN L'INITIALI-
<                    SANT) ET EN NETTOYANT LEUR ESPACE
<                    DE SWAPPING ET SCRATCH...
<                      ENFIN, ELLE LANCE LA PREMIERE
<                    DEMANDE DE SCHEDULING.
<
<
<        I M P O R T A N T  :
<                      'RECOTO' EST MIS A 0 !!!
<
<
<        ARGUMENTS :
<                    (AMDEM)=NSP DU PERIPHERIQUE IN DE L'ESCLAVE,
<                    (CODEM)=TAILLE OCTET DE L'ESPACE MEMOIRE NECESSAIRE
<                            A L'ESCLAVE.
<
<
         USE         L,DCT0
         USE         W,DEM0
HDLJE:   EQU         $
<
< ALLOCATION D'UN IDENTIFICATEUR 'ID' A L'ESCLAVE :
<
         RQST        &ASAESC         < ALLOCATION AVEC ATTENTE EVEN-
                                     < TUELLE DE LA LIBERATION D'UN ID.
                                     < PAR UN AUTRE ESCLAVE.
         LAD         ATOESC          < @RELAI VERS LA TABLE D'OCCUPATION
                                     < DES IDENTIFICATEURS D'ESCLAVES.
         NTRN
         LXI         X12/NBITMO      < LONGUEUR DE TOESC.
         TRN
         RQST        &ASIDES         <<<<PHASE CRITIQUE.
         BSR         ASOBT           < RECHERCHE DU 1ER 'ID' LIBRE.
         JNE         SYSR36          < OK.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      JE NE SAIS PAS, MAIS ATTENTION,
<                    IL Y A DEJA EU UN 'RQST' SUR
<                    LE SEMAPHORE 'SAESC'...
<
SYSR36:  EQU         $
         LR          A,X             < SAVE L'ID DE L'ESCLAVE DANS X.
         STA         VAR+IDESJE
         LAD         &ASIDES
         BSR         ARLSE
<
<        ON A ICI :
<                    (X)='ID' (/0) ALLOUE A L'ESCLAVE.
<
         PSR         W               < SAVE @DEMANDE DE JOB-ENTRY.
         LAD         VAR+ALBJE
         LR          A,W             < (W)=@DEMANDE 1 BUFFER EN VUE DE
                                     <     CREER LA DCT-ESCLAVE.
         BSR         ACHAND
         BSR         ACHANW          < ATTENTE D'ALLOCATION DU BUFFER.
<
< ACCES A LA DCT-ESCLAVE :
<
         LA          VAR+ADCTES
         SLRS        NOCMO=K         < (A)=@MOT DE LA DCT-ESCLAVE.
         STA         &ATBU           < ON MET @DCT-ESCLAVE DANS TBU(ID).
         LR          A,W             < (W)=@DCT-ESCLAVE
<
<        ON A ICI :
<                    (L)=ADRESSE DCT(HDLJE),
<                    (W)=ADRESSE DCT(ESCLAVE).
<
<
< RAZ DE LA DCT ALLOUEE A L'ESCLAVE :
<
         ADRI        -IJIJDX,A       < POUR INDEXATION JUSQU'A 1.
         SBT         BITX            < GENERATION D'UN RELAI INDEXE.
         STA         VAR+ADCTES      < RELAI INDIRECT INDEXE VERS DCT
                                     < ESCLAVE.
         LXI         LDCTES          < LA DCT-ESCLAVE FAIT LDCTES=YY7 MOTS...
E718:    EQU         $
         STZ         &VAR+ADCTES     < RAZ DCT-ESCLAVE.
         JDX         E718
<
< NETTOYAGE DE LA ZONE 'DKF' DE L'UTILISATEUR :
<
         LA          VAR+IDESJE      < (A)=<ICDESC>,
         CP          NUSEP1          < A-T'IL EVENTUELLEMENT DROIT A 'PR1' ???
         LA          ANSPS           < OUI, A PRIORI : (A)=ORGANE COURANT
                                     < DE SWAPPING...
         JL          E718Y           < OUI...
         LAI         NSPDKS          < NON, DONC DANS TOUS LES CAS :
                                     < (A)=DISQUE DE SWAPPING.
E718Y:   EQU         $
         LRM         X
         WORD        TCPROG+TZSCRA   < (X)=NOMBRE D'ECHANGES DE NETTOYAGE,
                                     <     EN SUPPOSANT A PRIORI QU'IL S'AGIT
                                     <     DE 'PR1' ; 'TCPROG' CORRESPOND ALORS
                                     <     A LA ZONE DE SWAPPING (QUI EST AUSSI
                                     <     LA "!CDAP"), ET 'TZCSRA' CORRESPOND
                                     <     A LA ZONE SCRATCH SUR 'DKS'.
         CPI         NSPPR1          < ALORS EST-CE 'PR1' ???
         JE          E718Y1          < OUI...
         LXI         TZSWAP          < (X)=NOMBRE D'ECHANGES DE NETTOYAGE A
                                     <     FAIRE SUR 'DKS'...
E718Y1:  EQU         $
         STBY        VAR+DDKFJE+XXNSP
                                     < MISE EN PLACE DE L'UNITE DE SWAPPING...
         LAI         TZSWAP
         MP          VAR+IDESJE
         LR          B,A
XWOR%2:  VAL         XXXMOY
XWOR%1:  VAL         TZSWAP/XWOR%2
         IF          XWOR%1*XWOR%2-TZSWAP,,XEIF%,
         IF          ATTENTION : TZSWAP NON DIVISIBLE PAR 2 !!!
XEIF%:   VAL         ENDIF
         DO          XWOR%2*M
         ADRI        XWOR%1,A        < ON SAUTE AINSI LE SYSTEME LUI-MEME...
         AD          ASYS            < TRANSLATION DE L'ADRESSE DE
                                     < SAWPPING DANS LE 'GB' DU
                                     < SYSTEME.
         LR          A,B             < (B)=ADRESSE DE LA ZONE DE SWAP (ET DE LA
                                     <     ZONE SCRATCH QUI LA SUIT).
         PSR         W               < SAUVEGARDE DE L'ADRESSE 'DCTESC'.
         LAD         VAR+DDKFJE
         XR          A,W             < (W)=ADRESSE DE LA DEMANDE A 'DKF', ET
                                     < (A)=ADRESSE-MOT DE LA 'DCTESC' (QUI EST
                                     <     DONC LE BUFFER DE NETTOYAGE),
         STA         ARGDEM+AMDEM    < QUE L'ON MET DANS LA DEMANDE,
         STB         ARGDEM+ASDEM    < AINSI QUE L'ADRESSE DISQUE.
E718X:   EQU         $
         LBY         VAR+DDKFJE+XXNSP
         CPI         NSPPR1          < EST-ON SUR 'PR1' ???
         JNE         E718A           < NON, SUR 'DKS', ALLONS ENVOYER LA DEMANDE
                                     < DE NETTOYAGE...
         LR          X,A             < OUI, ALORS
         CPI         TZSCRA          < EN EST-ON A LA ZONE SCRATCH ???
         JLE         E718B           < OUI, ELLE N'EXISTE PAR SUR 'PR1', ALLONS
                                     < NETTOYER SEULEMENT CELLE DE 'DKS'...
E718A:   EQU         $
         BSR         ACHAND          < DEMANDE DE NETTOYAGE,
         BSR         ACHANW          < ET ATTENTE...
         LBY         VAR+DDKFJE+XXNSP
         CPI         NSPPR1          < A-T'ON INITIALISE 'PR1' ???
         JNE         E718Z           < NON 'DKS', OK...
E718B:   EQU         $
         LAI         NSPDKS          < OUI, IL FAUT DONC AUSSI NETTOYER 'DKS',
                                     < POUR PREPARER EN PARTICULIER LA ZONE
                                     < SCRATCH DE L'UTILISATEUR...
         STBY        VAR+DDKFJE+XXNSP
         BSR         ACHAND          < ENVOI DE LA DEMANDE A 'DKS',
         BSR         ACHANW          < ET ATTENTE...
         LAI         NSPPR1          < PUIS RESTAURE 'PR1'...
         STBY        VAR+DDKFJE+XXNSP
E718Z:   EQU         $
         IC          ARGDEM+ASDEM    < PUIS PASSAGE AU SECTEUR SUIVANT,
         JDX         E718X           < S'IL EXISTE...
         PLR         W               < RESTAURE : (W)=ADRESSE 'DCTESC'.
<
< INITIALISATION DE LA 'DCTESC' :
<
         LA          VAR+IDESJE
         STA         IDESC-DCTESC,W  < MISE EN PLACE DE L'IDESC,
         STB         DEMSWP-DCTESC+T+ASDEM,W
                                     < AINSI QUE DE L'ADRESSE DE SWAPPING...
<
< INTIALISATION DE LA GRAMMAIRE DU CCI :
<
         LA          CE000
         STA         SRCOTO-DCTESC,W < RECOTO=K & SRCOTO='E000.
<
< GENERATION DE L'EN-TETE DE DEMSWP :
<
         LAI         NSPDKF          < INITIALISATION DE L'ESCLAVE
                                     < SUR LE DISQUE DE SWAPPING
                                     < LE 1ER DISQUE DE SWAPPING.
         SWBR        A,A
         STA         DEMSWP-DCTESC+XXNSP,W < EN-TETE DE DEMSWP.
         LR          W,A             < (A)=@DCT-ESCLAVE.
         ADRI        DEMSWP-DCTESC+T+AMDEM,A
                                     < (A)=ADRESSE DU MOT AMDEM(DEMSWP).
         STA         DEMMEM-DCTESC+T+AMDEM,W
         LAI         XXALME          < EN VUE DE L'ALLOCATION D'1
                                     < BLOC MEMOIRE A L'ESCLAVE.
         STA         DEMMEM-DCTESC+T+CODEM,W
         STA         HORESC-DCTESC,W < INITIALISATION ARBITRAIRE DE L'
                                     < "HORLOGE" DE SWAPPING DE L'ESCLAVE.
                                     < (A 1)
<
< GENERATION DE L'EN-TETE DE DEMSCH :
<
         LAI         NSPSCH
XWOR%1:  VAL         MSPTYP=K        < INUTILE, MAIS ON NE SAIT JAMAIS...
         SWBR        A,A
         STA         DEMSCH-DCTESC+XXNSP,W < EN-TETE DE DEMSCH.
<
< INITIALISATION DES ADRESSES DE 'CDA' :
<
         LRM         A,B
         WORD        AOCDA1
         WORD        AECDA1
         STA         CDESCO-DCTESC,W < ORIGINE, ET
         STB         CDESCE-DCTESC,W < FIN DE LA 'CDA' DE CET UTILISATEUR
                                     < INITIALISEE SUR LA 'CDA-COMMUNE'...
<
< INITIALISATION DE WEIO(DEMSCH) EN VUE DE LA 1ERE
< DEMANDE DE SCHEDULING SUR CET ESCLAVE :
<
         IC          DEMSCH-DCTESC+X18,W < MISE A 1 DE WEIO(DEMSCH).
         LAD         VAR+OTOINI
         LR          A,B             < (B)=@AUTOMATE DE 1ERE ALLOCATION
                                     <     MEMOIRE.
         LR          W,A             < (A)=@DCT-ESCLAVE.
         PLR         W               < RESTAURE (W)=@DEMANDE DE 'JOB
                                     <     ENTRY'.
         PSR         L               < SAVE @DCT-'JOB ENTRY'.
         LR          A,L
<
<        ON A ICI :
<                    (L)=ADRESSE DCT(ESCLAVE),
<                    (W)=ADRESSE DEMANDE('JOB-ENTRY').
<
<
< INITIALISATION DE TASSGN :
<
         LR          L,A             < (A)=@DCT-ESCLAVE.
XWOR%1:  VAL         YASSGN-TASSGN
         ADRI        TASSGN-DCTESC+XWOR%1,A
         SBT         BITX            < GENERATION D'UN RELAI INDIRECT
                                     < ET INDEXE VERS TASSGN.
         STA         TASSGN-DCTESC,L < MISE DU RELAI DANS DCT-ESCLAVE.
         LA          ARGDEM+AMDEM    < RECUPERATION DU NSP DU PERIPHERI-
                                     < QUE IN DE L'ESCLAVE.
         LXI         PHIN
         STBY        &TASSGN-DCTESC,L
                                     < NVP=1 --> NSP=NSP DU PERIPHERIQUE
                                     < IN DE L'ESCLAVE.
<
< MISE A JOUR DE LA DCT DE NSPIN :
<
         LR          A,X             < (X)=NSPIN.
         LY          IDESC-DCTESC,L
         LAI         NSPDUM-N
         ANDR        A,X             < (X)=NSPIN.
         ANDR        A,Y             < (Y)=ID. ESCLAVE.
         PSR         L               < SAVE @DCT-ESCLAVE.
         BSR         ACADCT          < (L)=@DCT(NSPIN).
         LA          IOID            < ACCES A L'IOID DE LA DCT(NSPIN).
         TBT         IOIDX           < UNE DEMANDE DE JOB-ENTRY A-T'
                                     < ELLE BIEN ETE FAITE SUR NSPIN...
         JC          SYSR37          < OUI : OK.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      PEUT-ETRE METTRE A 1 LE BIT 'IOIDX'...
<
SYSR37:  EQU         $
         ORR         Y,A             < ON MET DANS IOID, L'ID DE
                                     < L'ESCLAVE.
         STA         IOID            < MAJ DE DCT(NSPIN).
         LBY         IOID            < (A)=NSPOUT ASSOCIE A NSPIN. A
                                     <     NOTER QUE CE 'LBY' EST PLUS
                                     <     RAPIDE QU'1N 'SLRS 8'.
         LR          L,Y             < SAVE DANS Y @DCT-PERIPH.IN.
         PLR         L               < RESTAURE (L)=@DCT-ESCLAVE.
         CPI         XNVPF           < EST-CE UN FICHIER...
         JNE         E779            < NON.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      ALORS CA, JE N'EN SAIS RIEN !!!
<
<
< FIN DE CALCUL DE TASSGN :
<
E779:    EQU         $
         LXI         PHOUT
         STBY        &TASSGN-DCTESC,L
                                     < NVP=2 --> NSP=NSPOUT,
<
< ESPACE MEMOIRE NECESSAIRE A L'ESCLAVE :
<
         LA          ARGDEM+CODEM    < TAILLE OCT NECESSAIRE A
                                     < L'ESPACE MEMOIRE ESCLAVE.
         STA         DEMSWP-DCTESC+T+CODEM,L
<
<        ON A ICI :
<                    (L)=ADRESSE DCT(ESCLAVE),
<                    (B)=ADRESSE AUTOMATE DE PREMIERE ALLOCATION.
<
<
< 'LANCEMENT' DE L'ESCLAVE :
<
         BSR         AALOHS          < 1ERE ALLOCATION HANDLER DE SERVICE.
         PLR         L               < RESTAURE (L)=@DCT JOB ENTRY.
<
< ENVOI DU MESSAGE '!!JEVIX' SUR TTYS :
<
         PSR         W               < SAVE @DEMANDE DE JE.
         LAD         VAR+JETYS
         LR          A,W             < (W)=@DEMANDE D'E/S SUR TTYS.
<
<        ON A ICI :
<                    (Y)=ADRESE DCT(PERIPHERIQUE-IN).
<
         BSR         AMJEEJ          < ENVOI DU MESSAGE VERS TTYS
                                     < ET ATTENTE.
         PLR         W               < RESTAURE (W)=@DEMANDE JE.
         RSR
         PAGE
         CALL        #SISP CMS5 DOL1#
<
<
<        I N I T I A L I S A T I O N   D E   L ' E S P A C E
<        M E M O I R E   D E   L ' E S C L A V E  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME EST APPELE
<                    PAR L'AUTOMATE DE 'JOB-ENTRY'.
<                    IL INITIALISE L'ESPACE MEMOIRE
<                    DE L'UTILISATEUR AVEC LE PRO-
<                    GRAMME SUIVANT :
<
<
<        1- SI BIT0(MOT0)=K :
<
<@0:     SVC         K               < APPEL AU CCI.
<@1:     BYTE        0;FONCCI        < ARGUMENT DU SVC : APPEL CCI.
<@2:     WORD        NILK            < PILE POINTEE PAR K.
XMOT0::  MOT         O               < INDEX DU MOT0,
XMOT1::  MOT         XMOT0+D         < INDEX DU MOT1.
XMOT2::  MOT         XMOT1+D         < INDEX DU MOT2.
LXMOT::  VAL         XMOT2+D-XMOT0   < LONGUEUR MAXIMUM DU PROGRAMME D'INITIA-
                                     < LISATION.
         IF          XLRMOT-LXMOT,,XEIF%,
         IF          ATTENTION : L'EN-TETE DE L'ESPACE MEMOIRE
         IF          UTILISATEUR DIFFERE DES BESOINS !!!
XEIF%:   VAL         ENDIF
<
<        ET :
<                    P<--XMOT0,
<                    A<--XMOT1,
<                    K<--XMOT2-DEPILE.
<
<
<        2- SI BIT0(MOT0)=1 :
<
<@0:     WORD        '1E16           < QUIT D'APPEL DIRECT DU CCI.
<
<        ET :
<                    P<--XMOT0.
<
<
<        NOTA :
<                      LES ADRESSES DONNEES ICI
<                    SONT EVIDEMMENT RELATIVES
<                    AU REGISTRE 'SLO'...
<
<
<        ARGUMENT :
<                    (W)=ADRESSE DCT(ESCLAVE).
<                    (DESTRUCTIBLE).
<
<
<        A T T E N T I O N  :
<                      C'EST 'RUNSVC' QUI SE CHARGE
<                    DE FAIRE BOUCLER L'UTILISATEUR
<                    SUR LE 'SVC' 'CCI'...
<
<
IMEMES:  EQU         $
         PSR         B,Y
         CALL        #SISP CMS5 PSRSLO#
                                     < SAUVEGARDE DE (SLO,SLE) COURANT.
         LA          RSLO+XXPSTD,W
         LB          RSLE+XXPSTD,W
         WOE                         < MISE EN PLACE DE (SLO,SLE) ESCLAVE.
         CPZ         MOT0            < IMPLANTE-T'ON UN SVC OU UN QUIT???
         JL          IMEMX           < DANS LE CAS OU L'ON IMPLANTE
                                     < UN QUIT, LES REGISTRES NE
                                     < SONT PAS (RE-)INITIALISES,
                                     < MIS A PART LE REGISTRE P...
<
< CAS OU L'ON IMPLANTE UN 'SVC',
< INITIALISATION DES REGISTRES :
< (ON A DEJA (P)=0...)
<
         IC          RA+XXPSTD,W     < A(ESCLAVE)<--XMOT1.
         IC          RK+XXPSTD,W     < K(ESCLAVE)<--XMOT2-DEPILE.
         IF          XMOT2-DEPILE-I,,XEIF%,
         IF          ATTENTION : LE 'IC' SUR 'RK' EST IDIOT !!!
XEIF%:   VAL         ENDIF
         IF          XMOT1-I,,XEIF%,
         IF          ATTENTION : LE 'IC' SUR 'RA' EST IDIOT !!!
XEIF%:   VAL         ENDIF
<
< GENERATION DU MINI-PROGRAMME D'INITIALISATION :
<
IMEMX:   EQU         $               < ENTREE RESERVEE A LA ROUTINE
                                     < D'ABORT DES ESCLAVES.
         LA          MOT0            < ACCES A L'INSTRUCTION (QUIT/
                                     < SVC) A IMPLANTER EN MOT0.
         TBT         BMOT0           < DISCRIMINATION QUIT/SVC A
                                     < L'AIDE DU CARY (C=1 SI QUIT).
         RBT         BMOT0           < ARZ BIT0(MOT0) A PRIORI.
         LYI         XMOT0           < (Y)=ADRESSE RELATIVE DU MOT0...
         STAR                        < MISE EN PLACE DU SVC/QUIT CCI
                                     < DANS LE MOT0 DE L'ESPACE
                                     < MEMOIRE UTILISATEUR.
                                     < (EN (SLO)+0).
         JC          E872            < DANS LE CAS D'UN QUIT, IL
                                     < N'Y A RIEN D'AUTRE A INITIALISER.
<
< CAS DU SVC : GENERATION DE
< L'ARGUMENT D'APPEL DU CCI :
<
         LAI         FONCCI
         LYI         XMOT1           < (Y)=ADRESSE RELATIVE DU MOT1...
         STAR                        < MISE DE L'ARGUMENT DU SVC
                                     < EN (SLO)+1.
E872:    EQU         $
                                     < RESTAURATION DE (SLO,SLE) :
         CALL        #SISP CMS5 PLRSLO#
         PLR         B,Y
         RSR                         < ET C'EST TOUT...
<
<
<        R E I N I T I A L I S A T I O N   D E   L ' E S P A C E
<        M E M O I R E   E S C L A V E   S U I T E
<                    A   U N   A B O R T  :
<
<
<        FONCTION :
<                      LORS DE LA RECEPTION D'UN
<                    DOUBLE 'ALT-MODE' D'UN UTILI-
<                    SATEUR (OU DE "!X..."), LE
<                    PROGRAMME EN COURS EST IN-
<                    TERROMPU, ET LA MAIN EST DON-
<                    NEE AU 'CCI' ; POUR CE FAIRE,
<                    IL FAUT UN MINI-PROGRAMME
<                    D'APPEL DU 'CCI' : C'EST LE
<                    BUT DE CE SOUS-PROGRAMME
<                    APPELE EN TANT QUE 'FSERV'.
<
<
<        ARGUMENT :
<                    (W)=ADRESSE DE 'DEMSER'.
<
<
ABORT:   EQU         $
         ADRI        DCTESC-DEMSER,W < (W)=@DCT-ESCLAVE.
         PSR         B
         BSR         ASAVRE          < SAUVEGARDE DES REGISTRES
                                     < COURANTS DE L'ESCLAVE AU
                                     < MOMENT DE L'ABORT.
         PLR         B
<
<        SUPPRESSION DE LA ROUTINE DE FIN DE SERVICE :
<
         STZ         FSERV-DCTESC,W
<
<        PREPARATION DES REGISTRES DE L'ESCLAVE :
<
         LXI         XMOT2-DEPILE    < PREPARATION DE LA REINITIALISATION
                                     < DES REGISTRES ESCLAVES.
         LA          PSTESC-DCTESC+RS,W < TEST DU MODE DE L'ESCLAVE (S).
         JAGE        E803            < L'ESCLAVE EST EN MODE 'ESCLAVE'.
<
< CAS OU L'ESCLAVE EST EN MODE 'MAITRE',DONC
< SUITE A UN SVC : DEUX CAS SE PRESENTENT :
<
<        1 - MOT0='SVC' : ON LAISSE LA PILE
<        INTACTE, ET ON MODIFIE LE REGISTRE
<        'K' AVEC 'XMOT2', MOT2 DANS LEQUEL
<        ON MET UN 'P' DE RETOUR' NUL ; DE
<        PLUS LE MOT 'RAD' CONTIENT DIRECTEMENT
<        LE 'P' DE RETOUR DU 'SVC'...
<
<        2 - MOT0='QUIT' : IL N'Y A PAS
<        DE PILE GENEREE, DONC LA ON DOIT
<        MODIFIER LA PILE, EN Y METTANT LE
<        REGISTRE 'P' DE RETOUR DU 'SVC' AVEC
<        'XMOT0' ; LA 'RAD' CONTIENT L'ANCIEN
<        'P' DE RETOUR, CE QUI EST OBLIGATOIRE,
<        SINON ON PERD UNE INFORMATION...
<
         PSR         L
         LA          PSTESC-DCTESC+RSLO,W < (A)=(SLO(ESCLAVE)).
         BSR         APDADR          < MULTIPLICATION PAR 16 DE (SLO).
         LR          A,L             < (L)=SLO*16
         AD          PSTESC-DCTESC+RK,W
         XR          A,L             < (L)=K ABSOLU
                                     < (A)=SLO*16
         LY          O,L             < 'P' DE RETOUR
         XR          A,W             < SAVE @DCT-ESCLAVE DANS A, ET
                                     < (W)=(SLO-ESCLAVE).
         STY         RAD-SLOESC,W    < L'OPERANDE '@' DU DEBUG UTILI-
                                     < SATEUR RECOIT LE P DE RETOUR DU
                                     < SVC QUI SE TROUVAIT AU SOMMET
                                     < DE LA PILE POINTEE PAR K.
         CPZ         MOT0            < QUE DOIT-ON GENERER ???
         JG          E804X           < UN 'SVC'...
         JL          E804Y           < UN 'QUIT'...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      VOIR POURQUOI LE 'MOT0' EST RAZE !!!
<
         JMP         E804X           < ON FAIT COMME POUR LES 'SVC'...
<
< CAS D'UN 'QUIT' A GENERER :
<
E804Y:   EQU         $
         XR          A,W             < RESTAURE (W)=@DCT-ESCLAVE.
         STZ         O,L             < RAZ DU P DE RETOUR
                                     < DE L'ESCLAVE DANS SON PROGRAMME.
         PLR         L
LARMO2:: VAL         K               < VALEUR INDIQUANT DANS 'A' QU'UN 'LAR'
                                     < D'ACCES AU MOT2 EST POSSIBLE ET DONNERA
                                     < BIEN LA VALEUR CORRECTE DU MOT2 ; CETTE
                                     < VALEUR EST INDISTINGUABLE D'UNE VALEUR
                                     < ANTERIEUREMENT NULLE DU MOT2, CE QUI EST
                                     < BIEN...
         LAI         LARMO2          < (A)=LARMO2 : ON POURRA FAIRE UN 'LAR'...
         JMP         IMEMY           < VERS LA GENERATION DU MINI-PROGRAMME...
<
< CAS D'UN 'SVC' A GENERER :
<
E804X:   EQU         $
         PSR         X               < SAUVEGARDE DU FUTUR REGISTRE 'A'
                                     < DE L'UTILISATEUR...
         LX          XMOT2,W         < (X)=VALEUR ANTERIEURE DU MOT2 ; A NOTER
                                     <     QUE SI CELLE-CI EST NULLE, ON TOMBE
                                     <     SUR 'LARMO2', MAIS COMME ON VA RAZER
                                     <     LE MOT2, SA VALEUR NE VA PAS CHANGER,
                                     <     ET DONC ON PEUT FAIRE UN 'LAR', BIEN
                                     <     QUE LE MOT2 AIT ETE CHANGE...
         IF          LARMO2-K,,XEIF%,
         IF          ATTENTION : LA VALEUR DE 'LARMO2' EST INCOMPATIBLE
         IF          AVEC LA VALEUR DE REINITIALISATION DU MOT2 ;
         IF          EN EFFET, IL FAUT QUE 'LARMO2' VAILLE CETTE
         IF          VALEUR DE REINITIALISATION, SI L'ON VEUT QUE
         IF          LE 'LAR' DONNE UN RESULTAT CORRECT LORSQUE
         IF          (A)=LARMO2 !!!
XEIF%:   VAL         ENDIF
         STZ         XMOT2,W         < AINSI, ON RAZE LE 'P' DE RETOUR DU 'SVC'
                                     < COURANT DANS LA PILE QUE L'ON GENERE...
         IF          XMOT0-K,,XEIF%,
         IF          ATTENTION : LE 'P' DE RETOUR EST MAL INITIALISE !!!
XEIF%:   VAL         ENDIF
         XR          A,W             < RESTAURE : (W)=ADRESSE DE 'DCTESC'...
         LAI         XMOT2
         STA         PSTESC-DCTESC+RK,W
                                     < INITIALISATION DU REGISTRE 'K' TEL
                                     < QUE LA PILE 'K' CONTIENNE LE 'P' DE
                                     < RETOUR DU 'SVC' COURANT...
         LR          X,A             < (A)=VALEUR ANTERIEURE DU MOT2...
         PLR         X               < (X)=FUTUR REGISTRE 'A' UTILISATEUR...
         PLR         L
         JMP         E804            < VERS L'INITIALISATION DU REGISTRE 'A'...
<
< CAS OU L'ESCLAVE EST EN MODE 'ESCLAVE',
< DONC EN EXECUTION OU INTERROMPU PAR
< L'HORLOGE OU EN TRAPPE :
<
E803:    EQU         $
         STZ         PSTESC-DCTESC+RP,W < RAZ DU REGISTRE 'P' COURANT DE
                                        < L'ESCLAVE.
         LAI         LARMO2          < (A)=LARMO2, INDIQUANT AINSI QU'UN 'LAR'
                                     <     D'ACCES AU MOT2 EST REALISABLE...
         CPZ         MOT0            < DISCRIMINATION QUIT/SVC.
         JL          IMEMY           < QUIT : PAS D'INIT REGISTRES.
<
< CAS DU SVC : INITIALISATION DE A & K :
<
         STX         PSTESC-DCTESC+RK,W < K(ESCLAVE) <-- XMOT2-DEPILE.
E804:    EQU         $
         IF          XMOT2-DEPILE-XMOT1,,XEIF%,
         IF          ATTENTION : L'INITIALISATION DE 'A' NE PEUT SE
         IF          FAIRE AVEC CELLE DU REGISTRE 'K' !!!
XEIF%:   VAL         ENDIF
         STX         PSTESC-DCTESC+RA,W < A(ESCLAVE) <-- XMOT1.
<
<
<        S A U V E G A R D E   P U I S   I N T I A L I S A T I O N
<        D E S   M O T S   0 ,   1   E T   2   D E   L ' E S P A C E
<        M E M O I R E   D E   L ' U T I L I S A T E U R  :
<
<
<        ARGUMENT :
<                    (A)=LARMO2 OU K (MAIS A NOTER QUE LARMO2=K) : UN
<                                    'LAR' D'ACCES AU MOT2 EST POSSIBLE,
<                                    CAR SOIT ON N'A PAS MODIFIE LE
<                                    MOT2 (LARMO2), SOIT ON L'A MODIFIE
<                                    MAIS EN LE METTANT A 0 (K)...
<                       #K : LE MOT2 A ETE MODIFIE, ET SA
<                            VALEUR ANTERIEURE EST DANS 'A',
<                            ET DIFFERENTE DE K...
<
<
IMEMY:   EQU         $               < ENTRY UTILISEE PAR 'TH0'...
         PSR         B,Y
         LR          A,X             < (X)=INDICATEUR DE 'LAR' SUR LE MOT2...
         CALL        #SISP CMS5 PSRSLO#
                                     < SAUVEGARDE DE (SLO,SLE) COURANT.
<
< MEMORISATION DE L'ETAT ANTERIEUR
< DE L'ESPACE MEMOIRE UTILISATEUR :
<
         LA          RSLO+XXPSTD,W
         LB          RSLE+XXPSTD,W
XWOR%9:  VAL         SLOESC>DADR
         ADRI        -XWOR%9,A
         WOE                         < MISE EN PLACE D'UN (SLO,SLE) ENCADRANT
                                     < L'ESPACE MEMOIRE UTILISATEUR, Y COMPRIS
                                     < SON EN-TETE...
         LYI         SLOESC+XMOT0
         LAR
         LYI         RMOT0
         STAR                        < MEMORISATION DU MOT0,
         LYI         SLOESC+XMOT1
         LAR
         LYI         RMOT1
         STAR                        < DU MOT1,
         LR          X,A             < (A)=INDICATEUR DE 'LAR' A FAIRE, ET
                                     <     VALEUR ANTERIEURE DU MOT2 SI #0...
         IF          LARMO2-K,,XEIF%,
         IF          ATTENTION : LE 'JANE' EST IDIOT !!!
XEIF%:   VAL         ENDIF
         JANE        E804X1          < LE 'LAR' N'EST PAS A FAIRE, ET 'A'
                                     < DONNE LA VALEUR ANTERIEURE DU MOT2...
         LYI         SLOESC+XMOT2    < (A)=LARMO2 :
         LAR                         < (A)=VALEUR DU MOT2 (QUI A ETE MODIFIE
                                     <     PAR UN 'STZ', OU PAS MODIFIE...).
E804X1:  EQU         $
         LYI         RMOT2
         STAR                        < ET DU MOT2.
<
< PREPARATION DE L'INITIALISATION :
<
         LA          RSLO+XXPSTD,W
         LB          RSLE+XXPSTD,W
         WOE                         < MISE EN PLACE DE (SLO,SLE) ESCLAVE.
         JMP         IMEMX           < ALLONS GENERER LE MINI-
                                     < PROGRAMME D'APPEL A CCI.
         CALL        #SISP CMS5 DOL2#
         PAGE
<
<
<        S A U V E G A R D E   D E S   R E G I S T R E S
<        D ' U N   E S C L A V E   E N   T E T E
<        D E   L ' E S P A C E   M E M O I R E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE DEPLACE LES 10 REGISTRES
<                    DE L'ESCLAVE (A,B,X,Y,C,L,W,K,P,S) DE
<                    DCTESC VERS L'EN-TETE DE L'ESPACE MEMOIRE
<                    LORS DES ABORT (ALT-MODE) ET DES TRAPPES.
<
<
<        A T T E N T I O N  :
<                      CETTE ROUTINE NE PEUT ETRE APPELEE QUE
<                    SI L'ESPACE MEMOIRE DE L'ESCLAVE EST
<                    RESIDENT !!!!!
<
<
<        ARGUMENT :
<                    (W)=ADRESSE DCT(ESCLAVE).
<
<
<        DETRUIT A,B,X.
<
<
SAVREG:  EQU         $
         CALL        #SISP CMS5 PSRSLO#
                                     < SAUVEGARDE DE (SLO,SLE) COURANT...
         LA          RSLO+XXPSTD,W
         LB          RSLE+XXPSTD,W
XWOR%9:  VAL         SLOESC>DADR
         ADRI        -XWOR%9,A
         WOE                         < INITIALISATION DE (SLO,SLE) EN TETE
                                     < DU BLOC MEMOIRE QUI LUI EST ATTRIBUE,
                                     < COMPTE TENU DE 'SLOESC'...
         LAD         PSTESC-DCTESC,W < (A)=ADRESSE ABSOLUE DES REGISTRES DANS
                                     <     LA 'DCTESC',
         LBI         RAT             < (B)=ADRESSE RELATIVE A 'SLO' DU PREMIER
                                     < REGISTRE DE TRAPPE...
         LXI         RS-RA+Z         < (X)=NOMBRE DE REGISTRES A DEPLACER, A
                                     < SAVOIR (A,B,X,Y,C,L,W,K,P,S).
         MVTS                        < SAUVEGARDE DES REGISTRES DE TRAPPE...
                                     < RESTAURATION DE (SLO,SLE) :
         CALL        #SISP CMS5 PLRSLO#
         RSR
         PAGE
<
<
<        I N I T I A L I S A T I O N   D E   L ' E N - T E T E
<        D E   L ' E S P A C E   M E M O I R E   E S C L A V E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE APPELEE PAR UN HANDLER
<                    DE SERVICE LORS DU JOB ENTRY A A SA
<                    CHARGE DE REMETTRE A 0 LES MOTS DE
<                    L'EN-TETE DE L'ESPACE MEMOIRE ESCLAVE,
<                    SOIENT LES MOTS ALLANT DE (SLO)-SLOESC A
<                    (SLO)-1 ; CES MOTS SONT DESTINES A
<                    SAUVEGARDER LE CONTEXTE ESCLAVE (A,B,X,Y,
<                    C,L,W,K,P,S) LORS DES TRAPPES DE CET ESCLAVE.
<
<
<        ARGUMENT :
<                    (W)=ADRESSE DCT(ESCLAVE).
<                    (DESTRUCTIBLE).
<
<
RZMEM:   EQU         $
         LXI         SLOESC          < NBRE DE MOTS A RAZER.
         LA          RSLO+XXPSTD,W   < (A)=SLO DE L'ESCLAVE.
         BSR         APDADR          < MULTIPLLICATION PAR 16 DE (SLO).
         LR          A,W             < (W)=SLO.
Z310:    EQU         $
         ADRI        -P,W
         STZ         O,W             < RAZ DE CHAQUE MOT.
         JDX         Z310
         RSR                         < ET C'EST TOUT...



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