EXT         GENLC
         TABLE
ZERO:    EQU         $
<
< INTERFACE AVEC CMS4
<
         DZS         '10
         WORD        DEB
<
< POINT D'ENTREE
<
         WORD        DEBUT
         PROG
DEB:     EQU         $
         LRP         L
         BR          -1,L
<
<
<        E N - T E T E   D E   L ' I T E M  :
<
<
LHITEM:  VAL         80              < NBRE DE MOTS OCCUPES PAR
                                     < L'EN-TETE D'UN ITEM.
HITEM:   EQU         $               < EN-TETE D'UN ITEM.
NOMCI:   DZS         3               < NOM CODE SUR 6 CARACTERES.
         BYTE        '04;'C9         < <EON> DE FIN DE NOM , ET
                                     < INDICATEURS TYPE-ITEM : 'I'+'80.
LRITEM:  WORD        0               < LONGUEUR REELLE DE L'ITEM EN
                                     < OCTETS (0 INITIALEMENT).
IINDIC:  BYTE        "T";0           < INDICATEURS DIVERS ET VARIES
                                     < OCTET0=NATURE DE L'ITEM (='00 ,
                                     < SI L'ITEM EST VIDE) :
                                     < OCTET0='T' POUR 'TYPE-TEXTE'.
X1:      VAL         'C
FAMILI:  EQU         HITEM+X1        < OCCUPATION DES 16 PERES POSSIBLES
                                     < D'UN ITEM.
X1:      VAL         'D
PERIS:   EQU         HITEM+X1        < LISTE DES 16 PERES POSSIBLES
                                     < D'UN ITEM.
XNOM:    VAL         '3D             < DEPLACEMENT DE <NOM> DANS ITEM
NOMI:    EQU         HITEM+XNOM      < NOM DE L'ITEM.
X1:      VAL         '4F
TOPI:    EQU         HITEM+X1        < TOP DE L'EN-TETE DE L'ITEM.
         DZS         TOPI-IINDIC     < $<--TOPI+1.
<
<
<        R E L A I S   D ' A C C E S  :
<
<
ANOMCI:  WORD        NOMCI,X
ANOMI:   WORD        NOMI,X
<
<
<        C O R P S   D E   L ' I T E M  :
<
<
NBCAR:   VAL         74              < NBRE DE CARACTERES/LIGNE.
NBLIG:   VAL         35              < NBRE DE LIGNES/PAGE.
LITEM:   VAL         NBCAR*NBLIG     < NBRE DE CARACTERES MAX OCCUPES
                                     < PAR LE CORPS DE L'ITEM.
CITEM:   DZS         LITEM/2         < CORPS DE L'ITEM PROPREMENT DIT.
X2:      VAL         CITEM-HITEM
LTNI:    VAL         $-HITEM         < LONGUEUR TOTALE MAXIMALE EN
                                     < MOTS DE L'ITEM (EN-TETE+CORPS).
         COMMON
COM:     EQU         $
         DZS         1               < POUR FLOTTANT
CCI:     WORD        1               < RETOUR CCI
KSTORE:  DZS         20              < PILE K
REL:     WORD        CITEM,X         < RELAI CORPS ITEM
DEBITE:  ASCI        "KGXWYW D 12AB "  < EN-TETE ITEM
FINSEQ:  ASCI        " MIC; OAB MOC;  "  < FIN DE SEQUENCE
LIST:    EQU         $               < PARAM POUR GENLC
FCT:     DZS         1               < FONCTION
AD:      DZS         1               < @ GENERATION
RHO:     DZS         1               < RAYON
NB:      DZS         1               < NB SEGMENTS
RAYON:   WORD        200             < RAYON
DIST:    WORD        300             < DISTANCE YEUX
NBSEG:   WORD        80              < NB DE SEGMENTS
NBPV:    WORD        10              < NB DE POINTS DE VUE
SP:      WORD        GENLC           < RELAI SP
AITEM:   WORD        HITEM           < RELAI DEBUT ITEM
F3:      DZS         1               < FCT COMPRESSION NOM
ANOMC:   WORD        NOMCI,X         < RELAI NOM COMPACTE
NOMCP2:  WORD        NOMCI+2         < DERNIER MOT NOM COMPACTE
AGTCAR:  WORD        GETCAR          < SP LECTURE 1 CARAC
LNOM:    VAL         '26             < LONGUEUR NOM
ANOM:    WORD        NOMI,X          < RELAI NOM SYMBOLIQUE
CODE:    WORD        CODAGE          < SP DE CODAGE NOM
ALITEM:  WORD        LRITEM          < RELAI LG ITEM
LMITEM:  WORD        LITEM/2         < LG ITEM EN MOTS
FINITE:  WORD        HITEM+LTNI,X    < RELAI FIN ITEM
NOMITE:  BYTE        '6D;"N"         < POUR DEMANDER NOM ITEM
         ASCI        "OM ="
DEMNOM:  WORD        '0202           < DEMANDE NOM
         WORD        NOMITE-ZERO*2
         WORD        6
LECNOM:  WORD        '0101           < LECTURE NOM
         WORD        NOMI-ZERO*2
         WORD        LNOM
DEMGEN:  WORD        '8402           < GENERATION ITEM
         WORD        HITEM-ZERO*2
         WORD        LTNI*2
         WORD        -1
DIX:     WORD        10
BID:     WORD        0               < POUR LECTURE
MESS:    WORD        SPMESS          < SORTIE MESSAGE
LECN:    WORD        SPLECN          < LECTURE NOMBRE
LECF:    WORD        SPLECF          < LECTURE NOM FONCTION
DEMSEG:  BYTE        13;'6D          < NB SEGMENTS
         ASCI        "NB SEGMENTS="
DEMRAY:  BYTE        7;'6D           < RAYON
         ASCI        "RAYON="
DEMFIG:  BYTE        8;'6D           < FIGURE
         ASCI        "FIGURE="
DEMNBP:  BYTE        11;'6D          < NB PT VUE
         ASCI        "NB PT VUE="
DEMDIS:  BYTE        11;'6D          < DISTANCE YEUX
         ASCI        "DIST YEUX="
DEMOUT:  WORD        '0202           < SORTIE MESSAGE
         DZS         2
LECCH:   WORD        '0101           < LECTURE REPONSE
         WORD        BID-ZERO*2+1
         WORD        1
         WORD        COM+'80
         PROG
DEBUT:   EQU         $
         LRP         C               < INIT. BASE
         LA          -1,C
         LR          A,C
         LAD         KSTORE-1
         LR          A,K
         LX          LMITEM          < MISE A BLANC ITEM
         NGR         X
         LAI         '20
         SBT         2
         STA         &FINITE
         JIX         $-1
         LXI         0               < EN-TETE
         LAD         &REL
         LR          A,B
         LAD         DEBITE
         LXI         15
         MOVE
         LAD         DEMSEG          < NB SEGMENTS
         BSR         LECN
         STA         NBSEG
         LAD         DEMRAY          < RAYON
         BSR         LECN
         STA         RAYON
         LAD         DEMFIG          < 1ERE FIGURE
         BSR         LECF
         STA         FCT
         LXI         15
         LAD         &REL
         STA         AD
         LA          RAYON
         STA         RHO
         LA          NBSEG
         STA         NB
         LAD         LIST
         BSR         SP
         LB          AD              < OAB
         LAD         FINSEQ
         LXI         8
         MOVE
         LAD         DEMFIG          < 2EME FIGURE
         BSR         LECF
         STA         FCT
         LA          AD
         ADRI        8,A
         STA         AD
         LA          NBSEG
         STA         NB
         LAD         LIST
         BSR         SP
         LB          AD              < OAB
         LAD         FINSEQ
         LXI         8
         MOVE
         LAD         DEMNBP          < NB PT VUE
         BSR         LECN
         STA         NBPV
         LAD         DEMDIS          < DIST. YEUX
         BSR         LECN
         STA         DIST
         LA          AD
         ADRI        8,A
         STA         AD
         LAI         -1
         STA         FCT
         LA          DIST
         STA         RHO
         LA          NBPV
         STA         NB
         LAD         LIST
         BSR         SP
         LB          AD              < OAB
         LAD         FINSEQ
         LXI         8
         MOVE
         LA          LMITEM
         SLLS        1
         STA         &ALITEM
         LAD         DEMNOM          < GENERER
         SVC         0
         LAD         LECNOM
         SVC         0
         BSR         CODE
         LAD         DEMGEN
         SVC         0
         LAD         CCI
         SVC         0
         JMP         $-1
<
< SORTIE DE MESSAGE
<
SPMESS:  EQU         $
         LR          A,Y
         LR          A,W
         ADR         A,A
         ADRI        1,A
         STA         DEMOUT+1
         LBY         0,W
         STA         DEMOUT+2
         LAD         DEMOUT
         SVC         0
         RSR
<
< LECTURE D'UN NOMBRE
<
SPLECN:  EQU         $
         BSR         MESS
         LAI         0
         LR          A,W
LECN1:   EQU         $
         LAD         LECCH
         SVC         0
         LA          BID
         CPI         '0D
         JE          LECN2
         CPI         '04
         JE          LECN2
         ADRI        -'30,A
         JAL         LECN3
         CPI         9
         JG          LECN3
         XR          A,W
         MP          DIX
         ADR         B,W
         JMP         LECN1
LECN2:   EQU         $
         LR          W,A
         JAE         LECN3
         RSR
LECN3:   EQU         $
         LR          Y,A
         JMP         SPLECN
<
< LECTURE NOM FIGURE
<
SPLECF:  EQU         $
         BSR         MESS
         LAD         LECCH
         SVC         0
         LBI         0
         LA          BID
         CPI         "L"
         JE          LECF1
         ADRI        1,B
         CPI         "C"
         JE          LECF1
         ADRI        1,B
         CPI         "I"
         JE          LECF1
         LR          Y,A
         JMP         SPLECF
LECF1:   EQU         $
         LR          B,A
         RSR
<
<
<        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).
<
<
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         &NOMCP2         < 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
<
<
<        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>.
<
<
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
         END



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