DATE
         PROG
         TRN
<
<
<        D E F I N I T I O N S   G E N E R A L E S  :
<
<
XUNDEF:: VAL         -1              < POUR NE DEFINIR QUE LES 'XX...' DANS LES
                                     < FICHIERS DE DEFINITION...
         CALL        #SIP DEFINITION CTTE#
<
< PREPARATION DE L'APPEL DE #SIP UTILITAIRES# :
<
XXXDEF:  VAL         XUNDEF
XXXLOC:  VAL         XUNDEF
XXXTAB:  VAL         XUNDEF
XXXPRO:  VAL         XUNDEF
         CALL        #SIP UTILITAIRES#
<
<
<        D E F I N I T I O N   D E   L ' I M A G E  :
<
<
XXXVEC:  VAL         XUNDEF          < AFIN DE NE DEFINIR QUE LES 'XXVEC'...
         CALL        #SIP VECTEUR 512#
XXXVEC:  VAL         XXVEC1          < DEFINITION DES CONSTANTES IMAGE/VECTEUR.
         CALL        #SIP VECTEUR 512#
         PAGE
<
<
<        O P T I O N S   D ' A S S E M B L A G E  :
<
<
XOPT01: @
XWOR%1:  VAL         KOLF=FMASK+KOLTES=FVAL
XWOR%1:  VAL         KOLC=FMASK+KDP=FVAL?XWOR%1
XWOR%2:  VAL         KOLTED=FMASK+KOL0=FVAL
XWOR%2:  VAL         KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2
XWOR%3:  VAL         XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT...
XWOR%4:  VAL         MSYMBI=FMASK+KOL0=FVAL
XWOR%4:  VAL         MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4
XWOR%5:  VAL         XWOR%4=FCSYMT   < ETAT DU SYMBOLE 'XOPT01'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
XOPT01:: VAL         EXIST           < TRACE GRAPHIQUE, ET VERIFICATIONS CROI-
                                     < SEES DES EQUATIONS CALCULEES...
XEIF%:   VAL         ENDIF
         PAGE
<
<
<        B A S   D E   L A   M E M O I R E  :
<
<
ZERO:    EQU         $
         DZS         PEPROG-D+Z
<
< POINT D'ENTREE :
<
ENTRY:   EQU         $
         LRM         A,K
         WORD        DEBUT           < POINT D'ENTREE DU PROGRAMME,
         WORD        STACK-DEPILE    < INITIALISATION DE LA PILE.
         PSR         A
         RSR                         < ON EFFECTUE AINSI UN 'GOTO' 'DEBUT'...
         PAGE
<
<
<        M E S S A G E S  :
<
<
         TABLE
<
<
<        C O M M O N  :
<
<
         COMMON
COM:     EQU         $
<
< MOT DESTINE AU BLOC FLOTTANT :
<
COMFLO:  WORD        NILK            < MOT "BIDON" DESTINE AU BLOC FLOTTANT
                                     < POUR QU'IL Y FIT SES MERDES...
ATSFLO:  WORD        TSFLO           < POUR TESTER DE TEMPS EN TEMPS 'COMFLO'...
<
< INDICATEURS DE CONTROLE :
<
IERASE:  WORD        EXIST           < EFFACER ('EXIST'), OU NON ('NEXIST')
                                     < L'ECRAN 512...
IQUIT:   WORD        EXIST           < S'ARRETER ('EXIST') OU PAS ('NEXIST')
                                     < APRES CHAQUE IMAGE (POINT D'ARRET).
GRAINE:  WORD        NILK            < GRAINE DU GENERATEUR ALEATOIRE...
SUPRDN:  WORD        NILK            < SUP(RDN),
INFRDN:  WORD        NILK            < INF(RDN).
ICONEX:  WORD        EXIST           < DOIT-ON EXTRAIRE LE SOUS-ENSEMBLE
                                     < CONNEXE :
                                     < 'EXIST'  : OUI (DANS 'MAT2'),
                                     < 'NEXIST' : NON.
IVISP:   WORD        EXIST           < DOIT-ON VISUALISER AU PREALABLE PLAN
                                     < PAR PLAN SOUS FORME D'UNE MATRICE :
                                     < 'EXIST'  : OUI,
                                     < 'NEXIST' : NON.
IVISD:   WORD        NEXIST          < TRACER ('EXIST') OU PAS ('NEXIST') LES
                                     < DISQUES SYMBOLISANT LES SITES.
RAYON:   WORD        NILK            < RAYON DES DISQUES.
IVISK:   WORD        EXIST           < DOIT-ON VISUALISER ('EXIST') OU PAS
                                     < ('NEXIST') DES PETITS CUBES.
COTE:    WORD        NILK            < COTE DES PETITS CUBES.
IVISC:   WORD        NEXIST          < TRACER ('EXIST') OU PAS ('NEXIST') LES
                                     < CONNEXIONS.
INEW1:   WORD        EXIST           < MODE DE CHOIX DES COULEURS DES DISQUES
                                     < ET DES CONNEXIONS :
                                     < 'NEXIST' : LES CONNEXIONS SONT 2 FOIS PLU
                                     <            PLUS SOMBRES QUE LES PARTIES
                                     <            LES PLUS LUMINEUSES DES
                                     <            DISQUES, ET LES PARTIES DES
                                     <            DISQUES LES PLUS SOMBRES (AU
                                     <            BORD VONT PRATIQUEMENT JUS-
                                     <            QU'AU NOIR) ET ENFIN, LES
                                     <            CONNEXIONS UTILISENT DES
                                     <            NIVEAUX PRIS PAR LES DISQUES.
                                     < 'EXIST'  : LES COULEURS UTILISEES SONT
                                     <            PROPRES A CHAQUE PLAN 'Z' ;
                                     <            2 PLANS PARALLELES NE PEUVENT
                                     <            UTILISER LES MEMES...
<
< MATRICE DE TRANSFORMATION :
<
MAT11:   FLOAT       <NILK<NILK<NILK
MAT12:   FLOAT       <NILK<NILK<NILK
MAT13:   FLOAT       <NILK<NILK<NILK
TRMATX:  WORD        NILK            < TRANSLATION APRES MULTIPLICATION PAR LA
                                     < MATRICE 'MAT'.
IMODX:   WORD        NEXIST          < PAS DE MODULO SUR L'AXE 'OX' TRANSFORME,
MAT21:   FLOAT       <NILK<NILK<NILK
MAT22:   FLOAT       <NILK<NILK<NILK
MAT23:   FLOAT       <NILK<NILK<NILK
TRMATY:  WORD        NILK            < TRANSLATION APRES MULTIPLICATION PAR LA
                                     < MATRICE 'MAT'.
IMODY:   WORD        NEXIST          < PAS DE MODULO SUR L'AYE 'OY' TRANSFORME,
MAT31:   FLOAT       <NILK<NILK<NILK
MAT32:   FLOAT       <NILK<NILK<NILK
MAT33:   FLOAT       <NILK<NILK<NILK
TRMATZ:  WORD        NILK            < TRANSLATION APRES MULTIPLICATION PAR LA
                                     < MATRICE 'MAT'.
IMODZ:   WORD        NEXIST          < PAS DE MODULO SUR L'AZE 'OZ' TRANSFORME,
<
< RELAIS DIVERS :
<
ADEB9:   WORD        DEBUT9
<
< CONSTANTES FLOTTANTES DE BASE :
<
F0:      FLOAT       <K<K<K          < REMISE A ZERO FLOTTANTE...
F1:      FLOAT       <W<K<K          < L'UNITE EN FLOTTANT...
XXXLOC:  VAL         YYYFLO          < 'YYYFLO'.
         CALL        #SIP UTILITAIRES#
<
< VARIABLES DE MANOEUVRE :
<
FWORK1:  FLOAT       <NILK<NILK<NILK
FWORK2:  FLOAT       <NILK<NILK<NILK
<
< DEMANDE DE TEMPORISATION
< APRES EFFACEMENT :
<
TEMPO:   BYTE        NVPSER;FONDOR
         WORD        NILK            < INUTILE...
         WORD        XXXMOY          < 2 PETITES SECONDES...
XXXLOC:  VAL         YYYGOT          < 'YYYGOT'.
         CALL        #SIP UTILITAIRES#
XXXVEC:  VAL         XXVEC2          < DEFINITION DES DONNEES DU VECTEUR 512...
         CALL        #SIP VECTEUR 512#
APOINT:  WORD        POINT           < SOUS-PROGRAMME DE MARQUAGE D'UN POINT
                                     < DE COORDONNEES (X), DONT LE NIVEAU EST
                                     < CALCULE VIA LA TABLE 'LNIVO'.
ALNIVO:  WORD        LNIVO,X         < TABLE DE CORRESPONDANCE DES NIVEAUX POUR
                                     < LE SOUS-PROGRAMME 'POINT'.
<
< ACCES AUX REGISTRES DE CONTROLE :
<
ACTRL1:  WORD        RCTRL1
ACTRL2:  WORD        RCTRL2
<
< PARAMETRES DU GENERATEUR ALEATOIRE :
<
RDN0::   VAL         K               < PAS DE DIRECTION PRINCIPALE...
RDNX::   VAL         RDN0+I          < DIRECTION PRINCIPALE DE 'RDN' : 'OX',
RDNY::   VAL         RDNX+I          < DIRECTION PRINCIPALE DE 'RDN' : 'OY',
RDNZ::   VAL         RDNY+I          < DIRECTION PRINCIPALE DE 'RDN' : 'OZ'.
RDNXYZ: @
XWOR%1:  VAL         KOLF=FMASK+KOLTES=FVAL
XWOR%1:  VAL         KOLC=FMASK+KDP=FVAL?XWOR%1
XWOR%2:  VAL         KOLTED=FMASK+KOL0=FVAL
XWOR%2:  VAL         KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2
XWOR%3:  VAL         XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT...
XWOR%4:  VAL         MSYMBI=FMASK+KOL0=FVAL
XWOR%4:  VAL         MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4
XWOR%5:  VAL         XWOR%4=FCSYMT   < ETAT DU SYMBOLE 'RDNXYZ'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
RDNXYZ:: VAL         RDNZ            < LE GENERATEUR ALEATOIRE DEPENDRA DE
                                     < LA DIRECTION 'OZ'...
XEIF%:   VAL         ENDIF
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
INF32:   FLOAT       32768
INF64:   FLOAT       65536
FWORK4:  FLOAT       <NILK<NILK<NILK
FWORK5:  FLOAT       <NILK<NILK<NILK
FSUP:    FLOAT       <NILK<NILK<NILK < 'SUPRDN' EN FLOTTANT,
FINF:    FLOAT       <NILK<NILK<NILK < 'INFRDN' EN FLOTTANT.
SUP64:   FLOAT       <NILK<NILK<NILK < SUP/65536,
UNMIS:   FLOAT       <NILK<NILK<NILK < 1-(INF/SUP),
UNPIS:   FLOAT       <NILK<NILK<NILK < 32768*(1+(INF/SUP)).
         IF          RDNXYZ-RDN0,XEIF%,,XEIF%
RDNSEU:  FLOAT       <NILK<NILK<NILK < SEUIL DE 'RDN' LORSQU'IL N'Y A PAS DE
                                     < DIRECTION PRINCIPALE...
XEIF%:   VAL         ENDIF
ARDN:    WORD        SPRDN           < GENERATEUR ALEATOIRE 3D.
<
< DEFINITION DES MATRICES :
<
LOGZ::   VAL         4               < LOGARITHME BASE 2 DE LA DIMENSION 'Z',
LOGY::   VAL         4               < LOGARITHME BASE 2 DE LA DIMENSION 'Y',
LOGX::   VAL         4               < LOGARITHME BASE 2 DE LA DIMENSION 'X'.
LONGZ::  VAL         BIT>LOGZ        < LONGUEUR DE L'AXE 'Z',
LONGY::  VAL         BIT>LOGY        < LONGUEUR DE L'AXE 'Y',
LONGX::  VAL         BIT>LOGX        < LONGUEUR DE L'AXE 'X'.
XWOR%1:  VAL         LOGX+LOGY+LOGZ
XWOR%2:  VAL         BIT>XWOR%1
LONMAT:: VAL         XWOR%2          < NOMBRE D'ELEMENTS D'UNE MATRICE BINAIRE.
         IF          LONMAT-K,,,XEIF%
         IF          ATTENTION : L'ESPACE 3D EST TROP GRAND !!!
XEIF%:   VAL         ENDIF
AINDEX:  WORD        INDEX           < CALCUL D'UN INDEX LINEAIRE A PARTIR
                                     < D'UN TRIPLET (X,Y,W) (SOIT (X,Y,Z)).
ASBT3D:  WORD        SBT3D           < MISE D'UN ELEMENT A 1,
ARBT3D:  WORD        RBT3D           < MISE D'UN ELEMENT A 0,
ATBT3D:  WORD        TBT3D           < TEST D'UN ELEMENT.
AVALID:  WORD        VALID           < TEST DE L'APPARTENANCE AU "CUBE" DU
                                     < POINT (X,Y,Z).
<
< DEFINITION DE LA MATRICE '1'
< DES SITES DU RESEAU :
<
AMAT1:   WORD        MAT1            < ADRESSE DE LA MATRICE.
AMAT1X:  WORD        MAT1-IJIJDX,X   < RELAI DE NETTOYAGE.
ASBT1:   WORD        SBT1            < MISE D'UN ELEMENT A 1,
ARBT1:   WORD        RBT1            < MISE D'UN ELEMENT A 0,
ATBT1:   WORD        TBT1            < TEST D'UN ELEMENT.
<
< DEFINITION DE LA MATRICE '2'
< DES SITES CONNECTES DU RESEAU :
<
AMAT2:   WORD        MAT2            < ADRESSE DE LA MATRICE.
AMAT2X:  WORD        MAT2-IJIJDX,X   < RELAI DE NETTOYAGE.
ASBT2:   WORD        SBT2            < MISE D'UN ELEMENT A 1,
ARBT2:   WORD        RBT2            < MISE D'UN ELEMENT A 0,
ATBT2:   WORD        TBT2            < TEST D'UN ELEMENT.
<
< RECHERCHE DE LA CONNEXITE :
<
AREMP:   WORD        REMP            < SOUS-PROGRAMME RECURSIF DE REMPLISSAGE.
NREMP::  VAL         6               < ON RECONNAIT LES 6 VOISINS LES PLUS
                                     < PROCHES ("ORTHOGONAUX").
AINCX:   WORD        INCX,X          < LISTE DES INCREMENTS DE 'X' :
INCX:    EQU         $
         WORD        K;K;+I;-I;K;-I;+I
         IF          $-INCX-I-NREMP,,XEIF%,
         IF          ATTENTION : LA LONGUEUR DE 'INCX' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
AINCY:   WORD        INCY,X          < LISTE DES INCREMENTS DE 'Y' :
INCY:    EQU         $
         WORD        K;+I;-I;K;-I;+I;K
         IF          $-INCY-I-NREMP,,XEIF%,
         IF          ATTENTION : LA LONGUEUR DE 'INCY' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
AINCZ:   WORD        INCZ,X          < LISTE DES INCREMENTS DE 'X' :
INCZ:    EQU         $
         WORD        +I;-I;K;-I;+I;K;K
         IF          $-INCZ-I-NREMP,,XEIF%,
         IF          ATTENTION : LA LONGUEUR DE 'INCZ' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
XWOR%1:  VAL         K               < INITIALISATION DU CUMUL,
XWOR%2:  VAL         -I              < POUR UN DECALAGE A DROITE,
XWOR%3:  VAL         COSBT?BITSIG=FMASK(K=FCINST
                                     < POUR MARQUER LE PREMIER BIT...
         DO          NREMP
XWOR%1:  VAL         XWOR%1>XWOR%2?XWOR%3
LVALXY:  WORD        XWOR%1          < LISTE DES VOISINS A TESTER ; LE BIT
                                     < 'REMP+1' A 0 PERMET DE CLORE LA LISTE, ET
                                     < ASSURE LE RETOUR AU POINT DE DEPART...
<
< GESTION DE LA PILE VIRTUELLE :
<
SSTACK:: VAL         K               < ADRESSE EN 'CDAJ' DE LA PILE VIRTUELLE.
KSSTAC:  WORD        NILK            < POINTEUR DE LA PILE VIRTUELLE,
ASSTAC:  WORD        SSTACK          < ADRESSE EN 'CDAI' DE LA PILE VIRTUELLE.
MSSTAC:  WORD        NILK            < MOT COURANT DE LA PILE VIRTUELLE,
AMSSTA:  WORD        MSSTAC          < ET SON ADRESSE...
ASPSTA:  WORD        SPSTAC          < SOUS-PROGRAMME DE SIMULATION DES
                                     < EMPILEMENTS.
<
< DONNEES DE LA TRANSFORMATION
< MATRICIELLE (MATIJ) :
<
APRMAT:  WORD        PRMAT           < SOUS-PROGRAMME DE TRANSFORMATION.
<
< SAUVEGARDE DES COORDONNEES :
<
SAVEX:   WORD        NILK
SAVEY:   WORD        NILK
SAVEZ:   WORD        NILK
<
< DONNEES DE PROJECTION :
<
COST:    FLOAT       <NILK<NILK<NILK < COS(TETA) DONNE EN ARGUMENT,
SINT:    FLOAT       <NILK<NILK<NILK < SIN(TETA) CALCULE A PARTIR DE COS(TETA).
DECX::   VAL         5               < AMPLIFICATEUR DE 'X',
DECY::   VAL         DECX            < AMPLIFICATEUR DE 'Y',
DECZ::   VAL         DECX-I          < AMPLIFICATEUR DE 'Z'.
TRANSX:  WORD        NILK            < TRANSLATION DE 'X',
TRANSY:  WORD        NILK            < TRANSLATION DE 'Y' (PROJETES).
<
< DONNEES DE TRACE D'UN DISQUE :
<
XWOR%1:  VAL         XXN255+I
XWOR%2:  VAL         BIT>LOGZ
         TRN
XWOR%3:  VAL         XWOR%1/XWOR%2=K
         NTRN
DECZDK:: VAL         4               < POUR AMPLIFIER LA COORDONNEE 'Z' LORS
                                     < DU TRACE DES DISQUES.
         IF          DECZDK-XWOR%3,XEIF%,XEIF%,
         IF          ATTENTION : 'DECZDK' EST TROP GRAND !!!
XEIF%:   VAL         ENDIF
SAVEZP:  WORD        NILK            < POUR SAUVEGARDER LA COORDONNEE 'Z'
                                     < AMPLIFIEE...
ACERCL:  WORD        CERCLE          < SOUS-PROGRAMME DE TRACE.
<
< DONNEES DE TRACE DES PETITS CUBES :
<
COTEG:   WORD        NILK            < COTE DU CUBE EN UNITE GRAPHIQUE...
COTES2:  WORD        NILK            < DEMI-COTE DES PETITS CUBES.
PROJXG:  WORD        NILK            < PROJECTION DU COTE
PROJYG:  WORD        NILK            <                    D'UN PETIT CUBE (EN
                                     < UNITE GRAPHIQUE...)
PROXS2:  WORD        NILK            < PROJECTION DU DEMI-COTE
PROYS2:  WORD        NILK            <                         D'UN CUBE (EN
                                     < UNITE TV...).
ACUBE:   WORD        CUBE            < SOUS-PROGRAMME DE TRACE DES PETITS CUBES.
<
< DONNEES DE TRACE DES CONNEXIONS :
<
DECZCO:: VAL         DECZDK-I        < POUR AMPLIFIER LA COORDONNEE 'Z' LORS
                                     < DU TRACE DES CONNEXIONS.
         IF          DECZCO-XWOR%3,XEIF%,XEIF%,
         IF          ATTENTION : 'DECZCO' EST TROP GRAND !!!
XEIF%:   VAL         ENDIF
PROJX:   WORD        NILK            < PROJECTIONS DU VECTEUR UNITAIRE 'Z'
PROJY:   WORD        NILK            < EXPRIMEES EN COORDONNEES GRAPHIQUES.
ACONEX:  WORD        CONEX           < SOUS-PROGRAMME DE TRACE.
<
<
<        C O N S T A N T E   M A G I Q U E  :
<
<
MAGIK::  VAL         7               < CONSTANTE MAGIQUE...
         IF          K*MAGIK/BASE16(K=FCREST-K,,XEIF%,
         IF          ATTENTION : IL FAUT MAGIK(K)=K POUR
         IF          SIMPLIFIER LES CHOSES EN BASE 16 !!!
XEIF%:   VAL         ENDIF
XWOR%3:  VAL         MAGIK           < CONSTANTE MAGIQUE...
XWOR%7:  VAL         K               < INITIALISATION DU CUMUL...
         NTRN
         DO          BASE16
XWOR%7:  VAL K=FCDO*XWOR%3/BASE16(K=FCREST?COSBT=FMASK(K?XWOR%7=FCINST
XWOR%8:  VAL         K               < INITIALISATION DU CUMUL...
         DO          BASE16
XWOR%8:  VAL K=FCDO?COSBT=FMASK(K?XWOR%8=FCINST
         TRN
         IF          XWOR%7-XWOR%8,,XEIF%,
         IF          ATTENTION : LA CONSTANTE MAGIQUE 'MAGIK'
         IF          N'OPERE PAS UNE PERMUTATION DES 16 CHIFFRES
         IF          DE 0 A F !!!
XEIF%:   VAL         ENDIF
         IF          K*MAGIK/BASE10(K=FCREST-K,,XEIF%,
         IF          ATTENTION : IL FAUT MAGIK(K)=K POUR
         IF          SIMPLIFIER LES CHOSES EN BASE 10 !!!
XEIF%:   VAL         ENDIF
XWOR%3:  VAL         MAGIK           < CONSTANTE MAGIQUE...
XWOR%7:  VAL         K               < INITIALISATION DU CUMUL...
         NTRN
         DO          BASE10
XWOR%7:  VAL K=FCDO*XWOR%3/BASE10(K=FCREST?COSBT=FMASK(K?XWOR%7=FCINST
XWOR%8:  VAL         K               < INITIALISATION DU CUMUL...
         DO          BASE10
XWOR%8:  VAL K=FCDO?COSBT=FMASK(K?XWOR%8=FCINST
         TRN
         IF          XWOR%7-XWOR%8,,XEIF%,
         IF          ATTENTION : LA CONSTANTE MAGIQUE 'MAGIK'
         IF          N'OPERE PAS UNE PERMUTATION DES 10 CHIFFRES
         IF          DE 0 A 9 !!!
XEIF%:   VAL         ENDIF
AMAGIK:  WORD        MAGIK
         PAGE
<
<
<        M A T R I C E   D E S   S I T E S  :
<
<
MAT1:    EQU         $
         DZS         LONMAT/NBITMO
         PAGE
<
<
<        M A T R I C E   D E S   S I T E S   C O N N E C T E S  :
<
<
MAT2:    EQU         $
         DZS         LONMAT/NBITMO
         PAGE
<
<
<        T A B L E   D E   T R A N S C O D A G E   D E S   N I V E A U X  :
<
<
<        ARGUMENTS D'ASSEMBLAGE :
<                    ND=DIVISEUR DES NIVEAUX DE 'LNIVO' (0 OU 2),
<                    NI=TRANSLATION DES NIVEAUX DE 'LNIVO' (0 OU 128)...
<
<
NI:     @
XWOR%1:  VAL         KOLF=FMASK+KOLTES=FVAL
XWOR%1:  VAL         KOLC=FMASK+KDP=FVAL?XWOR%1
XWOR%2:  VAL         KOLTED=FMASK+KOL0=FVAL
XWOR%2:  VAL         KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2
XWOR%3:  VAL         XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT...
XWOR%4:  VAL         MSYMBI=FMASK+KOL0=FVAL
XWOR%4:  VAL         MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4
XWOR%5:  VAL         XWOR%4=FCSYMT   < ETAT DU SYMBOLE 'NI'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
NI::     VAL         XXNOIR          < LE NIVEAU INITIAL SERA LE NIVEAU NOIR.
XEIF%:   VAL         ENDIF
ND:     @
XWOR%1:  VAL         KOLF=FMASK+KOLTES=FVAL
XWOR%1:  VAL         KOLC=FMASK+KDP=FVAL?XWOR%1
XWOR%2:  VAL         KOLTED=FMASK+KOL0=FVAL
XWOR%2:  VAL         KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2
XWOR%3:  VAL         XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT...
XWOR%4:  VAL         MSYMBI=FMASK+KOL0=FVAL
XWOR%4:  VAL         MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4
XWOR%5:  VAL         XWOR%4=FCSYMT   < ETAT DU SYMBOLE 'ND'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
ND::     VAL         W               < PAS DE DIVISEUR DES NIVEAUX...
XEIF%:   VAL         ENDIF
LNIVO:   EQU         $
         NTRN
XWOR%1:  VAL         NIV256+NOCMO-E/NOCMO
XWOR%2:  VAL         NIV256/NOCMO(K=FCREST
         TRN
XWOR%3:  VAL         NIV256+XWOR%2
                                     < INCREMENT DES OCTETS GAUCHES,
XWOR%4:  VAL         XWOR%3+NOCMO-Z
                                     < INCREMENT DES OCTETS DROITS.
         NTRN
<*******************************************************************************
         DO          XWOR%1
   BYTE K=FCDO)MFFFF+N-Z*NOCMO+XWOR%3/ND+NI;K=FCDO)MFFFF+N-Z*NOCMO+XWOR%4/ND+NI
XWOR%5:  VAL         '0000000@@@@    < RECUPERATION DU DERNIER MOT,
<*******************************************************************************
         TRN
         IF          XWOR%2-K,,XEIF%,
XWOR%5:  VAL         XWOR%5(MOCG     < DANS LE CAS D'UNE TABLE DE LONGUEUR
                                     < IMPAIRE, ON EFFACE LE DERNIER OCTET
                                     < GENERE,
         $EQU        $-D             < ON REVIENT D'UN MOT EN ARRIERE,
         WORD        XWOR%5          < ET ON REGENERE LE DERNIER MOT...
XEIF%:   VAL         ENDIF
         NLS
         DO          XC512
         FLOAT       <NILK<NILK<NILK < LIGNE PRECEDENTE.
         LST
         PAGE
<
<
<        P I L E   D E   T R A V A I L  :
<
<
STACK:   EQU         $
         DZS         64
         PROG
XXXVEC:  VAL         XXVEC3          < DEFINITION DES PROGRAMMES VECTEUR 512...
         CALL        #SIP VECTEUR 512#
         PAGE
<
<
<        M A R Q U A G E   D ' U N   P O I N T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME MARQUE
<                    LE POINT ARGUMENT (X,Y) AVEC
<                    COMME NIVEAU, LE NIVEAU ARGU-
<                    MENT (A) TRANSCODE VIA LA TA-
<                    BLE 'LNIVO', CE QUI PERMET PAR
<                    EXEMPLE LA SUPERPOSITION DE
<                    PLUSIEURS IMAGES, EN FAISANT
<                    QUE LEURS TABLES 'LNIVO' SOIENT
<                    COMPLEMENTAIRES...
<
<
<        ARGUMENTS :
<                    (A)=NIVEAU,
<                    (X,Y)=COORDONNEES DU POINT.
<
<
<        RESULTAT :
<                    (A)=NIVEAU TRANSCODE.
<
<
POINT:   EQU         $
         PSR         A,B
         LR          A,B             < (B)=NIVEAU DU TRACE.
<
< TEST DES "HORS-ECRAN" :
<
         LR          X,A             < (A)=COORDONNEE 'X' ET VALIDATION :
         JAL         POINT1          < HORS-ECRAN...
         CP          VECTNC
         JG          POINT1          < HORS-ECRAN...
         LR          Y,A             < (A)=COORDONNEE 'Y' ET VALIDATION :
         JAL         POINT1          < HORS-ECRAN...
         CP          VECTNL
         JG          POINT1          < HORS-ECRAN...
<
< TRANSCODAGE DU NIVEAU :
<
         PSR         X               < SAUVEGARDE DE LA COORDONNEE 'X'...
         LR          B,X             < (X)=NIVEAU ARGUMENT,
         LBY         &ALNIVO         < (A)=NIVEAU TRANSCODE,
         PLR         X               < RESTAURE :
                                     < (X)=COORDONNEE 'X'.
<
< MARQUAGE DU POINT :
<
         BSR         ASTORP          < MARQUAGE : (X,Y) <-- (A)...
<
< ET RETOUR :
<
POINT1:  EQU         $
         PLR         A,B
         RSR
         PAGE
<
<
<        T E S T   P E R I O D I Q U E   D E   ' C O M F L O '  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME EST
<                    APPELE DERRIERE CHAQUE
<                    'FDV' EXPLICITE AINSI
<                    QU'APRES LES APPELS DE
<                    'RAC' ET 'CRAMR'...
<
<
TSFLO:   EQU         $
         PSR         A
         LA          COMFLO          < TEST DE 'COMFLO' PAR UN 'LA' AFIN DE NE
                                     < PAS MODIFIER LES CODES (CARY & CO)...
         JAE         TSFLO1          < OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
                                     < ON A :
                                     < (A)=INDICATEURS FLOTTANTS...
                                     < BIT 0 : UNDERFLOW,
                                     < BIT 1 : OVERFLOW,
                                     < BIT 2 : DIVISION PAR ZERO,
                                     < BIT 3 : 'FIX' IMPOSSIBLE.
         STZ         COMFLO          < PUIS RAZ, CAR CES INDICATEURS SONT
                                     < REMANENTS...
TSFLO1:  EQU         $
         PLR         A
         RSR
XXXPRO:  VAL         YYYGOT          < 'YYYGOT'.
         CALL        #SIP UTILITAIRES#
XXXPRO:  VAL         YYYFLO          < 'YYYFLO'.
         CALL        #SIP UTILITAIRES#
         PAGE
<
<
<        I N D E X A T I O N   D ' U N E   M A T R I C E
<                    B I N A I R E   3 D  :
<
<
<        ARGUMENTS :
<                    (X,Y,W)=TROIS INDICES D'UNE MATRICE BINAIRE 3D (.,.,.),
<                            CORRESPONDANT EN FAIT AUX COORDONNEES
<                            D'UN POINT DANS UN ESPACE 3D.
<
<
<        RESULTAT :
<                    (X)=INDEX DU BIT CORRESPONDANT A L'ELEMENT (X,Y,W).
<
<
INDEX:   EQU         $
         PSR         A               < SAUVEGARDES...
         LR          W,A             < Z,
         SLLS        LOGY            < Z*DIMY,
         ORR         Y,A             < Z*DIMY+Y,
         SLLS        LOGX            < (Z*DIMY+Y)*DIMX,
         ORR         A,X             < (Z*DIMY+Y)*DIMX+X,
                                     < CE QUI DONNE DANS 'X' L'INDEX CHERCHE.
         PLR         A               < RESTAURATIONS...
         RSR                         < ET RETOUR...
         PAGE
<
<
<        M I S E   A   1   D ' U N   E L E M E N T   D ' U N E
<                    M A T R I C E   B I N A I R E   3 D  :
<
<
<        ARGUMENTS :
<                    (A)=ADRESSE DE LA MATRICE.
<                    (X,Y,W)=TROIS INDICES D'UNE MATRICE BINAIRE 3D.
<
<
SBT3D:   EQU         $
         PSR         X               < SAUVEGARDES...
         BSR         AINDEX          < CALCUL DE L'INDEX LINEAIRE EQUIVALENT
                                     < AU TRIPLET (X,Y,W) DANS 'X',
         SBTM        O,X             < ET MISE A 1...
         PLR         X               < RESTAURATIONS...
         RSR                         < ET RETOUR...
         PAGE
<
<
<        M I S E   A   0   D ' U N   E L E M E N T   D ' U N E
<                    M A T R I C E   B I N A I R E   3 D  :
<
<
<        ARGUMENTS :
<                    (A)=ADRESSE DE LA MATRICE.
<                    (X,Y,W)=TROIS INDICES D'UNE MATRICE BINAIRE 3D.
<
<
RBT3D:   EQU         $
         PSR         X               < SAUVEGARDES...
         BSR         AINDEX          < CALCUL DE L'INDEX LINEAIRE EQUIVALENT
                                     < AU TRIPLET (X,Y,W) DANS 'X',
         RBTM        O,X             < ET MISE A 0...
         PLR         X               < RESTAURATIONS...
         RSR                         < ET RETOUR...
         PAGE
<
<
<        T E S T   D ' U N   E L E M E N T   D ' U N E   M A T R I C E
<                    B I N A I R E   3 D  :
<
<
<        ARGUMENTS :
<                    (A)=ADRESSE DE LA MATRICE,
<                    (X,Y,W)=TROIS INDICES D'UNE MATRICE BINAIRE 3D.
<
<
<        RESULTAT :
<                    LE CARRY EST POSITIONNE COMME PAR UN 'TBT'.
<
<
TBT3D:   EQU         $
         PSR         A,B,X,Y         < SAUVEGARDES...
         BSR         AINDEX          < CALCUL DE L'INDEX LINEAIRE EQUIVALENT
                                     < AU TRIPLET (X,Y,W) DANS 'X',
         LR          X,B             < ET SAUVEGARDE DANS 'B'...
         LRM         Y
         WORD        LONMAT          < (Y)=INDEX LINEAIRE DU DERNIER ELEMENT
                                     <     N'APPARTENANT PAS A LA MATRICE.
         DRBM
                                     < RECHERCHE DANS 'X' DU PREMIER ELEMENT
                                     < A 1 COMPRIS ENTRE LES INDEX (X) ET (Y).
         JC          TBT3D1          < ON N'A TROUVE AUCUN ELEMENT A 1...
         SBTM        O,X             < LE PREMIER TROUVE DOIT ETRE RESTAURE,
                                     < CAR 'DRBM' LE MET A 0...
TBT3D1:  EQU         $
         LAI         K               < (A)=0 A PRIORI : CE QUI SIGNIFIE QUE
                                     < L'ELEMENT A T(B) ESTER (B) EST A 0...
         CPR         B,X             < LE PREMIER ELEMENT TROUVE A 1 (X) EST-IL
                                     < L'ELEMENT QUE L'ON TESTE (B) ???
         JNE         TBT3D2          < NON, DONC L'ELEMENT A TESTER (B) EST A 0.
         LAI         MMOT            < OUI. DONC L'ELEMENT A TESTER (B) EST A 1.
TBT3D2:  EQU         $
         TBT         BITSIG          < ET ON POSITIONNE LE 'CARRY'...
         PLR         A,B,X,Y         < RESTAURATIONS...
         RSR                         < ET RETOUR...
         PAGE
<
<
<        M O D U L E   D ' A C C E S   A   L A   M A T R I C E   1  :
<
<
<        ARGUMENTS :
<                    (X,Y,W)=TROIS INDICES DE LA MATRICE BINAIRE 3D 'MAT1'.
<
<
SBT1:    EQU         $
         PSR         A
         LA          AMAT1           < (A)=ADRESSE DE LA MATRICE 1,
         BSR         ASBT3D          < MISE A 1 DE L'ELEMENT (X,Y,W).
         PLR         A
         RSR
RBT1:    EQU         $
         PSR         A
         LA          AMAT1           < (A)=ADRESSE DE LA MATRICE 1,
         BSR         ARBT3D          < MISE A 0 DE L'ELEMENT (X,Y,W).
         PLR         A
         RSR
TBT1:    EQU         $
         PSR         A
         LA          AMAT1           < (A)=ADRESSE DE LA MATRICE 1,
         BSR         ATBT3D          < TEST DE L'ELEMENT (X,Y,W).
         PLR         A
         RSR
         PAGE
<
<
<        M O D U L E   D ' A C C E S   A   L A   M A T R I C E   2  :
<
<
<        ARGUMENTS :
<                    (X,Y,W)=TROIS INDICES DE LA MATRICE BINAIRE 3D 'MAT2'.
<
<
SBT2:    EQU         $
         PSR         A
         LA          AMAT2           < (A)=ADRESSE DE LA MATRICE 1,
         BSR         ASBT3D          < MISE A 1 DE L'ELEMENT (X,Y,W).
         PLR         A
         RSR
RBT2:    EQU         $
         PSR         A
         LA          AMAT2           < (A)=ADRESSE DE LA MATRICE 1,
         BSR         ARBT3D          < MISE A 0 DE L'ELEMENT (X,Y,W).
         PLR         A
         RSR
TBT2:    EQU         $
         PSR         A
         LA          AMAT2           < (A)=ADRESSE DE LA MATRICE 1,
         BSR         ATBT3D          < TEST DE L'ELEMENT (X,Y,W).
         PLR         A
         RSR
         PAGE
<
<
<        E X I S T E N C E   D U   P O I N T   3 D  :
<
<
<        ARGUMENTS :
<                    (X,Y,W)=COORDONNEES (X,Y,Z) D'UN POINT 3D.
<
<
<        RESULTATS :
<                    LES INDICATEURS SONT POSITIONNES
<                    TELS QUE L'ON PUISSE FAIRE AU RETOUR
<                    DE CE SOUS-PROGRAMME :
<                                    'JE'  SI LE POINT ARGUMENT 'EXIST',
<                                    'JNE' SI LE POINT ARGUMENT 'NEXIST'.
<                    DE PLUS, (X,Y,Z) EST EVENTUELLEMENT
<                    MODIFIE SI LE POINT N'EXISTE PAS,
<                    ET QUE SUR UN OU PLUSIEURS AXES ON
<                    TRAVAILLE EN MODULO...
<
<
VALID:   EQU         $
         PSR         A               < SAUVEGARDES...
<
< TEST D'APPARTENANCE AU CUBE 3D :
<
VALID4:  EQU         $
         LR          X,A             < TEST DE 'X' :
         JAL         VALIDX          < ???
         CPI         LONGX
         JGE         VALIDX          < ???
VALID5:  EQU         $
         LR          Y,A             < TEST DE 'Y' :
         JAL         VALIDY          < ???
         CPI         LONGY
         JGE         VALIDY          < ???
VALID6:  EQU         $
         LR          W,A             < TEST DE 'Z' :
         JAL         VALIDZ          < ???
         CPI         LONGZ
         JGE         VALIDZ          < ???
<
< LE POINT (X,Y,Z) EXISTE :
<
VALID3:  EQU         $
         LAI         EXIST           < 'EXIST'.
<
< RETOUR :
<
VALID2:  EQU         $
         CPI         EXIST           < POSITIONNEMENT DES INDICATEURS...
         PLR         A               < RESTAURATIONS...
         RSR                         < ET RETOUR...
<
< TEST DES 'MODULO' :
<
VALIDX:  EQU         $
         CPZ         IMODX           < CALCULE-T'ON MODULO SUR 'OX' ???
         JE          VALID1          < NON ==> 'NEXIST"...
         ANDI        BIT>LOGX-N      < OUI...
         LR          A,X
         JMP         VALID5          < VERS LA SUITE DU TEST...
VALIDY:  EQU         $
         CPZ         IMODY           < CALCULE-T'ON MODULO SUR 'OY' ???
         JE          VALID1          < NON ==> 'NEXIST"...
         ANDI        BIT>LOGY-N      < OUI...
         LR          A,Y
         JMP         VALID6          < VERS LA SUITE DU TEST...
VALIDZ:  EQU         $
         CPZ         IMODZ           < CALCULE-T'ON MODULO SUR 'OZ' ???
         JE          VALID1          < NON ==> 'NEXIST"...
         ANDI        BIT>LOGZ-N      < OUI...
         LR          A,W
         JMP         VALID3          < ET 'EXIST'...
<
< LE POINT (X,Y,Z) N'EXISTE PAS :
<
VALID1:  EQU         $
         LAI         NEXIST          < 'NEXIST'.
         JMP         VALID2          < ET SORTIE...
         PAGE
<
<
<        T R A N S F O R M A T I O N   M A T R I C I E L L E  :
<
<
<        ARGUMENT :
<                    (X,Y,W)=COORDONNEES (X,Y,Z).
<
<
<        RESULTAT :
<                    (X)=A11*X+A12*Y+A13*Z+TRMATX EVENTUELLEMENT MODULO,
<                    (Y)=A21*X+A22*Y+A23*Z+TRMATY EVENTUELLEMENT MODULO,
<                    (W)=A31*X+A32*Y+A33*Z+TRMATZ EVENTUELLEMENT MODULO.
<
<
PRMAT:   EQU         $
<
< CALCUL DU NOUVEL 'X' :
<
         LR          X,A             < X,
         FLT
         FMP         MAT11           < A11*X,
         BSR         ASFWOR
         LR          Y,A             < Y,
         FLT
         FMP         MAT12           < A12*Y,
         BSR         APFWOR          < A11*X+A12*Y,
         LR          W,A             < Z,
         FLT
         FMP         MAT13           < A13*Z,
         BSR         APFWOR          < A11*X+A12*Y+A13*Z,
         FAD         TRMATX          < A11*X+A12*Y+A13*Z+TRANSX,
         BSR         AROND
         CPZ         IMODX           < FAUT-IL CALCULER MODULO SUR 'OX' ???
         JE          PRMAT1          < NON...
         ANDI        BIT>LOGX-N      < OUI...
PRMAT1:  EQU         $
         PSR         A               < SAUVEGARDE DU NOUVEL 'X'...
<
< CALCUL DU NOUVEL 'Y' :
<
         LR          X,A             < X,
         FLT
         FMP         MAT21           < A21*X,
         BSR         ASFWOR
         LR          Y,A             < Y,
         FLT
         FMP         MAT22           < A22*Y,
         BSR         APFWOR          < A21*X+A22*Y,
         LR          W,A             < Z,
         FLT
         FMP         MAT23           < A23*Z,
         BSR         APFWOR          < A21*X+A22*Y+A23*Z,
         FAD         TRMATY          < A21*X+A22*Y+A23*Z+TRANSY,
         BSR         AROND
         CPZ         IMODY           < FAUT-IL CALCULER MODULO SUR 'OY' ???
         JE          PRMAT2          < NON...
         ANDI        BIT>LOGY-N      < OUI...
PRMAT2:  EQU         $
         PSR         A               < SAUVEGARDE DU NOUVEL 'Y'...
<
< CALCUL DU NOUVEAU 'Z' :
<
         LR          X,A             < X,
         FLT
         FMP         MAT31           < A31*X,
         BSR         ASFWOR
         LR          Y,A             < Y,
         FLT
         FMP         MAT32           < A32*Y,
         BSR         APFWOR          < A31*X+A32*Y,
         LR          W,A             < Z,
         FLT
         FMP         MAT33           < A33*Z,
         BSR         APFWOR          < A31*X+A32*Y+A33*Z,
         FAD         TRMATZ          < A31*X+A32*Y+A33*Z+TRANSZ,
         BSR         AROND
         CPZ         IMODZ           < FAUT-IL CALCULER MODULO SUR 'OZ' ???
         JE          PRMAT3          < NON...
         ANDI        BIT>LOGZ-N      < OUI...
PRMAT3:  EQU         $
         LR          A,W             < Z,
         PLR         A
         LR          A,Y             < Y,
         PLR         A
         LR          A,X             < X.
<
< RETOUR :
<
         RSR
         PAGE
<
<
<        R E M P L I S S A G E   R E C U R S I F  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RECURSIF
<                    PARCOURS L'ENSEMBLE GENERE ET
<                    MEMORISE DANS 'MAT1', ET NE GARDE
<                    QUE LE SOUS-ENSEMBLE CONNEXE
<                    RACCORDE AU POINT (0,0,0).
<
<
<        ARGUMENT :
<                    (X,Y,W)=POINT COURANT.
<
<
REMP:    EQU         $
<
< TEST DES SORTIES DU "CUBE" :
<
         BSR         AVALID          < TEST DES COORDONNEES (X,Y,Z) :
         JNE         REMP1           < LE POINT (X,Y,Z) EST HORS DU CUBE, ON
                                     < ARRETE LA RECURSIVITE...
<
< TEST DU POINT COURANT :
<
         BSR         ATBT1           < TEST DU POINT COURANT (X,Y,Z) DANS
                                     < L'ESPACE 'MAT1' :
         JNC         REMP1           < IL N'EST PAS OCCUPE : ON ARRETE LA
                                     < RECURSIVITE...
         BSR         ATBT2           < IL EST OCCUPE, MAIS EST-ON DEJA PASSE
                                     < SUR LUI ???
         JC          REMP1           < OUI, DONC INUTILE DE LA RE-MARQUER,
                                     < ON ARRETE LA RECURSIVITE...
         BSR         ASBT2           < NON, IL EST OCCUPE, NON ENCORE MARQUE
                                     < ET CONNECTE A LA SOURCE : ON LE MARQUE
                                     < DONC DANS 'MAT2'...
<
< ACCES AUX 6-VOISINS :
<
REMP2:   EQU         $
         LAI         K               < (A)=NUMERO DU VOISIN COURANT.
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,W
         AD          &AINCZ          < MODIFICATION DE LA COORDONNEE 'Z',
         XR          A,W
         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        I,A             < PASSAGE AU VOISIN SUIVANT...
         CPI         NREMP+I         < 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)...
XWOR%1:  VAL         CODBT=FMASK(K?NREMP=FCINST)NREMP
XWOR%2:  VAL         COSBT?XWOR%1=FMASK(K=FCINST
         IF          XWOR%2-NREMP,,XEIF%,XEIF%
XWOR%1:  VAL         XWOR%1-I        < RECHERCHE DE LA PUISSANCE DE 2
                                     < IMMEDIATEMENT SUPERIEURE.
XEIF%:   VAL         ENDIF
DREMP::  VAL         NBITMO-XWOR%1   < DECALAGE D'ACCES...
         IF          NBITMO/DREMP(K=FCREST,,XEIF%,
DREMP:   VAL         DREMP+I         < RECHERCHE D'UN DIVISEUR DE 'NBITMO'...
XEIF%:   VAL         ENDIF
         IF          NBITMO/DREMP(K=FCREST,,XEIF%,
         IF          ATTENTION : 'DREMP' EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
XWOR%1:  VAL         LONGX*LONGY*LONGZ
                                     < NOMBRE MAXIMUM D'APPELS RECURSIFS.
XWOR%3:  VAL         NBITMO/DREMP    < NOMBRE D'APPELS MEMORISES DANS UN MOT.
XWOR%4:  VAL         XWOR%1/XWOR%3   < NOMBRE DE MOTS NECESSAIRES POUR UN
                                     < MAXIMUM 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         K               < CLEAR 'B' (SUITE DU SUPER-BUG...).
         SLRD        NBITMO/DREMP=K  < 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         W               < (X)=NOMBRE DE MOTS A DEPLACER.
         RCDA
         PLR         B               < RESTAURATION DU NUMERO DE ZONE,
         LAI         K
         SLLD        NBITMO=K        < 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        XXQUIT          < E R R E U R   P R O G R A M M E ...
REMP9:   EQU         $
         RSR                         < RETOUR REEL A L'APPELANT...
         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        XXQUIT          < 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        XXQUIT          < 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         K               < CLEAR 'B' (OUFFF... BUG PAS FACILE !!!).
         SLRD        NBITMO/DREMP=K  < 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         W               < (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         K
         SLLD        NBITMO=K        < 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         W               < (X)=NOMBRE DE MOTS A DEPLACER,
         WCDA
                                     < MISE A JOUR DE LA PILE...
<
< ET RETOUR :
<
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        G E N E R A T E U R   R E D O N N A N T   T O U J O U R S
<        L E   M E M E   V E C T E U R   A L E A T O I R E   E N
<        U N   P O I N T   D O N N E  :
<
<
<        ARGUMENT :
<                    (X,Y,W)=COORDONNEES DU POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=RDN(XS,YS,ZS,GRAINE).
<
<
SPRDN:   EQU         $
<
< GENERATION ALEATOIRE :
<
         LR          X,A             < (A)=COORDONNEE 'X',
         EORR        B,A             < ET ON SE RAMENE SUR UN MOT...
         STA         FWORK4          < SAVE F1(XS)...
         LR          Y,A             < (A)=COORDONNEE 'Y',
         EOR         RDN1            < ??!???!
         STA         FWORK5          < SAVE F2(YS)...
         MP          FWORK4          < ET ON CONSTRUIT
         XR          A,B             < UNE FONCTION UNIQUE
         AD          FWORK5          < DU NOEUD COURANT,
         SB          FWORK4          < TELLE QUE :
                                     < F(X,Y)#F(Y,X),
                                     < F(X,Y)=X*Y+Y-X.
         EORR        B,A
         EORR        W,A             < ET ON RAJOUTE LA TROISIEME COORDONNEE...
         MP          GRAINE          < D'OU F(GRAINE,X,Y,Z), TELLE QUE :
                                     < F(X,Y)#F(Y,X) AFIN D'EVITER UNE SYMETRIE
                                     < PAR RAPPORT A UNE DIAGONALE...
         EORR        B,A
         MP          AMAGIK          < DONT ON FAIT UN "SHUFFLING"...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
<
< MISE A L'ECHELLE :
<
<
<        NOTA :
<                      ON DOIT POUR METTRE LA
<                    VALEUR 'RDN' A L'ECHELLE
<                    CALCULER L'EXPRESSION :
<
<                    (SUP/(-32768))*(-RDN/2+16384+(RDN/2-16384)*(INF/SUP)),
<
<                    QUI SE SIMPLIFIE EN :
<
<                    (SUP/65536)*(RDN*(1-(INF/SUP))+32768*(1+(INF/SUP))).
<
         FLT                         < ON FLOTTE 'RDN',
         FMP         UNMIS           < RDN*(1-(INF/SUP)),
         FAD         UNPIS           < RDN*(1-(INF/SUP))+32768*(1+(INF/SUP)),
         FMP         SUP64           < (SUP/65536)*(...).
<
< ET SORTIE :
<
         RSR
         PAGE
<
<
<        T R A C E   D ' U N   D I S Q U E  :
<
<
<        FONCTION :
<                      CE MODULE TRACE UN DISQUE EN
<                    DEGRADE DESTINE A REPRESENTER
<                    UNE SPHERE PROJETEE.
<
<
<        ARGUMENTS :
<                    (X,Y)=CENTRE DU DISQUE.
<
<
CERCLE:  EQU         $
         CPZ         IVISD           < FAUT-IL TRACER LES DISQUES ???
         JE          CERCL4          < NON...
<
< INITIALISATIONS :
<
         PSR         X,Y
         LR          X,B             < (B)='X' DU CENTRE,
         PSR         Y               < SAUVEGARDE DE 'Y' DU CENTRE.
         LA          RAYON
         SBR         A,X             < ON SE PLACE EN HAUT ET A GAUCHE
         SBR         A,Y             < D'UN CARRE CIRCONSCRIT AU DISQUE.
         STX         VECTX1          < INITIALISATION DE L'ABSCISSE INITIALE
                                     < DE CHAQUE LIGNE,
         STY         VECTY1          < INITIALISATION DE LA COORDONNEE 'Y'.
         LA          SAVEZ
         ADRI        Z,A             < POUR EVITER LE NOIR...
         SLLS        DECZDK          < AMPLIFICATION...
         ADRI        -Z,A            < ET DESATURATION...
         STA         SAVEZP          < SAUVEGARDE DE LA COORDONNEE 'Z'.
         PLR         Y               < ON A :
                                     < (B,Y)=COORDONNEES DU CENTRE.
<
< BALAYAGE VERTICAL :
<
         LX          RAYON
         ADR         X,X
         ADRI        Z,X             < (X)=NOMBRE DE LIGNES A BALAYER.
CERCL1:  EQU         $
         LA          VECTX1
         PSR         A,X             < SAUVEGARDE DE L'ABSCISSE INITIALE
                                     < DE CHAQUE LIGNE (A) ET DU NOMBRE DE
                                     < LIGNES A TRACER (X).
<
< BALAYAGE HORIZONTAL :
<
         LX          RAYON
         ADR         X,X
         ADRI        Z,X             < (X)=NOMBRE DE LIGNES A BALAYER.
CERCL2:  EQU         $
         PSR         B               < SAUVEGARDE DE LA COORDONNEE 'X'
                                     < DU CENTRE.
         LA          VECTX1          < X1,
         SBR         B,A             < X1-XC,
         BSR         AFLT
         #/FST#      FWORK1          < X1-XC,
         FMP         FWORK1          < (X1-XC)**2,
         BSR         ASFWOR
         LA          VECTY1          < Y1,
         SBR         Y,A             < Y1-YC ((XC,YC) DESIGNE LE CENTRE).
         BSR         AFLT
         #/FST#      FWORK2          < Y1-YC,
         FMP         FWORK2          < (Y1-YC)**2,
         BSR         APFWOR          < (X1-XC)**2+(Y1-YC)**2,
         BSR         ARAC            < ET CALCUL DE LA DISTANCE DU POINT
                                     < COURANT (X1,Y1) AU CENTRE (XC,YC) :
         BSR         ATSFLO
         BSR         AROND
         CP          RAYON           < EST-ON HORS DU DISQUE ??
         JGE         CERCL3          < OUI, ON IGNORE CE POINT...
         SB          RAYON           < NON :
         NGR         A,A             < (A)=DISTANCE DU POINT COURANT AU BORD
                                     <     DU DISQUE.
         CPZ         INEW1           < CHOIX DES NIVEAUX :
         JE          CERCL5          < 2 PLANS 'Z' PARALLELES PEUVENT UTILISER
                                     < DES NIVEAUX COMMUNS...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST CI-DESSUS EST IDIOT !!!
XEIF%:   VAL         ENDIF
         ADRI        Z,A             < DANS CETTE METHODE, LES NIVEAUX SONT
                                     < PROPRES A UN PLAN 'Z'... CE QUI PERMET
                                     < DE LES DISTINGUER...
         LR          A,B             < (B)=DISTANCE AU BORD DU DISQUE TELLE
                                     <     QU'ELLE NE SOIT PAS NULLE.
         LA          SAVEZ           < Z,
         SLLS        DECZDK          < CADRAGE,
         ORR         B,A             < (A)=NIVEAU FONCTION DE LA DISTANCE AU
                                     <     BORD ET DU 'Z'...
         JMP         CERCL6          < VERS LE TRACE...
CERCL5:  EQU         $
         MP          SAVEZP          < DANS CETTE METHODE, 2 PLANS 'Z' PEUVENT
                                     < UTILISER LES MEMES NIVEAUX (EN FAIT SE
                                     < RECOUVRIR...).
         DV          RAYON           < (A)=NIVEAU(DISTANCE AU CENTRE,Z).
CERCL6:  EQU         $
         PSR         X,Y
         LX          VECTX1
         LY          VECTY1
         BSR         APOINT          < MARQUAGE DE (X,Y) AVEC LE NIVEAU (A).
         PLR         X,Y
CERCL3:  EQU         $
         PLR         B               < RESTAURE L'ABSCISSE DU CENTRE,
         IC          VECTX1          < ET PROGRESSION SUR LA LIGNE,
         JDX         CERCL2          < A CONDITION DE N'ETRE POINT EN BOUT
                                     < DE LIGNE...
         PLR         A,X             < RESTAURE :
                                     < (A)='VECTX1' DE DEBUT DE LIGNE,
                                     < (X)=NOMBRE DE LIGNES A TRACER...
         STA         VECTX1          < ON SE PLACE EN DEBUT
         IC          VECTY1          < DE LA NOUVELLE LIGNE,
         JDX         CERCL1          < SI ELLE EXISTE...
<
< ET RETOUR :
<
         PLR         X,Y
CERCL4:  EQU         $
         RSR
         PAGE
<
<
<        T R A C E   D ' U N   P E T I T   C U B E  :
<
<
<        FONCTION :
<                      CE MODULE EST DESTINE
<                    A MATERIALISER LES SITES
<                    OCCUPES A L'AIDE DE PETITS
<                    CUBES.
<
<
<        ARGUMENTS :
<                    (X,Y)=COORDONNEES PROJETEES DU CENTRE DU CUBE.
<
<
CUBE:    EQU         $
         CPZ         IVISK           < FAUT-IL TRACER LES CUBES ???
         JE          CUBE1           < NON...
<
< OUI, INITILISATIONS :
<
         PSR         X,Y             < SAUVEGARDES.
         LA          PROXS2
         ADR         A,X             < ABSCISSE DU CENTRE DE LA FACE AVANT,
         LA          PROYS2
         SBR         A,Y             < ORDONNEE DU CENTRE DE LA FACE AVANT.
<
< CALCUL DE LA COULEUR DU TRACE :
<
         LA          SAVEZ           < Z,
         SLLS        DECZDK          < CADRAGE DE 'Z',
         ORI         MMOT>DECZDK)MMOT
                                     < (A)=NIVEAU DE TRACE DE LA PREMIERE
                                     <     CONNEXION.
         STA         VECTNI          < CE QUI DONNE LE NIVEAU DU TRACE...
<
< TRACE DE LA FACE AVANT :
<
         DC          VECTNI          < CHOIX DE LA COULEUR...
         LR          X,A
         SB          COTES2
         SLLS        XXDEDX
         STA         VECGX1          < ABSCISSE DU SOMMET HAUT-GAUCHE,
         STA         VECGX2          < ET ABSCISSE DU SOMMET BAS-GAUCHE.
         LR          Y,A
         AD          COTES2
         PSR         A
         SLLS        XXDEDY
         STA         VECGY1          < ORDONNEE DU SOMMET HAUT-GAUCHE,
         PLR         A
         SB          COTE
         SLLS        XXDEDY
         STA         VECGY2          < ET ORDONNEE DU SOMMET BAS-GAUCHE.
         LX          COTE            < (X)=NOMBRE DE VECTEURS A TRACER.
         ADRI        I,X
CUBE2:   EQU         $
         BSR         AVE512          < TRACE PAR BALAYAGE VERTICAL.
         DO          BIT>XXDEDX
         IC          VECGX1          < PROGRESSION DE L'ABSCISSE HAUTE.
         DO          BIT>XXDEDX
         IC          VECGX2          < PROGRESSION DE L'ABSCISSE BASSE.
         JDX         CUBE2           < ET BALAYAGE...
         DO          BIT>XXDEDX
         DC          VECGX1          < RE-POSITIONNEMENT ABSCISSE HAUTE.
         IC          VECTNI          < ET RESTAURATION DU NIVEAU...
<
< TRACE DE LA FACE DU DESSUS :
<
         LA          VECGX1
         SB          PROJXG
         STA         VECGX2          < POSITIONNEMENT ABSCISSE ARRIERE.
         LA          VECGY1
         AD          PROJYG
         STA         VECGY2          < POSITIONNEMENT ORDONNEE ARRIERE.
         LX          COTE            < (X)=NOMBRE DE VECTEURS A TRACER.
         ADRI        I,X
CUBE3:   EQU         $
         BSR         AVE512          < TRACE PAR BALAYAGE OBLIQUE.
         DO          BIT>XXDEDX
         DC          VECGX1          < REGRESSION DE L'ABSCISSE HAUTE.
         DO          BIT>XXDEDX
         DC          VECGX2          < REGRESSION DE L'ABSCISSE ARRIERE.
         JDX         CUBE3           < ET BALAYAGE...
         DO          BIT>XXDEDX
         IC          VECGX1          < RE-POSITIONNEMENT DE L'ABSCISSE HAUTE.
         DO          BIT>XXDEDX
         IC          VECGX2          < RE-POSITIONNEMENT DE L'ABSCISSE ARRIERE.
<
< TRACE DE LA FACE DE COTE :
<
         DC          VECTNI          < CHOIX DU
         DC          VECTNI          <          NIVEAU.
         LX          COTE            < (X)=NOMBRE DE VECTEURS A TRACER.
         ADRI        I,X
CUBE4:   EQU         $
         BSR         AVE512          < TRACE PAR BALAYAGE OBLIQUE...
         DO          BIT>XXDEDY
         DC          VECGY1          < REGRESSION DE L'ORDONNEE HAUTE.
         DO          BIT>XXDEDY
         DC          VECGY2          < REGRESSION DE L'ORDONNEE ARRIERE.
         JDX         CUBE4           < ET BALAYAGE...
         DO          BIT>XXDEDY
         IC          VECGY1          < RE-POSITIONNEMENT ORDONNEE HAUTE.
         DO          BIT>XXDEDY
         IC          VECGY2          < RE-POSITIONNEMENT ORDONNEE ARRIERE.
<
< MARQUAGE DES ARETES :
<
         DC          VECTNI          < CHOIX DU NIVEAU.
         BSR         AVE512          < COTE HORIZONTAL BAS GAUCHE.
         LA          VECGX2
         STA         VECGX1
         LA          VECGY2
         AD          COTEG
         STA         VECGY1
         BSR         AVE512          < COTE VERTICAL ARRIERE GAUCHE.
         LA          VECGY1
         STA         VECGY2
         LA          VECGX1
         AD          COTEG
         STA         VECGX2
         BSR         AVE512          < COTE HORIZONTAL ARRIERE HAUT.
         LA          VECGX2
         AD          PROJXG
         STA         VECGX1
         LA          VECGY2
         SB          PROJYG
         STA         VECGY1
         BSR         AVE512          < COTE HORIZONTAL HAUT DROIT.
         LA          VECGX1
         STA         VECGX2
         LA          VECGY1
         SB          COTEG
         STA         VECGY2
         BSR         AVE512          < COTE VERTICAL AVANT DROIT.
         LA          VECGX2
         SB          COTEG
         STA         VECGX1
         LA          VECGY2
         STA         VECGY1
         BSR         AVE512          < COTE HORIZONTAL AVANT BAS.
         LA          VECGX1
         STA         VECGX2
         LA          VECGY1
         AD          COTEG
         STA         VECGY2
         BSR         AVE512          < COTE VERTICAL AVANT GAUCHE.
         LA          VECGX2
         AD          COTEG
         STA         VECGX1
         LA          VECGY2
         STA         VECGY1
         BSR         AVE512          < COTE HORIZONTAL AVANT HAUT.
         LA          VECGX2
         SB          PROJXG
         STA         VECGX1
         LA          VECGY2
         AD          PROJYG
         STA         VECGY1
         BSR         AVE512          < COTE HORIZONTAL HAUT GAUCHE.
<
< ET RETOUR :
<
         PLR         X,Y
CUBE1:   EQU         $
         RSR
         PAGE
<
<
<        T R A C E   D E S   C O N N E X I O N S  :
<
<
<        FONCTION :
<                      SUIVANT LE TRIEDRE UNITAIRE
<                    (+I,-I,-I), ON REGARDE LES
<                    VOISINS DU SITE COURANT, ET
<                    SI LES CONNEXIONS EXISTENT, ON
<                    LES VISUALISE...
<
<
<        AGUMENTS :
<                    (X,Y)=COORDONNEES PROJETEES DU SITE COURANT.
<
<
CONEX:   EQU         $
         CPZ         IVISC           < FAUT-IL VISUALISER LES CONNEXIONS ???
         JE          CONEX9          < NON...
         PSR         A,X,Y,W         < SAUVEGARDES...
<
< CALCUL DE LA COULEUR DU TRACE :
<
         LA          SAVEZ           < Z,
         CPZ         INEW1           < CHOIX DE L'ATTRIBUTION DES NIVEAUX :
         JE          CONEX4          < LES MEMES POUR LES 3 CONNEXIONS, ET PLUS
                                     < SOMBRE QUE LES DISQUES.
         SLLS        DECZDK          < CADRAGE DE 'Z',
         ORI         MMOT>DECZDK)MMOT
                                     < (A)=NIVEAU DE TRACE DE LA PREMIERE
                                     <     CONNEXION.
         JMP         CONEX5          < VERS SA MEMORISATION...
CONEX4:  EQU         $
         ADRI        Z,A             < LES 3 CONNEXIONS ONT LE MEME NIVEAU, ET
                                     < MALHEUREUSEMENT CELUI-CI EST AUSSI UTI-
                                     < LISE POUR LES ISQUES...
                                     < (POUR EVITER LES NOIRS +Z...)
         SLLS        DECZCO          < AMPLIFICATION...
         ADRI        -Z,A            < ET DESATURATION...
CONEX5:  EQU         $
         STA         VECTNI          < CE QUI DONNE LE NIVEAU DU TRACE...
<
< MISE EN PLACE DE L'ORIGINE
< DES 1,2 OU 3 VECTEURS A TRACER :
<
         LR          X,A
         SLLS        XXDEDX
         STA         VECGX1          < ABSCISSE GRAPHIQUE,
         LR          Y,A
         SLLS        XXDEDY
         STA         VECGY1          < ET ORDONNEE (PASSAGE 'TV' --> GRAPHIQUE).
<
< MISE EN PLACE DU SITE COURANT :
<
         LX          SAVEX           < X,
         LY          SAVEY           < Y,
         LA          SAVEZ
         LR          A,W             < Z.
<
< TEST DE LA PREMIERE CONNEXION :
<
         ADRI        +I,W            < Z+1,
         BSR         AVALID          < LE SITE EXISTE-T'IL ???
         JNE         CONEX1          < NON, ON L'IGNORE...
         BSR         ATBT1           < OUI, EST-IL OCCUPE ???
         JNC         CONEX1          < NON, ON L'IGNORE...
         LA          VECGX1          < OUI,
         AD          PROJX
         STA         VECGX2          < MISE EN PLACE
         LA          VECGY1
         SB          PROJY
         STA         VECGY2          <               DE SA PROJECTION,
         BSR         AVE512          < ET TRACE DE LA CONNEXION COURANTE
                                     < ((X,Y,Z),(X,Y,Z+1)).
CONEX1:  EQU         $
         CPZ         INEW1           < CHOIX DES NIVEAUX :
         JE          CONEX6          < LE MEME POUR LES 3 CONNEXIONS...
         DC          VECTNI          < UN PAR CONNEXION.
CONEX6:  EQU         $
         ADRI        -I,W            < ET RESTAURE 'Z'...
<
< TEST DE LA DEUXIEME CONNEXION :
<
         ADRI        +I,Y            < Y+1,
         BSR         AVALID          < LE SITE EXISTE-T'IL ???
         JNE         CONEX2          < NON, ON L'IGNORE...
         BSR         ATBT1           < OUI, EST-IL OCCUPE ???
         JNC         CONEX2          < NON, ON L'IGNORE...
         LA          VECGX1          < OUI,
         STA         VECGX2          < MISE EN PLACE
         LA          VECGY1
XWOR%1:  VAL         +I>DECY>XXDEDY
         ADRI        XWOR%1,A
         STA         VECGY2          <               DE SA PROJECTION,
         BSR         AVE512          < ET TRACE DE LA CONNEXION COURANTE
                                     < ((X,Y,Z),(X,Y+1,Z)).
CONEX2:  EQU         $
         CPZ         INEW1           < CHOIX DES NIVEAUX :
         JE          CONEX7          < LE MEME POUR LES 3 CONNEXIONS...
         DC          VECTNI          < UN PAR CONNEXION.
CONEX7:  EQU         $
         ADRI        -I,Y            < ET RESTAURE 'Y'...
<
< TEST DE LA TROISIEME CONNEXION :
<
         ADRI        -I,X            < X-1,
         BSR         AVALID          < LE SITE EXISTE-T'IL ???
         JNE         CONEX3          < NON, ON L'IGNORE...
         BSR         ATBT1           < OUI, EST-IL OCCUPE ???
         JNC         CONEX3          < NON, ON L'IGNORE...
         LA          VECGX1          < OUI,
XWOR%1:  VAL         +I>DECX>XXDEDX
XWOR%1:  VAL         -XWOR%1
         ADRI        XWOR%1,A
         STA         VECGX2          < MISE EN PLACE
         LA          VECGY1
         STA         VECGY2          <               DE SA PROJECTION,
         BSR         AVE512          < ET TRACE DE LA CONNEXION COURANTE
                                     < ((X,Y,Z),(X-1,Y,Z)).
CONEX3:  EQU         $
         ADRI        +I,X            < ET RESTAURE 'X'...
<
< ET RETOUR :
<
         PLR         A,X,Y,W
CONEX9:  EQU         $
         RSR
         PAGE
<
<
<        P O I N T   D ' E N T R E E  :
<
<
DEBUT:   EQU         $
<
< INITIALISATION DES REGISTRES :
<
         LRM         C,K
         WORD        COM+DEPBAS      < POSITIONNEMENT DE 'C',
         WORD        STACK-DEPILE    < ET DE 'K'.
<
< CONNEXION A LA 'CDA' :
<
         LAI         PAGER
         BSR         AGPCDA          < AFIN D'ATTEINDRE LA MEMOIRE DU '68000'
                                     < ET LA MEMOIRE 'SOLAR' QUI LA PRECEDE
                                     < AFIN D'Y METTRE 'BUF'...
<
<
<        E N T R Y   D E   R E B O U C L A G E  :
<
<
DEBUT4:  EQU         $
DEBUT9:  EQU         $
<
< MODIFICATION A PRIORI DU 'PRESC' :
<
         LRM         A
         WORD        DEBUT5          < POUR 'XXXPRE'...
         ACTD        XXXPRE          < ON CHANGE ALORS SYSTEMATIQUEMENT APRES
                                     < PASSAGE ICI LE 'PRESC' DU PROGRAMME, AFIN
                                     < DE REVENIR SUR LA VISUALISATION APRES
                                     < CHAQUE ALT-MODE (VIA 'DEBUT5'...).
<
<
<        I N I T I A L I S A T I O N S  :
<
<
INIT01:  EQU         $
<
< RE-INITIALISATION EVENTUELLE
< DE CERTAINS RELAIS :
<
         LRM         A,B
         WORD        MAT1
         WORD        MAT1-IJIJDX,X
         STA         AMAT1
         STB         AMAT1X
         LRM         A,B
         WORD        MAT2
         WORD        MAT2-IJIJDX,X
         STA         AMAT2
         STB         AMAT2X
<
< INITIALISATION A PRIORI
< DU TRACE DES CONNEXIONS :
<
         LRM         A,B,X,Y
         WORD        CORBT?BANTI=FMASK(K=FCINST
         WORD        MMOT
         WORD        K
         WORD        COSBT?VELODD=FMASK(K?VECTSB=FCINST
         STA         VECANT          < PAS D'ANTI-ALIASING,
         STB         VEPOIN          < PAS DE POINTILLE,
         STX         VEDECA          < PAS DE DECALAGE DES NIVEAUX,
         STY         VECTRS          < MODE 'SBT' EN LOGIQUE BINAIRE.
<
< GENERATEUR ALEATOIRE :
<
         LA          SUPRDN
         FLT
         #/FST#      FSUP            < BORNE SUPERIEURE ('SUP'),
         LA          INFRDN
         FLT
         #/FST#      FINF            < BORNE INFERIEURE ('INF'),
         FDV         FSUP            < INF/SUP,
         PSR         A,B             < ET SAVE...
         FSB         F1              < (INF/SUP)-1,
         FNEG                        < 1-(INF/SUP),
         #/FST#      UNMIS           < UNMIS=1-(INF/SUP).
         PLR         A,B             < INF/SUP,
         FAD         F1              < 1+(INF/SUP),
         FMP         INF32           < 32768*(1+(INF/SUP)),
         #/FST#      UNPIS           < UNPIS=32768*(1+(INF/SUP)).
         #/FLD#      FSUP            < SUP,
         FDV         INF64           < SUP/65536,
         #/FST#      SUP64           < SUP64=SUP/65536.
<
< DONNEES DE PROJECTION :
<
         #/FLD#      COST            < COS(TETA),
         FMP         COST            < COS(TETA)**2,
         FSB         F1
         FNEG                        < 1-COS(TETA)**2,
         BSR         ARAC
         #/FST#      SINT            < SIN(TETA).
<
< INITIALISATIONS DE L'IMAGEUR :
<
GEN69:   EQU         $
         CPZ         IERASE          < FAUT-IL EFFACER ???
         JE          GEN69N          < NON...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST CI-DESSUS EST IDIOT !!!
XEIF%:   VAL         ENDIF
<
< EFFACEMENT DE L'ECRAN :
<
XWOR%1:  VAL         NIV256=K
         IF          BIT>XWOR%1-NIV256,,XWOR%,
         IF          ATTENTION : LE CALCUL DU MASQUE SELECTANT TOUS
         IF          LES PLANS EST ABSURDE !!!
XWOR%:   VAL         ENDIF
         LAI         NIV256-MASK)MOCD
         STA         MCDAJ
         LA          ARPLAN          < (A)=ADRESSE DU REGISTRE DE SELECTION...
         BSR         APWCDA          < ET ON SELECTIONNE TOUS LES PLANS...
         LAI         ERASE
         STA         MCDAJ
         LA          ARCMD
         BSR         APWCDA          < EFFACEMENT DE L'ECRAN, ET REINITIALISA-
                                     < TION DE TOUS LES REGISTRES...
         LAD         TEMPO
         SVC                         < ET ON FAIT UN PETIT DODO...
         LAI         XCTRL1
         STA         MCDAJ
         LA          ACTRL1
         BSR         APWCDA          < INITIALISATION DE 'CTRL1'.
         LAI         XCTRL2
         STA         MCDAJ
         LA          ACTRL2
         BSR         APWCDA          < INITIALISATION DE 'CTRL2'.
GEN69N:  EQU         $
<
<
<        P R O J E C T I O N   D U   V E C T E U R
<        U N I T A I R E   D E   L ' A X E   ' Z '  :
<
<
         LAI         +I              < 'Z'.
         SLLS        DECZ
         LR          A,W             < AMPLIFICATION DE 'Z'.
         FLT
         PSR         A,B             < PRISE EN COMPTE DE 'Z' :
         FMP         COST
         BSR         AROND
         SLLS        XXDEDX          < PASSAGE AUX COORDONNEES GRAPHIQUES,
         STA         PROJX           < ET MEMORISATION...
         PLR         A,B             < PRISE EN COMPTE DE 'Z' :
         FMP         SINT
         BSR         AROND
         SLLS        XXDEDY          < PASSAGE AUX COORDONNEES GRAPHIQUES,
         STA         PROJY           < ET MEMORISATION...
<
< PREPARATION DU TRACE
< EVENTUEL DES PETITS CUBES :
<
         LA          COTE
         SLLS        XXDEDX?XXDEDY
         STA         COTEG           < COTE EN UNITE GRAPHIQUE...
         LA          COTE            < (A)=COTE DES PETITS CUBES.
         SLRS        XXXMOY=K
         STA         COTES2          < ET MEMORISATION DU DEMI-COTE...
         LA          COTE            < COTE DU CARRE,
         SLRS        DECX?DECY-DECZ  < POUR SIMULER LA PERSPECTIVE...
         FLT
         PSR         A,B             < PRISE EN COMPTE DU COTE :
         FMP         COST
         BSR         AROND
         SLLS        XXDEDX          < PASSAGE AUX COORDONNEES GRAPHIQUES,
         STA         PROJXG          < ET MEMORISATION...
         SLRS        XXXMOY=K+XXDEDX
         STA         PROXS2          < ET MEMORISATION...
         PLR         A,B             < PRISE EN COMPTE DU COTE :
         FMP         SINT
         BSR         AROND
         SLLS        XXDEDY          < PASSAGE AUX COORDONNEES GRAPHIQUES,
         STA         PROJYG          < ET MEMORISATION...
         SLRS        XXXMOY=K+XXDEDY
         STA         PROYS2          < ET MEMORISATION...
<
<
<        G E N E R A T I O N   D E   L A   M A T R I C E   D E S   S I T E S  :
<
<
         LRM         W
         WORD        K               < (W)=COORDONNEE 'Z'.
GEN001:  EQU         $
         LRM         Y
         WORD        K               < (Y)=COORDONNEE 'Y'.
GEN002:  EQU         $
         LRM         X
         WORD        K               < (X)=COORDONNEE 'X'.
GEN003:  EQU         $
         BSR         ARDN            < (A,B)=RDN(X,Y,W).
         IF          RDNXYZ-RDN0,XEIF%,,XEIF%
         FCAM        RDNSEU          < OU EST-ON PAR RAPPORT AU SEUIL ???
         JG          GEN011          < AU-DESSUS  : MARQUAGE A 1,
         BSR         ARBT1           < AU-DESSOUS : MARQUAGE A 0.
XEIF%:   VAL         ENDIF
         IF          RDNXYZ-RDNX,XEIF%,,XEIF%
         BSR         AROND           < (A)=RDN(X,Y,W),
         CPR         A,X             < CHOIX ENTRE LE MARQUAGE OU PAS DU SITE
                                     < COURANT (X,Y,W) :
         JLE         GEN011          < (X)<=(A) : MARQUAGE A 1,
         BSR         ARBT1           < (X)>(A)  : MARQUAGE A 0.
XEIF%:   VAL         ENDIF
         IF          RDNXYZ-RDNY,XEIF%,,XEIF%
         BSR         AROND           < (A)=RDN(X,Y,W),
         CPR         A,Y             < CHOIX ENTRE LE MARQUAGE OU PAS DU SITE
                                     < COURANT (X,Y,W) :
         JLE         GEN011          < (Y)<=(A) : MARQUAGE A 1,
         BSR         ARBT1           < (Y)>(A)  : MARQUAGE A 0.
XEIF%:   VAL         ENDIF
         IF          RDNXYZ-RDNZ,XEIF%,,XEIF%
         BSR         AROND           < (A)=RDN(X,Y,W),
         CPR         A,W             < CHOIX ENTRE LE MARQUAGE OU PAS DU SITE
                                     < COURANT (X,Y,W) :
         JLE         GEN011          < (Z)<=(A) : MARQUAGE A 1,
         BSR         ARBT1           < (Z)>(A)  : MARQUAGE A 0.
XEIF%:   VAL         ENDIF
         JMP         GEN012
GEN011:  EQU         $
         BSR         ASBT1           < MARQUAGE DU SITE COURANT...
GEN012:  EQU         $
         ADRI        I,X
         LR          X,A
         CPI         LONGX
         JL          GEN003          < PARCOURS DE L'AXE DES 'X'.
         ADRI        I,Y
         LR          Y,A
         CPI         LONGY
         JL          GEN002          < PARCOURS DE L'AXE DES 'Y'.
         ADRI        I,W
         LR          W,A
         CPI         LONGZ
         JL          GEN001          < PARCOURS DE L'AXE DES 'Z'.
<
<
<        G E N E R A T I O N   D U   S O U S - E N S E M B L E
<                    C O N N E X E  :
<
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         ICONEX          < FAUT-IL LE GENERER ???
         JE          GEN101          < NON...
<
< OUI, NETTOYAGE DE 'MAT2' :
<
         LRM         X
         WORD        LONMAT/NBITMO
GEN111:  EQU         $
         STZ         &AMAT2X         < CLEAR DE TOUS LES SITES...
         JDX         GEN111
<
< GENERATION DU SOUS-ENSEMBLE
< DES SITES CONNECTES :
<
         LRM         X,Y,W           < (X,Y,Z)=(0,0,0).
         WORD        K;K;K
         BSR         AREMP           < EXTRACTION DU SOUS-ENSEMBLE COONECTE
                                     < AU POINT-SOURCE (0,0,0).
         LA          AMAT1           < AFIN
         LB          AMAT1X          <      DE
         LX          AMAT2           <         VISUALISER
         LY          AMAT2X          <                    LE
         STY         AMAT1X          < SOUS-
         STX         AMAT1           <      ENSEMBLE
         STB         AMAT2X          <               CONNEXE
         STA         AMAT2           <                       DES SITES...
GEN101:  EQU         $
<
<
<        V I S U A L I S A T I O N   P L A N   P A R   P L A N  :
<
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IVISP           < FAUT-IL VISUALISER PLAN PAR PLAN ???
         JE          GEN201          < NON...
         LRM         W
         WORD        K               < (W)=COORDONNEE 'Z'.
GEN021:  EQU         $
         LRM         Y
         WORD        K               < (Y)=COORDONNEE 'Y'.
GEN022:  EQU         $
         LRM         X
         WORD        K               < (X)=COORDONNEE 'X'.
GEN023:  EQU         $
         BSR         ATBT1           < TEST DE L'ELEMENT COURANT (X,Y,W) :
         JNC         GEN031          < 0 : ON NE LE MARQUE PAS...
         PSR         X,Y             < 1 : ON VA LE MARQUER...
         LR          W,A             < (A)=COORDONNEE 'Z' :
         TRN
XWOR%1:  VAL         LOGZ/XXXMOY
         NTRN
         SLRD        XWOR%1          < DECONCATENATION DE 'Z',
         SLLS        LOGY
         ORR         A,Y             < DECALAGE DES 'Y' EN FONCTION DES
                                     < POIDS FORTS DE 'Z'.
         LAI         K               < CLEAR 'A',
         SLLD        XWOR%1          < RECUPERATION DES POIDS FAIBLES,
         SLLS        LOGX
         ORR         A,X             < DECALAGE DES 'X' EN FONCTION DES
                                     < POIDS FAIBLES DE 'Z'.
         LR          W,A
         ADRI        Z,A             < (A)=NIVEAU DE TRACE.
         SLLS        XXN255+Z/LONGZ=K
         ADRI        -Z,A            < CADRAGE DU NIVEAU DE TRACE...
         BSR         APOINT          < ET MARQUAGE...
         PLR         X,Y             < RESTAURATIONS DES COORDONNEES (X,Y).
GEN031:  EQU         $
         ADRI        I,X
         LR          X,A
         CPI         LONGX
         JL          GEN023          < PARCOURS DE L'AXE DES 'X'.
         ADRI        I,Y
         LR          Y,A
         CPI         LONGY
         JL          GEN022          < PARCOURS DE L'AXE DES 'Y'.
         ADRI        I,W
         LR          W,A
         CPI         LONGZ
         JL          GEN021          < PARCOURS DE L'AXE DES 'Z'.
GEN201:  EQU         $
<
<
<        V I S U A L I S A T I O N   D U   " C U B E "  :
<
<
         LRM         W
         WORD        K               < (W)=COORDONNEE 'Z'.
GEN041:  EQU         $
         LRM         Y
         WORD        K               < (Y)=COORDONNEE 'Y'.
GEN042:  EQU         $
         LRM         X
         WORD        LONGX-I         < (X)=COORDONNEE 'X'.
GEN043:  EQU         $
<
< TRANSFORMATION DES COORDONNEES :
<
         PSR         X,Y,W           < SAUVEGARDE DU (X,Y,Z) REEL...
         BSR         APRMAT          < (X,Y,Z) <-- (MAT(I,J))*(X,Y,Z)+(TRMAT).
<
< TEST DE L'ELEMENT TRANSFORME (X,Y,Z) :
<
         BSR         AVALID          < LE TRIPLET (X,Y,Z) TRANSFORME
                                     < EXISTE-T'IL ???
         JNE         GEN051          < NON, ON L'IGNORE...
         BSR         ATBT1           < TEST DE L'ELEMENT COURANT (X,Y,W) :
         JNC         GEN051          < 0 : ON NE LE MARQUE PAS...
<
< 1 : MARQUAGE DU POINT :
<
         PLR         X,Y,W           < RESTAURATION DES COORDONNEES (X,Y,Z)
                                     < AFIN QUE LE TRACE SOIT BON...
         STX         SAVEX
         STY         SAVEY
         LR          W,A
         STA         SAVEZ           < SAUVEGARDE DES 3 COORDONNEES.
<
< PROJECTION :
<
         PSR         X,Y,W           < ET SAUVEGARDES...
         LR          X,A
         SLLS        DECX
         LR          A,X             < AMPLIFICATION DE 'X'.
         LR          Y,A
         SLLS        DECY
         LR          A,Y             < AMPLIFICATION DE 'Y'.
         LR          W,A
         SLLS        DECZ
         LR          A,W             < AMPLIFICATION DE 'Z'.
         FLT
         PSR         A,B             < PRISE EN COMPTE DE 'Z' :
         FMP         COST
         BSR         AROND
         AD          TRANSX          < ET TRANSLATION,
         ADR         A,X             < X(PROJETE)=X+Z*COS(TETA)+TRANSX.
         PLR         A,B             < PRISE EN COMPTE DE 'Z' :
         FMP         SINT
         BSR         AROND
         SB          TRANSY          < ET TRANSLATION,
         SBR         A,Y             < Y(PROJETE)=Y-Z*SIN(TETA)+TRANSY.
<
< MARQUAGE DU SITE :
<
         BSR         ACONEX          < VISUALISATION DES CONNEXIONS,
         BSR         ACERCL          < ET MARQUAGE DU SITE COURANT PAR SPHERES,
         BSR         ACUBE           < OU PAR PETITS CUBES...
         PLR         X,Y,W           < RESTAURATION DES COORDONNEES...
         JMP         GEN052          < VERS LA PROGRESSION...
GEN051:  EQU         $
         PLR         X,Y,W           < RESTAURATION DES COORDONNEES (X,Y,Z).
GEN052:  EQU         $
         ADRI        -I,X
         LR          X,A
         CPI         K
         JGE         GEN043          < PARCOURS DE L'AXE DES 'X'.
                                     < (AFIN DE FAVORISER LA GESTION 3D)
         ADRI        I,Y
         LR          Y,A
         CPI         LONGY
         JL          GEN042          < PARCOURS DE L'AXE DES 'Y'.
         ADRI        I,W
         LR          W,A
         CPI         LONGZ
         JL          GEN041          < FIN...
<
<
<        T R A I T E M E N T   D E   F I N  :
<
<
         CPZ         IQUIT           < FAUT-IL S'ARRETER ???
         JE          GEN410          < NON...
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST CI-DESSUS EST IDIOT !!!
XEIF%:   VAL         ENDIF
         QUIT        XXQUIT          < OUI...
GEN410:  EQU         $
         BR          ADEB9           < A L'IMAGE SUIVANTE...
<
<
<        E N T R Y   A L T - M O D E  :
<
<
DEBUT5:  EQU         $
         QUIT        XXQUIT          < A T T E N T E ...
         LRM         C,K             < ON REINITIALISE 'C' ET 'K' AU CAS
                                     < D'UNE RE-ENTREE PAR UN 'ALT-MODE'...
         WORD        COM+DEPBAS      < 'C',
         WORD        STACK-DEPILE    < 'K'.
         BSR         AGOTO
         WORD        DEBUT4          < (A)=ADRESSE D'ITERATION SUR ALT-MODE...
         PAGE
<
<
<        U P D A T E S  :
<
<
         $EQU        GRAINE
         WORD        4660            < GRAINE DU GENERATEUR ALEATOIRE.
         IF          RDNXYZ-RDN0,XEIF%,,XEIF%
         $EQU        RDNSEU
         FLOAT       <K<BASE10/XXXMOY<K
         $EQU        SUPRDN
         WORD        W               < SUP(RDN).
XEIF%:   VAL         ENDIF
         $EQU        SUPRDN
         NTRN
         IF          RDNXYZ-RDNX,XEIF%,,XEIF%
         WORD        LONGX-Z         < SUP(RDN).
XEIF%:   VAL         ENDIF
         IF          RDNXYZ-RDNY,XEIF%,,XEIF%
         WORD        LONGY-Z         < SUP(RDN).
XEIF%:   VAL         ENDIF
         IF          RDNXYZ-RDNZ,XEIF%,,XEIF%
         WORD        LONGZ-Z         < SUP(RDN).
XEIF%:   VAL         ENDIF
         TRN
         $EQU        INFRDN
         NTRN
         WORD        K               < INF(RDN).
         TRN
         $EQU        COST
         FLOAT       0.8             < COS(TETA).
         $EQU        TRANSX
         WORD        16              < TRANSLATION DE X(PROJETE).
         $EQU        TRANSY
         WORD        160             < TRANSLATION DE Y(PROJETE).
         $EQU        RAYON
         WORD        8               < RAYON D'UN DISQUE DE MARQUAGE.
         $EQU        COTE
         WORD        20              < COTE DES PETITS CUBES.
         $EQU        MAT11
         FLOAT       1.0             < A11,
         $EQU        MAT12
         FLOAT       0.0             < A12,
         $EQU        MAT13
         FLOAT       0.0             < A13.
         $EQU        MAT21
         FLOAT       0.0             < A11,
         $EQU        MAT22
         FLOAT       1.0             < A22,
         $EQU        MAT23
         FLOAT       0.0             < A23.
         $EQU        MAT31
         FLOAT       0.0             < A31,
         $EQU        MAT32
         FLOAT       0.0             < A32,
         $EQU        MAT33
         FLOAT       1.0             < A33.
         $EQU        TRMATX
         WORD        0               < TRANSLATION SUR 'OX' TRANSFORME.
         $EQU        TRMATY
         WORD        0               < TRANSLATION SUR 'OY' TRANSFORME.
         $EQU        TRMATZ
         WORD        0               < TRANSLATION SUR 'OZ' TRANSFORME.
         PAGE
<
<
<        T A B L E   D E S   S Y M B O L E S  :
<
<
         IF          '00000000000@,XEIF%,,XEIF%
         EST
XEIF%:   VAL         ENDIF
         DATE
         END         DEBUT



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