NMTW:    VAL         "TW"
NMTX:    VAL         "TX"
NMTY:    VAL         "TY"
NMM:     VAL         " M"
NMN:     VAL         " N"
NMO:     VAL         " O"
         IF          NMPROC-NMTX,,XWOR%,
         IF          NMPROC-NMTW,,XWOR%,
         IF          NMPROC-NMM,,XWOR%,
         IF          NMPROC-NMN,,XWOR%,
         IF          NMPROC-NMTY,,XWOR%,
         IF          NMPROC-NMO,,XWOR%,
         IF          ATTENTION : 'NMPROC' EST MAUVAIS !!!
XWOR%:   VAL         0
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
         IDP         "TW - VERSION A NIVEAUX DE GRIS DE TV"
XWOR%9:  VAL         0
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
         IDP         "TX - VERSION TRI-DIMENSIONNELLE DE TW"
XWOR%9:  VAL         0
         IF          NMPROC-NMTY,XWOR%9,,XWOR%9
         IDP         "TY - VERSION TRANSFORMATION CONFORME DE TW"
XWOR%9:  VAL         0
         IF          NMPROC-NMM,XWOR%9,,XWOR%9
         IDP         " M - VERSION DE 'TW' INTERPRETATIVE"
XWOR%9:  VAL         0
         IF          NMPROC-NMN,XWOR%9,,XWOR%9
         IDP         " N - VERSION DE 'TX' INTERPRETATIVE"
XWOR%9:  VAL         0
         IF          NMPROC-NMO,XWOR%9,,XWOR%9
         IDP         " O - VERSION DE 'TY' INTERPRETATIVE"
XWOR%9:  VAL         0
         IDP         "RELEASE 27/05/1980"
         EOT         #SIP DEFINITION CMS5#
         EOT         #SIP DEF PROCESSEUR#
         PROG
         WORD        TW              < POINT D'ENTREE...
         WORD        0
PTW:     EQU         $               < DOIT VALOIR '12...
         LRP         L
         BR          -2,L            < ENTREE DANS LE PROCESSEUR...
         EOT         #SIP DEFINITION ITEM#
ITEM2:   EQU         ZERO+PILE-LTNI-LTNI
         EOT         #SIP IMAGE 256#
NBITMO:  VAL         16              < NOMBRE DE BITS PAR MOT.
NOCMO:   VAL         2               < NOMBRE D'OCTETS PAR MOT...
NBRHEX:  VAL         4               < NOMBRE DE CHIFFRES HEXAS PAR MOT.
BIT:     VAL         1
NMOTL:   VAL         CNMPL           < NOMBRE DE MOTS PAR LIGNE.
NLIG:    VAL         LIMAG/NMOTL     < NOMBRE DE LIGNES PAR TRAME.
NLIGM1:  VAL         NLIG-1          < ORDONNEE MAXIMALE.
XWOR%1:  VAL         NLIGM1+1
XWOR%2:  VAL         XWOR%1=0
         IF          BIT>XWOR%2-XWOR%1,,XWOR%,
         IF          ATTENTION : 'NLIGM1' DOIT ETRE UN MASQUE !!!
XWOR%:   VAL         0
NPOLM1:  VAL         NMOTL*NBITMO-1  < ABSCISSE MAXIMALE.
XWOR%1:  VAL         NPOLM1+1
XWOR%2:  VAL         XWOR%1=0
         IF          BIT>XWOR%2-XWOR%1,,XWOR%,
         IF          ATTENTION : 'NPOLM1' DOIT ETRE UN MASQUE !!!
XWOR%:   VAL         0
NCOOL:   VAL         3               < NOMBRE DE COULEURS DE BASE.
NIVMAX:  VAL         BIT>NCOOL-BIT   < NIVEAU MAX RECONNU.
MFFFF:   VAL         'FFFF           < MASQUE DU MOT.
EOT:     VAL         '04             < CARACTERE 'EOT'.
SGNDLN:  VAL         3               < FONCTION DE DELETE SGN,
SGNSTN:  VAL         4               < FONCTION DE STORE SGN,
SGNLON:  VAL         5               < FONCTION DE LOAD SOUS ACN SGN,
SGNLNS:  VAL         6               < FONCTION DE LOAD SOUS :SYS SGN.
         PAGE
<
<
<        S E L E C T I O N   D U   M O D E   D ' E N T R E E  :
<
<
NMPROD:  VAL         NMPROC          < SAUVEGARDE DU NOM REEL DU PROCESSEUR,
                                     < ON NE SAIT JAMAIS ??!?!?!?
VISU:    VAL         0               < MODE D'ENTREE PAR LA VISU,
ITEM:    VAL         1               < MODE D'ENTREE PAR L'ITEM1.
MODE:    VAL         VISU            < A PRIORI, 'TW'/'TX' : ENTREE VISU...
         IF          NMPROC-NMM,XWOR%,,XWOR%
NMPROC:  VAL         NMTW            < SI " M", ON LE REMPLACE PAR "TW",
MODE:    VAL         ITEM            < AVEC ENTREE PAR L'ITEM1.
XWOR%:   VAL         0
         IF          NMPROC-NMN,XWOR%,,XWOR%
NMPROC:  VAL         NMTX            < SI " N", ON LE REMPLACE PAR "TX",
MODE:    VAL         ITEM            < AVEC ENTREE PAR L'ITEM1.
XWOR%:   VAL         0
         IF          NMPROC-NMO,XWOR%,,XWOR%
NMPROC:  VAL         NMTY            < SI " O", ON LE REMPLACE PAR "TY",
MODE:    VAL         ITEM            < AVEC ENTREE PAR L'ITEM1.
XWOR%:   VAL         0
         PAGE
<
<
<        D E F I N I T I O N   D E   L ' I M A G E  :
<
<
NOM:     EQU         ZERO+PILE+5-LNOM
IMAG:    EQU         NOM+LNOM
IMAGE:   EQU         IMAG
IMAGR:   EQU         IMAGE+0
IMAGV:   EQU         IMAGR+LIMAG
IMAGB:   EQU         IMAGV+LIMAG
AMASK:   VAL         NCOOL*LIMAG     < ADRESSE DU MASQUE DANS LA 'CDA'.
LNOMP:   VAL         LNOM-1          < LONGUEUR UTILE DU NOM (A CAUSE DE
                                     < L'EOT A PRIORI...
         PAGE
<
<
<        M E S S A G E S  :
<
<
MMCDA:   BYTE        5;'6D
MCDAP:   ASCI        "!CDA"
PI:      BYTE        "P";EOT
MCDA:    ASCI        "!CDA"
         BYTE        EOT;0
REP:     DZS         NBRHEX/NOCMO    < BUFFER DES REPONSES.
MERR:    BYTE        1;"?"
         IF          MODE-VISU,XWOR%7,,XWOR%7
MINT:    BYTE        2;'6D;">";0
MNOM:    BYTE        5;'6D
         ASCI        "NOM="
MORGX:   BYTE        3;'6D
         ASCI        "X="
MORGY:   BYTE        3;'6D
         ASCI        "Y="
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
MMC:     BYTE        5;'6D
         ASCI        "RVB?"
MMS:     BYTE        6;'6D
         BYTE        "S";" ";"M";'08;'08
XWOR%9:  VAL         0
MFOND:   BYTE        6;'6D
         ASCI        "FOND= "
MTORE:   BYTE        6;'6D
         ASCI        "TORE? "
         IF          NMPROC-NMTW,XWOR%,,XWOR%
MIMA:    BYTE        7;'6D
         ASCI        "MASK=?"
MMAH:    BYTE        3;'6D
         ASCI        "H="
MMAV:    BYTE        3;'6D
         ASCI        "V="
XWOR%:   VAL         0
         IF          NMPROC-NMTX,XWOR%,,XWOR%
MPOINT:  BYTE        5;'6D
         ASCI        "#PT="
MPASQ:   BYTE        5;'6D
         ASCI        "PAS="
MFLOU:   BYTE        6;'6D
         ASCI        "FLOU? "
MMAX:    BYTE        5;'6D
         ASCI        "MAX?"
MPOND:   BYTE        8;'6D
         ASCI        "PONDER? "
MNIVO:   BYTE        9;'6D
         ASCI        "NIVEAUX="
MTRAM:   BYTE        7;'6D
         ASCI        "TRAME?"
MSENS:   BYTE        6;'6D;"S";" ";"R";'08;'08
MPROJ:   BYTE        3;'6D
         ASCI        "P="
XWOR%:   VAL         0
         IF          NMPROC-NMTY,XWOR%9,,XWOR%9
MK:      BYTE        3;'6D
         ASCI        "K="
MSENS:   BYTE        6;'6D;"S";" ";"R";'08;'08
MTRAN:   BYTE        24;'6D
         ASCI        "1/Z=1 OU Z2=2 OU MAP=3?"
MPROJ:   BYTE        3;'6D
         ASCI        "P="
XWOR%9:  VAL         0
MASKO:   BYTE        5;'6D
         ASCI        "MSK?"
MODM:    BYTE        5;'6D
         ASCI        "MOD="
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
MAT11:   BYTE        5;'6D
         ASCI        "M11="
MAT12:   BYTE        5;'6D
         ASCI        "M12="
MAT21:   BYTE        5;'6D
         ASCI        "M21="
MAT22:   BYTE        5;'6D
         ASCI        "M22="
XWOR%9:  VAL         0
MSLAS:   BYTE        1;"/"
MTRX:    BYTE        4;'6D
         ASCI        "CX= "
MTRY:    BYTE        4;'6D
         ASCI        "CY= "
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
MTRZ:    BYTE        4;'6D
         ASCI        "CZ= "
XWOR%9:  VAL         0
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
MNIVO:   BYTE        5;'6D
         ASCI        "NIV="
XWOR%9:  VAL         0
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
MDX:     BYTE        4;'6D
         ASCI        "DX= "
MDY:     BYTE        4;'6D
         ASCI        "DY= "
XWOR%9:  VAL         0
XWOR%7:  VAL         0
<
< ZONE EN RECOUVREMENT :
<
BUFIN:   EQU         ITEM2           < BUFFER D'ENTREE DES FONDS.
LBUFIN:  VAL         NBITMO/NOCMO
LBUFMH:  VAL         NPOLM1+1/NBITMO < LONGUEUR DU MASQUE HORIZONTAL,
LBUFMV:  VAL         NLIGM1+1/NBITMO < LONGUEUR DU MASQUE VERTICAL.
BUFMH:   EQU         BUFIN+LBUFIN    < MASQUE HORIZONTAL,
BUFMV:   EQU         BUFMH+LBUFMH    < MASQUE VERTICAL.
LSTACK:  VAL         40              < LONGUEUR DE LA PILE DE TRAVAIL.
STACK:   EQU         BUFMV+LBUFMV    < PILE DE TRAVAIL.
         PAGE
<
<
<        L O C A L  :
<
<
         LOCAL
LOC:     EQU         $
<
< CONSTANTES :
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
NGE:     ASCI        "GE"            < NOM DU PROCESSEUR DE RETOUR.
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
NSD:     ASCI        "SD"            < NOM DE L'OVERLAY D'APPEL.
TCALL:   WORD        "GE";"EI"       < NOM DES OVERLAYS DE RETOUR SI ALT-MODE.
NCALL:   WORD        TCALL,X
NPCALL:  WORD        0               < NOM DU PROCESSEUR DE RETOUR SI ALT-MODE.
XWOR%7:  VAL         0
SAVER:   WORD        0               < SAUVEGARDE D'UN MOT DE LA TRAME
                                     < RESIDENTE ROUGE,
SAVEV:   WORD        0               < DE MEME POUR LE VERT,
SAVEB:   WORD        0               < DE MEME POUR LE BLEU.
MCDAR:   WORD        0               < SAUVEGARDE D'UN MOT DE LA TRAME
                                     < SCRATCH ROUGE,
MCDAV:   WORD        0               < DE MEME POUR LE VERT,
MCDAB:   WORD        0               < DE MEME POUR LE BLEU.
SAVEK:   WORD        0               < SAUVEGARDE DU REGISTRE 'K'.
KIN:     WORD        -1              < COMPTEUR DES ENTREES...
         IF          MODE-VISU,XWOR%7,,XWOR%7
NMOTS:   WORD        2*LTNI          < LONGUEUR MOTS DES 2 ITEMS.
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
NMOTS:   WORD        LTNI            < POUR NE RAZER QUE L'ITEM2...
XWOR%7:  VAL         0
XR:      WORD        0               < COORDONNEE X D'UN POINT RESIDENT,
YR:      WORD        0               < COORDONNEE Y D'UN POINT RESIDENT,
XS:      WORD        0               < COORDONNEE X D'UN POINT SCRATCH,
YS:      WORD        0               < COORDONNEE Y D'UN POINT SCRATCH.
         IF          NMPROC-NMTY,XWOR%9,,XWOR%9
FXS:     FLOAT       0
FYS:     FLOAT       0
FRS:     FLOAT       0
FK:      FLOAT       1
SENS:    WORD        0               < SENS DE LA TRASFORMATION :
                                     < 0 : R --> S,
                                     < 1 : S --> R.
XTRAN:   WORD        0               < TYPE DE LA TRANSFORMATION CONFORME :
                                     < 0 : Z=K/Z,
                                     < 1 : Z=K*Z*Z.
XWOR%9:  VAL         0
         IF          NMPROC-NMTY,XWOR%9,,XWOR%9
<
< CONSTANTES DE CALCUL DES SINUS ET COSINUS :
<
ASIN:    WORD        SIN             < S/P DE CALCUL DU SINUS,
ACOS:    WORD        COS             < ET DU COSINUS.
ZZZ061:  DZS         2               < NB EN FLOTTANT
ZZZ062:  DZS         2
ZZZ063:  DZS         1               < SIGNE
DEUXPI:  FLOAT       6.2831853       < 2 PI
PI3141:  FLOAT       3.1415926       < PI
PISUR2:  FLOAT       1.5707963       < PI/2
RADIAX:  FLOAT       40.58451        < 255/(2*PI).
RADIAY:  FLOAT       81.16902        < 255/PI.
ZZZ067:  EQU         PISUR2          < CSTES DU POLYNOME
ZZZ068:  WORD        'AD00;'5110
ZZZ069:  WORD        '51FD;'9A2C
ZZZ070:  WORD        'B3F9;'6CCE
ZZZ071:  WORD        '4FF4;'6BDD
RAYON:   EQU         FK              < RAYON DE LA SPHERE.
SINT:    FLOAT       -0.5
COST:    FLOAT       0.86602
IPROJ:   WORD        0               < 0 : MODE DE PROJECTION PAR COST,SINT ;
                                     < 1 : MODE DE PROJECTION PERSPECTIVE.
PZ:      FLOAT       0
F1:      FLOAT       1
XWOR%9:  VAL         0
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
FXS:     FLOAT       0
FYS:     FLOAT       0
FZS:     FLOAT       0
FXR:     FLOAT       0
FYR:     FLOAT       0
FZR:     FLOAT       0
SENS:    WORD        0               < SENS DE LA TRANSFORMATION :
                                     < 0 : R --> S,
                                     < 1 : S --> R.
LB0:     WORD        0               < LONGUEUR DU BRAS COURANT DE LA SPIRALE.
LB:      WORD        0               < NOMBRE DE POINTS ENCORE A TRAITER
                                     < SUR LE BRAS COURANT DE LA SPIRALE.
NP:      WORD        0               < NOMBRE DE POINTS DEJA TRAITES,
NPM:     WORD        0               < NOMBRE DE POINTS A TRAITER.
DELTAX:  WORD        0               < PAS D'INCREMENTATION DE X,
DELTAY:  WORD        0               < PAS D'INCREMENTATION DE Y.
PASQ:    WORD        1               < VALEUR INITIALE DU PAS...
CUMUL:   WORD        0               < CUMUL DES NIVEAUX DES POINTS D'UNE
                                     < SPIRALE.
IFLOU:   WORD        0               < 0 : CALCUL D'UN FLOU EN (XR,YR),
                                     < 1 : ELIMINATION DES POINTS NOIRS.
ISMAX:   WORD        0               < 0 : LORS DE L'ELIMINATION DES POINTS
                                     <     NOIRS, FAIRE UNE MOYENNE SUR LA
                                     <     SPIRALE,
                                     < 1 : LORS DE L'ELIMINATION DES POINTS
                                     <     NOIRS, PRENDRE LE MAX RENCONTRE SUR
                                     <     LA SPIRALE.
XSMAX:   WORD        0               < MAX COURANT SUR LA SPIRALE.
NPMAX:   WORD        0               < 'NP' DU XSMAX COURANT...
LNIV:    WORD        0               < DONNE DANS L'OCTET GAUCHE LES NIVEAUX A
                                     < TESTER LORS DU BOUCHAGE DES TROUS :
                                     < LNIV(I)=1 : LES POINTS DE NIVEAU 'I'
                                     <             SERONT TESTES...
                                     < DANS SON OCTET DROIT, IL DONNE LA
                                     < VALEUR INITIALE DE 'DRDN'...
IPOND:   WORD        0               < 0 : NE PAS PONDERER (ON PREND XSMAX),
                                     < 1 : PONDERER (ON PREND XSMAX*NPMAX/NPM).
<
< DONNEES POUR LE GENERATEUR ALEATOIRE :
<
ITRAM:   WORD        0               < INDICATEUR DE TRAMAGE :
                                     < 0 : FONCTIONNEMENT NORMAL SANS TRAMAGE,
                                     < 1 : TRAMAGE : LES COULEURS SONT REMPLACEE
                                     <     PAR UNE TRAME DE BLANC/NOIR DONT LA
                                     <     DENSITE EST FONCTION DU NIVEAU
                                     <     CALCULE SUR LA SPIRALE.
RDN9:    WORD        0               < SECONDE COURANTE...
DRDN:    WORD        NIVMAX*NIVMAX   < DIVISEUR DU NOMBRE ALEATOIRE :
                                     < IL EST INITIALISE A PARTIR DE L'OCTET
                                     < DROIT DE 'LNIV'...
ATAUX:   WORD        TAUX,X          < ACCES A LA TABLE DONNANT LA PROPORTION
                                     < DE BLANC/NOIR POUR CHAQUE NIVEAU DE
                                     < GRIS :
TAUX:    EQU         $
         BYTE        0;1*1;2*2;3*3;4*4;5*5;6*6;7*7
         IF          $-TAUX*NOCMO-NIVMAX-1,,XWOR%,
         IF          ATTENTION : 'TAUX' EST MAUVAISE !!!
XWOR%:   VAL         0
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RDN1:    WORD        5189            < CONSTANTE DE CALCUL
RDN3::   VAL         19              < DES NOMBRE ALEATOIRES...
POINTS:  WORD        16807
KRDN1:   WORD        0
XKRDN1:: VAL         3               < INCREMENTEUR DE 'KRDN1'.
XKRDN2:: VAL         7               < DECOMPTEUR DE 'KRDN2'.
XWOR%9:  VAL         0
ORGX:    WORD        0               < ORIGINE EN X DE L'IMAGE SCRATCH
                                     < PAR RAPPORT A L'IMAGE RESIDENTE,
ORGY:    WORD        0               < DE MEME, ORIGINE EN Y...
MODX:    WORD        0               < 0 : "TORE" SUR LES X,
                                     < 1 : L'IMAGE SCRATCH NE SE REFERME PAS...
MODY:    WORD        0               < DE MEME SUR L'AXE DES Y.
WORK1:   WORD        0               < VARIABLE DE TRAVAIL...
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
AEMETT:  WORD        0               < ADRESSE DE L'EMETTEUR EN 'CDA' LORS
                                     < DES GENERATIONS/RECUPERATIONS DU
                                     < MASQUE D'IMAGE.
ARECEP:  WORD        0               < DE MEME, ADRESSE DU RECEPTEUR...
XWOR%9:  VAL         0
MCDAM:   WORD        0               < MOT COURANT DE LA 'CDA'.
XWORK:   WORD        0               < INDEX DE GENERATION DES FONDS...
IMASKO:  WORD        0               < 0 : MASK OFF,
                                     < 1 : MASK ON...
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
NIVEAU:  WORD        0               < NIVEAU RECHERCHE LORS DE 'C'...
XWOR%9:  VAL         0
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
EX:      WORD        0               < DIMENSION HORIZONTALE DU MAILLAGE.
EY:      WORD        0               < DIMENSION VERTICALE DU MAILLAGE.
NDX:     WORD        0               < 'DX' TEMPORAIRE,
NDY:     WORD        0               < 'DY' TEMPORAIRE.
NPOINT:  WORD        0               < NOMBRE DE POINTS DANS UNE MAILLE=DX*DY.
CUMUL:   WORD        0               < SOMME DES NIVEAUX INTERNES D'UNE
                                     < MAILLE COURANTE.
XDX:     WORD        0               < NOMBRE DE MAILLE SUR L'HORIZONTALE,
XDY:     WORD        0               < NOMBRE DE MAILLES SUR LA VERTICALE.
XNDX:    WORD        0               < 'XDX' TEMPORAIRE,
XNDY:    WORD        0               < 'XDY' TEMPORAIRE.
XWOR%9:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
<
< DONNEES DE SIMULATION DES ENTREES :
<
IEG:     WORD        0               < INDEX COURANT DE L'ITEM1.
NCP:     WORD        NBCAR*NBLIG-LNOM  < LONGUEUR MAX D'UN ITEM,
                                       < ON RETRANCHE LNOM, CAR LE NOM
                                       < D'UNE IMAGE DOIT ETRE IMPERATIVEMENT
                                       < DEVANT L'IMAGE...
SITEM1:  DZS         LNOM/NOCMO      < POUR SAUVEGARDER LA FIN DE L'ITEM1.
ITEM1:   EQU         ZERO+PILE-LTNI
AI1:     WORD        ITEM1+LTN,X     < RELAI D'ACCES A L'ITEM1.
ABUFC:   WORD        0               < RELAI D'ACCES AU BUFFER COURANT.
XWOR%7:  VAL         0
<
< DONNEES POUR LA TRANSFORMATION :
<
FWORK:   FLOAT       0               < VARIABLE DE TRAVAIL.
         IF          MODE-VISU,XWOR%7,,XWOR%7
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
MAT:     BYTE        6;'6D
         ASCI        " M"
MATN:    WORD        0               < NUMERO DE L'ELEMENT COURANT...
         ASCI        "= "
XWOR%9:  VAL         0
XWOR%7:  VAL         0
F05:     FLOAT       0.5             < POUR LES ARRONDIS...
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
M11:     FLOAT       1               < MATRICE
M12:     FLOAT       0               <         DE
M21:     FLOAT       0               <            TRANSFORMATION
M22:     FLOAT       1               <                           UNITE...
XWOR%9:  VAL         0
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
M11:     FLOAT       1
M12:     FLOAT       0
M13:     FLOAT       0
M21:     FLOAT       0
M22:     FLOAT       1
M23:     FLOAT       0
M31:     FLOAT       0
M32:     FLOAT       0
M33:     FLOAT       1
AM:      WORD        M11,X           < ACCES A LA MATRICE TRI-DIMENSIONNELLE.
XWOR%9:  VAL         0
TRX:     WORD        0               < TRANSLATION EN X,
TRY:     WORD        0               < TRANSLATION EN Y.
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
TRZ:     WORD        0               < TRANSLATION EN Z.
COST:    FLOAT       0.86602         < POUR LA PROJECTION
SINT:    FLOAT       -0.5            <                    3D --> 2D
IPROJ:   WORD        0               < 0 : MODE DE PROJECTION PAR COST,SINT ;
                                     < 1 : MODE DE PROJECTION PERSPECTIVE.
PZ:      FLOAT       0
F1:      FLOAT       1
XWOR%9:  VAL         0
<
< RELAIS DE TABLES, D'IMAGES...
<
ACOM:    WORD        KOM,X           < TABLE DES COMMANDES RECONNUES.
AMERR:   EQU         MERR            < MESSAGE D'ERREUR.
         IF          MODE-VISU,XWOR%7,,XWOR%7
AMINT:   EQU         MINT            < MESSAGE D'INVITATION.
AMNOM:   EQU         MNOM            < "NOM="
AMORGX:  EQU         MORGX           < "ORGX="
AMORGY:  EQU         MORGY           < "ORGY="
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
AMMC:    EQU         MMC             < "STACK?"
AMMS:    EQU         MMS             < "SENS?"
XWOR%9:  VAL         0
AMFOND:  EQU         MFOND           < "FOND="
AMTORE:  EQU         MTORE           < "TORE?"
         IF          NMPROC-NMTW,XWOR%,,XWOR%
AMIMA:   EQU         MIMA            < "INIT MASK?"
AMMAH:   EQU         MMAH            < "MASK H="
AMMAV:   EQU         MMAV            < "MASK V="
XWOR%:   VAL         0
AMASKO:  EQU         MASKO           < "MASK ON?"
AMODM:   EQU         MODM            < "MODE="
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
AMAT11:  EQU         MAT11           < "M11="
AMAT12:  EQU         MAT12           < "M12="
AMAT21:  EQU         MAT21           < "M21="
AMAT22:  EQU         MAT22           < "M22="
XWOR%9:  VAL         0
AMSLAS:  EQU         MSLAS           < "/"
AMTRX:   EQU         MTRX            < "TX="
AMTRY:   EQU         MTRY            < "TY="
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
AMTRZ:   EQU         MTRZ            < "TZ="
AMPOIN:  EQU         MPOINT          < "#POINTS="
AMPASQ:  EQU         MPASQ           < "PAS="
AMFLOU:  EQU         MFLOU           < "FLOU?"
AMMAX:   EQU         MMAX            < "MAX?"
AMPOND:  EQU         MPOND           < "PONDER?"
AMNIVO:  EQU         MNIVO           < "NIVEAUX="
AMTRAM:  EQU         MTRAM           < "TRAME?"
AMSENS:  EQU         MSENS           < "S R"
AMPROJ:  EQU         MPROJ           < "P="
XWOR%9:  VAL         0
         IF          NMPROC-NMTY,XWOR%9,,XWOR%9
AMK:     EQU         MK              < "K="
AMSENS:  EQU         MSENS           < "S R"
AMTRAN:  EQU         MTRAN           < "1/Z Z2 ?"
AMPROJ:  EQU         MPROJ           < "P="
XWOR%9:  VAL         0
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
AMNIVO:  EQU         MNIVO           < "NIVEAU="
XWOR%9:  VAL         0
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
AMDX:    EQU         MDX             < "DX="
AMDY:    EQU         MDY             < "DY="
XWOR%9:  VAL         0
XWOR%7:  VAL         0
AREP:    WORD        REP             < ACCES AU BUFFER DE REPONSE...
AREPX:   WORD        REP,X           < DE MEME EN INDEXE...
ABUFIN:  WORD        BUFIN,X         < ACCES AU BUFFER DE GENERATION DU FOND.
         IF          NMPROC-NMTW,XWOR%,,XWOR%
ABUFMH:  WORD        BUFMH,X         < ACCES AU MASQUE HORIZONTAL,
ABUFMV:  WORD        BUFMV,X         < ACCES AU MASQUE VERTICAL.
XWOR%:   VAL         0
AMCDAP:  EQU         MCDAP           < !CDAP.
AMCDA:   EQU         MCDA            < !CDA.
AMMCDA:  EQU         MMCDA           < !CDA.
API:     WORD        PI              < RELAI POUR RANGER "P" OU "I"...
AIMAGR:  WORD        IMAGR,X         < RELAI TRAME ROUGE,
AIMAGV:  WORD        IMAGV,X         < RELAI TRAME VERTE,
AIMAGB:  WORD        IMAGB,X         < RELAI TRAME BLEUE.
AITEM2:  WORD        ITEM2-1,X       < POUR RAZER LES ITEMS 1 ET 2.
AEOT:    WORD        NOM+LNOMP       < POUR FORCER UN EOT...
<
< RELAIS DE SOUS-PROGRAMMES :
<
AOVL:    WORD        OVL             < CHARGEMENT DES OVERLAYS...
APRINT:  WORD        PRINT           < EDITION D'UN MESSAGE.
AENTER:  WORD        ENTER           < ENTREE DE QUELQUE CHOSE SUR LA VISU...
AHEX:    WORD        HEX             < CONVERSION DE 4 CHIFFRES HEXAS EN BINAIRE
AIN:     WORD        IN              < ENTREE 1 CARACTERE,
AIHEX:   WORD        IHEX            < ENTREE DE 4 CHIFFRES HEXA-DECIMAUX.
ACCI:    WORD        CCI             < ACCES AU CCI.
AGOSGN:  WORD        GOSGN           < POUR ACCEDER AU SGN...
ASPAPR:  WORD        SPAPR           < ACCES A UN POINT RESIDENT (X,Y).
ASPAPS:  WORD        SPAPS           < ACCES A UN POINT SCRATCH (X,Y).
ASPSPR:  WORD        SPSPR           < RANGEMENT D'UN POINT RESIDENT (X,Y).
ASPSPS:  WORD        SPSPS           < RANGEMENT D'UN POINT SCRATCH (X,Y).
ASPGPR:  EQU         ASPAPR
ASPGPS:  EQU         ASPAPS
ASPRPR:  EQU         ASPSPR
ASPRPS:  EQU         ASPSPS
         IF          NMPROC-NMTX,,XWOR%9,
ASPOR:   WORD        SPOR            < RESIDENT <-- (RESIDENT).OR.(SCRATCH),
ASPAND:  WORD        SPAND           < RESIDENT <-- (RESIDENT).AND.(SCRATCH),
ASPEOR:  WORD        SPEOR           < RESIDENT <-- (RESIDENT).EOR.(SCRATCH),
ASPINV:  WORD        SPINV           < RESIDENT <-- .NOT.(RESIDENT).
XWOR%9:  VAL         0
ASPSCD:  WORD        SPSCD           < TRANSFERT BRUTAL EN SCRATCH.
ASPACD:  WORD        SPACD           < TRANSFERT EN RESIDENT AVEC MASQUE,
ASPBCD:  WORD        SPBCD           < TRANSFERT EN RESIDENT SANS MASQUE.
APMOV5:  WORD        PMOV5           < TV R --> RESIDENT,
APMOV6:  WORD        PMOV6           < TV V --> RESIDENT,
APMOV7:  WORD        PMOV7           < TV B --> RESIDENT.
         IF          NMPROC-NMTW,XWOR%,,XWOR%
ASFOND:  WORD        SFOND           < GENERATION D'UN POINT DU FOND.
XWOR%:   VAL         0
         IF          NMPROC-NMTX,XWOR%,,XWOR%
ASPMOY:  WORD        SPMOY           < MOYENNE DES NIVEAUX DES POINTS SPIRALE.
XWOR%:   VAL         0
         IF          NMPROC-NMTX,,XWOR%9,
ASPPER:  WORD        SPPER           < PERMUTATION RESIDENT <--> SCRATCH.
XWOR%9:  VAL         0
ASPTR:   WORD        SPTR            < (XS,YS) <-- TRANS(XR,YR).
         IF          NMPROC-NMTY,XWOR%9,,XWOR%9
ATRAN:   WORD        TRAN,X          < ACCES AUX MODULES DE TRANSFORMATION :
XTR1::   VAL         0               < TRANSFORMATION CONFORME : Z=K/Z,
XTR2::   VAL         1               < TRANSFORMATION CONFORME : Z=K*Z*Z,
XTR3::   VAL         2               < MAPPING SUR UNE SPHERE.
TRAN:    EQU         $
         WORD        TRANS1;TRANS2;TRANS3
XWOR%9:  VAL         0
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
ASPFIL:  WORD        SPFIL           < (XS,YS) <-- (XR,YR) SI NIVEAU, 0 SINON.
XWOR%9:  VAL         0
APTRAN:  WORD        PTRANS          < ENTREE D'UN COEFFICIENT DE LA MATRICE.
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
APIC:    WORD        PIC             < ENTREE DE CX OU CY OU CZ.
XWOR%9:  VAL         0
AROND:   WORD        ROND            < ARRONDI FLOTTANT, ET CONVERSION ENTIERE.
ASP:     WORD        0               < RELAI VARIABLE CONTENANT L'ADRESSE DE
                                     < L'UN DES SOUS-PROGRAMMES PRECEDENTS.
ASPOP:   WORD        SPOP            < OPERATIONS INTER-IMAGES...
ALOOP:   WORD        LOOP            < BOUCLE DE L'INTERROGATION.
AERROR:  WORD        ERROR           < BRANCHEMENT EN ERREUR...
         IF          MODE-ITEM,XWOR%7,,XWOR%7
AALTM:   WORD        ALTM            < TRAITEMENT DES RETOURS BRUTAUX...
XWOR%7:  VAL         0
<
< DEMANDES A CMS5 :
<
DEMIN:   WORD        '0101           < ENTREE D'UN CARACTERE DE REPONSE.
         WORD        REP-ZERO*NOCMO
         WORD        1
DEMFON:  WORD        '0101           < ENTREE DE LA VALEUR DU FOND.
         WORD        BUFIN-ZERO*NOCMO
         WORD        NBITMO
DEMHEX:  WORD        '0101           < ENTREE D'UN NOMBRE HEXA-DECIMAL.
         WORD        REP-ZERO*NOCMO
         WORD        NBRHEX
DEMOUT:  WORD        '0202           < ECRITURE D'UN MESSAGE SUR LA VISU.
         WORD        0               < ADRESSE DU MESSAGE,
         WORD        0               < ET SA LONGUEUR...
DEMMEM:  WORD        4               < DEMANDE DE 16 K MOTS...
RELMEM:  WORD        4               < RETOUR A 4K MOTS...
         WORD        '8000
         WORD        '2000
DEMLOD:  BYTE        '80?SGNLNS;'02  < DEMANDE DE CHARGEMENT DE "GE".
         WORD        BRANCH-ZERO*NOCMO
         WORD        ZERO-BRANCH+PILE-LTNI-LTNI*NOCMO
         WORD        -1
DEMCC:   WORD        2               < ACCES AU CCI INTERPRETATIF.
         WORD        0               < ADRESSE DE LA CARTE.
         WORD        80
TVDKU:   VAL         '8A01           < ACCES A 'DKU' POUR LA 'TV'.
DEMTVR:  WORD        TVDKU           < ACCES AU ROUGE.
         WORD        IMAGR-ZERO*NOCMO
         WORD        LIMAG*NOCMO
         WORD        TVPR
DEMTVV:  WORD        TVDKU           < ACCES AU VERT.
         WORD        IMAGV-ZERO*NOCMO
         WORD        LIMAG*NOCMO
         WORD        TVPV
DEMTVB:  WORD        TVDKU           < ACCES AU BLEU.
         WORD        IMAGB-ZERO*NOCMO
         WORD        LIMAG*NOCMO
         WORD        TVPB
NOMIN:   WORD        '0101           < ENTREE DU NOM D'UNE IMAGE.
         WORD        NOM-ZERO*NOCMO
         WORD        LNOMP*NOCMO
SGN:     WORD        '0002           < POUR LES ACCES AU SGN.
         WORD        NOM-ZERO*NOCMO
         WORD        LIMAG*NCOOL+LNOM*NOCMO
         WORD        -1              < LA VALEUR SUIT LE NOM...
         PAGE
<
<
<        T A B L E   D E S   C O M M A N D E S  :
<
<
REP0:    VAL         "+"             < PREMIERE COMMANDE.
KOM:     EQU         $-REP0          < ELLES COMMENCENT A "+"...
         WORD        STORE           < + : STORE SGN LE RESIDENT
         WORD        ERROR           < ,
         WORD        DELETE          < - : DELETE SGN LE RESIDENT
         WORD        ERROR           <.
         WORD        ERROR           < /
         WORD        MOV0            < 0 : TV <-- RESIDENT R+V+B
         WORD        MOV1            < 1 : TV <-- RESIDENT R
         WORD        MOV2            < 2 : TV <-- RESIDENT V
         WORD        MOV3            < 3 : TV <-- RESIDENT B
         WORD        MOV4            < 4 : RESIDENT <-- TV R+V+B
         WORD        MOV5            < 5 : RESIDENT <-- TV R
         WORD        MOV6            < 6 : RESIDENT <-- TV V
         WORD        MOV7            < 7 : RESIDENT <-- TV B
         WORD        ERROR           < 8
         WORD        ERROR           < 9
         WORD        ERROR           < :
         WORD        ERROR           < ;
         WORD        ERROR           < <
         WORD        DTRANS          < = : DEFINITION DE LA MATRICE M(I,J)
         WORD        ERROR           < >
         WORD        ERROR           < ?
         WORD        ERROR           < @
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
         WORD        ERROR           < A
XWOR%9:  VAL         0
         IF          NMPROC-NMTX,,XWOR%9,
         WORD        IMAND           < A : RESIDENT <-- (RESIDENT).AND.(SCRATCH)
XWOR%9:  VAL         0
         WORD        ERROR           < B
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
         WORD        FILTRE          < C : SCRATCH <-- (RESIDENT DE NIVEAU N)
XWOR%9:  VAL         0
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
         WORD        ERROR           < C
XWOR%9:  VAL         0
         IF          NMPROC-NMTY,XWOR%9,,XWOR%9
         WORD        ERROR           < C
XWOR%9:  VAL         0
         WORD        DISP            < D : RESIDENT <-- IMAGE SGN
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
         WORD        ERROR           < E
XWOR%9:  VAL         0
         IF          NMPROC-NMTX,,XWOR%9,
         WORD        IMEOR           < E : RESIDENT <-- (RESIDENT).EOR.(SCRATCH)
XWOR%9:  VAL         0
         WORD        GOGE            < F : FIN
         WORD        ERROR           < G
         WORD        ERROR           < H
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
         WORD        ERROR           < I
XWOR%9:  VAL         0
         IF          NMPROC-NMTX,,XWOR%9,
         WORD        IMINV           < I : RESIDENT <-- .NOT.(RESIDENT)
XWOR%9:  VAL         0
         WORD        ERROR           < J
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
         WORD        ERROR           < K
XWOR%9:  VAL         0
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
         WORD        ERROR           < K
XWOR%9:  VAL         0
         IF          NMPROC-NMTY,XWOR%9,,XWOR%9
         WORD        INFK            < K : ENTREE CTTE TRANSFORMATION
XWOR%9:  VAL         0
         WORD        IMLOAD          < L : RESIDENT <-- (SCRATCH) SANS MASQUE
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
         WORD        MASK            < M : RECUPERATION/GENERATION DU MASQUE
XWOR%9:  VAL         0
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
         WORD        ERROR           < M
XWOR%9:  VAL         0
         IF          NMPROC-NMTY,XWOR%9,,XWOR%9
         WORD        ERROR           < M
XWOR%9:  VAL         0
         WORD        NAME            < N : NOMME L'IMAGE RESIDENTE
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
         WORD        ERROR           < O
         WORD        ERROR           < P
XWOR%9:  VAL         0
         IF          NMPROC-NMTX,,XWOR%9,
         WORD        IMOR            < O : RESIDENT <-- (RESIDENT).OR.(SCRATCH)
         WORD        IMPERM          < P : (RESIDENT) <--> (SCRATCH)
XWOR%9:  VAL         0
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
         WORD        MOYEN           < Q : FILTRAGE DES HAUTES FREQUENCES
XWOR%9:  VAL         0
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
         WORD        MOYEN           < Q : SCRATCH <-- MOYENNE SPIRALE(RESIDENT)
XWOR%9:  VAL         0
         IF          NMPROC-NMTY,XWOR%9,,XWOR%9
         WORD        ERROR           < Q
XWOR%9:  VAL         0
         WORD        FOND            < R : INITIALISATION DU FOND PAR MOT
         WORD        IMSAV           < S : SCRATCH <-- (RESIDENT)
         WORD        TRANS           < T : SCRATCH <-- M(I,J)(RESIDENT)
         WORD        IMUP            < U : RESIDENT <-- (SCRATCH) AVEC MASQUE
         WORD        ERROR           < V
         WORD        GOCCI           < W : RETOUR TEMPORAIRE AU CCI
         WORD        GORGX           < X : POSITIONNEMENT DE 'ORGX'
         WORD        GORGY           < Y : POSITIONNEMENT DE 'ORGY'
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
         WORD        ERROR           < Z
XWOR%9:  VAL         0
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
         WORD        PROJE           < Z : CHOIX DU MODE DE PROJECTION
XWOR%9:  VAL         0
         IF          NMPROC-NMTY,XWOR%9,,XWOR%9
         WORD        PROJE           < Z : CHOIX DU MODE DE PROJECTION
XWOR%9:  VAL         0
REPZ:    VAL         $-KOM-1         < DERNIERE COMMANDE.
         PAGE
         PROG
<
<
<        E D I T I O N   D ' U N   M E S S A G E  :
<
<
<        ARGUMENT :
<                    A=ADRESSE MOT DU MESSAGE, DONT LE
<                    PREMIER OCTET EST LA LONGUEUR.
<
<
PRINT:   EQU         $
         PSR         A,X,C
         LR          A,C
         ADR         A,A
         ADRI        1,A             < CALCUL DE L'ADRESSE OCTET DU MESSAGE.
         STA         DEMOUT+1
         LBY         0,C             < ACCES A LA LONGUEUR...
         STA         DEMOUT+2
         LAD         DEMOUT
         SVC         0               < ENVOI DU MESSAGE...
         PLR         A,X,C
         RSR
         PAGE
<
<
<        E N T R E E   D E   Q U E L Q U E   C H O S E  :
<
<
<        ARGUMENT :
<                    A=ADRESSE DE LA DEMANDE.
<
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
ENTER:   EQU         $
         PSR         X
         SVC         0               < ENVOI DE LA DEMANDE...
         PLR         X
         RSR
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
ENTER:   EQU         $
         PSR         A,X,Y,W
         LR          A,W             < W=ADRESSE DE LA DEMANDE :
         LRM         A
         WORD        '0101
         CP          0,W             < EST-CE BIEN UNE ENTREE AVEC ECHO
                                     < SUR LA VISU UTILISATEUR ???
         JE          ENTER1          < OUI...
         QUIT        1               < NON, ???!???!
ENTER1:  EQU         $
         LA          1,W             < A=ADRESSE OCTET DU BUFFER,
         LYI         0               < Y=INDEX DU BUFFER,
         SLRS        NOCMO=0         < CONVERSION EN UNE ADRESSE MOT,
         ADCR        Y               < Y=INDEX INITIAL DU BUFFER COURANT.
         SBT         0               < MISE EN PLACE DU BIT INDEX,
         STA         ABUFC           < ET GENERATION DU RELAI VERS LE BUFFER.
         LX          2,W             < X=NOMBRE D'OCTETS MAX A DEPLACER...
ENTER2:  EQU         $
         PSR         X
         LA          IEG             < A=INDEX COURANT DE L'ITEM1,
         CP          NCP             < ET VALIDATION ???
         JL          ENTER3          < OK...
         BR          AALTM           < NON, ON FAIT COMME SI UN ALT-MODE
                                     < ETAIT ARRIVE...
ENTER3:  EQU         $
         IC          IEG             < PROGRESSION DE L'INDEX DE L'ITEM1.
         LR          A,X             < X=INDEX D'ACCES A L'ITEM1,
         LBY         &AI1            < A=CARACTERE COURANT DE L'ITEM1,
         CPI         " "             < EST-CE L'ELEMENT NEUTRE ???
         JNE         ENTER6          < NON...
         PLR         X               < OUI,
         LR          X,A
         CP          2,W             < EST-ON EN TETE DU MESSAGE ???
         JE          ENTER2          < OUI, ON IGNORE LE 'SPACE'...
         PSR         X               < NON, ON LE CONSERVE...
         LAI         " "             < RESTAURATION DE 'A'...
ENTER6:  EQU         $
         CPI         ";"             < EST-CE LA FIN DE MESSAGE ???
         JNE         ENTER4          < NON,
         LAI         '04             < OUI, ON LE REMPLACE PAR 'EOT'...
ENTER4:  EQU         $
         LR          Y,X
         STBY        &ABUFC          < ET RANGEMENT DANS LE BUFFER...
         ADRI        1,Y             < PROGRESSION DE L'INDEX BUFFER.
         PLR         X
         CPI         '04             < EST-CE UNE FIN DE MESSAGE ???
         JE          ENTER5          < OUI, ON ARRETE LA...
         JDX         ENTER2          < NON, ON CONTINUE...
ENTER5:  EQU         $
         PLR         A,X,Y,W
         RSR
XWOR%7:  VAL         0
         PAGE
<
<
<        E N T R E E   1   C A R A C T E R E  :
<
<
IN:      EQU         $
         LAD         DEMIN
         BSR         AENTER
         LBY         &AREP           < A=CARACTERE ATTENDU.
         RSR
<
<
<        E N T R E E   4   C H I F F R E S  :
<
<
IHEX:    EQU         $
         LAD         DEMHEX
         BSR         AENTER
         BSR         AHEX            < A=VALEUR ATTENDUE, SI OK...
         RSR
         PAGE
<
<
<        C O N V E R S I O N   H E X A   -->   B I N A I R E  :
<
<
<        ARGUMENT :
<                    LE BUFFER 'REP'.
<
<
<        RESULTAT :
<                    B=0 : (A)=VALEUR BINAIRE,
<                    B#0 : ERREUR DE SYNTAXE HEXA-DECIMALE.
<                    LES INDICATEURS POSITIONNES SUR (B).
<
<
HEX:     EQU         $
BASE10:  VAL         10
BASE16:  VAL         16
         PSR         X,Y
         LYI         NBRHEX
         LXI         0               < INDEX DU BUFFER DE REPONSE.
         LBI         0               < CLEAR LE REGISTRE B.
HEX1:    EQU         $
         LBY         &AREPX          < A=CARACTERE COURANT DU BUFFER.
         ADRI        -"0",A
         JAL         HEX4            < ERREUR : CARACTERE NON RECONNU.
         CPI         BASE10          < EST-CE UN CHIFFRE ???
         JL          HEX2            < OUI , C'EST UN CHIFFRE.
         ADRI        -"A"+"9"+1,A    < NON.
         CPI         BASE10          < VALIDATION.
         JL          HEX4            < ERREUR : CARACTERE NON RECONNU.
         CPI         BASE16          < VALIDATION.
         JGE         HEX4            < ERREUR : CARACTERE NON RECONNU.
HEX2:    EQU         $
         SCRS        NBITMO/NBRHEX   < MISE DES 4 BITS EN TETE DE A.
         SCLD        NBITMO/NBRHEX   < ET CONCATENATION A B.
         ADRI        1,X             < PROGRESSION DE L'INDEX.
         CPR         X,Y             < EST-CE FINI ???
         JNE         HEX1            < NON , ON CONTINUE.
         LR          B,A             < A=VALEUR BINAIRE DE (REP).
         LBI         0               < B=0 : RETOUR OK.
HEX3:    EQU         $
         PLR         X,Y
         CPZR        B               < POSITIONNEMENT DES INDICATEURS.
         RSR
<
< RETOURS EN ERREUR :
<
HEX4:    EQU         $
         LR          B,A             < A=VALEUR COURANTE...
         LBI         1               < B#0.
         JMP         HEX3            < VERS LA SORTIE ...
         PAGE
<
<
<        E N V O I   D ' U N E   C A R T E   A U   C C I  :
<
<
<        ARGUMENT :
<                    A=ADRESSE MOT DE LA CARTE.
<
<
CCI:     EQU         $
         ADR         A,A             < CONVERSION EN UNE ADRESSE OCTET.
         STA         DEMCC+1
         LAD         DEMCC
         SVC         0               < ET ENVOI DE LA CARTE...
         RSR
         PAGE
<
<
<        A C C E S   A U   C C I  :
<
<
GOCCI:   EQU         $
         QUIT        1               < ACCES AU CCI INTERACTIF...
         BR          ALOOP
         PAGE
<
<
<        M O D U L E S   D ' A C C E S   A U   S G N  :
<
<
<        FONCTION :
<                      PERMETTENT L'ACCES AU SGN
<                    POUR LES IMAGES SUIVANT :
<                    N : NOMME L'IMAGE RESIDENTE,
<                        JUSQU'A UNE COMMANDE 'N'
<                        SUIVANTE,
<                    D : AFFICHE L'IMAGE PRECEDEMMENT
<                        NOMMEE PAR 'N'.
<                    + : CREE L'IMAGE PRECEDEMMENT
<                        NOMMEE PAR 'N',
<                    - : DETRUIT L'IMAGE PRECEDEMMENT
<                        NOMMEE PAR 'N'.
<
<
NAME:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMNOM-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         LAD         NOMIN
         BSR         AENTER          < ENTREE DU NOM COURANT,
         LAI         EOT
         STBY        &AEOT           < ET ON FORCE A PRIORI UN 'EOT'...
         BR          ALOOP           < ET C'EST TOUT...
<
< SOUS-PROGRAMME GENERAL D'ACCES AU SGN :
< (LORS DES 'LNS' ET 'LON', IL REGARDE
< SI LA LONGUEUR DE L'IMAGE VAUT EXACTE-
< MENT LIMAG*NCOOL*NOCMO ; SI NON, ELLE
< REITERE L'OPERATION AVEC UN DELTA
< NOM-VALEUR DE -1 CORRESPONDANT A UNE
< ANCIENNE VERSION DU PROGRAMME)
<
GOSGN:   EQU         $               < RESPONSABLE DE TOUS LES ACCES SGN...
         STBY        SGN             < MISE EN PLACE DU 'NVP' ARGUMENT,
         LAI         LNOM*NOCMO
         STA         SGN+3           < A PRIORI...
         LAD         SGN
         SVC         0               < ET ENVOI DE LA DEMANDE...
         LBY         SGN
         CPI         SGNDLN
         JE          GOSGN1          < CAS D'UN DELETE...
         CPI         SGNSTN
         JE          GOSGN1          < CAS D'UN STORE...
         ACTD        3               < CAS D'UN LOAD : B=LONGUEUR DE L'IMAGE,
         LRM         A
         WORD        LIMAG*NCOOL*NOCMO
         CPR         A,B             < S'AGIT-IL D'UNE ANCIENNE OU D'UNE
                                     < NOUVELLE IMAGE ???
         JE          GOSGN1          < NOUVELLE : DELTA=LNOM*NOCMO...
         LAI         -1              < ANCIENNE :
         STA         SGN+3           < IL FAUT LA RECUPERER AVEC DELTA=-1...
         LAD         SGN
         SVC         0               < ON REITERE LE LOAD...
GOSGN1:  EQU         $
         CPZR        X               < TEST DES CONDITIONS DE RETOUR...
         RSR
<
< MODULES SPECIFIQUES :
<
DISP:    EQU         $               < COMMANDE 'D' :
         LAI         SGNLON          < ON COMMENCE PAR L'ACN DU DEMANDEUR,
         BSR         AGOSGN
         JE          DISP1           < OK, IL EXISTE...
         LAI         SGNLNS          < NON, ON TENTE SOUS :SYS...
         BSR         AGOSGN
         JE          DISP1           < OK...
DISP2:   EQU         $
         BR          AERROR          < TRAITEMENT DES ERREURS...
DISP1:   EQU         $
         BR          ALOOP           < VERS LA BOUCLE SI OK...
DELETE:  EQU         $               < COMMANDE '-' :
         LAI         SGNDLN
DELET1:  EQU         $
         BSR         AGOSGN
         JE          DISP1           < OK...
         JMP         DISP2           < ERREUR...
STORE:   EQU         $               < COMMANDE '+' :
         LAI         SGNSTN
         JMP         DELET1
         PAGE
<
<
<        A C C E S   A   U N   P O I N T   R E S I D E N T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RECONSTITUE
<                    LE NIVEAU ASSOCIE A 3 BITS
<                    PARALLELES.
<
<
<        ARGUMENT :
<                    XR,YR = COORDONNEES DU POINT,
<
<
<        RESULTAT :
<                    A = NIVEAU DE GRIS DU POINT, SOIT R+V*2+B*4.
<
<
SPAPR:   EQU         $
         PSR         B,X,Y
         LX          XR              < X=ABSCISSE,
         LY          YR              < Y=ORDONNEE.
         LR          X,A             < A=COORDONNEE X,
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1   < B=NUMERO DE MOT DANS LA LIGNE,
         SLRS        NBITMO-XWOR%1   < A=NUMERO DE BIT DANS LE MOT,
         LXI         NBITMO-BIT
         SBR         A,X             < X=DECALAGE D'ACCES AU BIT COURANT.
         XR          Y,B             < Y=NUMERO DU MOT DANS LA LIGNE,
         SLLD        NMOTL=0
         IF          NBITMO-NMOTL,,XWOR%,
         IF          ATTENTION : LA CONCATENATION QUI SUIT EST COMPLETEMENT
         IF          STUPIDE !!!
XWOR%:   VAL         0
         ORR         B,Y             < Y=NUMERO DU MOT DANS LA TRAME.
         XR          Y,X
         LA          &AIMAGB         < ACCES A LA TRAME BLEU,
         PSR         A
         LA          &AIMAGV         < ACCES A LA TRAME BLEUE,
         PSR         A
         LA          &AIMAGR         < ACCES A LA TRAME ROUGE.
         XR          X,Y
         SLRS        0,X
         SLRD        BIT             < RECUPERATION D'UN BIT ROUGE,
         PLR         A
         SLRS        0,X
         SLRD        BIT             < RECUPERATION D'UN BIT VERT,
         PLR         A
         SLRS        0,X
         ANDI        BIT             < RECUPERATION D'UN BIT BLEU.
         SLLD        NCOOL-BIT       < A=NIVEAU DE GRIS DU POINT (X,Y).
         PLR         B,X,Y
         RSR
         PAGE
<
<
<        A C C E S   A   U N   P O I N T   S C R A T C H  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RECONSTITUE
<                    LE NIVEAU ASSOCIE A 3 BITS
<                    PARALLELES.
<
<
<        ARGUMENTS :
<                    XS,YS = COORDONNEES DU POINT SCRATCH,
<
<
<        RESULTAT :
<                    A=NIVEAU DE GRIS DU POINT SCRATCH.
<
<
SPAPS:   EQU         $
         PSR         B,X,Y
         LX          XS              < X=ABSCISSE,
         LY          YS              < Y=ORDONNEE.
         LR          X,A
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1   < B=NUMERO DU MOT DANS LA LIGNE,
         SLRS        NBITMO-XWOR%1
         LXI         NBITMO-BIT
         SBR         A,X             < X=DECALAGE D'ACCES AUX BITS,
         PSR         X
         XR          Y,B
         SLLD        NMOTL=0+NBITMO
         ORR         Y,A             < A=NUMERO DU MOT DANS LA TRAME.
         LRM         B,X,Y
         WORD        MCDAR
         WORD        1
         WORD        LIMAG           < Y=LONGUEUR EN MOTS D'UNE TRAME.
         RCDA
                                     < ACCES A UN MOT ROUGE,
         LRM         B,X
         WORD        MCDAV
         WORD        1
         ADR         Y,A
         RCDA
                                     < ACCES A UN MOT VERT,
         LRM         B,X
         WORD        MCDAB
         WORD        1
         ADR         Y,A
         RCDA
                                     < ACCES A UN MOT BLEU.
         PLR         X               < RESTAURATION DU DECALAGE,
         LA          MCDAR
         SLRS        0,X
         SLRD        BIT             < RECUPERATION D'UN BIT ROUGE,
         LA          MCDAV
         SLRS        0,X
         SLRD        BIT             < RECUPERATION D'UN BIT VERT,
         LA          MCDAB
         SLRS        0,X
         ANDI        BIT             < RECUPERATION D'UN BIT BLEU,
         SLLD        NCOOL-BIT       < A=NIVEAU DE GRIS DU POINT.
         PLR         B,X,Y
         RSR
         PAGE
<
<
<        R A N G E M E N T   D ' U N   P O I N T   R E S I D E N T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RANGE LE
<                    NIVEAU D'UN POINT SUR 3 BITS
<                    PARALLELES.
<
<
<        ARGUMENTS :
<                    XR,YR = COORDONNEES DU POINT,
<                    A = SON NIVEAU DE GRIS.
<
<
SPSPR:   EQU         $
         PSR         A,B,X,Y
         LX          XR              < X=ABSCISSE,
         LY          YR              < Y=ORDONNEE.
         PSR         A
         LR          X,A
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1
         SLRS        NBITMO-XWOR%1
         LR          A,X             < X=NUMERO DE BITS.
         XR          Y,B
         SLLD        NMOTL=0
         ORR         B,Y             < Y=NUMERO DU MOT DANS LA TRAME.
         PLR         A               < A=NIVEAU DE GRIS DU POINT.
         SLRD        NCOOL           < ET MISE DANS B...
         XR          X,Y
         LA          &AIMAGR         < ACCES A UN MOT ROUGE,
         STA         SAVER
         LA          &AIMAGV         < ACCES A UN MOT VERT,
         STA         SAVEV
         LA          &AIMAGB         < ACCES A UN MOT BLEU.
         XR          X,Y
         SCLS        0,X
         SLLD        BIT             < RECUPERATION DU BIT BLEU,
         SCRS        BIT,X
         STA         SAVEB
         LA          SAVEV
         SCLS        0,X
         SLLD        BIT             < RECUPERATION DU BIT VERT,
         SCRS        BIT,X
         STA         SAVEV
         LA          SAVER
         SCLS        0,X
         SLLD        BIT             < RECUPERATION DU BIT ROUGE,
         SCRS        BIT,X
         XR          X,Y
         STA         &AIMAGR         < RANGEMENT DU MOT ROUGE,
         LA          SAVEV
         STA         &AIMAGV         < RANGEMENT DU MOT VERT,
         LA          SAVEB
         STA         &AIMAGB         < RANGEMENT DU MOT BLEU.
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        R A N G E M E N T   D ' U N   P O I N T   S C R A T C H  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RANGE LE
<                    NIVEAU D'UN POINT SUR 3 BITS
<                    PARALLELES EN SCRATCH.
<
<
<        AGUMENTS :
<                    XS,YS = COORDONNEES DU POINT,
<                    A = SON NIVEAU DE GRIS.
<
<
SPSPS:   EQU         $
         PSR         A,B,X,Y
         PSR         A               < SAUVEGARDE DU NIVEAU,
         LX          XS              < DU POINT
         LY          YS              < SCRATCH (XS,YS).
         LR          X,A
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1
         SLRS        NBITMO-XWOR%1
         LXI         NBITMO-BIT
         SBR         A,X             < X=AMPLITUDE DU DECALAGE...
         PSR         X
         XR          Y,B
         SLLD        NMOTL=0+NBITMO
         ORR         Y,A             < A=ADRESSE DU MOT ROUGE CONTENANT
                                     < (XS,YS) DANS LA 'CDA'...
         LRM         B,X,Y
         WORD        MCDAR
         WORD        1
         WORD        LIMAG           < Y=POUR PASSER D'UNE COULEUR A L'AUTRE.
         RCDA
                                     < ACCES AU MOT ROUGE,
         LRM         B,X
         WORD        MCDAV
         WORD        1
         ADR         Y,A
         RCDA
                                     < ACCES AU MOT VERT,
         LRM         B,X
         WORD        MCDAB
         WORD        1
         ADR         Y,A
         RCDA
                                     < ACCES AU MOT BLEU.
         PLR         X               < X=AMPLITUDE DU DECALAGE,
         STA         WORK1           < SAUVEGARDE DE LA DERNIERE ADRESSE...
         PLR         A               < A=NIVEAU DE GRIS DE (XS,YS).
         SLRD        NCOOL           < ET CADRAGE DANS 'B'...
         LA          MCDAB           < MSE A JOUR DU BLEU,
         SCRS        0,X
         SLRS        BIT
         SLLD        BIT
         SCLS        0,X
         STA         MCDAB
         LA          MCDAV           < MISE A JOUR DU VERT,
         SCRS        0,X
         SLRS        BIT
         SLLD        BIT
         SCLS        0,X
         STA         MCDAV
         LA          MCDAR           < MISE A JOUR DU ROUGE.
         SCRS        0,X
         SLRS        BIT
         SLLD        BIT
         SCLS        0,X
         STA         MCDAR
         LA          WORK1           < A=ADRESSE EN 'CDA' DU BLEU...
         LRM         B,X
         WORD        MCDAB
         WORD        1
         WCDA
                                     < MISE A JOUR DU BLEU,
         LRM         B,X
         WORD        MCDAV
         WORD        1
         SBR         Y,A
         WCDA
                                     < MISE A JOUR DU VERT,
         LRM         B,X
         WORD        MCDAR
         WORD        1
         SBR         Y,A
         WCDA
                                     < MISE A JOUR DU ROUGE.
         PLR         A,B,X,Y
         RSR
         PAGE
         IF          NMPROC-NMTX,,XWOR%9,
<
<
<        ' O R '   E N T R E   2   P O I N T S  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME EFFECTUE L'OPE-
<                    RATION SUIVANTE :
<                    POINT RESIDENT <-- (POINT RESIDENT).OR.(POINT SCRATCH),
<                    SACHANT QUE SUIVANT LA LOGIQUE FLOUE :
<                    X.OR.Y=MAX(X,Y).
<
<
<        ARGUMENTS :
<                    (XR,YR),(XS,YS) = COORDONEES DES 2 POINTS.
<
<
SPOR:    EQU         $
         PSR         A,B
         BSR         ASPGPR
         LR          A,B             < B=NIVEAU DU POINT RESIDENT,
         BSR         ASPGPS          < A=NIVEAU DU POINT SCRATCH.
         CPR         A,B             < RECHERCHE DU MAX...
         JGE         SPOR1           < B>=A : LE RESIDENT EST LE MAX,
         BSR         ASPRPR          < B<A : LE SCRATCH EST LE MAX, IL REMPLACE
                                     < LE POINT RESIDENT.
SPOR1:   EQU         $
         PLR         A,B
         RSR
         PAGE
<
<
<        ' A N D '   E N T R E   2   P O I N T S  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME EFFECTUE L'OPERATION
<                    SUIVANTE :
<                    POINT RESIDENT <-- (POINT RESIDENT).AND.(POINT SCRATCH),
<                    SACHANT QUE SUIVANT LA LOGIQUE FLOUE :
<                    X.AND.Y=MIN(X,Y).
<
<
<        ARGUMENTS :
<                    (XR,YR),(XS,YS) = COORDONNEES DES 2 POINTS.
<
<
SPAND:   EQU         $
         PSR         A,B
         BSR         ASPGPR
         LR          A,B             < B=NIVEAU DU POINT RESIDENT,
         BSR         ASPGPS          < A=NIVEAU DU POINT SCRATCH.
         CPR         A,B             < RECHERCHE DU MINIMUM :
         JLE         SPAND1          < B<=A : LE RESIDENT EST DEJA LE MINIMUM,
         BSR         ASPRPR          < B>A : LE SCRATCH EST LE MINIMUM, IL
                                     < REMPLACE LE POINT RESIDENT...
SPAND1:  EQU         $
         PLR         A,B
         RSR
         PAGE
<
<
<        P E R M U T A T I O N   D E   2   P O I N T S  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME EFFECTUE
<                    L'OPERATIO SUIVANTE :
<                    (POINT RESIDENT) <--> (POINT SCRATCH).
<
<
<        AGUMENTS :
<                    (XR,YR) ET (XS,YS).
<
<
SPPER:   EQU         $
         PSR         A,B
         BSR         ASPGPR
         LR          A,B             < B=NIVEAU RESIDENT,
         BSR         ASPGPS          < A=NIVEA SCRATCH,
         XR          A,B             < ET ON PERMUTE...
         BSR         ASPRPS          < ET ON MET A JOUR LE SCRATCH,
         LR          B,A
         BSR         ASPRPR          < ET LE RESIDENT...
         PLR         A,B
         RSR
         PAGE
<
<
<        I N V E R S I O N   D ' U N   P O I N T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME CALCULE L'INVERSE
<                    D'UN POINT SUIVANT LA FORMULE :
<                    .NOT.X=MAX-X, OU MAX REPRESENTE LE
<                    NIVEAU MAXIMUM RECONNU.
<
<
<        ARGUMENTS :
<                    XR,YR = COORDONNEES DU POINT.
<
<
SPINV:   EQU         $
         PSR         A
         BSR         ASPGPR          < A=NIVEAU DU POINT,
         ADRI        -NIVMAX,A
         NGR         A,A
         BSR         ASPRPR          < QUE L'ON INVERSE...
         PLR         A
         RSR
XWOR%9:  VAL         0
         PAGE
<
<
<        S O U S - P R O G R A M M E   D E   T R A N S F O R M A T I O N  :
<
<
<        FONCTION :
<                    1 - POUR 'TW' :
<                      ETANT DONNEES LES COORDONNEES DU
<                    POINT RESIDENT, LE SOUS-PROGRAME
<                    CALCULE LE POINT (XS,YS) TEL QUE :
<                    (XS,YS)=TRANS(XR,YR), OU 'TRANS' EST
<                    DEFINI PAR LA MATRICE M(I,J) ; LE
<                    CENTRE DE LA TRANSFORMATION EST
<                    DEFINI PAR (TRX,TRY).
<                    2 - POUR 'TX' :
<                      FAIT DE MEME, MAIS EN 3 DIMENSIONS
<                    PROJETE SUR LES 2 DIMENSIONS DE
<                    L'ECRAN :
<                    (XS,YS)=PROJ(M(I,J)(XR,YR,0)) SI SENS=0,
<                    (XR,YR)=PROJ(M(I,J)(XR,YR,0)) SI SENS=1.
<                    3 - POUR 'TY' :
<                      IL PROCEDE A UNE TRANSFORMATION
<                    CONFORME DU PLAN DE L'IMAGE CHOISIE
<                    PARMI LES 3 SUIVANTES :
<                                    Z=K/Z,
<                                    Z=K*Z*Z,
<                                    MAPPING SUR UNE SPHERE,
<                    DANS LE SENS SCRATCH --> RESIDENT SI
<                    SENS=1, ET DANS LE SENS INVERSE SI SENS=0.
<
<
SPTR:    EQU         $
         PSR         A,B,X,Y
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
         LA          XR
         SB          TRX             < CENTRAGE...
         FLT
         FMP         M11
         FST         FWORK
         LA          YR
         SB          TRY             < CENTRAGE...
         FLT
         FMP         M12
         FAD         FWORK
         BSR         AROND
         AD          TRX
         JAL         SPTR1           < HORS-ECRAN...
         CPI         NPOLM1
         JG          SPTR1           < HORS-ECRAN...
         STA         XS              < XS=M11*(XR-TRX)+M12*(YR-TRY)+TRX.
         LA          XR
         SB          TRX             < CENTRAGE...
         FLT
         FMP         M21
         FST         FWORK
         LA          YR
         SB          TRY             < CENTRAGE...
         FLT
         FMP         M22
         FAD         FWORK
         BSR         AROND
         AD          TRY
         JAL         SPTR1           < HORS-ECRAN...
         CPI         NLIGM1
         JG          SPTR1           < HORS-ECRAN...
         STA         YS              < YS=M21*(XR-TRX)+M22*(YR-TRY)+TRY.
         BSR         ASPGPR          < A=NIVEAU(XR,YR),
         BSR         ASPRPS          < NIVEAU(XS,YS) <-- (A)...
XWOR%9:  VAL         0
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
         LA          XR
         SB          TRX
         FLT
         FST         FXR             < X 3D CENTRE...
         FMP         M11
         FST         FXS
         LA          YR
         SB          TRY
         FLT
         FST         FYR             < Y 3D CENTRE...
         FMP         M12
         FAD         FXS
         FST         FXS
         LAI         0               < LA COORDONNEE 'Z' EST NULLE,
         SB          TRZ
         FLT
         FST         FZR             < Z 3D CENTRE...
         FMP         M13
         FAD         FXS
         FST         FXS
         LA          TRX
         FLT
         FAD         FXS
         FST         FXS             < FXS=M11*(XR-TRX)+M12*(YR-TRY)
                                     <     +M13*(ZR-TRZ)+TRX.
         FLD         FXR
         FMP         M21
         FST         FYS
         FLD         FYR
         FMP         M22
         FAD         FYS
         FST         FYS
         FLD         FZR
         FMP         M23
         FAD         FYS
         FST         FYS
         LA          TRY
         FLT
         FAD         FYS
         FST         FYS             < FYS=M21*(XR-TRX)+M22*(YR-TRY)
                                     <     +M23*(ZR-TRZ)+TRY.
         FLD         FXR
         FMP         M31
         FST         FZS
         FLD         FYR
         FMP         M32
         FAD         FZS
         FST         FZS
         FLD         FZR
         FMP         M33
         FAD         FZS
         FST         FZS
         LA          TRZ
         FLT
         FAD         FZS
         FST         FZS             < FZS=M31*(XR-TRX)+M32*(YR-TRY)
                                     <     +M33*(ZR-TRZ)+TRZ.
         CPZ         IPROJ           < MODE DE PROJECTION ???
         JE          SPTRX1          < PAR COST,SINT...
<
< PROJECTION PERSPECTIVE :
<
         FDV         PZ
         FSB         F1
         FNEG
         FST         FWORK           < 1-(FZS/PZ)
         FLD         FXS
         FDV         FWORK           < FXS/(1-(FZS/PZ))
         JMP         SPTRX2
<
< PROJECTION PAR COST,SINT :
<
SPTRX1:  EQU         $
         FMP         COST
         FAD         FXS             < PROJ(X)=FXS+FZS*COST.
SPTRX2:  EQU         $
         BSR         AROND           < CONVERSION ENTIERE...
         JAL         SPTR1           < HORS-ECRAN...
         CPI         NPOLM1
         JG          SPTR1           < HORS-ECRAN...
         STA         XS              < XS=PROJ(X).
         CPZ         IPROJ           < MODE DE PROJECTION ???
         JE          SPTRX3          < PAR COST,SINT...
<
< PROJECTION PERSPECTIVE :
<
         FLD         FYS
         FDV         FWORK           < FYS/(1-(FZS/PZ))
         JMP         SPTRX4
<
< PAR SINT,COST :
<
SPTRX3:  EQU         $
         FLD         FZS
         FMP         SINT
         FAD         FYS             < PROJ(Y)=FYS+FZS*SINT.
SPTRX4:  EQU         $
         BSR         AROND           < CONVERSION ENTIERE...
         JAL         SPTR1           < HORS-ECRAN...
         CPI         NLIGM1
         JG          SPTR1           < HORS-ECRAN...
         STA         YS              < YS=PROJ(Y).
         CPZ         SENS            < ???
         JNE         SPTR2           < SCRATCH --> RESIDENT...
         BSR         ASPGPR          < A=NIVEAU(XR,YR),
         BSR         ASPRPS          < NIVEAU(XS,YS) <-- (A)...
         JMP         SPTR1
SPTR2:   EQU         $               < RESIDENT <-- SCRATCH.
         BSR         ASPGPS          < A=NIVEAU(XS,YS),
         BSR         ASPRPR          < NIVEAU(XR,YR) <-- (A).
XWOR%9:  VAL         0
         IF          NMPROC-NMTY,XWOR%9,,XWOR%9
         LA          XR
         SB          TRX
         FLT
         FST         FXS             < XS.
         FMP         FXS
         FST         FRS             < XS*XS.
         LA          YR
         SB          TRY
         FLT
         FST         FYS             < YS.
         FMP         FYS
         LX          XTRAN           < X=NUMERO DE LA TRANSFORMATION,
         BR          &ATRAN          < A LAQUELLE ON SE BRANCHE...
<
< TRANSFORMATION CONFORME Z=K*Z*Z :
<
TRANS2:  EQU         $
         FSB         FRS             < XS*XS-YS*YS.
         FMP         FK
         BSR         AROND
         AD          TRX
         STA         XS              < XS=FK*(XS*XS-YS*YS).
         FLD         FYS
         FMP         FXS
         FDV         F05
         FMP         FK
         BSR         AROND
         AD          TRY
         STA         YS              < YS=2*FK*XS*YS.
         JMP         SPTR4
<
< TRANSFORMATION CONFORME Z=K/Z :
<
TRANS1:  EQU         $
         FAD         FRS
         FST         FRS             < XS*XS+YS*YS.
         FLD         FXS
         FMP         FK
         FDV         FRS
         BSR         AROND
         AD          TRX
         STA         XS              < XS=FK*XS/(XS*XS+YS*YS).
         FLD         FYS
         FMP         FK
         FNEG
         FDV         FRS
         BSR         AROND
         AD          TRY
         STA         YS              < YS=-FK*YS/(XS*XS+YS*YS).
         JMP         SPTR4
<
< MAPPING DE (XR,YR) SUR UNE SURFACE DONT LES
< COORDONNEES CURVILIGNES SONT (XS,YS) :
<
TRANS3:  EQU         $
         CPZ         SENS
         JE          SPTR10          < RESIDENT --> SCRATCH : ON DIFFERE
                                     < LE TEST SUR LE POINT DESTINATION DONT
                                     < ON NE CONNAIT PAS ENCORE LES COORDONNEES
                                     < XS,YS...
         BSR         ASPGPR          < SCRATCH --> RESIDENT : LE POINT DESTINA-
                                     < TION EST LE POINT XR,YR :
         JANE        SPTR1           < IL N'EST PAS NOIR, ON NE VA PAS Y
                                     < TOUCHER...
SPTR10:  EQU         $
         FLD         FXS
         FDV         RADIAX
         FST         FXS             < XS=2*PI*XR/255.
         FLD         FYS
         FDV         RADIAY
         FST         FYS             < YS=PI*YR/255.
         BSR         ACOS
         FMP         RAYON
         FST         FRS             < RS=RAYON*COS(PI*YR/255).
         FLD         FXS
         BSR         ACOS
         FMP         FRS
         PSR         A,B             < SAVE X=FRS*COS(2*PI*XR/255).
         FLD         FXS
         BSR         ASIN
         FMP         FRS
         PSR         A,B             < SAVE Y=FRS*SIN(2*PI*XR/255).
         FLD         FYS
         BSR         ASIN
         FMP         RAYON
         FST         FRS             < SAVE Z=RAYON*SIN(PI*YR/255) DANS FRS.
         PLR         A,B
         FST         FYS             < COORDONNEE 'Y' 3D,
         PLR         A,B
         FST         FXS             < COORDONNEE 'X' 3D,
         FLD         FRS             < COORDONNEE 'Z' 3D...
         CPZ         IPROJ           < MODE DE PROJECTION ???
         JE          SPTRX1          < PAR COST,SINT...
<
< PROJECTION PERSPECTIVE :
<
         FDV         PZ
         FSB         F1
         FNEG
         FST         FWORK           < 1-(FZS/PZ)
         FLD         FXS
         FDV         FWORK           < FXS/(1-(FZS/PZ))
         JMP         SPTRX2
<
< PROJECTION PAR COST,SINT :
<
SPTRX1:  EQU         $
         FMP         COST            < ET ON PROJETTE...
         FAD         FXS
SPTRX2:  EQU         $
         BSR         AROND
         AD          TRX
         STA         XS              < XS=X+Z*COST.
         CPZ         IPROJ           < MODE DE PROJECTION ???
         JE          SPTRX3          < PAR COST,SINT...
<
< PROJECTION PERSPECTIVE :
<
         FLD         FYS
         FDV         FWORK           < FYS/(1-(FZS/PZ))
         JMP         SPTRX4
<
< PAR SINT,COST :
<
SPTRX3:  EQU         $
         FLD         FRS
         FMP         SINT
         FAD         FYS
SPTRX4:  EQU         $
         BSR         AROND
         AD          TRY
         STA         YS              < YS=Y+Z*SINT.
<
< TEST DES HORS-ECRAN :
<
SPTR4:   EQU         $
         LA          XS
         CPZ         MODX            < EST-ON SUR UN X-TORE ???
         JE          SPTT3           < OUI...
         JAL         SPTR1           < NON, ET XS EST OVERSCREEN...
         CPI         NPOLM1
         JG          SPTR1           < DE MEME...
         JMP         SPTT4           < OK, XS EST DANS L'ECRAN...
SPTT3:   EQU         $               < CAS OU L'ON EST SUR UN X-TORE :
         ANDI        NPOLM1
         STA         XS              < CALCUL MODULO DE XS...
SPTT4:   EQU         $
         LA          YS
         CPZ         MODY            < EST-ON SUR UN Y-TORE ???
         JE          SPTT6           < OUI...
         JAL         SPTR1           < NON, ET YS EST OVERSCREEN...
         CPI         NLIGM1
         JG          SPTR1           < DE MEME...
         JMP         SPTT7
SPTT6:   EQU         $               < CAS OU L'ON EST SUR UN Y-TORE :
         ANDI        NLIGM1
         STA         YS              < CALCUL MODULO DE YS...
SPTT7:   EQU         $
         CPZ         SENS            < ???
         JNE         SPTR2           < SCRATCH --> RESIDENT.
         LA          XTRAN
         CPI         XTR3            < EST-CE LE MAPPING ???
         JNE         SPTR11          < NON...
         BSR         ASPGPS          < OUI : A=NIVEAU(XS,YS) :
         JANE        SPTR1           < LE POINT (XS,YS) EST DEJA OCCUPE,
                                     < ON LE LAISSE INTACT...
SPTR11:  EQU         $
         BSR         ASPGPR          < A=NIVEAU(XR,YR),
         BSR         ASPRPS          < NIVEAU(XS,YS) <-- (A)...
         JMP         SPTR1
SPTR2:   EQU         $
         BSR         ASPGPS          < A=NIVEAU(XS,YS),
         BSR         ASPRPR          < NIVEAU(XR,YR) <-- (A)...
XWOR%9:  VAL         0
SPTR1:   EQU         $
         PLR         A,B,X,Y
         RSR
<
<
<        A R R O N D I   F L O T T A N T  :
<
<
ROND:    EQU         $
         JAL         ROND1           < NOMBRE NEGATIF...
         FAD         F05             < NOMBRE POSITIF...
         JMP         ROND2
ROND1:   EQU         $
         FSB         F05
ROND2:   EQU         $
         FIX
         RSR
         PAGE
         IF          NMPROC-NMTY,XWOR%9,,XWOR%9
<
<
<        C A L C U L   S I N U S   E T   C O S I N U S  :
<
<
<        ARGUMENT :
<                    A,B = ANGLE EN RADIANS,
<
<
<        RESULTAT :
<                    A,B = LIGNE TRIGONOMETRIQUE DEMANDEE.
<
<
COS:     EQU         $               < ENTRY 'COSINUS' :
         FSB         PISUR2          < A,B = TETA-PI/2,
         FNEG                        < A,B = PI/2-TETA.
SIN:     EQU         $               < ENTRY 'SINUS' :
         FST         ZZZ061          < SAVE TEMPORAIRE DE L'ANGLE.
         STZ         ZZZ063
         JAGE        ZZZ072
         FNEG
         FST         ZZZ061
         IC          ZZZ063
ZZZ072:  EQU         $
         FDV         DEUXPI
         FIX
         FLT
         FMP         DEUXPI
         FSB         ZZZ061
         FNEG
         FCAM        PI3141
         JL          ZZZ073
         FSB         PI3141
         IC          ZZZ063
ZZZ073:  EQU         $
         FCAM        PISUR2
         JL          ZZZ074
         FSB         PI3141
         FNEG
ZZZ074:  EQU         $
         FDV         PISUR2
         FST         ZZZ061
         FMP         ZZZ061
         FST         ZZZ062
         FMP         ZZZ071
         FAD         ZZZ070
         FMP         ZZZ062
         FAD         ZZZ069
         FMP         ZZZ062
         FAD         ZZZ068
         FMP         ZZZ062
         FAD         ZZZ067
         FMP         ZZZ061
         DC          ZZZ063
         JNE         ZZZ075
         FNEG
ZZZ075:  EQU         $
         RSR
XWOR%9:  VAL         0
         PAGE
         IF          NMPROC-NMTX,XWOR%,,XWOR%
<
<
<        M O Y E N N A G E   S U R   U N E   S P I R A L E  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME CALCULE UNE SPIRALE
<                    CENTREE SUR LE POINT (XR,YR) COURANT,
<                    ET CALCULE LA MOYENNE DES NIVEAUX QU'IL
<                    Y RENCONTRE, ET QU'IL AFFECTE ENSUITE
<                    AU POINT (XS,YS) COURANT.
<
<
<        ARGUMENT :
<                    (XR,YR) = POINT RESIDENT COURANT.
<
<
SPMOY:   EQU         $
         PSR         A,B,X,Y
         CPZ         IFLOU           < FLOU OU ELIMINATION POINTS NOIRS ???
         JE          SPMOY6          < FLOU...
         BSR         ASPGPR          < ELIMINATION DE CERTAINS POINTS :
         LR          A,X
         LA          LNIV
         TBT         0,X             < LE NIVEAU DE (XR,YR) EST-IL A PRENDRE
                                     < EN COMPTE ???
         JNC         SPMOY7          < (XR,YR) N'EST PAS A PRENDRE EN COMPTE...
SPMOY6:  EQU         $
         STZ         XSMAX           < REINITIALISATION DU MAX A PRIORI...
         LA          XR
         LB          YR
         PSR         A,B             < SAUVEGARDE DU POINT (XR,YR).
         STZ         CUMUL           < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         LA          PASQ
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         1
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIRALE.
SPMOY8:  EQU         $
<
< PARCOURS D'UN BRAS :
<
SPMOY1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPMOY2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NPM             < FINI ???
         JG          SPMOY3          < OUI...
         LA          XR              < NON :
         JAL         SPMOY4          < LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPMOY4          < HORS-ECRAN...
         LA          YR
         JAL         SPMOY4          < HORS-ECRAN...
         CPI         NLIGM1
         JG          SPMOY4          < HORS-ECRAN...
         BSR         ASPGPR          < A=NIVEAU(XR,YR),
         CP          XSMAX           < EST-CE LE MAX RENCONTRE ???
         JLE         SPMOYA          < NON..
         STA         XSMAX           < OUI, ON LE GARDE...
         LA          NP
         STA         NPMAX           < ET ON MEMORISE LE 'NP' ASSOCIE...
         LA          XSMAX           < ET RESTAURE (A)...
SPMOYA:  EQU         $
         AD          CUMUL           < ET
         STA         CUMUL           < CUMULE...
SPMOY4:  EQU         $
         LA          XR
         AD          DELTAX          < CHANGEMENT DE
         STA         XR
         LA          YR
         AD          DELTAY          < POINT COURANT (XR,YR).
         STA         YR
         DC          LB              < DECOMPTAGE DES POINTS SUR LA BRANCHE :
         JG          SPMOY2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPMOY5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPMOY5:  EQU         $
         LA          DELTAY          < ON FAIT SUBIR AU NOMBRE COMPLEXE
         NGR         A,A             < (DX,DY) UNE ROTATION DE PI/2, SOIT
         LB          DELTAX          < UNE MULTIPLICATION PAR LA MATRICE
                                     < (0,-1,1,0)...
         STA         DELTAX          < DELTAX=-DELTAY,
         STB         DELTAY          < DELTAY=DELTAX.
         JMP         SPMOY1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (XS,YS) :
<
SPMOY3:  EQU         $
         PLR         A,B
         STA         XR              < RESTAURATION
         STB         YR              < DE (XR,YR),
         STA         XS              < ET GENERATION
         STB         YS              < DE (XS,YS)...
         LA          XSMAX           < A=NIVEAU MAX RENCONTRE,
         CPZ         IPOND           < DOIT-ON PONDERER ???
         JE          SPMOYB          < NON, ON PREND 'XSMAX'...
         LA          NPM
         SB          NPMAX
         MP          XSMAX           < OUI, ON VA PRENDRE :
         DV          NPM             < (XSMAX*(NPM-NPMAX))/NPM...
SPMOYB:  EQU         $
         CPZ         ISMAX           < MAIS EST-CE BIEN UNE RECHERCHE DU MAX ?
         JNE         SPMOY9          < ET OUI...
         LAI         0               < ET NON...
         LB          CUMUL
         DV          NPM             < A=NIVEAU MOYEN DE LA SPIRALE,
SPMOY9:  EQU         $
<
< TRAMAGE PAR CALCUL DE LA
< PROPORTION DE POINTS BLANCS
< PAR RAPPORT AUX POINTS NOIRS
< EN FONCTION DES COULEURS
< PRESENTES :
<
         CPZ         ITRAM           < DOIT-ON TRAMER ???
         JE          ERDN1           < NON...
         LR          A,X
         LBY         &ATAUX
         JAE         ERDN7           < NUL, RIEN A FAIRE ==> NOIR...
         LR          A,X             < INITIALISATION DU MULTIPLICATEUR
                                     < COURANT PAR UNE FONCTION DU NIVEAU DE
                                     < GRIS DU POINT COURANT...
         LA          LNIV
XWOR%8:  VAL         0
         DO          NIVMAX+1
XWOR%8:  VAL         XWOR%8>BIT?BIT
         ANDI        XWOR%8          < (A)=VALEUR INITIALE DE 'DRDN' :
         JANE        ERDN6           < OK...
         LAI         NIVMAX*NIVMAX   < NUL, ON FORCE LE CARRE DU NIVEAU
                                     < DE BLANC (VOIR LE FORMAT DE 'TAUX')...
ERDN6:   EQU         $
         STA         DRDN            < INITIALISATION DE 'DRDN'...
ERDN5:   EQU         $
         LA          RDN             < GENERATION DE NOMBRES ALEATOIRES :
         EOR         POINTS          < ON INTRODUIT UN AUTRE PARAMETRE...
         MP          RDN1
         SCRD        RDN3
         JANE        SPMOYC
         LR          B,A
         JANE        SPMOYC
         LA          KRDN1
         ADRI        XKRDN1,A
         SCRS        XKRDN2
         STA         KRDN1           < PROGRESSION DE 'KRDN1'...
SPMOYC:  EQU         $
         EOR         XS              < PRISE EN COMPTE DE LA COORDONNEE 'X'...
         EOR         RDN9
         ADRI        -XKRDN2,A
         SCRS        XKRDN1
         EOR         YS              < PRISE EN COMPTE DE LA COORDONNEE 'Y'...
         STA         RDN
         SARD        NBITMO
         DV          DRDN
         LAI         NIVMAX          < (A)=BLANC A PRIORI...
         CPZR        B               < DOIT ON TRACER (LE NOMBRE ALEATOIRE
                                     < COURANT EST-IL DIVISIBLE PAR 'DRDN') ???
         JE          ERDN4           < OUI ==> BLANC...
         JDX         ERDN5           < NON, ATTENDONS ENCORE UN PEU...
ERDN7:   EQU         $
         LAI         0               < (A)=NOIR LORSQU'ON NE TRACE PAS...
ERDN4:   EQU         $
ERDN3:   EQU         $
ERDN1:   EQU         $
<
< MARQUAGE DU POINT (XS,YS) :
<
         BSR         ASPRPS          < QUE L'ON AFFECTE A (XS,YS).
SPMOY7:  EQU         $
         PLR         A,B,X,Y
         RSR
XWOR%:   VAL         0
         PAGE
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
<
<
<        E X T R A C T I O N   D ' U N   N I V E A U   D O N N E  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME TESTE LE NIVEAU
<                    DU POINT (XR,YR) ; SI CE NIVEAU EGALE
<                    'NIVEAU', ALORS, IL L'AFFECTE AU
<                    POINT (XS,YS), SINON, IL LUI AFFECTE
<                    LE NIVEAU 0...
<
<
SPFIL:   EQU         $
         PSR         A
         BSR         ASPGPR          < A=NIVEAU(XR,YR),
         CP          NIVEAU
         JE          SPFIL1          < NIVEAU(XR,YR)=NIVEAU...
         LAI         0               < NIVEAU(XR,YR)#NIVEAU, ON AFFECTE 0...
SPFIL1:  EQU         $
         BSR         ASPRPS          < NIVEAU(XS,YS) <-- (A)...
         PLR         A
         RSR
XWOR%9:  VAL         0
         PAGE
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
<
<
<        F I L T R A G E   D E S   H A U T E S   F R E Q U E N C E S  :
<
<
<        FONCTION :
<                      CE MODULE DECOUPE L'IMAGE EN MAILLES
<                    ELEMENTAIRES DE DIMENSION (DX,DY), ET AU
<                    NOMBRE DE (NDX,NDY) ; DANS CHACUNE D'ENTRE
<                    ELLES DE L'IMAGE RESIDENTE, ON CALCULE
<                    LE NIVEAU DE GRIS MOYEN, QUE L'ON AFFECTE
<                    ENSUITE EN RESIDENT A TOUS LES POINTS
<                    DE LA MAILLE COURANTE.
<
<
MOYEN:   EQU         $
MOYEN1:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMDX-ZERO
         BSR         APRINT          < "DX=",
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 'DX' :
         JNE         MOYEN1          < ERREUR...
         JALE        MOYEN1          < ERREUR...
         STA         EX
         LRM         A,B
         WORD        0;NMOTL*NBITMO
         DV          EX
         JAE         MOYEN1          < ERREUR...
         CPZR        B
         JNE         MOYEN1          < 'DX' EST INCOMPATIBLE AVEC LA
                                     < DIMENSION HORIZONTALE DE L'ECRAN.
         STA         NDX             < NOMBRE HORIZONTAL DE MAILLES.
MOYEN2:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMDY-ZERO
         BSR         APRINT          < "DY=",
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 'DY' :
         JNE         MOYEN2          < ERREUR...
         JALE        MOYEN2          < ERREUR...
         STA         EY
         LRM         A,B
         WORD        0;NLIG
         DV          EY
         JAE         MOYEN2          < ERREUR...
         CPZR        B
         JNE         MOYEN2          < LA DIMENSION VERTICALE EST INCOMPATIBLE
                                     < AVEC L'ECRAN...
         STA         NDY             < NOMBRE VERTICAL DE MAILLES...
         LA          EX
         MP          EY
         CPZR        B
         JLE         MOYEN1          < TROP GRAND, DONC NEGATIF...
         STB         NPOINT          < NOMBRE DE POINTS PAR MAILLE...
<
< BOUCLE DE FILTRAGE :
<
         LYI         0
         LB          NDY
         STB         XNDY
MOYEN3:  EQU         $
         LXI         0
         LB          NDX
         STB         XNDX
MOYEN4:  EQU         $
         STZ         CUMUL           < SOMMATION DES NIVEAUX DE GRIS.
         LB          EY
         STB         XDY             < DIMENSION VERTICALE DE LA MAILLE...
         STY         YR              < YR=COORDONNEE Y COURANTE.
MOYEN5:  EQU         $
         LB          EX
         STB         XDX             < DIMENSION HORIZONTALE DE LA MAILLE...
         STX         XR              < XR=COORDONNEE X COURANTE.
MOYEN6:  EQU         $
         BSR         ASPGPR          < A=NIVEAU DU POINT (XR,YR),
         AD          CUMUL           < ET
         STA         CUMUL           < CUMUL DANS LA MAILLE...
         IC          XR              < DEPLACEMENT HORIZONTAL DANS
         DC          XDX             < LA MAILLE COURANTE.
         JG          MOYEN6
         IC          YR              < DEPLACEMENT VERTICAL DANS
         DC          XDY             < LA MAILLE COURANTE.
         JG          MOYEN5
         LAI         0
         LB          CUMUL
         DV          NPOINT          < A=NIVEAU DE GRIS MOYEN DE LA MAILLE
                                     < COURANTE.
         LB          EY
         STB         XDY
         STY         YR              < YR=COORDONNEE Y COURANTE.
MOYEN7:  EQU         $
         LB          EX
         STB         XDX
         STX         XR              < XR=COORDONNEE X COURANTE.
MOYEN8:  EQU         $
         BSR         ASPRPR          < MISE EN PLACE DU NIVEAU MOYEN...
         IC          XR              < BALAYAGE HORIZONTAL DANS
         DC          XDX             < LA MAILLE COURANTE.
         JG          MOYEN8
         IC          YR              < BALAYAGE VERTICAL DANS
         DC          XDY             < LA MAILLE COURANTE.
         JG          MOYEN7
         LA          EX
         ADR         A,X             < BALAYAGE HORIZONTAL DANS
         DC          XNDX            < L'IMAGE RESIDENTE.
         JG          MOYEN4
         LA          EY
         ADR         A,Y             < BALAYAGE VERTICAL DANS
         DC          XNDY            < L'IMAGE RESIDENTE.
         JG          MOYEN3
         BR          ALOOP           < ET ENFIN, VERS L'INTERROGATION...
XWOR%9:  VAL         0
         PAGE
         IF          NMPROC-NMTX,,XWOR%9,
<
<
<        ' E O R '   E N T R E   2   P O I N T S  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME EFFECTUE L'OPERATION
<                    SUIVANTE :
<                    POINT RESIDENT <-- (POINT RESIDENT).EOR.(POINT SCRATCH),
<                    SACHANT QUE :
<                    X.EOR.Y=(X.AND.(.NOT.Y)).OR.((.NOT.X).AND.Y)
<
<
<        ARGUMENTS :
<                    (XR,YR),(XS,YS) = COORDONNEES DES 2 POINTS.
<
<
SPEOR:   EQU         $
         PSR         A,B,W
         BSR         ASPGPR
         LR          A,W             < A=W=NIVEAU DU POINT RESIDENT, SOIT 'NR'.
         PSR         W
         BSR         ASPGPS
         LR          A,B             < B=NIVEAU DU POINT SCRATCH, SOIT 'NS'.
         ADRI        -NIVMAX,A
         NGR         A,A             < A=.NOT.NS
         ADRI        -NIVMAX,W
         NGR         W,W             < W=.NOT.NR
         CPR         B,W             < CALCUL DE NS.AND.(.NOT.NR)
         JGE         SPEOR1          < W>=B : C'EST NS...
         LR          W,B             < W<B : C'EST .NOT.NR...
SPEOR1:  EQU         $               < B=NS.AND.(.NOT.NR)
         PLR         W               < W=NR
         CPR         A,W             < CALCUL DE (.NOT.NS).AND.NR
         JGE         SPEOR2          < W>=A : C'EST NR...
         LR          W,A             < W<A : C'EST .NOT.NS...
SPEOR2:  EQU         $               < A=(.NOT.NS).AND.NR
         CPR         A,B             < CALCUL DE :
                                     < ((.NOT.NS).AND.NR).OR.(NS.AND.(.NOT.NR))
         JLE         SPEOR3          < B<=A, A EST LE MAXIMUM,
         LR          B,A             < B>A : B EST LE MAXIMUM...
SPEOR3:  EQU         $               < A CONTIENT LE 'EOR'...
         BSR         ASPRPR          < QUE L'ON MET EN RESIDENT...
         PLR         A,B,W
         RSR
XWOR%9:  VAL         0
         PAGE
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
<
<
<        R E C U P E R A T I O N   /   G E N E R A T I O N
<        D U   M A S Q U E   D ' I M A G E  :
<
<
<        FONCTION :
<                      CE MODULE PERMET DE GENERER (COMMANDE
<                    ">") OU DE RECUPERER (COMMANDE
<                    "<") LE MASQUE COURANT D'IMAGE
<                    DE, OU A PARTIR DE L'UNE DES 3 COMPOSANTES
<                    'R', 'V' ET 'B' DE L'IMAGE SCRATCH.
<
<
MASK:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMMC-ZERO
         BSR         APRINT          < MESSAGE "STACK?"...
XWOR%7:  VAL         0
         BSR         AIN             < A=REPONSE "R"/"V"/"B"...
         LBI         TVPR-1          < B=NUMERO DU STACK DEMANDE...
         CPI         "R"
         JE          MASK1           < "R"...
         LBI         TVPV-1
         CPI         "V"
         JE          MASK1           < "V"...
         LBI         TVPB-1
         CPI         "B"
         JE          MASK1           < "B"...
MASK2:   EQU         $
         BR          AERROR          < TRAITEMENT DES ERREURS...
MASK1:   EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMMS-ZERO
         BSR         APRINT          < MESSAGE "SENS?"...
XWOR%7:  VAL         0
         LAD         DEMIN
         BSR         AENTER
         SLLD        LIMAG=0         < B=ADRESSE DANS LA 'CDA' DU STACK DEMANDE.
         LRM         X,Y
         WORD        LIMAG           < X=NOMBRE DE MOTS A DEPLACER,
         WORD        AMASK           < Y=ADRESSE DU MASQUE DANS LA 'CDA'.
         LBY         &AREP           < A=REPONSE DE "SENS?"...
         CPI         ">"
         JE          MASK3           < ">" : GENERATION...
         CPI         "<"
         JNE         MASK2           < ERREUR...
         XR          B,Y             < "<" : RECUPERATION, ON PERMUTE EMETTEUR
                                     < ET RECPTEUR...
MASK3:   EQU         $
         STB         AEMETT          < EMETTEUR EN CDA,
         STY         ARECEP          < RECEPTEUR EN CDA.
         LRM         B
         WORD        MCDAM           < B=ADRESSE DU MOT DE TRANSIT...
MASK4:   EQU         $
         PSR         X
         LA          AEMETT
         LXI         1
         RCDA
         LA          ARECEP
         LXI         1
         WCDA
         PLR         X
         IC          AEMETT          < PROGRESSION DE L'EMETTEUR,
         IC          ARECEP          < AINSI QUE DU RECEPTEUR...
         JDX         MASK4           < AU MOT SUIVANT DU MASQUE...
         BR          ALOOP           < ET C'EST TOUT...
XWOR%9:  VAL         0
         PAGE
<
<
<        O P E R A T I O N   I N T E R - I M A G E S  :
<
<
<        FONCTION :
<                      CETTE VERSION PROVISOIRE REALISE
<                    L'OPERATION .OP. DE LA FACON
<                    SUIVANTE :
<                    RESIDENT <-- (RESIDENT).OP.(SCRATCH)
<                    CETTE OPERATION N'ETANT EFFECTUEE
<                    QUE POUR LES BITS A 1 DU MASQUE...
<
<
SPOP:    EQU         $
         PSR         A,B,X,Y
         LY          ORGY
         STY         YS              < ORDONNEE SCRATCH.
         LYI         0               < Y=ORDONNEE.
         STY         YR
SPOP1:   EQU         $
         LXI         0
         STX         XR              < X=ABSCISSE.
         LX          ORGX
         STX         XS
SPOP2:   EQU         $
         LX          XS
         LY          YS
         PSR         X,Y             < SAUVEGARDE DE 'XS' ET 'YS'...
         LA          XS
         CPZ         MODX            < EST-ON SUR UN X-TORE ???
         JE          SPOP3           < OUI...
         JAL         SPOP5           < NON, ET XS EST OVERSCREEN...
         CPI         NPOLM1
         JG          SPOP5           < DE MEME...
         JMP         SPOP4           < OK, XS EST DANS L'ECRAN...
SPOP3:   EQU         $               < CAS OU L'ON EST SUR UN X-TORE :
         ANDI        NPOLM1
         STA         XS              < CALCUL MODULO DE XS...
SPOP4:   EQU         $
         LA          YS
         CPZ         MODY            < EST-ON SUR UN Y-TORE ???
         JE          SPOP6           < OUI...
         JAL         SPOP5           < NON, ET YS EST OVERSCREEN...
         CPI         NLIGM1
         JG          SPOP5           < DE MEME...
         JMP         SPOP7
SPOP6:   EQU         $               < CAS OU L'ON EST SUR UN Y-TORE :
         ANDI        NLIGM1
         STA         YS              < CALCUL MODULO DE YS...
SPOP7:   EQU         $
         CPZ         IMASKO
         JE          SPOP8           < LE MASQUE EST OFF...
         PSR         X,Y
         LX          XR              < X=COORDONNEE RESIDENTE,
         LY          YR              < AINSI QUE Y...
         LR          X,A
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1   < B=NUMERO DU MOT SUR LA LIGNE,
         SLRS        NBITMO-XWOR%1   < A=NUMERO DU BIT DANS LE MOT,
         LR          A,X             < X=NUMERO DU BIT DANS LE MOT,
         XR          Y,B
         SLLD        NMOTL=0+NBITMO
         ORR         A,Y             < Y=NUMERO DU MOT DANS LE MASQUE,
         LRM         A
         WORD        AMASK
         ADR         Y,A             < A=ADRESSE DU MOT DANS LA 'CDA'.
         PSR         X
         LRM         B,X
         WORD        MCDAM           < B=ADRESSE DU MOT DE TRANSIT,
         WORD        1               < X=NOMBRE DE MOTS A DEPLACER.
         RCDA
         PLR         X
         LA          MCDAM           < ACCES AU MASQUE,
         TBT         0,X             < ALORS ???
         PLR         X,Y
         JNC         SPOP5           < LE MOT (X,Y) EST MASQUE...
SPOP8:   EQU         $
         BSR         ASP             < EXECUTION DE L'OPERATION VARIABLE .OP.
                                     < SUR LE COUPLE DE POINTS (X,Y).
SPOP5:   EQU         $
         PLR         X,Y             < RESTAURATION DE XS ET YS...
         STX         XS
         STY         YS
         IC          XS              < PROGRESSION DE XS,
         IC          XR              < ET DE XR,
         LA          XR
         CPI         NPOLM1          < EST-ON EN BOUT DE LIGNE ???
         JLE         SPOP2           < NON... BALAYAGE HORIZONTAL...
         IC          YS              < OUI, PROGRESSION DE YS,
         IC          YR              < ET DE YR...
         LA          YR
         CPI         NLIGM1          < EST-ON EN BOUT D'IMAGE ???
         JLE         SPOP1           < NON, BALAYAGE VERTICAL...
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        E N T R E E   D E   M ( I , J )  :
<
<
<        ARGUMENT :
<                    A = ADRESSE DU MESSAGE POUR 'TW',
<                        NUMERO DE L'ELEMENT POUR 'TX'.
<
<
<        RESULTAT :
<                    A,B = COEFFICIENT EN FLOTTANT.
<
<
PTRANS:  EQU         $
         PSR         X,Y
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
         STA         XWORK           < SAUVEGARDE DE L'ADRESSE DU MESSAGE.
XWOR%9:  VAL         0
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
         LR          A,X             < SAVE LE NUMERO DE L'ELEMENT,
         SLRD        NBRHEX
         ORI         "0"             < CONVERSION ASCI DU NUMERO,
         SLLS        NBRHEX
XWOR%:   VAL         -NBRHEX
         ORI         "0">XWOR%       < SUITE...
         SLLD        NBRHEX
         IF          MODE-VISU,XWOR%7,,XWOR%7
         STA         MATN            < NUMERO EN ASCI DE L'ELEMENT...
XWOR%7:  VAL         0
         LR          X,A
         ADRI        -'11,A
         SLRD        NBRHEX
         LR          A,X
         ADR         A,A
         ADR         A,X             < X=TRIPLE DU PREMIER CHIFFRE,
         LAI         0
         SLLD        NBRHEX
         ADR         A,X             < X=CONVERSION LINEAIRE DU NUMERO DE
                                     < L'ELEMENT : 11 --> 0, 12 --> 1,...
         ADR         X,X             < ET ON DOUBLE CAR IL S'AGIT D'UNE
                                     < MATRICE FLOTTANTE...
XWOR%9:  VAL         0
PTRAN1:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
         LA          XWORK           < A PRIORI, A=ADRESSE MESSAGE,
XWOR%9:  VAL         0
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
         LAD         MAT             < A=ADRESSE DU MESSAGE MIJ=.
XWOR%9:  VAL         0
         BSR         APRINT          < QUE L'ON EDITE...
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 4 CHIFFRES HEXA-DECIMAUX :
         JNE         PTRAN1          < ERREUR...
         LR          A,Y             < Y=NUMERATEUR...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMSLAS-ZERO
         BSR         APRINT          < EDITION DE "/"...
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 4 CHIFFRES HEXA-DECIMAUX :
         JNE         PTRAN1          < ERREUR...
         FLT
         FST         FWORK           < SAUVEGARDE DU DENOMINATEUR...
         LR          Y,A
         FLT                         < CALCUL DU NUMERATEUR,
         FDV         FWORK           < (A,B)=NUMERATEUR/DENOMINATEUR.
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
         FST         &AM             < QUE L'ON RANGE DANS LA MATRICE...
XWOR%9:  VAL         0
         PLR         X,Y
         RSR
         PAGE
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
<
<
<        E N T R E E   D E   C X   C Y   O U   C Z  :
<
<
<        ARGUMENT :
<                    A=ADRESSE DU MESSAGE.
<
<
<        RESULTAT :
<                    A=COEFFICIENT.
<
<
PIC:     EQU         $
         STA         XWORK           < SAUVEGARDE DE L'ADRESSE DU MESSAGE,
PIC1:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LA          XWORK           < A=ADRESSE DU MESSAGE...
         BSR         APRINT          < QUE L'ON EDITE...
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 4 CHIFFRES HEXA-DECIMAUX :
         JNE         PIC1            < ERREUR DE SYNTAXE...
         RSR
XWOR%9:  VAL         0
         PAGE
<
<
<        E N T R E E   D E   L A   M A T R I C E  :
<
<
DTRANS:  EQU         $
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMAT11-ZERO
XWOR%7:  VAL         0
         BSR         APTRAN
         FST         M11
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMAT12-ZERO
XWOR%7:  VAL         0
         BSR         APTRAN
         FST         M12
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMAT21-ZERO
XWOR%7:  VAL         0
         BSR         APTRAN
         FST         M21
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMAT22-ZERO
XWOR%7:  VAL         0
         BSR         APTRAN
         FST         M22
DTRAN1:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTRX-ZERO
         BSR         APRINT          < EDITION DE "CX=",
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 'CX' :
         JNE         DTRAN1          < ERREUR...
         STA         TRX
DTRAN2:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTRY-ZERO
         BSR         APRINT          < EDITION DE "CY=",
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 'CY' :
         JNE         DTRAN2          < ERREUR...
         STA         TRY
XWOR%9:  VAL         0
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
         LAI         '11
         BSR         APTRAN          < ENTREE DE M11,
         LAI         '12
         BSR         APTRAN          < ENTREE DE M12,
         LAI         '13
         BSR         APTRAN          < ENTREE DE M13,
         LAI         '21
         BSR         APTRAN          < ENTREE DE M21,
         LAI         '22
         BSR         APTRAN          < ENTREE DE M22,
         LAI         '23
         BSR         APTRAN          < ENTREE DE M23,
         LAI         '31
         BSR         APTRAN          < ENTREE DE M31,
         LAI         '32
         BSR         APTRAN          < ENTREE DE M32,
         LAI         '33
         BSR         APTRAN          < ENTREE DE M33.
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTRX-ZERO
XWOR%7:  VAL         0
         BSR         APIC
         STA         TRX             < ENTREE DE TRX,
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTRY-ZERO
XWOR%7:  VAL         0
         BSR         APIC
         STA         TRY             < ENTREE DE TRY,
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTRZ-ZERO
XWOR%7:  VAL         0
         BSR         APIC
         STA         TRZ             < ENTREE DE TRZ.
DTRAN3:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMSENS-ZERO
         BSR         APRINT          < "S R".
XWOR%7:  VAL         0
         STZ         SENS            < SENS=0, : S <-- R A PRIORI...
         BSR         AIN             < ENTREE DU SENS :
         CPI         "<"
         JE          DTRAN4          < S <-- R.
         IC          SENS            < SENS=1 : S --> R...
         CPI         ">"
         JNE         DTRAN3          < ERREUR...
DTRAN4:  EQU         $
XWOR%9:  VAL         0
         IF          NMPROC-NMTY,XWOR%9,,XWOR%9
DTRAN5:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTRAN-ZERO
         BSR         APRINT          < "1/Z Z2 ?"
XWOR%7:  VAL         0
         STZ         XTRAN           < XTRAN=0 : 1/Z A PRIORI...
         BSR         AIN             < ENTREE DE LA TRANSFORMATION :
         CPI         "1"
         JE          DTRAN6          < 1/Z...
         IC          XTRAN           < XTRAN=1 : Z*Z...
         CPI         "2"
         JE          DTRAN6          < Z*Z...
         IC          XTRAN           < XTRAN=2 : MAPPING...
         CPI         "3"
         JNE         DTRAN5          < ERREUR...
DTRAN6:  EQU         $
DTRAN1:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTRX-ZERO
         BSR         APRINT          < EDITION DE "CX=",
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 'CX' :
         JNE         DTRAN1          < ERREUR...
         STA         TRX
DTRAN2:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTRY-ZERO
         BSR         APRINT          < EDITION DE "CY=",
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 'CY' :
         JNE         DTRAN2          < ERREUR...
         STA         TRY
DTRAN3:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMSENS-ZERO
         BSR         APRINT          < "S R".
XWOR%7:  VAL         0
         STZ         SENS            < SENS=0 : S <-- R A PRIORI...
         BSR         AIN             < ENTREE DU SENS :
         CPI         "<"
         JE          DTRAN4          < S <-- R.
         IC          SENS            < SENS=1 : S --> R...
         CPI         ">"
         JNE         DTRAN3          < ERREUR...
DTRAN4:  EQU         $
XWOR%9:  VAL         0
         BR          ALOOP           < EASY ??!?!?!
         PAGE
         IF          NMPROC-NMTX,XWOR%9,,XWOR%9
<
<
<        C H O I X   D U   M O D E   D E   P R O J E C T I O N  :
<
<
PROJE:   EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMODM-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIN             < ENTREE DU MODE :
                                     < 0 : PAR COST,SINT ;
                                     < 1 : EN PERSPECTIVE.
         ADRI        -"0",A
         JAL         PROJE           < ERREUR...
         CPI         1
         JG          PROJE           < ERREUR...
         STA         IPROJ           < RANGEMENT DU MODE...
         JAE         PROJE2          < PAR COST, SINT...
PROJE1:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMPROJ-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 'PZ' :
         JNE         PROJE1          < ERREUR...
         FLT
         FST         PZ              < PZ=POSITION DE L'ECRAN.
PROJE2:  EQU         $
         BR          ALOOP           < ET C'EST TOUT...
XWOR%9:  VAL         0
         PAGE
         IF          NMPROC-NMTY,XWOR%9,,XWOR%9
<
<
<        C H O I X   D U   M O D E   D E   P R O J E C T I O N  :
<
<
PROJE:   EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMODM-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIN             < ENTREE DU MODE :
                                     < 0 : PAR COST,SINT ;
                                     < 1 : EN PERSPECTIVE.
         ADRI        -"0",A
         JAL         PROJE           < ERREUR...
         CPI         1
         JG          PROJE           < ERREUR...
         STA         IPROJ           < RANGEMENT DU MODE...
         JAE         PROJE2          < PAR COST, SINT...
PROJE1:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMPROJ-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 'PZ' :
         JNE         PROJE1          < ERREUR...
         FLT
         FST         PZ              < PZ=POSITION DE L'ECRAN.
PROJE2:  EQU         $
         BR          ALOOP           < ET C'EST TOUT...
XWOR%9:  VAL         0
         PAGE
         IF          NMPROC-NMTW,XWOR%9,,XWOR%9
<
<
<        F I L T R A G E  :
<
<
<        FONCTION :
<                      SELECTIONNE DANS L'IMAGE RESIDENTE
<                    LES POINTS DE NIVEAU DONNE POUR LES
<                    METTRE EN IMAGE SCRATCH...
<
<
FILTRE:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMNIVO-ZERO
         BSR         APRINT          < EDITION DE "NIVEAU="...
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DU NIVEAU :
         JNE         FILTRE          < ERREUR...
         JAL         FILTRE          < NIVEAU NE PEUT ETRE NEGATIF...
         CPI         NIVMAX          < NE PEUT EXCEDER 'NIVMAX'...
         JG          FILTRE          < TROP GRAND...
FILTR1:  EQU         $
         STA         NIVEAU
         LB          ASPFIL
         JMP         IM1
XWOR%9:  VAL         0
         PAGE
         IF          NMPROC-NMTX,XWOR%,,XWOR%
<
<
<        M O Y E N N A G E   S U R   U N E   S P I R A L E  :
<
<
<        FONCTION :
<                      CETTE COMMANDE CENTRE SUR CHAQUE
<                    POINT (XR,YR) UNE SPIRALE DONT LE
<                    NOMBRE DE POINTS EST FIXE PAR L'UTI-
<                    LISATEUR, CALCULE LA MOYENNE DES NIVEAUX
<                    DES POINTS DE CETTE SPIRALE, ET
<                    L'AFFECTE AU POINT (XS,YS) CONFONDU
<                    AVEC LE POINT (XR,YR).
<
<
MOYEN:   EQU         $
         STZ         ISMAX           < A PRIORI, PAS DE RECHERCHE DU MAX...
         STZ         IPOND           < PAS DE PONDERATION A PRIORI...
         STZ         ITRAM           < PAS DE TRAMAGE A PRIORI...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMPOIN-ZERO
         BSR         APRINT          < EDITION DE "#POINTS="...
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DU NOMBRE DE POINTS :
         JNE         MOYEN           < ERREUR...
         JALE        MOYEN           < ERREUR...
         STA         NPM             < NPM=NOMBRE DE POINTS PAR SPIRALE (>1).
MOYEN1:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMPASQ-ZERO
         BSR         APRINT          < "PAS="
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DU PAS :
         JNE         MOYEN1          < ERREUR, ON REDEMANDE...
         JALE        MOYEN1          < ERREUR...
         IF          NLIGM1-NPOLM1,,XWOR%9,
         IF          CE QUI SUIT EST IDIOT !!!
XWOR%9:  VAL         0
         CPI         NLIGM1?NPOLM1   < VALIDATION ???
         JG          MOYEN1          < ERREUR...
         STA         PASQ            < OK, LE PAS EST BON...
MOYEN2:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMFLOU-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIN             < ENTREE DE FLOU OU PAS :
         STZ         IFLOU           < FLOU A PRIORI...
         CPI         "O"
         JE          MOYEN3          < IFLOU=0 : FLOU...
         IC          IFLOU           < IFLOU=1 : ELIMINATION POINTS NOIRS...
         CPI         "N"
         JNE         MOYEN2          < ERREUR...
         IC          NPM             < ON COMPTE LE POINT CENTRAL EN PLUS
                                     < LORS DU MAX...
MOYEN4:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMMAX-ZERO
         BSR         APRINT          < "MAX?"...
XWOR%7:  VAL         0
         BSR         AIN             < ENTREE DE MAX OU PAS :
         CPI         "N"
         JE          MOYEN5          < "N" : ISMAX=0...
         CPI         "O"
         JNE         MOYEN4          < ??!?!
         IC          ISMAX           < "O" : ISMAX=1...
MOYEN5:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMNIVO-ZERO
         BSR         APRINT          < "NIVEAUX="...
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DES NIVEAUX AUTORISES :
         JNE         MOYEN5          < ERROR...
         STA         LNIV            < ET SAUVEGARDE A PRIORI...
         CPZ         ISMAX           < MAX OU MOYENNE ???
         JE          MOYEN3          < MOYENNE, DONC PAS DE PONDERATION...
MOYEN6:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMPOND-ZERO
         BSR         APRINT          < "PONDERATION?"...
XWOR%7:  VAL         0
         BSR         AIN             < PONDERATION OU PAS :
         CPI         "N"
         JE          MOYEN8          < NON : IPOND=0...
         CPI         "O"
         JNE         MOYEN6          < ERREUR...
         IC          IPOND           < OUI : IPOND=1...
MOYEN8:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTRAM-ZERO
         BSR         APRINT          < "TRAME?"...
XWOR%7:  VAL         0
         BSR         AIN             < ENTREE DE LA REPONSE :
         CPI         "N"
         JE          MOYEN3          < NON, PAS DE TRAMAGE...
         CPI         "O"
         JNE         MOYEN8          < ??!??!?!!
         IC          ITRAM           < OUI, TRAMAGE...
MOYEN3:  EQU         $
         LB          ASPMOY          < B=ADRESSE DU S/P DE MOYENNAGE...
         JMP         IM1
XWOR%:   VAL         0
         PAGE
<
<
<        E N T R E E   D U   F O N D  :
<
<
<        FONCTION :
<                      LA COMMANDE "R" PERMET DE RENTRER
<                    16 VALEURS HEXADECIMALES COMPRISES
<                    ENTRE 0 ET 7 (NIVMAX) POUR INITIALISER
<                    LE FOND AVEC DES BARRES VERTICALES...
<
<
FOND:    EQU         $
         IF          NMPROC-NMTW,XWOR%,,XWOR%
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMFOND-ZERO
         BSR         APRINT          < EDITION DE "FOND=",
XWOR%7:  VAL         0
         LAD         DEMFON
         BSR         AENTER          < ENTREE DU FOND,
         LXI         0               < ET VALIDATION...
FOND1:   EQU         $
         LBY         &ABUFIN         < ACCES AU CARACTERE COURANT,
         ADRI        -"0",A          < TRANSLATION,
         JAL         FOND2           < ERREUR...
         CPI         NIVMAX          < VALIDATION,
         JG          FOND2           < ERREUR...
         STBY        &ABUFIN         < GENERATION DE LA TABLE D'INITIALISATION.
         ADRI        1,X
         LR          X,A
         CPI         NBITMO
         JL          FOND1           < ENCORE...
         STZ         XWORK           < INITIALISATION DE L'INDEX DE 'BUFIN'...
         LB          ASFOND          < B=ADRESSE DU MODULE DE TRAITEMENT,
         JMP         IM2             < VERS LE TRAITEMENT...
FOND2:   EQU         $
XWOR%:   VAL         0
         BR          AERROR
         IF          NMPROC-NMTW,XWOR%,,XWOR%
<
<
<        I N I T I A L I S A T I O N   D ' U N   P O I N T  :
<
<
SFOND:   EQU         $
         PSR         A,X
         LA          XWORK
         LR          A,X             < X=INDEX CIRCULAIRE DE 'BUFIN',
         ADRI        1,A
         ANDI        NBITMO-1        < ET PROGRESSION MODULO 'NBITMO'...
         STA         XWORK
         LBY         &ABUFIN         < A=NIVEAU COURANT,
         BSR         ASPRPR          < QUE L'ON MET AU POINT RESIDENT
                                     < COURANT...
         PLR         A,X
         RSR
XWOR%:   VAL         0
         PAGE
<
<
<        O P E R A T I O N S   I N T E R - I M A G E S  :
<
<
IMSAV:   EQU         $               < ENVOI DU RESIDENT EN SCRATCH.
         LBY         &API
         CPI         "P"             < EST-ON SUR LA 'CDA-PRIVE' ???
         JE          IMSAV1          < OUI, ON PEUT Y ALLER...
         BR          AERROR          < NON, SUR LA 'CDA-IMAGE', ET ALORS
                                     < GARE AUX MOVE DE PLUS D'UN MOT !!!
IMSAV1:  EQU         $
         BSR         ASPSCD
         BR          ALOOP
         IF          NMPROC-NMTX,,XWOR%9,
IMPERM:  EQU         $               < PERMUTATION RESIDENT-SCRATCH.
         LB          ASPPER
         JMP         IM1
XWOR%9:  VAL         0
IMUP:    EQU         $               < RAPPEL DU SCRATCH EN RESIDENT AVEC MASK.
         LB          ASPACD
         JMP         IM2
IMLOAD:  EQU         $               < RAPPEL DU SCRATCH EN RESIDENT SANS MASK.
         LBY         &API
         CPI         "P"             < EST-ON SUR LA 'CDA-PRIVE' ???
         JE          IMLOAE          < OUI, ON PEUT Y ALLER...
         BR          AERROR          < NON, SUR LA 'CDA-IMAGE', ET ALORS
                                     < GARE AUX MOVE DE PLUS D'UN MOT !!!
IMLOAE:  EQU         $
         BSR         ASPBCD
         BR          ALOOP
         IF          NMPROC-NMTX,,XWOR%9,
IMINV:   EQU         $               < INVERSION VIDEO DE L'IMAGE.
         LB          ASPINV
         JMP         IM2
XWOR%9:  VAL         0
TRANS:   EQU         $               < APPLICATION DE M(I,J).
         LB          ASPTR
         JMP         IM2
         IF          NMPROC-NMTX,,XWOR%9,
IMAND:   EQU         $               < .AND.
         LB          ASPAND
         JMP         IM1
IMEOR:   EQU         $               < .EOR.
         LB          ASPEOR
         JMP         IM1
IMOR:    EQU         $               < .OR.
         LB          ASPOR
         JMP         IM1
XWOR%9:  VAL         0
IM1:     EQU         $
IM2:     EQU         $
         STB         ASP             < RELAI DYNAMIQUE DE SOUS-PROGRAMME.
         BSR         ASPOP
         BR          ALOOP
         PAGE
         IF          NMPROC-NMTY,XWOR%9,,XWOR%9
<
<
<        E N T R E E   D E   L A   C O N S T A N T E   D E
<        T R A N S F O R M A T I O N   C O N F O R M E  :
<
<
INFK:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMK-ZERO
         BSR         APRINT          < "K="
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DU NUMERATEUR DE 'K' :
         JNE         GORGX2          < ERREUR...
         LR          A,Y             < Y=SAVE LE NUMERATEUR...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMSLAS-ZERO
         BSR         APRINT          < "/"
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DU DENOMINATEUR DE 'K' :
         JNE         GORGX2          < ERREUR...
         JAE         GORGX2          < NE PEUT ETRE NUL...
         FLT
         FST         FK
         LR          Y,A
         FLT
         FDV         FK              < NUMERATEUR/DENOMINATEUR...
         FDV         F05             < ON MULTIPLIE PAR 2...
         FST         FK              < OK...
         BR          ALOOP
XWOR%9:  VAL         0
         PAGE
<
<
<        E N T R E E   D E   ' O R G X '   E T   ' O R G Y '  :
<
<
GORGX:   EQU         $
         STZ         MODX            < TORE A PRIORI...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMORGX-ZERO
         BSR         APRINT          < EDITION DU MESSAGE.
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 'ORGX' :
         JE          GORGX1          < OK...
GORGX2:  EQU         $
         BR          AERROR          < ET NON...
GORGX1:  EQU         $
         NGR         A,A
         STA         ORGX
GORGX3:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTORE-ZERO
         BSR         APRINT          < "TORE?"
XWOR%7:  VAL         0
         BSR         AIN             < ENTREE DE X-TORE :
         CPI         "O"
         JE          GORGX4          < TORE...
         CPI         "N"
         JNE         GORGX3          < ERREUR...
         IC          MODX            < CE N'EST PAS LE MODE TORE...
GORGX4:  EQU         $
         BR          ALOOP           < OK...
GORGY:   EQU         $
         STZ         MODY            < MODE TORE A PRIORI...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMORGY-ZERO
         BSR         APRINT          < EDITION DU MESSAGE...
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 'ORGY' :
         JNE         GORGX2          < ERREUR...
         NGR         A,A
         STA         ORGY
GORGY3:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTORE-ZERO
         BSR         APRINT          < "TORE?"
XWOR%7:  VAL         0
         BSR         AIN             < ENTREE DE Y-TORE :
         CPI         "O"
         JE          GORGY4          < TORE...
         CPI         "N"
         JNE         GORGY3          < ERREUR...
         IC          MODY            < CE N'EST PAS LE MODE TORE...
GORGY4:  EQU         $
         BR          ALOOP           < OK...
         PAGE
<
<
<        M O U V E M E N T S   R E S I D E N T  <-->  T V  :
<
<
MOV0:    EQU         $               < RESIDENT R+V+B --> TV.
         LAD         DEMTVR
         SVC         0               < ROUGE,
         LAD         DEMTVV
         SVC         0               < VERT,
MOV3:    EQU         $               < RESIDENT B --> TV.
         LAD         DEMTVB
         SVC         0               < BLEU.
         BR          ALOOP
MOV1:    EQU         $               < RESIDENT R --> TV.
         LAD         DEMTVR
         SVC         0               < ROUGE.
         BR          ALOOP
MOV2:    EQU         $               < RESIDENT V --> TV.
         LAD         DEMTVV
         SVC         0               < VERT.
         BR          ALOOP
PMOV5:   EQU         $               < TV R --> RESIDENT.
         LA          DEMTVR+3
         LR          A,B
         ORI         TVIN            < MISE EN ENTREE,
         STA         DEMTVR+3
         LAD         DEMTVR
         SVC         0               < ENTREE DU ROUGE,
         STB         DEMTVR+3        < ET RESTAURATION...
         RSR
PMOV6:   EQU         $               < TV V --> RESIDENT.
         LA          DEMTVV+3
         LR          A,B
         ORI         TVIN
         STA         DEMTVV+3
         LAD         DEMTVV
         SVC         0               < ENTREE DU VERT...
         STB         DEMTVV+3
         RSR
PMOV7:   EQU         $               < TV B --> RESIDENT.
         LA          DEMTVB+3
         LR          A,B
         ORI         TVIN
         STA         DEMTVB+3
         LAD         DEMTVB
         SVC         0               < ENTREE DU BLEU...
         STB         DEMTVB+3
         RSR
MOV4:    EQU         $               < TV R+V+B --> RESIDENT.
         BSR         APMOV5          < ROUGE,
         BSR         APMOV6          < VERT,
MOV7:    EQU         $               < TV B --> RESIDENT.
         BSR         APMOV7          < BLEU.
         BR          ALOOP
MOV5:    EQU         $               < TV R --> RESIDENT.
         BSR         APMOV5
         BR          ALOOP
MOV6:    EQU         $               < TV V --> RESIDENT.
         BSR         APMOV6
         BR          ALOOP
         PAGE
<
<
<        T R A N S F E R T S   R E S I D E N T - S C R A T C H  :
<
<
<        FONCTION :
<                      CE MODULE ASSURE LES TRANSFERTS
<                    BRUTAUX ENTRE LE RESIDENT, ET LE
<                    SCRATCH (QUI EST EN FAIT LA 'CDA').
<
<
SPSCD:   EQU         $
         PSR         A,B,X
         LRM         A,B,X
         WORD        0               < A=ADRESSE EN 'CDA',
         WORD        IMAGE           < B=ADRESSE EN RESIDENT,
         WORD        LIMAG*NCOOL     < X=NOMBRE DE MOTS A TRANSFERER.
         WCDA
                                     < TRANSFERT : RESIDENT --> SCRATCH.
         PLR         A,B,X
         RSR
SPACD:   EQU         $               < TRANSFERT AVEC MASQUE...
         PSR         A
         BSR         ASPGPS          < ACCES AU POINT SCRATCH COURANT,
         BSR         ASPRPR          < ET MISE EN RESIDENT...
         PLR         A
         RSR
SPBCD:   EQU         $               < TRANSFERT SANS MASQUE...
         PSR         A,B,X
         LRM         A,B,X
         WORD        0               < A=ADRESSE EN 'CDA',
         WORD        IMAGE           < B=ADRESSE EN RESIDENT,
         WORD        LIMAG*NCOOL     < X=NOMBRE DE MOTS A TRANSFERER.
         RCDA
                                     < TRANSFERT : SCRATCH --> RESIDENT.
         PLR         A,B,X
         RSR
         PAGE
<
<
<        T R A I T E M E N T   D E S   E R R E U R S  :
<
<
ERROR:   EQU         $
         LAI         AMERR-ZERO
         BSR         APRINT          < ENVOI D'UN MESSAGE D'ERREUR...
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        R E T O U R   A   ' G E '  :
<
<
GOGE:    EQU         $
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         LAI         BRANCH-ZERO
         LR          A,W             < W=ADRESSE DE LA BRANCHE...
         LA          NSD
         STA         0,W             < GENERATION DU NOM DE L'OVERALY,
         ACTD        4               < A='IDESC',
         ORI         "0"             < CONVERTI EN ASCI,
         STBY        2,W             < QUI FAIT PARTIE DU NOM...
         LAI         SGNLON
         STBY        DEMLOD          < MISE EN MODE 'LOAD SOUS ACN'...
         STZ         CDRET,W         < RETOUR OK...
GOGE2:   EQU         $
         LRM         A,B,X
         WORD        SITEM1          < A=ZONE DE SAUVEGARDE,
         WORD        NOM             < B=ZONE A RESTAURER,
         WORD        LNOM/NOCMO      < X=NOMBRE DE MOTS A RESTAURER.
         MOVE                        < RESTAURATION DU BOUT DE L'ITEM1...
         LX          NMOTS
GOGE3:   EQU         $
         STZ         &AITEM2         < RAZ DE L'ITEM2...
         JDX         GOGE3
XWOR%7:  VAL         0
         LA          SAVEK
         LR          A,K             < RESTAURATION DE 'K'...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAD         RELMEM
         SVC         0               < RETOUR A 4K MOTS...
         LAI         BRANCH-ZERO
         LR          A,W             < RESTAURATION DE 'W'.
         STZ         MODCAL,W        < REINITIALISATION DU MODE D'APPEL...
         LA          NGE
         STA         0,W             < MISE EN PLACE DU NOM DE "GE"...
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         LA          IEG
         STA         MODCAL,W        < RENVOI DE L'INDEX COURANT DE ITEM1,
XWOR%7:  VAL         0
         LAI         AMCDA-ZERO
         BSR         ACCI            < ENVOI DE !CDA.
GOGE1:   EQU         $
         LAD         DEMLOD
         BSR         AOVL            < ET TENTATIVE DE CHARGEMENT...
         QUIT        1               < ACCES AU CCI EN CAS D'ERREUR...
         JMP         GOGE1           < ET ON RETENTE...
         IF          MODE-ITEM,XWOR%7,,XWOR%7
<
<
<        T R A I T E M E N T   D E S   A L T - M O D E S  :
<
<
ALTM:    EQU         $
         LAI         BRANCH-ZERO
         LR          A,W             < W=ADRESSE DE LA BRANCHE...
         LA          NPCALL
         JANE        ALTM1           < OK...
         LA          MODCAL,W        < MODCAL EST ENCORE A SA VALEUR INITIALE.
         LXI         0               < "GE" A PRIORI...
         TBT         0               < "EI" OU "GE" ???
         ADCR        X
         LA          &NCALL          < A=OVERLAY A APPELER...
ALTM1:   EQU         $
         STA         0,W             < DANS LE CAS D'UN ALT-MODE, ON REVIENT
                                     < DIRECTEMENT A "GE" OU A "EI"...
         LAI         " "             < ON RESTAURE, AU CAS OU LE ALT-MODE
         STBY        2,W             < APPARAITRAIT DANS 'GOGE'...
         LAI         SGNLNS          < IDEM...
         STBY        DEMLOD
         LAI         2
         STA         CDRET,W         < TRANSMISSION DU ALT-MODE...
         JMP         GOGE2
XWOR%7:  VAL         0
         PAGE
<
<
<        E N T R Y  :
<
<
TW:      EQU         $
         LRM         C,L
         WORD        REP+128         < ON INITIALISE 'C' AVEC 'REP+128'
                                     < A CAUSE DE L'OPERATEUR FLOTTANT
                                     < QUI ECRIT DANS LE MOT (C)-128 !!!
         WORD        LOC+128         < L=BASE DU LOCAL...
         IC          KIN             < COMPTAGE DES ENTREES :
         IF          MODE-VISU,XWOR%7,,XWOR%7
         JG          TW1             < CAS DES ALT-MODES...
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         JG          ALTM            < ABORT IMMEDIAT SUR ALT-MODE...
         LA          CDRET,W         < A=RELAI D'ACCES A ITEM1/ITEM2...
         CP          AI1             < SEUL ITEM1 EST AUTORISE...
         JNE         ALTM            < L'ITEM2 PROVOQUE UN ABORT...
         LA          MODCAL,W        < A=INDEX INITIAL DE L'ITEM1...
         LXI         0               < "GE" A PRIORI...
         TBT         0               < "GE" (0) OU "EI" (1) ???
         ADCR        X
         RBT         0
         STA         IEG
         LA          &NCALL
         STA         NPCALL          < NOM DU PROCESSEUR A APPELER SUR LA
                                     < RECEPTION D'UN ALT-MODE.
         LRM         A,B,X
         WORD        NOM             < A=ZONE A SAUVEGARDER,
         WORD        SITEM1          < B=ZONE DE SAUVEGARDE,
         WORD        LNOM/NOCMO      < X=NOMBRE DE MOTS.
         MOVE                        < SAUVEGARDE...
XWOR%7:  VAL         0
         LR          K,A             < CAS DE LA PREMIERE,
         STA         SAVEK           < SAUVEGARDE DE K...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LX          NMOTS           < X=NOMBRE DE MOTS A RAZER,
TW2:     EQU         $
         STZ         &AITEM2         < NETTOYAGE DE ITEM1 ET ITEM2...
         JDX         TW2
XWOR%7:  VAL         0
TW1:     EQU         $
         LRM         K
         WORD        STACK-1         < INITIALISATION DE K...
TW20:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMMCDA-ZERO
         BSR         APRINT          < EDITION DE "!CDA"...
XWOR%7:  VAL         0
         BSR         AIN             < ENTREE DU CHOIX ENTRE !CDAI ET !CDAP :
         CPI         "P"             < PRIVE ???
         JE          TW21            < OUI, OK...
         CPI         "I"             < IMAGE ???
         JNE         TW20            < NON, ERREUR...
TW21:    EQU         $
         STBY        &API            < MISE EN PLACE DE "P" OU "I"...
         LAI         AMCDAP-ZERO
         BSR         ACCI            < TENTATIVE DE !CDAP OU !CDAI,
         JNE         GOGE            < ET BIEN CELA NE MARCHE PAS...
         STZ         IMASKO          < MISE DU MASQUE OFF A PRIORI...
         LAD         DEMMEM
         SVC         0               < PASSAGE A 16 K...
         LAI         '18
         WORD        '1E15
         LR          B,X             < X=ORIGINE DE LA 'CDAP'/'CDAI',
         LAI         '19
         WORD        '1E15
         SBR         X,B
XWOR%1:  VAL         -4              < B=LONGUEUR UTILE DE LA 'CDAP'/'CDAI',
         LRM         A
         WORD        NCOOL+1*LIMAG>XWOR%1 < A=LONGUEUR IMAG+MASQUE NECESSAIRE.
         CPR         A,B             < CELA SUFFIT-IL ???
         JL          GOGE            < B<A : INSUFFISANT POUR TRAVAILLER...
         IF          NMPROC-NMTW,XWOR%,,XWOR%
<
< ENTREE DU MASQUE COURANT ???
<
TW3:     EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMIMA-ZERO
         BSR         APRINT          < EDITION DE "INIT MASK?"...
XWOR%7:  VAL         0
         BSR         AIN             < INITIALISATION DU MASQUE :
         CPI         "N"
         JE          TW4             < PAS D'INITIALISATION...
         CPI         "O"
         JNE         TW3             < ??!??!
<
< INITIALISATION SIMPLE DU MASQUE COURANT :
<
TW5:     EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMMAH-ZERO
         BSR         APRINT          < EDITION DE "MASK H="...
XWOR%7:  VAL         0
         LXI         0               < INDEX DU MASQUE HORIZONTAL,
TW6:     EQU         $
         BSR         AIHEX           < ENTREE DU H-MASQUE :
         JNE         TW5             < MAUVAIS, ON RECOMMENCE...
         STA         &ABUFMH         < OK, ON RANGE...
         ADRI        1,X
         LR          X,A
         CPI         LBUFMH
         JL          TW6             < AU SUIVANT...
TW7:     EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMMAV-ZERO
         BSR         APRINT          < EDITION DE "MASK V="...
XWOR%7:  VAL         0
         LXI         0               < INDEX DU MASQUE VERTICAL,
TW8:     EQU         $
         BSR         AIHEX           < ENTREE DU V-MASQUE :
         JNE         TW7             < MAUVAIS, ON RECOMMENCE...
         STA         &ABUFMV         < OK, ON RANGE...
         ADRI        1,X
         LR          X,A
         CPI         LBUFMV
         JL          TW8             < AU SUIVANT...
TW15:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMODM-ZERO
         BSR         APRINT          < EDITION DE "MODE="...
XWOR%7:  VAL         0
         BSR         AIN             < A=REPONSE ("A", "O", "E").
         LBI         3
         CPI         "O"
         JE          TW16            < .OR. : B=3...
         LBI         2
         CPI         "A"
         JE          TW16            < .AND. : B=2...
         CPI         "E"
         JNE         TW15            < ?!???!
         LBI         1               < .EOR. : B=1...
TW16:    EQU         $
         STB         XWORK           < SAUVEGARDE DE (B)...
         LYI         NLIGM1
         STY         YR              < YR=INDEX VERTICAL,
TW9:     EQU         $
         LXI         NPOLM1
         STX         XR              < XR=INDEX HORIZONTAL.
TW10:    EQU         $
         LYI         0
         LA          XR
         LBI         0
XWOR%1:  VAL         NBITMO=0
XWOR%2:  VAL         NBITMO-XWOR%1
         SCLD        XWOR%2          < B=NUMERO DE MOT DANS LA LIGNE
         SLRS        XWOR%2          < A=NUMERO DE BIT DANS LE MOT.
         LR          B,X             < X=NUMERO DE MOT DANS 'BUFMH'.
         LB          &ABUFMH
         LR          A,X             < X=NUMERO DE BIT DANS LE MOT,
         TBT         NBITMO,X        < 1 OU 0 ???
         ADCR        Y               < ON CUMULE LE BIT BUFMH(XR).
         LA          YR
         LBI         0
         SCLD        XWOR%2          < B=NUMERO DE MOT DANS LA COLONNE,
         SLRS        XWOR%2          < A=NUMERO DE BIT DANS LE MOT.
         LR          B,X             < X=NUMERO DE MOT DANS 'BUFMV',
         LB          &ABUFMV
         LR          A,X             < X=NUMERO DE BIT DANS LE MOT,
         TBT         NBITMO,X        < 1 OU 0 ???
         ADCR        Y               < ON CUMULE LE BIT BUFMV(YR).
         LB          XWORK           < NATURE DE L'OPERATION LOGIQUE...
         ANDR        B,Y             < FINALEMENT ON CALCULE :
                                     < Y=BUFMH(XR).OP.BUFMV(YR), OU .OP.
                                     < DESIGNE .OR. OU .AND. OU .EOR. ;
                                     < Y=0 SI LE BIT DOIT ETRE MIS A 0,
                                     < Y#0 (1 OU 2) SINON...
         LA          XR
         LBI         0
         SCLD        XWOR%2
         SLRS        XWOR%2
         LR          A,X             < X=NUMERO DE BIT DANS LE MOT,
         PSR         X,Y             < SAVE LE NUMERO DE BIT DANS LE
                                     < MOT ET LE CUMUL "EOR"...
         LY          YR
         XR          Y,B
         SLLD        NMOTL=0+NBITMO
         ORR         A,Y             < Y=NUMERO DE MOT DANS LE MASQUE,
         LRM         A
         WORD        AMASK           < A=ADRESSE DU MASQUE DANS 'CDA',
         ADR         Y,A             < A=ADRESSE DU MOT EN 'CDA'.
         LRM         B,X
         WORD        MCDAM           < B=ADRESSE DE RECEPTEUR,
         WORD        1               < X=1 MOT A DEPLACER.
         RCDA
         PLR         X,Y
         LB          MCDAM
         RBT         NBITMO,X        < A PRIORI, ON RAZE...
         CPZR        Y               < ALORS ???
         JE          TW11            < Y=0, XR.EOR.YR=0...
         SBT         NBITMO,X        < Y=1, XR.EOR.YR=1...
TW11:    EQU         $
         STB         MCDAM
         LRM         B,X
         WORD        MCDAM
         WORD        1
         WCDA
         DC          XR              < BALAYAGE HORIZONTAL,
         JGE         TW10
         DC          YR              < BALAYAGE VERTICAL,
         JGE         TW9
TW4:     EQU         $
XWOR%:   VAL         0
TW13:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMASKO-ZERO
         BSR         APRINT          < EDITION DE "MASK ON?"...
XWOR%7:  VAL         0
         BSR         AIN             < MASQUE ON OU OFF :
         STZ         IMASKO          < OFF A PRIORI...
         CPI         "N"
         JE          TW14            < OK, IMASKO=0 ==> OFF...
         IC          IMASKO          < A PRIORI, IMASKO=1 ==> ON...
         CPI         "O"
         JNE         TW13            < ?!??!??!
TW14:    EQU         $
         PAGE
<
<
<        B O U C L E   D ' I N T E R R O G A T I O N  :
<
<
LOOP:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMINT-ZERO
         BSR         APRINT          < ENVOI DU MESSAGE ">",
XWOR%7:  VAL         0
         BSR         AIN             < A=COMMANDE COURANTE...
         CPI         REP0            < ET VALIDATION...
         JL          TW12            < ERREUR...
         CPI         REPZ            < VALIDATION, SUITE...
         JG          TW12            < ERREUR...
         LR          A,X             < X=COMMANDE DEMANDEE,
         BR          &ACOM           < BRANCHEMENT AU MODULE SPECIFIQUE...
TW12:    EQU         $
         BR          AERROR          < ERREUR...
         PAGE
<
<
<        G E N E R A T I O N   E T   V A L I D A T I O N  :
<
<
XWOR%1:  VAL         PILE-LTNI-LTNI
XWOR%2:  VAL         $-ZERO
         IF          XWOR%2-XWOR%1,XWOR%,,
         IF          ATTENTION : TROP LONG !!!
XWOR%:   VAL         0
         DZS         XWOR%1-XWOR%2+1 < NETTOYAGE...
         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.