<
<        R E S T A U R A T I O N
<
         IDP         "CARTES A DISQUE"
         IDP         "P. FRANCONNET"
         IDP         "RELEASE 21/08/80"
         TABLE
ZERO:    EQU         $
<
<        I M P L A N T A T I O N ...
<
XIMPL:   VAL         '3000           < ADRESSE D'IMPLANTATION.
         $EQU        $+XIMPL
<
<        A T T E N T I O N ! ! !
<
<                      L'ADRESSE D'IMPLANTATION DOIT TENIR COMPTE
<                    DU FAIT QUE CE PROGRAMME UTILISE DES ADRESSES D'OCTETS
<                    ET QUE PAR CONSEQUENT TOUS SES BUFFERS DOIVENT RESIDER
<                    EN ADRESSES BASSES (<=32K).
<
QUANTA:  VAL         1               < QUANTA=NB SECTEURS PHYSIQUES
                                     < POUR 1 SECTEUR LOGIQUE (SGF)
                                     < CAR ON TRAVAILLE FORCEMENT SUR DKF.
NSPDK3:  VAL         '25
NSPDK2:  VAL         NSPDK3-1
LPAC:    VAL         128             < LONG PAGE VIRT SI CARTES
LCCI:    VAL         80              < COMPATIBILITE CMS5.
NBCOL:   VAL         LCCI            < NOMBRE DE COLONNES CARTE
                                     < ATTENTION: CECI N'EST PAS UN PARAMETRE
PILE:    DZS         36              < PILE POUR 'K'.
<
<        BUFFERS.
<
BC:      DZS         NBCOL           < BUFFER CARTE
FBC:     EQU         $               < FIN BUFFER CARTE
<
BUDK:    DZS         QUANTA*128      < BUFFER DKF/DKM.
FBUDK:   EQU         $               < FIN DU BUFFER DK.
<
<        PAGE VIRTUELLE.
<
PAGE:    DZS         LPAC
FPAGE:   EQU         $               < FIN DE PAGE.
<
<        TABLES POUR PUNCH
<
MSK1:    BYTE        'FF;'E0;'FC;'FF;'80;'F0;'FE;'FF;'C0;'F8;'FF
SHF1:    BYTE        8;0;16-3;16-6;2;16-1;16-4;16-7;1;16-2;16-5
SHF2:    BYTE        0;5;2;0;7;4;1;0;6;3;0
<
<        P A R A M E T R E S   C M S 5.
<
         NLS
NIL:     EQU         ZERO            < ELEMENT INDIQUANT UNE ADRESSE VIDE.
                                     < (PAR EXEMPLE CHAINAGE DE FILE D'ATTENTE
                                     < 'TETE' ET 'QUEUE' VIDE,...).
NOCMO::  VAL         2               < NOMBRE D'OCTETS PAR MOT.
NBITOC:: VAL         8               < NOMBRE DE BITS DANS UN OCTET,
NBITMO:: VAL         NBITOC*NOCMO    < NOMBRE DE BITS DANS UN MOT.
BIT::    VAL         1
B::      VAL         1               < PARCEQUE LE PREMIER BIT D'UN MOT
                                     < A LE RANG 0...
ZERO1:   WORD        0
D::      VAL         $-ZERO1         < LONGUEUR D'UN MOT !!!
         $EQU        ZERO1
P::      VAL         D               < PASSAGE A UN ELEMENT PRECEDENT.
Z::      VAL         1               < POUR CE QUI COMMENCE A 0...
I::      VAL         1               < POUR LES INCREMENTATIONS/DECREMENTATIONS.
E::      VAL         1               < POUR LES DIVISIONS PAR EXCES (Y+X-E/X).
S::      VAL         BIT             < POUR LES DECALAGES D'UN CRAN.
K::      VAL         '0000           < POUR CLEARER, RAZER,...
L::      VAL         0               < RANG DU BIT DE GAUCHE ('LEFT') D'UN MOT.
O::      VAL         ZERO-ZERO       < ELEMENT COURANT,...
         PAGE
<
<
<        D E F I N I T I O N S   G E N E R A L E S  :
<
<
<
<
<        PROVERBE SHADOKK :
<
<        "POURQUOI FAIRE SIMPLE, QUAND ON PEUT FAIRE COMPLIQUE ???!!?
<
<                      EN EFFET, CERTAINS TROUVERONT CERTAINES
<                    DEFINITIONS LUXUEUSES, MAIS J'AI ESSAYE
<                    ICI, DE NE JAMAIS FAIRE APPARAITRE DE
<                    CONSTANTES, OU D'OBJETS DONT LA DEFINITION
<                    N'AIT ETE FAITE AVEC LE PLUS DE RIGUEUR
<                    POSSIBLE; DE PLUS, A CHAQUE FOIS QUE
<                    CELA EST POSSIBLE, DES VERIFICATIONS "CONTEX-
<                    TUELLES" ONT ETE INTRODUITES (PAR EXEMPLE,
<                    DE NON RECOUVREMENT DE MASQUES).
<                      AINSI, J'ESPERE QUE LE RESTE DU SYSTEME
<                    NE DEPENDRA QUE DE CES DEFINITIONS, ET QUE
<                    LEUR MODIFICATION SE FERA DANS LA CONTINUITE...
<
<
         PAGE
<
<
<        C O N S T A N T E S   G E N E R A L E S
<                D E   N O M B R E  :
<
<
BITX::   VAL         L               < RANG DU BIT D'INDEXATION.
BASE10:: VAL         10              < BASE DECIMALE,
BASE16:: VAL         16              < BASE HEXA-DECIMALE.
NBITCX:: VAL         BASE16=K        < NOMBRE DE BITS CONTENUS DANS
                                     < UN CHIFFRE HEXA-DECIMAL.
LK::     VAL         BIT>10          < VALEUR DU FACTEUR MULTIPLICATIF 'K'.
UMEM::   VAL         2               < LES TAILLES MEMOIRES SONT EXPRIMEES
                                     < EN UNITE DE DOUBLE-MOTS (2).
XWOR%1:  VAL         LK/UMEM         < 1K DANS CETTE UNITE...
MEMORK:: VAL         32              < TAILLE EN K-MOTS DE LA MEMOIRE
                                     < ALLOUABLE.
MEMORY:: VAL         MEMORK          < LA MEMOIRE ALLOUABLE FAIT 32K,
MEMORY:  VAL         MEMORY*XWOR%1   < SOIT (...) DOUBLE-MOTS.
                                     < LA MEMOIRE.
XX64K::  VAL         64              < LONGUEUR DE LA MEMOIRE ACCESSIBLE EN
                                     < ADRESSAGE DIRECT, ET PAR LA MEME, DONNE
                                     < LA TAILLE DU SYSTEME...
PLK::    VAL         LK              < LONGUEUR DU PLUS PETIT ESPACE MEMOIRE
                                     < ALLOUABLE A UN UTILISATEUR.
<
<
<        P A R T I T I O N   D E   L A   M E M O I R E  :
<
<
DOLA1::  VAL         '0000           < '$' INITIAL DE LA MEMOIRE BASSE.
XWOR%1:  VAL         UMEM=K          < POUR AVOIR UNE ADRESSE-MOT,
DOLA2::  VAL         MEMORY>XWOR%1   < '$' INITIAL DE LA MEMOIRE HAUTE.
DOLAR1:  VAL         DOLA1           < INITIALISATION DU '$' BAS COURANT,
DOLAR2:  VAL         DOLA2           < INITIALISATION DU '$' HAUT COURANT.
         PAGE
<
<
<        C O N S T A N T E S   G E N E R A L E S
<                D U   S Y S T E M E  :
<
<
IJIJDX:: VAL         I               < TRANSLATION DES INDEX LORS
                                     < DE L'UTILISATION DES INSTRUCTIONS
                                     < 'JIX' ET 'JDX'.
DEPILE:: VAL         D               < TRANSLATION NEGATIVE A DONNER
                                     < AUX ADRESSES DE PILE AFIN DE PRENDRE
                                     < EN COMPTE LA GESTION QUI EST FAITE
                                     < PAR LES INSTRUCTIONS 'PSR' ET 'PLR'.
NMBUSM:: VAL         8               < NOMBRE MAXIMUM DE BUS MEMOIRE.
NMPROB:: VAL         4               < NOMBRE MAXIMUM DE PROCESSEURS
                                     < PAR BUS MEMOIRE (UN PROCESSEUR
                                     < POUVANT ETRE UN SOLAR-40, UN
                                     < SOLAR-65, UN IOP, OU ENFIN
                                     < UN CBM-P.
NMPROC:: VAL         NMBUSM*NMPROB   < NOMBRE MAXIMUM DE PROCESSEURS.
NMTS::   VAL         128             < NOMBRE MAXIMUM DE TACHES
                                     < SOFTWARES DANS LE SYSTEME.
NMTH::   VAL         16              < NOMBRE MAXIMUM DE TACHES
                                     < HARDWARES DANS LE SYSTEME,
                                     < NON COMPRIS LE DEFAUT SECTEUR !!!
NTS0::   VAL         0               < NUMERO DE LA PREMIERE TACHE SOFT,
NTH0::   VAL         0               < NUMERO DE LA PREMIERE TACHE HARD.
         IF          2*NBITMO-NMPROC,,XWOR%,XWOR%
         IF          A T T E N T I O N  : IL Y A TROP DE
         IF          PROCESSEURS POUR QUE LEUR LISTE
         IF          TIENNE SUR 2 MOTS (OU DANS LES 2
         IF          REGISTRES 'A' ET 'B') !!!
XWOR%:   VAL         0
NMSVC::  VAL         BIT>NBITOC      < NOMBRE MAXIMUM DE 'SVC'.
NMSVCM:: VAL         NMSVC           < NOMBRE MAXIMUM DE 'SVC' EXECUTABLES
                                     < EN MODE MAITRE.
NMSVCS:: VAL         NMSVC           < NOMBRE MAXIMUM DE 'SVC' EXECUTABLES
                                     < EN MODE ESCLAVE.
         PAGE
<
<
<        C O N V E N T I O N S   G E N E R A L E S  :
<
<
NEXIST:: VAL         NIL-ZERO        < EXPRIME LA NON EXISTENCE,...
EXIST::  VAL         BIT)NEXIST      < EXPRIME L'EXISTENCE...
         PAGE
<
<
<        C O N S T A N T E S   G E N E R A L E S
<                D E   M A S Q U E S  :
<
<
MFFFF::  VAL         -1              < -1='FFFF : UTILISE POUR COMPLEMENT.
N::      VAL         -MFFFF          < POUR CALCULER DES MASQUES A PARTIR
                                     < DE CONSTANTES QUI SONT DES PUISSAN-
                                     < CES DE 2.
M1FFF::  VAL         '1FFF
M0FFF::  VAL         '0FFF
M7FFF::  VAL         '7FFF
M007F::  VAL         '007F
M003F::  VAL         '003F
M001F::  VAL         '001F
M000F::  VAL         '000F
M0007::  VAL         '0007
M0003::  VAL         '0003
M0001::  VAL         '0001
M8000::  VAL         '8000
M07FF::  VAL         '07FF
ME000::  VAL         'E000
MOCD::   VAL         0               < MASQUE D'ACCES A L'OCTET DROIT
                                     < D'UN MOT.
         DO          NBITOC
MOCD:    VAL         MOCD>BIT?BIT    < GENERATION BIT A BIT DE 'MOCD'.
MOCG::   VAL         MOCD>NBITOC     < MASQUE D'ACCES A L'OCTET
                                     < GAUCHE D'UN MOT.
M00FF::  VAL         MOCD
MFF00::  VAL         MOCG
MMOT::   VAL         '0000           < MASQUE RECOUVRANT UN MOT.
         DO          NBITMO
MMOT:    VAL         MMOT>BIT?BIT    < GENERATION BIT A BIT DE 'MMOT'.
         IF          MMOT-MFFFF,,XWOR%,
         IF          ATTENTION : IL VA SE PASSER DES CHOSES !!!
XWOR%:   VAL         0
         PAGE
<
<
<        C O N S T A N T E S   G E N E R A L E S
<              D E   D E C A L A G E  :
<
<
DOCD::   VAL         MOCD=K          < DECALAGE D'ACCES A L'OCTET
                                     < DROIT D'UN MOT.
DOCG::   VAL         MOCG=K          < DECALAGE D'ACCES A L'OCTET
                                     < GAUCHE D'UN MOT.
         PAGE
<
<
<        D E F I N I T I O N   D E S
<        C O D E S   A S C I I  :
<
<
KNUL::   VAL         '00             < CONTROL-SHIFT-P.
KSOH::   VAL         '01             < CONTROL-A.
KSTX::   VAL         '02             < CONTROL-B.
KETX::   VAL         '03             < CONTROL-C.
KEOT::   VAL         '04             < CONTROL-D.
KENQ::   VAL         '05             < CONTROL-E.
KACK::   VAL         '06             < CONTROL-F.
KBEL::   VAL         '07             < CONTROL-G.
KBS::    VAL         '08             < CONTROL-H (BACK-SPACE).
KHT::    VAL         '09             < CONTROL-I (TAB).
KLF::    VAL         '0A             < CONTROL-J (LINE-FEED).
KVT::    VAL         '0B             < CONTROL-K.
KFF::    VAL         '0C             < CONTROL-L.
KCR::    VAL         '0D             < CONTROL-M (RETURN).
KSO::    VAL         '0E             < CONTROL-N.
KSI::    VAL         '0F             < CONTROL-O.
KDLE::   VAL         '10             < CONTROL-P.
KDC1::   VAL         '11             < CONTROL-Q.
KDC2::   VAL         '12             < CONTROL-R.
KDC3::   VAL         '13             < CONTROL-S.
KDC4::   VAL         '14             < CONTROL-T.
KNAK::   VAL         '15             < CONTROL-U.
KSYN::   VAL         '16             < CONTROL-V.
KETB::   VAL         '17             < CONTROL-W.
KCAN::   VAL         '18             < CONTROL-X.
KEM::    VAL         '19             < CONTROL-Y.
KSUB::   VAL         '1A             < CONTROL-Z.
KESC::   VAL         '1B             < CONTROL-SHIFT-K.
KFS::    VAL         '1C             < CONTROL-SHIFT-L.
KGS::    VAL         '1D             < CONTROL-SHIFT-M.
KRS::    VAL         '1E             < CONTROL-SHIFT-M.
KUS::    VAL         '1F             < CONTROL-SHIFT-O.
KSP::    VAL         " "             < SPACE.
KPE::    VAL         "!"             < !
KDQ::    VAL         '22             < "
KDIESE:: VAL         "#"             < #
KDOLAR:: VAL         "$"             < $
KPC::    VAL         '25             < POUR-CENT.
KET::    VAL         "&"             < &
KQUOTE:: VAL         "'"             < '
KPG::    VAL         "("             < (
KPD::    VAL         ")"             < )
KSTAR::  VAL         "*"             < *
KPLUS::  VAL         "+"             < +
KVIR::   VAL         ","             < ,
KMOINS:: VAL         "-"             < -
KPOINT:: VAL         "."             <.
KSLASH:: VAL         "/"             < /
KZERO::  VAL         "0"             < 0
KUN::    VAL         "1"             < 1
KDEUX::  VAL         "2"             < 2
KTROIS:: VAL         "3"             < 3
KQUATR:: VAL         "4"             < 4
KCINQ::  VAL         "5"             < 5
KSIX::   VAL         "6"             < 6
KSEPT::  VAL         "7"             < 7
KHUIT::  VAL         "8"             < 8
KNEUF::  VAL         "9"             < 9
KDP::    VAL         ":"             < ::
KPV::    VAL         ";"             < ;
KINF::   VAL         "<"             < <
KEGAL::  VAL         "="             < =
KSUP::   VAL         ">"             < >
KPI::    VAL         "?"             < ?
KAROND:: VAL         '40             < @
KA::     VAL         "A"             < A
KB::     VAL         "B"             < B
KC::     VAL         "C"             < C
KD::     VAL         "D"             < D
KE::     VAL         "E"             < E
KF::     VAL         "F"             < F
KG::     VAL         "G"             < G
KH::     VAL         "H"             < H
KI::     VAL         "I"             < I
KJ::     VAL         "J"             < J
KK::     VAL         "K"             < K
KL::     VAL         "L"             < L
KM::     VAL         "M"             < M
KN::     VAL         "N"             < N
KO::     VAL         "O"             < O
KP::     VAL         "P"             < P
KQ::     VAL         "Q"             < Q
KR::     VAL         "R"             < R
KS::     VAL         "S"             < S
KT::     VAL         "T"             < T
KU::     VAL         "U"             < U
KV::     VAL         "V"             < V
KW::     VAL         "W"             < W
KX::     VAL         "X"             < X
KY::     VAL         "Y"             < Y
KZ::     VAL         "Z"             < Z
KCG::    VAL         "["             < [
KASLSH:: VAL         "\"             < \
KCD::    VAL         "]"             < ]
KCHAP::  VAL         "^"             < ^
KSOUL::  VAL         "_"             < _
KAPO::   VAL         '60             < APOSTROPHE.
KMINUS:: VAL         '20             < CONSTANTE DE PASSAGE DES
                                     < MAJUSCULES AUX MINUSCULES.
KAM::    VAL         KA+KMINUS       < A
KBM::    VAL         KB+KMINUS       < B
KCM::    VAL         KC+KMINUS       < C
KDM::    VAL         KD+KMINUS       < D
KEMI::   VAL         KE+KMINUS       < E
KFM::    VAL         KF+KMINUS       < F
KGM::    VAL         KG+KMINUS       < G
KHM::    VAL         KH+KMINUS       < H
KIM::    VAL         KI+KMINUS       < I
KJM::    VAL         KJ+KMINUS       < J
KKM::    VAL         KK+KMINUS       < K
KLM::    VAL         KL+KMINUS       < L
KMM::    VAL         KM+KMINUS       < M
KNM::    VAL         KN+KMINUS       < N
KOM::    VAL         KO+KMINUS       < O
KPM::    VAL         KP+KMINUS       < P
KQM::    VAL         KQ+KMINUS       < Q
KRM::    VAL         KR+KMINUS       < R
KSM::    VAL         KS+KMINUS       < S
KTM::    VAL         KT+KMINUS       < T
KUM::    VAL         KU+KMINUS       < U
KVM::    VAL         KV+KMINUS       < V
KWM::    VAL         KW+KMINUS       < W
KXM::    VAL         KX+KMINUS       < X
KYM::    VAL         KY+KMINUS       < Y
KZM::    VAL         KZ+KMINUS       < Z
KACCOG:: VAL         '7B             < ACCOLADE GAUCHE.
KDPBIS:: VAL         '7C             < 'DEUX POINTS' BIZARRES...
KACCOD:: VAL         '7D             < ACCOLADE DROITE.
KALTM::  VAL         KACCOD          < FABULEUX ALT-MODE !!!
KSINUS:: VAL         '7E             < PETIT BOUT DE SINUSOIDE...
KDEL::   VAL         '7F             < RUBOUT.
KRUBOU:: VAL         KDEL            < RUBOUT.
K6D::    VAL         '6D             < EXTENSION CR+LF...
KINEX::  VAL         'FF             < CARACTERE INEXISTANT.
KEON::   VAL         KEOT            < CARACTERE DE FIN DE NOM...
KBREAK:: VAL         KNUL            < LE CODE DU 'BREAK' EST CELUI DU 'NULL'.
         IF          KBREAK-0,,XWOR%,
         IF          ATTENTION : IL Y A DES TAS DE TESTS DANS
         IF          'HDLVIS' QUI NE VONT PAS MARCHER ('JAE',...) !!!
XWOR%:   VAL         0
         PAGE
<
<
<        N U M E R O   D E   C O M P T E
<          D U   S Y S T E M E  :
<
<
XK1::    VAL         KDP             < LE NUMERO DE COMPTE
XK2::    VAL         KS              < DU SYSTEME
XK3::    VAL         KY              < EST DEFINI
XK4::    VAL         KS              < PAR 4 CARACTERES.
         PAGE
<
<
<        G E N E R A T I O N   D Y N A M I Q U E
<                    D E   C A R T E S  :
<
<
<        FONCTION :
<                      LES CONSTANTES SUIVANTES PERMET-
<                    TENT LA GENERATION DYNAMIQUE DE CAR-
<                    TES EN DEFINISSANT LE FORMAT DES
<                    CARTES STANDARD (K, 9, 21, 37) AINSI
<                    QUE LES DEUXIEMES OPERANDES DE L'OPE-
<                    RATEUR '='.
<
<
<
< DEFINITION DES FONCTIONS DISPONIBLES
< EN TANT QUE DEUXIEME OPERANDE DE '=' :
<
KOLGET:: VAL         'F1             < DEUXIEME OPERANDE DE L'OPERATEUR '='
                                     < DEMANDANT L'ACCES AU CARACTERE COURANT
                                     < DE LA CARTE "DYNAMIQUE" DONT L'INDEX
                                     < EST LE PREMIER OPERANDE.
KOLSTO:: VAL         'F2             < DEUXIEME OPERANDE DE L'OPERATEUR '='
                                     < DEMANDANT DE METTRE DANS LA CARTE
                                     < "DYNAMIQUE" LE CARACTERE CONTENU DANS
                                     < L'OCTET LIBRE DE CE DEUXIEME OPERANDE
                                     < A L'INDEX DONNE PAR LE PREMIER
                                     < OPERANDE (VOIR LE MASQUE 'KOLC' POUR LA
                                     < DEFINITION DU CARACTERE A INSERER).
KOLMOV:: VAL         'F3             < FONCTION PERMETTANT DE DEPLACER
                                     < UNE CHAINE DE CARACTERES D'INDEX
                                     < INITIAL DEFINI PAR 'KOLMOE' VERS
                                     < L'INDEX FINAL DEFINI PAR 'KOLMOR'
                                     < DANS LE PREMIER OPERANDE DE '=',
                                     < ET SUR UNE LONGUEUR DEFINI PAR
                                     < PAR 'KOLMOL' DANS LE DEUXIEME
                                     < OPERANDE.
KOLTES:: VAL         'F4             < FONCTION PERMETTANT DE RECHERCHER
                                     < LE CARACTERE DEFINI PAR LE MASQUE 'KOLC'
                                     < DANS LA CHAINE DEFINIE PAR SON
                                     < INDEX DE PREMIER CARACTERE (MASQUE
                                     < 'KOLTED' DU PREMIER OPERANDE), ET
                                     < PAR LE PREMIER CARACTERE NE LUI
                                     < APPARTENANT PAS MASQUE 'KOLTEF' DU
                                     < PREMIER OPERANDE) ; LE RESULTAT EST
                                     < L'INDEX DE LA PREMIERE OCCURENCE DU
                                     < CARACTERE, OU BIEN L'INDEX DE FIN DANS
                                     < LES AUTRES CAS...
<
< DEFINITION DES MASQUES DU PREMIER OPERANDE :
<
KOLMOE:: VAL         MFF00           < DEFINITION DE L'EMETTEUR LORS
                                     < D'UN DEPLACEMENT DE CHAINE PAR
                                     < LA FONCTION 'KOLMOV'.
KOLMOR:: VAL         M00FF           < DEFINITION DU RECEPTEUR LORS
                                     < D'UN DEPLACEMENT DE CHAINE PAR
                                     < LA FONCTION 'KOLMOV'.
KOLTED:: VAL         MFF00           < DEFINITION DE L'INDEX DU PREMIER
                                     < CARACTERE D'UNE CHAINE DANS LA
                                     < FONCTION 'KOLTES'.
KOLTEF:: VAL         M00FF           < DEFINITION DE L'INDEX DU PREMIER
                                     < CARACTERE N'APPARTENANT PLUS A UNE
                                     < CHAINE DANS LA FONCTION 'KOLTES'.
<
< DEFINITION DES MASQUES DE DEUXIEME OPERANDE :
<
KOLF::   VAL         MFF00           < DEFINITION DE LA FONCTION DEMANDEE ::
                                     < PAR EXEMPLE : 'KOLGET', 'KOLSTO' OU
                                     < BIEN 'KOLMOV'...
KOLMOL:: VAL         M00FF           < DEFINITION DU NOMBRE DE CARACTERES A
                                     < DEPLACER PAR LA FONCTION 'KOLMOV'.
KOLC::   VAL         M00FF           < DEFINITION DU CARACTERE A INSERER
                                     < DANS LA CARTE DYNAMIQUE PAR LA
                                     < FONCTION 'KOLSTO', AINSI QUE DU CARAC-
                                     < TERE A TESTER LORS DE LA FONCTION
                                     < 'KOLTES'.
         PAGE
<
<
<        D E F I N I T I O N   D E S   C H A M P S  :
<
<
<        DEFINITION :
<                      UN 'CHAMP' EST UNE ZONE DE UN
<                    OU PLUSIEURS BITS CONTENUE DANS
<                    UN MOT MACHINE ; UN CHAMP SERA
<                    TOUJOURS DEFINI PAR UN MASQUE,
<                    ET SON POSITIONNEMENT SE FERA
<                    TOUJOURS A L'AIDE D'UNE VALEUR
<                    CADREE A DROITE DANS LE MOT
<                    MACHINE.
<
<
<        GENERATION :
<                      PAR LES FONCTIONS 'FMASK' ET
<                    'FVAL' DE L'ASSEMBLEUR LA PRE-
<                    MIERE PERMET DE DEFINIR UN MASQUE
<                    COURANT (PREMIER OPERANDE DE '='),
<                    LA SECONDE, DONNE LA VALEUR A INSE-
<                    RER DANS LE MASQUE COURANT (PREMIER
<                    OPERANDE DE '='), PUIS FAIT UN CUMUL
<                    (PAR UN 'OU') SUR UNE VALEUR COURANTE,
<                    QUI EST ENSUITE AFFECTEE A L'EXPRESSION
<                    COURANTE...
<
<
FOMASK:: VAL         'F5             < FONCTION DE DEFINITION DU MASQUE
                                     < COURANT : CELUI-CI SERA LA PARTIE
                                     < GAUCHE DE L'OPERATEUR '='.
FOVAL::  VAL         'F6             < FONCTION D'INSERTION DE LA VALEUR
                                     < DANS LE MASQUE COURANT, ET DE CUMUL ;
                                     < LA VALEUR EST L'OPERANDE GAUCHE DE
                                     < L'OPERATEUR '='.
<
< GENERATION DES OPERANDES DROITS DE '=' :
<
XWOR%1:  VAL         KOLF=K          < POUR CADRER LA FONCTION :
FMASK::  VAL         FOMASK>XWOR%1   < 'DEFINITION D'UN MASQUE'.
FVAL::   VAL         FOVAL>XWOR%1    < 'CADRAGE D'UNE VALEUR SUIVANT UN MASQUE'.
         PAGE
<
<
<        F O N C T I O N S    C O M P L E T E S   D E
<        G E N E R A T I O N    D E   C A R T E S  :
<
<
<        NOTA :
<                      CES FONCTIONS 'FCXXX' S'UTILISERONT
<                    POUR GENERER D'AUTRES FONCTIONS AVEC
<                    CETTE FOIS DES ARGUMENTS, ET CECI DE
<                    LA FACON SUIVANTE :
<
<XXX:    VAL         <EXPRESSION AVEC 'FMASK', 'FVAL',...>?FCXXX
<
<
FCGET::  VAL         KOLF=FMASK+KOLGET=FVAL
                                     < ACCES A UN OCTET.
FCSTO::  VAL         KOLF=FMASK+KOLSTO=FVAL
                                     < RANGEMENT D'UN OCTET.
FCMOV::  VAL         KOLF=FMASK+KOLMOV=FVAL
                                     < MOUVEMENT D'UNE CHAINE D'OCTETS.
FCTES::  VAL         KOLF=FMASK+KOLTES=FVAL
                                     < RECHERCHE D'UN OCTET DANS UNE CHAINE.
         PAGE
<
<
<        D E F I N I T I O N   D ' U N E   C A R T E  :
<
<
0       @1           2               3                                         L
XWOR%1:  VAL         0               < DEBUT PRESUME D'UNE CARTE,
XWOR%2:  VAL         80              < FIN PRESUMEE D'UNE CARTE...
XWOR%3:  VAL         KOLTED=FMASK+XWOR%1=FVAL+KOLTEF=FMASK+XWOR%2=FVAL
XWOR%4:  VAL         KOLC=FMASK+KZERO=FVAL?FCTES
KOL0::   VAL         XWOR%3=XWOR%4   < DEFINITION DE LA ZONE 'ETIQUETTE' DES
                                     < LIGNES A ASSEMBLER.
XWOR%4:  VAL         KOLC=FMASK+KUN=FVAL?FCTES
KOL1::   VAL         XWOR%3=XWOR%4   < DEFINITION DE LA ZONE 'COMMANDE'.
XWOR%4:  VAL         KOLC=FMASK+KDEUX=FVAL?FCTES
KOL2::   VAL         XWOR%3=XWOR%4   < DEFINITION DE LA ZONE 'ARGUMENT.
XWOR%4:  VAL         KOLC=FMASK+KTROIS=FVAL?FCTES
KOL3::   VAL         XWOR%3=XWOR%4   < DEFINITION DE LA ZONE 'ARGUMENT'.
XWOR%4:  VAL         KOLC=FMASK+KL=FVAL?FCTES
KOLON::  VAL         XWOR%3=XWOR%4+1 < LONGUEUR D'UNE CARTE A ASSEMBLER.
         IF          XWOR%1-KOL0,XWOR%,XWOR%,
         IF          ATTENTION : ARGUMENTS DE BASE MAUVAIS !!!
XWOR%:   VAL         0
         IF          XWOR%2-KOL0-KOLON,,XWOR%,XWOR%
         IF          ATTENTION : ARGUMENTS DE BASE MAUVAIS !!!
XWOR%:   VAL         0
         PAGE
<
<
<        I N D E X   D ' I T E R A T I O N  :
<
<
KOLDO::  VAL         'F8             < CETTE FONCTION PERMET DE RECUPERER
                                     < L'INDEX COURANT D'UNE ITERATION
                                     < PORTANT SUR TOUTE INSTRUCTION
                                     < AUTRE QU'UN 'EOT' ; SI UN 'DO N'
                                     < A ETE EXECUTE, ELLE RENVERRA LES
                                     < VALEURS N-1, N-2,..., 2, 1, 0
                                     < AUXQUELLES AURONT ETE AJOUTEES
                                     < LA PARTIE GAUCHE DE L'OPERATEUR "=",
                                     < AINSI QUE L'OCTET QUI SUIT LA
                                     < FONCTION ELLE-MEME.
KOLDOF:: VAL         'F9             < CETTE FONCTION EST IDENTIQUE A LA
                                     < FONCTION 'KOLDO', MAIS PORTE SUR
                                     < LES ITERATIONS INTERRESSANTS LES
                                     < INSTRUCTIONS 'EOT'...
<
< DEFINITION DES FONCTIONS COMPLETES (SI NECESSAIRE) :
<
FCDO::   VAL         KOLF=FMASK+KOLDO=FVAL
                                     < AJOUTE A LA VALEUR DE L'EXPRESSION
                                     < SITUEE A GAUCHE DE "=" L'INDEX COURANT
                                     < DES ITERATIONS SUR INSTRUCTIONS DIF-
                                     < FERENTES DE 'EOT'.
FCDOF::  VAL         KOLF=FMASK+KOLDOF=FVAL
                                     < AJOUTE A LA VALEUR DE L'EXPRESSION
                                     < SITUEE A GAUCHE DE "=" L'INDEX COURANT
                                     < DES ITERATIONS SUR 'EOT'.
         PAGE
<
<
<        D E F I N I T I O N   D E S   F O N C T I O N S
<        D E   T E S T   D E S   S Y M B O L E S  :
<
<
<        FONCTION :
<                      CETTE FONCTION DE L'ASSEMBLEUR 'FOSYMB'
<                    PERMET, LUI TRANSMETTANT UN SYMBOLE PAR
<                    L'INTERMEDIAIRE D'UNE CARTE DYNAMIQUE,
<                    DE SAVOIR SI CE SYMBOLE EXISTE, ET SI
<                    OUI, DE QUEL TYPE IL EST, ET QUEL EST
<                    SON MODE DE REFERENCE.
<                      DE PLUS, LES SOUS-FONCTIONS RECEMMENT
<                    INTRODUITES ('FSXXXX') PERMETTENT DE
<                    CHANGER LE DESCRIPTEUR D'UN SYMBOLE,
<                    AUTORISANT PAR EXEMPLE LA MISE A
<                    L'ETAT 'INDEFINI' D'UN SYMBOLE TRANS-
<                    LATABLE DEJA DEFINI, ET DONC AINSI
<                    SA REDEFINITION ULTERIEURE ; CETTE
<                    APPLICATION S'ECRIRA PAR EXEMPLE :
<
<XXX:    VAL         MSYMBN?MSYMBM=FMASK+MSYMBN=FVAL(K+YYY=FOSYMM
<                    (OU 'YYY' DESIGNE UNE VARIABLE DEFINIE
<                    A L'AIDE DES MASQUES 'MSYMBI' ET 'MSYMBL'
<                    PRECISANT LA POSITION DU SYMBOLE DANS LA
<                    CARTE DYNAMIQUE COURANTE)
<
<                      AUTRE EXEMPLE: ON POURRA RENDRE
<                    UN SYMBOLE QUELCONQUE EQUIVALENT AU
<                    COMPTEUR D'ASSEMBLAGE "$" EN ECRIVANT :
<XXX:    VAL         MSYMBM=FMASK(K+YYY=FOSYMM
<                    (OU 'YYY' A LE MEME SENS QUE CI DESSUS,
<                    ET CONCERNE LE SYMBOLE A RENDRE
<                    EQUIVALENT AU "$").
<
<
<        NOTA IMPORTANT :
<                      BIEN EVIDEMMENT, LA PLUS GRANDE
<                    PRUDENCE SERA REQUISE LORS DE L'UTI-
<                    LISATION DE CES FONCTIONS !!!
<
<
FOSYMB:: VAL         'F7             < FONCTION DE GESTION D'UN SYMBOLE.
<
< DEFINITION DES SOUS-FONCTIONS :
<
FSSYMT:: VAL         '00             < PERMET DE TESTER L'ETAT DU SYMBOLE.
FSSYMM:: VAL         '01             < PERMET DE MODIFIER L'ETAT D'UN
                                     < SYMBOLE ARGUMENT (CARTE DYNAMIQUE).
<
< DEFINITION DES MASQUES DE DEUXIEME OPERANDE DE "=" :
<
KOLSYM:: VAL         M00FF           < DEFINITION DE LA SOUS-FONCTION.
<
< DEFINITION DES FONCTIONS COMPLETES :
<
XWOR%1:  VAL         KOLF=FMASK+FOSYMB=FVAL
FOSYMT:: VAL         KOLSYM=FMASK+FSSYMT=FVAL?XWOR%1
                                     < FONCTION DE TEST DE L'ETAT
                                     < DU SYMBOLE ARGUMENT.
FOSYMM:: VAL         KOLSYM=FMASK+FSSYMM=FVAL?XWOR%1
                                     < FONCTION DE MODIFICATION DE L'ETAT
                                     < DU SYMBOLE ARGUMENT.
FCSYMT:: VAL         FOSYMT          < DEFINITION DES
FCSYMM:: VAL         FOSYMM          < FONCTIONS-SYNONYMES.
<
< DEFINTION DES MASQUES DU PREMIER OPERANDE DE "=" :
<
MSYMBI:: VAL         MFF00           < DEFINITION DE L'INDEX DU PREMIER CARAC-
                                     < TERE DU SYMBOLE DANS LA ZONE DYNAMIQUE.
MSYMBL:: VAL         M00FF           < DEFINITION DU NOMBRE DE CARACTERES
                                     < DU SYMBOLE.
<
< RESULTAT : LA VALEUR RENVOYEE (A LAQUELLE A ETE
< AJOUTEE L'OCTET SUIVANT LA FONCTION 'FOSYMB'
< DANS LE DEUXIEME OPERANDE DE "=") EST LA
< SUPERPOSITION D'UN CERTAIN NOMBRE DE MASQUES
< DEFINIS CI-APRES ; ON NOTERA ENFIN QU'UNE
< VALEUR NULLE CORRESPOND A UN SYMBOLE INEXISTANT...
<
MSYMBX:: VAL         '8000           < CE MASQUE INDIQUE QU'UNE INDEXATION A
                                     < ETE DEMANDEE SUR CE SYMBOLE ALORS
                                     < QU'IL N'EST PAS ENCORE DEFINI.
MSYMB1:: VAL         '4000           < CE MASQUE, LORSQU'IL EST PRESENT
                                     < INDIQUE QUE LE SYMBOLE N'A ETE
                                     < REFERENCE EN AVANT QU'UNE SEULE
                                     < FOIS ; POUR LES REFERENCES EN
                                     < AVANT SUIVANTES, IL EST ABSENT,
                                     < AINSI QU'APRES SA DEFINITION.
MSYMBS:: VAL         '3F00           < CE MASQUE DONNE LE NUMERO DE SECTION
                                     < LORSQUE LE SYMBOLE EXISTE (DEFINI), ET
                                     < EST TRANSLATABLE ; UN NUMERO NUL
                                     < EST RENVOYE DANS LES AUTRES CAS...
MSYMBN:: VAL         '0080           < CE MASQUE SIGNIFIE QUE LE SYMBOLE
                                     < A ETE REFERENCE SANS ETRE ENCORE
                                     < DEFINI (IL SERA DONC TRANSLATABLE).
MSYMBA:: VAL         '0040           < CE MASQUE INDIQUE QUE LE SYMBOLE A
                                     < ETE DEFINI DE MANIERE ABSOLUE (DONC
                                     < PAR UNE DIRECTIVE 'VAL').
MSYMBR:: VAL         '0020           < CE MASQUE INDIQUE QUE LE SYMBOLE
                                     < A ETE REFERENCE PAR UNE DIREC-
                                     < TIVE 'REF'.
MSYMBD:: VAL         '0010           < CE MASQUE INDIQUE QUE LE SYMBOLE
                                     < EST TRANSLATABLE, ET DEJA DEFINI
                                     < DANS UNE 'DSEC'.
MSYMBC:: VAL         '0008           < CE MASQUE INDIQUE QUE LE SYMBOLE EST
                                     < DEJA CHAINE (IL EST RENCONTRE ASSOCIE
                                     < AU MASQUE 'MSYMBN').
MSYMBF:: VAL         '0004           < CE MASQUE INDIQUE QUE LE SYMBOLE A
                                     < ETE REFERENCE DANS UNE DIRECTIVE 'DEF'.
                                     < (QU'IL SOIT DEFINI, OU REFERENCE
                                     < EN AVANT).
MSYMBM:: VAL         '0003           < CE MASQUE DONNE LE NOMBRE DE MOTS
                                     < UTILISES POUR RANGER LE NOM DU
                                     < SYMBOLE ; BIEN QU'INUTILE, CE MASQUE
                                     < DEVRA TOUJOURS ETRE UTILISE LORS
                                     < DES DEFINITIONS DES MASQUES DE MODI-
                                     < FICATION DES ETATS DE SYMBOLES, PUISQU'
                                     < EN EFFET, LES FONCTIONS 'FMASK' ET 'FVAL'
                                     < PROVOQUENT UN CADRAGE A GAUCHE DE LA
                                     < VALEUR FONCTION DE LA POSITION DU
                                     < MASQUE DONNE.
         IF          MSYMBM=K-0,,XWOR%,
         IF          A T T E N T I O N  : LE MASQUE
         IF          'MSYMBM' DOIT ETRE CADRE A DROITE !!!
XWOR%:   VAL         0
SYMBX:   VAL         0               < CETTE VALEUR EST RENVOYEE LORSQUE LE
                                     < SYMBOLE EST INEXISTANT (NI DEFINI,
                                     < NI REFERENCE...).
         PAGE
<
<
<        D E F I N I T I O N   D E S   F O N C T I O N S
<        D E   C O N V E R S I O N S   H E X A - D E C I M A L E S  :
<
<
<        FONCTION :
<                      CES FONCTIONS DE L'ASSEMBLEUR,
<                    PERMETTENT DE CONVERTIR UN CHIFFRE
<                    ASCI HEXA-DECIMAL EN BINAIRE ('FOCAB'),
<                    OU BIEN UN OU DEUX CHIFFRES BINAIRES EN
<                    DEUX CARACTERES ASCI HEXA-DECIMAUX.
<                      DE PLUS, ELLES PERMETTENT DORENAVANT
<                    LA CONVERSION D'EXPRESSIONS ABSOLUES
<                    EN EXPRESSIONS TRANSLATABLES, ET
<                    INVERSEMENT...
<
<
FOCONV:: VAL         'FA             < FONCTION DE CONVERSION.
<
< DEFINITION DES SOUS-FONCTIONS :
<
FSBA::   VAL         '00             < CONVERSION DE UN OU DEUX CHIFFRES
                                     < BINAIRE EN DEUX CARACTERES ASCI.
FSAB::   VAL         '01             < CONVERSION D'UN CARACTERE ASCI HEXA-
                                     < DECIMAL EN BINAIRE.
FSTA::   VAL         '02             < CONVERSION TRANSLATABLE --> ABSOLU,
FSAT::   VAL         '03             < CONVERSION ABSOLU --> TRANSLATABLE.
<
< MASQUE DE SOUS-FONCTION :
<
KOLCON:: VAL         M00FF           < DEFINITION DU MASQUE DE SOUS-FONCTION
                                     < DANS L'OPERANDE DROIT DE "=".
<
< DEFINITION DES FONCTIONS COMPLETES :
<
XWOR%1:  VAL         KOLF=FMASK+FOCONV=FVAL
FOCBA::  VAL         KOLCON=FMASK+FSBA=FVAL?XWOR%1
                                     < CONVERSION DE UN OU DEUX CHIFFRES
                                     < BINAIRES EN DEUX CARACTERES ASCI.
FOCAB::  VAL         KOLCON=FMASK+FSAB=FVAL?XWOR%1
                                     < CONVERSION DE UN CARACTERE ASCI
                                     < EN UN NOMBRE BINAIRE.
FCBA::   VAL         FOCBA           < DEFINITION DES
FCAB::   VAL         FOCAB           < FONCTIONS-SYNONYMES.
FCTA::   VAL         KOLCON=FMASK+FSTA=FVAL?XWOR%1
                                     < FONCTION COMPLETE DE CONVERSION
                                     < TRANSLATABLE --> ABSOLU.
FCAT::   VAL         KOLCON=FMASK+FSAT=FVAL?XWOR%1
                                     < FONCTION COMPLETE DE CONVERSION
                                     < ABSOLU --> TRANSLATABLE.
         PAGE
<
<
<        V A L I D A T I O N   D E   ' Z E R O '  :
<
<
         IF          ZERO=FCTA-K,,XWOR%,
         IF          ATTENTION : TOUT VA MERDER LAMENTABLEMENT !!!
XWOR%:   VAL         0
         PAGE
<
<
<        F O N C T I O N   D E   R E F E R E N C E
<        A   U N E   I N S T R U C T I O N  :
<
<
<        FONCTION :
<                      CETTE FABULEUSE FONCTION PERMET
<                    D'APPLIQUER A UNE VALEUR CALCULEE
<                    UNE INSTRUCTION QUELCONQUE DU LANGAGE
<                    MACHINE.
<                      ON NOTERA QUE LES REGISTRES DE L'ASSEMBLEUR
<                    AVANT L'EXECUTION DE CETTE INSTRUCTION
<                    SONT AINSI POSITIONNES :
<                    'A' <-- L'OPERANDE GAUCHE DE "=",
<                    'B' <-- 0,
<                    'X' <-- 0,
<                    'Y' <-- L'OCTET SUIVANT LA FONCTION 'FOINST.
<                      L'INSTRUCTION A EXECUTER AURA ETE DEFINIE
<                    PAR SA VALEUR, DANS LA MEME EXPRESSION
<                    PAR LA FONCTION 'FMASK' (ET OUI !?!?!??).
<                      APRES EXECUTION, L'ASSEMBLEUR EFFECTUERA
<                    LES OPERATIONS SUIVANTES :
<                    'A' <-- ('A').EOR.('B'),
<                    'A' <-- ('A').EOR.('X'),
<                    PERMETTANT SI L'INSTRUCTION EXECUTEE NE
<                    MODIFIE QUE L'UN DES 3 REGISTRES 'A',
<                    'B' OU 'X' DE RECUPERER CE RESULTAT DANS
<                    LE REGISTRE 'A', PUIS DANS L'EXPRESSION
<                    COURANTE EN FAISANT EVENTUELLEMENT UN
<                    'EOR' PERMETTANT DE RE-SEPARER LE BON
<                    RESULTAT.
<
<
FOINST:: VAL         'FB             < FONCTION D'EXECUTION DE L'INSTRUCTION
                                     < DONT LE CODE EST DONNE PAR L'OPERANDE
                                     < GAUCHE DE L'OPERATEUR "=".
KOLY::   VAL         M00FF           < DEFINITION DU MASQUE PERMETTANT
                                     < DE DONNER L'OCTET A METTRE AU PREALABLE
                                     < DANS LE REGISTRE 'Y'.
<
< DEFINITION DE LA FONCTION COMPLETE (SI NECESSAIRE) :
<
FCINST:: VAL         KOLF=FMASK+FOINST=FVAL
                                     < EXECUTION DE L'INSTRUCTION DONT LE
                                     < CODE EST DONNE PAR L'OPERANDE GAUCHE
                                     < DE "=", AVEC 'Y' <-- 0.
<
<
<        Q U E L Q U E S   I N S T R U C T I O N S
<                    U T I L E S  :
<
<
<        NOTA :
<                      LES INSTRUCTIONS DEFINIES CI-DESSOUS
<                    TRANSFORMENT LE CONTENU DU REGISTRE 'A'
<                    EN GENERAL ; ON NOTERA POUR 'COSBT',
<                    'CORBT' ET 'COIBT', POUR ATTEINDRE
<                    UN BIT DE RANG DIFFERENT DE '0', IL
<                    SUFFIT D'AJOUTER CE RANG AU CODE
<                    DE L'INSTRUCTION...
<
<
         PROG
XWOR%1:  VAL         $-ZERO          < SAUVEGARDE DU "$", EN EFFET ON VA
                                     < GENERER DU CODE INUTILE...
         SLLS        K
COSLLS:: VAL         '0000000@@@@    < DECALAGE LOGIQUE A GAUCHE SIMPLE.
         SLRS        K
COSLRS:: VAL         '0000000@@@@    < DECALAGE LOGIQUE A DROITE SIMPLE.
         SCLS        K
COSCLS:: VAL         '0000000@@@@    < DECALAGE CIRCULAIRE A GAUCHE SIMPLE.
         SCRS        K
COSCRS:: VAL         '0000000@@@@    < DECALAGE CIRCULAIRE A DROITE SIMPLE.
         SARS        K
COSARS:: VAL         '0000000@@@@    < DECALAGE ARITHMETIQUE A DROITE SIMPLE.
         WORD        '1E45
COIDES:: VAL         '0000000@@@@    < RECUPERATION DE L'IDENTIFICATEUR
                                     < SYSTEME A L'ASSEMBLAGE ('IDESC').
         WORD        '1E15
COGETM:: VAL         '0000000@@@@    < ACCES ABSOLU A LA MEMOIRE, 'BITX'
                                     < PERMETTANT DE DISCRIMINER LES 'NSP'
                                     < DES ADRESSES MEMOIRE ABSOLUES.
         SWBR        A,A
COSWBR:: VAL         '0000000@@@@    < PERMUTATION DES OCTETS DE 'A'.
         SBT         L
COSBT::  VAL         '0000000@@@@    < MISE A '1' DU BIT '0' DE 'A'.
         RBT         L
CORBT::  VAL         '0000000@@@@    < MISE A '0' DU BIT '0' DE 'A'.
         IBT         L
COIBT::  VAL         '0000000@@@@    < INVERSION DU BIT '0' DE 'A'.
         DBT
CODBT::  VAL         '0000000@@@@    < MISE DANS LE REGISTRE 'X', DU NUMERO
                                     < DU PREMIER BIT A '1' DANS 'A'.
         CMR         A,A
COCMR::  VAL         '0000000@@@@    < COMPLEMENT LOGIQUE DU REGISTRE 'A'.
<
< ANNULATION DU CODE GENERE :
<
XWOR%2:  VAL         $-ZERO
XWOR%2:  VAL         XWOR%2-XWOR%1   < LONGUEUR DU CODE GENERE...
         $EQU        ZERO+XWOR%1
         DZS         XWOR%2          < ON LE REMET A '0000, ET ON RECULE :
         $EQU        ZERO+XWOR%1     < ET VOILA...
         PAGE
<
<
<        F O N C T I O N S   D E   ' T M O B T '  :
<
<
FONTB::  VAL         0               < TEST BIT,
FONSB1:: VAL         '0@@@@+I        < SET BIT AVEC VERIFICATION,
FONRB0:: VAL         '0@@@@+I        < RESET BIT AVEC VERIFICATION,
FONIB::  VAL         '0@@@@+I        < INVERSION BIT,
FONRB::  VAL         '0@@@@+I        < RESET BIT,
FONSB::  VAL         '0@@@@+I        < SET BIT.
         PAGE
<
<
<        F O N C T I O N   D ' E X E C U T I O N
<        D ' U N   S O U S - P R O G R A M M E
<        G E N E R E   D Y N A M I Q U E M E N T  :
<
<
<        FONCTION :
<                      CETTE FONCTION AUX POSSIBILITES
<                    INSOUPCONNEES, PERMET D'EXECUTER
<                    UN SOUS-PROGRAMME GENERE EN LANGAGE
<                    BINAIRE DANS LA CARTE DYNAMIQUE ;
<                    CETTE GENERATION AURA ETE FAITE
<                    AU PREALABLE A L'AIDE D'APPLICA-
<                    TIONS DE LA FONCTION 'KOLSTO' QUI
<                    PERMET DE METTRE UN OCTET QUELCONQUE
<                    EN UN ENDROIT QUELCONQUE DU CODE
<                    DE L'ASSEMBLEUR (ET EN PARTICULIER
<                    DANS LA CARTE DYNAMIQUE).
<                      CE SOUS-PROGRAMME EST APPELE PAR
<                    UN 'BSR' EXECUTE PAR L'ASSEMBLEUR,
<                    L'ADRESSE DU SOUS-PROGRAMME ETANT
<                    EGALE A L'ADRESSE DE LA CARTE DYNA-
<                    MIQUE TRANSLATEE DE LA VALEUR DE
<                    L'OCTET SUIVANT LA FONCTION 'FOEXSP'
<                    (TOUTES ADRESSES EXPRIMEES EN MOTS).
<                      DE PLUS, CE SOUS-PROGRAMME RECOIT
<                    COMME ARGUMENT DANS LE REGISTRE 'A'
<                    L'OPERANDE GAUCHE DE "=". AU RETOUR
<                    L'ASSEMBLEUR SUPPOSE QUE LE REGISTRE
<                    'A' CONTIENT LE RESULTAT QU'IL AFFECTERA
<                    A L'EXPRESSION COURANTE.
<                      BIEN ENTENDU, CE SOUS-PROGRAMME
<                    DOIT SE TERMINER PAR UN 'RSR'...
<
<
FOEXSP:: VAL         'FC             < FONCTION D'EXECUTION D'UN SOUS-
                                     < PROGRAMME DYNAMIQUE.
KOLSP::  VAL         M00FF           < DEFINITION DU MASQUE PERMETTANT DE
                                     < DONNER LA TRANSLATION A OPERER SUR
                                     < L'ADRESSE DE LA CARTE DYNAMIQUE POUR
                                     < OBTENIR LE POINT D'ENTREE DU SOUS-
                                     < PROGRAMME.
<
< DEFINITION DE LA FONCTION COMPLETE (SI NECESSAIRE) :
<
FCEXSP:: VAL         KOLF=FMASK+FOEXSP=FVAL
         PAGE
<
<
<        P U S H / P U L L  :
<
<
<        FONCTION :
<                      CES 2 FONCTIONS COMPLETES PERMETTENT
<                    D'ATTEINDRE LES FONCTIONS D'EMPILEMENT
<                    ('PUSH')/DEPILEMENT ('PULL') DE L'ASSEM-
<                    BLEUR ; LE 'PUSH' PERMET DE SAUVEGARDER
<                    LA VALEUR DE L'EXPRESSION SITUEE A
<                    GAUCHE DE "=", ALORS QUE 'PULL' AJOUTE
<                    A L'EXPRESSION COURANTE L'ENTREE COURANTE
<                    DE LA PILE (ON NOTERA QUE POUR FAIRE UN
<                    DEPILEMENT SANS ADDITION, IL SUFFIT QUE
<                    L'OPERANDE GAUCHE DE "=" AIT UNE VALEUR
<                    NULLE).
<
<
FOPILE:: VAL         'FE             < FONCTION GENERALE D'EMPILEMENT
                                     < ET DE DEPILEMENT.
<
< SOUS-FONCTIONS :
<
FSPUSH:: VAL         '00             < EMPILEMENT DE LA PARTIE GAUCHE DE "=".
FSPULL:: VAL         '01             < DEPILEMENT, ET ADDITION A LA PARTIE
                                     < GAUCHE DE "=".
FSPEXU:: VAL         '02             < DEPILEMENT ; L'OPERANDE GAUCHE DE
                                     < L'OPERATEUR "=" SUBSISTE, ALORS
                                     < QUE LA PARTIE IMMEDIATEMENT A DROITE
                                     < (C'EST-A-DIRE LA FONCTION 'FCPEXU')
                                     < EST REMPLACEE PAR LA VALEUR DEPILEE ;
                                     < L'OPERATEUR "=" EST ENSUITE REINTER-
                                     < PRETE ; AINSI ON 'EXECUTE' LA VALEUR
                                     < DEPILEE...
<
< MASQUE DE SOUS-FONCTION :
<
KOLPIL:: VAL         M00FF           < LA SOUS-FONCTION EST DONNEE A LA SUITE
                                     < DE LA FONCTION.
<
< DEFINITION DES FONCTIONS COMPLETES :
<
XWOR%1:  VAL         KOLF=FMASK+FOPILE=FVAL
FOPUSH:: VAL         KOLPIL=FMASK+FSPUSH=FVAL?XWOR%1
                                     < EMPILEMENT DE LA PARTIE GAUCHE DE "=".
FOPULL:: VAL         KOLPIL=FMASK+FSPULL=FVAL?XWOR%1
                                     < DEPILEMENT, ET ADDITION A LA PARTIE
                                     < GAUCHE DE "=".
FOPEXU:: VAL         KOLPIL=FMASK+FSPEXU=FVAL?XWOR%1
                                     < DEPILEMENT, PUIS RE-EXECUTION DE "=",
                                     < AVEC COMME OPERANDE DROIT LA VALEUR
                                     < DEPILEE.
FCPUSH:: VAL         FOPUSH          < DEFINITION DES
FCPULL:: VAL         FOPULL          < FONCTIONS-SYNONYMES.
FCPEXU:: VAL         FOPEXU
         PAGE
<
<
<        R E S T E   D ' U N E   D I V I S I O N  :
<
<
<        FONCTION :
<                      CETTE FONCTION PERMET DE RECU-
<                    PERER LE RESTE DE LA DERNIERE
<                    DIVISION ENTIERE EFFECTUEE DANS
<                    L'EXPRESSION COURANTE, OU BIEN
<                    UNE VALEUR NULLE S'IL N'Y A PAS
<                    EU DE DIVISION ; CE RESTE EST
<                    AJOUTE A LA PARTIE GAUCHE DE "=",
<                    AINSI QU'A L'OCTET SUIVANT L'OCTET
<                    DE FONCTION.
<
<
FOREST:: VAL         'FD             < RESTE D'UNE DIVISION ENTIERE.
<
< DEFINITION DE LA FONCTION COMPLETE (SI NECESSAIRE) :
<
FCREST:: VAL         KOLF=FMASK+FOREST=FVAL
         PAGE
<
<
<        S I G N E   D ' U N E   E X P R E S S I O N  :
<
<
<        FONCTION :
<                      CETTE FONCTION PERMET DE CALCULER
<                    LE SIGNE DE L'EXPRESSION FIGURANT A
<                    GAUCHE DE "=" ; CE SIGNE EST DONNE
<                    PAR UNE VALEUR NUMERIQUE ('SIGN.'),
<                    AUQUEL EST AJOUTE L'OCTET SUIVANT
<                    L'OCTET DE FONCTION.
<
<
FOSIGN:: VAL         'FF             < SIGNE DE LA PARTIE GAUCHE DE "=".
<
< DEFINITION DE LA FONCTION COMPLETE (SI NECESSAIRE) :
<
FCSIGN:: VAL         KOLF=FMASK+FOSIGN=FVAL
<
< DEFINITION NUMERIQUE DU SIGNE :
<
SIGNM::  VAL         -1              < L'EXPRESSION FIGURANT A GAUCHE DE "="
                                     < EST NEGATIVE (STRICTEMENT).
SIGN0::  VAL         0               < CETTE EXPRESSION EST NULLE.
SIGNP::  VAL         +1              < CETTE EXPRESSION EST STRICTEMENT
                                     < POSITIVE.
         PAGE
<
<
<        C A R A C T E R E S   H E X A - D E C I M A U X  :
<
<
HZERO::  VAL         0=FCBA(MOCD        < 0,
HNEUF::  VAL         BASE10-Z=FCBA(MOCD < 9,
HA::     VAL         BASE10=FCBA(MOCD   < A,
HF::     VAL         BASE16-Z=FCBA(MOCD < F.
<
<        C O N F I G U R A T I O N   P E R I P H E R I Q U E  :
<
XXBRAC:: VAL         4               < INDICATEUR DES ARGUMENTS DE 'SIO' INDI-
                                     < QUANT QUE LE COUPLEUR CORRESPONDANT
                                     < EST IN (0) / HORS (1) RACK...
XWOR%9:  VAL         COSBT           < HORS-RACK A PRIORI...
INRACK: @
<
< TESTONS L'EXISTENCE DU SYMBOLE 'INRACK' ???
< S'IL EXISTE, ON ADMET QUE LES COUPEURS SONT
< IN-RACK, SINON, HORS-RACK :
<
XWOR%1:  VAL         KOLF=FMASK+KOLTES=FVAL
XWOR%1:  VAL         KOLC=FMASK+KDP=FVAL?XWOR%1
XWOR%2:  VAL         KOLTED=FMASK+KOL0=FVAL
XWOR%2:  VAL         KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2
XWOR%3:  VAL         XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE 'INRACK'...
XWOR%4:  VAL         MSYMBI=FMASK+KOL0=FVAL
XWOR%4:  VAL         MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4
         IF          XWOR%4=FCSYMT-SYMBX,,XWOR%,
XWOR%9:  VAL         CORBT           < ET BIEN NON, 'IN-RACK'...
         IDP         "VERSION IN-RACK !"
XWOR%:   VAL         0
         IF          XWOR%9-COSBT,XWOR%,,XWOR%
         IDP         "VERSION OUT-RACK !"
XWOR%:   VAL         0
OFFRAC:: VAL         XWOR%9?XXBRAC=FMASK(K=FCINST
                                     < GENERATION DE L'INDICATEUR IN/HORS-RACK,
                                     < SUIVANT QUE LE SYMBOLE 'INRACK' EXISTE
                                     < OU PAS...
<
<        LISTE DES COUPLEURS UTILISES.
<
ACCR1::  VAL         '10             < LECTEUR DE CARTES 1.
ACCR1:   VAL         ACCR1+OFFRAC
ACDKF::  VAL         '38             < DISQUE A TETES FIXES.
ACDKF:   VAL         ACDKF+OFFRAC
ACDKM::  VAL         '30             < DISQUE A TETES MOBILES.
ACDKM:   VAL         ACDKM+OFFRAC
ACPUP:   VAL         '17F0           < PUPITRE.
<
<        F O N C T I O N   P E R I P H E R I Q U E S  :
<
FPHIN::  VAL         '0              < ENTREE INFORMATION.
FPHOUT:: VAL         '1              < SORTIE INFORMATION.
FPHETA:: VAL         '2              < ENTREE ETAT.
FPHCMD:: VAL         '3              < SORTIE COMMANDE.
FPHDUM:: VAL         '4
FPHSAD:: VAL         '5              < SORTIE ADRESSE DISQUE...
FPHETB:: VAL         '6              < ENTREE MOT D'ETAT B.
FPHCME:: VAL         '7              < SORTIE COMMANDE...
MNUPRO:: VAL         '0003           < NUMERO D'UN PROCESSEUR SUR UN
                                     < BUS MEMOIRE DE NUMERO DONNE
                                     < PAR 'MNUBUS' (DONNE PAR 'RDSI'
                                     < DANS A).
MNUBUS:: VAL         '001C           < NUMERO D'UN BUS MEMOIRE DANS
                                     < LE SYSTEME (DONNE PAR 'RDSI'
                                     < DANS A).
         IF          MNUBUS?MNUPRO=K-0,,XWOR%,
         IF          ATTENTION : ETANT DONNEES LES OPERATIONS
         IF          REALISEES SUR LES NUMEROS DE PROCESSEUR,
         IF          IL FAUT QUE CE MASQUE SOIT CADRE A DROITE !!!
XWOR%:   VAL         0
MSBOOT:: VAL         '00E0           < POSITION DU SELECTEUR DE
                                     < BOOTSTRAP (DONNE PAR 'RDSI'
                                     < DANS A).
MTYPRO:: VAL         '0300           < TYPE DU PROCESSEUR (DONNE PAR
                                     < 'RDSI' DANS 'A').
<
<        D E C A L A G E S   A S S O C I E S  :
<
DNUPRO:: VAL         MNUPRO=K        < DECALAGE D'ACCES AU NUMERO
                                     < D'UN PROCESSEUR SUR UN BUS
                                     < MEMOIRE (INSTRUCTION 'RDSI').
DNUBUS:: VAL         MNUBUS=K        < DECALAGE D'ACCES AU NUMERO
                                     < D'UN BUS MEMOIRE (INSTRUC-
                                     < TION 'RDSI').
DSBOOT:: VAL         MSBOOT=K        < DECALAGE D'ACCES A LA POSITION
                                     < DU SELECTEUR DE BOOTSTRAP
                                     < (INSTRUCTION 'RDSI').
DTYPRO:: VAL         MTYPRO=K        < DECALAGE D'ACCES AU TYPE DU
                                     < PROCESSEUR (INSTRUCTION
                                     < 'RDSI').
         PAGE
<
<
<        P A R A M E T R E S   D ' E / S  :
<
<
<        F O N C T I O N S  :
<
<
FGR::    VAL         0               < FONCTION DE LECTURE,
FGW::    VAL         2               < FONCTION D'ECRITURE.
XBITQ::  VAL         12              < BIT INDIQUANT POUR LE 'DKM' LA
                                     < VALEUR A DONNER A 'QUANTA' :
                                     < =1 POUR 1, =3 POUR 0.
FGRQ::   VAL         COSBT?XBITQ=FMASK(K+FGR=FCINST
                                     < LECTURE 'DKM' AVEC QUANTA=1.
FGWQ::   VAL         COSBT?XBITQ=FMASK(K+FGW=FCINST
                                     < ECRITURE 'DKM' AVEC QUANTA=1.
FGSGNA:: VAL         '2              < FONCTION COMMUNE A TOUS LES HANDLERS
                                     < 'SGN' LORSQUE LES <ACN> DOIVENT
                                     < ETRE CONCATENES AUX <NOMS>.
FGSGN::  VAL         'A              < FONCTION COMMUNE A TOUS LES HANDLERS
                                     < 'SGN' LORSQU'IL N'Y A PAS DE CONCA-
                                     < TENATION AUTOMATIQUE.
FGSGNN:: VAL         -1              < 'ASDEM' D'ACCES AU 'SGN' LORSQUE
                                     < LA <VALEUR> SUIT IMMEDIATEMENT
                                     < LE <NOM>.
FGID::   VAL         '2              < FONCTION D'INSERT/DELETE DE 'HDLTRI'.
FGT::    VAL         'A              < FONCTION DE TEST DE 'HDLTRI'.
<
<
<        P A R A M E T R E S  :
<
<
TYPITX:: VAL         1               < INDICATEUR 'INTERRUPTION EXCEPTION'.
TYPITN:: VAL         0               < INDICATEUR 'INTERRUPTION NORMALE'.
BITPAR:: VAL         8               < BIT DE PARITE CARACTERE DANS UN MOT.
         PAGE
<
<
<        R E G I S T R E   D ' E T A T   D ' U N
<                    C O U P L E U R  :
<
<
<        DEFINITION :
<                      LE REGISTRE D'ETAT D'UN COUPLEUR
<                    EST UN REGISTRE ACCESSIBLE A L'AIDE
<                    D'UNE 'SIO' D'ENTREE ETAT ; LES BITS
<                    QU'IL CONTIENT SONT DES INDICATEURS
<                    DE L'ETAT DU COUPLEUR.
<
<
ETADEF:: VAL         0               < SOMME DES INDICATEURS DE DEFAUTS
                                     < REELS (EXCLUE DONC LA FIN D'ECHANGE).
ETACAD:: VAL         1               < ERREUR DE CADENCE EN ENTREE
                                     < COMME EN SORTIE.
ETAPAR:: VAL         2               < INFORMATION INCORRECTE (PARITE,
                                     < CHECKSUM,...).
ETAVIO:: VAL         3               < TENTATIVE DE VIOL (OH,... PROTECTION
                                     < D'ECRITURE,... AH BON...).
ETADOG:: VAL         5               < CHIEN DE GARDE (OUAH, OUAH...) ;
                                     < HEUREUSEMENT, IL EST PAS MECHANT...
ETABRK:: VAL         6               < APPEL OPERATEUR (BREAK,...).
ETAFBS:: VAL         7               < FIN DE BLOC EN SORTIE POUR LES VOIES
                                     < FULL DUPLEX UNIQUEMENT.
ETARIL:: VAL         8               < LE REGISTRE D'INFORMATION EST LIBRE
                                     < EN SORTIE, IL PEUT RECEVOIR LA DONNEE
                                     < SUIVANTE : NE VAUT QUE POUR LES LIGNES
                                     < FULL DUPLEX.
ETAS0::  VAL         11              < UTILISE POUR DKM/DKU POUR LES
                                     < SYNCHRONISATIONS SUR SECTEUR 0...
ETAPIV:: VAL         12              < INFORMATION VALIDE LORS DE L'UTILI-
                                     < SATION DU PUPITRE !!!
ETAFBK:: VAL         13              < FIN DE BLOC EN ENTREE COMME EN SORTIE ;
                                     < MAIS FIN DE BLOC EN ENTREE UNIQUEMENT
                                     < POUR LES LIGNES FULL DUPLEX.
ETANXT:: VAL         14              < EN ENTREE, LE REGISTRE INFORMATION
                                     < CONTIENT LA DONNEE SUIVANTE, ALORS
                                     < QU'EN SORTIE, IL PEUT RECEVOIR LA
                                     < SUIVANTE (LA SIGNIFICATION 'EN
                                     < SORTIE' N'A PAS DE SENS POUR LES
                                     < LIGNES FULL DUPLEX.
ETAOPE:: VAL         15              < LE COUPLEUR EST OPERATIONNEL : IL EST
                                     < PRESENT, SOUS TENSION ET TOUT
                                     < ET TOUT...
<
< DEFINITION DES MASQUES ASSOCIES :
<
XWOR%:   VAL         NBITMO-B-ETADEF
MTADEF:: VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'ETADEF'.
XWOR%:   VAL         NBITMO-B-ETACAD
MTACAD:: VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'ETACAD'.
XWOR%:   VAL         NBITMO-B-ETAPAR
MTAPAR:: VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'ETAPAR'.
XWOR%:   VAL         NBITMO-B-ETAVIO
MTAVIO:: VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'ETAVIO'.
XWOR%:   VAL         NBITMO-B-ETADOG
MTADOG:: VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'ETADOG'.
XWOR%:   VAL         NBITMO-B-ETABRK
MTABRK:: VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'ETABRK'.
XWOR%:   VAL         NBITMO-B-ETAFBS
MTAFBS:: VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'ETAFBS'.
XWOR%:   VAL         NBITMO-B-ETARIL
MTARIL:: VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'ETARIL'.
XWOR%:   VAL         NBITMO-B-ETAFBK
MTAFBK:: VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'ETAFBK'.
XWOR%:   VAL         NBITMO-B-ETANXT
MTANXT:: VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'ETANXT'.
XWOR%:   VAL         NBITMO-B-ETAOPE
MTAOPE:: VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'ETAOPE'.
<
<
<        R E G I S T R E   D E   C O M M A N D E
<              D ' U N   C O U P L E U R  :
<
<
<        DEFINITION :
<                      LE REGISTRE DE COMMANDE D'UN COUPLEUR
<                    EST ACCESSIBLE PAR UNE 'SIO' DE SORTIE
<                    DE COMMANDE, ET PERMET DE REALISER AVEC
<                    LE COUPLEUR LES OPERATIONS N'IMPLIQUANT
<                    PAS DE TRANSFERT DE DONNEES.
<
<
COM8::   VAL         8               < UTILISE PAR 'CR' ET 'DKM'...
COM10::  VAL         10              < UTILISE PAR 'DKM'...
COMRW::  VAL         9               < INDIQUE LE SENS D'UN TRANSFERT DE
                                     < DONNEES :
                                     < COMRW=COMR=K : LECTURE D'INFORMATIONS,
                                     < COMRW=COMW=1 : ECRITURE D'INFORMATIONS.
COMR::   VAL         0               < LECTURE D'INFORMATIONS,
COMW::   VAL         1               < ECRITURE D'INFORMATIONS.
COMINI:: VAL         11              < DEMANDE D'INITIALISATION D'UN COUPLEUR.
COMFBK:: VAL         12              < DEMANDE DE FIN DE BLOC.
COMSTR:: VAL         13              < DEMANDE DE LANCEMENT D'UN ECHANGE.
                                     < ('START')
COMTST:: VAL         14              < MISE DU COUPLEUR EN MODE TEST.
COMINT:: VAL         15              < DEMANDE DE VALIDATION DES INTERRUPTIONS.
<
< MASQUES ASSOCIES AUX BITS DU REGISTRE DE COMMANDE :
<
XWOR%:   VAL         NBITMO-B-COM8
MOM8::   VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'COM8'.
XWOR%:   VAL         NBITMO-B-COM10
MOM10::  VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'COM10'.
XWOR%:   VAL         NBITMO-B-COMRW
MOMRW::  VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'COMRW'.
XWOR%:   VAL         NBITMO-B-COMINI
MOMINI:: VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'COMINI'.
XWOR%:   VAL         NBITMO-B-COMFBK
MOMFBK:: VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'COMFBK'.
XWOR%:   VAL         NBITMO-B-COMSTR
MOMSTR:: VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'COMSTR'.
XWOR%:   VAL         NBITMO-B-COMTST
MOMTST:: VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'COMTST'.
XWOR%:   VAL         NBITMO-B-COMINT
MOMINT:: VAL         BIT>XWOR%       < MASQUE ASSOCIE A 'COMINT'.
<
<
<        D E F I N I T I O N   D U   R E G I S T R E   ' S T '  :
<
<
<
<
<        D E F I N I T I O N   D U   R E G I S T R E   ' S '
<        ( R E G I S T R E   E T A T   D E   T A C H E )
<
<
<        FONCTION :
<                      LE REGISTE 'S' (APPELE 'SS' DANS 'PSTS',
<                    ET 'HS' DANS 'PSTH') EST UN SOUS-ENSEMBLE
<                    DU REGISTRE 'ST' D'ETAT DU PROCESSEUR; A
<                    LA DIFFERENCE DE 'ST', 'S' APPARTIENT A LA
<                    'PST' D'UNE TACHE ('PSTIJ' OU 'PSTH').
<                      'S' VA ETRE DEFINI BIT A BIT :
<
<
MS::     VAL         0               < BIT DE MODE D'EXECUTION DE LA
                                     < TACHE :
                                     < MS=K : MODE ESCLAVE,
                                     <   =1 : MODE MAITRE.
MODMST:: VAL         1               < 'MODE MAITRE' (CF. 'MS').
MODESC:: VAL         0               < 'MODE ESCLAVE' (CF. 'MS').
SVCS::   VAL         1               < SVCS EST MIS A 1 LORSQU'UN 'SVC'
                                     < EST EXECUTE EN MODE ESCLAVE, ET
                                     < EST REMIS A 0 LORSQU'UN 'RSV'
                                     < EST EXECUTE; SVCS S'IL EST A 1
                                     < EN MODE MAITRE PERMET L'ACTIVA-
                                     < TION DE 'DRPS' LORS DE L'EXECUTION
                                     < DES INSTRUCTIONS 'PSR', 'PLR',
                                     < 'BSR', 'RSR', 'SVC' ET 'RSV'.
V::      VAL         6               < V=1 : - S'IL Y A DEBORDEMENT LORS
                                     <       D'INSTRUCTIONS ARITHMETIQUES
                                     <       SUR DES ENTIERS ALGEBRIQUES
                                     <       (DE -32768 A +32767),
                                     <       - SI 2 QUANTITES SONT EGALES
                                     <       APRES UNE INSTRUCTION DE
                                     <       COMPARAISON,
                                     <       - LORS D'UN PASSAGE A '0000
                                     <       PAR 'IC' OU 'DC'.
C::      VAL         7               < C=1 : - S'IL Y A REPORT LORS D'INS-
                                     <       TRUCTIONS ARITHMETIQUES
                                     <       SUR DES ENTIERS POSITIFS
                                     <       (DE 0 A +65535),
                                     <       - SI LE PREMIER TERME D'UNE
                                     <       COMPARAISON EST ALGEBRIQUE-
                                     <       MENT INFERIEUR AU SECOND (LE
                                     <       BIT0 ETANT ALORS LE BIT
                                     <       DE SIGNE).
SMST::   VAL         COSBT?MS=FMASK(K=FCINST
                                     < REGISTRE 'S' EN MODE MAITRE...
<
<
<        C A S   D E   L A   T A C H E   A L A R M E  :
<
<
MALARM:: VAL         MOCD            < LE CHAMP 'MALARM' DE LA 'PSTH'
                                     < DE LA TACHE ALARME (TACHE HARWARE 0)
                                     < CONTIENT LE NUMERO DE L'ALARME
                                     < EN CAUSE :
ALMX::   VAL         '00             < MEMOIRE INEXISTANTE.
ALPRO::  VAL         '01             < PROTECTION 'DRPS' OU 'CDA'.
ALPAR::  VAL         '02             < ERREUR DE PARITE HORS DU
                                     < MODE 'DEBUG'.
ALIX::   VAL         '03             < INSTRUCTION INEXISTANTE.
ALIP::   VAL         '04             < INSTRUCTION PRIVILEGIEE EN
                                     < MODE ESCLAVE.
ALSCH::  VAL         '05             < 'RQST', 'WAIT' OU 'QUIT' EXECUTEE
                                     < SOUS NIVEAU HARDWARE.
ALIPIX:: VAL         '06             < RECEPTION D'UN 'IPI' DE REVEIL
                                     < INTER-PROCESSEUR.
ALSTEP:: VAL         '07             < 'STEP'.
ALARR::  VAL         '08             < POINT D'ARRET EN MODE 'DEBUG'.
ALACTD:: VAL         '09             < 'ACTD'.
<
<
<        D E F I N I T I O N   D U   R E G I S T R E   S T  :
<        ( R E G I S T R E   E T A T   P R O C E S S E U R )
<
<
<        NOTA IMPORTANT :
<                      LE REGISTRE 'ST' NE PARTICIPE PAS
<                    GLOBALEMENT AUX CHANGEMENTS DE CONTEXTES
<                    GLOBAUX OU PARTIELS; SEULS SES SOUS-
<                    ENSEMBLES 'SS' ET 'ST' Y PARTICIPENT !!!
<
<
<                      'ST' VA ETRE DEFINI BIT A BIT :
<
<
MS:      VAL         MS              < VOIR LE REGISTRE 'S'.
MODMST:  VAL         MODMST          < VOIR LE REGISTRE 'S'.
MODESC:  VAL         MODESC          < VOIR LE REGISTRE 'S'.
SVCS:    VAL         SVCS            < VOIR LE REGISTRE 'S'.
                                     < A T T E N T I O N  : DANS CERTAINS
                                     < CAS, 'SVCS' SERA APPELE 'SAUV'
                                     < DANS LE REGISTRE 'ST' : VOIR A
                                     < CE SUJET LA DEFINITION DE 'SCHED' !!!
V:       VAL         V               < VOIR LE REGISTRE 'S'.
C:       VAL         C               < VOIR LE REGISTRE 'S'.
LCM::    VAL         3               < LCM=1 : LES INTERRUPTIONS
                                     <         DU CANAL 'LDC' SONT
                                     <         MASQUEES.
IPM::    VAL         4               < IPM=1 : LES INTERRUPTIONS
                                     <         INTERPROCESSEURS (PAR
                                     <         'IPI') SONT MASQUEES.
IOM::    VAL         5               < IOM=1 : TOUTES LES INTERRUPTIONS
                                     <         SONT MASQUEES Y COM-
                                     <         PRIS LE DEFAUT SECTEUR,
                                     <         MAIS A L'EXCEPTION
                                     <         DES 'IPI' !!!
DEBUG::  VAL         8               < DEBUG=1 : LES ERREURS DE
                                     <           PARITE MEMOIRE SONT
                                     <           INTERPRETEES COMME DES
                                     <           POINTS D'ARRET.
MAINT::  VAL         10              < MAINT=1 : LES ERREURS DE PARITE
                                     <           SONT IGNOREES...
SCHED::  VAL         11              < SCHED=1 : LE PROCESSEUR A ETE
                                     <           INTERROMPU DANS LE
                                     <           MICRO-SCHEDULER, ET
                                     <           ALORS 'SVCS' SIGNIFIE :
                                     < SVCS=1 : LA SAUVEGARDE DU CONTEXTE
                                     <          DE LA TACHE SOFTWARE
                                     <          ABANDONNEE N'A PAS ETE
                                     <          FAITE (ENCORE DANS LES
                                     <          REGISTRES ET DANS LE
                                     <          CONTEXTE PARTIEL DE LA
                                     <          TACHE HARD COURANTE,
                                     <     =K : LA SAUVEGARDE A ETE
                                     <          FAITE;
                                     < NOTA : A CETTE OCCASION, ON
                                     < APPELLERA 'SVCS' : 'SAUV' ==>
SAUV::   VAL         SVCS            < VOIR CE QUI PRECEDE !!!
STOP::   VAL         12              < STOP=1 : LE PROCESSEUR EST A
                                     <          L'ETAT ARRET PROGRAMME.
WARNG::  VAL         13              < WARNG=1 : UN DEFAUT SECTEUR EST EN
                                     <           COURS DE TRAITEMENT.
POP::    VAL         14              < IL FAUT QUE DEBUG=1; ALORS ::
                                     < POP=1 : LES POINTS D'ARRET
                                     <         PROVOQUENT L'ARRET DU
                                     <         PROCESSEUR (MISE AU POINT
                                     <         PUPITRE),
                                     <    =K : LES POINTS D'ARRET
                                     <         PROVOQUENT DES ALARMES
                                     <         (MISE AU POINT PROGRAMME).
XWOR%:   VAL         NBITMO-B-IOM
MIOM::   VAL         BIT>XWOR%       < MASQUE DU BIT 'IOM'.
XWOR%:   VAL         NBITMO-B-IPM
MIPM::   VAL         BIT>XWOR%       < MASQUE DU BIT 'IPM'.
XWOR%:   VAL         NBITMO-B-SVCS
MSVCS::  VAL         BIT>XWOR%       < MASQUE DU BIT 'SVCS'.
<
<
<        P A R A M E T R E S   D E   C C B  :
<
<
BCCBIP:: VAL         0               < BIT DE MOT0 DISCRIMINANT LES 'IPI'
                                     < CANAUX DES 'IPI' INTER-PROCESSEURS.
BCCBCR:: VAL         4               < BIT(MOT0) D'ENTREE DU COMPTE-RENDU.
BCCBBM:: VAL         7               < BIT(MOT0) DISCRIMINANT LES CANAUX
                                     < MOTS(K) DES CANAUX OCTETS(1).
CCBDF::  VAL         1               < BIT SPECIAL "DEFAUT-SECTEUR".
CCBDKM:: VAL         6               < BIT SPECIAL "DISQUE AMOVIBLE".
CCBHDC:: VAL         '80             < CODE INDICATEUR D'UN CANAL "HDC".
CCBMDC:: VAL         'C0             < CODE INDICATEUR D'UN CANAL "MDC".
CCBLDC:: VAL         '00             < CODE INDICATEUR D'UN CANAL "LDC".
BCCBDC:: VAL         1               < BIT DEFSEC/CLEAR DU COMPTE-RENDU.
BCCBME:: VAL         0               < BIT DEFAUT MEMOIRE DU COMPTE-RENDU.
YY7::    VAL         BIT>7           < TAILLE DES SECTEURS DISQUES, DES
                                     < BUFFERS ET DE DIVERSES AUTRES CHOSES...
<
<
<        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...)
XXDK4::  VAL         50              < NOMBRE DE TENTATIVES AUTORISEES SUR UN
                                     < ECHANGE EN ERREUR.
XWOR%1:  VAL         COSBT?XBITQ=FMASK(K+FGR=FCINST
XWOR%2:  VAL         COSBT?XBITQ=FMASK(K+FGW=FCINST
XWOR%3:  VAL         0
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.
<
<        ECHANGE
<        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
<        MAX 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'.
XWOR%1:  VAL         24              < NOMBRE DE SECTEURS PAR PISTE.
XDKMSP:: VAL         XWOR%1          < NOMBRE DE SECTEURS PAR PISTE.
XDKMPC:: VAL         20              < NOMBRE DE PISTES PAR CYLINDRE.
         LST
<
<        B O X
<
ABOX:    VAL         'E              < RELAI D'ACCES A 'BOX'.
BOXIPI:  EQU         $               < BOX'S.
         DZS         NMBUSM*NMPROB   < NOMBRE MAXIMUM DE PROCESSEURS.
<
<        S O U S - N I V E A U X   D ' I T.
<
<                    ATTENTION! ILS SONT DEFINIS "BRUTALEMENT", IL
<                    FAUDRA EVENTUELLEMENT LES METTRE A JOUR!
<
XSNDKF:  VAL         0               < SOUS-NIVEAU NORMAL DKF.
XSNDKM:  VAL         1               < SOUS-NIVEAU NORMAL DKM.
         COMMON
COM:     EQU         $
CCMP:    DZS         1               < COMPTEUR DE COMPACTAGE (EN
                                     < L'OCCURRENCE DECOMPACTAGE)
IPRR1:   DZS         1               < INDICATEUR 1ER READ DE 1 CAR SUR
                                     < PAGE VIRTUELLE
IRCARD:  DZS         1               < INDICATEUR READ ACTIF/INACTIF
                                     < SUR CARTES
                                     < =0 ACTIF   #0 INACTIF
IDKO:    DZS         1               < INDICATEUR DK OUTPUT ACTIF/INACTIF
                                     < =0 ACTIF    #0 INACTIF
IDKF:    DZS         1               < INDICATEUR RESTAURATION SUR DKF/DKM:
                                     < = 1 : DKF (ETAT A PRIORI).
                                     < = 0 : DKM.
NBSECD:  DZS         1               < NOMBRE DE SECTEURS AU DUMP DK
NBSECR:  EQU         NBSECD          < NOMBRE DE SECTEURS A LA RESTAURATION DK
LPC:     WORD        LPAC*2          < LONG OCT PAGE SI CARTES
<
<        RELAIS DIVERS
<
AXTRAV:  WORD        ZERO,X
AOPAG:   WORD        PAGE-ZERO*2     < ADR OCT DEBUT PAGE VIRTUELLE.
AOFPAG:  WORD        FPAGE-ZERO*2    < ADR OCT FIN PAGE VIRTUELLE.
PPG:     DZS         1               < POINTEUR OCT PAGE VIRTUELLE
                                     < RESTAURATION
ABC:     WORD        BC              < ADR BUFFER CARTE
AXBC:    WORD        BC,X            < ADR X BUFFER CARTE
AFBC:    WORD        FBC             < ADR FIN BUFFER CARTE
AXBCM1:  WORD        BC-1,X          < RELAI INDEXE BC-1
ACHECK:  WORD        BC+75           < ADRESSE CHECK CARTE
PBC:     DZS         1               < POINTEUR BUFFER CARTE
NUMC:    DZS         1               < NUMERO CARTE EN COURS
NBM11:   DZS         1               < INDEX MODULO 11 POUR LECTURE
                                     < CARACTERE SUR CARTE
AXMSK1:  WORD        MSK1,X          < TABLE PUNCH
AXSHF1:  WORD        SHF1,X          < IDEM
AXSHF2:  WORD        SHF2,X          < IDEM
SUI:     WORD        '6EC0           < INDICATEURS MOT SUIVANT BUFFER
                                     < PUNCH
DIX:     WORD        10
DIXMIL:  WORD        10000           < POUR NUM CARTES MODULO 10000
SAVK:    DZS         1               < SAUVEGARDE DE 'K' POUR CERTAINES
                                     < REPRISES DELICATES (CARTES).
DATE:    DZS         6               < DATE DE DUMP (JJ MM AA HH MM SS).
FDATE:   EQU         $               < FIN DE ZONE DATE.
ACN:     DZS         2               < ACN  DE DUMP.
FACN:    EQU         $               < FIN DE ZONE ACN.
SECT:    DZS         1               < ADRESSE SECTEUR COURANTE.
<
<        RELAIS SOUS-PROGRAMMES
<
ARSTDK:  WORD        RSTDK           < RESTAURATION DISQUE
ARSTDA:  WORD        RSTDA           < RESTAURATION DE LA DATE DU DUMP.
ARSTAC:  WORD        RSTAC           < RESTAURATION DE L'ACN DU DUMP.
AR1:     WORD        R1              < READ 1 CAR SUR PAGE VIRTUELLE
ALDC:    WORD        LDC             < LOAD CARACTERE PAGE VIRTUELLE
ARN:     WORD        RN              < READ N CAR SUR PAGE VIRTUELLE
ARPAGE:  WORD        RPAGE           < READ 1 PAGE VIRTUELLE
ARCARD:  WORD        RCARD           < READ CARTE
AR1C:    WORD        R1C             < READ 1 CARACTERE SUR CARTE
ASPDKF:  WORD        SPDKF           < S/P D'ECRITURE SUR DKF.
ASPDKM:  WORD        SPDKM           < S/P D'ECRITURE SUR DKM.
ASPCR1:  WORD        SPCR1           < S/P DE LECTURE D'UNE CARTE SUR CR1.
ASTOP:   WORD        SPSTOP          < S/P DE STOP PROCESSEUR.
         PAGE
         LOCAL
<
LOC:     EQU         $               < LOCAL.
<
<        DONNEES RELATIVES AU S/P SPDKF.
<
ACDKB::  VAL         ACDKF           < ADRESSE COUPLEUR DU DISQUE UTILISE PAR
                                     < LE BOOTSTRAP FHD
BSIOEA:  WORD        ACDKB+FPHETA    < OPERANDE SIO ENTREE ETAT A
BSIOEB:  WORD        ACDKB+FPHETB    < OPERANDE SIO ENTREE ETAT B
BSIOCD:  WORD        ACDKB+FPHCMD    < OPERANDE SIO SORTIE COMMANDE
BSIOSA:  WORD        ACDKB+FPHCME    < OPERANDE SIO SORTIE ADRESSE SECTEUR
BSIOSC:  WORD        ACDKB+FPHSAD    < OPERANDE SIO SORTIE COMPTE DE SECTEURS
<
BCCB0:   WORD        0               < CCB MOT 0
XXDK50:: VAL         0               < JEU DE REGISTRES 'HDC' POUR 'DKF',
XXDK51:: VAL         XXDK50+I        < JEU DE REGISTRES 'HDC' POUR 'DKM'.
BCCB1:   BYTE        CCBHDC+XSNDKF;XXDK50 < CCB MOT1.
BCCB2:   WORD        BUDK            < CCB MOT 2: ADRESSE MEMOIRE
BCCB3:   WORD        FBUDK-BUDK      < CCB MOT 3: COMPTE DE MOTS
BCCB4:   WORD        ACDKB+FPHOUT    < CCB MOT 4: OPERANDE SIO SORTIE INFO
<
BABIPI:  WORD        BIPI            < RELAI D'ACCES AU S/P 'BIPI'.
BC0800:  WORD        MIPM            < POUR MASK/DEMASK IPI
<
<        DONNEES SPECIFIQUES AU S/P SPDKM.
<
BACDKM:: VAL         ACDKM           < ADRESSE COUPLEUR DU DISQUE AMOVIBLE
                                     < UTILISE PAR LE BOOTSTRAP 'DKM'.
BMSEA:   WORD        BACDKM+FPHETA   < OPERANDE SIO ENTREE ETAT A.
BMSEB:   WORD        BACDKM+FPHETB   < OPERANDE SIO ENTREE ETAT B.
BMSSA:   WORD        BACDKM+FPHCME   < OPERANDE SIO SORTIE ADRESSE.
BMSCD:   WORD        BACDKM+FPHCMD   < OPERANDE SIO SORTIE COMMANDE.
BMPUP:   WORD        ACPUP+FPHOUT    < VISUALISATION AU PUPITRE...
<
<
BMCCB0:  WORD        COSBT?CCBDKM=FMASK(K=FCINST < CCB DKM MOT0 :
                                     < BIT 6 = DK TETES MOBILES.
BMCCB1:  BYTE        CCBHDC+XSNDKM;XXDK51 < CCB DKM MOT 1 :
                                     < BITS 0-1 = MODE HDC.
                                     < BITS 2-7 = NIVEAU IT NORMALE.
                                     < BITS 11-15 = NUMERO DU JEU DE
                                     <              REGISTRES CANAL UTILISES.
BMCCB2:  WORD        BUDK            < CCB DKM MOT 2 : ADRESSE MEMOIRE.
BMCCB3:  WORD        FBUDK-BUDK      < CCB DKM MOT 3 : COMPTE DE MOTS.
BMCCB4:  WORD        BACDKM+FPHOUT   < CCB DKM MOT 4 : OPERANDE SIO IN/OUT.
BMCCB5:  WORD        0               < CCB DKM MOT 5 : HEADER 1 DU PREMIER
                                     < SECTEUR A ECHANGER.
<
<
BMNSPP:  WORD        XDKMSP          < NOMBRE DE SECTEURS PAR PISTE.
BMNPPC:  WORD        XDKMPC          < NOMBRE DE PISTES PAR CYLINDRE.
<
BMSECT:  WORD        0               < NUMERO DE SECTEUR.
BMPIST:  WORD        0               < NUMERO DE PISTE.
BMCYL:   WORD        0               < NUMERO DE CYLINDRE.
<
<        DONNEES SPECIFIQUES AU S/P SPCR1.
<
ACCRB::  VAL         ACCR1           < ADRESSE COUPLEUR DU LECTEUR DE CARTES
                                     < UTILISE PAR LE BOOTSTRAP CARTES
BCETA:   WORD        ACCRB+FPHETA    < OPERANDE SIO ENTREE MOT D'ETAT
BCCDE:   WORD        ACCRB+FPHCMD    < OPERANDE SIO SORTIE COMMANDE
BCDATA:  WORD        ACCRB+FPHIN     < OPERANDE SIO DATA IN
<
         PAGE
         PROG
ENTRY1:  EQU         $
<
<        E N T R Y   1   D A N S   R E S T   ( I N I T I A L E . . . )
<
<        INITIALISATIONS
<
         LRM         C,L,K
         WORD        COM+'80         < BASE LE COMMON.
         WORD        LOC+'80         < LOCAL.
         WORD        PILE-1          < POUR LA PILE.
         STZ         IPRR1           < PREMIER READ=OUI
RBCL:    EQU         $
<
<        BOUCLE DE RESTAURATION
<
         BSR         AR1
         CPI         'DA             < DATE ?
         JE          RDA1
         CPI         'AC             < ACN ?
         JE          RAC1
         CPI         'DD             < DEBUT DISQUE ?
         JE          RD1
         CPI         0               < IL SUFFIT POUR CE PROGRAMME TRES
                                     < SPECIAL, DE TROUVER UN SEUL 0 POUR
                                     < CONCLURE A LA FIN DE RESTAURATION.
         JE          RFIN
ERROR:   EQU         $
         BSR         ASTOP           < CODES NON RECONNUS...
         JMP         ERROR           < !!!
RDA1:    EQU         $
         BSR         ARSTDA          < RESTAURATION DATE.
         JMP         RBCLF
RAC1:    EQU         $               < RESTAURATION DE L'ACN DU DUMP.
         BSR         ARSTAC
         JMP         RBCLF
RD1:     EQU         $
         BSR         ARSTDK          < RESTAURATION DISQUE
RBCLF:   EQU         $
         JMP         RBCL            < AU SUIVANT
<
<        FIN DU PROGRAMME
<
RFIN:    EQU         $
RFINC:   EQU         RFIN            < RESTAURATION CARTES
                                     < ON S'ASSURE QUE TOUTES
                                     < LES CARTES ONT BIEN ETE LUES
                                     < (ENCHAINEMENTS EVENTUELS DE
                                     < RESTAURATIONS)
RFIN1:   EQU         $
         BSR         ARCARD          < READ CARD
         CPZ         IRCARD          < READ CARD TOUJOURS ACTIF?
         JE          RFIN1           < OUI, CONTINUER
<
<        FIN : ON FAIT STOP ...
<
RFIN2:   EQU         $
         BSR         ASTOP
         HALT
         JMP         RFIN2
         PAGE
RSTDK:   EQU         $
<
<        R E S T A U R A T I O N   D ' U N   D I S Q U E
<
         PSR         X,Y             < SAUVEGARDES
<
         BSR         AR1             < READ QUANTA DE DUMP
         CPI         1               < CE DOIT ETRE OBLIGATOIREMENT 1.
         JNE         $               < PROBLEME...
<
         STZ         IDKF
         IC          IDKF            < DK DE RESTAURATION = DKF A PRIORI.
<
         BSR         AR1             < READ NSP DU DK DE DUMP
         CPI         NSPDK3          < TEST NSP DK DE DUMP.
         JE          RSTDK5          < C'EST DKF.
         CPI         NSPDK2
         JNE         $               < NI DK2, NI DK3.
         STZ         IDKF            < C'EST DKM.
RSTDK5:  EQU         $
<
         LAD         SECT
         SLLS        1               < ADRESSE OCTET ADRESSE SECTEUR.
         LXI         2               < 2 OCTETS
         BSR         ARN             < READ ADRESSE SECTEUR
         BSR         ASTOP           < POUR PERMETTRE A L'UTILISATEUR DE
                                     < MODIFIER L'ADRESSE SECTEUR DE DEBUT
                                     < DE RESTAURATION, AINSI QUE LE NSP
                                     < DU DISQUE DE RESTAURATION (DKF / DKM),
                                     < (CF INDICATEUR 'IDKF').
<
         LAD         NBSECD
         SLLS        1               < ADRESSE OCTETS NOMBRE DE SECTEURS
         LXI         2
         BSR         ARN             < READ NOMBRE DE SECTEURS
<
<
<        BOUCLE DE WRITE DE  'NBSECR' SECTEURS SUR DK2 / DK3.
<
         BSR         ASTOP           < POUR PERMETTRE A L'UTILISATEUR
                                     < D'INHIBER OU PAS LA RESTAURATION
                                     < DISQUE (INDICATEUR 'IDKO')
RSTDKF:  EQU         $               < BOUCLE DE RESTAURATION DK
         CPZ         NBSECR          < NOMBRE DE SECTEURS RESTANT A
                                     < RESTAURER
         JE          RSTDKD
         LRM         A,X
         WORD        BUDK-ZERO*2     < ADRESSE OCTET BUFFER DK.
         WORD        FBUDK-BUDK*2    < LONGUEUR OCTETS BUFFER DK.
         BSR         ARN             < READ N OCTETS EN PAGE VIRTUELLE
         CPZ         IDKO            < RESTAURATION DK ACTIVE ?
         JNE         RSTDK4          < NON
         LA          SECT            < ADRESSE SECTEUR COURANT (PARAMETRE
                                     < D'APPEL DES S/P D'ECHANGE DK).
         CPZ         IDKF            < DISCRIMINATION DKF/DKM.
         JNE         RSTDK3
         BSR         ASPDKM          < C'EST DKM.
         JMP         RSTDK4
RSTDK3:  EQU         $
         BSR         ASPDKF          < C'EST DKF.
RSTDK4:  EQU         $
         IC          SECT            < ADRESSE SECTEUR SUIVANT
         DC          NBSECR          < -1 SUR NOMBRE DE SECTEURS RESTANT
         JMP         RSTDKF
RSTDKD:  EQU         $
         BSR         AR1             < READ DELIMITEUR 'FD
         CPI         'FD             < QUI SIGNIFIE 'FIN DUMP DISQUE'
         JNE         $               < PROBLEME...
<
         PLR         X,Y             < RESTAURATIONS
         RSR
         PAGE
RSTDA:   EQU         $
<
<        R E S T A U R A T I O N   D E   L A   D A T E   D U   D U M P
<
<                      CELLE-CI EST STOCKEE DANS LA ZONE 'DATE'
<                    A TITRE D'INFORMATION.
<
         PSR         A,X             < SAUVEGARDES
         LAD         DATE
         SLLS        1               < ADRESSE OCTET ZONE 'DATE'.
         LXI         FDATE-DATE*2    < 16 OCTETS (JJ MM AA HH MM SS).
         BSR         ARN             < READ N OCTETS EN PAGE VIRTUELLE.
<
         PLR         A,X             < RESTAURATIONS.
         RSR
RSTAC:   EQU         $
<
<        R E S T A U R A T I O N   D E   L ' A C N   D U   D U M P
<
<                      CET ACN EST STOCKE DANS LA ZONE 'ACN' A TITRE
<                    D'INFORMATION.
<
         PSR         A,X             < SAUVEGARDES.
         LAD         ACN
         SLLS        1               < ADRESSE OCTET ZONE 'ACN'.
         LXI         FACN-ACN*2      < 4 OCTETS.
         BSR         ARN             < READ N OCTETS EN PAGE VIRTUELLE.
         PLR         A,X             < RESTAURATIONS.
         RSR
         PAGE
R1:      EQU         $
<
<        R E A D   1   C A R A C T E R E   E N   P A G E   V I R T U E L L E
<
<                    CE S/P ASSURE LE DECOMPACTAGE, ET RENVOIE LE
<                    CARACTERE LU DANS LE REGISTRE 'A' (BITS 8-15)
<
         PSR         X,Y
         CPZ         IPRR1           < PREMIER APPEL?
         JNE         R11
                                     < OUI,
         IC          IPRR1           < BASCULEMENT
         LAI         -1
         STA         CCMP            < INIT COMPT DE COMPACTAGE
                                     < BIT 0=1 SIGNIFIE EPUISE
<
                                     < INIT SPECIFIQUES AUX
                                     < DIFFERENTS SUPPORTS UTILISES
         STZ         NUMC            < NUMERO CARTE EN COURS
         STZ         NBM11           < INDEX MODULO 11
         STZ         IRCARD          < READ CARTE ACTIF A PRIORI
         LA          ACHECK
         STA         PBC             < POINTEUR BUFF CARTES (PROVOQUERA
                                     < APPEL A READ CARD)
         BSR         ARPAGE          < READ 1ERE PAGE
<
<
<
R11:     EQU         $               < N EME APPEL
         LB          CCMP            < COMPTEUR COMPACTAGE
         LY          PPG             < POINTEUR DE PAGE
<
         TBT         16+0            < CONT INVALIDE?
         JNC         R101
                                     < OUI,REINIT CCMP
         BSR         ALDC            < LOAD COUNT
         LR          A,B
<
R101:    EQU         $
         TBT         16+8            < COUNT DE CAR REPETITIFS?
         JNC         R102
                                     < OUI,ON RESTE SUR LE CAR
                                     < ACTERE EN COURS
         LR          Y,X
         LBY         &AXTRAV         < CAR EN COURS
         JMP         R103
<
R102:    EQU         $               < COUNT DE CAR NON-REPETITIFS
         BSR         ALDC            < LOAD CARACTERE SUIVANT
<
R103:    EQU         $               < MAJ COUNT DE COMPACTAGE
         ADRI        -1,B
         XR          A,B
         PSR         A
         ANDI        '7F
         CPI         '7F             < EPUISE?
         PLR         A
         JNE         R1F
                                     < OUI,FAUT-IL AVANCER D'1 CAR
                                     < IL LE FAUT SI LE COUNT EN
                                     < COURS ETAIT UN COUNT DE CAR
                                     < REPETITIFS
         TBT         0
         JC          R1F
                                     < C'ETAIT UN REPETITIF
         PSR         A
         BSR         ALDC            < POUR PASSER AU COUNT SUIVANT
         PLR         A
         SBT         0               < SET CCMP EPUISE
<
R1F:     EQU         $
         XR          A,B
         STB         CCMP            < CCMP MIS A JOUR
         STY         PPG             < PPG MIS A JOUR
<
         PLR         X,Y
         RSR
<
         PAGE
LDC:     EQU         $
<
<        L O A D   1   O C T E T    D E   P A G E   V I R T U E L L E
<
<        D A N S   'A' (BITS 8-15)
<
<                      CE S/P EST APPELE PAR LE S/P 'R1' ET IL LIT BRUTALEMENT
<                    UN OCTET QUI PEUT ETRE UN COUNT OU UN CARACTERE.
<
         LR          Y,X
         LBY         &AXTRAV
         ADRI        1,Y
         LX          AOFPAG
         CPR         X,Y             < ON DEPASSE?
         JL          LDCF
                                     < OUI, LIRE PAGE SUIVANTE
         BSR         ARPAGE
         LY          PPG             < REINIT Y POUR R1
LDCF:    EQU         $
         RSR
<
         PAGE
RN:      EQU         $
<
<        R E A D   N   C A R A C T E R E S   E N   P A G E   V I R T U E L L E
<
<                    ARGUMENTS:
<                                    'A' = ADRESSE OCTET ZONE DE STOCKAGE DES
<                                    CARACTERES LUS
<                                    'X' = NOMBRE DE CARACTERES A LIRE
<
<                    NOTA:
<                                      CE S/P UTILISE LE S/P 'R1'(READ 1 CARACT)
<
         PSR         A,X,Y
         CPZR        X               < LONGUEUR NULLE?
         JE          $               < OUI, PROBLEME!
         LR          A,Y
RN1:     EQU         $               < BOUCLR DE READ 1 CAR
         PSR         X               < SVG COUNT
         BSR         AR1             < READ 1 CAR
         LR          Y,X
         STBY        &AXTRAV         < STOCKAGE CAR
         ADRI        1,Y
         PLR         X
         JDX         RN1             < BOUCLE
<
         PLR         A,X,Y
         RSR
         PAGE
RPAGE:   EQU         $
<
<        R E A D   U N E   P A G E   V I R T U E L L E
<
<        ( S U R   C R 1 . )
<
         PSR         A,B,X
         LA          AOPAG
         STA         PPG             < INIT POINTEUR PAGE
                                     <
RPGC:    EQU         $               < LECTEUR DE CARTES
         BSR         AR1C            < LIRE 1 CARACT SUR CARTE
         LX          PPG
         STBY        &AXTRAV         < STORE CAR EN PAGE
         IC          PPG             < +1 SUR POINT PAGE
         LA          PPG
         CP          AOFPAG          < ON DEPASSE?
         JL          RPGC            < NON,CONTINUER,C'EST BIEN
RPGF:    EQU         $               < FIN,REINIT PPG ET RETOUR
         LA          AOPAG
         STA         PPG
<
         PLR         A,B,X
         RSR
         PAGE
R1C:     EQU         $
<
<        R E A D   1   C A R A C T E R E   S U R   C A R T E
<
<                     CE SOUS-PROGRAMME PREND 8 BITS A CHAQUE
<                    APPEL, QU'IL REND DANS 'A' (BITS 8-15),
<                    SACHANT QU'UNE CARTE CONTIENT 11 BITS UTILES
<                    PAR COLONNE.
<                      POUR RECONSTITUER UN CARACTERE QUI PEUT
<                    ETRE "A CHEVAL" SUR DEUX COLONNES OU MEME
<                    SUR DEUX CARTES, IL UTILISE LES TABLES
<                    'MSK1', 'SHF1', 'SHF2' ET LES BITS PLACES
<                    DANS 'SUI'.
<                      LORSQUE LE S/P A BESOIN DE LIRE LA CARTE
<                    SUIVANTE, IL APPELLE LE S/P 'RCARD'.
<
         LA          PBC             < POINTEUR BUFFER CARTE
         CP          ACHECK          < ON DEPASSE?
         JL          R1C1
         BSR         ARCARD          < OUI, LIRE UNE CARTE
R1C1:    EQU         $
         LX          PBC
         LA          &AXTRAV         < MOT EN COURS BUFFER CARTE
         LR          A,Y
         LX          NBM11           < INDEX MODULO 11 EN COURS
         LBY         &AXSHF1         < SHIFT1
         LR          A,X
         LR          Y,A
         SCLS        0,X
         LR          A,Y             < Y=MOT.SHIFT1
         LX          NBM11           < INDEX
         LBY         &AXMSK1         < MASQUE 1
         ANDR        A,Y             < Y=MOT.SHIFT1.MASK1
         LA          SUI             < INDICATEUR DE PASSAGE AU MOT
                                     < SUIVANT DU BUFFER CARTE
         TBT         0,X             < PASSER AU MOT SUIVANT?
         JNC         R1C3
                                     < OUI,
         IC          PBC             < POINTEUR BUFFER CARTE='+1
         LA          PBC
         CP          ACHECK          < ON DEPASSE?
         JL          R1C3
         BSR         ARCARD          < OUI, LIRE UNE CARTE
R1C3:    EQU         $
         LX          PBC
         LB          &AXTRAV         < MOT BUFFER CARTE
         LX          NBM11           < INDEX EN COURS MODULO 11
         LBY         &AXSHF2         < SHIFT2
         LR          A,X
         LR          B,A
         SCLS        0,X
         LR          A,B             < B=MOT.SHIFT2
         LX          NBM11
         LBY         &AXMSK1         < MASK1...
         CMR         A,A             < ...INVERSE...
         ANDI        '00FF           < ...ET NETTOYE
         ANDR        A,B             < B=MOT.SHIFT2.MASK1-INVERSE
         ORR         Y,B             < B=OCTET COMPLET
<
         IC          NBM11           < INDEX MODULO 11 = '+1
         LA          NBM11
         CPI         11              < ON DEPASSE?
         JL          R1C2
                                     < OUI,
         STZ         NBM11           < RAZ NBM11
         IC          PBC             < MOT SUIVANT BUFFER CARTE
R1C2:    EQU         $
         LR          B,A
         RSR                         < RETOUR, A(8-15)=OCTET LU
         PAGE
RCARD:   EQU         $
<
<        R E A D   C A R D
<
<                      CE SOUS-PROGRAMME LIT UNE CARTE, ET
<                    ASSURE LES CONTROLES DE "CHECK" ET DE
<                    SEQUENCE, AINSI QU'UNE REPRISE EVENTUELLE
<                    DE LA LECTURE SI UNE CARTE EST ERRONEE.
<                      IL ASSURE LES INITIALISATIONS ET REINITIALISATIONS
<                    NECESSAIRES ET LA GESTION DE FIN DE DECK.
<
         PSR         A,Y
         LR          K,A             < ON SAUVE LE K ACTUEL AU
         STA         SAVK            < IL Y AURAIT UNE RELECTURE SUITE A
                                     < ERREUR DE CHECKSUM OU DE NUMEROTATION.
RCD0:    EQU         $               < POINT D'ENTREE DE RELECTURE
         CPZ         IRCARD          < SSI LECTURE ACTIVE
         JNE         RCD9
         LA          ABC             < ADRESSE BUFFER CARTE (POUR S/P 'SPCR1').
         BSR         ASPCR1          < S/P DE LECTURE PHYSIQUE CARTE.
RCD9:    EQU         $
         LA          &ABC            < 1ER MOT BUFFER
         ANDI        'F0             < NETTOYAGE
         CPI         '70             < FIN PHYSIQUE?
         JNE         RCD1
                                     < OUI,
         IC          IRCARD          < INHIBITION LECTURE PHYSIQUE
         JMP         RCDFIN
<
RCD1:    EQU         $
<
<        CONTROLE DU CHECK
<
         LA          &ACHECK
         ANDI        'FFE0          < CHECK NETTOYE
         LR          A,Y
         LXI         NBCOL           < INIT COUNT
         LAI         0
         STA         &ACHECK         < RAZ CHECK
RCD2:    EQU         $               < BOUCLE DE RECALCUL CHECK
         EOR         &AXBCM1
         JDX         RCD2            < BOUCLE
         ANDI        'FFE0           < NETTOYAGE CHECK RECALCULE
         CPR         A,Y             < CHECK CORRECT?
         JE          RCD3
         JMP         $               < ERREUR DE CHECK: REMETTRE LA DERNIERE
                                     < CARTE DANS LE LECTEUR.
         JMP         RCDER           < VERS RELECTURE
RCD3:    EQU         $
<
<        CONTROLE DE SEQUENCE
<
         IC          NUMC            < NUMERO CARTE EN COURS
         LA          NUMC
         CP          DIXMIL          < ON ATTEINT 10000 CARTES?
         JL          RCD8
         LAI         1               < OUI,ON REPART A 1
         STA         NUMC
RCD8:    EQU         $
<
                                     < CONVERSION DECIMALE DE NUMC
         LXI         0
         LB          NUMC
RCD4:    EQU         $               < BOUCLE CONVERSION
         LAI         0
         DV          DIX             < DIVISION PAR 10
         JNV         $+2
         JMP         $               < ....
         PSR         B               < ON EMPILE LE RESTE
         ADRI        1,X             < COUNT NB CHIFFRES DECIMAUX
         JAE         RCD5            < QUOTIENT NUL?
                                     < NON, ON CONTINUE
         XR          A,B
         JMP         RCD4
RCD5:    EQU         $
                                     < COMPARAISON DU NB DECIMAL RECALCULE
                                     < AVEC CELUI DU BUFFER CARTE
         LA          AFBC
         NGR         X,Y
         ADR         A,Y             < ADRESSE 1ER MOT DE STOCKAGE DE
                                     < LA NUMEROTATION SUR BUFFER CARTE
<
RCD6:    EQU         $               < BOUCLE COMPAR CHIFFRE PAR CHIFFRE
         PLR         A               < CHIFFRE DECIMAL
         PSR         X               < SVG COUNT
         LR          A,X
         LAI         0
         SBT         2,X             < SET BIT
         LR          Y,X
         LB          &AXTRAV         < MOT DU BUFFER
         XR          A,B
         ANDI        'FFF0           < NETTOYAGE
         CPR         A,B             < EGALITE CHIFFRE?
         JE          RCD7
         JMP         $               < ERREUR DE SEQUENCE: REMETTRE LA DERNIERE
                                     < CARTE LUE DANS LE LECTEUR.
         LA          NUMC            < NUMERO ATTENDU
         CPI         1
         JNE         $+2
         LA          DIXMIL
         ADRI        -1,A
         STA         NUMC            < MISE A JOUR DE 'NUMC'
RCDER:   EQU         $               < ERREUR DE CHECK OU DE NUMEROTATION
                                     < ON VIENT ICI QUAND LA DERNIERE
                                     < CARTE LUE A ETE REPLACEE DANS LE
                                     < LECTEUR.
         LA          SAVK            < ON RECUPERE 'K' POUR REBOUCLER
         LR          A,K             < SUR LA LECTURE
         JMP         RCD0            < RELECTURE
RCD7:    EQU         $
         ADRI        1,Y             < CHIFFRE SUIVANT
         PLR         X               < RECUP COUNT
         JDX         RCD6            < AU SUIVANT
<
<        CHECK ET NUMEROTATION SONT CORRECTS
<        REINITS NECESSAIRES, RESTAURATIONS ET RETOUR
<
RCDFIN:  EQU         $
         LA          ABC
         STA         PBC             < POINTEUR BUFFER CARTE
         PLR         A,Y
         RSR
         PAGE
SPSTOP:  EQU         $
<
<        S/P DE STOP PROCESSEUR.
<
         PSR         A,X
         LAI         K
         SBT         STOP
         SST
         HALT
         HALT
         PLR         A,X
         RSR
         PAGE
SPCR1:   EQU         $
<
<        S/P DE LECTURE D'UNE CARTE (EN PROGRAMME SIMPLE).
<
<        ARGUMENTS:
<                    -'A' = ADRESSE MOT BUFFER CARTE.
<
         PSR         A,X,W           < SAUVEGARDES.
         LR          A,W             < 'W' BASE LE BUFFER CARTE.
SPCR12:  EQU         $
         SIO         BCETA           < MOT D'ETAT.
         TBT         ETAOPE          < TEST LECTEUR PRET.
         JC          SPCR11          < PRET.
         LAI         MOMINI          < NON-PRET: FAIRE 'RESET'.
         SIO         BCCDE
         JMP         SPCR12          < ET ATTENDRE.
SPCR11:  EQU         $               < LECTEUR PRET: LANCER L'ECHANGE.
         LAI         MOMSTR          < LECTURE, IT NON VALIDEES.
         SIO         BCCDE
<
         LXI         LCCI            < EXPLOITATION DES 'LCCI' COLONNES..
SPCR13:  EQU         $
         SIO         BCETA           < ENTREE MOT D'ETAT.
         TBT         ETANXT          < DATA VALID ?
         JNC         SPCR13
         SIO         BCDATA          < 'A' (4-15) = COLONNE LUE.
         SLLS        4               < 'A' (0-11) = COLONNE LUE.
         STA         0,W             < STORE MOT OBTENU.
         ADRI        1,W             < MOT SUIVANT.
         JDX         SPCR13
<
         PLR         A,X,W           < RESTAURATIONS.
         RSR
         PAGE
SPDKF:   EQU         $
<
<        S/P D'ECHANGE D'UN SECTEUR DKF.
<
<        ARGUMENTS:
<                    'A' = ADRESSE SECTEUR.
<                    'L' = BASE DU LOCAL.
<
<                    INFORMATIONS DU 'LOCAL', NOTAMMENT :
<                    'BMCCB2' = ADRESSE MEMOIRE BUFFER DKF.
<                    'BMCCB3' = LONGUEUR A ECHANGER (1 BLOC DKF).
<
         PSR         A,B,X,C         < SAUVEGARDES.
         PSR         W               < SUITE SAUVEGARDES.
         LR          A,B             < SAVE ADRESSE SECTEUR.
< INITIALISATION DE ADRESSE DE 'BOX' (REGISTRE 'C').
         LRM         C,W
         WORD        BOXIPI          < ADRESSE DE 'BOX'.
         WORD        ABOX            < ADRESSE DU RELAI DES 'BOX'.
         LR          C,A
         STA         0,W             < RELAI DES 'BOX'.
         RDSI                        < READ SYSTEM IDENTIFICATION.
         ANDI        MNUBUS?MNUPRO   < 'A' = NUMERO DU PROCESSEUR.
<
         ADR         A,C             < D'OU L'ADRESSE DE 'BOX'.
         LAI         MOMINI
         SIO         BSIOCD          < RESET
<
BCARTX:  EQU         $
         SIO         BSIOEA          < MOT D'ETAT
         TBT         ETAOPE          < PRET?
         JNC         BCARTX          < NON,ATTENDRE
<
         LR          B,A             < ADRESSE SECTEUR
         SIO         BSIOSA          < SORTIE ADRESSE SECTEUR
<
         LAI         YY7             < A(BIT1 A 8)=CPTE DE SECTEURS
         SIO         BSIOSC          < SORTIE COMPTE DE SECTEURS
<
<
         LAD         BCCB0           < ADRESSE DU CCB
         BSR         BABIPI          < IPI ETC...
         LAI         MOMRW?MOMSTR?MOMINT < LANCEMENT ECRITURE, IT VALIDEEES.
         SIO         BSIOCD
         LXI         K
         HALT
<
         PLR         W               < RESTAURATIONS.
         PLR         A,B,X,C         < SUITE RESTAURATIONS.
         RSR
         PAGE
SPDKM:   EQU         $
<
<        S/P D'ECHANGE D'UN SECTEUR DKM.
<
<        ARGUMENTS:
<                    'A' = ADRESSE SECTEUR.
<                    'L' = BASE DU LOCAL.
<
<                    INFORMATIONS DU 'LOCAL', NOTAMMENT :
<                    'BMCCB2' = ADRESSE MEMOIRE BUFFER DKM.
<                    'BMCCB3' = LONGUEUR A ECHANGER (1 BLOC DKM).
<
         PSR         A,B,X,C         < SAUVEGARDES.
         PSR         W               < SUITE SAUVEGARDES.
         PSR         A               < ADRESSE SECTEUR (INITIALE OU
                                     < DE REPRISE SUR FIN DE CYLINDRE).
< INITIALISATION DE ADRESSE DE 'BOX' (REGISTRE 'C').
         LRM         C,W
         WORD        BOXIPI          < ADRESSE DE 'BOX'.
         WORD        ABOX            < ADRESSE DU RELAI DES 'BOX'.
         LR          C,A
         STA         0,W             < RELAI DES 'BOX'.
         RDSI                        < READ SYSTEM IDENTIFICATION.
         ANDI        MNUBUS?MNUPRO   < 'A' = NUMERO DU PROCESSEUR.
         ADR         A,C             < D'OU L'ADRESSE DE 'BOX'.
BME1:    EQU         $
<
<        TEST DISQUE PRET; SI NON PRET : RESET.
<
         SIO         BMSEA           < 'A'=MOT D'ETAT A.
         TBT         ETAOPE          < DISQUE PRET?
         JC          BME2            < DISQUE PRET.
         LAI         MOMINI          < DISQUE NON PRET, ON FAIT
         SIO         BMSCD           < UN RESET,
         JMP         BME1            < ET ON BOUCLE.
BME2:    EQU         $
<
<        CALCUL ADRESSE PHYSIQUE.
<
         LAI         K
         PLR         B               < ADRESSE SECTEUR.
         DV          BMNSPP
         JV          $               < ERREUR.
         STB         BMSECT          < NUMERO DE SECTEUR.
         LR          A,B
         LAI         K
         DV          BMNPPC
         JV          $               < ERREUR.
         STB         BMPIST          < NUMERO DE PISTE.
         STA         BMCYL           < NUMERO DE CYLINDRE.
<
<        SELECTION DE L'UNITE ET POIDS 1 2 ET 3 DE L'ADRESSE TETE.
<
         LA          BMPIST          < NUMERO DE PISTE (OU TETE).
         RBT         NBITMO-XXDK10
         SLLS        NBITMO-XXDK12-XXDK10
         SLRS        NBITMO-XXDK12-XXDK10-XXDK11 < POIDS 1 A 3 DE L'ADRESSE TETE
         SBT         XXDK13          < UNITE.
         SIO         BMSSA           < SORTIE ADRESSE.
         LAI         XXDK30          < POUR UNIT SELECT.
         SIO         BMSCD           < UNIT SELECT.
<
<        POSITIONNEMENT DES TETES.
<
         LBI         K
         LA          BMCYL           < NUMERO DE CYLINDRE.
         SLLS        XXDK14
         LR          A,Y
         LA          BMPIST          < NUMERO DE PISTE.
         ANDI        XXDK20          < SELECTION BITS DE POIDS 0 ET 4
         SLRD        XXDK10          < DE L'ADRESSE TETE.
         SLLS        NBITMO-XXDK12-XXDK10-XXDK15-XXDK10
         SLLD        XXDK15+XXDK10
         ORR         Y,A             < POUR SORTIE ADRESSE.
         SIO         BMSSA           < SORTIE ADRESSE.
         AD          BMSECT          < 'A'= HEADER 1 DU PREMIER SECTEUR A
                                     < ECHANGER.
         STA         BMCCB5          < MOT 5 DU CCB : HEADER 1.
         LAI         XXDK31          < POUR SEEK.
         SIO         BMSCD           < SEEK.
         PSR         X               < SAUVEGARDE X.
         HALT                        < ATTENDONS QUE LES TETES...
         HALT                        < ...SOIENT POSITIONNEES.
         JMP         $+1             < PATCH EVENTUEL.
         PLR         X               < RESTAURATION X.
<
<        REMPLISSAGE DU CCB ET LANCEMENT DE L'ECHANGE.
<
         LAI         FBUDK-BUDK      < RE-INITIALISATION COMPTE DE MOTS
                                     < (RAZE PAR COMPTE-RENDU).
         STA         BMCCB3
         LA          BMCCB0
         RBT         BCCBCR          < RAZ BIT COMPTE RENDU.
         STA         BMCCB0
<
         LRM         A
         WORD        BACDKM+FPHOUT   < MOT 4 DU CCB = SIO OUT.
         STA         BMCCB4          < MOT 4 CCB = OPERANDE SIO.
<
         LAD         BMCCB0          < ADRESSE DU CCB...
         BSR         BABIPI          < IPI ETC...
         LAI         XXDK32          < POUR LANCEMENT DE L'ECHANGE.
         SIO         BMSCD           < LANCEMENT ECHANGE.
         LR          X,A             < SAUVEGARDE DE X.
         HALT                        < ATTENTE DE LA FIN...
         HALT                        < ...D'ECHANGE.
         LR          A,X             < RECUPERATION DE 'X'.
<
<        RECUPERATION, TEST ET EXPLOITATION DU MOT D'ETAT.
<
         SIO         BMSEA           < 'A' RECOIT MOT D'ETAT A.
         JAGE        BME3            < OK, ALLONS AU COMPTE RENDU.
         TBT         ETACAD          < CADENCE ?
         JC          $               < FATAL...
         TBT         ETAPAR          < CHECKSUM ?
         JC          $               < FATAL...
         TBT         ETAVIO          < VIOL ?
         JC          $               < FATAL...
         TBT         ETADOG          < CHIEN DE GARDE ?
         JC          $               < FATAL...
         TBT         ETAOPE          < DISQUE PRET ?
         JNC         $               < NON, FATAL...
         TBT         ETABRK          < FIN DE CYLINDRE ?
         JNC         $               < NON, FATAL...
BME3:    EQU         $
<
<        COMPTE RENDU D'ECHANGE.
<
         LA          BMCCB0
         SBT         BCCBCR          < SET BIT "COMPTE RENDU"
         STA         BMCCB0
         LAD         BMCCB0          < ADRESSE DU CCB.
         BSR         BABIPI          < IPI ETC...
<
         LA          BMCCB3          < MOT 3 DU CCB...
         JANE        $               < DEFAUT...
<
         PLR         W               < RESTAURATIONS.
         PLR         A,B,X,C         < SUITE RESTAURATIONS.
         RSR
         PAGE
<
<
<        E N V O I   D E S   ' I P I '  :
<
<
<          CE PETIT S/P EST UTILISE PAR LES BOOTSTRAPS
<        POUR FAIRE DES 'IPI'.
<
<        ARGUMENTS:
<
<                    'A'=ADRESSE DU CCB.
<                    'C'=ADRESSE DE LA 'BOX'.
<
<        DETRUIT 'A'.
<
<
BIPI:    EQU         $
         STA         O,C             < STOCKAGE ADRESSE CCB DANS 'BOX'
         IPI
         LA          BC0800          < POUR DEMASK DES 'IPI'
         RST                         < DEMASK 'IPI'.
BIPI1:   EQU         $
         CPZ         O,C             < TEST 'BOX'=K.
         JNE         BIPI1           < ATTENTE.
         LA          BC0800          < POUR MASK 'IPI'.
         SST                         < MASK 'IPI'.
         RSR
         LST
         NDS
         END



Copyright © Jean-François Colonna, 2022-2022.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2022.