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 'XXIMA'...
         CALL        #SIP VECTEUR 512#
XXXVEC:  VAL         XXVEC1          < DEFINITION DES CONSTANTES IMAGE/VECTEUR.
         CALL        #SIP VECTEUR 512#
<
<
<        D E F I N I T I O N   D E S   E S P A C E S  :
<
<
DIMGRA:: VAL         3               < ON TRACE DANS L'ESPACE EUCLIDIEN
                                     < A 3 DIMENSIONS...
DIMGR2:: VAL         DIMGRA-I        < ET UNE DIMENSION DE MOINS...
DIMESP:: VAL         5               < DIMENSION MAXIMALE DE L'ESPACE MULTI-
                                     < CONNECTE QUE L'ON VEUT REPRESENTER.
         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
<
<
<        D E F I N I T I O N   D U   B L O C    D E S C R I P T E U R
<                    D ' U N   P O I N T  :
<
<
NPOINT:: VAL         400             < NOMBRE DE POINTS DU NUAGE A GENERER...
         DSEC
DESCPT:  EQU         $
DCS3D:   EQU         $               < DEBUT DE LA LISTE DES COORDONNEES
                                     < TRI-DIMENSIONNELLES DANS L'ESPACE
                                     < EUCLIDIEN DE LA REPRESENTATION GRA-
                                     < PHIQUE :
DFXS:    FLOAT       <NILK<NILK<NILK < COORDONNEE 'X',
DFYS:    FLOAT       <NILK<NILK<NILK < COORDONNEE 'Y',
DFZS:    FLOAT       <NILK<NILK<NILK < COORDONNEE 'Z'.
         IF          $-DCS3D/DFLOT-DIMGRA,,XEIF%,
         IF          ATTENTION : LA LISTE DES COORDONNEES EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
DFWORK:  FLOAT       <NILK<NILK<NILK < VARIABLE DE MANOEUVRE DESTINEE PAR EXEM-
                                     < PLE A CONTENIR UNE DISTANCE...
NVOIS::  VAL         W+W             < NOMBRE DE VOISINS POSSIBLES POUR UN
                                     < POINT LE LONG D'UNE DIMENSION.
DNVOIS:  WORD        NILK            < NOMBRE DE VOISINS DU POINT COURANT
                                     < DANS L'ESPACE 'DIMESP'-CONNECTE.
VOISEX:: VAL         NEXIST          < INDICATEUR DE VOISIN "INOCCUPPE".
         IF          VOISEX-K,,XEIF%,
         IF          ATTENTION : 'VOISEX' DOIT ETRE NUL !!!
XEIF%:   VAL         ENDIF
DLVOIS:  EQU         $               < LISTE DES VOISINS :
         DO          NVOIS*DIMESP
         WORD        VOISEX          < IDENTITE DES VOISINS DU POINT COURANT.
<
< FIN DU DESCRIPTEUR :
<
LDESCP:: VAL         $-DESCPT        < LONGUEUR DU DESCRIPTEUR...
         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 :
<
ANPOIN:  WORD        NPOINT          < NOMBRE COURANT DE POINTS DU NUAGE.
ADIMGR:  WORD        DIMGRA          < DIMENSION DE L'ESPACE GRAPHIQUE DE
                                     < REPRESENTATION.
RDNMIN:  WORD        K               < MIN(NOMBRE DE VOISINS),
RDNMAX:  WORD        NVOIS*DIMESP    < MAX(NOMBRE DE VOISINS).
ANVOIS:  WORD        NVOIS*DIMESP    < NOMBRE DE VOISINS MAXIMAL QUE PEUT
                                     < POSSEDER UN POINT,
XEPAIS:: VAL         16*XXXMOY+Z     < EPAISSEUR MAXIMALE DES RECTANGLES.
AEPAIS:  WORD        XEPAIS          < EPAISSEUR COURANTE DES RECTANGLES.
XNIVP::  VAL         4               < PAS IMPLICITE DE PASSAGE D'UN NIVEAU
                                     < A L'AUTRE.
AXNIVP:  WORD        XNIVP           < PAS COURANT DE PASSAGE D'UN NIVEAU A
                                     < L'AUTRE...
IERASE:  WORD        EXIST           < EFFACER ('EXIST'), OU NON ('NEXIST')
                                     < L'ECRAN 512...
         IF          XOPT01-EXIST,XOPT1,,XOPT1
IWGPT:   WORD        EXIST           < TRACER ('EXIST') OU PAS ('NEXIST') LE
                                     < NUAGE DE POINTS GENERE.
IWGVOI:  WORD        EXIST           < TRACER ('EXIST') OU PAS ('NEXIST') LES
                                     < VOISINS DU TYPE (P(I),P(J)).
XOPT1:   VAL         ENDIF
<
< 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#
APWORK:  EQU         APFWOR          < POUR LA COMPATIBILITE AVEC LES OVERLAYS
                                     < DE " +" (CF. 'SIO...').
<
< DONNEES DE CALCUL D'UN
< PRODUIT SCALAIRE :
<
APRSCA:  WORD        PRSCA           < CE SOUS-PROGRAMME CALCULE LE PRODUIT
                                     < SCALAIRE DES 2 VECTEURS ARGUMENTS.
<
< POINT TRI-DIMENSIONNEL COURANT :
<
CS3D:    EQU         $               < DEBUT DES COORDONNEES 3D :
FXS:     FLOAT       <NILK<NILK<NILK < COORDONNEE 'X' 3D,
FYS:     FLOAT       <NILK<NILK<NILK < COORDONNEE 'Y' 3D,
FZS:     FLOAT       <NILK<NILK<NILK < COORDONNEE 'Z' 3D.
LBUF3D:: VAL         $-CS3D          < NOMBRE DE MOTS POUR UN POINT 3D...
         IF          LBUF3D/DFLOT-DIMGRA,,XEIF%,
         IF          ATTENTION : INCOHERENCE DANS LES
         IF          DIMENSIONS DE L'ESPACE DE TRACE GRAPHIQUE !!!
XEIF%:   VAL         ENDIF
<
< DONNEES DE 'MOVE' :
<
APMOV1:  WORD        PMOV1           < DEPLACEMENT DU POINT COURANT (DFXS,DFYS,
                                     < DFZS) VERS (FXS,FYS,FZS).
<
< DONNEES DE LA PROJECTION :
<
FACT:    FLOAT       <NILK<NILK<NILK < FACTEUR D'ECHELLE...
SFACT:   FLOAT       <NILK<NILK<NILK < SAUVEGARDE DE 'FACT' A CAUSE DES
                                     < ALT-MODES INTEMPESTIFS...
PZ:      FLOAT       <NILK<NILK<NILK < POSITION DU POINT DE VUE SUR L'AXE OZ,
                                     < QUI EST DEVANT L'ECRAN...
TRX:     WORD        NILK            < TRANSLATION DU
TRY:     WORD        NILK            <                TRACE (VISU ET RASTER).
CS2D:    EQU         $               < DEBUT DES COORDONNEES 2D :
YS:      WORD        NILK            < COORDONNEES 2D DU
XS:      WORD        NILK            <                   POINT 3D PROJETE...
LBUF2D:: VAL         $-CS2D          < NOMBRE DE MOTS NECESSAIRES POUR UN POINT,
LBUFGR:: VAL         LBUF2D+LBUF2D   < ET POUR UN VECTEUR.
COORDX:: VAL         XS-CS2D         < INDEX DE LA COORDONNEE 'X',
COORDY:: VAL         YS-CS2D         < INDEX DE LA COORDONNEE 'Y'.
APROJ:   WORD        PROJ            < SOUS-PROGRAMME DE PROJECTION 3D --> 2D...
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
< DONNEES DU TRACE GRAPHIQUE :
<
BUFGR:   EQU         $
BUFGR1:  DZS         LBUF2D          < ORIGINE D'UN VECTEUR,
BUFGR2:  DZS         LBUF2D          < ET EXTREMITE.
DEMOG:   BYTE        NVPOUT;FAVOG    < MISE EN GRAPHIQUE DE LA VISU.
DEMCG:   BYTE        NVPOUT;FAVCG    < RETOUR EN ALPHA-NUMERIQUE DE LA VISU.
DEMWG:   BYTE        NVPOUT;FAVWG    < ECRITURE GRAPHIQUE D'UN VECTEUR.
         WORD        BUFGR=FCTA*NOCMO
         WORD        LBUFGR*NOCMO
DEMWD0:  BYTE        NVPOUT;FAVWD    < DEMANDE DE MISE EN MODE NORMAL...
         BYTE        KESC;'60;KEOT
DEMWD1:  BYTE        NVPOUT;FAVWD    < DEMANDE DE MISE EN POINTILLES...
         BYTE        KESC;'61;KEOT
DEMWD2:  BYTE        NVPOUT;FAVWD    < DEMANDE DE MISE EN TIRETES...
         BYTE        KESC;'63;KEOT
<
< DEMANDE D'EFFACEMENT
< DE L'ECRAN DE LA VISU :
<
DEMERA:  BYTE        NVPOUT;FAVER    < DEMANDE D'EFFACEMENT DE L'ECRAN DE LA
                                     < VISU DE DIALOGUE.
XOPT1:   VAL         ENDIF
<
< 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#
<
< SOUS-PROGRAMMES COMPLEMENTAIRES :
<
VECTAS:  WORD        VECTP1          < POUR ATTEINDRE 'VECTP1', CAR LE RELAI
                                     < GENERE PRECEDEMMENT VA ETRE ECRASE PAR
                                     < UN APPEL A 'VECTPS' QUI GENERE 4 POINTS
                                     < AU LIEU D'UN SEUL...
<
< COORDONNEES FLOTTANTES
< DU VECTEUR A TRACER :
<
FECGX1:  FLOAT       <NILK<NILK<NILK < X1,
FECGY1:  FLOAT       <NILK<NILK<NILK < Y1,
FECGX2:  FLOAT       <NILK<NILK<NILK < X2,
FECGY2:  FLOAT       <NILK<NILK<NILK < Y2.
FECGXP:  FLOAT       <NILK<NILK<NILK < PAS SUR 'X',
FECGYP:  FLOAT       <NILK<NILK<NILK < PAS SUR 'Y'.
<
< ACCES AUX REGISTRES DE CONTROLE :
<
ACTRL1:  WORD        RCTRL1
ACTRL2:  WORD        RCTRL2
<
< DONNEES POUR LE GENERATEUR ALEATOIRE :
<
XTYPX::  VAL         3571            < TYPE "COORDONNEE X",
XTYPY::  VAL         XTYPX+567       < TYPE "COORDONNEE Y",
XTYPZ::  VAL         XTYPY+2391      < TYPE "COORDONNEE Z",
XTYPN::  VAL         XTYPZ+12491     < TYPE "NOMBRE DE VOISINS".
RDN7:    WORD        793             < DECOMPTEUR D'ACCES A LA SECONDE,
RDN8:    WORD        1               < VALEUR COURANTE DE 'RDN7'.
RDN9:    WORD        0               < SECONDE COURANTE...
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RDN1:    WORD        5189            < CONSTANTES DE CALCUL
RDN3::   VAL         19              < DES NOMBRE ALEATOIRES...
RDN4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RDN5:    WORD        4021
RDN6::   VAL         23
POINTS:  WORD        16807
KRDN1:   WORD        0
KRDN2:   WORD        0
XKRDN1:: VAL         3               < INCREMENTEUR DE 'KRDN1'.
XKRDN2:: VAL         7               < DECOMPTEUR DE 'KRDN2'.
ASPRDN:  WORD        SPRDN           < GENERATEUR DE NOMBRES ALEATOIRES.
<
< DEFINITION DU NUAGE :
<
AMPOIN:  WORD        NPOINT          < NOMBRE MAXIMAL DE POINTS DU NUAGE.
<
< DONNEES NECESSAIRES A LA
< RECHERCHE DES VOISINS :
<
ANVOIZ:  WORD        NVOIS*DIMESP+Z  < NOMBRE DE VOISIN PAR EXCES MAXIMAL QUE
                                     < PEUT POSSEDER UN POINT.
FWORK0:  EQU         $               < LISTE DE VARIABLES DE MANOEUVRE EN
                                     < NOMBRE EGAL A LA DIMENSION DE L'ESPACE
                                     < DE REPRESENTATION :
         DO          DIMGRA
         FLOAT       <NILK<NILK<NILK
FWORK1:  EQU         FWORK0
FWORK2:  EQU         FWORK1+DFLOT
FWORK3:  EQU         FWORK2+DFLOT
XWOR%1:  VAL         BASE10=K
XWOR%1:  VAL         NBITMO-B-XWOR%1 < RANG DU DERNIER BIT DE BASE10...
XWOR%1:  VAL         CORBT?XWOR%1=FMASK(K?BASE10=FCINST
XWOR%2:  VAL         XWOR%1=K
XWOR%2:  VAL         NBITMO-B-XWOR%2
XWOR%3:  VAL         CORBT?XWOR%2=FMASK(K?XWOR%1=FCINST
         IF          XWOR%3-K,,XEIF%,
         IF          ATTENTION : IL Y A PLUS DE 2 BITS A 1 DANS 'BASE10' !!!
XEIF%:   VAL         ENDIF
XWOR%4:  VAL         COSBT?XWOR%2=FMASK(K=FCINST
XWOR%4:  VAL         XWOR%4=K+E      < 'XWOR%4' EST UNE VALEUR ENTIERE PAR
                                     < EXCES DE LOG(BASE10) EN BASE2...
XWOR%5:  VAL         CORBT?BITPAR=FMASK(K?MOCD=FCINST
         NTRN
XWOR%5:  VAL         XWOR%5/XWOR%4   < 'XWOR%5' EST UN EXPOSANT VOISIN DU
                                     < PLUS GRAND...
XWOR%6:  VAL         XWOR%5/XXXMOY   < AFIN DE PREVENIR UNE EVENTUELLE ELEVA-
                                     < TION AU CARRE...
         TRN
XWOR%6:  VAL         XWOR%6-W        < AFIN D'AVOIR UNE MARGE DE SECURITE
                                     < SUPPLEMENTAIRE...
FINFIN:  FLOAT       <W<K<+XWOR%6    < (A,B)=UN NOMBRE FLOTTANT TRES GRAND
                                     <       VOISIN DU PLUS GRAND NOMBRE
                                     <       FLOTTANT REPRESENTABLE...
<
< DEFINITION DES RECTANGLES :
<
DEPAIS:  WORD        XEPAIS-Z/XXXMOY < FONCTION DE L'EPAISSEUR COURANTE DES
                                     < RECTANGLES.
XNIV0::  VAL         4               < PREMIER NIVEAU.
WEPAIS:  WORD        NILK            < DONNE UNE VALEUR PROPORTIONNELLE A
                                     < L'EPAISSEUR A DONNER AUX RECTANGLES.
<
< DEFINITION DES DISQUES :
<
SAVEX:   WORD        NILK            < COORDONNEES DU
SAVEY:   WORD        NILK            <                CENTRE.
ACERCL:  WORD        CERCLE          < REMPLISSAGE D'UN DISQUE...
         PAGE
<
<
<        P I L E   D E   T R A V A I L  :
<
<
STACK:   EQU         $
         DZS         64
         PROG
         USE         W,DESCPT
XXXVEC:  VAL         XXVEC3          < DEFINITION DES PROGRAMMES VECTEUR 512...
         CALL        #SIP VECTEUR 512#
         PAGE
<
<
<        T R A C E   D ' U N   P A V E   D E   4   P O I N T S  :
<
<
<        FONCTION :
<                      AFIN DE BOUCHER LES TROUS CREES
<                    LORS DU REMPLISSAGE DES RECTANGLES
<                    PAR DES VECTEURS PARALLELES, ON
<                    REMPLACE 'VECTP1' PAR 'VECTPS' QUI
<                    TRACE UN PAVE DE 4 POINTS...
<
<
VECTPS:  EQU         $               < PROGRAMME REMPLACANT 'VECTP1' DANS
                                     < L'INTERPOLATEUR...
         $EQU        VECTA1
         WORD        VECTPS          < POUR TROMPER L'INTERPOLATEUR : CROYANT
                                     < APPELER 'VECTP1', C'EST EN FAIT 'VECTPS'
                                     < QUI SERA REFERENCE...
         $EQU        VECTPS          < RETOUR A 'VECTPS'...
<
< INITIALISATION :
<
         PSR         A
<
< TRACE DU PAVE ((X,Y),(X+1,Y),(X+1,Y+1),(X,Y+1)) :
<
         BSR         VECTAS          < TRACE DE (X,Y).
         LA          VECTX1
         ADRI        I,A
         STA         VECTX1
         BSR         VECTAS          < TRACE DE (X+1,Y).
         LA          VECTY1
         ADRI        I,A
         STA         VECTY1
         BSR         VECTAS          < TRACE DE (X+1,Y+1).
         LA          VECTX1
         ADRI        -I,A
         STA         VECTX1
         BSR         VECTAS          < TRACE DE (X,Y+1).
         LA          VECTY1
         ADRI        -I,A
         STA         VECTY1          < ET RETOUR A (X,Y)...
<
< ET RETOUR :
<
         PLR         A
         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#
         PAGE
<
<
<        D E P L A C E M E N T   D U   P O I N T   C O U R A N T  :
<
<
<        ARGUMENTS :
<                    (W)=ADRESSE DU DESCRIPTEUR DE POINT COURANT.
<
<
PMOV1:   EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
<
< DEPLACEMENT :
<
         LAD         DCS3D           < (A)=ADRESSE DE L'EMETTEUR (DESCRIPTEUR
                                     <     COURANT),
         LRM         B,X
         WORD        CS3D            < (B)=ADRESSE DU POINT COURANT,
         WORD        LBUF3D          < (X)=NOMBRE DE POINTS A DEPLACER.
         MOVE                        < ET MOVE : DESCRIPTEUR --> (FXS,FYS,FZS).
<
< ET RETOUR :
<
         PLR         A,B,X
         RSR
         PAGE
<
<
<        P R O J E C T I O N   3 D   -->   2 D  :
<
<
<        ARGUMENT :
<                    (FXS,FYS,FZS)=POINT 3D.
<
<
<        RESULTAT :
<                    (XS,YS)=POINT 2D PROJETE SUIVANT 'IPROJ'.
<
<
PROJ:    EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B             < SAUVEGARDES...
         #/FLD#      FZS
<
< PROJECTION PERSPECTIVE SUR 'OX' :
<
         FDV         PZ
         BSR         ATSFLO
         FSB         F1
         BSR         AFNEG
         BSR         ASFWOR          < 1-(FZS/PZ)
         BSR         AFCAZ
         JNE         EOK3            < OK, 1-(FZS/PZ)#0...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
EOK3:    EQU         $
         #/FLD#      FXS
         FDV         FWORK           < FXS/(1-(FZS/PZ))
         BSR         ATSFLO
<
< CALCUL DE 'XS' :
<
         FDV         FACT            < MISE A L'ECHELLE 2D...
         BSR         AROND
         AD          TRX             < TRANSLATION 2D...
         STA         XS
<
< PROJECTION PERSPECTIVE SUR 'OY' :
<
         #/FLD#      FYS
         FDV         FWORK           < FYS/(1-(FZS/PZ))
         BSR         ATSFLO
<
< CALCUL DE 'YS' :
<
         FDV         FACT            < MISE A L'ECHELLE 2D...
         BSR         AROND
         AD          TRY             < TRANSLATION 2D...
         STA         YS
<
< SORTIE :
<
         PLR         A,B             < RESTAURATIONS...
         RSR
XXXPRO:  VAL         YYYFLO          < 'YYYFLO'.
         CALL        #SIP UTILITAIRES#
         PAGE
<
<
<        P R O D U I T   S C A L A I R E   D E   2   V E C T E U R S  :
<
<
<        ARGUMENTS :
<                    (A)=ADRESSE DU PREMIER VECTEUR 'VECT1',
<                    (B)=ADRESSE DU DEUXIEME VECTEUR 'VECT2'.
<
<
<        RESULTAT :
<                    (A,B)=VALEUR DU PRODUIT SCALAIRE...
<
<
<        ATTENTION :
<                    AUX BASES 'L' ET 'W' !!!
<
<
PRSCA:   EQU         $
VECT1X:: MOT         O               < X(VECT1),
VECT1Y:: MOT         VECT1X+DFLOT    < Y(VECT1),
VECT1Z:: MOT         VECT1Y+DFLOT    < Z(VECT1).
VECT2X:: MOT         O               < X(VECT2),
VECT2Y:: MOT         VECT2X+DFLOT    < Y(VECT2),
VECT2Z:: MOT         VECT2Y+DFLOT    < Z(VECT2).
<
< INITIALISATIONS :
<
         PSR         Y,L,W           < SAUVEGARDE DE 2 BASES ; MAIS 'C' NE DOIT
                                     < PAS ETRE UTILISEE A CAUSE DU BLOC FLOT-
                                     < TANT...
         LR          L,Y             < SAUVEGARDE DE 'L' DANS 'Y' POUR POUVOIR
                                     < ACCEDER EVENTUELLEMENT LE 'LOCAL'...
         LR          A,L             < (L)=BASE DU VECTEUR 'VECT1',
         LR          B,W             < (W)=BASE DU VECTEUR 'VECT2'.
<
< CALCUL DU PRODUIT SCALAIRE :
<
         #/FLD#      VECT1X,L        < X(1),
         FMP         VECT2X,W        < X(1)*X(2),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      VECT1Y,L        < Y(1),
         FMP         VECT2Y,W        < Y(1)*Y(2),
         BSR         APFWOR          < X(1)*X(2)+Y(1)*Y(2),
                                     < ET SAVE...
         #/FLD#      VECT1Z,L        < Z(1),
         FMP         VECT2Z,W        < Z(1)*Z(2),
         BSR         APFWOR          < (A,B)=X(1)*X(2)+Y(1)*Y(2)+Z(1)*Z(2),
                                     <       SOIT LE PRODUIT SCALAIRE DES 2
                                     <       VECTEURS 'VECT1' ET 'VECT2'...
                                     <       ET MISE DANS 'FWORK', ON NE SAIT
                                     <       JAMAIS...
<
< ET RETOUR :
<
         PLR         Y,L,W
         RSR
         PAGE
<
<
<        G E N E R A T E U R   A L E A T O I R E  :
<
<
<        ARGUMENT :
<                    (X)=FONCTION DU NUMERO DU POINT COURANT,
<                    (Y)=CODE FONCTION DU TYPE DE COORDONNEE (X/Y/Z).
<
<
<        RESULTAT :
<                    (A,B)=NOMBRE ALEATOIRE FLOTTANT.
<
<
SPRDN:   EQU         $
         LA          RDN             < GENERATION DE NOMBRES ALEATOIRES :
         EOR         POINTS          < ON INTRODUIT UN AUTRE PARAMETRE...
         MP          RDN1
         SCRD        RDN3
         JANE        SPMOYC
         LR          B,A
         JANE        SPMOYC
         LA          KRDN1
         ADRI        XKRDN1,A
         SCRS        XKRDN2
         STA         KRDN1           < PROGRESSION DE 'KRDN1'...
SPMOYC:  EQU         $
         EORR        X,A
         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 ??!?!??!
         ACTD        XXXTIM          < (A)=HEURE COURANTE EN MULTIPLE DE 2S.
         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
         FLT                         < (A,B)=NOMBRE ALEATOIRE...
         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 ETE PLACE A
<                    CHAQUE EXTREMITE DE RECTANGLE
<                    TRACE.
<
<
<        ARGUMENTS :
<                    (X,Y)=CENTRE DU DISQUE (LE RAYON EST XEPAIS-Z/XXXMOY).
<
<
CERCLE:  EQU         $
<
< INITIALISATIONS :
<
         PSR         X,Y
         LR          X,B             < (B)='X' DU CENTRE,
         PSR         Y               < SAUVEGARDE DE 'Y' DU CENTRE.
         LA          DEPAIS
         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'.
         PLR         Y               < ON A :
                                     < (B,Y)=COORDONNEES DU CENTRE.
<
< BALAYAGE VERTICAL :
<
         LX          DEPAIS          < (X)=NOMBRE DE LIGNES A BALAYER.
         ADRI        Z,A
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          DEPAIS          < (X)=NOMBRE DE POINTS PAR LIGNE.
         ADRI        Z,A
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          DEPAIS          < EST-ON HORS DU DISQUE ??
         JGE         CERCL3          < OUI, ON IGNORE CE POINT...
         SB          DEPAIS          < NON :
         NGR         A,A             < ON CALCULE DONC LE NIVEAU DU
                                     < POINT QUE L'ON VA TRACER :
         MP          AXNIVP
         ADRI        XNIV0,B
         STB         VENIVO          < CE NIVEAU EST PROPORTIONNEL A LA
                                     < DISTANCE AU CENTRE...
         LA          VECTX1
         LB          VECTY1
         PSR         A,B             < SAUVEGARDE DE (X1,Y1) VISU...
         SARS        XXDEDX
         STA         VECTX1          < PASSAGE AUX
         LR          B,A
         SARS        XXDEDY
         STA         VECTY1          <             COORDONNEES 512...
         BSR         VECTA1          < ET ON MARQUE LE POINT (X1,Y1)...
         PLR         A,B
         STA         VECTX1          < RESTAURE LES
         STB         VECTY1          <              COORDONNEES VISU...
CERCL3:  EQU         $
         PLR         B               < RESTAURE L'ABSCISSE DU CENTRE,
         DO          BIT>XXDEDX
         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
         DO          BIT>XXDEDY
         IC          VECTY1          < DE LA NOUVELLE LIGNE,
         JDX         CERCL1          < SI ELLE EXISTE...
<
< ET RETOUR :
<
         PLR         X,Y
         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  :
<
<
         #/FLD#      FACT            < SAUVEGARDE DE 'FACT'
         #/FST#      SFACT           <                      A CAUSE DES ALT-
                                     < MODES INTEMPESTIFS...
DEBUT4:  EQU         $
         #/FLD#      SFACT
         #/FST#      FACT            < AU CAS OU UN MALHEUREUX ALT-MODE...
<
< 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'...).
<
< VALIDATION DE 'ANVOIS' :
<
DEBUT6:  EQU         $
         LA          ANVOIS          < ACCES A 'ANVOIS' :
         JALE        DEBUT7          < ERREUR...
         CPI         NVOIS*DIMESP    < VALIDATION :
         JLE         DEBUT8          < OK...
DEBUT7:  EQU         $
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
         JMP         DEBUT6          < ET ON RE-TESTE !!!
DEBUT8:  EQU         $
         ADRI        Z,A
         STA         ANVOIZ          < ET ON CALCULE 'ANVOIZ' AU CAS OU
                                     < 'DIMESP' AURAIT ETE MODIFIE SOUS
                                     < 'DEBUG' DANS 'ANVOIS'...
<
< VALIDATION DE 'ANPOIN' :
<
DEBUT9:  EQU         $
         LA          ANPOIN          < ACCES A 'ANPOIN' :
         JALE        DEBUTA          < ERREUR...
         CP          AMPOIN          < VALIDATION :
         JLE         DEBUTB          < OK...
DEBUTA:  EQU         $
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
         JMP         DEBUT9          < ET ON RE-TESTE !!!
DEBUTB:  EQU         $
<
< VALIDATION DE 'AEPAIS' :
<
DEBUTC:  EQU         $
         LA          AEPAIS          < (A)=EPAISSEUR DEMANDEE POUR LES
                                     <     RECTANGLES,
         JALE        DEBUTE          < ERREUR...
         CPI         XEPAIS
         JG          DEBUTE          < ERREUR...
         ADRI        -Z,A
         SLRS        XXXMOY=K        < CALCUL DE XEPAIS-Z/XXXMOY :
         JALE        DEBUTE          < ERREUR...
         JNC         DEBUTD          < OK, LA DIVISION TOMBE JUSTE...
DEBUTE:  EQU         $
         QUIT        XXQUIT          < 'AEPAIS' DOIT ETRE IMPAIR ET DE VALEUR
                                     < VALEUR CONVENABLE...
         JMP         DEBUTC          < ET ON RE-TESTE...
DEBUTD:  EQU         $
         STA         DEPAIS          < ET MEMORISATION DE XEPAIS-Z/XXXMOY...
<
< VALIDATION DE (RDNMIN,RDNMAX) :
<
DEBUTF:  EQU         $
         LA          RDNMIN
         CP          RDNMAX
         JLE         DEBUTG          < OK : MIN <= MAX...
         QUIT        XXQUIT          < POUR CORRIGER...
         JMP         DEBUTF          < ET ON RE-TESTE...
DEBUTG:  EQU         $
<
<
<        G E N E R A T I O N   D U   N U A G E   D E   P O I N T S  :
<
<
         LX          ANPOIN          < (X)=NOMBRE DE POINTS A GENERER,
         LRM         W
         WORD        LPOINT          < (W)=ADRESSE DE BASE DE LA LISTE DES
                                     <     DESCIPTEURS DE POINTS.
GEN1:    EQU         $
<
< GENERATION DES COORDONNEES :
<
         LRM         Y
         WORD        XTYPX           < (Y)=TYPE "COORDONNEE X".
         BSR         ASPRDN          < (A,B)=NOMBRE ALEATOIRE,
         #/FST#      DFXS            < CE QUI DONNE 'X' ALEATOIRE.
         LRM         Y
         WORD        XTYPY           < (Y)=TYPE "COORDONNEE Y",
         BSR         ASPRDN          < (A,B)=NOMBRE ALEATOIRE,
         #/FST#      DFYS            < CE QUI DONNE 'Y' ALEATOIRE.
         #/FLD#      F0
         #/FST#      DFZS            < DFZS=0 A PRIORI...
         LA          ADIMGR
         CPI         DIMGRA          < COMBIEN DE DIMENSIONS POUR LA VISUALI-
                                     < SATION ???
         JNE         GEN5            < 2...
         LRM         Y               < 3...
         WORD        XTYPZ           < (Y)=TYPE "COORDONNEE Z",
         BSR         ASPRDN          < (A,B)=NOMBRE ALEATOIRE,
         #/FST#      DFZS            < CE QUI DONNE 'Z' ALEATOIRE.
GEN5:    EQU         $
<
< INITIALISATION DES
< DIVERS INDICATEURS :
<
         PSR         X
         #/FLD#      F0
         #/FST#      DFWORK          < DFWORK=0.
         STZ         DNVOIS          < DNVOIS=0.
         LAD         DLVOIS
         LR          A,L             < (L)=BASE LA LISTE DES VOISINS.
         LRM         A
         WORD        VOISEX          < (A)=INDICATEUR "PAS DE VOISIN",
         LX          ANVOIS          < (X)=NOMBRE MAXIMAL DE VOISINS.
GEN4:    EQU         $
         STA         O,L             < PAS DE VOISINS POUR LE POINT COURANT.
         ADRI        D,L
         JDX         GEN4
         PLR         X               < RESTAURE :
                                     < (X)=NOMBRE DE POINTS ENCORE A INITIALISER
         ADRI        LDESCP,W        < PASSAGE AU DESCRIPTEUR SUIVANT,
         JDX         GEN1            < S'IL EXISTE...
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
<
<        T R A C E   D U   N U A G E   D E   P O I N T S  :
<
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IWGPT           < DOIT-ON TRACER LE NUAGE ???
         JE          GEN2            < NON...
         #/FLD#      FACT
         PSR         A,B             < SAUVEGARDE DE 'FACT'...
         FDV         F05
         #/FST#      FACT            < AFIN DE VOIR L'ENSEMBLE DU DESSIN...
         LAD         DEMERA          < OUI :
         SVC                         < ON EFFACE L'ECRAN.
         LX          ANPOIN          < (X)=NOMBRE DE POINTS A TRACER,
         LRM         W
         WORD        LPOINT          < (W)=ADRESSE DE LA LISTE DES DESCRIPTEURS.
GEN3:    EQU         $
         PSR         X
         BSR         APMOV1          < DEPLACEMENT DU DESCRIPTEUR COURANT (W)
                                     < VERS LE POINT COURANT (FXS,FYS,FZS),
         BSR         APROJ           < ET PROJECTION 2D --> 3D.
         LRM         A,B,X
         WORD        CS2D            < (A)=ADRESSE DU POINT 2D COURANT,
         WORD        BUFGR1          < (B)=ADRESSE DU BUFFER ORIGINE GRAPHIQUE,
         WORD        LBUF2D          < (X)=NOMBRE DE MOTS A DEPLACER,
         MOVE                        < ET MISE EN PLACE DE L'ORIGINE.
         LRM         B,X
         WORD        BUFGR2          < (B)=ADRESSE DU BUFFER EXTREMITE GRAPHIQUE
         WORD        LBUF2D          < (X)=NOMBRE DE MOTS A DEPLACER,
         MOVE                        < ET MISE EN PLACE DE L'EXTREMITE.
         LAD         DEMOG
         SVC                         < ET ON FAIT UNE MISE EN GRAPHIQUE, PERMET-
                                     < TANT PAR LA MEME OCCASION DE NE PAS
                                     < CHAINER LES POINTS ENTRE-EUX...
         LAD         DEMWG
         SVC                         < TRACE DU POINT COURANT...
         PLR         X               < RESTAURE LE DECOMPTE,
         ADRI        LDESCP,W        < PASSAGE AU DESCRIPTEUR SUIVANT,
         JDX         GEN3            < S'IL EXISTE...
         LAD         DEMCG
         SVC                         < ET RETOUR EN ALPHA-NUMERIQUE...
         PLR         A,B
         #/FST#      FACT            < RESTAURATION DE 'FACT'...
GEN2:    EQU         $
XOPT1:   VAL         ENDIF
<
<
<        G E N E R A T I O N   D E S   V O I S I N S   D E
<        C H A Q U E   P O I N T   D U   N U A G E  :
<
<
<        FONCTION :
<                      ON VIENT DE GENERER LA LISTE
<                    DES POINTS P(I) DU NUAGE ; POUR
<                    CHAQUE POINT P(I) 0<I<N, ON VA
<                    RECHERCHER SES PLUS PROCHES
<                    VOISINS P(J) I<J<N ; DE PLUS,
<                    IL CONVIENT DE NE PAS OUBLIER
<                    LA RELATION : D(P(I),P(J))=D(P(J),P(I)),
<                    OU 'D' REPRESENTE LA DISTANCE
<                    EUCLIDIENNE...
<
<
         LX          ANPOIN          < (X)=NOMBRE DE POINTS DU NUAGE,
         LRM         W
         WORD        LPOINT          < (W)=ADRESSE DE LA LISTE DES DESCRIPTEURS
                                     <     DES POINTS.
<
< BOUCLE DE PARCOURS DES P(I) :
<
GEN10:   EQU         $
<
< GENERATION DU NOMBRE DE
< VOISINS AUTORISES POUR
< LE POINT COURANT P(I) :
<
GEN14:   EQU         $
         LRM         Y
         WORD        XTYPN           < (Y)=TYPE "NOMBRE DE VOISINS",
         BSR         ASPRDN          < (A,B)=NOMBRE ALEATOIRE FLOTTANT,
         BSR         AFABS           < (A,B)=NOMBRE ALEATOIRE POSITIF FLOTTANT,
         BSR         AROND           < (A)=NOMBRE ALEATOIRE POSITIF ENTIER,
         SARD        NBITMO
         DV          ANVOIZ
         LR          B,A             < (A)=NOMBRE ALEATOIRE SITUE DANS LE
                                     <     SEGMENT (0,NVOIS*DIMESP).
         CP          RDNMIN
         JL          GEN14           < ON SOUHAITE
         CP          RDNMAX
         JG          GEN14           <             ETRE DANS (MIN,MAX)...
         CP          DNVOIS          < P(I) N'AURAIT-IL PAS DEJA UN NOMBRE
                                     < VOISINS SUFFISANT, OBTENUS LORS DE LA
                                     < RECHERCHE DES P(J) DE P(I) ANTERIEURS ???
         JLE         GEN11           < OUI, PASSONS AU P(I) SUIVANT...
         XM          DNVOIS          < NON, ON MET DONC DANS 'DNVOIS' LE MAX
                                     < ENTRE LE NOMBRE ALEATOIRE (B), ET LE
                                     < 'DNVOIS' ANTERIEUR,
         SBR         A,B             < (B)=NOMBRE DE VOISINS ENCORE A GENERER,
         LR          B,Y             < (Y)=NOMBRE DE VOISINS A GENERER POUR LE
                                     <     POINT P(I) COURANT.
         LR          W,L             < (L)=ADRESSE DU DESCRIPTEUR DU POINT
                                     <     P(I) COURANT.
<
< BOUCLE DE PARCOURS DES
< P(J), AVEC I<J<N :
<
         PSR         X,W
         ADRI        -W,X            < (X)=NOMBRE DE P(J) A TESTER (PUISQUE
                                     <     L'ON A I<J).
         CPZR        X               < L'ENSEMBLE (P(J)) EST-IL VIDE ???
         JE          GEN12           < OUI, RIEN A FAIRE, ON A FINI...
         ADRI        LDESCP,W        < (W)=ADRESSE DU DESCRIPTEUR DU PREMIER
                                     < POINT P(J).
<
< CALCUL DE D(P(I),P(J))
< POUR TOUT J (I<J<N) :
<
         PSR         X,W             < SAUVEGARDE DE LA BASE DES DESCRIPTEURS
                                     < DES P(J) (W), ET DU CARDINAL DE CET
                                     < ENSEMBLE (X).
GEN13:   EQU         $
         #/FLD#      DFXS
         FSB         DFXS-DESCPT,L
         #/FST#      FWORK1          < FWORK1=X(P(J))-X(P(I)).
         #/FLD#      DFYS
         FSB         DFYS-DESCPT,L
         #/FST#      FWORK2          < FWORK2=Y(P(J))-Y(P(I)).
         #/FLD#      DFZS
         FSB         DFZS-DESCPT,L
         #/FST#      FWORK3          < FWORK3=Z(P(J))-Z(P(I)).
         LAD         FWORK0
         LR          A,B             < (A)=(B)=ADRESSE DE LA LISTE DES COOR-
                                     <         DONNEES DU VECTEUR (P(I),P(J)).
         BSR         APRSCA
         BSR         ARAC            < (A,B)=D(P(I),P(J)),
         BSR         ATSFLO
         #/FST#      DFWORK          < DFWORK(P(J)) <-- D(P(I),P(J)).
         ADRI        LDESCP,W        < PASSAGE AU POINT P(J) SUIVANT,
         JDX         GEN13           < S'IL EXISTE...
         PLR         X,W             < RESTAURE :
                                     < (X)=CARDINAL DE L'ENSEMBLE (P(J)),
                                     < (W)=ADRESSE DE BASE DES DESCRIPTEURS DE
                                     <     L'ENSEMBLE (P(J)).
<
< RECHERCHE DES (Y) PLUS
< PROCHES VOISINS DE P(I) :
<
GEN20:   EQU         $
         CPZR        Y               < LES A-T'ON TOUS TROUVES ???
         JE          GEN21           < OUI, PASSONS AU POINT P(I) SUIVANT...
GEN24:   EQU         $
         #/FLD#      FINFIN          < NON,
                                     < (A,B)=MIN(D(P(I),P(J))) COURANT.
         PSR         X,Y,W
GEN22:   EQU         $
         FCMZ        DFWORK          < EST-ON SUR P(I)=P(J) ???
         JE          GEN23           < OUI, ON DOIT DONC IGNORE CE POINT P(J)...
         FCAM        DFWORK          < TEST DE D(P(I),P(J)) POUR P(J) COURANT :
         JLE         GEN23           < TROP GRAND...
         #/FLD#      DFWORK          < OK, D(P(I),P(J)) DEVIENT LE 'MIN'
                                     < COURANT,
         LR          W,Y             < ET ON MEMORISE DANS 'Y' L'ADRESSE DU
                                     < DESCRIPTEUR DE P(J).
GEN23:   EQU         $
         ADRI        LDESCP,W        < PASSAGE AU POINT P(J) SUIVANT,
         JDX         GEN22           < S'IL EXISTE...
         FCAM        FINFIN          < A-T'ON TROUVE UN MINIMUM ???
         JE          GEN50           < NON, ON DOIT SE TROUVER PRES DE LA
                                     < FIN DE LA LISTE DES POINTS DU NUAGE...
         LR          Y,W             < (W)=ADRESSE DU DESCRIPTEUR DU PLUS
                                     <     PROCHE VOISIN COURANT P(J) DU
                                     <     POINT P(I) :
         #/FLD#      FINFIN
         #/FST#      DFWORK          < ON MAJORE LOURDEMENT LA DISTANCE, AFIN
                                     < DE NE PLUS RETROUVER CE POINT P(J) LORS
                                     < DE L'ITERATION SUIVANTE POUR P(I)...
         LA          DNVOIS          < (A)=NOMBRE DE VOISINS COURANT DE P(J) :
         CP          RDNMAX          < MAIS P(J) NE SERAIT-IL PAS DEJA SATURE
                                     < EN VOISINS ???
         JGE         GEN79           < OUI, ON IGNORE P(J)...
         CP          ANVOIS          < MEME QUESTION ???
         JL          GEN29           < NON...
GEN79:   EQU         $
         PLR         X,Y,W           < OUI, RESTAURE :
                                     < (X)=CARDINAL DE (P(J)),
                                     < (Y)=NOMBRE DE VOISINS POUR P(I),
                                     < (W)=BASE DES DESCRIPTEURS DE L'ENSEM-
                                     <     BLE (P(J)).
         JMP         GEN24           < VERS LA RECHERCHE D'UN AUTRE PLUS PROCHE
                                     < VOISIN DE P(I) PUISQUE L'ON VIENT
                                     < D'ECHOUER ICI...
GEN29:   EQU         $
         IC          DNVOIS          < COMPTABILISONS LES VOISINS DE P(J),
                                     < PUISQUE L'ON A LA RELATION :
                                     < D(P(I),P(J))=D(P(J),P(I))...
         ADRI        DLVOIS-DESCPT,W < PLACONS NOUS SUR LA LISTE DES VOISINS
                                     < DE P(J),
         LX          ANVOIS          < (X)=NOMBRE DE VOISINS MAXIMAL.
GEN25:   EQU         $
         IF          VOISEX-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         O,W             < ET CHERCHONS UN EMPLACEMENT LIBRE...
         JE          GEN26           < OK, TROUVE...
         ADRI        D,W             < NON,
         JDX         GEN25           < AU SUIVANT...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
         JMP         GEN40           <ET ON SAUTE LA MISE A JOUR...
GEN26:   EQU         $
         NGR         L,A             < (A)=ADRESSE DU DESCRIPTEUR DE P(I),
         STA         O,W             < QUE L'ON INSERE DANS LA LISTE DES
                                     < VOISINS DE P(J) ; CELLE-CI EST INSEREE
                                     < EN NEGATIF, AFIN DE MEMORISER LE FAIT
                                     < QU'ELLE FIGURE DANS LA LISTE DES VOI-
                                     < SINS DE P(I)...
         LR          L,W             < (W)=ADRESSE DU DESCRIPTEUR DE P(I),
         ADRI        DLVOIS-DESCPT,W < PLACONS-NOUS SUR LA LISTE DES VOISINS
                                     < DE P(I),
         LX          ANVOIS          < (X)=NOMBRE DE VOISINS MAXIMAL.
GEN27:   EQU         $
         IF          VOISEX-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         O,W             < ET CHERCHONS UN EMPLACEMENT LIBRE...
         JE          GEN28           < OK...
         ADRI        D,W             < NON,
         JDX         GEN27           < AU SUIVANT...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
         JMP         GEN41           < ET ON SAUTE LA MISE A JOUR...
GEN28:   EQU         $
         STY         O,W             < ET L'ON INSERE L'ADRESSE DU DESCRIPTEUR
                                     < DE P(J) (Y) DANS LA LISTE DES VOISINS
                                     < DE P(I).
GEN40:   EQU         $
GEN41:   EQU         $
GEN50:   EQU         $
         PLR         X,Y,W           < RESTAURE :
                                     < (X)=CARDINAL DE L'ENSEMBLE (P(J)),
                                     < (Y)=NOMBRE DE VOISINS A TROUVER POUR
                                     <     P(I),
                                     < (W)=ADRESSE DE BASE DES DESCRIPTEURS
                                     <     DE L'ENSEMBLE (P(J)).
         ADRI        -I,Y            < ET UN VOISINS DE MOINS A TROUVER POUR
                                     < P(I)...
         JMP         GEN20           < VERS LES VOISINS SUIVANTS...
<
< BOUCLE DE BALAYAGE DES P(I) :
<
GEN21:   EQU         $
GEN12:   EQU         $
         PLR         X,W             < RESTAURE :
                                     < (X)=NOMBRE DE POINTS P(I),
                                     < (W)=ADRESSE DU P(I) COURANT.
<
< CALCUL DU 'DNVOIS' REEL :
<
         PSR         X,W             < RE-SAUVEGARDE TEMPORAIRE...
         LX          ANVOIS          < (X)=NOMBRE DE VOISINS MAXIMAL,
         LYI         K               < (Y)=COMPTEUR DES VOISINS GENERES,
         ADRI        DLVOIS-DESCPT,W < (W)=BASE DE LA LISTE DES VOISINS DE P(I),
GEN42:   EQU         $
         IF          VOISEX-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         O,W             < A-T'ON ICI UN VOISIN ???
         JE          GEN43           < NON...
         ADRI        I,Y             < OUI, ON LE COMPTE,
GEN43:   EQU         $
         ADRI        D,W             < PASSAGE AU VOISIN SUIVANT EVENTUEL,
         JDX         GEN42           < S'IL EXISTE...
         PLR         X,W             < RESTAURATIONS,
         STY         DNVOIS          < ET MISE EN PLACE DU NOMBRE DE VOISINS
                                     < REELLEMENT GENERE...
<
< TRI DES VOISINS PAR ADRESSE
< DECROISSANTE DES DESCRIPTEURS :
<
         PSR         X,W
         LX          DNVOIS          < (X)=NOMBRE REEL DE VOISINS,
         ADRI        DLVOIS-DESCPT,W < (W)=ADRESSE DE LA LISTE DES VOISINS.
GEN73:   EQU         $
         ADRI        -I,X            < (X)=NOMBRE DE TESTS A FAIRE POUR TRIER
                                     <     PAR PERMUTATION 2 A 2...
         LR          X,A
         CPI         W               < Y-A-T'IL AU MOINS 1 VOISIN ???
         JL          GEN74           < NON...
         PSR         X,W
GEN71:   EQU         $
         LA          O,W             < ACCES A L'ELEMENT COURANT,
         CP          O+D,W           < ET COMPARAISON AU SUIVANT :
         JGE         GEN72           < OK, LE PLUS GRAND EST DEJA DEVANT...
         XM          O+D,W           < NON,
         STA         O,W             <      ON LES PERMUTE...
GEN72:   EQU         $
         ADRI        D,W             < PASSAGE A L'ELEMENT SUIVANT,
         JDX         GEN71           < S'IL EXISTE...
         PLR         X,W
         JMP         GEN73           < MAINTENANT QUE LE MINIMUMM EST EN QUEUE,
                                     < PASSONS A UN UN MINIMUM INFERIEUR...
GEN74:   EQU         $
         PLR         X,W             < NON, ON A FINI LE TRI...
GEN11:   EQU         $
         ADRI        LDESCP,W        < PASSAGE AU POINT P(I) SUIVAT,
         JDX         GEN110          < S'IL EXISTE...
         JMP         GEN111          < VERS LA VISUALISATION...
GEN110:  EQU         $
         BSR         AGOTO
         WORD        GEN10           < VERS LE POINT P(I) SUIVANT...
GEN111:  EQU         $
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
<
<        V I S U A L I S A T I O N   D E S   V O I S I N A G E S  :
<
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IWGVOI          < DOIT-ON TRACER LES VOISINAGES ???
         JE          GEN32           < NON...
         #/FLD#      FACT
         PSR         A,B             < SAUVEGARDE DE 'FACT'...
         FDV         F05
         #/FST#      FACT            < AFIN DE VOIR L'ENSEMBLE DU DESIN...
         LX          ANPOIN          < (X)=NOMBRE DE POINTS DANS LE NUAGE,
         LRM         W
         WORD        LPOINT          < (W)=ADRESSE DE LA BASE DES DEXCRIPTEURS.
GEN30:   EQU         $
         PSR         X,W             < SAUVEGARDES...
         LX          DNVOIS          < (X)=NOMBRE DE VOISINS DE P(I) COURANT,
         CPZR        X               < P(I) A-T'IL DES VOISINS ???
         JE          GEN31           < NON, RIEN A FAIRE...
         PSR         X               < SAUVEGARDE DU NOMBRE DE VOISINS P(J)
                                     < DE P(I).
         BSR         APMOV1          < DEPLACEMENT DE P(I) --> (FXS,FYS),
         BSR         APROJ           < QUE L'ON PROJETTE,
         LRM         A,B,X
         WORD        CS2D            < (A)=ADRESSE DU POINT 2D COURANT,
         WORD        BUFGR1          < (B)=ADRESSE DU BUFFER ORIGINE GRAPHIQUE,
         WORD        LBUF2D          < (X)=NOMBRE DE MOTS A DEPLACER,
         MOVE                        < ET MISE EN PLACE DE L'ORIGINE P(I)...
         PLR         X               < RESTAURE :
                                     < (X)=NOMBRE DE VOISINS P(J) DE P(I).
         LR          W,L
         ADRI        DLVOIS-DESCPT,L < (L)=BASE DE LA LISTE DES VOISINS P(J)
                                     < DE P(I).
GEN33:   EQU         $
         PSR         X               < SAUVEGARDE DU NOMBRE DE VOISINS P(J)
                                     < DE P(I) ENCORE A TRACER...
         LA          O,L             < (A)=ADRESSE DU DESCRIPTEUR DE P(J).
         IF          VOISEX-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         JALE        GEN34           < ET ON SAUTE LE TRACE SI LE VOISIN N'EXIS-
                                     < TE PAS, OU BIEN FIGURE DANS UNE LISTE
                                     < ANTERIEURE...
         LR          A,W             < (W)=ADRESSE D'UN VOISIN P(J) DE P(I),
         BSR         APMOV1          < DEPLACEMENT DE P(J) -- (FXS,FYS,FZS),
         BSR         APROJ           < QUE L'ON PROJETTE,
         LRM         A,B,X
         WORD        CS2D            < (A)=ADRESSE DU POINT 2D COURANT,
         WORD        BUFGR2          < (B)=ADRESSE DU BUFFER EXTREMITE GRAPHIQUE
         WORD        LBUF2D          < (X)=NOMBRE DE MOTS A DEPLACER,
         MOVE                        < ET MISE EN PLACE DE L'EXTREMITE P(J)...
         LAD         DEMOG
         SVC                         < OUVERTURE GRAPHIQUE, AFIN DE DECHAINER
                                     < LES VECTEURS.
         LAD         DEMWG
         SVC                         < ET TRACE DU VECTEUR (P(I),P(J))...
GEN34:   EQU         $
         PLR         X               < RESTAURE :
                                     < (X)=NOMBRE DE VOISINS P(J) RESTANT A
                                     < VISUALISER...
         ADRI        D,L             < ACCES AU VOISIN P(J) SUIVANT,
         JDX         GEN33           < S'IL EXISTE...
GEN31:   EQU         $
         PLR         X,W             < RESTAURE :
                                     < (X)=NOMBRE DE POINTS P(I) A TRAITER,
                                     < (W)=BASE COURANTE DE P(I).
         ADRI        LDESCP,W        < PASSAGE AU POINT P(I) SUIVANT,
         JDX         GEN30           < S'IL EXISTE...
         LAD         DEMCG
         SVC                         < ET RETOUR EN ALPHA-NUMERIQUE...
         PLR         A,B
         #/FST#      FACT            < RESTAURATION DE 'FACT'...
GEN32:   EQU         $
XOPT1:   VAL         ENDIF
<
<
<        G E N E R A T I O N   D E   L ' I M A G E  :
<
<
GEN69:   EQU         $
         QUIT        XXQUIT          < P O U R   R E F L E C H I R ...
         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'.
<
< INITIALISATION DES
< CONDITIONS DE TRACE :
<
GEN69N:  EQU         $
         LAI         VECTSB
         STA         VECTRS          < MISE EN MODE 'SBT', SOIT 'OU-FLOU',
         LRM         A
         WORD        XXN255+Z=K+I
         STA         VEDECA          < AFIN D'ECRASER LE NIVEAU ANTERIEUR...
<
< VISUALISATION DES POINTS DU NUAGE :
<
         LX          ANPOIN          < (X)=NOMBRE DE POINTS DANS LE NUAGE,
         LRM         W
         WORD        LPOINT          < (W)=ADRESSE DE LA BASE DES DEXCRIPTEURS.
GEN70:   EQU         $
         PSR         X               < SAUVEGARDE DU NOMBRE DE POINTS...
         BSR         APMOV1          < DEPLACEMENT DE P(I) --> (FXS,FYS),
         BSR         APROJ           < QUE L'ON PROJETTE,
         LRM         A,B,X
         WORD        CS2D            < (A)=ADRESSE DU POINT 2D COURANT,
         WORD        BUFGR1          < (B)=ADRESSE DU BUFFER ORIGINE GRAPHIQUE,
         WORD        LBUF2D          < (X)=NOMBRE DE MOTS A DEPLACER,
         MOVE                        < ET MISE EN PLACE DE L'ORIGINE P(I)...
         LX          BUFGR1+COORDX
         LY          BUFGR1+COORDY
         BSR         ACERCL          < VISUALISATION DU POINT COURANT.
         PLR         X               < RESTAURE :
                                     < (X)=NOMBRE DE POINTS DU NUAGE...
         ADRI        LDESCP,W        < PASSAGE AU POINT P(I) SUIVANT,
         JDX         GEN70           < S'IL EXISTE...
         QUIT        XXQUIT          < POUR POUVOIR ADMIRER L'IMAGE DES POINTS
                                     < DU NUAGE...
<
< PARCOURS DE LA LISTE
< DES VOISINAGES ET
< LEUR VISUALISATION :
<
         LX          ANPOIN          < (X)=NOMBRE DE POINTS DANS LE NUAGE,
         LRM         W
         WORD        LPOINT          < (W)=ADRESSE DE LA BASE DES DEXCRIPTEURS.
GEN80:   EQU         $
         PSR         X,W             < SAUVEGARDES...
         LX          DNVOIS          < (X)=NOMBRE DE VOISINS DE P(I) COURANT,
         CPZR        X               < P(I) A-T'IL DES VOISINS ???
         JG          GEN181          < OUI, ALLONS LES VISUALISER...
         BSR         AGOTO
         WORD        GEN81           < NON, 'GOTO' RIEN FAIRE...
GEN181:  EQU         $
         PSR         X               < SAUVEGARDE DU NOMBRE DE VOISINS P(J)
                                     < DE P(I).
         BSR         APMOV1          < DEPLACEMENT DE P(I) --> (FXS,FYS),
         BSR         APROJ           < QUE L'ON PROJETTE,
         LRM         A,B,X
         WORD        CS2D            < (A)=ADRESSE DU POINT 2D COURANT,
         WORD        BUFGR1          < (B)=ADRESSE DU BUFFER ORIGINE GRAPHIQUE,
         WORD        LBUF2D          < (X)=NOMBRE DE MOTS A DEPLACER,
         MOVE                        < ET MISE EN PLACE DE L'ORIGINE P(I)...
         PLR         X               < RESTAURE :
                                     < (X)=NOMBRE DE VOISINS P(J) DE P(I).
         LR          W,L
         ADRI        DLVOIS-DESCPT,L < (L)=BASE DE LA LISTE DES VOISINS P(J)
                                     < DE P(I).
GEN83:   EQU         $
         PSR         X               < SAUVEGARDE DU NOMBRE DE VOISINS P(J)
                                     < DE P(I) ENCORE A TRACER...
         LA          O,L             < (A)=ADRESSE DU DESCRIPTEUR DE P(J).
         IF          VOISEX-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         JAG         GEN85           < OK...
         BSR         AGOTO
         WORD        GEN84           < ET ON SAUTE LE TRACE S'IL N'Y A PAS DE
                                     < VOISINS OU BIEN S'IL FIGURE SUR UNE LISTE
                                     < ANTERIEURE...
<
< VISUALISATION D'UNE LIAISON (P(I),P(J)) :
<
GEN85:   EQU         $
         LR          A,W             < (W)=ADRESSE D'UN VOISIN P(J) DE P(I),
         BSR         APMOV1          < DEPLACEMENT DE P(J) -- (FXS,FYS,FZS),
         BSR         APROJ           < QUE L'ON PROJETTE,
         LRM         A,B,X
         WORD        CS2D            < (A)=ADRESSE DU POINT 2D COURANT,
         WORD        BUFGR2          < (B)=ADRESSE DU BUFFER EXTREMITE GRAPHIQUE
         WORD        LBUF2D          < (X)=NOMBRE DE MOTS A DEPLACER,
         MOVE                        < ET MISE EN PLACE DE L'EXTREMITE P(J)...
<
< TRACE D'UN RECTANGLE :
<
         PSR         X,Y
         LRM         A,B,X
         WORD        BUFGR           < (A)=ADRESSE DU VECTEUR PROJETE,
         WORD        VECGC           < (B)=ADRESSE DU VECTEUR A TRACER EN 512,
         WORD        LBUFGR          < (X)=NOMBRE DE MOTS A DEPLACER.
         MOVE                        < PREPARATION DES ARGUMENTS DE L'INTER-
                                     < POLATEUR.
                                     < NOTA : LE VECTEUR (+(Y2-Y1),-(X2-X1))
                                     < EST UN VECTEUR NORMAL AU VECTEUR
                                     < ((X2-X1),(Y2-Y1)) A TRACER ; ON VA DONC
                                     < LE REPRESENTER PAR UN RECTANGLE BALAYE
                                     < LE LONG DE CE VECTEUR NORMAL...
<
< TRACE DES DISQUES
< DES 2 EXTREMITES :
<
         LX          VECGX1
         LY          VECGY1
         BSR         ACERCL          < TRACE DU DISQUE DE CENTRE (X1,Y1).
         LX          VECGX2
         LY          VECGY2
         BSR         ACERCL          < TRACE DU DISQUE DE CENTRE (X2,Y2).
<
< CALCUL DU PAS EN 'X' ET 'Y'
< DE GENERATION DU RECTANGLE :
<
         LA          VECGX2          < X2,
         SB          VECGX1          < X2-X1,
         NGR         A,Y             < (Y)=-(X2-X1).
         LA          VECGY2          < Y2,
         SB          VECGY1          < Y2-Y1.
         LR          A,X             < (X)=+(Y2-Y1).
         PSR         X,Y
         CPZR        X               < RECHERCHE DE ABS(X).
         JGE         GEN93
         NGR         X,X
GEN93:   EQU         $
         CPZR        Y               < RECHERCHE DE ABS(Y).
         JGE         GEN94
         NGR         Y,Y
GEN94:   EQU         $
         LR          X,A
         CPR         Y,X             < RECHERCHE DU MAX((X),(Y)) :
         JGE         GEN90           < 'X' EST LE MAXIMUM...
         LR          Y,A             < 'Y' EST LE MAXIMUM...
GEN90:   EQU         $
         PLR         X,Y
         JANE        GEN96           < OK, LE MAXIMUM EST NON NUL...
         BSR         AGOTO
         WORD        GEN97           < SI LE MAXIMUM EST NUL, CELA SIGNIFIE
                                     < QUE LES 2 POINTS P(I) ET P(J) SONT TRES
                                     < PROCHES (SANS ETRE CONFONDUS PUISQUE
                                     < L'ON ELIMINE LES D(P(I),P(J)) QUI SONT
                                     < NULLES...), ON N'A DONC PAS DE RECTANGLE
                                     < A TRACER...
GEN96:   EQU         $
         BSR         AFLT
         #/FST#      FWORK1          < ET MEMORISATION DANS 'FWORK1'
                                     < DE MAX(+(Y2-Y1),-(X2-X1)).
         LR          X,A             < +(Y2-Y1),
         BSR         AFLT
         FDV         FWORK1
         #/FST#      FECGXP          < PAS LE LONG DE 'X' :
                                     < +(Y2-Y1)/MAX(+(Y2-Y1),-(X2-X1)).
         LR          Y,A
         BSR         AFLT
         FDV         FWORK1
         #/FST#      FECGYP          < PAS LE LONG DE 'Y' :
                                     < -(X2-X1)/MAX(+(Y2-Y1),-(X2-X1)).
         LA          VECGX1          < X1,
         STA         SAVEX           < X(CENTRE DU DISQUE (X1,Y1)),
         BSR         AFLT
         #/FST#      FECGX1
         LA          VECGY1          < Y1.
         STA         SAVEY           < Y(CENTRE DU DISQUE (X1,Y1)).
         BSR         AFLT
         #/FST#      FECGY1
         LA          VECGX2          < X2,
         BSR         AFLT
         #/FST#      FECGX2
         LA          VECGY2          < Y2.
         BSR         AFLT
         #/FST#      FECGY2
         LAI         XNIV0
         STA         VECTNI          < INITIALISATION DU PREMIER NIVEAU...
<
< CALCUL DE L'EPAISSEUR :
<
         #/FLD#      FECGXP          < XP (PAS LE LONG DE 'X'),
         FMP         FECGXP          < XP*XP,
         BSR         ASFWOR
         #/FLD#      FECGYP          < YP (PAS LE LONG DE 'Y'),
         FMP         FECGYP          < YP*YP,
         BSR         APFWOR          < XP*XP+YP*YP,
         BSR         ARAC            < RAC(XP*XP+YP*YP),
         BSR         ATSFLO
         #/FST#      FWORK2          < FWORK2=RAC(XP*XP+YP*YP),
         LA          DEPAIS
         BSR         AFLT            < EPAIS,
         FDV         FWORK2          < EPAIS/RAC(XP*XP+YP*YP),
         BSR         AROND
         ADRI        W,A             < ON MAJORE D'UNE UNITE, AFIN DE FAVORISER
                                     < LE TEST DE RACCORDEMENT DU RECTANGLE ET
                                     < DES DISQUES D'EXTREMITE...
         LR          A,X             < (X)=NOMBRE DE DECALAGE A FAIRE SUR LE
                                     <     VECTEUR ARGUMENT POUR L'AMENER SUR
                                     <     L'UN DES COTES DU RECTANGLE.
<
< RECHERCHE D'UN GRAND
< BORD DU RECTANGLE :
<
         STX         WEPAIS          < (CORRESPOND A XEPAIS-Z/XXXMOY)
GEN91:   EQU         $
         #/FLD#      FECGX1
         FSB         FECGXP
         #/FST#      FECGX1          < TRANSLATION DE 'X1',
         #/FLD#      FECGY1
         FSB         FECGYP
         #/FST#      FECGY1          < TRANSLATION DE 'Y1'.
         #/FLD#      FECGX2
         FSB         FECGXP
         #/FST#      FECGX2          < TRANSLATION DE 'X2',
         #/FLD#      FECGY2
         FSB         FECGYP
         #/FST#      FECGY2          < TRANSLATION DE 'Y2'.
         JDX         GEN91           < UN PEU LOURD COMME METHODE, MAIS JE
                                     < FAIS SIMPLE...
<
< GENERATION DU RECTANGLE :
<
         LA          WEPAIS
         LR          A,X
         ADR         X,X
         ADRI        Z,X             < (X)=NOMBRE DE VECTEURS A TRACER POUR
                                     < REMPLIR LE RECTANGLE,
                                     < (CORRESPOND A XEPAIS)
         ADRI        Z,A
         STA         WEPAIS          < POUR LE TEST DE MILIEU...
         LY          AXNIVP          < (Y)=PAS INITIAL DE PROGRESSION DES
                                     <     NIVEAUX DES VECTEURS.
GEN92:   EQU         $
         #/FLD#      FECGX1
         BSR         AROND
         STA         VECGX1          < GENERATION DE 'X1',
         #/FLD#      FECGY1
         BSR         AROND
         STA         VECGY1          < GENERATION DE 'Y1'.
         LA          VECGX1          < X1,
         SB          SAVEX           < X1-XC,
         BSR         AFLT
         #/FST#      FWORK1          < X1-XC,
         FMP         FWORK1          < (X1-XC)**2,
         BSR         ASFWOR
         LA          VECGY1          < Y1,
         SB          SAVEY           < 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          DEPAIS          < LE VECTEUR COURANT DE REMPLISSAGE
                                     < TOMBE-T'IL DANS LE DISQUE (SAVEX,SAVEY) ?
         JG          GEN95           < NON, ON IGNORE CE VECTEUR...
         #/FLD#      FECGX2          < NON, ON TRACE CE VECTEUR...
         BSR         AROND
         STA         VECGX2          < GENERATION DE 'X2',
         #/FLD#      FECGY2
         BSR         AROND
         STA         VECGY2          < GENERATION DE 'Y2'.
         BSR         AVE512          < TRACE DU VECTEUR ((X1,Y1),(X2,Y2))
                                     < COURANT...
         LR          X,A             < (A)=INDEX DE LA BOUCLE :
         CP          WEPAIS          < EST-ON AU MILIEU DU REMPLISSAGE ???
                                     < (CORRESPOND A XEPAIS-Z/XXXMOY+Z)
         JNE         GEN86           < NON...
         NGR         Y,Y             < OUI, ON INVERSE LE PAS DE PROGRESSION
                                     < DES NIVEAUX DES VECTEURS AFIN D'AVOIR
                                     < DU "RELIEF", ET D'EVITER A AVOIR A FAIRE
                                     < DE L'ANTI-ALIASING SUR LES BORDS !!!
GEN86:   EQU         $
         LA          VECTNI
         ADR         Y,A
         STA         VECTNI          < ET TRANSLATION DU NIVEAU DE TRACE...
GEN95:   EQU         $
         #/FLD#      FECGX1
         FAD         FECGXP
         #/FST#      FECGX1          < TRANSLATION DE 'X1',
         #/FLD#      FECGY1
         FAD         FECGYP
         #/FST#      FECGY1          < TRANSLATION DE 'Y1'.
         #/FLD#      FECGX2
         FAD         FECGXP
         #/FST#      FECGX2          < TRANSLATION DE 'X2',
         #/FLD#      FECGY2
         FAD         FECGYP
         #/FST#      FECGY2          < TRANSLATION DE 'Y2'.
         JDX         GEN92           < ET AU VECTEUR SUIVANT DE REMPLISSAGE
                                     < DU RECTANGLE...
GEN97:   EQU         $
         PLR         X,Y
GEN84:   EQU         $
<
< PASSAGE A UN VECTEUR (P(I),P(J)) SUIVANT :
<
         PLR         X               < RESTAURE :
                                     < (X)=NOMBRE DE VOISINS P(J) RESTANT A
                                     < VISUALISER...
         ADRI        D,L             < ACCES AU VOISIN P(J) SUIVANT,
         JDX         GEN183          < S'IL EXISTE...
GEN81:   EQU         $
         PLR         X,W             < RESTAURE :
                                     < (X)=NOMBRE DE POINTS P(I) A TRAITER,
                                     < (W)=BASE COURANTE DE P(I).
         ADRI        LDESCP,W        < PASSAGE AU POINT P(I) SUIVANT,
         JDX         GEN180          < S'IL EXISTE...
<
< RELAIS :
<
         JMP         GEN200          < POUR LES SAUTER...
GEN183:  EQU         $
         BSR         AGOTO
         WORD        GEN83
GEN180:  EQU         $
         BSR         AGOTO
         WORD        GEN80
GEN200:  EQU         $
<
<
<        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
<
<
<        L I S T E   D E S   D E S C R I P T E U R S   D E   P O I N T S  :
<
<
LPOINT:  EQU         $
         IF          LPOINT=FCTA,,,XEIF%
         IF          ATTENTION : A CAUSE DE 'VOISEX', TOUTES LES
         IF          ADRESSES DE 'LPOINT' DOIVENT ETRE STRICTEMENT
         IF          POSITIVES !!!
XEIF%:   VAL         ENDIF
         DO          NPOINT
         DZS         LDESCP
         IF          $=FCTA-K,,,XEIF%
         IF          ATTENTION : A CAUSE DE 'VOISEX',
         IF          TOUTES LES ADRESSES DE 'LPOINT'
         IF          DOIVENT ETRE STRICTEMENT POSITIVES !!!
XEIF%:   VAL         ENDIF
         PAGE
<
<
<        U P D A T E S  :
<
<
         $EQU        PZ
         FLOAT       1000            < POINT DE VUE DE L'OBSERVATEUR.
         $EQU        FACT
         FLOAT       70              < FACTEUR D'ECHELLE DE LA PROJECTION.
         $EQU        TRX
         WORD        SIZXVI/XXXMOY   < X-TRANSLATION GRAPHIQUE.
         $EQU        TRY
         WORD        SIZYVI/XXXMOY   < Y-TRANSLATION GRAPHIQUE.
         $EQU        ADIMGR
         WORD        DIMGR2          < DIMENSION DE L'ESPACE GRAPHIQUE.
         $EQU        RDNMIN
         WORD        NVOIS*DIMGR2    < MIN(NOMBRE DE VOISINS).
         $EQU        RDNMAX
         WORD        NVOIS*DIMGR2    < MAX(NOMBRE DE VOISINS).
         $EQU        ANVOIS
         WORD        NVOIS*DIMGR2    < NOMBRE DE VOISINS MAXIMAL D'UN POINT.
         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-2022.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2022.