IF          GIGE,X100,,X100
NMPROC:  VAL         "GE"            < NOM DU PROCESSEUR.
         IDP         "GE - RELEASE 01/06/1979"
X100:    VAL         0
         IF          GIGE,,X100,
NMPROC:  VAL         "GI"            < NOM DU PROCESSEUR.
         IDP         "GI - RELEASE 01/06/1979"
X100:    VAL         0
         IDP         "JOHN F. COLONNA"
MULTI:   VAL         1               < LORSQUE MULTI#0 , GE/GI
                                     < AUTORISE LES FILIATIONS MULTIPLES
                                     < ENTRE NOEUDS , DU TYPE :
                                     < C0 N1 --> N2 ,
                                     < C1 N1 --> N2 ,...
         EOT         #SIP DEFINITION ITEM#
         EOT         #SIP DEF PROCESSEUR#
NOEUD1:  EQU         BRANCH
         WORD        GEGRAF          < @DE LANCEMENT DE 'OS' (COMPATIBLE
                                     < AVEC 'CALL' : ELLE EST DONNEE
                                     < EN SLO+'10).
         WORD        0               < POUR FAIRE +1 SUR $.
         PROG
GE:      EQU         $               < POINT D'ENTREE LORS D'UN APPEL
                                     < PAR LE CCI DE CMS4 (P='12).
         LRP         L
         BR          -2,L            < VERS L'INITIALISATION.
         TABLE
X3:      VAL         $-NOEUD1
         DZS         LNOEUD-X3       < SUITE DE L'ESPACE DE NOEUD1.
         WORD        NOEUD1+XNOMC,X  < RELAI D'ACCES A <NOMC1>.
         WORD        NOEUD1+XNOM,X   < RELAI D'ACCES A <NOM1>.
NOEUD2:  DZS         LNOEUD          < NOEUD-FILS.
         WORD        NOEUD2+XNOMC,X  < RELAI D'ACCES A <NOMC2>.
         WORD        NOEUD2+XNOM,X   < RELAI D'ACCES A <NOM2>.
         PAGE
<
<
<        P I L E   D E   T R A V A I L  :
<
<
PILE:    VAL         'FF0-6          < 6 MOTS SONT RESERVES POUR
                                     < LA PILE DE TRAVAIL AU SOMMET
                                     < DE L'ESPACE MEMOIRE.
         PAGE
<
<
<        I T E M 1   E T   I T E M 2  :
<
<
ITEM1:   EQU         ZERO+PILE-LTNI
ITEM2:   EQU         ITEM1-LTNI
         PAGE
<
<
<        L O C A L  :
<
<
         LOCAL       LOCGE
LOC:     EQU         $
         IF          GIGE,,X100,
<
< MESSAGE DIVERS :
<
MERR:    BYTE        '6D;"!"
         ASCI        "ITEM2 "
X100:    VAL         0
<
<        D E M A N D E S   A   C M S 4  :
<
DEMIN:   WORD        '0101           < DEMANDE D'ENTREE AVEC ECHO.
         WORD        0               < @OCTET DU BUFFER.
         WORD        LNOM            < NBRE DE CARACTERES MAX A ENTRER.
DEMOUT:  WORD        '0202           < DEMANDE DE SORTIE.
         IF          GIGE,X100,,X100
         WORD        0               < @OCTET DU BUFFER.
X100:    VAL         0
         IF          GIGE,,X100,
         WORD        MERR-ZERO*2     < L'ADRESSE OCTET EST INITIALISEE
                                     < SUR LE MESSAGE D'ERREUR DE
                                     < TYPE DE L'ITEM2.
X100:    VAL         0
         WORD        7               < 7 CARACTERES DU <NOMC> A SORTIR.
DEMSGN:  WORD        '0402           < INITIALEMENT UN STORE DE 'GE    '
                                     < LUI-MEME.
         WORD        NOEUD1-ZERO*2   < @BRANCHE D'OVERLAY.
         WORD        ZERO-NOEUD1+PILE-LTNI-LTNI*2
         WORD        -1              < LA VALEUR SUIT IMMEDIATEMENT
                                     < LE NOM.
DEMAND:  DZS         3               < BLOC DE DEMANDE DE TRAVAIL.
<
<        C O N S T A N T E S  :
<
LISDEL:  WORD        0               < INDICATEUR DE LISTE AVEC OU
                                     < SANS DELETE :
                                     < LISDEL=0 : LISTE SEUL ,
                                     < LISDEL=3=CODE-DELETE-SGN : LISTE
                                     <          AVEC DELETE.
IMESS:   WORD        0               < INDEX COURANT DU MESSAGE IN.
F3:      WORD        0               < STOCKAGE INTERMEDIAIRE DE F3 :
                                     < F3=SIGMA(EOR(I*K(I))).
                                     < (APPROXIMATIVEMENT ????....)
ALITEM:  WORD        LITEM           < LONGUEUR MAX EN OCTETS DU
                                     < CORPS DE L'ITEM.
ALTNI:   WORD        LTNI            < LONGUEUR MAX TOTALE D'UN ITEM.
LOVL:    WORD        ZERO-NOEUD1+PILE-LTNI-LTNI*2
                                     < LONGUEUR EN OCTETS DES BRANCHES
                                     < D'OVERLAY.
RESTAR:  WORD        GEGRAF          < PRESC SPECIAL DE 'GE'/'GI'.
<
<        A D R E S S E S   D E   T A B L E S  :
<
AN1:     WORD        NOEUD1          < ADRESSE DU NOEUD1.
AN2:     WORD        NOEUD2          < ADRESSE DU NOEUD2.
AI1:     WORD        ITEM1           < ADRESSE DE ITEM1.
         IF          GIGE,X100,,X100
AI2:     WORD        ITEM2           < ADRESSE DE ITEM2.
X100:    VAL         0
         IF          GIGE,,X100,
AI2:     WORD        ITEM1           < A T T E N T I O N  : POUR 'GI' ,
                                     < L'ITEM2 EST EN RECOUVREMENT DE
                                     < L'ITEM1 (AFIN DE NE PAS DETRUIRE
                                     < L'ITEM2 QUI CONTIENT LA SAUITE
                                     < DES COMMANDES !!!).
X100:    VAL         0
AMESS:   WORD        MESSAG,X        < RELAI VERS LES MESSAGES IN.
APRIM:   WORD        PRIM,X          < RELAI VERS LA TABLE DES PRIMITIVES.
APILE:   WORD        PILE-1          < VALEUR INITIALE DU REGISTRE K.
<
<        R E L A I S   D E   R O U T I N E S  :
<
AOVL:    WORD        OVL             < INTERFACE DE CHARGEMENT DES
                                     < BRANCHES D'OVERLAY.
AGTCAR:  WORD        GETCAR          < ROUTINE D'ACCES A UN CARACTERE.
ASEEK:   WORD        SEEK            < ROUTINE DE RECHERCHE D'NUN
                                     < <NOMC> DANS UNE LISTE.
                                     < (DANS UNE LISTE A 8 ENTREES).
ASEEK1:  WORD        SEEK1           < ROUTINE DE RECHERCHE D'UN
                                     < <NOMC> DANS UNE LISTE A 16
                                     < ENTREES.
ASP2:    WORD        SP2             < ROUTINE POUR FAIRE DES SVC.
ASP3:    WORD        SP3             < ROUTINE DE CALCUL DE L'ADRESSE
                                     < DE L'ENTREE DANS UNE LISTE.
ACHKR:   WORD        CHKR            < RESTAURATION DE LA RACINE DU
                                     < CATALOGUE LORS DES LISTE-DELETE.
         IF          GIGE,,X100,
ABORTI:  WORD        ABORT           < ERREUR DE TYPE DE L'ITEM2.
<
< ENVOI EN ZDC :
<
VALZDC:  WORD        0               < MOT DE SYNCHRONISATION...
ZDC2:    DZS         XXNOMC/XXNOCM   < <NOMC> QUE L'ON ECHANGE...
         BYTE        XXEOT;0
LONZDC:: VAL         $-VALZDC*2
AZDC:    WORD        ZDC2,X          < POUR DEPLACER <NOMC>...
STOGS:   WORD        '000A           < ENVOI <NOMC> EN ZDC.
         WORD        VALZDC-ZERO*2
         WORD        LONZDC
         WORD        'FFC0
GETGS:   WORD        '0008           < ACCES A L'ACQUIITEMENT ZDC.
         WORD        VALZDC-ZERO*2
         WORD        ZDC2-VALZDC*2
         WORD        'C000
X100:    VAL         0
<
<
<        B U F F E R   D E   T R A V A I L  :
<
<
LMESS:   VAL         4               < NBRE DE CARACTERES MAX DE MESSAG.
MESSAG:  DZS         LMESS/2
                                     < (COMMANDES ET RACINE CATALOGUE)
         IF          GIGE,,X100,
<
<
<        C O N S T A N T E S   D E   S I M U L A T I O N
<                    D E S   S V C   I N  :
<
<
ASP4:    WORD        SP4             < ROUTINE DE SIMULATION SVC-IN.
AGI:     WORD        ITEM2+LTN,X     < RELAI VERS LE CORPS DE ITEM2.
XGI:     WORD        0               < INDEX COURANT DE L'ITEM2.
AGID:    WORD        0               < REALI DYNAMIQUE VERS LE BUFFER
                                     < DONT ON SIMULE LE SVC IN.
NCP:     WORD        NBCAR*NBLIG     < NBRE DE CARACTERES MAX PAR PAGE.
NGE:     ASCI        "GE"            < NOM DE LA BRANCHE A APPELER
                                     < EN CAS DE DEBORDEMENT ITEM2.
VOUT:    WORD        '0202           < POUR GENERER UNE DEMANDE
                                     < DE SORTIE SUR LE TERMINAL.
X100:    VAL         0
         PAGE
<
<
<        C O D A G E   < N O M >   E N   < N O M C >  :
<
<
<        FONCTION :
<                      CETTE ROUTINE CODE SUR 6 CARACTERES
<                    <NOMC> LES 'N' CARACTERES <NOM>
<                    D'UN NOEUD.
<                      CECI EST FAIT SUIVANT UN SUPERBE
<                    ALGORITHME DE COMPACTAGE PAS MAL
<                    UNIVOQUE ...
<
<
<        ARGUMENT :
<                    W=@NOEUD.
<
<
<        RESULTAT :
<                    X=0 (OK).
<
<
         PROG
         USE         W,NOEUD
CODAGE:  EQU         $
<
< INITIALISATION DU CODEUR :
<
         STZ         F3              < RAZ DE LA FONCTION F3.
         LYI         3               < 2*3 CARACTERES A METTRE A BLANC.
         LXI         0               < INDEX DE MISE A BLANC.
         LAI         '20
         SBT         2               < A='SPACE''SPACE'.
E1:      EQU         $
         STA         &ANOMC          < MISE DE <NOMC> A 'SPACE'.
         ADRI        1,X             < INDEX DE RAZ.
         CPR         X,Y
         JNE         E1              < NEXT ....
         LXI         -1              < X=INDEX CARACTERE.
                                     <   =F1=LONGUEUR DU MOT ENTRE.
         LBI         0               < B=F2.
<
<        UTILISATION DES REGISTRES :
<
<                    B=F2=EOR(K(I)) : EOR SUR TOUS LES
<                      CARACTERES DE K(4) A K(L).
<                      F2=EOR(K(4),K(5),...,K(L)) ,
<                    X=INDEX CARACTERES (IN ET OUT) ,
<                     =F1=LONGUEUR COURANTE DU MOT ENTRE (NBRE DE
<                      CARACTERES NON COMPRIS 'EOT') ,
<                    F3=CF. F2  , MAIS A CHAQUE EOR , LE
<                       RESULTAT INTERMEDIAIRE EST DECALE
<                       CIRCULAIREMENT.
<
<
< RECUPERATION DES 3 PREMIERS CARACTERES :
<
         BSR         AGTCAR          < A=K(1).
         JE          E2              < MOT VIDE , C'EST FINI.
         STBY        &ANOMC          < STORE : C(1)=K(1).
         BSR         AGTCAR          < A=K(2).
         JE          E2              < LE MOT N' A QU'UNE LETTRE.
         STBY        &ANOMC          < C(2)=K(2).
         BSR         AGTCAR          < A=K(3).
         JE          E2              < LE MOT N'A QUE 2 LETTRES.
         STBY        &ANOMC          < C(3)=K(3).
<
< CODAGE DES CARACTERES K(4),...,K(L) :
<
E3:      EQU         $
         BSR         AGTCAR          < A=K(I) , I=4,...,L.
                                     < (L DESIGNANT LA LONGUER DU
                                     < MOT A CODER).
         JE          E4              < ARRET DU CODAGE SUR 'EOT'.
         ADR         X,A             < LE CARACTERE COURANT (A) EST
                                     < 'PONDERE' PAR SA POSITION (X)
                                     < DANS LE MOT.
                                     < K(I)=K(I)+I.
         EORR        A,B             < CALCUL DE F2 :
                                     < F2=EOR(F2,K(I)).
         ADR         A,B             < F2=F2+K(I).
         EOR         F3              < CALCUL DE F3 :
                                     < A=EOR(F3,K(I)).
         SCLS        1               < DECALAGE CIRCULAIRE.
         STA         F3              < F3=SCLS(EOR(F3,K(I)),1).
         JMP         E3              < CODAGE DU CARACTERE SUIVANT.
<
< MISE SOUS FORME ASCI DES FONCTIONS F2 & F3 :
<
E4:      EQU         $
         LBY         F3              < A=OCTET0(F3).
         AD          F3              < A=F3+OCTET0(F3).
         ANDI        '7F             < A=OCTET0(F3)+OCTET1(F3).
                                     < (SUR 7 BITS).
         CPI         "Z"
         JLE         E5
         ADRI        -'30,A          < F3 EST MIS SOUS LA FORME D'UN
                                     < CODE INFERIEUR AU 'Z'.
E5:      EQU         $
         CPI         " "
         JG          E6
         ADRI        '30,A           < F3 EST DONC ENTRE LE 'Z'
                                     < (COMPRIS) ET LE 'SPACE' (NON
                                     < COMPRIS).
E6:      EQU         $
<        ON A ICI :
<                    A=F3=CARACTERE ASCI DE '!' (='21) A 'Z' (='5A) ;
<                          L'AMBIGUITE EST DONC POUR F3 DE '5A-'21.
         XR          A,B             < B=F3 , A=F2 A METTRE EN FORME.
         ANDI        '7F             < MISE SUR 7 BITS.
         CPI         "Z"
         JLE         E7
         ADRI        -'30,A          < ON RAMENE F2 A UN CODE INFERIEUR
                                     < A CELUI DU 'Z'.
E7:      EQU         $
         CPI         "0"
         JGE         E8
         ADRI        '20,A           < ON TENTE DE RAMENER F2 APRES
                                     < LE CODE DU '0' (ZERO).
         JMP         E7              < POURSUIVONS LA TENTATIVE ....
E8:      EQU         $
<        ON A ICI :
<                    A=F2=CARACTERE ASCI ALLANT DU '0' (COMPRIS)
<                          AU 'Z' (COMPRIS) ; L'AMBIGUITE DE F2 EST DONC
<                          DE '30-'5A :
<                                    AMBIGUITE(F2)<AMBIGUITE(F3).
         SWBR        A,A
         ORR         B,A             < A=F2.F3.
         STA         NOMC+2          < STORE : C(5)=F2 , C(6)=F3.
<
< CODAGE DE LA LONGUEUR DU MOT :
<
E2:      EQU         $
<        ON A ICI :
<                    X=LONGUEUR DU MOT ENTRE (NON COMPRIS 'EOT').
         LR          X,A
         ADRI        '30,A           < ON MET LA LONGUEUR SOUS FORME
                                     < D'UN CARACTERE ASCI QUI NOUS
                                     < DONNE F1 DONT L'AMBIGUITE EST
                                     < DE '30-.... , MAIS INFERIEUR A
                                     < CELLE DE F2 , ET DONC A CELLE
                                     < DE F3 A FORTIORI.
         LXI         3               < INDEX DE C(4).
         STBY        &ANOMC          < STORE : C(4)=F1.
         LXI         6               < INDEX DE C(7).
         LAI         '04             < 'EON' DE FIN DE NOM CODE.
         STBY        &ANOMC          < STORE : C(7)='EON'.
         LXI         0               < RETOUR OK.
         RSR
         PAGE
<
<
<        A C C E S   A   U N   C A R A C T E R E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE FAIT PROGRESSER L'INDEX
<                    CARACTERE COURANT (X) , LA LONGUEUR COURANTE
<                    DU MOT (X) ET ACCEDE LE CARACTERE COURANT ,
<                    APRES INCREMENTATION DE X ; ENFIN
<                    ELLE DIT SI LE CARACTERE ACCEDE EST
<                    OU N'EST PAS 'EOT'.
<
<
<        NOTA :
<                      UNE REPONSE EQUIVALENTE EST DONNEE
<                    DANS LE CAS OU LA LONGUEUR COURANTE
<                    ATTEINTE EST LA LONGUEUR MAX QUE
<                    PEUT ATTEINDRE UN <NOM>.
<
<
         USE         W,NOEUD
GETCAR:  EQU         $
         ADRI        1,X             < PROGRESSION DE L'INDEX CARACTERE
                                     < COURANT (AVANT ACCES !!!!).
                                     < ET PROGRESSION DE LA LONGUEUR
                                     < COURANTE.
         LR          X,A             < ACCES A LA LONGUEUR COURANTE.
         CPI         LNOM            < EST-ON AU BOUT DU <NOM> SANS
                                     < AVOIR RENCONTRE D''EOT' ???
         JE          E140            < OUI , ON FAIT COMME SI....
         LBY         &ANOM           < A=K(X).
         CPI         '04             < EST-CE 'EOT' ????
E140:    EQU         $
         RSR
         PAGE
         IF          GIGE,,X100,
<
<
<        S I M U L A T I O N   D E S   S V C   I N  :
<
<
<        FONCTION :
<                      CETTE ROUTINE QUI DISTINGUE 'GE'
<                    DE 'GI' PERMET DE DEROUTER LES SVC IN
<                    (SUR PHIN) , ET DE RECUPERER LES MESSAGES
<                    EQUIVQLENTS DANS L'ITEM2 . LE CARACTERE
<                    DE SEPARATION DE MESSAGE UTILISE
<                    EST ';' (ASSIMILE A L'EOT PAR LE
<                    SIMULATEUR ET D'AILLEURS RENVOYE
<                    PAR LUI A LA PLACE DES ';').
<
<
<        ARGUMENT :
<                    A=@DEMANDE A CMS4.
<
<
SP4:     EQU         $
         PSR         W               < SAVE W.
         LR          A,W             < W=@DE LA DEMANDE COURANTE.
         LA          0,W             < ACCES A LA FONCTION CONTENUE
                                     < DANS LA DEAMNDE.
         LR          A,Y             < SAVE EVENTUELLEMENT LE MOT0
                                     < DE LA DEMANDE DANS Y.
         ANDI        'F              < A=FONCTION DEMANDEE.
         CPI         2               < EST-CE UNE LECTURE ????
         JGE         E300            < NON , ON L'EXECUTE DONC.
<
< SIMULATION DES FONCTIONS DE LECTURE ('00 ET '01) :
<
         LB          2,W             < B=COMPTE D'OCTETS DEMANDES.
         LXI         -1              < PREPARATION DE L'INDEX DU
                                     < BUFFER DONT ON SIMULE LE SVC IN.
         LA          1,W             < A=@OCTET DU BUFFER.
         TBT         15              < AFIN DE SAVOIR SI ON COMMENCE
                                     < LE BUFFER SUR UNE FRONTIERE
                                     < DE MOT OU PAS ????
         ADCR        X               < X=-1 SI ON COMMENCE A UNE
                                     < FRONTIERE DE MOT ET X=0 SINON.
         SLRS        1               < CONVERSION EN UNE ADRESSE-MOT.
         SBT         0               < POSITIONNEMENT DU BIT INDEX.
         STA         AGID            < GENERATION DU RELAI VERS LE BUFFER
                                     < DONT ON SIMULE LE SVC IN.
         LY          XGI             < Y=INDEX COURANT VERS L'ITEM2.
<
< BOUCLE DE RECUPERATION DES CARACTERES DANS L'ITEM2 :
<
E301:    EQU         $
         ADRI        1,X             < PROGRESSION DE L'INDEX-BUFFER.
         XR          X,Y             < X=INDEX-ITEM2 , Y=INDEX-BUFFER.
         LR          X,A             < A=INDEX DE L'ITEM2.
         CP          NCP             < VALIDATION EN DEBORDEMENT ITEM2.
         JGE         E304            < LORS DES DEBORDEMENTS , ON
                                     < ABANDONNE LE PROCESSEUR 'GI'.
         LBY         &AGI            < A=CARACTERE COURANT ITEM2.
         ADRI        1,X             < PROGRESSION DE L'INDEX COURANT
                                     < DE L'ITEM2.
         XR          X,Y             < X=INDEX-BUFFER , Y=INDEX ITEM2.
         CPI         ";"             < TEST DE FIN DE MESSAGE ???
         JNE         E302            < NON.
         LAI         '04             < DANS LE CAS DE LA RENCONTRE DU
                                     < CARACTERE ';' , ON LE REMPLACE
                                     < PAR UN 'EOT' , ET ON FAIT
                                     < UNE FIN DE MESSAGE.
E302:    EQU         $
         STBY        &AGID           < MISE DU CARACTERE COURANT DANS
                                     < LE BUFFER DESTINATAIRE.
         JE          E303            < CAS DES FIN DE MESSAGE <EOT>.
         ADRI        -1,B            < SINON , DECOMPTE DU COMPTE
                                     < OCTETS DEMANDES.
         CPZR        B               < EST-CE FINI ???
         JNE         E301            < NON , ON CONTINUE LA SIMULATION.
<
< CAS DES FIN DE MESSAGE (POUR
< EOT OU POUR ANNULATION DU COMPTE OCTETS) :
<
E303:    EQU         $
         ADRI        1,X             < X=NBRE DE CARACTERES DONT
                                     < L'ENTREE A ETE SIMULEE.
         STX         2,W             < MISE EN PLACE DU COMPTE OCTETS
                                     < REEL DE LA DEMANDE.
         STY         XGI             < SAVE LE NOUVEL INDEX DE L'ITEM2.
         LY          0,W             < SAVE LE MOT0 DE LA DEMANDE
                                     < DANS Y.
         LA          VOUT
         STA         0,W             < LA DEMANDE D'ENTREE EST
                                     < TRANSFORMEE EN UNE DEMANDE
                                     < DE SORTIE.
<
< EXECUTION DES OPERATIONS DE SORTIE :
<
E300:    EQU         $
         LR          W,A             < RESTAURATION : A=@DEMANDE.
         SVC         0               < ENVOI D'1NE DEMANDE DE SORTIE.
         STY         0,W             < RESTAURE EVENTUELLEMENT LE
                                     < MOT0 DE LA DEMANDE (CAS IN).
         PLR         W               < RESTAURE W.
         RSR                         < RETOUR ...
<
< TRAITEMENT DES DEBORDEMENTS D'ITEM2 :
<
E304:    EQU         $
         ADRI        -1,K            < RATTRAPAGE DE LA PILE K ,
                                     < PAR PURE HYGIENE ....
GOGE:    EQU         $               < RETOUR A 'GE'.
         LA          AN1
         LR          A,W             < W=@NOEUD1.
         LA          NGE             < NOM DE LA BRANCHE A CHARGER
                                     < POUR RETOURNER A 'GE'.
         JMP         E305            < VERS LA TEANTATIVE DE CHARGEMENT
                                     < DE 'GE'.
<
<
<        E R R E U R   D E   T Y P E   D E   L ' I T E M 2  :
<
<
ABORT:   EQU         $
         LAD         DEMOUT
         SVC         0               < ENVOI D'UN MESSAGE D'ERREUR ...
         JMP         GOGE            < ET VERS L'ABORT DE 'GI'.
X100:    VAL         0
         PAGE
<
<
<        T E N T A T I V E S   D E   C H A R G E M E N T
<        D E S   B R A N C H E S   D ' O V E R L A Y  :
<                    S O U S   : S Y S
<
<
<        FONCTION :
<                      CETTE ROUTINE EST APPELEE LORSQU'UNE
<                    COMMANDE INCONNUE A DESTINATION
<                    DE 'GE' EST RECONNUE ; ELLE TENTE
<                    D'APPELER UNE BRANCHE D'OVERLAY
<                    QUI AURAIT SON NOM ET QUI SERAIT
<                    SOUS LE NUMERO DE COMPTE ':SYS'.
<
<
<        B R A N C H E S   D ' O V E R L A Y   R E C O N N U E S  :
<
<
<        ??          HELP ,
<        EX          EDITEUR EXAUSTIF DES NOMS SOUS UN <ACN>
<        ED          EDITEUR ALPHA-NUMERIQUE ,
<        GR          EDITEUR GRAPHIQUE ,
<        G2          EDITEUR GRAPHIQUE BI-DIMENSIONNEL ,
<        G3          EDITEUR GRAPHIQUE TRI-DIMENSIONNEL ,
<        GV          EDITEUR GRAPHIQUE ET VIDEO TRI-DIMENSIONNEL ,
<        DE          SIMULATEUR DE FLOPPY SUR VISUS ,
<        TV          GENERATEUR DE VIDEO SYNTHETIQUE ,
<        TI          GENERATEUR VIDEO SYNTHETIQUE INTERPRETATIF ,
<        RE          REGIE VIDEO SIMULEE SUR LA BAIE DE COMMUTATION ,
<        SO          ORGUE ELECTRONIQUE ,
<        VG          CONVERTISSEUR VIDEO --> GRAPHIQUE ,
<        SC          GESTION DE L'ENCHAINEMENT DES IMAGES VIDEOS ,
<        GC          ASSEMBLEUR+CHARGEUR
<        3D          RUNNER ET PROCESSEUR GRAPHIQUE ,
<        KA          ITEM A CARTE , ET IMPRIMANTE ,
<        SA          SAVE/RESTORE TOUTE VALEUR DU SGN ,
<        EI          PARCOURS AUTOMATIQUE DU GRAPHE ,
<        GO          INITIALISATION DU PARCOURS DU GRAPHE ,
<        GE          GESTION DU GRAPHE ,
<        PH          ANALYSEUR DU FRANCAIS ,
<        SE          SERVICES DIVERS.
<        VI          PROCESSEUR DES ITEMS VIDEOS ,
<
<
<        ARGUMENT :
<                    W=@NOEUD1.
         IF          GIGE,,X100,
<                    A=NOM DE LA BRACHE A CHARGER POUR L'ENTRY E305.
X100:    VAL         0
<
<
<        RESULTAT :
<                    X#0 : LA BRANCHE DEMANDEE N'EXISTE PAS SOUS :SYS.
<
<
         USE         W,NOEUD
LOADP:   EQU         $
         LA          MESSAG          < ACCES AUX 2 CARACTERES DE LA
                                     < COMMANDE NON RECONNUE.
         IF          GIGE,,X100,
E305:    EQU         $               < ENTRY RESERVEE PUR LES DEBOR-
                                     < DEMENTS DE L'ITEM2 EN SIMULATION.
X100:    VAL         0
         STA         NOMC            < QUE L'ON MET EN K1 ET K2.
         ANDI        'FF             < A=K2.
         CPI         '04             < TEST D'UNE COMMANDE FAITE D'UN
                                     < SEUL CARACTERE ; EN EFFET
                                     < SI LA RACINE DE L'ARBRE DU
                                     < SYSTEME A ETE INITIALISE PAR
                                     < SYSCAT , LES NOMS D'1 SEUL
                                     < CARACTERE EXISTENT TOUS , ET
                                     < ON VA DONC AVOIR UN RETOUR OK !!!
         JE          E710            < ERREUR : UN SEUL CARACTERE.
         LAI         '20
         SBT         2               < A='  '.
         STA         NOMC+1          < K3 ET K4 SONT MIS A 'SPACE'.
         STA         NOMC+2          < K5 ET K6 SONT MIS A 'SPACE'.
         LAI         '04             < <EON>.
         STBY        NOMC+3          < K7='EOT'.
         LA          LOVL
         STA         DEMSGN+2        < MAJ DU COMPTE D'OCTETS DE DEMSGN.
         LR          W,A             < A=@MOT DE NOEUD1.
         ADR         A,A             < A=@OCTET DE NOEUD1.
         STA         DEMSGN+1        < MAJ DE DEMSGN AVEC L'@OCTET.
         LAI         6               < NVP DE 'LOAD' SOUS :SYS.
                                     < MENT DE BRANCHES SOUS :SYS.
         STBY        DEMSGN          < MISE EN PLACE DU NVP DE CHARGE-
         LAI         GE-ZERO
         WORD        '1EB5           < RESTAURE LE PRESC IMPLICITE.
<
<        A T T E N T I O N  :
<                      CETTE SOLUTION N'EST PAS INFAILLIBLE :
<                    IL SUFFIT QU'UN ALT-MODE APPARAISSE ENTRE
<                    LA RESTAURATION DU PRESC , ET LE SVC AU
<                    SGN DE AOVL , POUR QUE 'GE'/'GI' PARTE EN
<                    <TRAPPE> !!!.
<
         LAD         DEMSGN          < A=@DEMSGN.
         BSR         AOVL            < TENTATIVE DE CHARGEMENT DE
                                     < LA BRANCHE D'OVERLAY.
<
< RETOUR EN ERREUR : X#0 :
< (LA BRANCHE EST INCONNUE)
<
E710:    EQU         $               < CAS DES COMMANDES D'UN SEUL
                                     < CARACTERE.
         LA          RESTAR
         WORD        '1EB5           < EN CAS D'ERREUR , ON RESTAURE
                                     < LE PRESC SPECIAL DE 'GE'/'GI'.
         RSR                         < RETOUR EN ERREUR.
         PAGE
<
<
<        R A Z   D ' U N   N O E U D  :
<
<
<        FONCTION :
<                      CETTE ROUTINE REMET A '0000 LES
<                    'LNOEUD' MOTS D'UN NOEUD.
<
<
<        ARGUMENT :
<                    W=@NOEUD.
<
<
<        RESULTAT :
<                    X=0 (OK).
<
<
         USE         W,NOEUD
RAZN:    EQU         $
         STZ         TOPN            < RAZ DU DERNIER MOT DU NOEUD.
         LR          W,B             < B=@NOEUD (=@RECEPTEUR).
         LR          W,A
         ADRI        1,A             < A=@NOEUD+1 (=@EMETTEUR).
         LXI         LNOEUD-1        < NBRE DE MOTS RESTANT A RAZER.
         MOVE                        < RAZ (HABILE , N'EST-IL PAS !?!!?)
         RSR                         < RETOUR AVEC X=0 (OK).
         PAGE
<
<
<        R E C U P E R A T I O N   N A T U R E   I T E M  :
<
<
<        FONCTION :
<                      CETTE ROUTINE RECUPERE LA NATURE
<                    DE L'ITEM , TELLE QU'ELLE A ETE
<                    PRECISEE DANS IINDIC PAR LE PROCESSEUR
<                    QUI L'A CREE . SI L'ITEM N'A PAS ENCORE
<                    ETE CREE (SI CE N'EST PAR 'I+') ,
<                    ELLE RENVOIE 'V' POUR 'VIDE'.
<
<
<        ARGUMENT :
<                    W=@ITEM COURANT.
<
<
<        RESULTAT :
<                    B=CARACTERE ASCI (NATURE).
<
<
         USE         W,HITEM
TYPI:    EQU         $
         LBY         IINDIC          < RECUPERATION DE L'OCTET0 DE
                                     < IINDIC (NATURE DE L'ITEM).
         JANE        E160            < OK , L'ITEM N'EST PAS VIDE.
         LAI         "V"             < SI L'ITEM EST VIDE (MAIS
                                     < EXISTANT) , ON RENVOIE 'V' ,
                                     < POUR 'VIDE'.
E160:    EQU         $
         LR          A,B             < B=NATURE EXPRIMEE EN ASCI.
         RSR
         PAGE
<
<
<        I N D I C A T E U R   T Y P E - I T E M  :
<
<
<        FONCTION :
<                      CETTE ROUTINE MEMORISE DANS LA
<                    ZONE POINTEE PAR W , QU'ELLE A
<                    LE TYPE-ITEM.
<
<
<        ARGUMENT :
<                    W=@ZONE (NOEUD OU ITEM).
<
<
         USE         W,NOEUD
INDICI:  EQU         $
         LAI         'C9             < CARACTERE 'I' AVEC EB0=1.
         JMP         E50             < VERS LE TRONC COMMUN NOEUD/ITEM.
         PAGE
<
<
<        I N D I C A T E U R   T Y P E - N O E U D  :
<
<
<        FONCTION :
<                      CETTE ROUTINE MEMORISE DANS LA
<                    ZONE POINTEE PAR W , QU'ELLE A
<                    LE TYPE-NOEUD.
<
<
<        ARGUMENT :
<                    W=@NOEUD COURANT.
<
<
         USE         W,NOEUD
INDICN:  EQU         $
         LAI         'CE             < CARACTERE 'N' AVEC EB0=1.
E50:     EQU         $
         LXI         7               < INDEX DU CARACTERE SUIVANT
                                     < L'<EON> DE <NOMC>.
         STBY        &ANOMC
         LXI         0               < RETOUR OOK.
         RSR
         PAGE
<
<
<        T E S T   T Y P E   I T E M   O U   N O E U D  :
<
<
<        FONCTION :
<                      CETTE ROUTINE TESTE QUE LA ZONE
<                    PINTEE PAR W A BIEN LE TYPE QUI
<                    EST CONTENU DANS LE 2EME CARACTERE
<                    DE LA COMMANDE PRECEDENTE.
<
<
<        ARGUMENT :
<                    W=@ZONE NOEUD/ITEM.
<
<
<        RESULTAT :
<                    X=0 : TYPE ATTENDE ,
<                     #0 : NON-TYPE ATTENDE.
<
<
         USE         W,NOEUD
CHKIN:   EQU         $
         LA          F3              < RECUPERATION DU 2EME CARACTERE
                                     < DE LA COMMANDE PRECEDENTE
                                     < (SOIT -I , SOIT -N).
         ORI         '80             < ON FORCE LE BIT0 DU CARACTERE.
         JMP         E70             < VERS LE TEST ...
<
<
<        T E S T   T Y P E - N O E U D  :
<
<
<        FONCTION :
<                      CETTE ROUTINE TESTE QUE LA ZONE POINTEE
<                    PAR W A BIEN LE TYPE-NOEUD.
<
<
<        ARGUMENT :
<                    W=@NOEUD.
<
<
<        RESULTAT :
<                    X=0 : TYPE-NOEUD ,
<                     #0 : PAS TYPE-NOEUD.
<
<
         USE         W,NOEUD
CHKN:    EQU         $
         LAI         'CE
E70:     EQU         $               < ENTRY 'TETS TYPE-ITEM'.
         SBT         5               < A=VALEUR ATTENDUE :
                                     < OCTET0=<EON> ,
                                     < OCTET1='N'/'I'+'80.
         SB          NOMC+3          < LE RESULTAT (A) SERA NUL SI
                                     < ON EST BIEN EN PRESENCE D'UN NOEUD
                                     < OU D'UN ITEM.
         LR          A,X             < X=0 : ON EST BIEN EN PRESENCE
                                     < DU TYPE TESTE.
         RSR
<
<
<        T E S T   T Y P E - I T E M  :
<
<
<        FONCTION :
<                      CETTE ROUTINE TESTE QUE LA ZONE
<                    POINTEE PAR W A BIEN LE TYPE-ITEM.
<
<
<                    W=@NOEUD.
<
<
<        RESULTAT :
<                    X=0 : LA ZONE A BIEN LE TYPE-ITEM ,
<                     #0 : ET BIEN NON.
<
<
CHKI:    EQU         $
         LAI         'C9
         JMP         E70             < VERS LE TRONC COMMUN 'NOEUD'
                                     < ET 'ITEM'.
         PAGE
<
<
<        T E S T   I T E M   A T T A C H E   A U   N O E U D  :
<
<
<        FONCTION :
<                      CETTE ROUTINE TESTE SI UN
<                    ITEM EST ATTACHE AU NOEUD
<                    COURANT.
<
<
<        ARGUMENT :
<                    W=@NOEUD COURANT.
<
<
<        RESULTAT :
<                    X=0 : PAS OU PLUS D'ITEM ATTACHE ,
<                     =1 : ITEM ATTACHE AU NOEUD.
<
<
         USE         W,NOEUD
CHKNI:   EQU         $
         LXI         0               < PAS OU PLUS D'ITEM A PRIORI.
         LA          INDIC           < ACCES AUX INDICATEURS.
         TBT         BITEM           < TEST DU BIT 'ITEM ATTACHE'.
         ADCR        X               < X=1 SI UN ITEM EST ATTACHE.
         RSR
         PAGE
<
<
<        A C C E S   A U   S G N  :
<
<
<        FONCTION :
<                    CES MODULES ACCEDENT AU SGN POUR
<                    UNE FONCTION DETERMINEE (TEST ,
<                    DELETE , ECRIRE) ; DE PLUS ELLE
<                    METTE COMME @OCTET DANS DEMSGN ,
<                    L'ADRESSE DU NOEUD COURANT.
<
<
<        ARGUMENT :
<                    W=@NOEUD.
<
<
<        RESULTAT :
<                    X=CONDITIONS DE RETOUR DU SGN.
<
<
<
<        E N T R I E S   I T E M  :
<
         USE         W,HITEM
WSGNI:   EQU         $
         LAI         4               < 'STORE' <NOMC>+<VALEUR>.
         LY          LRITEM          < LONGUER REELLE EN OCTETS
                                     < DU CORPS DE L'ITEM.
         JMP         E82
LSGNI:   EQU         $
         LBY         DEMSGN          < LE NVP DE DEMSGN EST DEJA POSI-
                                     < TIONNE :
                                     < NVP=5 : LOAD SOUS L'<ACN> ,
                                     < NVP=6 : LOAD SOUS :SYS.
         JMP         E200            < VERS LA RESTAURATION DU NVP ; SA
                                     < VALEUR (5 OU 6) VA RESTER
                                     < INCHANGEE.
TSGNI:   EQU         $
         LAI         5               < 'LOAD' & 'TEST' <VALEUR> A
                                     < PARTIR DE <NOMC>.
E200:    EQU         $               < ENTRY NVP DEJA POSITIONNE.
         LY          ALITEM          < LONGUEUR MAXIMALE EN OCTETS
                                     < DU CORPS DE L'ITEM.
E82:     EQU         $               < TRONC COMMUN AUX 3 FONCTIONS.
         ADRI        XWORK2,Y
         ADRI        XWORK2,Y        < LONGUEUR TOTALE EN OCTETS DE
                                     < L'ITEM (EN-TETE+CORPS).
         JMP         E81             < VERS LE TRONC COMMUN ITEM/NOEUD.
<
<        E N T R I E S   N O E U D  :
<
         USE         W,NOEUD
WSGN:    EQU         $
         LAI         4               < 'STORE' <NOMC>+<VALEUR>.
         JMP         E10
TSGN:    EQU         $
         LAI         5               < FONCTION 'LOAD' (& 'TEST')
                                     < <VALEUR> A PARTIR DE <NOMC>.
         JMP         E10
DSGN:    EQU         $
DSGNI:   EQU         DSGN
         LAI         3               < FONCTION 'DELETE' <NOMC>+
                                     < <VALEUR>.
E10:     EQU         $               < TRONC COMMUN AUX 3 FONCTIONS.
         LYI         2*LNOEUD        < NBRE D'OCTETS D'UN NOEUD.
E81:     EQU         $               < TRONC COMMUN NOEUD/ITEM.
<        ON A ICI :
<                    A=NVP D'ACCES AU SGN ,
<                    Y=NBRE D'OCTETS DEMANDES.
         STY         DEMSGN+2        < MISE EN PLACE DU COMPTE D'OCTETS.
E400:    EQU         $               < ENTRY LISTAGE AVEC DELETE.
         STBY        DEMSGN          < MISE EN PLACE DU NVP EXECUTANT
                                     < LA FONCTION DEMANDEE.
         LR          W,A             < A=@MOT DU NOEUD COURANT.
         ADR         A,A             < A=@OCTET DU NOEUD COURANT.
         STA         DEMSGN+1        < MISE EN PLACE DE L'@OCTET DU
                                     < NOEUD COURANT DANS DEMSGN.
         LAD         DEMSGN
         SVC         0               < ENVOI DE LA DEMANDE AU SGN (CMS4)
E401:    EQU         $               < ENTRY LISTAGE SANS DELETE.
         RSR                         < X=CONDITIONS DE RETOUR ...
<
<
<        D E L E T E   L O R S   D E S   L I S T A G E S  :
<
<
DSGNG:   EQU         $
         LA          LISDEL          < RECUPERATION DE L'INDICATEUR.
         JAE         E401            < C'EST UN LISTAGE SANS DELETE.
         JMP         E400            < C'EST UN LISTAGE AVEC DELETE ,
                                     < ET A=3=FONCTION DE DELETE SGN.
<
<
<        C H O I X   D U   D E L E T E   L O R S   D E S   L I S T E S :
<
<
<        ARGUMENT :
<                    B=VALEUR A DONNER A LISDEL.
<
<
<        FAIT UN RETOUR EN ERREUR AVEC X=1 !!!!
<
<
INDLD:   EQU         $
         STB         LISDEL          < SAVE L'INDICATEUR.
         LX          IMESS           < X=INDEX COURANT DU BUFFER.
                                     < A NOTER : X=1#0 !!!!
         LBY         &AMESS          < A=TYPE ATTENDE ('I'/'N').
         STA         F3              < SAUVEGARDE TEMPORAIRE DU 2EME
                                     < CARACCTERE DE LA COMMANDE
                                     < COURANTE DANS F3.
         RSR                         < RETOUR INDIFFERENT ....
         PAGE
<
<
<        S E L E C T I O N   N U M E R O   D E   C O M P T E  :
<
<
<        ARGUMENT :
<                    B="L" : UN CHARGEMENT SOUS <ACN> A ETE DEMANDE ,
<                     ="U" : UN CHARGEMENT SOUS :SYS A ETE DEMANDE.
<
<
<        RESULTAT :
<                    DEMSGN=5 : 'LOAD' SOUS <ACN> ,
<                          =6 : 'LOAD' SOUS :SYS.
<
<
STACN:   EQU         $
         LAI         5               < NVP=5 A PRIORI ('LOAD' SOUS
                                     < L'<ACN> DE L'UTILISATEUR).
         TBT         11+16           < DISCRIMINATION DU MODE DE
                                     < CHARGEMENT DEMANDE :
                                     < "L"='4C : BIT11(B)=0 ,
                                     < "U"='55 : BIT11(B)=1.
         ADCR        A               < A=6 SI "U" ('LOAD' SOUS :SYS).
         STBY        DEMSGN          < MISE EN PLACE DU NVP DU 'LOAD'
                                     <A VENIR DANS DEMSGN.
         RSR                         < RETOUR INDIFFERENT (X) , CAR
                                     < APPEL EN SEQUENTIEL.
         PAGE
<
<
<        A C C E S   A U   T E R M I N A L  :
<
<
<        FONCTION :
<                      FAIRE DES ENTREES-SORTIES SUR
<                    LA CONSOLE UTILISATEUR.
<                    NOMIN : ENTRER <NOM> ,
<                    EDITN : EDITER <NOM>.
<                    NOMOUT : EDITER <NOMC> ,
<
<
<        ARGUMENT :
<                    W=@NOEUD COURANT.
<
<
<        RESULTAT :
<                    X=CONDITIONS DE RETOUR DE CMS4.
<
<
         USE         W,NOEUD
NOMIN:   EQU         $               < ENTREE.
         LYI         XNOM            < DEPLACEMENT DE <NOM> DANS NOEUD.
         IF          GIGE,,X100,
         LAI         LNOM            < A=LONGUEUR MAX D'UN NOM.
         STA         DEMIN+2         < RESTAURE LE COMPTE D'OCTETS
                                     < DE LA DEMANDE DEMIN.
X100:    VAL         0
         LAD         DEMIN           < A=@DEMANDE IN.
         JMP         E11
EDITN:   EQU         $
         LYI         XNOM            < DEPLACEMENT DE <NOM> DANS NOEUD.
         LXI         3               < ACCES A LA LONGUEUR DANS <NOMC>.
         LBY         &ANOMC          < A=LONGUEUR DE <NOM>.
         ADRI        -'30,A          < QUE L'ON CONVERTIT D'ASCI
                                     < EN BINAIRE.
         JAE         E80             < CAS DU NOM VIDE ('EOT' TRANSFORME
                                     < EN '   0  ' PAR LE CODAGE.
         JMP         E55             < VERS L'EDITION.
NOMOUT:  EQU         $               < SORTIE.
         LYI         XNOMC           < DEPLACEMENT DE <NOMC> DANS NOEUD.
         LAI         6               < 6 OCTETS A EDITER POUR <NOMC>.
E55:     EQU         $               < TRONC COMMUN EDITN & NOMOUT.
         STA         DEMOUT+2        < MAJ COMPTE D'OCTET DE DEMOUT.
         LAD         DEMOUT          < A=@DEMANDE OUT.
E11:     EQU         $               < TRONC COMMUN IN & OUT.
         ADR         W,Y             < Y=@MOT DE <NOM>/<NOMC>.
         ADR         Y,Y             < Y=@OCTET DE <NOM>/<NOMC>.
         XR          A,W             < W=@DEMANDE IN / OUT.
         STY         1,W             < MISE EN PLACE DE L'ADRESSE-
                                     < OCTET DU BUFFER (B).
         XR          A,W             < A=@DEMANDE ; W=@NOEUD.
         IF          GIGE,X100,,X100
         SVC         0               < ENVOI DE LA DEMANDE A CMS4.
X100:    VAL         0
         IF          GIGE,,X100,
         BSR         ASP4            < SIMULATION DANS LE CSA DES
                                     < SVC IN.
X100:    VAL         0
         RSR                         < X=CONDITIONS DE RETOUR DE CMS4.
         PAGE
         IF          GIGE,,X100,
<
<
<        E N V O I   < N O M C >   E N   Z D C  :
<
<
STOZDC:  EQU         $
<
< TRANSFERT DE <NOMC> :
<
         LXI         XXNOMC          < (X)=INDEX DES CARACTERES,
STOZ1:   EQU         $
         LBY         &ANOMC
         STBY        &AZDC           < TRANSFERT DE <NOMC>...
         ADRI        -1,X
         CPZR        X
         JGE         STOZ1
<
< ATTENTE DE LIBERTE DE LA ZDC :
<
         LAD         GETGS
STOZ2:   EQU         $
         SVC         0               < LECTURE DE 'VALZDC' :
         CPZ         VALZDC          < ALORS ???
         JNE         STOZ2           < PAS LIBRE...
<
< ENVOI EN ZDC :
<
         DC          VALZDC          < VALEUR DE SYNCHRONISATION,
         LAD         STOGS
         SVC         0               < ET ENVOI...
         RSR
X100:    VAL         0
         PAGE
<
<
<        M I S E   E N   P L A C E   D E
<        L ' I T E M   C O U R A N T  :
<
<
<        RESULTATS :
<                    W=@ITEM1 OU ITEM2 ,
<                    X=0 (OK).
<
<
         USE         W,NOEUD
IC1:     EQU         $
         LA          AI1             < A=@ITEM1.
         JMP         E12
IC2:     EQU         $
         LA          AI2             < A=@ITEM2.
         JMP         E12
         PAGE
<
<
<        M I S E   E N   P L A C E   D U
<        N O E U D   C O U R A N T  :
<
<
<
<        RESULTAT :
<                    W=@NOEUD1 OU NOEUD2.
<                    X=0 (OK).
<
<
         USE         W,NOEUD
NC1:     EQU         $
         LA          AN1             < A=@NOEUD1.
         JMP         E12
NC2:     EQU         $
         LA          AN2             < A=@NOEUD2.
E12:     EQU         $
         LR          A,W             < W=@NOEUD1/NOEUD2.
<
< RETOUR OK :
<
E80:     EQU         $
         LXI         0               < RETOUR OK.
         RSR
         PAGE
<
<
<        V A L I D A T I O N   D E   L A   R A C I N E
<                    D U   C A T A L O G U E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE RECUPERE DANS 'MESSAG' LA RACINE
<                    DEMANDEE POUR LE CATALOGUE ; ELLE LA DEPLACE
<                    DANS <NOMC> DU NOEUD COURANT , EN LA
<                    VALIDANT.
<                      CETTE RACINE NE PEUT AVOIR QUE 3
<                    CARACTERES AU MAXIMUM (0 EST LE MINIMUM...) ,
<                    ET SE TERMINER PAR UN 'EOT'.
<
<
<        ARGUMENT :
<                    W=@NOEUD COURANT.
<
<
<        RESULTAT :
<                    X=0 : RACINE CORRECTE ,
<                     #0 : RACINE INCOREECTE ,
<                    IMESS=DEMSGN+2=NBRE DE CARACTERES DE
<                                   LA RACINE SI ELLE N'EST PAS
<                                   VIDE , 1 SI ELLE EST VIDE
<                                   ('EOT' SEUL).
<
<
         USE         W,NOEUD
CHKR:    EQU         $
         LXI         0               < INDEX DE AMESS.
         LYI         4               < POUR LE TEST DE FIN.
<
< BOUCLE DE RECUPERATION DE LA RACINE :
<
E94:     EQU         $
         LBY         &AMESS
         STBY        &ANOMC          < ENVOI DANS <NOMC>.
         CPI         '04             < EST-CE UN 'EOT' ???
         JE          E95             < OUI , ARRET DE LA RECUPERATION.
         ADRI        1,X             < PROGRESSION DE L'INDEX.
         CPR         X,Y
         JNE         E94             < IL RESTE DES CARACTERES A
                                     < RECUPERER.
<
< CAS OU ON A TESTE 4 CARACTERES SANS ATTEINDRE
< UN 'EOT' : ERREUR : RACINE ERRONNEE :
< (CODE X=4)
<
E96:     EQU         $
         RSR                         < RETOUR.
<
< CAS D'UN 'EOT' :
<
E95:     EQU         $
         STX         IMESS           < SAVE LONGUEUR INITIALE DANS
                                     < IMESS POUR TEST DE PARCOURS DE
                                     < L'ARBRE.
         CPZR        X               < L''EOT' ETAIT-IL AU 1ER RANG ...
         JNE         E97             < NON , X EST BON.
         LXI         1               < DANS LE CAS D'UN 'EOT' AU 1ER
                                     < RANG , ON FORCE X=1.
E97:     EQU         $
         STX         DEMSGN+2        < INITIALISATION DE DEMSGN.
         LR          W,A
         ADR         A,A             < A=@OCTET DU NOEUD COURANT.
         STA         DEMSGN+1        < INITIALISATION DE DEMSGN.
         LXI         0               < EN VUE D'1N RETOUR OK.
         JMP         E96
         PAGE
<
<
<        R E C O N S T I T U T I O N   D U   C A T A L O G U E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE RECHERCHE DANS
<                    LE CATALOGUE DES NOMS DE CE NUMERO
<                    DE COMPTE LES NOMS DE 6 CARACTERES DU
<                    TYPE :
<                    <K1><K2><K3><K4><K5><K6><EOT> ,
<                    LORSQU'IL EN A TROUVE UN , IL
<                    REND LA MAIN ; IL L'A RECUPERE
<                    POUR ALLER CHERCHER LE SUIVANT.
<                    CATAL1 : ENTREE A UTILISER LA 1ERE FOIS ,
<                    CATAL2 : ENTREE A UTILISER LES FOIS SUIVANTE.
<
<
<        ARGUMENT :
<                    W=@NOEUD COURANT.
<
<
<        RESULTAT :
<                    X=0 : UN <NOMC> A ETE DECOUVERT ,
<                     #0 : PAS OU PLUS DE <NOMC>.
<
<
         USE         W,NOEUD
<
<        1 E R E   E N T R Y  :
<
CATAL1:  EQU         $
         LAI         9               < NVP=NEXT-SERIE.
         BSR         ASP2            < DEMANDE D'ACCES AU NEXT-SERIE.
         JAE         E101            < LE NEXT-SERIE EXISTE , OK.
         CPI         5
         JNE         E105            < AUTRE ERREUR , SORTIE ; A
                                     < NOTER : X#0 !!!!
<
< CAS OU LE NEXT-SERIE N'EXISTE PAS :
<
E102:    EQU         $
         LAI         8               < NVP=NEXT-PARALLELE.
         BSR         ASP2            < DEMANDE D'ACCES AU NEXT-PARALLELE
         JAE         E402            < OK , LE SUIVANT PARALLELE
                                     < EXISTE.
         CPI         5               < SINON , QUELLE EST LA NATURE
                                     < DU RETOUR ????
         JE          E103            < LE NEXT PARALLELE N'EXISTE PAS ,
                                     < A NOTER : X#0 !!!!
<
< AUTRES CAS : CERTAINEMENT LE NOM
< N'EXISTE PAS PARCEQUE ON EST EN TRAIN
< DE FAIRE UN DELETE SIMULTANEMENT , ON
< VA DONC REINITIALISER LE PARCOURS DU
< CATALOGUE : C'EST PLUS SIMPLE ...
<
         BSR         ACHKR           < RESTAURATION DE LA RACINE DU
                                     < CATALOGUE ET REINITIALISATIONS.
         JMP         CATAL1          < ET C')ST REPARTI COMME
                                     < AU COMMENCEMENT ....
<
< CAS OU LE NEXT-PARALLELE EXISTE :
<
E402:    EQU         $
         LX          DEMSGN+2        < X=LONGUEUR COURANTE DU MOT
                                     < ARGUMENT.
         LBY         &ANOMC          < ACCES AU NEXT-PARALLELE.
         ADRI        -1,X
         STBY        &ANOMC          < QUE L'ON MET A LA PLACE DU
                                     < DERNIER CARACTERE DU NOM.
E104:    EQU         $
         LA          DEMSGN+2
         CPI         7
         JNE         CATAL1          < ON N'A PAS ENCORE ATTEINT LA
                                     < LONGUEUR FATIDIQUE DE 7 LETTRES.
<
< CAS OU LA LONGUEUR COURANTE EST 7 :
<
         LBY         NOMC+3          < ACCES AU CARACTERE K7.
         CPI         '04             < EST-CE UN 'EOT' ???
         JNE         E102            < NON , LE NOM COURANT N'EST
                                     < DONC PAS UN NOMC.
<
< CAS D'UN 'EOT' COMME K7 . IL Y A
< PRESOMPTION DE <NOMC> :
<
         LXI         0               < SORTIE OK (POSSIBILITE DE <NOMC>)
<
< SORTIE DE LA ROUTINE :
<
E105:    EQU         $
         RSR
<
< CAS OU LE NEXT-PARALLELE N'EXISTE PAS :
<
E103:    EQU         $
         DC          DEMSGN+2        < RETOUR D'UN RANG VERS LA RACINE.
         LA          DEMSGN+2
         CP          IMESS           < EST-ON DE RETOUR SUR LA RACINE ???
         JE          E105            < OUI , SORTIE DE TYPE FIN : A
                                     < NOTER QUE X=5#0 !!!!
         JMP         E102            < VERS LA RECHERCHE DU NEXT-
                                     < PARALLELE.
<
<        E N T R I E S   S U I V A N T E S  :
<
CATAL2:  EQU         $
         LAI         6
         STA         DEMSGN+2        < DANS LE CAS DES ENTREES SUIVANTES
                                     < ON REINITIALISE LA LONGUEUR
                                     < COURANTE A 6 , CAR ON ETAIT SORTI
                                     < AVEC 7.
         JMP         E102            < VERS LA RECHERCHE DU NEXT-
                                     < PARALLELE.
<
< CAS OU LE NEXT-SERIE EXISTE :
<
E101:    EQU         $
         IC          DEMSGN+2        < ON S'ELOIGNE D'UN CRAN DE
                                     < LA RACINE.
         JMP         E104            < VERS LA RECHERCHE DU NEXT-SERIE.
         PAGE
<
<
<        A C C E S   A U   S G N   P O U R   C A T A L O G U E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE MET EN PLACE
<                    LE NVP DEMANDE , ENVOIE LA
<                    DEMANDE AU SGN , ET ENFIN RECUPERE
<                    LES CONDITIONS DE RETOUR DU SGN.
<
<
<        ARGUMENT :
<                    A=NVP DEMANDE.
<
<
<        RESULTAT :
<                    A=X=CONDITIONS DE RETOUR DU SGN.
<
<
SP2:     EQU         $
         STBY        DEMSGN          < MISE EN PLACE DU NVP.
         LAD         DEMSGN
         SVC         0               < ENVOI DE LA DEMANDE AU SGN.
         LR          X,A             < A=X=CONDITIONS DE RETOUR.
         RSR
         PAGE
<
<
<        G E N E R A T I O N   D E S   R E L A I S
<        V E R S   N O M   E T   N O M C  :
<
<
<        FONCTION :
<                      CETTE ROUTINE UTILISEE SURTOUT
<                    POUR LES ITEMS GENERE LES RELAIS
<                    ANOMC ET ANOM VERS NOMC ET NOM.
<
<
<        ARGUMENT :
<                    W=@ZONE A INITIALISER.
<
<
<        RESULTAT :
<                    X=0 (OK).
<
<
         USE         W,NOEUD
GANOM:   EQU         $
         LR          W,A             < A=@ZONE.
         SBT         0               < MISE EN PLACE DU BIT INDEX.
         ADRI        XNOMC,A         < DEPLACEMENT DE (W) VERS NOMC.
         STA         ANOMC           < MISE EN PLACE DE ANOMC.
         ADRI        XNOM-XNOMC,A    < DEPLACEMENT DE (W) VERS NOM.
         STA         ANOM            < MISE EN PLACE DE ANOM.
         JMP         E80             < VERS UN RETOUR OK.
         PAGE
<
<
<        I N I T I A L I S A T I O N   L R I T E M  :
<
<
<        ARGUMENT :
<                    W=@ITEM.
<
<
<        RESULTAT :
<                    X=0 (OK).
<
<
         USE         W,HITEM
ILONG:   EQU         $
         STZ         LRITEM          < RAZ DE LRITEM.
         USE         W,NOEUD         < FAUT ETRE PRUDENT ....
         JMP         E80             < VERS UN RETOUR OK.
         PAGE
         IF          GIGE,X100,,X100
<
<
<        M O U V E M E N T   I T E M   C O U R A N T  :
<
<
<        FONCTION :
<                      CETTE ROUTINE DEPLACE L'ITEM
<                    COURANT VERS L'AUTRE ITEM.
<                    MOVE1 : ITEM1-->ITEM2 ,
<                    MOVE2 : ITEM2-->ITEM1.
<
<
<        ARGUMENT :
<                    W=@ITEM COURANT.
<
<
<        RESULTAT :
<                    X=0 (OK).
<
<
         USE         W,HITEM
MOVE1:   EQU         $
MOVE2:   EQU         $
         LA          LRITEM          < ACCES A LA LONGUEUR RELLE EN
                                     < OCTETS DU CORPS DE L'ITEM COURANT.
         SLRS        1               < CONVERSION EN MOTS.
         ADRI        XWORK2,A        < AJOUTONS LA LONGUEUR MOTS
                                     < DE L'EN-TETE DE L'ITEM.
         LR          A,X             < X=NBRE DE MOTS A DEPLACER.
         LA          AI1             < A=@ITEM1.
         LB          AI2             < B=@ITEM2.
         CPR         A,W             < L'ITEM COURANT EST-IL ITEM1.
         JE          E91             < OUI : MOVE1 : ITEM1-->ITEM2.
         XR          A,B             < NON : MOVE2 : ITEM2-->ITEM1.
E91:     EQU         $
         MOVE                        < MOVE ITEM COURANT.
         RSR                         < RETOUR OK (X=0).
         PAGE
<
<
<        E C H A N G E   I T E M 1   E T   I T E M 2  :
<
<
<        RESULTAT :
<                    X=0 (OK) ,
<                    DETRUIT W.
<
<
MOVEX:   EQU         $
         PSR         C               < SAVE L'@PRIMITIVE COURANTE DU
                                     < LANGAGE INTERPRETATIF.
         LX          ALTNI           < NBRE DE MOTS A DEPLACER.
         LA          AI1
         LR          A,C             < C=@ITEM1.
         LA          AI2
         LR          A,W             < W=@ITEM2.
<
< BOUCLE D'ECHANGE :
<
E92:     EQU         $
         LA          0,C             < ACCES A UN MOT DE ITEM1.
         LB          0,W             < ACCES A UN MOT DE ITEM2.
         STA         0,W             < ECHANGE.
         STB         0,C             < ECHANGE.
         ADRI        1,C             < MOT SUIVANT DE ITEM1.
         ADRI        1,W             < MOT SUIVANT DE ITEM2.
         JDX         E92
         PLR         C               < RESTAURE L'@PRIMITIVE DU
                                     < LANGAGE INTERPRETATIF.
         RSR                         < RETOUR OK (X=0).
X100:    VAL         0
         PAGE
<
<
<        T E S T   E X I S T E N C E   D ' U N
<        M E M B R E   D E   L A   F A M I L L E  :
<        E T   A C C E S   A   S O N   < N O M >  :
<
<
<        FONCTION :
<                      CETTE ROUTINE TESTE L'EXISTENCE D'UN
<                    MEMBRE DE LA FAMILLE (PERES+FILS)
<                    SI CE MEMBRE EXISTE , ELLE MET
<                    CELUI-CI DANS NOEUD2.
<
<
<        ARGUMENTS :
<                    W=@NOEUD1 ,
<                    B=NUMERO DE 0 A 15 DU MEMBRE.
<
<
<        RESULTAT :
<                    X=0 , SI LE MEMBRE EXISTE ,
<                    B<--(B)+1 DANS TOUS LES CAS.
<
<
         USE         W,NOEUD
EFAMIL:  EQU         $
         ADRI        1,B             < PASSAGE A PRIORI AU MEMBRE
                                     < SUIVANT (A NOTER : B#0).
         LR          B,X             < X=NUMERO DU MEMBRE SUIVANT ,
                                     < A NOTER : X#0 !!!!
         LA          FAMILY          < ACCES A L'OCCUPATION DE LA
                                     < FAMILLE DE NOEUD1.
         TBT         '1F,X           < TEST DU MEMBRE ARGUMENT.
         JNC         E57             < IL N'EST PAS OCCUPE : RIEN
                                     < A FAIRE , ET ON A : X#0.
<
< CAS OU LE MEMBRE ARGUMENT EST OCCUPE :
<
         LR          B,Y             < SAVE B=MEMBRE SUIVANT DANS Y.
         ADRI        -1,B            < RETOUR SUR LE NUMERO REEL DU
                                     < MEMBRE ARGUMENT.
         LR          B,A
         ADR         A,A
         ADR         B,A
         ADR         W,A
         ADRI        PERES-NOEUD,A   < A=@<NOMC>(MEMBRE)=@EMETTEUR.
         LR          W,B
         ADRI        LTN,B           < B=@<NOMC>(NOEUD2)=@RECEPTEUR.
         LXI         3               < 6 CARACTERES A DEPLACER.
         MOVE                        < DEPLACEMENT DU <NOMC> DU
                                     < MEMBRE ARGUMENT DE NOEUD1 ,
                                     < VERS NOEUD2 ; AU RETOUR : X=0 !!!
         LAI         '04             < <EON>.
         STBY        LTN+3,W         < MISE D'UN <EON> EN FIN DU
                                     < <NOMC>(MEMBRE-ARGUMENT).
         LR          Y,B             < RESTAURE B=NUMERO DU MEMBRE SUIVANT.
<
< SORTIE DE LA ROUTINE :
<
E57:     EQU         $
         RSR
         PAGE
<
<
<        T E S T   D E   F I N   D E   F A M I L L E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE TESTE SI ON A
<                    EXPLORE TOUTE LA FAMILLE DE
<                    NOEUD1 , C'EST-A-DIRE LES LISTES
<                    PERES ET FILS.
<
<
<        ARGUMENTS :
<                    B=NUMERO DU PROCHAIN MEMBRE.
<
<
<        RESULTAT :
<                    X=0 : IL RESTE AU MOINS UN MEMBRE ,
<                     =1 : LA FAMILLE EST FINIE.
<
<
FFAMIL:  EQU         $
         LXI         0               < IL RESTE AU MOINS UN MEMBRE A
                                     < PRIORI.
         TBT         11+16           < TEST : B=16 ???
         ADCR        X               < X=1 SI B=16 (FAMILLE FINIE).
         RSR                         < FACILE ????
         PAGE
<
<
<        D I S C R I M I N A T I O N   P E R E / F I L S  :
<
<
<        FONCTION :
<                      CETTE ROUTINE TESTE SI LE
<                    PROCHAIN MEMBRE DE LA FAMILLE EST
<                    DANS LA LISTE DES PERES OU DANS
<                    CELLE DES FILS.
<
<
<        ARGUMENT :
<                    B=NUMERO DU MEMBRE.
<
<
<        RESULTAT :
<                    X=0 : LE MEMBRE EST DANS LA LISTE DES PERES ,
<                     =1 : LE MEMBRE EST DANS LA LISTE DES FILS.
<
<
DISPF:   EQU         $
         LXI         1               < LISTE DES FILS A PRIORI.
         LR          B,A             < A=NUMERO DU MEMBRE+1.
         CPI         9
         SBCR        X               < X=0 : B=1,...,8.
         RSR                         < FACIL , N'EST-IL PAS ?!?!?
         PAGE
<
<
<        N U M E R O   D E S   P E R E S   E T   D E S   F I L S  :
<
<
<        FONCTION :
<                      SUIVANT SON POINT D'ENTREE CONVERTIT
<                    D'ASCI EN BINAIRE , OU DE BINAIRE
<                    EN ASCI LE NUMERO D'UN PERE
<                    OU D'UN FILS , A PARTIR DU CONTENU DE B.
<
<
<        ARGUMENT :
<                    B=CARACTERE ASCI , OU NUMERO DE 0 A 15.
<
<
<        RESULTAT :
<                    B=NUMERO DE 0 A 15 , OU CARACTERE ASCI.
<
<
NPERE:   EQU         $
         ADRI        -'30+1,B        < NUMERO DU PERE EN BINAIRE.
         JMP         E58
NAFILS:  EQU         $
         ADRI        '30-1-8,B       < NUMERO DU FILS EN ASCI.
         JMP         E58
NFILS:   EQU         $
         ADRI        -'30+1+8,B      < NUMERO DU FILS EN BINAIRE.
         JMP         E58
NAPERE:  EQU         $
         ADRI        '30-1,B         < NUMERO DU PERE EN ASCI.
<
< SORTIE DE LA ROUTINE :
<
E58:     EQU         $
         LXI         0               < RETOUR OK.
         RSR
         PAGE
<
<
<        C H E C K   F A M I L Y  :
<
<
<        FONCTION :
<                      CES 2 ROUTINES REGARDENT SI LE NOEUD
<                    COURANT A ENCORE DE LA FAMILLE
<                    (PERE(S) OU FILS).
<
<
<        ARGUMENT :
<                    W=@NOEUD COURANT.
<
<
<        RESULTAT :
<                    X=0 : LE NOEUD N'A PLUS DE PERE/FILS.
<
<
         USE         W,NOEUD
CHKP:    EQU         $               < CHECK LES PERES ...
         LBY         FAMILY          < ACCES A L'OCCUPATION DES 8
                                     < PERES POSSIBLES.
E21:     EQU         $               < TRONC COMMUN PERE(S)/FILS.
         LR          A,X             < X=OCCUPATION=0 S'IL N'Y A PLUS
                                     < DE PERE(S)/FILS.
         RSR                         < RETOUR AVEC X.
CHKF:    EQU         $               < CHECK LES FILS.
         LA          FAMILY
         ANDI        'FF             < ACCES A L'OCCUPATION DES 8
                                     < FILS POSSIBLES DU NOEUD.
         JMP         E21             < VERS LE TRONC COMMUN.
         PAGE
<
<
<        C H E C K   F A M I L Y   I T E M  :
<
<
<        FONCTION :
<                      CETTE ROUTINE REGARDE SI L'ITEM
<                    ARGUMENT A DE LA FAMILLE.
<
<
<        ARGUMENT :
<                    W=@NOEUD COURANT.
<
<
<        RESULTAT :
<                    X=0 : PAS OU PLUS DE FAMILLE ,
<                     #0 : AU MOINS UN PERE.
<
<
         USE         W,NOEUD
CHKPI:   EQU         $
         LX          FAMILY          < ACCES A L'OCCUPATION DES PERES
                                     < DE L'ITEM ; SI ELLE EST =0 ,
                                     < C'EST QU'IL N'Y A PLUS DE PERE.
         RSR                         < RETOUR AVEC (X).
         PAGE
<
<
<        C O N N E X I O N   P E R E   --->   F I L S  :
<
<
<        FONCTION :
<                      CETTE ROUTINE ETABLIT UNE RELATION
<                    DE TYPE PERE-->FILS ENTRE NOEUD1 (PERE)
<                    ET NOEUD2 (FILS) . LE FILS A UN NUMERO
<                    DONNE EN ARGUMENT DE LA DEMANDE
<                    VU DU PERE , ALORS QUE LE PERE A UN
<                    NUMERO NON FIXE VU DU FILS.
<
<
<        ARGUMENT :
<                    B=NUMERO DU FILS VU DU PERE EN ASCI.
<                    W=@NOEUD2 (FILS).
<
<
<        RESULTAT :
<                    X=0 SI OK ,
<                     =1 SINON , ET ALORS :
<                    B=CARACTERE ASCI D'ERREUR.
<
<
         USE         W,NOEUD
CONECT:  EQU         $
<
< INTERDICTION DES 'AUTO-CONNEXIONS' :
<
         LA          NOMC            < FILS.
         CP          NOMC-NOEUD-LTN,W  < PERE.
         JNE         E34             < OK , PAS D'AUTO-CONNEXION.
         LA          NOMC+1          < FILS.
         CP          NOMC-NOEUD-LTN+1,W
         JNE         E34             < OK.
         LA          NOMC+2          < FILS.
         CP          NOMC-NOEUD-LTN+2,W
         JNE         E34             < OK.
<
< ERREUR D'AUTO-CONNEXION' :
<
         LBI         "C"             < CARACTERE D'ERREUR.
         LXI         1               < RETOUR EN ERREUR.
         JMP         E32             < SORTIE DE LA ROUTINE.
<
< ACCES AU NUMERO DU FILS :
<
E34:     EQU         $
         LR          B,A             < A=NUMERO PRESUME DU FILS
                                     < VU DU PERE.
         ADRI        -'30,A          < CONVERSION BINAIRE DU NUMERO.
         JAL         E30             < ERREUR : NUMERO ERRONE.
         CPI         7
         JG          E30             < ERREUR : NUMERO ERRONE.
         LR          A,Y             < Y=NUMERO DEMANDE POUR LE FILS
                                     < VU DU PERE.
<
< TEST D'OCCUPATION DES PERES DU FILS DEMANDE :
<
         LBY         FAMILY          < OCCUPATION DES PERES DU FILS.
         EORI        'FF
         JAE         E31             < ERREUR : LES 8 PERES
                                     < POSSIBLES SONT OCCUPES.
         DBT                         < X=NUMERO+8 DU 1ER PERE
                                     < DISPONIBLE.
         XR          X,Y             < X=NUMERO DEMANDE POUR LE FILS
                                     <   VU DU PERE.
                                     < Y=NUMERO+8 DU 1ER PERE ALLOUE
                                     <   AU FILS.
<
< TEST D'OCCUPATION DES FILS DU PERE DEMANDE :
<
<        IF          MULTI,X100,,X100
         IF          MULTI,X100,,X100
         PSR         X,C,W
         LR          W,C             < C POINTE <NOMC>(FILS).
         ADRI        FILS-NOEUD-LTN,W  < W POINTE LA LISTE DES FILS
                                       < DU PERE.
         BSR         ASEEK           < REGARDONS SI PAR HASARD , LE
                                     < FILS DEMANDE N'EST PAS DEJA LE
                                     < FILS DE SON PERE ???
         PLR         X,C,W
         JANE        E31             < ET OUI , ERREUR ....
X100:    VAL         0
         ADRI        -LTN,W          < CHANGEMENT DE NOEUD COURANT :
                                     < PASSAGE SUR NOEUD1 (PERE).
         LA          FAMILY          < ACCES A LA FAMILLE DU PERE.
         TBT         8,X             < TEST DU FILS DEMANDE ????
         JC          E62             < ERREUR : LE FILS DEMANDE
                                     < EXISTE DEJA.
<
< CAS OU LES FAMILLES SONT DISPONIBLES
< POUR L'EXTENSION DEMANDEE :
<
         SBT         8,X             < OCCUPATION DU FILS (X).
         STA         FAMILY          < MAJ DE LA FAMILLE DU PERE.
<
< MEMORISATION DE <NOMC>(FILS) DANS LE PERE :
<
         LAD         FILS
         BSR         ASP3            < B=@<NOMC>(FILS) DANS LE PERE
                                     <  =@RECEPTEUR.
         LR          W,A
         ADRI        LTN,A           < A=@<NOMC>(FILS)=@EMETTEUR.
         LXI         3               < 6 CARACTERES A DEPLACER POUR
                                     < <NOMC>.
         MOVE                        < DEPLACEMENT DE <NOMC>(FILS) DANS
                                     < NOEUD1 (PERE).
<
< MEMORISATION DE LA FILIATION DANS LE FILS :
<
         ADRI        LTN,W           < PASSAGE AU NOEUD2 (NOUVEAU
                                     < NOED COURANT).
         LBY         FAMILY          < ACCES A L'OCCUPATION DES
                                     < PERES DU FILS DEMANDE.
         LR          Y,X             < X=NUMERO ALLOUE AU PERE+8.
         SBT         0,X             < OCCUPATION DU PERE DANS LE FILS.
         STBY        FAMILY
<
< MEMORISATION DE <NOMC>(PERE) DANS LE FILS :
<
         LAD         PERES
         ADRI        -8,X            < X=NUMERO DU PERE.
         BSR         ASP3            < B=@<NOMC>(PERE) DANS LE FILS
                                     <  =@RECEPTEUR.
         LR          W,A
         ADRI        -LTN,A          < A=@<NOMC>(PERE)=@EMETTEUR.
E141:    EQU         $               < ENTRY CONNEXION ITEM.
         LXI         3               < 6 CARACTERES DE <NOMC>.
         MOVE                        < MISE DE <NOMC>(PERE) DANS LE FILS
                                     < A NOTER QU'ON A : X=0 !!!!!
E32:     EQU         $
<        ON A ICI :
<                    X=CONDITIONS DE RETOUR.
         RSR                         < RETOUR A L'INTERPRETEUR.
<
<
<        T R A I T E M E N T   D E S   E R R E U R S  :
<
<
E30:     EQU         $
         LBI         "N"             < CODE ASCI DE RETOUR.
         LXI         1               < RETOUR EN ERREUR.
         JMP         E32             < SORTIE DE LA ROUTINE.
E62:     EQU         $
         ADRI        LTN,W           < RETOUR SUR LE FILS (NOEUD2).
E31:     EQU         $
         LBI         "O"             < CODE ASCI D'ERREUR.
         LXI         1               < RETOUR EN ERREU.
         JMP         E32             < SORTIE DE LA ROUTINE.
         PAGE
<
<
<        C O N N E X I O N   N O E U D   ---->   I T E M  :
<
<
<        FONCTION :
<                      CETTE ROUTINE MEMORISE SI CELA
<                    EST POSSIBLE , LE <NOMC> DU NOEUD PERE
<                    DE L'ITEM.
<
<
<        ARGUMENT :
<                    W=@ITEM COURANT.
<
<
<        RESULTAT :
<                    X=0 : OKK ,
<                     =1 : ERREUR , ET ALORS :
<                    B=CARACTERE ASCI D'ERREUR.
<
<
         USE         W,NOEUD
CONI:    EQU         $
         LA          FAMILY          < ACCES A L'OCCUPATION DES 16
                                     < PERES POSSIBLES DE L'ITEM.
         EORI        -1              < TEST DE LIBERTE ...
                                     < (INVERSION DES CONVENTIONS)
         JAE         E31             < DESOLE , MAIS C'EST COMPLET :
                                     < 16 PERES C'EST LE MAXIMUM.
<
< CAS OU UN PERE AU MOINS EST LIBRE :
<
         DBT                         < RECHERCHE DU 1ER PERE LIBRE (X).
         RBT         0,X             < OCCUPATION DE CE PERE.
         EORI        -1              < RE-INVERSION DES CONVENTIONS.
         STA         FAMILY          < ET MAJ DE LA FAMILLE DE L'ITEM.
<
< TRANSFERT DE <NOMC>(NOEUD1) DANS
< LE PERE QUE L'ON VIENT D'ALLOUER :
<
         LAD         PERES           < A=@LISTE DES PERES DE L'ITEM.
         BSR         ASP3            < B=@DU PERE ALLOUE=@RECEPTEUR.
         LA          AN1             < A=@<NOMC>(NOEUD1)=@EMETTEUR.
         JMP         E141            < VERS LE MOVE DU <NOMC>.
                                     < (SUR 6 CARACTERES)
         PAGE
<
<
<        @ E N T R E E   D A N S   U N E   L I S T E  :
<
<
<        ARGUMENTS :
<                    A=@DE LA LISTE DE PARENTE ,
<                    X=NUMERO DU PARENT DONT ON VEUT L'ENTREE.
<
<
<        RESULTAT :
<                    B=@ENTREE DU PARENT DANS LA LISTE.
<
<
SP3:     EQU         $
         LR          X,B
         ADR         B,B
         ADR         X,B
         ADR         A,B
         RSR
         PAGE
<
<
<        D E C O N N E X I O N   P E R E   ---->   F I L S  :
<
<
<        FONCTION :
<                      CETTE ROUTINE ROMPT LORSQUE
<                    CELA EST POSSIBLE UNE RELATION
<                    DE PERE A FILS.
<
<
<        ARGUMENT :
<                    W=@NOEUD2 (FILS).
<
<
<        RESULTAT :
<                    X=0 SI OK ,
<                     =1 SI ERREUR , ET ALORS :
<                    B=CARACTERE ASCI D'ERREUR.
<
<
         USE         W,NOEUD
DECONE:  EQU         $
<
< RECHERCHE DU PERE PRESUME DU FILS
< DANS LA LISTE DES PERES DE CE FILS ....
<
         PSR         C               < SAVE L'@PRIMITIVE DU PROGRAMME
                                     < INTERPRETATIF.
         PSR         W               < SAVE @NOEUD2 (FILS).
         LR          W,C
         ADRI        PERES-NOEUD,W   < W POINTE LA LISTE DES PERES
                                     < DU FILS.
         ADRI        -LTN,C          < C POINTE <NOMC>(PERE PRESUME).
         BSR         ASEEK           < RECHERCHE DU PERE PRESUME ????
         JAE         E43             < ERREUR : NOEUD1 N'EST PAS PERE
                                     < DE NOEUD2 !!!
<        ON A ICI :
<                    W=@<NOMC(PERE)> DANS LA LISTE DES PERES DU FILS.
         STZ         0,W             < RAZ DU MOT0 DU NOMC DU PERE
                                     < DANS LA LISTE DES PERES DE CE
                                     < FILS POUR INDIQUER QU'IL N'EST
                                     < PLUS PERE ...
         LR          X,Y             < OK : Y=INDEX (0 A 7) DU PERE
                                     < DANS LA LISTE DES PERES DU FILS.
         PLR         W               < RESTAURE W=@NOEUD2 (FILS).
         ADRI        1,K             < MAIS ON LAISSE W DANS LA PILE.
         XR          W,C             < C POINTE <NOMC>(FILS).
         ADRI        FILS-NOEUD,W    < W POINTE LA LISTE DES FILS
                                     < POSSIBLES DU PERE.
         BSR         ASEEK           < RECHERCHE DU FILS DANS LA LISTE
                                     < DES FILS POSSIBLES DE NOEUD1
                                     < (PERE).
         JAE         E43             < ERREUR CE N'EST PAS SON FILS ....
<        ON A ICI :
<                    W=@<NOMC(FILS) DANS LA LISTE DES FILS DU PERE.
         STZ         0,W             < RAZ DU MOT0 DU NOMC DU FILS
                                     < POUR INDIQUER AINSI QU'IL
                                     < N'EST PLUS PERE DE CE FILS ...
<
< OK , ON A RETROUVE LE PERE ET LE FILS :
<
         PLR         W               < RESTAURE W=@NOEUD2 (FILS).
         PLR         C               < RESTAURE L'@ LANGAGE INTERPRETA-
                                     < TIF.
<        ON A ICI :
<                    X=NUMERO DU FILS DANS LA LISTE DES FILS DE NOEUD1 ,
<                    Y=NUMERO DU PERE DANS LA LISTE DES PERES DE NOEUD2 ,
<                    W=@NOEUD2 (FILS).
<
< MISE A JOUR DE LA FAMILLE DU FILS :
<
         LA          FAMILY
         XR          X,Y             < X=NUMERO DU PERE.
         TBT         0,X             < MAIS CE PERE N'A T'IL PAS ETE
                                     < DEJA DECONNECTE (LA LISTE DES
                                     < PERES/FILS N'ETANT PAS RASEE).
         JNC         E45             < EFFECTIVEMENT , LA FILIATION
                                     < N'EXISTE PLUS ...
         RBT         0,X             < SI ELLE EXISTE , ON LA BRISE.
         STA         FAMILY          < MAJ DE LA FAMILLE DU FILS.
<
< MISE A JOUR DE LA FAMILLE DU PERE :
<
         ADRI        -LTN,W          < W=@NOEUD1 (PERE).
         XR          X,Y             < X=NUMERO DU FILS.
         LA          FAMILY          < FAMILLE DU PERE.
         TBT         8,X             < MAIS EST-CE ENCORE SON FILS ...
                                     < (MEME REMARQUE QUE POUR LE FILS)
         JNC         E45             < NON , ERREUR DE FILIATION.
         RBT         8,X             < OK , ON ROMPT CETTE FILIATION ...
         STA         FAMILY          < MAJ DE LA FAMILLE DU PERE.
         ADRI        LTN,W           < RETOUR SUR W=@NOEUD2.
E143:    EQU         $               < ENTRY DECONNEXION ITEM.
         LXI         0               < RETOUR OK.
<
< SORTIE DE LA ROUTINE :
<
E44:     EQU         $
<        ON A ICI :
<                    W=@NOEUD2 ,
<                    X=CONDITIONS DE RETOUR ,
<                    ET B=CARACTERE ASCI SI X#0.
         RSR
<
< TRAITEMENT DES ERREURS :
<
E43:     EQU         $
         PLR         W               < RESTAURE W=@NOEUD2.
         PLR         C               < RESTAURE LA BASE DU LANGAGE ...
E45:     EQU         $
         LBI         "D"             < ERREUR DE DECONNEXION.
         LXI         1               < RETOUR EN ERREUR.
         JMP         E44             < SORTIE.
         PAGE
<
<
<        D E C O N N E X I O N   N O E U D   ---->   I T E M  :
<
<
<        FONCTION :
<                      CETTE ROUTINE ROMPT LA PATERNITE DE
<                    NOEUD1 POUR L'ITEM COURANT.
<
<
<        ARGUMENT :
<                    W=@ITEM COURANT.
<
<
<        RESULTAT :
<                    X=0 : OK ,
<                     =1 : ERREUR , ET LAORS :
<                    B=CARACTERE ASCI D'ERREUR.
<
<
         USE         W,NOEUD
DECONI:  EQU         $
<
< RECHERCHE DU <NOMC>(NOEUD1)
< DANS LA LISTE DES PERES DE L'ITEM
< COURANT :
<
         PSR         C,W             < SAVE LES BASES C ET W.
         LA          AN1
         LR          A,C             < C=@<NOMC>(NOEUD1)=@DU NOM
                                     < CHERCHE DANS LA LISTE.
         ADRI        PERES-NOEUD,W   < W=@DE LA BASE DE LA LISTE DES
                                     < PERES DE L'ITEM COURANT.
         BSR         ASEEK1          < RECHERCHE DU PERE (LISTE A
                                     < 16 ENTREES).
         JAE         E43             < ERREUR BIZARRE : LE PERE N'A
                                     < APS ETE RETROUVE.
<
< OK , ON A RETOUVE LE PERE :
<
         STZ         0,W             < ON TUE LA RELATION DE L'ITEM
                                     < VERS SON NOEUD PERE.
         PLR         C,W             < RESTAURE LES BASES C ET W.
<
< MISE A JOUR DE LA FAMILLE DE L'ITEM :
<
         LA          FAMILY
<        ON A ICI :
<                    X=NUMERO DU PERE DE -8 A 7.
         TBT         8,X             < TEST DE L'OCCUPATION.
         JNC         E45             < ERREUR DE PLUS EN PLUS BIZARRE.
         RBT         8,X             < OK , LIBERATION DE L'ENTREE
                                     < QU'OCCUPAIT LE NOEUD1 (PERE).
         STA         FAMILY          < MAJ DE LA FAMILLE DE L'ITEM.
         JMP         E143            < VERS LA SORTIE.
         PAGE
<
<
<        R E C H E R C H E   D ' U N   < N O M C >  :
<
<
<        FONCTION :
<                      CETTE ROUTINE PARCOURT UNE LISTE
<                    BASEE PAR W , A LA RECHERCHE
<                    D'UN <NOMC> BASE PAR C.
<
<
<        ARGUMENT :
<                    C=BASE FIXE DU <NOMC> CHERCHE ,
<                    W=BASE VARIABLE INITIALISEE SUR LE DEBUT DE LISTE.
<
<
<        RESULTAT :
<                    A=0 : <NOMC> NON TROUVE ,
<                     #0 : <NOMC> TROUVE ,
<                    X=INDEX DE 0 A 7 DU <NOMC> DANS LA LISTE SI OK.
<                     =INDEX DE -8 A 7 DANS LE CAS DE SEEK1.
<
<
SEEK1:   EQU         $
         LXI         -16             < LA LISTE A 16 ENTREES DE 3 MOTS.
         JMP         E40             < ET C'EST PARTI ...
SEEK:    EQU         $
         LXI         -8              < LA LISTE A 8 ENTREES DE 3 MOTS.
E40:     EQU         $
         LA          0,C
         CP          0,W
         JNE         E41             < NON ENCORE TROUVE.
         LA          1,C
         CP          1,W
         JNE         E41             < NON ENCORE TROUVE.
         LA          2,C
         CP          2,W
         JAE         $               < E R E U R   P R O G R A M M E ....
         JE          E42             < <NOMC> A ETE TROUVE.
<
< CAS OU <NOMC> N'EST PAS ENCORE TROUVE :
<
E41:     EQU         $
         ADRI        3,W             < PASSAGE SUR L'ENTREE SUIVANTE DE
                                     < LA LISTE .(3 MOTS PAR ENTREE).
         JIX         E40             < SUIVANTE.
         LAI         0               < A=0 : <NOMC> N'A PAS ETE TROUVE.
<
< SORTIE DE LA ROUTINE :
<
E42:     EQU         $
         ADRI        8,X             < X EST CONVERTI EN UN INDEX
                                     < DE 0 A 7 (=8 SI A=0).
         RSR                         < RETOUR.
         PAGE
<
<
<        I N V E R S I O N   D E   B I T E M  :
<
<
<        ARGUMENT :
<                    W=@NOEUD.
<
<
         USE         W,NOEUD
IBITEM:  EQU         $
         LA          INDIC           < ACCES AUX INDICATEURS.
         IBT         BITEM           < INVERSION DE BITEM.
         STA         INDIC           < MAJ DES INDICATEURS.
         LXI         0               < RETOUR OK.
         RSR
         PAGE
<
<
<        D E P L A C E M E N T   D U   < N O M C >
<        D E   L ' I T E M   D A N S   L E   N O E U D 1  :
<
<
<        ARGUMENT :
<                    W=@ITEM COURANT.
<
<
NITEM1:  EQU         $
         LR          W,A             < A=@<NOMC>(ITEM)=@EMETTEUR.
         LB          AN1             < B=@NOEUD1.
         ADRI        ITEM-NOEUD,B    < B=@ITEM(NOEUD1)=@RECEPTEUR.
E142:    EQU         $
         LXI         4               < ON DEPLACE LES 6 CARACTERES
                                     < DU <NOMC>+<EON>.
                                     < (<EON> MIS AU CODAGE...).
         MOVE                        < AU RETOUR , ON : X=0.
         RSR                         < RETOUR OK : X=0.
         PAGE
<
<
<        D E P L A C E M E N T   D U   < N O M C >
<        D E   L ' I T E M   D E   N O E U D 1
<                    V E R S   N O E U D 2  :
<
<
<        ARGUMENT :
<                    W=@NOEUD1.
<
<
NITEM2:  EQU         $
         LR          W,B
         ADRI        LTN,B           < B=@<NOMC>(ITEM)=@RECEPTEUR.
E144:    EQU         $
         LR          W,A
         ADRI        ITEM-NOEUD,A    < A=@<NOMC>(ITEM) DANS LE
                                     < NOEUD1=@EMETTEUR.
         JMP         E142            < VERS MOVE NOEUD1-->NOEUD2.
         PAGE
<
<
<        D E P L A C E M E N T   D U   < N O M C >
<        D E   L ' I T E M   D E   N O E U D 1
<        V E R S   L ' I T E M   C O U R A N T  :
<
<
<        ARGUMENT :
<                    W=@NOEUD1.
<
<
NITEM3:  EQU         $
         LB          AI2             < B=@<NOMC>(ITEM2)=@RECEPTEUR.
         JMP         E144            < VERS LA RECUPERATION DE L'EMETTEUR
         PAGE
         PROG
<
<
<        G E S T I O N   D U   G R A P H E  :
<
<
<        FONCTION :
<                    'GE'/'GI' GERENT LES GRAPHES D'ITEMS ,
<                    MAIS :
<                    1- 'GE' FAIT SES ENTREES SUR NVP='01 ,
<                    2- 'GI' SIMULE SES ENTREES A PARTIR DE ITEM2.
<
<
         WORD        NCOM            < VALEUR INITIALE DU REGISTRE C :
                                     < @NOEUD INITIAL DU PROGRAMME
                                     < INTERPRETATIF DE GESTION
                                     < DU GRAPHE.
         WORD        LOC+'80         < VALEUR INITIALE DU REGISTRE L.
         WORD        NOEUD1          < VALEUR INITIALE DU REGISTRE W ,
                                     < POUR PERMETTRE LA GENERATION
                                     < DE LA BRANCHE D'OVERLAY 'GE    '.
GEGRAF:  EQU         $
         LRP         K
         ADRI        -1,K            < K POINTE SUR LA VALEUR INITIALE
                                     < DU REGISTRE L.
         PLR         C,L,W           < INITIALISATION DE L SUR LE
                                     < LOCAL , DE C SUR LE NOEUD
                                     < INITIAL DU PROGRAMME DE GESTION
                                     < DU GRAPHE , ET DE W SUR LE
                                     < NOEUD1 POUR LA GENERATION
                                     < DE LA BRANCHE 'GE    '.
         LB          APILE
         LR          B,K             < INITIALISATION DU REGISTRE K.
         STZ         MODCAL,W        < CA Y EST , J'AI ENFIN REUSSI
                                     < A METTRE LA REMISE A 0
                                     < EVENTUELLE DE MODCAL DANS 'GE' ...
         IF          GIGE,,X100,
<
< VALIDATION DU TYPE DE L'ITEM2 :
<
         LXI         IINDIC-HITEM-LTN*2
         LBY         &AGI            < A=TYPE DE L'ITEM2.
         CPI         "T"             < EST-CE UN TEXTE ???
         JE          OKI2            < OUI , ON Y VA !!!
         BR          ABORTI          < ET NON , ON S'EN VA ...
OKI2:    EQU         $
X100:    VAL         0
         LA          RESTAR
         WORD        '1EB5           < MISE EN PLACE DHUN PRESC SPECIAL
                                     < A 'GE'/'GI' ; EN EFFET LE
                                     < PRESC IMPLICITE ('12) EST
                                     < SITUE DANS UNE ZONE EN
                                     < GENERAL ECRASEE LORS DES
                                     < OPERATIONS SUR LE GRAPHE !!!
         LXI         0               < ON NE SAIT JAMAIS ....
         JMP         LOOP            < VERS LA BOUCLE DE L'INTERPRETEUR.
         PAGE
<
<
<        I N T E R P R E T E U R   D E   G E S T I O N
<        D E S   P R I M I T I V E S   D E
<        T R A V A I L   S U R   L E   G R A P H E  :
<
<
<        F O R M A T   D E S   P R I M I T I V E S  :
<
<                    OCTET0=FONCTION (NOM DE LA PRIMITIVE) ,
<                            BIT0=1 (TOUJOURS) ,
<                            BIT1=0 : MOT2 (ET EVENTUELLEMENT MOT3)
<                                     PRESENT(S).
<                                =1 : L'EXECUTION EST SEQUENTIELLE
<                                     (ON PASSE A LA PRIMITIVE SUIVANTE
<                                     EN FAISANT +2 SUR LA BASE C).
<                    OCTET1=ARGUMENT1 ,
<                           (ARGUMENT1 INCHANGE SI OCTET1='FF)
<                    MOT1=ARGUMENT2 ,
<                    MOT2=@PRIMITIVE SUIVANTE EN CAS D'ERREUR (IL
<                         FAUT BIT1(MOT0)=0) ,
<                    MOT3=@PRIMITIVE SUIVANTE SI OK (IL FAUT :
<                         BIT1(MOT0)=0).
<
<        F O R M A T   D ' U N E   S O U S - G R A M M A I R E  :
<
<                    MOT0: POINT D'ENTREE : CONTIENT L'@ DE LA
<                                           PRIMITIVE D'APPEL 'PS' ,
<                    MOTS SUIVANTS : SUITE DE PRIMITIVES ,
<                    MOTN : PRIMITIVE DE RETOUR 'PR' ,
<                    MOTN+1 : @MOT0 (=@POINT D'ENTREE).
<
<
<
PR:      VAL         0               < NOM DE LA PRIMITIVE+ARGUMENT1.
BSEQ:    VAL         1               < BIT INDICATEUR DE PRIMITIVE
                                     < SEQUENTIELLE.
ARG2:    VAL         1               < ARGUMENT2.
ADER:    VAL         2               < @PRIMITIVE SUIVANTE SI ERREUR.
ADOK:    VAL         3               < @PRIMITIVE SUIVANTE SI OK.
GRIN:    VAL         ARG2            < @ENTRY D'UNE SOUS-GRAMMAIRE.
<
<
<        FONCTION    ARGUMENT1       ARGUMENT2
<
<        PA                                      GOTO.
<-----------------------------------------------------------------------
<        PC          (????)          @ROUTINE    CALL.
<-----------------------------------------------------------------------
<        PM                          @MESSAGE,X  IMPRESSION MESSAGE :
<                                                OCTET0(MESSAGE)=
<                                                LONGUEUR DU MESSAGE.
<-----------------------------------------------------------------------
<        PT          CARACTERE-ASCI              TEST-CARACTERE.
<-----------------------------------------------------------------------
<        PI          LONGUEUR-MAX.               ENTREE-MESSAGE.
<-----------------------------------------------------------------------
<        PF                                      RETOUR-CCI.
<-----------------------------------------------------------------------
<        PS                          @SOUS-GR    APPEL D'UNE SOUS-
<                                                GRAMMAIRE D'@ : ARG2.
<-----------------------------------------------------------------------
<        PB                                      RETOUR D'UNE SOUS-
<                                                GRAMMAIRE DE POINT
<                                                D'ENTREE D'ADRESSE
<                                                &ARG2.
<
<
<        UTILISATION DES REGISTRES :
<                    X=NOM DES PRIMITIVES , ET
<                     =CONDITION D'EXECUTION DES PRIMITIVES (=0 SI OK) ,
<                    W=@NOEUD COURANT DU GRAPHE ,
<                    C=@PRIMITIVE COURANTE ,
<                    B=ARGUMENT1.
<
<
<        T A B L E   D E   L ' I N T E R P R E T E U R  :
<
<
PRIM:    WORD        PRIMA;PRIMC;PRIMM;PRIMT;PRIMI
         WORD        PRIMF
         WORD        PRIMS;PRIMR
NP:      VAL         $-PRIM          < NBRE DE PRIMITIVES.
<
<        P R I M I T I V E S   A   A D R E S S E ( S )  :
<
PA:      VAL         0+'80           < PRIMITIVE 'GOTO'.
PC:      VAL         1+'80           < PRIMITIVE 'CALL'.
PM:      VAL         2+'80           < PRIMITIVE 'PRINT'.
PT:      VAL         3+'80           < PRIMITIVE 'TEST'.
PI:      VAL         4+'80           < PRIMITIVE 'IN'.
PF:      VAL         5+'80           < PRIMITIVE 'CCI'.
PS:      VAL         6+'80           < APPEL D'UNE SOUS-GRAMMAIRE.
PB:      VAL         7+'80           < RETOUR D'UNE SOUS-GRAMMAIRE.
<
<        P R I M I T I V E S   S E Q U E N T I E L L E S  :
<
PAS:     VAL         PA+'40          < 'GOTO' SEQUENTIEL.
PCS:     VAL         PC+'40          < 'CALL' SEQUENTIEL.
PMS:     VAL         PM+'40          < 'PRINT' SEQUENTIEL.
PTS:     VAL         PT+'40          < 'TEST' SEQUENTIEL.
PIS:     VAL         PI+'40          < 'IN' SEQUENTIEL.
PFS:     VAL         PF+'40          < 'CCI' SEQUENTIEL (???).
PSS:     VAL         PS+'40          < 'SOUS-GRAMMAIRE' SEQUENTIEL.
PBS:     VAL         PB+'40          < 'RETOUR' SEQUENTIEL.
<
<
<        R E T O U R   D E S   P R I M I T I V E S  :
<
<
LOOPB:   EQU         $
<        ON A ICI :
<                    B=ARGUMENT1 PRECEDENT , OU AUTRE CHOSE ,
<                    X=CONDITION DE RETOUR DE LA PRIMITIVE (0 SI OK).
         LA          PR,C            < RECUPERATION DES BITS 0 & 1
                                     < DE LA PRIMITIVE QUE L'ON VIENT
                                     < D'EXECUTER.
         ADRI        ADER-PR,C       < AU CAS OU LA PRIMITIVE ETAIT
                                     < SEQUENTIELLE.
         TBT         BSEQ            < TEST DU BIT SEQUENTIEL.
         JC          LOOP            < LA PRIMITIVE ETAIT SEQUENTIELLE.
<
< CAS D'UNE PRIMITIVE A ADRESSE(S) :
<
         ADRI        ADOK-ADER,C     < AU CAS OU LE RETOUR SERAIT OK ,
                                     < ET QUE ADOK SERAIT ABSENTE.
         CPZR        X               < COMMENT CELA S'EST-IL PASSE ????
         JE          E14             < BIEN , ET VOUS ???
         ADRI        ADER-ADOK,C     < CAS D'UN RETOUR EN ERREUR ,
                                     < ON PASSE SUR ADER.
E14:     EQU         $
         LA          0,C             < RECUPERATION DE L'ADRESSE DE
                                     < LA PRIMITIVE SUIVANTE.
         JAL         LOOP            < EN FAIT , CETTE ADRESSE EST
                                     < ABSENTE (BIT0=1) , C'EST LE
                                     < PR DE LA PRIMITIVE SUIVANTE
                                     < QUE L'ON VIENT DE RECUPERER ,
                                     < FAISONS DONC DU SEQUENTIEL.
         LR          A,C             < SINON : C=@PRIMITIVE SUIVANTE.
<
<
<        B O U C L E   D E   L ' I N T E R P R E T E U R  :
<
<
LOOP:    EQU         $
         LBY         PR,C            < ACCES AU NOM DE LA PRIMITIVE
                                     < COURANTE.
         ANDI        'F              < RECUPERATION NOM PRIMITIVE.
         CPI         NP              < VALIDATION DU NOM.
         JL          $+2             < OK.
         ACTD                        < E R R E U R   P R O G R A M M E.
         PSR         X               < SAVE EVENTUELLEMENT LES CCONDI-
                                     < TIONS DE RETOUR DE LA PRIMITIVE
                                     < PRECEDENTE.
         LR          A,X             < X=NOM DE LA PRIMITIVE.
         LA          PR,C
         ANDI        'FF
         CPI         'FF
         JE          E20             < ARGUMENT1='FF : ON LAISSE
                                     < B INCHANGE.
         LR          A,B             < B=ARGUMENT1.
E20:     EQU         $
         LA          &APRIM          < A=@EXECUTION DE LA PRIMITIVE (X).
         PLR         X               < RESTAURE X=CONDITIONS DE RETOUR
                                     < DE LA PRIMITIVE PRECDENTE.
         PSR         A               < EMPILE @EXECUTION DE LA
                                     < PRIMITIVE (X).
         RSR                         < EXECUTION DE LA PRIMITIVE.
<
<
<        P R I M I T I V E   ' G O T O '  :
<
<
PRIMA:   EQU         $
         LXI         0               < RETOUR OK.
         JMP         LOOPB           < VERS LA BOUCLE DE L'INTERPRETEUR.
<
<
<        P R I M I T I V E   ' A P P E L   S O U S - G R A M M A I R E '
<
<
PRIMS:   EQU         $
         LA          ARG2,C
         XR          A,C             < A=@PRIMITIVE 'PS' ,
                                     < C=@POINT D'ENTREE DE LA SOUS-
                                     < GRAMMAIRE.
         STA         0,C             < SAVE @PRIMITIVE 'PS' DANS LE
                                     < POINT D'ENTREE (MOT0 DE LA
                                     < SOUS-GRAMMAIRE).
         ADRI        1,C             < C=@DE LA 1ERE PRIMITIVE DE
                                     < LA SOUS-GRAMMAIRE.
         JMP         LOOP            < VERS LHACCES A LA 1ERE PRIMITIVE;
                                     < A NOTER QUE LE 'LOOPB' DE LA
                                     < PRIMITIVE 'PS' NE SERA FAIT QU'
                                     < A L'OCCASION DU 'PR' DE FIN
                                     < DE LA SOUS-GRAMMAIRE.
<
<
<        P R I M I T I V E   ' R E T O U R '  :
<
<
PRIMR:   EQU         $
<        ON A ICI :
<                    X=CONDITIONS DE RETOUR DE LA SOUS-GRAMMAIRE ,
<                      QUI SERA UTILISE POUR CALCULER LE 'LOOPB'
<                      DE LA PRIMITIVE D'APPEL 'PS'.
         LA          &GRIN,C         < RECUPERATION DU CONTENU DU
                                     < POINT D'ENTREE.
         LR          A,C             < C=@PRIMITIVE 'PS'.
         JMP         LOOPB           < VERS LE 'LOOPB' DU 'PS'.
                                     < A NOTER QUE X EST INCHANGE ,
                                     < ET CONTIENT LES CONDITIONS DE
                                     < RETOUR DE LA SOUS-GRAMMAIRE !!!!
<
<
<        P R I M I T I V E   ' C A L L '  :
<
<
PRIMC:   EQU         $
         BSR         ARG2,C          < APPEL DE LA ROUTINE ARGUMENT2.
         JMP         LOOPB           < VERS LA BOUCLE DE L'INTERPRETEUR.
<
<
<        P R I M I T I V E   ' P R I N T '  :
<
<
PRIMM:   EQU         $
         LAI         '02             < FONCTION D'ECRITURE.
         SBT         6               < NVP=2 (OUT).
         STA         DEMAND          < MAJ DE LA DEMANDE DE TRAVAIL.
         LA          ARG2,C          < RECUPERATION DE L'@MOT DU MESSAGE
         SLLS        1               < A=@OCTET DU MESSAGE.
         ADRI        1,A             < POUR DEPASSER LA LONGUEUR
                                     < CONTENUE DANS L'OCTET0.
         STA         DEMAND+1        < MAJ DE LA DEMANDE DE TRVAIL.
         LXI         0               < POUR ACCES A OCTET0.
         LBY         &ARG2,C         < RECUPERATION DE LA LONGUEUR
                                     < DU MESSAGE (OCTET0).
         LR          A,X             < X=COMPTE OCTETS DU MESSAGE.
         LR          B,A             < A=ARGUMENT1 ,
         CPI         '20             < ARGUMENT1 EST-IL UN CARACTERE
                                     < ASCI ????
         JL          E15             < NON , IL N'EST DONC PAS INSERE
                                     < DANS LE MESSAGE.
         STBY        &ARG2,C         < QUE L'ON MET EN DERNIER
                                     < CARACTERE DU MESSAGE.
E15:     EQU         $               < ENTRY 'MESSAGE IN'.
<        ON A ICI :
<                    X=COMPTE D'OCTETS.
         STX         DEMAND+2        < MAJ DE LA DEMANDE DE TRAVAIL.
         LAD         DEMAND
         IF          GIGE,X100,,X100
         SVC         0               < ENVOI DE LA DEMANDE A CMS4.
X100:    VAL         0
         IF          GIGE,,X100,
         BSR         ASP4            < SIMULATION DES SVC IN.
X100:    VAL         0
         JMP         LOOPB           < VERS LA BOUCLE DE L'INTERPRETEUR.
<
<
<        P R I M I T I V E   ' T E S T '  :
<
<
<        RESULTAT :
<                    B=CARACTERE LU.
<
<
PRIMT:   EQU         $
<        ON A ICI :
<                    B=ARGUMENT1=CARACTERE ATTENDU.
         LX          IMESS           < X=INDEX COURANT DU MESSAGE.
         LBY         &AMESS          < ACCES AU CARACTERE COURANT
                                     < DU MESSAGE.
         ADRI        1,X             < PROGRESSION DE L'INDEX COURANT
                                     < DU MESSAGE ; A NOTER QU'ON A
                                     < DONC : X#0 !!!!
         XR          A,B             < B=CARACTERE LU ....
         CPR         A,B             < COMPARAISON DU CARACTERE
                                     < COURANT ET DU CARACTERE ATTENDU.
         JNE         LOOPB           < CAS OU (A)#(B) : IL N'Y A PAS
                                     < COINCIDENCE : ALORS : X#0.
                                     < (L'INDEX COURANT DU MESSAGE ,
                                     < IMESS RESTE INCHANGE)
<
< CAS OU : (A)=(B) : COINCIDENCE :
<
         STX         IMESS           < MAJ DE L'INDEX COURANT DU
                                     < MESSAGE.
         LXI         0               < RETOUR OK.
         JMP         LOOPB           < VERS LA BOUCLE DE L'INTERPRETEUR
                                     < AVEC X=0 (OK).
<
<
<        P R I M I T I V E   ' M E S S A G E   I N '  :
<
<
PRIMI:   EQU         $
<        ON A ICI :
<                    B=LONGUEUR MAXIMALE AUTORISEE POUR LE MESSAGE.
         STZ         IMESS           < RAZ DE L'INDEX COURANT DU MESSAGE
         LAI         '01             < FONCTION LECTURE AVEC ECHO.
         SBT         7               < NVP=1 (IN).
         STA         DEMAND          < MAJ DE LA DEMANDE DE TRAVAIL.
         LA          AMESS
         SLLS        1               < A=@OCTET DU MESSAGE.
         STA         DEMAND+1        < MAJ DE LA DEMANDE DE TRAVAIL.
         LR          B,X             < X=LONGUEUR MAX DU MESSAGE IN.
         JMP         E15             < VERS L'ENVOI DE LA DEMANDE.
<
<
<        P R I M I T I V E   ' R E T O U R - C C I '  :
<
<
PRIMF:   EQU         $
         QUIT        1               < REOUR AU CCI.
         JMP         GEGRAF          < CAS OU ON A RECU UN !GO
                                     < SOUS CCI.
         PAGE
<
<
<        C L E A R   T A B L E   D E S   S Y M B O L E S  :
<
<
<        DST         FNOEUD
         DST         FNOEUD
<        DST         FITEM
         DST         FITEM
         PAGE
<
<
<        L I S T E   D E S   C O M M A N D E S  :
<
<
<        N+          CREATION D'UN NOUVEAU NOEUD ,
<        N-          DELETE D'UN ANCIEN NOEUD ,
         IF          GIGE,X100,,X100
<        N=          EDITION DE LA FAMILLE D'UN NOEUD ,
X100:    VAL         0
<        NC          CONNEXION D'UN NOEUD A UN ITEM ,
<        ND          DECONNEXION D'UN NOEUD ET D'UN ITEM ,
<        C0,...,C7   CONNEXION NOEUD-PERE A NOEUD-FILS ,
<        C-          RUPTURE DE LA PATERNITE D'UN NOEUD A UN AUTRE ,
<        I+          CREATION D'UN NOUVEL ITEM ,
<        I-          DELETE D'UN ANCIEN ITEM ,
<        IL          APPEL (LOAD) DE L'ITEM COURANT EN ITEM1 ,
<        IU          APPEL ITEM COURANT SOUS :SYS ,
<        IS          REECRITURE (STORE) DE L'ITEM COURANT ITEM1 ,
<        LI          LISTAGE DES ITEMS ,
<        -I          LISTAGE DES ITEMS AVEC DELETE ,
<        LN          LISTAGE DES NOEUDS ,
<        -N          LISTAGE DES NOEUDS AVEC DELETE ,
         IF          GIGE,X100,,X100
<        I=          EDITION DE LA FAMILLE D'UN ITEM ,
<        M1          DEPLACEMENT DE L'ITEM1 DANS ITEM2 ,
<        M2          DEPLACEMENT DE L'ITEM2 DANS ITEM1 ,
<        MX          ECHANGE DE ITEM1 ET ITEM2 ,
X100:    VAL         0
<        XY          APPEL DU PROCESSEUR 'XY    ' (S'IL EXISTE...).
<
<
<        NOTA :
<                      POUR BAPTISER UN ITEM DONT
<                    LE CONTENU EST DEJA CREE (PAR EXEMPLE
<                    PAR ED , AYANT OUBLIE DE FAIRE 'I+') ,
<                    ON FERA :
<        IL<NOM DE BAPTEME>  QUI PROVOQUERA ?S , MAIS
<                            INITIALISERA <NOM> ET <NOMC>
<                            SANS DETRUIRE LRITEM,IINDIC,... PUIS :
<        IS                  QUI PROVOQUERA LA CREATION ET LE
<                            RANGEMENT DE <NOM DE BAPTEME>.
         PAGE
<
<
<        P R O G R A M M E   I N T E R P R E T A T I F
<        D E   G E S T I O N   D U   G R A P H E  :
<
<
<
<        M E S S A G E S  :
<
M1:      BYTE        2;'6D;":";0
M2:      BYTE        7;" "
         ASCI        "NOEUD="
M3:      BYTE        6;'6D
         ASCI        "NOMC= "
M4:      BYTE        5;" ";'07;'07
         ASCI        "??"
M7:      BYTE        7;'6D
         ASCI        "PERE  "
M75:     BYTE        5;'6D
         ASCI        "PERE"
M8:      BYTE        7;'6D
         ASCI        "FILS  "
M5:      EQU         M7              < 'PERE'.
M6:      EQU         M8              < 'FILS'.
M9:      BYTE        3;" "
         ASCI        "  "
M10:     BYTE        6;'6D
         ASCI        "ITEM= "
M11:     BYTE        8;'6D
         ASCI        "RACINE= "
M12:     BYTE        5;'6D
         ASCI        "TYP="
<
<        E N T R E E   C O M M A N D E  :
<
NCOM:    EQU         $
         BYTE        PM;"!"

         WORD        M1,X
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
N1:      BYTE        PCS;0
         WORD        NC1             < MISE DU NOEUD1 COMME NOEUD
                                     < COURANT A PRIORI.
N2:      BYTE        PIS;2           < LECTURE DE 2 CARACTERES.
         WORD        0               < POUR OCCUPER UN MOT.
<
<        A N A L Y S E   C O M M A N D E  :
<
N3:      BYTE        PT;"N"
         WORD        0
N19:     BYTE        PT;"F"
         WORD        N4              < DEMANDE DE TRAVAIL GLOBAL
                                     < SUR UN NOEUD.
N21:     BYTE        PT;"C"
         WORD        N20             < DEMANDE DE FIN DE TRAVAIL.
N140:    BYTE        PT;"I"
         WORD        N22             < CONNEXION PERE-->FILS.
         IF          GIGE,X100,,X100
N194:    BYTE        PT;"M"
         WORD        N141            < TRAVAIL SUR ITEM DEMANDE.
         BYTE        PT;" "
         WORD        N195            < DEMANDE DE MOUVEMENT D'ITEM(S).
X100:    VAL         0
         IF          GIGE,,X100,
N194:    BYTE        PT;" "
         WORD        N141            < TRAVAIL SUR ITEM DEMANDE.
X100:    VAL         0
         BYTE        PT;"-"
         WORD        N10             < ERREUR : C'EST PROBABLEMENT LE
                                     < NOM D'UNE BRANCHE SECONDAIRE
                                     < D'OVERLAY QUI A ETE DONNE
N251:    BYTE        PT;"L"
         WORD        N262            < DEMANDE DE LISTE+DELETE <NOM>.
         WORD        NONC            < COMMANDE NON RECONNUE : OVERLAY.
         WORD        N252            < DEMANDE LISTE DE <NOM>.
<
<        R E T O U R   A U   C C I  :
<
N20:     BYTE        PF;0            < RETOUR AU CCI.
<
<        T R A V A I L   G L O B A L   S U R   N O E U D  :
<
N4:      BYTE        PCS;0
         WORD        RAZN            < RAZ DE L'ESPACE DU NOEUD1.
N11:     BYTE        PM;">"
         WORD        M2,X            < ENVOI DU MESSAGE 'NOM>'.
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
N5:      BYTE        PCS;0
         WORD        NOMIN           < ENTREE DE <NOM> DU NOEUD.
N6:      BYTE        PCS;0
         WORD        CODAGE          < CODAGE FABULEUX DE <NOM>.
N7:      BYTE        PT;"+"
         WORD        0
N14:     BYTE        PT;"-"
         WORD        N9              < DEMANDE DE CREATION D'UN NOEUD.
         IF          GIGE,X100,,X100
N57:     BYTE        PT;"="
         WORD        N15             < DEMANDE DE DELETE D'UN NOEUD.
N92:     BYTE        PT;"C"
         WORD        N58             < DEMANDE DISPLAY D'UN NOEUD
X100:    VAL         0
         IF          GIGE,,X100,
N57:     BYTE        PT;"C"
         WORD        N15             < DEMANDE DE DELETE NOEUD.
X100:    VAL         0
N93:     BYTE        PT;"D"
         WORD        N120            < CONNEXION NOEUD-->ITEM.
         WORD        NONC            < COMMANDE NON RECONNUE : OVERLAY.
         WORD        N100            < DECONNEXION NOEUD-->ITEM.
<
<        C R E A T I O N   D ' U N   N O E U D  :
<
N9:      BYTE        PCS;0
         WORD        INDICN          < MISE EN PLACE DE L'INDICATEUR
                                     < 'TYPE-NOEUD' ('CE).
N56:     BYTE        PC;"S"
         WORD        WSGN            < ENVOI DU <NOMC> AU SGN.
         WORD        N10             < RETOUR EN ERREUR DU SGN.
         WORD        NCOM            < RETOUR AU NIVEAU COMMANDE.
<
<        D E L E T E   D ' U N   N O E U D  :
<
N15:     BYTE        PC;"S"
         WORD        TSGN            < TEST & LOAD LE NOEUD1.
         WORD        N10             < ERREUR , LE NOEUD N'EXISTE PAS.
N16:     BYTE        PC;"N"
         WORD        CHKN            < (NOEUD1) EST-IL DE TYPE-NOEUD ????
         WORD        N10             < NON , ERREUR.
N52:     BYTE        PC;"I"
         WORD        CHKNI           < TEST SI UN ITEM EST ATTACHE
                                     < AU NOEUD COURANT ???
         WORD        N10             < ET OUI , ERREUR.
N53:     BYTE        PC;"P"
         WORD        CHKP            < TEST LE PERES DE NOEUD1.
         WORD        N10             < ERREUR : IL RESTE UN OU DES
                                     < PERE(S) A NOEUD1.
N17:     BYTE        PC;"F"
         WORD        CHKF            < TEST LES FILS DE NOEUD1.
         WORD        N10             < ERREUR : NOEUD1 A ENCORE UN
                                     < OU DES FILS.
N18:     BYTE        PC;"X"
         WORD        DSGN            < DELETE LE NOEUD.
         WORD        N10             < ERREUR ????
         WORD        NCOM            < VERS LA COMMANDE SUIVANTE.
         IF          GIGE,X100,,X100
<
<        E D I T I O N   D U   C O N T E N U   D E   N O E U D 1  :
<
N58:     BYTE        PC;"S"
         WORD        TSGN            < TEST & LOAD NOEUD1.
         WORD        N10             < ERREUR , LE NOEUD DEMANDE
                                     < N'EXISTE PAS.
N59:     BYTE        PC;"N"
         WORD        CHKN            < TEST DU TYPE DE NOEUD1.
         WORD        N10             < ERREUR DE TYPE ...
N60:     BYTE        PM;"="
         WORD        M3,X            < MESSAGE 'NOMC='.
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
N290:    BYTE        PC;0
         WORD        NOMOUT          < EDITION DU <NOMC>.
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
N291:    BYTE        PC;0
         WORD        CHKNI           < UN ITEM EST-IL CONNECTE ????
         WORD        N114            < OUI , EDITION DE SON NOM ....
         WORD        N61             < PAS D'ITEM CONNECTE A CE
                                     < NOEUD ; NOTER B=0 !!!!!!!
N114:    BYTE        PM;"="
         WORD        M10,X           < MESSAGE 'ITEM='.
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
N115:    BYTE        PCS;0
         WORD        NITEM2          < <NOMC>(ITEM) MIS DANS LE NOEUD2.
N110:    BYTE        PCS;0
         WORD        NC2             < NOEUD2 DEVIENT LE NOEUD COURANT.
N111:    BYTE        PC;"S"
         WORD        TSGN            < TEST & LOAD L'IEM.
         WORD        N113            < IL N'EXISTE PLUS , ON NE PEUT
                                     < DONC EDITER SON <NOM>.
N112:    BYTE        PC;0
         WORD        EDITN           < EDITION DE <NOM>(ITEM).
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
N113:    BYTE        PCS;0
         WORD        NC1             < NOEUD1 REDEVIENT LE NOEUD COURANT
N61:     BYTE        PC;'FF          < B INCHANGE.
         WORD        EFAMIL          < TEST DE L'OCCUPATION DU
                                      < MEMBRE (B) DEMANDE.
         WORD        N62             < LE MEMBRE N'EST PAS OCCUPE.
         WORD        N68             < LE MEMBRE (B) EXISTE.
N62:     BYTE        PC;'FF
         WORD        FFAMIL          <TEST DU FIN DE FAMILLE.
         WORD        NCOM            < ET NON , ON EST AU BOUT DE LA
                                     < FAMILLE , ALLONS VERS LA
                                     < COMMANDE SUIVANTE.
         WORD        N61             < OK , LE MEMBRE SUIVANT (B)
                                     < EXISTE , ALLONS LE QUERIR.
N68:     BYTE        PCS;'FF
         WORD        NC2             < PASSAGE SUR NOEUD2.
N63:     BYTE        PC;'FF
         WORD        TSGN            < TEST & LOAD DU MEMBRE DEMANDE.
         WORD        N81             < ERREUR N'EXISTE PLUS !????
         WORD        N80             < OK , LE MEMBRE EXISTE ...
N81:     BYTE        PA;"S"
         WORD        0
         WORD        N35             < VERS LA RESTAURATION DE NOEUD1
                                     < ET LE RETOUR EN ERREUR.
N80:     BYTE        PC;'FF
         WORD        DISPF           < DISCRIMINATION PERES/FILS.
         WORD        N65             < LE MEMBRE APPARTIENT A LA
                                     < LISTE DES FILS.
<
< EDITION D'UN PERE :
<
N64:     BYTE        PCS;'FF
         WORD        NAPERE          < CONVERSION DU NUMERO DE MEMBRE
                                     < EN NUMERO ASCI DE PERE.
N66:     BYTE        PM;'FF
         WORD        M7,X            < EDITION DU MESSAGE PERE.
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
N69:     BYTE        PCS;'FF
         WORD        NPERE           < RESTAURATION DU NUMERO DE
                                     < MEMBRE B.
N67:     BYTE        PM;'FF
         WORD        M9,X            < EDITION DE 3 'SPACE'.
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
N90:     BYTE        PC;'FF
         WORD        EDITN           < EDITION DE <NOM> DE CE PERE.
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
N70:     BYTE        PC;'FF
         WORD        NC1             < RETOUR SUR NOEUD1.
         WORD        0               < POUR OCCUPER UN MOT.
         WORD        N62             < VERS L'ACCES AU MEMBRE SUIVANT ,
                                     < SI EXISTE ET OCCUPE.
<
< EDITION D'UN FILS :
<
N65:     BYTE        PCS;'FF
         WORD        NAFILS          < CONVERSION DU NUMERO DE MEMBRE
                                     < EN UN NUMERO DE FILS ASCI.
N71:     BYTE        PM;'FF
         WORD        M8,X            < EDITION DU MESSAGE FILS.
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
N73:     BYTE        PCS;'FF
         WORD        NFILS           < RESTAURATION DU NUMERO DE
                                     < MEMBRE (B).
N72:     BYTE        PM;'FF
         WORD        M9,X            < EDITION DE 3 'SPACE'.
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
N91:     BYTE        PC;'FF
         WORD        EDITN           < EDITION DE <NOM> DE CE FILS.
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
         WORD        N70             < VERS LE RETOUR A NOEUD1.
X100:    VAL         0
<
<        C O N N E X I O N   P E R E   ---->   F I L S  :
<        E T   D E C O N N E X I O N  :
<
N22:     BYTE        PCS;0
         WORD        RAZN            < RAZ DU NOEUD1 (PERE).
N25:     BYTE        PM;">"
         WORD        M5,X            < ENVOI DU MESSAGE 'PERE'.
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
N26:     BYTE        PCS;0
         WORD        NOMIN           < ENTREE DE <NOM>(PERE).
N27:     BYTE        PCS;0
         WORD        CODAGE          < CALCUL DE <NOMC>(PERE).
N28:     BYTE        PC;"P"
         WORD        TSGN            < LOAD & TEST LE PERE (NOEUD1).
         WORD        N10             < PERE INCONNU ....
N29:     BYTE        PC;"N"
         WORD        CHKN            < TEST LE TYPE DU PERE ???
         WORD        N10             < ERREUR : PAS LE TYPE-NOEUD.
N54:     BYTE        PCS;0
         WORD        NC2             < CHANGEMENT DE NOEUD COURANT :
                                     < PASSAGE A NOEUD2 (FILS).
N30:     BYTE        PCS;0
         WORD        RAZN            < RAZ DU NOEUD2 (FILS).
N31:     BYTE        PM;">"
         WORD        M6,X            < ENVOI DU MESSAGE 'FILS'.
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
N32:     BYTE        PCS;0
         WORD        NOMIN           < ENTREE DE <NOM>(FILS).
N33:     BYTE        PCS;0
         WORD        CODAGE          < CALCUL DE <NOMC>(FILS).
N34:     BYTE        PC;"F"
         WORD        TSGN            < TEST & LOAD LE FILS.
         WORD        N35             < ERREUR : FILS INCONNU ....
         WORD        N50
N35:     BYTE        PC;'FF          < 'FF CAR ON DOIT TRANSMETTRE LE
                                     < CODE ASCI D'ERREUR.
         WORD        NC1             < RESTAURATION DE NOEUD1 COMME
                                     < NOEUD COURANT.
         WORD        0               < POUR OCCUPER UN MOT.
         WORD        N10             < VERS LE TRAITEMENT DES ERREURS.
N50:     BYTE        PC;"N"
         WORD        CHKN            < LE FILS DEMANDE EST-IL DE
                                     < TYPE-NOEUD ????
         WORD        N35             < NON , ERREUR.
N55:     BYTE        PT;"-"
         WORD        0
         WORD        N36             < NON , TENTONS UNE CONNEXION.
N51:     BYTE        PC;0
         WORD        DECONE          < TENTATIVE DE DECONNEXION.
         WORD        N35             < DECONNEXION IMPOSSIBLE.
         WORD        N38             < OK
N36:     BYTE        PTS;0           < ACCES AU 2EME CARACTERE DE LA
                                     < COMMANDE QUELQUE SOIT SA VALEUR.
         WORD        0
N37:     BYTE        PC;'FF          < AFIN DE TRANSMETTRE B=NUMERO
                                     < DEMANDE POUR LE FILS.
         WORD        CONECT          < TENTATIVE DE CONNEXION :
                                     < PERE-->FILS.
         WORD        N35             < ERREUR : CONNEXION IMPOSSIBLE.
N38:     BYTE        PCS;0
         WORD        DSGN            < DELETE LE FILS (NOEUD2).
N39:     BYTE        PC;"S"
         WORD        WSGN            < REECRITURE DU NOEUD1 (FILS).
         WORD        N35             < ERREUR.
N40:     BYTE        PCS;0
         WORD        NC1             < RETOUR SUR NOEUD1 (&ERE).
N41:     BYTE        PC;0
         WORD        DSGN            < DELETE LE PERE.
         WORD        N42             < OK
         WORD        N42             < ERREUR.
N42:     EQU         N56             < VERS LA REECRITURE DU PERE.
<
<        C O N N E X I O N   I T E M  :
<
N120:    BYTE        PC;"S"
         WORD        TSGN            < TEST & LOAD NOEUD.
         WORD        N10             < ERREUR : NOEUD INEXISTANT.
N121:    BYTE        PC;"N"
         WORD        CHKN            < TEST DU TYPE DE NOEUD1.
         WORD        N10             < ERREUR : PAS TYPE NOEUD.
N122:    BYTE        PC;"I"
         WORD        CHKNI           < Y-A-T'IL UN ITEM CONNECTE
                                     < A CE NOEUD ???
         WORD        N10             < ET OUI DEJA UN , ERREUR.
N123:    BYTE        PCS;0
         WORD        IC2             < ITEM2 DEVIENT L'ITEM COURANT.
         BYTE        PCS;0
         WORD        GANOM           < GENERE LES RELAIS ANOM & ANOMC.
N124:    BYTE        PSS;0
         WORD        SG1             < APPEL DE LA SOUS-GRAMMAIRE SG1
                                     < POUR : 'ITEM'+NOMIN+CODAGE.
N126:    BYTE        PC;"S"
         WORD        TSGNI           < TEST & LOAD L'ITEM.
         WORD        N35             < ERREUR : L'ITEM A DISPARU ....
N127:    BYTE        PC;"T"
         WORD        CHKI            < ITEM2 A-T'IL LE TYPE ITEM ???
         WORD        N35             < ERREUR.
         BYTE        PC;0
         WORD        CONI            < TENTATIVE DE CONNEXION :
                                     < ITEM2-->NOEUD1.
         WORD        N35             < ERREUR : PLUS DE PERES DISPONIBLES
N128:    BYTE        PCS;0
         WORD        NITEM1          < DEPLACEMENT DE <NOMC>(ITEM) DE
                                     < ITEM2 A NOEUD1.
N129:    BYTE        PCS;0
         WORD        DSGNI           < DELETE ITEM2.
         BYTE        PC;"S"
         WORD        WSGNI           < ET REECRITURE IMMEDIATE APRES
                                     < MAJ DE LA LISTE DES PERES.
         WORD        N35             < ERREUR BIZARRE ...
         BYTE        PCS;0
         WORD        NC1             < NOEUD1 REDEVIENT LE NOEUD COURANT
N130:    BYTE        PC;0
         WORD        IBITEM          < MISE DE BITEM DU NOEUD1 A
                                     < 1 POUR MEMORISER LA CONNEXION.
         WORD        N41
         WORD        N41             < VERS LE DELETE ET LA REECRITURE
                                     < DU NOEUD1.
<
<        D E C O N N E X I O N   I T E M  :
<
N100:    BYTE        PC;"S"
         WORD        TSGN            < TEST & LOAD LE NOEUD1.
         WORD        N10             < ERREUR : N'EXISTE PAS.
N101:    BYTE        PC;"N"
         WORD        CHKN            < TEST DU TYPE DE NOEUD1.
         WORD        N10             < ERREUR : CE N'EST PAS LE
                                     < TYPE NOEUD.
N102:    BYTE        PC;"I"
         WORD        CHKNI           < Y-A-T'IL UN ITEM CONNECTE ???
         WORD        N310            < OK , ALLONS ROMPRE LA CONNEXION.
         WORD        N10             < ERREUR : PAS D'ITEM CONNECTE.
N310:    BYTE        PCS;0
         WORD        NITEM3          < <NOMC>(ITEM) EST DEPLACE
                                     < DE <ITEM>(NOEUD1) VERS
                                     < <NOMC>(ITEM2).
         BYTE        PCS;0
         WORD        IC2             < ITEM2 DEVIENT L'ITEM COURANT.
         BYTE        PCS;0
         WORD        GANOM           < GENERE LES RELAIS ANOM & ANOMC.
         BYTE        PC;"S"
         WORD        TSGNI           < TEST & LOAD ITEM2.
         WORD        N35             < ERREUR : ITEM2 N'EXISTE PLUS ???
         BYTE        PC;0
         WORD        DECONI          < DECONNEXION ITEM2-->NOEUD1.
         WORD        N35             < ERREUR BIZARRE ....
         WORD        N129            < VERS LA MAJ DU NOEUD1.
<
<        T R A V A I L   G L O B A L   S U R   I T E M  :
<
N141:    BYTE        PT;"+"
         WORD        0
N142:    BYTE        PT;"-"
         WORD        N150            < CREATION D'UN ITEM.
         BYTE        PT;"U"
         WORD        N143            < DELETE ITEM.
N180:    BYTE        PT;"L"
         WORD        N181            < APPEL ITEM SOUS :SYS.
N182:    BYTE        PT;"S"
         WORD        N181            < APPEL DE L'ITEM COURANT.
         IF          GIGE,X100,,X100
N320:    BYTE        PT;"="
         WORD        N183            < DEMANDE DE REECRITURE DE L'ITEM
                                     < COURANT.
         WORD        NONC            < COMMANDE NON RECONNUE : OVERLAY.
         WORD        N321            < DEMANDE DISPLAY ITEM.
X100:    VAL         0
         IF          GIGE,,X100,
         WORD        NONC            < COMMANDE NON RECONNUE : OVERLAY.
         WORD        N183            < DEMANDE DE REECRITURE DE L'ITEM
                                     < COURANT.
X100:    VAL         0
<
<        D E L E T E   I T E M   S I T U E   E N   N C 1  :
<
N143:    BYTE        PSS;0
         WORD        SG1             < APPEL DE LA SOUS-GRAMMAIRE SG1 ,
                                     < POUR : 'ITEM'+NOMIN+CODAGE.
N146:    BYTE        PC;"S"
         WORD        TSGN            < A T T E N T I O N  : C'EST
                                     < TSGN (ET NON PAS TSGNI) QU'ON
                                     < APPELLE , ETANT DONNE QUE L'ITEM
                                     < EST SITUE EN NC1 ......
         WORD        N10             < ERREUR : L'ITEM N'EXISTE PAS.
N147:    BYTE        PC;"I"
         WORD        CHKI            < L'ITEM A-T'IL BIEN LE TYPE-ITEM ?
         WORD        N10             < NON , ERREUR.
         BYTE        PC;"F"
         WORD        CHKPI           < L'ITEM A-T'IL ENCORE DES PERES ???
         WORD        N10             < OUI , ERREUR.
         WORD        N18             < OK , DELETE L'ITEM.
<
<        C R E A T I O N   I T E M  :
<
N150:    BYTE        PCS;0
         WORD        IC1             < ITEM1 DEVIENT L'ITEM COURANT.
N151:    BYTE        PCS;0
         WORD        RAZN            < RAZ DE L'EN-TETE DE L'ITEM.
N152:    BYTE        PCS;0
         WORD        GANOM           < GENERATION DES RELAIS ANOM
                                     < ET ANOMC POUR ITEM1.
N153:    BYTE        PCS;0
         WORD        ILONG           < RAZ DE LRITEM.
N154:    BYTE        PSS;0
         WORD        SG1             < APPEL DE LA SOUS-GRAMMAIRE SG1
                                     < POUR : 'ITEM'+NOMIN+CODAGE.
N155:    BYTE        PCS;0
         WORD        INDICI          < MISE EN PLACE DE L'INDICATEUR
                                     < TYPE-ITEM.
N156:    BYTE        PC;"S"
         WORD        WSGNI           < DEMANDE DE CREATION DE L'ITEM.
         WORD        N35             < ERREUR : L'ITEM EXISTE DEJA ,
                                     < RETOUR SUR NC1.
         WORD        NCOM            < OK , ITEM CREE.
<
<        A P P E L   I T E M   C O U R A N T  :
<
N181:    BYTE        PCS;'FF         < B RESTE INCHANGE : B="U"/"L".
         WORD        STACN           < SELECTION DU NVP REPONDANT A
                                     < LA DEMANDE : NVP=6/5.
         BYTE        PCS;0
         WORD        IC1             < ITEM1 DEVIENT L'ITEM COURANT.
N184:    BYTE        PCS;0
         WORD        GANOM           < GENERATION DES RELAIS NOM
                                     < ET NOMC.
N185:    BYTE        PSS;0
         WORD        SG1             < APPEL DE LA SOUS-GRAMMAIRE
                                     < SG1 POUR : 'ITEM'+NOMIN+CODAGE.
N186:    BYTE        PC;"S"
         WORD        LSGNI           < TEST & LOAD LE <NOM> DEMANDE
                                     < SOUS LE BON <ACN> ; LE NVP
                                     < DE DEMSGN EST DEJA POSITIONNE.
         WORD        N35             < ERREUR : LE NOM N'EXISTE PAS.
N187:    BYTE        PC;"I"
         WORD        CHKI            < LE NOM EST-IL BIEN CELUI
                                     < D'UN ITEM ????
         WORD        N35             < NON , ERREUR.
         WORD        NCOM            < OK , LE <NOM> EST BIEN CELUI
                                     < D'UN ITEM.
<
<        R E E C R I T U R E   D E   L ' I T E M   C O U R A N T  :
<
N183:    BYTE        PCS;0
         WORD        IC1             < ITEM1 DEVIENT L'ITEM COURANT.
N190:    BYTE        PC;0
         WORD        CHKI            < ITEM1 A-T'IL LE TYPE-ITEM ????
         WORD        N35             < ERREUR.
N191:    BYTE        PCS;"S"
         WORD        DSGNI           < DELETE ITEM1.
N192:    BYTE        PC;"S"
         WORD        WSGNI           < REECRITURE DE ITEM1.
         WORD        N35             < ERREUR ????
         WORD        NCOM            < OK , COMMANDE SUIVANTE.
         IF          GIGE,X100,,X100
<
<        E D I T I O N   D U   C O N T E N U   D ' U N   I T E M  :
<
N321:    BYTE        PSS;0
         WORD        SG1             < POUR 'ITEM'+NOMIN+CODAGE.
         BYTE        PC;"S"
         WORD        TSGN            < TEST & LOAD L'ITEM.
         WORD        N10             < ERREUR : N'EXISTE PAS.
         BYTE        PC;"T"
         WORD        CHKI            < NOEUD1 A-T'IL LE TYPE-ITEM ????
         WORD        N10             < NON , ERREUR.
         BYTE        PCS;0
         WORD        TYPI            < RENVOI B=NATURE ITEM (EN ASCI).
         BYTE        PM;'FF
         WORD        M12,X           < EDITION DE 'TYPE=V/T/....'.
         WORD        NCOM            < ABORT COMMANDE POUR CTRL-X-OFF.
         BYTE        PM;"="
         WORD        M3,X            < EDITION DE 'NOMC='
         WORD        NCOM            < ABORT POUR CTRL-X-OFF.
         BYTE        PC;0            < A NOTER : B=0 !!!!!!
         WORD        NOMOUT          < EDITION DE <NOMC>(ITEM).
         WORD        NCOM            < ABORT POUR CTRL-X-OFF.
N324:    BYTE        PC;'FF          < B CONTIENT LE NUMERO DU PERE
                                     < COURANT DE 0 A 15.
         WORD        EFAMIL          < TEST DE L'OCCUPATION DU PERE (B).
         WORD        N322            < LE PERE(B) N'EST PAS OCCUPE.
<
< EDITION D'UN PERE :
<
N323:    BYTE        PCS;'FF
         WORD        NC2             < NOEUD2 DEVIENT LE NOEUD COURANT.
         BYTE        PC;'FF
         WORD        TSGN            < ACCES AU PERE(B) DANS NOEUD2.
         WORD        N81             < ERREUR N'EXISTE PLUS !!!
         BYTE        PM;'FF
         WORD        M75,X           < EDITION DE 'PERE='.
         WORD        NCOM            < ABORT POUR CTRL-X-OFF.
         BYTE        PM;'FF
         WORD        M9,X            < EDITION DE '   ' COMME SEPARATEUR.
         WORD        NCOM            < ABORT POUR CTRL-X-OFF.
         BYTE        PC;'FF
         WORD        EDITN           < EDITION DE <NOM>(PERE(B)).
         WORD        NCOM            < ABORT POUR CTRL-X-OFF.
         BYTE        PCS;'FF
         WORD        NC1             < NOEUD1 REDEVIENT LE NOEUD COURANT.
N322:    BYTE        PC;'FF
         WORD        FFAMIL          < TEST DE FIN DE LISTE DES PERES ??
         WORD        NCOM            < OUI , C'EST FINI.
         WORD        N324            < NON , AU SUIVANT.
<
<        M O U V E M E N T   D ' I T E M S  :
<
N195:    BYTE        PT;"1"
         WORD        0
N197:    BYTE        PT;"2"
         WORD        N196            < DEMANDE : ITEM1-->ITEM2.
N199:    BYTE        PT;"X"
         WORD        N198            < DEMANDE : ITEM2-->ITEM1.
         WORD        NONC            < COMMANDE NON RECONNUE : OVERLAY.
         WORD        N200            < DEMANDE ECHANGE ITEM1<-->ITEM2.
<
<        M O U V E M E N T   :   I T E M 1   ---->    I T E M 2  :
<
N196:    BYTE        PCS;0
         WORD        IC1             < ITEM1 DEVIENT L'ITEM COURANT.
N201:    BYTE        PC;"I"
         WORD        CHKI            < ITEM1 A-T'IL BIEN LE TYPE-ITEM ???
         WORD        N35             < NON , ERREUR.
N202:    BYTE        PCS;0
         WORD        MOVE1           < MOVE : ITEM1-->ITEM2.
N250:    BYTE        PC;0
         WORD        IC2             < ITEM2 DEVIENT L'ITEM COURANT.
         WORD        0
         WORD        N208
<
<        M O U V E M E N T   :   I T E M 2   ---->    I T E M 1  :
<
N198:    BYTE        PCS;0
         WORD        IC2             < ITEM2 DEVIENT L'ITEM COURANT.
N203:    BYTE        PC;"I"
         WORD        CHKI            < ITEM2 A-T'2L BIEN LE TYPE-ITEM ???
         WORD        N35             < NON , ERREUR.
N204:    BYTE        PC;0
         WORD        MOVE2           < MOVE : ITEM2-->ITEM1.
         WORD        0
         WORD        N207
<
<        E C H A N G E   :   I T E M 1   <---->   I T E M 2  :
<
N200:    BYTE        PCS;0
         WORD        MOVEX           < ECHANGE SANS VERIFICATIONS.
N205:    BYTE        PCS;0
         WORD        IC2             < IC2 DEVIENT L'ITEM COURANT.
N206:    BYTE        PCS;0
         WORD        GANOM           < GENERATION DE ANOM ET ANOMC
                                     < POUR ITEM2.
N207:    BYTE        PCS;0
         WORD        IC1             < ITEM1 DEVIENT L'ITEM COURANT.
N208:    BYTE        PC;0
         WORD        GANOM           < GENERATION DE ANOM ET ANOMC
                                     < POUR ITEM1.
         WORD        0
         WORD        NCOM            < ACCES COMMANDE SUIVANTE.
X100:    VAL         0
<
<        S O U S - G R A M M A I R E   S G 1  :
<        ' I T E M '   +   N O M I N   +   C O D A G E  :
<
SG1:     EQU         $
         WORD        0               < POINT D'ENTREE DE SG1.
N160:    BYTE        PM;">"
         WORD        M10,X           < MESSAGE 'ITEM='.
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
N104:    BYTE        PCS;0
         WORD        NOMIN           < ENTREE DE <NOM>(ITEM).
N125:    BYTE        PCS;0
         WORD        CODAGE          < CALCUL DE <NOMC>(ITEM).
N170:    BYTE        PB;0
         WORD        SG1             < PERMET D'ACCEDER AU POINT DE
                                     < RETOUR DE L'APPEL DE SG1.
<
<        D E L E T E   E T   L I S T E  :
<
N262:    BYTE        PC;3            < ARG1=CODE DE DELETE SGN.
         WORD        INDLD           < MEMORISATION DU LISTE ET DELETE.
         WORD        N254            < VERS LA RECUPERATION CATALOGUE.
<
<        L I S T E   S E U L  :
<
N252:    BYTE        PCS;0           < ARG1=0 : PAS DE DELETE.
         WORD        INDLD           < MEMORISATION 'PAS DE DELETE'.
<
<        D E M A N D E   D E   C A T A L O G U E S  :
<
N254:    BYTE        PT;"I"          < CATALOGUE D'ITEMS ???
         WORD        0
         BYTE        PT;"N"          < CATALOGUE DE NOEUDS ???
         WORD        N253            < DANS LE CAS I/N , ON RECUPERE LE
                                     < CATALOGUE.
         WORD        NONC            < CAS DES TYPES NON RECONNUS ....
N253:    EQU         $
N215:    BYTE        PM;">"
         WORD        M11,X           < ENVOI DU MESSAGE 'RACINE'.
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
N216:    BYTE        PIS;4           < ENTREE DE 4 CARACTERES MAX
                                     < POUR LA RACINE :
                                     < RACINE=(K1(K2(K3)))<EOT>.
         WORD        0
N217:    BYTE        PC;"R"
         WORD        CHKR            < VALIDATION DE LA RACINE.
         WORD        N10             < ERREUR : MAUVAISE RACINE.
N218:    BYTE        PC;0
         WORD        CATAL1          < 1ERE ENTREE DANS LA ROUTINE
                                     < DE RECONSTITUTION DU CATALOGUE.
         WORD        NCOM            < C'EST FINI , ACCES A LA COMMANDE
                                     < SUIVANTE.
N257:    BYTE        PC;0
         WORD        TSGN            < TEST ET LOAD DU <NOMC>.
         WORD        N259            < ERREUR ???
N258:    BYTE        PC;0
         WORD        CHKIN           < TEST DU TYPE DE <NOMC> ???
         WORD        N259            < CE N'EST PAS UN ITEM , LE
                                     < <NOMC> EST IGNORE.
N260:    BYTE        PM;"-"
         WORD        M1,X            < ENVOI D'UN SEPARATEUR.
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
N270:    BYTE        PC;0
         WORD        EDITN           < EDITION DU <NOM> DU <NOMC>.
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
         IF          GIGE,,X100,
         BYTE        PCS;0
         WORD        STOZDC          < ENVOI DE <NOMC> EN ZDC...
X100:    VAL         0
         BYTE        PCS;0
         WORD        DSGNG           < FAUT-IL AUSSI DELETER L'ELEMENT
                                     < COURANT , MAIS ,
                                     < A T T E N T I O N  : S'IL Y
                                     < A DELETER , CELUI-CI EST FAIT
                                     < SANS AUCUNE VERIFICATION
                                     < DE FILIATION/PATERNITE !!!!!!!
N259:    BYTE        PC;0
         WORD        CATAL2          < ENTRY2 DE RECONSTITUTION DU
                                     < CATALOGUE.
         WORD        NCOM            < FIN DU CATALOGUE.
         WORD        N257            < RETOUR UN <NOMC> TROUVE.
<
<        C O M M A N D E S   N O N   R E C O N N U E S  :
<
NONC:    BYTE        PC;'FF          < NE PAS MODIFIER (B).
         WORD        LOADP           < TENTATIVE DE CHARGEMENT D'UNE
                                     < BRANCHE D'OVERLAY.
         WORD        N10             < ERREUR : LA COMMANDE EST
                                     < REELLEMENT INCONNUE.
<
<
<        A T T E N T I O N  :
<                      NONC ET N10 DOIVENT ETRE DES
<                    NOEUDS CONTIGUS A CAUSE DE
<                     LA ROUTINE 'LOADP' QUI PEUT REVENIR
<                    AVEC X=0 LORS DES COMMANDES D'UN
<                    SEUL CARACTERE ...
<
<
<        E R R E U R  :
<
N10:     BYTE        PM;'FF
         WORD        M4,X
         WORD        NCOM            < CTRL-X-OFF : ABORT LA COMMANDE.
         WORD        NCOM            < RETOUR AU NIVEAU COMMANDE.
         PAGE
<
<
<        V A L I D A T I O N   D E   L ' I M P L A N T A T I O N
<        E N   M E M O I R E   D E S   I T E M S  :
<
X4:      VAL         ITEM2-$         < CETTE QUANTITE DOIT ETRE
                                     < POSITIVE OU NULLE.
         IF          X4,,XWOR%,XWOR%
         IF          ATTENTION : "GE" EST TROP LONG !!!
XWOR%:   VAL         0
         DZS         X4+1            < PAR PURE PROPRETE !!!
         EOT         #SIP GEN PROCESSEUR#



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.