<        S I S   C M S 5   12
         PAGE
         PAGE
<
<
<        D C T   I N E X I S T A N T E  :
<
<
DCTTSI:  EQU         $
PSTTSI:  WORD        K;K;K;K;COM+DEPCS;DCTTSI;NIL;PILTSI;HANDLR;SMST;SO;SE
       #@ASCI        " TSI"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR
         WORD        FILTRS
         WORD        XXDCTP          < 'DCTTSI' N'EST PAS LOUABLE !!!
         WORD        XXLOC0
         DZS         LSEM
         WORD        NIL
         WORD        NIL
         WORD        XXCHV0
         DZS         LSEM
         WORD        XXSIT0
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLTSI
         WORD        HDLTSI
         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 :
<
VARTSI:  EQU         $
         IF          VARTSI-DCTTSI-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
< PILE :
<
         CALL        #SISP CMS5 DOL2#
PILTSI:  EQU         $-DEPILE
XWPILE:  VAL         LPILEH+1
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        H A N D L E R   D E S   T A C H E S
<        S O F T   I N E X I S T A N T E S  :
<
<
<        A T T E N T I O N  :
<                      'TSI' N'EST PAS UNE TACHE RE-ENTRANTE,
<                    PUISQUE NE POSSEDANT QU'UNE 'DCT' ; OR,
<                    CELLE-CI EST REFERENCEE SOUS PLUSIEURS
<                    NIVEAUX DIFFERENTS. DANS UN CONTEXTE TRES
<                    VERREUX, CELA POURRAIT AVOIR DES CONSE-
<                    QUENCES FACHEUSES SUR LA MISE A POINT !!!
<
<
HDLTSI:  EQU         $
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
         RSR
         PAGE
<
<
<        T A C H E S   H A R D S   I N E X I S T A N T E S  :
<
<
         CALL        #SISP CMS5 CHECK#
<
<
<        P I L E S  :
<
<
LPLTHI:: VAL         LPILEH          < LONGUEUR DES PILES DE 'THI'...
XWPILE:  VAL         LPLTHI
PILTH3:  EQU         $-DEPILE
         CALL        #SISP CMS5 GENPIL2#
PILTH5:  EQU         $-DEPILE
         CALL        #SISP CMS5 GENPIL2#
PILTH7:  EQU         $-DEPILE
         CALL        #SISP CMS5 GENPIL2#
PILTH8:  EQU         $-DEPILE
         CALL        #SISP CMS5 GENPIL2#
PILTH9:  EQU         $-DEPILE
         CALL        #SISP CMS5 GENPIL2#
PILTHA:  EQU         $-DEPILE
         CALL        #SISP CMS5 GENPIL2#
PILTHB:  EQU         $-DEPILE
         CALL        #SISP CMS5 GENPIL2#
PILTHC:  EQU         $-DEPILE
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
<
<
<        C O D E   D E   ' T H I '  :
<
<
THI:     EQU         $
TH03:    EQU         THI
TH05:    EQU         THI
TH07:    EQU         THI
TH08:    EQU         THI
TH09:    EQU         THI
TH0A:    EQU         THI
TH0B:    EQU         THI
TH0C:    EQU         THI
<
<
<        FONCTION :
<                      CETTE TACHE POSSEDE UN PROLOGUE ET
<                    STANDARD, ET UN EPILOGUE.
<                      ENTRE LES DEUX, ELLE BOUCLE SUR UN
<                    APPEL A SYSER QUI BOUCLERA SUR UN
<                    APPEL A TDEFS (PUISQUE LES IT SONT
<                    MASQUEES).
<                      ON POURRA REPARTIR EN PROVOQUANT
<                    UN DEFAUT SECTEUR.
<
<
XWKNIV:  VAL         NTH0-I          < UN QUELCONQUE NIVEAU INEXISTANT
                                     < POUR APPELER 'SI CMS5 THDEB' QUI
                                     < GENERERA UN PROLOGUE STANDAUD
         CALL        #SISP CMS5 THDEB#
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
         BSR         ARRSTF          < EPILOGUE.
         JMP         THI             < ET C'EST TOUT...
         PAGE
<
<
<        T A C H E   H A R D   N I V E A U   1  :
<
<
<        FONCTION :
<                      CETTE TACHE HARDWARE UN PEU SPECIALE
<                    EST DESTINEE A TRAITER LES INCESSANTS
<                    DEFAUTS SUR LE 'CBM' DE LA TELEVISION
<                    BASSE DEFINITION ATTEINTE PAR LA 'CDAI'...
<
<
XSNCBM:: VAL         6               < NUMERO DU SOUS-NIVEAU D'INTERRUPTION
                                     < DU 'CBM' CONNU...
LOCTH1:  EQU         $               < LOCAL NECESSAIRE AU 'CBM' :
<
< DONNEES D'ACCES AU 'CBM' :
<
T1ETA2:  WORD        ACCBM?FPHIN     < LECTURE DU MOT D'ETAT2 :
XCBMX::  VAL         ETAPAR          < BIT INDIQUANT UNE MEMOIRE INEXISTANTE,
XCBMXL:: VAL         ETAVIO          < BIT INDIQUANT QUE LA MEMOIRE NE RENVOIE
                                     < PAS LES INFORMATIONS DEMANDEES.
T1ETA1:  WORD        ACCBM?FPHETB    < LECTURE DU MOT D'ETAT1,
T1CMD:   WORD        ACCBM?FPHCMD    < SORTIE D'UNE COMMANDE AU 'CBM'.
<
< PILE :
<
         CALL        #SISP CMS5 CHECK#
PILTH1:  EQU         $-DEPILE
XWPILE:  VAL         LPILTH          < LONGUEUR DE LA PILE DE 'TH01'.
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
XWKNIV:  VAL         NIVCBM          < NIVEAU DE LA TACHE HARD.
         CALL        #SISP CMS5 THDEB#
<
< ACCES AU SOUS-NIVEAU EN CAUSE :
<
         ACK                         < RECHERCHE DES SOUS-NIVEAUX EN ATTENTE :
         LR          X,A
         CPI         XSNCBM          < EST-CE LE 'CBM' ???
         JE          SYSCBM          < OUI, C'EST BON...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
         JMP         CBMOK1          < ET ON SORT TOUT DE SUITE, QUOI FAIRE
                                     < D'AUTRE ???
SYSCBM:  BSR         ASYSER          < E R R E U R   S Y S T E M E ...
                                     < SYSER DES DEFAUTS SUR 'CBM' DE LA 'TV'.
<
< INITIALISATION DU PROCESSUS :
<
         CALL        #SISP CMS5 W TRACE#
         LAI         NPCBM
         BSR         ATRACE          < TRACE DU DEFAUT SUR LE 'CBM'...
         LRM         A,B,W
         WORD        SLOCBM          < (A)='SLO' SPECIAL DU 'CBM',
         WORD        SLECBM          < (B)='SLE' SPECIAL DU 'CBM',
         WORD        LOCTH1          < 'W' BASE LE "LOCAL" DE 'TH01'...
         WOE                         < POSITIONNEMENT DE 'SLO' ET 'SLE'.
<
< TENTATIVE DE CLEAR DU 'CBM' :
<
CBMNOK:  EQU         $               < CAS DU 'CBM' EN MANUEL...
         SIO         T1ETA2-LOCTH1,W < LECTURE DU MOT D'ETAT2.
         LAI         CBMDIS
         SIO         T1CMD-LOCTH1,W  < ON DISJOINT LE 'CBM'.
         LAI         CBMJON
         SIO         T1CMD-LOCTH1,W  < ON JOINT LE 'CBM'.
         SIO         T1ETA2-LOCTH1,W < LECTURE DU MOT D'ETAT2,
         TBT         ETAOPE          < LE 'CBM' EST-IL JOINT ET PRESENT ???
         JC          CBMOK2          < OUI, OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
                                     < LE 'CBM' DOIT ETRE EN MANUEL...
         JMP         CBMNOK          < SI LE 'CBM' EST PRESENT, IL FAUT LE
                                     < METTRE EN AUTOMATIQUE... ET RETENTER
                                     < LA JONCTION...
         JMP         CBMOK1          < S'IL EST ABSENT, IL FAUT SAUTER LE
                                     < 'STAR', GARE AUX ALARMES !!!
CBMOK2:  EQU         $
         LA          MEMV
         TBT         MEMXXX          < DOIT-ON INITIALISER LE FILTRE D'ADRESSE ?
         JNC         CBMOK3          < NON...
                                     < OUI :
         LAI         K               < (A)=VALEUR ARBITRAIRE...
         LYI         K               < (Y)=ADRESSE RELATIVE DANS (SLO,SLE),
         STAR                        < ON ECRIT AINSI LE FILTRE D'ADRESSE...
CBMOK3:  EQU         $
         SIO         T1ETA1-LOCTH1,W < LECTURE DU MOT D'ETAT1 AFIN DE DESARMER
                                     < UNE EVENTUELLE INTERRUPTION PUPITRE...
         SIO         T1ETA2-LOCTH1,W < ON RELIT LE MOT D'ETA2 :
         RBT         ETAOPE          < A PRIORI, CE N'EST PAS UN DEFAUT...
         JAE         CBMOK1          < EFFECTIVEMENT, TOUT EST BON...
SYSCBN:  BSR         ASYSER          < E R R E U R   S Y S T E M E ...
                                     < SYSER DE DEFAUT RECALCITRANT SUR
                                     < LE 'CBM' DE 'TV'.
<
< ET RETOUR :
<
CBMOK1:  EQU         $
         BSR         ARRSTF          < EPILOGUE...
         JMP         TH01            < ET C'EST TOUT...
         PAGE
<
<
<        T A C H E   H A R D   N I V E A U   2  :
<
<
<        FONCTION :
<                      CETTE TACHE HARDWARE UN PEU SPECIALE
<                    EST DESTINEE A TRAITER LES INCESSANTS
<                    DEFAUTS SUR LE 'CBJ' DE LA TELEVISION
<                    MOYENNE DEFINITION ATTEINTE PAR LA 'CDAJ'...
<
<
XSNCBJ:: VAL         6               < NUMERO DU SOUS-NIVEAU D'INTERRUPTION
                                     < DU 'CBJ' CONNU...
LOCTH2:  EQU         $               < LOCAL NECESSAIRE AU 'CBJ' :
<
< DONNEES D'ACCES AU 'CBJ' :
<
T2ETA2:  WORD        ACCBJ?FPHIN     < LECTURE DU MOT D'ETAT2,
T2ETA1:  WORD        ACCBJ?FPHETB    < LECTURE DU MOT D'ETAT1,
T2CMD:   WORD        ACCBJ?FPHCMD    < SORTIE D'UNE COMMANDE AU 'CBJ'.
<
< DONNEES D'ACCES A LA 'CDA' COURANTE :
<
T2CDO:   WORD        OCDA            < ACCES A L'ORIGINE,
T2CDE:   WORD        ECDA            < ACCES A L'EXTREMITE.
<
< DONNEES NECESSAIRES POUR
< SAVOIR S'IL FAUT IGNORER
< LES MEMOIRES INEXISTANTES :
<
T2MEX:   WORD        MEMINX          < ADRESSE DE L'INDICATEUR EN MEMOIRE
                                     < DEBANALISEE...
<
< PILE :
<
         CALL        #SISP CMS5 CHECK#
PILTH2:  EQU         $-DEPILE
XWPILE:  VAL         LPILTH          < LONGUEUR DE LA PILE DE 'TH02'.
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
XWKNIV:  VAL         NIVCBJ          < NIVEAU DE LA TACHE HARD.
         CALL        #SISP CMS5 THDEB#
<
< ACCES AU SOUS-NIVEAU EN CAUSE :
<
         ACK                         < RECHERCHE DES SOUS-NIVEAUX EN ATTENTE :
         LR          X,A
         CPI         XSNCBJ          < EST-CE LE 'CBJ' ???
         JE          SYSCBJ          < OUI, C'EST BON...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
         JMP         CBJOK1          < ET ON SORT TOUT DE SUITE, QUOI FAIRE
                                     < D'AUTRE ???
SYSCBJ:  BSR         ASYSER          < E R R E U R   S Y S T E M E ...
                                     < SYSER DES DEFAUTS SUR 'CBJ' DE LA 'TV'.
<
< INITIALISATION DU PROCESSUS :
<
         CALL        #SISP CMS5 W TRACE#
         LAI         NPCBJ
         BSR         ATRACE          < TRACE DU DEFAUT SUR LE 'CBJ'...
         LRM         A,B,W
         WORD        SLOCBM          < (A)='SLO' SPECIAL DU 'CBM',
         WORD        SLECBM          < (B)='SLE' SPECIAL DU 'CBM',
         WORD        LOCTH2          < 'W' BASE LE "LOCAL" DE 'TH02'...
         WOE                         < POSITIONNEMENT DE 'SLO' ET 'SLE'.
<
< TENTATIVE DE CLEAR DU 'CBJ' :
<
CBJNOK:  EQU         $               < CAS DU 'CBJ' EN MANUEL...
         SIO         T2ETA2-LOCTH2,W < LECTURE DU MOT D'ETAT2.
         TBT         XCBMX           < Y-A-T'IL UNE MEMOIRE INEXISTANTE ???
         JC          CBJNK1          < OUI...
         TBT         XCBMXL          < LA MEMOIRE RENVOIE-T'ELLE LES INFORMA-
                                     < TIONS DEMANDEES ???
         JNC         CBJOK4          < OUI, OK...
<
< CAS DES MEMOIRES INEXISTANTES :
< (LE PROBLEME EST DELICAT ; EN
< EFFET, L'INTERRUPTION MEMOIRE
< INEXISTANTE SUR LE 'CBJ' EST
< ASYNCHRONE PAR RAPPORT AU PRO-
< GRAMME QUI L'A CAUSEE, ET NE
< RESSEMBLE DONC EN RIEN A UNE
< TRAPPE ; EN PARTICULIER LA TACHE
< INTERROMPUE PAR L'INTERRUPTION
< COURANTE PEUT TRES BIEN NE PAS
< ETRE CELLE QUI EST LA CAUSE
< DE LA MEMOIRE INEXISTANTE, OU
< SI C'EST ELLE, SES REGISTRES
< NE POINTENT PLUS SUR L'INSTRUCTION
< EN COURS ; CE QUE L'ON VA DONC
< FAIRE ICI, C'EST ESPERER QUE LA
< TACHE EN CAUSE VA REDEMANDER
< UN PEU PLUS LOIN LA 'CDAJ', ET
< ON VA LUI FORCER UNE VRAIE TRAPPE
< EN PERMUTANT 'CDESCO' ET 'CDESCE'...
< CE N'EST DONC PAS UN PROCEDE
< SUR A CENT POUR CENT... DE PLUS
< IL DEMANDE QUE "!CDAJ..." ET
< "!ACTIVITE ON" S'EXCLUENT L'UNE
< L'AUTRE)
<
CBJNK1:  EQU         $
         IF          XMEMXI-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         &T2MEX-LOCTH2,W < PEUT-ON IGNORER CETTE ALARME ???
         JE          CBJOK4          < OUI, DONC ON NE VA PAS TENTER DE TRANS-
                                     < METTRE LA TRAPPE A L'UTILISATEUR...
         PSR         X,W             < SAUVEGARDE DE LA BASE D'ACCES AUX ARGU-
                                     < MENTS DU 'CBJ'...
         LXI         NESCLA-Z        < POUR INDEXER LES UITILISATEURS :
                                     < (X)='IDESC'...
CBJNK2:  EQU         $
         LA          &ATBU           < (A)=ADRESSE DE LA 'DCTESC' D'IDESC=(X),
         JALE        CBJNK3          < L'UTILISATEUR (X) N'EXISTE PAS, OU EST
                                     < EN TRAIN DE FAIRE UN LOGOUT...
         LR          A,W             < (W)=ADRESSE DE LA 'DCTESC' DE L'UTILISA-
                                     <     D'IDESC=(X),
         LA          CDESCO-DCTESC,W < (A)=ORIGINE DE SA 'CDA' COURANTE,
         TBT         BMCDAJ          < A-TIL LA 'CDAJ' ???
         JC          CBJNK4          < OUI...
CBJNK3:  EQU         $
         ADRI        -I,X            < DANS LE CAS D'UN UTILISATEUR INEXISTANT,
                                     < EN LOGOUT, OU NE POSSEDANT PAS LA 'CDAJ',
                                     < ON PASSE A L'UTILISATEUR PRECEDENT...
         CPZR        X               < EXISTE-T'IL ???
         JGE         CBJNK2          < OUI...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      SI AUCUN UTILISATEUR N'A
<                    LA 'CDAJ', C'EST QU'ON EST
<                    EN PHASE "!ACTIVITE ON", ON
<                    A DONC INTERET LA FAIRE "OFF" !!!
<
CBJNK8:  EQU         $
         PLR         X,W             < RESTAURATIONS...
         JMP         CBJOK4          < VERS LE CLEAR DU 'CBJ'...
CBJNK4:  EQU         $
         LB          CDESCE-DCTESC,W < ON A TROUVE L'UTILSATEUR QUI EST LA
                                     < CAUSE DE LA MEMOIRE INEXISTANTE :
                                     < (A)=ORIGINE DE SA 'CDAJ',
                                     < (B)=EXTREMITE DE SA 'CDAJ'...
         CPR         A,B             < VALIDONS :
         JG          CBJNK6          < OK : ORIGINE (A) < EXTREMITE (B)...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE COMMENT ORIGINE
<                    ET EXTREMITE PEUVENT ETRE
<                    INVERSEES (DEUX INTERRUPTIONS
<                    SUCCESSIVES...) !!!
<                      CELA PEUT PEUT-ETRE S'EXPLIQUER
<                    DE LA FACON SUIVANTE : SI MEMXXX=1,
<                    ON EXECUTE UN 'STAR' UN PEU PLUS
<                    LOIN, OR CE 'STAR', CONTRAIREMENT A
<                    CE QUI EST DIT, PROVOQUE UN VERI-
<                    TABLE ECHANGE, ET PEUT DONC A SON
<                    TOUR PROVOQUER UNE MEMOIRE INEXIS-
<                    TANTE, ET DONC UNE RERENTRER PLUS
<                    OU MOINS IMMEDIATEMENT DANS 'TH2',
<                    D'OU CETTE 'SYSER' LORS DE CETTE
<                    RERENTREE ; ON VERIFIERA A CE
<                    PROPOS LA TRACE (IL SUFFIT DE DE-
<                    MASQUER LES INTERRUPTIONS, DE
<                    REEXECUTER LE 'BSR''ASYSER' ; MAIS
<                    N'OUBLIONS PAS QU'ON SE TROUVE DANS
<                    LE CAS OU DES TACHES HARDWARES SE
<                    TROUVENT IMBRIQUEES, CE QUI EST
<                    IMPOSSIBLE DE PAR LE MASQUAGE, ET
<                    PROVOQUE DONC UNE 'SYSER' DANS LE
<                    MODULE 'RRSTF' PAR DECOMPTAGE DE
<                    LA VARIABLE 'COMPTH'...)
<
         JMP         CBJNK8          < ET ON NE RE-PERMUTE PAS...
CBJNK6:  EQU         $
         STA         CDESCE-DCTESC,W < ON PERMUTE ORIGINE ET EXTREMITE, EN
         STB         CDESCO-DCTESC,W < ESPERANT QUE L'UTILISATEUR VA REUTILI-
                                     < SER LA 'CDAJ' TOUT DE SUITE, ET SANS
                                     < RENVOYER DE "!CDAJ..."...
CBJNK5:  EQU         $
         PLR         X,W             < RESTAURATION DE 'W'...
         LA          &T2CDO-LOCTH2,W < (A)=ADRESSE DE LA 'CDA' COURANTE,
         TBT         BMCDAJ          < EST-CE LA 'CDAJ' ???
                                     < NOTONS QU'ON EST OBLIGE DE FAIRE CE
                                     < TEST SUPPLEMENTAIRE, CAR IL N'EST PAS
                                     < EVIDENT QU'APRES LA PERMUTATION DE
                                     < 'CDESCO' ET 'CDESCE' LE SCHEDULER PRENNE
                                     < LA MAIN, ET AINSI PROVOQUE LA VIOLATION
                                     < MEMOIRE TANT ATTENDUE...
         JNC         CBJNK7          < NON, DONC RIEN A FAIRE...
         LB          &T2CDE-LOCTH2,W < OUI :
                                     < (B)=ADRESSE DE FIN,
         CPR         A,B             < LA 'CDA' COURANTE QUI EST LA 'CDAJ', ET
                                     < DONC POUR L'UTILISATEUR COURANT EST-ELLE
                                     < DEJA PERMUTEE ???
         JLE         CBJNK7          < OUI, RIEN A FAIRE...
         STB         &T2CDO-LOCTH2,W < NON,
         STA         &T2CDE-LOCTH2,W <      ON PERMUTE LA 'CDA' COURANTE...
CBJNK7:  EQU         $
<
< TENTATIVE DE CLEAR DU 'CBJ' :
<
CBJOK4:  EQU         $
         LAI         CBMDIS
         SIO         T2CMD-LOCTH2,W  < ON DISJOINT LE 'CBJ'.
         LAI         CBMJON
         SIO         T2CMD-LOCTH2,W  < ON JOINT LE 'CBJ'.
         SIO         T2ETA2-LOCTH2,W < LECTURE DU MOT D'ETAT2,
         TBT         ETAOPE          < LE 'CBJ' EST-IL JOINT ET PRESENT ???
         JC          CBJOK2          < OUI, OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
                                     < LE 'CBJ' DOIT ETRE EN MANUEL...
         JMP         CBJNOK          < SI LE 'CBJ' EST PRESENT, IL FAUT LE
                                     < METTRE EN AUTOMATIQUE... ET RETENTER
                                     < LA JONCTION...
         JMP         CBJOK1          < S'IL EST ABSENT, IL FAUT SAUTER LE
                                     < 'STAR', GARE AUX ALARMES !!!
CBJOK2:  EQU         $
         LA          MEMV
         TBT         MEMXXX          < DOIT-ON INITIALISER LE FILTRE D'ADRESSE ?
         JNC         CBJOK3          < NON...
                                     < OUI :
         LAI         K               < (A)=VALEUR ARBITRAIRE...
         LYI         K               < (Y)=ADRESSE RELATIVE DANS (SLO,SLE),
         STAR                        < ON ECRIT AINSI LE FILTRE D'ADRESSE...
CBJOK3:  EQU         $
         SIO         T2ETA1-LOCTH2,W < LECTURE DU MOT D'ETAT1 AFIN DE DESARMER
                                     < UNE EVENTUELLE INTERRUPTION PUPITRE...
         SIO         T2ETA2-LOCTH2,W < ON RELIT LE MOT D'ETA2 :
         RBT         ETAOPE          < A PRIORI, CE N'EST PAS UN DEFAUT...
         JAE         CBJOK1          < EFFECTIVEMENT, TOUT EST BON...
SYSCBK:  BSR         ASYSER          < E R R E U R   S Y S T E M E ...
                                     < SYSER DE DEFAUT RECALCITRANT SUR
                                     < LE 'CBJ' DE 'TV'.
CBJOK1:  EQU         $
         BSR         ARRSTF          < EPILOGUE...
         JMP         TH02            < ET C'EST TOUT...
         PAGE
<
<
<        T A C H E   H A R D W A R E   4  :
<
<
<
< PILE :
<
         CALL        #SISP CMS5 CHECK#
PILTH4:  EQU         $-DEPILE
XWPILE:  VAL         LPILTH
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
XWKNIV:  VAL         NIVTH4
         CALL        #SISP CMS5 THDEB#
         LAI         YTRAN4          < (A)=NOMBRE MAX DE SOUS-NIVEAUX,
         LYI         NTRAN4          < NOMBRE DE TRANSLATIONS POUR
                                     < OBTENIR LE SOUS-NIVEAU D'INTERRUPTION
                                     < GENERALISE...
         BSR         ATIT            < TRAITEMENT DE L'IT.
         BSR         ARRSTF          < EPILOGUE...
         JMP         TH04
         PAGE
<
<
<        T A C H E   H A R D W A R E   6  :
<
<
<
< PILE :
<
         CALL        #SISP CMS5 CHECK#
PILTH6:  EQU         $-DEPILE
XWPILE:  VAL         LPILTH
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
XWKNIV:  VAL         NIVTH6
         CALL        #SISP CMS5 THDEB#
         LAI         YTRAN6          < (A)=NOMBRE MAX DE SOUS-NIVEAUX,
         LYI         NTRAN6          < NOMBRE DE TRANSLATIONS POUR
                                     < OBTENIR LE SOUS-NIVEAU D'INTERRUPTION
                                     < GENERALISE...
         BSR         ATIT            < TRAITEMENT DE L'IT.
         BSR         ARRSTF          < EPILOGUE...
         JMP         TH06
         PAGE
<
<
<        T A C H E   H A R D W A R E   ' D  :
<
<
<
< PILE :
<
         CALL        #SISP CMS5 CHECK#
PILTHD:  EQU         $-DEPILE
XWPILE:  VAL         LPILTH
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
XWKNIV:  VAL         NIVTHD
         CALL        #SISP CMS5 THDEB#
         LAI         YTRAND          < (A)=NOMBRE MAX DE SOUS-NIVEAUX,
         LYI         NTRAND          < NOMBRE DE TRANSLATIONS
                                     < POUR OBTENIR LE SOUS-
                                     < NIVEAU D'INTERRUPTION GENERALISE...
         BSR         ATIT            < TRAITEMENT DE L'IT.
         BSR         ARRSTF          < EPILOGUE...
         JMP         TH0D
         PAGE
<
<
<        T A C H E   H A R D W A R E   ' E  :
<
<
<
< PILE :
<
         CALL        #SISP CMS5 CHECK#
PILTHE:  EQU         $-DEPILE
XWPILE:  VAL         LPILTH
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
XWKNIV:  VAL         NIVTHE
         CALL        #SISP CMS5 THDEB#
         LAI         YTRANE          < (A)=NOMBRE MAX DE SOUS-NIVEAUX,
         LYI         NTRANE          < NOMBRE DE TRANSLATIONS
                                     < POUR OBTENIR LE SOUS-
                                     < NIVEAU D'INTERRUPTION GENERALISE...
         BSR         ATIT            < TRAITEMENT DE L'IT.
         BSR         ARRSTF          < EPILOGUE...
         JMP         TH0E
         PAGE
<
<
<        T A C H E   H A R D W A R E   ' F  :
<
<
<
< PILE :
<
         CALL        #SISP CMS5 CHECK#
PILTHF:  EQU         $-DEPILE
XWPILE:  VAL         LPILTH
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
XWKNIV:  VAL         NIVTHF
         CALL        #SISP CMS5 THDEB#
         LAI         YTRANF          < (A)=NOMBRE MAX DE SOUS-NIVEAUX,
         LYI         NTRANF          < NOMBRE DE TRANSLATIONS
                                     < POUR OBTENIR LE SOUS-
                                     < NIVEAU D'INTERRUPTION GENERALISE...
         BSR         ATIT            < TRAITEMENT DE L'IT.
         BSR         ARRSTF          < EPILOGUE...
         JMP         TH0F
<
<
<        A T T E N T I O N  :
<                      (W)=0 : UTILISE PAR LA TRACE !!!
<
<
         PAGE
<
<
<        T R A I T E M E N T   C E N T R A L I S E
<        D E S   I N T E R R U P T I O N S  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME APPELE PAR
<                    TOUTES LES TACHES HARDWARES
<                    RECUPERE LE SOUS-NIVEAU APPELANT,
<                    EN DEDUIT LA TACHE ASSOCIEE, ET
<                    PASSE LA MAIN A L''ARIT' ASSOCIE...
<
<
<        ARGUMENTS :
<                    (Y)=TRANSLATION POUR CALCULER
<                       LE SOUS-NIVEAU D'IT GENERALISE
<                    (A)=NOMBRE MAX DE SOUS-NIVEAUX DU NIVEAU COURANT.
<
<
TIT:     EQU         $
         CALL        #SISP CMS5 W TRACE# < (W)=0 POUR LA TRACE...
TITACK:  EQU         $
         LBI         TYPITN          < POUR LE TEST DU 'CARY' EVENTUEL...
         ACK                         < 'X' RECOIT LE NUMERO DU SOUS-NIVEAU LE
                                     < PLUS PRIORITAIRE EN ATTENTE SOUS CE
                                     < NIVEAU, ET
                                     < 'S' RECOIT :
                                     < (C)=1 : SI SOUS-NIVEAU EXCEPTION,
                                     < (V)=1 : SI SOUS-NIVEAU NORMAL,
                                     < (V)=(C)=0 : S'IL N'Y A PLUS DE SOUS-
                                     <             NIVEAUX EN ATTENTE...
         JNCV        TITFIN          < PLUS DE SOUS-NIVEAUX EN ATTENTE...
<
< CAS OU IL RESTE AU MOINS
< UN SOUS-NIVEAU EN ATTENTE :
<
         ADCR        B               < (B)=1 : SOUS-NIVEAU EXCEPTION,
                                     <    =0 : SOUS-NIVEAU NORMAL.
         PSR         A,Y             < SAUVEGARDE DES ARGUMENTS...
         CPR         A,X             < LE SOUS-NIVEAU EXISTE-T'IL ???
         JL          TITS2           < OUI : (X)<(A)...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
         JMP         TITS3           < ET C'EST TOUT...
TITS2:   EQU         $
         LR          X,L             < (L)=NUMERO DE SOUS-NIVEAU,
         ADR         Y,X
         LR          X,A             < (A)=NIVEAU D'INTERRUPTION GENERALISE,
         PSR         B,L
         BSR         ATRACE          < QUE L'ON TRACE...
<
< RECUPERATION DU HANDLER CONCERNE :
<
         BSR         ACBDCT          < RECUPERATION ADRESSE DCT DANS 'A' ET 'L'.
         JAG         SYSRB1          < OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      PEUT ETRE METTRE 'DCTTSI' DANS 'A' ET 'L',
<                    OU PLUS PRUDEMMENT 'PLR B,X', ET PUIS
<                    UN 'JMP TITS3'...
<
SYSRB1:  EQU         $
         USE         L,DCT0
         LA          TESTO           < FAUT-IL TESTER LE TIME-OUT ???
         JAE         TITS1           < NON, LE TIME-OUT N'EST PAS A TESTER SUR
                                     < CE HANDLER...
         STA         TIMOUT          < OUI, IL EST A TESTER, ALORS :
                                     < ON REINITIALISE APRES CHAQUE IT
                                     < LE COMPTEUR COURANT DE TIME OUT
                                     < AU CAS OU LE HANDLER NE SERAIT PAS
                                     < A UNE FIN DE SERVICE...
TITS1:   EQU         $
         PLR         B,X             < PARAMETRES DE L'ARIT :
                                     < (B)=0 : SOUS-NIVEAU NORMAL,
                                     <    =1 : SOUS-NIVEAU EXCEPTION.
                                     < (X)=NUMERO DU SOUS-NIVEAU.
         BSR         ARIT            < APPEL DE LA ROUTINE SPECIFIQUE DU
                                     < PERIPHERIQUE.
<
< PASSAGE A L'EVENTUEL SOUS-
< NIVEAU SUIVANT :
<
TITS3:   EQU         $
         PLR         A,Y
         BSR         ATDEFS          < SOYONS PRUDENT : Y-A-T'IL UN DEFAUT
                                     < DEFAUT SECTEUR EN ATTENTE ???
         JMP         TITACK          < PUIS, VERS LE SOUS-NIVEAU SUIVANT EN
                                     < ATTENTE...
TITFIN:  EQU         $
         RSR
         PAGE
<
<
<        T E S T   D U   M O D E   D ' E X E C U T I O N
<        D U   S Y S T E M E   E T   E P I L O G U E
<        D E S   T A C H E S   H A R D W A R E S  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME APPELE PAR
<                    TOUTES LES TACHES HARDWARES EST
<                    EN FAIT LE PENDANT DE #SISP CMS5 THDEB# ;
<                    IL CONSTITUE L'EPILOGUE DE TOUTES
<                    LES TACHES HARDWARES. IL TESTE LE
<                    MODE D'EXECUTION DU SYSTEME (VOIR
<                    LA FILE 'RSTF' ET 'CHECK AND TRACE'),
<                    IL TESTE DE PLUS POUR 'TH0' (ALAR-
<                    MES) LES 'IPI' EN ATTENTE (CEUX DU
<                    DIALOGUE MAITRE <--> ESCLAVE), PUIS
<                    RESTAURE LES REGISTRES, ET DESARME
<                    LE NIVEAU...
<
<
<
<
<        E N T R Y   T H 0  :
<
<
FITH0:   EQU         $
         LXI         NSPPR1
         BSR         ACADCT          < RENVOIE (L)=ADRESSE DE 'DCTPR1', DETRUIT
                                     < LA BASE 'L' MAIS SANS IMPORTANCE...
         LBI         TYPITN          < AFIN DE DISTINGUER L'HORLOGE (TIME
                                     < OUT) DES APPELS NORMAUX ('IPI').
         BSR         ARIT            < AINSI, ON PREND EN COMPTE LES 'IPI'
                                     < INTER-PROCESSEURS S'ILS SONT VALIDES.
<
<
<        E N T R Y   T H 1   A   T H 1 5  :
<
<
RRSTF:   EQU         $
         LXI         LOFDMS
         LA          &ARSTF          < ACCES AU DERNIER MOT SIGNIFICATIF
                                     < DE RSTF ; S'IL VAUT -1 ('FFFF),
                                     < C'EST QU'ON NE TRACE PAS TOUS
                                     < LES CHANGEMENTS DE CONTEXTE.
         CPI         MMOT
         JE          E964            < SI =-1, ON LAISSE RSTF TELLE
                                     < QU'ELLE EST...
<
< CAS OU ON TRACE TOUS LES CHANGEMENTS DE CONTEXTE :
<
Z2000:   EQU         $
         STZ         &ARSTF          < RAZ DE TOUTE RSTF A PRIORI,
                                     < POUR NE PAS PERDRE DE CHANGE-
                                     < MENTS DE CONTEXTES.
         JDX         Z2000
         LXI         NTS0
         LYI         FONSB1
         LAD         ARSTF
         BSR         ATMOBT          < A PRIORI, ON FOCE LE BIT 'RSTF' DE
                                     < LA TACHE 'CHECK AND TRACE'...
E964:    EQU         $
<
< RECUPERATION DES REGISTRES DE LA TACHE INTERROMPUE :
<
         LR          K,W
         LY          O,W             < (Y)=ADRESSE DE RETOUR ('P' D'APPEL).
         LA          -D,W            < (A)=ADRESSE DE 'IC' ('L' EMPILEE).
         LR          A,W             < (W)=ADRESSE DE 'IC'.
         LA          HK-PSTH,W       < (A)=VALEUR INITIALE DE 'K'.
         LR          A,B
         ADRI        DEPILE,A        < (A)=@EMETTEUR=BASE DE LA PILE,
         ADRI        DEPILE+D,B      < (B)=@RECEPTEUR=PILE DECALEE D'UN  MOT.
         LXI         LREGTH          < 9 REGISTRES EMPILES A DECALER...
         MOVE                        < TRANSLATION D'UN MOT DE LA PILE.
         LA          HK-PSTH,W       < (A)=VALEUR INITIALE DE 'K'.
         LR          A,W
         STY         D,W             < "EMPILEMENT" DE L'ADRESSE DE RETOUR
                                     < AU BAS DE LA PILE...
<
< "DECOMPTAGE" DES TACHES HARDWARES :
<
         DC          COMPTH
         JE          E964XY          < EN EFFET, ELLE NE PEUT VALOIR QUE 0/1...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      REGARDER EN PARTICULIER S'IL N'Y A PAS
<                    EU PRECEDEMMENT UN DEFAUT SECTEUR DANS UNE
<                    TACHE HARDWARE...
<
         STZ         COMPTH          < ET ON REINITIALISE...
E964XY:  EQU         $
<
<
<        E P I L O G U E   D E   T A C H E   H A R D  :
<
         PLR         L
         LR          L,C
                                     < RESTAURATION DE (SLO,SLE) :
         CALL        #SISP CMS5 PLRSLO#
         STZ         ICSAV-PSTH,L
         PLR         L,W             < RESTAURATION L,W,...
         PLR         A,B,X,Y         < ...A,B,X,Y
         ACQ                         < ET DESARMEMENT...
         RSR                         < POUR LA PROCHAINE IT, PROVOQUE ALORS UN
                                     < RETOUR SUR UNE INSTRUCTION 'JMP THXX'...
         PAGE
<
<
<        A T T E N T E   I T   E T   C L E A R   S I T  :
<
<
<        FONCTION :
<                      SUITE A CERTAINS PROBLEMES SUR
<                    L'HORLOGE (CAS OU ELLE SE TROUVE
<                    BLOQUEE SUR UNE ATTENTE DISQUE,...), IL
<                    APPARAIT NECESSAIRE DE CREER CETTE
<                    ROUTINE, QUI MET LE HANDLER
<                    APELANT EN ATTENTE D'INTERRUPTION
<                    SUR SON SEMAPHORE SIT, PUIS LORSQUE
<                    L'IT EST ARRIVEE, RE-INITIALISE SIT. AINSI
<                    SI PLUSIEURS IT SONT MONTEES POUR LE
<                    MEME EVENEMENT, LORS DES ECHANGES
<                    SUIVANTS, ON NE SE DESYNCHRONISERA
<                    PAS...
<
<
<        NOTA :
<                      ON NE PEUT INVERSER L'ATTENTE
<                    DE L'INTERRUPTION ET LE CLEAR DU
<                    BETA(SEMAPHORE), EN EFFET DANS LE
<                    CAS OU DES DEFAUTS IMMEDIATS
<                    APPARAISSENT, L'IT MONTE
<                    AVANT QU'ON NE SE METTE EN ATTENTE  !!!!
<
<
<        A T T E N T I O N  :
<                      POUR BIEN FAIRE, IL FAUDRAIT
<                    QUE LA REMISE A 0 DU BETA(SIT) SOIT
<                    PROTEGE DES DEFAUTS SECTEUR, CE QUI
<                    EST EVIDEMMENT IMPOSSIBLE. EN
<                    CONSEQUENCES, IL SE PEUT QUE
<                    'CSWIT' ET 'THDS' INTERFERENT DANGEREU-
<                    SEMENT LORS DE DEFAUTS SECTEUR
<                    MALENCONTREUX...
<
<
<        ARGUMENT :
<                    (L)=ADRESSE DCT(HANDLER).
<
<
         USE         L,DCT0
CSWIT:   EQU         $
         RQST        SIT             < A T T E N T E   I N T E R R U P T I O N.
<
<        I N T E R R U P T I O N   A P P A R U E  :
<
         STZ         SIT             < RAZ DU SIT
         RSR                         < RETOUR A L'APPELANT LORSQUE
                                     < LA REINITIALISATION EST FAITE.
         PAGE
<
<
<        R E V E I L   D ' U N   H A N D L E R   :
<
<
<        ARGUMENT :
<                    - (L)=ADRESSE DCT(HANDLER).
<
<
         USE         L,DCT0
REVHDL:  EQU         $
         PSR         A
<
< VALIDATION DU 'SIT' :
<
         BSR         ABETA2          < RENVOIE : (A)=BETA(SIT).
         CPI         MAXBET          < TEST SUR LE NBRE D'IT MONTEES
                                     < SUR CE SEMAPHORE ET NON ENCORE
                                     < TRAITEES.
         JL          E885            < ACCEPTABLE...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
                                     < ON SAIT LES RISQUES ENCOURUS
                                     < LORSQUE CE TEST N'EST PAS FAIT :
                                     < LE SEMAPHORE RISQUE DE REDEVENIR
                                     < NEGATIF EN PASSANT AU DELA
                                     < DE '7F, ET LA MICRO-MACHINE
                                     < SE MET A RAZER TOUS LES BITS
                                     < A 1 QUI SUIVENT LE BETA (...).
<
<        QUE FAIRE ???
<                      ALLER MODIFIER EN GENERAL LE
<                    'BETA' DU SEMAPHORE, OU BIEN
<                    FAIRE UN 'JMP E885X'...
<
         IF          XXSIT0-K,,XEIF%,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         STZ         SIT             < ON REINITIALISE LE 'SIT'...
E885:    EQU         $
<
< REVEIL DU HANDLER :
<
         LAD         SIT
         BSR         ARLSE           < REVEIL DU HANDLER QUI DORT SUR 'SIT'...
<
< ET RETOUR :
<
         PLR         A
         RSR
         PAGE
<
<
<        S U P E R - I D L E  :
<
<
<        FONCTION :
<                      CETTE TACHE REMPLACE JUSTE APRES LE
<                    'SYSINI' LA TACHE 'INI' ; CECI AVEC
<                    DEUX CONSEQUENCES :
<                    1 - LA DCT QUI EST RELAYEE PAR 'NSPINI'
<                    (='NSPIDS') EXISTE DE NOUVEAU, ET ON NE
<                    RISQUE PAS DE PARTIR DANS LE DECORS...
<                    2 - SI PAR UN MALHEUREUX HASARD, 'IDLE'
<                    SE TROUVAIT BLOQUEE, ON LE DETECTERAIT...
<
<
         CALL        #SISP CMS5 CHECK#
<
<
<        ' D C T '   D E   L A   S U P E R - I D L E  :
<
<
         CALL        #SISP CMS5 DOL1#
DCTIDS:  EQU         $
PSTIDS:  WORD        K;K;K;K;COM+DEPCS;NIL;NIL;PILIDS;IDLSUP;SMST;SO;SE
       #@ASCI        " IDS"          < #SISP CMS5 ASCI#
<
<
<        P I L E   D E   L A   S U P E R - I D L E  :
<
<
         CALL        #SISP CMS5 DOL2#
PILIDS:  EQU         $-DEPILE
XWPILE:  VAL         8               < INCREMENT DE LA PILE...
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
<
<
<        S U P E R - I D L E  :
<
<
         USE         L,DCT0
IDLSUP:  EQU         $
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
         ACQ                         < POUR FORCER UN PASSAGE AU MICRO
                                     < SCEDULER, ET UN DEMASQUAGE DE 'IOM'
                                     < ET 'IPM'...
         JMP         IDLSUP          < FACILE ?!??!!
         PAGE
<
<
<        T A C H E   D ' I D L E   D E   B A C K G R O U N D  :
<
<
<        FONCTION :
<                      CETTE TACHE EST LA MOINS PRIORITAIRE DU SYSTEME ;
<                    ELLE EST DESTINE A PRENDRE LE CONTROLE DE LA
<                    MACHINE LORSQUE TOUTES LES AUTRE TACHES SONT EN
<                    ATTENTE. COMME ON PEUT ESPERE QU'ELLES SONT EN
<                    ATTENTE D'INTERRUPTION (SINON ELLES SONT EN
<                    INTER-BLOCAGE), ON FAIT UN HALT QUI FAVORISE ENTRE
<                    AUTRE LES E/S DISQUES-ADM.
<
<
         CALL        #SISP CMS5 CHECK#
<
<
<        ' D C T '   D E   L ' I D L E  :
<
<
         CALL        #SISP CMS5 DOL1#
DCTIDL:  EQU         $
PSTIDL:  WORD        DCTIDS;K;NSPINI;K;COM+DEPCS;NIL;XXIDLE;PILIDL;IDLINI;SMST
         WORD        MEMTV0;MEMTVE-Z < (SLO,SLE) ENCADRE 'MEMTV' POUR 'SVCM3'.
       #@ASCI        " IDL"          < #SISP CMS5 ASCI#
<
< BALAYAGE PERIODIQUE DE LA MEMOIRE :
< (POUR EVITER DES PARITES ULTERIEURES)
<
BALAIS:  WORD        ZERO            < ADRESSE COURANTE...
<
< MOT PERMETTANT DES TESTER
< LE PROCESSEUR MAITRE EN
< PERMANENCE :
<
WTEST:   FLOAT       DADR     < CONVERTIE EN 'DADR'-MOTS...
XWOR%2:  VAL         -DADR
         IF          XWOR%1>XWOR%2-TBMEMQ,,XEIF%,
         IF          ATTENTION : C'EST PLUS SIMPLE SI LA LONGUEUR
         IF          EST UN MULTIPLE DE 'DADR' !!!
XEIF%:   VAL         ENDIF
BMEMQ:   EQU         $               < BUFFER DE COPIE...
         DZS         TBMEMQ
         CALL        #SISP CMS5 CHECK#
         PAGE
         USE         L,DCT0
<
<
<        I N I T I A L I S A T I O N   D U   S Y S T E M E  :
<
<
IDLINI:  EQU         $
         STA         &ADCTSY         < 'DCTIDS' REMPLACE 'DCTINI'
                                     < DANS LA TABLE DES DCTSY ; EN
                                     < EFFET L'ESPACE MEMOIRE OCCUPE PAR
                                     < LE 'SYSINI' A ETE RECUPERE PAR
                                     < L'ALLOCATION MEMOIRE, ET IL
                                     < SERAIT FORT FACHEUX QUE L'ON Y
                                     < RETOURNE (MEME PAR ERREUR) !!!
         IF          NSPINI-NSPIDS,,XEIF%,
         IF          ATTENTION : IL FAUT : NSPINI=NSPIDS !!!
XEIF%:   VAL         ENDIF
<
< PREPARATION DU DETECTEUR SECONDAIRE
< DE TIME-OUT :
<
XXIDL1:: VAL         16              < NOMBRE ARBITRAIRE DE BOUCLE D'IDLE
                                     < AVANT DE TESTER LES TIME-OUT SECON-
                                     < DAIRES...
         LRM         B
TOIDLE:  WORD        XXIDL1          < (B)=DECOMPTEUR DES BOUCLES D'IDLE.
         LR          B,Y             < (Y)=POUR REINITIALISER 'B'...
         LA          HTIME+D         < (A)=HEURE MEMORISEE TOUS LES 'XXIDL1'
                                     <     TOURS D'IDLE...
         PSR         A,B,Y           < LA PILE MEMORISE 'A', 'B' ET 'Y'...
<
<
<        B O U C L E   D ' I D L E  :
<
<
IDLE:    EQU         $
         ARM         NSNSP0+NSPIDS   < EN FAIT INUTILE, MAIS ON NE SAIT
                                     < JAMAIS !!!
         BSR         ASMIT           < TEST DES INTERRUPTIONS ???
         JAE         IDLSY1          < OK, NON MASQUEES...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      NE SERAIT-CE PAS LA SUITE D'UN MASQUAGE
<                    AU PUPITRE DES INTERRUPTIONS DANS LA TACHE
<                    'IDLE' PRECISEMENT ???
<
         ACQ                         < PUIS, ON DEMASQUE...
IDLSY1:  EQU         $
<
< A PRIORI, MISE A JOUR PERMANENTE
< DU BOOTSTRAP 'DKM' :
<
         LRM         A,B,X
         WORD        TVDKMQ          < (A)=ADRESSE DE LA TABLE DE VIRTUALISATION
                                     <     DE 'DKM',
         WORD        TVDKMR          < (B)=ADRESSE DE LA TABLE DE VIRTUALISATION
                                     <     DU BOOTSTRAP 'DKM',
         NTRN
         WORD        GAXCYL+NOCMO-E/NOCMO
         TRN
                                     < (X)=LONGUEUR EN MOTS...
         MOVE                        < ET ON MET A JOUR, DES FOIS QUE...
<
< DETECTEUR SECONDAIRE DE TIME-OUT : CELUI-CI
< EST UTILISE LORSQUE PAR MALHEUR L'HORLOGE
< EST BLOQUEE : CELA PEUT ARRIVER, PAR EXEMPLE
< LORSQUE L'HORLOGE ADRESSE 'DKF' OU 'DKM',
< ET QUE CELUI-CI EST EN TIME-OUT : IL Y A
< INTER-BLOCAGE...
<
         PLR         A,B,Y           < RESTAURE LES PARAMETRES...
         ADRI        -I,B            < DECOMPTAGE DES TOURS...
         CPZR        B               < FIN DES 'XXIDL1' TOURS ???
         JNE         IDLE1           < NON, ON ATTEND...
         LR          Y,B             < OUI, ON REINITIALISE LE DECOMPTEUR.
         CP          HTIME+D         < L'HEURE A-T'ELLE EVOLUE ???
         LA          HTIME+D         < A PRIORI, (A)=HEURE COURANTE...
         JNE         IDLE1           < OUI, PAS DE TIME-OUT SUR L'HORLOGE...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      VERIFIER QUE C'EST BIEN UN INTERBLOCAGE !!!
<
         PSR         A,L
         LXI         NSPHOR          < (X)='NSP' DE L'HORLOGE,
         BSR         ACADCT          < (A)=L=ADRESSE DCT(HORLOGE).
         BSR         VAR+ASPTO       < DETECTION ET TRAITEMENT DES TIME-OUT...
         PLR         A,L
IDLE1:   EQU         $
         PSR         A,B,Y           < SAVE LES PARAMETRES 'A', 'B' ET 'Y'...
<
<
<        T R A C E   D U   S Y S T E M E  :
<
<
         LXI         K               < POUR FAIRE UN 'HALT' MAXIMUM...
IDLE2:   EQU         $
         LR          W,L             < (L)=-1 POUR AFFICHAGE PUPITRE
                                     <     DANS 'TRACE' A PRIORI...
         LA          &ASAESC
         BSR         ABETA           < RENVOIE : (A)=BETA(SAESC)=NOMBRE DE 'DCT-
                                     < ESCLAVE' LIBRES...
         CPI         NESCLA          < Y-A-T'IL DES ESCLAVES CONNECTES ???
         JL          IDLEUS          < OUI, AU MOINS 1...
<
<
<        I D L E  :  P L U S   D ' U T I L I S A T E U R  :
<
<
<
< AUTORISATION DE LA COPY :
<
         LA          ETASYS
         RBT         OTOCOP          < A PRIORI...
         STA         ETASYS
<
< AUTORISATION DE LA TRACE :
<
         LA          SAVEX
         RBT         XBTROF          < A PRIORI...
         STA         SAVEX
<
< LORSQU'IL N'Y A PLUS PERSONNE
< DE CONNECTE, ON SE PLACE DANS
< UN MODE NON DANGEREUX ('DKU'
< NE DOIT PLUS SE SYNCHRONISER
< SUR LE SECTEUR 0 DE CHAQUE
< PISTE) :
<
         LRM         A,B
         WORD        IDLEBC          < (A)=ADRESSE DE RETOUR DE 'PS0OFF',
         WORD        PS0OF3          < (B)=ADRESSE DU SOUS-PROGRAMME DE MISE
                                     <     DE LA SYNCHRONISATION SUR LE
                                     <     SECTEUR 0 'OFF'.
         PSR         A,B             < EMPILEMENT DE L'ADRESSE DE RETOUR POUR
                                     < SIMULER UN 'BSR', ET DE L'ADRESSE DU
                                     < SOUS-PROGRAMME,
         RSR                         < VERS LEQUEL ON VA EN METTANT (B) DANS
                                     < 'P' PAR UN 'PSR'/'RSR'...
IDLEBC:  EQU         $               < ADRESSE DE RETOUR...
<
< LORSQU'IL N'Y A PLUS PERSONNE,
< ON REMET 'DKU' EN MODE 'FAST' :
<
         LRM         A,B
         WORD        IDLEBB          < (A)=ADRESSE DE RETOUR DE 'PFAST',
         WORD        PFAST3          < (B)=ADRESSE DU SOUS-PROGRAMME DE MISE
                                     <     EN MODE 'FAST' DE 'DKU'.
         PSR         A,B             < EMPILEMENT DE L'ADRESSE DE RETOUR POUR
                                     < SIMULER UN 'BSR', ET DE L'ADRESSE DU
                                     < SOUS-PROGRAMME,
         RSR                         < VERS LEQUEL ON VA EN METTANT (B) DANS
                                     < 'P' PAR UN 'PSR'/'RSR'...
IDLEBB:  EQU         $               < ADRESSE DE RETOUR...
<
< CAS OU IL N'Y A PLUS PERSONNE
< DE CONNECTE : ACTIVONS LA
< COMPRESSION 'SGN' A PRIORI :
<
         LRM         A,B
         WORD        IDLEBA          < (A)=ADRESSE DE RETOUR DE 'PSGNON',
         WORD        PSGNON          < (B)=ADRESSE DU SOUS-PROGRAMME D'ACTIVA-
                                     <     TION DE LA COMPRESSION.
         PSR         A,B             < EMPILEMENT DE L'ADRESSE DE RETOUR (SIMU-
                                     < LANT UN 'BSR'), ET DE L'ADRESSE DU SOUS-
                                     < PROGRAMME,
         RSR                         < POUR SE BRANCHER A 'PSGNON'...
IDLEBA:  EQU         $               < ADRESSE DE RETOUR...
<
< TEST DES FICHIERS ENCORE OUVERTS :
<
XWOR%1:  VAL         COSBT?XBITF1=FMASK(K=FCINST>NBITEF
XWOR%1:  VAL         COSBT?XBITF1=FMASK(K?XWOR%1=FCINST
         LAI         XWOR%1          < AFIN DE COMPTER LE NOMBRE DE FICHIERS
         SBT         XXBKFE          < A L'ETAT "OPEN"...
         BSR         ALOOKF          < (A)=NOMBRE DE FICHIERS OUVERTS OU
                                     <     BIEN EN ATTENTE DE DELETE...
         JANE        IDLEUS          < ENCORE AU MOINS OUVERT, OU EN ATTENTE
                                     < DE DELETE, ON ATTEND DONC...
         PSR         X,L
         LXI         NSPHOR          < NON, PERSONNE...
         BSR         ACADCT          < (L)=ADRESSE DCT(HORLOGE),
         LA          VAR+PATCOP      < (A)=PATTERN CYCLIQUE DES COPIES,
         PLR         X,L
         LR          A,L             < (L)=PATTERN DES COPIES S'IL N'Y A
                                     <     PAS D'UTILISATEURS CONNECTES...
<
<
<        T E S T   D U   F O N C T I O N N E M E N T  :
<
<
IDLEUS:  EQU         $
         CALL        #SISP CMS5 RST#
         TBT         MAINT           < LE BIT 'MAINT' EST-IL PRESENT ???
         LA          MEMV            < AFIN DE TRACER 'MEMV'...
                                     < (ON NE SAIT JAMAIS...)
         JC          IDLEXY          < OUI, ON VA L'INDIQUER AU PUPITRE...
         TBT         MEMXXX          < TOUT EST-IL AUTORISE ???
         JC          IDLEXY          < OUI, ON LE SIGNALE AU PUPITRE...
         PSR         A,W             < NON, ALORS :
         LRM         A,W
         LAI         XXCPR           < (A)=INSTRUCTION VARIABLE D'AUTORISA-
                                     <     TION/INHIBITION DE LA COMPRESSION,
         WORD        DCOMPR          < (W)=SON ADRESSE...
         CP          O,W             < ALORS LE 'STN' DU 'SGN' PEUT-IL FAIRE
                                     < DE LA COMPRESSION ???
         PLR         A,W             < RESTAURE : (A)='MEMV' POUR TRACE...
         JE          IDLEXX          < OUI, 'L' RESTE TEL QUEL...
<
< CAS DES FONCTIONNEMENTS DANGEREUX
< DU FABULEUX SYSTEME 'CMS5' :
<
IDLEXY:  EQU         $
         LBI         MOCD            < OUI, ON L'INDIQUE AU PUPITRE EN
                                     < INVERSANT L'OCTET DROIT !!!
         EORR        B,L             < ON INVERSE PARTIELLEMENT LE PUPITRE
                                     < DANS 2 CAS :
                                     < 1 - BIT 'MAINT' DE 'ST' PRESENT,
                                     < 2 - BIT 'MEMXXX' DE 'MEMV' PRESENT,
                                     < 3 - PAS DE COMPRESSION DES ITEMS AU
                                     <     NIVEAU 'STN' DU 'SGN'.
IDLEXX:  EQU         $
         BSR         ATRACE          < TRACE, ET AFFICHAGE AU PUPITRE DE
                                     < 'XXIDLE' SI AU MOINS UN UTILISATEUR
                                     < EST CONNECTE, ET DE LA PATTERN PERIODI-
                                     < QUE DES COPIES ; ANSI, ON PEUT SAVOIR
                                     < EN REGARDANT LE PUPITRE S'IL EST
                                     < POSSIBLE DE RECHARGER LE SYSTEME,
                                     < C'EST-A-DIRE, S'IL N'Y A PAS D'UTILI-
                                     < SATEURS CONNECTES, ET SI SURTOUT,  LE
                                     < LE SYSTEME A FAIT AU MOINS LES 2
                                     < DERNIERES COPIES  EN BASCULE...
<
<
<        A T T E N T E  :
<
<
         HALT                        < ATTENTE MOMENTANEE DES INTERRUPTIONS...
<
<
<        T R A I T E M E N T   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 '  :
<
<
BLOCK2:  EQU         $               < ADRESSE DE BLOCAGE LORS DE LA RELANCE
                                     < SUITE A UN DEFAUT SECTEUR NON PRIS EN
                                     < COMPTE...
         PSR         X,Y,W
         SVC         SVCM9           < VERS LA SYNCHRONISATION SUR LES VALEURS
                                     < POSITIVES DE 'CDAG0'...
<
<
<        B A L A Y A G E   P E R I O D I Q U E
<        D E   L A   M E M O I R E  :
<
<
         LRM         W
         WORD        BALAIS          < (W)=ADRESSE DE L'ADRESSE COURANTE DANS LA
                                     <     MEMOIRE LORSQU'ON LA BALAYE...
         LA          O,W             < (A)=ADRESSE DU MOT COURANT,
         IC          O,W             < QUE L'ON FAIT PROGRESSER...
         LR          A,W             < (W)=ADRESSE DU MOT COURANT :
         LA          O,W             < ACCES AU MOT COURANT (ON NE FAIT QUE LE
                                     < LIRE, BIEN SUR ; S'IL Y A UNE PARITE ON
                                     < FERA AINSI UNE ALARME SANS TROP DE
                                     < RISQUES...).
         NLS
GABUZO:  EQU         $
         NOP
         LST
<
<
<        T E S T   P E R I O D I Q U E   D U   P R O C E S S E U R
<                    M A I T R E  :
<
<
         JMP         TESTPM          < LE MODULE CORRESPONDANT NE PEUT ETRE
                                     < IMPLANTE ICI POUR DES RAISONS BIEN
                                     < CONNUES...
                                     < A NOTER :
                                     < (A)=BALAIS COURANT...
TESTRT:  EQU         $               < RETOUR DU TEST DU PROCESSEUR...
<
<
<        S I M U L A T I O N   D ' U N   S Y S T E M E
<        D E   T E L E V I S I O N   N U M E R I Q U E
<        A C C E D A N T   A   T O U T E   L A
<        M E M O I R E   D U   S Y S T E M E  :
<
<
         SVC         SVCM3           < APPEL DU 'SVC' MAITRE ADEQUAT...
                                     < ((SLO,SLE) ENCADRE 'MEMTV'...)
         PLR         X,Y,W
         CPZR        X               < FIN DU 'HALT' ???
         JNE         IDLE2           < NON, ON REBOUCLE, AFIN DE MODERER LE
                                     < RYTHME DES TESTS SECONDAIRES DE
                                     < TIME OUT...
<
<
<        A C T I O N   S U R   L A   R E G U L A T I O N
<        D U   S W A P P I N G   E S C L A V E  :
<
<
         STZ         SOCYCL          < RAZ DE LA LISTE CYCLIQUE DES
                                     < ESCLAVES A SWAPPER OUT A PRIORI ;
                                     < ON CREE AINSI UNE BOUCLE DE
                                     < REGULATION AVEC LE SWAPPER
                                     < OUT : SI LE TAUX DE SWAPPING
                                     < OUT AUGMENTE (ET DONC AUSSI
                                     < LE SWAPPING IN), LE NBRE
                                     < D'E/S DISQUES AUGMENTE, ET
                                     < DONC CERTAINEMENT AUSSI LE
                                     < NBRE DE PASSAGE EN IDLE ; EN
                                     < IDLE, RAZANT 'SOCYCL' , ON
                                     < DIMINUE LE TAUX DE SWAPPING
                                     < OUT, ET DONC LE NBRE D'E/S
                                     < DISQUES, ET DONC LE NBRE DE
                                     < PASSAGE EN IDLE, ET DONC
                                     < SOCYCL REDEVIENT NON NUL,...
                                     < (ET ON RESWAPPE OUT...)
<
<
<        T E S T   D E   T R A S H I N G   D U   S Y S T E M E  :
<
<
         LXI         NSPDKF          < (X)=NSP DISQUE DE SWAPPING
         BSR         ACADCT          < (L)=@DCT DU DISQUE DE SWAPPING.
         BSR         APBS            < TEST DE LA FILE D'ATTENTE
                                     < SUR LE DISQUE DE SWAPPING.
         JLE         IDLE            < OK,LA FILE D'ATTENTE EST
                                     < ACCEPTABLESUR LE DISQUE
                                     < DE SWAPPING
<
< CAS OU IL Y A TROP DE MONDE
< SUR LE DISQUE DE SWAPPING :
<
         LXI         NSPSCH
         BSR         ACADCT          < (L)=@DCT-SCH.
         BSR         APBS            < TEST DE LA FILE D'ATTENTE SUR
                                     < LE SCHEDULER.
         LA          &FREQI          < (A)=FREQUENCE COURANTE DE L'HORLOGE.
         JGE         IDLE            < TOUT PARAIT OK, POUR LE MOMENT.
<
<
<        T R A S H I N G   A P P A R E N T  :
<
<
<        DANS LE CAS SUIVANT :
<
<                      'BETA(DKS) GRAND' & 'BETA(SCHEDULER) PETIT',
<                    IL Y A INSTABILITE DU SYSTEME. LA SOLUTION EST DE TENTER
<                    DE STABILISER LE SYSTEME EN JOUANT SUR LA FREQUENCE
<                    DE L'HORLOGE.RAPPELONS QUE L'ON DISPOSE DE
<                    4 FREQUENCES UTILISABLES:
<                    F1:BIT6     1     SECONDE   ('03E8 MILLISECONDES)
<                    F2:BIT7     0,5   SECONDE   ('01F4 MILLISECONDES)
<                    F3:BIT8     0,200 SECONDE   ('00C8 MILLISECONDES)
<                    F4:BIT9     0,100 SECONDE   ('0064 MILLISECONDES)
<
<                      ON REMARQUERA HABILEMENT QUE 200 MS LAISSENT LE TEMPS
<                    (LE NUMERO DE BIT INDIQUE LE NUMERO DU 1ER BIT
<                    A 1 DANS LA VALEUR DE CES FREQUENCES, ET TESTE PAR
<                    LE HANDLER HORLOGE). EXPERIMENTALEMENT, ON CONSTATE
<                    LES FAITS SUIVANTS (SUBJECTIFS...) :
<                                    SI LA FREQUENCE EST 'PETITE', IL FAUT
<                                    L'AUGMENTER,
<                                    SI LA 'FREQUENCE' EST GRANDE, IL VAUT MIEUX
<                                    LA DIMINUER.
<
<
<        ON A ICI :
<                    (A)=FREQUENCE COURANTE.
<
<
         DBT                         < EVALUATION DE LA FREQUENCE
                                     < COURANTE DE L'HORLOGE.
XWOR%8:  VAL         CODBT=FMASK(K?XH200=FCINST)XH200
         ADRI        -XWOR%8,X       < FORMONS :
                                     < FREQUENCE - F3 DE FACON A
                                     < CALCULER UN INCREMENT/DECREMENT
                                     < A LA FREQUENCE COURANTE:
                                     < SI F=F1 DELTA(F)= -2
                                     < SI F=F2 DELTA(F)= -1
                                     < SI F=F3 DELTA(F)= 0
                                     < SI F=F4 DELTA(F)= 1
                                     < (X)=DELTA(F)...
         ADR         X,A             < INCREMENTATION/DECREMENTATION
                                     < DE LA FREQUENCE COURANTE.
         STA         &FREQI          < MAJ DE LA FREQUENCE COURANTE,
                                     < AFIN QUE HDLHOR LA MODIFIE.
         JMP         IDLE            < ET ON BOUCLE SUR L'IDLE...
<
<
<        REMARQUE IMPORTANTE :
<                      ON NE TESTE PAS LES FILES D'ATTENTE SUR
<                    L'AUTRE DISQUE.EN EFFET,LA LONGUEUR DE CELLE-CI
<                    DEPEND DE L'ACTIVITE
<                    DES ESCLAVES ; MAIS CETTE ACTIVITE
<                    DEPEND DE LEUR REACTIVATION (...),
<                    QUI ELLE-MEME DEPEND DES FINS DE SERVICE,
<                    ET DONC ENTRE AUTRE DES FINS D'E/S
<                    DISQUE.
<                      IL EXISTE DONC AINSI DANS LE SYSTEME
<                    UNE BOUCLE D'AUTO-REGULATION...
<
<
<        AUTRE REMARQUE:
<                    ON REMARQUERA HABILEMENT QUE TOUTES LES
<                    FREQUENCES F1 A F4 SONT UTILISABLES,PUISQUE
<                    LA PLUS GRANDE F4 (PERIODE =100MS)LAISSE LE
<                    TEMPS DE FAIRE UN ECHANGE DISQUE MEME AMOVIBLE
<
<
         PAGE
<
<
<        T E S T   P E R I O D I Q U E   D U   P R O C E S S E U R
<                    M A I T R E  :
<
<
<        FONCTION :
<                      CE MODULE TOURNE DONC PENDANT
<                    L'IDLE ; IL PART D'UN NOMBRE
<                    "PSEUDO-ALEATOIRE" (L'HEURE DANS
<                    LE JOUR EXPRIMEE EN SECONDES
<                    .EOR. LE BALAIS COURANT, ET
<                    TRONQUEE, AFIN D'EVITER DES DEBOR-
<                    DEMENTS) ; ENSUITE, IL EFFECTUE
<                    DESSUS UNE SUITE D'OPERATIONS
<                    ARITHMETIQUES ET LOGIQUES, PUIS
<                    LA SEQUENCE INVERSE ; ENFIN, IL
<                    VERIFIE QU'IL RETOMBE BIEN SUR
<                    SES PIEDS.
<                      AINSI, SI LES OPERATEURS CABLES
<                    ET MICRO-PROGRAMMES ONT DES PRO-
<                    BLEMES DELICATS ET ALEATOIRES, ON
<                    PEUT ESPERER LES PIEGER ICI...
<
<
KTEST0:: VAL         '10             < POUR EVITER LES PASSAGES PAR 0...
KTEST1:: VAL         '53             < CONSTANTE ARBITRAIRE POUR TESTER LES
                                     < ADDITIONS IMMEDIATES...
KTEST2:: VAL         'D6             < CONSTANTE ARBITRAIRE POUR TESTER LES
                                     < OPERATIONS LOGIQUES IMMEDIATES...
KTEST3:: VAL         NBITMO/XXXMOY   < NUMERO D'UN BIT PRESQUE ARBITRAIRE DANS
                                     < UN MOT...
KTEST4:: VAL         -'47            < POUR TESTER QUE LES INSTRUCTIONS FLOT-
                                     < TANTES NE SONT PAS PRISES POUR DES
                                     < INSTRUCTIONS 'SVC' D'EXTENSION...
<
< POINT D'ENTREE :
<
TESTPM:  EQU         $
         LRM         W
         WORD        WTEST           < (W) VA BASER LA VARIABLE ALEATOIRE...
<
< INITIALISATION DU PROCESSUS
< DE TEST ENTIERS/LOGIQUES :
<
         EOR         HTIMED          < (A)=HEURE DU JOUR TRONQUEE EN SECONDES,
                                     <     .EOR. LE BALAIS COURANT (CONTENU
                                     <     DANS LE 'A' INCIDENT.
         RBT         BITSIG          < ET CECI AFIN D'EVITER DES OVERFLOWS
         RBT         BITSIG+BIT      < LORS DES OPERATIONS ARITHMETIQUES...
         JANE        TEST01          < OK, NON NUL...
         LAI         KTEST0          < POUR EVITER LES PASSAGES PAR 0...
                                     < (ET SURTOUT LES DIVISIONS PAR 0)
TEST01:  EQU         $
         JAG         TEST04          < OK, LE NOMBRE ALEATOIRE EST CORRECT...
         BSR         ASYSER          < E R R E U R   M A C H I N E ...
<
<        QUE FAIRE :
<                      EXAMINER LE COMPORTEMENT DE
<                    L'OPERATEUR LOGIQUE !!!
<
TEST04:  EQU         $
         LR          A,Y             < (Y)=NOMBRE ALEATOIRE COURANT,
         STA         O,W             < QUE L'ON MET AUSSI DANS 'WTEST', AFIN
                                     < DE TESTER ET LES OPERATIONS REGISTRE
                                     < A REGISTRE, ET REGISTRE A MEMOIRE...
<
< SERIE DE TRANSFORMATIONS ENTIERES/LOGIQUES :
<
         SCRS        NBITMO          < OPERATION THEORIQUEMENT NEUTRE...
         IBT         KTEST3          < POUR TESTER LES OPERATIONS SUR BITS...
         EORI        KTEST2          < POUR TESTER LES OPERATIONS LOGIQUES...
         ADR         Y,A             < POUR TESTER LES ADDITIONS REGISTRE
                                     < A REGISTRE,
         AD          O,W             < ET MEMOIRE A REGISTRE...
         ADRI        KTEST1,A        < POUR TESTER LES ADDITIONS IMMEDIATES...
         SCY                         < ON FORCE LE 'CARRY',
         ADCR        A               < ET ON L'AJOUTE A (A)...
         MP          O,W             < POUR TESTER LA MULTIPLICATION...
<
< SERIE INVERSE ENTIERES/LOGIQUES :
<
         DV          O,W             < POUR TESTER LA DIVISION,
         JNCV        TEST05          < OK, ELLE S'EST BIEN PASSEE...
         BSR         ASYSER          < E R R E U R   M A C H I N E ...
<
<        QUE FAIRE ???
<                      VERIFIER LES ARGUMENTS DE
<                    LA DIVISION AVANT D'ACCUSER
<                    LA MACHINE...
<
TEST05:  EQU         $
         SCY
         SBCR        A
         ADRI        -KTEST1,A
         SB          O,W
         SBR         Y,A
         EORI        KTEST2
         IBT         KTEST3
         SCLS        NBITMO
<
< VERIFICATION DES RESULTATS :
<
         CP          O,W             < EST-ON RETOMBE SUR SES PIEDS ???
         JE          TEST02          < OUI...
         BSR         ASYSER          < E R R E U R   M A C H I N E ...
<
<        QUE FAIRE ???
<                      VERIFIER LE CODE D'AUTO-TEST
<                    PRECEDENT AVANT DE TELEPHONER
<                    A LA MAINTENANCE !!!
<
TEST02:  EQU         $
         EORR        Y,A             < (A) ET (Y) DOIVENT ETRE IDENTIQUES, LE
                                     < RESULTAT DE CETTE OPERATION DOIT DONC
                                     < ETRE NUL..
         ORR         B,A             < DE PLUS LA DIVISION PRECEDENTE A DU
                                     < TOMBER JUSTE, DONC LE 'A' FINAL DOIT
                                     < ETRE STRICTEMENT NUL...
         JAE         TEST03          < ET OUI, TOUT EST BON...
         BSR         ASYSER          < E R R E U R   M A C H I N E ...
<
<        QUE FAIRE ???
<                      MEME REMARQUE !!!
<
TEST03:  EQU         $
<
< INITIALISATION DU PROCESSUS FLOTTANT :
<
         PSR         C               < ET OUI, MALHEUREUSEMENT, A CAUSE DU
                                     < BLOC FLOTTANT, IL EST PLUS PRUDENT
                                     < DE CHANGER DE BASE 'C'...
         LRM         C
         WORD        CTESTC+DEPCS    < ON PREND COMME COMMON, UN MOT BIDON...
                                     < A T T E N T I O N  : IL N'EST PLUS
                                     < POSSIBLE DE FAIRE DE 'SYSER' JUSQU'A
                                     < LA RESTAURATION DE 'C' !!!
         STZ         CTESTC-CTESTC-DEPCS,C
                                     < ET ON LE CLEAR AVANT TOUTE OPERATION
                                     < FLOTTANTE, AFIN DE POUVOIR LE TESTER A
                                     < LA FIN...
         LXI         KTEST4          < ON INITIALISE 'X' AFIN DE VERIFIER QUE
                                     < LES INSTRUCTIONS FLOTTANTES SUIVANTES
                                     < NE SONT PAS, SUITE A UN DEFAUT HARD,
                                     < CONSIDEREES COMME DES 'SVC' EXTENSION...
         LR          Y,A             < (A)=(Y)=NOMBRE ALEATOIRE,
         FLT                         < QUE L'ON FLOTTE,
         FST         O,W             < ET RANGE EN MEMOIRE...
<
< SERIE DE TRANSFORMATIONS FLOTTANTES :
<
         FNEG
         FAD         O,W
         FMP         O,W
<
< SERIE INVERSE FLOTTANTE :
<
         FDV         O,W
         FSB         O,W
         FNEG
<
< VERIFICATIONS DES RESULTATS :
< (NOTA : ON NE PEUT FAIRE LE
< 'FCAM O,W', CAR EN EFFET, EN
< CAS DE TEST NEGATIF, IL FAU-
< DRAIT FAIRE UNE 'SYSER', OR
< LA BASE 'C' EST MAUVAISE, ET
< CELA ALLOURDIRAIT LA PROGRAM-
< MATION ; DE PLUS, ON FAIT PLUS
< LOIN UN 'CPR A,Y'...)
<
         FIX
         CPZ         CTESTC-CTESTC-DEPCS,C
                                     < ALORS, COMMENT SE SONT PASSEES TOUTES
                                     < LES OPERATIONS FLOTTANTES PRECEDENTES ;
                                     < ON NOTERA POUR 'CTESTC' :
                                     < BIT0 : 'UNDERFLOW',
                                     < BIT1 : 'OVERFLOW',
                                     < BIT2 : DIVISION PAR 0,
                                     < BIT3 : 'FIX' IMPOSSIBLE...
         PLR         C               < ET RESTAURATION DE LA BASE 'C' DE 'CMS5'.
         JE          TEST09          < OK, LE RESULTAT N'EST PAS TROP GRAND...
         BSR         ASYSER          < E R R E U R   M A C H I N E ...
<
<        QUE FAIRE ???
<                      MEME REMARQUE !!!
<
TEST09:  EQU         $
         CPR         A,Y             < EST-ON RETOMBE SUR NOS PIEDS ENTIERS ???
         JE          TEST07          < OUI...
         BSR         ASYSER          < E R R E U R   M A C H I N E ...
<
<        QUE FAIRE ???
<                      MEME REMARQUE !!!
<
TEST07:  EQU         $
         LR          X,A
         CPI         KTEST4          < ALORS N'Y A-T'IL PAS EU DE 'SVC'
                                     < D'EXTENSION FLOTTANTE...
         JE          TEST08          < NON...
         BSR         ASYSER          < E R R E U R   M A C H I N E ...
<
<        QUE FAIRE ???
<                      VERIFIER D'ABORD LA PRESENCE
<                    DU BLOC FLOTTANT, ET PUIS COMPREN-
<                    DRE COMMENT LES TESTS PRECEDENTS
<                    PURENT ETRE POSITIFS !!!
<
TEST08:  EQU         $
<
<
<        C O P I E   D ' U N E   Z O N E   Q U E L C O N Q U E
<        D E   L A   M E M O I R E   E N   M E M O I R E   B A S S E  :
<
<
<        FONCTION :
<                      CE MODULE A ETE RAJOUTE
<                    AFIN DE VISUALISER INDIREC-
<                    TEMENT PAR "!ACTIVITE..."
<                    L'ENSEMBLE DE LA MEMOIRE...
<                    LA COPIE EST FAITE TELLE
<                    QUE :
<
<                                    BMEMQ <-- (AMEMQ).
<
<
         CALL        #SISP CMS5 PSRSLO#
         LRM         A
AMEMQ:   WORD        O>DADR          < (A)=DADR-ADRESSE DU PREMIER MOT DE LA
                                     <     ZONE DE MEMOIRE QUELCONQUE A VISUA-
                                     <     LISER.
                                     < (A)=FUTUR 'SLO',
         LR          A,B             < AFIN DE CALCULER UN 'SLE' :
         ADRI        TBMEMQ>DADR-Z,B < (B)='SLE' DE FACON QUE (SLO,SLE) ENCADRE
                                     <     EXACTEMENT LA ZONE A COPIER...
         WOE                         < ENCADREMENT DE LA MEMOIRE...
         LRM         A,B,X
         WORD        O               < (A)=ADRESSE DE DEBUT RELATIVE A 'SLO'
                                     <     DE L'EMETTEUR,
         WORD        BMEMQ           < (B)=ADRESSE DU RECEPTEUR,
         WORD        TBMEMQ          < (X)=NOMBRE DE MOTS A DEPLACER...
         MVTM                        < ET COPIE EN MEMOIRE BASSE D'UNE ZONE
                                     < QUELCONQUE DE LA MEMOIRE...
         CALL        #SISP CMS5 PLRSLO#
<
<
<        G E S T I O N   D U   R E G I S T R E   ' I M '  :
<
<
         LRM         W
         WORD        RIMMST          < (W)=ADRESSE DE LA COPIE EN MEMOIRE DEBA-
                                     <     NALISEE DU REGISTRE 'IM' DU PROCES-
                                     <     SEUR MAITRE,
         LA          O,W             < (A)=VALEUR A DONNER A 'IM'...
         XIMR        A               < ET ON MET A JOUR AINSI PERIODIQUEMENT
                                     < LE REGISTRE 'IM', QUI PEUT DONC ETRE
                                     < MODIFIE INTERACTIVEMENT PAR LE 'DEBUG
                                     < ABSOLU', VIA LE MOT 'RIMMST'...
<
<
<        V E R I F I C A T I O N   D E S   C H E C K - S U M S
<        D E S   B L O C S   " R O M " - " R A M "  :
<
<
<        FONCTION :
<                      CE MODULE PERMET DE SIMULER
<                    DES BLOCS DE MEMOIRE "ROM" ;
<                    EN EFFET, ON VERIFIE EN PERMA-
<                    NENCE SI CERTAINES ZONES MEMOIRE
<                    DONT LE CONTENU NE PEUT CHANGER,
<                    NE CHANGE QUAND MEME PAS, ET CECI
<                    PAR 2 CAUSES PRINCIPALES :
<                    1 - LA MALVEILLANCE (AU PUPITRE...),
<                    2 - LES ERREURS DANS LE SYSTEME...
<
<
FRCHEC:: VAL         4               < LOGARITHME EN BASE 2 DE LA FREQUENCE DES
                                     < TESTS "ROM"/"RAM" EXPRIMEE EN UNITE
                                     < 2*65535 MICRO-SECONDES...
         LRM         W
         WORD        BALAIS          < (W)=ADRESSE DU "BALAIS", DONT LA VALEUR
                                     <     EST INCREMENTEE APRES CHAQUE 'HALT',
                                     <     DONC AVEC LA PERIODE ANNONCEE...
         LAI         K               < CLEAR 'A',
         LB          O,W             < (B)=VALEUR COURANTE DU "BALAIS"...
AFRCHK:  SCRD        FRCHEC          < ET ON DIVISE LE "BALAIS" POUR SAVOIR
                                     < S'IL EST DIVISIBLE PAR 2**FRCHEC...
         JANE        CHEK04          < ET BIEN NON, IL N'EST PAS DIVISIBLE,
                                     < DONC ON NE FAIT PAS LE TEST "ROM"/"RAM",
                                     < FAVORISANT AINSI :
                                     < 1 - LA STABILITE DU DISPLAY AU PUPITRE
                                     <     DE L'"IDLE",
                                     < 2 - L'EXECUTION DES COMMANDES DU TYPE
                                     <     "!ACTIVITE R/V/B...".
         LRM         W               < OUI, ALLONS VERIFIER...
         WORD        CHAIN2          < (W)=ADRESSE DE DEBUT DE LA CHAINE
                                     <     DES BLOCS.
<
< PARCOURS DE LA
< CHAINE DES BLOCS :
<
CHEK01:  EQU         $
<
< CALCUL DU CHECK-SUM
< DU BLOC COURANT :
<
         LAI         K               < (A)=CUMUL DE CALCUL DES CHECK-SUMS,
         LB          CHAINA,W        < (B)=ADRESSE DU BLOC PRECEDENT, CE QUI DON
                                     <     LE TEST DE FIN DE CALCUL DU CHECK-
                                     <     SUM DU BLOC COURANT,
         LX          CHAINX,W        < (X)=VALEUR ATTENDUE DU CHECK-SUM.
CHEK02:  EQU         $
         EOR         O,W             < CUMUL DU CHECK-SUM,
         ADRI        -D,W            < PASSAGE AU MOT PRECEDENT,
         CPR         B,W             < S'IL EXISTE ???
         JNE         CHEK02          < OUI...
         CPR         A,X             < NON, ALORS LE CHECK-SUM EST-IL BON ???
         JE          CHEK03          < OUI, OK...
CHEKPA:  BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      IL CONVIENT D'ABORD DE
<                    REPERER LE BLOC EN CAUSE,
<                    ET VERIFIER QU'IL N'Y A
<                    PAS REELLEMENT D'INFORMA-
<                    TIONS VARIABLES OUBLIEES
<                    LORS DE L'IMPLANTATION DES
<                    #SISP CMS5 CHECK# ; SI CE
<                    N'EST PAS LE CAS, ALORS ?!??!
<
CHEK03:  EQU         $
         LA          CHAINA,W        < (A)=ADRESSE DU BLOC "ROM" PRECEDENT, CAR
                                     <     ON SAUTE LE BLOC "RAM"...
         LR          A,W             < AFIN DE L'ACCEDER AU TOUR SUIVANT...
         CP          INFINI          < EST-CE LA FIN DE LA CHAINE DES BLOCS ???
         JNE         CHEK01          < NON, AU BLOC PRECEDENT...
<
< RETOUR A L'IDLE :
<
CHEK04:  EQU         $
         LRM         A
         WORD        TESTRT          < (A)=ADRESSE DE RETOUR DES TESTS...
         PSR         A               < ET ON SIMULE
         RSR                         <              UN 'GOTO''TESTRT'...
         PAGE
<
<
<        G E S T I O N   D E S   R E G I S T R E S   ' H D C '  :
<
<
<        FONCTION :
<                      IL N'Y A PAS MALHEUREUSEMENT AUTANT
<                    DE JEUX DE REGISTRES 'HDC' QU'IL Y
<                    A DE PERIPHERIQUES DE CE TYPE ;
<                    IL FAUT DONC UNE STRATEGIE D'ALLO-
<                    CATION :
<                    1 - ON DISPOSE D'UN POOL MEMORISE
<                    DANS LA PILE 'PILDKX' (PLEINE A
<                    L'INITIALISATION DU SYSTEME) ;
<                    2 - 'DKM' ET 'DKU' FONT DES 'GET'
<                    SUR CE POOL QUAND ILS ONT BESOIN
<                    D'UN JEU, ET DES 'REL' LORSQU'ILS
<                    ONT FINI (A LA SORTIE DES HANDLERS) ;
<                    3 - 'DKF' OBEIT AU MEME PRINCIPE A
<                    LA DIFFERENCE PRES SUIVANTE : A LA
<                    SORTIE DE SON HANDLER, SUIVANT LA
<                    VALEUR DE L'INDICATEUR BRCDKF(ETASYS),
<                    IL PEUT GARDER SON JEU DE REGISTRES
<                    AUSSI LONGTEMPS QUE CET INDICATEUR
<                    L'Y AUTORISE, AINSI 'DKF' SERA MOINS
<                    RALENTI...
<
<
RHDC0::  VAL         K               < NUMERO DU PREMIER JEU.
<
<
<        S E M A P H O R E   D ' A L L O C A T I O N  :
<
<
         CALL        #SISP CMS5 CHECK#
         CALL        #SISP CMS5 DOL1#
SEMDKX:  WORD        NRHDC           < PROTEGE L'ACCES AU 'NRHDC' JEUX...
         DZS         LSEM
SEMDKY:  EQU         SEMDKX          < A CAUSE DE
SEMDKZ:  EQU         SEMDKX          < L'ASSEMBLEUR...
         CALL        #SISP CMS5 DOL2#
<
<
<        P O O L   D E   J E U X   D E   R E G I S T R E S  :
<
<
PILDKX:  BYTE        NRHDC;NRHDC     < LA PILE EST PLEINE A L'INITIALISATION
                                     < DU SYSTEME : TOUS LES REGISTRES SONT
                                     < LIBRES.
XWOR%1:  VAL         CCBCCN=K
         DO          NRHDC
         WORD        RHDC0=FCDO>XWOR%1 < NUMERO D'UN JEU LIBRE POSITIONNE...
<
<
<        C O N S T A N T E S    D I V E R S E S  :
<
<
XXDK4::  VAL         128             < NOMBRE DE TENTATIVES AUTORISEES SUR UN
                                     < ECHANGE EN ERREUR.
         PAGE
<
<
<        D C T   D K F  :
<
<
         CALL        #SISP CMS5 DOL1#
DCTDKF:  EQU         $
PSTDKF:  WORD        K;K;K;K;COM+DEPCS;DCTDKF;NIL;PILDKF;HANDLR;SMST;SO;SE
       #@ASCI        " DKF"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR
         WORD        FILTRS          < S-FILTRE.
         WORD        XXDCTP          < ETALOC=XXDCTP : 'DKF' NON LOUABLE...
         WORD        XXLOC0          < SEMLOC.
         DZS         LSEM
         WORD        NIL             < TETE DE LA FILE D'ATTENTE SUR 'DKF',
         WORD        NIL             < QUEUE DE LA FILE D'ATTENTE SUR 'DKF'.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLDKF          < ROUTINE SPECIFIQUE D'EXECUTION DES
                                     < ENTREES-SORTIES SUR 'DKF'.
         WORD        ITDKF           < ROUTINE SPECIFIQUE DE TRAITEMENT
                                     < DES INTERRUPTIONS SUR 'DKF'.
         WORD        K;K             < ETAT.
         WORD        COSBT?B0SIT=FMASK(K=FCINST < BITSEM.
         WORD        XXDK4;TRYDKF    < NTRIES ET FRTRY.
         WORD        K               < HSTATS.
XWOR%2:  VAL         2
         WORD        XWOR%2*DKCMS4   < TESTO#0 : TIME-OUT A TESTER...
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?FGR=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?FGW=FMASK(K?XWOR%1=FCINST
         WORD        XWOR%1          < LISTE DES FONCTIONS AUTORISEES.
XWOR%1:  VAL         K               < INITIALISATION...
XWOR%1:  VAL         COSBT?FGR=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?FGW=FMASK(K?XWOR%1=FCINST
         WORD        XWOR%1          < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
<        Z O N E   V A R I A B L E  :
<
<
VARDKF:  EQU         $
         IF          VARDKF-DCTDKF-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
< OPERANDES DES 'SIO' :
<
         WORD        ACDKF?FPHCME
SADKF::  VAL         $-D-VARDKF      < SORTIE ADRESSE SECTEUR.
         WORD        ACDKF?FPHSAD
CSDKF::  VAL         $-D-VARDKF      < SORTIE COMPTE DE SECTEURS.
         WORD        ACDKF?FPHCMD
CDDKF::  VAL         $-D-VARDKF      < SORTIE COMMANDE.
         WORD        ACDKF?FPHETA
EADKF::  VAL         $-D-VARDKF      < ENTREE MOT D'ETAT A.
         WORD        ACDKF?FPHETB
EBDKF::  VAL         $-D-VARDKF      < ENTREE MOT D'ETAT B.
         WORD        ACDKF
INIDKF:: VAL         $-D-VARDKF      < POUR INITIALISER LE CCB.
<
< 'CCB' DU DISQUE 'DKF' :
<
         WORD        K
CCDKG0:: VAL         $-D-VARDKF      < POUR INITIALISER 'CCDKF0',
         WORD        K
CCDKG2:: VAL         $-D-VARDKF      < DE MEME POUR 'CCDKF2'...
CCDKF::  VAL         $-VARDKF        < 'CCBDKF' :
         WORD        K
CCDKF0:: VAL         $-D-VARDKF      < MOT 0 DU 'CCB'.
         BYTE        CCBHDC?XSNDKF;K
CCDKF1:: VAL         $-D-VARDKF      < MOT 1 DU 'CCB', DONT LE FORMAT EST :
                                     < BITS 0-1   : MODE 'HDC',
                                     < BITS 2-7   : SOUS-NIVEAU NORMAL,
                                     < BITS 11-15 : NUMERO DU JEU DE REGISTRES
                                     <              'HDC' UTILISE.
         WORD        NIL
CCDKF2:: VAL         $-D-VARDKF      < MOT 2 : ADRESSE-MOT DU BUFFER EN
                                     <         MEMOIRE (POIDS FAIBLES).
         WORD        NILK
CCDKF3:: VAL         $-D-VARDKF      < MOT 3 : LONGUEUR-MOTS DU BUFFER.
         WORD        ACDKF
CCDKF4:: VAL         $-D-VARDKF      < MOT 4 : OPERANDE DE LA 'SIO' D'ECHANGE :
                                     < BITS13-15=000 : LECTURE,
                                     < BITS13-15=001 : ECRITURE.
<
< ACCES AU REGISTRES 'HDC' :
<
XXNHDC:: VAL         K               < ETAT DE NON ALLOCATION DE REGISTRES 'HDC'
         IF          XXNHDC-K,,XEIF%,
         IF          ATTENTION : LES TESTS D'APPROPRIATION DE
         IF          REGISTRES 'HDC' PAR 'CPZ' VONT MERDER !!!
XEIF%:   VAL         ENDIF
         WORD        XXNHDC
XRHDCF:: VAL         $-D-VARDKF      < INDICATEUR DE L'ETAT D'ALLOCATION :
                                     < 0 : 'DKF' N'A PAS DE JEU DE REGISTRES,
                                     < 1 : 'DKF' EN A UN, SOIT PARCEQU'IL
                                     <     EST EN TRAIN DE L'UTILISER, SOIT
                                     <     PARCEQU'IL EST AUTORISE A LE
                                     <     CONSERVER EN PERMANENCE...
<
< INFORMATIONS DE "DIMENSIONNEMENT" :
<
         WORD        NSDKF
NOSDKF:: VAL         $-D-VARDKF      < NOMBRE DE SECTEURS SUR 'DKF'.
<*******************************************************************************
         WORD        '4000
XWOR%1:  VAL         '0000000@@@@    < NOMBRE DE MOTS MAX ECHANGES.
<*******************************************************************************
         NTRN
         IF          XWOR%1/LK(K=FCREST,,XEIF%,
         IF          ATTENTION : LE NOMBRE DE MOTS MAX ECHANGEABLES
         IF          DOIT ETRE UN NOMBRE ENTIER DE K-MOTS !!!
XEIF%:   VAL         ENDIF
         TRN
XX16KK:: VAL         XWOR%1/LK       < NOMBRE DE 'K' MAX ECHANGEABLE...
NMMDKF:: VAL         $-D-VARDKF      < NOMBRE DE MOTS MAX ECHANGES.
<
< VIRTUALISATION DU BAS DE 'DKF' :
<
         WORD        TVDKF,X
ATVDKF:: VAL         $-D-VARDKF      < ACCES A LA TABLE DE VIRTUALISATION...
         WORD        ZERBV
AVDKF::  VAL         $-D-VARDKF      < ADRESSE DU PREMIER SECTEUR VIRTUALISE.
                                     < (A UNE FRONTIERE DE PISTE)
         WORD        ZERBNV
ANVDKF:: VAL         $-D-VARDKF      < ADRESSE DU PREMIER SECTEUR NON VIRTUA-
                                     < LISE (A UNE FRONTIERE DE PISTE).
<
< BLOC DE DEMANDE DE SIMULATION DE 'DKF' SUR 'DKM' :
<
DEMFM::  VAL         $-VARDKF
         DZS         LDEM0B          < ON MET UNE 'BOX', ON NE SAIT JAMAIS...
<
<
<        P I L E  :
<
<
         CALL        #SISP CMS5 DOL2#
PILDKF:  EQU         $-DEPILE        < PILE DKF
XWPILE:  VAL         LPILEH+6
         CALL        #SISP CMS5 GENPIL2#
         PAGE
<
<
<        T A B L E   D E   V I R T U A L I S A T I O N
<        D U   D E B U T   D E   ' D K F '  :
<
<
         CALL        #SISP CMS5 DOL1#
         NTRN
         IF          ZERBV/XNSPDK(K=FCREST-K,,XEIF%,
         IF          ATTENTION : 'ZERBV' EST MAL IMPLANTEE !!!
XEIF%:   VAL         ENDIF
         TRN
<
<
<        FONCTION :
<                      LE DEBUT DU DISQUE DE 'ZERBV' A 'ZERBNV'
<                    EXCLU N'EST ACCEDE QUE SECTEUR PAR SECTEUR ;
<                    IL EST OCCUPE PAR 'TOGB', 'TP' ET L'ARBRE DU
<                    SYSTEME ; ON PEUT LE VIRTUALISER PISTE A PISTE
<                    PUISQU'UUCUN ECHANGE NE RISQUE DE CHEVAUCHER
<                    2 PISTES. AINSI, UTILISANT LES PISTES INUTILISEES,
<                    ON DISPOSE DE PISTES DE RESERVE DES PISTES VIRTUA-
<                    LISEES EN DEFAUT...
<
<
         NTRN
         IF          ZERBNV/XNSPDK(K=FCREST-K,,XEIF%,
         IF          ATTENTION : 'ZERBNV' N'EST PAS A UNE FRONTIERE DE PISTE...
XEIF%:   VAL         ENDIF
         TRN
         IF          NOCMO-Z-I,,XEIF%,
         IF          ???!??!?
XEIF%:   VAL         ENDIF
TVDKF:   EQU         $-ZERBVP        < DEBUT DE LA TABLE DE VIRTUALISATION.
         NTRN
XWOR%1:  VAL         NPVDKF+NOCMO-E/NOCMO
XWOR%2:  VAL         NPVDKF/NOCMO(K=FCREST
         TRN
XWOR%3:  VAL         NPVDKF+XWOR%2   < TRANSLATION DES OCTETS GAUCHES,
XWOR%4:  VAL         XWOR%3+NOCMO-Z  < TRANSLATION DES OCTETS DROITS.
<*******************************************************************************
         DO          XWOR%1
         BYTE       K=FCDO)MFFFF+N-Z*NOCMO+XWOR%3;K=FCDO)MFFFF+N-Z*NOCMO+XWOR%4
XWOR%5:  VAL         '0000000@@@@    < RECUPERATION DU DERNIER MOT,
<*******************************************************************************
         IF          XWOR%2-K,,XEIF%,
XWOR%5:  VAL         XWOR%5(MOCG     < CAS D'UNE TABLE DE LONGUEUR IMPAIRE,
         $EQU        $-D             < ON REVIENT SUR LE DERNIER MOT,
         WORD        XWOR%5          < ET ON ECRASE LE DERNIER OCTET...
XEIF%:   VAL         ENDIF
         CALL        #SISP CMS5 DOL2#
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        H A N D L E R   ' D K F '  :
<
<
<        ARGUMENTS:
<                    (L)=ADRESSE DE LA 'DCT' DE 'DKF',
<                    (W)=ADRESSE DE LA DEMANDE A TRAITER,
<                    (A)='NSPTYP' DE CETTE DEMANDE.
<
<        FONCTION:
<                      CE HANDLER A A SA CHARGE DE
<                    GERER LE DISQUE FIXE 'DKF' ;
<                    IL PREND LA DEMANDE DE TETE,
<                    LANCE L'ECHANGE DEMANDE, ATTEND
<                    L'INTERRUPTION CORRESPONDANTE,
<                    ET ANALYSE LA FACON DONT IL
<                    S'EST DEROULE...
<                      SI 'DKF' EST DECLARE ABSENT DANS 'ETASYS',
<                    LA DEMANDE EST TRANSFEREE SUR 'DKM' QUI
<                    ASSURERA SA SIMULATION DANS LA
<                    LA ZONE DE COPIE 'DKF' --> 'DKM'...
<
<
         USE         L,DCT0
         USE         W,DEM0
HDLDKF:  EQU         $
<
< VALIDATION DE LA DEMANDE :
<
         TBT         TYPAD           < ADRESSE MOT OU OCTET ???
         JC          DKF11           < MOT...
         LA          ARGDEM+AMDEM    < (A)=ADRESSE-OCTETS DU BUFFER :
         TBT         NBITMO-B        < EST-IL BIEN A UNE FRONTIERE DE MOTS ???
         JNC         SYSRB3          < OUI, OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      VOIR D'OU VIENT CET
<                    ECHANGE BIZARRE ; C'EST
<                    PEUT-ETRE UN PROGRAMME
<                    ESCLAVE SOUS ":SYS" QUI
<                    S'EST CONNECTE DIRECTEMENT
<                    A 'DKF' !!!
<
SYSRB3:  EQU         $
DKF11:   EQU         $
         LA          ETASYS
         TBT         NSPDKF-NSPDK    < 'DKF' EST-IL LA ???
         JNC         DKF20           < NON, ON VA SIMULER...
<
<
<        A C C E S   A U   V R A I   ' D K F '  :
<
<
         LA          ARGDEM+CODEM    < (A)=LONGUEUR-OCTETS DE L'ECHANGE :
         JAE         ERDKF3          < (CODEM)=0 : ERREUR...
         ADRI        NOCMO-E,A       < ARRONDI EVENTUEL AU MOT SUPERIEUR...
         SLRS        NOCMO=K         < CONVERSION EN UN NOMBRE DE MOTS,
         CP          VAR+NMMDKF      < ET VALIDATION...
         JG          ERDKF3          < (CODEM) EST TROP GRAND : ERREUR...
         LA          ARGDEM+ASDEM    < (A)=ADRESSE DU PREMIER SECTEUR :
         JAL         ERDKF4          < ADRESSE INEXISTANTE...
         CP          VAR+NOSDKF      < ET VALIDATION...
         JGE         ERDKF4          < (ASDEM) INEXISTANT : ERREUR...
<
< ALLOCATION EVENTUELLE D'UN
< JEU DE REGISTRES 'HDC' :
<
         CPZ         VAR+XRHDCF      < EN-A-T'ON DEJA UN ???
         JNE         DKF11X          < OUI, RIEN A FAIRE...
         PSR         X
         LAD         VAR+CCDKF
         SVC         SVCM4           < ALLOCATION D'UN CONTEXTE 'HDC'...
         PLR         X
         IC          VAR+XRHDCF      < MEMORISONS QU'UN JEU DE REGISTRES
                                     < 'HDC' EST EN LA POSSESSION DE 'DKF'.
DKF11X:  EQU         $
<
< CONSTRUCTION DU 'CCB' :
<
         STZ         VAR+CCDKG0      < REINITIALISATION DU MOT0 (EN PARTICULIER
                                     < ON RAZE LE BIT DE COMPTE-RENDU).
         LA          NSPTYP
         TBT         TYPAD           < ADRESSE NOT OU OCTET ???
         LA          ARGDEM+AMDEM    < (A)=ADRESSE ARGUMENT.
         JC          DKF12           < C'EST UNE ADRESSE MOT, OK...
         SLRS        NOCMO=K         < CAS DES ADRESSES OCTET.
DKF12:   EQU         $
         STA         VAR+CCDKG2      < MOT2=ADRESSE-MOT BUFFER.
         LA          ARGDEM+CODEM    < (A)=LONGUEUR-OCTETS DU BUFFER,
         ADRI        NOCMO-E,A       < ARRONDI A L'EVENTUEL MOT SUPERIEUR,
         SLRS        NOCMO=K         < CONVERSION EN UN NOMBRE DE MOTS,
         STA         VAR+CCDKF3      < MOT3=LONGUEUR-MOTS DU BUFFER.
         LB          VAR+INIDKF      < (B)=ADRESSE DU COUPLEUR,
         LA          ARGDEM+OPDEM    < (A)=(OPDEM) POUR DETERMINER LE SENS :
XWOR%1:  VAL         FGW?FGR=K       < ACCES AU BIT DISCRIMINANT LA
                                     < LECTURE DE L'ECRITURE...
         TBT         NBITMO-B-XWOR%1
         JNC         DKF5XX          < CAS DE LA LECTURE...
         ADRI        FPHOUT-FPHIN,B  < CAS DE L'ECRITURE...
DKF5XX:  EQU         $
         STB         VAR+CCDKF4      < MOT4=ARGUMENT DE LA 'SIO' D'ECHANGE.
DKF5:    EQU         $
<
< ECHANGE PROPREMENT DIT :
<
         LAI         MOMINI
         SIO         VAR+CDDKF       < RESET DU COUPLEUR ET DU PERIPHERIQUE...
         LA          ARGDEM+ASDEM    < (A)=ADRESSE DU PREMIER SECTEUR :
         CP          VAR+AVDKF       < EST-ON DANS LA ZONE VIRTUELLE ???
         JL          DKF5X           < NON...
         CP          VAR+ANVDKF      < EST-ON DANS LA ZONE VIRTUELLE ???
         JGE         DKF5X           < NON, ON GARDE 'ASDEM'...
         PSR         B               < OUI, CAR IL EST UTILE...
XWOR%1:  VAL         XNSPDK=K
         SLRD        XWOR%1          < (A)=NUMERO DE PISTE,
         LR          A,X             < (X)=NUMERO DE PISTE VIRTUELLE,
         LA          VAR+CCDKF3      < LONGUEUR EN MOTS DE L'ECHANGE,
         CPI         YY7             < ECHANGE-T'ON BIEN UN SECTEUR ???
         JLE         DKF5Y           < OUI, OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      EXAMINER LA TABLE DE VIRTUALISATION,
<                    LA DEFINITION DE LA ZONE VIRTUELLE ET
<                    L'ASDEM...
<
         LA          ARGDEM+ASDEM    < ON RESTAURE L'ASDEM...
         JMP         DKF5Z           < ET ON NE FAIT RIEN...
DKF5Y:   EQU         $
         LBY         &VAR+ATVDKF     < (A)=NUMERO DE PISTE REELLE...
         SLLD        XWOR%1          < ET ON RECONCATENE...
DKF5Z:   EQU         $
         PLR         B
DKF5X:   EQU         $
<
< ENVOI DES ARGUMENTS :
<
         SIO         VAR+SADKF       < SORTIE DE L'ADRESSE DU PREMIER SECTEUR.
         LA          VAR+CCDKF3      < (A)=LONGUEUR-MOTS DU BUFFER,
         ADRI        YM7,A
         ANDI        YM7)MFFFF       < (A)=LONGUEUR-MOTS DU BUFFER, MAIS SUR
                                     <     UN NOMBRE ENTIER PAR EXCES DE
                                     <     SECTEURS,
         SIO         VAR+CSDKF       < SORTIE COMPTE DE SECTEURS SUR LES BITS
                                     < 1 A 8 DU REGISTRE 'A'.
         LAD         VAR+CCDKF       < ADRESSE DU CCB
         PSR         X
         SVC         SVCM6           < ADRESSE SUR 20 BITS DANS LE 'CCB'...
         PLR         X
         BSR         ASDIPI          < ENVOI DU 'CCB' A L''IOP'...
         LAI         MOMSTR?MOMINT   < (A)=LECTURE A PRIORI...
XWOR%1:  VAL         FPHIN?FPHOUT=K
         TBT         NBITAB-B-XWOR%1 < LECTURE OU ECRITURE ???
         JNC         DKF5XY          < CAS DE LA LECTURE...
         ADRI        MOMRW,A         < CAS DE L'ECRITURE...
DKF5XY:  EQU         $
         SIO         VAR+CDDKF       < ET ENFIN LANCEMENT DE L'ECHANGE PAR
                                     < UNE 'SIO' D'ECHANGE...
<
< ATTENTE DE LA FIN D'ECHANGE :
<
         BSR         ACSWIT          < RAZ BETA(SIT) ET ATTENTE DE FIN
                                     < D'ECHANGE. RAPPEL : DANS 'ARIT', LE
                                     < LE MOT D'ETAT 'A' EST LU ET STOCKE
                                     < DANS 'ETAT0' DE LA 'DCT' DE 'DKF'...
         BSR         ATHDS           < EST-CE UNE VRAIE IT QUI EST MONTE
                                     < OU UN DEFSEC/RECOVERY QUI
                                     < A SIMULE LE 'RLSE''SIT' ???
         JC          DKF5            < C'EST UN DEFSEC/RECOVERY,DONC
                                     < IL EST PLUS PRUDENT DE
                                     < RECOMMENCER L'ECHANGE...
         CPZ         ETAT0           < CAS D'UNE "VRAIE" INTERRUPTION ; Y-A-T'IL
                                     < EU DES DEFAUTS ???
         JL          ERDKF5          < OUI, ERREUR...
<
< QUI SAIT, COMPTE-RENDU DE L'ECHANGE :
<
         LA          VAR+CCDKF0
         SBT         BCCBCR          < MISE EN PLACE DU BIT DE COMPTE-RENDU
         STA         VAR+CCDKF0      < DANS LE 'CCB',
         LAD         VAR+CCDKF       < (A)=ADRESSE DU 'CCB',
         BSR         ASDIPI          < DEMANDE DE COMPTE-RENDU A L''IOP'...
         LA          VAR+CCDKF3      < (A)=MOT3 DU 'CCB', C'EST-A-DIRE COMPTE-
                                     <     COMPTE-RENDU DU CANAL 'HDC' SUR
                                     <     LES BITS 0-1 POUR L'ETAT, ET 2-15
                                     <     POUR LE COMPTE DE MOTS RESIDUELS :
                                     < SIGNIFICATION DES BITS 0-1 :
                                     < =00 : OK, TOUT S'EST BIEN PASSE,
                                     < =01 : L'ECHANGE S'EST ARRETE SUR UN
                                     <       DEFAUT SECTEUR, OU UN 'INI',
                                     < =10 : UNE PARITE MEMOIRE A ETE RENCON-
                                     <       TREE AU COURS DE L'ECHANGE,
                                     < =11 : UNE MEMOIRE INEXISTANTE A ETE
                                     <       RENCONTREE AU COURS DE L'ECHANGE.
                                     < LES BITS 2-15, QUANT A EUX, DONNENT LE
                                     < COMPTE DE MOTS RESIDUELS EN FIN D'ECHAN-
                                     < GE (NORMALEMENT NUL...).
         JAE         DKF2            < OK, LES BITS 0-1 SONT NULS, ET LE
                                     < COMPTE DE MOTS RESIDULES EST NUL...
         JAG         SYSRB4          < MAUVAIS, MAIS CE N'EST NI UNE PARITE,
                                     < NI UNE MEMOIRE INEXISTANTE...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      IDENTIFIER ET LOCALISER
<                    LA MEMOIRE INEXISTANTE OU
<                    LA PARITE !!!
<
         JMP         ERDKF5          < ET ERREUR...
SYSRB4:  EQU         $
         TBT         BCCBDC          < EN SUPPOSANT QUE LA 'SYSER' PRECEDENTE
                                     < NE S'EST PAS PRODUITE, EST-CE UN DEFAUT
                                     < SECTEUR (OU UN 'INI') ???
         JC          ERDKF5          < OUI...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE COMMENT ON
<                    PEUT AVOIR UN COMPTE DE
<                    MOTS RESIDUELS NON NUL ???
<                      RELANCER L'ECHANGE PAR UNE
<                    SORTIE EN ERREUR : 'JMP ERDKF4'...
<
DKF2:    EQU         $
<
<
<        S O R T I E   N O R M A L E  :
<
<
         STZ         ETAT0
DKF3:    EQU         $
<
< DESALLOCATION EVENTUELLE DU
< JEU DE REGISTRES 'HDC' :
<
         CPZ         VAR+XRHDCF      < A-T'ON UN JEU ???
         JE          DKF3X           < NON, CAS DES ERREURS SITUEES AU DEBUT,
                                     < OU DES SIMULATIONS SUR 'DKM'.
         LA          ETASYS          < OUI, MAIS
         TBT         BRCDKF          < PEUT-ON LE GARDER ???
         JC          DKF3X           < OUI...
         STZ         VAR+XRHDCF      < NON, ON LE REND...
         PSR         X
         LAD         VAR+CCDKF
         SVC         SVCM5           < DESALLOCATION DU CONTEXTE 'HDC'...
         PLR         X
DKF3X:   EQU         $
         RSR
<
<
<        T R A I T E M E N T   D E S   E R R E U R S   S O F T W A R E  :
<
<
ERDKF3:  EQU         $               < COMPTE DE MOTS INVALIDES :
         LBY         VAR+NMMDKF      < LORSQUE LA TAILLE DU BUFFER EST
                                     < TROP GRANDE, LE CODE D'ERREUR
                                     < RETOUR EST PRECISEMENT NMMDKF/YY8
                                     < CECI EST UTILISE PAR LE SWAPPER.
                                     < ("LE SWAPPER CAMEMBERT"...)
         JMP         DKF4            < VERS LA SORTIE DES ERREURS SOFTWARE...
ERDKF4:  EQU         $               < ADRESSE SECTEUR INEXISTANTE :
EDKAI::  VAL         3               < ERREUR 'ADRESSE INEXISTNTE'.
         LAI         CORBT?NBITMO-B=FMASK(K?EDKAI=FCINST
DKF4:    EQU         $
         STZ         ETAT1           < ETAT1=0 POUR UN DEFAUT SOFWARE,
         SBT         NBITMO-B
         STA         ETAT0           < ETAT0=CODE D'ERREUR...
         JMP         DKF3            < VERS LA SORTIE...
<
<
<        T R A I T E M E N T   D E S   E R R E U R S   H A R W A R E  :
<
<
ERDKF5:  EQU         $
<
<        NOTA :
<                      DANS LE CAS DES ERREURS
<                    HARDWARE, 'ETAT0' ET 'ETAT1'
<                    CONTIENNENT (VOIR 'ARIT')
<                    LES MOTS D'ETAT 'A' ET 'B',
<                    IL N'Y A DONC RIEN D'AUTRE
<                    A FAIRE ; DE PLUS L'OCTET0
<                    DE 'ETAT0' ETANT NON NUL,
<                    IL Y AURA UN 'RETRY'...
<
         JMP         DKF3            < VERS LE RETOUR...
<
<
<        S I M U L A T I O N   ' D K F '  S U R   ' D K M '  :
<
<
DKF20:   EQU         $
         LA          NSPTYP
XWOR%2:  VAL         '0000           < INITIALISATION DU MASQUE INDICATEURS.
XWOR%2:  VAL         COSBT?PRIO=FMASK(K?XWOR%2=FCINST
XWOR%2:  VAL         COSBT?BACT=FMASK(K?XWOR%2=FCINST
XWOR%2:  VAL         COSBT?VBOX=FMASK(K?XWOR%2=FCINST
XWOR%2:  VAL         COSBT?TYPAD=FMASK(K?XWOR%2=FCINST
MKTD::   VAL         XWOR%2          < EN EFFET, CE MASQUE SERA RE-UTILISE
                                     < PAR LES MEMOIRES VIRTUELLES DKA ET DKB,
                                     < AINSI QUE LORS D'UNE EVENTUELLE SIMU-
                                     < LATION DE 'DKU' SUR 'DKM'.
         ANDI        MKTD            < ON NE CONSERVE QUE QQ INDICATEURS, QUE
         STA         VAR+DEMFM+XXNSP < L'ON PLACE DANS LA DEMANDE DKF --> DKM.
         LAI         NSPDKM
         STBY        VAR+DEMFM+XXNSP < AFIN D'ATTEINDRE 'DKM'.
         LAD         VAR+DEMFM+T
         LR          A,B             < (B)=RECEPTEUR=DEMANDE LOCALE A 'DKF'.
         LAD         ARGDEM+OPDEM    < (A)=EMETTEUR=DEMANDE ARGUMENT (OPDEM...)
         LXI         ASDEM-OPDEM+Z   < (X)=NOMBRE DE MOTS A DUPLIQUER...
         MOVE                        < DUPLICATION DE OPDEM, AMDEM, CODEM
                                     < ET ASDEM.
         IF          XDKSYM-K,,XEIF%,
         IF          ATTENTION : LE 'GB' DE SIMULATION DE 'DKF' SUR 'DKM'
         IF          DOIT ETRE LE PREMIER...
XEIF%:   VAL         ENDIF
         PSR         W               < SAVE L'ADRESSE DE LA DEMANDE...
         LAD         VAR+DEMFM
         LR          A,W             < (W)=ADRESSE DE LA DEMANDE "LOCALE"...-
         BSR         ACHAND          < ENVOI DE LA DEMANDE DKF --> DKM ; ON
                                     < NOTERA QUE 'DKM' DISCRIMINERA CET APPEL
                                     < PAR 'ETASYS' ET LE CONTENU DE 'ETADEM'.
         BSR         ACHANW          < ATTENTE DE FIN D'ENTREE-SORTIE...
         LA          ARGDEM+ETADEM   < TRANSMISSION DES
         STA         ETAT0           < CONDITIONS DE RETOUR...
         PLR         W               < ON RESTAURE...
         JMP         DKF3            < ET C'EST TOUT...
         PAGE
<
<
<        R O U T I N E   D ' I T   D K F
<
<
<        RAPPEL :
<                      ON TRAVAILLE EN MODE 'HDC' SUR 'DKF' ; EN CONSEQUENCE
<                    ON RECUPERE UNE INTERRUPTION EXCEPTION EN FIN
<                    D'ECHANGE, QUE L'ON FAIT RETOMBER PAR UNE 'SIO'
<                    D'ETAT AVEC AU PASSAGE LE STOCKAGE DES MOTS
<                    D'ETAT 'A' ET 'B' DANS 'ETAT0' ET 'ETAT1' DE 'DCTDKF'
<                    POUR EXPLOITATION ULTERIEURE PAR LE HANDLER 'DKF'...
<                    ON NE REVEILLE LE HANDLER QUE S'IL Y A UN
<                    ECHANGE EN COURS.
<
<
<        NOTA :
<                      EN CAS D'INTERRUPTION
<                    NORMALE, ON FERA UNE 'SYSER'...
<
<
<        ARGUMENT :
<                    (B)=0 : INTERRUPTION NORMALE,
<                    (B)=1 : INTERRUPTION EXCEPTION.
<
<
ITDKF:   EQU         $
         CPZR        B               < QUELLE EST LA NATURE DE L'INTERRUPTION ??
         JNE         SYSRB5          < EXCEPTION, CE QUI EST "NORMAL"...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE :
<                      COMPRENDRE COMMENT UNE
<                    INTERRUPTION NORMALE A PU
<                    APPARAITRE !!!
<
SYSRB5:  EQU         $
         SIO         VAR+EADKF       < LECTURE DU MOT D'ETAT 'A',
         STA         ETAT0           < ET MISE DANS 'ETAT0'.
         SIO         VAR+EBDKF       < LECTURE DU MOT D'ETAT 'B',
         STA         ETAT1           < ET MISE DANS 'ETAT1'.
         BSR         ATEC            < Y-A-T'IL UN ECHANGE EN COURS ???
         JE          ITDKF1          < NON, DONC PAS DE REVEIL DE 'HDLDKF'...
         BSR         ARVHDL          < OUI, REVEIL DE 'HDLDKF'...
ITDKF1:  EQU         $
         RSR
         PAGE
<
<
<        R O U T I N E   D E S   R E P R I S E S   D K  :
<
<
<        FONCTION :
<                      CE MODULE EST CHARGE DE REGARDER,
<                    LORSQU'IL Y A EU ERREUR, S'IL Y A
<                    ENCORE DES ESSAIS A TENTER ; SINON,
<                    POUR 'DKM' ET 'DKF', LORSQ'IL S'AGIT
<                    D'UNE LECTURE ('FGR'), IL POSITIONNE
<                    L'ENSEMBLE DU BUFFER AVEC 'Q8000',
<                    EN ESPERANT QUE TOUT LE MONDE S'EN
<                    CONTENTERA...
<
<
<        ARGUMENT :
<                    (X)=NBRE D'ESSAIS RESTANT A TENTER.
<
<
<        RESULTAT :
<                    (A)=K : OK, PAS DE REPRISE,
<                       #0 : REPRISE DE L'OPERATION (IL Y A EU UN
<                            DEFAUT HARD SUR LE DK.
<
<
TRYDKF:  EQU         $               < ENTRY 'DKF'.
TRYDKM:  EQU         $               < ENTRY 'DKM'.
<
< COMMENT CELA S'EST-IL PASSE ???
<
         CPZ         ETAT0           < COMMENT CELA S'EST-IL PASSE ???
         JE          TRYDKZ          < TRES BIEN...
<
< MAL, QU'Y FAIRE ???
<
         LBY         ETAT0           < NON, ERREUR SOFT OU HARD ???
         JAE         TRYDKS          < SOFT, VERS UNE SYSER IMMEDIATE...
         LR          X,A             < HARD, (A)=NBRE D'ESSAIS RESTANT A TENTER.
         CPI         XXNTRY          < EST-CE LE DERNIER ESSAI ????
         JG          TRYDKZ          < NON, LAISSONS LUI AU MOINS
                                     < UNE CHANCE...
TRYDKS:  EQU         $
         LA          ETASYS          < ACCES A L'ETAT DU SYSTEME,
         TBT         BTRYDK          < FAUT-IL FAIRE UNE 'SYSER' ???
         JNC         TRYDKX          < 0 ==> ET OUI...
         STZ         ETAT0           < 1 ==> NON, ET ON FAIT MEME CROIRE
                                     < QUE TOUT C'EST BIEN PASSE PAR LA
                                     < REMISE A 0 DE 'ETAT0'...
         JMP         SYSRB6          < VERS LA RECUPERATION DE 'ETAT0' (...).
TRYDKX:  EQU         $
         BSR         ASYSER          < E R R E U R   F A T A L E ...
<
<        QUE FAIRE ???
<                      ATTENTION, ON A EPUISE
<                    TOUTES LES TENTATIVES DE
<                    'RETRY' !!!
<
SYSRB6:  EQU         $
<
< TRAITEMENT DES DEFAUTS SUR 'LECTURE' :
<
XWOR%1:  VAL         FGR?FGW=K       < BIT DISCRIMINANT LECTURE/ECRITURE.
         LA          ARGDEM+OPDEM
         TBT         NBITMO-B-XWOR%1 < SENS DE L'OPERATION ???
         JC          TRYDKZ          < ECRITURE, ON LAISSE LE BUFFER...
         PSR         X,Y             < LECTURE : ON VA TRUANDER LE BUFFER...
         LA          ARGDEM+CODEM
         ADRI        NOCMO-E,A
         SLRS        NOCMO=K
         LR          A,X             < (X)=NOMBRE DE MOTS A ECHANGER,
         LA          NSPTYP
         TBT         TYPAD           < ADRESSE MOT, OU OCTET ???
         LA          ARGDEM+AMDEM
         JC          TRYDK1          < MOT, PAS DE DECALAGE...
         ADRI        NOCMO-E,A       < OCTET...
         SLRS        NOCMO=K
TRYDK1:  EQU         $
         LR          A,Y             < (Y)=ADRESSE-MOTS DU BUFFER...
                                     <     (DANS UNE PAGE DE 32K)
         LA          ARGDEM+ASDEM    < ACCES AU PREMIER SECTEUR :
         IF          XXGB-K,,XEIF%,XEIF%
         IF          ATTENTION : 'XXGB' EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
         IF          XXGB-K,XEIF%,XEIF%,
         CPI         XXGB            < EST-CE UN MORCEAU DE 'TOGB' ???
         JL          TRYDK2          < NON...
XEIF%:   VAL         ENDIF
         CPI         XXGB+NSTO       < EST-CE UN MORCEAU DE 'TOGB' ???
         JGE         TRYDK2          < NON...
<
< CAS D'UNE ERREUR DE LECTURE SUR UN MORCEAU DE 'TOGB' :
<
         LR          X,A             < (A)=NOMBRE DE MOTS A ECHANGER,
         CPI         YY7             < ET VALIDATION...
         JE          TRYDK4          < OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      REGARDER LE DEMANDEUR DE L'ECHANGE QUI DOIT
<                    ETRE 'DKA', ET VOIR ALORS QUI EST LE DEMANDEUR
<                    DE 'DKA' QUI DEVRAIT ETRE 'GET'/'REL'...
<
TRYDK4:  EQU         $
         LAI         MMOT)MMOT       < VALEUR DE REINITIALISATION D'UN BUFFER
                                     < DE 'TOGB'...
         JMP         TRYDK3          < VERS LA REINITIALISATION...
<
< CAS D'UNE ERREUR DE LECTURE SUR
< UN BLOC N'APPARTENANT PAS A 'TOGB' :
<
TRYDK2:  EQU         $
         LA          INFINI          < VALEUR DE REINITIALISATION : ON CHOISIT
                                     < CELLE-CI CAR ELLE CORRESPOND A UNE FIN
                                     < DE QUELQUE CHOSE POUR LE 'SGF' ET LE
                                     < 'SGN'...
<
< REINITIALISATION DU BLOC EN ERREUR :
<
TRYDK3:  EQU         $
TRYDKY:  EQU         $
         STAR
         ADRI        P,Y             < PARTOUT...
         JDX         TRYDKY
         PLR         X,Y
TRYDKZ:  EQU         $
<
< RETOUR :
<
TRYDKU:  EQU         $               < ENTRY 'DKU'.
         LBY         ETAT0           < (A)=PARTIE DU MOT D'ETAT DU
                                     <     DK RELATIVE AUX ERREURS HARD ;
                                     <     AINSI, S'IL Y A EU DES
                                     <     ERREURS HARD, ON RECOMMENCERA
                                     <     L'OPERATION AVEC LE DK.
         RSR
         PAGE
<
<
<        C O N S T A N T E S   D I V E R S E S
<        D I S Q U E S   A M O V I B L E S  :
<
<

XXDK1::  VAL         10              < INCREMENT DE LA LONGUEUR DE LA PILE.
XXDK2::  VAL         '4000           < NOMBRE DE MOTS MAX ECHANGEABLES.
XXDK3::  VAL         1               < NUMERO DU JEU DE REGISTRES 'HDC'.
                                     < (EN FAIT ALLOUE DYNAMIQUEMENT...)
XWOR%1:  VAL         COSBT?XBITQ=FMASK(K?FGR=FCINST
XWOR%2:  VAL         COSBT?XBITQ=FMASK(K?FGW=FCINST
XWOR%3:  VAL         K
XWOR%3:  VAL         COSBT?FGR=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?FGW=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XWOR%1=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XWOR%2=FMASK(K?XWOR%3=FCINST
XXDK5::  VAL         XWOR%3          < LISTE DES FONCTIONS RECONNUES.
XXDK6T:: VAL         200/THALT       < TEMPORISATION DE 200 MICRO-SECONDES
                                     < DESTINEE A ESPACER SUFFISAMMENT
                                     < CERTAINES 'SIO' AFIN D'EVITER DES
                                     < PERTES ALEATOIRES DU READY ???!?!?!
XWOR%3:  VAL         K               < INITIALISATION...
XWOR%1:  VAL         COSBT?XBITQ=FMASK(K?FGR=FCINST
XWOR%2:  VAL         COSBT?XBITQ=FMASK(K?FGW=FCINST
XWOR%3:  VAL         COSBT?FGR=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?FGW=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XWOR%1=FMASK(K?XWOR%3=FCINST
XWOR%3:  VAL         COSBT?XWOR%2=FMASK(K?XWOR%3=FCINST
XXDK6::  VAL         XWOR%3          < LISTE DES "ALTITUDES" POUR 'DKM' ; POUR
                                     < 'DKU', IL FAUDRA LA COMPLETER...
         PAGE
<
<
<        D C T   D K M  :
<
<
         CALL        #SISP CMS5 CHECK#
         CALL        #SISP CMS5 DOL1#
DCTDKM:  EQU         $
PSTDKM:  WORD        K;K;K;K;COM+DEPCS;DCTDKM;NIL;PILDKM;HANDLR;SMST;SO;SE
       #@ASCI        " DKM"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR
         WORD        FILTRS          < S-FILTRE.
         WORD        XXDCTP          < ETALOC=XXDCTP : 'DKM' NON LOUABLE...
         WORD        XXLOC0          < SEMLOC.
         DZS         LSEM
         WORD        NIL             < TETE DE LA FILE D'ATTENTE SUR 'DKM',
         WORD        NIL             < QUEUE DE LA FILE D'ATTENTE SUR 'DKM'.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLDKM          < HANDLER SPECIFIQUE DE GESTION DE 'DKM'.
         WORD        ITDKM           < ROUTINE SPECIFIQUE DE TRAITEMENT DES
                                     < INTERRUPTIONS DE 'DKM'.
         WORD        K;K             < ETAT.
         WORD        COSBT?B0SIT=FMASK(K=FCINST < BITSEM.
         WORD        XXDK4;TRYDKM    < NTRIES ET FRTRY.
         WORD        K               < HSTATS.
XWOR%2:  VAL         2
         WORD        XWOR%2*DKCMS4   < TESTO#0 : TIME-OUT A TESTER...
         WORD        XXDK5           < LISTE DES FONCTIONS RECONNUES.
         WORD        XXDK6           < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
<        Z O N E   V A R I A B L E  :
<
<
VARDKM:  EQU         $
         IF          VARDKM-DCTDKM-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
< OPERANDES DES 'SIO' :
<
         WORD        ACDKM?FPHCME
ASDKM::  VAL         $-D-VARDKM      < SORTIE ADRESSE SECTEUR.
         WORD        ACDKM?FPHCMD
CDDKM::  VAL         $-D-VARDKM      < SORTIE COMMANDE.
         WORD        ACDKM?FPHETA
EADKM::  VAL         $-D-VARDKM      < ENTREE DU MOT D'ETAT 'A'.
         WORD        ACDKM?FPHETB
EBDKM::  VAL         $-D-VARDKM      < ENTREE DU MOT D'ETAT 'B'.
         WORD        ACDKM
INIDKM:: VAL         $-D-VARDKM      < POUR INITIALISER LE 'CCB'.
<
< 'CCB' DU DISQUE 'DKM' :
<
         WORD        COSBT?CCBDKM=FMASK(K=FCINST
DSYNC0:: VAL         $-D-VARDKM      < POUR INITIALISER 'CCDKM0' ; IL CONTIENT
                                     < ENTRE AUTRE LE BIT 'CCBDKM' PERMETTANT
                                     < LA SYNCHRONISATION SUR LE SECTEUR 0...
         WORD        K
CCDKN2:: VAL         $-D-VARDKM      < POUR INITIALISER 'CCDKM2'...
CCDKM::  VAL         $-VARDKM        < 'CCBDKM' :
         WORD        COSBT?CCBDKM=FMASK(K=FCINST
CCDKM0:: VAL         $-D-VARDKM      < MOT0 :
                                     < BIT6=1 : DISQUE A TETE MODILE.
         BYTE        CCBHDC?XSNDKM;XXDK3 < MOT1 :
                                     < BITS 0-1   : MODE 'HDC',
                                     < BITS 2-7   : SOUS-NIVEAU NORMAL,
                                     < BITS 11-15 : NUMERO DU JEU DE REGISTRES
                                     <              'HDC' ALLOUES.
         WORD        NIL
CCDKM2:: VAL         $-D-VARDKM      < MOT2 : ADRESSE-MOT DU BUFFER.
         WORD        NILK
CCDKM3:: VAL         $-D-VARDKM      < MOT3 : LONGUEUR-MOTS DU BUFFER.
         WORD        ACDKM
CCDKM4:: VAL         $-D-VARDKM      < MOT4 : OPERANDE DE LA 'SIO' D'ECHANGE :
                                     < BITS 13-15=000 : LECTURE,
                                     <           =001 : ECRITURE.
         WORD        NILK
CCDKM5:: VAL         $-D-VARDKM      < MOT5 : IL CONTIENT LE 'HEADER 1' DU
                                     < PREMIER SECTEUR DE L'ECHANGE.
<
< INFORMATIONS DE DIMENSIONNEMENT :
<
<*******************************************************************************
         WORD        XXDK2
XWOR%1:  VAL         '0000000@@@@    < NOMBRE DE MOTS MAX ECHANGEABLES.
<*******************************************************************************
         NTRN
XWOR%2:  VAL         XXSGN9+NOCMO-E/NOCMO
         TRN
         IF          XWOR%2-XWOR%1,XEIF%,XEIF%,
         IF          ATTENTION : LE NOMBRE MAX D'OCTETS GROUPABLES
         IF          PAR LE 'SGN' DOIT ETRE INFERIEUR OU EGAL AU
         IF          NOMBRE DE MOTS MAX ECHANGEABLES PAR 'DKM' !!!
XEIF%:   VAL         ENDIF
NMMDKM:: VAL         $-D-VARDKM      < LONGUEUR-MOTS MAXIMALE D'UN ECHANGE.
<
< RELAIS DE SOUS-PROGRAMMES :
<
         WORD        SPDKM
ASPDKM:: VAL         $-D-VARDKM      < SOUS-PROGRAMME VIDE POUR 'DKM' ET
                                     < DESTINE A DETECTER LES MEMOIRES INEX-
                                     < ISTANTES POUR 'DKU'...
<
< POUR LA GESTION DES ADRESSES :
<
         WORD        K
SUIDKM:: VAL         $-D-VARDKM      < INDICATEUR DE "SUITE" : CE MOT EST UTI-
                                     < POUR POURSUIVRE UN ECHANGE A CHEVAL SUR
                                     < UNE FIN DE CYLINDRE.
         WORD        NILK
CYL::    VAL         $-D-VARDKM      < NUMERO DE CYLINDRE.
         WORD        NILK
PIST::   VAL         $-D-VARDKM      < NUMERO DE PISTE.
         WORD        NILK
SECT::   VAL         $-D-VARDKM      < NUMERO DE SECTEUR.
XWOR%1:  VAL         24              < NOMBRE DE SECTEURS PAR PISTE.
XDKMSP:: VAL         XWOR%1          < NOMBRE DE SECTEURS PAR PISTE.
XWOR%2:  VAL         XWOR%1/QUANTA   < NOMBRE DE QUANTUM PAR PISTE.
XWOR%3:  VAL         XWOR%2*QUANTA-XWOR%1
         IF          -XWOR%3,,XEIF%,
         IF          A T T E N T I O N  : 'QUANTA' NE DIVISE
         IF          PAS EXACTEMENT LE NOMBRE DE SECTEURS
         IF          PAR PISTE !!!
XEIF%:   VAL         ENDIF
         WORD        XWOR%2
NBSPP::  VAL         $-D-VARDKM      < NOMBRE DE SECTEURS PAR PISTE.
         WORD        XWOR%1
NBSRPP:: VAL         $-D-VARDKM      < NOMBRE REEL DE SECTEURS PAR PISTE ;
                                     < IL EST UTILISE A LA PLACE DE 'NBSPP'
                                     < LORSQU'ON SIMULE 'DKF' SUR 'DKM'...
         WORD        NUQFM/2
VALFM::  VAL         $-D-VARDKM      < AFIN DE VALIDER LES ADRESSES DEMANDES
                                     < LORSQUE L'ON SIMULE 'DKF' ET QU'IL
                                     < N'EST PAS DEMANDEUR ; ON DIVISE PAR 2
                                     < CAR EN EFFET, LES ADRESSES SECTEURS
                                     < SONT SUR 16 BITS, ET PEUVENT DONC
                                     < ETRE DES NOMBRES NEGATIFS...
XDKMPC:: VAL         20              < NOMBRE DE PISTES PAR CYLINDRE.
         WORD        XDKMPC
NBPPC::  VAL         $-D-VARDKM      < NB DE PISTES PAR CYLINDRE
MINCYL:: VAL         K               < PREMIER CYLINDRE RECONNU (ON EN FAIT UN
                                     < 'VAL' ET NON PAS UN 'WORD', CAR LA
                                     < 'DCTDKU' EST SATUREE...).
NAXCYL:: VAL         XAXCYL-Z        < NOMBRE DE CYLINDRES...
         WORD        NAXCYL
MAXCYL:: VAL         $-D-VARDKM      < DERNIER CYLINDRE RECONNU.
         WORD        QUANTA
DKMQUA:: VAL         $-D-VARDKM      < VALEUR DU QUANTA, UTILISEE PAR 'DKU'
                                     < LORSQU'IL EST SIMULE SUR 'DKM'.
         WORD        YY8Q
DKMLS::  VAL         $-D-VARDKM      < NOMBRE D'OCTETS CONTENUS DANS UN
                                     < BLOC DE 'QUANTA' SECTEURS.
         WORD        TVDKM,X
ATVDKM:: VAL         $-D-VARDKM      < ACCES A LA TABLE DE VIRTUALISATION DES
                                     < GROUPES DE CYLINDRES.
<
< ALLOCATION DES REGISTRES 'HDC' :
<
         WORD        XXNHDC
XRHDCM:: VAL         $-D-VARDKM      < INDICATEUR DE L'ETAT D'ALLOCATION D'UN
                                     < JEU DE REGISTRES 'HDC' :
                                     < 0 : PAS DE JEU ALLOUE (HANDLER INACTIF,
                                     <     OU ERREUR DE DEBUT...),
                                     < 1 : UN JEU A ETE ALLOUE (HANDLER ACTIF,
                                     <     CONTRAIREMENT A 'DKF'...).
<
< PROTECTION DES CYLINDRES PAR GROUPE :
<
         NTRN
NCYLP::  VAL         XAXCYL+NBITMO-E/NBITMO
                                     < NOMBRE DE CYLINDRES CONSTITUANT UN
                                     < GROUPE D'APPROPRIATION ET ASSOCIES
                                     < A UN BIT DE 'LSDK' ET 'LUDKU' (DANS
                                     < CHAQUE 'DCTESC').
         TRN
LSDKM:   EQU         $
         DZS         LOSDKM
XWOR%7:  VAL         $-LSDKM
         IF          XWOR%7-LOSDKM,,XEIF%,
         IF          ATTENTION : LA LONGUEUR PRESUMEE DE LA LISTE
         IF          DES GROUPES DE CYLINDRES APPROPRIES DE 'DKM'
         IF          (FAITE DANS LE BUFFER DE 'COPY') EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
LSDK::   VAL         $-D-VARDKM      < LISTE DES GROUPES DE 'NCYLP' CYLINDRES
                                     < APPROPRIES.
<
< ACCES A LA LISTE DES
< TRANSLATIONS EN Q=1 :
<
         WORD        TASQM,X
ATASQ::  VAL         $-D-VARDKM      < RELAI D'ACCES A UNE LISTE DE DOUBLE-MOTS
                                     < CONTENANT DES COUPLES : LISTE D'APPRO-
                                     < PRIATION DES GROUPES DE CYLINDRE, TRANS-
                                     < LATION DES ADRESSES LORSQUE Q=1.
<
<
<        A T T E N T I O N  :
<        Z O N E   S P E C I F I Q U E   ' D K M '  :
<
<
WARDKM:  EQU         $
         WORD        DKMGS
ADKMGS:: VAL         $-D-VARDKM      < INITIALISATION SANS ENTREE SORTIE DE
                                     < CERTAINS BUFFERS...
         WORD        LDKMN-IJIJDX,X
ALDKMN:: VAL         $-D-VARDKM      < RELAI D'ACCES A LA LISTE DES 'NSP'
                                     < POUVANT ACCEDER A 'DKM'...
LDKMN:   EQU         $
         WORD        NSPDKB
         WORD        NSPDKF
         WORD        NSPDKU
         WORD        NSPHOR
         WORD        NSPREL
         WORD        NSPGET
LLDKMN:: VAL         $-LDKMN         < LONGUEUR EN MOTS DE CETTE LISTE ; SI
                                     < CETTE LISTE EST UNE LISTE DE MOTS
                                     < C'EST POUR DES RAISONS D'ECONOMIE
                                     < DE CODE LORS DU TEST (TOUJOURS A CAUSE
                                     < DES SAUTS SUPERIEURS A 128 MOTS...)
<
< PILE :
<
         CALL        #SISP CMS5 DOL2#
PILDKM:  EQU         $-DEPILE        < PILE DKM
XWPILE:  VAL         LPILEH+XXDK1
         CALL        #SISP CMS5 GENPIL2#
         PAGE
<
<
<        Z O N E   D E   V I R T U A L I S A T I O N
<        D E S   G R O U P E S   D E   C Y L I N D R E S  :
<
<
<        FONCTION PRINCIPALE :
<                      SUR 'DKM' RAMENER LA ZONE DE COPIE
<                    DE 'DKF', ET DONC SA ZONE DE SIMULATION
<                    A MI-CHEMIN DES EXTREMITES DE 'DKM', PUIS
<                    ACCEDER A DES GROUPES DE RESERVE...
<
<
         CALL        #SISP CMS5 DOL1#
TVDKM:   EQU         $               < DEBUT DE LA ZONE DE VIRTUALISATION.
TVDKMQ:  EQU         TVDKM           < A CAUSE DES REFERENCES EN AVANT DESSUS...
         NTRN
XWOR%1:  VAL         GAXCYL+NOCMO-E/NOCMO
XWOR%2:  VAL         GAXCYL/NOCMO(K=FCREST
         TRN
XWOR%3:  VAL         GAXCYL+XWOR%2   < INCREMENT DES OCTETS GAUCHES,
XWOR%4:  VAL         XWOR%3+NOCMO-Z  < INCREMENT DES OCTETS DROITS.
<*******************************************************************************
         DO          XWOR%1
         BYTE       K=FCDO)MFFFF+N-Z*NOCMO+XWOR%3;K=FCDO)MFFFF+N-Z*NOCMO+XWOR%4
XWOR%5:  VAL         '0000000@@@@    < RECUPERATION DU DERNIER MOT,
<*******************************************************************************
         IF          XWOR%2-K,,XEIF%,
XWOR%5:  VAL         XWOR%5(MOCG     < DANS LE CAS D'UNE TABLE DE LONGUEUR
                                     < IMPAIRE, ON EFFACE LE DERNIER OCTET
                                     < GENERE,
         $EQU        $-D             < ON REVIENT D'UN MOT EN ARRIERE,
         WORD        XWOR%5          < ET ON REGENERE LE DERNIER MOT...
XEIF%:   VAL         ENDIF
         CALL        #SISP CMS5 DOL2#
<
<
<        E S P A C E   I N U T I L I S E   S U R   ' D K M '  :
<
<
SDKMTO:: VAL         XAXCYL*XDKMSP/QUANTA*XDKMPC
                                     < NOMBRE TOTAL DE Q-SECTEURS SUR 'DKM',
                                     < A COMPARER A 'SDKM'...
SDKMLI:: VAL         SDKMTO-SDKM     < NOMBRE DE Q-SECTEURS INUTILISES.
         IF          SDKMLI-K,,,XEIF%
         IF          ET BIEN, CELA NE FAIT PAS BEAUCOUP !!!
XEIF%:   VAL         ENDIF
XWOR%1:  VAL         CAXCYL=K
XWOR%1:  VAL         -XWOR%1
XWOR%2:  VAL         SDKM+CAXCYL-E>XWOR%1
         NTRN
SDKMGL:: VAL         XWOR%2*QUANTA+XDKMSP-E/XDKMSP+XDKMPC-E/XDKMPC
         TRN
                                     < NOMBRE DE GROUPES DE CYLINDRES DISPO-
                                     < NIBLES, A COMPARER A 'GAXCYL'...
         PAGE
<
<
<        L I S T E   D E S   T R A N S L A T I O N S   E N   Q = 1  :
<
<
<        FONCTION :
<                      CETTE LISTE EST EN FAIT INUITLE POUR
<                    'DKM', MAIS ON LA MET POUR DES RAISONS
<                    DE SYMETRIE AVEC 'DKU' ; ELLE CONTIENT
<                    UNE ENTREE PAR UTILISATEUR, SACHANT QU'A
<                    UN INSTANT DONNE 2 UTILISATEURS NE PEU-
<                    VENT AVOIR LA MEME LISTE D'APPROPRIATION
<                    DE GROUPES DE CYLINDRES. CETTE LISTE
<                    CONTIENT DONC DES COUPLES :
<
<                    (LISTE D'APPROPRIATION DE GROUPES DE CYLINDRES,
<                    TRANSLATION DES ADRESSES DISQUES EN Q=1),
<
<                    POUR TOUT ECHANGE EN Q=1, ON CHERCHE LA
<                    TRANSLATION D'ADRESSE A EFFECTUER A PARTIR
<                    DE LA LISTE D'APPROPRIATION DES GROUPES
<                    DE CYLINDRES ; LE FONCTIONNEMENT EST DONC
<                    ASSOCIATIF.
<
<
<*******************************************************************************
TRDKU0:: VAL         K               < TRANSLATION 0,
TRDKU1:: VAL         TRDKU0+I        < TRANSLATION 1,
TRDKU2:: VAL         TRDKU1+I        < TRANSLATION 2...
TRDKUM:: VAL         '0@@@@          < TRANSLATION MAXIMALE RECONNUE...
<*******************************************************************************
         CALL        #SISP CMS5 DOL1#
TASQM:   EQU         $
LOSDK2:: VAL         LOSDKM*NBITMO
         DO          LOSDK2
         WORD        NILK;TRDKU0     < LISTE VIDE INITIALEMENT...
LTASQ::  VAL         $-TASQM         < LONGUEUR TOTALE DE CETTE LISTE,
ITASQ::  VAL         LTASQ/LOSDK2    < LONGUEUR D'UNE ENTREE,
ITASQT:: VAL         ITASQ-D         < INDEX DE L'ENTREE CONTENANT LA TRANS-
                                     < LATION DES ADRESSES EN Q=1.
         CALL        #SISP CMS5 DOL2#
         PAGE
<
<
<        D C T   D K U  :
<
<
         CALL        #SISP CMS5 DOL1#
DCTDKU:  EQU         $
PSTDKU:  WORD        K;K;K;K;COM+DEPCS;DCTDKU;NIL;PILDKU;HANDLR;SMST;SO;SE
       #@ASCI        " DKU"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR
         WORD        FILTRS          < S-FILTRE.
         WORD        XTALOC          < ETALOC=XTALOC :
                                     < 'DKU' EST PARTAGEABLE AVEC LES ASSIGNS
                                     <       IMPLICITES, ET
                                     < 'DKU' EST NON PARTAGEABLE AVEC LES
                                     <       !ASSIGN EXPLICITES, QUI INHIBENT
                                     <       ALORS LES ASSIGNS IMPLICITES...
         WORD        XXLOC0          < SEMLOC.
         DZS         LSEM
         WORD        NIL             < TETE DE LA FILE D'ATTENTE SUR 'DKU',
         WORD        NIL             < QUEUE DE LA FILE D'ATTENTE SUR 'DKU'.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLDKU          < HANDLER SPECIFIQUE DE GESTION DES
                                     < ECHANGES 'DKU' ET DU SYSTEME DE TELEVI-
                                     < SION NUMERIQUE BASSE DEFINITION.
         WORD        ITDKU           < SOUS-PROGRAMME SPECIFIQUE DES GESTION
                                     < DES INTERRUPTIONS DE 'DKU'.
         WORD        K;K             < ETAT.
         WORD        COSBT?B0SIT=FMASK(K=FCINST < BITSEM.
         WORD        XXDK4;TRYDKU    < NTRIES ET FRTRY.
         WORD        K               < HSTATS.
XWOR%2:  VAL         2
         WORD        XWOR%2*DKCMS4   < TESTO#0 : TIME-OUT A TESTER.
XWOR%1:  VAL         COSBT?FONTV=FMASK(K?XXDK5=FCINST
XWOR%9:  VAL         FGR?FGW=K
XWOR%9:  VAL         NBITMO-B-XWOR%9 < BIT DISCRIMINANT UNE LECTURE D'UNE
                                     < ECRITURE.
XWOR%8:  VAL         4               < POUR GENERER 'FONTVR' ET 'FONTVW'.
FONTVR:: VAL         CORBT?XWOR%9=FMASK(K?XWOR%8=FCINST
                                     < FONCTION SPECIALE DE TRANSFERT DIRECT
                                     < DE 'DKU' VERS LA MEMOIRE RAPIDE DE
                                     < VISUALISATION...
                                     < 'FONTVR' DOIT ETRE UNE LECTURE.
         IF          FONTVR(MASSFF-FGX,,,XEIF%
         IF          ATTENTION : POUR EVITER DE FACHEUSEUSES VALIDATIONS
         IF          DANS 'HDLSVC', IL FAUT QUE 'FONTVR' SOIT UNE FAUSSE
         IF          ENTREE-SORTIE !!!
XEIF%:   VAL         ENDIF
XWOR%1:  VAL         COSBT?FONTVR=FMASK(K?XWOR%1=FCINST
FONTVW:: VAL         COSBT?XWOR%9=FMASK(K?XWOR%8=FCINST
                                     < FONCTION SPECIALE DE TRANSFERT DIRECT
                                     < DE LA MEMOIRE RAPIDE DE VISUALISATION
                                     < VERS 'DKU'...
                                     < 'FONTVW' DOIT ETRE UNE ECRITURE.
         IF          FONTVW(MASSFF-FGX,,,XEIF%
         IF          ATTENTION : POUR EVITER LES VALIDATIONS DE 'SVC'
         IF          'FONTVW' DOIT ETRE UNE FAUSSE ENTREE-SORTIE !!!
XEIF%:   VAL         ENDIF
XWOR%1:  VAL         COSBT?FONTVW=FMASK(K?XWOR%1=FCINST
XWOR%5:  VAL         COSBT?XBITQ=FMASK(K?FONTVR=FCINST
XWOR%6:  VAL         COSBT?XBITQ=FMASK(K?FONTVW=FCINST
XWOR%1:  VAL         COSBT?XWOR%5=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?XWOR%6=FMASK(K?XWOR%1=FCINST
         WORD        XWOR%1          < LISTE DES FONCTIONS RECONNUES.
EDKUX1:  EQU         $               < POUR DEFINIR DES INSTRUCTIONS EN AVANT :
<*******************************************************************************
         LAI         FONTVR
XWOR%1:  VAL         '0000000@@@@    < RECUPERATION DU CODE GENERE...
<*******************************************************************************
LAFTVR:  EQU         ZERO+XWOR%1     < INSTRUCTION 'LAI FONTVR'.
L1FTVR:  EQU         LAFTVR          < A CAUSE DE L'ASSEMBLEUR...
L2FTVR:  EQU         LAFTVR          < A CAUSE DE L'ASSEMBLEUR...
<*******************************************************************************
         LAI         FONTVW
XWOR%1:  VAL         '0000000@@@@    < RECUPERATION DU CODE GENERE...
<*******************************************************************************
LAFTVW:  EQU         ZERO+XWOR%1     < INSTRUCTION 'LAI FONTVW'.
<*******************************************************************************
         CPI         FONTVR
XWOR%1:  VAL         '0000000@@@@    < RECUPERATION DU CODE GENERE...
<*******************************************************************************
CPFTVR:  EQU         ZERO+XWOR%1     < INSTRUCTION 'CPI FONTVR'.
<*******************************************************************************
         CPI         FONTVW
XWOR%1:  VAL         '0000000@@@@    < RECUPERATION DU CODE GENERE...
<*******************************************************************************
CPFTVW:  EQU         ZERO+XWOR%1     < INSTRUCTION 'CPI FONTVW'.
         $EQU        EDKUX1          < ANNULATION DU CODE GENERE...
XWOR%1:  VAL         XXDK6           < INITIALISATION...
XWOR%1:  VAL         CORBT?FONTVR=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         CORBT?FONTVW=FMASK(K?XWOR%1=FCINST
XWOR%5:  VAL         COSBT?XBITQ=FMASK(K?FONTVR=FCINST
XWOR%6:  VAL         COSBT?XBITQ=FMASK(K?FONTVW=FCINST
XWOR%1:  VAL         CORBT?XWOR%5=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         CORBT?XWOR%6=FMASK(K?XWOR%1=FCINST
                                     < A T T E N T I O N  : 'FONTVR' ET
                                     < 'FONTVW' DOIVENT (PROVISOIREMENT ???)
                                     < S'EXECUTER EN MEMOIRE BASSE ; EN EFFET
                                     < DANS LE CAS CONTRAIRE, A CHAQUE 'SVC'
                                     < SUIVANT QUE L'UTILISATEUR EST EN BAS
                                     < OU EN HAUT, IL N'A PAS, OU IL A, DE
                                     < HANDLER DE SERVICE ; S'IL EST EN BAS,
                                     < LE HANDLER DE SERVICE QU'ON LUI ALLOUE
                                     < RECOIT LA DEFINITION DE LA 'CDA' COURAN-
                                     < TE, PAR CONTRE S'IL EN POSSEDE DEJA UN
                                     < ON NE FAIT QUE LE RE-ACTIVER, SANS LUI
                                     < COMMUNIQUER AUCUN ARGUMENTS (VIA UNE
                                     < DEMANDE DE SERIVES) : IL NE RECOIT DONC
                                     < PAS LA DEFINITION DE LA 'CDA' COURANTE...
XWOR%1:  VAL         CORBT?FONTV=FMASK(K?XWOR%1=FCINST
                                     < A T T E N T I O N : 'FONTV' NE DOIT
                                     < ABSOLUMENT PAS S'EXECUTER EN MEMOIRE
                                     < HAUTE ; EN EFFET, ELLE UTILISE TROP LA
                                     < BASE 'C' POUR REFERENCER LES LISTES
                                     < DE POINTS LORS DE L'INTERPOLATION...
         WORD        XWOR%1          < DCTFUP ("ALTITUDES" DES FONCTIONS).
<*******************************************************************************
XWOR%F:  VAL         FONTV
FONTV:  @VAL         '0@@@@          < FONCTION D'ACCES A LA TELEVISION 256.
         CALL        #SISP CMS5 GEN CTE#
<*******************************************************************************
<*******************************************************************************
XWOR%F:  VAL         FONTVR
FONTVR: @VAL         '0@@@@          < TRANSFERT 'DKU' --> 'MEMTV'.
         CALL        #SISP CMS5 GEN CTE#
<*******************************************************************************
<*******************************************************************************
XWOR%F:  VAL         FONTVW
FONTVW: @VAL         '0@@@@          < TRANSFERT 'MEMTV' --> 'DKU'.
         CALL        #SISP CMS5 GEN CTE#
<*******************************************************************************
<*******************************************************************************
XWOR%F:  VAL         XBITQ
XBITQ:  @VAL         '0@@@@          < BIT DISCRIMINANT LE QUANTA D'ACCES 'DKU'.
         CALL        #SISP CMS5 GEN CTE#
<*******************************************************************************
<
<
<        Z O N E   V A R I A B L E  :
<
<
VARDKU:  EQU         $
         IF          VARDKU-DCTDKU-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
< OPERANDES DES 'SIO' :
<
         WORD        ACDKU?FPHCME
         WORD        ACDKU?FPHCMD
         WORD        ACDKU?FPHETA
         WORD        ACDKU?FPHETB
         WORD        ACDKU
<
< 'CCB' DE 'DKU' :
<
         WORD        COSBT?CCBDKM=FMASK(K=FCINST
                                     < 'DSYNC0'.
         WORD        K               < 'CCDKN2'.
         WORD        COSBT?CCBDKM=FMASK(K=FCINST
         BYTE        CCBHDC?XSNDKU;XXDK3 < MOT1.
         WORD        NIL             < MOT2 : ADRESSE-MOT DU BUFFER,
         WORD        NILK            < MOT3 : LONGUEUR-MOTS DU BUFFER.
         WORD        ACDKU
         WORD        NILK            < MOT5 : 'HEADER 1' DU PREMIER SECTEUR.
<
< AUTRES INFORMATIONS (CF. 'DKM') :
<
         WORD        XXDK2           < LONGUEUR MAXIMALE D'UN ECHANGE.
         WORD        SPDKU           < DETECTION DES MEMOIRES INEXISTANTES...
         WORD        K               < INDICATEUR DE "SUITE".
         WORD        NILK            < NUMERO DE CYLINDRE.
         WORD        NILK            < NUMERO DE PISTE.
         WORD        NILK            < NUMERO DE SECTEUR.
XWOR%1:  VAL         XDKMSP          < NOMBRE DE SECTEURS PAR PISTE.
XWOR%2:  VAL         XWOR%1/QUANTA   < NOMBRE DE QUANTUM PAR PISTE.
XWOR%3:  VAL         XWOR%2*QUANTA-XWOR%1
         IF          -XWOR%3,,XEIF%,
         IF          A T T E N T I O N  : 'QUANTA' NE DIVISE
         IF          PAS EXACTEMENT LE NOMBRE DE SECTEURS
         IF          PAR PISTE !!!
XEIF%:   VAL         ENDIF
         WORD        XWOR%2          < NOMBRE DE "SECTEURS" PAR PISTE.
         WORD        XWOR%1          < NOMRE REEL DE SECTEURS PAR PISTE.
         WORD        K               < VALIDATION NUMERO 1ER SECTEUR.
         WORD        XDKMPC
         WORD        NAXCYL          < DERNIER CYLINDRE.
         WORD        QUANTA
         WORD        YY8Q
         WORD        TVDKU,X         < ACCES A LA TABLE DE VIRTUALISATION.
         WORD        XXNHDC          < INDICATEUR D'ALLOCATION DE JEUX.
LOSDKU:: VAL         LOSDKM          < LONGUEUR EN MOTS DE LA LISTE DES
                                     < GROUPES DE CYLINDRES APPROPRIES.
         DZS         LOSDKU          < 'LSDK' : LISTE DES GROUPES DE 'NCYLP'
                                     < CYLINDRES APPROPRIES A DES UTILISATEURS
                                     < VIA 'LUDKU' DANS 'DCTESC'.
         WORD        TASQU,X         < ACCES A LA LISTE DES TRANSLATIONS DES
                                     < ADRESSES EN Q=1.
<
<
<        Z O N E   S P E C I F I Q U E   ' D K U '
<
<
WARDKU:  EQU         $
XWOR%1:  VAL         WARDKM-DCTDKM
XWOR%2:  VAL         WARDKU-DCTDKU
         IF          XWOR%1-XWOR%2,,XEIF%,
         IF          ATTENTION : UNE DES DEUX 'DCT' ('DKM' OU 'DKU')
         IF          EST MAL IMPLANTEE !!!
XEIF%:   VAL         ENDIF
<
<
<        E X T E N S I O N   D E S   A C C E S   ' C D A '  :
<
<
         WORD        TWOED
ATWOED:: VAL         $-D-VARDKU      < IL S'AGIT EN FAIT D'UN RELAI DE RELAI,
                                     < CAR, EN EFFET, LORSQUE LE SOUS-PROGRAMME
                                     < 'TWOE' EST NECESSAIRE POUR 'DKU', LA
                                     < BASE 'C' EST EN GENERAL MAUVAISE...
<
<
<        A C C E S   A U   V O L U M E  :
<
<
         WORD        BVOLU
ABVOLU:: VAL         $-D-VARDKU      < ADRESSE DU BUFFER CONTENANT LE DESCRIP-
                                     < TEUR DU VOLUME COURANT MONTE SUR 'DKU',
                                     < LORSQU'IL EST LA, ET CONTENANT DONC DES
                                     < INDICATEURS SUR LA PRESENCE EFFECTIVE
                                     < D'UN VOLUME...
<
<
<        I N T E R P O L A T I O N   B A S S E   D E F I N I T I O N  :
<
<
<
< DEFINITION DE LA LUTTE ANTI-ALIASING :
<
DIMAL1:: VAL         W               < GESTION MONO-DIMENSIONNELLE DE L'ANTI-
                                     < ALIASING,
DIMAL2:: VAL         DIMAL1+I        < ET GESTION BI-DIMENSIONNELLE (ELLE DONNE
                                     < DE MOINS BONS RESULTATS, MAIS COMME J'AI
                                     < BEAUCOUP PEINE POUR LE PROGRAMMER, JE NE
                                     < PEUX ME RESOUDRE A L'ELIMINER...).
DIMALI:: VAL         DIMAL1          < DIMENSION DE LA LUTTE ANTI-ALIASING
                                     < COURANTE...
<
< NIVEAU DE GRIS MAXIMUM :
<
NIVMAX:: VAL         BIT>XNCOOL-N    < NIVEAU DE GRIS MAXIMUM DES COULEURS.
<
< FORMAT DE L'EN-TETE D'UNE IMAGE
< LORSQU'UNE INTERPOLATION ENTRE
< DEUX POINTS EST DEMANDEE :
<
<*******************************************************************************
XWOR%1:  VAL         K-D             < INITIALISATION...
DKMTCO:: MOT         '0@@@@+D        < MOT BIDON DESTINE AU BLOC FLOTTANT
                                     < QUI ECRASE LE MOT D'ADRESSE (C)-'DEPCS' ;
                                     < MAIS, A T T E N T I O N  : PAR MANQUE
                                     < DE PLACE, 'DKMTCO' EST MAINTENANT UTI-
                                     < LISE POUR TRANSMETTRE LE CHAMP 'DKMLCOL'
                                     < DONNANT LES NIVEAUX DE GRIS, QUI S'ILS
                                     < SONT RENCONTRES LORS DU MARQUAGE D'UN
                                     < POINT AVEC NIVEAU DE GRIS DOIVENT
                                     < RESTER INTACTS, QUELQUE SOIT LE MODE
                                     < DEMANDE...
DKMTMO:: MOT         '0@@@@+D        < MODE DU TRACE : VOIR 'DKMTSB'/'DKMTRB' ;
                                     < MAIS ATTENTION,DANS LE CAS DU TRACE
                                     < AVEC NIVEAU DE GRIS, 'DKMTMO' A LE
                                     < FORMAT DECRIT PLUS LOIN...
DKMTY1:: MOT         '0@@@@+D        < COORDONNEE Y1,
DKMTC::  MOT         DKMTY1          < LISTE DES COORDONNEES (FORMAT 'TV').
DKMTX1:: MOT         '0@@@@+D        < COORDONNEE X1 DU PREMIER POINT,
DKMTY2:: MOT         '0@@@@+D        < COORDONNEE Y2,
DKMTX2:: MOT         '0@@@@+D        < COORDONNEE X2 DU DEUXIEME POINT.
DKMGY1:: MOT         '0@@@@+D        < COORDONNEE Y1,
DKMGC::  MOT         DKMGY1          < LISTE DES COORDONNEES (FORMAT 'VISU').
DKMGX1:: MOT         '0@@@@+D        < COORDONNEE X1 DU PREMIER POINT,
DKMGY2:: MOT         '0@@@@+D        < COORDONNEE Y2,
DKMGX2:: MOT         '0@@@@+D        < COORDONNEE X2 DU DEUXIEME POINT.
DKMTXY:: VAL         '0@@@@+D        < LONGUEUR DE L'EN-TETE...
<*******************************************************************************
DKMTNP:: VAL         2               < NOMBRE DE POINTS DEFINISSANT UN SEGMENT.
         IF          XXVXY*DKMTNP-DKMTXY+DKMGC,,XEIF%,
         IF          ATTENTION : LA LISTE DES COORDONNEES EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
DKMTNS:: VAL         2               < IL Y A DEUX SEGMENTS : LE SEGMENT ARGU-
                                     < MENT EN FORMAT GRAPHIQUE OU 'VISU' BAPTI-
                                     < SE 'DKMG', LE SECOND EN FORMAT 'TV',
                                     < RENVOYE A L'UTILISATEUR APPELE 'DKMT'.
         IF          XXVXY*DKMTNP*DKMTNS-DKMTXY+DKMTC,,XEIF%,
         IF          ATTENTION : LE FORMAT DES SEGMENTS EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
<
< FORMAT DE 'DKMTCO' :
<
XWOR%1:  VAL         K
         DO          NIVMAX+Z
XWOR%1:  VAL         XWOR%1>BIT?BIT
XWOR%2:  VAL         CODBT=FMASK(K?XWOR%1=FCINST)XWOR%1
DKMLCO:: VAL         XWOR%1>XWOR%2   < CHAMP DONNANT POUR CHAQUE NIVEAU DE
                                     < GRIS L'INDICATION SUIVANTE : FAUT-IL
                                     < MARQUER CE POINT SI NIVEAU EST PRESENT
                                     < ANTERIEUREMENT (LE BIT DE RANG 'I' EST
                                     < ASSOCIE AU NIVEAU DE RANG 'I')...
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
DKMPOI:: VAL         MOCD            < DEFINITION D'UNE PATTERN DE POINTILLES
                                     < SUR 8 BITS ; CECI N'EST POSSIBLE QUE
                                     < SI LA LUTTE ANTI-ALIASING EST MONO-
                                     < DIMENSIONNELLE, ET CECI POUR DES RAISONS
                                     < D'ENCOMBREMENT MEMOIRE...
         IF          DKMLCO(DKMPOI-K,,XEIF%,
         IF          ATTENTION : IL Y A UN RECOUVREMENT ENTRE LES
         IF          2 CHAMPS 'DKMLCO' ET 'DKMPOI' !!!
XEIF%:   VAL         ENDIF
BDKMPO:: VAL         BITSIG          < BIT A TESTER SUR LA PATTERN CYCLIQUE
                                     < 'MDKMPO' POUR SAVOIR SI L'ON TRACE (=0)
                                     < OU PAS (=1) ; CES CONVENTIONS INVERSEES
                                     < SONT CHOISIES POUR DES RAISONS DE COM-
                                     < PATIBILITE ANTERIEURE...
XEIF%1:  VAL         ENDIF
<
< MODE DE TRACE :
<
DKMTSB:: VAL         EXIST           < MODE 'SBT',
DKMTRB:: VAL         NEXIST          < MODE 'RBT',
DKMTIB:: VAL         -DKMTRB-DKMTSB  < MODE 'IBT'.
<
< FORMAT DE 'DKMTMO' LORSQUE DES
< NIVEAUX DE GRIS SONT DEMANDES :
<
DKMSRI:: VAL         MOCG            < DONNE LE MODE DE TRACE (VOIR 'DKMTSB',
                                     < 'DKMTRB'...).
DKMNIV:: VAL         M000F           < DONNE LE NIVEAU DE GRIS DEMANDE :
                                     < ANTIAL : MODE ANTI-ALIASING,
                                     < 0-NIVMAX : NIVEAU DE GRIS FORCE.
DKMDEC:: VAL         M007F)DKMNIV    < DONNE DE 0 A XNCOOL LE DECALAGE A
                                     < DROITE A APPLIQUER AU NIVEAU ANTERIEUR
                                     < DU POINT COURANT AVANT L'OPERATION
                                     < LOGIQUE AVEC LE NOUVEAU NIVEAU...
DKBDEC:: VAL         CODBT=FMASK(K?DKMDEC=FCINST)DKMDEC
                                     < BIT DE 'DKMDEC' INDIQUANT S'IL EST
                                     < NECESSAIRE DE TESTER A L'AIDE DE 'DKMLCO'
                                     < LE NIVEAU ANTERIEUR DE CHAQUE POINT.
XWOR%2:  VAL         DKMDEC=K
XWOR%2:  VAL         -XWOR%2
XWOR%1:  VAL         CORBT?DKBDEC=FMASK(K?DKMDEC=FCINST>XWOR%2
         IF          XWOR%1-XNCOOL,,XEIF%,XEIF%
         IF          'DKMDEC' EST TROP PETIT POUR CONTENIR UN DECALAGE
         IF          PERMETTANT DE MANIPULER 'XNIVMAX'+Z COULEURS, ET
         IF          LE BIT 'DKBDEC' !!!
XEIF%:   VAL         ENDIF
ANTIAL:: VAL         NIVMAX+I        < NIVEAU DE GRIS A DONNER POUR FORCER
                                     < LE MODE ANTI-ALIASING.
DKMOBA:: VAL         DKMSRI?DKMDEC?DKMNIV)MMOT
                                     < INDIQUE OU DOIT SE FAIRE LE TRACE :
                                     < 0 : DANS LA MEMOIRE UTILISATEUR,
                                     < 1 : DANS 'MEMTV'.
<
< DISCRIMINATION LOGIQUE FLOUE
< ET LOGIQUE BINAIRE :
<
XWOR%1:  VAL         DKMSRI=K
XWOR%2:  VAL         NBITMO-B-XWOR%1 < DERNIER BIT DU CHAMP 'DKMSRI',
DKLOGD:: VAL         XWOR%2-I        < BIT ARGUMENT DISCRIMINATEUR DE LA LOGIQUE
                                     < FLOUE ET DE LA LOGIQUE BINAIRE.
DKLOGF:: VAL         DKLOGD-I        < BIT DONNANT LA VALEUR DE 'DKLOGD' DANS
                                     < LE CAS DE LA LOGIQUE FLOUE ; DONC :
                                     < 'DKLOGD'='DKLOGF' ==> LOGIQUE FLOUE,
                                     < 'DKLOGD'#'DKLOGF' ==> LOGIQUE BINAIRE.
DKLODD:: VAL         DKLOGD+XWOR%1   < IDEM A 'DKLOGD', MAIS 'DKMSRI' ETANT
                                     < CADRE A DROITE,
DKLODF:: VAL         DKLOGF+XWOR%1   < DE MEME POUR 'DKLOGF'...
XWOR%3:  VAL         DKMTSB=K
XWOR%3:  VAL         NBITMO-B-XWOR%3 < DERNIER BIT DE 'DKMTSB'...
         IF          XWOR%3-DKLODD,,,XEIF%
         IF          ATTENTION : LA POSITION DE 'DKLOGD' EST MAUVAISE
         IF          SI L'ON VEUT UNE COMPATIBILTE AVEC LES VERSIONS
         IF          ANTERIEURES DE CMS5 ET DES PROGRAMMES !!!
XEIF%:   VAL         ENDIF
         IF          XWOR%3-DKLODF,,,XEIF%
         IF          ATTENTION : IDEM, 'DKLOGF' EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
<
< DONNEES DE L'INTERPOLATION ((X1,Y1),(X2,Y2)) :
<
         WORD        NILK
DKMTDX:: VAL         $-D-VARDKU      < DELTAX=ABS(X2-X1).
         WORD        NILK
DKMTDY:: VAL         $-D-VARDKU      < DELTAY=ABS(Y2-Y1).
DKMTDF:: VAL         $-VARDKU        < DELTAX EXPRIME EN FLOTTANT...
         FLOAT       0 : FORTE PENTE (ANGLE > PI/4),
                                     < <0 : DROITE VERTICALE.
         WORD        INFINI
DKMINF:: VAL         $-D-VARDKU      < RELAI D'ACCES A 'INFINI' ; EN EFFET LA
                                     < BASE 'C' EST MAUVAISE LORS DE L'INTER-
                                     < POLATION, QU'EST-CE QU'IL NE FAUT PAS
                                     < FAIRE !!!
         WORD        NILK
DKMRNA:: VAL         $-D-VARDKU      < CE MOT EST A LA FOIS ARGUMENT ET RESUL-
                                     < TAT DE 'DKMTP1' :
                                     < 1 - ARGUMENT :
                                     <     =0 : TRACER LE POINT ARGUMENT,
                                     <     #0 : NE FAIRE QUE RECUPERER LE
                                     <          NIVEAU ANTERIEUR DU POINT.
                                     < 2 - RESULTAT : IL DONNE LE NIVEAU ANTE-
                                     <     RIEUR DU POINT COURANT.
         WORD        NILK
DKPOIN:: VAL         $-D-VARDKU      < INDICATEUR UTILISE PAR 'DKMTP2' PERMET-
                                     < TANT DE SAVOIR S'IL S'AGIT D'UN POINT
                                     < (ISOLE OU D'EXTREMITE) OU PAS :
                                     < #0 : POINT ISOLE,
                                     < =0 : POINT D'UN VECTEUR.
                                     < A T T E N T I O N  : 'DKPOIN' EST UTILI-
                                     < SE POUR TRANSMETTRE LE 'CODEM' ENTRE
                                     < 'DKMTV1' ET 'DKMTV5' PUISQUE LA BASE
                                     < 'W' NE POINTE PLUS LA DEMANDE COURANTE.
XEIF%1:  VAL         ENDIF
<
< SOUS-PROGRAMMES NECESSAIRES :
<
         WORD        DKMTV5
DKMTA5:: VAL         $-D-VARDKU      < RELAI VERS 'DKMTV5'.
         WORD        DKMTP1
DKMTA1:: VAL         $-D-VARDKU      < TRACE D'UN POINT DONNE PAR SES
                                     < COORDONNEES ENTIERES,
         WORD        DKMTP2
DKMTA2:: VAL         $-D-VARDKU      < TRACE DU POINT COURANT DONNE PAR
                                     < SES COORDONNEES FLOTTANTES.
         WORD        DKMTP4
DKMTA4:: VAL         $-D-VARDKU      < SOUS-PROGRAMME DE CHOIX DU NIVEAU DE
                                     < GRIS D'UN POINT, ET DE SON TRACE.
         WORD        DKMTP3
DKMTA3:: VAL         $-D-VARDKU      < "ARRONDI" D'UN NOMBRE FLOTTANT...
         WORD        DKMTP6
DKMTA6:: VAL         $-D-VARDKU      < SOUS-PROGRAMME FAISANT UN 'LOAD' OU UN
                                     < 'STORE' SUR UN MOT DE L'IMAGE, EN FONC-
                                     < TION DE L'INDICATEUR 'DKMOBA'.
<
< CONSTANTES DEFINISSANT L'IMAGE :
<
XWOR%2:  VAL         XC256-Z
DKMTNC:: VAL         XWOR%2          < NOMBRE DE COLONNES PAR LIGNE.
XWOR%2:  VAL         XC256/NBITMO
DKMTNM:: VAL         XWOR%2          < NOMBRE DE MOTS MEMOIRE PAR LIGNE.
         WORD        XL256-Z
DKMTNL:: VAL         $-D-VARDKU      < NOMBRE DE LIGNES EN PARTANT DE 0
                                     < SUR UNE IMAGE DE 'TV'.
XXDEDX:: VAL         XXVD4/XC256=K   < REDUCTION SUR L'AXE DES 'X',
XXDEDY:: VAL         XXVD4/XL256=K   < REDUCTION SUR L'AXE DES 'Y'.
         WORD        NILK
DKMTRS:: VAL         $-D-VARDKU      < MODE 'SBT'/'RBT' DU TRACE...
         WORD        TVLIMA*LK*NOCMO
DKMLI1:: VAL         $-D-VARDKU      < LONGUEUR EN OCTETS D'UNE TRAME SIMPLE.
         WORD        TVLIMA*LK*XNCOOL+DKMTXY*NOCMO
DKMLI3:: VAL         $-D-VARDKU      < LONGUEUR EN OCTETS DES TRAMES AVEC
                                     < INTERPOLATION AVEC NIVEAUX DE GRIS.
<
<
<        Z O N E   S P E C I F I Q U E   D E   T R A N S F E R T
<        R A P I D E  :  ' D K U '  -->  M E M T V  :
<
<
XWOR%2:  VAL         NOCMO=K-DADR    < POUR CONVERTIR AVEC DES PERTES DES
                                     < ADRESSES DE LADR-MOTS EN ADRESSES
                                     < D'OCTETS...
MEMTVQ:: VAL         MEMTV0>XWOR%2
         IF          MEMTVQ-K,,XEIF%,
         WORD        MEMTVQ
DKMTM0:: VAL         $-D-VARDKU      < ADRESSE-OCTETS RELATIVES DE 'MEMTV0'.
XEIF%:   VAL         ENDIF
DKMTMR:: VAL         MEMTVR>XWOR%2   < ADRESSE-OCTETS RELATIVE A 'MEMTV'
                                     < DU PREMIER MOT INEXISTANT DANS LA
                                     < MEMOIRE DE TAILLE 'RTLIMA'...
         IF          DKMTMR-K,,XEIF%,XEIF%
         IF          ATTENTION : LES TESTS FAITS A L'AIDE DE 'DKMTME'
         IF          SONT MAL PROGRAMMES !!!
XEIF%:   VAL         ENDIF
         IF          DKMTMR-K,,XEIF%,
         WORD        DKMTMR
DKMTME:: VAL         $-D-VARDKU      < ADRESSE OCTETS RELATIVE DE 'MEMTVR'.
XEIF%:   VAL         ENDIF
XWOR%1:  VAL         -DADR           < POUR UN DECALAGE A GAUCHE...
         IF          MEMTVE-MEMTV0>XWOR%1-XXDK2,XEIF%,XEIF%,
         IF          ATTENTION : ON NE PEUT EN UNE SEULE OPERATION
         IF          ECHANGER LES 3 COMPOSANTES CHROMATIQUES !!!
XEIF%:   VAL         ENDIF
         WORD        DKM2
ADKM2::  VAL         $-D-VARDKU      < SORTIE IMMEDIATE LORSQUE LE SYSTEME
                                     < DE TEEVISION EST ABSENT...
         WORD        ERDKM3
ADKM3::  VAL         $-D-VARDKU      < TRAITEMENT DES ERREURS DES TRANSFERTS
                                     < RAPIDES...
<
< DONNEES DE TRANSFERT ENTRELACE DES TRAMES :
<
XLBKTV:: VAL         16              < ON CHOISIT DES BLOCS RELATIVEMENT PETITS.
XWOR%1:  VAL         XLBKTV=K
         IF          BIT>XWOR%1-XLBKTV,,XEIF%,
         IF          ATTENTION : 'XLBKTV' AFIN DE DIVISER LA LONGUEUR
         IF          DES TRAMES DOIT ETRE DE PREFERENCE UNE PUISSANCE DE 2 !!!
XEIF%:   VAL         ENDIF
ALBKTV:  WORD        XLBKTV
DKMLBK:: VAL         $-D-VARDKU      < LONGUEUR DES BLOCS DE MOTS INSEPARA-
                                     < BLES DANS LES TRAMES DE CHAQUE COU-
                                     < LEUR PRIMAIRE...
         WORD        LINHIB
ALINHI:: VAL         $-D-VARDKU      < RELAI D'ACCES A LA LISTE DES AUTORISA-
                                     < TIONS/INHIBITIONS DES BLOCS ENTRELACES ;
                                     < LE BIT D'INDEXATION SIGNIFIE :
                                     < BITX=0 : CE DISPOSITIF EST IGNORE (AFIN
                                     <          D'OPTIMISER LES TRANSFERTS) ;
                                     <          REMARQUONS QUE DANS CE CAS,
                                     <          TOUS LES BLOCS SONT AUTORISES.
                                     < BITX=1 : CE DISPOSITIF EST ACTIF...
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
<
< CONSTANTE D'EXCES OU DE DEFAUT :
< (ELLE EST MISE ICI, EN BOUT DE 'DCTDKU',
< DE FACON A ECONOMISER UN MOT AU NIVEAU
< DE L'ADRESSAGE A L'AIDE DE LA BASE 'L' ;
< EN EFFET, SEUL LE PREMIER MOT D'UN
< NOMBRE FLOTTANT SE DOIT D'ETRE ADRES-
< SABLE)
<
DKMT05:: VAL         $-VARDKU        < CONSTANTE D'EXCES OU DE DEFAUT...
         FLOAT       XWOR%6-XXLTV,,XEIF%,
         IF          ATTENTION : LA LONGUEUR DE LA ZONE D'ENTRELACAGE DES
         IF          IMAGES EST INSUFFISANTE !!!
XEIF%:   VAL         ENDIF
         CP          ARGDEM+CODEM    < L'IMAGE EST-ELLE COMPLETE ???
         JNE         DKUTT7          < NON, DONC PAS D'ENTRELACAGE...
         CPZ         ARGDEM+AMDEM    < EST-CE BIEN 'MEMTV0' QUI EST CONCERNEE
                                     < PAR CET ECHANGE ???
         JNE         DKUTT7          < NON, OU BIEN ELLE EST DECALEE ; ON REFUSE
                                     < L'ENTRELACAGE...
         IF          MEMTVQ-K,,XEIF%,
         IF          ATTENTION : LE TEST PRECEDENT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         PSR         W
         CALL        #SISP CMS5 W ZERO#
                                     < (W)=BASE LA MEMOIRE DEBANALISEE :
         LA          TVENTR-ZERO,W   < (A)=ADRESSE-MOT DE LA ZONE D'ENTRELACAGE,
         PLR         W
         STA         ARGDEM+AMDEM    < ET ON MODIFIE 'AMDEM' QUI DESIGNE DESOR-
                                     < MAIS LA ZONE D'ENTRELACAGE ; ON POURRA
                                     < REGENERER 'AMDEM' EN SORTIE PUISQU'IL
                                     < NUL A L'ENTREE...
         LA          NSPTYP
         SBT         TYPAD           < ET IL FAUT FAIRE CROIRE QU'UNE ADRESSE
         STA         NSPTYP          < A ETE FOURNIE...
DKUTT7:  EQU         $
<
< TRAITEMENT COMMUN 'FONTVR'/'FONTVW' :
<
<*******************************************************************************
DKMTQ3:  LX          VAR+LSDK        < (X)=LISTE DES GROUPES APPROPRIES...
XWOR%1:  VAL         '0000000@@@@    < RECUPERATION DU 'LX LSDK'...
<*******************************************************************************
LXLSDK:  EQU         ZERO+XWOR%1     < AFIN D'UTILISER CETTE INSTRUCTION
                                     < DANS 'HDLSCH' EN REFERENCE EN AVANT...
         $EQU        DKMTQ3          < ET ANNULATION DU CODE GENERE...
DKUTT6:  EQU         $
         LA          NSPTYP
         TBT         VBOX            < LA DEMANDE COURANTE A-T'ELLE UNE 'BOX' ?
         JNC         DKMTQ2          < NON, PAS DE TEST DE BLOCAGE...
         LA          BOX             < OUI :
         EOR         VAR+LSDK        < ON FAIT UN .EOR. ENTRE LA LISTE DES
                                     < APPROPRIATIONS PARTIELLES ('BOX') ET
                                     < LA LISTE DES APPROPRIATIONS GENERALES
                                     < ('LSDK') :
         TBT         BLDKTV          < ON TESTE LE DERNIER GROUPE DE CYLINDRES
                                     < QUI PROTEGE AUSSI L'ACCES A 'MEMTV' :
         JC          DKUTT5          < ERREUR, L'ACCES EST INTERDIT POUR CE
                                     < DEMANDEUR : BOX=0 ET LSDK=1 (L'AUTRE
                                     < CONFIGURATION DE BITS (1 ET 0) ETANT
                                     < IMPOSSIBLE...
DKMTQ2:  EQU         $               < PAS DE TEST NECESSAIRE, OU BIEN
                                     < (BOX)=LSDK : ACCES LIBRE (=0), OU BIEN
                                     <       RESERVE A CE DEMANDEUR (=1)...
         LA          ETASYS          < OUI,
         TBT         TVEXIS          < ALORS LA 'TV' EXISTE-T'ELLE ???
         JC          DKUTT3          < OUI, C'EST BON...
         BR          VAR+ADKM2       < NON, ON FAIT UNE SORTIE IMMEDIATE...
DKUTT3:  EQU         $
<
<        NOTA IMPORTANT :
<                      ON NE FAIT PLUS L'OPERATION
<                    SUIVANTE :
<                    DSYNC0 <-- (DSYNC0).OR.'XEXATV'
<                    CAR EN EFFET, (SLO,SLE) SONT
<                    POSITIONNES DE FACON A ENCADRER
<                    LA 'CDA' COURANTE DE L'UTILISATEUR
<                    DEMANDEUR...
<
         LA          NSPTYP
         TBT         TYPAD           < TYPE DE 'AMDEM' ???
         JC          DKUTT2          < DE MOTS, IL S'AGIT DONC DE L'ENTRELACAGE,
                                     < ON NE FAIT DONC AUCUNE VERIFICATION, NI
                                     < AUCUNE TRANSLATION...
         LA          ARGDEM+AMDEM    < ADRESSE RELATIVE A 'MEMTV' DESIREE...
         IF          DKMTMR-K,,XEIF%,
         JAL         DKUTT5          < ERREUR...
XEIF%:   VAL         ENDIF
         IF          MEMTVQ-K,,XEIF%,
         AD          VAR+DKMTM0      < ON TRANSLATE,
         STA         ARGDEM+AMDEM    < ET ON MODIFIE 'AMDEM' !!!
XEIF%:   VAL         ENDIF
         IF          DKMTMR-K,,XEIF%,
         AD          ARGDEM+CODEM    < ADRESSE DU PREMIER MOT NON ECHANGE,
         CP          VAR+DKMTME      < VALIDATION...
         JG          DKUTT5          < ERREUR, VIOLATION...
XEIF%:   VAL         ENDIF
DKUTT2:  EQU         $
<
< VERS LE TRAITEMENT DE L'ECHANGE :
<
         LRM         A
         WORD        DKM50           < (A)=ADRESSE DE TRAITEMENT DE L'ECHANGE.
         PSR         A               < CETTE METHODE ME PERMET DE GAGNER UN MOT
                                     < DANS LA 'DCTDKU'...
         RSR                         < VERS LE TRAITEMENT DE L'ECHANGE...
<
< SORTIE EN ERREUR :
<
DKUTT5:  EQU         $
         BR          VAR+ADKM3
         PAGE
<
<
<        T R A C E   D U   P O I N T   ( X 1 , Y 1 )  :
<
<
<        ARGUMENT :
<                    DKMTX1,DKMTY1=COORDONNEES ENTIERES DU POINT A TRACER.
<                    DKMRNA=0 : TRACER LE POINT ARGUMENT,
<                          #0 : RENVOYER UNIQUEMENT LE NIVEAU ANTERIEUR
<                               DU POINT COURANT.
<
<
<        RESULTAT :
<                    DKMRNA=NIVEAU ANTERIEUR DU POINT DANS TOUS LES CAS.
<
<
DKMTP1:  EQU         $
         PSR         A,B,X           < SAUVEGARDES.
         PSR         C,W
<
< LE POINT (X1,Y1) EST-IL DANS L'ECRAN ???
<
         LA          DKMTX1-DEPCS,C  < COORDONNEE X1 :
         JAL         AKMTV9          < HORS-ECRAN...
         CPI         DKMTNC          < ???
         JG          AKMTV9          < HORS-ECRAN...
         LA          DKMTY1-DEPCS,C  < COORDONNEE Y1 :
         JAL         AKMTV9          < HORS-ECRAN...
         CP          VAR+DKMTNL      < ???
         JG          AKMTV9          < HORS-ECRAN...
<
< CAS OU LE POINT (X1,Y1) EST VISIBLE :
<
         LR          C,X             < 'X' SERT A TRANSFERER UNE ADRESSE :
         ADRI        DKMTXY-DEPCS,X  < (X)=ADRESSE DE L'IMAGE OU METTRE LE POINT
         LR          X,W             < 'W' MEMORISE L'ADRESSE DE L'IMAGE, AFIN
                                     < DE POUVOIR RECUPERER ULTERIEUREMENT
                                     < L'INDICATEUR 'DKMOBA', ET DANS LA CAS DE
                                     < 'MEMTV' L'ADRESSE RELATIVE D'UN MOT
                                     < DANS L'IMAGE.
XWOR%1:  VAL         DKMTNM=K
         IF          BIT>XWOR%1-DKMTNM,,XEIF%,
         IF          ATTENTION : POUR QUE CE QUI SUIT FONCTIONNE
         IF          CORRECTEMENT, 'DKMTNM' DOIT ETRE UNE
         IF          PUISSANCE DE 2 !!!
XEIF%:   VAL         ENDIF
         SLLS        XWOR%1          < ON MULTIPLIE PAR LE NOMBRE DE MOTS PAR
                                     < LIGNE.
         ADR         A,X
         LA          DKMTX1-DEPCS,C  < (A)=COORDONNEE 'X',
         SLRS        NBITMO=K        < QUE L'ON CONVERTIT EN ADRESSE-MOTS.
         ADR         A,X
         LAI         NBITMO-N
XWOR%1:  VAL         NBITMO=K
         IF          BIT>XWOR%1-NBITMO,,XEIF%,
         IF          ATTENTION : 'NBITMO' DOIT ETRE UNE PUISSANCE DE 2 !!!
XEIF%:   VAL         ENDIF
         AND         DKMTX1-DEPCS,C  < NUMERO BIT DANS LE MOT.
         LR          X,C             < (C)=ADRESSE DU MOT DANS L'IMAGE CONTE-
                                     <     NANT LE POINT A TRACER.
         LR          A,X
         CPZ         VAR+DKNIVO      < AVEC OU SANS NIVEAU DE GRIS ???
         JL          DKMTW5          < SANS...
<
< CAS DU TRACE AVEC NIVEAU DE GRIS :
<
         PSR         Y
         LRM         Y
         WORD        TVLIMA*LK       < CONSTANTE DE PASSAGE D'UNE TRAME
                                     < A L'AUTRE...
         IF          DKMTSB-K,,,XEIF%
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         IF          DKMTRB-K,,XEIF%,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         IF          DKMTIB-K,XEIF%,,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
<
< DETERMINATION DU NIVEAU COURANT DU POINT :
<
<*******************************************************************************
         BSR         VAR+DKMTA6      < EXECUTION DE CE QUI SUIT :
         LA          O,C             < ACCES A LA PREMIERE COMPOSANTE :
<*******************************************************************************
         SCLS        BIT,X
         SLRD        BIT             < MEMORISATION DU PREMIER BIT (ROUGE).
         ADR         Y,C
<*******************************************************************************
         BSR         VAR+DKMTA6      < EXECUTION DE CE QUI SUIT :
         LA          O,C             < ACCES A LA DEUXIEME COMPOSANTE :
<*******************************************************************************
         SCLS        BIT,X
         SLRD        BIT             < MEMORISATION DU DEUXIEME BIT (VERT).
         ADR         Y,C
<*******************************************************************************
         BSR         VAR+DKMTA6      < EXECUTION DE CE QUI SUIT :
         LA          O,C             < ACCES A LA TROISIEME COMPOSANTE :
<*******************************************************************************
         SCLS        BIT,X
         ANDI        BIT             < MEMORISATION DU TROISIEME BIT (BLEU).
         SLLD        XNCOOL-BIT      < (A)=NIVEAU COURANT DU POINT...
                                     < SOIT : (A)=NC.
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
<
< RENVOI DU NIVEAU ANTERIEUR :
<
         CPZ         VAR+DKMRNA      < ALORS FAUT-IL TRACER LE POINT (=0), OU
                                     < UNIQUEMENT RENVOYER SON NIVEAU ANTE-
                                     < RIEUR ???
         STA         VAR+DKMRNA      < DANS TOUS LES CAS, ON LE RENVOIE...
         JNE         DKMTWL          < ET OUI, C'EST CE QUI ETAIT DEMANDE...
<
< ET NON, TRACE DU POINT :
<
XEIF%1:  VAL         ENDIF
<
< TEST DU NIVEAU ANTERIEUR 'NC' :
<
         PSR         X
         LX          VAR+DKDECA      < (X)=DECALAGE A APPLIQUER AU NIVEAU 'NC',
         XR          A,X             < (A)=DECALAGE A APPLIQUER,
                                     < (X)='NC',
         TBT         DKMDEC=DKBDEC   < ALORS, FAUT-IL TESTE LE NIVEAU
                                     < ANTERIEUR 'NC' ???
         JNC         DKMTWK          < NON, ON Y VA POUR LE MARQUAGE...
         LA          VAR+DKTCO       < OUI, ALORS, ACCEDONS AU CHAMP 'DKMLCO' :
         TBT         CODBT=FMASK(K?DKMLCO=FCINST)DKMLCO+L,X
         JNC         DKMTWM          < OK, LE BIT ASSOCIE AU NIVEAU 'NC' EST
                                     < A 0, LE POINT COURANT, SI LA SUITE LE
                                     < JUGE NECESSAIRE, PEUT ETRE MARQUE...
         PLR         X               < ET BIEN NON, LE POINT COURANT DE NIVEAU
                                     < 'NC' DOIT RESTER INTACT, CAR LE BIT DE
                                     < RANG 'NC' DANS 'DKMLCO' EST A 1...
         JMP         DKMTWL          < VERS LA SORTIE...
DKMTWM:  EQU         $
         LA          VAR+DKDECA      < RESTAURATION DE (A)='DKDECA',
XWOR%2:  VAL         DKMDEC=K
XWOR%2:  VAL         -XWOR%2
XWOR%1:  VAL         CORBT?DKBDEC=FMASK(K?DKMDEC=FCINST>XWOR%2
         ANDI        XWOR%1          < (A)=DECALAGE A APPORTER A 'NC'...
DKMTWK:  EQU         $
         XR          A,X             < RESTAURE :
                                     < (A)='NC',
                                     < (X)=DECALAGE A APPLIQUER A 'NC'...
         SLRS        L,X             < ON DECALE LE NIVEAU COURANT DU POINT
                                     < COURANT, QUITTE A LE FAIRE DISPARAITRE...
                                     < (NC) DECALE EST ENCORE APPELE 'NC'...
         PLR         X
         LB          VAR+DKNIVO      < (B)=NIVEAU DEMANDE,
                                     < SOIT : (B)=N.
<
< DISCRIMINATION ENTRE LES 2 LOGIQUES :
<
         PSR         A,X
         LA          VAR+DKMTRS      < (A)=MODE DEMANDE :
         LXI         K               < (X)=DISCRIMINATEUR DES LOGIQUES,
         TBT         DKLODD
         ADCR        X
         TBT         DKLODF
         SBCR        X               < (X)=0 : 'DKLODD'='DKLODF' ==> LOGIQUE
                                     <         FLOUE...
                                     < (X)#0 : 'DKLODD'#'DKLODF' ==> LOGIQUE
                                     <         BINAIRE...
         CPZR        X               < ALORS QUELLE EST LA LOGIQUE DEMANDEE ???
                                     < (A NOTER QUE 'DKLOGD'='DKLOGF' EST
                                     < COMPATIBLE AVEC L'ANCIENNE VERSION...)
         PLR         A,X
         JE          DKMTZ1          < CAS DE LA LOGIQUE FLOUE...
<
<
<        L O G I Q U E   B I N A I R E  :
<
<
         PSR         A               < SAUVEGARDE DU NIVEAU ANTERIEUR...
         LA          VAR+DKMTRS      < (A)=MODE DEMANDE EN LOGIQUE BINAIRE,
         IBT         DKLODD          < ET ON SE RAMENE AU FLOU...
         CPI         NEXIST          < ALORS QUEL EST L'OPERATEUR ???
         PLR         A               < (A)=NIVEAU ANTERIEUR...
         IF          DKMTSB-K,,,XEIF%
         IF          ATTENTION : 'DKMTSB' DOIT ETRE POSITIF !!!
XEIF%:   VAL         ENDIF
         IF          DKMTRB-K,,XEIF%,
         IF          ATTENTION : 'DKMTRB' DOIT ETRE NUL !!!
XEIF%:   VAL         ENDIF
         IF          DKMTIB-K,XEIF%,,
         IF          ATTENTION : 'DKMTIB' DOIT ETRE NEGATIF !!!
XEIF%:   VAL         ENDIF
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LES BRANCHEMENTS QUI SUIVENT SON IDIOTS !!!
XEIF%:   VAL         ENDIF
         JG          DKMTZ7          < CAS DE .OR. LOGIQUE...
         JE          DKMTZ6          < CAS DE .AND. LOGIQUE...
<
< .EOR. LOGIQUE :
<
         EORR        B,A             < (A)=(A).EOR.(B),
         JMP         DKMTWD          < VERS L'ECRITURE DANS L'IMAGE...
<
< .OR. LOGIQUE :
<
DKMTZ7:  EQU         $
         ORR         B,A             < (A)=(A).OR.(B),
         JMP         DKMTWD          < VERS L'ECRITURE DANS L'IMAGE...
<
< .AND. LOGIQUE :
<
DKMTZ6:  EQU         $
         ANDR        B,A             < (A)=(A).AND.(B),
         JMP         DKMTWD          < VERS L'ECRITURE DANS L'IMAGE...
AKMTV9:  JMP         DKMTV9          < RELAI...
<
<
<        L O G I Q U E   F L O U E  :
<
<
DKMTZ1:  EQU         $
         CPZ         VAR+DKMTRS      < QUEL EST LE MODE DU TRACE ???
         JG          DKMTW7          < 'SBT' : C'EST L'OPERATEUR .OR.
         JE          DKMTW6          < 'RBT' : C'EST L'OPERATEUR .AND.
<
< 'IBT' FLOU : C'EST L'OPERATEUR .EOR. FLOU :
<
         PSR         X,Y
         LXI         NIVMAX
         SBR         A,X             < (X)=.NOT.(A)=.NOT.(NC), QUE L'ON VA
                                     < NOTER NA...
         LYI         NIVMAX
         SBR         B,Y             < (Y)=.NOT.(B)=.NOT.(N), QUE L'ON VA
                                     < NOTER NB...
         CPR         A,Y             < CALCUL DE A.AND.NB :
         JGE         DKMTWI          < 'A' EST DEJA LE 'MIN'...
         LR          Y,A             < C'EST 'Y' LE MIN...
DKMTWI:  EQU         $
         CPR         B,X             < CALCUL DE B.AND.NA :
         JGE         DKMTWJ          < 'B' EST DEJA LE 'MIN'...
         LR          X,B             < C'EST 'X' LE MIN...
DKMTWJ:  EQU         $
         PLR         X,Y
         JMP         DKMTW7          < MAINTENANT, ON VA CALCULER :
                                     < (A.AND.NB).OR.(NA.AND.B), C'EST-A-DIRE
                                     < QUE L'ON EQUIVAUT MAINTENANT A 'SBT'...
<
< 'RBT' : C'EST L'OPERATEUR .AND. FLOU :
<
DKMTW6:  EQU         $
         CPR         A,B             < CALCUL DE (A).AND.(B) :
         JGE         DKMTWD          < 'A' EST DEJA LE 'MIN'...
         JMP         DKMTWH          < C'EST 'B' LE 'MIN'...
<
< 'SBT' : C'EST L'OPERATEUR .OR. FLOU :
<
DKMTW7:  EQU         $
         CPR         A,B             < CALCUL DE (A).OR.(B) :
         JLE         DKMTWD          < 'A' EST DEJA LE 'MAX'...
DKMTWH:  EQU         $
         LR          B,A             < C'EST 'B' LE 'MAX'...
<
< MISE EN PLACE DU NOUVEAU NIVEAU DU POINT COURANT :
<
DKMTWD:  EQU         $
         SLRD        XNCOOL          < MISE DU NIVEAU DANS 'B'...
<*******************************************************************************
         BSR         VAR+DKMTA6      < EXECUTION DE CE QUI SUIT :
         LA          O,C             < ACCES A LA TROISIEME COMPOSANTE :
XLAOC::  VAL         '0000000@@@@    < CODE DU 'LA O,C'...
<*******************************************************************************
         SCLS        L,X
         SLLD        BIT             < CONCATENATION DU TROISIEME BIT (BLEU).
         SCRS        BIT,X
<*******************************************************************************
         BSR         VAR+DKMTA6      < EXECUTION DE CE QUI SUIT :
         STA         O,C
XSTAOC:: VAL         '0000000@@@@    < CODE DU 'STA O,C'...
<*******************************************************************************
         SBR         Y,C
<*******************************************************************************
         BSR         VAR+DKMTA6      < EXECUTION DE CE QUI SUIT :
         LA          O,C             < ACCES A LA DEUXIEME COMPOSANTE :
<*******************************************************************************
         SCLS        L,X
         SLLD        BIT             < CONCATENATION DU DEUXIEME BIT (VERT).
         SCRS        BIT,X
<*******************************************************************************
         BSR         VAR+DKMTA6      < EXECUTION DE CE QUI SUIT :
         STA         O,C
<*******************************************************************************
         SBR         Y,C
<*******************************************************************************
         BSR         VAR+DKMTA6      < EXECUTION DE CE QUI SUIT :
         LA          O,C             < ACCES A LA PREMIERE COMPOSANTE :
<*******************************************************************************
         SCLS        L,X
         SLLD        BIT             < CONCATENATION DU PREMIER BIT (ROUGE).
         SCRS        BIT,X
<*******************************************************************************
         BSR         VAR+DKMTA6      < EXECUTION DE CE QUI SUIT :
         STA         O,C
<*******************************************************************************
DKMTWL:  EQU         $
         PLR         Y
         JMP         DKMTV9          < VERS LA SORTIE...
<
< CAS DU TRACE SANS NIVEAU DE GRIS :
<
DKMTW5:  EQU         $
         LA          O,C
         IF          DKMTSB-K,,,XEIF%
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         IF          DKMTRB-K,,XEIF%,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         IF          DKMTIB-K,XEIF%,,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         VAR+DKMTRS      < QUE LE MODE 'SBT'/'RBT' ???
         JE          DKMTV3          < 'RBT'...
         JL          DKMTW1          < 'IBT'...
         SBT         L,X             < 'SBT'.
         JMP         DKMTV4          < VERS LA MISE A JOUR DE L'IMAGE...
DKMTW1:  EQU         $
         IBT         L,X             < 'IBT'.
         JMP         DKMTV4          < VERS LA MISE A JOUR DE L'IMAGE...
DKMTV3:  EQU         $
         RBT         L,X             < 'RBT'.
DKMTV4:  EQU         $
         STA         O,C
DKMTV9:  EQU         $               < CAS DES OVER-SCREEN...
         PLR         C,W
         PLR         A,B,X           < RESTAURATIONS.
         RSR
         PAGE
<
<
<        A C C E S   A   U N   M O T   D E   L ' I M A G E  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME EST TRES COMPLIQUE
<                    PARCEQU'IL N'Y A PLUS DE PLACE DANS LA
<                    'DCTDKU', ET QU'ON NE PEUT DONC PAS FAIRE
<                    UN SOUS-PROGRAMME DE 'LOAD' ET UN SOUS-
<                    PROGRAMME DE 'STORE'. DE PLUS IL PREND
<                    EN COMPTE L'INDICATEUR 'DKMOBA' QUI
<                    INDIQUE SI L'OPERATION A LIEU DANS LA
<                    MEMOIRE UTILISATEUR, OU BIEN DANS
<                    'MEMTV'...
<
<
<        ARGUMENT :
<                    (W)=ADRESSE DE L'IMAGE DANS L'ESPACE BAS.
<                    (A)=VALEUR A FORCER S'IL S'AGIT D'UN 'STORE',
<                        L'INSTRUCTION SUIVANT LE 'BSR'.
<
<
<        RESULTAT :
<                    (A)=VALEUR RECUPEREE S'IL S'AGIT D'UN 'LOAD'.
<
<
DKMTP6:  EQU         $
XKREG:   VAL         K
       #@PSR         X,Y,W           < #SISP CMS5 KREG#
       #@PSR         A,B             < #SISP CMS5 KREG#
XKREG:   VAL         -XKREG          < NOMBRE DE REGISTRES EMPILES A L'ENTREE.
XWOR%2:  VAL         D               < LONGUEUR D'UNE INSTRUCTION...
         LA          -DKMTXY+DKMTMO,W
         ANDI        DKMOBA          < 'A' : DISCRIMINE LES DEMANDES EN MEMOIRE
                                     < BASSSE (=0) DES DEMANDES 'MEMTV' (#0).
         JANE        DKMTVG          < CAS DE 'MEMTV'...
<
< CAS DE LA MEMOIRE UTILISATEUR :
<
         PLR         A,B             < RESTAURATION DE 'A' EN PARTICULIER...
                                     < L'INSTRUCTION ARGUMENT SERA EXECUTEE AU
                                     < RETOUR DU 'BSR'...
<
< SORTIE :
<
DKMTVH:  EQU         $
         PLR         X,Y,W
         RSR
<
< CAS DE LA MEMOIRE 'MEMTV' :
<
DKMTVG:  EQU         $
         SBR         C,W             < 'W' DONNAIT L'ADRESSE ABSOLUE DE LA
                                     < MEMOIRE DE L'IMAGE UTILISATEUR, ET
                                     < 'C' L'ADRESSE ABSOLUE D'UN MOT PARTI-
                                     < CULIER DEDANS,
         NGR         W,Y             < (Y)=ADRESSE RELATIVE DU MOT ADRESSE
                                     <     DANS 'MEMTV'.
         LR          K,W             < 'W' BASE LA PILE :
         LA          -XKREG-XWOR%2+DEPILE,W
                                     < (A)=REGISTRE 'P' DE RETOUR D'UN 'BSR'
                                     <     EXECUTE "NORMALEMENT"...
         DO          XWOR%2
         IC          -XKREG-XWOR%2+DEPILE,W
                                     < AFIN DE SAUTER L'INSTRUCTION ARGUMENT...
         LR          A,W             < 'W' BASE L'INSTRUCTION ARGUMENT,
         LX          O,W             < (X)=INSTRUCTION ARGUMENT, QUI SUIT LE
                                     <     'BSR' D'APPEL.
         LRM         A,B
         WORD        XLAOC           < (A)=CODE DU 'LA O,C',
         WORD        XSTAOC          < (B)=CODE DU 'STA O,C'.
         CPR         A,X             < EST-CE UN 'LOAD' ???
         JE          DKMTVI          < OUI...
         CPR         B,X             < EST-CE UN 'STORE' ???
         JE          DKMTVJ          < OUI...
         PSR         C               < NON,
         CALL        #SISP CMS5 BASE C#
                                     < QU'EST-CE QU'IL NE FAUT PAS FAIRE ?!???!
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      VOIR POURQUOI LE REGISTRE 'X' EST
<                    MAUVAIS !!!
<
         PLR         C
         PLR         A,B
         JMP         DKMTVH          < ET ON ABANDONNE...
<
< CAS D'UN 'LOAD' DANS 'MEMTV' :
<
DKMTVI:  EQU         $
         PLR         A,B             < RESTAURATION DE 'A' EN PARTICULIER...
         LAR                         < ACCES AU MOT DEMANDE...
         JMP         DKMTVH          < ET ON SORT...
<
< CAS D'UN 'STORE' DANS 'MEMTV' :
<
DKMTVJ:  EQU         $
         PLR         A,B             < RESTAURATION DE 'A' EN PARTICULIER...
         STAR                        < ET RANGEMENT DU MOT ARGUMENT...
         JMP         DKMTVH          < ET ON SORT...
         PAGE
<
<
<        C A L C U L   D U   N I V E A U   D E   G R I S
<        E T   T R A C E   D U   P O I N T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME CALCULE LA DISTANCE
<                    DU POINT ENTIER COURANT (X,Y)
<                    AU POINT FLOTTANT COURANT (DKMTX,DKMTY)
<                    SUIVANT LA NORME EUCLIDIENNE ;
<                    A PARTIR DE CETTE DISTANCE, ON EN DEDUIT
<                    UN NIVEAU DE GRIS : PLUS LE POINT ENTIER
<                    EST PRES DU POINT FLOTTANT, PLUS IL EST
<                    LUMINEUX...
<
<
<        ARGUMENTS :
<                    (DKMTX,DKMTY)=COORDONNEES DU POINT FLOTTANT,
<                    (X,Y)=COORDONNEES DU POINT ENTIER.
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
<                    (FPENTE)=COEFFICIENT (ENTRE 0 ET 1) DE PONDE-
<                             RATION DES NIVEAUX...
XEIF%1:  VAL         ENDIF
<
<
DKMTP4:  EQU         $
         PSR         A,B
         IF          DIMALI-DIMAL1,XEIF%2,,XEIF%2
         STX         DKMTX1-DEPCS,C  < ARGUMENT 'X' DE 'DKMTP1',
         STY         DKMTY1-DEPCS,C  < ARGUMENT 'Y' DE 'DKMTP1'.
<
< INTERPOLATION AVEC
< LE NIVEAU ANTERIEUR :
<
         STZ         VAR+DKMRNA
         IC          VAR+DKMRNA      < (DKMRNA)#0,
         BSR         VAR+DKMTA1      < RECUPERATION DU NIVEAU ANTERIEUR DU
                                     < POINT ARGUMENT :
         PSR         X,Y             < SAUVEGARDES...
         FLD         VAR+FPENTE      < (A,B)=FPENTE ; A NOTER QUE LE CODE QUI
                                     < SUIT EST VACHEMENT COMPLIQUE PAR LE FAIT
                                     < QU'IL DEMANDERAIT EN FAIT DES VARIABLES
                                     < FLOTTANTES DE MANOEUVRE, MAIS QUE LA
                                     < 'DCTDKU' EST PLEINE COMME UN OEUF...
         LR          A,X
         LR          B,Y             < (X,Y)=FPENTE,
         LAI         I
         FLT
         FSB         VAR+FPENTE
         FST         VAR+FPENTE      < MEMORISATION PENIBLE DE 1-FPENTE...
         LA          VAR+DKMRNA      < (A)=NIVEAU ANTERIEUR DU POINT COURANT,
         FLT                         <     QUE L'ON FLOTTE...
         FMP         VAR+FPENTE      < NA*(1-FPENTE), EN APPELANT "NA" LE
                                     < NIVEAU ANTERIEUR...
         FST         VAR+FPENTE      < ET MEMORISATION PENIBLE...
         LR          X,A             < (X,Y)=FPENTE,
         LR          Y,B             < (A,B)=FPENTE,
         FMP         VAR+FIVMAX      < FIVMAX*FPENTE,
         PSR         A,B             < ET SAUVEGARDE...
         BSR         VAR+DKMTA3      < (A)=NIVEAU ENTIER QUE L'ON OBTIENDRAIT
                                     <     SI L'ON INTERPOLAIT ENTRE LE NIVEAU
                                     <     NUL (NOIR) ET LE MAX...
         CP          VAR+DKMRNA      < EST-IL EGAL A CELUI QUI ETAIT PRESENT
                                     < ANTERIEUREMENT ???
         PLR         A,B             < RESTAURATION...
         JE          DKMTWN          < OUI, C'EST LUI QU'ON PREND ; NOTONS
                                     < QU'ON N'A PAS BESOIN DE LE TRACER, MAIS
                                     < CELA SIMPLIFIE LA GESTION DE LA PILE...
                                     < C'EST EN PARTICULIER LE CAS OU L'ON
                                     < TRACE DE FOIS DE SUITE LE MEME TRAIT :
                                     < SANS CE DISPOSITIF, ON CUMULE LES 2 TRACE
                                     < ET L'ANTI-ALIASING S'AMENUISE...
         FAD         VAR+FPENTE      < NON, NA*(1-FPENTE)+FIVMAX*FPENTE, SOIT UN
                                     < VALEUR INTERPOLEE ENTRE LE NIVEAU ANTE-
                                     < RIEUR "NA", ET LE NIVEAU MAXIMAL...
DKMTWN:  EQU         $
         XR          A,X
         XR          B,Y             < (A,B)=FPENTE, ET
                                     < (X,Y)=NA*(1-FPENTE)+FIVMAX*FPENTE.
         FST         VAR+FPENTE      < ET ON RESTAURE 'FPENTE', ENFIN...
         LR          X,A
         LR          Y,B             < (A,B)=NIVEAU INTERPOLE DANS (NA,FIVMAX),
         PLR         X,Y             < ET ON RESTAURE...
XEIF%2:  VAL         ENDIF
         IF          DIMALI-DIMAL2,XEIF%2,,XEIF%2
         LR          X,A             < (X)=A=COORDONNEE X ENTIERE,
         STA         DKMTX1-DEPCS,C  < ARGUMENT DE 'DKMTP1'.
         FLT
         FSB         VAR+DKMTX
         FST         VAR+FWORK
         FMP         VAR+FWORK
         PSR         A,B             < SAUVEGARDE DE (X1-X)**2.
         LR          Y,A             < (Y)=A=COORDONNEE Y ENTIERE,
         STA         DKMTY1-DEPCS,C  < ARGUMENT DE 'DKMTP1'.
         FLT
         FSB         VAR+DKMTY
         FST         VAR+FWORK
         FMP         VAR+FWORK
         FST         VAR+FWORK       < SAUVEGARDE DE (Y1-Y)**2,
         PLR         A,B
         FAD         VAR+FWORK       < CALCUL DE LA NORME EUCLIDIENNE AU CARRE,
                                     < SOIT : D**2=(X1-X)**2+(Y1-Y)**2.
<
< CALCUL D'UNE RACINE CARREE :
< (PAR LA METHODE DE NEWTON
< U(N+1)=(U(N)+K/U(N))/2)
<
RAC:     EQU         $
         FCAZ                        < LE CALCUL EST-IL NECESSAIRE ???
         JE          RAC2            < NON : NOMBRE=0 ==> RACINE=0...
         JL          DKMTWA          < HORREUR, LE NOMBRE EST NEGATIF,
                                     < E R R E U R   S Y S T E M E...
                                     < (NE PAS OUBLIER QUE 'C' EST MAUVAISE !!!)
         PSR         X,Y
         LR          A,X             < X ET
         LR          B,Y             < Y MEMORISENT LE NOMBRE ARGUMENT.
RAC1:    EQU         $
         FST         VAR+FWORK
         LR          X,A
         LR          Y,B             < ('K' REPRESENTE LE NOMBRE DONT ON
                                     < CALCULE LA RACINE CARREE ET QUI EST
                                     < MEMORISE DANS (X,Y)).
         FDV         VAR+FWORK       < K/U(N),
         FAD         VAR+FWORK       < U(N)+K/U(N),
         FMP         VAR+DKMT05      < (U(N)+K/U(N))/2=(U(N)+K/U(N))*0.5.
         FCAM        VAR+FWORK       < TEST DE FIN ???
         JNE         RAC1            < NON...
         PLR         X,Y
<
< CALCUL DU NIVEAU DU POINT :
<
RAC2:    EQU         $
         FSB         VAR+FRHUIT
         FNEG
         FDV         VAR+FRHUIT      < ON CALCULE (FRHUIT-D)/FRHUIT, OU
                                     < 'FRHUIT' EST LA VALEUR MAXIMALE DE 'D'...
         FMP         VAR+FIVMAX      < PONDERATION DE 'NIVMAX'...
XEIF%2:  VAL         ENDIF
         BSR         VAR+DKMTA3      < (A)=NIVEAU A ATTRIBUER AU POINT (X,Y).
         JAL         DKMTWA          < ERREUR...
         CPI         NIVMAX          < VALIDATION, SUITE...
         JLE         DKMTW3          < OK...
DKMTWA:  EQU         $
         PSR         C
         CALL        #SISP CMS5 BASE C#
                                     < QU'EST-CE QU'IL NE FAUT PAS FAIRE ????!!!
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      ESSAYER DE COMPRENDRE...
<
         PLR         C
         NTRN
         LAI         NIVMAX/XXXMOY   < POURQUOI PAS ???
         TRN
DKMTW3:  EQU         $
         STA         VAR+DKNIVO      < MEMORISATION DU NIVEAU...
         IF          DIMALI-DIMAL2,XEIF%2,,XEIF%2
         CP          VAR+DKMIVO      < EST-IL MAXIMAL ???
         JLE         DKMTWB          < NON...
         STA         VAR+DKMIVO      < OUI, ON LE MEMORISE,
         STX         VAR+DKNIVX      < AINSI QUE LES COORDONNEES 'X'
         STY         VAR+DKNIVY      < ET 'Y' DU POINT ENTIER CORRESPONDANT.
DKMTWB:  EQU         $
XEIF%2:  VAL         ENDIF
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
         STZ         VAR+DKMRNA      < AFIN DE TRACER LE POINT DANS 'DKMTA1'...
XEIF%1:  VAL         ENDIF
         BSR         VAR+DKMTA1      < ET TRACE DU POINT (DKMTX1,DKMTY1)
                                     < AVEC LE NIVEAU 'DKNIVO'...
         PLR         A,B
         RSR
         PAGE
<
<
<        T R A C E   D U   P O I N T   C O U R A N T   ( X , Y )  :
<
<
<        ARGUMENT :
<                    DKMTX,DKMTY=COORDONNEES DU POINT A TRACER EN FLOTTANT.
<
<
DKMTP2:  EQU         $
         PSR         A,B,X,Y
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
<
< GESTION DES POINTILLES :
<
         LA          VAR+MDKMPO      < (A)=PATTERN COURANTE DES POINTILLES,
         TBT         BDKMPO          < FAUT-IL TRACER LE POINT COURANT ???
         JC          AKMTZP          < NON, ON SORT...
XEIF%1:  VAL         ENDIF
<
< INITIALISATIONS :
<
         LX          DKMTX1-DEPCS,C  < SAUVER 'DKMTX1'...
         LY          DKMTY1-DEPCS,C  < ... ET 'DKMTY1'.
         CPZ         VAR+DKNIVO      < FAUT-IL DES NIVEAUX DE GRIS ???
         JL          DKMTW9          < NON...
         LA          DKMTMO-DEPCS,C  < OUI,
         ANDI        DKMNIV          < (A)=NIVEAU DE GRIS DEMANDE.
XWOR%1:  VAL         DKMNIV=K
         IF          XWOR%1-K,,XEIF%,
         SLRS        XWOR%1
XEIF%:   VAL         ENDIF
         CPI         ANTIAL          < EST-CE L'ANTI-ALIASING ???
         JNE         DKMTVD          < NON, IL S'AGIT BIEN D'UN NIVEAU DE GRIS..
<
< CAS D'UN TRACE ANTI-ALIASING :
<
         IF          DIMALI-DIMAL2,XEIF%1,,XEIF%1
         STZ         VAR+DKMIVO      < INITIALISATION DU NIVEAU MAXIMAL
         DC          VAR+DKMIVO      < RENCONTRE SUR UNE VALEUR NEGATIVE...
XEIF%1:  VAL         ENDIF
         PSR         X,Y
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
         LA          &VAR+DKMINF     < ACCES A 'INFINI'...
         STA         VAR+APENTE      < DROITE VERTICALE A PRIORI...
         FLD         VAR+DKMT05
         FST         VAR+FPENTE      < A PRIORI, ON SUPPOSE QU'IL S'AGIT DE
                                     < DROITES VERTICALES OU HORIZONTALES, OU
                                     < DE POINTS ISOLES OU D'EXTREMITES.
         FLD         VAR+DKMTA       < (A,B)=PENTE FLOTTANTE,
         FABS                        < DONT ON PREND LA VALEUR ABSOLUE,
         FIX                         < PUIS LA VALEUR ENTIERE :
         JV          DKMTZK          < DEBORDEMENT, ON CONSIDERE LA DROITE
                                     < VERTICALE...
         STA         VAR+APENTE      < OK, CET INDICATEUR PRECISE :
                                     < =0 : FAIBLE PENTE,
                                     < >0 : FORTE PENTE,
                                     < <0 : DROITE VERTICALE.
DKMTZK:  EQU         $
PENT45:: VAL         W/W             < DEFINITION D'UNE PENTE A 45 DEGRE...
                                     < NOTA IMPORTANT : ETANT DONNE L'INVER-
                                     < SION DE L'AXE 'OY', LE REFERENTIEL
                                     < N'EST PAS DIRECT : IL Y A SYMETRIE PAR
                                     < RAPPORT A 'OX', ET ALORS TOUTES LES
                                     < REFERENCES A 'PENT45' SERONT INVERSEES...
         IF          PENT45-K-I,,XEIF%,
         IF          ATTENTION : SI 'PENT45' NE VAUT PAS 1,
         IF          ON NE PEUT PAS DISTINGUER LES PENTES
         IF          FAIBLES (ANGLE INFERIEUR A PI/4) PAR
         IF          UN TEST DE NULLITE !!!
XEIF%:   VAL         ENDIF
XEIF%1:  VAL         ENDIF
<
< CALCUL DU "POINT CENTRAL" :
<
         FLD         VAR+DKMTX
         FCAZ
         JL          DKMTWC          < HORS-ECRAN : ON EVITE DE PLUS UN
                                     < MECHANT PROBLEME LIE A L'INSTRUCTION
                                     < 'FIX' QUI TRONQUE PAR EXCES LES
                                     < NOMBRES NEGATIFS...
         IF          DIMALI-DIMAL2,XEIF%1,,XEIF%1
         FIX
XEIF%1:  VAL         ENDIF
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
         CPZ         VAR+APENTE      < COMMENT EST-LA PENTE DE LA DROITE ???
         JE          DKMTZG          < FAIBLE...
         FIX                         < FORTE : LA COORDONNEE 'X' EST DONC LA
                                     < PARTIE ENTIERE PAR DEFAUT DE LA
                                     < VALEUR FLOTTANTE 'DKMTX'.
         JMP         DKMTZH
DKMTZG:  EQU         $
         BSR         VAR+DKMTA3      < FAIBLE : LA COORDONNEE 'X' EST OBTENUE
                                     < PAR LA PLUS PROCHE VALEUR ENTIERE DE
                                     < 'DKMTX' AFIN D'EVITER DES TROUS DANS
                                     < LE TRACE...
DKMTZH:  EQU         $
XEIF%1:  VAL         ENDIF
         LR          A,X             < (X)=COORDONNEE DU PREMIER POINT ENTIER.
                                     <     (DIT "POINT CENTRAL")
         FLD         VAR+DKMTY
         FCAZ
         JL          DKMTWC          < HORS-ECRAN...
         IF          DIMALI-DIMAL2,XEIF%1,,XEIF%1
         FIX
XEIF%1:  VAL         ENDIF
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
         CPZ         VAR+APENTE      < COMMENT EST LA PENTE DE LA DROITE ???
         JNE         DKMTZI          < FORTE (>0) OU VERTICALE (<0)...
         FIX                         < FAIBLE : LA COORDONNEE 'Y' EST LA
                                     < VALEUR ENTIERE PAR DEFAUT DE LA VALEUR
                                     < FLOTTANTE 'DKMTY'.
         JMP         DKMTZJ
DKMTZI:  EQU         $
         BSR         VAR+DKMTA3      < FORTE : LA COORDONNEE 'Y' EST LA VALEUR
                                     < ENTIERE LA PLUS PROCHE DE LA VALEUR
                                     < FLOTTANTE 'DKMTY' AFIN D'EVITER DES
                                     < TROUS...
DKMTZJ:  EQU         $
XEIF%1:  VAL         ENDIF
         LR          A,Y             < (Y)=COORDONNEE DU PREMIER POINT ENTIER.
                                     <     (DIT "POINT CENTRAL")
         IF          DIMALI-DIMAL2,XEIF%1,,XEIF%1
<
< GESTION BI-DIMENSIONNELLE :
<
         IF          FRCOTE-I-I,,XEIF%,
         IF          FRCOTE-I-I-I-I,,XEIF%,
         IF          ATTENTION : 'FRCOTE' NE PEUT VALOIR QUE 2 OU 4 !!!
XEIF%:   VAL         ENDIF
         BSR         VAR+DKMTA4      < TRACE DU POINT (X,Y) AVEC NIVEAU,
         ADRI        I,X
         BSR         VAR+DKMTA4      < TRACE DU POINT (X+1,Y) AVEC NIVEAU,
         ADRI        I,Y
         BSR         VAR+DKMTA4      < TRACE DU POINT (X+1,Y+1) AVEC NIVEAU,
         ADRI        -I,X
         BSR         VAR+DKMTA4      < TRACE DU POINT (X,Y+1) AVEC NIVEAU,
         ADRI        -I,X
         BSR         VAR+DKMTA4      < TRACE DU POINT (X-1,Y+1) AVEC NIVEAU,
         ADRI        -I,Y
         BSR         VAR+DKMTA4      < TRACE DU POINT (X-1,Y) AVEC NIVEAU,
         ADRI        -I,Y
         BSR         VAR+DKMTA4      < TRACE DU POINT (X-1,Y-1) AVEC NIVEAU,
         ADRI        I,X
         BSR         VAR+DKMTA4      < TRACE DU POINT (X,Y-1) AVEC NIVEAU,
         ADRI        I,X
         BSR         VAR+DKMTA4      < TRACE DU POINT (X+1,Y-1) AVEC NIVEAU.
         IF          FRCOTE-I-I-I-I,XEIF%,,XEIF%,
         ADRI        I,X
         BSR         VAR+DKMTA4      < TRACE DU POINT (X+2,Y-1) AVEC NIVEAU,
         ADRI        I,Y
         BSR         VAR+DKMTA4      < TRACE DU POINT (X+2,Y) AVEC NIVEAU,
         ADRI        I,Y
         BSR         VAR+DKMTA4      < TRACE DU POINT (X+2,Y+1) AVEC NIVEAU,
         ADRI        I,Y
         BSR         VAR+DKMTA4      < TRACE DU POINT (X+2,Y+2) AVEC NIVEAU,
         ADRI        -I,X
         BSR         VAR+DKMTA4      < TRACE DU POINT (X+1,Y+2) AVEC NIVEAU,
         ADRI        -I,X
         BSR         VAR+DKMTA4      < TRACE DU POINT (X,Y+2) AVEC NIVEAU,
         ADRI        -I,X
         BSR         VAR+DKMTA4      < TRACE DU POINT (X-1,Y+2) AVEC NIVEAU,
         ADRI        -I,X
         BSR         VAR+DKMTA4      < TRACE DU POINT (X-2,Y+2) AVEC NIVEAU,
         ADRI        -I,Y
         BSR         VAR+DKMTA4      < TRACE DU POINT (X-2,Y+1) AVEC NIVEAU,
         ADRI        -I,Y
         BSR         VAR+DKMTA4      < TRACE DU POINT (X-2,Y) AVEC NIVEAU,
         ADRI        -I,Y
         BSR         VAR+DKMTA4      < TRACE DU POINT (X-2,Y-1) AVEC NIVEAU,
         ADRI        -I,Y
         BSR         VAR+DKMTA4      < TRACE DU POINT (X-2,Y-2) AVEC NIVEAU,
         ADRI        I,X
         BSR         VAR+DKMTA4      < TRACE DU POINT (X-1,Y-2) AVEC NIVEAU,
         ADRI        I,X
         BSR         VAR+DKMTA4      < TRACE DU POINT (X,Y-2) AVEC NIVEAU,
         ADRI        I,X
         BSR         VAR+DKMTA4      < TRACE DU POINT (X+1,Y-2) AVEC NIVEAU,
         ADRI        I,X
         BSR         VAR+DKMTA4      < TRACE DU POINT (X+2,Y-2) AVEC NIVEAU.
         ADRI        I,Y
         ADRI        -I,X
XEIF%:   VAL         ENDIF
         ADRI        I,Y             < RETOUR AU
         ADRI        -I,X            <           POINT CENTRAL...
         LAI         NIVMAX
         STA         VAR+DKNIVO      < ON VA FORCER 'NIVMAX'
                                     < EN UN POINT ENTIER ADAPTE A 'DELTAX'
                                     < ET 'DELTAY'...
                                     < (CE POINT SERA LE PLUS PROCHE POSSIBLE
                                     < DU POINT "MAX" RENCONTRE...)
         LX          VAR+DKNIVX      < 'X' A PRIORI...
         LY          VAR+DKNIVY      < 'Y' A PRIORI...
         STX         DKMTX1-DEPCS,C
         STY         DKMTY1-DEPCS,C
         BSR         VAR+DKMTA1      < ET ON RE-TRACE CE POINT...
XEIF%1:  VAL         ENDIF
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
<
< GESTION MONO-DIMENSIONNELLE :
<
         LAI         NIVMAX
         STA         VAR+DKNIVO
         STX         DKMTX1-DEPCS,C
         STY         DKMTY1-DEPCS,C
         STZ         VAR+DKMRNA      < AFIN DE TRACER LE POINT DANS 'DKMTA1'...
         BSR         VAR+DKMTA1      < TRACE DU "POINT CENTRAL" (X,Y), AVEC
                                     < LE NIVEAU MAXIMAL 'NIVMAX'...
<
< DISCRIMINATION SUIVANT LA
< PENTE DE LA DROITE :
<
         FCMZ        VAR+DKMTA       < COMMENT EST LA DROITE ???
         JE          DKMTZO          < HORIZONTALE, ON A DEJA : (FPENTE)=F05...
         CPZ         VAR+APENTE      < COMMENT EST LA DROITE ???
         JL          DKMTZO          < VERTICALE, ON A DEJA : (FPENTE)=F05...
         JG          DKMTZQ          < LA DROITE A UNE FORTE PENTE SANS ETRE
                                     < VERTICALE...
<
< CAS DES DROITES DE FAIBLE
< PENTE NON HORIZONTALE :
<
         LR          Y,A
         FLT
         FSB         VAR+DKMTY
         FABS
         FST         VAR+FPENTE      < LA PENTE EST FAIBLE EN VALEUR ABSOLUE,
                                     < ET ALORS :
                                     < FPENTE=ABS(DKMTY-Y), C'EST-A-DIRE LA
                                     < MESURE EN VALEUR ABSOLUE SUR L'AXE
                                     < DES 'Y' DE LA DISTANCE DU POINT FLOTTANT
                                     < AU POINT ENTIER...
                                     < ATTENTION : L'AXE DES 'Y' EST DESCEN-
                                     < DANT, ET 'Y' ENTIER PAR DEFAUT EST AU-
                                     < DESSUS (SUR L'ECRAN) DU POINT FLOTTANT
                                     < 'DKMTY' ; C'EST DONC EN FAIT 1-FPENTE
                                     < QUE L'ON VIENT DE CALCULER, D'OU :
                                     < (X,Y+1) <-- NIVMAX*FPENTE, ET
                                     < (X,Y-1) <-- NIVMAX*(1-FPENTE) CI DESSOUS
                                     < ET NON PAS L'INVERSE...
         JMP         DKMTZO
<
< CAS DES DROITES DE FORTE
< PENTE NON VERTICALE :
<
DKMTZQ:  EQU         $
         LR          X,A
         FLT
         FSB         VAR+DKMTX
         FABS
         FST         VAR+FPENTE      < A PRIORI, ON SUPPOSE QUE LA PENTE DE
                                     < DROITE VA ETRE FORTE EN VALEUR ABSOLUE,
                                     < ET ALORS :
                                     < FPENTE=ABS(DKMTX-X), C'EST-A-DIRE LA
                                     < MESURE EN VALEUR ABSOLUE SUR L'AXE
                                     < DES 'X' DE LA DISTANCE DU POINT FLOTTANT
                                     < AU POINT ENTIER...
DKMTZO:  EQU         $
         CPZ         VAR+DKPOIN      < EST-CE UN POINT ISOLE ???
         JE          DKMTZN          < NON...
<
< CAS DES POINTS ISOLES :
<
         ADRI        I,Y
         BSR         VAR+DKMTA4      < (X,Y+1) <-- NIVMAX/2,
         ADRI        -I,X
         BSR         VAR+DKMTA4      < (X-1,Y+1) <-- NIVMAX/2,
         ADRI        -I,Y
         BSR         VAR+DKMTA4      < (X-1,Y) <-- NIVMAX/2,
         ADRI        -I,Y
         BSR         VAR+DKMTA4      < (X-1,Y-1) <-- NIVMAX/2,
         ADRI        I,X
         BSR         VAR+DKMTA4      < (X,Y-1) <-- NIVMAX/2,
         ADRI        I,X
         BSR         VAR+DKMTA4      < (X+1,Y-1) <-- NIVMAX/2,
         ADRI        I,Y
         BSR         VAR+DKMTA4      < (X+1,Y) <-- NIVMAX/2,
         ADRI        I,Y
         JMP         DKMTZM          < POUR :
                                     < (X+1,Y+1) <-- NIVMAX/2.
AKMTZP:  JMP         DKMTZP          < RELAI...
<
< DISCRIMINATION DES PENTES :
<
DKMTZN:  EQU         $
         IF          PENT45-K-I,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         VAR+APENTE      < COMMENT EST LA PENTE DE LA DROITE ???
         JNE         DKMTZC          < FORTE (>0), OU VERTICALE (<0)...
<
< CAS DES FAIBLES PENTES :
<
         ADRI        I,Y
         BSR         VAR+DKMTA4      < (X,Y+1) <-- NIVMAX*FPENTE,
         ADRI        -I-I,Y
         JMP         DKMTZE          < (X,Y-1) <-- NIVMAX*(1-FPENTE).
<
< CAS DES FORTES PENTES :
<
DKMTZC:  EQU         $
         ADRI        I,X
         BSR         VAR+DKMTA4      < (X+1,Y) <-- NIVMAX*FPENTE,
         ADRI        -I-I,X          < POUR :
                                     < (X-1,Y) <-- NIVMAX*(1-FPENTE).
<
< TRACE DU DEUXIEME POINT :
< (OU DU DERNIER POUR LES
< "POINTS ISOLES")
<
DKMTZE:  EQU         $
         LAI         I               < PAS DE PASSAGE D'UN POINT A L'AUTRE...
         FLT
         FSB         VAR+FPENTE
         FST         VAR+FPENTE      < FPENTE=1-FPENTE...
DKMTZM:  EQU         $
         BSR         VAR+DKMTA4      < ET MARQUAGE DU DEUXIEME POINT SUIVANT
                                     < LE CONTENU DES REGISTRES 'X' ET 'Y', ET
                                     < AVEC LE NIVEAU NIVMAX*(1-FPENTE)...
XEIF%1:  VAL         ENDIF
DKMTWC:  EQU         $
         PLR         X,Y
         JMP         DKMTW8          < VERS LA SORTIE...
<
< CAS D'UN TRACE AVEC NIVEAU DE GRIS :
<
DKMTVD:  EQU         $
         STA         VAR+DKNIVO      < ON MEMORISE LE NIVEAU DE GRIS DEMANDE ;
                                     < CETTE OPERATION EST D'AILLEURS SUREMENT
                                     < INUTILE, PUISQUE REALISEE AU DEBUT DE LA
                                     < PHASE D'INTERPOLATION, MAIS...
<
< TRACE SANS NIVEAU DE GRIS :
<
DKMTW9:  EQU         $
         FLD         VAR+DKMTX       < X COURANT FLOTTANT.
         BSR         VAR+DKMTA3      < QUE L'ON FIXE...
         STA         DKMTX1-DEPCS,C  < X COURANT EN FIXE.
         FLD         VAR+DKMTY       < Y COURANT FLOTTANT.
         BSR         VAR+DKMTA3      < QUE L'ON FIXE...
         STA         DKMTY1-DEPCS,C  < Y COURANT EN FIXE.
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
         STZ         VAR+DKMRNA      < AFIN DE TRACER LE POINT DANS 'DKMTA1'...
XEIF%1:  VAL         ENDIF
         BSR         VAR+DKMTA1      < TRACE POINT.
DKMTW8:  EQU         $
         STX         DKMTX1-DEPCS,C  < RESTAURATION 'DKMTX1'...
         STY         DKMTY1-DEPCS,C  < ... ET 'DKMTY1'.
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
<
< GESTION DES POINTILLES, ET RETOUR :
<
         LA          VAR+MDKMPO
DKMTZP:  EQU         $               < (A)=PATTERN COURANTE DES POINTILLES,
         SCLS        BIT             < ON LA FAIT TOURNER,
         STA         VAR+MDKMPO      < ET ON LA MEMORISE...
XEIF%1:  VAL         ENDIF
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        A R R O N D I   D ' U N   N O M B R E   F L O T T A N T  :
<
<
<        ARGUMENT :
<                    (A,B)=NOMBRE FLOTTANT.
<
<
<        RESULTAT :
<                    (A)=NOMBRE FLOTTANT ARGUMENT CONVERTI EN
<                        ENTIER PAR EXCES OU PAR DEFAUT SUIVANT
<                        LES CAS...
<
<
DKMTP3:  EQU         $
         FCAZ                        < LE NOMBRE EST-IL POSITIF OU NEGATIF ???
         JL          DKMTWE          < NEGATIF...
         FAD         VAR+DKMT05      < POSITIF : ARRONDI PAR ADDITION DE 0.5...
         JMP         DKMTWF          < VERS LA CONVERSION ENTIERE...
DKMTWE:  EQU         $
         FSB         VAR+DKMT05      < NEGATIF : ARRONDI PAR SOUSTRACTION...
DKMTWF:  EQU         $
         FIX                         < CONVERSION ENTIERE...
         RSR
         PAGE
<
<
<        T R A N S F E R T   S I M U L T A N E   D E S   T R O I S
<        C O M P O S A N T E S   E N   E N T R E L A C A N T  :
<
<
<        FONCTION :
<                      CETTE FONCTION PERMET DE VISUALISER
<                    GLOBALEMENT LES 3 COMPOSANTES, ET CECI
<                    EN ENTRELACANT CES 3 DERNIERES ; A CETTE
<                    FIN, ON ENVOIE UN MOT ROUGE, PUIS UN MOT
<                    VERT, PUIS UN MOT BLEU, PUIS UN MOT ROUGE,...
<                      ON NE PEUT QUE REGRETTER QUE CETTE
<                    METHODE SOIT INAPPLIQUABLE LORS DES TRANSFERTS
<                    RAPIDES ENTRE 'DKU' ET 'MEMTV'...
<
<
DKUT50:  EQU         $
         CPI         -DKMTXY*NOCMO   < LE 'CODEM' VALAIT-IL TVLIMA*LK*
                                     < NOCMO*NCOOL ???
         JNE         DKUT8A          < NON, ERREUR...
         CPZR        Y               < OUI, Y-AVAIT-IL UN 'ASDEM' ???
         JNE         DKUT8A          < OUI, ERREUR...
         CALL        #SISP CMS5 BASE C#
                                     < C'EST-Y PAS MALHEUREUX MON BON
                                     < MONSIEUR D'EN ARRIVER LA...
         LA          ETASYS          < OUI,
         TBT         TVEXIS          < MAIS LA TELEVISION EST-ELLE ACTIVE ???
         JNC         DKUT53          < NON, ON SORT IMMEDIATEMENT...
<
< OK, TRANSFERT ENTRELACE DES 3 COMPOSNTES :
<
         ADRI        -DKMTC,W        < AINSI, 'W' BASE L'IMAGE...
         CALL        #SISP CMS5 PSRSLO#
                                     < SAUVEGARDE DE 'SLO' ET 'SLE'...
         LRM         A,B,Y
         WORD        MEMTV0          < (A)=VALEUR DU FUTUR 'SLO',
         WORD        MEMTVE-Z        < (B)=VALEUR DU FUTUR 'SLE',
         WORD        TVLIMA*LK       < (Y)=LONGUEUR D'UNE TRAME=CONSTANTE DE
                                     <     PASSAGE D'UNE TRAME A L'AUTRE.
         BSR         VAR+ATWOED      < ON INITIALISE 'SLO' ET 'SLE' SUR LA
                                     < MEMOIRE DE VISUALISATION 'MEMTV'.
         LR          Y,A
         SARD        NBITMO          < (A,B)=LONGUEUR D'UNE TRAME,
         DV          VAR+DKMLBK      < (A)=NOMBRE DE BLOCS MONOCHROMATIQUES
                                     <     CONTENUS DANS UNE TRAME.
         CPZR        B               < ET LE RESTE ???
         JE          DKUT56          < ET BIEN, IL EST NUL...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      VERIFIER SI 'DKMLBK' A ETE MODIFIE,
<                    ET SI OUI, PAR QUI ???
<
DKUT56:  EQU         $
         LR          A,X             < (X)=NOMBRE DE BLOCS PAR TRAME=NOMBRE DE
                                     <     XNCOOL-TRANSFERTS DE BLOCS...
         LR          W,A             < (A)=ADRESSE DE DEBUT DE L'IMAGE A
                                     <     TRANSFERER=ADRESSE DE L'EMETTEUR,
         LBI         TVAR0           < (B)=ADRESSE RELATIVE A 'MEMTV' DE LA
                                     <     MEMOIRE DE VISUALISATION=ADRESSE DU
                                     <     RECEPTEUR.
<
< BOUCLE DE TRANSFERT DES 'XNCOOL' COMPOSANTES :
<
DKUT54:  EQU         $
         PSR         A,B,X
         LXI         XNCOOL          < (X)=NOMBRE DE COMPOSANTES.
<
< BOUCLE DE TRANSFERT D'UN XNCOOL-BLOC :
<
DKUT55:  EQU         $
         PSR         X
         LX          VAR+DKMLBK      < (X)=LONGUEUR D'UN BLOCS=NOMBRE DE MOTS
                                     <     A DEPLACER.
         MVTS                        < ENVOI D'UN BLOC EN 'MEMTV',
         ADR         Y,A             < PASSAGE AU BLOC EMETTEUR SUIVANT,
         ADR         Y,B             < PASSAGE AU BLOC RECEPTEUR SUIVANT,
         PLR         X
         JDX         DKUT55          < S'IL EXISTE...
         PLR         A,B,X
         AD          VAR+DKMLBK      < PROGRESSION DES EMETTEURS,
         XR          A,B
         AD          VAR+DKMLBK      < ET DES RECPTEURS,
         XR          A,B
         JDX         DKUT54          < S'IL EN EXISTE...
<
< FIN DU PROCESSUS :
<
                                     < RESTAURATION DE (SLO,SLE) :
         CALL        #SISP CMS5 PLRSLO#
DKUT53:  EQU         $
         PLR         B,Y,C,W
         BR          VAR+ADKM2       < VERS LA SORTIE...
         PAGE
<
<
<        T R A C E   D U   S E G M E N T   ( ( X 1 , Y 1 ) , ( X 2 , Y 2 ) )  :
<
<
<        FONCTION :
<                      CE MODULE EST CHARGE DE L'INTERPOLATION
<                    GRAPHIQUE ENTRE 2 POINTS ARGUMENTS (X1,Y1)
<                    ET (X2,Y2), SUIVANT LE MODE 'SBT'/'RBT' PRECISE
<                    PAR L'ARGUMENT 'DKMTMO'.
<                      ON TROUVERA DANS 'DCTDKU' LE FORMAT DES
<                    ARGUMENTS TELS QUI SONT SITUES DEVANT
<                    L'IMAGE RECEVANT LE SEGMENT. ON NOTERA
<                    QUE LES COORDONNES ARGUMENT SONT DONNEES
<                    EN FORMAT GRAPHIQUE, PUIS RENVOYEE SI
<                    TOUT S'EST BIEN PASSE EN FORMAT 'TV'
<                    AU DEMANDEUR...
<                      ENFIN ON NOTERA LE MOT "INUTILE" APPELE
<                    'DKMTCO' ET DESTINE A EVITER DES PERTES
<                    D'INFORMATIONS DUES AU FAIT QUE LE BLOC
<                    FLOTTANT ECRIT DANS LE MOT D'ADRESSE (C)-'DEPCS'...
<
<
DKMTV5:  EQU         $               < POINT D'ENTREE...
                                     < (A)=(CODEM)-TVLIMA*LK*NOCMO,
                                     < (Y)=MOT DE CONTROLE DE LA 'TV'...
<
< GESTION DES NIVEAUX :
<
         IF          NIVMAX-K,,,XEIF%
         IF          'NIVMAX' EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
         STZ         VAR+DKNIVO      < A PRIORI,
         DC          VAR+DKNIVO      < PAS DE NIVEAU DE GRIS...
         CPI         DKMTXY*NOCMO    < AVEC OU SANS ???
         JE          DKMTW4          < SANS...
         IF          DIMALI-DIMAL2,XEIF%1,,XEIF%1
         LA          VAR+FWORK       < (A)=(CODEM),
XEIF%1:  VAL         ENDIF
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
         LA          VAR+DKPOIN      < (A)=(CODEM),
XEIF%1:  VAL         ENDIF
         CPI         DKMTXY*NOCMO    < EST-CE UN 'CODEM' REDUIT ???
         JNE         DKMTVK          < NON...
         LA          DKMTMO-DEPCS,C  < OUI, ALORS EST-CE BIEN 'MEMTV' QUI
         ANDI        DKMOBA          < EST DEMANDEE ???
         JAE         DKUT8           < NON, ERREUR...
         JMP         DKMTVL          < OUI, ON CONTINUE...
DKMTVK:  EQU         $
         SB          VAR+DKMLI3      < EST-CE UNE TRAME AVEC NIVEAU DE GRIS ???
         JANE        DKUT50          < NON, ALORS PEUT-ETRE TRANSFERT GLOBAL
                                     < EN MODE ENTRELACE...
DKMTVL:  EQU         $
         CPZR        Y               < OK, AVEC NIVEAU DE GRIS ; MAIS A-T'ON
                                     < DEMANDE UNE VISUALISATION ???
DKUT8A:  JNE         DKUT8           < OUI, ERREUR, ON NE PEUT PAS TOUT FAIRE...
                                     < (ET RELAI...)
         LA          DKMTMO-DEPCS,C  < (A)=MODE DEMANDE POUR LE TRACE :
         ANDI        DKMNIV          < ON EXTRAIT LE NIVEAU DE GRIS,
XWOR%1:  VAL         DKMNIV=K
         IF          XWOR%1-K,,XEIF%,
         SLRS        XWOR%1
XEIF%:   VAL         ENDIF
         CPI         ANTIAL          < ET ON LE VALIDE...
         JG          DKUT8           < TROP GRAND...
         JNE         DKMTVE          < IL S'AGIT D'UN NIVEAU DE GRIS IMPOSE...
         IF          ANTIAL-NIVMAX-I,,XEIF%,
         IF          ATTENTION : LE TEST PRECEDENT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         LAI         NIVMAX          < IL S'AGIT D'UNE DEMANDE D'ANTI-ALIASING,
                                     < ON PREND LE MAX, AU CAS OU LE SEGMENT A
                                     < TRACER SERAIT HORIZONTAL OU VERTICAL...
DKMTVE:  EQU         $
         STA         VAR+DKNIVO      < INITIALISATION DE 'DKNIVO', AU CAS OU
                                     < L'ON TOMBERAIT SUR UNE HORIZONTALE OU
                                     < UNE VERTICALE...
<
< GESTION DES "TRANSPARENCES" :
<
         LA          DKMTCO-DEPCS,C
         STA         VAR+DKTCO       < TRANSMISSION DU CHAMP 'DKMLCO' EN
                                     < PARTICULIER...
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
<
< GESTION DES POINTILLES :
<
         IF          DKMPOI-MOCD,,XEIF%,
         IF          ATTENTION : VU LE 'SWBR', 'DKMPOI' DOIT ETRE
         IF          UN OCTET !!!
XEIF%:   VAL         ENDIF
         ANDI        DKMPOI          < RECUPERATION DE LA PATTERN DES POIN-
                                     < TILLES...
XWOR%5:  VAL         DKMPOI=K
         IF          XWOR%5-K,,XEIF%,
         SLRS        XWOR%5          < ET CADRAGE SI NECESSAIRE...
XEIF%:   VAL         ENDIF
         SWBR        A,B             < DUPLICATION DANS L'OCTET GAUCHE DE 'B',
         ORR         B,A             < ET MISE SUR 16 BITS DANS 'A' PAR
                                     < DUPLICATION DE 'DKMPOI'...
         STA         VAR+MDKMPO      < ET INITIALISATION AISNI DE LA PATTERN
                                     < CYCLIQUE DES POINTILLES...
XEIF%1:  VAL         ENDIF
<
< GESTION DES DECALAGES :
<
         LA          DKMTMO-DEPCS,C
         ANDI        DKMDEC
         SLRS        DKMDEC=K        < (A)=DECALAGE A APPLIQUER AU NIVEAU ANTE-
                                     <     RIEUR DE CHAQUE POINT...
         STA         VAR+DKDECA      < OK, MEMORISATION DU DECALAGE...
         LA          DKMTMO-DEPCS,C  < (A)=MODE DEMANDE POUR LE TRACE :
XWOR%5:  VAL         CODBT=FMASK(K?DKMSRI=FCINST)DKMSRI
         IF          XWOR%5-L,,XEIF%,
         SLLS        XWOR%5          < CADRAGE A GAUCHE...
XEIF%:   VAL         ENDIF
         SARS        DKMSRI=K        < ON EXTRAIT LE MODE 'SBT', 'RBT' OU 'IBT',
         JMP         DKMTVC          < VERS SA MEMORISATION ; NOTONS QUE
                                     < TEST SUR 'Y' A DEJA ETE FAIT...
DKMTW4:  EQU         $
         LR          Y,A             < (Y)=A=MOT DE CONTROLE REDUIT DE 'TV'.
         ANDI        TVIN            < L'ENTREE EST-ELLE DEMANDEE ???
         JANE        DKUT8           < IL EST COMPLETEMENT IDIOT CELUI-LA !!!
<
< VALIDATION DU MODE DE TRACE :
<
         LA          DKMTMO-DEPCS,C  < VALIDATION DU MODE DEMANDE...
DKMTVC:  EQU         $
         STA         VAR+DKMTRS      < MEMORISATION DU MODE DE TRACE DEMANDE ;
                                     < ON LE FAIT AVANT LA VALIDATION AFIN
                                     < D'INCLURE LA NOUVELLE LOGIQUE BINAIRE...
         RBT         DKLODD          < METTONS NOUS A PRIORI EN LOGIQUE FLOUE
                                     < (OU EN MODE 'SBT'/'RBT'/'IBT'), ET CECI
                                     < AFIN DE NE PAS INTRODUIRE DE NOUVELLES
                                     < FONCTIONS (AUTRES QUE 'DKMTSB', 'DKMTRB'
                                     < ET 'DKMTIB'),
         TBT         DKLODF          < ON DUPLIQUE LE BIT 'DKLOGF' SUR 'DKLOGD'
                                     < AFIN DE SE METTRE EN FLOU...
         JNC         DKMTVM          < CAS DE 'DKMTSB' OU 'DKMTRB'...
         SBT         DKLODD          < CAS DE 'DKMTIB'...
DKMTVM:  EQU         $
         CPI         DKMTSB          < ???
         JE          DKMTV7          < OK...
         CPI         DKMTRB          < ???
         JE          DKMTV7          < OK...
         CPI         DKMTIB          < ???
         JNE         DKUT8           < NON, SORTIE EN ERREUR...
DKMTV7:  EQU         $
         IF          DKMTCO-K,,XEIF%,
         IF          ATTENTION : IL FAUT QUE LE MOT RESERVE AU BLOC
         IF          FLOTTANT SOIT EN TETE SINON !!!
XEIF%:   VAL         ENDIF
         CALL        #SISP CMS5 PSRSLO#
                                     < SAUVEGARDE DE (SLO,SLE),
         LRM         A,B
         WORD        MEMTV0
         WORD        MEMTVE-Z        < NOTA : ON NE PREND PAS LA 'CDAI' ENTIERE
                                     < AFIN D'EVITER DES PROBLEMES AU CAS OU
                                     < L'ON AURAIT "!CDAI=J" ACTIVE...
         BSR         VAR+ATWOED      < ON SE PLACE SUR 'MEMTV' A PRIORI...
<
< REDUCTION DES COORDONNEES (PASSAGE
< DE L'ECHELLE GRAPHIQUE A L'ECHELLE TV) :
<
<        NOTA SUR LA "FRUSTRATION DES PIXELS" :
<                      RAISONNONS A UNE DIMENSION,
<                    SUR L'AXE DES 'X' PAR EXEMPLE :
<                    IMAGINONS 3 POINTS 'A', 'M' ET
<                    'B' TELS QUE :
<
<                                    X(A)='100,
<                                    X(M)='1FF,
<                                    X(B)='2FE,
<                    ON A :
<                                    X(M)=(X(A)+X(B))/2,
<                    ET :
<                                    X(M)-X(A)=X(B)-X(M)='FF,
<                    LE POINT 'M' EST AU MILIEU DU
<                    SEGMENT GRAPHIQUE 'AB' :
<
<                                    AM=MB.
<                      APPLIQUONS LA REDUCTION 'TV',
<                    C'EST-A-DIRE DIVISONS LES COOR-
<                    DONNEES PAR 4 :
<
<                                    XT(A)='100/4='40,
<                                    XT(M)='1FF/4='7F,
<                                    XT(B)='2FE/4='BF,
<                    ON A MAINTENANT :
<                                    XT(M)-XT(A)='3F,
<                                    XT(B)-XT(M)='40,
<                    LE POINT 'M' EN FORMAT 'TV' N'EST
<                    PLUS AU MILIEU DU SEGMENT 'AB' !!!
<                      IL Y A AINSI FRUSTRATION DU
<                    POINT 'M', ET SUIVANT LA METHODE DE
<                    CORRECTION APPLIQUEE, 'M' SE RAP-
<                    PROCHERA DE 'A' (CAS DES DIVISIONS
<                    PAR DEFAUT CI-DESSUS), OU DE 'B'
<                    (DIVISION PAR EXCES) ; ETENDU A
<                    DEUX DIMENSIONS, ON VOIT QU'AINSI
<                    LES PENTES DES VECTEURS RISQUENT
<                    DE NE PAS ETRE CONSERVEE LORS DU
<                    PASSAGE GRAPHIQUE-TV...
<                      DE PLUS, UNE METHODE DE CORRECTION
<                    "CONTEXTUELLE" (C'EST-A-DIRE TENANT
<                    COMPTE DU SEGMENT ENTIER POUR CORRIGER
<                    LES COORDONNEES INDIVIDUELLES DES
<                    EXTREMITES) FAIT QU'UN MEME POINT
<                    APPARTENANT A DEUX SEGMENTS DIFFERENTS
<                    (VOIR PAR EXEMPLE LES SOMMETS D'UN
<                    CARRE) RISQUE DE DONNER NAISSANCE A
<                    DEUX POINTS DIFFERENTS EN 'TV'...
<
         PSR         W               < SAUVEGARDE DE LA BASE 'W'...
XWOR%1:  VAL         BIT>XXDEDX-E    < POUR LES DIVISIONS PAR EXCES SUR 'X',
XWOR%2:  VAL         BIT>XXDEDY-E    < POUR LES DIVISIONS PAR EXCES SUR 'Y'.
         IF          XWOR%1-XWOR%2,,XEIF%,
         IF          ATTENTION : LA MISE DE L'INCREMENT DANS 'W' EST
         IF          MAUVAISE, IL FAUT DEUX REGISTRES !!!
XEIF%:   VAL         ENDIF
         LAI         XWOR%1?XWOR%2(K < CONSTANTE DE GESTION DE LA FRUSTRATION :
                                     < =0 : LES PENTES NE VONT PAS ETRE RES-
                                     <      PECTEES EN PASSANT DU GRAPHIQUE
                                     <      A LA 'TV' BASSE-DEFINITION (DANS
                                     <      CERTAINS CAS : LORSQUE LES COORDON-
                                     <      NEES NE SONT PAS EXACTEMENT DIVISI-
                                     <      BLES...),
                                     < #0 : UN MEME POINT GRAPHIQUE RISQUE DE
                                     <      DONNER NAISSANCE A PLUSIEURS POINTS
                                     <      'TV' (LORSQUE LES COORDONNEES NE
                                     <      SONT PAS EXACTEMENT DIVISIBLES...),
                                     <      VOIR PAR EXEMPLE UN CARRE...
         LR          A,W             < (W)=CONSTANTE DE FRUSTRATION.
         LA          DKMGX1-DEPCS,C  < COORDONNEE X1 :
         CP          DKMGX2-DEPCS,C
         JGE         DKMTWP          < (X1)>=(X2)...
         ADR         W,A             < (X1)<(X2)...
DKMTWP:  EQU         $
         SARS        XXDEDX          < CONVERSION EN MODE 'TV',
         LR          A,X             < ET STOCKAGE TEMPORAIRE : (X)=X1.
         LA          DKMGY1-DEPCS,C  < COORDONNEE Y1 :
         CP          DKMGY2-DEPCS,C
         JGE         DKMTWQ          < (Y1)>=(Y2)...
         ADR         W,A             < (Y1)<(Y2)...
DKMTWQ:  EQU         $
         SARS        XXDEDY          < CONVERSION EN MODE 'TV',
         NGR         A,A             < EN EFFET LES AXES 'Y' DE 'TV' ET
         AD          VAR+DKMTNL      < DU GRAPHIQUE SONT INVERSES...
         LR          A,Y             < ET STOCKAGE TEMPORAIRE : (Y)=Y1.
         LA          DKMGX2-DEPCS,C  < COORDONNEE X2 :
         CP          DKMGX1-DEPCS,C
         JGE         DKMTWR          < (X2)>=(X1)...
         ADR         W,A             < (X2)<(X1)...
DKMTWR:  EQU         $
         SARS        XXDEDX          < CONVERSION EN MODE 'TV,
         LR          A,B             < ET STOCKAGE TEMPORAIRE : (B)=X2.
         LA          DKMGY2-DEPCS,C  < COORDONNEE Y2 :
         CP          DKMGY1-DEPCS,C
         JGE         DKMTWS          < (Y2)>=(Y1)...
         ADR         W,A             < (Y2)<(Y1)...
DKMTWS:  EQU         $
         SARS        XXDEDY          < CONVERSION EN MODE 'TV',
         NGR         A,A             < EN EFFET, LES AXES 'Y' DE 'TV' ET
         AD          VAR+DKMTNL      < DU GRAPHIQUE SONT INVERSES...
<
< ORDONNANCEMENT DES COORDONNEES TEL QUE (X1)<=(X2) :
< (JE SUPPRIME LE CODE, CAR DE TOUTE EVIDENCE
< CELA N'ARRANGE PAS LES CHOSES, MAIS JE LE
< LAISSE EN COMMENTAIRES, CAR ON NE SAIT
< JAMAIS...)
<
<        CPR         B,X             < COMPARAISON DE (X1) ET (X2) :
<        JLE         DKMTWG          < OK, (X1)<=(X2)...
<        XR          A,Y             < SINON, ON PERMUTE
<        XR          B,X             < LES 2 POINTS...
DKMTWG:  EQU         $
         PLR         W               < RESTAURE LA BASE 'W' QUI POINTE LA
                                     < LISTE DES COORDONNEES...
                                     < A T T E N T I O N  : LES COMMENTAIRES
                                     < QUI SUIVENT N'ONT PLUS DE VALEUR :
         STA         DKMTY2-DEPCS,C  < (A)=Y2 SI (X1)<=(X2), (A)=Y1 SINON,
         STB         DKMTX2-DEPCS,C  < (B)=X2 SI (X1)<=(X2), (B)=X1 SINON,
         STY         DKMTY1-DEPCS,C  < (Y)=Y1 SI (X1)<=(X2), (Y)=Y2 SINON,
         STX         DKMTX1-DEPCS,C  < (X)=X1 SI (X1)<=(X2), (X)=X2 SINON.
<
< CALCUL DELTAX ET DELTAY.
<
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
         STZ         VAR+DKPOIN      < A PRIORI, IL NE S'AGIT PAS D'UN POINT
                                     < ISOLE...
XEIF%1:  VAL         ENDIF
         LA          DKMTX2-DEPCS,C
         SB          DKMTX1-DEPCS,C
         STA         VAR+DKMTDX      < DELTAX=X2-X1.
         FLT
         FST         VAR+DKMTDF      < DELTAX FLOTTANT.
         LA          DKMTY2-DEPCS,C
         SB          DKMTY1-DEPCS,C
         STA         VAR+DKMTDY      < DELTAY=Y2-Y1.
         JAE         DKUT1
         CPZ         VAR+DKMTDX
         JNE         DKUT2
<
< ICI, DELTAX = 0 ET DELTAY # 0 : LIGNE VERTICALE.
<
         IF          DKMTY1-DKMTC-D,XEIF%,,XEIF%
         ADRI        D,W             < POUR FAIRE VARIER Y DANS LA BOUCLE.
XEIF%:   VAL         ENDIF
         LX          VAR+DKMTDY
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
         LA          &VAR+DKMINF     < (A)=PENTE D'UNE DROITE VERTICALE...
XEIF%1:  VAL         ENDIF
DKUT3:   EQU         $
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
         FLT
         FST         VAR+DKMTA       < MISE EN PLACE DE LA PENTE DES DROITES
                                     < VERTICALES (INFINI) ET HORIZONTALE
                                     < (NULLE)...
XEIF%1:  VAL         ENDIF
         LAI         I               < PAS DE VARIATION = 1 A PRIORI.
         CPZR        X
         JGE         DKUT32
         NGR         A,A             < PAS DE VARIATION = -1.
         NGR         X,X             < COUNT POSITIF.
DKUT32:  EQU         $
         ADRI        I,X             < AFIN DE TRACER LE POINT EXTREME (X2,Y2).
DKUT31:  EQU         $
         PSR         A               < SAUVEGARDE DU PAS...
         LA          DKMTX1-DEPCS,C
         FLT
         FST         VAR+DKMTX       < FLOTTAGE
         LA          DKMTY1-DEPCS,C
         FLT
         FST         VAR+DKMTY       <          DES COORDONNEES...
         PLR         A               < RESTAURATION DU PAS...
         BSR         VAR+DKMTA2      < ET TRACE DU POINT COURANT (X1,Y1)...
         XM          O,W
         AD          O,W             < INCREMENTATION/DECREMENTATION D'1...
         XM          O,W
         JDX         DKUT31          < POINT SUIVANT.
         JMP         DKUT40          < C'EST FINI.
DKUT8:   JMP         DKMTV8          < RELAI...
<
< ICI, DELTAY=0 : LIGNE HORIZONTALE (OU POINT
< ISOLE SI DELTAX=0) :
<
DKUT1:   EQU         $
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
         CPZ         VAR+DKMTDX      < EST-CE UN POINT ISOLE ???
                                     < (DELTAX)=(DELTAY)=0...
         JNE         DKUT1A          < NON (ON A DEJA : (DKPOIN)=0)...
         IC          VAR+DKPOIN      < OUI, ON LE MEMORISE...
DKUT1A:  EQU         $
XEIF%1:  VAL         ENDIF
         IF          DKMTX1-DKMTC-D,XEIF%,,XEIF%
         ADRI        D,W             < POUR FAIRE VARIER X DANS LA BOUCLE.
XEIF%:   VAL         ENDIF
         LX          VAR+DKMTDX
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
         LAI         K/W             < (A)=PENTE D'UNE DROITE HORIZONTALE...
XEIF%1:  VAL         ENDIF
         JMP         DKUT3           < ET VOILA.
DKUT2:   EQU         $
<
< ICI, DELTAX # 0 ET DELTAY # 0,
< IL FAUT DONC CALCULER L'EQUATION
< DE LA DROITE :
<
         FLD         VAR+DKMTDF      < (A,B)=DELTAX.
         FST         VAR+DKMTA
         LA          VAR+DKMTDY
         FLT
         FDV         VAR+DKMTA
         FST         VAR+DKMTA       < (DKMTA)=(A,B)=DELTAY/DELTAX.
         LA          DKMTX1-DEPCS,C
         FLT
         FMP         VAR+DKMTA
         FST         VAR+DKMTB
         LA          DKMTY1-DEPCS,C
         FLT
         FSB         VAR+DKMTB
         FST         VAR+DKMTB       < (DKMTB)=(A,B)=Y1-(DKMTA)*X1.
<
< TRACE DU SEGMENT A L'AIDE DE 'N' POINTS
< TEL QUE N=MAX(ABS(DELTAX,DELTAY)) :
<
         LA          VAR+DKMTDX      < (A)=DELTAX.
         JAGE        DKUT11
         NGR         A,A             < (A)=ABS(DELTAX).
DKUT11:  EQU         $
         LR          A,Y
         LA          VAR+DKMTDY
         JAGE        DKUT12
         NGR         A,A
DKUT12:  EQU         $
         CPR         Y,A
         JGE         DKUT13
         LR          Y,A
DKUT13:  EQU         $
         LR          A,X             < (A)=(X)=MAX(DELTAX,DELTAY) EN
                                     <         VALEUR ABSOLUE.
         FLT
         FST         VAR+DKMTN       < NOMBRE DE PAS EN FLOTTANT.
         LYI         K               < (Y)=NUMERO DE PAS (DE 0 A 'N').
DKUT5:   EQU         $
         LR          Y,A             < NUMERO DU PAS COURANT.
         FLT
         FMP         VAR+DKMTDF
         FDV         VAR+DKMTN
         FST         VAR+DKMTX       < ((NUMERO DE PAS)*(DELTAX))/(NOMBRE PAS).
         LA          DKMTX1-DEPCS,C
         FLT
         FAD         VAR+DKMTX
         FST         VAR+DKMTX       < (DKMTX)=COORDONNEE 'X' COURANTE FLOTTANT,
         FMP         VAR+DKMTA
         FAD         VAR+DKMTB
         FST         VAR+DKMTY       < (DKMTY)=COORDONNEE 'Y' COURANTE FLOTTANT,
                                     <        = A*X+B, SOIT : Y=A*X+B...
         BSR         VAR+DKMTA2      < TRACE POINT DU POINT COURANT DE
                                     < COORDONNEES (DKMTX,DKMTY) FLOTTANTES.
         ADRI        I,Y             < INCREMENTATION DU PAS (Y),
         CPR         X,Y             < ET PASSAGE AU POINT SUIVANT,
         JLE         DKUT5           < S'IL EXISTE...
<
< SORTIE NORMALE :
<
DKUT40:  EQU         $
                                     < RESTAURATION DE (SLO,SLE) :
         CALL        #SISP CMS5 PLRSLO#
         JMP         DKMTV6          < VERS UN DISPLAY EVENTUEL DE L'IMAGE.
<
< SORTIES EN ERREUR :
<
DKMTV8:  EQU         $
         LA          VAR+DKTCO
         STA         DKMTCO-DEPCS,C  < RESTAURATION DE 'DKMTCO' QUI EST DETRUIT
                                     < PAR CE MALHEUREUX BLOC FLOTTANT !!!
         PLR         B,Y,C,W         < ON RESTAURE...
         JMP         GRDKM3          < VERS LA SORTIE EN ERREUR DU HANDLER...
         PAGE
<
<
<        A C C E S   U T I L I S A T E U R S   A   L A
<        T E L E V I S I O N   N U M E R I Q U E  :
<
<
DKMTV1:  EQU         $
         RDOE                        < LECTURE DE (SLO,SLE) COURANTS :
         LRM         B
         WORD        MEMTV0          < (B)=ADRESSE DE 'MEMTV',
         CPR         A,B             < LA DEMANDE COURANTE REFERENCE-T'ELLE
                                     < 'MEMTV' ???
         JNE         DKMTQ1          < NON, DONC PAS DE TESTS DE PROTECTION
                                     < PAR "!Q1"...
         LA          NSPTYP
         TBT         VBOX            < LA DEMANDE COURANTE A-T'ELLE UNE 'BOX' ?
         JNC         DKMTQ1          < NON, PAS DE TEST DE BLOCAGE...
         LA          BOX             < OUI :
         EOR         VAR+LSDK        < ON FAIT UN .EOR. ENTRE LA LISTE DES
                                     < APPROPRIATIONS PARTIELLES ('BOX') ET
                                     < LA LISTE DES APPROPRIATIONS GENERALES
                                     < ('LSDK') :
         TBT         BLDKTV          < ON TESTE LE DERNIER GROUPE DE CYLINDRES
                                     < QUI PROTEGE AUSSI L'ACCES A 'MEMTV' :
         JC          GRDKM3          < ERREUR, L'ACCES EST INTERDIT POUR CE
                                     < DEMANDEUR : BOX=0 ET LSDK=1 (L'AUTRE
                                     < CONFIGURATION DE BITS (1 ET 0) ETANT
                                     < IMPOSSIBLE...
DKMTQ1:  EQU         $               < PAS DE TEST NECESSAIRE, OU BIEN
                                     < (BOX)=LSDK : ACCES LIBRE (=0), OU BIEN
                                     <       RESERVE A CE DEMANDEUR (=1)...
         LA          ARGDEM+AMDEM
         SLRD        NOCMO=NBITMO    < (B)=ADRESSE MOT DE L'IMAGE.
         LA          ARGDEM+ASDEM    < INDICATEURS DE CONTROLE PRESUMES...
         ANDI        TVIN?TVSIMU     < NE CONSERVONS QUE LE NECESSAIRE :
         CP          ARGDEM+ASDEM    < Y-AVAIT'IL AUTRE CHOSE ???
         JNE         GRDKM3          < OUI, REFUSE...
         LR          A,Y             < (Y)=MOT DE CONTROLE DE LA 'TV'...
         LA          ARGDEM+CODEM
         IF          DIMALI-DIMAL2,XEIF%1,,XEIF%1
         STA         VAR+FWORK       < SAUVEGARDE DU 'CODEM' A CAUSE DE 'W'...
XEIF%1:  VAL         ENDIF
         IF          DIMALI-DIMAL1,XEIF%1,,XEIF%1
         STA         VAR+DKPOIN      < SAUVEGARDE DU 'CODEM' A CAUSE DE 'W'...
XEIF%1:  VAL         ENDIF
         SB          VAR+DKMLI1      < DISCRIMINATION DISPLAY/INTERPOLATION...
         JAE         DKMTV2          < SEUL UN DISPLAY A ETE DEMANDE...
<
<
<        I N T E R P O L A T I O N  :
<
<
         PSR         B,Y,C,W         < ET OUI, MEME 'C'...
         LR          B,C             < (C)=ADRESSE DE L'EN-TETE,
         LR          B,W
         ADRI        DKMTC,W         < (W)=BASE DE LA LISTE DES SEGMENTS.
         LBI         DEPCS           < ATTENTION : DEPCS>127 !!!
         ADR         B,C             < AINSI, (C)-'DEPCS' POINTE SUR LE MOT
                                     < 'DKMTCO' RESERVE AUX EXTRAVAGANCES DU
                                     < BLOC FLOTTANT !!!
                                     < MAIS, A T T E N T I O N... DORENAVANT
                                     < 'DKMTCO' TRANSMET (PAR MANQUE DE PLACE)
                                     < LE CHAMP 'DKMLCO' !!!
         BR          VAR+DKMTA5      < VERS L'INTERPOLATION...
                                     < (A)=(CODEM)-TVLIMA*LK*NOCMO,
                                     < (Y)=MOT DE CONTROLE DE LA 'TV'...
<
< RETOUR DE L'INTERPOLATION :
<
DKMTV6:  EQU         $
         LA          VAR+DKTCO
         STA         DKMTCO-DEPCS,C  < RESTAURATION DE 'DKMTCO' QUI EST DETRUIT
                                     < PAR LE BLOC FLOTTANT (ET FLUCTUAT NEC
                                     < MERGITUR... COMME ON DIT A LA SEMS...).
         PLR         B,Y,C,W
         ADRI        DKMTXY,B        < (B)=ADRESSE MOT DE L'IMAGE...
<
<
<        D I S P L A Y  :
<
<
DKMTV2:  EQU         $
         LR          Y,A             < (A)=MOT DE CONTROLE DE LA 'TV'...
         PSR         W
         CALL        #SISP CMS5 W ZERO#
                                     < (W)=BASE DE LA MEMOIRE DEBANALISEE.
         XM          TVCTRL-ZERO,W   < POSITIONNEMENT DU CONTROLE,
         XR          A,B             < PERMUTATION ET SAUVEGARDE...
         XM          TVMEME-ZERO,W   < AINSI QUE DE L'ADRESSE DE L'IMAGE...
         SVC         SVCM3           < ET ON VISUALISE...
         XM          TVMEME-ZERO,W   < PUIS ON RESTAURE CE
         XR          A,B
         XM          TVCTRL-ZERO,W   < L'ON A DETRUIT...
         PLR         W               < PUIS L'ADRESSE DE LA DEMANDE COURANTE.
         STZ         ETAT0           < RETOUR OK, POUR LA TV...
         JMP         DKM3RR          < ET C'EST FINI...
         PAGE
<
<
<        S I M U L A T I O N   ' D K U '   S U R   ' D K M '  :
<
<
<        NOTA :
<                      LORSQUE 'DKU' EST SIMULE SUR 'DKM',
<                    'DKU' TRANSMET SES DEMANDES A 'DKM',
<                    EN VERIFIANT AU PREALABLE, AVEC UNE
<                    MARGE DE SECURITE, QUE L'ECHANGE
<                    DEMANDE PORTE SUR DES 'QUANTA'-SECTEURS
<                    APPARTENANT A DES 'GB' INACCESSIBLES
<                    A L'ALLOCATION DISQUE (BIT0 DE 'NSLGB'
<                    A 1).
<
<
DKU1:    EQU         $
         LA          ARGDEM+OPDEM
         TBT         XBITQ           < L'ECHANGE DEMANDE CONCERNE-T'IL
                                     < DES SECTEURS OU DES Q-SECTEURS ???
         LA          ARGDEM+ASDEM    < A PRIORI DES Q-SECTEURS, ET ALORS,
                                     < (A)=ADRESSE DU PREMIER Q-SECTEUR...
         JNC         DKU2            < OUI, DES Q-SECTEURS...
         SLRD        NBITMO          < NON, DES SECTEURS, DANS CES CONDI-
         DV          VAR+DKMQUA      < ON CONVERTIT EN Q-SECTEURS.
DKU2:    EQU         $
         LR          A,Y             < (A)=(Y)=NUMERO DU Q-SECTEUR CONTENANT
                                     < LE PREMIER OCTET ECHANGE.
         SLRS        DECON           < DECONCATENATION (VOIR 'HDLREL'),
         ADRI        IJIJDX,A        < ET CONVERSION EN NUMERO DE 'GB' :
         LR          A,X             < (X)=NUMERO DU 'GB' CONTENANT LE PREMIER
                                     <     OCTET DE L'ECHANGE.
         LA          ARGDEM+CODEM    < (A)=NOMBRE D'OCTETS ECHANGES,
         AD          VAR+DKMLS       < ET MAJORATION LARGE...
         SLRD        NBITMO
         DV          VAR+DKMLS       < (A)=NOMBRE DE Q-SECTEURS MAJORE NECES-
                                     <     SAIRES POUR CONTENIR LES OCTETS
                                     <     ECHANGES.
         ADR         Y,A             < (A)=NUMERO DU Q-SECTEUR MAJORE CONTE-
                                     <     NANT LE DENIER OCTET DE L'ECHANGE.
         SLRS        DECON           < DECONCATENATION,
         ADRI        IJIJDX,A        < ET CONVERSION EN UN NUMERO DE 'GB' :
                                     < (A)=NUMERO MAJORE DU 'GB' CONTENANT
                                     <     LE DERNIER OCTET DE L'ECHANGE.
         LR          A,Y             < (Y)=NUMERO DU 'GB' CONTENANT LE DERNIER
                                     <     OCTET ECHANGE, OU BIEN SUIVANT...
         LRM         A
         WORD        COSBT?XXINGB=FMASK(K?NBSPGB=FCINST
                                     < (A)=ETAT D'UN 'GB' INACCESSIBLE A L'ALLO-
                                     <     CATION DISQUE (BITSIG) ET N'ETANT PAS
                                     <     UTILISE ('NBSPGB' Q-SECTEURS LIBRES)
                                     <     CET ETAT EST DONNE PAR 'ANSLGB'.
         CP          &ANSLGB         < LE PREMIER 'GB' (X) EST-IL UTILISABLE
                                     < POUR LA SIMULATION DE 'DKU' ???
         JNE         DKU3            < NON, ERREUR, MAUVAIS !!!
         XR          X,Y
         CP          &ANSLGB         < LE DERNIER 'GB' (Y <--> X) L'EST-IL ???
         JE          DKU4            < OUI, C'EST BON, LES OCTETS A ECHANGER
                                     < SONT SUR DES 'GB' LIBRES ET NON
                                     < ALLOUABLES.
DKU3:    EQU         $
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
                                     < L'ECHANGE PORTE ENTIEREMENT OU
                                     < PARTIELLEMENT SUR DES Q-SECTEURS
                                     < ALLOUABLES !!!
<
<        QUE FAIRE ???
<                      VERIFIER LES TABLES D'ALLOCATION DISQUE...
<
         JMP         GRDKM3          < PUIS, ON SORT EN ERREUR, EN EFFET,
                                     < IL PEUT AUSSI S'AGIR D'UNE ERREUR
                                     < D'UTILISATION !!!
<
< TRANSMISSION DE LA DEMANDE 'DKU' VERS 'DKM' :
<
DKU4:    EQU         $
         LA          NSPTYP
         ANDI        MKTD            < (A)=INDICATEURS A TRANSMETTRE D'UNE
         LR          A,Y             < DEMANDE A L'AUTRE, ET MISE DANS 'Y'.
         LAD         ARGDEM+OPDEM    < (A)=ADRESSE EMETTRICE...
         PSR         W               < SAUVEGARDE DE L'ADRESSE DE LA
                                     < DEMANDE A 'DKU'.
         LRM         B,X,W
         WORD        DEMUN+T         < (B)=ADRESSE RECEPTRICE,
         WORD        ASDEM-OPDEM+Z   < (X)=NOMBRE DE MOTS A DUPLIQUER,
         WORD        DEMUN           < (W)=ADRESSE DE LA DEMANDE A 'DKM'.
         MOVE                        < DUPLICATION DES ARGUMENTS A 'DKU'
                                     < DANS LA DEMANDE A 'DKM'.
         STY         NSPTYP          < TRANSMISSION DES INDICATEURS,
         LAI         NSPDKM          < ET MISE EN PLACE DU 'NSP'
         STBY        NSPTYP          < DE 'DKM'...
         BSR         ACHAND          < ENVOI DE LA DEMANDE A 'DKM',
         BSR         ACHANW          < ET ATTENTE DE FIN D'ECHANGE...
         LA          ARGDEM+ETADEM   < TRANSMISSION DES
         STA         ETAT0           < CONDITIONS DE RETOUR...
         PLR         W               < RESTAURE (W)=ADRESSE DE LA
                                     < DEMANDE A 'DKU'.
         JMP         DKM3RR          < ET ON SORT NORMALEMENT...
         PAGE
<
<
<        E N T R Y   ' D K U '  :
<
<
HDLDKU:  EQU         $
         TBT         TYPAD           < ADRESSE MOT OU OCTET ???
         JC          DKM11X          < MOT, PAS DE VERIFICATIONS...
         LA          ARGDEM+AMDEM    < OCTET : DOIT ETRE A UNE FRONTIERE PAIRE.
         TBT         NBITMO-B        < PAIRE ???
         JC          GRDKM3          < ERREUR, ADRESSE IMPAIRE...
DKM11X:  EQU         $
         LA          ARGDEM+OPDEM    < (A)=FONCTION DEMANDEE,
         CPI         FONTV           < EST-CE LA TELEVISION NUMERIQUE ???
         JE          DKMTV1          < OUI, QUEL TRUANDAGE QUAND MEME ?!?!??
         LA          ARGDEM+CODEM    < VALIDATION DU 'CODEM'.
         JALE        GRDKM3          < ERREUR...
         ADRI        NOCMO-E,A       < ARRONDI PAR EXCES,
         SLRS        NOCMO=K         < ET CONVERSION EN MOTS...
         CP          VAR+NMMDKM      < TROP ???
         JG          GRDKM3          < OUI, ERREUR...
         LA          ETASYS          < ACCES AUX INDICATEURS DE CONTROLE
                                     < DU SYSTEME,
         TBT         NSPDKU-NSPDK    < 'DKU' EST-IL PRESENT ???
         JNC         DKU1            < NON, ON VA LE SIMULER SUR 'DKM'...
<
< LORSQUE 'DKU' EST LA, FAUT-IL LE
< SYNCHRONISER SUR LE SECTEUR 0 ???
<
         LBI         CORBT?CCBDKM=FMASK(K=FCINST
         LA          ARGDEM+OPDEM
XWOR%1:  VAL         FGR?FGW=K
         TBT         NBITMO-B-XWOR%1 < LECTURE OU ECRITURE ???
         JNC         DKUS2           < LECTURE, PAS DE SYNCHRONISATION SUR
                                     < LE SECTEUR 0...
         LA          MEMV            < ECRTURE, QUEL EST L'ETAT DE 'MEMV' ???
         TBT         XSYNC0          < ALORS ???
         JC          DKUS1           < XSYNC0=1 : OUI, SYNCHRONISATION SUR 0...
DKUS2:   EQU         $               < CAS DES LECTURES...
         SBT         NBITMO+CCBDKM   < XSYNC0=0 : NON...
DKUS1:   EQU         $
         STB         VAR+DSYNC0      < INDICATEUR, ET GENERATEUR DU 'CCB'.
         LRM         A
         WORD        DKUTT1
         PSR         A               < AFIN DE SIMULER UN 'BR' VERS 'DKUTT1',
                                     < POUR ECONOMISER UN MOT DANS 'DCTDKU'...
         RSR                         < ALLONS TESTER LE MODE DE TRANSFERT
                                     < RAPIDE 'DKU' --> 'MEMTV' (EN 'DKUTT1').
GRDKM3:  BR          VAR+ADKM3       < RELAI DE RELAI...
DKM3RR:  JMP         DKM3R1          < RELAI DE RELAI...
         PAGE
<
<
<        E N T R Y   ' D K M '  :
<
<
HDLDKM:  EQU         $
<
< VALIDATION DE LA DEMANDE :
<
         TBT         TYPAD           < ADRESSE MOT OU OCTET ???
         JC          DKM11           < MOT, PAS DE VERIFICATION...
         LA          ARGDEM+AMDEM    < (A)=ADRESSE-OCTET DU BUFFER,
         TBT         NBITMO-B        < EST-ELLE BIEN A UNE FRONTIERE DE MOT ???
         JNC         DKM11
         BSR         ASYSER
DKM11:   EQU         $
         LA          ARGDEM+ETADEM   < (A)=NSP(DEMANDEUR).
         LXI         LLDKMN          < (X)=NOMBRE DE 'NSP' AUTORISES,
DKM11Y:  EQU         $
         CP          &VAR+ALDKMN     < LE 'NSP' EST-IL AUTORISE ???
         JE          DKM60           < OUI, ON Y VA...
         JDX         DKM11Y          < PEUT-ETRE...
ZDKM:    EQU         $               < ADRESSE DE LA SYSER SUR DEMANDEUR
                                     < DE 'DKM' NON RECONNU.
         BSR         ASYSER          < NI L'UN, NI L'AUTRE : A NOTER QUE
                                     < CELA N'EST PAS FORCEMENT UNE ERREUR
                                     < SYSTEME : CF. LES DUMPS DISQUES
                                     < PAR EXEMPLE...
DKM60:   EQU         $
         LA          ARGDEM+CODEM    < (A)=LONGUEUR-OCTETS DU BUFFER,
         ADRI        NOCMO-E,A       < QUE L'ON ARRONDIT EVENTUELLEMENT AU MOT
                                     < SUPERIEUR,
         SLRS        NOCMO=K
         CP          VAR+NMMDKM      < ET VALIDATION ???
         JG          HRDKM3          < ERREUR : ECHANGE TROP GRAND...
         LA          ARGDEM+ASDEM    < (A)=ADRESSE DU PREMIER SECTEUR,
         CP          INFINI          < LE SECTEUR 'INFINI' EST IMPOSSIBLE
                                     < A ATTEINDRE CAR EN EFFET, UN CHAINAGE DU
                                     < TYPE 'INFINI' EST UNE MARQUE DE FIN DE
                                     < CHAINE ; IL FAUT DONC QUE CELUI-CI SOIT
                                     < INALLOUABLE, CE QUE L'ON VERIFIE ICI...
         JNE         DKM1            < OK, SECTEUR AUTORISE PAR L'ALLOCATION...
         BSR         ASYSER          < C'EST PEUT-ETRE UNE ERREUR SYSTEME,
                                     < OU PEUT-ETRE PAS (VOIR PAR EXEMPLE DES
                                     < PROGRAMMES DE COPIE DE DISQUE... DANS
                                     < CES CONDITIONS, APRES AVOIR SIGNALE
                                     < L'ANOMALIE, ON CONTINUE...
DKM1:    EQU         $
XWOR%1:  VAL         DKMINX=K
XWOR%1:  VAL         -XWOR%1
         SLRS        -XWOR%1
         CPI         DKMINX>XWOR%1   < EST-CE UN SECTEUR INEXISTANT ???
         JNE         DKM1XX          < NON, ON VA FAIRE UNE ENTREE-SORTIE...
         BR          VAR+ADKMGS      < OUI, VERS L'INITIALISATION...
DKM1XX:  EQU         $
<
< 'DKF' EST-IL PRESENT ???
<
         LA          ETASYS
         TBT         NSPDKF-NSPDK    < 'DKF' EST-IL LA ???
         JC          DKM50           < OUI...
         LA          ARGDEM+ETADEM   < NON, ALORS QUI EST LE DEMANDEUR ???
         CPI         NSPDKF          < EST-CE JUSTEMENT 'DKF' ???
         JE          DKM52           < OUI, ON VA SIMULER...
         LA          ARGDEM+ASDEM    < NON, MAIS LE DEBUT DU 'DKM' ETANT
                                     < RESERVE A LA SIMULATION, IL FAUT
                                     < VALIDER 'ASDEM' ; ON PEUT RENCONTRER
                                     < CE CAS EN REPARTANT D'UNE ANCIENNE
                                     < VERSION DKF+DKM EN NE DEMANDANT QUE
                                     < DKM !!!
         SLRS        S               < PARCE QU'ELLE PEUVENT ETRE NEGATIVES...
         CP          VAR+VALFM       < VIOLATION ???
         JGE         SYSRB9          < NON, OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      PEUT-ETRE UNE SORTIE EN ERREUR 'JMP ERDKM3'...
<
SYSRB9:  EQU         $
         JMP         DKM50           < VERS L'ACCES AU DISQUE...
DKM3R1:  JMP         DKM3R           < RELAI...
         PAGE
<
<
<        S I M U L A T I O N   ' D K F '   S U R   ' D K M '  :
<
<
DKM52:   EQU         $
<
< PRISE EN COMPTE DES TRANSLATIONS
< D'ADRESSES EN Q=1 :
<
         PSR         X
         LAI         TRDKU0          < (A)=TRANSLATION NULLE A PRIORI...
         LB          NSPTYP
         TBT         NBITMO+VBOX     < Y-A-T'IL UNE 'BOX' DANS LA DEMANDE
                                     < COURANTE ???
         JNC         DKM52M          < NON (C'EST EN GENERAL LE CAS DE 'DKM')...
         LXI         K               < OUI, (X) VA INDEXER LA LISTE ASSOCIATIVE
                                     < DES (APPROPRIATIONS,TRANSLATIONS) :
         LA          BOX             < (A)=LISTE D'APPROPRIATION DES GROUPES
                                     <     DE CYLINDRES DU DEMANDEUR COURANT,
         IF          TRDKU0-K,,XEIF%,
         IF          ATTENTION : LE 'JAE' SUIVANT (QUI FINALEMENT
         IF          CONFOND UNE LISTE D'APPROPRIATION 'BOX', ET
         IF          UNE TRANSLATION RENVOYEE DANS 'A') VA MERDER !!!
XEIF%:   VAL         ENDIF
         JAE         DKM52M          < PAS DE LISTE D'APPROPRIATIONS, PAS DE
                                     < TRANSLATION, NAHHHH...
DKM52N:  EQU         $
         CP          &VAR+ATASQ      < RECHERCHE DE LA LISTE COURANTE 'BOX'
                                     < DANS LA LISTE 'TASQ'...
         JE          DKM52O          < TROUVEE...
         ADRI        ITASQ,X         < NON, A L'ENTREE SUIVANTE,
         XR          A,X             < SI ELLE EXISTE :
         CPI         LTASQ           < ???
         XR          A,X
         JL          DKM52N          < OUI...
DKM52P:  EQU         $
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE COMMENT IL SE PEUT
<                    QUE LA LISTE D'APPROPRIATION
<                    COURANTE 'BOX' NE SOIT PAS DANS
<                    LA LISTE 'ATASQ' DU DISQUE COURANT !!!
<                      OU COMMENT LA TRANSLATION PEUT
<                    ETRE DIFFERENTE DES 'TRDKU' PREVUS !!!
<
         LAI         TRDKU0          < ET ON FORCE UNE TRANSLATION NULLE...
         JMP         DKM52M
DKM52O:  EQU         $
         ADRI        ITASQT,X        < LORSQU'ON A TROUVE LA LISTE D'APPROPRIA-
                                     < TION DU DEMANDEUR, LE MOT SUIVANT DE
                                     < L'ENTREE COURANTE DONNE LA TRANSLATION,
         LA          &VAR+ATASQ      < (A)=TRANSLATION EN Q=1...
         JAL         DKM52P          < E R R E U R   S Y S T E M E...
         CPI         TRDKUM          < VALIDATION...
         JG          DKM52P          < E R R E U R   S Y S T E M E...
DKM52M:  EQU         $
         PLR         X
<
< CALCUL D'UN NUMERO DE SECTEUR :
<
         LB          ARGDEM+ASDEM    < ADRESSE SECTEUR DEMANDEE.
         DV          VAR+NBSRPP      < DANS LE CAS DE LA SIMULATION, ON
                                     < FAIT COMME SI 'QUANTA'=1...
         JNV         SYSRBA          < OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      VERIFIER LA 'DCT'...
<
SYSRBA:  EQU         $
         STB         VAR+SECT        < (B)=NUMERO DE SECTEUR.
         LR          A,B
         JMP         DKM51           < VERS LA SUITE DES CALCULS...
         PAGE
<
<
<        A C C E S   R E E L   A U   ' D K M '  :
<
<
DKM50:   EQU         $
         LA          ARGDEM+OPDEM    < (A)=FONCTION DEMANDEE,
         TBT         XBITQ           < QUELLE VALEUR DONNER A 'QUANTA' ???
         JC          DKM52           < 1...
         LAI         K               < 3...
         LB          ARGDEM+ASDEM    < (A,B)=ADRESSE DU PREMIER SECTEUR.
<
<
<        A T T E N T I O N  :
<                      LA RELATION 1 QUANTUM="QUANTA" SECTEURS
<                    EST PRISE EN COMPTE DANS LA VALEUR DE
<                    'NBSPP'.
<
<
         DV          VAR+NBSPP       < CONVERSION EN UN COUPLE (PISTE,SECTEUR).
         JNV         SYSRBB
         BSR         ASYSER
<
<        QUE FAIRE ???
<                      VERIFIER LA 'DCT'...
<
SYSRBB:  EQU         $
         STB         VAR+SECT        < (B)=NUMERO DE SECTEUR/QUANTA.
         ADR         B,B             < (B)=2*NUMERO DE SECTEUR/QUANTA.
         XR          A,B
         AD          VAR+SECT        < (B)=3*NUMERO DE SECTEUR/QUANTA, ATTENTION
         STA         VAR+SECT        < ON SUPPOSE QUE : QUANTA=3  !!!!
         IF          QUANTA-3,,XEIF%,
         IF          A T T E N T I O N  : LA PROGRAMMATION PRECENTE,
         IF          SUPPOSANT : QUANTA=3 EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
DKM51:   EQU         $
         CPZ         VAR+SECT        < L'ECHANGE DEMANDE DEBUTE-T'IL SUR UNE
                                     < FRONTIERE DE PISTE ???
         JE          DKM51P          < OUI, AUCUN PROBLEME...
         LA          VAR+DSYNC0      < NON, ALORS :
         TBT         CCBDKM          < TESTONS LA NULLITE DU BIT 'CCBDKM'
                                     < DU MOT 'DSYNC0' CE QUI EQUIVAUT A TESTER
                                     < SIMULTANEMENT LES 3 CONDITIONS SUIVANTES:
                                     < 1 - EST-ON SUR 'DKU', ET
                                     < 2 - EST-CE UNE ECRITURE, ET
                                     < 3 - Y-A-T'IL SYNCHRONISATION SUR LE SEC-
                                     <     TEUR 0 DE CHAQUE PISTE ???
         JNC         FRDKM3          < OUI, CES 3 CONDITIONS SONT VERIFIEES,
                                     < OR CETTE ECRITURE NE PORTE PAS SUR UNE
                                     < FRONTIERE DE PISTE, L'ECHANGE NE PEUT
                                     < DONC AVOIR LIEU SOUS PEINE D'ECRITURES
                                     < ABERRANTES !!!
DKM51P:  EQU         $
         LAI         K
         DV          VAR+NBPPC       < CONVERSION EN UN COUPLE (CYLINDRE,PISTE).
         JNV         SYSRBC
         BSR         ASYSER
<
<        QUE FAIRE ???
<                      VERIFIER LA 'DCT'...
<
SYSRBC:  EQU         $
         STB         VAR+PIST        < (B)=NUMERO DE PISTE,
         STA         VAR+CYL         < (A)=NUMERO DE CYLINDRE.
<
< VALIDATION DU CYLINDRE DEMANDE :
< (APRES L'EXCLUSION, CAR EN EFFET,
< JUSTE AVANT DE SORTIR ON LIBERE
< LE SEMAPHORE...)
<
         CPI         MINCYL
         JL          FRDKM3          < INFERIEUR, ERREUR...
         CP          VAR+MAXCYL
HRDKM3:  JG          FRDKM3          < SUPERIEUR, ERREUR...
                                     < (ET RELAI !!!)
<
< ALLOCATION D'UN JEU DE REGISTRES 'HDC' :
<
         PSR         X
         LAD         VAR+CCDKM
         SVC         SVCM4           < ALLOCATION D'UN CONTEXTE 'HDC'...
         PLR         X
         IC          VAR+XRHDCM      < MEMORISONS QUE L'ON POSSEDE UN JEU...
<
< CONSTRUCTION PARTIELLE DU 'CCB' :
<
         LA          NSPTYP
         TBT         TYPAD           < ADRESSE DE MOT OU D'OCTET ???
         LA          ARGDEM+AMDEM    < (A)=ADRESSE ARGUMENT.
         JC          DKM12           < CAS DES ADRESSES DE MOT.
         SLRS        NOCMO=K         < CAS DES ADRESSES D'OCTET.
DKM12:   EQU         $
         STA         VAR+CCDKN2      < (MOT2)=ADRESSE-MOT DU BUFFER.
         LA          ARGDEM+CODEM    < (A)=LONGUEUR-OCTETS DU BUFFER,
         ADRI        NOCMO-E,A       < ET ARRONDI A L'EVENTUEL MOT SUPERIEUR,
         SLRS        NOCMO=K         < PUIS CONVERSION EN UN NOMBRE DE MOTS,
         LR          A,Y             < (Y)=COMPTE DE MOTS DE L'ECHANGE.
         LB          VAR+INIDKM
         LA          ARGDEM+OPDEM    < (A)=FONCTION DEMANDEE :
XWOR%1:  VAL         FGR?FGW=K       < DISCRIMINATION LECTURE/ECRITURE...
         TBT         NBITMO-B-XWOR%1 < EST-CE UNE LECTURE OU UNE ECRITURE ???
         ADCR        B               < ET MEMORISATION...
         STB         VAR+CCDKM4      < (MOT4)=OPERANDE DE LA 'SIO' D'ECHANGE.
<
<
<        I T E R A T I O N   D E S   E C H A N G E S   A   C H E V A L
<        S U R   D E S   F I N S   D E   C Y L I N D R E  :
<
DKM4:    EQU         $
<
< TEST DE PROTECTION DES GROUPES
< DE CYLINDRES (INFORMATION
< AMENEE PAR L'EVENTUELLE 'BOX'
< DE LA DEMANDE COURANTE) :
<
         LBI         NCYLP
ANCYLP:: VAL         SUIDKM          < A T T E N T I O N  : ETANT DONNE QUE LA
                                     < ZONE LOCALE DE 'DKU' EST PLEINE, ON EST
                                     < OBLIGE DE METTRE EN RECOUVREMENT LES
                                     < MOTS 'SUIDKM' ET 'ANCYLP' !!!
         STB         VAR+ANCYLP      < INITIALISATION DE 'ANCYLP' ; NE PAS
                                     < QUE 'ANCYLP' RECOUVRE 'SUIDKM' !!!
         LA          VAR+CYL         < (A)=NUMERO DE CYLINDRE...
         SARD        NBITMO
         DV          VAR+ANCYLP
         LR          A,X             < (X)=NUMERO DU GROUPE DE CYLINDRES AUQUEL
                                     <     APPARTIENT L'ECHANGE COURANT...
         LA          VAR+LSDK        < (A)=LISTE D'APPROPRIATION GENERALE :
         TBT         L,X             < LE GROUPE (X) EST-IL APPROPRIE ???
         JNC         DKM12Y          < NON, DONC PAS DE PROBLEMES...
         LA          NSPTYP          < OUI, DONC REGARDONS SI LA DEMANDE COU-
                                     < RANTE TRANSMET UNE LISTE 'LUDKU' ???
         TBT         VBOX            < (DANS LA 'BOX') ALORS ???
         JNC         DKM12Y          < NON, RIEN A FAIRE...
         LA          BOX             < OUI : (A)=LISTE D'APPROPRIATION DU DEMAN-
                                     < DEUR (QUI EST DONC UN UTILISATEUR)...
         TBT         L,X             < ALORS ???
         JNC         FRDKM3          < LE DEMANDEUR N'EST PAS PROPRIATAIRE DU
                                     < GROUPE DE CYLINDRES DEMANDES, ERREUR...
DKM12Y:  EQU         $               < OK...
<
< PREVENTION PARTIELLE
< DES MEMOIRES INEXISTANTES :
<
         BSR         VAR+ASPDKM      < DETECTION DES MEMOIRES INEXISANTES...
<
< INITIALISATION DE LA GESTION
< DES FINS DE CYLINDRE :
<
         STZ         VAR+SUIDKM      < PAS DE SUITE A PRIORI...
<
< ECHANGE PROPREMENT DIT :
< (RAPPELONS QUE L'ECHANGE PEUT SE FAIRE EN PLUSIEURS FOIS
< SI LES SECTEURS A ECHANGER SONT A CHEVAL SUR PLUSIEURS
< CYLINDRE (EN FAIT 2 MAXIMUM PUISQUE LE COMPTE DE MOTS
< MAXIMUM EST '3FFF, ET QU'IL Y A 'F000 MOTS PAR CYLINDRE))
<
XXDK10:: VAL         1               < NOMBRE DE PUISSANCE DE 2 (A PARTIR DE
                                     < DE 2**0) IGNOREES DANS L'ADRESSE TETE
                                     < LORS DE LA SELECTION D'UNITE.
XXDK12:: VAL         3               < NOMBRE DE PUISSANCE DE 2 (A PARTIR DE
                                     < CELLES QUI SONT IGNOREES) PRISES EN
                                     < COMPTE LORS DE LA SELECTION D'UNITE.
XWOR%1:  VAL         BIT>XXDK12-BIT>XXDK10)MMOT
XXDK20:: VAL         XWOR%1          < MASQUE DE SELECTION DES PUISSANCES UTILES
XXDK11:: VAL         7               < CADRAGE DES PUISSANCE UTILES LORS
                                     < DE LA SELECTION D'UNITE.
XXDK13:: VAL         1               < NUMERO DE 'DKM' ET 'DKU' SUR LEURS
                                     < COUPLEURS RESPECTIFS (PREMIERE UNITE).
XXDK14:: VAL         6               < POSITIONNEMENT DU NUMERO DE CYLINDRE
                                     < LORS DU POSITIONNEMENT DES TETES.
XXDK15:: VAL         XXDK14-XXDK10   < POSITION DES PUISSANCES LES PLUS FAIBLES
                                     < LORS DU POSITIONNEMENT DES TETES.
XXDK30:: VAL         MOMINI?MOMFBK?MOMSTR
                                     < 'UNIT SELECT SANS IT ET CHECKSUM'.
XXDK31:: VAL         MOMINI?MOMFBK?MOMINT
                                     < 'SEEK AVEC IT VALIDEES'.
XXDK32:: VAL         MOM8?MOM10?MOMSTR?MOMINT
                                     < 'ECHANGE AVEC CHECKSUM'.
XXDK33:: VAL         MOMRW?MOMSTR?MOMINT
                                     < 'BEGIN WRITE'.
         LA          VAR+PIST        < (A)=NUMERO DE PISTE,
         IF          XXDK10-1,,XEIF%,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         RBT         NBITMO-XXDK10
         SLLS        NBITMO-XXDK12-XXDK10
         SLRS        NBITMO-XXDK12-XXDK10-XXDK11 < TETE (BITS DE POIDS 1,2,3).
         SBT         XXDK13          < MISE EN PLACE DU NUMERO DE L'UNITE DE
                                     < DISQUE SUR CE COUPLEUR (EN FAIT, ICI,
                                     < UN 'DRIVE' PAR COUPLEUR...),
         SIO         VAR+ASDKM       < ET ENVOI DE LA FONCTION 'SORTIE ADRESSE'.
         LXI         -XXDK6T
         BSR         ADODO           < AFIN D'EVITER DES PERTES ALEATOIRES
                                     < DU READY, ON ESPACE LES 'SIO' !!!
         LAI         XXDK30
         SIO         VAR+CDDKM       < ENVOI DE LA FONCTION 'UNIT SELECT',
                                     < SANS INTERRUPTION ET AVEC CHECKSUM.
         LXI         -XXDK6T
         BSR         ADODO           < AFIN D'EVITER DES PERTES ALEATOIRES
                                     < DU READY, ON ESPACE LES 'SIO' !!!
DKM4X:   EQU         $
         SIO         VAR+EADKM       < (A)=MOT D'ETAT 'A' :
         TBT         ETADEF          < Y-A-T'IL UN DEFAUT ???
         JC          DKM4XX          < OUI, ON VA FAIRE UN RESET...
         TBT         ETAOPE          < NON, LE DISQUE EST-IL PRET ???
         JC          DKM41           < OUI, ON PEUT FAIRE L'ECHANGE...
DKM4XX:  EQU         $               < NON,EXECUTION D'UN RESET SUR LE DISQUE...
         LAI         MOMINI?MOMINT
         SIO         VAR+CDDKM       < RETOUR DU BRAS SUR LE CYLINDRE 0 ; ON
                                     < ESPERE AINSI, PAR EXEMPLE CHASSER LES
                                     < PETITES POUSSIERES AVEC UN COURANT
                                     < D'AIR (AVEC CHECKSUM)...
         BSR         ACSWIT          < ET ATTENTE DE L'INTERRUPTION DE FIN
                                     < D'OPERATION...
         JMP         DKM4X           < PUIS, ON RETESTE L'ETAT...
DKM3R:   JMP         DKM3            < RELAI...
FRDKM3:  JMP         ERDKM3          < RELAI...
DKM4R:   JMP         DKM4            < RELAI (ET OUI, ENCORE UN !!!)...
<
< CAS OU LE DISQUE EST PRET :
<
DKM41:   EQU         $
         LBI         K
         LA          VAR+CYL         < (A)=NUMERO DE CYLINDRE,
XWOR%1:  VAL         CAXCYL=K
         IF          BIT>XWOR%1-CAXCYL,,XEIF%,
         IF          ATTENTION : 'CAXCYL' DOIT ETRE UNE PUISSANCE DE 2 !!!
XEIF%:   VAL         ENDIF
         SLRD        XWOR%1          < DECONCATENATION :
         LR          A,X             < (X)=NUMERO DU GROUPE VIRTUEL,
         LBY         &VAR+ATVDKM     < (A)=NUMERO DU GROUPE REEL.
         CPI         MINCYL          < ET VALIDATION :
         JL          DKM41X          < BERK ?!??!?!
         CP          VAR+MAXCYL      < ET VALIDATION :
         JLE         DKM41Y          < OK...
DKM41X:  EQU         $
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      REGARDER LES TABLES DE VIRTUALISATION...
<
         LR          X,A             < ET ON RESTAURE :
                                     < (A)=NUMERO DE GROUPE VIRTUEL.
DKM41Y:  EQU         $
         SLLD        XWOR%1          < ET ON RECONCATENE...
         SLLS        XXDK14
         LR          A,X
         LA          VAR+PIST        < (A)=NUMERO DE PISTE,
         ANDI        XXDK20          < SELECTION DES BITS DE POIDS 0 ET 4 DE
                                     < L'ADRESSE DE LA TETE.
         SLRD        XXDK10
         SLLS        NBITMO-XXDK12-XXDK10-XXDK15-XXDK10
         SLLD        XXDK15+XXDK10
         ORR         X,A
         SIO         VAR+ASDKM       < ENVOI DE LA FONCTION 'SORTIE ADRESSE
                                     < SECTEUR'...
         AD          VAR+SECT        < (A)='HEADER 1' DU PREMIER SECTEUR A
                                     <     ECHANGER,
         STA         VAR+CCDKM5      < (MOT5)='HEADER 1' DU PREMIER SECTEUR.
         LAI         XXDK31
         SIO         VAR+CDDKM       < ENVOI DE LA FONCTION 'SEEK', AVEC LES
                                     < INTERRUPTIONS VALIDEES ET LE CHECKSUM.
         BSR         ACSWIT          < ET ATTENTE DE L'INTERRUPTION DE FIN...
         BSR         ATHDS           < Y-A-T'IL EU UN DEFAUT SECTEUR ENTRE
                                     < TEMPS ???
         JC          DKM4            < OUI, ON RECOMMENCE...
         STY         VAR+CCDKM3      < NON,
                                     < (MOT3)=COMPTE DE MOTS RESIDUELS...
         LAD         VAR+CCDKM       < (A)=ADRESSE DU 'CCB',
         PSR         X
         SVC         SVCM6           < ET EXTENSION D'ADRESSE SUR 20 BITS...
         PLR         X
         BSR         ASDIPI          < ENVOI DU 'CCB' A L''IOP'...
         LA          VAR+DSYNC0
         TBT         CCBDKM          < Y-A-T'IL SYNCHRONISATION SUR LE
                                     < SECTEUR 0 ???
         LAI         XXDK32          < 'ECHANGE AVEC CHECKSUM' A PRIORI...
         JC          DKM42X          < NON, MODE NORMAL...
<
< BOUCLE DE SYNCHRONISATION SUR LE SECTEUR 0 :
<
DKM42Y:  EQU         $
         SIO         VAR+EADKM       < ENTREE DU MOT D'ETAT 'A',
         TBT         ETAS0           < EST-ON SUR LE SECTEUR 0 ???
         JNC         DKM42Y          < NON, ON L'ATTEND ACTIVEMENT...
         LAI         XXDK33          < 'BEGIN WRITE'...
<
< ECHANGE PROPREMENT DIT :
<
DKM42X:  EQU         $
         SIO         VAR+CDDKM       < LANCEMENT ECHANGE PAR UNE 'SIO'
                                     < D'ECHANGE...
         BSR         ACSWIT          < ET ATTENTE DE L'INTERRUPTION DE FIN
                                     < D'ECHANGE...
                                     < RAPPEL : LES MOTS D'ETAT 'A' ET 'B' SONT
                                     < STOCKES DANS 'ETAT0' ET 'ETAT1' DE LA
                                     < 'DCT' PAR 'ARIT'...
         BSR         ATHDS           < EST-CE UNE VRAIE INTERRUPTION, OU BIEN
                                     < UN DEFAUT SECTEUR ???
         JC          DKM4            < C'EST UN DEFAUT SECTEUR, IL EST DONC PLUS
                                     < PRUDENT DE RELANCER L'ECHANGE...
         LA          ETAT0           < C'EST UNE VRAIE INTERRUPTION :
                                     < (A)=MOT D'ETAT 'A' :
         JAGE        DKM42           < OK, ALLONS VOIR LE COMPTE-RENDU...
<
< CAS OU IL Y A AU MOINS UN DEFAUT :
<
         TBT         ETACAD          < EST-CE L'ERREUR DE CADENCE ???
         JC          ERDKM5          < OUI...
         TBT         ETAPAR          < EST-CE UN CHECKSUM ???
         JC          ERDKM5          < OUI...
         TBT         ETAVIO          < EST-CE UN VIOL ???
         JC          ERDKM5          < OUI...
         TBT         ETADOG          < EST-CE UN CHIEN DE GARDE (OUAH, OUAH) ???
         JC          ERDKM5          < OUI...
         TBT         ETAOPE          < LE DISQUE EST-IL PRET ???
         JNC         ERDKM5          < NON, ERREUR...
         TBT         ETABRK          < OUI, EST-CE UN FIN DE CYLINDRE ???
         JNC         ERDKM5          < NON, ERREUR...
         IC          VAR+SUIDKM      < OUI, C'EST UNE FIN DE CYLINDRE
                                     < IL VA Y AVOIR VRAISEMBLABLEMENT
                                     < UNE SUITE ; PASSONS AU COMPTE-RENDU...
                                     < COMPTE RENDU
DKM42:   EQU         $
<
< COMPTE-RENDU D'ECHANGE :
<
         LA          VAR+CCDKM0
         SBT         BCCBCR
         STA         VAR+CCDKM0      < MISE DU 'CCB' EN MODE COMPTE-RENDU...
         LAD         VAR+CCDKM
         BSR         ASDIPI          < DEMANDE DE COMPTE-RENDU A L''IOP' :
         LA          VAR+CCDKM3      < (A)=MOT3 DU 'CCB', C'EST-A-DIRE
                                     <     COMPTE-RENDU DU CANAL 'HDC' SUR
                                     <     LES BITS 0-1 POUR L'ETAT, ET 2-15
                                     <     POUR LE COMPTE DE MOTS RESIDUELS :
                                     < SIGNIFICATION DES BITS 0-1 :
                                     < =00 : OK, TOUT S'EST BIEN PASSE,
                                     < =01 : L'ECHANGE S'EST ARRETE SUR UN
                                     <       DEFAUT SECTEUR, OU UN 'INI',
                                     < =10 : UNE PARITE MEMOIRE A ETE RENCON-
                                     <       TREE AU COURS DE L'ECHANGE,
                                     < =11 : UNE MEMOIRE INEXISTANTE A ETE
                                     <       RENCONTREE AU COURS DE L'ECHANGE.
                                     < LES BITS 2-15, QUANT A EUX, DONNENT LE
                                     < COMPTE DE MOTS RESIDUELS EN FIN D'ECHAN-
                                     < GE (NORMALEMENT NUL...).
         JAE         DKM2            < OK, TOUT S'EST BIEN PASSE...
<
< CAS OU CELA S'EST MAL PASSE :
<
         TBT         BCCBME          < Y-A-T'IL EU UN PROBLEME MEMOIRE ???
         JC          ERDKM5          < OUI...
         TBT         BCCBDC          < Y-A-T'IL EU UN DEFAUT SECTEUR ???
         JC          ERDKM5          < OUI...
         CPZ         VAR+SUIDKM      < NON, MAIS Y-A-T'IL EU UN INTERRUPTION
                                     < DE FIN DE CYLINDRE ???
         JNE         DKM70           < MAIS OUI, MON BON MONSIEUR...
ZZDKM:   EQU         $               < COLMPTE DE MOTS RESIDUELS NON NUL
                                     < SANS INTERRUPTION DE FIN DE CYLINDRE...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      NOTER LES ADRESSES, ET VERIFIER
<                    QU'IL N'Y A PAS EU DE FIN DE CYLINDRE,
<                    ET RELANCER...
<
<
< CAS OU LE COMPTE DE MOTS RESIDUELS EST NON NUL,
< PREPARATION DE L 'ECHANGE SUIVANT :
<
DKM70:   EQU         $
         SBR         A,Y             < (Y)=NOMBRE DE MOTS DEJA ECHANGES,
         LR          Y,A             < (A)=NOMBRE DE MOTS DEJA ECHANGES.
         LBI         K               < CLEAR REGISTRE 'B'.
XWOR%1:  VAL         YY7             < NOMBRE DE MOTS PAR SECTEUR.
XWOR%2:  VAL         XWOR%1=K
         SLRD        XWOR%2          < (A)=NOMBRE DE SECTEURS DEJA ECHANGES.
         CPZR        B               < CE NOMBRE DOIT ETRE ENTIER !!!
         JE          DKM71           < OUI, OUF !!!
ZZZDKM:  BSR         ASYSER          < E R R E U R   S Y S T E M E ...
                                     < CAS OU LE NOMBRE DE MOTS DEJA ECHANGES.
                                     < N'EST PAS UN NOMBRE ENTIER DE SECTEURS.
<
<        QUE FAIRE ???
<                      BIEN NOTER LES ADRESSES, VERIFIER
<                    LES CALCULS, PUIS RELANCER COMME
<                    SUIT...
<
         XR          A,B
         SLRS        NBITMO-XWOR%2   < (A)=NOMBRE DE MOTS ECHANGES EN TROP,
         SBR         A,Y             < (Y)=NOMBRE DE MOTS DEJA ECHANGES DANS
                                     <     UN NOMBRE ENTIER DE SECTEURS.
         AD          VAR+CCDKM3      < ET CALCUL DU NOMBRE REEL DE MOTS ENCORE
         STA         VAR+CCDKM3      < A ECHANGER, ET MISE A JOUR DU 'CCB'...
         XR          A,B
DKM71:   EQU         $
         AD          VAR+SECT
         SLRD        NBITMO
         DV          VAR+NBSRPP      < POUR CHANGER DE PISTE EVENTUELLEMENT.
         STB         VAR+SECT        < PROCHAIN SECTEUR A ECHANGER.
         AD          VAR+PIST
         SLRD        NBITMO
         DV          VAR+NBPPC       < POUR CHANGER DE CYLINDRE EVENTUELLEMENT.
         STB         VAR+PIST        < PROCHAINE PISTE A ECHANGER.
         AD          VAR+CYL
         STA         VAR+CYL         < PROCHAIN CYLINDRE A ECHANGER.
         LA          VAR+CCDKN2      < ANCIENNE ADRESSE BUFFER,
         ADR         Y,A             < QUE L'ON FAIT PROGRESSER,
         STA         VAR+CCDKN2      < NOUVELLE ADRESSE BUFFER...
         LY          VAR+CCDKM3      < (Y)=NOUVEAU COMPTE DE MOTS RESIDUEL.
         JMP         DKM4R
DKM2:    EQU         $
<
<
<        S O R T I E   D U   H A N D L E R  :
<
<
         STZ         ETAT0
DKM3:    EQU         $
<
< LIBERATION EVENTUELLE D'UN
< JEU DE REGISTRE 'HDC' :
<
         CPZ         VAR+XRHDCM      < A-T'ON UN JEU DE REGISTRES ???
         JE          DKM3X           < NON, RIEN A RENDRE (CAS DES ERREURS
                                     < DE DEBUT...).
         STZ         VAR+XRHDCM      < MEMORISONS QUE L'ON REND CE JEU...
         PSR         X
         LAD         VAR+CCDKM
         SVC         SVCM5           < DESALLOCATION DU CONTEXTE 'HDC'...
         PLR         X
DKM3X:   EQU         $
         JMP         DKME1           < (ANCIEN 'RSR') VERS LA GESTION DES
                                     < DEMANDES D'ENTRELACAGES DES LECTURES
                                     < RAPIDES SUR 'DKU'...
<
<
<        E R R E U R S   S O F T S  :
<
<
ERDKM4:  EQU         $
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
ERDKM3:  EQU         $               < COMPTE DE MOTS INVALIDE.
         LBY         VAR+NMMDKM      < ON RENVOIE LE NOMBRE MAXIMUM DE MOTS
                                     < ECHANGEABLES/YY8 POUR FAIRE
                                     < COMME DANS 'DKF', MAIS ICI, CELA NE
                                     < SERT A RIEN...
DKM72:   EQU         $
         SBT         NBITMO-B        < SOMME DES DEFAUTS SOFT,
         STA         ETAT0           < (ETAT0)=CODE D'ERREUR...
         JMP         DKM3            < VERS LA SORTIE...
<
<
<        E R R E U R S   H A R D S  :
<
<
ERDKM5:  EQU         $
         LA          ETAT0           < DANS LE CAS OU L'ON ARRIVE ICI (ERREUR
                                     < HARD, OU BIZARRERIE DE MOTS RESIDUELS),
         PSR         A               < SAVE LE MOT D'ETAT DU DEFAUT...
         BSR         ACANSP          < MAIS QUI EST LA ???
                                     < (A)='NSP' DU DISQUE EN DEFAUT :
         CPI         NSPDKM          < EST-CE 'DKM' ???
         JE          ERDKMY          < OUI, DANS LE CAS DU DISQUE SYSTEME 'DKM'
                                     < ON FAIT SYSTEMATIQUEMENT LE "RETURN TO
                                     < ZERO TRACK" POUR DONNER UN AVERTISSEMENT
                                     < SONORE...
         LA          MEMV            < NON, C'EST 'DKU' :
         TBT         XSYNC0          < ICI, ON FAIT UN PETIT TRUANDAGE, DESTINE
                                     < A POUVOIR CONTROLER LE "RETURN TO ZERO
                                     < TRACK" A L'AIDE D'UN INDICATEUR, ALORS
                                     < QU'IL N'Y EN A PAS DE LIBRE ; ALORS ON
                                     < UTILISE CELUI DE LA SYNCHRONISATION SUR
                                     < LE SECTEUR 0 DE CHAQUE PISTE...
         JC          ERDKMX          < EFFECTIVEMENT, ON NE FAIT PAS DE RETOUR
                                     < A 0 POUR FACILITER LES TRANSFERTS RAPIDES
                                     < 'MEMTV' <--> 'DKU'...
ERDKMY:  EQU         $
         LAI         MOMINI?MOMSTR?MOMINT
         SIO         VAR+CDDKM       < "RETURN TO ZERO TRACK"...
                                     < (POUR FAIRE DU VENT : EN EFFET CE MOUVE-
                                     < MENT RAPIDE DES TETES PEUT DEPLACER
                                     < D'EVENTUELLES POUSSIERES...)
         BSR         ACSWIT          < ET ATTENTE DE FIN D'OPERATION.
ERDKMX:  EQU         $
         PLR         A               < RESTAURE : (A)=MOT D'ETAT DU DEFAUT...
         JMP         DKM72           < ON FORCE LE BIT0(ETAT0) AFIN DE LANCER
                                     < UN RETRY...
<
<
<        C A S   D E S   S E C T E U R S   I N E X I S T A N T S  :
<
<
DKMGS:   EQU         $
         LA          ARGDEM+OPDEM    < (A)=FONCTION DEMANDEE,
XWOR%1:  VAL         FGR?FGW=K
         TBT         NBITMO-B-XWOR%1 < DISCRIMINATION DES LECTURES/ECRITURES :
         JC          DKM2            < LES ECRITURES SONT SANS EFFETS...
<
< INITIALISATION D'UN BUFER EN LECTURE :
<
         LX          ARGDEM+CODEM    < (X)=NOMBRE D'OCTESTS DESIRES...
         LA          ARGDEM+ASDEM
         SWBR        A,B
         ANDR        A,B             < (B)=MOT=DOUBLE-OCTET A REPETER...
         LA          ARGDEM+AMDEM
         SLRS        NOCMO=K
         PSR         W
         LR          A,W             < (W)=ADRESSE MOT DU BUFFER.
<
< BOUCLE DE TRAITEMENT D'UN Q-SECTEUR :
<
DKMGS1:  EQU         $
         LRM         Y
         WORD        YY7Q            < (Y)=LONGUEUR MOTS D'UN Q-SECTEUR.
DKMGS2:  EQU         $
         STB         O,W             < INITIALISATION DU BUFFER PAR MOTS,
                                     < COMME LE FERAIT UNE ENTREE-SORTIE...
         ADRI        P,W             < AU MOT SUIVANT...
         ADRI        -I*NOCMO,X      < DECOMPTE DES OCTETS TRAIES,
         ADRI        -I,Y            < DECOMPTE DES MOTS DANS LE Q-SECTEUR,
         CPZR        X               < L'ENTREE-SORTIE EST-ELLE FINIE ???
         JLE         DKMGS3          < OUI, ON SORT...
         CPZR        Y               < NON, A-T'ON EPUISE LE Q-SECTEUR COURANT ?
         JNE         DKMGS2          < NON, ON CONTINUE...
         ADRI        I,B             < OUI, PASSAGE A LA VALEUR
         SWBR        B,B             < D'INITIALISATION
         ADRI        I,B             < SUIVANTE...
         JMP         DKMGS1          < ET AU Q-SECTEUR SUIVANT...
<
< FIN DU PROCESSUS :
<
DKMGS3:  EQU         $
         PLR         W               < RESTAURE (W)=ADRESSE DE LA DEMANDE,
         JMP         DKM2            < ET VERS LA SORTIE...
         PAGE
<
<
<        G E S T I O N   D E   L ' E N T R E L A C A G E
<        D E S   L E C T U R E S   R A P I D E S   ' D K U '  :
<
<
<        FONCTION :
<                      CE MODULE MIS ICI A CAUSE DES
<                    FABULEUX SAUTS DE LA MORT (SOUS-
<                    ENTENDU, SUPERIEURS A 128 MOTS...)
<                    PERMET A LA FIN DU HANDLER DISQUE
<                    AMOVIBLE, DE REGARDER SI UN ENTRE-
<                    LACAGE EST A REALISER... CECI NE
<                    PEUT SE PRODUIRE QUE POUR 'DKU' LORS
<                    DES TRNASFERTS RAPIDES 'DKU'-->'MEMTV',
<                    S'IL Y EU UNE COMMANDE "!DKU S"
<                    EMISE...
<
<
DKME1:   EQU         $
<
< TEST SUR LA NECESSITE D'ENTRELACER :
<
         LA          ARGDEM+OPDEM    < (A)=FONCTION COURANTE :
         CPI         FONTVR          < EST-CE LE TRANSFERT RAPIDE 'DKU'-->
                                     < 'MEMTV' ???
         JNE         DKME2           < NON, RIEN A FAIRE, ON SORT...
         CPZ         ETAT0           < OUI, ALORS L'OPERATION S'EST-ELLE CORREC-
                                     < TEMENT REALISEE ???
         JNE         DKME2           < NON, DONC ON SORT...
XWOR%1:  VAL         COSBT?FONTVR=FMASK(K?XXDK5=FCINST
         IF          XWOR%1-XXDK5,XEIF%,,XEIF%
         IF          ATTENTION : POUR QUE CES TESTS FONCTIONNENT
         IF          CORRECTEMENT, IL FAUT QUE 'DKM' NE POSSEDE
         IF          PAS UNE FONCTION VALANT 'FONTVR' !!!
XEIF%:   VAL         ENDIF
         BSR         ACANSP          < COMME ON N'EST JAMAIS ASSEZ PRUDENT :
                                     < (A)='NSP' DU HANDLER COURANT,
         CPI         NSPDKU          < EST-CE BIEN 'DKU' ???
         JE          DKME5           < OUI, OUF...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      ELIMINER LA FONCTION A 'DKM' QUI
<                    VAUT 'FONTVR' ET QUI EST BIZARREMENT
<                    PASSEE INAPERCUE !!!
<
         JMP         DKME2           < ET IL VAUT MIEUX SORTIR...
DKME5:   EQU         $
XWOR%1:  VAL         TVLIMA*LK*XNCOOL*NOCMO
         LRM         A
         WORD        XWOR%1          < (A)=LONGUEUR D'UNE IMAGE COULEUR ENTIERE,
         CP          ARGDEM+CODEM    < 'FONTVR' A-T'IL PORTE SUR UNE IMAGE
                                     < COULEUR ENTIERE ???
         JNE         DKME2           < NON, PAS D'ENTRELACAGE...
         LA          NSPTYP
         TBT         TYPAD           < EST-CE BIEN UNE ADRESSE-MOT ???
         JNC         DKME2           < NON, PAS D'ENTRELACAGE...
         PSR         W               < OUI,
         CALL        #SISP CMS5 W ZERO#
                                     < (W)=BASE DE LA MEMOIRE DEBANALISEE,
         CPZ         TVENTR-ZERO,W   < Y-A-T'IL UNE COMMANDE "!DKU S" EN COURS ?
         PLR         W
         JE          DKME2           < NON "!DKU F", DONC PAS D'ENTRELACAGE...
         IF          AMEMTV-ZERO,,XEIF%,
         IF          ATTENTION : LE TEST ('CPZ') CI-DESSUS EST IDIOT !!!
XEIF%:   VAL         ENDIF
<
< APRES TOUTES CES VERIFICATIONS (...),
< ON SAIT QUE L'IMAGE LUE A PARTIR DE
< 'DKU' EST COMPLETE, ET QU'IL FAUT
< L'ENTRELACER, CE QUE L'ON VA FAIRE :
<
XWOR%2:  VAL         XWOR%1/XNCOOL/LENTR/NOCMO
                                     < NOMBRE D'ITERATIONS D'ENTRELACAGE.
XWOR%3:  VAL         -DADR
XWOR%3:  VAL         -XWOR%3         < POUR CONVERTIR DES ADRESSES DE MOTS EN
                                     < DES FADR-ADRESSES...
XWOR%4:  VAL         AMEMTV-ZERO>XWOR%3+MEMTV0
XWOR%5:  VAL         AMEMTW-ZERO>XWOR%3+MEMTV0+XXLTV-E
         CALL        #SISP CMS5 PSRSLO#
         PSR         W               < SAUVEGARDE DE L'ADRESSE DE LA DEMANDE
                                     < COURANTE.
         LRM         A,B,X,W
         WORD        XWOR%4          < (A)=ADRESSE DU DEBUT DE L'IMAGE VISUALISE
         WORD        XWOR%5          < (B)=ADRESSE DE FIN DE L'IMAGE INTERME-
                                     <     DIAIRE A ENTRELACER...
<+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DKMBL1:  WORD        XWOR%2          < (X)=NOMBRE DE BLOCS A ENTRELACER,
DKMBL2:  WORD        LENTR           < (W)=LONGUEUR DES BLOCS ENTRELACES.
                                     < NOTA : CE SONT CES 2 MOTS QUI SONT A
                                     <        MODIFIER SI L'ON SOUHAITE CHANGER
                                     <        LA LONGUEUR DES BLOCS, SANS TOUTE
                                     <        FOIS DEPASSER 'LBENTR'...
<+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
         BSR         VAR+ATWOED      < POSITIONNEMENT DE (SLO,SLE) AFIN DE
                                     < FAIRE L'ENTRELACAGE DANS 'MEMTV'.
         LR          W,A             < (A)=LONGUEUR DES BLOCS,
         CPI         LBENTR          < VALIDATION VICIEUSE AU CAS OU CETTE
                                     < LONGUEUR AURAIT ETE PATCHEE...
         JLE         DKME6           < OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      MODIFIER CETTE LONGUEUR ET LE NOMBRE
<                    D'ITERATIONS AVANT DE RELANCER...
<
DKME6:   EQU         $
         LRM         A,B,Y
         WORD        AMEMTW          < (A)=ADRESSE DE LA SOURCE 'SLAVE',
         WORD        BENTR           < (B)=ADRESSE DU RECEPTEUR/EMETTEUR
                                     <     'MASTER',
         WORD        AMEMTV          < (Y)=ADRESSE DU RECEPTEUR 'SLAVE'.
<
< BOUCLE D'ITERATIONS SUR LES
< XNCOOL-BLOCS :
<
DKME3:   EQU         $
         IF          BITX-BITSIG,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         VAR+ALINHI      < DOIT-ON UTILISER LE SYSTEME D'AUTORISA-
                                     < TION/INHIBITION DES BLOCS ENTRELACES ???
         JGE         DKME8           < NON, ON NE TESTE PAS LES INHIBITIONS...
         PSR         A,X,Y           < OUI :
         LAD         VAR+ALINHI      < (A)=ADRESSE DU RELAI VERS 'LINHIB',
         ADRI        L-IJIJDX,X      < (X)=INDEX DU BIT A TESTER (ON RETRANCHE
                                     <     'IJIJDX' PARCEQUE LA BOUCLE
                                     <     'DKME3' EST CONTROLEE PAR UN 'JDX') ;
                                     <     NE PAS OUBLIER QUE LA LISTE EST DANS
                                     <     L'ORDRE INVERSE...
         LYI         FONTB           < (Y)=FONCTION DE TEST BIT...
         BSR         ATMOBT          < ET TEST DU BIT (X) DANS LA TABLE ((A)) :
         PLR         A,X,Y
         JNC         DKME7           < LE BLOC COURANT EST INHIBE...
DKME8:   EQU         $               < LE BLOC COURANT EST AUTORISE, OU BIEN
                                     < CE MECANISME N'EST PAS UTILISE...
         PSR         A,X,Y           < SAUVEGARDE ENTRE AUTRES DES ADRESSES
                                     < SOURCE/RECEPTEUR 'SLAVE'.
         LXI         XNCOOL          < (X)=NOMBRE DE COULEURS,
<
< ITERATION SUR CHAQUE COULEUR
< A L'INTERIEUR D'UN XNCOOL-BLOC :
<
DKME4:   EQU         $
         PSR         X               < SAVE DU DECOMPTE DES ITERATIONS,
         LR          W,X             < (X)=LONGUEUR D'UN BLOC,
         MVTM                        < TRANSFERT 'AMEMTW' --> 'BENTR',
         XR          A,Y             < CHANGEMENT DES
         XR          A,B             < EMETTEURS/RECEPTEURS...
         LR          W,X             < (X)=LONGUEUR D'UN BLOC,
         MVTS                        < TRANSFERT 'BENTR' --> 'AMEMTV'.
         XR          A,B             < RETABLISSEMENT DES
         XR          A,Y             < EMETTEURS/RECEPTEURS...
         LRM         X
         WORD        TVLIMA*LK       < (X)=CONSTANTE DE PASSAGE D'UNE COMPOSANTE
                                     <     CHROMATIQUE A LA SUIVANTE...
         ADR         X,A             < PASSAGE A LA SOURCE 'SLAVE' SUIVANTE,
         ADR         X,Y             < ET AU RECEPTEUR 'SLAVE' SUIVANT...
         PLR         X
         JDX         DKME4           < VERS LE BLOC CHROMATIQUE SUIVANT...
         PLR         A,X,Y           < RESTAURATION ENTRE AUTRES DES ADRESSES
                                     < SOURCE/RECEPTEUR 'SLAVE'...
DKME7:   EQU         $               < CAS DES BLOC INHIBES...
         ADR         W,A             < PASSAGE AU BLOC SOURCE 'SLAVE' SUIVANT,
         ADR         W,Y             < ET RECEPTEUR 'SLAVE' SUIVANT...
         JDX         DKME3           < AU XNCOOL-BLOC SUIVANT...
         PLR         W               < RESTAURE :
                                     < (W)=ADRESSE DE LA DEMANDE COURANTE.
         CALL        #SISP CMS5 PLRSLO#
<
< RESTAURATION DE LA DEMANDE
< SUITE A UN ENTRELACAGE :
<
         STZ         ARGDEM+AMDEM    < L'ADRESSE ETAIT NULLE,
         LA          NSPTYP
         RBT         TYPAD           < ET D'OCTETS...
         STA         NSPTYP
<
<
<        S O R T I E   D U   H A N D L E R  :
<
<
DKME2:   EQU         $
         RSR                         < ET C'EST TOUT...
         PAGE
<
<
<        D E T E C T I O N   D E S   M E M O I R E S
<                    I N E X I S T A N T E S  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME, UTILE POUR
<                    'DKU', DETECTE AU DELA DE 64K LES
<                    MEMOIRES INEXISTANTES ; EN EFFET,
<                    LORSQUE L'ON UTILISE LES TRANSFERTS
<                    RAPIDES ENTRE 'DKU' ET 'MEMTV', SI
<                    C'EST 'PROESC' QUI EST LE 'PROIOP',
<                    ET SI POUR TERMINER LE COUPLEUR DE
<                    BUS EST DECONNECTE, 'PROESC' ETANT
<                    SOUS NIVEAU 'TH0', CELA PROVOQUERAIT
<                    UNE ALARME !!! ICI DONC ON FAIT UN TEST
<                    PRELIMINAIRE DE CE TYPE DE MEMOIRE
<                    INEXISTANTE...
<
<
SPDKU:   EQU         $
         PSR         A,B,Y
         LA          VAR+DSYNC0
         ANDI        CCBMAE          < (A)=EXTENSION D'ADRESSE,
         JAE         SPDKU1          < AUCUN TEST A FAIRE...
         LR          A,Y             < (Y)=EXTENSION D'ADRESSE...
         CALL        #SISP CMS5 PSRSLO#
                                     < SAUVEGARDE DE 'SLO' ET 'SLE'...
XWOR%1:  VAL         1               < NOMBRE DE 'DADR'-MOTS A TESTER...
XWOR%2:  VAL         CCBMAE=K        < CADRAGE DE 'CCBMAE'.
XWOR%4:  VAL         -DADR
XWOR%5:  VAL         BIT>XWOR%4-BIT)MMOT
XWOR%5:  VAL         COSCLS?XWOR%2=FMASK(K?XWOR%5=FCINST
         LA          VAR+CCDKN2      < (A)=ADRESSE MOT DE L'ECHANGE A L'INTERIEU
                                     < D'UN SEGMENT DE 64K,
         IF          XWOR%2-K,,XEIF%,
         SCLS        XWOR%2          < CADRAGE COMPATIBLE AVEC L'EXTENSION,
XEIF%:   VAL         ENDIF
         ANDI        XWOR%5          < SUPPRESSION DES -'DADR' BITS DE POIDS
                                     < FAIBLES,
         ORR         Y,A             < CONCATENATION DE L'EXTENSION,
         SCRS        -DADR+XWOR%2    < (A)=ADRESSE EN 'DADR'-MOTS DE L'ECHANGE,
         LR          A,B
         ADRI        XWOR%1,B        < PASSAGE UN 'DADR'-MOTS PLUS LOIN...
         WOE                         < INITIALISATION DE 'SLO' ET 'SLE',
         LAI         COSBT?DEBUG=FMASK(K=FCINST
         BSR         ASMMK           < MASQUAGE DES INTERRUPTIONS, CAR
                                     < ON VA PASSER EN MODE 'DEBUG'...
         SST                         < PASSAGE EN MODE 'DEBUG'.
SPDKU3:  EQU         $
XWOR%3:  VAL         -DADR
         LYI         XWOR%1>XWOR%3-D < (Y)=ADRESSE DU PREMIER MOT A TESTER
                                     <     DANS L'ESPACE (SLO,SLE).
         DBP                         < RECHERCHE DES DEFAUTS...
         JNV         SPDKU2          < OK, IL N'Y A PAS DE MEMOIRE INEXISTANTE,
                                     < MAIS IL PEUT Y AVOIR UNE PARITE, CE
                                     < QUI PEUT ETRE INDIFFERENT, DANS LA MESURE
                                     < OU CELA PEUT SE RENCONTRER APRES UNE
                                     < ENTREE CAMERA, SUIVIE IMMEDIATEMENT D'UN
                                     < TRANSFERT 'DKU' <--> 'MEMTV'...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      VERIFIER LA CONNEXION DU COUPLEUR
<                    DE BUS VERS 'MEMTV', ET EN GENERAL
<                    ITERER LE TEST !!!
<
         JMP         SPDKU3          < ET ON RETESTE...
SPDKU2:  EQU         $
         LAI         COSBT?DEBUG=FMASK(K=FCINST
         RST                         < ET ON EFFACE LE MODE 'DEBUG'...
         BSR         ASMDK           < ET ON DEMASQUE LES INTERRUPTIONS.
                                     < RESTAURATION DE (SLO,SLE) :
         CALL        #SISP CMS5 PLRSLO#
SPDKU1:  EQU         $
         PLR         A,B,Y
<
< SORTIE, ET ENTRY 'DKM' :
<
SPDKM:   EQU         $
         RSR
         PAGE
<
<
<        E X T E N S I O N   D E S   ' C D A '  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME EST DESTINE
<                    A REMPLACER LES ANCIENS 'WOE'
<                    QUI PERMETTAIENT DE SE POSITIONNER
<                    SUR 'MEMTV' (C'EST-A-DIRE LA 'CDAI') ;
<                    DORENAVANT, TOUTES CES OPERATIONS
<                    PEUVENT ATTEINDRE L'ENSEMBLE DES
<                    'CDA' DU SYSTEME ; 'HDLDKU' RECOIT
<                    A CET EFFET, DANS LE CAS DE CES
<                    FONCTIONS, NON PAS (SLO,SLE) DE
<                    L'UTILISATEUR DANS LES REGISTRES
<                    (SLO,SLE), MAIS (CDESCO,CDESCE) QUI
<                    DEFINISSENT LA 'CDA' COURANTE...
<
<
<        NOTA :
<                      ON NE PEUT EN GENERAL APPELER
<                    DIRECTEMENT 'TWOE' DEPUIS 'HDLDKU',
<                    CAR LA PLUPART DU TEMPS, LA BASE
<                    'C' EST MAUVAISE...
<
<
<        ARGUMENTS :
<                    (A,B)=REGISTRES 'SLO' ET 'SLE'
<                          DEMANDES SUR L'ANCIENNE 'CDAI'...
<
<
TWOED:   EQU         $
         PSR         C
         CALL        #SISP CMS5 BASE C#
                                     < ET OUI, EN EFFET, LA BASE 'C' EST EN
                                     < GENERAL MAUVAISE !!!
         BSR         ATWOE           < VERS L'EXTENSION DES 'CDA'...
         PLR         C
         RSR                         < ET RETOUR...
         PAGE
<
<
<        A U T O R I S A T I O N   D E   T O U S   L E S
<                    B L O C S   E N T R E L A C E S  :
<
<
<        FONCTION :
<                      POUR DES RAISONS ECONOMIQUES,
<                    ON A GROUPE LES BLOCS ENTRELACES
<                    EN 'NBITMO' GROUPES DE CHACUN
<                    'LLINHI*NBITMO/LVALES'='LLINHI'
<                    GROUPES ENTRELACES.
<                      CE PREMIER MODULE, AUTORISE
<                    TOUS LES GROUPES DE BLOCS, ET
<                    DESARME CE MECANISME (PAR LE
<                    BIT D'INDEX DE 'ALINHI').
<
<
<        NOTA :
<                      IL N'EST PAS NECESSAIRE DE
<                    CREER DES PHASES CRITIQUES,
<                    PUISQUE L'APPEL DE 'PSLOWA'
<                    IMPLIQUE QUE L'UTILISATEUR
<                    SOIT ASSIGNE LE DISQUE...
<
<
<        ARGUMENTS :
<                    (B)='NSP' DU DISQUE.
<
<
PSLOWA:  EQU         $
PSLOWB:  EQU         PSLOWA          < (A CAUSE DE L'ASSEMBLEUR...)
         PSR         B,X,L
<
< POSITIONNEMENT SUR LE
< DISQUE ARGUMENT :
<
         LR          B,X             < (X)='NSP' DU DISQUE,
         BSR         ACADCT          < (A)=(L)=ADRESSE DE LA 'DCT' DU DISQUE.
<
< AUTORISATION DE TOUS LES
< BLOCS ENTRELACES :
<
         LA          VAR+ALINHI
         SBT         BITX
         STA         VAR+ALINHI      < AFIN D'INITIALISER LA LISTE PAR MOTS...
         LXI         LLINHI          < (X)=NOMBRE DE MOTS DE LA LISTE,
         LBI         MMOT            < (B)=POUR AUTORISER...
PSLOW1:  EQU         $
         STB         &VAR+ALINHI     < ET ON AUTORISE
         JDX         PSLOW1          <                TOUS LES BLOCS...
<
< ET DESARMEMENT DU MECANISME :
<
         RBT         BITX
         STA         VAR+ALINHI      < ET ON CLEAR LE BIT INDEX DE 'ALINHI'...
<
< RETOUR :
<
         PLR         B,X,L
         RSR
<
<
<        I N H I B I T I O N   S E L E C T I V E   D E
<        G R O U P E S   D E   B L O C S   E N T R E L A C E S  :
<
<
<        FONCTION :
<                      POUR DES RAISONS D'ECONOMIE
<                    CETTE INHIBITION NE PEUT SE
<                    FAIRE QUE PAR GROUPE DE BLOCS
<                    (DE 'LLINHI' BLOCS), AFIN QUE
<                    LISTE COMMUNIQUEE PAR L'UTILI-
<                    SATEUR TIENNE SUR UN MOT...
<
<
<        NOTA :
<                      PAS DE PHASES CRITIQUES PUISQUE
<                    L'APPEL DE 'PSLOWI' IMPLIQUE UNE
<                    ASSIGNATION PREALABLE DU DISQUE...
<
<
<        ARGUMENTS :
<                    (B)='NSP' DU DISQUE,
<                    (VALESC)=LISTE DES GROUPES DE BLOCS
<                             ENTRELACES INHIBES (0) OU
<                             INHIBES (1) DANS LE BON
<                             ORDRE (RAPPELONS QUE 'LINHIB'
<                             EST RANGEE A L'ENVERS...).
<
<
PSLOWI:  EQU         $
         PSR         B,X,L
<
< POSITIONNEMENT SUR LE DISQUE :
<
         LR          B,X             < (X)='NSP' DU DISQUE,
         BSR         ACADCT          < (A)=(L)=ADRESSE DE SA 'DCT'...
<
< ACCES A LA LISTE ARGUMENT :
<
         LA          VALESC-DCTESK,W < (A)=LISTE ARGUMENT,
         EORI        MMOT            <     QUE L'ON INVERSE AFIN DE DETECTER
                                     <     LES INHIBITIONS (0 --> 1),
         LBI         K               < CLEAR DE 'B' POUR LE TEST D'ARRET...
<
< RECUPERATION DE CHAQUE
< GROUPE DE BLOCS INHIBES :
<
PSLOW2:  EQU         $
         DBT                         < RECHERCHE DU GROUPE DE BLOCS INHIBES
                                     < COURANT,
         JC          PSLOW4          < C'EST FINI ; NOTONS QUE 'ALINHI' PEUT
                                     < AVOIR SONT 'BITX' A '0' SI LA LISTE
                                     < ARGUMENT 'VALESC' AUTORISEE TOUS LES
                                     < GROUPES DE BLOCS...
         RBT         L,X             < ET ON MEMORISE SON TRAITEMENT...
         PSR         A,B             < ET SAUVEGARDE DE LA LISTE COURANTE...
<
< ACTIVATION DU MECANISME, ET
< INHIBITION DU GROUPE DE BLOCS
< ENTRELACES COURANT :
<
         LA          VAR+ALINHI
         SBT         BITX
         STA         VAR+ALINHI      < ON POURRA AINSI ACCEDER A LA LISTE PAR
                                     < 'ATMOBT', MAIS DE PLUS, ON ACTIVE LE
                                     < MECANISME DANS 'HDLDKU'...
         ADRI        -LVALES+B,X
         NGR         X,A             < (A)=NUMERO DU GROUPE COURANT DANS LA
                                     <     CONVENTION INVERSEE QUI EST CELLE
                                     <     DE 'LINHIB'...
XWOR%1:  VAL         LLINHI*NBITMO   < NOMBRE DE BLOCS DANS 'LINHIB',
XWOR%1:  VAL         XWOR%1/LVALES   < ET DONC NOMBRE DE BLOCS PAR GROUPE
                                     < PUISQUE 'VALESC' NE PEUT CONTENIR QUE
                                     < 'NBITMO' GROUPES...
XWOR%2:  VAL         XWOR%1=K        < POUR FAIRE UNE MULTIPLICATION PAR
                                     < DECALAGE...
         IF          BIT>XWOR%2-XWOR%1,,XEIF%,
         IF          ATTENTION : LE NOMBRE DE BLOCS PAR GROUPE
         IF          DOIT ETRE UNE PUISSANCE DE 2 AFIN QUE CE
         IF          SUIT SOIT CORRECT !!!
XEIF%:   VAL         ENDIF
         SLRD        NBITMO-XWOR%2   < (NE PAS OUBLIER QUE (B)=CLEAR...)
                                     < (B)=NUMERO DU PREMIER BLOC DU GROUPE
                                     <     COURANT,
         LXI         XWOR%1          < (X)=NOMBRE DE BLOCS PAR GROUPE,
         LYI         FONRB0          < (Y)=FONCTION DE MISE A '0' D'UN BIT AVEC
                                     <     VERIFICATION PREALABLE,
         LAD         VAR+ALINHI      < (A)=ADRESSE DU RELAI D'ACCES A LA LISTE
                                     <     'LINHIB'.
PSLOW3:  EQU         $
         XR          B,X             < (X)=NUMERO DU BLOC COURANT, ET SAVE 'X',
         BSR         ATMOBT          < INHIBITION DU BLOC COURANT (X),
         XR          B,X             < RESTAURE,
         ADRI        I,B             < ET PASSAGE AU BLOC SUIVANT,
         JDX         PSLOW3          < S'IL EXISTE...
         PLR         A,B             < SINON, RESTAURATION DE LA LISTE COURANTE
                                     < DES GROUPES A INHIBER,
         JMP         PSLOW2          < ET RECHERCHE DU SUIVANT...
<
< SORTIE :
<
PSLOW4:  EQU         $
         PLR         B,X,L
         RSR
         PAGE
<
<
<        P R O T E C T I O N   D E   ' D K U '
<        P A R   G R O U P E S   D E   C Y L I N D R E S  :
<
<
<        PHILOSOPHIE :
<                      NE PARLONS QUE DE 'DKU' ; CE
<                    DISQUE POSSEDE UNE LISTE 'LSDK'
<                    DONT CHAQUE BIT EST ASSOCIE A UN
<                    GROUPE DE 'NCYLP' CYLINDRES ;
<                    LORSQU'UN TEL BIT EST A 1, CELA
<                    SIGNIFIE QUE LE GROUPE DE CYLINDRES
<                    ASSOCIE A ETE APPROPRIE PAR UN
<                    UTILISATEUR (VOIR LA COMMANDE
<                    "!Q DU DEMANDEUR D'INITIALISATION,
                                     < (LE VOLUME EST DONC PRIVE...)
         LRM         A,X
         WORD        CLEVOL
         WORD        NVOLIM
         STA         VOLCLE,L        < PREMIERE CLEF DE VALIDATION,
         STX         VOLNIM,L        < NOMBRE DE BLOCS INITIALEMENT LIBRES,
         LAI         LVOLIM
         STA         VOL23,L         < DEUXIEME CLEF DE VALIDATION, ET CONSTANTE
                                     < PERMETTANT DES CONVERSIONS NUMEROS DE
                                     < BLOC <--> ADRESSE DE Q-SECTEURS.
         LAD         VOLTAB,L
         LR          A,L             < (L)=ADRESSE DE LA TABLE D'ALLOCATION.
         LXI         MVOLIM          < (X)=NOMBRE DE MOTS A INITIALISER.
         LAI         MMOT            < (A)=CONFIGURATION DE CHAQUE MOT CORRES-
                                     <     PONDANT A UN ETAT LIBRE INITIAL.
P3SGU1:  EQU         $
         STA         O,L             < INITIALEMENT, TOUS LES BLOCS SONT LIBRES,
         ADRI        D,L             < PASSAGE AU MOT SUIVANT,
         JDX         P3SGU1          < S'IL EXISTE...
XWOR%1:  VAL         LVOLTA-MVOLIM   < NOMBRE DE MOTS RESIDUELS DANS LE DESCRIP-
                                     < TEUR DERRIERE LA TABLE D'ALLOCATION.
         IF          XWOR%1-K,,XEIF%,XEIF%
         IF          ATTENTION : LA LONGUEUR RESIDUELLE EST NEGATIVE !!!
XEIF%:   VAL         ENDIF
         IF          XWOR%1-K,XEIF%,XEIF%,
         LXI         XWOR%1          < (X)=LONGUEUR DU RESIDU.
P3SGU2:  EQU         $
         STZ         O,L             < CLEAR DE LA FIN DU DESCRIPTEUR...
         ADRI        D,L             < AU MOT SUIVANT,
         JDX         P3SGU2          < S'IL EXISTE...
XEIF%:   VAL         ENDIF
<
< INITIALISATION DU VOLUME PAR
< ECRITURE DE SON DESCRIPTEUR :
<
         LR          B,A             < (A)=ADRESSE DU BUFFER DU DESCRIPTEUR.
         PLR         B,X,L           < RESTAURATIONS :
                                     < (B)='NSP' DU DISQUE,
                                     < (X)=INDEX DE LA GRAMMAIRE 'CCI',
                                     < (L)=ADRESSE DE LA 'DCTSER'.
         PSR         B,W             < ET SAUVEGARDES...
         LR          A,W             < (W)=ADRESSE DU BUFFER DU DESCRIPTEUR, ET
                                     <     CECI TEMPORAIREMENT...
         LAD         VAR+DEMCCI
         XR          A,W             < (W)=ADRESSE DE LA DEMANDE, ET
                                     < (A)=ADRESSE DU BUFFER DU DESCRIPTEUR.
         STA         ARGDEM+AMDEM    < GENERATION DE 'AMDEM'.
         SWBR        B,A             < MISE EN PLACE DU 'NSP' DU DISQUE,
         ORI         XDSYM?XTYPAD    < POSITIONNEMENT DU MODE SYMBOLIQUE, ET
                                     < DE L'ADRESSAGE MOT.
         STA         NSPTYP          < GENERATION DU 'NSPTYP'.
         LAI         FGW
         STA         ARGDEM+OPDEM    < MISE EN PLACE D'UNE FONCTION D'ECRITURE.
         LRM         A,B
         WORD        LVOL*NOCMO      < (A)=LONGUEUR DU BUFFER DU DESCRIPTEUR,
         WORD        SECVOL          < (B)=ADRESSE Q-SECTEUR DU DESCRIPTEUR.
         STA         ARGDEM+CODEM    < GENERATION DU 'CODEM',
         STB         ARGDEM+ASDEM    < ET DE 'ASDEM'.
         BSR         ACHAND          < ENVOI DE LA DEMANDE D'ECRITURE,
         WAIT        WEIO            < ET ATTENTE DE FIN...
         CPZ         ARGDEM+ETADEM   < COMMENT CELA S'EST-IL PASSE ???
         PLR         B,W             < RESTAURATIONS :
                                     < (B)='NSP' DU DISQUE, ET
                                     < (W)=ADRESSE DE 'DCTESC'.
<
< TRAITEMENT DES ERREURS A L'INITIALISATION,
< OU LORS DU MONTAGE :
<
P3SGU4:  EQU         $               < ENTRY POUR LES ERREURS LORS DU MON-
                                     < TAGE (MAUVAIS VOLUME, OU INCOHERENCE
                                     < DE NUMERO DE COMPTE,...).
         PSR         X,L
         LR          B,X             < (X)='NSP' DU DISQUE..
         JE          P3SGU3          < OK, TOUT EST BON...
         LBI         NSPVID          < (B)='NSPVID',
         IF          MONT0-K,,XEIF%,
         IF          ATTENTION : LE 'STZ' EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
         STZ         VALESC-DCTESK,W < ON FORCE UN NUMERO DE VOLUME NUL, INDI-
                                     < QUANT AINSI, QU'IL N'Y A PAS DE VOLUME
                                     < MONTE, ET QUE L'ON DOIT FAIRE SEULEMENT
                                     < LA PREMIERE PARTIE DU MONTAGE...
P3SGU3:  EQU         $
         JMP         A2SGU1          < VERS UNE INITIALISATION PARTIELLE
                                     < DU BUFFER DU DESCRIPTEUR (MONTAGE)...
         PAGE
<
<
<        D E M O N T A G E   D ' U N   V O L U M E  :
<
<
<        FONCTION :
<                      CE MODULE DEMONTE EXPLICITEMENT
<                    LE VOLUME COURANT (TOUT EN NOTANT
<                    QUE LA DESASSIGNATION DU 'NVP'
<                    ASSOCIE PROVOQUE UN DEMONTAGE
<                    IMPLICITE).
<
<
<        ARGUMENTS :
<                    (B)='NSP' DU DISQUE D'EXTENSION DE VOLUME,
<                    (L)=ADRESSE DE 'DCTSER',
<                    (W)=ADRESSE DE 'DCTESC'.
<
<
P5SGU:   EQU         $
<
< MISE A JOUR DU DESCRIPTEUR DE VOLUME :
< (NOTA : ON N'A PAS A LE REECRIRE
< PUISQUE LE 'SGN' LE REECRIT APRES
< CHAQUE MISE A JOUR)
<
         PSR         X,L
         LR          B,X             < (X)='NSP' DU DISQUE D'EXTENSION :
         BSR         ACADCT          < (A)=(L)=ADRESSE DE LA 'DCT' DU DISQUE
                                     <         D'EXTENSION SUR VOLUME.
         LA          VAR+ABVOLU
         LR          A,L             < (L)=ADRESSE DU BUFFER DU DESCRIPTEUR
                                     <     DE VOLUME :
         IF          MONT0-K,,XEIF%,
         IF          ATTENTION : LE 'STZ' EST IDIOT !!!
XEIF%:   VAL         ENDIF
         STZ         VOLNUM,L        < SUPPRESSION DU NUMERO DE VOLUME,
         LAI         NSPVID
         STA         VOLNSP,L        < DEMONTAGE...
         PLR         X,L
<
< DEMONTAGE AU NIVEAU DE 'DCTESC' :
<
         LA          IDDESC-DCTESC,W
         TBT         IDESC8          < REVALIDATION DE 'IDESC8'...
         JC          P5SGU1          < OK, IL Y AVAIT UN VOLUME MONTE...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE COMMENT 'IDESC8' PEUT ETRE
<                    A 0, ALORS QUE DANS 'P4SGU' ON L'A
<                    TROUVE A 1 !!!
<
P5SGU1:  EQU         $
         RBT         IDESC8          < DEMONTAGE...
         STA         IDDESC-DCTESC,W
         RSR
         PAGE
<
<
<        E N T R E L A C A G E   D E S   L E C T U R E S   R A P I D E S
<                    ' D K U '   -->   ' M E M T V '  :
<
<
<        FONCTION :
<                      CES 2 MODULES REFERENCES PAR
<                    LE 'CCI' SUITE AUX COMMANDES
<                    "!DKU S" ET !DKU F" PERMETTENT
<                    D'AUTORISER/INHIBER L'ENTRELACAGE
<                    LORS DE LA FONCTION 'FONTVR' SUR
<                    LE DISQUE 'DKU'.
<
<
PFAST:   EQU         $               < COMMANDE "!DKU F" :
PFAST1:  EQU         PFAST           < A CAUSE
PFAST2:  EQU         PFAST           <         DE
PFAST3:  EQU         PFAST           <            L'ASSEMBLEUR...
         LRM         A
         WORD        AMEMTV          < (A)=ADRESSE-MOTS DE LA ZONE VISUALISEE.
         JMP         PVITES          < VERS LA MEMORISATION...
PSLOW:   EQU         $               < COMMANDE "!DKU S" :
         LRM         A
         WORD        AMEMTW          < (A)=ADRESSE-MOTS DE LA ZONE INTERME-
                                     <     DIAIRE D'ENTRELACAGE,
<
< MEMORISATION DE LA COMMANDE :
<
PVITES:  EQU         $
         PSR         W
         CALL        #SISP CMS5 W ZERO#
                                     < (W)=BASE LA MEMOIRE DEBANALISEE,
         STA         TVENTR-ZERO,W   < MEMORISATION DE "!DKU S"/"!DKU F"...
         PLR         W
         RSR                         < ET C'EST TOUT...
         PAGE
<
<
<        G E S T I O N   D E   L A   S Y N C H R O N I S A T I O N
<        S U R   L E   S E C T E U R   0   D E   ' D K U ' ,
<        A I N S I   Q U E   D E   S E S   E R R E U R S   H A R D S  :
<
<
<        FONCTION :
<                      CES 2 MODULES SONT REFERENCES
<                    PAR LE 'CCI' VIA LES COMMANDES
<                    "!DK S0 ON" ET "!DK S0 OFF" QUI
<                    PERMETTENT RESPECTIVEMENT DE
<                    DEMANDER A 'DKU' DE SE SYNCHRONISER
<                    SUR LE SECTEUR 0 DE CHAQUE PISTE
<                    (ET PLUS DE "RETURN TO ZERO TRACK"
<                    SUR ERREUR HARD), ET LE CONTRAIRE...
<
<
PS0ON:   EQU         $               < "!DK S0 ON" : SYNCHRONISATION SUR LE
                                     < SECTEUR 0 DE CHAQUE PSITE DE 'DKU', ET
                                     < PLUS DE "RETURN TO ZERO TRACK" SUR
                                     < ERREUR HARD.
         BSR         ASMMK           < M A S Q U A G E   I N T E R R U P T S...
         LA          MEMV
         SBT         XSYNC0          < ON AUTORISE...
         JMP         PS0ON1          < VERS LA MISE A JOUR...
PS0OFF:  EQU         $               < "!DK S0 OFF" : 'DKU' NE DOIT PAS SE
                                     < SYNCHRONISER SUR LE SECTEUR 0 DE
                                     < CHAQUE PISTE, ET FAIRE UN "RETURN TO
                                     < ZERO TRACK" POUR CHAQUE ERREUR HARD.
PS0OF1:  EQU         PS0OFF          < A CAUSE
PS0OF2:  EQU         PS0OFF          <         DE
PS0OF3:  EQU         PS0OFF          <            L'ASSEMBLEUR...
         BSR         ASMMK           < M A S Q U A G E   I N T E R R U P T S...
         LA          MEMV
         RBT         XSYNC0          < ON INHIBE...
<
< SORTIE COMMUNE A "ON"/"OFF" :
<
PS0ON1:  EQU         $
         STA         MEMV            < MISE A JOUR DE 'MEMV',
         BSR         ASMDK           < D E M A S Q U A G E...
         RSR
<
<
<        L ' U T I L I S A T E U R   A - T ' I L   ' D K U '  :
<
<
<        FONCTION
<                      LES COMMANDES "!DK..." NE
<                    SONT AUTORISEES QU'A L'UTILISATEUR
<                    QUI S'EST ASSIGNE 'DKU', CE QUE VERI-
<                    FIE LE MODULE SUIVANT...
<                      CET ACCES UNIQUE EST MIS EN
<                    PLACE D'UNE PART POUR EVITER DES
<                    ERREURS DE MANIPULATION DU TYPE
<                    UN UTILISATEUR 1 EST EN TRAIN
<                    D'ECRIRE SUR 'DKU' ALORS QU'UN
<                    DEUXIEME ENVOIE "!DK S0 ON"...
<                      D'AUTRE PART, AFIN DE GERER
<                    CORRECTEMENT LES REPRISES SUR
<                    ERREUR LORS DES 'STN' SUR VOLUME
<                    AMOVIBLE, IL FAUT QUE LE 'STN'
<                    ECRIVE SUR LE DISQUE D'EXTENSION
<                    EN MODE "!DK S" ; AFIN D'EVITER
<                    QU'UNE COMMANDE "!DK F" SOIT
<                    EMISE SIMULTANEMENT PAR UN AUTRE
<                    UTILISATEUR, LA SEULE SOLUTION
<                    EST DE RESERVER "!DK S/F" A L'UTI-
<                    LISATEUR QUI FAIT LES ACCES
<                    SUR VOLUME ET QUI S'EST DONC
<                    ASSIGNE LE DISQUE...
<
<
<        ARGUMENTS :
<                    (B)='NSPDKU',
<                    (W)=ADRESSE DE 'DCTESC'.
<
<
PS0AS:   EQU         $
         LYI         K               < RETOUR OK A PRIORI...
         PSR         X               < SAUVEGARDE DE L'INDEX COURANT DE LA
                                     < GRAMMAIRE DU 'CCI'.
         LXI         NOCMO*LTASGN-Z  < (X)=INDEX DE LA TABLE DES ASSIGNATIONS,
PS0AS1:  EQU         $
         LBY         &TASSGN-DCTESC,W
         CPR         A,B             < LE 'NSP' COURANT (A) EST-IL CELUI
                                     < DE 'DKU' (B) ???
         JE          PS0AS2          < OUI, DONC "!DK S0..." ACCEPTEE...
         JDX         PS0AS1          < NON, AU 'NSP' SUIVANT S'IL EXISTE...
         LYI         XCCIER          < ET BIEN NON, L'UTILISATEUR N'A PAS
                                     < 'DKU', LA COMMANDE EST REFUSEE...
PS0AS2:  EQU         $
         PLR         X               < RESTAURATION DE L'INDEX DE LA GRAMMAIRE
                                     < DU 'CCI',
         ADR         Y,X             < ET PREPARATION DU RETOUR...
         RSR                         < ET C'EST TOUT...
         PAGE
<
<
<        R O U T I N E   D ' I T   D K M
<
<
<        RAPPEL :
<                      AVEC 'DKM' ET 'DKU', ON
<                    TRAVAILLE EN CANAL 'HDC' ;
<                    ON RECUPERE DONC EN FIN DE
<                    'SEEK', DE 'RESET' OU D'ECHANGE,
<                    UNE INTERRUPTION D'EXCEPTION...
<                    CETTE INTERRUPTION RETOMBE
<                    PAR LA LECTURE DES MOTS D'ETAT
<                    'A' ET 'B' DANS 'ETAT0' ET
<                    'ETAT1' DES 'DCT' CORRESPON-
<                    DANTES POUR UNE EXPLOITATION
<                    ULTERIEURE PAR LES HANDLERS.
<                    MALGRE CELA, LE REVEIL DU
<                    HANDLER N'A LIEU QUE S'IL Y
<                    A UN ECHANGE EN COURS.
<

<        NOTA :
<                      EN CAS D'INTERRUPTION
<                    NORMALE, ON PROVOQUE UNE
<                    'SYSER'...
<
<
<        ARGUMENT :
<                    (B)=0 : INTERRUPTION NORMALE,
<                       =1 : INTERRUPTION D'EXCEPTION.
<
<
ITDKM:   EQU         $
ITDKU:   EQU         ITDKM
         CPZR        B               < QUELLE EST LA NATURE DE L'INTERRUPTION ??
         JNE         SYSRBD          < D'EXCEPTION, OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE COMMENT UNE
<                    INTERRUPTION NORMALE A PU
<                    SE PRODUIRE SUR 'DKM' OU 'DKU' !!!
<
SYSRBD:  EQU         $
         SIO         VAR+EADKM       < ENTREE DU MOT D'ETAT 'A',
         STA         ETAT0           < (ETAT0)=MOT D'ETAT 'A'.
         SIO         VAR+EBDKM       < ENTREE DU MOT D'ETAT 'B',
         STA         ETAT1           < (ETAT1)=MOT D'ETAT 'B'.
         BSR         ATEC            < Y-A-T'IL UN ECHANGE EN COURS ???
         JE          ITDKM1          < NON, DONC PAS DE REVEIL DU HANDLER...
         BSR         ARVHDL          < OUI, ON REVEILLE DONC LE HANDLER...
ITDKM1:  EQU         $
         RSR                         < THAT'S ALL FOLK...
         PAGE
<
<
<        C O N S T A N T E S   D I V E R S E S  :
<
<
XZDK1::  VAL         NEXIST          < 'PAS DE WAIT',
XZDK2::  VAL         XZDK1+I         < 'AVEC WAIT'.
XZDK3::  VAL         XZDK1-I         < ECRITURE SGF OPTIMISEE OU LECTURE
                                     < SGF NON OPTIMISEE.
XZDK4::  VAL         XZDK3-I         < ECRITURE SGF SANS OPTIMISATION, OU
                                     < CE N'EST PAS UNE ECRITURE SGF.
                                     < OU C'EST UNE LECTURE NON SGF.
XZDK5::  VAL         XZDK3+I         < LECTURE SGF OPTIMISEE 1ER TOUR.
XZDK6::  VAL         XZDK5+I         < LECTURE SGF OPTIMISEE 2EME TOUR.
XLRUR::  VAL         K               < MODE DE GESTION DES 'LRU' PAR ROTATION :
                                     < ON AMENE PAR DECALAGE CIRCULAIRE L'ENTREE
                                     < COURANTE EN TETE.
XLRUP::  VAL         XLRUR+I         < MODE DE GESTION DES 'LRU' PAR PERMUTA-
                                     < TION : L'ENTREE COURANTE EST PREMUTEE
                                     < AVEC L'ENTREE PRECEDENTE (SAUF EN TETE,
                                     < BIEN ENTENDU...).
         IF          XLRUP-XLRUR,XEIF%,,XEIF%
         IF          ATTENTION : LES TEST DISCRIMINATOIRES
         IF          SONT IMPOSSIBLES !!!
XEIF%:   VAL         ENDIF
         PAGE
<
<
<        S I M U L A T E U R   D E   M E M O I R E
<        V I R T U E L L E   S U R   D K F  :
<
<
         CALL        #SISP CMS5 CHECK#
         CALL        #SISP CMS5 DOL1#
DCTDKA:  EQU         $
PSTDKA:  WORD        K;K;K;K;COM+DEPCS;DCTDKA;NIL;PILDKA;HANDLR;SMST;SO;SE
       #@ASCI        " DKA"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR
         WORD        FILTRS
         WORD        XXDCTP          < ETALOC=XXDCTP A' NON LOUABLE.
         WORD        XXLOC0          < SEMLOC.
         DZS         LSEM
         WORD        NIL             < TETE DE LA FILE D'ATTENTE SUR 'DKA'.
         WORD        NIL             < QUEUE DE LA FILE D'ATTENTE SUR 'DKA.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLDKA          < ROUTINE SPECIFIQUE.
         WORD        NIL             < PAS DE RIT.
         WORD        K;K             < ETAT.
         WORD        XBITS0          < BITSEM.
         WORD        XXNTRY;TRYVID   < FRTRY.
         WORD        K               < HSTATS.
         WORD        XTESTO          < TESTO.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?FGR=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?FGW=FMASK(K?XWOR%1=FCINST
         WORD        XWOR%1          < LISTE DES FONCTIONS AUTORISEES.
XWOR%1:  VAL         K               < INITIALISATION...
XWOR%1:  VAL         COSBT?FGR=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?FGW=FMASK(K?XWOR%1=FCINST
         WORD        XWOR%1          < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
<        Z O N E   V A R I A B L E  :
<
<
VARDKA:  EQU         $
         IF          VARDKA-DCTDKA-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
< SIMULATION DES TRANSFERTS :
<
XBMEMA:: VAL         YY7             < LONGUEUR DES PAGES DE LA MEMOIRE
                                     < VIRTUELLE 'DKA'.
         WORD        XBMEMA
LBMEMA:: VAL         $-D-VARDKA      < LONGUEUR DES PAGES DE 'DKA'.
         WORD        MOVEV
AMOVEV:: VAL         $-D-VARDKA      < SOUS-PROGRAMME COMMUN A 'DKA' ET 'DKB'
                                     < DE SIMULATION DES TRANSFERTS.
         WORD        CHANDB
ACHANB:: VAL         $-D-VARDKA      < SOUS-PROGRAMME D'ENVOI D'UNE DEMANDE
                                     < PAR 'CHAND' AVEC FORCAGE DE LA PAGE 0...
<
< DEMANDE A 'DKF' :
<
XWOR%1:  VAL         MSPTYP=K        < POUR CADRER LE 'NSP'...
XWOR%2:  VAL         NSPDKF>XWOR%1   < INITIALISATION DE NSPTYP.
XWOR%2:  VAL         COSBT?TYPAD=FMASK(K?XWOR%2=FCINST
XWOR%2:  VAL         COSBT?PRIO=FMASK(K?XWOR%2=FCINST
         WORD        XWOR%2          < NSPTYP.
DKADEM:: VAL         $-D-VARDKA      < DEMANDE AU 'DKF'.
         WORD        NILK            < OPDEM (0=LECTURE, 1=ECRITURE).
         WORD        NIL             < ADRESSE MOT DE LA PAGE REELLE.
         WORD        XBMEMA*NOCMO    < CODEM : ON MANIPULE 1 SECTEUR ENTIER.
         WORD        NILS            < ADRESSE PAGE VIRTUELLE (SECTEUR).
         WORD        NILK
         WORD        NILK
         WORD        NIL
DKADEN:: VAL         $-VARDKA        < DEMANDE DESTINEE AUX TRANSITS DES
                                     < DEMANDES DONT LE CODEM EST TROP
                                     < GRAND ; AU QUEL CAS ON LES ENVOIE
                                     < DIRECTEMENT A 'DKF'...
         DZS         LDEM0
<
< DEFINITION DE LA MEMOIRE VIRTUELLE :
<
DKNSO::  VAL         ZERBV           < 1ERE PAGE VIRTUELLE.
DKNSD::  VAL         ZERBNV-Z        < DERNIERE PAGE VIRTUELLE.
         WORD        DKNSO
DKANSO:: VAL         $-D-VARDKA      < 1ERE PAGE VIRTUELLE.
         WORD        DKNSD
DKANSD:: VAL         $-D-VARDKA      < DERNIERE PAGE VIRTUELLE.
<
< DIVERS :
<
         WORD        XLRUR
DKAMOD:: VAL         $-D-VARDKA      < MODE DE GESTION DE LA 'LRU' : INITIA-
                                     < LISE POUR UNE GESTION PAR PERMUTATION...
         WORD        XZDK2
DKAW::   VAL         $-D-VARDKA      < INDICATEUR DE 'WAIT' PRELIMINAIRE...
                                     < 1 : PAS DE WAIT PRELIMINAIRE,
                                     < 0 : WAIT PRELIMINAIRE.
         WORD        SPDKA
ASPDKA:: VAL         $-D-VARDKA      < SOUS-PROGRAMME D'E/S SUR 'DKF'.
         WORD        NILS
DKAAS::  VAL         $-D-VARDKA      < TRANSIT D'UN 'ASDEM'.
         WORD        NILK
DKAOP::  VAL         $-D-VARDKA      < TRANSIT D'UN 'OPDEM'.
<
<
<        P I L E  :
<
<
         CALL        #SISP CMS5 DOL2#
PILDKA:  EQU         $-DEPILE
XWPILE:  VAL         LPILEH+20
         CALL        #SISP CMS5 GENPIL2#
<
<
<        P A G E S   R E E L L E S  :
<
<
DKAPAG:: VAL         '26             < NOMBRE DE PAGES REELLES.
PAGES:   EQU         $
         DO          DKAPAG
         DZS         XBMEMA
<
<
<        D E F I N I T I O N   D E   L A   ' L R U '  :
<
<
<        DEFINITION D'UNE ENTREE :
<                    MOT0=Q8000 SI L'ENTREE EST INOCCUPEE,
<                        =ADRESSE PAGE VIRTUELLE (SECTEUR) SI OCCUPEE.
<                    MOT1=ADRESSE MOT DE LA PAGE REELLE.
<
<
PAVIR::  MOT         O               < MOT0 D'UNE ENTREE LRU.
PARES::  MOT         PAVIR+D         < MOT1 D'UNE ENTREE LRU.
XWOR%1:  VAL         XBMEMA=K        < POUR CALCULER DES ADRESSES DE BUFFERS.
         IF          BIT>XWOR%1-XBMEMA,,XEIF%,
         IF          ATTENTION : 'XBMEMA' N'EST PAS UNE PUISSANCE DE 2 !!!
XEIF%:   VAL         ENDIF
DKALRU:  EQU         $
         DO          DKAPAG
         WORD        Q8000;K=FCDO)MFFFF+N+DKAPAG-Z>XWOR%1+PAGES
LARU::   VAL         $-DKALRU/DKAPAG < LONGUEUR D'UNE ENTREE.
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        S I M U L A T E U R   D E   M E M O I R E
<        V I R T U E L L E   S U R   D K F  :
<
<
<        FONCTION :
<                      CE FAUX DISQUE EST UN SIMULATEUR
<                    DE MEMOIRE VIRTUELLE; IL ESSAYE DE
<                    TENIR EN MEMOIRE CENTRALE LES SECTEURS
<                    DE 'DKF' LES PLUS UTILISES A L'AIDE
<                    D'UNE LISTE 'LRU'. POUR DES RAISONS
<                    EVIDENTES DE SECURITE, A CHAQUE FOIS
<                    QU'UNE ECRITURE EST DEMANDEE, ELLE
<                    EST FAITE DANS UNE PAGE VIRTUELLE,
<                    MAIS AUSSI SUR DISQUE (EN PARALLELE).
<
<
         USE         L,DCT0
         USE         W,DEM0
HDLDKA:  EQU         $
         LR          W,Y             < (Y)=SAVE L'ADRESSE DE LA DEMANDE.
<
< VALIDATION DES ARGUMENTS :
<
         LA          ARGDEM+OPDEM
XWOR%1:  VAL         FGR?FGW=K       < POUR DISCRIMINER LECTURE/ECRITURE...
         RBT         NBITMO-B-XWOR%1
         JAE         SYSRBE          < OK, OPDEM=K OU 2...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      ALLER VOIR LE DEMANDEUR, POUR
<                    VOIR CE QU'IL VEUT VRAIMENT...
<
SYSRBE:  EQU         $
         LA          ARGDEM+CODEM
         CP          VAR+DKADEM+T+CODEM
         JG          DKA10           < TROP GRAND, ENVOI DIRECT A 'DKF'.
         JAG         SYSRBF          < OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      S'EN ALLER...
<
SYSRBF:  EQU         $
         LA          ARGDEM+ASDEM
         CP          VAR+DKANSO      < LE SECTEUR DEMANDE EST-IL DANS
                                     < LA MEMOIRE VIRTUELLE ???
         JL          DKA1            < NON, ERREUR...
         CP          VAR+DKANSD      < MEME QUESTION...
         JLE         DKA50           < OUI, OK...
DKA1:    EQU         $
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
         JMP         DKA10           < PUIS ENVOI A 'DKF'...
<
< RECHERCHE DU SECTEUR DEMANDE (A) DANS LA LRU :
<
DKA50:   EQU         $
         LRM         X,W
         WORD        DKAPAG          < (X)=NOMBRE D'ENTREES DE LA LRU,
         WORD        DKALRU-LARU     < (W)=ADRESSE PRECEDENTE DE LA LRU.
         LR          A,B             < (B)=SECTEUR DEMANDE (PAGE VIRTUELLE).
DKA2:    EQU         $
         ADRI        LARU,W          < ACCES A L'ENTREE COURANTE.
         LA          PAVIR,W         < (A)=PAGE VIRTUELLE COURANTE.
         CPR         A,B             < EST-CE LA PAGE DEMANDEE ???
         JE          DKA3            < OUI, PAGE TROUVEE RESIDENTE.
         CP          INFINI          < EST-ON SUR LA PREMIERE ENTREE LIBRE ???
         JE          DKA4            < OUI, LA PAGE N'EST PAS TROUVEE,
                                     < MAIS LA LRU N'EST PAS PLEINE.
         JDX         DKA2            < A L'ENTREE SUIVANTE...
<
< PAGE NON TROUVEE, ET LRU PLEINE :
<
<
< NOTA : LA PAGE SE TROUVANT EN QUEUE DE LA
< 'LRU' PEUT ETRE ECRASEE SANS SOUCIS, EN
< EFFET, OU BIEN ELLE N'A ETE QUE LUE, ET
< DONC SA COPIE DISQUE EST CORRECTE, OU BIEN
< ELLE A ETE ECRITE AU MOINS UNE FOIS, ET TOUTE
< MISE A JOUR DE LA MEMOIRE VIRTUELLE S'ACCOMPA-
< GNE EN PARALLELE D'UNE MISE A JOUR DU DISQUE...
<
<
< PAGE NON TROUVEE, ET LA LRU A AU MOINS UNE ENTREE DISPONIBLE :
<
DKA4:    EQU         $
         STB         PAVIR,W         < (B)=PAGE DEMANDEE, QUE L'ON MET DANS
                                     <     L'ENTREE LIBRE D'ADRESSE (W).
         XR          W,Y             < (W)=ADRESSE DEMANDE ARGUMENT.
         LA          ARGDEM+OPDEM
         XR          W,Y
         JANE        DKA3            < (A)=2 : C'EST UNE ECRITURE DE PAGE.
         STB         VAR+DKAAS       < (A)=0 : C'EST UNE LECTURE, IL FAUT
                                     <     DONC AMENER LA PAGE (B) EN MEMOIRE.
         STZ         VAR+DKAOP       < DEMANDE DE LECTURE,
         LXI         XZDK2           < AVEC WAIT (X=1).
         BSR         VAR+ASPDKA      < LECTURE DE LA PAGE DEMANDEE
                                     < AVEC ATTENTE DE FIN D'E/S.
<
< LA PAGE DEMANDEE EST RESIDENTE :
<
DKA3:    EQU         $
         LA          PARES,W         < (A)=ADRESSE DE LA PAGE RESIDENTE,
         CP          VAR+DKADEM+T+AMDEM
         JNE         DKA40           < CE N'EST PAS LA PAGE QUI FUT CONCER-
                                     < NEE PAR L'ENTREE-SORTIE PRECEDENTE...
         CPZ         VAR+DKAW        < OUI, ALORS Y-A-T'IL LIEU D'ATTENDRE
                                     < LA FIN D'ENTREE-SORTIE ???
         JNE         DKA40           < NON...
         IC          VAR+DKAW        < OUI, MEMORISONS CETTE ATTENTE,
         WAIT        VAR+DKADEM+X18  < ET ATTENDONS...
DKA40:   EQU         $
         XR          Y,W             < (W)=ADRESSE DE LA DEMANDE ARGUMENT.
         LA          ARGDEM+CODEM    < (A)=NOMBRE D'OCTETS DEMANDES,
         ADRI        NOCMO-E,A       < POUR PASSAGE A UN NOMBRE DE
                                     < MOTS AFIN D'ASSURER LA COMPATIBI-
                                     < LITE AVEC 'DKF'...
         SLRS        NOCMO=K         < CONVERSION EN UN NOMBRE DE MOTS.
         LR          A,X             < (X)=NOMBRE DE MOTS.
         LA          NSPTYP
         TBT         TYPAD           < A-T'ON UNE ADRESSE MOT ???
         LA          ARGDEM+AMDEM    < OUI A PRIORI...
         JC          DKA6            < ET OUI, (A)=ADRESSE MOT...
         SLRS        NOCMO=K         < NON, CONVERSION...
         JNC         SYSRBG          < OK (ADRESSE PAIRE OCTETS)...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
SYSRBG:  EQU         $
DKA6:    EQU         $
         CPZ         ARGDEM+OPDEM    < LECTURE OU ECRITURE ???
         XR          Y,W
         LB          PARES,W         < (B)=ADRESSE MOT DE LA PAGE RESIDENTE, ET
                                     < (A)=ADRESSE-MOT DU BUFFER DEMANDE.
         JNE         DKA7            < 2=ECRITURE : BUFFER --> PAGE.
         XR          A,B             < 0=LECTURE : PAGE --> BUFFER.
DKA7:    EQU         $
         BSR         VAR+AMOVEV      < SIMULATION DE L'ENTREE/SORTIE...
<
< ROTATION DE LA LRU :
<
         LA          PAVIR,W         < SAVE LE NUMERO DE PAGE VIRTUELLE,
         LB          PARES,W         < ET L'ADRESSE MOT EN RESIDENT.
         LR          W,X             < (X)=ADRESSE COURANTE EN LRU,
         LRM         W
         WORD        DKALRU          < (W)=ADRESSE DE LA LRU.
         CPR         X,W             < EST-ON DEJA EN TETE ???
         JE          DKA60           < OUI, RIEN A FAIRE...
                                     < ON A :
                                     < (A)=ADRESSE-DISQUE DE LA PAGE VIRTUELLE.
         PSR         A,B             < NON, SAUVEGARDE DU CONTENU DE L'ENTREE
                                     < COURANTE DE LA 'LRU'.
         CPZ         VAR+DKAMOD      < QUEL EST LE MODE DE GESTION DE LA 'LRU' ?
         IF          XLRUR-K,,XEIF%,
         IF          ATTENTION : LE TEST EST INCOHERENT !!!
XEIF%:   VAL         ENDIF
         JE          DKA62           < PAR ROTATION (DECALAGE CIRCULAIRE...)...
<
< PAR PERMUTATION (DE L'ENTREE
< COURANTE ET DE L'ENTREE PRE-
< CEDENTE : CETTE METHODE AMENE
< PLUS DOUCEMENT EN TETE LES PAGES
< LES PLUS UTILISEES, MAIS SURTOUT
< NE MET PAS EN TETE LES PAGES RE-
< FERENCEES UNE SEULE FOIS...) :
<
         LR          X,W             < RESTAURE :
                                     < (W)=ADRESSE DE L'ENTREE COURANTE,
         ADRI        -LARU,W         < (W)=ADRESSE DE L'ENTREE PRECEDENTE,
         LA          PAVIR,W         < L'ENTREE
         LB          PARES,W         <          PRECEDENTE
         STA         PAVIR+LARU,W    <                     RECULE
         STB         PARES+LARU,W    <                            D'UN "CRAN"...
         JMP         DKA61           < VERS L'AVANCEE DE L'ENTREE COURANTE
                                     < D'UN "CRAN" (A LA PLACE DE L'ENTREE
                                     < PRECEDENTE...).
<
< PAR ROTATION (ON AMENE L'ENTREE
< COURANTE EN TETE PAR DECALAGE
< CIRCULAIRE) :
<
DKA62:   EQU         $
         SBR         W,X             < (X)=NOMBRE DE MOTS A DEPLACER.
         LR          W,A             < (A)=EMETTEUR (ORIGINE DE LA LRU),
         LR          W,B
         ADRI        LARU,B          < (B)=RECEPTEUR (LRU+LARU).
         MOVE                        < ROTATION...
DKA61:   EQU         $
         PLR         A,B
         STA         PAVIR,W         < GENERATION DE L'ENTREE DE TETE, AVEC
         STB         PARES,W         < LA PAGE VIRTUELLE (A), ET L'ADRESSE
                                     < RESIDENTE (B) DANS LE CAS DE 'XLRUR', OU
                                     < DE L'ENTREE PRECEDENTE DANS LE CAS DE
                                     < 'XLRUP'...
DKA60:   EQU         $
         XR          Y,W             < (W)=ADRESSE DE LA DEMANDE.
         CPZ         ARGDEM+OPDEM    < LECTURE OU ECRITURE ???
         IF          FGR-K,,XEIF%,
         IF          ATTENTION : LE TEST PRECEDENT VA MERDER !!!
XEIF%:   VAL         ENDIF
         XR          Y,W
         JE          DKA8            < 0 : LECTURE, C'EST FINI...
         STA         VAR+DKAAS       < 2 : ECRITURE, ON VA ECRIRE LA PAGE
         LAI         FGW             < VIRTUELLE (A) EN PARALLELE.
         STA         VAR+DKAOP       < ECRITURE...
         LXI         XZDK1           < (X)=K : PAS DE WAIT...
         BSR         VAR+ASPDKA      < ECRITURE DE LA PAGE VIRTUELLE EN
                                     < PARALLELE PAR MESURE DE SECURITE...
DKA8:    EQU         $
         STZ         ETAT0           < RETOUR OK...
         LR          Y,W             < RESTAURE (W)=ADRESSE DE LA DEMANDE...
         RSR
<
< ENVOI DIRECT A 'DKF' DES ECHANGES TROP GRANDS :
<
DKA10:   EQU         $
<
< RECHERCHE PREALABLE EN LRU :
<
         LA          ARGDEM+CODEM    < (A)=NOMBRE D'OCTETS DEMANDES,
         AD          VAR+DKADEM+T+CODEM
         ADRI        -NOCMO+E,A      < QUE L'ON MAJORE AFIN D'AVOIR UN
         SARD        NBITMO          < NOMBRE ENTIER DE BLOCS.
         DV          VAR+DKADEM+T+CODEM
         LR          A,X             < (X)=NOMBRE DE BLOCS DE 'QUANTA'
                                     <     SECTEURS DEMANDES,
         LB          ARGDEM+ASDEM    < (B)=ADRESSE DU PREMIER BLOC DE
                                     <     'QUANTA' SECTEURS DEMANDES.
DKA80:   EQU         $
         PSR         B,X             < SAVE L'ADRESSE DU PREMIER
                                     < ET LE NOMBRE...
         LRM         X,W
         WORD        DKAPAG          < (X)=NOMBRE DE PAGES RESIDENTES.
         WORD        DKALRU-LARU     < (W)=ADRESSE COURANTE AVANT LRU.
DKA42:   EQU         $
         ADRI        LARU,W          < PASSAGE A L'ENTREE SUIVANTE.
         LA          PAVIR,W         < (A)=PAGE VIRTUELLE COURANTE.
         CPR         A,B             < EST-CE CELLE QUI EST DEMANDEE ???
         JE          DKA43           < OUI, IL FAUT L'ELIMINER...
         CP          INFINI          < EST-CE LA FIN DE LRU ???
         JE          DKA44           < OUI, ON N'A PAS TROUVE LA PAGE (B).
         JDX         DKA42           < A L'ENTREE SUIVANTE.
         JMP         DKA44           < ON N'A PAS TROUVE LA PAGE (B),
                                     < ET LA LRU EST PLEINE...
<
< ELIMINATION D'UNE PAGE VIRTUELLE PRESENTE EN
< LRU ET CONCERNEE PAR UN ACCES DIRECT A 'DKF' :
<
DKA43:   EQU         $
         LA          PARES,W         < (A)=SAVE L'ADRESSE-MOT DE LA
         ADRI        -I,X
         CPZR        X               < EST-CE LA DERNIERE ENTREE LRU ???
         JE          DKA71           < OUI, RIEN A FAIRE...
         ADR         X,X             < (X)=NOMBRE DE MOTS A DEPLACER.
         IF          LARU-2,,XEIF%,
         IF          ATTENTION : LE 'ADR X,X' EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
DKA70:   EQU         $
         LB          LARU,W          < ACCES A UN MOT DE LA LRU,
         STB         O,W             < QUE L'ON DECALE DE -LARU MOTS.
         ADRI        P,W             < PASSAGE AU MOT SUIVANT,
         JDX         DKA70           < S'IL EXISTE...
DKA71:   EQU         $               < CAS DE LA DERNIERE ENTREE...
         STA         PARES,W         < REGENERATION DE LA DERNIERE ENTREE...
         LA          INFINI
         STA         PAVIR,W
DKA44:   EQU         $
         PLR         B,X
         ADRI        I,B             < PASSAGE AU BLOC SUIVANT...
         JDX         DKA80           < ET DECOMPTAGE...
         LR          Y,W             < RESTAURE (W)=ADRESSE DE LA DEMANDE...
<
< ENVOI DIRECT A 'DKF' :
<
         LA          NSPTYP
         ANDI        MKTD            < CONSERVONS QUELQUES INDICATEURS.
         STA         VAR+DKADEN+XXNSP  < GENERONS LE 'NSPTYP'...
         LAI         NSPDKF
         STBY        VAR+DKADEN+XXNSP  < INSERTION DU 'NSP' VERS 'DKF'.
         LAD         VAR+DKADEN+T
         LR          A,B             < (B)=@ZONE RECEPTRICE,
         LAD         ARGDEM+OPDEM    < (A)=@ZONE EMETTRICE,
         LXI         ASDEM-OPDEM+Z   < (X)=NOMBRE DE MOTS ARGUMENTS.
         MOVE                        < GENERATION DE LA DEMANDE DE TRANSIT.
         LAD         VAR+DKADEN
         XR          A,W             < (A)=SAVE W, ET (W)=@DEMANDE DE TRANSIT.
         BSR         ACHAND          < ENVOI DE LA DEMANDE A 'DKF'.
         BSR         ACHANW          < ATTENTE DE FIN D'OPERATION, ON
                                     < NE PEUT FAIRE AUTREMENT, MEME
                                     < SI LE DEMANDEUR DESIRE FAIRE CETTE
                                     < ENTREE-SORTIE EN PARALLELE !!!
         XR          A,W             < RESTAURATIONS...
         JMP         DKA8            < ET ON SORT...
         PAGE
<
<
<        E N T R E E S - S O R T I E S   ' D K F '  :
<
<
<        ARGUMENTS :
<                    (W)=ADRESSE COURANTE LRU,
<                    (X)=0 : ENTREE-SORTIE SANS 'WAIT',
<                        1 : E/S AVEC WAIT...
<                    (VOIR 'XZDK1' ET 'XZDK2')
<                    (DKAAS)=PAGE VIRTUELLE DEMANDEE,
<                    (DKAOP)=0 OU 2 (SENS DE L'OPERATION).
<
<
SPDKA:   EQU         $
         PSR         B,W
         LB          PARES,W         < (B)=ADRESSE MOT DU BUFFER.
         LAD         VAR+DKADEM
         LR          A,W             < (W)=ADRESSE DE LA DEMANDE 'DKF'.
         CPZ         VAR+DKAW        < Y-A-T'IL UNE E/S EN COURS ???
         JNE         SPDKA2          < NON...
         BSR         ACHANW          < OUI, ON ATTEND QU'ELLE SE TERMINE...
SPDKA2:  EQU         $
         STB         ARGDEM+AMDEM    < ADRESSE MOT DE LA PAGE RESIDENTE.
         LA          VAR+DKAAS       < ADRESSE DE LA PAGE VIRTUELLE.
         STA         ARGDEM+ASDEM    < (SECTEUR).
         LA          VAR+DKAOP       < SENS DE L'OPERATION...
         STA         ARGDEM+OPDEM
         BSR         VAR+ACHANB      < ENVOI DE LA DEMANDE A 'DKF'...
                                     < (AVEC FORCAGE DE LA PAGE 0, EN EFFET
                                     < CETTE ENTREE-SORTIE SE FAIT DANS L'ESPA-
                                     < CE ABSOLU DU SYSTEME...)
                                     < (EN FORCANT LA PAGE 0...)
         CPZR        X               < FAUT-IL ATTENDRE ???
         STX         VAR+DKAW        < ET ON MEMORISE CE FAIT...
         JE          SPDKA1          < NON (X=K)...
         BSR         ACHANW          < OUI (X=1)...
SPDKA1:  EQU         $
         PLR         B,W
         RSR
         PAGE
<
<
<        E N V O I   D ' U N E   D E M A N D E   P A R   ' C H A N D '
<        A V E C   F O R C A G E   D E   L A   P A G E   0  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME ENVOI
<                    LA DEMANDE ARGUMENT PAR 'CHAND',
<                    EN AYANT FORCE (SLO,SLE) AVEC
<                    LES VALEURS (SO,SE) QUI PERMETTENT
<                    DE N'ACCEDER QU'A LA PAGE 0...
<
<
<        ARGUMENT :
<                    (W)=ADRESSE DE LA DEMANDE.
<
<
CHANDB:  EQU         $
         PSR         A,B
         CALL        #SISP CMS5 PSRSLO#
                                     < SAUVEGARDE DE (SLO,SLE) D'APPEL,
<
< POSITIONNEMENT SUR LA PAGE 0 :
<
         CALL        #SISP CMS5 PAGE0#
<
< ENVOI DE LA DEMANDE :
<
         BSR         ACHAND          < EASY ?!???!
<
< RETOUR AU DEMANDEUR :
<
                                     < RESTAURATION DE (SLO,SLE) D'APPEL :
         CALL        #SISP CMS5 PLRSLO#
         PLR         A,B
         RSR
         PAGE
<
<
<        S I M U L A T E U R   D E   M E M O I R E
<        V I R T U E L L E   S U R   ' D K M '  :
<
<
         CALL        #SISP CMS5 CHECK#
         CALL        #SISP CMS5 DOL1#
DCTDKB:  EQU         $
PSTDKB:  WORD        K;K;K;K;COM+DEPCS;DCTDKB;NIL;PILDKB;HANDLR;SMST;SO;SE
       #@ASCI        " DKB"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR
         WORD        FILTRS
         WORD        XXDCTP          < ETALOC=XXDCTP B' NON LOUABLE.
         WORD        XXLOC0          < SEMLOC.
         DZS         LSEM
         WORD        NIL             < TETE DE LA FILE D'ATTENTE SUR 'DKB'.
         WORD        NIL             < QUEUE DE LA FILE D'ATTENTE SUR 'DKB.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLDKB          < ROUTINE SPECIFIQUE.
         WORD        NIL             < PAS DE RIT.
         WORD        K;K             < ETAT.
         WORD        XBITS0          < BITSEM.
         WORD        XXNTRY;TRYVID   < FRTRY.
         WORD        K               < HSTATS.
         WORD        XTESTO          < TESTO.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?FGR=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?FGW=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?FOPURG=FMASK(K?XWOR%1=FCINST
         WORD        XWOR%1          < LISTE DES FONCTIONS AUTORISEES.
XWOR%1:  VAL         K               < INITIALISATION...
XWOR%1:  VAL         COSBT?FGR=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?FGW=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?FOPURG=FMASK(K?XWOR%1=FCINST
         WORD        XWOR%1          < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
<        Z O N E   V A R I A B L E  :
<
<
VARDKB:  EQU         $
         IF          VARDKB-DCTDKB-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
< SIMULATION DES TRANSFERTS :
<
XBMEMB:: VAL         YY7Q            < LONGUEUR DES PAGES DE LA MEMOIRE
                                     < VIRTUELLE 'DKB'.
         WORD        XBMEMB
LBMEMB:: VAL         $-D-VARDKB      < LONGUEUR DES PAGES DE 'DKB'.
         WORD        MOVEV
BMOVEV:: VAL         $-D-VARDKB      < SOUS-PROGRAMME COMMUN A 'DKB' ET 'DKA'
                                     < DE SIMULATION DES TRANSFERTS.
         WORD        CHANDB
BCHANB:: VAL         $-D-VARDKB      < SOUS-PROGRAMME D'ENVOI D'UNE DEMANDE
                                     < PAR 'CHAND' AVEC FORCAGE DE LA PAGE 0...
<
< DEMANDE A 'DKM' :
<
XWOR%1:  VAL         MSPTYP=K        < POUR CADRER UN 'NSP'...
XWOR%2:  VAL         NSPDKM>XWOR%1   < INITIALISATION DE NSPTYP.
XWOR%2:  VAL         COSBT?TYPAD=FMASK(K?XWOR%2=FCINST
XWOR%2:  VAL         COSBT?PRIO=FMASK(K?XWOR%2=FCINST
         WORD        XWOR%2          < NSPTYP.
DKBDEM:: VAL         $-D-VARDKB      < DEMANDE AU 'DKM'.
         WORD        NILK            < OPDEM (K=LECTURE, 1=ECRITURE).
         WORD        NIL             < ADRESSE MOT DE LA PAGE REELLE.
         WORD        XBMEMB*NOCMO    < CODEM : ON MANIPULE 1 UNITE ENTIERE.
         WORD        NILS            < ADRESSE PAGE VIRTUELLE (SECTEUR).
         WORD        NILK
         WORD        NILK
         WORD        NIL
DKBDEN:: VAL         $-VARDKB        < DEMANDE DE TRANSIT DIRECT VERS
                                     < LE 'DKM' LORSQUE LES ENREGISTREMENTS
                                     < SONT TROP LONGS...
         DZS         LDEM0
<
< DIVERS :
<
         WORD        XLRUR
DKBMOD:: VAL         $-D-VARDKB      < MODE DE GESTION DE LA 'LRU' : INITIALISE
                                     < SUR UNE GESTION PAR PERMUTATION DE
                                     < L'ENTREE COURANTE AVEC LA PRECEDENTE...
         WORD        XZDK2
DKBW::   VAL         $-D-VARDKB      < INDICATEUR DE 'WAIT' PRELIMINAIRE...
                                     < 1 : PAS DE WAIT PRELIMINAIRE,
                                     < 0 : WAIT PRELIMINAIRE.
         WORD        SPDKB
ASPDKB:: VAL         $-D-VARDKB      < SOUS-PROGRAMME D'E/S SUR 'DKM'.
         WORD        NILS
DKBAS::  VAL         $-D-VARDKB      < TRANSIT D'UN 'ASDEM'.
         WORD        NILK
DKBOP::  VAL         $-D-VARDKB      < TRANSIT D'UN 'OPDEM'.
         WORD        NILK
DKBSGF:: VAL         $-D-VARDKB      < INDICATEUR DES CONDITIONS D'OPTI-
                                     < MISATION DES ENTREES-SORTIES :
                                     < -2 : C'EST UNE ECRITURE SGF SANS
                                     <      OPTIMISATION, OU
                                     <      C'EST UNE ECRITURE NON SGF,
                                     < -1 : C'EST UNE ECRITURE SGF AVEC
                                     <      OPTIMISATION (MEMVO=1), OU
                                     <      C'EST UNE LECTURE SGF SANS
                                     <      OPTIMISATION (MEMVO=K), OU
                                     <      C'EST UNE LECTURE NON SGF,
                                     <  0 : C'EST UNE LECTURE SGF AVEC
                                     <      OPTIMISATION PREMIER TOUR,
                                     < +1 : C'EST UNE LECTURE SGF AVEC
                                     <      OPTIMISATION DEUXIEME TOUR.
                                     < (VOIR 'XZDK3' A 'XZDK6')
         WORD        NILS
DKBNXT:: VAL         $-D-VARDKB      < LORS DES LECTURES SGF OPTIMISEES, ON
                                     < TROUVE ICI L'ADRESSE DE LA PAGE
                                     < VIRTUELLE QUE LOGIQUEMENT LE
                                     < SGF DEVRAIT RECLAMER LA PROCHAINE
                                     < FOIS...
<
< ACCES A LA 'LRU' D'UTILISATION DES 'GB' :
<
         WORD        TLRUGB,X
ALRUGB:: VAL         $-D-VARDKB      < RELAI D'ACCES A LA 'LRU' QUI MEMORISE
                                     < QUELS SONT LES 'GB' LES PLUS UTILISES
                                     < ET LE PLUS RECEMMENT...
<
<
<        P I L E  :
<
<
         CALL        #SISP CMS5 DOL2#
PILDKB:  EQU         $-DEPILE
XWPILE:  VAL         LPILEH+20
         CALL        #SISP CMS5 GENPIL2#
<
<
<        P A G E S   R E E L L E S  :
<
<
DKBPAG:: VAL         '0A             < NOMBRE DE PAGES REELLES.
PBGES:   EQU         $
         DO          DKBPAG
         DZS         XBMEMB
<
<
<        D E F I N I T I O N   D E   L A   ' L R U '  :
<
<
<        DEFINITION D'UNE ENTREE :
<                    MOT0=Q8000 SI L'ENTREE EST INOCCUPEE,
<                        =ADRESSE PAGE VIRTUELLE (SECTEUR) SI OCCUPEE.
<                    MOT1=ADRESSE MOT DE LA PAGE REELLE.
<
<
PAVIR:   MOT         PAVIR           < MOT0 D'UNE ENTREE LRU.
PARES:   MOT         PARES           < MOT1 D'UNE ENTREE LRU.
DKBLRU:  EQU         $
         DO          DKBPAG
         WORD        Q8000;K=FCDO)MFFFF+N+DKBPAG-Z*XBMEMB+PBGES
LBRU::   VAL         $-DKBLRU/DKBPAG < LONGUEUR D'UNE ENTREE.
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        S I M U L A T E U R   D E   M E M O I R E
<        V I R T U E L L E   S U R   ' D K M '  :
<
<
<        FONCTION :
<                      CE FAUX DISQUE EST UN SIMULATEUR
<                    DE MEMOIRE VIRTUELLE; IL ESSAYE DE
<                    TENIR EN MEMOIRE CENTRALE LES SECTEURS
<                    DE 'DKM' LES PLUS UTILISES A L'AIDE
<                    D'UNE LISTE 'LRU'. POUR DES RAISONS
<                    EVIDENTES DE SECURITE, A CHAQUE FOIS
<                    QU'UNE ECRITURE EST DEMANDEE, ELLE
<                    EST FAITE DANS UNE PAGE VIRTUELLE,
<                    MAIS AUSSI SUR DISQUE (EN PARALLELE).
<
<
<        FONCTIONS RECONNUES :
<                    '00 : LECTURE,
<                    '02 : ECRITURE,
<                    '05 : PURGE ('FOPURG').
<
<
         USE         L,DCT0
         USE         W,DEM0
HDLDKB:  EQU         $
         LR          W,Y             < (Y)=SAVE L'ADRESE DE LA DEMANDE.
<
< VALIDATION DES ARGUMENTS :
<
         LA          ARGDEM+OPDEM
         TBT         XBITQ           < DEMANDE-T'ON QUANTA=1 ???
         JC          DKB10X          < OUI, DONC ON ENVOIE DIRECTEMENT
                                     < CETTE DEMANDE A 'DKM'...
         CPI         FOPURG          < EST-CE UNE PURGE ???
         JE          DKB20Y          < OUI, ON Y VA...
         LBI         XZDK3           < -1 : LECTURE A PRIORI...
XWOR%1:  VAL         FGR?FGW=K       < POUR DISCRIMINER LECTURE/ECRITURE...
         TBT         NBITMO-B-XWOR%1 < EST-CE UNE LECTURE (K) OU ECRITURE (1) ??
         SBCR        B               < -2 : C'EST UNE ECRITURE.
         STB         VAR+DKBSGF      < SAUVEGARDE DE L'INDICATEUR ; ON NOTERA
                                     < QUE POUR UNE E/S NON SGF, ON A :
                                     < DKBSGF<0 !!!
         RBT         NBITMO-B-XWOR%1
         JAE         SYSRBH          < OK, OPDEM=K OU 2...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      ALLER VOIR LE DEMANDEUR, POUR VOIR
<                    CE QU'IL VEUT VRAIMENT...
<
SYSRBH:  EQU         $
<
< GESTION DE LA 'LRU' DES 'GB' :
<
         LA          ARGDEM+ASDEM    < (A)=PREMIER Q-SECTEUR DEMANDE,
XWOR%1:  VAL         DKMINX=K
XWOR%1:  VAL         -XWOR%1
         SLRD        -XWOR%1
         CPI         DKMINX>XWOR%1   < EST-CE UN SECTEUR INEXISTANT ???
         JE          DKB3A3          < OUI, IL S'AGIT D'UN FAUX SECTEUR UTILISE
                                     < POUR LE COMPACTAGE DES VALEURS 'SGN' ;
                                     < IL EST DONC IGNORE AU NIVEAU 'LRU'...
XWOR%2:  VAL         NBITMO+DECON+XWOR%1
         SLRD        XWOR%2          < (B)=NUMERO DU 'GB'-1 D'APPARTENANCE
                                     <     DU PREMIER Q-SECTEUR DE L'ECHANGE.
         LXI         K               < (X)=INDEX DE LA 'LRU' QUE L'ON VA PAR-
                                     <     COURIR EN PARTANT DES PLUS UTILISES,
                                     <     AFIN DE MINIMISER SON TEMPS D'EXPLO-
                                     <     RATION...
DKB3A2:  EQU         $
         LBY         &VAR+ALRUGB     < (A)=NUMERO DE 'GB'-1 COURANT,
         CPR         A,B             < EST-CELUI DE L'ECHANGE COURANT ???
         JE          DKB3A1          < ET OUI...
         ADRI        I,X             < PASSAGE A L'ENTREE SUIVANTE,
         LR          X,A
         CPI         NBGB-Z          < SI ELLE EXISTE...
         JLE         DKB3A2          < ET OUI, ON VA Y ACCEDER...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE COMMENT LE NUMERO
<                    DE 'GB'-1 ARGUMENT PEUT NE PAS
<                    FIGURER DANS LA 'LRU' ???
<
         JMP         DKB3A3          < ET ON SAUTE LA MISE A JOUR DE LA 'LRU' !!
DKB3A1:  EQU         $
         CPZR        X               < ON A TROUVE LE 'GB'-1 ARGUMENT (B) DANS
                                     < L'ENTREE (X) DE LA 'LRU' ; CETTE ENTREE
                                     < SERAIT-ELLE PAR HASARD CELLE DE TETE ???
         JE          DKB3A3          < ET OUI, DONC RIEN A FAIRE...
         ADRI        -I,X            < ET NON, IL FAUT DONC PERMUTER L'ENTREE
                                     < COURANTE AVEC L'ENTREE PRECEDENTE, AFIN
                                     < DE LA FAIRE REMONTER PROGRESSIVEMENT
                                     < EN TETE...
         LBY         &VAR+ALRUGB     < (A)=PREDECESSEUR,
         XR          A,B             < (A)=ENTREE COURANTE, ET
                                     < (B)=PREDECESSEUR,
         STBY        &VAR+ALRUGB     < L'ENTREE COURANTE REMONTE D'UN CRAN,
         XR          A,B
         ADRI        I,X
         STBY        &VAR+ALRUGB     < ET L'EX-PREDECESSEUR REDESCEND D'UN...
DKB3A3:  EQU         $
<
< TEST DES CONDITIONS DE REFERENCE DE 'DKB' :
<
         LA          ARGDEM+ETADEM   < (A)=IDENTITE DU DEMANDEUR.
         LB          MEMV
         TBT         MEMVN+NBITMO    < LE 'SGN' A-T'IL ACCES A 'DKB' ???
         JC          DKB30           < OUI, IL Y A DROIT...
         IF          NSPTRI+I-NSPSG0,,XEIF%,
         IF          ATTENTION : IL VA Y AVOIR DES MERDES !!!
XEIF%:   VAL         ENDIF
         CPI         NSPTRI
         JL          DKB30           < NON...
         CPI         NSPSGN
         JLE         DKB10X          < OUI, LE 'SGN' EST DEMANDEUR, ALORS
                                     < QU'IL N'A PLUS ACCES A 'DKB' ; CELA
                                     < PEUT SE PRODUIRE LORSQUE DES DEMANDES
                                     < DU SGN ARRIVE SUR 'DKB', ALORS QU'UNE
                                     < PURGE EST EN COURS DE TRAITEMENT...
                                     < DANS CES CONDITIONS, ON ENVOIE EN
                                     < TRANSPARENCE LA DEMANDE...
DKB30:   EQU         $
         CPI         NSPFIL          < EST-CE LE SGF ???
         JL          DKB31           < NON, CONTINUONS...
         CPI         NSPFIL+NDCTF-Z  < EST-CE LE SGF ???
         JG          DKB31           < NON, CONTINUONS...
         TBT         MEMVF+NBITMO    < OUI, A-T'IL ACCES A 'DKB' ???
         JNC         DKB10X          < NON, ALORS ENVOI TRANSPARENT A 'DKM'.
         LR          A,X             < OUI, (X)=NSP(DCTF),
         PSR         Y
         LYI         FONTB           < (Y)=FONCTION DE 'TEST BIT'.
         LAD         ATNSPF
         BSR         ATMOBT          < TEST DU BIT (NSPF).
         PLR         Y
         JNC         DKB10X          < CETTE 'DCTF' N'A PAS ACCES A LA
                                     < MEMOIRE VIRTUELLE (BIT(NSPF)=K).
         LA          VAR+DKBSGF      < DANS LE CAS DU SGF :
         TBT         MEMVO+NBITMO    < DOIT-ON OPTIMISER LES LECTURES ???
         ADCR        A               < -2 ==> -2 : ECRITURE SANS OPTIMISATION,
                                     < -2 ==> -1 : ECRITURE AVEC OPTIMISATION,
                                     < -1 ==> -1 : LECTURE SANS OPTIMISATION,
                                     < -1 ==>  0 : LECTURE AVEC OPTIMISATION.
         STA         VAR+DKBSGF      < SAUVEGARDE DE L'INDICATEUR ; ON NOTERA
                                     < QUE POUR LES E/S SGF :
                                     < DKBSGF=K : S'IL S'AGIT D'UNE LECTURE,
                                     <            ET QUE L'OPTIMISATION EST
                                     <            ACTIVE (MEMVO=1),
                                     < DKBSGF<0 : DANS LES AUTRES CAS SGF.
DKB31:   EQU         $
         LA          ARGDEM+CODEM
         CP          VAR+DKBDEM+T+CODEM
         JG          DKB10X          < TROP GRAND, ON ENVOIE DIRECTEMENT...
         JAG         SYSRBI          < OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      S'EN ALLER...
<
SYSRBI:  EQU         $
         LA          ARGDEM+ASDEM
         CP          INFINI
         JNE         SYSRBJ          < OK, Q8000 EST INTERDIT...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
                                     < OU PAS, EN EFFET, VOIR LES PROGRAMMES
                                     < DE COPIE DE DISQUES...
         JMP         DKB10X          < 'INFINI' ETANT UN INDICATEUR DE
                                     < LIBERTE DE LA 'LRU', LES DEMANDES
                                     < PORTANT SUR 'INFINI' VONT DIRECTEMENT
                                     < A 'DKM'...
DKB20Y:  JMP         DKB20X          < RELAI...
SYSRBJ:  EQU         $
XWOR%1:  VAL         DKMINX=K
XWOR%1:  VAL         -XWOR%1
         SLRS        -XWOR%1
         CPI         DKMINX>XWOR%1   < EST-CE UN SECTEUR INEXISTANT ???
         JE          DKB10X          < OUI, ENVOI DIRECT A 'DKM'...
         LA          ARGDEM+ASDEM    < NON, RESTAURE 'A'...
<
< RECHERCHE DU SECTEUR DEMANDE (A) DANS LA LRU :
<
DKB91:   EQU         $               < POINT D'ENTREE DU DEUXIEME TOUR DES
                                     < LECTURES SGF OPTIMISEES.
         LRM         X,W
         WORD        DKBPAG          < (X)=NOMBRE D'ENTREES DE LA LRU,
         WORD        DKBLRU-LBRU     < (W)=ADRESSE PRECEDENTE DE LA LRU.
         LR          A,B             < (B)=SECTEUR DEMANDE (PAGE VIRTUELLE).
DKB2:    EQU         $
         ADRI        LBRU,W          < ACCES A L'ENTREE COURANTE.
         LA          PAVIR,W         < (A)=PAGE VIRTUELLE COURANTE.
         CPR         A,B             < EST-CE LA PAGE DEMANDEE ???
         JE          DKB3            < OUI, PAGE TROUVEE RESIDENTE.
         CP          INFINI          < EST-ON SUR LA PREMIERE ENTREE LIBRE ???
         JE          DKB4            < OUI, LA PAGE N'EST PAS TROUVEE,
                                     < MAIS LA LRU N'EST PAS PLEINE.
         JDX         DKB2            < A L'ENTREE SUIVANTE...
<
< PAGE NON TROUVEE, ET LRU PLEINE :
<
<
< NOTA : LA PAGE SE TROUVANT EN QUEUE DE LA
< 'LRU' PEUT ETRE ECRASEE SANS SOUCIS, EN
< EFFET, OU BIEN ELLE N'A ETE QUE LUE, ET
< DONC SA COPIE DISQUE EST CORRECTE, OU BIEN
< ELLE A ETE ECRITE AU MOINS UNE FOIS, ET TOUTE
< MISE A JOUR DE LA MEMOIRE VIRTUELLE S'ACCOMPA-
< GNE EN PARALLELE D'UNE MISE A JOUR DU DISQUE...
<
         JMP         DKB4            < ON CONSIDERE QUE LA DERNIERE ENTREE
                                     < OCCUPEE EST LIBERABLE...
DKB10X:  JMP         DKB10           < RELAI...
<
< PAGE NON TROUVEE, ET LA LRU A AU MOINS UNE ENTREE DISPONIBLE :
<
DKB4:    EQU         $
         STB         PAVIR,W         < (B)=PAGE DEMANDEE, QUE L'ON MET DANS
                                     <     L'ENTREE LIBRE D'ADRESSE (W).
         XR          W,Y             < (W)=ADRESSE DEMANDE ARGUMENT.
         LA          ARGDEM+OPDEM
         XR          W,Y
         JANE        DKB3            < (A)=2 : C'EST UNE ECRITURE DE PAGE.
         STB         VAR+DKBAS       < (A)=K : C'EST UNE LECTURE, IL FAUT
                                     <     DONC AMENER LA PAGE (B) EN MEMOIRE.
         STZ         VAR+DKBOP       < DEMANDE DE LECTURE,
         LXI         XZDK2           < AVEC WAIT (X=1).
         CPZ         VAR+DKBSGF      < QUEL EST LE LE MODE EN REALITE ???
         JLE         DKB92           < PAS D'OPTIMISATION, OU BIEN IL S'AGIT
                                     < DU PREMIER TOUR SGF OPTIMISE...
         LXI         XZDK1           < DKBSGF>0 : IL S'AGIT DU DEUXIEME TOUR
                                     < SGF DE LECTURE OPTIMISEE ; DANS CES
                                     < CONDITIONS, LA LECTURE DE LA PAGE EST
                                     < EN FAIT UN PRE-CHARGEMENT, ON LA FAIT
                                     < DONC SANS WAIT (X=K).
DKB92:   EQU         $
         BSR         VAR+ASPDKB      < LECTURE DE LA PAGE DEMANDEE
                                     < AVEC ATTENTE DE FIN D'E/S.
<
< LA PAGE DEMANDEE EST RESIDENTE :
<
DKB3:    EQU         $
         CPZ         VAR+DKBSGF      < QUEL EST LE MODE ACTUEL ???
         JG          DKB93           < IL S'AGIT DU DEUXIEME TOUR DU SGF EN
                                     < MODE LECTURE OPTIMISEE ; ON VA DONC
                                     < UNIQUEMENT FAIRE TOURNER LA LRU, AFIN
                                     < DE NE PAS RISQUER DE PERDRE LE BENE-
                                     < FICE DU PRE-CHARGEMENT AU CAS OU CETTE
                                     < PAGE SERAIT EN QUEUE...
         LA          PARES,W         < (A)=ADRESSE DE LA PAGE RESIDENTE.
         CP          VAR+DKBDEM+T+AMDEM
         JNE         DKB40           < LA PAGE COURANTE N'EST PAS CELLE QUI
                                     < FUT CONCERNEE PAR LA DERNIERE ENTREE-
                                     < SORTIE, CONTINUONS...
         CPZ         VAR+DKBW        < OUI, Y-A-T'IL LIEU D'ATTENDRE
                                     < LA FIN D'ENTREE-SORTIE ???
         JNE         DKB40           < NON, CONTINUONS...
         IC          VAR+DKBW        < OUI, MISE A JOUR DES INDICATEURS,
         WAIT        VAR+DKBDEM+X18  < ATTENTE DE FIN...
DKB40:   EQU         $
         XR          Y,W             < (W)=ADRESSE DE LA DEMANDE ARGUMENT.
         LA          ARGDEM+CODEM    < (A)=NOMBRE D'OCTETS DEMANDES,
         ADRI        NOCMO-E,A       < AFIN D'OBTENIR UN NOMBRE ENTIER
                                     < DE MOTS POUR ASSURER LA COMPA-
                                     < TIBILITE AVEC 'DKM'.
         SLRS        NOCMO=K         < CONVERSION EN UN NOMBRE DE MOTS.
         LR          A,X             < (X)=NOMBRE DE MOTS.
         LA          NSPTYP
         TBT         TYPAD           < A-T'ON UNE ADRESSE MOT ???
         LA          ARGDEM+AMDEM    < OUI A PRIORI...
         JC          DKB6            < ET OUI, (A)=ADRESSE MOT...
         SLRS        NOCMO=K         < NON, CONVERSION...
         JNC         SYSRBK          < OK (ADRESSE PAIRE OCTETS)...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
SYSRBK:  EQU         $
DKB6:    EQU         $
         CPZ         ARGDEM+OPDEM    < LECTURE OU ECRITURE ???
         XR          Y,W
         LB          PARES,W         < (B)=ADRESSE MOT DE LA PAGE RESIDENTE, ET
                                     < (A)=ADRESSE-MOT DU BUFFER DEMANDE.
         JNE         DKB7            < 2=ECRITURE : BUFFER --> PAGE.
         XR          A,B             < 0=LECTURE : PAGE --> BUFFER.
         CPZ         VAR+DKBSGF      < QUEL EST LE MODE ACTUEL ???
         JNE         DKB7            < CE N'EST PAS UN PREMIER TOUR DU SGF
                                     < EN MODE LECTURE OPTIMISEE...
         PSR         A,W             < C'EST LE PREMIER TOUR D'UNE LECTURE
                                     < SGF EN MODE OPTIMISEE :
         LR          A,W             < (W)=ADRESSE DE LA PAGE RESIDENTE,
         LA          XCHSGF,W        < (A)=PREMIER MOT DE LA PAGE RESIDENTE
         STA         VAR+DKBNXT      < C'EST, SI ELLE EXISTE, L'ADRESSE DE
                                     < LA PAGE VIRTUELLE SUIVANTE DANS CE
                                     < FICHIER...
         PLR         A,W
DKB7:    EQU         $
         BSR         VAR+BMOVEV      < SIMULATION DE L'ENTREE/SORTIE...
<
< ROTATION DE LA LRU :
<
DKB93:   EQU         $
         LA          PAVIR,W         < SAVE LE NUMERO DE PAGE VIRTUELLE,
         LB          PARES,W         < ET L'ADRESSE MOT EN RESIDENT.
         LR          W,X             < (X)=ADRESSE COURANTE EN LRU,
         LRM         W
         WORD        DKBLRU          < (W)=ADRESSE DE LA LRU.
         CPR         X,W             < EST-ON DEJA EN TETE ???
         JE          DKB60           < OUI, RIEN A FAIRE...
                                     < ON A :
                                     < (A)=ADRESSE-DISQUE DE LA PAGE VIRTUELLE.
         PSR         A,B             < NON, SAUVEGARDE DU CONTENU DE L'ENTREE
                                     < COURANTE DE LA 'LRU'.
         CPZ         VAR+DKBMOD      < QUEL EST LE MODE DE GESTION DE LA 'LRU' ?
         IF          XLRUR-K,,XEIF%,
         IF          ATTENTION : LE TEST EST INCOHERENT !!!
XEIF%:   VAL         ENDIF
         JE          DKB62           < PAR ROTATION (DECALAGE CIRCULAIRE...)...
<
< PAR PERMUTATION (DE L'ENTREE
< COURANTE ET DE L'ENTREE PRE-
< DENTE : CETTE METHODE AMENE
< PLUS DOUCEMENT EN TETE LES PAGES
< LES PLUS UTILISEES, MAIS SURTOUT
< NE MET PAS EN TETE LES PAGES RE-
< FERENCEES UNE SEULE FOIS...) :
<
         LR          X,W             < RESTAURE :
                                     < (W)=ADRESSE DE L'ENTREE COURANTE,
         ADRI        -LBRU,W         < (W)=ADRESSE DE L'ENTREE PRECEDENTE,
         LA          PAVIR,W         < L'ENTREE
         LB          PARES,W         <          PRECEDENTE
         STA         PAVIR+LBRU,W    <                     RECULE
         STB         PARES+LBRU,W    <                            D'UN "CRAN"...
         JMP         DKB61           < VERS L'AVANCEE DE L'ENTREE COURANTE
                                     < D'UN "CRAN" (A LA PLACE DE L'ENTREE
                                     < PRECEDENTE...).
<
< PAR ROTATION (ON AMENE L'ENTREE
< COURANTE EN TETE PAR DECALAGE
< CIRCULAIRE) :
<
DKB62:   EQU         $
         SBR         W,X             < (X)=NOMBRE DE MOTS A DEPLACER.
         LR          W,A             < (A)=EMETTEUR (ORIGINE DE LA LRU),
         LR          W,B
         ADRI        LBRU,B          < (B)=RECEPTEUR (LRU+LBRU).
         MOVE                        < ROTATION...
DKB61:   EQU         $
         PLR         A,B
         STA         PAVIR,W         < GENERATION DE L'ENTREE DE TETE, AVEC
         STB         PARES,W         < LA PAGE VIRTUELLE (A), ET L'ADRESSE
                                     < RESIDENTE (B) DANS LE CAS DE LA ROTATION
                                     < 'XLRUR', OU DE L'ENTREE PRECEDENTE DANS
                                     < LE CAS DE LA PERMUTATION 'XLRUP'.
DKB60:   EQU         $
         XR          Y,W             < (W)=ADRESSE DE LA DEMANDE.
         CPZ         ARGDEM+OPDEM    < LECTURE OU ECRITURE ???
         IF          FGR-K,,XEIF%,
         IF          ATTENTION : LE TEST PRECEDENT VA MERDER !!!
XEIF%:   VAL         ENDIF
         XR          Y,W
         JE          DKB90           < 0 : LECTURE, ALLONS VOIR S'IL Y A
                                     <     UNE OPTIMISATION A FAIRE...
         STA         VAR+DKBAS       < 2 : ECRITURE, ON VA ECRIRE LA PAGE
         LAI         FGW             < VIRTUELLE (A) EN PARALLELE.
         STA         VAR+DKBOP       < ECRITURE...
         LXI         XZDK1           < (X)=0 : PAS DE WAIT...
         BSR         VAR+ASPDKB      < ECRITURE DE LA PAGE VIRTUELLE EN
                                     < PARALLELE PAR MESURE DE SECURITE...
DKB8:    EQU         $
         STZ         ETAT0           < RETOUR OK...
         LR          Y,W             < RESTAURE (W)=ADRESSE DE LA DEMANDE...
         RSR
DKB20X:  JMP         DKB20           < RELI...
DKB91X:  JMP         DKB91           < RELAI...
<
< ENVOI DIRECT A 'DKM' DES ENREGISTREMENTS TROP LONGS :
<
DKB10:   EQU         $
<
< RECHERCHE PREALABLE EN LRU :
<
         LA          ARGDEM+CODEM    < (A)=NOMBRE D'OCTETS DEMANDES,
         AD          VAR+DKBDEM+T+CODEM
         ADRI        -NOCMO+E,A      < QUE L'ON MAJORE AFIN D'AVOIR UN
         SARD        NBITMO          < NOMBRE ENTIER DE BLOCS.
         DV          VAR+DKBDEM+T+CODEM
         LR          A,X             < (X)=NOMBRE DE BLOCS DE 'QUANTA'
                                     <     SECTEURS DEMANDES,
         LB          ARGDEM+ASDEM    < (B)=ADRESSE DU PREMIER BLOC DE
                                     < 'QUANTA' SECTEURS DEMANDES.
DKB80:   EQU         $
         PSR         B,X             < SAVE L'ADRESSE DU PREMIER
                                     < ET LE NOMBRE...
         LRM         X,W
         WORD        DKBPAG          < (X)=NOMBRE DE PAFGES RESIDENTES.
         WORD        DKBLRU-LBRU     < (W)=ADRESSE COURANTE AVANT LRU.
DKB42:   EQU         $
         ADRI        LBRU,W          < PASSAGE A L'ENTREE SUIVANTE.
         LA          PAVIR,W         < (A)=PAGE VIRTUELLE COURANTE.
         CPR         A,B             < EST-CE CELLE QUI EST DEMANDEE ???
         JE          DKB43           < OUI, IL FAUT L'ELIMINER...
         CP          INFINI          < EST-CE LA FIN DE LRU ???
         JE          DKB44           < OUI, ON N'A PAS TROUVE LA PAGE (B).
         JDX         DKB42           < A L'ENTREE SUIVANTE.
         JMP         DKB44           < ON N'A PAS TROUVE LA PAGE (B),
                                     < ET LA LRU EST PLEINE...
<
< ELIMINATION D'UNE PAGE VIRTUELLE PRESENTE EN
< LRU ET CONCERNEE PAR UN ACCES DIRECT A 'DKM' :
<
DKB43:   EQU         $
         LA          PARES,W         < (A)=SAVE L'ADRESSE-MOT DE LA
         ADRI        -I,X
         CPZR        X               < EST-CE LA DERNIERE ENTREE LRU ???
         JE          DKB71           < OUI, RIEN A FAIRE...
         ADR         X,X             < (X)=NOMBRE DE MOTS A DEPLACER.
         IF          LBRU-2,,XEIF%,
         IF          ATTENTION : LE 'ADR X,X' EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
DKB70:   EQU         $
         LB          LBRU,W          < ACCES A UN MOT DE LA LRU,
         STB         O,W             < QUE L'ON DECALE DE -LBRU MOTS.
         ADRI        P,W             < PASSAGE AU MOT SUIVANT,
         JDX         DKB70           < S'IL EXISTE...
DKB71:   EQU         $               < CAS DE LA DERNIERE ENTREE...
         STA         PARES,W         < REGENERATION DE LA DERNIERE ENTREE...
         LA          INFINI
         STA         PAVIR,W
DKB44:   EQU         $
         PLR         B,X
         ADRI        I,B             < PASSAGE AU BLOC SUIVANT...
         JDX         DKB80           < ET DECOMPTAGE...
         LR          Y,W             < RESTAURE (W)=ADRESSE DE LA DEMANDE...
<
< ENVOI DIRECT A 'DKM' :
<
         LA          NSPTYP
         ANDI        MKTD            < ON NE CONSERVE QUE QUELQUES INDICATEURS.
         STA         VAR+DKBDEN+XXNSP  < GENERATION DU 'NSPTYP'...
         LAI         NSPDKM
         STBY        VAR+DKBDEN+XXNSP  < INSERTION DU 'NSP' DE 'DKM'.
         LAD         VAR+DKBDEN+T
         LR          A,B             < (B)=@ZONE RECEPTRICE,
         LAD         ARGDEM+OPDEM    < (A)=@ZONE EMETTRICE,
         LXI         ASDEM-OPDEM+Z   < (X)=NOMBRE DE MOTS ARGUMENTS.
         MOVE                        < GENERATION DE LA DEMANDE DE TRANSIT.
         LAD         VAR+DKBDEN
         XR          A,W             < (A)=SAVE W, ET (W)=@DEMANDE TRANSIT.
         BSR         ACHAND          < ENVOI DIRECT A 'DKM'...
         BSR         ACHANW          < ATTENTE DE FIN D'OPERATION,
                                     < MEME SI CE N'EST PAS LE DESIR DU
                                     < DEMANDEUR !!!
         XR          A,W             < RESTAURATIONS...
         JMP         DKB8            < ET ON SORT...
<
< FIN DES LECTURES ; CHOIX DES OPTIMISATIONS :
<
DKB90:   EQU         $
         CPZ         VAR+DKBSGF      < TEST DU MODE ACTUEL ???
         JNE         DKB8            < OU BIEN IL N'Y A PAS D'OPTIMISATION A
                                     < FAIRE (<0), OU BIEN ELLE EST FAITE (>0).
         IC          VAR+DKBSGF      < ET OUI, IL S'AGIT DU PREMIER TOUR D'UNE
                                     < LECTURE SGF OPTIMISEE, DKBSGF>0...
         LA          VAR+DKBNXT      < (A)=ADRESSE DE LA PROCHAINE PAGE VIRTUELL
         CP          INFINI          < EXISTE-T'ELLE ???
         JE          DKB8            < NON, DONC ON SORT...
         JMP         DKB91X          < OUI, ON VA DONC LANCER SON PRE-
                                     < CHARGEMENT...
         PAGE
<
<
<        P U R G E   D E   ' D K B '  :
<
<
<        NOTA IMPORTANT :
<                      CETTE OPERATION A POUR BUT DE
<                    RENVOYER EN VIRTUEL TOUTES LES
<                    PAGES RESIDENTES ; ELLE EST A
<                    A FAIRE A CHAQUE FOIS QUE LES
<                    INDICATEURS DE 'MEMV' CHANGENT...
<                      ELLE EST TRES SIMPLE, CAR EN
<                    EN EFFET CHAQUE ACCES EN ECRITURE
<                    A 'DKB' S'ACCOMPAGNE D'UNE MISE
<                    MISE A JOUR EN PARALLELE DE 'DKM'...
<
<
DKB20:   EQU         $
         LRM         X,W
         WORD        DKBPAG          < (X)=NOMBRE DE PAGES RESIDENTES,
         WORD        DKBLRU          < (W)=ADRESSE DE LA 1ERE ENTREE DE LRU.
         LA          INFINI          < (A)=INDICATEUR DE PAGE LIBRE.
DKB21:   EQU         $
         STA         PAVIR,W         < L'ENTREE COURANTE EST RENDUE LIBRE...
         ADRI        LBRU,W          < A L'ENTREE
         JDX         DKB21           < SUIVANTE DE LRU...
         JMP         DKB8            < ET C'EST TOUT...
         PAGE
<
<
<        E N T R E E S - S O R T I E S   ' D K M '  :
<
<
<        ARGUMENTS :
<                    (W)=ADRESSE COURANTE LRU,
<                    (X)=0 : E/S SANS WAIT,
<                        1 : E/S AVEC WAIT...
<                    (DKBAS)=PAGE VIRTUELLE DEMANDEE,
<                    (DKBOP)=0 OU 2 (SENS DE L'OPERATION).
<
<
SPDKB:   EQU         $
         PSR         B,W
         LB          PARES,W         < (B)=ADRESSE MOT DU BUFFER.
         LAD         VAR+DKBDEM
         LR          A,W             < (W)=ADRESSE DE LA DEMANDE 'DKM'.
         CPZ         VAR+DKBW        < Y-A-T'IL UNE E/S EN COURS ???
         JNE         SPDKB2          < NON...
         BSR         ACHANW          < OUI, ON ATTEND QU'ELLE SE TERMINE...
SPDKB2:  EQU         $
         STB         ARGDEM+AMDEM    < ADRESSE MOT DE LA PAGE RESIDENTE.
         LA          VAR+DKBAS       < ADRESSE DE LA PAGE VIRTUELLE.
         STA         ARGDEM+ASDEM    < (SECTEUR).
         LA          VAR+DKBOP       < SENS DE L'OPERATION...
         STA         ARGDEM+OPDEM
         BSR         VAR+BCHANB      < ENVOI DE LA DEMANDE A 'DKM'...
                                     < (AVEC FORCAGE DE LA PAGE 0, EN EFFET
                                     < CETTE ENTREE-SORTIE SE FAIT DANS
                                     < L'ESPACE ABSOLU DU SYSTEME...)
         CPZR        X               < FAUT-IL ATTENDRE ???
         STX         VAR+DKBW        < ET ON MEMORISE CE FAIT...
         JE          SPDKB1          < NON (X=K)...
         BSR         ACHANW          < OUI (X=1)...
SPDKB1:  EQU         $
         PLR         B,W
         RSR
         PAGE
<
<
<        S I M U L A T I O N   D E S   T R A N S F E R T S
<        D E   ' D K A '   E T   D E   ' D K B '  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME COMMUN A 'DKA'
<                    ET 'DKB' REALISE LES TRANSFERTS ENTRE
<                    BUFFERS DEMANDEURS ET PAGES RESIDENTES ;
<                    IL COMPLETE LES PAGES RESIDENTES PAR
<                    DES '0000 LORSQUE LA LONGUEUR DEMANDEE
<                    NE CORRESPOND PAS A UNE PAGE COMPLETE,
<                    LORS D'UNE ECRITURE...
<
<
<        ARGUMENT :
<                    (A)=ADRESSE DE L'EMETTEUR (ABSOLUE OU RELATIVE),
<                    (B)=ADRESSE DU RECEPTEUR (RELATIVE OU ABSOLUE).
<                    (X)=NOMBRE DE MOTS A TRANSFERER.
<                    (Y)=ADRESSE DE LA DEMANDE COURANTE.
<
<
<        ATTENTION :
<                    DETRUIT A, B, X !!!
<
<
MOVEV:   EQU         $
         IF          LBMEMB-LBMEMA,,XEIF%,
         IF          ATTENTION : 'DCTDKA' ET 'DCTDKB' DOIVENT
         IF          LOCALISER IDENTIQUEMENT 'LBMEMV' !!!
XEIF%:   VAL         ENDIF
LBMEMV:: VAL         LBMEMB?LBMEMA   < ACCES A LA LONGUEUR DES PAGES RESIDENTES
                                     < DE LA MEMOIRE VIRTUELLE DEMANDEUSE.
         PSR         X
         XR          Y,W
         CPZ         ARGDEM+OPDEM    < EST-CE UNE LECTURE OU UNE ECRITURE ???
         XR          Y,W
         IF          FGR-K,,XEIF%,
         IF          ATTENTION : CE QUI PRECEDE EST COMPLETEMENT IDIOT,
         IF          ET EN PLUS CELA DOIT SE PRODUIRE AILLEURS !!!
XEIF%:   VAL         ENDIF
         JE          MOVEV3          < C'EST UNE LECTURE : IL NE FAUT DONC
                                     < SURTOUT PAS CLEARER LA PAGE COURANTE
                                     < AU CAS OU ON EN LIRAIT PLUTARD UNE
                                     < LONGUEUR SUPERIEURE (LE COMPLEMENT
                                     < SERAIT NUL...).
<
< CAS D'UNE ECRITURE :
<
         MVTM                        < IL S'AGIT D'UN MOUVEMENT DE L'ESPACE
                                     < RELATIF DE L'UTILISATEUR ('SLO' ET 'SLE'
                                     < SONT CORRECTS) VERS L'ESPACE ABSOLU DU
                                     < SYSTEME...
         PLR         X               < RESTAURE : (X)=NOMBRE DE MOTS TRANSFERES.
         LR          X,A
         CP          VAR+LBMEMV      < A-T'ON TRANSFERE UNE PAGE ENTIERE ???
         JE          MOVEV1          < OUI, C'EST FINI...
<
< NON, IL FAUT CLEARER LA FIN DE
< LA PAGE RESIDENTE, C'EST BEAUCOUP
< PLUS ESTHETIQUE... MAIS UNIQUEMENT
< LORS D'UNE ECRITURE...
<
         PSR         W               < SAUVEGARDE DE LA LRU COURANTE...
         LB          PARES,W         < (B)=ADRESSE MOT DE LA PAGE RESIDENTE,
         ADR         X,B
         LR          B,W             < (W)=ADRESSE DU PREMIER MOT NON ECHANGE
                                     <     DANS LA PAGE RESIDENTE...
         SB          VAR+LBMEMV
         NGR         A,X             < (X)=NOMBRE DE MOTS A NETTOYER...
MOVEV2:  EQU         $
         STZ         O,W             < ET ON NETTOIE...
         ADRI        D,W             < AU MOT SUIVANT,
         JDX         MOVEV2          < S'IL EXISTE...
         PLR         W               < ET ENFIN, ON RESTAURE L'ADRESSE
                                     < DE LA LRU COURANTE...
         JMP         MOVEV1          < VERS LA SORTIE...
<
< CAS D'UNE LECTURE :
<
MOVEV3:  EQU         $
         MVTS                        < IL S'AGIT D'UN MOUVEMENT DE L'ESPACE
                                     < ABSOLU DU SYSTEME VERS L'ESPACE RELATIF
                                     < DE L'UTILISATEUR ('SLO' ET 'SLE' SONT
                                     < CORRECTS)...
         PLR         X               < RESTAURE : (X)=NOMBRE DE MOTS TRANSFERES
<
< SORTIE :
<
MOVEV1:  EQU         $
         RSR
         PAGE
<
<
<        C O N S T A N T E S   G E N E R A L E S  :
<
<
XWOR%1:  VAL         COSBT?FGR=FMASK(K=FCINST
XWOR%1:  VAL         COSBT?FGW=FMASK(K?XWOR%1=FCINST
XXCU4::  VAL         8               < TRANSLATION DES FONCTIONS AVEC ATTENTE
                                     < D'INTERRUPTION.
XWOR%2:  VAL         FGR?XXCU4       < FONCTION LECTURE AVEC IT.
XWOR%1:  VAL         COSBT?XWOR%2=FMASK(K?XWOR%1=FCINST
XWOR%2:  VAL         FGW?XXCU4       < FONCTION ECRITURE AVEC IT.
XWOR%1:  VAL         COSBT?XWOR%2=FMASK(K?XWOR%1=FCINST
XXCU1::  VAL         XWOR%1          < POUR VALIDER LES FONCTIONS 'CU'.
XXCU2::  VAL         2               < INCREMENT DE LA LONGUEUR DES PILES.
XXCU3::  VAL         32              < POUR LE TEST DES TIME OUT...
                                     < ON LE PREND GRAND A CAUSE DES CONNEXIONS
                                     < EN MODE CANAL DU 'CU2' (IMPRIMANTE
                                     < ELECTROSTATIQUE PAR EXEMPLE...).
XXCUM1:: VAL         NOCMO           < 'CODEM' LEGAL POUR ACCES AU MOT2,
XXCUM2:: VAL         XXCUM1+NOCMO    < 'CODEM' LEGAL POUR ACCES AU MOT1.
XXCUMN:: VAL         XXCUM2+NOCMO    < 'CODEM' MINIMUM POUR PROCEDER A UNE
                                     < ITERATION SUR LE BUFFER (EN PROGRESSANT
                                     < DE MOT EN MOT BIEN SUR) VERS LE MOT2.
XXCUMP:: VAL         KOLON*NOCMO     < 'CODEM' MAXIMUM D'ITERATION SUR LE MOT2.
                                     < (ON PREND 'KOLON' CAR AINSI, ON PEUT
                                     < ENVOYER UNE CARTE D'UN COUP...)
XXCUMM:: VAL         YY8             < 'CODEM' MAXIMUM D'ITERATION SUR LE MOT2,
                                     < CELUI-CI DOIT ALORS ETRE SUPERIEUR A
                                     < 'XXCUMP'...
         IF          XXCUMP-XXCUMM,XEIF%,,
         IF          ATTENTION : LA DISCRIMINATION ENTRE LE
         IF          MOT1 ET LE MOT2 SERA MAUVAISE !!!
XEIF%:   VAL         ENDIF
         IF          XXCUMN-XXCUMP,XEIF%,,
         IF          ATTENTION : LA DISCRIMINATION ENTRE LE MOT1
         IF          L'ITERATION SUR LE MOT2 EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
XXNCU::  VAL         32767           < SUPER-TEMPORISATION LORS DES ECHANGES
                                     < SUR LES 'GPI' DUE AU DIALOGUE ENTRE
                                     < UN 'GPI' ET LES REGISTRES DE COULEUR
                                     < DE 'TV' ; CETTDE TEMPORISATION DE
                                     < DETECTION DE TIME-OUT DOIT ETRE SUPE-
                                     < RIEURE A LA DUREE D'UNE TRAME CDE 'TV'...
BUSY2::  VAL         ETANXT          < SIGNAL .NOT.BUSY2 DANS LE MOT D'ETAT,
BUSY1::  VAL         ETAOPE          < SIGNAL .NOT.BUSY1 DANS LE MOT D'ETAT.
XCBCU1:: VAL         NEXIST          < 'CU1' N'A PAS DE MODE CANAL,
XCBCU2:: VAL         EXIST           < 'CU2' A LE MODE CANAL,
XCBCU3:: VAL         NEXIST          < 'CU3' N'A PAS LE MODE CANAL.
         IF          XCBCU1-NEXIST,,XEIF%,
         IF          ATTENTION : IL FAUT DONNER A 'CU1' UN
         IF          'CCB' ET LE PLACER JUSTE DERRIERE 'VARCU1' !!!
XEIF%:   VAL         ENDIF
         IF          XCBCU3-NEXIST,,XEIF%,
         IF          ATTENTION : IL FAUT DONNER A 'CU3' UN
         IF          'CCB' ET LE PLACER JUSTE DERRIERE 'VARCU3' !!!
XEIF%:   VAL         ENDIF
XWOR%1:  VAL         K               < INITIALISATION...
XWOR%1:  VAL         COSBT?FGR=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?FGW=FMASK(K?XWOR%1=FCINST
                                     < NOTA : LES ENTREES-SORTIES AVEC INTERRUP-
                                     <        TIONS UTILISANT '&VAR+MEMCU', MAIS
                                     <        NE POSITIONNANT PAS (SLO,SLE), IL
                                     <        EST IMPOSSIBLE DE LES INSERER DANS
                                     <        'DCTFUP' !!!
XCUP1::  VAL         XWOR%1          < 'DCTFUP' POUR LES 'CU' N'AYANT PAS LE
                                     < MODE CANAL.
XWOR%1:  VAL         K               < INITIALISATION...
XWOR%1:  VAL         COSBT?FGR=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?FGW=FMASK(K?XWOR%1=FCINST
XWOR%2:  VAL         FGR?XXCU4       < FONCTION LECTURE AVEC IT.
XWOR%1:  VAL         COSBT?XWOR%2=FMASK(K?XWOR%1=FCINST
XWOR%2:  VAL         FGW?XXCU4       < FONCTION ECRITURE AVEC IT.
XWOR%1:  VAL         COSBT?XWOR%2=FMASK(K?XWOR%1=FCINST
XCUP2::  VAL         XWOR%1          < 'DCTFUP' POUR LES 'CU' FONCTIONNANT EN
                                     < MODE CANAL.
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        D C T   C O U P L E U R   U N I V E R S E L   1  :
<
<
         CALL        #SISP CMS5 DOL1#
DCTCU1:  EQU         $
PSTCU1:  WORD        K;K;K;K;COM+DEPCS;DCTCU1;NIL;PILCU1;HANDLR;SMST;SO;SE
       #@ASCI        " CU1"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR
         WORD        FILTRS
         WORD        XTALOC          < ETALOC.
         WORD        XXLOC0
         DZS         LSEM
         WORD        NIL             < TETE.
         WORD        NIL             < QUEUE.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLCU           < HANDLER SPECIFIQUE 'CUX'.
         WORD        ITCU            < ROUTINE SPECIFIQUE D'INTERRUPTIONS 'CUX'.
         WORD        K;K             < ETAT.
         WORD        XBITS0          < BITSEM.
         WORD        XXNTRY;TRYVID   < NTRIES ET FRTRY.
         WORD        K               < HSTATS.
         WORD        XXCU3           < TESTO#0 : TIME A OUT A TESTER...
         WORD        XXCU1           < LISTE DES FONCTIONS AUTORISEES.
         WORD        XCUP1           < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
<        Z O N E   V A R I A B L E  :
<
<
VARCU:   EQU         $
VARCU1:  EQU         VARCU
         IF          VARCU1-DCTCU1-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
< OPERANDES DES 'SIO' :
<
         WORD        ACCU1?FPHDUM    < LECTURE A PRIORI...
ECHCU::  VAL         $-D-VARCU       < ECHANGE INFORMATION AVEC CU1.
         WORD        ACCU1?FPHETA
ETAACU:: VAL         $-D-VARCU       < ENTREE DU MOT D'ETAT 'A'...
         WORD        ACCU1?FPHETB
ETABCU:: VAL         $-D-VARCU       < ENTREE DU MOT D'ETAT 'B'...
         WORD        ACCU1?FPHCME
CDECU::  VAL         $-D-VARCU       < SORTIE COMMANDE 'F7'.
         WORD        ACCU1?FPHCMD
CMDCU::  VAL         $-D-VARCU       < SORTIE COMMANDE 'F3'.
<
< RELAIS ET DIVERS :
<
         WORD        NILX
MEMCU::  VAL         $-D-VARCU       < RELAI VERS LA ZONE MEMOIRE
                                     < CONTENANT OU RECEVANT LE MOT
                                     < D'INFORMATION DU COUPLEUR.
         WORD        NILK
LONCU::  VAL         $-D-VARCU       < NOMBRE DE MOTS A ECHANGER.
         WORD        XXNCU
TXXNCU:: VAL         $-D-VARCU       < DETECTEUR LOCAL DE TIME-OUT SUR
                                     < LES ECHANGES EN PROGRAMME SIMPLE
                                     < DES 'GPI'...
                                     < NOTA : SI TXXNCU=0, IL N'Y A PAS DE TEST
                                     <        DE TIME-OUT, ET LE HANDLER RISQUE
                                     <        DE SE BLOQUER LONGUEMENT...
         WORD        SPCUV
ASPCU::  VAL         $-D-VARCU       < SOUS-PROGRAMME APPELE APRES LES SORTIES
                                     < ET EN FAIT UTILISE UNIQUEMENT PAR LE
                                     < 'CU3' LORS DE LA GESTION DE LA MEMOIRE
                                     < DES COULEURS.
         WORD        XCBCU1
XCCBCU:: VAL         $-D-VARCU       < INDICATEUR PRECISANT SI CE 'CU' POSSEDE
                                     < ('EXIST') OU PAS ('NEXIST') LE MODE
                                     < CANAL.
<
<
<        Z O N E   S P E C I F I Q U E   ' C U 1 '  :
<
<
SPECU1:  EQU         $
<
<
<        P I L E  :
<
<
XWPILE:  VAL         LPILEH+XXCU2
PILCU1:#@EQU         $-DEPILE        < #SISP CMS5 GENPIL1#
         PAGE
<
<
<        D C T   C O U P L E U R   U N I V E R S E L   2  :
<
<
DCTCU2:  EQU         $
PSTCU2:  WORD        K;K;K;K;COM+DEPCS;DCTCU2;NIL;PILCU2;HANDLR;SMST;SO;SE
       #@ASCI        " CU2"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR
         WORD        FILTRS
         WORD        XTALOC          < ETALOC.
         WORD        XXLOC0
         DZS         LSEM
         WORD        NIL             < TETE.
         WORD        NIL             < QUEUE.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLCU           < HANDLER SPECIFIQUE 'CUX'.
         WORD        ITCU            < ROUTINE SPECIFIQUE D'INTERRUPTIONS 'CUX'.
         WORD        K;K             < ETAT.
         WORD        XBITS0          < BITSEM.
         WORD        XXNTRY;TRYVID   < NTRIES ET FRTRY.
         WORD        K               < HSTATS.
         WORD        XXCU3           < TESTO#0 : TIME-OUT A TESTER...
         WORD        XXCU1           < LISTE DES FONCTIONS AUTORISEES.
         WORD        XCUP2           < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
<        Z O N E   V A R I A B L E  :
<
<
VARCU2:  EQU         $
         IF          VARCU2-DCTCU2-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
         WORD        ACCU2?FPHDUM    < ECHANGE INFORMATION AVEC CU2.
         WORD        ACCU2?FPHETA    < ENTREE MOT D'ETAT 'A' DE CU2.
         WORD        ACCU2?FPHETB    < ENTREE MOT D'ETAT 'B' DE CU2.
         WORD        ACCU2?FPHCME    < SORTIE COMMANDE 'F7' SUR CU2.
         WORD        ACCU2?FPHCMD    < SORTIE COMMANDE 'F3' SUR CU2.
         WORD        NILX            < RELAI VERS L'INFO COUPLEUR.
         WORD        NILK            < NOMBRE DE MOTS A ECHANGER.
         WORD        XXNCU           < DETECTEUR LOCAL DE TIME-OUT...
         WORD        SPCUV           < SOUS-PROGRAMME VIDE DE SORTIE.
         WORD        XCBCU2          < 'CU2' POSSEDE LE MODE CANAL.
<
<
<        Z O N E   S P E C I F I Q U E   ' C U 2 '  :
<
<
SPECU2:  EQU         $
<
< CONSTANTES DIVERSES :
<
         WORD        '3FF0
LMCU::   VAL         $-D-VARCU2      < LONGUEUR MAXIMALE D'UN ECHANGE CANAL.
         WORD        ACCU2
INICU::  VAL         $-D-VARCU2      < POUR INITIALISER L'ADRESSE DU COUPLEUR
                                     < DE 'CU2' DANS LE 'CCB'.
<
< 'CCB' D'ACCES A 'CU2' :
<
         WORD        K
CCBCV0:: VAL         $-D-VARCU2      < POUR INITIALISER 'CCBCU0'...
         WORD        K
CCBCV2:: VAL         $-D-VARCU2      < POUR INITIALISER 'CCBCU2'...
CCBCU::  VAL         $-VARCU2        < 'CCBCU' :
         WORD        K
CCBCU0:: VAL         $-D-VARCU2      < IL S'AGIT D'UN CANAL MOT...
         BYTE        CCBLDC?XSNCU2;K
                                     < CANAL 'LDC', ET 'ITN'...
         WORD        NIL
CCBCU2:: VAL         $-D-VARCU2      < ADRESSE MOT DU BUFFER.
         WORD        NILK
CCBCU3:: VAL         $-D-VARCU2      < LONGUEUR EN MOTS DE L'ECHANGE.
         WORD        ACCU2
CCBCU4:: VAL         $-D-VARCU2      < ADRESSE DU COUPLEUR DE 'CU2'.
<
< ACCES A 'TTYS' SUR DEFAUT DE 'CU2' :
<
         BYTE        NSPTYS;XDSYM
TYSCU2:: VAL         $-D-VARCU2      < DEMANDE D'EMISSION SUR 'TTYS'...
         WORD        FGW
         DZS         LDEM0+VARCU2-$+TYSCU2
<
<
<        P I L E  :
<
<
XWPILE:  VAL         LPILEH+XXCU2
PILCU2:#@EQU         $-DEPILE        < #SISP CMS5 GENPIL1#
         PAGE
<
<
<        D C T   C O U P L E U R   U N I V E R S E L   3  :
<
<
DCTCU3:  EQU         $
PSTCU3:  WORD        K;K;K;K;COM+DEPCS;DCTCU3;NIL;PILCU3;HANDLR;SMST;SO;SE
       #@ASCI        " CU3"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR
         WORD        FILTRS
         WORD        XTALOC          < ETALOC=XTALOC :
                                     < 'CU3' EST PARTAGEABLE AVEC LES ASSIGNS
                                     <       IMPLICITES, ET
                                     < 'CU3' EST NON PARTAGEABLES AVEC LES
                                     <       !ASSIGN EXPLICITES, QUI INHIBENT
                                     <       ALORS LES ASSIGNS IMPLICITES...
         WORD        XXLOC0
         DZS         LSEM
         WORD        NIL             < TETE.
         WORD        NIL             < QUEUE.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLCU           < HANDLER SPECIFIQUE 'CUX'.
         WORD        ITCU            < ROUTINE SPECIFIQUE D'INTERRUPTIONS 'CUX'.
         WORD        K;K             < ETAT.
         WORD        XBITS0          < BITSEM.
         WORD        XXNTRY;TRYVID   < NTRIES ET FRTRY.
         WORD        K               < HSTATS.
         WORD        XXCU3           < TESTO#0 : TIME-OUT A TESTER...
         WORD        XXCU1           < LISTE DES FONCTIONS AUTORISEES.
         WORD        XCUP1           < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
<        Z O N E   V A R I A B L E  :
<
<
VARCU3:  EQU         $
         IF          VARCU3-DCTCU3-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
         WORD        ACCU3?FPHDUM    < ECHANGE INFORMATION AVEC CU3.
         WORD        ACCU3?FPHETA    < ENTREE MOT D'ETAT 'A' DE CU3.
         WORD        ACCU3?FPHETB    < ENTREE MOT D'ETAT 'B' DE CU3.
         WORD        ACCU3?FPHCME    < SORTIE COMMANDE 'F7' SUR CU3.
         WORD        ACCU3?FPHCMD    < SORTIE COMMANDE 'F3' SUR CU3.
         WORD        NILX            < RELAI VERS L'INFO COUPLEUR.
         WORD        NILK            < NOMBRE DE MOTS A ECHANGER.
         WORD        XXNCU           < DETECTEUR LOCAL DE TIME-OUT...
         WORD        SPCUC           < GESTION DE LA MEMOIRE DES COULEURS.
         WORD        XCBCU3          < 'CU3' N'A PAS LE MODE CANAL...
<
<
<        Z O N E   S P E C I F I Q U E   ' C U 3 '  :
<
<
SPECU3:  EQU         $
XWOR%1:  VAL         SPECU1-DCTCU1
XWOR%2:  VAL         SPECU2-DCTCU2
XWOR%3:  VAL         SPECU3-DCTCU3
         IF          XWOR%1-XWOR%2,,XEIF%,
         IF          ATTENTION : LES 'DCTCUX' SONT MAUVAISES !!!
XEIF%:   VAL         ENDIF
         IF          XWOR%1-XWOR%3,,XEIF%,
         IF          ATTENTION : LES 'DCTCUX' SONT MAUVAISES !!!
XEIF%:   VAL         ENDIF
         WORD        ACCU3?FPHOUT
CUCLIR:: VAL         $-D-VARCU3      < POUR LES 'SIO' DE CLEAR DE LA CARTE...
         WORD        ACCU3?FPHSAD
CUINIT:: VAL         $-D-VARCU3      < POUR LES 'SIO' D'INITIALISATION DES
                                     < MEMOIRES DE COULEUR ET DE PROGRAMMATION
                                     < DU CONTROLEUR DE 'CRT'.
         WORD        SPCU1
ASPCU1:: VAL         $-D-VARCU3      < POUR TESTER LE MOT D'ETAT, ET
                                     < ATTENDRE LA LIBERATION...
<
< DEFINITION DU CONTROLEUR DE
< TELEVISION NUMERIQUE BASSE DEFINITION :
<
LICRT:   EQU         $               < REGISTRES PROGRAMMABLES DU
                                     < CONTROLEUR DE 'CRT' :
         BYTE        K;'27           < R0=H.TOTAL,
         BYTE        K;'20           < R1=H.DISPLAYED,
         BYTE        K;'24           < R2=H.SYNC POSITION ('24 AU LIEU DE '23
                                     <    PERMET LE CENTRAGE DES IMAGES CODEES
                                     <    EN SECAM...),
         BYTE        K;'03           < R3=H.SYNC WIDTH,
         BYTE        K;'26           < R4=V.TOTAL,
         BYTE        K;'00           < R5=V.SCAN LINE ADJUST,
         BYTE        K;'20           < R6=V.DISPLAYED,
         BYTE        K;'22           < R7=V.SYNC POSITION,
         BYTE        K;'01           < R8=INTERLACE MODE,
         BYTE        K;'07           < R9=MAX.SCAN LINE ADDRESS,
         BYTE        K;'05           < RA=CURSOR START,
         BYTE        K;'06           < RB=CURSOR END,
         BYTE        K;'00           < RC=START ADDRESS (H),
         BYTE        K;'00           < RD=START ADDRESS (L),
         BYTE        K;'01           < RE=CURSOR (H),
         BYTE        K;'02           < RF=CURSOR (L).
LLICRT:: VAL         $-LICRT         < LONGUEUR DE LA LISTE DE REINITIALI-
                                     < SATION DU CONTROLEUR DE 'CRT'...
<
<
<        P I L E  :
<
<
         CALL        #SISP CMS5 DOL2#
PILCU3:  EQU         $-DEPILE
XWPILE:  VAL         LPILEH+XXCU2
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        H A N D L E R   C O U P L E U R S   U N I V E R S E L S  :
<
<
<        FONCTION :
<                      CE HANDLER GERE LES 3 COUPLEURS
<                    DE TYPE 'GPI32' EN PERMETTANT L'ECHANGE
<                    D'INFORMATION PARALLELES 16 BITS MOT
<                    PAR MOT AVEC OU SANS IT...
<                      DANS LE CAS DE 'CU3', ET LORSQU'IL
<                    S'AGIT D'UN ACCES AU SYSTEME DES COULEURS
<                    DE LA TELEVISION NUMERIQUE, UNE MEMOIRE
<                    DES COULEURS EST GEREE ; ON NOTERA
<                    QUE CELLE-CI A UN CONTENU INITIAL
<                    QUI NE CORRESPOND PAS A CE QUE LE SYSTEME
<                    DE TELEVISION NUMERIQUE DIFFUSE, ET
<                    QU'UNE INITIALISATION S'IMPOSE ; ET
<                    QUE D'AUTRE PART, APRES UN DEFAUT
<                    SECTEUR, CETTE MEMOIRE REFLETE CE
<                    QU'IL Y AVAIT SUR L'ECRAN AVANT CELUI-CI...
<                    (MAIS VOIR LA 'COPY'...)
<
<
<        ARGUMENTS :
<                    (AMDEM)=ADRESSE OCTET DU BUFFER CONTENANT OU RECEVANT
<                            L'INFORMATION DU COUPLEUR, MAIS ATTENTION,
<                            SEUL LE DEUXIEME MOT EST SIGNIFICATIF SI
<                            CODEM=XXCUM2...
<                    (OPDEM)=0000 : LECTURE,
<                            1000 : LECTURE AVEC ATTENTE D'INTERRUPTION,
<                            0010 : ECRITURE,
<                            1010 : ECRITURE AVEC ATTENTE INTERRUPTION.
<                    (CODEM)=XXCUM1 : ACCES AU MOT2 (ANCIEN MODE), ET
<                                     ALORS 'AMDEM' DONNE DIRECTEMENT
<                                     L'ADRESSE DU MOT A ECHANGER.
<                          XXCUM2 : ACCES AU MOT1 (NOUVEAU MODE),ET
<                                     ALORS 'AMDEM'+NOCMO DONNE L'ADRESSE
<                                     DU MOT A ECHANGER...
<                          COMPRIS ENTRE XXCUMN ET XXCUMP : ON ITERE SUR LE
<                                     MOT2 (DE L'ANCIEN MODE) (CODEM)/NOCMO
<                                     FOIS EN PROGRESSANT MOT A MOT DANS LE
<                                     BUFFER ARGUMENT.
<                          COMPRIS ENTRE XXCUMP+NOCMO ET XXCUMM : ON
<                                     ITERE SUR LE MOT1 (CODEM)/NOCMO
<                                     FOIS, EN PROGRESSANT MOT A MOT
<                                     DANS LE BUFFER ARGUMENT, MAIS A
<                                     LA DIFFRENCE DE (CODEM)=XXCUM2,
<                                     'AMDEM' DONNE DIRECTEMENT L'ADRESSE
<                                     DU PREMIER MOT A ECHANGER.
<
<
<        CAS DE 'CU2' :
<                      LES ECHANGES SUR 'CU2' AVEC DEMANDE
<                    D'INTERRUPTION (TRANSLATION DES FONCTIONS
<                    'XXCU4') SONT ALORS GERES EN MODE CANAL
<                    'LDC'...
<
<
XWOR%1:  VAL         XXCU4=K
         IF          BIT>XWOR%1-XXCU4,,XEIF%,
         IF          ATTENTION : 'XXCU4' DOIT ETRE UNE PUISSANCE DE 2 !!!
XEIF%:   VAL         ENDIF
BXCU1::  VAL         NBITMO-B-XWOR%1 < NUMERO DU BIT DISCRIMINANT LES APPELS
                                     < AVEC IT DES APPELS SANS IT.
BXCU2::  VAL         ETAPIV          < BIT 'INFORMATION VALIDE' DU MOT
                                     < D'ETAT UTILISE DU COUPLEUR POUR LE
                                     < MOT2 EN ENTREE ('VAL2').
BXCU5::  VAL         ETAFBK          < BIT 'INFORMATION VALIDE' DU MOT
                                     < D'ETAT UTILISE DU COUPLEUR POUR LE
                                     < MOT1 EN ENTREE ('VAL1').
<
<
<        CODES D'ERREUR :
<                    'A0A0 : FONCTION NON RECONNUE,
<                    '0001 : DEFAUT COUPLEUR (L'OCCUPATION
<                            N'EST PAS RETOMBEE ASSEZ VITE !!!)
<                    '0002 : 'CODEM' INCORRECT.
<                    '0003 : 'AMDEM' IMPAIR...
<
<
<        A T T E N T I O N  :
<                      LE MOT D'INFORMATION COUPLEUR
<                    PEUT AUSSI ETRE UN MOT D'ETAT,
<                    UNE FONCTION QUE DE L'INFORMA-
<                    TION AU SENS CLASSIQUE DU TERME...
<
<
         USE         L,DCT0
         USE         W,DEM0
<
<
<        G E S T I O N   D E S   E C H A N G E S
<                    E N   M O D E
<                    C A N A L  :
<
<
HDLCU2:  EQU         $
         LA          ARGDEM+OPDEM
         TBT         BXCU1           < EST-CE BIEN UN ECHANGE EN MODE CANAL ???
         JNC         HDLCUA          < NON, ON EST RAMENE AU MODE PROGRAMME
                                     < SIMPLE...
<
< CAS DES ECHANGES CANAUX :
<
         LB          VAR+INICU       < (B)=ADRESSE DU COUPLEUR,
XWOR%1:  VAL         FGW?FGR=K
         TBT         NBITMO-B-XWOR%1 < DISCRIMINATION DU SENS DE L'ECHANGE,
         ADCR        B               < ET MISE A JOUR DANS CES CONDITIONS DE
                                     < L'ADRESSE DU COUPLEUR...
         IF          FPHOUT-FPHIN-I,,XEIF%,
         IF          ATTENTION : ICI ET AILLEURS, LA
         IF          MISE A JOUR DE L'ADRESSE D'UN COUPLEUR
         IF          EN FONCTION DU SENS DE L'ECHANGE EST
         IF          MAUVAISE !!!
XEIF%:   VAL         ENDIF
         STB         VAR+CCBCU4      < ET MISE A JOUR DU 'CCB'.
         LA          ARGDEM+AMDEM    < (A)=ADRESSE-OCTET ARGUMENT DU BUFFER,
         SLRS        NOCMO=K         < CONVERSION EN UNE ADRESSE-MOT :
         IF          NOCMO=K-W,,XEIF%,
         IF          ATTENTION : ICI ET AILLEURS DES TESTS
         IF          D'IMPARITE SUIVANT UN DECALAGE A
         IF          DROITE SONT MAUVAIS !!!
XEIF%:   VAL         ENDIF
         JC          E911CE          < ERREUR : L'ADRESSE-OCTET EST IMPAIRE...
         STA         VAR+CCBCV2      < MISE EN PLACE DE L'ADRESSE-MOT DU
                                     < BUFFER DANS LE 'CCB'...
         LA          ARGDEM+CODEM    < (A)=LONGUEUR OCTET DE L'ECHANGE,
         SLRS        NOCMO=K         < CONVERSION EN UNE LONGUEUR-MOTS,
         JC          E911E           < ERREUR, LA LONGUEUR-OCTETS ETAIT
                                     < IMPAIRE...
         CP          VAR+LMCU        < ET VALIDATION SUPERIEURE :
         JG          E911E           < TROP GRAND...
         STA         VAR+CCBCU3      < OK, ON MET LA LONGUEUR-MOT DE L'ECHANGE
                                     < DANS LE 'CCB'.
         STZ         VAR+CCBCV0      < INITILISATION DU PREMIER MOT SUR
                                     < UN CANAL MOT NORMAL...
<
< TEST DE L'ETAT DU COUPLEUR :
<
HDLCUF:  EQU         $
         SIO         VAR+ETAACU      < (A)=MOT D'ETAT 'A' DU COUPLEUR,
         TBT         BUSY1           < ALORS, COMMENT EST .NOT.BUSY1 ???
         JNC         HDLCUD          < A 0, TRES MAUVAIS...
         TBT         BXCU5           < A 1, MAIS ET 'VAL1' ???
         JNC         HDLCUE          < A 0, OK...
HDLCUD:  EQU         $
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE POURQUOI LE COUPLEUR EST DANS CET ETAT ???
<
HDLCUG:  EQU         $
         JMP         HDLCUF          < ET ON RE-TESTE...
HDLCUE:  EQU         $
<
< ECHANGE PROPREMENT DIT :
<
         LAD         VAR+CCBCU       < (A)=ADRESSE DU 'CCB',
         PSR         X
         SVC         SVCM6           < ADRESSE SUR 20 BITS DANS LE 'CCB'...
         PLR         X
         BSR         ASDIPI          < QUE L'ON TRANSMET AU PROCESSEUR
                                     < GERANT LES ENTREES-SORTIES...
BXCU3::  VAL         COMSTR          < SELECTION D'UNE SORTIE 'MOT2',
BXCU4::  VAL         COMTST          < SELECTION D'UNE SORTIE 'MOT1',
XWOR%2:  VAL         COSBT?COMINT=FMASK(K=FCINST
         LAI         COSBT?BXCU4=FMASK(K?XWOR%2=FCINST
         SIO         VAR+CDECU       < LANCEMENT DE L'ECHANGE PAR LE 'MOT1',
                                     < QUI EST SEUL RECONNU PAR LE CANAL, ET
                                     < VALIDATION DES INTERRUPTIONS...
         BSR         ACSWIT          < ET ATTENTE DE LA FIN DE L'ECHANGE...
<
< LORS DE LA FIN D'ECHANGE, ON
< VA REGARDER COMMENT TOUT CELA
< S'EST PASSE :
<
         LA          VAR+CCBCU0
         SBT         BCCBCR
         STA         VAR+CCBCU0      < ON MET LE 'CCB' EN MODE COMPTE-RENDU,
         LAD         VAR+CCBCU
         BSR         ASDIPI          < QUE L'ON ENVOIE AU PROCESSEUR GERANT
                                     < LES ENTREES-SORTIES,
         LA          VAR+CCBCU3      < (A)=COMPTE-RENDU, QUE L'ON VA ANALYSER :
         JAE         E914A           < TOUT S'EST BIEN PASSE...
<
< CAS DES DEFAUTS :
<
         TBT         BCCBDC          < EST-CE UN DEFSEC/CLEAR ???
         JC          HDLCU2          < OUI, LE MIEUX EST DE RECOMMENCER...
         TBT         BCCBME          < EST-CE UN DEFAUT MEMOIRE ???
         JNC         HDLCUB          < NON...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      IL CONVIENT DE REPERER SOIT
<                    LA ZONE FAISANT DES PARITES, SOIT
<                    DES MEMOIRE INEXISTANTES !!!
<
         RBT         BCCBME          < ON EFFACE LE DEFAUT,
HDLCUB:  EQU         $
         JAE         HDLCU2          < LE COMPTE DE MOTS RESIDUELS EST NUL,
                                     < ON RETENTE IMMEDIATEMENT...
         LAD         VAR+TYSCU2      < ET BIEN NON, LE COUPLEUR, OU CE QUI
                                     < LUI EST RACCORDE EST EN DEFAUT,
         XR          A,W             < (W)=ADRESSE DE LA DEMANDE A 'TTYS',
                                     < ET (A)=SAVE L'ANCIEN 'W'...
         BSR         ACHAND          < ON ENVOIE LA DEMANDE A TTYS,
         BSR         ACHANW          < ET L'ON ATTEND...
         LR          A,W             < PUIS ENFIN, ON RESTAURE 'W'...
XXTCU::  VAL         2               < DUREE DE LA TEMPORISATION INTER-TEN-
                                     < TATIVES SUR 'CU'...
         LXI         XXTCU
         BSR         ADODO           < ET UN PETIT DODO,
HDLCUC:  EQU         $
         JMP         HDLCU2          < ET ON RECOMMENCE TOUT...
<
< SORTIE DU MODE CANAL :
<
E914A:   EQU         $
         LA          ETAT1
         JMP         E914            < LE MOT D'ETAT DU COUPLEUR SERA AINSI
                                     < RENVOYE PAR 'ETAT0'...
<
<
<        P O I N T   D ' E N T R E E   D U   H A N D L E R   ' C U '  :
<
<
HDLCU:   EQU         $
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         VAR+XCCBCU      < CE 'CU' A-T'IL LE MODE CANAL ???
         JNE         HDLCU2          < OUI, ALLONS VOIR SI C'EST CE MODE QUI EST
                                     < DEMANDE...
<
<
<        C A S   D U   M O D E   P R O G R A M M E  ,
<        O U   D U   M O D E   N O N   C A N A L  :
<
<
HDLCUA:  EQU         $
         LAI         K
         SIO         VAR+CDECU       < INHIBITION DES INTERRUPTIONS...
<
< DISCRIMINATION MOT1/MOT2 :
<
         LAI         W
         STA         VAR+LONCU       < A PRIORI, ON NE VA ECHANGER QU'UN SEUL
                                     < MOT.
         LB          VAR+ECHCU       < (B)=ARGUMENT DE LA VRAIE 'SIO' D'E/S...
         LX          ARGDEM+AMDEM    < (X)=ADRESSE DU DEBUT DU BUFFER.
         LA          ARGDEM+CODEM
         CPI         XXCUM1          < EST-CE LE MOT2 ???
         JE          E911A           < OUI...
         CPI         XXCUM2          < EST-CE LE MOT1 ???
         JE          E911B           < OUI...
         CPI         XXCUMN
         JL          E911E           < ERREUR, TROP PETIT...
         SLRS        NOCMO=K         < LE CODEM EST PEUT-ETRE BON,
                                     < MAIS CORRESPOND-IL A UN NOMBRE ENTIER
                                     < DE MOTS ???
         JC          E911E           < NON, ERREUR...
         STA         VAR+LONCU       < ET OUI, ON A AINSI LE NOMBRE DE MOTS
                                     < A ECHANGER...
         CPI         XXCUMM/NOCMO    < VALIDATION :
         JG          E911E           < ERREUR, TROP GRAND...
         CPI         XXCUMP/NOCMO    < OK, DISCRIMINATION ENTRE L'ITERATION
                                     < SUR LE MOT1 ET LE MOT2 :
         JLE         E911A           < ENTRE 'XXCUMN' ET 'XXCUMP' C'EST
                                     < L'ITERATION SUR LE MOT2 (ANCIEN MODE,
                                     < PAR EXEMPLE POUR PERFORER DES CARTES).
         JMP         E911F           < ENTRE 'XXCUMP' ET 'XXCUMM' C'EST
                                     < L'ITERATION SUR LE MOT1 (NOUVEAU MODE
                                     < POUR ACCEDER L'IMPRIMANTE BENSON EN
                                     < PROGRAMME SIMPLE...).
         IF          NOCMO=K-W,,XEIF%,
         IF          ATTENTION : TOUS LES TESTS D'IMPARITE SUIVANT
         IF          UN DECALAGE A DROITE SONT IMPARFAITS !!!
XEIF%:   VAL         ENDIF
E911E:   EQU         $
ECNM::   VAL         2               < CODE D'ERREUR CONCERNANT UN 'CODEM'
                                     < INCORRECT...
         LAI         ECNM
         JMP         E914            < VERS LA SORTIE EN ERREUR...
<
< CAS DU MOT2 (ANCIEN MODE) :
<
E911A:   EQU         $
         LYI         BUSY2           < (Y)=BIT DE TEST DE .NOT.BUSY2.
XWOR%1:  VAL         FPHDUM?FPHIN=K  < DISCRIMINATION MOT1/MOT2...
XWOR%2:  VAL         FPHDUM=K
         IF          BIT>XWOR%2-FPHDUM,,XEIF%,
         IF          ATTENTION : 'FPHDUM' DOIT ETRE UNE PUISSANCE DE 2 !!!
XEIF%:   VAL         ENDIF
XWOR%2:  VAL         FPHOUT=K
         IF          BIT>XWOR%2-FPHOUT,,XEIF%,
         IF          ATTENTION : 'FPHOUT' DOIT ETRE UNE PUISSANCE DE 2 !!!
XEIF%:   VAL         ENDIF
XWOR%2:  VAL         FPHIN=K
         IF          BIT>XWOR%2-FPHIN,,XEIF%,
         IF          ATTENTION : 'FPHIN' DOIT ETRE UNE PUISSANCE DE 2 !!!
XEIF%:   VAL         ENDIF
         SBT         NBITMO-B-XWOR%1+NBITMO
                                     < FONCTION 'FPHDUM' (MOT2).
         JMP         E911C
<
< ACCES AU MOT1 (NOUVEAU MODE) :
<
E911B:   EQU         $
         ADRI        XXCUM2-XXCUM1,X < TRANSLATION DE L'ADRESSE DU BUFFER DANS
                                     < D'UN ECHANGE D'UN MOT SUR LE MOT1.
E911F:   EQU         $               < DANS LE CAS D'UN ECHANGE ITERE SUR LE
                                     < MOT1, 'AMDEM' N'EST PAS TRANSLATE...
                                     < (DUR, DUR...)
         LYI         BUSY1           < (Y)=BIT DE TEST DE .NOT.BUSY1.
         RBT         NBITMO-B-XWOR%1+NBITMO
                                     < FONCTION 'FPHIN' (MOT1).
<
< PREPARATION DES ARGUMENTS :
<
E911C:   EQU         $
         STB         VAR+ECHCU       < FONCTION D'E/S POUR LE 'GPI'.
         LR          X,A             < (A)=ADRESSE OCTET REELLE DU BUFFER,
         SLRS        NOCMO=K         < CONVERSION EN UNE ADRESSE MOT...
         JNC         E911D           < OK, ELLE EST BONNE...
E911CE:  EQU         $
ECAIM::  VAL         3               < 'AMDEM' IMPAIR...
         LAI         ECAIM
         JMP         E914            < VERS LA SORTIE EN ERREUR...
E911D:   EQU         $
         STA         VAR+MEMCU       < MISE EN PLACE DU RELAI...
<
<
<        B O U C L E   D ' I T E R A T I O N  :
<
<
E911I:   EQU         $
         LA          ARGDEM+OPDEM
         ANDI        MKOPDM          < RECUPERATION DE LA FONCTION DEMANDEE...
<
< PREPARATION DE L'OPERATION :
<
         LR          A,B             < (B)=FONCTION DEMANDEE SUR LE CU.
         LX          VAR+TXXNCU      < (X)=NBRE MAX DE TENTATIVES DE
                                     < SIO SUR LE COUPLEUR AUTORISEE,
                                     < AVANT DE LE DECLARER EN ERREUR,
                                     < POUR DESOCCUPATION NON ARRIVEE.
<
< REALISATION DE LA FONCTION :
<
XWOR%1:  VAL         FGR?FGW=K       < DISCRIMINATION LECTURE/ECRITURE...
         TBT         NBITAB-B-XWOR%1 < TEST LECTURE (0) / ECRITURE (1) ???
         JC          E912            < C'EST UNE ECRITURE.
<
<        L E C T U R E   S U R   C O U P L E U R   U N I V E R S E L  :
<
         LA          VAR+ECHCU
XWOR%1:  VAL         FPHOUT?FPHIN=K
         RBT         NBITMO-B-XWOR%1 < MEMORISATION DE LA FONCTION DE LECTURE,
         STA         VAR+ECHCU       < ET MISE A JOUR DE L'ARGUMENT DE 'SIO'...
         TBT         NBITMO+BXCU1    < DOIT-ON ATTENDRE UNE INTERRUPTION ???
         JNC         E913            < NON...
         LAI         MOMINT          < OUI :
         SIO         VAR+CDECU       < ET ON VALIDE LES INTERRUPTIONS...
         RQST        SIT             < ATTENTE DES INTERRUPTIONS (PAR 'RQST' ET
                                     < NON PAR 'ACSWIT', ON NE SAIT JAMAIS, AU
                                     < CAS OU ELLES SERAIENT MONTEES ENTRE LEUR
                                     < VALIDATION ET LE 'RQST'...).
         LAI         K
         SIO         VAR+CDECU       < PUIS, DEVALIDATION DES INTERRUPTIONS...
         CPZ         ETAT0           < QUELLE EST LA NATURE DE L'INTERRUPTION ??
         JE          Z1010           < (ETAT0)=0 : INTERRUPTION NORMALE...
         JMP         Z1011           < (ETAT0)#0 : INTERRUPTION EXCEPTION...
E913:    EQU         $
         SIO         VAR+ETABCU      < ENTREE DU MOT D'ETAT DANS 'A' :
         TBT         BXCU2           < L'INFORMATION EST-ELLE VALIDE ???
         JNC         E913B           < NON, ON RECOMMENCE...
         SIO         VAR+ECHCU       < OUI :
                                     < (A)=INFORMATION LUE.
<*******************************************************************************
         BSR         ASIMUL          < SIMULATION DE L'INSTRUCTION SUIVANTE :
         STA         &VAR+MEMCU      < SAUVEGARDE DE L'INFORMATION
<*******************************************************************************
         JMP         Z1010
E913B:   EQU         $
         CPZR        X               < DOIT-ON DETECTER LE TIME-OUT ???
         JE          E913            < NON (TXXNCU=0)...
         JDX         E913            < OUI...
<
<        T I M E D - O U T   S U R   C O U P L E U R  :
<
Z1011:   EQU         $
ECTO::   VAL         1               < 'TIME OUT SUR CU'.
         LAI         ECTO            < (A)=CODE D'ERREUR RENVOYE AU
                                     < DEMANDEUR, BIEN QU'IL NE SOIT
                                     < PAS RESPONSABLE !!!
         JMP         E914            < VERS LA SORTIE DU HANDLER.
<
< FIN CORRECTE D'UNE 'SIO' DE LECTURE :
<
Z1010:   EQU         $
<*******************************************************************************
         BSR         ASIMUL          < SIMULATION DE L'INSTRUCTION SUIVANTE :
         STA         &VAR+MEMCU      < RENVOI DU MOT LU SUR LE CU.
<*******************************************************************************
<
< ITERATION EVENTUELLE SUR UN MOT SUIVANT :
<
E915:    EQU         $
         IC          VAR+MEMCU       < ADRESSE DU MOT SUIVANT,
         DC          VAR+LONCU       < S'IL EXISTE...
         JG          E911I           < ET OUI, ON Y VA...
         LAI         K               < RETOUR OK.
E914:    EQU         $
         STA         ETAT0           < MISE DANS ETAT0 DU CODE DE RETOUR
         RSR                         < GO BACK.
<
<        E C R I T U R E   S U R   C O U P L E U R   U N I V E R S E L  :
<
E912:    EQU         $
         LA          VAR+ECHCU
XWOR%1:  VAL         FPHOUT?FPHIN=K
         SBT         NBITMO-B-XWOR%1 < MEMORISATION DE LA FONCTION D'ECRITURE,
         STA         VAR+ECHCU       < ET MISE A JOUR DE L'ARGUMENT DE 'SIO'.
         TBT         NBITMO+BXCU1    < DOIT-ON ATTENDRE LES INTERRUPTIONS ???
         JNC         E912A           < NON...
         LAI         MOMSTR?MOMINT   < OUI :
         SIO         VAR+CDECU       < VALIDATION DES INTERRUPTIONS ET MISE DU
                                     < 'MOT2' EN SORTIE...
         RQST        SIT             < ATTENTE DE L'INTERRUPTION (PAR 'RQST' ET
                                     < NON PAR 'ACSWIT', ON NE SAIT JAMAIS...).
         LAI         K
         SIO         VAR+CDECU       < DEVALIDATION DES INTERRUPTIONS...
         CPZ         ETAT0           < QUELLE FUT LA NATURE DE L'INTERRUPTION ??
         JE          E915            < (ETAT0)=0 : INTERRUPTION NORAMLE...
         JMP         Z1011           < (ETAT0)#0 : INTERRUPTION EXCEPTION...
E912A:   EQU         $
<*******************************************************************************
         BSR         ASIMUL          < SIMULATION DE L'INSTRUCTION SUIVANTE :
         LA          &VAR+MEMCU      < (A)=MOT1/MOT2 A SORTIR...
<*******************************************************************************
         SIO         VAR+ECHCU       < SORTIE DE L'INFORMATION (A) ; CECI
                                     < A POUR EFFET DE FAIRE TOMBER LE
                                     < SIGNAL .NOT.BUSY1/.NOT.BUSY2,
E912B:   EQU         $
         SIO         VAR+ETABCU      < ENTREE DU MOT D'ETAT DANS 'A',
         XR          X,Y             < (X)=BUSY1/BUSY2...
         TBT         L,X             < .NOT.BUSY1/.NOT.BUSY2 EST-IL REMONTE ???
         XR          X,Y
         JC          E915X           < OUI, LA SORTIE EST BONNE...
         CPZR        X               < DOIT-ON DETECTER LE TIME-OUT ???
         JE          E912B           < NON (TXXNCU=0)...
         JDX         E912B           < NON, ON RECOMMENCE...
         JMP         Z1011           < ERREUR : TIME-OUT...
E915X:   EQU         $
         BSR         VAR+ASPCU       < APRES UNE BONNE SORTIE, ON APPELLE
                                     < LE SOUS-PROGRAMME 'ASPCU'...
         JMP         E915            < ET ON SORT...
         PAGE
<
<
<        I N T E R R U P T I O N   S U R   ' C U X '  :
<
<
<        FONCTION :
<                      SUIVANT LA NATURE DE
<                    L'INTERRUPTION QUI EST
<                    MONTEE FAIT :
<                    1 - INTERRUPTION NORMALE : 'ITCU'
<                    PROCEDE A L'ECHANGE DEMANDE, PUIS
<                    REVEILLE LE HANDLER,
<                    2 - INTERRUPTION EXCEPTION : 'ITCU'
<                    LIT LE MODE D'ETAT AFIN DE FAIRE
<                    RETOMBER LE SOUS-NIVEAU, PUIS RE-
<                    VEILLE LE HANDLER.
<
<
<        ARGUMENTS:
<                    (B)=0 : SOUS-NIVEAU NORMAL,
<                       =1 : SOUS-NIVEAU EXCEPTION.
<                    (MEMCU)=RELAI INDEXE VERS LE BUFFER D'ECHANGE,
<                    (ECHCU)=SENS DE L'ECHANGE.
<
<
ITCU:    EQU         $
         STZ         ETAT0           < INTERRUPTION NORMALE A PRIORI...
         CPZR        B               < QUELLE EST LA NATURE DE L'INTERRUPTION ??
         JNE         ITCU2           < INTERRUPTION D'EXCEPTION...
<
< CAS D'UNE INTERRUPTION NORMALE :
<
         LA          VAR+ECHCU       < ACCES AU SENS DE L'ECHANGE :
XWOR%1:  VAL         FPHOUT?FPHIN=K
         TBT         NBITMO-B-XWOR%1
         JC          ITCU1           < CAS D'UNE ECRITURE...
<
< CAS D'UNE LECTURE :
<
         SIO         VAR+ECHCU       < (A)=INFORMATION PRESENTE EN ENTREE,
         BSR         ATEC            < MAIS Y-A-T'IL BIEN UN ECHANGE EN COURS ??
         JE          ITCU5           < NON, L'INFO LUE EST IGNOREE...
         STA         &VAR+MEMCU      < OUI, MISE DE L'INFORMATION VALIDE DANS
                                     < LE BUFFER...
ITCU5:   EQU         $
         JMP         ITCU3
<
< CAS D'UNE ECRITURE :
<
ITCU1:   EQU         $
         LAI         K               < PAS D'ECHANGE EN COURS A PRIORI...
         BSR         ATEC            < ALORS ???
         JE          ITCU4           < PAS D'ECHANGE EN COURS...
         LA          &VAR+MEMCU      < OUI, IL Y A UN ECHANGE EN COURS, ON
                                     < PREPARE L'INFORMATION A SORTIR...
ITCU4:   EQU         $
         SIO         VAR+ECHCU       < QUE L'ON ECRIT SUR LE 'CUX'...
         JMP         ITCU3
<
< CAS D'UNE INTERRUPTION EXCEPTION :
<
ITCU2:   EQU         $
         CPZ         VAR+XCCBCU      < CE 'CU' A-T'IL UN MODE CANAL ???
         JE          ITCU6           < NON...
<
< CAS D'UN FONCTIONNEMENT EN MODE CANAL :
<
         SIO         VAR+ETAACU      < ON RECUPERE LE MOT D'ETAT 'A' POUR FAIRE
                                     < RETOMBER LE SIGNAL D'APPEL EXTERNE
                                     < 'APEX1' ASSOCIE AU MOT1...
XWOR%1:  VAL         FPHOUT?FPHIN=K
         LA          VAR+CCBCU4
         TBT         NBITMO-B-XWOR%1 < EST-CE UNE ENTREE OU UNE SORTIE ???
         JNC         ITCU7           < UNE ENTREE...
XWOR%2:  VAL         CORBT?COMINT=FMASK(K=FCINST
XWOR%2:  VAL         CORBT?BXCU4=FMASK(K?XWOR%2=FCINST
         LAI         XWOR%2          < UNE SORTIE :
         SIO         VAR+CDECU       < ON INVALIDE LES PORTES DE SORTIE ET
                                     < LES INTERRUPTIONS.
ITCU7:   EQU         $
         LAI         CORBT?COMFBK=FMASK(K=FCINST
         SIO         VAR+CMDCU       < ET ON ENVOIE UNE COMMANDE DE FIN DE BLOC.
         JMP         ITCU8
<
< CAS DU MODE PROGRAMME GERE PAR INTERRUPTIONS :
<
ITCU6:   EQU         $
         SIO         VAR+ETABCU      < ENTREE MOT D'ETAT 'B'...
ITCU8:   EQU         $
         IC          ETAT0
ITCU3:   EQU         $
         BSR         ATEC            < Y-A-T'IL UNE OPERATION EN COURS ???
         JE          E911            < NON, IGNORONS L'INTERRUPTION...
         BSR         ARVHDL          < OUI, ON REVEILLE LE 'HANDLER'...
E911:    EQU         $
         RSR
         PAGE
<
<
<        M E M O I R E   D E S   C O U L E U R S  :
<
<
         CALL        #SISP CMS5 CHECK#
MCOLOR:  EQU         $
NCOLOR:  EQU         MCOLOR          < A CAUSE DE REFERENCES EN AVANT...
         DO          XXCULM
         WORD        XXCUMB?XXCUMV?XXCUMR
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        G E S T I O N   D E   L A   M E M O I R E   D E S
<                    C O U L E U R S   P A R   ' C U 3 '  :
<
<
SPCUC:   EQU         $
         LR          Y,A
         CPI         BUSY2           < EST-CE LE MOT2 QUE L'ON A ECRIT ???
         JNE         SPCUC1          < NON, DONC PAS DE COULEURS...
         PSR         B,X,W
<*******************************************************************************
         BSR         ASIMUL          < SIMULATION DE L'INSTRUCTION SUIVANTE :
         LB          &VAR+MEMCU      < (B)=MOT ARGUMENT...
<*******************************************************************************
         LRM         A,W
         WORD        XXCUC0)MMOT     < (A)=MASQUE DE DETECTION DES BITS DE TETE,
         WORD        MCOLOR          < (W)=BASE DE LA MEMOIRE DES COULEURS.
         ANDR        B,A
         CPR         A,B             < LES BITS 'XXCUC0' SONT-ILS LA ???
         JNE         SPCUC2          < OUI, DONC PAS DE COULEURS...
         LR          A,B             < (B)=ARGUMENT DE COLORIAGE...
         ANDI        XXCUAD
XWOR%1:  VAL         XXCUAD=K
         IF          XWOR%1-K,,XEIF%,
         SLRS        XWOR%1          < (A)=ADRESSE DES REGISTRES A POSITIONNER..
XEIF%:   VAL         ENDIF
         ADR         A,W             < (W)=ADRESSE DE LA MEMOIRE DE COULEURS A
                                     <     A POSITIONNER...
         LR          B,A
         ANDI        XXCUNI
XWOR%1:  VAL         XXCUNI=K
         IF          XWOR%1-K,,XEIF%,
         SLRS        XWOR%1
XEIF%:   VAL         ENDIF
         LR          A,X             < (X)=NIVEAU DE LUMINANCE DEMANDE.
<
< GESTION DU CANAL ROUGE EN DIFFUSION :
<
         TBT         NBITMO+XXCUCR
         JNC         SPCUC3          < PAS DE ROUGE EN SORTIE EN (W)...
         LAI         XXCUMR)MMOT
         AND         O,W             < CLEAR LA MEMOIRE,
XWOR%1:  VAL         XXCUMR=K
         IF          XWOR%1-K,,XEIF%,
         SCRS        XWOR%1          < CADRAGE,
XEIF%:   VAL         ENDIF
         ORR         X,A             < ET CONCATENATION DE LA LUMINANCE,
         IF          XWOR%1-K,,XEIF%,
         SCLS        XWOR%1          < ET RECADRAGE,
XEIF%:   VAL         ENDIF
         STA         O,W             < ET MISE A JOUR DE LA MEMOIRE...
<
< GESTION DU CANAL VERT EN DIFFUSION :
<
SPCUC3:  EQU         $
         TBT         NBITMO+XXCUCV
         JNC         SPCUC4          < PAS DE VERT EN SORTIE EN (W)...
         LAI         XXCUMV)MMOT
         AND         O,W             < CLEAR LA MEMOIRE,
XWOR%1:  VAL         XXCUMV=K
         IF          XWOR%1-K,,XEIF%,
         SCRS        XWOR%1          < CADRAGE,
XEIF%:   VAL         ENDIF
         ORR         X,A             < ET CONCATENATION DE LA LUMINANCE,
         IF          XWOR%1-K,,XEIF%,
         SCLS        XWOR%1          < ET RECADRAGE,
XEIF%:   VAL         ENDIF
         STA         O,W             < ET MISE A JOUR DE LA MEMOIRE...
<
< GESTION DU CANAL BLEU EN DIFFUSION :
<
SPCUC4:  EQU         $
         TBT         NBITMO+XXCUCB
         JNC         SPCUC5          < PAS DE BLEU EN SORTIE EN (W)...
         LRM         A
         WORD        XXCUMB)MMOT
         AND         O,W             < CLEAR LA MEMOIRE,
XWOR%1:  VAL         XXCUMB=K
         IF          XWOR%1-K,,XEIF%,
         SCRS        XWOR%1          < CADRAGE,
XEIF%:   VAL         ENDIF
         ORR         X,A             < ET CONCATENATION DE LA LUMINANCE,
         IF          XWOR%1-K,,XEIF%,
         SCLS        XWOR%1          < ET RECADRAGE,
XEIF%:   VAL         ENDIF
         STA         O,W             < ET MISE A JOUR DE LA MEMOIRE...
<
< SORTIE :
<
SPCUC5:  EQU         $
SPCUC2:  EQU         $
         PLR         B,X,W
SPCUC1:  EQU         $
<
<
<        S O U S - P R O G R A M M E   V I D E  :
<
<
SPCUV:   EQU         $
         RSR
         PAGE
<
<
<        I N I T I A L I S A T I O N   D E   L A
<        T E L E V I S I O N   N U M E R I Q U E  :
<
<
<        FONCTION :
<                      CE MODULE IMPLEMENTE ICI, AFIN DE
<                    BENEFICIER DE 'DCTCU3' INITIALISE
<                    LA MEMOIRE DES COULEURS, ET LE CON-
<                    TROLEUR DE 'CRT' (OU REINITIALISE A
<                    LA SUITE D'UN DEFAUT SECTEUR..).
<                      LE 'RESTART' SE BRANCHE BRUTALEMENT
<                    ICI SANS FAIRE DE DEMANDE DE SERVICE
<                    POUR PLUSIEURS RAISONS :
<                    1 - C'EST PEUT-ETRE 'HDLCU3' QUI A
<                    ETE INTERROMPUE PAR UN EVENTUEL DEFAUT
<                    SECTEUR, OU BIEN ELLE EST ACTIVE ET NE
<                    PEUT ACCEPTER PRESENTEMENT DE DEMANDE
<                    DE SERVICE.
<                    2 - IL Y A PEUT ETRE UN !ASSIGN SUR
<                    LE 'CU3', AUQUEL CAS, LE RESTART NE
<                    POURRAIT ENVOYER SA DEMANDE...
<
<
XXCWA::  VAL         10              < NOMBRE D'ITERATIONS SUR LE 'DODO'
                                     < D'ATTENTE DE FIN DE PROGRAMMATION
                                     < DU CONTROLEUR DE 'CRT'.
XXCLIR:: VAL         1               < VALEUR A ENVOYER POUR CLEARER LA CARTE
                                     < DE TELEVISION NUMERIQUE.
XXCSEL:: VAL         BITSIG          < BIT DE SELECTION DU PROGRAMMATEUR DU
                                     < CONTROLEUR DE 'CRT'.
XXCENA:: VAL         4               < BIT 'ENABLE' :
                                     < 0 : LATCH DES VALEURS PRESENTEES,
                                     < 1 : ECRITURE DE CELLES-CI.
XXCADV:: VAL         6               < BIT DE SELECTION :
                                     < 0 : ADRESSE DE REGISTRE,
                                     < 1 : SON CONTENU.
XWOR%1:  VAL         COSBT?XXCSEL=FMASK(K=FCINST
XWOR%2:  VAL         CORBT?XXCENA=FMASK(K?XWOR%1=FCINST
XXC1::   VAL         CORBT?XXCADV=FMASK(K?XWOR%2=FCINST
XWOR%2:  VAL         COSBT?XXCENA=FMASK(K?XWOR%1=FCINST
XXC2::   VAL         CORBT?XXCADV=FMASK(K?XWOR%2=FCINST
XWOR%2:  VAL         CORBT?XXCENA=FMASK(K?XWOR%1=FCINST
XXC3::   VAL         COSBT?XXCADV=FMASK(K?XWOR%2=FCINST
XWOR%2:  VAL         COSBT?XXCENA=FMASK(K?XWOR%1=FCINST
XXC4::   VAL         COSBT?XXCADV=FMASK(K?XWOR%2=FCINST
XWOR%2:  VAL         XXCADV-I?COSBT=FMASK(K?XWOR%1=FCINST
XWOR%2:  VAL         XXCADV?COSBT=FMASK(K?XWOR%2=FCINST
XWOR%2:  VAL         XXCADV+I?COSBT=FMASK(K?XWOR%2=FCINST
XXC5::   VAL         CORBT?XXCENA=FMASK(K?XWOR%2=FCINST
<
<
<        I N I T I A L I S A T I O N   G E N E R A L E  :
<
<
<        ARGUMENT :
<                    (B)=ADRESSE DE RETOUR (EN EFFET, 'GOCOL'
<                        N'EST PAS APPELE PAR UN 'BSR'...).
<
<
GOCOL:   EQU         $
         PSR         B               < SAUVEGARDE DE L'ADRESSE DE RETOUR ; EN
                                     < EFFET, BIEN QUE CONSIDERE COMME UN SOUS-
                                     < PROGRAMME, 'GOCOL' N'EST PAS APPELE PAR
                                     < UN 'BSR'...
         LA          ETASYS
         TBT         TVEXIS          < MAIS LA TELEVISION NUMERIQUE EST-ELLE LA?
         JNC         INITC3          < NON, ON NE FAIT RIEN...
         PSR         X,Y,L,W
         LXI         NSPCU3
         BSR         ACADCT          < RENVOIE : (A)=(L)=ADRESSE DE 'DCTCU3'...
<
<
<        C L E A R   T E L E V I S I O N   N U M E R I Q U E  :
<
<
         LYI         BUSY1           < POUR TESTER LA DESOCCUPATION...
         LAI         XXCLIR
         SIO         VAR+CUCLIR      < CLEAR LA CARTE,
         BSR         VAR+ASPCU1      < ET ATTENTE DE FIN DE CLEAR...
         LAI         K
         SIO         VAR+CUCLIR      < RETOUR A L'ETAT BAS,
         BSR         VAR+ASPCU1      < ET ATTENTE DE FIN...
<
<
<        I N I T I A L I S A T I O N   D U   C O N T R O L E U R
<                    D E   ' C R T '  :
<
<
         LRM         W
         WORD        LICRT           < (W)=ADRESSE DU CONTENU A DONNER AU
                                     <     REGISTRE COURANT DE NUMERO (X).
         LYI         BUSY2           < POUR TESTER LA DESOCCUPATION...
         LRM         A
         WORD        XXC5
         SIO         VAR+CUINIT      < "OUVERTURE" DE L'OPERATION...
         BSR         VAR+ASPCU1      < ET ATTENTE DE FIN D'OUVERTURE...
<
< PROGRAMMATION DU REGISTRE DE NUMERO (X) :
<
         LXI         K               < (X)=NUMERO DE REGISTRE COURANT.
INITC2:  EQU         $
         LRM         A
         WORD        XXC1
         ORR         X,A
         SIO         VAR+CUINIT      < LATCH DU NUMERO DE REGISTRE.
         BSR         VAR+ASPCU1      < ET ATTENTE DE FIN DE LATCH...
         LRM         A
         WORD        XXC2
         ORR         X,A
         SIO         VAR+CUINIT      < ECRITURE DU NUMERO DE REGISTRE.
         BSR         VAR+ASPCU1      < ET ATTENTE DE FIN D'ECRITURE...
         LRM         A
         WORD        XXC3
         OR          O,W
         SIO         VAR+CUINIT      < LATCH DE LA VALEUR DU REGISTRE.
         BSR         VAR+ASPCU1      < ET ATTENTE DE FIN DE LATCH...
         LRM         A
         WORD        XXC4
         OR          O,W
         SIO         VAR+CUINIT      < ECRITURE DE LA VALEUR DU REGISTRE...
         BSR         VAR+ASPCU1      < ET ATTENTE DE FIN D'ECRITURE...
         ADRI        D,W             < PASSAGE A LA VALEUR
         ADRI        I,X             < DU REGISTRE SUIVANT
         LR          X,A
         CPI         LLICRT          < S'IL EXISTE ???
         JL          INITC2          < OUI...
         LRM         A
         WORD        XXC5
         SIO         VAR+CUINIT      < NON, ON "FERME" L'OPERATION...
         BSR         VAR+ASPCU1      < ET ATTENTE DE FIN DE FERMETURE...
<
<
<        A T T E N T E   D E   F I N   D E   P R O G R A M M A T I O N
<                    D U   C O N T R O L E U R   D E   C R T  :
<
<
         LXI         XXCWA
INITC4:  EQU         $
         PSR         X
         LXI         K-I             < POUR ATTENDRE UN MAXIMUM...
         BSR         ADODO           < ET ON ATTEND...
         PLR         X
         JDX         INITC4          < ET ENCORE, ET TOUJOURS...
<
<
<        M E M O I R E   D E S   C O U L E U R S  :
<
<
         LXI         K               < (X)=NUMERO DE REGISTRE COURANT...
         LRM         W
         WORD        MCOLOR          < (W)=ADRESSE DE L'ENTREE COURANTE.
<
< ITERATION SUR CHAQUE ENTREE :
<
INITC1:  EQU         $
XWOR%2:  VAL         XXCUNI=K        < POUR LE NIVEAU DE GRIS...
XWOR%3:  VAL         XXCUAD=K        < POUR L'ADRESSE DU REGISTRE...
         LAI         XXCUMR
         AND         O,W             < ACCES AU NIVEAU DE ROUGE DU REGISTRE
                                     < (X) COURANT,
XWOR%1:  VAL         XXCUMR=K
         IF          XWOR%1-K,,XEIF%,
         SLRS        XWOR%1          < ET CADRAGE A DROITE...
XEIF%:   VAL         ENDIF
         SCRS        XWOR%3-XWOR%2
         ORR         X,A             < CONCATENATION DE L'ADRESSE DU REGISTRE,
         SCLS        XWOR%3          < ET CADRAGE...
         SBT         XXCUCR          < SELECTION DU CANAL ROUGE...
         SIO         VAR+CUINIT      < INITIALISATION DU CANAL ROUGE DU
                                     < REGISTRE (X),
         BSR         VAR+ASPCU1      < ET ATTENTE DE FIN...
         LAI         XXCUMV
         AND         O,W             < ACCES AU NIVEAU DE VERT DU REGISTRE
                                     < (X) COURANT,
XWOR%1:  VAL         XXCUMV=K
         IF          XWOR%1-K,,XEIF%,
         SLRS        XWOR%1          < ET CADRAGE A DROITE...
XEIF%:   VAL         ENDIF
         SCRS        XWOR%3-XWOR%2
         ORR         X,A             < CONCATENATION DE L'ADRESSE DU REGISTRE,
         SCLS        XWOR%3          < ET CADRAGE...
         SBT         XXCUCV          < SELECTION DU CANAL VERT...
         SIO         VAR+CUINIT      < INITIALISATIION DU CANAL VERT DU
                                     < REGISTRE (X),
         BSR         VAR+ASPCU1      < ET ATTENTE DE FIN...
         LRM         A
         WORD        XXCUMB
         AND         O,W             < ACCES AU NIVEAU DE BLEU DU REGISTRE
                                     < (X) COURANT,
XWOR%1:  VAL         XXCUMB=K
         IF          XWOR%1-K,,XEIF%,
         SLRS        XWOR%1          < ET CADRAGE A DROITE...
XEIF%:   VAL         ENDIF
         SCRS        XWOR%3-XWOR%2
         ORR         X,A             < CONCATENATION DE L'ADRESSE DU REGISTRE,
         SCLS        XWOR%3          < ET CADRAGE...
         SBT         XXCUCB          < SELECTION DU CANAL BLEU...
         SIO         VAR+CUINIT      < INITIALISATION DU CANAL BLEU DU
                                     < REGISTRE (X),
         BSR         VAR+ASPCU1      < ET ATTENTE DE FIN...
         ADRI        D,W             < PUIS PASSAGE A L'ENTREE SUIVANTE,
         ADRI        I,X             < PASSAGE AU REGISTRE SUIVANT,
         LR          X,A
         CPI         XXCULM          < S'IL EXISTE ???
         JL          INITC1          < OUI...
<
< FIN DE L'INITIALISATION :
<
         PLR         X,Y,L,W
INITC3:  EQU         $
         RSR                         < ET RETOUR (CORRESPONDANT AU
                                     < 'PSR''B' DE TETE...).
<
<
<        T E S T   D E   D E S O C C U P A T I O N  :
<
<
<        FONCTION :
<                      TESTE LA FIN D'UNE OPERATION
<                    PRECEDEMMENT DEMANDEE ; A NOTER
<                    QU'IL Y A UN TEST DE TIME-OUT
<                    DESTINE AU CAS OU LE SYSTEME SERAIT
<                    ABSENT, MAIS RIEN N'EST FAIT S'IL Y
<                    A TIME-OUT !!!
<
<
<        ARGUMENT :
<                    (Y)=NUMERO D'UN BIT A TESTER DANS LE MOT D'ETAT.
<
<
<        RESULTAT :
<                    (A)=VALEUR COURANTE DU DETECTEUR DE TIME-OUT.
<                        (DOIT ETRE DIFFERENTE DE 0 SI OK...)
<
<
SPCU1:   EQU         $
         PSR         X
         LX          VAR+TXXNCU      < (X)=DETECTEUR DE TIME-OUT...
SPCU11:  EQU         $
         SIO         VAR+ETABCU      < (A)=MOT D'ETAT :
         XR          X,Y
         TBT         L,X             < ALORS C'EST FINI ???
         XR          X,Y
         JC          SPCU12          < OUI, OK...
         JDX         SPCU11          < NON, DETECTION DES TIME-OUT...
<
<        NOTA :
<                      SI ON ARRIVE ICI, IL Y A
<                    TIME OUT MAIS ON NE FAIT RIEN
<                    SI CE N'EST QUE L'ON VA FAIRE :
<                    (A)=(X)=0...
<
SPCU12:  EQU         $
         LR          X,A             < A EST NUL S'IL Y A TIME OUT...
         PLR         X
         RSR
         PAGE
<
<
<        C O N S T A N T E S   D I V E R S E S   ' L P '  :
<
<
XXTLP::  VAL         2               < DUREE DE LA TEMPORISATION ENTRE 2
                                     < MESSAGES SUR 'TTYS'.
XXTOLP:: VAL         8               < DUREE DU DETECTEUR DE 'TIME-OUT'.
XXLP0::  VAL         K               < INDEX D'OCTET,
XXLP1::  VAL         XXLP0+I         < DE MEME...
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        D C T   L P 1  :
<
<
         CALL        #SISP CMS5 DOL1#
DCTLP1:  EQU         $
PSTLP1:  WORD        K;K;K;K;COM+DEPCS;DCTLP1;NIL;PILLP1;HANDLR;SMST;SO;SE
       #@ASCI        " LP1"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR
         WORD        FILTRS          < S-FILTRE.
         WORD        XTALOC          < ETALOC.
         WORD        XXLOC0          < SEMLOC
         DZS         LSEM
         WORD        NIL             < TETE DE LA FILE D'ATTENTE SUR 'LP1',
         WORD        NIL             < QUEUE DE LA FILE D'ATTENTE SUR 'LP1'.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLLP           < HANDLER SPECIFIQUE 'LP1'.
         WORD        ITLP            < ROUTINE SPECIFIQUE D'INTERRUPTION 'LP1'.
         WORD        K;K             < ETAT
         WORD        COSBT?B0SIT=FMASK(K?'0100=FCINST
                                     < BITSEM : REVEIL SUR DEFAUT SECTEUR.
         WORD        XXNTRY;TRYVID   < NTRIES ET FRTRY.
         WORD        K               < HSTATS.
         WORD        XXTOLP          < TESTO#0 : TIME-OUT A TESTER.
         WORD        COSBT?FGW=FMASK(K=FCINST
         WORD        COSBT?FGW=FMASK(K=FCINST
                                     < DCTFUP.
<
<
<        Z O N E   V A R I A B L E  :
<
<
VARLP:   EQU         $               < ZONE VARIABLE DCTLP1
VARLP1:  EQU         $
         IF          VARLP1-DCTLP1-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
< OPERANDES DES 'SIO' :
<
         WORD        ACLP1?FPHETA
ETALP1:: VAL         $-D-VARLP       < OPERANDE DE LA 'SIO' ENTREE DU MOT D'ETAT
         WORD        ACLP1?FPHCMD
CDELP1:: VAL         $-D-VARLP       < OPERANDE DE LA 'SIO' DE SORTIE COMMANDE.
<
< RELAIS DIVERS :
<
         WORD        BULP1,X
AXBULP:: VAL         $-D-VARLP       < RELAI INDEX SUR UN BUFFER 'LP1' ;
                                     < CE BUFFER EST PARFOIS NECESSAIRE
                                     < SI LE BUFFER UTILISATEUR N'EST PAS
                                     < A UNE FRONTIERE DE MOT.
         WORD        RCLF,X
AXRCLF:: VAL         $-D-VARLP       < RELAI INDEXE VERS UN MESSAGE 'R/C'-'LF',
                                     < AFIN DE SIMULER LE CODE '6D UTILISABLE
                                     < PAR LES UTILISATEURS (ON N'EST JAMAIS
                                     < TROP AIMABLE), POUR COMPATIBILITE AVEC LE
                                     < AVEC LES VISUS...
<
< INFORMATIONS DE DIMENSIONNEMENT :
<
         WORD        LMBLP1
NMAXLP:: VAL         $-D-VARLP       < NOMBRE MAXIMUM D'OCTETS ECHANGEABLES.
         WORD        W
NMINLP:: VAL         $-D-VARLP       < NOMBRE MINIMUM D'OCTETS ECHANGEABLES.
         WORD        NILX
C1MICA:: VAL         $-D-VARLP       < RELAI D'ACCES AU PREMIER OCTET D'UN
<
                                     < BUFFER A EDITER...
< DEMANDE A 'TTYS' D'AVERTISSEMENT
< DE L'OPERATEUR EN CAS DE NON-
< OPERATIONNALITE DE 'LP1' :
<
         BYTE        NSPTYS;XDSYM
TYSLP1:: VAL         $-D-VARLP
         WORD        FGW             < ECRITURE...
         DZS         LDEM0+VARLP-$+TYSLP1 < NOTA : CETTE DEMANDE N'EST PAS
                                     < METICULEUSEMENT VALIDEE PAR TTYS...
<
< RELAIS DE SOUS-PROGRAMMES :
<
         WORD        EDLLP
AEDLLP:: VAL         $-D-VARLP       < EDITION D'UNE CHAINE D'OCTETS.
<
< 'CCB' DE 'LP1' :
<
         WORD        K
CCBLQ0:: VAL         $-D-VARLP       < POUR INITIALISER 'CCBLP0'...
         WORD        K
CCBLQ2:: VAL         $-D-VARLP       < ET 'CCBLP2'...
CCBLP::  VAL         $-VARLP         < 'CCBLP' :
         WORD        K
CCBLP0:: VAL         $-D-VARLP       < MOT0.
         BYTE        CCBLDC?XSNLP1;K
CCBLP1:: VAL         $-D-VARLP       < MOT1 : SOUS-NIVEAU D'INTERRUPTION.
         WORD        K
CCBLP2:: VAL         $-D-VARLP       < MOT2 : ADRESSE-MOT BUFFER.
         WORD        NILK
CCBLP3:: VAL         $-D-VARLP       < MOT3 : COMPTE D'OCTETS,
                                     <        PUIS COMPTE RENDU...
         WORD        ACLP1?FPHOUT
CCBLP4:: VAL         $-D-VARLP       < MOT4 : OPERANDE 'SIO' SORTIE INFORMATION.
<
<
<        P I L E  :
<
<
XWPILE:  VAL         LPILEH+16
PILLP1:#@EQU         $-DEPILE        < #SISP CMS5 GENPIL1#
         PAGE
<
<
<        C O N S T A N T E S   D I V E R S E S   ' C R '  :
<
<
XXCR1::  VAL         14+8            < INCREMENT DES LONGUEURS DE PILE.
XXTCR::  VAL         8               < DUREE DE TEMPORISATION ENTRE 2
                                     < MESSAGES SUR 'TTYS'.
XXTOCR:: VAL         8               < DUREE DU DETECTEUR DE 'TIME-OUT'.
FGCRA::  VAL         FAVR            < FONCTION 'LECTURE ASCI',
FGCRAE:: VAL         FAVRE           < FONCTION 'LECTURE ASCI AVEC ECHO',
FGCRB::  VAL         8               < FONCTION 'LECTURE BINAIRE'.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?FGCRA=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?FGCRAE=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?FGCRB=FMASK(K?XWOR%1=FCINST
XXCR2::  VAL         XWOR%1          < LISTE DES FONCTIONS RECONNUES.
XWOR%1:  VAL         K
XWOR%1:  VAL         COSBT?FGCRA=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?FGCRAE=FMASK(K?XWOR%1=FCINST
XWOR%1:  VAL         COSBT?FGCRB=FMASK(K?XWOR%1=FCINST
XXCR3::  VAL         XWOR%1          < "ALTITUDES" DES FONCTIONS 'CR'.
         PAGE
<
<
<        D C T   C R 1  :
<
<
DCTCR1:  EQU         $
PSTCR1:  WORD        K;K;K;K;COM+DEPCS;DCTCR1;NIL;PILCR1;HANDLR;SMST;SO;SE
       #@ASCI        " CR1"          < #SISP CMS5 ASCI#
         BYTE        NSPLP1;NOUSER   < IOID.
         WORD        NFILTR
         WORD        FILTRS          < S-FILTRE.
         WORD        XTALOC          < ETALOC.
         WORD        XXLOC0          < SEMLOC
         DZS         LSEM
         WORD        NIL             < TETE DE LA FILE D'ATTENTE SUR CR1,
         WORD        NIL             < QUEUE DE LA FILE D'ATTENTE SUR CR1.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLCR           < HANDLER SPECIFIQUE DES 'CRX'.
         WORD        ITCR            < ROUTINE SPECIFIQUE D'INTERRUPTION 'CRX'.
         WORD        K;K             < ETAT.
XCRMY::  VAL         '0200           < CONSTANTE MYSTERIEUSE !??!???!!
         WORD        COSBT?B0SIT=FMASK(K?XCRMY=FCINST
         WORD        XXNTRY;TRYVID   < NTRIES & FRETRY.
         WORD        K               < HSTATS.
         WORD        XXTOCR          < TESTO#0 : TIME-OUT A TESTER.
         WORD        XXCR2           < LISTE DES FONCTIONS RECONNUES.
         WORD        XXCR3           < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
<        Z O N E   V A R I A B L E  :
<
<
VARCR:   EQU         $
VARCR1:  EQU         $
         IF          VARCR1-DCTCR1-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
< OPERANDES DES 'SIO' :
<
         WORD        ACCR1?FPHCMD
CDECR1:: VAL         $-D-VARCR       < ARGUMENT DE 'SIO' DE SORTIE COMMANDE.
         WORD        ACCR1?FPHETA
ETACR1:: VAL         $-D-VARCR       < ARGUMENT DE 'SIO' D'ENTREE MOT D'ETAT.
<
< RELAIS :
<
         WORD        BUCR1
ABUCR::  VAL         $-D-VARCR       < RELAI D'ACCES A UN BUFFER DE TRANSIT
                                     < UTILISE LORS DES LECTURES 'ASCI'.
         WORD        BUCR1,X
AXBUCR:: VAL         $-D-VARCR       < IDEM, MAIS INDEXE...
         WORD        NILX
AXRCR::  VAL         $-D-VARCR       < RELAI INDEXE D'ACCES AU BUFFER ARGUMENT.
<
< DEMANDE A 'TTYS' DESTINEE A
< L'OPERATEUR EN CAS DE NON-
< OPERATIONNALITE DE 'CR1' :
<
         BYTE        NSPTYS;XDSYM
TYSCR1:: VAL         $-D-VARCR
         WORD        FGW             < ECRITURE...
         DZS         LDEM0+VARCR-$+TYSCR1 < NOTA : CETTE DEMANDE N'EST PAS
                                     < METICULEUSEMENT VALIDEE PAR TTYS...
<
< DEMANDE D'ECHO SUR LE PERIPHERIQUE
< ASSOCIE A 'CR1' LORS DES LECTURES
< 'ASCI' AVEC ECHO :
<
         BYTE        NILK;XDSYM
ECHOCR:: VAL         $-D-VARCR       < DEMANDE D'ECRITURE SUR LE
                                     < PERIPHERIQUE ASSOCIE A 'CR1'
                                     < PAR L''IOID' DE LA 'DCT'...
         WORD        FGW             < DEMANDE D'ECRITURE.
         WORD        NIL             < AMDEM : CONTIENT L'AMDEM
                                     < ARGUMENT D'UNE DEMANDE A 'CR1'
                                     < LORS D'UN ECHO.
         WORD        NILK            < CODEM : CONTIENT LE CODEM
                                     < ARGUMENT D'UNE DEMANDE A 'CR1'
                                     < LORS D'UN ECHO.
         DZS         LDEM0+VARCR-$+ECHOCR
<
< 'CCB' DE 'CR1' :
<
         WORD        K
CCBCR5:: VAL         $-D-VARCR       < POUR INITIALISER 'CCBCR0'...
         WORD        K
CCBCS2:: VAL         $-D-VARCR       < POUR INITIALISER 'CCBCR0'...
CCBCR::  VAL         $-VARCR         < 'CCBCR' :
         WORD        K
CCBCR0:: VAL         $-D-VARCR       < MOT0.
         BYTE        CCBLDC?XSNCR1;K
CCBCR1:: VAL         $-D-VARCR       < MOT1 : SOUS-NIVEAU D'INTERRUPTION.
         WORD        NIL
CCBCR2:: VAL         $-D-VARCR       < MOT2 : ADRESSE-MOT DU BUFFER.
         WORD        NILK
CCBCR3:: VAL         $-D-VARCR       < MOT3 : LONGUEUR-OCTET, PUIS COMPTE RENDU.
         WORD        ACCR1?FPHIN
CCBCR4:: VAL         $-D-VARCR       < MOT4 : OPERANDE 'SIO' SORTIE INFORMATION.
<
<
<        P I L E  :
<
<
         CALL        #SISP CMS5 DOL2#
PILCR1:  EQU         $-DEPILE        < EMPLACEMENT VARIABLE DANS LA DCT.
XWPILE:  VAL         LPILEH+XXCR1
         CALL        #SISP CMS5 GENPIL2#
         PAGE
<
<
<        D C T   C R 2 :
<
<
         CALL        #SISP CMS5 DOL1#
DCTCR2:  EQU         $
PSTCR2:  WORD        K;K;K;K;COM+DEPCS;DCTCR2;NIL;PILCR2;HANDLR;SMST;SO;SE
       #@ASCI        " CR2"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR
         WORD        FILTRS          < S-FILTRE.
         WORD        XTALOC          < ETALOC.
         WORD        XXLOC0          < SEMLOC
         DZS         LSEM
         WORD        NIL             < TETE DE LA FILE D'ATTENTE SUR CR2,
         WORD        NIL             < QUEUE DE LA FILE D'ATTENTE SUR CR2.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT.
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLCR           < HANDLER SPECIFIQUE DES 'CRX'.
         WORD        ITCR            < ROUTINE SPECIFIQUE D'INTERRUPTION 'CRX'.
         WORD        K;K             < ETAT.
         WORD        COSBT?B0SIT=FMASK(K?XCRMY=FCINST
         WORD        XXNTRY;TRYVID   < NTRIES ET FRETRY.
         WORD        K               < HSTATS.
         WORD        XXTOCR          < TESTO#0 : TIME-OUT A TESTER.
         WORD        XXCR2           < LISTE DES FONCTIONS RECONNUES.
         WORD        XXCR3           < DCTFUP ("ALTITUDES" DES FONCTIONS).
<
<
<        Z O N E   V A R I A B L E  :
<
<
VARCR2:  EQU         $
         IF          VARCR2-DCTCR2-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
         WORD        ACCR2?FPHCMD    < OPERANDE 'SIO' DE SORTIE COMMANDE.
         WORD        ACCR2?FPHETA    < OPERANDE 'SIO' D'ENTREE DE MOT D'ETAT.
<
< RELAIS :
<
         WORD        BUCR2           < RELAI D'ACCES BUFFER CR2 (ASCI).
         WORD        BUCR2,X         < RELAI INDEXE D'ACCES A 'BUCR2'.
         WORD        NILX            < RELAI INDEXE CALCULE.
<
< DEMANDE A 'TTYS' EN CAS DE NON-
< OPERATIONNALITE DE 'CR2' :
<
         BYTE        NSPTYS;XDSYM
TYSCR2:: VAL         $-D-VARCR2
         WORD        FGW             < ECRITURE...
         DZS         LDEM0+VARCR2-$+TYSCR2
<
< DEMANDE D'ECHO SUR LE PERIPHERIQUE
< ASSOCIE A 'CR2' LORS DES LECTURES
< 'ASCI' AVEC ECHO :
<
         BYTE        NILK;XDSYM
ECHOC2:: VAL         $-D-VARCR2      < DEMANDE D'ECRITURE SUR LE
                                     < PERIPHERIQUE ASSOCIE A CR2
                                     < PAR L'IOID DE LA DCT.
         WORD        FGW             < DEMANDE D'ECRITURE.
         WORD        NIL             < AMDEM : CONTIENT L'AMDEM
                                     < ARGUMENT D'UNE DEMANDE A 'CR2'
                                     < LORS D'UN ECHO.
         WORD        NILK            < CODEM : CONTIENT LE CODEM
                                     < ARGUMENT D'UNE DEMANDE A 'CR2'
                                     < LORS D'UN ECHO.
         DZS         LDEM0+VARCR2-$+ECHOC2
<
< 'CCB' DE 'CR2' :
<
         WORD        K               < POUR INITIALISER LE MOT0,
         WORD        K               < ET LE MOT2...
         WORD        K               < MOT0.
         BYTE        CCBLDC?XSNCR2;K < MOT1 : SOUS-NIVEAU D'INTERRUPTION.
         WORD        NIL
         WORD        NILK
         WORD        ACCR2?FPHIN
         WORD        K               < POUR INITIALISER 'CCBCR0'...
<
<
<        P I L E  :
<
<
         CALL        #SISP CMS5 DOL2#
PILCR2:  EQU         $-DEPILE        < EMPLACEMENT VARIABLE DANS LA DCT.
XWPILE:  VAL         LPILEH+XXCR1
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        H A N D L E R   I M P R I M A N T E  :
<
<
<        FONCTION :
<                      TRES SIMPLEMENT, REALISER
<                    LA SORTIE DEMANDEE, EN SIMU-
<                    LANT EVENTUELLEMENT LE CODE
<                    '6D DES VISUS.
<
<
<        ARGUMENTS :
<                    (L)=ADRESSE DE LA 'DCT' CORRESPONDANTE,
<                    (W)=ADRESSE DE LA DEMANDE COURANTE (DE TETE),
<                    (A)='NSPTYP' DE LA DEMANDE COURANTE.
<
<
         USE         L,DCT0
         USE         W,DEM0
HDLLP:   EQU         $
         CALL        #SISP CMS5 PSRSLO#
<
< INITIALISATION DU RELAI D'ACCES AU
< PREMIER CARACTERE DU MESSAGE A EDITER :
<
<
<        NOTA :
<
<                      LE 'MOT2' DU 'CCB' CONTIENT
<                    UNE ADRESSE-MOT ; SI MALHEUREU-
<                    SEMENT LE MESSAGE ARGUMENT A EDI-
<                    TER N'EST PAS A UNE FRONTIERE DE
<                    MOTS, IL CONVIENT DE LE TRANSFERER
<                    DANS UN BUFFER LOCAL 'BUFLP'...
<
         LA          ARGDEM+AMDEM    < ACCES A L'ADRESSE D'OCTETS DU
                                     < BUFFER D'EMISSION.
         BSR         AMEM            < RENVOIE :
                                     < (A)= RELAI D'INDIRECTION INDEXE
                                     <     VERS LE BUFFER,
                                     < (X)=0 : SI LE PREMIER OCTET EST A GAUCHE,
                                     <    =1 : SI LE PREMIER OCTET EST A DROITE.
         STA         VAR+C1MICA      < GENERATION DU RELAI D'ACCES AU
                                     < 1ER CARACTERE.
         CPZR        X               < EST-ON A UNE FRONTIERE DE MOT OU
                                     < D'OCTET ???
         JE          HDLLP3          < OK, DE MOT...
<
< D'OCTET, IL FAUT TRANSFERER
< DANS LE BUFFER LOCAL :
<
         LY          VAR+NMAXLP
         NGR         Y,Y             < POUR LE DECOMPTAGE DES OCTETS...
HDLLP4:  EQU         $
<*******************************************************************************
         BSR         ASIMUL          < SIMULATION DE L'INSTRUCTION SUIVANTE :
         LBY         &VAR+C1MICA
<*******************************************************************************
         ADRI        -I,X
         STBY        &VAR+AXBULP     < TRANSFERT DU CARACTERE COURANT,
         ADRI        I+I,X           < ET PASSAGE
         ADRI        I,Y             <            AU SUIVANT...
         CPZR        Y               < S'IL EXISTE...
         JL          HDLLP4          < OUI...
         LXI         XXLP0           < POUR LA SUITE...
         LA          VAR+AXBULP
         STA         VAR+C1MICA      < GENERATION DU RELAI D'ACCES AU BUFFER...
         CALL        #SISP CMS5 PAGE0#
HDLLP3:  EQU         $
<
< VALIDATION DE LA DEMANDE ARGUMENT :
<
         LA          ARGDEM+OPDEM    < (A)=FONCTION DEMANDEE :
         CPI         FGW             < EST-CE BIEN UNE ECRITURE ???
         JNE         ERLP11          < NON, ERREUR...
         LA          ARGDEM+CODEM    < (A)=LONGUEUR-OCTETS DU MESSAGE,
         CP          VAR+NMAXLP      < VALIDATION SUPERIEURE :
         JG          ERLP13          < ERREUR, TROP GRAND...
         CP          VAR+NMINLP      < VALIDATION INFERIEURE :
         JL          ERLP13          < ERREUR, TROP PETIT...
<
< FAUT-IL SIMULER LE CODE '6D ???
<
<*******************************************************************************
         BSR         ASIMUL          < SIMULATION DE L'INSTRUCTION SUIVANTE :
         LBY         &VAR+C1MICA
<*******************************************************************************
         CPI         K6D             < Y-A-T'IL UN CODE '6D EN TETE ???
         JNE         HDLLP1          < NON...
<
< SIMULATION DU CODE '6D :
<
         LA          ARGDEM+CODEM
         LB          VAR+C1MICA
         PSR         A,B             < SAUVEGARDE LONGUEUR MESSAGE ET
                                     < RELAI D'ACCES AU PREMIER CARACTERE DU
                                     < MESSAGE...
         CALL        #SISP CMS5 PSRSLO#
         CALL        #SISP CMS5 PAGE0#
         LAI         LXRCLF          < (A)=LONGUEUR DU MESSAGE 'RC-LF'.
         STA         ARGDEM+CODEM    < ET MISE DANS LA DEMANDE...
         LA          VAR+AXRCLF
         STA         VAR+C1MICA      < GENERATION DU RELAI A 'R/C'-'LF',
         BSR         VAR+AEDLLP      < ET EDITION DU MESSAGE 'R/C'-'LF'...
         CALL        #SISP CMS5 PLRSLO#
         PLR         A,B
         STA         ARGDEM+CODEM    < RESTAURATION DU 'CODEM',
         STB         VAR+C1MICA      < ET DU RELAI D'ACES AU MESSAGE.
<
< TEST SUR LA LONGUEUR
< DE L'ECHANGE :
<
         CPI         NOCMO-Z         < N'Y-A-T'IL QU'UN CARACTERE A IMPRIMER ???
         JLE         HDLLP2          < OUI, C'EST FINI...
         LAI         KNUL            < NON, ON SUBSTITUE UN 'NULL' AU CODE
                                     < '6D DE DEBUT DE LIGNE...
<*******************************************************************************
         BSR         ASIMUL          < SIMULATION DE L'INSTRUCTION SUIVANTE :
         STBY        &VAR+C1MICA
<*******************************************************************************
         BSR         VAR+AEDLLP      < EDITION DU MESSAGE ARGUMENT...
         LAI         K6D
HDLLP6:  EQU         $
<*******************************************************************************
         BSR         ASIMUL          < SIMULATION DE L'INSTRUCTION SUIVANTE :
         STBY        &VAR+C1MICA     < RESTAURATION DU CODE '6D...
<*******************************************************************************
         JMP         HDLLP2          < VERS LA SORTIE...
<
< CAS OU IL N'Y A PAS
< DE CODE '6D EN TETE :
<
HDLLP1:  EQU         $
         LXI         XXLP1
<*******************************************************************************
         BSR         ASIMUL          < SIMULATION DE L'INSTRUCTION SUIVANTE :
         LBY         &VAR+C1MICA     < (A)=CARACTERE DE TETE :
<*******************************************************************************
         CPI         KAROND          < EST-CE LE "A-ROND" ???
         JNE         HDLLP5          < NON...
<
< OUI, TRAITEMENT DU SAUT DE PAGE :
<
         LAI         KFF             < (A)=CARACTERE 'FORM-FEED',
<*******************************************************************************
         BSR         ASIMUL          < SIMULATION DE L'INSTRUCTION SUIVANTE :
         STBY        &VAR+C1MICA     < QUE L'ON MET EN TETE DU BUFFER...
<*******************************************************************************
         BSR         VAR+AEDLLP      < EDITION DU MESSAGE AVEC SAUT DE PAGE...
         LAI         KAROND
         JMP         HDLLP6          < VERS LA RESTAURATION DU "A-ROND"...
<
< CAS NORMAL :
<
HDLLP5:  EQU         $
         BSR         VAR+AEDLLP      < EDITION DU MESSAGE TEL QUEL...
<
< SORTIE DU HANDLER :
<
HDLLP2:  EQU         $
         STZ         ETAT0
HDLLPS:  EQU         $               < SORTIE...
         CALL        #SISP CMS5 PLRSLO#
         RSR
<
<
<        E R R E U R S   S O F T W A R E  :
<
<
ECRLP1:: VAL         '11             < 'FONCTION CR/LP ERRONEE'.
ECRLP3:: VAL         '05             < 'LONGUEUR ERRONEE'.
ERLP11:  EQU         $               < FONCTION DEMANDEE ERRONNEE LP1,
ERCR11:  EQU         ERLP11          < FONCTION DEMANDEE ERRONNEE CR1.
         LAI         CORBT?NBITMO-B=FMASK(K?ECRLP1=FCINST
         JMP         E42
ERLP13:  EQU         $               < LONGUEUR ERRONNEE LP1,
ERCR13:  EQU         ERLP13          < LONGUEUR ERRONNEE CR1.
         LAI         CORBT?NBITMO-B=FMASK(K?ECRLP3=FCINST
E42:     EQU         $
         SBT         NBITMO-B        < MEMORISATION "ERREUR SOFTWARE",
         STA         ETAT0           < ET TRANSMISSION DU CODE D'ERREUR PAR
                                     < 'ETAT0'...
         JMP         HDLLPS          < VERS LA SORTIE...
         PAGE
<
<
<        E D I T I O N   D ' U N E   L I G N E  :
<
<
<        ARGUMENTS:
<                    (L)=ADRESSE DE LA 'DCT' CORRESPONDANTE,
<                    (W)=ADRESSE DE LA DEMANDE COURANTE, VALIDEE,
<                        MAIS DONT LES ARGUMENTS ONT PU ETRE
<                        MODIFIES...
<
<
EDLLP:   EQU         $
<
< INITIALISATION DE L'IMPRIMANTE :
<
         LAI         MOMINI
         SIO         VAR+CDELP1      < ENVOI DE LA FONCTION DE 'RESET'...
<
< CONSTRUCTION DU 'CCB' :
<
         LA          VAR+C1MICA      < (A)=RELAI-MOT INDEXE D'ACCES AU MESSAGE,
         RBT         BITX            < ON EFFACE L'INDEXATION,
         STA         VAR+CCBLQ2      < (MOT2)=ADRESSE-MOT DU BUFFER.
         LA          ARGDEM+CODEM
         STA         VAR+CCBLP3      < (MOT3)=LONGUEUR-OCTETS DU BUFFER.
EDLLP1:  EQU         $
         LAI         K
         SBT         BCCBBM          < MISE DE L'IMPRIMANTE EN MODE OCTET,
         STA         VAR+CCBLQ0      < ET GENERATION SYSTEMATIQUE DU MOT0...
         LAD         VAR+CCBLP       < (A)=ADRESSE DU 'CCB',
         PSR         X
         SVC         SVCM6           < EXTENSION D'ADRESSE SUR 20 BITS DANS
                                     < LE 'CCB'...
         PLR         X
<
< ECHANGE PROPREMENT DIT :
<
         BSR         ASDIPI          < ENVOI DU 'CCB' A L''IOP'...
         LAI         MOMRW?MOMSTR?MOMINT
         SIO         VAR+CDELP1      < 'SIO' DE LANCEMENT DE L'ECHANGE...
         BSR         ACSWIT          < ET ATTENTE DE L'INTERRUPTION ; N'OUBLIONS
                                     < QU'ON TROUVE AU RETOUR DANS 'ETAT0' LE
                                     < MOT D'ETAT...
         LA          ETAT0           < (A)=SOMME DES DEFAUTS :
         JAGE        EDLLP3          < OK, PAS DE DEFAUT...
<
< CAS OU IL Y A UN DEFAUT :
< ON VA AVERTIR L'OPERATEUR,
< PUIS RETITERER L'OPERATION :
<
         LAD         VAR+TYSLP1
         XR          A,W             < (W)=ADRESSE DE LA DEMANDE A 'TTYS',
                                     < (A)=ADRESSE DE LA DEMANDE COURANTE 'LP1'.
         BSR         ACHAND          < ENVOI DE LA DEMANDE A 'TTYS',
         BSR         ACHANW          < ET ATTENTE DE FIN D'EMISSION SUR 'TTYS'..
         LR          A,W             < ET RESTAURE :
                                     < (W)=ADRESSE DE LA DEMANDE SUR 'LP1'.
         PSR         X
         LXI         XXTLP
         BSR         ADODO           < MISE EN SOMMEIL DU HANDLER
                                     < PENDANT 2 SECONDES...
         PLR         X
EDLLP5:  EQU         $
         JMP         EDLLP1          < ET ON RECOMMENCE...
<
< FIN D'ECHANGE :
<
EDLLP3:  EQU         $
         LA          VAR+CCBLP0
         SBT         BCCBCR
         STA         VAR+CCBLP0      < MISE DU 'CCB' EN MODE COMPTE-RENDU...
         LAD         VAR+CCBLP       < (A)=ADRESSE DU 'CCB',
         BSR         ASDIPI          < ET DEMANDE DE COMPTE-RENDU A L''IOP'...
         LA          VAR+CCBLP3      < (A)=MOT3 DU 'CCB', C'EST-A-DIRE
                                     <     COMPTE-RENDU DU CANAL 'HDC' SUR
                                     <     LES BITS 0-1 POUR L'ETAT, ET 2-15
                                     <     POUR LE COMPTE DE MOTS RESIDUELS :
                                     < SIGNIFICATION DES BITS 0-1 :
                                     < =00 : OK, TOUT S'EST BIEN PASSE,
                                     < =01 : L'ECHANGE S'EST ARRETE SUR UN
                                     <       DEFAUT SECTEUR, OU UN 'INI',
                                     < =10 : UNE PARITE MEMOIRE A ETE RENCON-
                                     <       TREE AU COURS DE L'ECHANGE,
                                     < =11 : UNE MEMOIRE INEXISTANTE A ETE
                                     <       RENCONTREE AU COURS DE L'ECHANGE.
                                     < LES BITS 2-15, QUANT A EUX, DONNENT LE
                                     < COMPTE DE MOTS RESIDUELS EN FIN D'ECHAN-
                                     < GE (NORMALEMENT NUL...).
         JAE         EDLLP4          < OK, PAS D'ERREUR...
         JAG         SYSRBL          < IL Y A UN DEFAUT '01...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      RELANCER L'ECHANGE PAR UN 'JMP HDLLP'...
<
         JMP         EDLLP           < ET ON RELANCE...
SYSRBL:  EQU         $
         TBT         BCCBDC          < (A)>0 : Y-A-T'IL EU UN DEFAUT SECTEUR
                                     <         OU UN 'INI' ???
         JC          EDLLP           < OUI, ON RECOMMENCE LA SORTIE...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE COMMENT LE COMPTE
<                    D'OCTETS RESIDUELS PEUT ETRE
<                    NON NUL !!!
<                      PUIS, ON RELANCERA L'ECHANGE
<                    EN SIMULANT UN 'JMP''HDLLP'...
<
         JMP         EDLLP           < ET ON RELANCE...
EDLLP4:  EQU         $
         RSR                         < THAT'S ALL FOLK...
         PAGE
<
<
<        R O U T I N E   D ' I N T E R R U P T I O N   ' L P '  :
<
<
<        RAPPEL :
<                      L'IMPRIMANTE FONCTION EN MODE
<                    CANAL 'LDC' ; DONC, EN FIN D'E-
<                    CHANGE, ON DOIT RECUPERER UNE
<                    INTERRUPTION D'EXCEPTION, POUR
<                    LA DESARMER, ON LIT LE MOT D'ETAT
<                    DANS 'ETAT0' QUE L'ON TRANSMET
<                    DONC AU HANDLER QUE L'ON REVEIL-
<                    LE ENSUITE...
<
<
<        ARGUMENT :
<                    (B)=0 : INTERRUPTION NORMALE,
<                       =1 : INTERRUPTION EXCEPTION.
<                    (L)=ADRESSE DE LA 'DCT' EN CAUSE.
<
<
ITLP:    EQU         $
         CPZR        B               < QUELLE EST LA NATURE DE L'INTERRUPTION ??
         JNE         SYSRBM          < D'EXCEPTION, OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE COMMENT UNE
<                    INTERRUPTION NORMALE A PU
<                    MONTER !!!
<
SYSRBM:  EQU         $
         SIO         VAR+ETALP1      < (A)=MOT D'ETAT,
         STA         ETAT0           < ET STOCKAGE DANS 'ETAT0'...
         BSR         ATEC            < Y A-T-IL UN ECHANGE EN COURS ???
         JE          ITLP1           < NON, PAS DE REVEIL...
         BSR         ARVHDL          < OUI, REVEIL DU HANDLER...
ITLP1:   EQU         $
         RSR
         PAGE
<
<
<        H A N D L E R   L E C T E U R   D E   C A R T E S  :
<
<
<        FONCTION :
<                      LE HANDLER LECTEUR DE CARTES
<                    A A SA CHARGE DE GERER LES
<                    LECTEURS DE CARTES, ET D'ASSURER
<                    LES LECTURES BINAIRE ET 'ASCI'...
<
<
<        ARGUMENTS :
<                    (L)=ADRESSE DE LA 'DCT' EN CAUSE,
<                    (W)=ADRESSE DE LA DEMANDE A TRAITER (CELLE DE TETE),
<                    (A)='NSPTYP' DE LA DEMANDE COURANTE.
<                    (OPDEM)=0 : LECTURE ASCI,
<                           =1 : LECTURE ASCI AVEC ECHO SUR LE
<                                PERIPHERIQUE ASSOCIE,
<                           =8 : LECTURE BINAIRE.
<
<
         USE         L,DCT0
         USE         W,DEM0
HDLCR:   EQU         $
         CALL        #SISP CMS5 PSRSLO#
HDLCRI:  EQU         $
<
< VALIDATION DE LA DEMANDE :
<
         LA          NSPTYP          < (A)='NSPTYP' (RESTAURATION...),
         LB          ARGDEM+CODEM    < (B)=LONGUEUR-OCTETS DU BUFFER,
         LY          ARGDEM+OPDEM    < (Y)=FONCTION DEMANDEE :
         ADRI        -FGCRAE,Y       < (Y)=FONCTION-1...
         LA          ARGDEM+OPDEM    < (A)=FONCTION DEMANDEE :
         JAE         HDLCR1          < OK, LECTURE 'ASCI'...
         IF          FGCRA-K,,XEIF%,
         IF          ATTENTION : LE TEST CI-DESSUS EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
         CPI         FGCRAE          < EST-CE LA LECTURE 'ASCI' AVEC ECHO ???
         JE          HDLCR1          < OUI, OK...
         CPI         FGCRB           < EST-CE LA LECTURE BINAIRE ???
         JNE         ERCR11          < NON, ERREUR...
<
< CAS DE LA LECTURE BINAIRE :
<
         LA          ARGDEM+AMDEM    < (A)=ADRESSE-OCTET DU BUFFER :
         TBT         NBITMO-B        < EST-ON BIEN A UNE FRONTIERE DE MOTS ???
         JC          ERCR13          < NON (ADRESSE IMPAIRE), ERREUR...
         SLRD        NOCMO=K         < LA LONGUEUR EST-ELLE PAIRE ???
                                     < N'OUBLIONS PAS, QUE D'APRES LE TEST
                                     < PRECEDENT :
                                     < BIT15(A)=0...
         JC          ERCR13          < NON, ERREUR...
HDLCR1:  EQU         $
         LR          B,A             < (A)=(B)=LONGUEUR OU LONGUEUR/2 SUIVANT...
         JALE        ERCR13          < ERREUR, LONGUEUR NEGATIVE OU NULLE !!!
         CPI         LCCI            < VALIDATION...
         JG          ERCR13          < ERREUR, BUFFER TROP LONG !!!
<
< ECHANGE PROPREMENT DIT :
<
HDLCR2:  EQU         $
<
< CONSTRUCTION DU 'CCB' :
<
         STZ         VAR+CCBCR5      < POUR LE FUTUR 'CCBCR0'...
         LAI         K
         CPZR        Y               < TEST DE LA FONCTION-1 DANS 'Y' :
                                     < C'EST-A-DIRE :
                                     < -1 : 'ASCI',
                                     < 0  : 'ASCI' AVEC ECHO,
                                     < 7  : LECTURE BINAIRE.
         JG          HDLCR3          < CAS DE LA LECTURE BINAIRE...
<
< CAS DE LA LECTURE 'ASCI'
< (AVEC OU SANS ECHO) :
<
         SBT         BCCBBM          < AFIN DE METTRE LE CANAL EN MODE OCTET,
         STA         VAR+CCBCR5      < POUR LE FUTUR 'CCBCR0'...
         LA          VAR+ABUCR
         STA         VAR+CCBCS2      < ON UTILISE SYSTEMATIQUEMENT 'BUCRX',
                                     < CAR L'ADRESSE (AMDEM) N'EST PAS FORCEMENT
                                     < PAIRE, ET QUE SURTOUT, ON DOIT PARCOU-
                                     < RIR TOUTE LA CARTE LUE AFIN DE RAZER LE
                                     < BIT DE PARITE DE CHAQUE CARACTERE...
         CALL        #SISP CMS5 PAGE0# < ON PASSE SUR LA PAGE 0, PUISQUE LE
                                     < BUFFER UTILISE EST LOCAL A 'CR'...
         LA          ARGDEM+CODEM    < (A)=LONGUEUR-OCTETS DE LA CARTE A LIRE.
         JMP         HDLCR4          < VERS LE LANCEMENT DE L'ECHANGE...
<
< CAS DE LA LECTURE BINAIRE :
<
HDLCR3:  EQU         $
         LA          ARGDEM+AMDEM    < (A)=ADRESSE-OCTETS (PAIRE) ARGUMENT,
         SLRS        NOCMO=K         < (A)=ADRESSE-MOT ARGUMENT,
         STA         VAR+CCBCS2      < QUE L'ON MET EN 'MOT2'...
         LA          ARGDEM+CODEM    < (A)=LONGUEUR-OCTETS (PAIRE),
         SLRS        NOCMO=K         < (A)=LONGUEUR-MOTS DE L'ECHANGE.
<
< LANCEMENT DE L'ECHANGE :
<
HDLCR4:  EQU         $
         STA         VAR+CCBCR3      < MISE EN PLACE DU 'MOT4' QUI CONTIENT
                                     < LA LONGUEUR EN MOTS OU EN OCTETS,
                                     < SUIVANT LA VALEUR DU BIT 'BCCBBM'.
HDLCR5:  EQU         $
         SIO         VAR+ETACR1      < (A)=MOT D'ETAT DU PERIPHERIQUE :
         TBT         ETAFBS          < LE MAGASIN EST-IL VIDE ???
                                     < NOTA : CE BIT N'EST PAS RAZE PAR LA
                                     < LECTURE DU MOT D'ETAT, IL PEUT DONC
                                     < ETRE "VIEUX"...
         JC          HDLCRB          < LE MAGASIN EST VIDE, ALLONS AVERTIR
                                     < L'OPERATEUR...
         LAI         MOMINI
         SIO         VAR+CDECR1      < ENVOI DE LA COMMANDE 'RESET'...
         LAI         MOMTST
         SIO         VAR+CDECR1      < ENVOI DE LA COMMANDE DE MISE SOUS
                                     < TENSION...
         LAD         VAR+CCBCR       < (A)=ADRESSE DU 'CCB',
         PSR         X
         SVC         SVCM6           < EXTENSION D'ADRESSE SUR 20 BITS DANS
                                     < LE 'CCB'...
         PLR         X
         BSR         ASDIPI          < ENVOI DU 'CCB' A L''IOP'...
         LAI         MOMSTR?MOMINT   < LECTURE BINAIRE A PRIORI...
         CPZR        Y               < ALORS, BINAIRE OU 'ASCI' ???
         JG          HDLCR6          < LECTURE BINAIRE...
         SBT         COM8            < LECTURE 'ASCI'...
HDLCR6:  EQU         $
         SIO         VAR+CDECR1      < PUIS, LANCEMENT DE L'ECHANGE...
         BSR         ACSWIT          < ET ATTENTE DE L'INTERRUPTION DE FIN
                                     < D'ECHANGE ; ON TROUVERA AU RETOUR, LE
                                     < MOT D'ETAT DANS 'ETAT0'...
<
< ANALYSE DES CONDITIONS
< D'ECHANGE :
<
         LA          ETAT0           < (A)=MOT D'ETAT DU PERIPHERIQUE :
         JAGE        HDLCR7          < BIT0=0 : PAS DE DEFAUT A PRIORI...
         IBT         ETAOPE          < IL Y A DEFAUT, ON INVERSE DONC LE BIT
                                     < 'ETAOPE' (NON PRET) POUR ETRE COHERENT
                                     < AVEC LES AUTRES BITS DE DEFAUT...
         LRM         B
         WORD        MTADEF?MTAFBS?MTAFBK?MTAOPE
         CPR         A,B             < EST-CE MAGASIN VIDE OU FIN DE BLOC ???
         JE          HDLCR7          < C'EST LE DEFAUT "MAGASIN VIDE" :
                                     < ON L'IGNORE POUR LA CARTE QU'ON
                                     < VIENT DE LIRE. IL SERA DETECTE
                                     < AVANT LA LECTURE SUIVANTE
                                     < S'IL Y EN A...
<
< CAS DES DEFAUTS, AVERTISSONS
< L'OPERATEUR :
<
HDLCRB:  EQU         $
         LAD         VAR+TYSCR1
         XR          A,W             < (W)=ADRESSE DEMANDE SUR 'TYS',
                                     < (A)=ADRESSE DEMANDE SUR 'CRX',
         BSR         ACHAND          < ET ENVOI DU MESSAGE A L'OPERATEUR...
         BSR         ACHANW          < ET ATTENTE DE FIN D'EMISSION SUR 'TYS'...
         LR          A,W             < RESTAURE :
                                     < (W)=ADRESSE DE LA DEMANDE SUR 'CRX'.
         LXI         XXTCR
         BSR         ADODO           < MISE EN SOMMEIL DU HANDLER
                                     < PENDANT 2 SECONDES...
HDLCRH:  EQU         $
         JMP         HDLCR5          < ET APRES LE DODO, ON RETENTE...
<
< COMPTE-RENDU DE L'ECHANGE :
<
HDLCR7:  EQU         $
         LA          VAR+CCBCR0
         SBT         BCCBCR
         STA         VAR+CCBCR0      < MISE DU 'CCB' EN MODE COMPTE-RENDU...
         LAD         VAR+CCBCR       < (A)=ADRESSE DU 'CCB',
         BSR         ASDIPI          < ENVOI DE LA DEMANDE DE COMPTE-RENDU
                                     < A L''IOP'...
         LA          VAR+CCBCR3      < (A)=MOT3 DU 'CCB', C'EST-A-DIRE
                                     <     COMPTE-RENDU DU CANAL 'HDC' SUR
                                     <     LES BITS 0-1 POUR L'ETAT, ET 2-15
                                     <     POUR LE COMPTE DE MOTS RESIDUELS :
                                     < SIGNIFICATION DES BITS 0-1 :
                                     < =00 : OK, TOUT S'EST BIEN PASSE,
                                     < =01 : L'ECHANGE S'EST ARRETE SUR UN
                                     <       DEFAUT SECTEUR, OU UN 'INI',
                                     < =10 : UNE PARITE MEMOIRE A ETE RENCON-
                                     <       TREE AU COURS DE L'ECHANGE,
                                     < =11 : UNE MEMOIRE INEXISTANTE A ETE
                                     <       RENCONTREE AU COURS DE L'ECHANGE.
                                     < LES BITS 2-15, QUANT A EUX, DONNENT LE
                                     < COMPTE DE MOTS RESIDUELS EN FIN D'ECHAN-
                                     < GE (NORMALEMENT NUL...).
         JAE         HDLCR8          < OK, PAS DE DEFAUTS...
         JAG         SYSRBN          < C'EST PEUT-ETRE LE DEFAUT SECTEUR
                                     < OU L''INI'...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      REPERER LES PARITES MEMOIRE
<                    OU LES MEMOIRES INEXISTANTES,
<                    PUIS RELANCER PAR UN 'JMP''HDLCRI'...
<
         JMP         HDLCR2          < ET ON RELANCE...
SYSRBN:  EQU         $
         TBT         BCCBDC          < (A)>0 : EST-CE UN DEFAUT SECTEUR OU
                                     <         UN 'INI' ???
         JC          HDLCR2          < OUI, LE MIEUX EST DE RELANCER L'ECHANGE..
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE COMMENT LE NOMBRE
<                    D'OCTETS RESIDUELS PEUT ETRE NON
<                    NUL, PUIS RELANCER L'ECHANGE PAR
<                    UN 'JMP''HDLCRI'...
<
         JMP         HDLCR2          < ET ON RELANCE...
HDLCR8:  EQU         $
<
<
<        C A D R A G E   D E S   I N F O R M A T I O N S  :
<
<
         CALL        #SISP CMS5 PLRSLO#
         LA          ARGDEM+AMDEM    < (A)=ADRESSE-OCTET DU BUFFER ARGUMENT,
         BSR         AMEM            < RENVOIE :
                                     < (A)=RELAI INDEXE VERS LE BUFFER,
                                     < (X)=0 : FRONTIERE "PAIRE",
                                     <    =1 : FRONTIERE "IMPAIRE".
         STA         VAR+AXRCR       < MISE EN PLACE DU RELAI DE CADRAGE...
         CPZR        Y               < ALORS, LECTURE 'ASCI' OU BINAIRE ???
         JG          HDLCRE          < BINAIRE, ALLONS CADRER LES MOTS
                                     < A GAUCHE...
<
<        ' A S C I '  :  R A Z   D U   B I T   D E   P A R I T E  :
<
         LR          X,Y             < (Y)=INCREMENT DE DEPHASAGE DU AU
                                     <     PROBLEME DES FRONTIERES "PAIRES"
                                     <     ET "IMPAIRES"...
         LB          ARGDEM+CODEM    < (B)=NOMBRE D'OCTETS A TRANSFERER...
         NGR         B,B             < QUE L'ON INVERSE...
         LXI         K               < (X)=INDEX D'ACCES AUX BUFFERS.
HDLCR9:  EQU         $
         LBY         &VAR+AXBUCR     < (A)=CARACTERE 'ASCI' COURANT,
         RBT         BITPAR          < RAZ DE SON BIT DE PARITE.
         JAE         HDLCRD          < LES 'NULLS' SONT REMPLACES PAR 'R/C'...
         CPI         KSOUL           < ET LE '5F PAR 'EOT'...
         JNE         HDLCRC          < CAS DES CODES NORMAUX...
         LAI         KEON-KCR        < POUR GENERER UN 'EOT'.
HDLCRD:  EQU         $
         ADRI        KCR,A           < GENERATION DE 'EOT' OU 'R/C' SUIVANT...
         STX         ARGDEM+CODEM    < AFIN DE RENVOYER LE NOMBRE
         IC          ARGDEM+CODEM    < DE CARACTERES RENTRES...
HDLCRC:  EQU         $
         ADR         Y,X             < (X)=INDEX DE TRANSFERT,
<*******************************************************************************
         BSR         ASIMUL          < SIMULATION DE L'INSTRUCTION SUIVANTE :
         STBY        &VAR+AXRCR      < TRANSFERT DU CARACTERE 'ASCI' COURANT...
<*******************************************************************************
         SBR         Y,X             < RESTAURATION DE L'INDEX DE RECUPERATION.
         ADRI        I,X             < PASSAGE AU
         ADRI        I,B             <            CARACTERE SUIVANT...
         CPZR        B               < S'IL EXISTE ???
         JL          HDLCR9          < ET OUI...
         LX          ARGDEM+CODEM    < (X)=NOMBRE DE CARACTERES LUS,
         BSR         ASTBOX          < ET ENVOI EVENTUEL DANS LA 'BOX'...
<
<        E C H O   E V E N T U E L  :
<
         CPZ         ARGDEM+OPDEM    < L'ECHO EST-IL DEMANDE ???
         IF          FGCRAE-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST PRECEDENT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         JE          HDLCRA          < NON...
<
< CAS OU L'ECHO EST DEMANDE
< SUR LE PERIPHERIQUE ASSOCIE :
<
         LBY         IOID            < (A)='NSP' DU PERIPHERIQUE ASSOCIE,
         JAE         HDLCRA          < N'EXISTE PAS, PAS D'ECHO...
         IF          XIOID0-K,,XEIF%,
         IF          ATTENTION : LE TEST PRECEDENT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         LR          A,X             < (X)=NSP DU PERIPHERIQUE 'OUT'...
         LBI         XXNLOC          < POUR NE PAS ATTENDRE,
         BSR         ALODCT          < LOCATION DE LA DCT(NSP=(X)) SANS ATTENTE
                                     < AU CAS OU ELLE SERAIT DEJA LOUEE...
         CPZR        B               < ALORS ???
         IF          XXNLOC-K,,XEIF%,
         IF          ATTENTION : SI UNE DCT N'EST PAS LOUABLE,
         IF          ON A AU RETOUR (B)=XXNLOC, ET LE TEST EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
         JNE         HDLCRG          < ET BIEN LE PERIPHERIQUE 'OUT' EST
                                     < DEJA LOUE, ON SE DISPENSE DONC DE
                                     < L'UTILISER...
         STBY        VAR+ECHOCR+XXNSP
                                     < MISE EN PLACE DU 'NSP' (A) DU PERI-
                                     < PHERIQUE D'ECHO.
         LA          ARGDEM+AMDEM
         STA         VAR+ECHOCR+T+AMDEM
                                     < TRANSMISSION DE L'ADRESSE-OCTETS.
         LA          ARGDEM+CODEM
         STA         VAR+ECHOCR+T+CODEM
                                     < TRANSMISSION DE LA LONGUEUR-OCTETS.
<
< DEMANDE D'ECHO :
<
         LAD         VAR+ECHOCR
         XR          A,W             < (W)=ADRESSE DE LA DEMANDE D'ECHO,
                                     < (A)=ADRESSE DE LA DEMANDE A 'CRX'.
         BSR         ACHAND          < ENVOI DE LA DEMANDE D'ECHO,
         BSR         ACHANW          < ET ATTENTE DE FIN D'ECHO...
         LR          A,W             < RESTAURE :
                                     < (W)=ADRESSE DE LA DEMANDE COURANTE
                                     <     DESTINEE A 'CRX'.
         BSR         ADLDCT          < DELOCATION DE DCT(NSP=(X))...
HDLCRG:  EQU         $
<
<        F I N   N O R M A L E   D E   L A   L E C T U R E  :
<
HDLCRA:  EQU         $
         STZ         ETAT0           < RETOUR OK...
         RSR
HDLCRE:  EQU         $
<
<        L E C T U R E   B I N A I R E  :  R E C A D R A G E  :
<
         DC          VAR+AXRCR       < DECREMENTATION DU RELAI POUR
                                     < UTILISER LE 'JDX'...
         LXI         LCCI            < (X)=INDEX D'ACCES.
HDLCRF:  EQU         $
<*******************************************************************************
         BSR         ASIMUL          < SIMULATION DE L'INSTRUCTION SUIVANTE :
         LA          &VAR+AXRCR      < (A)=MOT COURANT,
<*******************************************************************************
XXCRNL:: VAL         12              < NOMBRE DE LIGNES SUR UNE CARTE...
         SLLS        NBITMO-XXCRNL   < CADRAGE (12=12 LIGNES/COLONNE), PAR
                                     < DECALAGE A GAUCHE DE CHAQUE COLONNE...
<*******************************************************************************
         BSR         ASIMUL          < SIMULATION DE L'INSTRUCTION SUIVANTE :
         STA         &VAR+AXRCR      < ET RENVOI DU MOT DECALE...
<*******************************************************************************
         JDX         HDLCRF          < PASSAGE AU MOT SUIVANT...
         JMP         HDLCRA          < PUIS VERS LA SORTIE...
         PAGE
<
<
<        R O U T I N E   D ' I N T E R R U P T I O N   ' C R '  :
<
<
<        RAPPEL :
<                      CETTE ROUTINE RECUPERE LES
<                    INTERRUPTIONS 'CRX' ; ETANT DONNE
<                    QUE LES ECHANGES SE FONT EN
<                    CANAL 'LDC', ON NE PEUT THEO-
<                    RIQUEMENT QUE RECUPERER DES
<                    INTERRUPTIONS D'EXCEPTION (EN
<                    FIN D'ECHANGE) ; 'ITCR' LIT LE
<                    MOT D'ETAT AFIN DE LA DESARMER,
<                    LE TRANSMET A 'HDLCR', QU'IL
<                    REVEILLE AU PASSAGE...
<
<
<        ARGUMENT :
<                    (B)=1 : INTERRUPTION EXCEPTION (CE QUI EST NORMAL...),
<                       =0 : INTERRUPTION NORMALE (CE QUI EST EXCEPTIONNEL...).
<
<
ITCR:    EQU         $
         CPZR        B               < QUELLE EST LA NATURE DE L'INTERRUPTION ??
         JNE         SYSRBO          < EXCEPTION, OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE COMMENT UN
<                    INTERRUPTION NORMALE A
<                    PU ARRIVER !!!
<
SYSRBO:  EQU         $
         SIO         VAR+ETACR1      < (A)=MOT D'ETAT DU PERIPHERIQUE,
         STA         ETAT0           < QUE L'ON TRANSMET PAR 'ETAT0'...
         BSR         ATEC            < Y A-T-IL UN ECHANGE EN COURS ???
         JE          ITCR1           < NON, DONC PAS DE REVEIL...
         BSR         ARVHDL          < OUI, REVEIL DU HANDLER...
ITCR1:   EQU         $
         RSR
         PAGE
<
<
<        E N V O I   D E S   ' I P I '   C A N A U X  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME COMPLEXE
<                    EST CHARGE DE TRANSMETTRE DES
<                    'CCB' A L''IOP', PUIS D'ATTEN-
<                    DRE QUE CEUX-CI FUSSENT PRIS
<                    EN COMPTE.
<                      LORSQUE LE PROCESSEUR 'IOP'
<                    N'EST PAS LE PROCESSEUR MAITRE,
<                    L'INSTRUCTION 'IPI' EST UTILI-
<                    SEE POUR CE FAIRE, DANS L'AUTRE
<                    CAS, POUR DES PROBLEMES D'ININ-
<                    TERRUPTIBILITE, ON NE PEUT
<                    L'UTILISER, ON FAIT DONC UN
<                    SAUT DIRECT DANS LES MICRO-
<                    PROGRAMMES A L'AIDE DE 'ROMB'...
<
<
<        ARGUMENT:
<                    (A)=ADRESSE DU 'CCB'.
<
IPI:     EQU         $
<
< INITIALISATIONS :
<
         PSR         X,Y,W
         LRM         W               < (W)=ADRESSE DE BOXIPI
         WORD        BOXIPI
         PSR         A               < SAUVEGARDE DE L'ADRESSE DU 'CCB'...
<
< EST-CE UN AUTO-ENVOI ???
<
ZIPIB:   EQU         $
         LXI         PROIOP
         LA          &SYSPRO         < (A)=NUMERO DE L'IOP...
         LYI         NIL-ZERO        < (Y)=K : A PRIORI LE MAITRE N'EST PAS L'IO
         IF          NIL-ZERO-ALIPI,XEIF%,,XEIF%
         IF          ATTENTION : LES TESTS SUR (Y) SONT IDIOTS !!!
XEIF%:   VAL         ENDIF
         LXI         PROMST
         CP          &SYSPRO         < QU'EN EST-IL REELLEMENT ???
         JNE         ZIPI6           < (Y)=K : MAITRE #IOP.
         LYI         ALIPI           < (Y)=ALIPI#0 : LE MAITRE EST AUSSI L'IOP,
                                     < Y CONTIENT ALORS L'ADRESSE DU MICRO-
                                     < PROGRAMME DE TRAITEMENT DES 'IPI'...
ZIPI6:   EQU         $
         JAGE        ZIPI2           < OK, IL EXISTE...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
         JMP         ZIPIB           < ET ON RECOMMENCE APRES CORRECTION.
<
< VERROUILLAGE DE LA
< BOITE A LETTRES :
<
ZIPI2:   EQU         $
         ADR         A,W             < (W)=ADRESSE BOITE AUX LETTRE IOP.
         LAI         VLOCK           < (A)=VALEUR DE VERROUILLAGE D'UN VERROU...
ZIPI3:   EQU         $
         BSR         ASMMK           < MASQUAGE GENERAL DES INTERRUPTIONS.
         XM          XVEROU,W        < ON TENTE DE VERROUILLER L'ACCES
                                     < A LA BOITE A LETTRES D'ADRESSE (W).
         JAE         ZIPI5           < OK, ON L'A EUE...
         BSR         ASMDK           < ET BIEN NON, IL FAUT DEMASQUER LES
                                     < INTERRUPTIONS AFIN DE PERMETTRE A
                                     < DES INTERRUPTIONS INTER-PROCESSEURS
                                     < DE PASSER (EN PROVENANCE DE L'ESCLAVE).
         JMP         ZIPI3           < ET ON RE-TENTE LE VERROUILLAGE...
<
< MISE EN PLACE DU 'CCB' :
<
ZIPI5:   EQU         $               < YOUPI, ON A LA BOITE A LETTRES...
         PLR         A               < RESTAURE : (A)=ADRESSE DU 'CCB'...
         STA         O,W             < CHARGEMENT DE BOXIPI
<
< ENVOI DE L'IPI, OU ITERATION SUR ENVOI :
<
         CPZR        Y               < LE MAITRE EST-IL L'IOP ???
         JNE         ZIPI7           < OUI, PAS D'IPI...
         IPI                         < NON, ON ENVOIE DONC UN IPI, ON PEUT
                                     < LE FAIRE BIEN QUE LES INTERRUPTIONS
                                     < DE CE PROCESSEUR SOIENT MASQUEES...
         JMP         ZIPI8
ZIPI7:   EQU         $               < LE MAITRE EST L'IOP...
         ROMB                        < ON FAIT UN BRANCHEMENT FORCE AU
                                     < TRAITEMENT DES INTERRUPTIONS 'IPI',
                                     < PLUTOT QU'UN 'IPI', CAR EN EFFET, LES
                                     < INTERRUPTIONS ETANT MASQUEES, CET 'IPI'
                                     < SERAIT DIFFERE, ET LE TEST DE REMISE
                                     < A 0 DE LA BOITE A LETTRES, PRECEDANT LE
                                     < DEVERROUILLAGE (CES 2 ACTIONS ETANT
                                     < MASQUEES), SERAIT UN TEST BLOQUANT.
                                     < EN FAISANT UN FORCAGE PAR 'ROMB', ON
                                     < PASSE PAR DESSUS LE SYSTEME D'INTERRUP-
                                     < TION ET SON MASQUAGE (ASTUCE...).
ZIPI8:   EQU         $
TEMIPI:: VAL         1000            < TEMPORISATION ARBITRAIRE DE DETECTION
                                     < DES TIME-OUT SUR 'IPI'...
         LRM         X
         WORD        TEMIPI          < (X)=NOMBRE DE TEST SUR LA BOITE A LETTRES
                                     < AVANT DE DECRETER UNE 'SYSER'...
ZIPI4:   EQU         $
         CPZ         O,W             < L'IPI A-T'IL ETE PRIS EN COMPTE ???
         JE          ZIPI9           < OUI, LA BOITE A LETTRES A ETE REMISE A 0.
         BSR         ATDEFS          < NON, ALORS ON TESTE LE DEFAUT SECTEUR
                                     < EVENTUELLEMENT EN ATTENTE ; ON EST
                                     < OBLIGE DE LE FAIRE, CAR L'IOP DESIRE
                                     < PEUT ETRE EN DEFAUT DE LONGUE DUREE...
         JDX         ZIPI4           < ON TEMPORISE...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      REGARDER POURQUOI L'IOP DESIRE
<                    NE REPOND PAS ; RAPPELONS A CE PROPOS
<                    QUE METTRE UN LECTEUR DE CARTES HORS
<                    TENSION A POUR CONSEQUENCE DE BLOQUER
<                    UN IOP...
<
BLOCK3:  EQU         $               < ADRESSE DE BLOCAGE LORS DE LA RELANCE
                                     < SUITE A UN DEFAUT SECTEUR NON PRIS EN
                                     < COMPTE...
         STZ         XVEROU,W        < ON LIBERE LE VERROU...
         BSR         ASMDK           < ON DEMASQUE,
         PLR         X,Y,W           < ON RESTAURE,
         JMP         IPI             < ET ON RETENTE, AU CAS OU PAR EXEMPLE
                                     < LE PROCESSEUR 'IOP' AURAIT ETE CHANGE
                                     < MANUELLEMENT AU PUPITRE...
<
< DEVERROUILLAGE, ET SORTIE :
<
ZIPI9:   EQU         $
         STZ         XVEROU,W        < ENFIN, ON PEUT DEVEROUILLER...
         BSR         ASMDK           < DEMASQUAGE DES INTERRUPTIONS.
         PLR         X,Y,W
         RSR
         PAGE
<
<
<        A L L O C A T I O N   D E   L ' E S P A C E   D I S Q U E
<        S U R   L E   D I S Q U E   A M O V I B L E
<
<
<        PHILOSOPHIE :
<                      L'ESPACE DISQUE 'DKM' EST ALLOUE
<                    PAR Q-SECTEURS ; LA TABLE D'ALLOCA-
<                    TION CORRESPONDANTE ('TOGB') ETANT
<                    TROP VOLUMINEUSE EST CHARGE EN O-
<                    VERLAY ; L'ESPACE ALLOUABLE EST
<                    DIT DECOUPE EN 'GB', UN 'GB' (OU
<                    'GRAND BLOC') CORRESPONDANT A LA
<                    PARTIE RESIDENTE DE 'TOGB'. CHAQUE
<                    'GB' EST DECOUPE EN 'YY7' SOUS-
<                    BLOCS (OU 'SB'), DONT LA SOUS-
<                    TABLE D'ALLOCATION FAIT UN MOT.
<                      ON PEUT DONC DIRE :
<                                    ESPACE 'DKM'='NSTO'*'GB',
<                                    'GB'        ='YY7'*'SB',
<                                    'SB'        ='NBITMO'*'Q-SECTEURS'.
<
<
<        NOTA :
<                      L'UNITE D'ALLOCATION EST LE
<                    Q-SECTEUR, ET NON PAS LE SECTEUR
<                    AFIN DE POUVOIR ADRESSER L'ENSEM-
<                    BLE DU DISQUE SUR 16 BITS !!!
<
<
<        NOTATIONS :
<                      A UN INSTANT DONNE, ON N'AURA
<                    DONC PRESENT EN MEMOIRE QU'UN
<                    SEUL 'GB', DIT 'GRAND BLOC COU-
<                    RANT' (OU 'GBC'), DONT LE NUMERO+1
<                    (A CAUSE DES 'JDX') EST 'NUGBC'...
<
<
<        NOTA :
<                      TOUS LES 'GB' SONT LIBRES SUR LE DISQUE AMOVIBLE
<                    A L'INITIALISATION DU SYSTEME. L'ESPACE DISQUE
<                    PRIVE DE CMS5 EST EN EFFET IMPLANTE SUR LE DISQUE
<                    FIXE (TOGB, TP, ARBRE DU SYSTEME, PROCESSEUR DE
<                    BASE ET SWAPPING). LE SECTEUR 'INFINI' EST IN-
<                    PAR L'ALLOCATEUR, CAR IL Y AURAIT CONFUSION
<                    AVEC L'INDICATEUR DE FIN DE CHAINE...
<
<
<        ATTENTION :
<                      PAR LA SUITE, ON POURRA PARLER DE
<                    SECTEURS, MAIS IL FAUDRA ENTENDRE
<                    GROUPE DE 'QUANTA' SECTEURS ; IL FAUDRAIT
<                    AVOIR LE COURAGE DE MODIFIER TOUS
<                    LES COMMENTAIRES...
<
<
         CALL        #SISP CMS5 CHECK#
<
<
<        B U F F E R   D E S   Q - S E C T E U R S
<        D E S T I N E   A   ' H D L R E L '   P O U R
<        S A V O I R   S ' I L S   S O N T   M A U V A I S ...
<
<
LBUFHS:: VAL         QUANTA-E*YY7+D  < AVEC CETTE LONGUEUR ON EST SUR DE
                                     < CALCULER LE CHECKSUM DE CHAQUE SECTEUR
                                     < COMPOSANT UN Q-SECTEUR ; CETTE LONGUEUR
                                     < EST MINIMALE...
BUFHS:   DZS         LBUFHS          < BUFFER DESTINE A 'HDLREL' POUR SAVOIR
                                     < SI LES SECTEURS RELEASES SONT BONS
                                     < OU MAUVAIS...
<
<
<        O P T I M I S E U R   D U   P A R C O U R S   D E   ' T O G B '  :
<
<
         CALL        #SISP CMS5 DOL1#
SB1:     WORD        YY7             < CE MOT CONTIENT EN PERMANENCE
                                     < LE NUMERO DU 1ER 'SB' A TESTER
                                     < DANS UN 'GB'. IL PERMET DONC
                                     < DE MINIMISER LE TEMPS DE PARCOURS
                                     < D'UNE 'TOGB'.
         CALL        #SISP CMS5 DOL2#
         PAGE
<
<
<        D C T   A L L O C A T E U R   D I S Q U E  :
<
<
         CALL        #SISP CMS5 DOL1#
DCTGET:  EQU         $
PSTGET:  WORD        K;K;K;K;COM+DEPCS;DCTGET;NIL;PILGET;HANDLR;SMST;SO;SE
       #@ASCI        " GET"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR
         WORD        FILTRS          < S-FILTRE.
         WORD        XTALOC          < ETALOC.
         WORD        XXLOC0          < SEMLOC.
         DZS         LSEM
         WORD        NIL             < TETE DE LA FILE D'ATTENTE DES
                                     < DEMANDES D'ALLOCATION DISQUE.
         WORD        NIL             < ET QUEUE...
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT (INUTILISE).
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLGET          < HANDLER D'ALLOCATION DE L'ESPACE 'DKM'.
         WORD        NIL             < PAS DE 'RIT' EVIDEMMENT...
         WORD        K;K             < ETAT.
         WORD        XBITS0          < BITSEM.
         WORD        XXNTRY;TRYVID   < NTRIES ET FRTRY.
         WORD        K               < HSTATS.
         WORD        XTESTO          < TESTO.
         WORD        XXDCTF          < 'DCT' NON CONNECTABLE...
         WORD        NOSOSE          < DCTFUP ("ALTITUDES" DES FONCTIONS).
                                     < NOTA : IL FAUT RESTER DANS LA PAGE 0 !!!
<
<
<        Z O N E   V A R I A B L E  :
<
<
VARGET:  EQU         $
         IF          VARGET-DCTGET-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
< OPTIMISATION DES PARCOURS :
<
         WORD        SB1
GETSB1:: VAL         $-D-VARGET      < ACCES AU MOT 'SB1'.
<
< DEMANDE DE TRANSFERT
< DE 'TOGB' SUR 'DKA' :
<
         BYTE        NSPDKA;XDSYM    < NSPTYP.
EGBGR::  VAL         $-D-VARGET
XWOR%1:  VAL         VAR-DCT0
XEGBGR:  EQU         ZERO+XWOR%1+EGBGR
         WORD        FGR             < OPDEM=0 : LECTURE,
                                     <      =2 : ECRITURE.
         WORD        TOGB+IJIJDX-ZERO*NOCMO < AMDEM.
         WORD        YY8             < CODEM.
         WORD        NILS            < ASDEM.
         DZS         LDEM0+VARGET-$+EGBGR
<
< VALIDATION DES SECTEURS ALLOUES :
<
         BYTE        NSPDKM;XDSYM?XTYPAD
DEMHSG:: VAL         $-D-VARGET      < DEMANDE DE LECTURE D'UN SECTEUR :
         WORD        FGR             < LECTURE,
         WORD        BUFHS-ZERO
         WORD        LBUFHS*NOCMO
         WORD        NILS
GECTHS:: VAL         $-D-VARGET      < ADRESSE DU SECTEUR A LIRE.
         DZS         LDEM0+VARGET-$+DEMHSG
         WORD        KQSHS
NQSHSG:: VAL         $-D-VARGET      < RELAI VERS LE COMPTEUR DE SECTEURS "HS".
<
< ACCES A LA 'LRU' DES 'GB' QUI
< TEND A FAVORISER L'ALLOCATION
< DES Q-SECTEURS DANS LES ZONES
< LES PLUS UTILISEES LE PLUS
< RECEMMENT :
<
         WORD        TLRUGB,X
ALRUAL:: VAL         $-D-VARGET      < RELAI D'ACCES A LA 'LRU' DES 'GB'...
<
< DONNEES D'OPTIMISATION DE L'ALLOCATION :
<
SEULIN:: VAL         K               < SEUIL DES MOTS DE &ANSLGB INITIAL.
         WORD        SEULIN
SEULSB:: VAL         $-D-VARGET      < CE MOT DONNE LE SEUIL COURANT AUQUEL
                                     < ON COMPARE LES NOMBRE DE Q-SECTEURS
                                     < LIBRES PAR GRAND BLOC...
                                     < CE SEUIL VAUT 'NSL' DIVISE PAR LE DOUBLE
                                     < DE GRAND-BLOC ; C'EST DONC LA MOITIE DU
                                     < NOMBRE DE Q-SECTEURS LIBRES MOYEN PAR
                                     < GRAND BLOC...
XWOR%1:  VAL         XXXMOY=K
XWOR%2:  VAL         -XWOR%1
         IF          SDKM>XWOR%2>XWOR%1-SDKM,,XEIF%,
         IF          ATTENTION : 'SDKM' N'EST PAS DIVISIBLE EXACTEMENT
         IF          PAR 'XXXMOY' ET EN PLUS EST UN NOMBRE NEGATIF !!!
XEIF%:   VAL         ENDIF
XWOR%3:  VAL         NBSPGB/XXXMOY
         WORD        SDKM>XWOR%2/XWOR%3*XXXMOY
SEULDV:: VAL         $-D-VARGET      < POUR CALCULER 'SEULSB' ; C'EST EN FAIT
                                     < LE NOMBRE DE 'GB' ALLOUABLES...
SEULGB:: VAL         128             < VALEUR PLANCHER DE 'SEULSB' EN DESSOUS
                                     < DE LAQUELLE IL EST MIS A 'SEULIN'.
         WORD        SEULGB
SEULCP:: VAL         $-D-VARGET      < LE SEUIL 'SEULSB' SERA UN MULTIPLE DE
                                     < DE 'SEULCP' AFIN DE DEFAVORISER L'ECLA-
                                     < TEMENT DES ITEMS ET L'EPARPILLEMENT DES
                                     < FICHIERS LORSQU'ON SE TROUVE TOUT PRES
                                     < DE CE SEUIL...
                                     < NOTA : EN FORCANT UNE VALEUR SUPERIEURE
                                     < (ET NON PAS EGALE, A CAUSE DU 'SB
                                     < ARGDEM+CODEM') ON EST RAMENE A L'ANCIEN-
                                     < NE STRATEGIE D'ALLOCATION DISQUE...
<
<
<        P I L E  :
<
<
         CALL        #SISP CMS5 DOL2#
PILGET:  EQU         $-DEPILE
XWPILE:  VAL         LPILEH+15
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        L E C T U R E / E C R I T U R E   D E   ' T O G B '  :
<
<
<        ARGUMENT :
<                    (X)=NUMERO+1 DU 'GB' A LIRE OU ECRIRE.
<
<
<        RESULTAT :
<                    (W)=ADRESSE DE LA DEMANDE A 'DKA' AFIN DE
<                        PERMETTRE LE 'WAIT' DE FIN D'OPERATION,
<                    (SB1)=POSITIONNE UNIQUEMENT PAR 'ROGB',
<                    LES CODES 'V' ET 'C' POSITIONNES PAR 'CHANW'.
<
<
<        A T T E N T I O N  :
<                    'WOGB' DETRUIT 'A' ET 'X',
<                    'ROGB' DETRUIT 'A'.
<
<
<
<
<        E C R I T U R E   S U R   ' D K A '  :
<
<
WOGB:    EQU         $
WOGBLA:  EQU         $               < ADRESSE DU 'LAD'...
<*******************************************************************************
         LAD         0,L             < POUR GENERER LE CODE DU 'LAD'...
XWOR%1:  VAL         '0000000@@00
<*******************************************************************************
         $EQU        WOGBLA          < RETOUR SUR LE 'LAD'...
         WORD        XEGBGR+XWOR%1   < 'LAD VAR+EGBGR'...
         LR          A,W             < (W)=ADRESSE DE LA DEMANDE A 'DKA'.
         ADRI        XXGB-IJIJDX,X   < CALCUL DU NUMERO DE SECTEUR
                                     < DE LA 'TOGB' ARGUMENT,
         STX         ARGDEM+ASDEM    < QUE L'ON RANGE DANS 'ASDEM'.
         LAI         FGW
         STA         ARGDEM+OPDEM    < L'ECHANGE EST UNE ECRITURE,
         BSR         ACHAND          < ENVOI DE LA DEMANDE D'ECRITURE SUR 'DKA',
         BSR         ACHANW          < ET ATTENTE DE FIN D'ECHANGE...
         RSR                         < THAT'S ALL FOLK...
<
<
<        L E C T U R E   S U R   ' D K A '  :
<
<
ROGB:    EQU         $
         PSR         X
         WORD        XEGBGR+XWOR%1   < 'LAD VAR+EGBGR'...
         LR          A,W             < (W)=ADRESSE DE LA DEMANDE A 'DKA'.
         ADRI        XXGB-IJIJDX,X   < CALCUL DU NUMERO DE SECTEUR
                                     < DE LA 'TOGB' ARGUMENT,
         STX         ARGDEM+ASDEM    < QUE L'ON RANGE DANS 'ASDEM'.
         STZ         ARGDEM+OPDEM    < L'ECHANGE EST UNE LECTURE.
         IF          FGR-K,,XEIF%,
         IF          ATTENTION : L'INITIALISATION PRECEDENTE EST IDIOTE !!!
XEIF%:   VAL         ENDIF
         BSR         ACHAND          < ENVOI DE LA DEMANDE DE LECTURE A 'DKA'.
         LXI         YY7             < NUMERO DU DERNIER 'SB' D'UN 'GB',
         STX         &VAR+GETSB1     < &VAR+GETSB1C INITIALISE AVEC
                                     < LE SOMMET DE 'TOGB' ; EN EFFET, ON NE
                                     < CONNAIT PAS LE 'GB' QUE L'ON CHARGE,
                                     < IL FAUDRA LE PARCOURIR EN ENTIER LES
                                     < PREMIERES FOIS...
         PLR         X
         BSR         ACHANW          < ET ATTENTE DE FIN DE LECTURE...
         RSR                         < ET C'EST TOUT...
         PAGE
<
<
<        H A N D L E R   D ' A L L O C A T I O N   D I S Q U E  :
<
<
<        ARGUMENTS :
<                    (L)=ADRESSE DE LA 'DCT' D'ALLOCATION,
<                    (W)=ADRESSE DE LA DEMANDE D'ALLOCATION :
<                    (AMDEM)=ADRESSE-MOT DE LA ZONE OU RENVOYER
<                            LE OU LES SECTEURS ALLOUES,
<                    (CODEM)=NOMBRE DE SECTEURS DEMANDES.
<
<
<        ATTENTION :
<                      'AMDEM' CONTIENT UNE ADRESSE DE
<                    MOTS ET NON PAS D'OCTETS ; 'CODEM'
<                    DE MEME CONTIENT UN NOMBRE DE MOTS
<                    CORRESPONDANT AU NOMBRE DE Q-SECTEURS
<                    A ALLOUER.
<                      DE PLUS AUCUNE VERIFICATION N'EST
<                    FAITE, CAR SEUL L'OPERATING SYSTEME
<                    UTILISE CES HANDLERS (GET & REL)...
<
<
<        FORMAT D'UNE ADRESSE SECTEUR :
<                      L'ADRESSE D'UN SECTEUR EST DONNEE SOUS FORME D'
<                    UN MOT :
<                    BITS 0-4  =NUMERO DE 'GB',
<                    BITS 5-11 =NUMERO DE 'SB',
<                    BITS 12-15=NUMERO DE SECTEUR (DANS LE 'SB').
<
<
         USE         L,DCT0
         USE         W,DEM0
HDLGET:  EQU         $
<
< GENERATION DU SEUIL :
<
         LAI         K
         LB          NSL             < (A,B)=NOMBRE DE Q-SECTEURS LIBRES ; A
                                     <       NOTER QU'ON FAIT CELA HORS DE LA
                                     <       PHASE CRITIQUE, CE QUI N'EST PAS
                                     <       TRES IMPORTANT, CAR LE SEUIL N'A
                                     <       PAS BESOIN D'ETRE TRES PRECIS...
         DV          VAR+SEULDV      < (A)=NOMBRE MOYEN DE Q-SECTEURS LIBRES
                                     <     PAR 'GB' DIVISE PAR 2...
         SB          ARGDEM+CODEM    < ON LUI RETRANCHE LE NOMBRE DE Q-SECTEURS
                                     < PRESENTEMENT DEMANDE, AFIN D'EVITER LES
                                     < EPARPILLEMENTS AU NIVEAU DES GRANDS
                                     < ITEMS...
         SARD        NBITMO          < PREPARATION DU DIVIDENDE DANS (A,B) :
         DV          VAR+SEULCP
         MP          VAR+SEULCP      < LE SEUIL EST CALCULE EN MULTIPLE INFE-
                                     < RIEUR DE 'SEULCP'...
         JANE        E80X2           < GLUPSSS, LE SEUIL NE TIENT PAS DANS
                                     < UN MOT !!!
         CPZR        B               < VALIDATION...
         JGE         E80X1           < OK...
E80X2:   EQU         $
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      COMPRENDRE COMMENT LE SEUIL
<                    PEUT ETRE NEGATIF OU NE PAS
<                    TENIR SUR UN MOT !!!
<
         LBI         SEULIN          < ON FORCE UN SEUIL PLANCHER...
E80X1:   EQU         $
         STB         VAR+SEULSB      < ET ON MEMORISE CE SEUIL...
<
< PREPARATION DES ARGUMENTS :
<
         LX          ARGDEM+CODEM    < (X)=NOMBRE D'UNITES A ALLOUER.
         PSR         W               < SAVE L'ADRESSE DE LA DEMANDE.
         LA          ARGDEM+AMDEM    < RECUPERATION DE L'ADRESSE MOT DE
                                     < LA LISTE DES SECTEURS,
         LR          A,W             < (W)=ADRESSE-MOT DE LA ZONE OU STOCKER
                                     <     L'ADRESSE DES SECTEURS ALLOUES.
         LRM         Y
         WORD        PQSHS           < (Y)=ADRESSE DE LA PILE "HS"...
<
< TEST SUR LE POOL GENERAL DES SECTEURS :
<
E80:     EQU         $
         DC          NSL             < ET UN DE MOINS DANS LE POOL GENERAL.
         JNE         E81             < C'EST BON, AU MOINS UN EST LIBRE...
<
< CAS OU IL N'Y A PLUS AUCUN SECTEUR LIBRE :
<
E80XX:   EQU         $               < BRANCHEMENT SUITE A DES 'SYSERS'.
         BSR         ASYSER          < A V E R T I S S E M E N T  !!!
         WAIT        SGETS           < L'ALLOCATEUR SE MET EN ATTENTE
                                     < D'UN RELEASE...
<
< CAS OU AU MOINS 1 SECTEUR EST LIBRE :
<
E81:     EQU         $
         PSR         X               < SAVE NBRE DE SECTEURS A ALLOER.
         RQST        &ASPHEX         <<<XWOR%1+IJIJDX < EST-CE LE 'GB' DU SECTEUR 'INFINI' ??
         JNE         E96             < NON, VERS LA REPRISE DE L'ALLOCATION...
         PSR         X               < OUI, ON L'OCCUPE...
         LXI         YY7
         LA          &ATOGB
XWOR%2:  VAL         Q8000=K
         RBT         NBITMO-B-XWOR%2 < AINSI, IL N'EST PLUS ALLOUABLE...
         STA         &ATOGB
         PLR         X
         DC          &ANSLGB         < ET UN SECTEUR DE MOINS DANS LE 'GB',
         DC          NSL             < ET DANS LE POOL GENERAL AUSSI...
         JMP         E96             < VERS LA REPRISE DE L'ALLOCATION...
         PAGE
<
<
<        D C T   R E L E A S E U R   D I S Q U E  :
<
<
         CALL        #SISP CMS5 CHECK#
         CALL        #SISP CMS5 DOL1#
DCTREL:  EQU         $
PSTREL:  WORD        K;K;K;K;COM+DEPCS;DCTREL;NIL;PILREL;HANDLR;SMST;SO;SE
       #@ASCI        " REL"          < #SISP CMS5 ASCI#
         WORD        XIOID0          < IOID.
         WORD        NFILTR
         WORD        FILTRS          < S-FILTRE.
         WORD        XTALOC          < ETALOC.
         WORD        XXLOC0          < SEMLOC.
         DZS         LSEM
         WORD        NIL             < TETE DE LA FILE D'ATTENTE DES
                                     < DEMANDES DE RELEASE SECTEURS.
         WORD        NIL             < QUEUE DE LA FILE D'ATTENTE DES RELEASES.
         WORD        XXCHV0          < SCHVID.
         DZS         LSEM
         WORD        XXSIT0          < SIT (INUTILISE).
         DZS         LSEM
         WORD        SPHEX0          < SPHEX.
         DZS         LSEM
         WORD        HDLREL          < HANDLER DE RELEASE DE L'ESPACE DISQUE.
         WORD        NIL             < PAS DE 'RIT' EVIDEMMENT...
         WORD        K;K             < ETAT.
         WORD        XBITS0          < BITSEM.
         WORD        XXNTRY;TRYVID   < NTRIES ET FRTRY.
         WORD        K               < HSTATS.
         WORD        XTESTO          < TESTO.
         WORD        XXDCTF          < 'DCT' NON CONNECTABLE...
         WORD        NOSOSE          < DCTFUP ("ALTITUDES" DES FONCTIONS).
                                     < NOTA : IL FAUT RESTER DANS LA PAGE 0 !!!
<
<
<        Z O N E   V A R I A B L E  :
<
<
VARREL:  EQU         $
         IF          VARREL-DCTREL-DCTFIX,,XEIF%,
         IF          ATTENTION : LA ZONE FIXE DE LA 'DCT' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
<
< OPTIMISATION DES PARCOURS :
<
         WORD        SB1
RELSB1:: VAL         $-D-VARREL      < ACCES AU MOT 'SB1'.
         IF          RELSB1-GETSB1,,XEIF%,
         IF          ATTENTION : A CAUSE DE 'ROGB' CES 2
         IF          DEPLACEMENTS DOIVENT ETRE EGAUX !!!
XEIF%:   VAL         ENDIF
<
< DEMANDE D'ECHANGE DE 'TOGB' SUR 'DKA' :
<
         BYTE        NSPDKA;XDSYM    < NSPTYP.
XWK::    VAL         $-D-VARREL
         IF          XWK-EGBGR,,XEIF%,
         IF          ATTENTION : CETTE DEMANDE DOIT ETRE IMPLANTEE
         IF          RELATIVEMENT A 'DCTREL' DE MEME MANIERE QUE
         IF          DANS 'DCTGET' !!!
XEIF%:   VAL         ENDIF
EGBGR:   VAL         $-D-VARREL
         WORD        FGR             < (OPDEM)=0 : LECTURE,
                                     <        =2 : ECRITURE.
         WORD        TOGB+IJIJDX-ZERO*NOCMO < AMDEM.
         WORD        YY8             < CODEM.
         WORD        NILS            < ASDEM.
         DZS         LDEM0+VARREL-$+EGBGR
<
< DEMANDE POUR TESTER LE BON ETAT D'UN Q-SECTEUR :
<
         BYTE        NSPDKM;XDSYM?XTYPAD
DEMHS::  VAL         $-D-VARREL
         WORD        FGR             < ON VA ESSAYER DE LE LIRE...
         WORD        BUFHS-ZERO
         WORD        LBUFHS*NOCMO    < ET ON LIT LE MINIMUM DE MOTS...
         WORD        NILS            < ADRESSE DU Q-SECTEUR A LIRE.
SECTHS:: VAL         $-D-VARREL      < ADRESSE DU Q-SECTEUR COURANT A TESTER.
         DZS         LDEM0+VARREL-$+DEMHS
         WORD        KQSHS           < NOMBRE DE Q-SECTEURS HORS-SERVICE ; CE
                                     < MOT FAIT PARTIE DE LA 'COPY' DU SYSTEME.
NQSHSR:: VAL         $-D-VARREL      < COMPTEUR DES Q-SECTEURS MAUVAIS...
<
<
<        P I L E  :
<
<
         CALL        #SISP CMS5 DOL2#
PILREL:  EQU         $-DEPILE
XWPILE:  VAL         LPILEH+15
         CALL        #SISP CMS5 GENPIL2#
         CALL        #SISP CMS5 CHECK#
         PAGE
<
<
<        H A N D L E R   D E   R E L E A S E   D I S Q U E  :
<
<
<        ARGUMENTS :
<                    (L)=ADRESSE DE LA 'DCT' DE RELEASE,
<                    (W)=ADRESSE DE LA DEMANDE DE RELEASE (LES
<                        ARGUMENTS ONT LA MEME SIGNIFICATION
<                        QUE POUR 'HDLGET' MAIS DANS LE SENS
<                        INVERSE...).
<
<
         USE         L,DCT0
         USE         W,DEM0
HDLREL:  EQU         $
         LX          ARGDEM+CODEM    < (X)=NOMBRE DE SECTEURS A RELEASER,
         PSR         W               < SAUVEGARDE DE L'ADRESSE DE LA DEMANDE,
         LA          ARGDEM+AMDEM
         LR          A,W             < (W)=ADRESSE DE LA LISTE DES SECTEURS A
                                     <     RELEASER.
         LRM         Y
         WORD        PQSHS           < (Y)=ADRESSE DE LA PILE 'PQSHS'.
<
< ACCES AU 1ER SECTEUR A LIBERER :
<
E90:     EQU         $
         LA          O,W             < (A)=ADRESSE DU SECTEUR COURANT A RENDRE,
         CP          INFINI          < ALORS, ON N'A PAS CONFIANCE ???
         JNE         E90XYZ          < OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      OU BIEN C'EST UNE ANCIENNE
<                    VERSION DE L'ALLOCATION QUI
<                    A ALLOUE LE SECTEUR 'INFINI'
<                    PAR ERREUR, SINON, IDENTIFIER
<                    LE DEMANDEUR, ET VOIR POUR-
<                    QUOI IL REND L'INDICATEUR DE
<                    FIN DE CHAINAGE !!!
<
         JMP         E93XXX          < ET ON IGNORE CE SECTEUR...
E90XYZ:  EQU         $
         STA         VAR+SECTHS      < A PRIORI ON VA TESTER LE Q-SECTEUR ('A').
XWOR%1:  VAL         DKMINX=K
XWOR%1:  VAL         -XWOR%1
         SLRS        -XWOR%1
         CPI         DKMINX>XWOR%1   < EST-CE UN SECTEUR INEXISTANT ???
                                     < (VOIR LA COMPRESSION DU 'SGN')
         JNE         E93XXY          < NON, UN VRAI, ON LE REND...
<
< CAS DES SECTEURS INEXISTANTS :
<
         LR          W,B             < SAUVEGARDE DANS 'B' DE L'ADRESSE DES
                                     < SECTEURS A RELEASER.
         PLR         W               < RESTAURE : (W)=ADRESSE DE LA DEMANDE,
         PSR         W               < ET RESAUVEGARDE IMMEDIATE...
         LA          ARGDEM+ETADEM   < (A)=DEMANDEUR DU RELEASE,
         CPI         NSPDLN          < EST-CE BIEN LE DELETE DU 'SGN' ???
         LR          B,W             < ET RESTAURE : (W)=ADRESSE DE LA LISTE
                                     < DES SECTEURS A RELEASER...
         JE          E93XXX          < OK, C'EST LE 'SGN', ON NE REND PAS
                                     < CE SECTEUR BIEN ENTENDU...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      ALLER VOIR LE DEMANDEUR...
<
         JMP         E93XXX          < ET ON NE REND RIEN BIEN SUR...
<
< CAS DES SECTEURS REELS :
<
E93XXY:  EQU         $
         LA          VAR+SECTHS      < NON, ON RESTAURE 'A'...
         PSR         X               < SAUVEGARDE DU NOMBRE DE SECTEURS ENCORE
                                     < A RENDRE.
         RQST        &ASPHEX         <<<XWOR%1-N    < DANS 'A' LE NUMERO DU SECTEUR
                                     < DANS LE 'SB'.
         ADRI        -YY7,B          < DEVIRTUALISATION DU NUMERO
                                     < DE 'SB'.
         NGR         B,B             < (B)=NUMERO DE 'SB'.
         XR          A,B             < (A)=NUMERO DE 'SB',
                                     < (B)=NUMERO DE SECTEUR.
         CP          &VAR+RELSB1     < REGARDONS SI LE SECTEUR RELEASE
                                     < EST DANS L'INTERVALLE (1,(SB1)) ???
         JLE         E99             < OUI, C'EST BON.
         STA         &VAR+RELSB1     < SI NON, LE 'SB' AUQUEL APPARTIENT
                                     < LE SECTEUR RELEASE DEVIENT LA
                                     < BORNE SUPERIEURE SB1 DE PARCOURS
                                     < DE LA TOGB COURANTE.
E99:     EQU         $
         LR          A,X             < (X)=NUMERO DE 'SB'.
         LA          &ATOGB          < ACCES A LA TABLE D'OCCUPATION
                                     < DU 'SB' DU SECTEUR RELEASE.
         XR          B,X             < (X)=NUMERO DU SECTEUR.
         TBT         L,X             < TEST DE L'ETAT DU SECTEUR...
         JNC         SYSRBQ          < OK.
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      ETRE TRES PRUDENT SI ON RELANCE
<                    LE SYSTEME...
<
SYSRBQ:  EQU         $
         SBT         L,X             < RELEASE DU SECTEUR.
         XR          B,X             < (X)=NUMERO DU 'SB'.
         PSR         A,X,W
         LA          ETASYS
         TBT         QSHS            < FAUT-IL TESTER LES Q-SECTEURS EN
                                     < MAUVAIS ETAT ???
         JNC         E99XX           < NON, RIEN A FAIRE DONC...
<
< TEST DE L'ETAT DU SECTEUR
< COURANT QUE L'ON REND :
<
         LAD         VAR+DEMHS       < OUI, ON VA DONC LIRE UN NOMBRE DE
         LR          A,W
         BSR         ACHAND          < MOTS SUFFISANTS SUR LE Q-SECTEUR
         BSR         ACHANW          < COURANT POUR QUE LE CHECKSUM DE
                                     < CHACUN DES SECTEURS QUI LE COMPOSENT
                                     < SOIT CALCULE :
         JE          E99XX           < LE SECTEUR COURANT EST BON...
<
< CAS OU UN Q-SECTEUR RENDU EST EN MAUVAIS ETAT :
< (ON NE PEUT LE RELIRE CORRECTEMENT...)
<
         LA          VAR+SECTHS      < (A)=ADRESSE DU Q-SECTEUR "HS" :
         PUSH                        < ON LE MEMORISE,
         JNCV        E99XY           < OK...
         BSR         ASYSER          < E R R E U R   S Y S T E M E ...
<
<        QUE FAIRE ???
<                      C'EST PAS GRAVE : RELEVER MANUELLEMENT
<                    L'AFRESSE DU Q-SECTEUR "HS", PUIS AUGMENTER
<                    LA TAILLE DE 'PQSHS'...
<
E99XY:   EQU         $
         LX          NUGBC           < (X)=NUMERO DU 'GB' COURANT,
         DC          &ANSLGB         < ON DECOMPTE LE Q-SECTEUR COURANT,
                                     < CAR IL A DEJA ETE RENDU AU 'GB'...
         IC          &VAR+NQSHSR     < ET ON COMPTE LES MAUVAIS Q-SECTEURS.
         LAD         &ASPHEX
         BSR         ARLSE           < FIN DE PHASE CRITIQUE GET/REL...
         PLR         A,X,W
         JMP         E93             < VERS LE Q-SECTEUR SUIVANT...
<
< CAS OU UN Q-SECTEUR RENDU EST EN BON ETAT :
<
E99XX:   EQU         $
         PLR         A,X,W
         STA         &ATOGB          < ET MISE A JOUR DE 'TOGB'...
         LAD         &ASPHEX
         BSR         ARLSE
         IC          NSL             < ET UN SECTEUR DE PLUS DANS LE
                                     < POOL GENERAL.
         LA          NSL             < (A)=NOMBRE DE SECTEURS ACTUELLEMENT
                                     <     LIBRES :
         CPI         W               < 'HDLGET' ATTEND-IL ???
         JNE         E93             < ON...
<
< OUI, 'HDLGET' ETAIT BLOQUE, ET
< EN MANQUE (COMME ON DIT...) :
<
         ACT         SGETS           < REVEIL DE L'ALLOCATEUR.
<
<        NOTA :
<                      'NUGBC' EST OK POUR
<                    L'ALLOCATEUR 'GET'...
<
E93:     EQU         $
         PLR         X               < RESTAURE :
                                     < (X)=NOMBRE (+1) DE SECTEURS ENCORE A
                                     <     RELEASER.
E93XXX:  EQU         $               < CAS DES SECTEURS INEXISTANTS...
         ADRI        P,W             < POUR L'ACCES A L'EVENTUEL
                                     < SECTEUR SUIVANT.
         JDX         E90             < AU SUIVANT...
         PLR         W               < RESTAURE :
                                     < (W)=ADRESSE DE LA DEMANDE...
         LA          ARGDEM+ETADEM   < (A)='NSP' DU DEMANDEUR :
         CPI         NSPINI          < NE SERAIT-CE PAS LA TACHE D'INITIALI-
                                     < SATION ???
         JE          E93XXT          < OUI, DONC PAS DE COPIE, EN EFFET, TANT
                                     < QUE L'INITIALISATION N'EST PAS TERMINEE
                                     < ON NE PEUT FAIRE DE COPIE (VOIR A CE
                                     < PROPOS LE MODULE DE 'COPY' DANS
                                     < 'HDLHOR'...).
         SVC         SVCM7           < NON, ON DEMANDE UNE COPIE SYNCHRONE SUR
                                     < LA ZONE 'SCOPY1'...
E93XXT:  EQU         $
         RSR                         < C'EST LA FIN...
<
< CAS OU UN SECTEUR RELEASE N'APPARTIENT PAS AU 'GBC' :
<
E91:     EQU         $
         PSR         W               < SAUVEGARDE DE L'ADRESSE DE LA DEMANDE
                                     < DE RELEASE.
         PSR         X               < SAUVEGARDE DU NUMERO DU NOUVEAU 'GBC'.
         LX          NUGBC           < ACCES AU 'GBC' PRECEDEMT POUR
                                     < ECRITURE DE SA TOGB SUR DK1.
         BSR         AWOGB           < SAUVEGARDE DE L'ANCIEN 'GBC'...
         PLR         X               < RESTAURE :
                                     < (X)=NUMERO DU NOUVEAU 'GBC',
         BSR         AROGB           < ET LECTURE DE SA 'TOGB'...
         STX         NUGBC           < ET POSITIONNEMENT DU NOUVEAU 'NUGBC'.
         PLR         W               < RESTAURE :
                                     < (W)=ADRESSE DE LA DEMANDE DE RELEASE.
         JE          E92             < ET C'EST REPARTI...
         JMP         E93XX           < N'AYANT PU LIRE LA 'TOGB', ON IGNORE
                                     < LE Q-SECTEUR RELEASE...
<
<
<        N O T A   I M P O R T A N T  :
<                      TOUTES LES 'SYSERS' DE L'ALLOCATION/
<                    RELEASE DISQUE PEUVENT SURVENIR APRES
<                    UNE MAUVAISE REINITIALISATION DU
<                    SYSTEME, OU BIEN APRES QU'UNE
<                    INITIALISATION PIRATE AIT ETE FAITE
<                    (PROGRAMME ESCLAVE EN MODE MAITRE) ;
<                    DANS TOUS LES CAS, POUR RELANCER LE SYSTEME,
<                    IL FAUDRA ETRE PRUDENT, ET PEUT ETRE
<                    INHIBER LA COPIE ('ETASYS')...
<
<



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