NMTZ:    VAL         "KD"
NMP:     VAL         " /"
         IF          NMPROC-NMTZ,,XWOR%,
         IF          NMPROC-NMP,,XWOR%,
         IF          ATTENTION : 'NMPROC' EST MAUVAIS !!!
XWOR%:   VAL         0
         IF          NMPROC-NMTZ,XWOR%9,,XWOR%9
         IDP         "KD - REMPLISSAGE RECURSIF D'UN CONTOUR"
XWOR%9:  VAL         0
         IF          NMPROC-NMP,XWOR%9,,XWOR%9
         IDP         " / - VERSION DE 'KD' INTERPRETATIVE"
XWOR%9:  VAL         0
         IDP         "RELEASE 31/05/1984"
         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
ITEM1:   EQU         ITEM2+LTNI
         EOT         #SIP IMAGE 256#
NBITMO:  VAL         16              < NOMBRE DE BITS PAR MOT.
NOCMO:   VAL         2               < NOMBRE D'OCTETS PAR MOT...
NBITOC:  VAL         NBITMO/NOCMO    < NOMBRE DE BITS PAR OCTET...
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
X20:     VAL         1024/DY         < NBRE DE LIGNES/IMAGE.
X21:     VAL         CNMPL*16        < NBRE DE POINTS/LIGNE.
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-NMP,XWOR%,,XWOR%
NMPROC:  VAL         NMTZ            < SI " 3", ON LE REMPLACE PAR "T3",
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
TV1::    VAL         0               < ADRESSE DE LA MEMOIRE DE VISUALISATION
                                     < EN 'CDAI'.
         IF          TV1-0,,XWOR%,
         IF          TV1 DOIT ETRE NUL, SINON, DE NOMBREUSES
         IF          SEQUENCES DE CODE SONT MAUVAISES !!!
XWOR%:   VAL         0
AMASK::  VAL         NCOOL*LIMAG+TV1 < ADRESSE DU MASQUE DANS LA 'CDA'.
IZBUF::  VAL         AMASK+LIMAG     < DEBUT DU BLOC COURANT DU Z-BUFFER DANS
                                     < LA 'CDA' QUAND ON EST EN '!CDAI'...
LIZBUF:: VAL         '1000           < LE Z-BUFFER EST DECOUPE EN BLOCS DE
                                     < 4K MOTS,
NZBUF::  VAL         16              < CE QUI FAIT DONC 16 BLOCS...
XWOR%1:  VAL         1024
XWOR%2:  VAL         LIZBUF/XWOR%1*NZBUF
XWOR%3:  VAL         LIMAG/XWOR%1*NBITMO
         IF          XWOR%3-XWOR%2,,XWOR%,
         IF          ATTENTION : LIZBUF ET NZBUF INCOMPATIBLES !!!
XWOR%:   VAL         0
LSDKU::  VAL         128
NSDKU::  VAL         LIZBUF/LSDKU    < INCREMENT DE PASSAGE D'UN BLOC DU
                                     < Z-BUFFER AU SUIVANT SUR 'DKU'...
TV2::    VAL         IZBUF+LIZBUF    < ADRESSE DE LA DEUXIEME IMAGE SCRATCH
                                     < UTILISEE EN PARTICULIER POUR LA MODU-
                                     < LATION D'AMPLITUDE SUR LA NORMALE.
LNOMP:   VAL         LNOM-1          < LONGUEUR UTILE DU NOM (A CAUSE DE
                                     < L'EOT A PRIORI...
<
< PILE VIRTUELLE DE RECURSIVITE :
<
SSTACK:: VAL         NCOOL*LIMAG+TV2 < ELLE OCCUPE UNE BONNE PARTIE DE 'CDAI'...
         PROG
         PAGE
<
<
<        M E S S A G E S  :
<
<
MMCDA:   BYTE        5;'6D
MCDAI:   ASCI        "!CDA"
         BYTE        "I";EOT
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="
MNIVO:   BYTE        5;'6D
         ASCI        "NIV="
MK:      BYTE        3;'6D
         ASCI        "K="
MASKO:   BYTE        9;'6D
         ASCI        "MASK ON?"
MSLAS:   BYTE        1;"/"
MCT:     BYTE        1;"="
MN:      BYTE        6;'6D
         ASCI        "#PTS="
MP:      BYTE        5;'6D
         ASCI        "PAS="
MT:      BYTE        6;'6D
         ASCI        "MODE="
M10:     BYTE        5;'6D
         ASCI        "RDN="
M11:     EQU         MSLAS
MBORD:   BYTE        6;'6D
         ASCI        "BORD="
MCOLOR:  BYTE        9;'6D
         ASCI        "COULEUR="
MFOND:   BYTE        6;'6D
         ASCI        "FOND="
MTOPO:   BYTE        8;'6D
         ASCI        "CONNEX="
XWOR%7:  VAL         0
<
< ZONE EN RECOUVREMENT :
<
BUFIN:   EQU         ITEM2+'518      < 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         30
STACK:   EQU         BUFMV+LBUFMV    < PILE DE TRAVAIL.
         IF          ITEM1-STACK-LSTACK,,,XWOR%
         IF          ATTENTION : LA ZONE EN RECOUVREMENT DE
         IF          L'ITEM2, RECOUVRE AUSSI L'ITEM1 !!!
XWOR%:   VAL         0
         PAGE
<
<
<        C O M M O N  :
<
<
         COMMON
COMON:   WORD        0               < MOT RESERVE POUR LE BLOC FLOTTANT.
<
< 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
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
IMASKO:  WORD        0               < 0 : MASK OFF,
                                     < 1 : MASK ON...
<
< DONNEES DE GESTION DU MASQUE :
<
AEMETT:  WORD        0               < ADRESSE DE L'EMETTEUR,
ARECEP:  WORD        0               < ADRESSE DU RECEPTEUR.
         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...
AI1:     WORD        ITEM1+LTN,X     < RELAI D'ACCES A L'ITEM1.
ABUFC:   WORD        0               < RELAI D'ACCES AU BUFFER COURANT.
XWOR%7:  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="
AMNIVO:  EQU         MNIVO           < "NIVEAUX="
AMASKO:  EQU         MASKO           < "MASK ON?"
AMSLAS:  EQU         MSLAS           < "/"
AMK:     EQU         MK              < "K="
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.
AMCDAI:  EQU         MCDAI           < !CDAI.
AMMCDA:  EQU         MMCDA           < !CDA.
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...
         IF          MODE-VISU,XWOR%7,,XWOR%7
APRINT:  WORD        PRINT           < EDITION D'UN MESSAGE.
XWOR%7:  VAL         0
AENTER:  WORD        ENTER           < ENTREE DE QUELQUE CHOSE SUR LA VISU...
AIN:     WORD        IN              < ENTREE D'UN CARACTERE,
AIHEX:   WORD        IHEX            < ENTREE DE 4 CHIFFRES HEXA-DECIMAUX,
         IF          MODE-VISU,XWOR%7,,XWOR%7
APIN:    WORD        PIN             < EDITION MESSAGE+ENTREE 1 CARACTERE.
APIHEX:  WORD        PIHEX           < EDITION MESSAGE+ENTREE 4 CHIFFRES.
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
APIN:    EQU         AIN
APIHEX:  EQU         AIHEX
XWOR%7:  VAL         0
AIFLOT:  WORD        IFLOT           < ENTREE D'UNE CONSTANTE FLOTTANTE.
AHEX:    WORD        HEX             < CONVERSION DE 4 CHIFFRES HEXAS EN BINAIRE
ACCI:    WORD        CCI             < ACCES AU CCI.
AGOSGN:  WORD        GOSGN           < POUR ACCEDER AU SGN...
APMOV5:  WORD        PMOV5           < TV R --> RESIDENT,
APMOV6:  WORD        PMOV6           < TV V --> RESIDENT,
APMOV7:  WORD        PMOV7           < TV B --> RESIDENT.
ALOOP:   WORD        LOOP            < BOUCLE DE L'INTERROGATION.
         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
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        MERR-ZERO*NOCMO+1
         WORD        1               < MESSAGE D'ERREUR POUR " P"...
DEMMEM:  WORD        4               < DEMANDE DE 16 K MOTS...
RELMEM:  WORD        4               < RETOUR A 4K MOTS...
         WORD        '8000
         WORD        '2000
DEMCC:   WORD        2               < ACCES AU CCI INTERPRETATIF.
         WORD        0               < ADRESSE DE LA CARTE.
         WORD        80
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...
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
DEMLOD:  BYTE        '80?SGNLNS;'02  < DEMANDE DE CHARGEMENT DE "GE".
         WORD        BRANCH-ZERO*NOCMO
         WORD        ZERO-BRANCH+PILE-LTNI-LTNI*NOCMO
         WORD        -1
         IF          MODE-ITEM,XWOR%7,,XWOR%7
SITEM1:  DZS         LNOM/NOCMO      < POUR SAUVEGARDER LA FIN DE L'ITEM1.
XWOR%7:  VAL         0
<
< CONSTANTES UTILES :
<
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.
ORGX:    WORD        0               < ORIGINE EN X DE L'IMAGE SCRATCH
                                     < PAR RAPPORT A L'IMAGE RESIDENTE,
ORGY:    WORD        0               < DE MEME, ORIGINE EN Y...
<
< POUR ACCEDER AUX IMAGES :
<
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:   EQU         SAVER           < SAUVEGARDE D'UN MOT DE LA TRAME
                                     < SCRATCH ROUGE,
MCDAV:   EQU         SAVEV           < DE MEME POUR LE VERT,
MCDAB:   EQU         SAVEB           < DE MEME POUR LE BLEU.
XCTCDA:  WORD        0
CTCDA:   WORD        TV2-TV1         < POUR ATTEINDRE 'TV2'...
MODX:    WORD        1               < 0 : "TORE" SUR LES X,
                                     < 1 : L'IMAGE SCRATCH NE SE REFERME PAS...
MODY:    WORD        1               < DE MEME SUR L'AXE DES Y.
WORK1:   WORD        0               < VARIABLE DE TRAVAIL...
FWORK:   FLOAT       0               < VARIABLE DE TRAVAIL...
MCDAM:   WORD        0               < MOT COURANT DE LA 'CDA'.
AIMAGR:  WORD        IMAGR,X         < RELAI TRAME ROUGE,
AIMAGV:  WORD        IMAGV,X         < RELAI TRAME VERTE,
AIMAGB:  WORD        IMAGB,X         < RELAI TRAME BLEUE.
<
< RELAIS :
<
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
<
< SOUS-PROGRAMMES SPECIFIQUES :
<
AROND:   WORD        ROND            < ARRONDI FLOTTANT ET CONVERSION ENTIERE.
<
< DONNEES D'ARRONDI :
<
F05:     FLOAT       0.5
<
< DONNEES POUR LA FONCTION :
<
FK:      FLOAT       1
F0:      FLOAT       0
<
< DONNEES D'ACCES AU CURSEUR :
<
CURSOR:  BYTE        "N";0           < CARACTERE DE DEBLOCAGE DU
                                     < CURSEUR (ERREUR A PRIORI).
         DZS         2               < COORDONNEES Y ET X.
NLIN:    WORD        1024/DY-1       < NBRE DE LIGNES/IMAGE-1.
X:       VAL         1               < COORDONNEE X D'UN POINT.
Y:       VAL         0               < COORDONNEE Y D'UN POINT.
C3:      WORD        3               < POUR MULTIPLIER
C4:      WORD        4               <                 PAR 4/3...
         IF          MODE-VISU,XWOR%7,,XWOR%7
OG:      WORD        '0103           < OPEN GRAPHIQUE DE '01.
CU:      WORD        '0106           < MISE EN FONCTION DU CURSEUR
         WORD        0               < GRAPHIQUE DE '01 (AMDEM=0).
LCU:     WORD        '0109           < LECTURE CURSEUR GRAPHIQUE
         WORD        CURSOR-ZERO*2   < DE '01.
         WORD        6
CG:      WORD        '0104           < CLOSE GRAPHIQUE DE '01.
XWOR%7:  VAL         0
STABIL:  WORD        '8A01           < DEMANDE DE STABILISATION VIDEO.
         WORD        IMAG-ZERO*2
         WORD        LIMAG*2
         WORD        TVPR            < SUR LE PROCESSEUR ROUGE.
ACLIGN:  WORD        CLIGN           < CLIGNOTEMENT D'UN POINT VIDEO...
         IF          MODE-ITEM,XWOR%7,,XWOR%7
ACOORD:  WORD        COORD           < ENTREE D'UNE COORDONNEE 'X' OU 'Y'.
XWOR%7:  VAL         0
<
< DONNEES POUR LE GENERATEUR ALEATOIRE :
<
MRDN:    WORD        0               < MULTIPLICATEUR DU NOMBRE ALEATOIRE,
XRDN:    WORD        0               < ET DECOMPTEUR DE 'MRDN'...
SECRDN:  WORD        0               < POUR ATTEINDRE LES SECONDES...
RDN7:    WORD        793             < DECOMPTEUR D'ACCES A LA SECONDE,
RDN8:    WORD        1               < VALEUR COURANTE DE 'RDN7'.
RDN9:    WORD        0               < SECONDE COURANTE...
DRDN:    WORD        0               < DIVISEUR DU NOMBRE ALEATOIRE...
F1:      FLOAT       1
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RDN1:    WORD        5189            < CONSTANTE
RDN2:    WORD        6791            < DE CALCUL DES
RDN3::   VAL         19              < NOMBRE ALEATOIRES...
RDN4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RDN5:    WORD        4021
RDN6::   VAL         23
POINTS:  WORD        16807
KRDN1:   WORD        0
XKRDN1:: VAL         3               < INCREMENTEUR DE 'KRDN1'.
KRDN2:   WORD        0
XKRDN2:: VAL         7               < DECOMPTEUR DE 'KRDN2'.
ARDN:    WORD        SPRDN           < GENERATEUR DE NOMBRES ALEATOIRES.
<
< REMPLISSAGE :
<
AREMP:   WORD        REMP            < SOUS-PROGRAMME RECURSIF DE REMPLISSAGE.
NCOLOR:  WORD        NIVMAX          < DEFINITION DU NIVEAU DE REMPLISSAGE.
SCOLOR:  WORD        0               < NIVEAU D'UN POINT DE DEPART DE COULEUR
                                     < DONNEE.
IMASKD:  WORD        0               < =0 : LE CHOIX DU POINT DE DEPART DANS LES
                                     <      COMMANDES "R""0...7" EST MASQUABLE,
                                     < #1 : CE CHOIX N'EST PAS MASQUABLE...
XWOR%1:  VAL         0               < INITIALISATION DE LA LISTE DES NIVEAUX,
XWOR%2:  VAL         -1              < POUR DECALER A DROITE...
XWOR%3:  VAL         '8000           < POUR MARQUER LE PREMIER BIT ET DONNE LE
                                     < NIVEAU DU NOIR...
         DO          NIVMAX+1
XWOR%1:  VAL         XWOR%1>XWOR%2?XWOR%3
LNIVI:   WORD        XWOR%1)MFFFF    < LISTE MAXIMALE DES NIVEAUX CONSTITUANT
                                     < LE FOND OU LE BORD INVERSE (POUR LES
                                     < TESTS DE VALIDATION...).
NFOND:   WORD        XWOR%3          < LISTE DES NIVEAUX CONSTITUANT LE FOND
                                     < COURANT (INITIALISE SUR LE NOIR...).
XWOR%1:  VAL         XWOR%3
         DO          NIVMAX
XWOR%1:  VAL         XWOR%1>XWOR%2
NBORD:   WORD        XWOR%1          < LISTE DES NIVEAUX CONSTITUANT LE BORD
                                     < COURANT (INITIALISE SUR LE BLANC...).
NREMP::  VAL         4+4             < ON RECONNAIT JUSQU'A LA 8-CONNEXITE...
AINCX:   WORD        INCX,X          < LISTE DES INCREMENTS DE 'X' :
INCX:    EQU         $
         WORD        0;-1;0;0;+1;+1;0;0;-1
         IF          $-INCX-1-NREMP,,XEIF%,
         IF          ATTENTION : LA LONGUEUR DE 'INCX' EST MAUVAISE !!!
XEIF%:   VAL         0
AINCY:   WORD        INCY,X          < LISTE DES INCREMENTS DE 'Y' :
INCY:    EQU         $
         WORD        -1;0;+1;+1;0;0;-1;-1;+1
         IF          $-INCY-1-NREMP,,XEIF%,
         IF          ATTENTION : LA LONGUEUR DE 'INCY' EST MAUVAISE !!!
XEIF%:   VAL         0
XWOR%1:  VAL         0               < INITIALISATION DU CUMUL,
XWOR%2:  VAL         -1              < POUR UN DECALAGE A DROITE,
XWOR%3:  VAL         '8000           < POUR MARQUER LE PREMIER BIT.
         DO          NREMP
XWOR%1:  VAL         XWOR%1>XWOR%2?XWOR%3
XWOR%4:  VAL         'AAAA           < AFIN D'INITIALISER SUR LA 4-CONNEXION...
LVALXY:  WORD        XWOR%1(XWOR%4   < ON S'INITIALISE SUR LA 8-CONNEXITE, LE
                                     < NEUVIEME BIT (A 0) PERMETTANT LE RETOUR
                                     < AU POINT DE DEPART...
IVALXY:  WORD        XWOR%1)MFFFF    < POUR VALIDER 'LVALXY'...
<
< GESTION DE LA PILE VIRTUELLE :
<
KSSTAC:  WORD        0               < POINTEUR DE LA PILE VIRTUELLE,
ASSTAC:  WORD        SSTACK          < ADRESSE EN 'CDAI' DE LA PILE VIRTUELLE.
MSSTAC:  WORD        0               < MOT COURANT DE LA PILE VIRTUELLE,
AMSSTA:  WORD        MSSTAC          < ET SON ADRESSE...
ASPSTA:  WORD        SPSTAC          < SOUS-PROGRAMME DE SIMULATION DES
                                     < EMPILEMENTS.
<
< DONNEES DE PARCOURS
< DES SPIRALES :
<
ASPIR:   WORD        SPIR            < MODULE DE CALCUL DU NIVEAU PONDERE
                                     < DU POINT COURANT (XR,YR).
PASQ:    WORD        0               < PAS DE PARCOURS DE LA SPIRALE.
DELTAX:  WORD        0
DELTAY:  WORD        0
LB:      WORD        0               < LONGUEUR DES
LB0:     WORD        0               <              BRANCHES DE LA SPIRALE.
MODET:   WORD        0               < QUE FAIRE LORS DE LA SORTIE HORS DE
                                     < L'INTERVALLE (0,NIVMAX) :
                                     < -1 : NIVEAUX<0 --> NOIR,
                                     <      NIVEAUX>NIVMAX --> NOIR,
                                     < 0  : NIVEAUX CALCULES MODULO NIVMAX+1,
                                     < +1 : NIVEAUX<0 --> NOIR,
                                     <      NIVEAUX>NIVMAX --> NIVMAX.
NP0::    VAL         1               < NOMBRE DE POINTS INITIAL D'UNE SPIRALE.
NPM:     WORD        NP0             < NOMBRE ENTIER DE POINTS D'UNE SPIRALE,
FNP:     FLOAT       <NP0<0<0        < IDEM EN FLOTTANT...
NP:      WORD        0               < NOMBRE DE POINTS COURANT D'UNE SPIRALE,
                                     < VA DE 1 A (NPM).
DCUMUL:  EQU         FK              < NORMALISATEUR DU CUMUL.
CUMUL:   FLOAT       0               < CUMUL SUR UNE SPIRALE : ON LE CALCULE
                                     < PAR :
                                     < SIGMA(CT(X)*NIVEAU(X)).
NCT::    VAL         '09             < NOMBRE DE CONSTANTES DE TRAVAIL.
ACT:     WORD        CT,X            < ACCES AUX CONSTANTES DE TRAVAIL.
CT:      EQU         $
         DO          NCT
         FLOAT       1
         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
AERROR:  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        STV2            < 8 : TV2 <-- RESIDENT R+V+B
         WORD        GTV2            < 9 : RESIDENT <-- TV2 R+V+B
         WORD        ERROR           < :
         WORD        ERROR           < ;
         WORD        ERROR           < <
         WORD        DSPIR           < = : DEFINITION DES SPIRALES
         WORD        ERROR           < >
         WORD        TRAME           < ? : ENTREE DE LA TRAME "ALEATOIRE"
         WORD        ERROR           < @
         WORD        GCT             < A : ENTREE DES CONSTANTES DE TRAVAIL
         WORD        BORD            < B : ENTREE DU "BORD" DU CONTOUR
         WORD        COLOR           < C : ENTREE DE LA "COULEUR" DE REMPLISSAGE
         WORD        DISP            < D : RESIDENT <-- IMAGE SGN
         WORD        ERROR           < E
         WORD        GOGE            < F : FIN
         WORD        FOND            < G : ENTREE DU FOND OU "GROUND"
         WORD        ERROR           < H
         WORD        ERROR           < I
         WORD        ERROR           < J
         WORD        INFK            < K : ENTREE CTTE TRANSFORMATION
         WORD        ERROR           < L
         WORD        PMASKD          < M : BASCULE DE 'IMASKD'.
         WORD        NAME            < N : NOMME L'IMAGE RESIDENTE
         WORD        ERROR           < O
         WORD        ERROR           < P
         WORD        ERROR           < Q
         WORD        CONTO           < R : REMPLISSAGE
         WORD        ERROR           < S
         WORD        TOPOLO          < T : ENTREE DES CONNEXITES
         WORD        ERROR           < U
         WORD        ERROR           < V
         WORD        GOCCI           < W : RETOUR TEMPORAIRE AU CCI
         WORD        ERROR           < X
         WORD        ERROR           < Y
         WORD        ERROR           < Z
REPZ:    VAL         $-KOM-1         < DERNIERE COMMANDE.
         PAGE
         PROG
         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 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
<
<
<        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...
         LX          NMOTS           < X=NOMBRE DE MOTS A RAZER...
TW2:     EQU         $
         STZ         &AITEM2         < RAZE DES ITEMS 1 ET 2.
         JDX         TW2
         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
<
<        NOTA IMPORTANT :
<                      ON NE REVIENT PLUS A
<                    "!CDA" A CAUSE DE 'PSIMUL'
<                    AFIN QU'IL CONSERVE LA
<                    'CDAG'...
<
GOGE1:   EQU         $
         LAD         DEMLOD
         BSR         AOVL            < ET TENTATIVE DE CHARGEMENT...
         QUIT        1               < 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
         WORD        COMON+128       < C=BASE DU COMMON...
         STZ         XCTCDA          < AU CAS OU UN MALHEUREUX ALT-MODE...
                                     < INUTILE EN FAIT ICI...
         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...
TW1:     EQU         $
         LRM         K
         WORD        STACK-1         < INITIALISATION DE K...
TW20:    EQU         $
         LAI         AMCDAI-ZERO
         BSR         ACCI            < ENVOI DE !CDAI...
         JNE         GOGE            < ET BIEN CELA NE MARCHE PAS...
         STZ         IMASKO          < MISE DU MASQUE OFF A PRIORI...
         LAI         NSPDAT
         SBT         0
         ACTD        1               < B=ADRESSE DE LA DATE,
         ADRI        5,B
         STB         SECRDN          < ADRESSE DES SECONDES...
         LAD         DEMMEM
         SVC         0               < PASSAGE A 16 K...
         LAI         '18
         WORD        '1E15
         LR          B,X             < X=ORIGINE DE LA 'CDAI'.
         LAI         '19
         WORD        '1E15
         SBR         X,B
XWOR%1:  VAL         -4              < B=LONGUEUR UTILE DE LA 'CDAP'/'CDAI',
         LRM         A
         WORD        IZBUF-TV1>XWOR%1 < A=LONGUEUR NECESSAIRE (IMAGE+MASQUE),
         CPR         A,B             < CELA SUFFIT-IL ???
         JL          GOGE            < B<A : INSUFFISANT POUR TRAVAILLER...
TW13:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMASKO-ZERO
XWOR%7:  VAL         0
         BSR         APIN
         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         $
         LRM         W
         WORD        IMAG            < W=BASE DE L'IMAGE ROUGE...
         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
XWOR%7:  VAL         0
         BSR         APIN            < ENTREE DE LA COMMANDE...
         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         $
<
<
<        T R A I T E M E N T   D E S   E R R E U R S  :
<
<
ERROR:   EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMERR-ZERO
         BSR         APRINT          < ENVOI D'UN MESSAGE D'ERREUR...
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         LAD         DEMOUT
         SVC         0               < EDITION DU MESSAGE D'ERREUR...
XWOR%7:  VAL         0
         BR          ALOOP           < ET C'EST TOUT...
         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.
         AD          XCTCDA          < POUR PERMETTRE UN ACCES A TV1/TV2...
         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'...
         AD          XCTCDA          < POUR ATTEINDRE TV1/TV2...
         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
<
<
<        C L I G N O T E M E N T   D ' U N   P O I N T  :
<
<
<        ARGUMENT :
<                    (X,Y)=POINT COURANT.
<
<
CLIGN:   EQU         $
         PSR         A,B,X,Y
         STX         XR              < ON SE PLACE
         STY         YR
         STX         XS
         STY         YS              <             AU POINT COURANT...
         BSR         ASPGPS          < (A)=NIVEAU(X,Y)...
         PSR         A               < AND SAVE IT...
         LXI         4               < (X)=NOMBRE DE CLIGNOTEMENTS...
CLIGN1:  EQU         $
         PSR         X
         LAI         NIVMAX          < ON AFFICHE UN POINT BLANC,
         BSR         ASPRPS          < ET ON VISUALISE...
         LXI         0
CLIGN2:  EQU         $
         HALT                        < ON ATTEND UN PEU...
         CPZR        X
         JNE         CLIGN2
         LAI         NIVMAX)NIVMAX   < ON AFFICHE UN POINT NOIR,
         BSR         ASPRPS          < ET ON VISUALISE...
         LXI         0
CLIGN3:  EQU         $
         HALT                        < ET ON ATTEND UN PEU...
         CPZR        X
         JNE         CLIGN3
         PLR         X
         JDX         CLIGN1          < ET ON RECOMMENCE...
         PLR         A
         BSR         ASPRPS          < PUIS ON RESTAURE LE POINT COURANT...
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        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
<
<
<        G E N E R A T E U R   A L E A T O I R E  :
<
<
<        ARGUMENT :
<                    (X,Y)=COORDONNEES X ET Y DU POINT COURANT...
<
<
SPRDN:   EQU         $
         PSR         B
         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         $
         EORR        X,A
         EOR         XRDN
         STA         RDN
         DC          RDN8
         LA          RDN9            < A=RDN9 A PRIORI...
         JNE         SPRDN1          < ET BIEN OUI... CE N'EST PAS L'HEURE...
         LA          RDN7            < C'EST L'HEURE D'ALLER CHERCHER
         STA         RDN8            < LA SECONDE COURANTE ??!?!??!
         LA          SECRDN
         ACTD        1               < B=SECONDE COURANTE,
         LR          B,A
         STA         RDN9            < ET MEMORISATION...
SPRDN1:  EQU         $
         EOR         RDN
         STA         RDN
         LA          RDN4            < CALCUL D'UN 2EME NOMBRE ALEATOIRE...
         MP          RDN5
         EOR         POINTS
         SCRD        RDN6
         JANE        SPMOYF
         LR          B,A
         JANE        SPMOYF
         LA          KRDN2
         ADRI        -XKRDN2,A
         SCRS        XKRDN1
         STA         KRDN2           < PROGRESSION DE 'KRDN2'...
SPMOYF:  EQU         $
         EORR        Y,A
         STA         RDN4
         EOR         RDN
         PLR         B
         RSR
         PAGE
         PAGE
<
<
<        A C C E S   A U   C C I  :
<
<
GOCCI:   EQU         $
         QUIT        1               < ACCES AU CCI INTERACTIF...
         BR          ALOOP
         PAGE
<
<
<        E N T R E E   D ' U N   C A R A C T E R E  :
<
<
<        ARGUMENT :
<                    A=ADRESSE D'UN MESSAGE SI 'PIN'...
<
<
<        RESULTAT :
<                    A=CARACTERE ENTRE.
<
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
PIN:     EQU         $
         BSR         APRINT
XWOR%7:  VAL         0
IN:      EQU         $
         LAD         DEMIN
         BSR         AENTER
         LBY         &AREP           < A=CARACTERE REPONSE.
         RSR
         PAGE
<
<
<        E N T R E E   D ' U N   N O M B R E   H E X A D E C I M A L
<                    E T   C O N V E R S I O N  :
<
<
<        ARGUMENT :
<                    A=ADRESSE D'UN MESSAGE SI 'PIHEX'...
<
<
<        RESULTAT :
<                    VOIR 'HEX'...
<
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
PIHEX:   EQU         $
         BSR         APRINT
XWOR%7:  VAL         0
IHEX:    EQU         $
         LAD         DEMHEX
         BSR         AENTER
         BSR         AHEX            < A=NOMBRE HEXADECIMAL, ET CODES CONDITION.
         RSR
         PAGE
<
<
<        E N T R E E   D E   L A   C O N S T A N T E   ' K '
<
<
INFK:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMK-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT          < ENTREE DE FK...
         JE          INFK            < 'K' DOIT ETRE NON NULLE...
         FST         FK              < OK...
         BR          ALOOP
         PAGE
<
<
<        M O U V E M E N T S   R E S I D E N T  <-->  T V  :
<
<
DEMTV:   WORD        TVDKU           < DEMANDE D'ENVOI D'UNE IMAGE DE 'TV'
                                     < EN MODE ENTRELACE ; CETTE DEMANDE EST
                                     < MISE ICI, ET NON PAS EN BAS, CAR IL
                                     < N'Y A PAS DE PLACE DANS LA RACINE DE
                                     < L'OVERLAY !!!
         WORD        IMAGE-ZERO*NOCMO
         WORD        LIMAG*NOCMO*NCOOL
         WORD        0
MOV0:    EQU         $               < RESIDENT R+V+B --> TV.
         LRM         A
         WORD        DEMTV
         JMP         MOVX            < VERS L'ENVOI DE L'IMAGE...
MOV3:    EQU         $               < RESIDENT B --> TV.
         LAD         DEMTVB
MOVX:    EQU         $
         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
<
<
<        A C C E S   A   T V 2  :
<
<
STV2:    EQU         $
         LRM         A,B,X
         WORD        TV2
         WORD        IMAGE
         WORD        LIMAG*NCOOL
         WCDA
         BR          ALOOP
GTV2:    EQU         $
         LRM         A,B,X
         WORD        TV2
         WORD        IMAGE
         WORD        LIMAG*NCOOL
         RCDA
         BR          ALOOP
         PAGE
<
<
<        E N T R E E   D ' U N E   C O N S T A N T E   F L O T T A N T E  :
<
<
<        ARGUMENT :
<                    A=ADRESSE D'UN MESSAGE EN MODE 'VISU'.
<
<
<        RESULTAT :
<                    A,B=CONSTANTE FLOTTANTE.
<                    INDICATEURS POSITIONNES PAR 'FCAZ'.
<
<
IFLOT:   EQU         $
         PSR         X,Y
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LR          A,X             < X=SAUVEGARDE DE L'ADRESSE MESSAGE.
IFLOT1:  EQU         $
         LR          X,A             < A=ADRESSE DU MESSAGE A EDITER...
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
IFLOT1:  EQU         $
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DU NUMERATEUR,
         JNE         IFLOT1          < ERREUR...
         LR          A,Y             < Y=NUMERATEUR.
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMSLAS-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DU DENOMINATEUR,
         JNE         IFLOT1          < ERREUR...
         JAE         IFLOT1          < IL NE PEUT ETRE NUL !!!
         FLT
         FST         FWORK           < DENOMINATEUR,
         LR          Y,A
         FLT                         < NUMERATEUR,
         FDV         FWORK           < RESULTAT=NUMERATEUR/DENOMINATEUR.
         FCAZ                        < ????
         PLR         X,Y
         RSR
         PAGE
<
<
<        E N T R E E   U N E   C O O R D O N N E E  :
<
<
<        ARGUMENT :
<                    A=@MESSAGE A EMETTRE.
<
<
<        RESULTAT :
<                    A=COORDONNEE (X OU Y).
<
<
COORD1:  EQU         $               < RETOUR EN ERREUR.
         LR          B,A             < RESTAURE A=@MESSAGE.
COORD:   EQU         $
         PSR         X,Y
         LR          A,B             < SAVE B=@MESSAGE.
         BSR         APIHEX          < ENTREE D'UNE COORDONNEE...
         PLR         X,Y
         JNE         COORD1          < ERREUR : ON RECOMMENCE.
         JAL         COORD1          < COORDONNEE<0 : ERREUR..
         CPI         X20-1           < DEBORDEMENT : ERREUR...
         JG          COORD1          < ERREUR...
         RSR                         < OK, (A)=VALEUR HEXA.
         PAGE
         IF          MODE-VISU,XWOR%7,,XWOR%7
<
<
<        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,W
         LR          A,W
         ADR         A,A
         ADRI        1,A             < CALCUL DE L'ADRESSE OCTET DU MESSAGE.
         STA         DEMOUT+1
         LBY         0,W             < ACCES A LA LONGUEUR...
         STA         DEMOUT+2
         LAD         DEMOUT
         SVC         0               < ENVOI DU MESSAGE...
         PLR         A,X,W
         RSR
XWOR%7:  VAL         0
         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 : ETOUR 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
<
<
<        B A S C U L E   D E   ' I M A S K D '  :
<
<
PMASKD:  EQU         $
         LA          IMASKD
         IBT         NBITMO-1
         STA         IMASKD          < ET VOILA LA BASCULE...
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        E N T R E E   D ' U N E   C O N S T A N T E
<                    D E   T R A V A I L  :
<
<
GCT:     EQU         $
         BSR         AIHEX           < ENTREE DU NUMERO :
         JNE         GCT             < ERREUR...
         JAL         GCT             < ERREUR...
         CPI         NCT
         JGE         GCT             < ERREUR...
         ADR         A,A
         LR          A,X             < X=INDEX DOUBLE-MOT DE LA CONSTANTE...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         MCT-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT          < ENTREE DE LA CONSTANTE...
         FST         &ACT            < ET MEMORISATION...
         BR          ALOOP
         PAGE
<
<
<        D E F I N I T I O N   D E   L A   S P I R A L E  :
<
<
DSPIR:   EQU         $
<
< NOMBRE DE POINTS :
<
DSPIR1:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         MN-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE D'UN NOMBRE HEXA-DECIMAL :
         JNE         DSPIR1          < ERREUR DE SYNTAXE...
         JALE        DSPIR1          < ERREUR...
         CPI         NCT
         JG          DSPIR1          < ERREUR...
         STA         NPM             < OK, ON LE MEMORISE EN ENTIER,
         FLT
         FST         FNP             < ET EN FLOTTANT...
<
< PAS DE PARCOURS :
<
DSPIR2:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         MP-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE D'UN NOMBRE HEXA-DECIMAL :
         JNE         DSPIR2          < ERREUR DE SYNTAXE...
         JALE        DSPIR2          < ERREUR...
         STA         PASQ            < TOUT NOMBRE POSITIF EST ACCEPTE...
<
< "MODE DE TRACE" :
<
DSPIR3:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         MT-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE D'UN NOMBRE HEXA-DECIMAL :
         JNE         DSPIR3          < ERREUR DE SYNTAXE...
         CPI         1               < ET VALIDATION...
         JE          DSPIR4          < OK...
         CPI         -1
         JE          DSPIR4          < OK...
         JANE        DSPIR3          < ERREUR...
DSPIR4:  EQU         $
         STA         MODET           < OK (-1,0,+1)...
<
< FIN DE DEFINITION DE LA SPIRALE :
<
         BR          ALOOP           < VERS LA BOUCLE DE L'INTERPRETEUR.
         PAGE
<
<
<        E N T R E E   D U   T R A M A G E  :
<
<
TRAME:   EQU         $
ERDN1:   EQU         $
         STZ         DRDN
         STZ         MRDN            < PAS D'ALEATOIRE A PRIORI...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         M10-ZERO
         BSR         APRINT          < EDITION DU MESSAGE...
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 4 CHIFFRES HEXAS ET CONVERSION.
         JNE         ERDN1           < ERREUR...
         JAE         ERDN6           < PAS D'ALEATOIRE... (MRDN=DRDN=0)
         STA         MRDN            < MULTIPLICATEUR,
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         M11-ZERO
         BSR         APRINT          < EDITION DU MESSAGE...
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 4 CHIFFRES HEXAS ET CONVERSION.
         JNE         ERDN1           < ERREUR...
         STA         DRDN            < ET DIVISEUR :
                                     < ON RENTRE UN NOMBRE COMPRIS ENTRE
                                     < 1 ET 255 ; LORSQUE LE NOMBRE ALEATOIRE
                                     < CALCULE EST DIVISIBLE PAR 'DRDN', ON
                                     < TRACE LE POINT COURANT PAR 'SETV' ;
                                     < LORSQUE DRDN=1, TOUS LES POINTS SONT
                                     < TRACES...
         CP          MRDN
         JL          ERDN1           < IL FAUT M<=D...
ERDN6:   EQU         $
                                     < NOTA : DRDN=0 EQUIVAUT A DRDN=1...
         BR          ALOOP           < ET VERS L'INTERPRETEUR...
         PAGE
<
<
<        D E F I N I T I O N   D U   B O R D  :
<
<
BORD:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         MBORD-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 4 CHIFFRES HEXAS ET CONVERSION.
         JNE         BORD            < ERREUR DE SYNTAXE...
         JAE         BORD            < ERREUR : IL FAUT AU MOINS UN NIVEAU...
         LB          LNIVI           < ACCES A LA LISTE MAXIMALE INVERSEE,
         ANDR        A,B
         CPZR        B               < Y-A-T'IL DES NIVEAUX INEXISTANTS ???
         JNE         BORD            < OUI, ERREUR...
         STA         NBORD           < ET MEMORISATION DE LA LISTE...
         BR          ALOOP           < VERS LA BOUCLE DE L'INTERPRETEUR...
         PAGE
<
<
<        D E F I N I T I O N   D E   L A   C O U L E U R
<                    D E   R E M P L I S S A G E  :
<
<
COLOR:   EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         MCOLOR-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 4 CHIFFRES HEXAS ET CONVERSION.
         JNE         COLOR           < ERREUR DE SYNTAXE...
         JAL         COLOR           < ERREUR DE NIVEAU...
         CPI         NIVMAX
         JG          COLOR           < ERREUR DE NIVEAU...
         STA         NCOLOR          < ET MEMORISATION...
         BR          ALOOP           < VERS LA BOUCLE DE L'INTERPRETEUR...
         PAGE
<
<
<        D E F I N I T I O N   D U   F O N D  :
<
<
FOND:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         MFOND-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE 4 CHIFFRES HEXAS ET CONVERSION.
         JNE         FOND            < ERREUR DE SYNTAXE...
         JAE         FOND            < ERREUR : IL FAUT AU MOINS UN NIVEAU...
         LB          LNIVI           < ACCES A LA LISTE MAXIMALE INVERSEE,
         ANDR        A,B
         CPZR        B               < Y-A-T'IL DES NIVEAUX INEXISTANTS ???
         JNE         FOND            < OUI, ERREUR...
         STA         NFOND           < ET MEMORISATION DE LA LISTE...
         BR          ALOOP           < VERS LA BOUCLE DE L'INTERPRETEUR...
         PAGE
<
<
<        D E F I N I T I O N   D E   L A   C O N N E X I T E  :
<
<
<        NOTA :
<                    'AA00 : 4-CONNEXITE HORIZONTALE-VERTICALE,
<                    '5500 : 4-CONNEXITE DIAGONALE,
<                    'FF00 : 8-CONNEXITE.
<
<
TOPOLO:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         MTOPO-ZERO
         BSR         APRINT          < ENVOI D'UN MESSAGE,
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE LA CONNEXITE :
         JNE         TOPOLO          < ERREUR DE SYNTAXE...
         JAE         TOPOLO          < ERREUR : IL FAUT AU MOINS UN LIEN...
         LB          IVALXY          < POUR VALIDER (A) :
         ANDR        A,B
         CPZR        B               < ALORS ???
         JNE         TOPOLO          < ERREUR : LIENS INCONNUS...
         STA         LVALXY          < ET MEMORISATION DE LA LISTE DES
                                     < LIENS (DANS LE SENS TRIGONOMETRIQUE).
         BR          ALOOP           < VERS LA BOUCLE D'INTERPRETATION...
         PAGE
<
<
<        R E M P L I S S A G E   D ' U N   C O N T O U R  :
<
<
CONTO:   EQU         $
<
<        R E C U P E R A T I O N   P O I N T
<                    D E   D E P A R T  :
<
CUR1:    EQU         $
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         BSR         AIN             < (A)=COMMANDE "R" OU "0"..."7".
XWOR%7:  VAL         0
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAD         OG
         SVC         0               < OPEN GRAPHIQUE.
         LAD         CU
         SVC         0               < MISE EN FONCTION CURSEUR.
         LAD         LCU
         SVC         0               < LECTURE DU CURSEUR.
<
<        NOTA :
<                      ON NE TESTE PAS LES ERREURS
<                    EN RETOUR (CAS DU PASSAGE EN
<                    BATCH...), CAR 'CURSOR' EST INITIALISE
<                    PAR 'N'.
<
         LA          CURSOR+1        < Y(CURSEUR).
         MP          C4              < POUR ATTEINDRE
         DV          C3              <                TOUTE LA VIDEO...
         SLRS        DEDY            < REDUCTION VIDEO.
         SB          NLIN            < LES AXES GRAPHIQUES ET
                                     < VIDEOS SONT INVERES.
         NGR         A,Y             < Y=Y(CURSEUR VIDEO).
         LA          CURSOR+2        < X(CURSEUR).
         SLRS        DEDX            < REDUCTION VIDEO.
         LR          A,X             < X=X(CURSEUR VIDEO).
         BSR         ACLIGN          < CLIGNOTEMENT DU POINT (X,Y).
         LBY         CURSOR          < A=COMMANDE ASSOCIEE.
<
<        COMMANDES RECONNUES :
<                    C : CLIGNOTEMENT DU CURSEUR,
<                    R : ENTREE DU POINT DE DEPART ET "REMPLISSAGE",
<                    0-7 : ENTREE DE LA COULEUR DU POINT DE DEPART (ON
<                          PARTIRA DU PREMIER POINT RENCONTRE PAR BALA-
<                          YAGE RASTER POSSEDANT CETTE COULEUR).
<
         CPI         "C"
         JE          CUR1            < CLIGNOTEMENT SEUL...
XWOR%7:  VAL         0
         CPI         "0"
         JL          CUR1            < ERREUR...
         CPI         NIVMAX='FA00('00FF
         JLE         CUR2            < DEPART SUR UN POINT DE COULEUR DONNEE...
         CPI         "R"
         JNE         CUR1            < RIEN COMPRIS, ON RECOMMENCE.
         IF          MODE-ITEM,XWOR%7,,XWOR%7
<
< ENTREE EN HEXA DES COORDONNEES :
<
         BSR         ACOORD          < ENTREE DE X.
         LR          A,X             < X=X(CURSEUR VIDEO).
         BSR         ACOORD          < ENTREE DE Y.
         LR          A,Y             < Y=Y(CURSEUR VIDEO).
XWOR%7:  VAL         0
<
< ON A UN POINT DE DEPART :
<
CUR3:    EQU         $
         STZ         KSSTAC          < REINITIALISATION A PRIORI DU POINTEUR
                                     < DE LA PILE VIRTUELLE...
         BSR         AREMP           < REMPLISSAGE DE (X,Y).
<
< FIN DE REMPLISSAGE :
<
CUR4:    EQU         $
         BR          ALOOP           < VERS LA BOUCLE DE L'INTERPRETEUR...
<
< RECHERCHE D'UN POINT DE
< DEPART, QUI EST LE PRE-
< MIER POINT D'UNE COULEUR
< DONNEE EN ARGUMENT :
<
CUR2:    EQU         $
         ADRI        -"0",A          < CONVERSION EN UN NIVEAU...
         STA         SCOLOR          < (A)=COULEUR DU POINT DE DEPART CHERCHE.
         LYI         0               < Y=ORDONNEE.
         STY         YR
CUR11:   EQU         $
         LXI         0
         STX         XR              < X=ABSCISSE.
CUR12:   EQU         $
         CPZ         IMASKD          < LE CHOIX EST-IL MASQUABLE ???
         JNE         CUR18           < NON, ALLONS TESTER...
         CPZ         IMASKO
         JE          CUR18           < 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         CUR15           < LE MOT (X,Y) EST MASQUE...
CUR18:   EQU         $
         BSR         ASPGPR          < (A)=NIVEAU(XR,YR) :
         CP          SCOLOR          < EST-CE LA COULEUR CHERCHEE ???
         JNE         CUR13           < NON...
         LA          NFOND           < OUI : ON VA S'ARRETER ICI, MAIS
                                     < AU PREALABLE, ON VA LUI METTRE
                                     < UNE DES COULEURS DU FOND...
         DBT                         < RECHERCHE DE LA PREMIERE COULEUR
                                     < APPARTENANT AU FOND,
         LR          X,A
         BSR         ASPRPR          < QUE L'ON DONNE A (XR,YR)...
         LX          XR              < ET ON SE POSITIONNE
         LY          YR              < SUR CE POINT DE DEPART...
         JMP         CUR3            < ET C'EST PARTI...
CUR13:   EQU         $
CUR15:   EQU         $
         IC          XR              < ET DE XR,
         LA          XR
         CPI         NPOLM1          < EST-ON EN BOUT DE LIGNE ???
         JLE         CUR12           < NON... BALAYAGE HORIZONTAL...
         IC          YR              < OUI : PROGRESSION DE 'YR'...
         LA          YR
         CPI         NLIGM1          < EST-ON EN BOUT D'IMAGE ???
         JLE         CUR11           < NON, BALAYAGE VERTICAL...
         JMP         CUR4            < OUI : ON N'A PAS TROUVE DE POINT
                                     < DE DEPART DE LA COULEUR ARGUMENT,
                                     < ON ABANDONNE DONC...
         PAGE
<
<
<        R E M P L I S S A G E   R E C U R S I F  :
<
<
<        FONCTION :
<                      CE MODULE TESTE LE POINT
<                    ARGUMENT (X,Y) ; S'IL APPAR-
<                    TIENT AU FOND RESIDENT, IL EST
<                    MARQUE EN RESIDENT ET ALEATOIRE-
<                    MENT EN SCRACTH AFIN DE CREER
<                    UNE TRAME. ON EST OBLIGE DE
<                    MARQUER LE RESIDENT, CAR EN
<                    EFFET LA TRAME ALEATOIRE DU
<                    SCRATCH EST TROUEE, ET LE TEST
<                    D'APPARTENANCE AU FOND S'Y
<                    PERDRAIT...
<
<
<        ARGUMENT :
<                    (X,Y)=POINT COURANT.
<
<
REMP:    EQU         $
<
< TEST DES OVER-SCREEN :
<
         LR          X,A             < TEST DE 'X' :
         JAL         REMP1           < HORS-ECRAN : ARRET DE LA RECURSIVITE...
         CPI         NPOLM1
         JG          REMP1           < HORS-ECRAN : ARRET DE LA RECURSIVITE...
         LR          Y,A             < TEST DE 'Y' :
         JAL         REMP1           < HORS-ECRAN : ARRET DE LA RECURSIVITE...
         CPI         NLIGM1
         JG          REMP1           < HORS-ECRAN : ARRET DE LA RECURSIVITE...
<
< ACCES A UNE VALEUR "PONDEREE"
< EN SPIRALE DU POINT (X,Y) :
<
         STX         XR
         STY         YR
         BSR         ASPGPR          < (A)=NIVEAU(XR,YR),
         CP          NCOLOR          < LE POINT (XR,YR) EST-IL DEJA MARQUE ???
         JE          REMP1           < OUI, ON L'IGNORE, ET ON ARRETE ICI LA
                                     < RECURSIVITE...
         LR          A,B             < NON :
                                     < (B)=NIVEAU(XR,YR)...
         PSR         A               < SAVE LE NIVEAU REEL DE (XR,YR)...
         LA          NPM
         CPI         NP0             < LA SPIRALE FAIT-ELLE 1 POINT ???
         JE          REMP20          < OUI, (A) EST BON...
         BSR         ASPIR           < NON, ALLONS SOMMER AUTOUR DE (XR,YR)
                                     < DANS L'IMAGE 'TV2'...
         LR          A,B             < (B)=NIVEAU PONDERE AUTOUR DE (XR,YR),
                                     <     LE POINT (XR,YR) Y COMPRIS.
REMP20:  EQU         $
         PLR         A               < (A)=NIVEAU REEL DE (XR,YR)...
         PSR         X               < SAVE LA COORDONNEE 'X',
         LR          A,X             < (X)=NIVEAU(XR,YR),
         LA          NBORD
         TBT         0,X             < LE POINT (X,Y) APPARTIENT-IL AU BORD ???
         PLR         X               < RESTAURATION DE LA COORDONNEE 'X'...
         JC          REMP1           < OUI, ON ARRETE LA RECURSIVITE...
<
< CAS D'UN POINT QUI N'EST
< PAS AU BORD :
<
         LA          NCOLOR          < (A)=COULEUR DE REMPLISSAGE...
         BSR         ASPRPR          < ON MARQUE TOUT POINT QUI N'APPARTIENT
                                     < AU BORD, AFIN DE NE PAS PERTURBER LA
                                     < RECURSIVITE A CAUSE :
                                     < 1 - DU TRAMAGE (QUI CREE DES TROUS) DU
                                     < SCARTCH,
                                     < 2 - DES CAS OU LES LISTES DU 'BORD'
                                     < ET DU 'FOND' NE SONT PAS COMPLEMENTAIRES,
                                     < CE QUI CREE DES TROUS AUSSI...
         PSR         X               < SAVE LA COORDONNEE 'X' :
         LR          B,X             < (X)=NIVEAU(XR,YR),
         LA          NFOND
         TBT         0,X             < LE POINT (X,Y) APPARTIENT-IL AU FOND ???
         PLR         X               < RESTAURATION DE LA COORDONNEE 'X'...
         JNC         REMP2           < NON, ON L'IGNORE ET ON PASSE AUX POINTS
                                     < VOISIN ORTHOGONALEMENT...
<
< UTILISATION DU MASQUE :
<
         CPZ         IMASKO
         JE          REMP8           < LE MASQUE EST OFF...
         PSR         X,Y             < LE MASQUE EST ON :
                                     < (X,Y)=COORDONNEES 'X' ET 'Y' DU POINT
                                     <       COURANT.
         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         REMP2           < LE MOT (X,Y) EST MASQUE, ON L'IGNORE, ET
                                     < ON PASSE A SES VOISINS...
REMP8:   EQU         $
<
< CAS D'UN POINT QUI EST
< SUR LE FOND ET NON MASQUE :
<
         LA          DRDN
         CPI         1
         JLE         REMP3           < DANS CE CAS, ON TRACE SYSTEMATIQUEMENT...
                                     < (POUR DRDN=1, ON TROUVERAIT TOUJOURS UN
                                     < NOMBRE DIVISIBLE PAR 1...)
         LA          MRDN
         STA         XRDN            < INITIALISATION DU MULTIPLICATEUR
                                     < COURANT...
REMP5:   EQU         $
         BSR         ARDN            < CALCUL D'UN NOMBRE ALEATOIRE,
         SARD        NBITMO
         DV          DRDN
         CPZR        B               < EST-IL DIVISIBLE PAR 'DRDN' ???
         JE          REMP4           < OUI, ON LE TRACE...
         DC          XRDN            < NON, ITERONS SUR 'RDN' :
         JG          REMP5           < OUI...
         JMP         REMP6           < NON, ON NE TRACE DONC PAS CE POINT...
REMP4:   EQU         $
REMP3:   EQU         $
<
< GENERATION DE LA TRAME :
<
         STX         XS
         STY         YS
         LA          NCOLOR          < (A)=COULEUR DE REMPLISSAGE,
         BSR         ASPRPS          < ET MARQUAGE DU POINT (XS,YS)...
REMP6:   EQU         $
<
< ACCES AUX 4-VOISINS :
<
REMP2:   EQU         $
         LAI         0               < (A)=NUMERO DU VOISIN COURANT, SACHANT
                                     <     QUE L'ON VA DANS LE SENS TRIGONO-
                                     <     METRIQUE...
REMP30:  EQU         $
         XR          A,X             < (X)=INDEX DES LISTES D'INCREMENT.
         AD          &AINCX          < MODIFICATION DE LA COORDONNEE 'X',
         XR          A,Y
         AD          &AINCY          < MODIFICATION DE LA COORDONNEE 'Y',
         XR          A,Y
         LB          LVALXY          < (B)=LISTE DE VALIDATION DES VOISINS...
         TBT         NBITMO,X        < LE VOISIN COURANT EST-IL A TESTER ???
         XR          A,X             < RESTAURE :
                                     < (A)=NUMERO DE VOISIN COURANT,
                                     < (X,Y)=COORDONNEE DE CELUI-CI...
         JNC         REMP31          < NON, ON PASSE AU SUIVANT...
         BSR         ASPSTA          < OUI, ON LE PREND EN COMPTE,
         JMP         REMP            < ET ON VA LE TRAITER...
REMP31:  EQU         $
         ADRI        1,A             < PASSAGE AU VOISIN SUIVANT...
         CPI         NREMP+1         < EST-CE FINI ???
                                     < (ON FAIT +1, AFIN DE REVENIR SUR LE
                                     < POINT CENTRAL...)
         JL          REMP30          < NON, PASSAGE AU VOISIN SUIVANT (OU
                                     < RETOUR AU POINT CENTRAL)...
DREMP::  VAL         NREMP=0         < ET DECALAGE D'ACCES...
         IF          NBITMO/DREMP(0='FD00,,XEIF%,
DREMP:   VAL         DREMP+1         < RECHERCHE D'UN DIVISEUR DE 'NBITMO'...
XEIF%:   VAL         0
         IF          NBITMO/DREMP(0='FD00,,XEIF%,
         IF          ATTENTION : 'DREMP' EST MAUVAIS !!!
XEIF%:   VAL         0
XWOR%1:  VAL         NLIG            < NOMBRE DE LIGNES,
XWOR%2:  VAL         NPOLM1+1        < NOMBRE DE POINTS,
XWOR%3:  VAL         NBITMO/DREMP    < NOMBRE D'APPELS MEMORISES DANS UN MOT.
XWOR%4:  VAL         XWOR%1/XWOR%3*XWOR%2
                                     < NOMBRE DE MOTS NECESSAIRES POUR UN
                                     < MAXIMU D'APPELS (TOUS LES POINTS).
XWOR%5:  VAL         SSTACK+XWOR%4   < TOP DE LA PILE VIRTUELLE...
<
< FIN DE LA RECURSIVITE :
<
REMP1:   EQU         $
         LA          KSSTAC          < (A)=POINTEUR COURANT DE LA PILE :
         JAE         REMP9           < C'EST FINI... ON RETOURNE A L'APPELANT...
         DC          KSSTAC          < NON, ON DEPILE DONC...
         PSR         X               < SAUVEGARDES...
         LBI         0               < CLEAR 'B' (SUITE DU SUPER-BUG...).
         SLRD        NBITMO/DREMP=0  < DECONCATENATION :
                                     < (A)=ADRESSE RELATIVE DANS LA PILE,
                                     < (B)=NUMERO DE ZONE,
         AD          ASSTAC          < (A)=ADRESSE ABSOLUE EN 'CDAI',
         PSR         B
         LB          AMSSTA          < (B)=ADRESSE DE RECEPTION,
         LXI         1               < (X)=NOMBRE DE MOTS A DEPLACER.
         RCDA
         PLR         B               < RESTAURATION DU NUMERO DE ZONE,
         LAI         0
         SLLD        NBITMO=0        < QUE L'ON CONVERTIT EN UN DECALAGE...
         LR          A,X
         LA          MSSTAC          < (A)=MOT COURANT DE LA PILE,
         SCLS        DREMP,X         < QUE L'ON CADRE,
         ANDI        BIT>DREMP-BIT   < ET CE QUI NOUS DONNE LE NUMERO DE
                                     < L'APPEL DU TYPE "XREMP..." :
                                     < D'OU LES RETOURS SIMULES...
         PLR         X
         CPI         NREMP           < VALIDATION...
         JL          REMP31          < OK, AU VOISIN SUIVANT...
         QUIT        1               < E R R E U R   P R O G R A M M E ...
REMP9:   EQU         $
         RSR                         < RETOUR REEL A L'APPELANT...
         PAGE
<
<
<        E X P L O R A T I O N   D ' U N E   S P I R A L E  :
<
<
<        FONCTION :
<                      CE MODULE ICI A CAUSE DES
<                    SAUTS SUPERIEURS A 128 MOTS
<                    PERMET DE CALCULER LE NIVEAU
<                    PONDERE PAR LES COEFFICIENTS
<                    'A' AUTOUR DU POINT COURANT.
<                    MAIS, ATTENTION, LE NIVEAU
<                    PONDERE EST CALCULE A PARTIR
<                    DE 'TV2' QUE L'ON SUPPOSE
<                    INITIALEMENT IDENTIQUE A
<                    L'IMAGE CONTENUE DANS 'TV1' ;
<                    LA DIFFERENCE ENTRE LES 2 EST
<                    QUE 'TV1' VA ETRE MODIFIE AU
<                    COURS DE L'OPERATION, ALORS
<                    QUE 'TV2' RESTE INTACTE...
<
<
<        ARGUMENTS :
<                    (X,Y)=POINT COURANT.
<
<
<        RESULTAT :
<                    (A)=NIVEAU PONDERE (0-7).
<
<
SPIR:    EQU         $
         PSR         B,X,Y
<
< INITIALISATION DE LA SPIRALE :
<
         LA          XR
         LB          YR
         PSR         A,B             < SAUVEGARDE DU POINT (XR,YR).
         FLD         F0
         FST         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...
         LA          XR
         LB          YR
         STA         XS
         STB         YS              < (XS,YS) <-- (XR,YR) COURANT.
         LA          CTCDA
         STA         XCTCDA          < AFIN D'ACCEDER A 'TV2'...
         BSR         ASPGPS          < (A)=NIVEAU(XS,YS) DANS 'TV2'.
         STZ         XCTCDA          < ET RETOUR A 'TV1'...
         FLT                         < NIVEAU DU POINT COURANT,
         LX          NP              < (X)=NUMERO DU POINT COURANT (DE 1 A NPM),
         ADRI        -1,X            < POUR COMMENCER A 0...
         ADR         X,X             < POUR OBTENIR UN INDEX FLOTTANT...
         FMP         &ACT            < ET ON PONDERE LE NIVEAU PAR CT(X),
         FAD         CUMUL
         FST         CUMUL           < PUIS ON CUMULE...
SPMOY4:  EQU         $
         LA          XR
         AD          DELTAX          < CHANGEMENT DE
         STA         XR
         LA          YR
         AD          DELTAY          < POINT COURANT (XS,YS).
         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 NIVEAU "PONDERE"
< DU POINT (X,Y)=(XR,YR) :
<
SPMOY3:  EQU         $
         PLR         A,B
         STA         XR              < RESTAURATION DE
         STB         YR              <                 (XR,YR)...
         FLD         CUMUL           < VALEUR DU SIGMA,
         FDV         FNP             < NORMALISATION,
         FDV         DCUMUL          < ET REDUCTION EVENTUELLE PAR 'K'...
         BSR         AROND
         CPZ         MODET           < QUEL EST LE MODE DE TRACE ???
         JNE         SPMOY6          < PAR SEUILLAGE...
         ANDI        NIVMAX          < PAR MODULO...
         JMP         SPMOY7          < VERS LA GENERATION...
SPMOY6:  EQU         $
         JAG         SPMOY9          < LE NIVEAU N'EST PAS NOIR...
         LAI         0               < NOIR, OU NEGATIF --> NOIR...
         JMP         SPMOY7          < VERS LE TRACE...
SPMOY9:  EQU         $
         CPI         NIVMAX
         JLE         SPMOY7          < ON EST DANS L'INTERVALLE (0,NIVMAX)...
         CPZ         MODET           < HORS DE CET INTERVALLE, QUEL EST LE
                                     < MODE DE TRACE ???
         LAI         0               < A PRIORI : NIVEAU>NIVMAX --> NOIR...
         JL          SPMOY7          < ET OUI, VERS LA GENERATION...
         LAI         NIVMAX          < ET NON : NIVEAU>NIVMAX --> NIVMAX...
SPMOY7:  EQU         $
<
< RETOUR :
<
         PLR         B,X,Y
         RSR
         PAGE
<
<
<        S I M U L A T I O N   D E S   ' B S R '  :
<
<
<        FONCTION :
<                      EN EFFET, LA PILE RESIDENTE
<                    NE SUFFIT PAS : ON DOIT DONC
<                    SIMULER LES 'BSR' RECURSIFS
<                    DANS UNE PILE DANS LAQUELLE ON
<                    PLACE DES NUMEROS D'APPELS LES
<                    PLUS PETITS POSSIBLES ("XREMP...").
<
<
<        ARGUMENT :
<                    (A)=NUMERO D'APPEL ("XREMP...").
<
<
SPSTAC:  EQU         $
         CPI         BIT>DREMP-BIT   < VALIDATION :
         JLE         SPSTA2          < OK...
         QUIT        1               < E R R E U R   P R O G R A M M E ...
SPSTA2:  EQU         $
<
< PROGRESSION DU POINTEUR DE PILE :
<
         IC          KSSTAC          < LE PSEUDO-POINTEUR PROGRESSE :
         JNE         SPSTA1          < OK...
         QUIT        1               < LORSQU'IL REPASSE PAR 0, IL Y A DEBOR-
                                     < DEMENT DE LA PILE VIRTUELLE...
SPSTA1:  EQU         $
<
< ACCES A L'ENTREE-MOT
< COURANTE :
<
         PSR         A,B,X,Y
         LR          A,Y             < (Y)=NUMERO D'APPEL...
         LA          KSSTAC          < (A)=PSEUDO-POINTEUR COURANT :
         LBI         0               < CLEAR 'B' (OUFFF... BUG PAS FACILE !!!).
         SLRD        NBITMO/DREMP=0  < QUE L'ON DECONCATENE :
                                     < (A)=ADRESSE RELATIVE EN 'CDAI',
                                     < (B)=NUMERO DE ZONE.
         AD          ASSTAC          < (A)=ADRESSE ABSOLUE EN 'CDAI',
         PSR         A               < QUE L'ON MEMORISE...
         STZ         MSSTAC          < A PRIORI (AU CAS OU (B)=0)...
         CPZR        B               < EST-CE LA PREMIERE ZONE D'UN MOT QUE
                                     < L'ON VA ECRIRE ???
         JE          SPSTA3          < OUI, PAS DE 'RCDA', AINSI : CELA VA UN
                                     < PEU PLUS VITE, MAIS SURTOUT, ON EVITE DES
                                     < PARITES MEMOIRE AU CAS OU LA 'CDAI'
                                     < AURAIT ETE MISE HORS-TENSION...
         PSR         B               < SAUVEGARDE DU NUMERO DE ZONE.
         LB          AMSSTA          < (B)=ADRESSE DU MOT COURANT EN RESIDENT,
         LXI         1               < (X)=NOMBRE DE MOTS A DEPLACER,
         RCDA
                                     < ACCES A L'ENTREE COURANTE...
<
< MISE EN PLACE DU
< NUMERO D'APPEL :
<
         PLR         B               < (B)=NUMERO DE ZONE :
SPSTA3:  EQU         $
         LAI         0
         SLLD        NBITMO=0        < QUE L'ON CONVERTIT EN UN DECALAGE :
         LR          A,X
         LA          MSSTAC          < (A)=MOT COURANT DE LA PILE :
         SCLS        DREMP,X         < CADRAGE DE LA ZONE COURANTE,
         ANDI        BIT>DREMP-BIT)MFFFF
                                     < ET NETTOYAGE,
         ORR         Y,A             < PUIS INSERTION DU NUMERO D'APPEL...
         SCRS        DREMP,X         < ET RECALAGE...
         STA         MSSTAC
<
< MISE A JOUR DE LA PILE :
<
         PLR         A               < (A)=ADRESSE ABSOLUE EN 'CDAI',
         LB          AMSSTA          < (B)=ADRESSE EN RESIDENT,
         LXI         1               < (X)=NOMBRE DE MOTS A DEPLACER,
         WCDA
                                     < MISE A JOUR DE LA PILE...
<
< ET RETOUR :
<
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        V A L I D A T I O N   D U   F O R M A T   D E   L ' I M A G E  :
<
<
         IF          X20-X21,,X100,
         IF          ATTENTION : L'IMAGE N'EST PAS CARREE !!!
X100:    VAL         0
         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.