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#
<
< CONSTANTES DES IMAGES (256,256) :
<
ORDI::   VAL                     "@" < TYPE DE L'ORDINATEUR...
         CALL        #SIP IMAGE 256#
NMOTL::  VAL         CNMPL           < NOMBRE DE MOTS PAR LIGNE D'IMAGE (256).
NPOL::   VAL         NMOTL*NBITMO    < NOMBRE DE POINTS PAR LIGNE,
NLIG::   VAL         LIMAG/NMOTL     < NOMBRE DE LIGNES PAR IMAGE (256,256).
NPOLM1:: VAL         NPOL-Z          < ABSCISSE MAXIMALE.
NLIGM1:: VAL         NLIG-Z          < ORDONNEE MAXIMALE.
TV1::    MOT         O               < PREMIERE IMAGE (256,256),
TV2::    MOT         '5000           < DEUXIEME IMAGE (256,256).
NCOOL::  VAL         XNCOOL          < NOMBRE DE COULEURS PRIMAIRES,
NIVMX7:: VAL         BIT>NCOOL-N     < NIVEAU MAXIMAL EN (256,256)...
<
<
<        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...
         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 O N N E E S   P O U R   L E S   O M B R E S   P O R T E E S  :
<
<
<        FONCTION :
<                      ON TROUVE ICI DEUX VECTEURS
<                    CORRESPONDANT AUX BORDS DROIT
<                    ET SUPERIEUR DE L'IMAGE ; ILS
<                    CONTIENNENT POUR CHAQUE PLAN
<                    A 'Z' CONSTANT TRACE LA PROJEC-
<                    TION DE CE PLAN SUIVANT LA SOUR-
<                    CE LUMINEUSE. LORSQU'UN NOUVEAU
<                    POINT (X,Y) VA ETRE TRACE, ON LE
<                    PROJETTE SUR CES 2 VECTEURS SUI-
<                    VANT LA SOURCE LUMINEUSE : SI
<                    L'ENTREE ATTEINTE CONTIENT UNE
<                    VALEUR NEGATIVE, CELA SIGNIFIE
<                    QU'ELLE EST LIBRE : LE POINT COURANT
<                    EST DONC AU SOLEIL ; SINON, ON Y
<                    TROUVE LA COORDONNEE 'Y' DU POINT
<                    AU SOLEIL ALIGNE AVEC LE POINT
<                    COURANT : SI LA DIFFERENCE DES 2
<                    ORDONNEES EST PETITE, ON CONSIDERE
<                    LE POINT COURANT AU SOLEIL (CETTE
<                    METHODE PERMET, JE L'ESPERE,
<                    D'ELIMINER DES PROBLEMES DUS A
<                    L'ALIASING INTER-LIGNE ET INTER-
<                    PLAN...).
<                      ON TROUVE ENSUITE LA MEME
<                    CHSOE POUR LE PLAN SUIVANT 'Z+1' ;
<                    ON NOTERA QUE 'COTE' SE REFERE
<                    AU PLAN 'Z' ET 'KOTE' AU PLAN 'Z+1'...
<
<
COTES:   EQU         $               < DEBUT DE LA ZONE DES 'COTES'...
COTEV:   EQU         $
LCOTEV:: VAL         XL512
         DZS         LCOTEV          < COTE DROIT DE L'IMAGE.
COTEH:   EQU         $
LCOTEH:: VAL         XC512
         DZS         LCOTEH          < COTE SUPERIEUR DE L'IMAGE.
KOTEV:   EQU         $
LKOTEV:: VAL         LCOTEV
         DZS         LKOTEV          < KOTE DROIT DE L'IMAGE.
KOTEH:   EQU         $
LKOTEH:: VAL         LCOTEH
         DZS         LKOTEH          < KOTE SUPERIEUR DE L'IMAGE.
LCOTES:: VAL         $-COTES         < LONGUEUR DE LA ZONE DES 'COTES'...
         PAGE
<
<
<        M E S S A G E S  :
<
<
         TABLE
<
< BUFFER BANDE :
<
LBUFMT: @
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 'LBUFMT'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
LBUFMT:: VAL         4096
XEIF%:   VAL         ENDIF
BUFMT:   EQU         COTES           < ATTENTION : 'BUFMT' ET 'COTES' SONT
                                     < RECOUVREMENT ; MAIS CELA NE GENE PAS
                                     < CAR LORSQU'ON LIT UNE BANDE, ON FORCE
                                     < (IECL)='NEXIST', ET DONC LES BUFFERS DE
                                     < 'COTES' SONT INUTILISES...
         IF          LBUFMT/NOCMO-LCOTES,XEIF%,XEIF%,
         IF          ATTENTION : LE RECOUVREMENT DE 'BUFMT' ET 'COTES'
         IF          EST IMPOSSIBLE !!!
XEIF%:   VAL         ENDIF
<
<
<        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 :
<
SCOUCH:  WORD        NILK            < SEUIL DONNANT LE NIVEAU FRONTIERE ENTRE
                                     < L'EXTERIEUR ET L'INTERIEUR DE LA SUR-
                                     < FACE ALEATOIRE.
ECOUCH:  WORD        NILK            < SEUIL DONNANT 'SCOUCH' PLUS L'EPAISSEUR
                                     < DE LA SURFACE FRACTALE...
NCOUCH:  WORD        NILK            < NOMBRE DE COUCHES A SUPERPOSER (CORRES-
                                     < POND A UNE TROISIEME DIMENSION 'Z'
                                     < PERPENDICULAIRE A L'ECRAN).
AXMIN:   WORD        K               < ABSCISSE MINIMALE,
AYMIN:   WORD        K               < ORDONNEE MINIMALE,
AZMIN:   WORD        XXNOIR+I        < 'Z' MINIMALE (A NOTER LA VALEUR D'INI-
                                     < TIALISATION LIEE A LA NOTION DE "DEPTH-
                                     < CUEING"...).
AMPLIR:  FLOAT       <NILK<NILK<NILK < AMPLIFICATEUR DU RESULTAT FINAL.
MOYENE:  FLOAT       <NILK<NILK<NILK < VALEUR MOYENEE DU RESULTAT FINAL.
MAXREC:: VAL         100             < VALEUR MAXIMALE DE 'NRECUR'...
MRECUR:  WORD        NILK            < NOMBRE DE RECURSIONS MAXIMAL LORS DE LA
                                     < SOMMATION DES FONCTION ALEATOIRES.
NPM:     WORD        NILK            < NOMBRE DE POINTS DES SPIRALES GENEREES
                                     < A PARTIR DES IMAGES 'TV1'/'TV2'.
EXPOP0:  FLOAT       <NILK<NILK<NILK < EXPOSANT DE CALCUL DES EXPONENTIELLES.
PASIX0:  WORD        NILK            < PAS SUR OX,
PASIY0:  WORD        NILK            < PAS SUR OY,
PASIZ0:  WORD        NILK            < PAS SUR OZ.
GRAINE:  WORD        NILK            < GRAINE DE 'RDN'...
SUPRDN:  WORD        NILK            < SUP(RDN),
INFRDN:  WORD        NILK            < INF(RDN).
MAXNIV:  WORD        NILK            < MAXIMUM DES NIVEAUX TRACES,
MINNIV:  WORD        NILK            < MINIMUM DES NIVEAUX TRACES.
TRONIV:  WORD        NEXIST          < TRONQUER BRUTALEMENT ('EXIST') OU UTILI-
                                     < SER UNE FONCTION EN DENTS DE SCIE
                                     < ('NEXIST') POUR LES VALEURS DU CHAMP...
PASDER:  WORD        NILK            < PAS COURANT DE DERIVATION : ON NOTERA
                                     < QUE LES GRANDES VALEURS PERMETTENT UN
                                     < FILTRAGE DES DETAILS, ET QUE LES PETITES
                                     < VALEURS (SURTOUT SI 'NRECUR' EST FAIBLE)
                                     < DONNENT DE MAUVAIS RESULTATS...
INEW:    WORD        EXIST           < NOUVELLE METHODE ('EXIST') OU BIEN
                                     < ANCIENNE METHODE ('NEXIST') DU TRACE DE
                                     < LA SURFACE ; DANS LA NOUVELLE METHODE,
                                     < ON INTRODUIT UNE INTERPOLATION ENTRE
                                     < 2 PLANS CONSECUTIFS 'Z' ET 'Z+1'...
IECL:    WORD        EXIST           < ECLAIRER ('EXIST') OU FAIRE DU "DEPTH-
                                     < CUEING" ('NEXIST') DE LA SURFACE...
IECLDC:  WORD        EXIST           < S'IL Y A ECLAIRAGE (VOIR 'IECL') FAIRE
                                     < SIMULTANEMENT DU "DEPTH-CUEING" ('EXIST')
                                     < OU PAS ('NEXIST').
IOMBRE:  WORD        EXIST           < S'IL Y A ECLAIRAGE DOIT-IL Y AVOIR DES
                                     < OMBRES PORTEES ('EXIST') OU DOIT-IL NE
                                     < PAS Y EN AVOIR ('NEXIST').
NPENOM:  WORD        NILK            < LARGEUR DE LA ZONE DE PENOMBRE (DOIT
                                     < ETRE STRICTEMENT POSITIVE) ; SI LA VALEUR
                                     < EST 1, IL N'Y EN A PAS...
IINTER:  WORD        EXIST           < LORS DU TRACE DES SEGMENTS PAR 'SEGH'
                                     < INTERPOLER DE LA DROITE VERS LA GAUCHE
                                     < ('EXIST'), OU BIEN TRACER LES NIVEAUX
                                     < TELS QU'ILS ONT ETE CALCULES PAR L'EQUA-
                                     < TION DE LA SURFACE ('NEXIST').
IMAX:    WORD        EXIST           < LORS DE L'INTERPOLATION PRENDRE LE 'MAX'
                                     < ENTRE LE NIVEAU DE 'LISTN' ET LE NIVEAU
                                     < CALCULE PAR INTERPOLATION ('EXIST'), OU
                                     < PRENDRE A PRIORI LE NIVEAU INTERPOLE
                                     < ('NEXIST') ; ON FAVORISE AINSI L'EN-
                                     < SOLEILLEMENT...
IINTMI:  WORD        NEXIST          < S'IL Y A INTERPOLATION, DOIT-ON FAIRE
                                     < UNE FAUSSE INTERPOLATION ('EXIST') QUI
                                     < CONSISTE A FORCER 'INTENG' SUR LE SEG-
                                     < MENT (VECGX1,EXTREM-1) ET 'INTEND' SUR
                                     < LE SEGMENT (EXTREM,VECGX2), OU BIEN ALORS
                                     < UNE VRAIE INTERPOLATION ('NEXIST').
NFONCT:  WORD        NEXIST          < INDICATEUR DE MODULATION DE LA FONCTION
                                     < 'RDN' CALCULEE :
                                     < 'NEXIST' : PAS DE MODULATION,
                                     < TOUTE AUTRE VALEUR INDEXE UNE FONCTION
                                     < DE MODULATION TELLE 'FGAUSS'...
FGAUSS:: VAL         EXIST           < INDEX DE LA MODULATION GAUSSIENNE QUI
                                     < VA CENTRER LA GENERATION AU CENTRE DU
                                     < CUBE VISUALISE...
IERASE:  WORD        NEXIST          < EFFACER ('EXIST'), OU NON ('NEXIST')
                                     < L'ECRAN 512...
TRDNX:   WORD        K               < TRANSLATION EN 'X' DU CHAMP RDN,
TRDNY:   WORD        K               < TRANSLATION EN 'Y' DU CHAMP RDN,
TRDNZ:   WORD        K               < TRANSLATION EN 'Z' DU CHAMP RDN.
FH:      FLOAT       <NILK<NILK<NILK < POUR DEFINIR LA FONCTION DE MODULATION
                                     < DU "DEPTH-CUEING" ; EN EFFET, ON CAL-
                                     < CULE UN NOMBRE 'X' APPARTENANT A (0,255)
                                     < FONCTION DE LA PROFONDEUR PAR RAPPORT
                                     < A L'ECRAN. ENSUITE CET 'X' EST MODULE
                                     < PAR UNE FONCTION LINEAIRE :
                                     < Y=(255-'FH')*X/255+'FH', AVEC 'FH' DANS (
                                     < 'Y' EST DONC DANS (FH,255) ; ET :
                                     < SI FH=0 : "DEPTH-CUEING" MAXIMAL,
                                     < SI FH=1 : PAS DE "DEPTH-CUEING"...
IBANDE:  WORD        NEXIST          < CHOIX DU MODE D'"ENTREE" DE LA FONCTION :
                                     < 'NEXIST' : ELLE EST CALCULEE A PARTIR
                                     <            DE LA FORMULE ALEATOIRE RECUR-
                                     <            SIVE,
                                     < 'EXIST'  : ELLE EST LUE SUR BANDE, ET
                                     <            ALORS ON A INTERET A FAIRE :
                                     <            (ALPHA)=0...
ABLOC0:  WORD        K               < NUMERO DU PREMIER BLOC A LIRE SUR LA
                                     < BANDE MAGNETIQUE.
                                     < NOTA : SI (ABLOC0)<0 : ON TRAVAILLE EN
                                     <        SEQUENTIEL STRICT, SANS JAMAIS RE-
                                     <        INITIALISER L'ADRESSE COURANTE
                                     <        SUR LA BANDE...
         IF          XOPT01-EXIST,XOPT1,,XOPT1
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...').
<
< POINT COURANT :
<
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,
ZS:      WORD        NILK            < TROISIEME COORDONNEE CORRESPONDANT A
                                     < L'EMPILEMENT DES COUCHES...
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'.
<
< 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
<
< CALCUL D'UN PRODUIT SCALAIRE :
<
APRSCA:  WORD        PRSCA           < SOUS-PROGRAMME DE CALCUL D'UN PRODUIT
                                     < SCALAIRE DE 2 VECTEURS 3D...
<
< 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
<
< DEFINITION DE LA NORMALE :
<
CN3D:    EQU         $               < DEBUT DES COORDONNEES DE LA NORMALE :
FXN:     FLOAT       <NILK<NILK<NILK < X(N),
FYN:     FLOAT       <NILK<NILK<NILK < Y(N),
FZN:     FLOAT       <NILK<NILK<NILK < Z(N).
APVALN:  WORD        PVALN           < SOUS-PROGRAMME DE TEST DE NON-NULLITE
                                     < DU VECTEUR NORMAL.
<
< DEFINITION DE LA SOURCE LUMINEUSE :
<
CL3D:    EQU         $               < DEBUT DES COORDONNEES DE LA SOURCE 'L' :
FXL:     FLOAT       <NILK<NILK<NILK < X(L),
FYL:     FLOAT       <NILK<NILK<NILK < Y(L),
FZL:     FLOAT       <NILK<NILK<NILK < Z(L).
FPENTM:  FLOAT       <NILK<NILK<NILK < MEMORISE XL/YL, C'EST-A-DIRE L'INVERSE
                                     < DE LA PENTE "MOYENNE" DES RAYONS LUMI-
                                     < NEUX.
<
< CALCUL DE L'ECLAIRAGE :
<
FNIVC:   FLOAT       <NILK<NILK<NILK < VAUT 'XXN255' SI L'ON NE FAIT PAS DE
                                     < "DEPTH-CUEING", ET UNE FONCTION LINEAIRE
                                     < DE 'Z' DANS LE CAS CONTRAIRE.
FNIVMX:  FLOAT       <XXN255<K<K     < NIVEAU LUMINEUX MAXIMAL.
FNIVEC:  FLOAT       <NILK<NILK<NILK < MODULATION COURANTE DE L'ECLAIRAGE DUE
                                     < A L'OMBRAGE.
FNIVLU:  FLOAT       <W<K<K          < MODULATION DE L'ECLAIRAGE D'UN POINT EN
                                     < PLEINE LUMIERE.
FNIVOM:  FLOAT       <K<K+W*BASE10/XXXMOY<K
                                     < MODULATION DE L'ECLAIRAGE D'UN POINT A
                                     < L'OMBRE.
FHP:     FLOAT       <NILK<NILK<NILK < FHP=255*FH,
F255MH:  FLOAT       <NILK<NILK<NILK < F255MH=255-FHP.
FPENOM:  FLOAT       <NILK<NILK<NILK < FPENOM=TNIVOM/NPENOM.
TNIVOM:  FLOAT       <NILK<NILK<NILK < TNIVOM=FNIVLU-FNIVOM.
AINTEN:  WORD        INTEN           < SOUS-PROGRAMME DE CALCUL DE L'ECLAIRAGE.
APNIVC:  WORD        PNIVC           < SOUS-PROGRAMME DE CALCUL DE L'INTENSITE
                                     < LUMINEUSE MAXIMALE.
APNIVO:  WORD        PNIVO           < SOUS-PROGRAMME DE CALCUL DE L'INTENSITE
                                     < LUMINEUSE GLOBALE POUR LE PLAN 'Z',
APNJVO:  WORD        PNJVO           < SOUS-PROGRAMME DE CALCUL DE L'INTENSITE
                                     < LUMINEUSE GLOBALE POUR LE PLAN 'Z+1'.
APLIST:  WORD        PLIST           < INSERTION D'UN NIVEAU LUMINEUX DANS LA
                                     < LISTE 'LISTN'.
AOMBRE:  WORD        OMBRE           < CALCUL DES OMBRES PORTEES DANS LE PLAN
                                     < 'Z',
AQMBRE:  WORD        QMBRE           < CALCUL DES OMBRES PORTEES DANS LE PLAN
                                     < 'Z+1'.
FANT0:   WORD        K-I             < POUR INITIALISER 'FANTZ' ET 'FANTZ1'
                                     < EN DEBUT DE CHAQUE LIGNE.
FANTZ:   WORD        NILK            < MEMORISE RDN(X+1,Y,Z)-SCOUCH,
FANTZ1:  WORD        NILK            < MEMORISE RDN(X+1,Y,Z+1)-SCOUCH.
ACOTEH:  WORD        COTEH,X         < RELAI D'ACCES AU BORD SUPERIEUR (OU HORI-
                                     < ZONTAL) DE L'IMAGE,
ACOTEV:  WORD        COTEV,X         < RELAI D'ACCES AU BORD DROIT (OU VERTICAL)
                                     < DE L'IMAGE.
XCOTEH:  WORD        COTEH-IJIJDX,X  < POUR INITIALISER 'COTEH',
XCOTEV:  WORD        COTEV-IJIJDX,X  < POUR INITIALISER 'COTEV'.
AKOTEH:  WORD        KOTEH,X         < RELAI D'ACCES AU BORD SUPERIEUR (OU HORI-
                                     < ZONTAL) DE L'IMAGE,
AKOTEV:  WORD        KOTEV,X         < RELAI D'ACCES AU BORD DROIT (OU VERTICAL)
                                     < DE L'IMAGE.
XKOTEH:  WORD        KOTEH-IJIJDX,X  < POUR INITIALISER 'KOTEH',
XKOTEV:  WORD        KOTEV-IJIJDX,X  < POUR INITIALISER 'KOTEV'.
<
< TRANSLATION DE LA FONCTION :
<
TCOUCH:  WORD        NILK            < VAUT '0 OU 'ICOUCH' SUIVANT 'INEW'...
ICOUCH:  WORD        NILK            < VAUT F(SCOUCH) SUIVANT LA MODULATION
                                     < DE RDN(X,Y,Z), VOIR A CE PROPOS LES
                                     < FONCTIONS DU TYPE 'FGAUS'...
<
< DONNEES D'INTERPOLATION
< DES NIVEAUX DE GRIS :
<
INTEND:  FLOAT       <NILK<NILK<NILK < INTENSITE "DROITE",
INTENG:  FLOAT       <NILK<NILK<NILK < INTENSITE "GAUCHE",
PINTEN:  FLOAT       <NILK<NILK<NILK < PAS D'INTERPOLATION DE L'INTENSITE...
                                     < (DE "DROITE" VERS "GAUCHE"...)
EXTREM:  WORD        NILK            < ABSCISSE DU POINT DE NIVEAU MAXIMAL
                                     < SUR UN SEGMENT HORIZONTAL.
ASEGH:   WORD        SEGH            < SOUS-PROGRAMME DE TRACE D'UN SEGMENT
                                     < HORIZONTAL.
ALISTN:  WORD        LISTN,X         < RELAI VERS UNE LISTE CONTENANT LES
                                     < NIVEAUX CALCULES POUR LA LIGNE COU-
                                     < RANTE.
ALISTX:  WORD        LISTN-IJIJDX,X  < IDEM, RELAI DE NETTOYAGE...
<
< DONNEES DE DERIVATION :
<
PASMAX:: VAL         6               < PAS MAXIMAL D'ACCROISSEMENT DES VARIA-
                                     < BLES 'X', 'Y' ET 'Z' POUR CALCULER LES
                                     < DERIVEES PARTIELLES DE LA FONCTION.
<
< BUFFER DES LIGNES CONSECUTIVES :
<
ALIG:    WORD        LIG,X           < BUFFER DE LA LIGNE COURANTE.
XWOR%1:  VAL         $=FCTA
ALIGM1:  WORD        LIGM1,X         < BUFFER
         IF          PASMAX-1,XEIF%,XEIF%,
ALIGM2:  WORD        LIGM2,X         <        DES
         IF          PASMAX-2,XEIF%,XEIF%,
ALIGM3:  WORD        LIGM3,X         <            LIGNES
         IF          PASMAX-3,XEIF%,XEIF%,
ALIGM4:  WORD        LIGM4,X         <                   PRECEDENTES...
         IF          PASMAX-4,XEIF%,XEIF%,
ALIGM5:  WORD        LIGM5,X         < BUFFER
         IF          PASMAX-5,XEIF%,XEIF%,
ALIGM6:  WORD        LIGM6,X         <        DES
         IF          PASMAX-6,XEIF%,XEIF%,
ALIGM7:  WORD        LIGM7,X         <            LIGNES
         IF          PASMAX-7,XEIF%,XEIF%,
ALIGM8:  WORD        LIGM8,X         <                   PRECEDENTES...
XEIF%:   VAL         ENDIF
XWOR%2:  VAL         $=FCTA
         IF          XWOR%2-XWOR%1-PASMAX,,XEIF%,
         IF          ATTENTION : INCOHERENCE !!!
XEIF%:   VAL         ENDIF
AALIGM:  WORD        NILK            < RELAI DE RELAI POUR GENERER 'ALIGM'
                                     < AU DEBUT DE CHAQUE LIGNE...
ALIGM:   WORD        NILK            < BUFFER DE LA LIGNE PRECEDENTE "COURANTE".
ALJG:    WORD        LJG,X           < BUFFER DE LA LJGNE COURANTE.
XWOR%1:  VAL         $=FCTA
ALJGM1:  WORD        LJGM1,X         < BUFFER
         IF          PASMAX-1,XEIF%,XEIF%,
ALJGM2:  WORD        LJGM2,X         <        DES
         IF          PASMAX-2,XEIF%,XEIF%,
ALJGM3:  WORD        LJGM3,X         <            LJGNES
         IF          PASMAX-3,XEIF%,XEIF%,
ALJGM4:  WORD        LJGM4,X         <                   PRECEDENTES...
         IF          PASMAX-4,XEIF%,XEIF%,
ALJGM5:  WORD        LJGM5,X         < BUFFER
         IF          PASMAX-5,XEIF%,XEIF%,
ALJGM6:  WORD        LJGM6,X         <        DES
         IF          PASMAX-6,XEIF%,XEIF%,
ALJGM7:  WORD        LJGM7,X         <            LJGNES
         IF          PASMAX-7,XEIF%,XEIF%,
ALJGM8:  WORD        LJGM8,X         <                   PRECEDENTES...
XEIF%:   VAL         ENDIF
XWOR%2:  VAL         $=FCTA
         IF          XWOR%2-XWOR%1-PASMAX,,XEIF%,
         IF          ATTENTION : INCOHERENCE !!!
XEIF%:   VAL         ENDIF
AALJGM:  WORD        NILK            < RELAI DE RELAI POUR GENERER 'ALJGM'
                                     < AU DEBUT DE CHAQUE LJGNE...
ALJGM:   WORD        NILK            < BUFFER DE LA LJGNE PRECEDENTE "COURANTE".
         PAGE
<
<
<        L O C A L  :
<
<
         LOCAL
LOC:     EQU         $
<
< POUR CALCULER LA FONCTION
< EN DENTS DE SCIE :
<
F255:    WORD        XXN255
F511:    WORD        NIV256+NIV256-Z
<
< VARIABLES MONTAGNEUSES :
<
GXS:     FLOAT       <NILK<NILK<NILK < COORDONNEES
GYS:     FLOAT       <NILK<NILK<NILK <             ABSOLUES
GZS:     FLOAT       <NILK<NILK<NILK <                      DU POINT COURANT.
FCUMR:   FLOAT       <NILK<NILK<NILK < SIGMA DES FONCTIONS ALEATOIRES
                                     < SCALANTES.
FPOND:   FLOAT       <NILK<NILK<NILK < POUR LES PONDERER...
FPOND0:  FLOAT       <NILK<NILK<NILK < VALEUR INITIALE DE LA PONDERATION :
                                     < FPOND0=RAC(PASIX*PASIY).
RENORM:  FLOAT       <NILK<NILK<NILK < DONNE LE SIGMA DES 'FPOND' SCALANTS
                                     < DIVISE PAR 'FPOND0', ET PERMET DE CAL-
                                     < CULER LA FONCTION ALEATOIRE DANS UN
                                     < SEGMENT PREDETERMINE, ET QUI EST :
                                     < (INFRDN*AMPLI*AMPLIR,SUPRDN*AMPLI*AMPLIR)
<
< RELAIS MONTAGNEUX :
<
AFONCT:  WORD        FONCT           < CALCUL DE LA FONCTION COURANTE.
<
< DEFINITION DE LA GRILLE :
<
NRECUR:  WORD        NILK            < NOMBRE COURANT DE RECURSIONS...
PASIX:   WORD        NILK            < PAS SUR 'OX',
PASIY:   WORD        NILK            < PAS SUR 'OY',
PASIZ:   WORD        NILK            < PAS SUR 'OZ'.
FPASIX:  FLOAT       <NILK<NILK<NILK < DE MEME
FPASIY:  FLOAT       <NILK<NILK<NILK <         EN
FPASIZ:  FLOAT       <NILK<NILK<NILK <            FLOTTANT...
XNOEUD:  WORD        NILK            < X(NOEUD BAS-GAUCHE) DE LA MAILLE,
YNOEUD:  WORD        NILK            < Y(NOEUD BAS-GAUCHE) DE LA MAILLE,
ZNOEUD:  WORD        NILK            < Z(NOEUD BAS-GAUCHE) DE LA MAILLE.
AFNIV1:  FLOAT       <NILK<NILK<NILK
AFNIV2:  FLOAT       <NILK<NILK<NILK
AFNIV3:  FLOAT       <NILK<NILK<NILK
AFNIV4:  FLOAT       <NILK<NILK<NILK
AFNIV5:  FLOAT       <NILK<NILK<NILK
AFNIV6:  FLOAT       <NILK<NILK<NILK
AFNIV7:  FLOAT       <NILK<NILK<NILK
AFNIV8:  FLOAT       <NILK<NILK<NILK
KITER:   WORD        NILK            < COMPTAGE DES RECURSIONS...
<
< PARAMETRES DU GENERATEUR ALEATOIRE :
<
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
HINCU:   FLOAT       <NILK<NILK<NILK < POUR
HINCV:   FLOAT       <NILK<NILK<NILK
HINCW:   FLOAT       <NILK<NILK<NILK <      L'INTERPOLATION...
HINCU1:  FLOAT       <NILK<NILK<NILK < HINCU1=1-HINCU,
HINCV1:  FLOAT       <NILK<NILK<NILK < HINCV1=1-HINCV,
HINCW1:  FLOAT       <NILK<NILK<NILK < HINCW1=1-HINCW.
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)).
AMPLI:   FLOAT       <NILK<NILK<NILK < AMPLIFICATEUR DU SIGMA DES 'FPOND'
                                     < CALCULE A PARTIR DE 'NRECUR'.
XAMPLI:: VAL         31              < POUR CALCULER 'KAMPLI'...
KAMPLI:  FLOAT       <XAMPLI-I<K<K   < POUR CALCULER 'AMPLI' A PARTIR DE
                                     < 'NRECUR'...
<
< POUR LE CALCUL DU LOGARITHME :
<
POLLO1:  FLOAT       <NILK<NILK<NILK < VARAIBLE DE MANOEUVRE...
POLLO2:  FLOAT       <NILK<NILK<NILK
POLLO3:  FLOAT       <NILK<NILK<NILK
POLLO4:  FLOAT       0.7071067       < RACINE(2)/2.
POLLO5:  FLOAT       1.2920088       < COEFFICIENTS
POLLO6:  FLOAT       2.6398577       <              DU
POLLO7:  FLOAT       1.656763        <                 DEVELOPPEMENT.
POLLO8:  EQU         F05             < CONSTANTE 1/2.
POLLO9:  FLOAT       0.6931472       < LN(2).
<
< POUR LE CALCUL DE L'EXPONENTIELLE :
<
POLEX1:  EQU         POLLO1          < VARIABLE DE MANOEUVRE...
POLEX2:  EQU         POLLO2
POLEX3:  EQU         POLLO3
POLEX4:  FLOAT       1.442695        < LOG2(E).
POLEX5:  WORD        NILK            < RELEVE DE L'EXPOSANT
POLEX6:  EQU         F1              < 1.0
POLEX7:  FLOAT       2               < 2.
POLEX8:  FLOAT       87.417488       < COEFFICIENTS
POLEX9:  FLOAT       0.0346573       <              DU
POLEY0:  FLOAT       -17830.91       <                 DEVELOPPEMENT.
POLEY1:  FLOAT       9.9545955
SIGNE:   WORD        NILK            < POUR DETERMINER LE SIGNE DE X**Y...
<
< POUR CALCULER
< LES EXPOSANTS :
<
EXPOP:   FLOAT       <NILK<NILK<NILK < EXPOSANT COURANT...
F3:      FLOAT       <DIMGRA<K<K     < POUR CALCULER UNE RACINE CUBIQUE (PASSA-
                                     < D'UN VOLUME A UNE DIMENSION...).
XXMASK:: VAL         MOCG
XX7F::   VAL         '7F             < MAXIMUM POSITIF,
XX80::   VAL         -'80            < MIMIMUM NEGATIF.
<
< RELAIS DE SOUS-PROGRAMMES :
<
ASPRDN:  WORD        SPRDN           < GENERATEUR ALEATOIRE DONNANT RDN(XS,YS).
ARAK:    WORD        RAK             < CALCUL DE LA PUISSANCE P/(2**Q) D'UN
                                     < NOMBRE...
<
< VARIABLES DE MANOEUVRE :
<
FWORK1:  FLOAT       <NILK<NILK<NILK
FWORK2:  FLOAT       <NILK<NILK<NILK
<
< POUR LE CALCUL D'UNE
< INTENSITE LUMINEUSE :
<
NIVBAS:: VAL         1               < NIVEAU MINIMAL...
FNIVBA:  FLOAT       <NIVBAS<K<K     < POUR ELIMINER LA GENERATION DE POINTS
                                     < NOIRS...
<
< RELAIS D'ACCES AUX LISTES
< DE DESCRIPTION DU MAILLAGE :
<
ALPASX:  WORD        LPASX,X         < RELAI D'ACCES A 'PASIX' FLOTTANT,
ALPSIX:  WORD        LPSIX,X         < RELAI D'ACCES A 'PASIX' ENTIER.
ALPASY:  WORD        LPASY,X         < RELAI D'ACCES A 'PASIY' FLOTTANT,
ALPSIY:  WORD        LPSIY,X         < RELAI D'ACCES A 'PASIY' ENTIER.
ALPASZ:  WORD        LPASZ,X         < RELAI D'ACCES A 'PASIZ' FLOTTANT,
ALPSIZ:  WORD        LPSIZ,X         < RELAI D'ACCES A 'PASIZ' ENTIER.
ALPOND:  WORD        LPOND,X         < RELAI D'ACCES A 'FPOND'.
<
< POUR ACCEDER AUX IMAGES :
<
SAVER:   WORD        NILK            < SAUVEGARDE D'UN MOT DE LA TRAME
                                     < RESIDENTE ROUGE,
SAVEV:   WORD        NILK            < DE MEME POUR LE VERT,
SAVEB:   WORD        NILK            < DE MEME POUR LE BLEU.
MCDAR:   EQU         SAVER           < SAUVEGARDE D'UN MOT DE LA TRAME
                                     < SCRATCH ROUGE,
MCDAV:   EQU         SAVEV           < DE MEME POUR LE VERT,
MCDAB:   EQU         SAVEB           < DE MEME POUR LE BLEU.
XCTCDA:  WORD        NILK            < CONSTANTE DE TRANSLATION PERMETTANT
                                     < D'ATTEINDRE INDIFFEREMMENT 'TV1' OU
                                     < 'TV2'...
CTCDA:   WORD        TV2-TV1         < POUR ATTEINDRE 'TV2'...
<
< DEFINITION DE L'ACCELERATEUR
< DES ACCES A 'TV1' ET 'TV2' :
<
ASHPR:  @
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 'ASHPR'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
ASHPR::  VAL         123             < ON SE DONNE UN NOMBRE PREMIER...
XEIF%:   VAL         ENDIF
LASHT:   WORD        ASHPR           < POUR FAIRE DES CALCULS MODULO 'ASHPR'.
SAVYX:   BYTE        NILK;NILK       < POUR MEMORISER UN COUPLE (Y,X).
INOC::   VAL         -EXIST          < ETAT INOCCUPE D'UNE ENTREE DE LA TABLE.
ASHT1::  MOT         O               < POUR ACCEDER A LA PARTIE (Y,X) DE LA
                                     < TABLE,
ASHT2::  MOT         ASHT1+ASHPR     < POUR ACCEDER A LA PARTIE TV1/TV2/NIVEAU
                                     < DE LA TABLE.
<
< DEFINITION DE LA SPIRALE
< DE CALCUL D'UN SIGMA(X,Y) :
<
PASQ:    WORD        NILK            < PAS DE PARCOURS DE LA SPIRALE,
DELTAX:  WORD        NILK            < VECTEUR TRANSLATION
DELTAY:  WORD        NILK            <                     COMPLEXE COURANT.
LB:      WORD        NILK            < LONGUEUR DES
LB0:     WORD        NILK            <              BRANCHES DE LA SPIRALE.
NP:      WORD        NILK            < NOMBRE DE POINT COURANT,
FNPM:    FLOAT       <NILK<NILK<NILK < NOMBRE DE POINTS FLOTTANT DE LA SPIRALE.
<
< SIGMA(X,Y) SUR UNE SPIRALE :
<
F2::     FLOAT       <XXXMOY<K<K
F4::     FLOAT       <XXXMOY*XXXMOY<K<K
CUMUL:   WORD        NILK            < SIGMA(NIVEAU(X,Y)).
ASPIRL:  WORD        SPIRAL          < SOUS-PROGRAMME DE CALCUL DE 'CUMUL'...
<
< PARTICIPATIONS RELATIVES DE
< LA GENERATION ALEATOIRE ET
< DE LA SOMMATION SUR UNE
< SPIRALE CENTREE EN (256,256) :
<
PONRDN:  FLOAT       <NILK<NILK<NILK < CONTRIBUTION DE LA GENERATION ALEATOIRE,
PONSPI:  FLOAT       <NILK<NILK<NILK < CONTRIBUTION DES SPIRALES.
<
< DONNEES DE GENERATION DE 'LNIVO' :
<
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
<
< GESTION DU "DEPTH-CUEING" :
<
FCOUCH:  FLOAT       <NILK<NILK<NILK < POUR CALCULER :
                                     < NIVEAU=FCOUCH*Z.
<
< DEFINITION DE LA MODULATION GAUSSIENNE :
<
TXGAUS:  WORD        NILK            < TRANSLATION DES COORDONNEES 'X',
TYGAUS:  WORD        NILK            < TRANSLATION DES COORDONNEES 'Y',
ZCOUCH:: VAL         NIV256          < VALEUR MAXIMALE DE LA COORDONNEE 'Z' ;
                                     < CETTE VALEUR EST LIEE A UNE UTILISATION
                                     < EN MODE "DEPTH-CUEING"...
TZGAUS:  WORD        NILK            < TRANSLATION DES COORDONNEES 'Z'.
DXGAUS:  FLOAT       <NILK<NILK<NILK < POUR "NORMALISER" (X-TX)**2,
DYGAUS:  FLOAT       <NILK<NILK<NILK < POUR "NORMALISER" (Y-TY)**2,
DZGAUS:  FLOAT       <NILK<NILK<NILK < POUR "NORMALISER" (Z-TZ)**2.
AEXPON:  WORD        EXPON           < SOUS-PROGRAMME DE CALCUL D'UNE EXPO-
                                     < NENTIELLE.
<
<
<        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
<
< GESTION DU DEROULEUR :
<
NVPMT::  VAL         '0B             < 'NVP' D'ACCES AU DEROULEUR DE BANDES.
DEMMT:   BYTE        NVPMT;XFMTRA    < DEMANDE DE LECTURE A ACCES DIRECT.
         WORD        BUFMT=FCTA*NOCMO
         WORD        LBUFMT
         WORD        NILK            < ADRESSE DU BLOC COURANT.
IBUFMT:  WORD        LBUFMT-Z+I      < INDEX COURANT DU BUFFER 'MT',
ZBUFMT:  WORD        LBUFMT-Z+I      < ET POUR FORCER LA LECTURE DU PREMIER
                                     < BLOC DE CHAQUE IMAGE...
ABUFMT:  WORD        BUFMT,X         < ET RELAI D'ACCES...
<
< "CADRAGE" DES OCTETS :
<
TRANMT:  FLOAT       <NILK<NILK<NILK < TRANSLATION ET
MULTMT:  FLOAT       <NILK<NILK<NILK <                MISE A L'ECHELLE...
         PAGE
<
<
<        T A B L E   A   A C C E S   A L E A T O I R E  :
<
<
ASHT:    EQU         $
         DO          ASHPR
         BYTE        NILK;NILK       < COUPLES (Y,X).
         IF          INOC-K,XEIF%,,
         IF          ATTENTION : LA VALEUR DE 'INOC' EST INACCEPTABLE !!!
XEIF%:   VAL         ENDIF
         DO          ASHPR
         WORD        INOC            < ETAT INOCCUPE.
         PAGE
<
<
<        L I S T E   D E S   N I V E A U X
<        D E   L A   L I G N E   C O U R A N T E  :
<
<
LISTN:   EQU         $
LLISTN:: VAL         XC512/NOCMO     < LONGUEUR-MOTS DE 'LISTN'.
         NLS
         DO          LLISTN
         BYTE        NILK;NILK
         LST
         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)...
<
<
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
         PAGE
<
<
<        L I S T E S   D E   D E S C R I P T I O N
<                    D U   M A I L L A G E  :
<
<
LPASX:   EQU         $
         NLS
         DO          MAXREC
         FLOAT       <NILK<NILK<NILK < 'PASIX'.
         LST
LPSIX:   EQU         $
         NLS
         DO          MAXREC
         WORD        NILK
         LST
LPASY:   EQU         $
         NLS
         DO          MAXREC
         FLOAT       <NILK<NILK<NILK < 'PASIY',
         LST
LPSIY:   EQU         $
         NLS
         DO          MAXREC
         WORD        NILK
         LST
LPASZ:   EQU         $
         NLS
         DO          MAXREC
         FLOAT       <NILK<NILK<NILK < 'PASIZ'.
         LST
LPSIZ:   EQU         $
         NLS
         DO          MAXREC
         WORD        NILK
         LST
LPOND:   EQU         $
         NLS
         DO          MAXREC
         FLOAT       <NILK<NILK<NILK < 'FPOND'.
         LST
         PAGE
<
<
<        B U F F E R S   D E S   L I G N E S   C O N S E C U T I V E S  :
<
<
<        NOTA :
<                      'LIG' SE REFERE AU PLAN 'Z',
<                    ALORS QUE 'LJG' SE REFERE AU
<                    PLAN SUIVANT 'Z+1'...
<
<
LIG:     EQU         $
         NLS
         DO          XC512
         WORD        NILK            < LIGNE COURANTE.
         LST
LIGM1:   EQU         $
         NLS
         DO          XC512
         WORD        NILK
         LST
         IF          PASMAX-1,XEIF%,XEIF%,
LIGM2:   EQU         $
         NLS
         DO          XC512
         WORD        NILK
         LST
         IF          PASMAX-2,XEIF%,XEIF%,
LIGM3:   EQU         $
         NLS
         DO          XC512
         WORD        NILK
         LST
         IF          PASMAX-3,XEIF%,XEIF%,
LIGM4:   EQU         $
         NLS
         DO          XC512
         WORD        NILK
         LST
         IF          PASMAX-4,XEIF%,XEIF%,
LIGM5:   EQU         $
         NLS
         DO          XC512
         WORD        NILK
         LST
         IF          PASMAX-5,XEIF%,XEIF%,
LIGM6:   EQU         $
         NLS
         DO          XC512
         WORD        NILK
         LST
         IF          PASMAX-6,XEIF%,XEIF%,
LIGM7:   EQU         $
         NLS
         DO          XC512
         WORD        NILK
         LST
         IF          PASMAX-7,XEIF%,XEIF%,
LIGM8:   EQU         $
         NLS
         DO          XC512
         WORD        NILK
         LST
XEIF%:   VAL         ENDIF
LJG:     EQU         $
         NLS
         DO          XC512
         WORD        NILK            < LJGNE COURANTE.
         LST
LJGM1:   EQU         $
         NLS
         DO          XC512
         WORD        NILK
         LST
         IF          PASMAX-1,XEIF%,XEIF%,
LJGM2:   EQU         $
         NLS
         DO          XC512
         WORD        NILK
         LST
         IF          PASMAX-2,XEIF%,XEIF%,
LJGM3:   EQU         $
         NLS
         DO          XC512
         WORD        NILK
         LST
         IF          PASMAX-3,XEIF%,XEIF%,
LJGM4:   EQU         $
         NLS
         DO          XC512
         WORD        NILK
         LST
         IF          PASMAX-4,XEIF%,XEIF%,
LJGM5:   EQU         $
         NLS
         DO          XC512
         WORD        NILK
         LST
         IF          PASMAX-5,XEIF%,XEIF%,
LJGM6:   EQU         $
         NLS
         DO          XC512
         WORD        NILK
         LST
         IF          PASMAX-6,XEIF%,XEIF%,
LJGM7:   EQU         $
         NLS
         DO          XC512
         WORD        NILK
         LST
         IF          PASMAX-7,XEIF%,XEIF%,
LJGM8:   EQU         $
         NLS
         DO          XC512
         WORD        NILK
         LST
XEIF%:   VAL         ENDIF
         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, OU NIVEAU PRE-EXISTANT,
<                    (B) EST DETRUIT !!!
<
<
POINT:   EQU         $
<
< TRANSCODAGE DU NIVEAU :
<
         PSR         X               < SAUVEGARDE DE LA COORDONNEE 'X'...
         LR          A,X             < (X)=NIVEAU ARGUMENT,
         LBY         &ALNIVO         < (A)=NIVEAU TRANSCODE,
         PLR         X               < RESTAURE :
                                     < (X)=COORDONNEE 'X'.
<
< MARQUAGE DU POINT :
<
POINT3:  EQU         $
         BSR         ASTORP          < MARQUAGE : (X,Y) <-- (A)...
<
< ET RETOUR :
<
POINT2:  EQU         $
         RSR
         PAGE
<
<
<        T R A C E   D ' U N   S E G M E N T   H O R I Z O N T A L  :
<
<
<        ARGUMENTS :
<                    (VECGX1,VECGY1)=COORDONNEES DU POINT "GAUCHE",
<                    (VECGX2,VECGY2)=COORDONNEES DU POINT "DROITE",
<                    (INTENG)=NIVEAU "GAUCHE",
<                    (INTEND)=NIVEAU "DROITE".
<
<
SEGH:    EQU         $
<
< INITIALISATIONS :
<
         PSR         X,Y             < SAUVEGARDE DES COORDONNEES 'X' ET 'Y'...
<
< CALCUL DU NOMBRE DE POINTS :
<
         LA          VECGX2          < (A)=ORDONNEE "DROITE",
         SB          VECGX1          < (A)=ORDONNEE "DROITE"-ORDONNEE "GAUCHE",
         LR          A,X             < (A)=NOMBRE D'INTERVALLES,
         ADRI        Z,X             < (X)=NOMBRE DE POINTS A TRACER...
         JAE         SEGH00          < RIEN A FAIRE, PAS D'INTERVALLE...
         JAG         SEGH01          < OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
SEGH01:  EQU         $
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IINTMI          < VRAIE OU FAUSSE INTERPOLATION ???
         JNE         SEGH20          < FAUSSE, ON VA FORCER 'INTENG' SUR LE
                                     < SEGMENT (VECGX1,EXTREM-1) ET 'INTEND'
                                     < SUR (EXTREM,VECGX2)...
<
< VRAIE INTERPOLATION,
< CALCUL DU PAS D'INTER-
< POLATION DES NIVEAUX :
<
         FLT                         < IL Y A AU MOINS UN INTERVALLE :
         #/FST#      FWORK1
         #/FLD#      INTENG          < (A,B)=INTENSITE "GAUCHE",
         FSB         INTEND          < (A,B)=INTENSITE "GAUCHE"-INTENSITE "DROIT
         FDV         FWORK1          < (A,B)=PAS D'INTERPOLATION DE L'INTENSITE
                                     <       LUMINEUSE...
         #/FST#      PINTEN          < ET MEMORISATION...
SEGH20:  EQU         $
SEGH00:  EQU         $
<
< TRACE POINT A POINT :
<
         LY          VECGX2          < (Y)=ABSCISSE "DROITE",
         #/FLD#      INTEND          < (A,B)=INTENSITE LUMINEUSE COURANTE,
SEGH10:  EQU         $
         PSR         A,B,X,Y         < QUE L'ON SAUVEGARDE, AINSI QUE LE DE-
                                     < COMPTE DES POINTS A TRACER, ET L'ABSCISSE
                                     < COURANTE...
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         INEW            < EST-CE LA NOUVELLE METHODE ???
         JNE         SEGH21          < OUI : VRAIE INTERPOLATION...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IINTMI          < VRAIE OU FAUSSE INTERPOLATION ???
         JE          SEGH21          < VRAIE...
         #/FLD#      INTEND          < FAUSSE :
         XR          A,Y             < TEST DE L'ABSCISSE (DANS 'Y'...) :
         CP          EXTREM          < A-T'ON PASSER LE MAXIMUM ???
         XR          A,Y
         JGE         SEGH22          < SUR (EXTREM,VECGX2), ON A:
                                     < (A,B)=INTENSITE "DROITE",
         #/FLD#      INTENG          < SUR (VECGX1,EXTREM-1), ON A :
                                     < (A,B)=INTENSITE "GAUCHE" :
SEGH22:  EQU         $
SEGH21:  EQU         $
         BSR         AROND           < (A)=NIVEAU ENTIER DU POINT COURANT,
         LR          Y,X             < (X)=ABSCISSE COURANTE,
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IMAX            < FAUT-IL EXTRAIRE LE 'MAX' ENTRE LE NIVEAU
                                     < DE 'LISTN(X)' ET LE NIVEAU INTERPOLE ???
         JE          SEGH31          < NON, ON PREND LE NIVEAU INTERPOLE A
                                     < PRIORI...
         LR          A,B             < OUI :
                                     < (B)=NIVEAU INTERPOLE,
         LBY         &ALISTN         < (A)=NIVEAU REEL AU POINT (X,Y,Z),
         CPR         B,A             < RECHERCHE DU 'MAX' :
         JGE         SEGH30          < (A)>=(B) : C'EST LE NIVEAU REEL...
         LR          B,A             < (A)<(B)  : C'EST LE NIVEAU INTERPOLE...
SEGH30:  EQU         $
SEGH31:  EQU         $
         LY          VECGY2          < (X)=(VECGY1)=(VECGY2)=ORDONNEE DU POINT
                                     <     COURANT,
         BSR         APOINT          < ET TRACE DU POINT COURANT...
         PLR         A,B,X,Y         < RESTAURE :
                                     < (Y)=ABSCISSE COURANTE,
                                     < (X)=DECOMPTE DES POINTS,
                                     < (A,B)=NIVEAU COURANT,
         FAD         PINTEN          < QUE L'ON MODIFIE...
         ADRI        -I,Y            < ET MODIFICATION DE L'ABSCISSE...
         JDX         SEGH10          < VERS LE POINT COURANT, S'IL EXISTE...
<
< ET RETOUR :
<
         PLR         X,Y             < ET ENFIN, RESTAURE :
                                     < (X,Y)=COORDONNES COURANTES DE GENERATION.
         RSR
         PAGE
<
<
<        C A L C U L   D ' U N E   I N T E N S I T E   L U M I N E U S E  :
<
<
<        FONCTION :
<                      ETANT DONNE LE POINT COURANT,
<                    ET SA NORMALE, CE SOUS-PROGRAM-
<                    ME CALCULE EN FONCTION DE LA
<                    SOURCE LUMINEUSE L'INTENSITE
<                    A ATTRIBUER AU POINT COURANT.
<
<
<        ARGUMENTS :
<                    (FXN,FYN,FZN)=COORDONNEES DU VECTEUR NORMAL,
<                    (FXL,FYL,FZL)=COORDONNEES DE LA SOURCE LUMINEUSE.
<
<
<        RESULTAT :
<                    (A,B)=INTENSITE LUMINEUSE.
<
<
INTEN:   EQU         $
<
< NORME DE LA NORMALE :
<
         LRM         A,B
         WORD        CN3D            < (A)=ADRESSE DE LA NORMALE,
         WORD        CN3D            < (B)=ADRESSE DE LA NORMALE,
         BSR         APRSCA          < ET CALCUL DU CARRE DE SA NORME,
         #/FST#      FWORK1          < (FWORK1)=NORME(X(N),Y(N),Z(N))**2,
<
< CALCUL DU RAYON LUMINEUX :
<
         LR          W,A             < Z(A),
         FLT
         FSB         FZL             < Z(A)-Z(L),
         #/FST#      FZS             < (FZS)=Z(A)-Z(L).
         LR          Y,A             < Y(A),
         FLT
         FSB         FYL             < Y(A)-Y(L),
         #/FST#      FYS             < (FYS)=Y(A)-Y(L).
         LR          X,A             < X(A),
         FLT
         FSB         FXL             < X(A)-X(L),
         #/FST#      FXS             < (FXS)=X(A)-X(L).
<
< NORME DU RAYON LUMINEUX :
<
         LRM         A,B
         WORD        CS3D            < (A)=ADRESSE DU RAYON LUMINEUX,
         WORD        CS3D            < (B)=ADRESSE DU RAYON LUMINEUX,
         BSR         APRSCA          < ET CALCUL DU CARRE DE SA NORME,
         FMP         FWORK1          < CALCUL DU CARRE DU PRODUIT DU MODULE
                                     < DE LA NORMALE ET DU RAYON LUMINEUX,
         BSR         ARAC
         #/FST#      FWORK1          < (FWORK1)=PRODUIT DE LA NORME DE LA NOR-
                                     <          MALE ET DE LA NORME DU RAYON
                                     <          LUMINEUX.
<
< CALCUL DE L'ANGLE ENTRE LE
< NORMALE ET LE RAYON LUMINEUX :
<
         LRM         A,B
         WORD        CN3D            < (A)=ADRESSE DE LA NORMALE,
         WORD        CS3D            < (B)=ADRESSE DU RAYON LUMINEUX,
         BSR         APRSCA          < (A,B)=PRODUIT SCALAIRE DE LA NORMALE,
                                     <       ET DU RAYON LUMINEUX,
         FDV         FWORK1          < (A,B)=COS(TETA), OU 'TETA' DESIGNE
                                     <       L'ANGLE ENTRE LA NORMALE ET LE
                                     <       RAYON LUMINEUX.
<
< CALCUL DE L'INTENSITE
< LUMINEUSE AU POINT COURANT :
<
         FAD         F1              < (A,B)=1+COS(TETA),
         FMP         F05             < (A,B)=(1+COS(TETA))/2,
                                     <       SOIT UN NOMBRE DANS (0,1)...
         FMP         FNIVC           < (A,B)=NIVEAU FLOTTANT A DONNER AU POINT
                                     <       COURANT.
         FCAM        FNIVBA          < NE VA-T'ON PAS CREER UN POINT NOIR ???
         JGE         INTEN1          < NON, OK...
         #/FLD#      FNIVBA          < OUI, ON LE "SATURE"...
INTEN1:  EQU         $
<
< ET RETOUR :
<
         BSR         ATSFLO
         RSR
         PAGE
<
<
<        C A L C U L   D E   L ' E C L A I R A G E   M A X I M A L  :
<
<
<        ARGUMENT :
<                    (W)=COORDONNEE 'Z'.
<
<
<        RESULTAT :
<                    (A,B)=INTENSITE LUMINEUSE MAXIMALE FONCTION DE 'Z'.
<
<
PNIVC:   EQU         $
         LR          W,A             < ON EST A L'INTERIEUR, ON TRACE :
                                     < (A)=COORDONNEE 'Z' COURANTE,
         FLT
         FMP         FCOUCH          < ET "Z-MODULATION" :
                                     < (A,B)=INTENSITE LUMINEUSE MAXIMALE...
         FMP         F255MH          < PUIS ON PLACE CETTE VALEUR DE (0,255)
         FAD         FHP             < DANS LE SEGMENT (FHP,255)...
         RSR                         < ET C'EST TOUT...
         PAGE
<
<
<        O M B R E S   P O R T E E S   S U R   L E   P L A N   ' Z '  :
<
<
<        FONCTION :
<                      ON SUPPOSE QUE LES RAYONS
<                    LUMINEUX SONT SITUES DANS LES
<                    PLANS A 'Z' CONSTANT ; EN NOTANT
<                    (X0,Y0) LES COORDONNEES DU POINT
<                    COURANT DANS LE PLAN 'Z' COURANT,
<                    ET (XL,YL) CELLES DE LA SOURCE
<                    LUMINEUSE DANS CE MEME PLAN, LA
<                    DROITE "RAYON LUMINEUX" A POUR
<                    EQUATION :
<
<                                    (X-X0)/(XL-X0)=(Y-Y0)/(YL-Y0),
<
<                    SOIT EN INVERSANT LES SIGNES :
<
<                                    (X-X0)/(X0-XL)=(Y-Y0)/(Y0-YL).
<
<                    ON CHERCHE ENSUITE LES INTER-
<                    SECTIONS DE CETTE DROITE AVEC LES
<                    BORDS SUPERIEUR ET DROIT DE L'IMAGE,
<                    SOIT AVEC LES DROITES D'EQUATIONS
<
<                                    X=XMAX (BORD DROIT),
<                                    Y=YMAX (BORD SUPERIEUR),
<
<                    D'OU LES VALEURS DE 'X' ET 'Y' :
<
<                                    X=X0+((X0-XL)/(Y0-YL))*(YMAX-Y0),
<                                    Y=Y0+((Y0-YL)/(X0-XL))*(XMAX-X0).
<
<                    SUPPOSANT LA SOURCE LUMINEUSE A
<                    L'INFINI, LES RAYONS LUMINEUX
<                    DEVIENNENT PARALLELES, ET LE
<                    RAPPORT ((X0-XL)/(Y0-YL)) DE-
<                    VIENT CONSTANT ; ON L'APPELLE
<                    'PENTM' (C'EST L'INVERSE DE LA PEN-
<                    TE) ; CE TRUANDAGE PERMET DE SIM-
<                    PLIFIER LE PROBLEME SUIVANT :
<                    DEUX POINTS A(X,Y) ET B(X-1,Y-1)
<                    PAR EXEMPLE PEUVENT AVOIR LA MEME
<                    PROJECTION SUR 'COTE', ET PAR LA
<                    L'UN OMBRE L'AUTRE CE QUI EST FAUX...
<                    ON A DONC :
<
<                                    X=X0+(YMAX-Y0)*PENTM,
<                                    Y=Y0+(XMAX-X0)/PENTM.
<
<
<        ARGUMENTS :
<                    (X,Y,W)=POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=CONTRIBUTION LUMINEUSE DES OMBRES PORTEES.
<
<
OMBRE:   EQU         $
<
< INITIALISATION :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IOMBRE          < FAUT-IL LES OMBRES PORTEES ???
         JE          OMB001          < NON, ET 'FNIVEC' EST BON...
         PSR         X               < SAUVEGARDE DE LA COORDONNEE 'X'...
<
< INTERSECTION DU RAYON LUMINEUX
< COURANT AVEC LE BORD SUPERIEUR
< DE L'IMAGE (NE PAS OUBLIER LES
< HYPOTHESES SUR LA POSITION DU
< SOLEIL...) :
<
         LA          VECTNL          < YMAX,
         SBR         Y,A             < YMAX-Y0,
         FLT                         < YMAX-Y0,
         FMP         FPENTM          < ((X0-XL)/(Y0-YL))*(YMAX-Y0),
         FIX                         < (ET NON PAS 'AROND' POUR TOUJOURS FAIRE
                                     < L'ERREUR DANS LE MEME SENS...)
         ADR         X,A             < X=X0+((X0-XL)/(Y0-YL))*(YMAX-Y0),
         JAGE        OMB973          < OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
OMB973:  EQU         $
         CP          VECTNC          < COUPE-T'ON LE BORD SUPERIEUR ???
         JG          OMB974          < NON, ALLONS VOIR LE BORD DROIT...
         LR          A,X             < X (ABSCISSE D'INTERSECTION),
         LA          &ACOTEH         < (A)=ORDONNEE D'UN POINT ALIGNE AVEC LE
                                     <     SOLEIL ET LE POINT COURANT,
         JAL         OMB977          < IL N'EXISTE PAS, LE POINT COURANT EST
                                     < DONC AU SOLEIL...
         SBR         Y,A             < FORMONS LA DISTANCE EN 'Y' ENTRE CES
                                     < 2 POINTS :
SLIMIT:: VAL         W               < DISTANCE EN 'Y' DE 2 POINTS CONSIDERES
                                     < TOUS LES 2 AU SOLEIL, SI LE PREMIER
                                     < Y EST...
         CPI         SLIMIT          < ALORS ???
         JLE         OMB977          < ON CONSIDERE LE POINT AU SOLEIL...
         LAI         K               < (A)=DISTANCE COURANTE DU POINT COURANT
                                     <     A LA LUMIERE : VA PERMETTRE LE
                                     <     CALCUL DE LA PENOMBRE...
OMB920:  EQU         $
         ADRI        I,A             < AUGMENTATION DE LA DISTANCE (A NOTER
                                     < QU'ELLE EST STRICTEMENT POSITIVE...).
         CP          NPENOM          < ALORS, OMBRE OU PENOMBRE ???
         JGE         OMB975          < LE POINT COURANT EST "TROP LOIN" : ON LE
                                     < CONSIDERE A L'OMBRE...
         ADRI        I,X             < PROGRESSION SUR 'COTEH',
         XR          A,X
         CP          VECTNC          < SORT-ON DU 'COTEH' ???
         XR          A,X
         JG          OMB975          < OUI, LE POINT COURANT EST CONSIDERE DANS
                                     < L'OMBRE...
         CPZ         &ACOTEH         < NON, LE POINT (X) EST-IL AU SOLEIL ???
         JL          OMB900          < OUI, ON CONSIDERE DONC LE POINT COURANT
                                     < DANS LA PENOMBRE...
         JMP         OMB920          < NON, ALLONS VOIR LE POINT PRECEDENT...
OMB977:  EQU         $               < CAS DES POINTS AU SOLEIL :
         STY         &ACOTEH         < ON LE MEMORISE,
         JMP         OMB976          < ET ON VA LUI ATTRIBUER SA PONDERATION...
<
< INTERSECTION DU RAYON LUMINEUX
< COURANT AVEC LE BORD DROIT DE
< L'IMAGE :
<
OMB974:  EQU         $
         LA          VECTNC          < XMAX,
         SBR         X,A             < XMAX-X0,
         FLT                         < XMAX-X0,
         FDV         FPENTM          < ((Y0-YL)/(X0-XL))*(XMAX-X0),
         FIX                         < (ET NON PAS 'AROND' POUR TOUJOURS FAIRE
                                     < L'ERREUR DANS LE MEME SENS...)
         ADR         Y,A             < Y=Y0+((Y0-YL)/(X0-XL))*(XMAX-X0),
         JAGE        OMB978          < OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
OMB978:  EQU         $
         CP          VECTNL          < COUPE-T'ON LE BORD DROIT ???
         JLE         OMB979          < OUI, OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
OMB979:  EQU         $
         LR          A,X             < Y (ORDONNEE D'INTERSECTION),
         LA          &ACOTEV         < (A)=ORDONNEE D'UN POINT ALIGNE AVEC LE
                                     <     SOLEIL ET LE POINT COURANT,
         JAL         OMB967          < IL N'EXISTE PAS, LE POINT COURANT EST
                                     < DONC AU SOLEIL...
         SBR         Y,A             < FORMONS LA DISTANCE EN 'Y' ENTRE CES
                                     < 2 POINTS :
         CPI         SLIMIT          < ALORS ???
         JLE         OMB967          < ON CONSIDERE LE POINT AU SOLEIL...
         LAI         K               < (A)=DISTANCE COURANTE DU POINT COURANT
                                     <     A LA LUMIERE : VA PERMETTRE LE
                                     <     CALCUL DE LA PENOMBRE...
OMB921:  EQU         $
         ADRI        I,A             < AUGMENTATION DE LA DISTANCE (A NOTER
                                     < QU'ELLE EST STRICTEMENT POSITIVE...).
         CP          NPENOM          < ALORS, OMBRE OU PENOMBRE ???
         JGE         OMB975          < LE POINT COURANT EST "TROP LOIN" : ON LE
                                     < CONSIDERE A L'OMBRE...
         ADRI        I,X             < PROGRESSION SUR 'COTEV',
         XR          A,X
         CP          VECTNL          < SORT-ON DU 'COTEV' ???
         XR          A,X
         JG          OMB975          < OUI, LE POINT COURANT EST CONSIDERE DANS
                                     < L'OMBRE...
         CPZ         &ACOTEV         < NON, LE POINT (X) EST-IL AU SOLEIL ???
         JL          OMB900          < OUI, ON CONSIDERE DONC LE POINT COURANT
                                     < DANS LA PENOMBRE...
         JMP         OMB921          < NON, ALLONS VOIR LE POINT PRECEDENT...
OMB967:  EQU         $               < CAS DES POINTS AU SOLEIL :
         STY         &ACOTEV         < ON LE MEMORISE...
<
< CAS DES POINTS AU SOLEIL :
<
OMB976:  EQU         $               < OUI : LE POINT EST DONC AU SOLEIL,
         #/FLD#      FNIVLU          < (A,B)=PONDERATION DE LA LUMIERE...
         JMP         OMB969          < VERS LA MISE EN PLACE DE LA PONDERATION
                                     < DE L'ECLAIRAGE...
<
< CAS DES POINTS DANS LA
< PENOMBRE (A NOTER QUE
< CES POINTS NE SONT PAS
< INSERES DANS LES LISTES
< 'COTE') :
<
OMB900:  EQU         $
         NGR         A,A
         AD          NPENOM          < (A)="DISTANCE" DU POINT COURANT A UN
                                     <     POINT QUI LUI SERAIT VRAIMENT A
                                     <     L'OMBRE,
         FLT
         FMP         FPENOM
         FAD         TNIVOM          < (A,B)=PONDERATION VARIABLE DE LA
                                     <       PENOMBRE...
         JMP         OMB969          < VERS LA MISE EN PLACE DE LA PONDERATION
                                     < DE L'ECLAIRAGE...
<
< CAS DES POINTS PRESUMES
< A L'OMBRE :
<
OMB975:  EQU         $
         #/FLD#      FNIVOM          < (A,B)=PONDERATION DE L'OMBRE...
<
< CALCUL DE L'ECLAIRAGE :
<
OMB969:  EQU         $
         #/FST#      FNIVEC          < ET SAUVEGARDE DE LA PONDERATION
                                     < COURANTE OMBRE/LUMIERE...
<
< ET RETOUR :
<
         PLR         X               < RESTAURATION DE LA COORDONNEE 'X'...
OMB001:  EQU         $
         RSR
         PAGE
<
<
<        O M B R E S   P O R T E E S   S U R   L E   P L A N   ' Z + 1 '  :
<
<
<        FONCTION :
<                      ON SUPPOSE QUE LES RAYONS
<                    LUMINEUX SONT SITUES DANS LES
<                    PLANS A 'Z+1' CONSTANT ; EN NOTANT
<                    (X0,Y0) LES COORDONNEES DU POINT
<                    COURANT DANS LE PLAN 'Z+1' COURANT,
<                    ET (XL,YL) CELLES DE LA SOURCE
<                    LUMINEUSE DANS CE MEME PLAN, LA
<                    DROITE "RAYON LUMINEUX" A POUR
<                    EQUATION :
<
<                                    (X-X0)/(XL-X0)=(Y-Y0)/(YL-Y0),
<
<                    SOIT EN INVERSANT LES SIGNES :
<
<                                    (X-X0)/(X0-XL)=(Y-Y0)/(Y0-YL).
<
<                    ON CHERCHE ENSUITE LES INTER-
<                    SECTIONS DE CETTE DROITE AVEC LES
<                    BORDS SUPERIEUR ET DROIT DE L'IMAGE,
<                    SOIT AVEC LES DROITES D'EQUATIONS
<
<                                    X=XMAX (BORD DROIT),
<                                    Y=YMAX (BORD SUPERIEUR),
<
<                    D'OU LES VALEURS DE 'X' ET 'Y' :
<
<                                    X=X0+((X0-XL)/(Y0-YL))*(YMAX-Y0),
<                                    Y=Y0+((Y0-YL)/(X0-XL))*(XMAX-X0).
<
<                    SUPPOSANT LA SOURCE LUMINEUSE A
<                    L'INFINI, LES RAYONS LUMINEUX
<                    DEVIENNENT PARALLELES, ET LE
<                    RAPPORT ((X0-XL)/(Y0-YL)) DE-
<                    VIENT CONSTANT ; ON L'APPELLE
<                    'PENTM' (C'EST L'INVERSE DE LA PEN-
<                    TE) ; CE TRUANDAGE PERMET DE SIM-
<                    PLIFIER LE PROBLEME SUIVANT :
<                    DEUX POINTS A(X,Y) ET B(X-1,Y-1)
<                    PAR EXEMPLE PEUVENT AVOIR LA MEME
<                    PROJECTION SUR 'KOTE', ET PAR LA
<                    L'UN OMBRE L'AUTRE CE QUI EST FAUX...
<                    ON A DONC :
<
<                                    X=X0+(YMAX-Y0)*PENTM,
<                                    Y=Y0+(XMAX-X0)/PENTM.
<
<
<        ARGUMENT :
<                    (X,Y,W)=POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=CONTRIBUTION LUMINEUSE DES OMBRES PORTEES.
<
<
QMBRE:   EQU         $
<
< INITIALISATION :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IOMBRE          < FAUT-IL LES OMBRES PORTEES ???
         JE          QMB001          < NON, ET 'FNIVEC' EST BON...
         PSR         X               < SAUVEGARDE DE LA COORDONNEE 'X'...
<
< INTERSECTION DU RAYON LUMINEUX
< COURANT AVEC LE BORD SUPERIEUR
< DE L'IMAGE (NE PAS OUBLIER LES
< HYPOTHESES SUR LA POSITION DU
< SOLEIL...) :
<
         LA          VECTNL          < YMAX,
         SBR         Y,A             < YMAX-Y0,
         FLT                         < YMAX-Y0,
         FMP         FPENTM          < ((X0-XL)/(Y0-YL))*(YMAX-Y0),
         FIX                         < (ET NON PAS 'AROND' POUR TOUJOURS FAIRE
                                     < L'ERREUR DANS LE MEME SENS...)
         ADR         X,A             < X=X0+((X0-XL)/(Y0-YL))*(YMAX-Y0),
         JAGE        QMB973          < OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
QMB973:  EQU         $
         CP          VECTNC          < COUPE-T'ON LE BORD SUPERIEUR ???
         JG          QMB974          < NON, ALLONS VOIR LE BORD DROIT...
         LR          A,X             < X (ABSCISSE D'INTERSECTION),
         LA          &AKOTEH         < (A)=ORDONNEE D'UN POINT ALIGNE AVEC LE
                                     <     SOLEIL ET LE POINT COURANT,
         JAL         QMB977          < IL N'EXISTE PAS, LE POINT COURANT EST
                                     < DONC AU SOLEIL...
         SBR         Y,A             < FORMONS LA DISTANCE EN 'Y' ENTRE CES
                                     < 2 POINTS :
         CPI         SLIMIT          < ALORS ???
         JLE         QMB977          < LE POINT EST AU SOLEIL...
         LAI         K               < (A)=DISTANCE COURANTE DU POINT COURANT
                                     <     A LA LUMIERE : VA PERMETTRE LE
                                     <     CALCUL DE LA PENOMBRE...
QMB920:  EQU         $
         ADRI        I,A             < AUGMENTATION DE LA DISTANCE (A NOTER
                                     < QU'ELLE EST STRICTEMENT POSITIVE...).
         CP          NPENOM          < ALORS, OMBRE OU PENOMBRE ???
         JGE         QMB975          < LE POINT COURANT EST "TROP LOIN" : ON LE
                                     < CONSIDERE A L'OMBRE...
         ADRI        I,X             < PROGRESSION SUR 'COTEH',
         XR          A,X
         CP          VECTNC          < SORT-ON DU 'COTEH' ???
         XR          A,X
         JG          QMB975          < OUI, LE POINT COURANT EST CONSIDERE DANS
                                     < L'OMBRE...
         CPZ         &ACOTEH         < NON, LE POINT (X) EST-IL AU SOLEIL ???
         JL          QMB900          < OUI, ON CONSIDERE DONC LE POINT COURANT
                                     < DANS LA PENOMBRE...
         JMP         QMB920          < NON, ALLONS VOIR LE POINT PRECEDENT...
QMB977:  EQU         $               < CAS DES POINTS AU SOLEIL :
         STY         &AKOTEH         < ON LE MEMORISE,
         JMP         QMB976          < ET ON VA LUI ATTRIBUER SA PONDERATION...
<
< INTERSECTION DU RAYON LUMINEUX
< COURANT AVEC LE BORD DROIT DE
< L'IMAGE :
<
QMB974:  EQU         $
         LA          VECTNC          < XMAX,
         SBR         X,A             < XMAX-X0,
         FLT                         < XMAX-X0,
         FDV         FPENTM          < ((Y0-YL)/(X0-XL))*(XMAX-X0),
         FIX                         < (ET NON PAS 'AROND' POUR TOUJOURS FAIRE
                                     < L'ERREUR DANS LE MEME SENS...)
         ADR         Y,A             < Y=Y0+((Y0-YL)/(X0-XL))*(XMAX-X0),
         JAGE        QMB978          < OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
QMB978:  EQU         $
         CP          VECTNL          < COUPE-T'ON LE BORD DROIT ???
         JLE         QMB979          < OUI, OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
QMB979:  EQU         $
         LR          A,X             < Y (ORDONNEE D'INTERSECTION),
         LA          &AKOTEV         < (A)=ORDONNEE D'UN POINT ALIGNE AVEC LE
                                     <     SOLEIL ET LE POINT COURANT,
         JAL         QMB967          < IL N'EXISTE PAS, LE POINT COURANT EST
                                     < DONC AU SOLEIL...
         SBR         Y,A             < FORMONS LA DISTANCE EN 'Y' ENTRE CES
                                     < 2 POINTS :
         CPI         SLIMIT          < ALORS ???
         JLE         QMB967          < LE POINT EST AU SOLEIL...
         LAI         K               < (A)=DISTANCE COURANTE DU POINT COURANT
                                     <     A LA LUMIERE : VA PERMETTRE LE
                                     <     CALCUL DE LA PENOMBRE...
QMB921:  EQU         $
         ADRI        I,A             < AUGMENTATION DE LA DISTANCE (A NOTER
                                     < QU'ELLE EST STRICTEMENT POSITIVE...).
         CP          NPENOM          < ALORS, OMBRE OU PENOMBRE ???
         JGE         QMB975          < LE POINT COURANT EST "TROP LOIN" : ON LE
                                     < CONSIDERE A L'OMBRE...
         ADRI        I,X             < PROGRESSION SUR 'COTEV',
         XR          A,X
         CP          VECTNL          < SORT-ON DU 'COTEV' ???
         XR          A,X
         JG          QMB975          < OUI, LE POINT COURANT EST CONSIDERE DANS
                                     < L'OMBRE...
         CPZ         &ACOTEV         < NON, LE POINT (X) EST-IL AU SOLEIL ???
         JL          QMB900          < OUI, ON CONSIDERE DONC LE POINT COURANT
                                     < DANS LA PENOMBRE...
         JMP         QMB921          < NON, ALLONS VOIR LE POINT PRECEDENT...
QMB967:  EQU         $               < CAS DES POINTS AU SOLEIL :
         STY         &AKOTEV         < ON LE MEMORISE...
<
< CAS DES POINTS AU SOLEIL :
<
QMB976:  EQU         $               < OUI : LE POINT EST DONC AU SOLEIL,
         #/FLD#      FNIVLU          < (A,B)=PONDERATION DE LA LUMIERE...
         JMP         QMB969          < VERS LA MISE EN PLACE DE LA PONDERATION
                                     < DE L'ECLAIRAGE...
<
< CAS DES POINTS DANS LA
< PENOMBRE (A NOTER QUE
< CES POINTS NE SONT PAS
< INSERES DANS LES LISTES
< 'KOTE') :
<
QMB900:  EQU         $
         NGR         A,A
         AD          NPENOM          < (A)="DISTANCE" DU POINT COURANT AU FRONT
                                     <     D'OMBRE FRANCHE...
         FLT
         FMP         FPENOM
         FAD         TNIVOM          < (A,B)=PONDERATION DE LA PENOMBRE...
         JMP         QMB969          < VERS LA MISE EN PLACE DE LA PONDERATION
                                     < DE L'ECLAIRAGE...
<
< CAS DES POINTS PRESUMES
< A L'OMBRE :
<
QMB975:  EQU         $
         #/FLD#      FNIVOM          < (A,B)=PONDERATION DE L'OMBRE...
<
< CALCUL DE L'ECLAIRAGE :
<
QMB969:  EQU         $
         #/FST#      FNIVEC          < ET SAUVEGARDE DE LA PONDERATION
                                     < COURANTE OMBRE/LUMIERE...
<
< ET RETOUR :
<
         PLR         X               < RESTAURATION DE LA COORDONNEE 'X'...
QMB001:  EQU         $
         RSR
         PAGE
<
<
<        R E C A L C U L   D E   L A   N O R M A L E  :
<
<
<        FONCTION :
<                      POUR DES RAISONS LIEES A
<                    L'ENCOMBREMENT MEMOIRE, LES
<                    VECTEURS 'LIG' ET 'LJG' SONT
<                    MEMORISES EN ENTIER ; CELA
<                    PEUT AMENER PARFOIS A DES PRO-
<                    BLEMES SUR LA NORMALE ; ON PEUT
<                    TROUVER SES TROIS COMPOSANTES
<                    NULLES. CE SOUS-PROGRAMME DETECTE
<                    CE CAS, ET SI NECESSAIRE RECAL-
<                    CULE LA NORMALE DIRECTEMENT EN
<                    FLOTTANT...
<
<
<        NOTA :
<                      LA SURFACE "FRACTALE" EST
<                    DEFINIE A L'AIDE DE LA FONCTION
<                    ALEATOIRE 'RDN(X,Y,Z)' CALCULEE
<                    DANS LE MODULE 'FONCT' ; LES
<                    POINTS DE LA SURFACE SONT DONC
<                    LES POINTS (X,Y,Z) TELS QUE :
<
<                                    RDN(X,Y,Z)=C, OU 'C' EST UNE CONSTANTE
<                                    DONNEE ('ICOUCH').
<
<                    L'EQUATION DE LA SURFACE EN
<                    IMPLICITE EST DONC :
<
<                                    F(X,Y,Z)=RDN(X,Y,Z)-C=0,
<
<                    SA NORMALE EN CHAQUE POINT EST
<                    DONC DEFINIE PAR LE VECTEUR DE
<                    COORDONNEES :
<
<                                    (DF/DX,DF/DY,DF/DZ).
<
<                    LES DERIVEES PARTIELLES VONT ETRE
<                    APPROXIMEES PAR LES FORMULES SUI-
<                    VANTES :
<
<                                    DF/DX=(F(X,Y,Z)-F(X-P,Y,Z))/P,
<                                    DF/DY=(F(X,Y+P,Z)-F(X,Y,Z))/P,
<                                    DF/FZ=(F(X,Y,Z)-F(X,Y,Z-P))/P,
<
<                    CAR EN EFFET ON SUPPOSE UN ACCROIS-
<                    SEMENT DE LA VARIABLE DE DERIVATION
<                    EGAL A 'P'...
<
<                    SOIT, PAR DEFINITION DE 'F' :
<
<                                    DF/DX=(RDN(X,Y,Z)-RDN(X-P,Y,Z))/P,
<                                    DF/DY=(RDN(X,Y+P,Z)-RDN(X,Y,Z))/P,
<                                    DF/DZ=(RDN(X,Y,Z)-RDN(X,Y,Z-P),
<
<                    ET, PAR CHANGEMENT D'ECHELLE (CE
<                    QUI N'EST PAS GRAVE PUISQUE L'ON
<                    "NORMALISERA" LA NORMALE) :
<
<                                    DF/DX=RDN(X,Y,Z)-RDN(X-P,Y,Z),
<                                    DF/DY=RDN(X,Y+P,Z)-RDN(X,Y,Z),
<                                    DF/DZ=RDN(X,Y,Z)-RDN(X,Y,Z-P).
<
<
<        ARGUMENT :
<                    (X,Y,W)=POINT COURANT.
<
<
<        ATTENTION :
<                    CE MODULE DETRUIT (A,B) !!!
<
<
PVALN:   EQU         $
<
< TEST DE LA NECESSITE
< DU RECALCUL DE LA NORMALE :
<
         FCMZ        FXN             < LA NORMALE EST-ELLE NULLE ???
         JNE         PVALN1          < NON...
         FCMZ        FYN             < LA NORMALE EST-ELLE NULLE ???
         JNE         PVALN1          < NON...
         FCMZ        FZN             < LA NORMALE EST-ELLE NULLE ???
         JNE         PVALN1          < NON...
<
< LA NORMALE EST NULLE, ON
< VA LA RECALCULER EN FLOTTANT :
<
         BSR         AFONCT          < RDN(X,Y,Z),
                                     < NOTA : APRES CHAQUE APPEL DE 'AFONCT',
                                     < IL CONVIENDRAIT DE RETRANCHER 'TCOUCH'
                                     < A 'RDN(X,Y,Z)' POUR DONNER 'F(X,Y,Z)',
                                     < MAIS COMME CE SONT LES ACCROISSEMENTS
                                     < DE LA FONCTION 'F' QUE L'ON CALCULE,
                                     < CETTE SOUSTRACTION NE SERT A RIEN (ELLES
                                     < S'ANNULENT 2 A 2) ; EN CONSEQUENCES DE
                                     < QUOI, ON NOTERA PAR LA SUITE 'F(X,Y,Z)'
                                     < ALORS QU'IL S'AGIT EN FAIT DE 'RDN'...
         PSR         A,B,W           < SAVE F(X,Y,Z) ET LA COORDONNEE 'Z',
         PSR         A,B,Y           < SAVE F(X,Y,Z) ET LA COORDONNEE 'Y',
         PSR         A,B,X           < SAVE F(X,Y,Z) ET LA COORDONNEE 'X'.
         LA          PASDER
         SBR         A,X             < X-P,
         BSR         AFONCT          < RDN(X-P,Y,Z),
         #/FST#      FWORK
         PLR         A,B,X           < F(X,Y,Z) ET LA COORDONNEE 'X',
         FSB         FWORK           < F(X,Y,Z)-F(X-P,Y,Z),
         #/FST#      FXN             < CE QUI DONNE LA PREMIERE COMPOSANTE
                                     < DU VECTEUR NORMAL...
         LA          PASDER
         ADR         A,Y             < Y+P,
         BSR         AFONCT          < RDN(X,Y+P,Z),
         #/FST#      FWORK
         PLR         A,B,Y           < F(X,Y,Z) ET LA COORDONNEE 'Y',
         FSB         FWORK           < F(X,Y,Z)-F(X,Y+P,Z),
         FNEG                        < F(X,Y+P,Z)-F(X,Y,Z),
         #/FST#      FYN             < CE QUI DONNE LA DEUXIEME COMPOSANTE
                                     < DU VECTEUR NORMAL.
         LA          PASDER
         SBR         A,W             < Z-P,
         BSR         AFONCT          < RDN(X,Y,Z-P),
         #/FST#      FWORK
         PLR         A,B,W           < F(X,Y,Z) ET LA COORDONNEE 'W',
         FSB         FWORK           < F(X,Y,Z)-F(X,Y,Z-P),
         #/FST#      FZN             < CE QUI DONNE LA TROISIEME COMPOSANTE
                                     < DU VECTEUR NORMAL...
<
< ET REVALIDATION :
<
         FCMZ        FXN             < LA NORMALE EST-ELLE NULLE ???
         JNE         PVALN2          < NON...
         FCMZ        FYN             < LA NORMALE EST-ELLE NULLE ???
         JNE         PVALN2          < NON...
         FCMZ        FZN             < LA NORMALE EST-ELLE NULLE ???
         JNE         PVALN2          < NON...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
PVALN2:  EQU         $
<
< ET RETOUR :
<
PVALN1:  EQU         $
         RSR
         PAGE
<
<
<        C A L C U L   D E   L ' I N T E N S I T E   L U M I N E U S E
<                    A U   P O I N T   C O U R A N T
<                    D U   P L A N   C O U R A N T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME, EN FONCTION
<                    DES DIFFERENTS INDICATEURS DE
<                    CONTROLE, CALCULE L'INTENSITE
<                    LUMINEUSE AU POINT COURANT SUIVANT
<                    LA SOURCE LUMINEUSE, LE CONTEXTE
<                    (OMBRES PORTEES), ET LA NORMALE SUR
<                    LE PLAN COURANT 'Z'...
<
<
<        ARGUMENTS :
<                    (X,Y,W)=POINT COURANT (X,Y,Z).
<
<
<        RESULTAT :
<                    (A,B)=INTENSITE LUMINEUSE FLOTTANTE NORMALISEE.
<
<
PNIVO:   EQU         $
<
< CALCUL DES OMBRE PORTEES :
<
         BSR         AOMBRE          < CALCUL DES OMBRES PORTEES DANS LE
                                     < PLAN 'Z'...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         #/FLD#      FNIVMX          < (A,B)=VALEUR MAXIMALE DE L'ECLAI-
                                     <       RAGE AU CAS OU IL N'Y AURAIT PAS
                                     <       DE "DEPTH-CUEING"...
         CPZ         IECLDC          < Y-A-T'IL DU "DEPTH-CUEING" AVEC L'ECLAI-
                                     < RAGE ???
         JE          PNI980          < NON...
         BSR         APNIVC          < OUI :
                                     < (A,B)=NIVEAU MAXIMAL D'ECLAIRAGE FONC-
                                     <       DE LA COORDONNEE 'Z'.
PNI980:  EQU         $
         FMP         FNIVEC          < MODULATION PAR L'OMBRAGE EVENTUEL,
         #/FST#      FNIVC           < CE QUI DONNE LE NIVEAU MAXIMAL DE
                                     < L'ECLAIRAGE...
<
< CALCUL DE LA NORMALE EN (X,Y,Z) :
<
         LA          &ALIG           < F(X,Y,Z).
<
< CALCUL DE LA NORMALE
< AU POINT COURANT (X,Y,Z) :
<
<
<        NOTA :
<                      LA SURFACE "FRACTALE" EST
<                    DEFINIE A L'AIDE DE LA FONCTION
<                    ALEATOIRE 'RDN(X,Y,Z)' CALCULEE
<                    DANS LE MODULE 'FONCT' ; LES
<                    POINTS DE LA SURFACE SONT DONC
<                    LES POINTS (X,Y,Z) TELS QUE :
<
<                                    RDN(X,Y,Z)=C, OU 'C' EST UNE CONSTANTE
<                                    DONNEE ('ICOUCH').
<
<                    L'EQUATION DE LA SURFACE EN
<                    IMPLICITE EST DONC :
<
<                                    F(X,Y,Z)=RDN(X,Y,Z)-C=0,
<
<                    SA NORMALE EN CHAQUE POINT EST
<                    DONC DEFINIE PAR LE VECTEUR DE
<                    COORDONNEES :
<
<                                    (DF/DX,DF/DY,DF/DZ).
<
<                    LES DERIVEES PARTIELLES VONT ETRE
<                    APPROXIMEES PAR LES FORMULES SUI-
<                    VANTES :
<
<                                    DF/DX=(F(X,Y,Z)-F(X-P,Y,Z))/P,
<                                    DF/DY=(F(X,Y+P,Z)-F(X,Y,Z))/P,
<                                    DF/FZ=(F(X,Y,Z)-F(X,Y,Z-P))/P,
<
<                    CAR EN EFFET ON SUPPOSE UN ACCROIS-
<                    SEMENT DE LA VARIABLE DE DERIVATION
<                    EGAL A 'P'...
<
<                    SOIT, PAR DEFINITION DE 'F' :
<
<                                    DF/DX=(RDN(X,Y,Z)-RDN(X-P,Y,Z))/P,
<                                    DF/DY=(RDN(X,Y+P,Z)-RDN(X,Y,Z))/P,
<                                    DF/DZ=(RDN(X,Y,Z)-RDN(X,Y,Z-P),
<
<                    ET, PAR CHANGEMENT D'ECHELLE (CE
<                    QUI N'EST PAS GRAVE PUISQUE L'ON
<                    "NORMALISERA" LA NORMALE) :
<
<                                    DF/DX=RDN(X,Y,Z)-RDN(X-P,Y,Z),
<                                    DF/DY=RDN(X,Y+P,Z)-RDN(X,Y,Z),
<                                    DF/DZ=RDN(X,Y,Z)-RDN(X,Y,Z-P).
<
         PSR         X               < SAUVEGARDE DE LA COORDONNEE 'X'...
         LB          PASDER
         SBR         B,X
         SB          &ALIG           < F(X,Y,Z)-F(X-P,Y,Z),
         PLR         X               < RESTAURATION DU 'X' COURANT...
         FLT
         #/FST#      FXN             < CE QUI DONNE LA PREMIERE COORDONNEE
                                     < DU VECTEUR NORMAL.
         LA          &ALIGM          < F(X,Y+P,Z),
         SB          &ALIG           < F(X,Y+P,Z)-F(X,Y,Z),
         FLT
         #/FST#      FYN             < CE QUI DONNE LA SECONDE COORDONNEE
                                     < DU VECTEUR NORMAL.
         PSR         W               < ET SAUVEGARDE DE LA COORDONNEE 'Z'...
         LB          PASDER          < PASSAGE AU PLAN PRECEDENT (Z-P),
         SBR         B,W             < Z-P,
         BSR         AFONCT          < RDN(X,Y,Z-P),
         FIX
         SB          TCOUCH          < F(X,Y,Z-P),
         PLR         W               < RESTAURATION DU 'Z' COURANT...
         SB          &ALIG           < F(X,Y,Z-P)-F(X,Y,Z),
         NGR         A,A             < F(X,Y,Z)-F(X,Y,Z-P),
         FLT
         #/FST#      FZN             < CE QUI DONNE LA TROISIEME COORDONNEE
                                     < DU VECTEUR NORMAL.
         BSR         APVALN          < ET TEST DE NON-NULLITE DE LA NORMALE...
<
< CALCUL DE L'ECLAIRAGE :
<
         BSR         AINTEN          < CALCUL DE L'ECLAIRAGE AU POINT COURANT
                                     < EN FONCTION DE LA SOURCE LUMINEUSE...
         JMP         PNI981          < ET VERS LE CALCUL DU NIVEAU ET LE
                                     < TRACE...
<
< CAS DU "DEPTH-CUEING" :
<
PNI702:  EQU         $
         BSR         APNIVC          < (A,B)=NIVEAU A DONNER A TOUS LES POINTS
                                     <       DE CE PLAN.
<
< CALCUL DU NIVEAU DE TRACE :
<
PNI981:  EQU         $
         BSR         AROND           < (A)=NIVEAU FONCTION DU NIVEAU DE LA
                                     <     COUCHE COURANTE...
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         TRONIV          < DOIT-ON TRONQUER BRUTALEMENT ???
         JNE         PNI400          < OUI...
<
< CAS DE LA FONCTION
< EN DENTS DE SCIE :
<
PNI401:  EQU         $
         JAGE        PNI402
         NGR         A,A             < ABS(NIVEAU),
PNI402:  EQU         $
         CP          F255
         JLE         PNI400          < ON DOIT ETRE DANS (0,255)...
         SB          F511            < SINON, ON S'Y RAMENE...
         JMP         PNI401          < ET ON ATTEND DE S'ETRE STABILISER...
<
< TRONCAGE :
<
PNI400:  EQU         $
         CP          MINNIV          < ET VALIDATION :
         JL          PNI314          < TROP PETIT : ON TRONQUE INFERIEUREMENT...
         CP          MAXNIV          < ET VALIDATION :
         JG          PNI315          < TROP GRAND : ON TRONQUE SUPERIEUREMENT...
PNI311:  EQU         $
         JMP         PNI312          < VERS LE MARQUAGE DE (X,Y) AVEC (A).
PNI314:  EQU         $
         LA          MINNIV          < (A)=NIVEAU PLANCHER,
         JMP         PNI311          < VERS SON MARQUAGE...
PNI315:  EQU         $
         LA          MAXNIV          < (A)=NIVEAU PLAFOND,
         JMP         PNI311          < VERS SON MARQUAGE...
<
< ET RETOUR :
<
PNI312:  EQU         $
         FLT                         < (A,B)=VALEUR FLOTTANTE DU NIVEAU...
         RSR
         PAGE
<
<
<        C A L C U L   D E   L ' I N T E N S I T E   L U M I N E U S E
<                    A U   P O I N T   C O U R A N T
<                    D U   P L A N   S U I V A N T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME, EN FONCTION
<                    DES DIFFERENTS INDICATEURS DE
<                    CONTROLE, CALCULE L'INTENSITE
<                    LUMINEUSE AU POINT COURANT SUIVANT
<                    LA SOURCE LUMINEUSE, LE CONTEXTE
<                    (OMBRES PORTEES), ET LA NORMALE SUR
<                    LE PLAN SUIVANT 'Z+1'...
<
<
<        ARGUMENTS :
<                    (X,Y,W)=POINT COURANT (X,Y,Z).
<
<
<        RESULTAT :
<                    (A,B)=INTENSITE LUMINEUSE FLOTTANTE NORMALISEE.
<
<
PNJVO:   EQU         $
<
< PASSAGE AU PLAN SUIVANT :
<
         ADRI        I,W             < PASSAGE SUR Z+1...
<
< CALCUL DES OMBRES PORTEES :
<
         BSR         AQMBRE          < CALCUL DES OMBRES PORTEES DANS LE
                                     < PLAN 'Z+1'...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         #/FLD#      FNIVMX          < (A,B)=VALEUR MAXIMALE DE L'ECLAI-
                                     <       RAGE AU CAS OU IL N'Y AURAIT PAS
                                     <       DE "DEPTH-CUEING"...
         CPZ         IECLDC          < Y-A-T'IL DU "DEPTH-CUEING" AVEC L'ECLAI-
                                     < RAGE ???
         JE          PNJ980          < NON...
         BSR         APNIVC          < OUI :
                                     < (A,B)=NIVEAU MAXIMAL D'ECLAIRAGE FONC-
                                     <       DE LA COORDONNEE 'Z'.
PNJ980:  EQU         $
         FMP         FNIVEC          < MODULATION PAR L'OMBRAGE EVENTUEL,
         #/FST#      FNIVC           < CE QUI DONNE LE NIVEAU MAXIMAL DE
                                     < L'ECLAIRAGE...
<
< CALCUL DE LA NORMALE EN (X,Y,Z) :
<
         LA          &ALJG           < F(X,Y,Z).
<
< CALCUL DE LA NORMALE
< AU POINT COURANT (X,Y,Z) :
<
<
<        NOTA :
<                      LA SURFACE "FRACTALE" EST
<                    DEFINIE A L'AIDE DE LA FONCTION
<                    ALEATOIRE 'RDN(X,Y,Z)' CALCULEE
<                    DANS LE MODULE 'FONCT' ; LES
<                    POINTS DE LA SURFACE SONT DONC
<                    LES POINTS (X,Y,Z) TELS QUE :
<
<                                    RDN(X,Y,Z)=C, OU 'C' EST UNE CONSTANTE
<                                    DONNEE ('ICOUCH').
<
<                    L'EQUATION DE LA SURFACE EN
<                    IMPLICITE EST DONC :
<
<                                    F(X,Y,Z)=RDN(X,Y,Z)-C=0,
<
<                    SA NORMALE EN CHAQUE POINT EST
<                    DONC DEFINIE PAR LE VECTEUR DE
<                    COORDONNEES :
<
<                                    (DF/DX,DF/DY,DF/DZ).
<
<                    LES DERIVEES PARTIELLES VONT ETRE
<                    APPROXIMEES PAR LES FORMULES SUI-
<                    VANTES :
<
<                                    DF/DX=(F(X,Y,Z)-F(X-P,Y,Z))/P,
<                                    DF/DY=(F(X,Y+P,Z)-F(X,Y,Z))/P,
<                                    DF/FZ=(F(X,Y,Z)-F(X,Y,Z-P))/P,
<
<                    CAR EN EFFET ON SUPPOSE UN ACCROIS-
<                    SEMENT DE LA VARIABLE DE DERIVATION
<                    EGAL A 'P'...
<
<                    SOIT, PAR DEFINITION DE 'F' :
<
<                                    DF/DX=(RDN(X,Y,Z)-RDN(X-P,Y,Z))/P,
<                                    DF/DY=(RDN(X,Y+P,Z)-RDN(X,Y,Z))/P,
<                                    DF/DZ=(RDN(X,Y,Z)-RDN(X,Y,Z-P),
<
<                    ET, PAR CHANGEMENT D'ECHELLE (CE
<                    QUI N'EST PAS GRAVE PUISQUE L'ON
<                    "NORMALISERA" LA NORMALE) :
<
<                                    DF/DX=RDN(X,Y,Z)-RDN(X-P,Y,Z),
<                                    DF/DY=RDN(X,Y+P,Z)-RDN(X,Y,Z),
<                                    DF/DZ=RDN(X,Y,Z)-RDN(X,Y,Z-P).
<
         PSR         X               < SAUVEGARDE DE LA COORDONNEE 'X'...
         LB          PASDER
         SBR         B,X
         SB          &ALJG           < F(X,Y,Z+1)-F(X-P,Y,Z+1),
         PLR         X               < RESTAURATION DU 'X' COURANT...
         FLT
         #/FST#      FXN             < CE QUI DONNE LA PREMIERE COORDONNEE
                                     < DU VECTEUR NORMAL.
         LA          &ALJGM          < F(X,Y+P,Z+1),
         SB          &ALJG           < F(X,Y+P,Z+1)-F(X,Y,Z+1),
         FLT
         #/FST#      FYN             < CE QUI DONNE LA SECONDE COORDONNEE
                                     < DU VECTEUR NORMAL.
         PSR         W               < ET SAUVEGARDE DE LA COORDONNEE 'Z+1'...
         LB          PASDER          < PASSAGE AU PLAN PRECEDENT (Z+1-P),
         SBR         B,W             < Z+1-P,
         BSR         AFONCT          < RDN(X,Y,Z+1-P),
         FIX
         SB          TCOUCH          < F(X,Y,Z+1-P),
         PLR         W               < RESTAURATION DU 'Z+1' COURANT...
         SB          &ALJG           < F(X,Y,Z+1-P)-F(X,Y,Z+1),
         NGR         A,A             < F(X,Y,Z+1)-F(X,Y,Z+1-P),
         FLT
         #/FST#      FZN             < CE QUI DONNE LA TROISIEME COORDONNEE
                                     < DU VECTEUR NORMAL.
         BSR         APVALN          < ET TEST DE NON-NULLITE DE LA NORMALE...
<
< CALCUL DE L'ECLAIRAGE :
<
         BSR         AINTEN          < CALCUL DE L'ECLAIRAGE AU POINT COURANT
                                     < EN FONCTION DE LA SOURCE LUMINEUSE...
         JMP         PNJ981          < ET VERS LE CALCUL DU NIVEAU ET LE
                                     < TRACE...
<
< CAS DU "DEPTH-CUEING" :
<
PNJ702:  EQU         $
         BSR         APNIVC          < (A,B)=NIVEAU A DONNER A TOUS LES POINTS
                                     <       DE CE PLAN.
<
< CALCUL DU NIVEAU DE TRACE :
<
PNJ981:  EQU         $
         BSR         AROND           < (A)=NIVEAU FONCTION DU NIVEAU DE LA
                                     <     COUCHE COURANTE...
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         TRONIV          < DOIT-ON TRONQUER BRUTALEMENT ???
         JNE         PNJ400          < OUI...
<
< CAS DE LA FONCTION
< EN DENTS DE SCIE :
<
PNJ401:  EQU         $
         JAGE        PNJ402
         NGR         A,A             < ABS(NIVEAU),
PNJ402:  EQU         $
         CP          F255
         JLE         PNJ400          < ON DOIT ETRE DANS (0,255)...
         SB          F511            < SINON, ON S'Y RAMENE...
         JMP         PNJ401          < ET ON ATTEND DE S'ETRE STABILISER...
<
< TRONCAGE :
<
PNJ400:  EQU         $
         CP          MINNIV          < ET VALIDATION :
         JL          PNJ314          < TROP PETIT : ON TRONQUE INFERIEUREMENT...
         CP          MAXNIV          < ET VALIDATION :
         JG          PNJ315          < TROP GRAND : ON TRONQUE SUPERIEUREMENT...
PNJ311:  EQU         $
         JMP         PNJ312          < VERS LE MARQUAGE DE (X,Y) AVEC (A).
PNJ314:  EQU         $
         LA          MINNIV          < (A)=NIVEAU PLANCHER,
         JMP         PNJ311          < VERS SON MARQUAGE...
PNJ315:  EQU         $
         LA          MAXNIV          < (A)=NIVEAU PLAFOND,
         JMP         PNJ311          < VERS SON MARQUAGE...
<
< ET RETOUR :
<
PNJ312:  EQU         $
         ADRI        -I,W            < RETOUR AU PLAN  COURANT 'Z'...
         FLT                         < (A,B)=VALEUR FLOTTANTE DU NIVEAU...
         RSR
         PAGE
<
<
<        C A L C U L   D U   N I V E A U   D A N S   ( 0 , 2 5 5 )  :
<
<
<        ARGUMENT :
<                    (A,B)=NIVEAU LUMINEUX FLOTTANT,
<                    (X)=ABSCISSE DU POINT COURANT.
<
<
<        RESULTAT :
<                    (A)=(LISTN(X))=NIVEAU LUMINEUX ENTIER.
<
<
PLIST:   EQU         $
<
< CONVERSION ENTIERE :
<
         BSR         AROND           < (A)=NIVEAU FONCTION DU NIVEAU DE LA
                                     <     COUCHE COURANTE...
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         TRONIV          < DOIT-ON TRONQUER BRUTALEMENT ???
         JNE         PLI400          < OUI...
<
< CAS DE LA FONCTION
< EN DENTS DE SCIE :
<
PLI401:  EQU         $
         JAGE        PLI402
         NGR         A,A             < ABS(NIVEAU),
PLI402:  EQU         $
         CP          F255
         JLE         PLI400          < ON DOIT ETRE DANS (0,255)...
         SB          F511            < SINON, ON S'Y RAMENE...
         JMP         PLI401          < ET ON ATTEND DE S'ETRE STABILISER...
<
< TRONCAGE :
<
PLI400:  EQU         $
         CP          MINNIV          < ET VALIDATION :
         JL          PLI314          < TROP PETIT : ON TRONQUE INFERIEUREMENT...
         CP          MAXNIV          < ET VALIDATION :
         JG          PLI315          < TROP GRAND : ON TRONQUE SUPERIEUREMENT...
PLI311:  EQU         $
         JMP         PLI312          < VERS LE MARQUAGE DE (X,Y) AVEC (A).
PLI314:  EQU         $
         LA          MINNIV          < (A)=NIVEAU PLANCHER,
         JMP         PLI311          < VERS SON MARQUAGE...
PLI315:  EQU         $
         LA          MAXNIV          < (A)=NIVEAU PLAFOND,
         JMP         PLI311          < VERS SON MARQUAGE...
<
< MEMORISATION DE NIVEAU(X,Y,Z) :
<
PLI312:  EQU         $
         STBY        &ALISTN         < MEMORISATION DE (A)=NIVEAU(X,Y,Z)...
<
< ET RETOUR :
<
         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
<
<
<        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         L,W             < SAUVEGARDE DE 2 BASES ; MAIS 'C' NE DOIT
                                     < PAS ETRE UTILISEE A CAUSE DU BLOC FLOT-
                                     < TANT...
         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),
         #/FST#      FWORK           < ET SAVE...
         #/FLD#      VECT1Y,L        < Y(1),
         FMP         VECT2Y,W        < Y(1)*Y(2),
         FAD         FWORK           < X(1)*X(2)+Y(1)*Y(2),
         #/FST#      FWORK
                                     < ET SAVE...
         #/FLD#      VECT1Z,L        < Z(1),
         FMP         VECT2Z,W        < Z(1)*Z(2),
         FAD         FWORK           < (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 RETOUR :
<
         PLR         L,W
         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,KITER,GRAINE).
<
<
SPRDN:   EQU         $
<
< GENERATION ALEATOIRE :
<
         LR          X,A             < (A)=COORDONNEE 'X',
         MP          KITER           < ON UTILISE 'KITER' AFIN DE FAIRE
                                     < VARIER LA GENERATION ALEATOIRE A (X,Y)
                                     < CONSTANT SUIVANT LE NIVEAU DE RECUR-
                                     < SIVITE...
         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,KITER,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
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
<        ARGUMENT :
<                    (X,Y)=COORDONNEES DANS L'ESPACE (256,256).
<
<
<        RESULTAT :
<                    (A,B)=CUMUL CENTRE SUR LE POINT ARGUMENT (X,Y).
<
<
SPIRAL:  EQU         $
<
< INITIALISATION DE LA SPIRALE :
<
         PSR         X,Y,W           < SAUVEGARDE DU POINT (X,Y).
         STZ         CUMUL           < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         LA          PASQ
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         W
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIRALE.
<
< PARCOURS D'UN BRAS :
<
SPIRL1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPIRL2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NPM             < FINI ???
         JG          SPIRL3          < OUI...
         LR          X,A             < NON, TEST DE LA COORDONNEE 'X' :
         JAL         SPIRL4          < LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPIRL4          < HORS-ECRAN...
         LR          Y,A             < TEST DE LA COORDONNEE 'Y' :
         JAL         SPIRL4          < HORS-ECRAN...
         CPI         NLIGM1
         JG          SPIRL4          < HORS-ECRAN...
<
< ACCES AU NIVEAU DU POINT (X,Y) :
<
         PSR         X,Y             < SAUVEGARDE DU POINT COURANT...
<
< TENTATIVE D'ACCELERATION :
<
         SWBR        Y,B
         ORR         X,B             < (B)=(Y,X),
         STB         SAVYX           < ET SAUVEGARDE...
         RBT         NBITMO          < SUPRESSION DU BIT DE SIGNE DE 'B' AFIN
                                     < QUE LE RESTE SOIT POSITIF OU NUL,
         LRM         W
         WORD        ASHT            < (W)=ADRESSE DE LA TABLE D'ACCELERATION.
         LAI         K
         DV          LASHT           < (B)=COUPLE (Y,X) MODULO 'ASHPR',
         ADR         B,W             < CE QUI DONNE DANS 'W' L'ADRESSE D'UNE
                                     < ENTREE :
         LA          ASHT1,W
         CP          SAVYX           < L'ENTREE COURANTE CONTIENT-ELLE (Y,X) ???
         JNE         SPIRL6          < NON, IL FAUT ACCEDER REELLEMENT A 'TV1'/
                                     < 'TV2'...
         LA          ASHT2,W         < OUI, MAIS
         EOR         XCTCDA          < ON VA ANSI REGARDER SIMULTANEMENT SI
                                     < L'ENTREE EST OCCUPEE, ET SI OUI, S'IL
                                     < Y A COINCIDENCE AVEC 'TV1'/'TV2'...
         JAL         SPIRL6          < ET BIEN NON, CE N'EST PAS (X,Y)...
         CPI         NIVMX7          < ALORS ???
         JLE         SPIRL7          < ON A TROUVE (X,Y), ET 'TV1'/'TV2' EST
                                     < LE MEME, ALORS :
                                     < (A)=NIVEAU(X,Y)...
<
< ACCES REEL AU POINT (X,Y) :
<
SPIRL6:  EQU         $
         LR          X,A
         LBI         K
XWOR%1:  VAL         NBITMO=K
         SCLD        NBITMO-XWOR%1   < (B)=NUMERO DU MOT DANS LA LIGNE,
         SLRS        NBITMO-XWOR%1
         LXI         NBITMO-BIT
         SBR         A,X             < (X)=DECALAGE D'ACCES AUX BITS,
         PSR         X
         XR          Y,B
         SLLD        NMOTL=K+NBITMO
         ORR         Y,A             < (A)=NUMERO DU MOT DANS LA TRAME.
         AD          XCTCDA          < POUR PERMETTRE UN ACCES A TV1/TV2...
         LRM         B,X,Y
         WORD        MCDAR
         WORD        D*W
         WORD        LIMAG           < (Y)=POUR PASSER D'UNE COULEUR A L'AUTRE.
         RCDA
                                     < ACCES AU MOT ROUGE,
         LRM         B,X
         WORD        MCDAV
         WORD        D*W
         ADR         Y,A
         RCDA
                                     < ACCES AU MOT VERT,
         LRM         B,X
         WORD        MCDAB
         WORD        D*W
         ADR         Y,A
         RCDA
                                     < ACCES AU MOT BLEU.
         PLR         X               < RESTAURATION DU DECALAGE,
         LA          MCDAR
         SLRS        L,X
         SLRD        BIT             < RECUPERATION D'UN BIT ROUGE,
         LA          MCDAV
         SLRS        L,X
         SLRD        BIT             < RECUPERATION D'UN BIT VERT,
         LA          MCDAB
         SLRS        L,X
         ANDI        BIT             < RECUPERATION D'UN BIT BLEU,
         SLLD        NCOOL-BIT       < (A)=NIVEAU DE GRIS DU POINT.
<
< MEMORISATION DE (X,Y) :
<
         OR          XCTCDA          < (A)='TV1'/'TV2',NIVEAU(X,Y) :
         IF          TV1?TV2(NIVMX7,,XEIF%,
         IF          ATTENTION : LA CONCATENATION 'TV1'/'TV2' ET NIVEAU
         IF          EST IMPOSSIBLE !!!
XEIF%:   VAL         ENDIF
         STA         ASHT2,W         < MEMORISATION DE LA TRANSLATION ET DU
                                     < NIVEAU,
         ANDI        NIVMX7          < ET RESTAURATION DU NIVEAU(X,Y)...
         LB          SAVYX
         STB         ASHT1,W         < ET MEMORISATION DE (X,Y)...
<
< RESTAURATION DU POINT
< COURANT ET CUMUL :
<
SPIRL7:  EQU         $
         PLR         X,Y
         AD          CUMUL           < ET
         STA         CUMUL           < CUMULE...
<
< PARCOURS DE LA SPIRALE :
<
SPIRL4:  EQU         $
         LA          DELTAX          < CHANGEMENT DE
         ADR         A,X
         LA          DELTAY          < POINT COURANT (X,Y).
         ADR         A,Y
         DC          LB              < DECOMPTAGE DES POINTS SUR LA BRANCHE :
         JG          SPIRL2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPIRL5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPIRL5:  EQU         $
         LA          DELTAY          < ON FAIT SUBIR AU NOMBRE COMPLEXE
         NGR         A,A             < (DX,DY) UNE ROTATION DE PI/2, SOIT
         LB          DELTAX          < UNE MULTIPLICATION PAR LA MATRICE
                                     < (0,-1,1,0)...
         STA         DELTAX          < DELTAX=-DELTAY,
         STB         DELTAY          < DELTAY=DELTAX.
         JMP         SPIRL1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (X,Y) :
<
SPIRL3:  EQU         $
         PLR         X,Y,W           < RESTAURATION DU POINT COURANT (X,Y).
<
< NORMALISATION DU CUMUL :
<
         LA          CUMUL
         FLT
         FDV         FNPM
         RSR
         PAGE
<
<
<        C A L C U L   D E   L A   S O M M E   P O N D E R E E
<        D E S   F O N C T I O N S   A L E A O I R E S  :
<
<
<        ARGUMENT :
<                    (X,Y,W)=COORDONNEES DU POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=((MOYENE)+(AMPLI)*F(XS,YS,ZS))*(CONTRIBUTION ALEATOIR
<                          (F(SIGMA(NIVEAU(X,Y)))*(CONTRIBUTION DES SPIRALES).
<
<
FONCT:   EQU         $
         PSR         X,Y,W           < SAUVEGARDES...
<
< FLOTTAGE DU POINT COURANT :
<
         LR          X,A             < COORDONNEE 'X' :
         AD          TRDNX           < TRANSLATION EN 'X' DU GENERATEUR,
         STA         XS
         FLT
         #/FST#      GXS             < COORDONNEE 'XS' DU POINT COURANT.
         LR          Y,A             < COORDONNEE 'Y' :
         AD          TRDNY           < TRANSLATION EN 'Y' DU GENERATEUR,
         STA         YS
         FLT
         #/FST#      GYS             < COORDONNEE 'YS' DU POINT COURANT.
         LR          W,A             < COORDONNEE 'Z' :
         AD          TRDNZ           < TRANSLATION EN 'Z' DU GENERATEUR,
         STA         ZS
         FLT
         #/FST#      GZS             < COORDONNEE 'ZS' DU POINT COURANT.
<
< DISCRIMINATION DES
< CONTRIBUTIONS ALEATOIRES
< ET DES SPIRALES :
<
         #/FLD#      PONRDN          < (A,B)=PONDERATION ALEATOIRE :
         FCAZ                        < EXISTE-T'ELLE ???
         JNE         FONCT1          < OUI, ALLONS LA CALCULER...
         BSR         AGOTO
         WORD        FONCT6          < NON, ALLONS VERS LA CONTRIBUTION DES
                                     < SPIRALES, EN NOTANT QUE L'ON A :
                                     < (A,B)=0...
<
<
<        C O N T R I B U T I O N   A L E A T O I R E  :
<
<
FONCT1:  EQU         $
<
<
<        G E N E R A T I O N   D ' U N E   S O M M A T I O N
<        R E C U R S I V E   D E   F O N C T I O N S
<        A L E A T O I R E S   " D E C R O I S S A N T E S "  :
<
<
         #/FLD#      F0
         #/FST#      FCUMR           < INITIALISATION DU CUMUL DES FONCTIONS
                                     < ALEATOIRES SCALANTES...
<
< ITERATION POUR CHAQUE
< FONCTION ALEATOIRE :
<
         STZ         KITER           < INITIALISATION DES RECURSIONS...
         LXI         K               < (X)=INDEX DES RECURSIONS...
FONCT5:  EQU         $
         IC          KITER           < COMPTAGE DES RECURSIONS...
<
< INITIALISATION DU MAILLAGE :
<
         LA          &ALPSIX
         STA         PASIX           < 'PASIX' ENTIER,
         LA          &ALPSIY
         STA         PASIY           < 'PASIY' ENTIER,
         LA          &ALPSIZ
         STA         PASIZ           < 'PASIZ' ENTIER.
         PSR         X
         ADR         X,X             < PASSAGE A UN INDEX FLOTTANT...
         FLD         &ALPASX
         #/FST#      FPASIX          < 'PASIX' FLOTTANT,
         FLD         &ALPASY
         #/FST#      FPASIY          < 'PASIY' FLOTTANT.
         FLD         &ALPASZ
         #/FST#      FPASIZ          < 'PASIZ' FLOTTANT.
         FLD         &ALPOND
         #/FST#      FPOND           < 'FPOND'.
<
< RECHERCHE DU NOEUD
< VOISIN PAR "DEFAUT" :
<
         LA          XS
         SARD        NBITMO
         DV          PASIX
         MP          PASIX
         LR          B,X             < X(NOEUD BAS-GAUCHE) DE LA MAILLE
                                     < COURANTE,
         LA          YS
         SARD        NBITMO
         DV          PASIY
         MP          PASIY
         LR          B,Y             < Y(NOEUD BAS-GAUCHE) DE LA MAILLE
                                     < COURANTE.
         LA          ZS
         SARD        NBITMO
         DV          PASIZ
         MP          PASIZ
         LR          B,W             < Z(NOEUD BAS-GAUCHE) DE LA MAILLE
                                     < COURANTE.
         LA          XS
         CPR         A,X             < EST-ON EN UN NOEUD ???
         JNE         FONCT3          < NON...
         LA          YS              < PEUT-ETRE :
         CPR         A,Y             < EST-ON EN UN NOEUD ???
         JNE         FONCT3          < NON, INTERPOLONS...
         LA          ZS              < PEUT-ETRE :
         CPR         A,W             < EST-ON EN UN NOEUD ???
         JNE         FONCT3          < NON, INTERPOLONS...
<
< CAS OU LE POINT (XS,YS,ZS)
< COURANT EST UN NOEUD :
<
         BSR         ASPRDN          < LE POINT COURANT EST UN NOEUD...
         BSR         AGOTO
         WORD        FONCT4          < VERS L'ACCES A LA VALEUR DU NOEUD...
<
< CAS OU LE POINT (XS,YS,ZS)
< COURANT N'EST PAS UN NOEUD :
<
FONCT3:  EQU         $
         NGR         X,A             < ABSCISSE DU NOEUD "BAS-GAUCHE"...
         FLT
         FAD         GXS             < X-XNOEUD,
         FDV         FPASIX          < (X-XNOEUD)/PASIX,
         #/FST#      HINCU           < DISTANCE NORMALISEE A 1 LE LONG DE OX,
                                     < DU POINT COURANT AU NOEUD DE LA MAILLE.
         NGR         Y,A             < ORDONNEE DU NOEUD "BAS-GAUCHE"...
         FLT
         FAD         GYS             < Y-YNOEUD,
         FDV         FPASIY          < (Y-YNOEUD)/PASIY,
         #/FST#      HINCV           < DISTANCE NORMALISEE A 1 LE LONG DE OY,
                                     < DU POINT COURANT AU NOEUD DE LA MAILLE.
         NGR         W,A             < Z-COORDONNEE DU NOEUD "BAS-GAUCHE"...
         FLT
         FAD         GZS             < Z-ZNOEUD,
         FDV         FPASIZ          < (Z-ZNOEUD)/PASIZ,
         #/FST#      HINCW           < DISTANCE NORMALISEE A 1 LE LONG DE OZ,
                                     < DU POINT COURANT AU NOEUD DE LA MAILLE.
                                     < NOTA : PAR LA SUITE, 'XN', 'YN' ET 'ZN'
                                     < DESIGNERONT LES 3 COORDONNEES DU
                                     < NOEUD DE LA MAILLE COURANTE.
         BSR         ASPRDN
         #/FST#      AFNIV1          < NIVEAU(XN,YN,ZN),
         LA          PASIX
         ADR         A,X
         BSR         ASPRDN
         #/FST#      AFNIV2          < NIVEAU(XN+PASIX,YN,ZN),
         LA          PASIY
         ADR         A,Y
         BSR         ASPRDN
         #/FST#      AFNIV3          < NIVEAU(XN+PASIX,YN+PASIY,ZN),
         LA          PASIX
         SBR         A,X
         BSR         ASPRDN
         #/FST#      AFNIV4          < NIVEAU(XN,YN+PASIY,ZN),
         LA          PASIZ
         ADR         A,W
         BSR         ASPRDN
         #/FST#      AFNIV5          < NIVEAU(XN,YN+PASIY,ZN+PASIZ),
         LA          PASIX
         ADR         A,X
         BSR         ASPRDN
         #/FST#      AFNIV6          < NIVEAU(XN+PASIX,YN+PASIY,ZN+PASIZ),
         LA          PASIY
         SBR         A,Y
         BSR         ASPRDN
         #/FST#      AFNIV7          < NIVEAU(XN+PASIX,YN,ZN+PASIZ),
         LA          PASIX
         SBR         A,X
         BSR         ASPRDN
         #/FST#      AFNIV8          < NIVEAU(XN,YN,ZN+PASIZ).
<
< INTERPOLATION ENTRE LES
< HUIT SOMMETS D'UN CUBE
< PORTANT LES VALEURS (NIV1,
< NIV2,NIV3,NIV4,NIV5,NIV6,
< NIV7,NIV8), LES COOR-
< DONNEES DU POINT DANS LE
< CUBE ETANT (HINCU,HINCV,HINCW) :
<
<
<        NOTA :
<                      ON DOIT INTERPOLER ENTRE LES
<                    HUIT NIVEAUX (NIV1,...,NIV8)
<                    PORTES PAR LES HUIT SOMMETS D'UN
<                    CUBE :
<
<
<                    (1-U,V,1-W) ----------------- (U,V,1-W)
<                        /I                          /I
<                       / I                         / I
<                      /  I                        /  I
<                     /   I                       /   I
<                    /    I                      /    I
<                   /     I                     /     I
<                  /      I                    /      I
<            (1-U,V,W) ------------------- (U,V,W)    I
<                 I       I                   I       I
<                 I       I                   I       I
<                 I       I                   I       I
<                 I       I                   I       I
<                 I (1-U,1-V,1-W) ----------- I - (U,1-V,1-W)
<                 I      /                    I      /
<                 I     /                     I     /
<                 I    /                      I    /
<                 I   /                       I   /
<                 I  /                        I  /
<                 I /                         I /
<                 I/                          I/
<           (1-U,1-V,W) ----------------- (U,1-V,W)
<
<
<                       NIV 4 --------------------- NIV 3
<                        /I                          /I
<                       / I                         / I
<                      /  I                        /  I
<                     /   I                       /   I
<                    /    I                      /    I
<                   /     I                     /     I
<                  /      I                    /      I
<               NIV 5 --------------------- NIV 6     I
<                 I       I                   I       I
<                 I       I                   I       I
<                 I       I                   I       I
<                 I       I                   I       I
<                 I     NIV 1 --------------- I --- NIV 2
<                 I      /                    I      /
<                 I     /                     I     /
<                 I    /                      I    /
<                 I   /                       I   /
<                 I  /                        I  /
<                 I /                         I /
<                 I/                          I/
<               NIV 8 --------------------- NIV 7
<
<
<                      CE QUI DONNE LA FORMULE
<                    D'INTERPOLATION POUR LE POINT
<                    INTERIEUR AU CUBE ET DE COOR-
<                    DONNEES (U,V,W) RELATIVES AU
<                    SOMMET '1' :
<
<                    NIVEAU(U,V,W) = (1-U)*(1-V)*(1-W)*NIV1
<                                   +U*(1-V)*(1-W)*NIV2
<                                   +U*V*(1-W)*NIV3
<                                   +(1-U)*V*(1-W)*NIV4
<                                   +(1-U)*V*W*NIV5
<                                   +U*V*W*NIV6
<                                   +U*(1-V)*W*NIV7
<                                   +(1-U)*(1-V)*W*NIV8.
<
<
< CALCUL DE (1-U,1-V,1-W)
<
         #/FLD#      F1              < 1,
         FSB         HINCU           < 1-U,
         #/FST#      HINCU1          < HINCU1=1-HINCU.
         #/FLD#      F1              < 1,
         FSB         HINCV           < 1-V,
         #/FST#      HINCV1          < HINCV1=1-HINCV.
         #/FLD#      F1              < 1,
         FSB         HINCW           < 1-W,
         #/FST#      HINCW1          < HINCW1=1-HINCW.
<
< INTERPOLATION TRI-DIMENSIONNELLE :
<
                                     < 1-W,
         FMP         AFNIV1          < (1-W)*N1,
         #/FST#      FWORK
         #/FLD#      HINCW           < W,
         FMP         AFNIV8          < W*N8,
         FAD         FWORK           < (1-W)*N1+W*N8,
         FMP         HINCU1          < (1-U)*((1-W)*N1+W*N8),
         #/FST#      FWORK1          < ET SAVE...
         #/FLD#      HINCW1          < 1-W,
         FMP         AFNIV2          < (1-W)*N2,
         #/FST#      FWORK
         #/FLD#      HINCW           < W,
         FMP         AFNIV7          < W*N7,
         FAD         FWORK           < (1-W)*N2+W*N7,
         FMP         HINCU           < U*((1-W)*N2+W*N7),
         FAD         FWORK1          < U*((1-W)*N2+W*N7)+(1-U)*((1-W)*N1+W*N8),
         FMP         HINCV1          < (1-V)*(U*((1-W)*N2+W*N7)
                                     <        +(1-U)*((1-W)*N1+W*N8)),
         #/FST#      FWORK1          < ET SAVE...
         #/FLD#      HINCW1          < 1-W,
         FMP         AFNIV3          < (1-W)*N3,
         #/FST#      FWORK
         #/FLD#      HINCW           < W,
         FMP         AFNIV6          < W*N6,
         FAD         FWORK           < (1-W)*N3+W*N6,
         FMP         HINCU           < U*((1-W)*N3+W*N6),
         #/FST#      FWORK2          < ET SAVE...
         #/FLD#      HINCW1          < 1-W,
         FMP         AFNIV4          < (1-W)*N4,
         #/FST#      FWORK
         #/FLD#      HINCW           < W,
         FMP         AFNIV5          < W*N5,
         FAD         FWORK           < (1-W)*N4+W*N5,
         FMP         HINCU1          < (1-U)*((1-W)*N4+W*N5),
         FAD         FWORK2          < (1-U)*((1-W)*N4+W*N5)+U*((1-W)*N3+W*N6),
         FMP         HINCV           < V*((1-U)*((1-W)*N4+W*N5)
                                     <    +U*((1-W)*N3+W*N6)),
         FAD         FWORK1          < CUMUL GENERAL...
<
< FIN DE L'INTERPOLATION :
<
FONCT4:  EQU         $
         PLR         X
<
< CALCUL RECURSIF DE LA FONCTION :
<
         FMP         FPOND           < ET ON PONDERE PAR LES 'FPOND'
                                     < AFIN D'OBTENIR DES VALEURS ALEATOIRES
                                     < DECROISSANTES STATISTIQUEMENT...
                                     < NOTA : ON NE DIVISE PLUS PAR 'FPOND0',
                                     < CAR LA DEFINITION DE 'RENORM' INCLUE
                                     < SON INVERSE, ET DONC : FPOND0/FPOND0=1...
         FAD         FCUMR           < QUE L'ON CUMULE,
         #/FST#      FCUMR           < ON A AINSI EN CHAQUE POINT UNE SOMME
                                     < DE FONCTION ALEATOIRE DONT LA FREQUENCE
                                     < AUGMENTE PROGRESSIVEMENT PAR REDUCTION
                                     < DE LA MAILLE, MAIS DONT L'AMPLITUDE
                                     < DIMINUE STATISTIQUEMENT...
<
< PASSAGE A LA COMPOSANTE SUIVANTE :
<
         ADRI        I,X             < PROGRESSION DE L'INDEX DE RECURSION...
         LR          X,A
         CP          NRECUR          < EST-CE FINI ???
         JGE         FONCT2          < OUI, ON ARRETE LA...
         BSR         AGOTO
         WORD        FONCT5          < NON, ON CONTINUE...
FONCT2:  EQU         $
<
< FIN DE RECURSION :
<
         #/FLD#      FCUMR           < ET ON RENVOIE LA SOMME DES
                                     < FONCTIONS ALEATOIRES...
         FDV         RENORM          < ET ON MULTIPLIE PAR 'AMPLI', 'AMPLIR',
                                     < ET ON DIVISE PAR LE SIGMA DES 'FPOND'...
<
< CALCUL FINAL DE LA
< CONTRIBUTION ALEATOIRE :
<
         FAD         MOYENE          < ET TRANSLATION.
         FMP         PONRDN          < ET PONDERATION PAR LA CONTRIBUTION
                                     < ALEATOIRE...
FONCT6:  EQU         $
<
< TEST DE LA CONTRIBUTION
< DES SPIRALES (256,256) :
<
         FCMZ        PONSPI          < LES SPIRALES SONT-ELLES LA ???
         JE          FONCT0          < NON, (A,B) DONNE LA FONCTION...
<
<
<        C O N T R I B U T I O N   D E S   S P I R A L E S  :
<
<
         PSR         A,B             < SAUVEGARDE DE LA CONTRIBUTION ALEATOIRE.
<
< TEST DE LA POSITION
< DU POINT COURANT (XS,YS)
< DE LA MAILLE (512,512)
< PAR RAPPORT A LA MAILLE
< DES SPIRALES 2*(256,256) :
<
         LA          XS              < (A)=ABSCISSE '512',
         SLRS        XC512/NPOL=K
         LR          A,X             < (X)=ABSCISSE '256'.
         JC          FONC01          < ELLE NE "TOMBE PAS JUSTE"...
         LA          YS              < (A)=ORDONNEE '512',
         SB          VECTNL
         NGR         A,A             < EN EFFET, LES AXES 'Y' '512' ET '256'
                                     < SONT INVERSES...
         SLRS        XL512/NLIG=K
         LR          A,Y             < (Y)=ORDONNEE '256'.
         JC          FONC02          < ELLE NE "TOMBE PAS JUSTE", ET LE POINT
                                     < '512' EST SUR SUR UNE HORIZONTALE ENTRE
                                     < DEUX POINTS '256'...
<
< CAS D'UN POINT '512'
< COINCIDANT AVEC UN
< POINT '256' :
<
         BSR         ASPIRL          < (A,B)=SIGMA(NIVEAU(X,Y)).
         FMP         F4              < ET ON LE QUADRUPLE :
                                     < (A,B)=4*SIGMA(NIVEAU(X,Y)).
         JMP         FONC09          < VERS LA SORTIE...
<
< CAS D'UN POINT '512'
< ENTRE DEUX POINTS '256'
< SUR UNE VERTICALE :
<
FONC02:  EQU         $
         BSR         ASPIRL          < (A,B)=SIGMA(NIVEAU(X,Y)),
         #/FST#      FWORK           < ET SAVE...
         ADRI        I,Y
         BSR         ASPIRL          < (A,B)=SIGMA(NIVEAU(X,Y+1)).
         FAD         FWORK           < (A,B)=SIGMA(NIVEAU(X,Y))+
                                     <       SIGMA(NIVEAU(X,Y+1)).
         FMP         F2              < ET ON LE DOUBLE :
                                     < (A,B)=2*(SIGMA(NIVEAU(X,Y))+
                                     <          SIGMA(NIVEAU(X,Y+1))).
         JMP         FONC09          < VERS LA SORTIE...
<
< AUTRES CAS :
<
FONC01:  EQU         $
         LA          YS              < (A)=ORDONNEE '512' :
         SB          VECTNL
         NGR         A,A             < EN EFFET, LES AXES 'Y' '512' ET '256'
                                     < SONT INVERSES...
         SLRS        XL512/NLIG=K
         LR          A,Y             < (Y)=ORDONNEE '256'.
         JC          FONC03          < ELLE NE "TOMBE PAS JUSTE", ET LE POINT
                                     < '512' ET AU CENTRE D'UN CARRE DE QUATRE
                                     < POINTS '256'...
<
< CAS D'UN POINT '512'
< ENTRE DEUX POINTS '256'
< SUR UNE HORIZONTALE :
<
         BSR         ASPIRL          < (A,B)=SIGMA(NIVEAU(X,Y)),
         #/FST#      FWORK           < ET SAVE...
         ADRI        I,X
         BSR         ASPIRL          < (A,B)=SIGMA(NIVEAU(X+1,Y)).
         FAD         FWORK           < (A,B)=SIGMA(NIVEAU(X,Y))+
                                     <       SIGMA(NIVEAU(X+1,Y)).
         FMP         F2              < ET ON LE DOUBLE :
                                     < (A,B)=2*(SIGMA(NIVEAU(X,Y))+
                                     <          SIGMA(NIVEAU(X+1,Y))).
         JMP         FONC09          < VERS LA SORTIE...
<
< CAS D'UN POINT '512' AU
< CENTRE D'UN CARRE FAIT
< DE QUATRE POINTS '256' :
<
FONC03:  EQU         $
         BSR         ASPIRL          < (A,B)=SIGMA(NIVEAU(X,Y)),
         #/FST#      FWORK1
         ADRI        I,X
         BSR         ASPIRL          < (A,B)=SIGMA(NIVEAU(X+1,Y)),
         #/FST#      FWORK2
         ADRI        I,Y
         BSR         ASPIRL          < (A,B)=SIGMA(NIVEAU(X+1,Y+1)),
         #/FST#      FWORK
         ADRI        -I,X
         BSR         ASPIRL          < (A,B)=SIGMA(NIVEAU(X,Y+1)).
         FAD         FWORK
         FAD         FWORK2
         FAD         FWORK1          < (A,B)=SIGMA(NIVEAU(X,Y))+
                                     <       SIGMA(NIVEAU(X+1,Y))+
                                     <       SIGMA(NIVEAU(X+1,Y+1))+
                                     <       SIGMA(NIVEAU(X,Y+1)).
<
< PONDERATION "SPIRALE" :
<
FONC09:  EQU         $
         FMP         PONSPI          < ET CONTRIBUTION DES SPIRALES...
<
<
<        C A L C U L   D E   L A   F O N C T I O N   C O U R A N T E  :
<
<
         #/FST#      FWORK           < SAUVEGARDE TEMPORAIRE...
         PLR         A,B             < (A,B)=CONTRIBUTION ALEATOIRE,
         FAD         FWORK           < (A,B)=CONTRIBUTION ALEATOIRE+
                                     <       CONTRIBUTION DES SPIRALES.
<
<
<        M O D U L A T I O N  :
<
<
FONCT0:  EQU         $
         PLR         X,Y,W           < RESTAURATION DES COORDONNEES (X,Y,Z)...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         NFONCT          < Y-A-T'IL UNE MODULATION ???
         JE          FONCT7          < NON, (A,B) EST BON...
         PSR         A,B             < OUI, ON EMPILE LA VALEUR COURANTE DE
                                     < LA FONCTION RDN(X,Y,Z)...
         PSR         X,Y,W           < ET SAUVEGARDE DES COORDONNEES, ON NE
                                     < SAIT JAMAIS...
         LA          NFONCT          < (A)=INDEX DE LA FONCTION DEMANDEE :
         CPI         FGAUSS          < EST-CE UNE GAUSSIENNE ???
         JE          GAUS01          < OUI...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
         PLR         A,B             < (A,B)=RDN(X,Y,Z) COURANTE,
         JMP         FONCT7          < ET VERS LA SORTIE...
<
<
<        G A U S S I E N N E  :
<
<
GAUS01:  EQU         $
         LR          X,A             < X,
         SB          TXGAUS          < X-TX,
         FLT
         #/FST#      FWORK
         FMP         FWORK           < (X-TX)**2,
         FDV         DXGAUS          < ((X-TX)**2)/DX.
         #/FST#      FWORK1
         LR          Y,A             < Y,
         SB          TYGAUS          < Y-TY,
         FLT
         #/FST#      FWORK
         FMP         FWORK           < (Y-TY)**2,
         FDV         DYGAUS          < ((Y-TY)**2)/DY.
         FAD         FWORK1          < ((X-TX)**2)/DX+((Y-TY)**2)/DY.
         #/FST#      FWORK1
         LR          W,A             < Z,
         SB          TZGAUS          < Z-TZ,
         FLT
         #/FST#      FWORK
         FMP         FWORK           < (Z-TZ)**2,
         FDV         DZGAUS          < ((Z-TZ)**2)/DZ.
         FAD         FWORK1          < ((X-TX)**2)/DX+((Y-TY)**2)/DY+
                                     < +((Z-TZ)**2)/DZ,
         FNEG
         BSR         AEXPON          < EXP(-(((X-TX)**2)/DX+((Y-TY)**2)/DY+
                                     <     ((Z-TZ)**2)/DZ)).
<
< ET MODULATION :
<
FINFON:  EQU         $
         #/FST#      FWORK           < SAUVEGARDE DU FACTEUR MULTIPLICATIF,
         PLR         X,Y,W           < RESTAURATION DES COORDONNEES (X,Y,Z)...
         PLR         A,B             < (A,B)=RDN(X,Y,Z),
         FMP         FWORK           < ET MODULATION...
FONCT7:  EQU         $
<
< RETOUR :
<
         RSR
         PAGE
<
<
<        A C C E S   A U   N I V E A U   C O U R A N T  :
<
<
<        ARGUMENT :
<                    (IBUFMT)=INDEX DE L'OCTET COURANT.
<
<
<        RESULTAT :
<                    (A,B)=OCTET COURANT EN FLOTTANT...
<
<
NIVO:    EQU         $
<
< INITIALISATIONS :
<
         PSR         X
<
< TEST DE L'ETAT DU BUFFER :
<
         LA          IBUFMT          < (A)=INDEX COURANT :
         CP          ZBUFMT          < LE BUFFER A-T'IL ETE VIDE (OU EST-CE
                                     < L'ETAT INITIAL) ???
         JL          NIVO1           < NON...
<
< CAS OU LE BUFFER EST VIDE :
<
NIVO2:   EQU         $
         LAD         DEMMT           < (A)=ADRESSE DE LA DEMANDE,
         SVC                         < QUE L'ON ENVOIE...
         JE          NIVO3           < OK...
         QUIT        XXQUIT          < E R R E U R   D ' A S S I G N A T I O N..
         JMP         NIVO2           < ET ON RE-TENTE, OU BIEN ON ARRETE S'IL
                                     < S'AGIT D'UN 'TAPE-MARK'...
NIVO3:   EQU         $
         IC          DEMMT+ARGESC    < PREPARATION DE L'ADRESSE DU BLOC SUIVANT,
         ACTD        XXXSIZ          < RECUPERATION DE LA 'BOX'...
         LR          B,A             < (A)=NOMBRE D'OCTETS REELS DU BLOC :
         CP          DEMMT+COESC     < LE BUFFER EST-IL BON ???
         JNE         NIVO2           < NON, ON LIT L'ENREGISTREMENT SUIVANT...
         LAI         K               < (A)=INDEX DU PREMIER OCTET.
<
< ACCES A L'OCTET COURANT :
<
NIVO1:   EQU         $
         LR          A,X             < (X)=INDEX DE L'OCTET COURANT,
         LBY         &ABUFMT         < (A)=OCTET COURANT...
         ADRI        I,X             < ET PREPARATION DE
         STX         IBUFMT          <                   L'ACCES SUIVANT...
<
< ET RETOUR :
<
         FLT                         < ET PASSAGE EN FLOTTANT...
         FAD         TRANMT          < TRANSLATION ET
         FMP         MULTMT          <                MISE A L'ECHELLE...
         PLR         X
         RSR
         PAGE
<
<
<        C A L C U L   D ' U N E   P U I S S A N C E
<        Q U E L C O N Q U E   R E E L L E   ' P '  :
<
<
<        ARGUMENT :
<                    (A,B)=NOMBRE 'N' ARGUMENT,
<
<
<        RESULTAT :
<                    (A,B)='N' A LA PUISSANCE P.
<
<
RAK:     EQU         $
         PSR         Y
<
<
<        L O G   N E P E R I E N  :
<
<
LOGN:    EQU         $
         STZ         SIGNE           < =0 : SIGNE "+" A PRIORI...
         FCAZ
         JGE         LOGN1           < POSITIF...
         IC          SIGNE           < =1 : SIGNE "-"...
LOGN1:   EQU         $
         LR          A,Y
         FABS
         ANDI        XXMASK
         #/FST#      POLLO3
         FAD         POLLO4
         #/FST#      POLLO2
         LR          Y,A
         SWBR        A
         SARS        XXMASK=K
         FLT
         #/FST#      POLLO1
         #/FLD#      POLLO3
         FSB         POLLO4
         FDV         POLLO2
         #/FST#      POLLO3
         FMP         POLLO3
         FNEG
         FAD         POLLO7
         #/FST#      POLLO2
         #/FLD#      POLLO6
         FDV         POLLO2
         FAD         POLLO5
         FMP         POLLO3
         FSB         POLLO8
         FAD         POLLO1
         FMP         POLLO9
<
<
<        G E S T I O N   D U   S I G N E   D E   L ' E X P O S A N T  :
<
<
         PSR         A,B             < SAVE LE 'LOG'...
         #/FLD#      EXPOP
         FABS
         BSR         AROND           < ON PREND LA PARTIE ENTIERE (PAR EXCES
                                     < OU PAR DEFAUT) DE LA VALEUR ABSOLUE DE
                                     < L'EXPOSANT...
         TBT         NBITMO-B        < QUELLE EST SA PARITE ???
         JC          RAK1            < IMPAIRE, 'SIGNE' RESTE TEL QUEL...
         STZ         SIGNE           < PAIRE : ON FORCE "+" (SIGNE INCHANGE)...
RAK1:    EQU         $
         PLR         A,B             < RESTAURATION DU LOG,
         FMP         EXPOP           < ET ON CALCULE P*LOG...
<
<
<        E X P O N E N T I E L L E  :
<
<
EXP:     EQU         $
         FMP         POLEX4
         #/FST#      POLEX3
         FIX
         STA         POLEX5
         FLT
         FCAM        POLEX3
         JNV         EXPON3
         #/FLD#      POLEX6
         #/FST#      POLEX3
         JMP         EXPON5
EXPON3:  EQU         $
         CPZ         POLEX3
         JGE         EXPON4
         DC          POLEX5
         LA          POLEX5
         FLT
EXPON4:  EQU         $
         FSB         POLEX3
         FNEG
         #/FST#      POLEX2
         FMP         POLEX2
         #/FST#      POLEX1
         FAD         POLEX8
         #/FST#      POLEX3
         #/FLD#      POLEY0
         FDV         POLEX3
         FAD         POLEX1
         FMP         POLEX9
         FAD         POLEY1
         FSB         POLEX2
         #/FST#      POLEX3
         #/FLD#      POLEX7
         FMP         POLEX2
         FDV         POLEX3
         FAD         POLEX6
         #/FST#      POLEX3
EXPON5:  EQU         $
         SWBR        A
         SARS        XXMASK=K
         AD          POLEX5
         CPI         XX7F
         JG          $               < E R R E U R   P R O G R A M M E ...
         CPI         XX80
         JGE         EXPON6
         #/FLD#      F0              < ON PREND LE MINIMUM...
         JMP         EXPON7
EXPON6:  EQU         $
XWOR%1:  VAL         XXMASK=K
XWOR%1:  VAL         -XWOR%1
         ANDI        XXMASK>XWOR%1
         STA         POLEX5
         LA          POLEX3
         ANDI        XXMASK
         AD          POLEX5
EXPON7:  EQU         $
         CPZ         SIGNE           < PRISE EN COMPTE DU SIGNE SIMULE :
         JE          EXP1            < POSITIF, ON LAISSE LE RESULTAT TEL QUEL..
         FNEG                        < NEGATIF, ON INVERSE...
EXP1:    EQU         $
         BSR         ATSFLO
         PLR         Y
         RSR
<
<
<        E X P O N E N T I E L L E  :
<
<
EXPON:   EQU         $
         PSR         Y
         STZ         SIGNE           < "+" A PRIORI...
         JMP         EXP             < VERS LE CALCUL DE L'EXPONENTIELLE...
         PAGE
<
<
<        P O I N T   D ' E N T R E E  :
<
<
DEBUT:   EQU         $
<
< INITIALISATION DES REGISTRES :
<
         LRM         C,L,K
         WORD        COM+DEPBAS      < POSITIONNEMENT DE 'C',
         WORD        LOC+DEPBAS      < POSITIONNEMENT DE 'L',
         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         $
<
< 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         $
<
< DEFINITION DU SEUIL
< DE DEFINITION DE LA
< SURFACE :
<
         LB          SCOUCH          < (B)=SEUIL A PRIORI ('SCOUCH')...
         LA          NFONCT          < (A)=FONCTION DE MODULATION DE LA FONCTION
                                     <     ALEATOIRE RDN(X,Y,Z) :
         CPI         FGAUSS          < EST-CE LA MODULATION GAUSSIENNE ???
         JNE         INIT20          < NON, (B) EST BON...
GCOUCH:: VAL         4               < LOGARITHME EN BASE 2 DU DIVISEUR DE
                                     < 'SCOUCH' LORSQUE LA MODULATION GAUS-
                                     < SIENNE EST UTILISEE ; EN EFFET, IL FAUT
                                     < DIMINUER LE SEUIL DE DEFINITION DE LA
                                     < SURFACE, CAR LA MODULATION GAUSSIENNE EST
                                     < INFERIEURE A 1, ET ALORS PRATIQUEMENT
                                     < TOUS LES POINTS SE TROUVERAIENT A L'EX-
                                     < TERIEUR...
         LAI         K               < CLEAR 'A',
         SLRD        GCOUCH          < ET ON DIMINUE LE SEUIL...
INIT20:  EQU         $
         STB         ICOUCH          < MISE A JOUR DU SEUIL COURANT DE DEFINI-
                                     < TION DE LA SURFACE...
<
< 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.
<
< INITIALISATION DES
< CALCULS DE SPIRALES :
<
         LA          NPM
         FLT
         #/FST#      FNPM            < FLOTTAGE DE 'NPM'...
<
< PAS INITIAUX DU MAILLAGE :
<
         #/FLD#      F1
         FDV         F3
         #/FST#      EXPOP           < POUR CALCULER UNE RACINE CUBIQUE POUR
                                     < PASSER D'UN VOLUME A UNE DIMENSION...
         LA          PASIX0          < VALEUR INITIALE DE 'PASIX' :
         JALE        $               < ???
         STA         PASIX           < PAS EN 'X',
         FLT
         #/FST#      FWORK           < ET SAUVEGARDE...
         LA          PASIY0          < VALEUR INITIALE DE 'PASIY' :
         JALE        $               < ???
         STA         PASIY           < ET PAS EN 'Y'...
         FLT
         FMP         FWORK           < CALCUL DE PASIX*PASIY...
         #/FST#      FWORK
         LA          PASIZ0          < VALEUR INITIALE DE 'PASIZ' :
         JALE        $               < ???
         STA         PASIZ           < ET PAS EN 'Z'...
         FLT
         FMP         FWORK           < ET CALCUL DE PASIX*PASIY*PASIZ, SOIT LE
                                     < VOLUME DE LA PLUS GRANDE MAILLE INITIALE,
         BSR         ARAK
         #/FST#      FPOND0          < LA PONDERATION INITIALE DES FONCTIONS
                                     < ALEATOIRES EST EN FAIT LA TAILLE DE LA
                                     < MAILLE...
<
< INITIALISATION DU REDUC-
< TEUR RECURSIF :
<
         #/FLD#      EXPOP0
         #/FST#      EXPOP
<
< MISE EN PLACE DE LA
< SOURCE DE LA FONCTION :
<
         LRM         A
         WORD        FONCT           < (A)=ADRESSE DU SOUS-PROGRAMME DE CALCUL
                                     <     DE LA FONCTION ALEATOIRE RECURSIVE
                                     <     A PRIORI...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST CI-DESSOUS EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IBANDE          < EN FAIT DOIT-ON LIRE UNE BANDE ???
         JE          INIT10          < NON...
         LRM         A               < OUI :
         WORD        NIVO            < (A)=ADRESSE DU SOUS-PROGRAMME DE RECUPE-
                                     <     RATION DES VALEURS DE LA FONCTION
                                     <     SUR BANDE...
         LBI         NEXIST          < DANS LE CAS D'UNE ENTREE PAR BANDE, ON
                                     < NE PEUT PAS RECALCULER LE CHAMP PAR
                                     < 'AFONCT' POUR CALCULER L'ECLAIRAGE ET
                                     < LES OMBRES PORTEES, CAR CELA FERAIT
                                     < TROP DE MOUVEMENTS DE BANDES ; ON INHIBE
                                     < DONC CES FONCTIONS, EN NE FAISANT QUE DU
                                     < "DEPTH-CUEING"...
         STB         INEW
         STB         IECL
INIT10:  EQU         $
         STA         AFONCT          < ET MISE EN PLACE DU RELAI D'ACCES A LA
                                     < FONCTION...
<
< INITIALISATION DU GESTIONNAIRE
< DE BANDES MAGNETIQUES (A PRIORI) :
<
         LA          ABLOC0
         JAL         INIT21          < ON FERA DU SEQUENTIEL STRICT...
         STA         DEMMT+ARGESC    < ADRESSE DU PREMIER BLOC A LIRE,
INIT21:  EQU         $
         LA          ZBUFMT
         STA         IBUFMT          < POUR FORCER LA PREMIERE LECTURE...
<
< PREPARATION A PRIORI DE LA
< MODULATION DU "DEPTH-CUEING" :
<
         #/FLD#      FH              < FH,
         FMP         FNIVMX          < 255*FH,
         #/FST#      FHP
         #/FLD#      FNIVMX          < 255,
         FSB         FHP             < 255-FHP,
         FDV         FNIVMX          < (255-FHP)/255,
         #/FST#      F255MH          < QUE L'ON MEMORISE SANS VALIDATION...
<
<
<        I N I T I A L I S A T I O N   D E S   M A I L L A G E S  :
<
<
GEN200:  EQU         $
         LA          MRECUR          < VALIDATION DE 'MRECUR' :
         JALE        GEN201          < MAUVAIS...
         CPI         MAXREC          < ALORS ???
         JLE         GEN202          < OK...
GEN201:  EQU         $
         QUIT        XXQUIT          < E R R E U R   U T I L I S A T E U R ...
         JMP         GEN200          < ET ON RE-VALIDE...
GEN202:  EQU         $
<
< INITIALISATIONS :
<
         LA          PASIX
         FLT
         #/FST#      FPASIX          < 'PASIX',
         LA          PASIY
         FLT
         #/FST#      FPASIY          < 'PASIY',
         LA          PASIZ
         FLT
         #/FST#      FPASIZ          < 'PASIZ'.
         #/FLD#      FPOND0
         #/FST#      FPOND           < 'FPOND'.
<
< REDUCTION RECURSIVE DU MAILLAGE :
<
         LXI         K               < (X)=INDEX DE RECURSION...
GEN210:  EQU         $
         PSR         X
         LR          X,Y             < (Y)=INDEX ENTIER,
         ADR         X,X             < PASSAGE A UN INDEX FLOTTANT...
         #/FLD#      FPOND
         FST         &ALPOND         < 'LPOND',
         BSR         ARAK            < EXPONENTIATION,
         #/FST#      FPOND           < ET REDUCTION...
         #/FLD#      FPASIX
         FST         &ALPASX         < 'PASIX' FLOTTANT,
         PSR         A,B,X
         LR          Y,X
         BSR         AROND
         STA         &ALPSIX         < 'PASIX' ENTIER.
         PLR         A,B,X
         BSR         ARAK            < EXPONENTIATION,
         #/FST#      FPASIX          < ET REDUCTION...
         #/FLD#      FPASIY
         FST         &ALPASY         < 'PASIY' FLOTTANT,
         PSR         A,B,X
         LR          Y,X
         BSR         AROND
         STA         &ALPSIY         < 'PASIY' ENTIER.
         PLR         A,B,X
         BSR         ARAK            < EXPONENTIATION,
         #/FST#      FPASIY          < ET REDUCTION...
         #/FLD#      FPASIZ
         FST         &ALPASZ         < 'PASIZ' FLOTTANT,
         PSR         A,B,X
         LR          Y,X
         BSR         AROND
         STA         &ALPSIZ         < 'PASIZ' ENTIER.
         PLR         A,B,X
         BSR         ARAK            < EXPONENTIATION,
         #/FST#      FPASIZ          < ET REDUCTION...
         FAD         FPASIY
         FAD         FPASIX
         BSR         AROND           < (A)=PASIX+PASIY+PASIZ,
         PLR         X               < RESTAURE L'INDEX DE RECURSION...
         ADRI        I,X             < PASSAGE A LA RECURSION SUIVANTE...
         CPI         W+W+W           < EST-ON ARRIVE A UNE MAILLE IRREDUCTIBLE,
                                     < SOIT ELEMENTAIRE (1*1*1) ???
         JE          GEN220          < OUI, ON ARRETE LA...
         LR          X,A             < NON,
         CP          MRECUR          < MAIS A-T'ON ATTEINT LE MAXIMUM ???
         JL          GEN210          < NON, ON CONTINUE...
GEN220:  EQU         $
         STX         NRECUR          < MISE EN PLACE DU 'NRECUR' A UTILISER...
<
< CALCUL DU FACTEUR DE
< RENORMALISATION DE LA
< FONCTION ALEATOIRE :
<
         LR          X,A             < (A)='NRECUR',
         FLT                         < QUE L'ON FLOTTE...
         FAD         KAMPLI
         FSB         F1
         FDV         KAMPLI
         #/FST#      AMPLI           < (AMPLI)=(NRECUR+30)/31...
         #/FLD#      F0              < INITIALISATION DU SIGMA DES 'FPOND',
GEN410:  EQU         $
         PSR         X
         ADRI        -IJIJDX,X
         ADR         X,X             < PASSAGE A UN INDEX FLOTTANT...
         FAD         &ALPOND         < CALCUL DE SIGMA(FPOND),
         PLR         X
         JDX         GEN410          < AU SUIVANT...
         FDV         AMPLI
         FDV         AMPLIR
         #/FST#      RENORM          < RENORM=SIGMA(FPOND)/(AMPLI*AMPLIR).
<
< INITIALISATION DE L'EVENTUEL
< CALCUL DES DERIVEES :
<
GEN950:  EQU         $
         LA          PASDER          < (A)=PAS DE DERIVATION COURANT :
         JALE        GEN951          < ERREUR...
         CPI         PASMAX
         JLE         GEN952          < OK, LE PAS EST VALIDE...
GEN951:  EQU         $
         QUIT        XXQUIT          < E R R E U R   D E   P A R A M E T R E ...
         JMP         GEN950          < ET ON REDEMANDE...
GEN952:  EQU         $
         LAD         ALIGM1-Z        < (A)=ADRESSE-1 DU PREMIER RELAI,
         AD          PASDER          < (A)=ADRESSE DU RELAI D'ACCES A LA LIGNE
                                     <     UTILISEE POUR DERVIVER PAR RAPPORT
                                     <     A 'Y',
         STA         AALIGM          < ET MISE EN PLACE DU RELAI DE RELAI DE
                                     < DERIVATION PAR RAPPORT A 'Y'...
         LAD         ALJGM1-Z        < (A)=ADRESSE-1 DU PREMIER RELAI,
         AD          PASDER          < (A)=ADRESSE DU RELAI D'ACCES A LA LJGNE
                                     <     UTILISEE POUR DERVIVER PAR RAPPORT
                                     <     A 'Y',
         STA         AALJGM          < ET MISE EN PLACE DU RELAI DE RELAI DE
                                     < DERIVATION PAR RAPPORT A 'Y'...
<
< VALIDATION DES DEMANDES
< D'OMBRES PORTEES :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
         CPZ         IOMBRE          < A-T'ON DEMANDE LES OMBRES PORTEES ???
         JE          GEN490          < NON, RIEN A VALIDER...
GEN491:  EQU         $
         FCMZ        FZL             < OUI, DANS CE CAS, ON FAIT LES HYPOTHESES
                                     < SUIVANTES :
                                     < 1 - ON TRACE DE DROITE A GAUCHE,
                                     < 2 - LA SOURCE LUMINEUSE 'S' EST A DROITE
                                     < DE LA SURFACE (XL > XMAX), PUISQU'ON
                                     < TRACE DE DROITE A GAUCHE, ET DANS LE
                                     < PLAN DE PROJECTION (ZL=0) POUR SIMPLIFIER
                                     < LES CALCULS (EN FAIT ON VA MEME LA SUP-
                                     < POSER A L'INFINI, EN IGNORANT SYLTEMATI-
                                     < QUEMENT LA TROISIEME COORDONNEE DU RAYON
                                     < LUMINEUX...).
         JNE         GEN492          < ERREUR : 'ZL' EST NON NUL !!!
         #/FLD#      FXL
         BSR         AROND
         CP          VECTNC
         JG          GEN490          < OK, LA SOURCE LUMINEUSE EST A DROITE DE
                                     < LA SURFACE...
GEN492:  EQU         $
         QUIT        XXQUIT          < ERREUR SUR LA SOURCE LUMINEUSE, ON
                                     < REDEMANDE LES PARAMETRES...
         JMP         GEN491          < ET ON REVALIDE...
GEN490:  EQU         $
         #/FLD#      FYL             < VALIDATION DE 'YL' :
         BSR         AROND
         CP          VECTNL          < LA SOURCE LUMINEUSE DOIT ETRE AU-DESSUS
                                     < DE L'IMAGE POUR DEUX RAISONS :
                                     < 1 - ON VA FAIRE DES DIVISIONS PAR Y0-YL,
                                     < QUI NE DOIT DONC PAS ETRE NUL,
                                     < 2 - ON VEUT QUE LES RAYONS LUMINEUX
                                     < COUPENT SOIT LE BORD DROIT, SOIT LE
                                     < BORD SUPERIEUR DE L'IMAGE...
         JLE         GEN492          < ERREUR...
GEN441:  EQU         $
         LA          NPENOM          < (A)=LARGEUR DE LA ZONE DE PENOMBRE :
         JAG         GEN440          < OK, ELLE EST STRICTEMENT POSITIVE...
         QUIT        XXQUIT          < E R R E U R ...
         JMP         GEN441          < ET ON RE-VALIDE...
GEN440:  EQU         $
         FLT
         #/FST#      FWORK
         #/FLD#      FNIVLU          < FNIVLU,
         FSB         FNIVOM          < FNIVLU-FNIVOM,
         #/FST#      TNIVOM          < TNIVOM=FNIVLU-FNIVOM,
         FDV         FWORK           < (FNIVLU-FNIVOM)/NPENOM,
         #/FST#      FPENOM          < FPENOM=(FNIVLU-FNIVOM)/NPENOM.
<
< INITIALISATION DE L'ECLAIRAGE :
<
         #/FLD#      FNIVLU
         #/FST#      FNIVEC          < ON INITIALISE A PRIORI 'FNIVEC' POUR
                                     < LE CAS OU L'OMBRAGE N'EST PAS DEMANDE...
         #/FLD#      FXL             < XL,
         FDV         FYL             < XL/YL,
         #/FST#      FPENTM          < SOIT L'INVERSE DE LA PENTE "MOYENNE"
                                     < DES RAYONS LUMINEUX...
<
< INITIALISATION DU TRANSLATEUR
< DE LA FONCTION 'RDN' :
<
         LAI         K               < (A)=TRANSLATION NULLE A PRIORI...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         INEW            < NOUVELLE OU ANCIENNE METHODE ???
         JE          GEN501          < ANCIENNE : LA TRANSLATION EST NULLE...
         LA          ICOUCH          < NOUVELLE : LA TRANSLATION EST LA CONS-
                                     < TANTE DE SEUIL DE DEFINITION DE LA
                                     < SURFACE (TRANSITION ENTRE L'EXTERIEUR
                                     < ET L'INTERIEUR...),
GEN501:  EQU         $
         STA         TCOUCH          < MISE EN PLACE DE LA TRANSLATION...
<
<
<        G E N E R A T I O N   D E   L ' I M A G E  :
<
<
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'.
<
< INITIALISATION DES
< CONDITIONS DE TRACE :
<
GEN69N:  EQU         $
<
<
<        G E N E R A T I O N   D U   C H A M P   A L E A T O I R E  :
<
<
         LA          AZMIN
         LR          A,W             < (W)=COORDONNEE 'Z' ; A NOTER L'INITIALI-
                                     <     SATION RENDUE NECESSAIRE PAR LA
                                     <     VISUALISATION "DEPTH-CUEING"...
<
< BALAYAGE EN 'Z' :
<
GEN900:  EQU         $
<
< INITIALISATION DES OMBRES PORTEES :
<
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IOMBRE          < Y-A-T'IL DES OMBRES PORTEES ???
         JE          GEN970          < NON...
         IF          LCOTEV-LCOTEH,,XEIF%,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         LRM         X               < OUI :
         WORD        LCOTEV?LCOTEH   < (X)=NOMBRE DE MOTS A INITIALISER,
         LAI         K-I             < (A)=VALEUR D'INITIALISATION (NEGATIVE).
GEN971:  EQU         $
         STA         &XCOTEH         < CLEAR LE COTE SUPERIEUR DE L'IMAGE,
         STA         &XCOTEV         < CLEAR LE COTE DROIT DE L'IMAGE.
         JDX         GEN971          < ET SUITE...
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         INEW            < EST-CE LA NOUVELLE METHODE ???
         JE          GEN970          < NON, L'ANCIENNE...
         IF          LKOTEV-LKOTEH,,XEIF%,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         LRM         X               < OUI :
         WORD        LKOTEV?LKOTEH   < (X)=NOMBRE DE MOTS A INITIALISER,
                                     < (A)=VALEUR D'INITIALISATION (NEGATIVE).
GEN97A:  EQU         $
         STA         &XKOTEH         < CLEAR LE KOTE SUPERIEUR DE L'IMAGE,
         STA         &XKOTEV         < CLEAR LE KOTE DROIT DE L'IMAGE.
         JDX         GEN97A          < ET SUITE...
GEN970:  EQU         $
<
< PREPARATION DU BALAYAGE EN 'Y' :
<
         LY          VECTNL          < (Y)=COORDONNEE 'Y'.
                                     < NOTA : ON FAIT DECROITRE LES 'Y' AFIN
                                     < DE PERMETTRE LE CALCUL SIMPLE DES
                                     < OMBRES PORTEES...
<
< BALAYAGE EN 'Y' :
<
GEN01:   EQU         $
<
< INITIALISATION DU BUFFER
< DES NIVEAUX DE LIGNE :
<
         LRM         X
         WORD        LLISTN          < (X)=NOMBRE DE MOTS A NETTOYER...
GEN700:  EQU         $
         STZ         &ALISTX         < NETTOYAGE DE LA LISTE DES NIVEAUX DE
                                     < GRIS DE LA LIGNE COURANTE...
         JDX         GEN700
GEN720:  EQU         $
<
< PREPARATION DU BALAYAGE EN 'X' :
<
         LA          &AALIGM
         STA         ALIGM           < MISE EN PLACE DU BUFFER COURANT DE
                                     < DERIVATION PAR RAPPORT A 'Y'...
         LA          &AALJGM
         STA         ALJGM           < MISE EN PLACE DU BUFFER COURANT DE
                                     < DERIVATION PAR RAPPORT A 'Y'...
         LX          AXMIN           < (X)=COORDONNEE 'X'.
<
< BALAYAGE EN 'X' :
<
GEN02:   EQU         $
         BSR         AFONCT          < (A,B)=RDN(X,Y,Z).
         FIX
         IF          DFLOT-XXXMOY,,XEIF%,
         IF          ATTENTION : LES 'ADR' VONT MERDER !!!
XEIF%:   VAL         ENDIF
         SB          TCOUCH          < ON TRANSLATE EVENTUELLEMENT...
         STA         &ALIG           < ET ON MEMORISE RDN(X,Y,Z) DANS LA LIGNE
                                     < COURANTE...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT VA MERDER !!!
XEIF%:   VAL         ENDIF
         CPZ         INEW            < EST-CE LA NOUVELLE METHODE ???
         JE          GEN500          < NON, L'ANCIENNE...
         ADRI        I,W             < OUI, LA NOUVELLE, PASSAGE AU PLAN 'Z'
                                     < SUIVANT...
         BSR         AFONCT          < (A,B)=RDN(X,Y,Z+1).
         FIX
         IF          DFLOT-XXXMOY,,XEIF%,
         IF          ATTENTION : LES 'ADR' VONT MERDER !!!
XEIF%:   VAL         ENDIF
         SB          TCOUCH          < ON TRANSLATE...
         STA         &ALJG           < ET ON MEMORISE RDN(X,Y,Z+1) DANS LA LJGNE
                                     < COURANTE...
         ADRI        -I,W            < RETOUR AU PLAN 'Z' COURANT...
GEN500:  EQU         $
         ADRI        I,X             < PROGRESSION SUR LA LIGNE :
         LR          X,A
         CP          VECTNC          < EST-ON AU BOUT ???
         JLE         GEN02           < NON...
<
<
<        G E N E R A T I O N   D U   R E L I E F  :
<
<
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         INEW            < EST-CE L'ANCIENNE OU LA NOUVELLE
                                     < METHODE ???
         JNE         GEN550          < LA NOUVELLE...
         BSR         AGOTO
         WORD        GEN551          < L'ANCIENNE...
<
<
<        N O U V E L L E   M E T H O D E  :
<
<
GEN550:  EQU         $
<
< INITIALISATION DU DETECTEUR
< DE TRANSITIONS A DROITE :
<
         LA          FANT0
         STA         FANTZ           < POUR LE PLAN 'Z',
         STA         FANTZ1          < ET LE PLAN 'Z+1'...
<
< INITIALISATION DU
< BALAYAGE LIGNE :
<
         LX          VECTNC          < (X)=ABSCISSE COURANTE.
         STY         VECGY1          < INITIALISATION DE L'ORDONNEE DES
         STY         VECGY2          < SEGMENTS HORIZONTAUX A TRACER.
<
< BALAYAGE LIGNE :
<
GEN510:  EQU         $
         LR          Y,A             < (A)=ORDONNEE COURANTE :
         SB          VECTNL
         NGR         A,A
         CP          PASDER          < EST-ON SUR LES PREMIERES LIGNES ???
         JGE         GEN219          < NON, ON PEUT GENERER LE RELIEF...
         BSR         AGOTO
         WORD        GEN50           < OUI, ATTENDONS LA LIGNE SUIVANTE...
                                     < (MAIS ROTATION DES BUFFERS DE LIGNE
                                     < MALGRE TOUT...)
GEN219:  EQU         $
         LA          &ALIG           < (A)=RDN(X,Y,Z)-ICOUCH.
         JAGE        GEN511          < ON EST A L'INTERIEUR...
<
< CAS OU ON EST A L'EXTERIEUR
< DE LA SURFACE POUR LE PLAN 'Z' :
<
         CPZ         FANTZ           < EST-CE UN PASSAGE PAR 0 DE LA FONCTION
                                     < RDN(X,Y,Z)-ICOUCH ???
         JL          GEN517          < NON...
<
< CAS D'UN PASSAGE PAR 0 (INTERIEUR --> EXTERIEUR)
< DE LA FONCTION RDN(X,Y,Z)-ICOUCH :
<
         STX         VECGX1          < MISE EN PLACE DE L'ABSCISSE "GAUCHE"...
         BSR         APNIVO          < ET CALCUL DE :
                                     < (A,B)=NIVEAU(X,Y,Z),
         #/FST#      INTENG          < CE QUI DONNE L'INTENSITE "GAUCHE",
         BSR         APLIST          < ET MISE DANS LISTN(X)...
         CPZ         FANTZ1          < MAIS EN FAIT, N'EST-ON PAS CACHE PAR
                                     < LE PLAN 'Z+1' ???
         JGE         GEN530          < OUI, CAR ON EST A L'INTERIEUR DE LA
                                     < SURFACE DANS LE PLAN 'Z+1'...
         BSR         ASEGH           < NON, TRACE DU SEGMENT HORIZONTAL
                                     < COURANT...
GEN530:  EQU         $
         JMP         GEN512          < VERS LE POINT HORIZONTAL PRECEDENT...
<
< CAS DES POINTS A L'EXTERIEUR
< DE LA SURFACE POUR LE PLAN 'Z'
< SANS PASSAGE PAR 0 :
<
GEN517:  EQU         $
         JMP         GEN512          < ON LES IGNORE, VERS LE PASSAGE AU POINT
                                     < PRECEDENT SUR LA LIGNE...
<
< CAS OU ON EST A L'INTERIEUR :
< DE LA SURFACE POUR LE PLAN 'Z' :
<
GEN511:  EQU         $
         CPZ         FANTZ           < EST-CE UN PASSAGE PAR 0 DE LA FONCTION
                                     < RDN(X,Y,Z)-ICOUCH ???
         JGE         GEN513          < NON, ALLONS VOIR LE PLAN 'Z+1'...
<
< CAS D'UN PASSAGE PAR 0 (EXTERIEUR --> INTERIEUR)
< DE LA FONCTION RDN(X,Y,Z)-ICOUCH :
<
         STX         VECGX2          < MISE EN PLACE DE L'ABSCISSE "DROITE".
         BSR         APNIVO          < (A,B)=NIVEAU(X,Y,Z),
         #/FST#      INTEND          < ET MISE EN PLACE DE L'INTENSITE
                                     < "DROITE",
         BSR         APLIST          < ET MISE DANS LISTN(X)...
         JMP         GEN512          < PUIS VERS LE PASSAGE AU POINT HORIZONTAL
                                     < PRECEDENT...
<
< CAS DES POINTS INTERIEURS
< A LA SURFACE POUR LE PLAN 'Z'
< SANS PASSAGE PAR 0 :
<
GEN513:  EQU         $
         LA          &ALJG           < (A)=RDN(X,Y,Z+1)-ICOUCH.
         JAGE        GEN514          < ON EST A L'INTERIEUR DE LA SURFACE POUR
                                     < LE PLAN 'Z+1'...
<
< CAS DES POINTS A L'EXTERIEUR
< DE LA SURFACE POUR LE PLAN 'Z+1' :
<
         CPZ         FANTZ1          < EST-CE UN PASSAGE PAR 0 DE LA FONCTION
                                     < RDN(X,Y,Z+1)-ICOUCH ???
         JL          GEN516          < NON...
<
< CAS DES PASSAGES PAR 0 (INTERIEUR --> EXTERIEUR)
< DE LA FONCTION RDN(X,Y,Z+1)-ICOUCH :
<
         BSR         AOMBRE          < GESTION DES OMBRES PORTEES DANS LE
                                     < PLAN 'Z'...
         STX         VECGX2          < MISE EN PLACE DE L'ABSCISSE "DROITE".
         BSR         APNJVO          < (A,B)=NIVEAU(X,Y,Z+1),
         #/FST#      INTEND          < ET MISE EN PLACE DE L'INTENSITE
                                     < "DROITE",
         BSR         APLIST          < ET MISE DANS LISTN(X)...
         JMP         GEN512          < ET PASSAGE AU POINT HORIZONTAL PRECEDENT.
<
< CAS DES POINTS EXTERIEURS A
< LA SURFACE SUR LE PLAN 'Z+1'
< SANS PASSAGE PAR 0
<
GEN516:  EQU         $
         BSR         APNIVO          < CALCUL SYSTEMATIQUE DU NIVEAU DES POINTS
                                     < INTERIEURS A LA SURFACE DANS LE PLAN 'Z'
                                     < ET EXTERIEURS POUR LE PLAN 'Z+1',
         BSR         APLIST          < ET MISE DANS LISTN(X)...
         JMP         GEN512          < PUIS PASSAGE AU POINT HORIZONTAL
                                     < PRECEDENT...
<
< CAS DES POINTS A L'INTERIEUR DE
< LA SURFACE POUR LE PLAN 'Z+1' :
<
GEN514:  EQU         $
         BSR         AOMBRE          < GESTION DES OMBRES PORTEES DANS LE
                                     < PLAN 'Z'...
         CPZ         FANTZ1          < EST-CE UN PASSAGE PAR 0 DE LA FONCTION
                                     < RDN(X,Y,Z+1)-ICOUCH ???
         JGE         GEN515          < NON...
<
< CAS DES PASSAGES PAR 0 (EXTERIEUR --> INTERIEUR)
< DE LA FONCTION RDN(X,Y,Z+1)-ICOUCH :
<
         STX         VECGX1          < MISE EN PLACE DE L'ABSCISSE "GAUCHE".
         BSR         APNJVO          < (A,B)=NIVEAU(X,Y,Z+1),
         #/FST#      INTENG          < ET MISE EN PLACE DE L'INTENSITE
                                     < "GAUCHE",
         BSR         APLIST          < ET MISE DANS LISTN(X)...
         BSR         ASEGH           < ET TRACE DU SEGMENT HORIZONTAL COURANT...
         JMP         GEN512          < PUIS PASSAGE AU POINT HORIZONTAL
                                     < PRECEDENT...
<
< CAS DES POINTS A L'INTERIEUR DE
< LA SURFACE POUR LE PLAN 'Z+1'
< SANS PASSAGE PAR 0 :
<
GEN515:  EQU         $
         BSR         AQMBRE          < GESTION DES OMBRES PORTEES DANS LE
                                     < PLAN 'Z+1'...
<
< CHANGEMENT DE POINT SUR LA LIGNE :
<
GEN512:  EQU         $
         LA          &ALIG
         STA         FANTZ           < MEMORISATION DE RDN(X,Y,Z)-ICOUCH,
         LA          &ALJG
         STA         FANTZ1          < ET DE RDN(X,Y,Z+1)-ICOUCH AVANT DE PASSER
                                     < AU POINT PRECEDENT SUR LA LIGNE...
         ADRI        -I,X            < PASSAGE AU POINT PRECEDENT,
         LR          X,A
         SB          AXMIN
         CP          PASDER          < EST-ON EN DEBUT DE LIGNE ???
         JGE         GEN510          < NON, ON POURSUIT L'EXPLORATION...
<
< CAS DU BOUT GAUCHE
< DE LA LIGNE :
<
         CPZ         FANTZ1          < OU EST-ON PAR RAPPORT A LA SURFACE DANS
                                     < LE PLAN 'Z+1' ???
         JGE         GEN521          < A L'INTERIEUR, RIEN D'AUTRE A FAIRE...
         CPZ         FANTZ           < A L'EXTERIEUR, ALORS OU EST-ON PAR
                                     < RAPPORT A LA SURFACE DANS LE PLAN 'Z' ???
         JL          GEN521          < A L'EXTERIEUR, RIEN A FAIRE...
<
< CAS OU L'ON EST A L'INTERIEUR
< DE LA SURFACE DANS LE PLAN 'Z' ET
< A L'EXTERIEUR DANS LE PLAN 'Z+1' :
<
         ADRI        I,X             < RETOUR SUR LE POINT D'EXTREMITE GAUCHE...
         STX         VECGX1          < MISE EN PLACE DE L'ABSCISSE "GAUCHE"...
         BSR         APNIVO          < ET CALCUL DE :
                                     < (A,B)=NIVEAU(X,Y,Z),
         #/FST#      INTENG          < CE QUI DONNE L'INTENSITE "GAUCHE",
         BSR         APLIST          < ET MISE DANS LISTN(X)...
         BSR         ASEGH           < ET TRACE DU DERNIER SEGMENT HORIZONTAL...
<
< FIN DE LA NOUVELLE METHODE :
<
GEN521:  EQU         $
         BSR         AGOTO
         WORD        GEN50           < VERS LA ROTATION DES BUFFERS DE
                                     < LIGNE...
<
<
<        A N C I E N N E   M E T H O D E  :
<
<
GEN551:  EQU         $
         LX          VECTNC          < ON COMMENCE SUR LE PREMIER POINT, MAIS
                                     < ATTENTION, ON NE FINIT PAS SUR LE PREMIER
                                     < AFIN DE POUVOIR SYSTEMATIQUEMENT TRAITER
                                     < UN TRIANGLE DU TYPE :
                                     < (A(X,Y),B(X-I,Y),C(X,Y-I)).
GEN30:   EQU         $
         LA          &ALIG           < (A)=RDN(X,Y,Z)...
<
< DEFINITION DE LA SURFACE :
<
         CP          ICOUCH          < EST-ON A L'INTERIEUR OU A L'EXTERIEUR ???
                                     < LA SURFACE ET SON INTERIEUR EST L'EN-
                                     < SEMBLE DES POINTS (X,Y,Z) TELS QUE :
                                     < RDN(X,Y,Z) > (ICOUCH)...
         JL          GEN913          < ON EST A L'EXTERIEUR, RIEN A MARQUER...
         CP          ECOUCH          < EST-ON DANS L'EPAISSEUR ???
         JG          GEN913          < NON, DONC RIEN A MARQUER...
<
< CHOIX DU MODE DE REPRESENTATION :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT VA MERDER !!!
XEIF%:   VAL         ENDIF
         CPZ         IECL            < ALORS QUE FAIT-ON ???
         JE          GEN902          < DU "DEPTH-CUEING"...
<
< CAS DE L'ECLAIRAGE :
<
         LR          Y,A             < (A)=ORDONNEE COURANTE :
         SB          VECTNL
         NGR         A,A
         CP          PASDER          < EST-ON SUR LES PREMIERES LIGNES ???
         JGE         GEN21           < NON, ON PEUT GENERER LE RELIEF...
         BSR         AGOTO
         WORD        GEN50           < OUI, ATTENDONS LA LIGNE SUIVANTE...
                                     < (MAIS ROTATION DES BUFFERS DE LIGNE
                                     < MALGRE TOUT...)
GEN913:  EQU         $
         BSR         AGOTO
         WORD        GEN313          < CAS DES POINTS (X,Y,Z) EXTERIEURS A LA
                                     < SURFACE...
GEN902:  EQU         $
         BSR         AGOTO
         WORD        GEN702          < CAS DU "DEPTH-CUEING" SEUL...
GEN946:  EQU         $
         BSR         AGOTO
         WORD        GEN972          < CAS OU IL N'Y A PAS D'OMBRES PORTEES...
GEN21:   EQU         $
<
< TEST DES OMBRES PORTEES :
<
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IOMBRE          < FAUT-IL LES OMBRES PORTEES ???
         JE          GEN946          < NON, ET 'FNIVEC' EST BON...
<
< OUI, CALCUL DES OMBRES PORTEES :
<
         BSR         AOMBRE          < CALCUL DES OMBRES PORTEES DANS LE
                                     < PLAN 'Z'...
GEN972:  EQU         $
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         #/FLD#      FNIVMX          < (A,B)=VALEUR MAXIMALE DE L'ECLAI-
                                     <       RAGE AU CAS OU IL N'Y AURAIT PAS
                                     <       DE "DEPTH-CUEING"...
         CPZ         IECLDC          < Y-A-T'IL DU "DEPTH-CUEING" AVEC L'ECLAI-
                                     < RAGE ???
         JE          GEN980          < NON...
         BSR         APNIVC          < OUI :
                                     < (A,B)=NIVEAU MAXIMAL D'ECLAIRAGE FONC-
                                     <       DE LA COORDONNEE 'Z'.
GEN980:  EQU         $
         FMP         FNIVEC          < MODULATION PAR L'OMBRAGE EVENTUEL,
         #/FST#      FNIVC           < CE QUI DONNE LE NIVEAU MAXIMAL DE
                                     < L'ECLAIRAGE...
<
< CALCUL DE LA NORMALE EN (X,Y,Z) :
<
         LA          &ALIG           < (A)=F(X,Y,Z).
<
< CALCUL DE LA NORMALE
< AU POINT COURANT (X,Y,Z) :
<
<
<        NOTA :
<                      LA SURFACE "FRACTALE" EST
<                    DEFINIE A L'AIDE DE LA FONCTION
<                    ALEATOIRE 'RDN(X,Y,Z)' CALCULEE
<                    DANS LE MODULE 'FONCT' ; LES
<                    POINTS DE LA SURFACE SONT DONC
<                    LES POINTS (X,Y,Z) TELS QUE :
<
<                                    RDN(X,Y,Z)=C, OU 'C' EST UNE CONSTANTE
<                                    DONNEE ('ICOUCH').
<
<                    L'EQUATION DE LA SURFACE EN
<                    IMPLICITE EST DONC :
<
<                                    F(X,Y,Z)=RDN(X,Y,Z)-C=0,
<
<                    SA NORMALE EN CHAQUE POINT EST
<                    DONC DEFINIE PAR LE VECTEUR DE
<                    COORDONNEES :
<
<                                    (DF/DX,DF/DY,DF/DZ).
<
<                    LES DERIVEES PARTIELLES VONT ETRE
<                    APPROXIMEES PAR LES FORMULES SUI-
<                    VANTES :
<
<                                    DF/DX=(F(X,Y,Z)-F(X-P,Y,Z))/P,
<                                    DF/DY=(F(X,Y+P,Z)-F(X,Y,Z))/P,
<                                    DF/FZ=(F(X,Y,Z)-F(X,Y,Z-P))/P,
<
<                    CAR EN EFFET ON SUPPOSE UN ACCROIS-
<                    SEMENT DE LA VARIABLE DE DERIVATION
<                    EGAL A 'P'...
<
<                    SOIT, PAR DEFINITION DE 'F' :
<
<                                    DF/DX=(RDN(X,Y,Z)-RDN(X-P,Y,Z))/P,
<                                    DF/DY=(RDN(X,Y+P,Z)-RDN(X,Y,Z))/P,
<                                    DF/DZ=(RDN(X,Y,Z)-RDN(X,Y,Z-P),
<
<                    ET, PAR CHANGEMENT D'ECHELLE (CE
<                    QUI N'EST PAS GRAVE PUISQUE L'ON
<                    "NORMALISERA" LA NORMALE) :
<
<                                    DF/DX=RDN(X,Y,Z)-RDN(X-P,Y,Z),
<                                    DF/DY=RDN(X,Y+P,Z)-RDN(X,Y,Z),
<                                    DF/DZ=RDN(X,Y,Z)-RDN(X,Y,Z-P).
<
         PSR         X               < SAUVEGARDE DE LA COORDONNEE 'X'...
         LB          PASDER
         SBR         B,X
         SB          &ALIG           < F(X,Y,Z)-F(X-P,Y,Z),
         PLR         X               < RESTAURATION DU 'X' COURANT...
         FLT
         #/FST#      FXN             < CE QUI DONNE LA PREMIERE COORDONNEE
                                     < DU VECTEUR NORMAL.
         LA          &ALIGM          < F(X,Y+P,Z),
         SB          &ALIG           < F(X,Y+P,Z)-F(X,Y,Z),
         FLT
         #/FST#      FYN             < CE QUI DONNE LA SECONDE COORDONNEE
                                     < DU VECTEUR NORMAL.
         PSR         W               < ET SAUVEGARDE DE LA COORDONNEE 'Z'...
         LB          PASDER          < PASSAGE AU PLAN PRECEDENT (Z-P),
         SBR         B,W             < Z-P,
         BSR         AFONCT          < RDN(X,Y,Z-P),
         FIX
         SB          TCOUCH          < F(X,Y,Z-P),
         PLR         W               < RESTAURATION DU 'Z' COURANT...
         SB          &ALIG           < F(X,Y,Z-P)-F(X,Y,Z),
         NGR         A,A             < F(X,Y,Z)-F(X,Y,Z-P),
         FLT
         #/FST#      FZN             < CE QUI DONNE LA TROISIEME COORDONNEE
                                     < DU VECTEUR NORMAL.
         BSR         APVALN          < ET TEST DE NON-NULLITE DE LA NORMALE...
<
< CALCUL DE L'ECLAIRAGE :
<
         BSR         AINTEN          < CALCUL DE L'ECLAIRAGE AU POINT COURANT
                                     < EN FONCTION DE LA SOURCE LUMINEUSE...
         JMP         GEN981          < ET VERS LE CALCUL DU NIVEAU ET LE
                                     < TRACE...
<
< CAS DU "DEPTH-CUEING" :
<
GEN702:  EQU         $
         BSR         APNIVC          < (A,B)=NIVEAU A DONNER A TOUS LES POINTS
                                     <       DE CE PLAN.
<
< CALCUL DU NIVEAU DE TRACE :
<
GEN981:  EQU         $
         BSR         APLIST          < ET MISE DANS LISTN(X)...
GEN313:  EQU         $
<
< PASSAGE AU POINT SUIVANT :
<
GEN32:   EQU         $
         ADRI        -I,X            < REGRESSION DE L'ABSCISSSE,
         LR          X,A
         SB          AXMIN
         CP          PASDER          < EST-ON EN DEBUT DE LIGNE ???
         JL          GEN31           < OUI, ON ABANDONNE...
         BSR         AGOTO
         WORD        GEN30           < NON, ON CONTINUE LE TRACE...
GEN31:   EQU         $
<
<
<        T R A C E   D E   L A   L I G N E  :
<
<
         LX          VECTNC          < (X)=ABSCISSE COURANTE...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IINTER          < FAUT-IL INTERPOLER ???
         JE          GEN800          < NON, TRACE DIRECT DES NIVEAUX...
<
< CAS DE L'INTERPOLATION
< ENTRE LES EXTREMITES DE
< DROITE ET DE GAUCHE DE
< CHAQUE SEGMENT HORIZONTAL :
<
         STY         VECGY1          < MISE EN PLACE
         STY         VECGY2          <               DE L'ORDONNEE COURANTE...
GEN710:  EQU         $
         LBY         &ALISTN         < (A)=NIVEAU(X,Y,Z) :
         JANE        GEN711          < ON S'ARRETE SUR LE PREMIER NON NUL...
         ADRI        -I,X            < ON ELIMINE LES NULS PAR REGRESSION,
GEN715:  EQU         $
         LR          X,A
         SB          AXMIN
         CP          PASDER          < EST-ON EN DEBUT DE LIGNE ???
         JGE         GEN710          < NON, ON CONTINUE...
         JMP         GEN712          < OUI, ON A TERMINE CETTE LIGNE...
<
< TRAITEMENT D'UN SEGMENT
< HORIZONTAL :
<
GEN711:  EQU         $
         FLT
         #/FST#      INTEND          < MEMORISATION DU NIVEAU "DROITE",
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IINTMI          < VRAIE OU FAUSSE INTERPOLATION ???
         JE          GEN802          < VRAIE...
         LA          &ALIG           < (A)=RDN(X,Y,Z) A "DROITE",
         STA         FWORK           < ET SAUVEGARDE...
GEN802:  EQU         $
         STX         VECGX2          < ET DE L'ABSCISSE "DROITE"...
GEN713:  EQU         $
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IINTMI          < VRAIE OU FAUSSE INTERPOLATION ???
         JE          GEN804          < VRAIE...
         LA          &ALIG           < (A)=RDN(X,Y,Z),
         CP          FWORK           < EST-ON DANS UNE PHASE CROISSANTE DE LA
                                     < FONCTION RDN(X,Y,Z) ???
         JLE         GEN803          < NON, DECROISSANTE, 'EXTREM' EST BON
                                     < MAINTENANT, ET DONNE L'ABSCISSE DU
                                     < MAXIMUM...
         STX         EXTREM          < OUI, ON MEMORISE EN PERMANENCE L'ABSCISSE
                                     < AINSI, A LA FIN, 'EXTREM' DONNERA L'ABS-
                                     < CISSE DU MAXIMUM...
         STA         FWORK           < ET ON MEMORISE LE MAXIMUM COURANT AUSSI..
GEN803:  EQU         $
GEN804:  EQU         $
         LBY         &ALISTN         < (A)=NIVEAU(X,Y,Z) ; ON FAIT AINSI (SANS
                                     <     DECREMENTER 'X' AFIN DE PRENDRE EN
                                     <     COMPTE LES SEGMENTS FAITS D'UN SEUL
                                     <     POINT...
         JAE         GEN714          < ON S'ARRETE EN FIN DE SEGMENT HORIZONTAL.
         FLT
         #/FST#      INTENG          < MEMORISATION DU NIVEAU "GAUCHE" COURANT,
         STX         VECGX1          < ET DE L'ABSCISSE GAUCHE COURANTE...
         ADRI        -I,X            < ET REGRESSION DES ABSCISSES,
         LR          X,A
         SB          AXMIN
         CP          PASDER          < EST-ON EN DEBUT DE LIGNE ???
         JGE         GEN713          < NON, ON CONTINUE...
GEN714:  EQU         $               < OUI, IL S'AGIT AUSSI D'UNE FIN DE SEG-
                                     < MENT HORIZONTAL...
         BSR         ASEGH           < ET ON TRACE PAR INTERPOLATION LE SEGMENT
                                     < HORIZONTAL COURANT...
         JMP         GEN715          < VERS LA RECHERCHE D'UN EVENTUEL NOUVEAU
                                     < SEGMENT HORIZONTAL...
<
< CAS DU TRACE DIRECT (SANS
< INTERPOLATION) DES NIVEAUX
< CALCULES :
<
GEN800:  EQU         $
GEN801:  EQU         $
         LBY         &ALISTN         < (A)=NIVEAU(X,Y,Z),
         BSR         APOINT          < QUE L'ON MARQUE...
         ADRI        -I,X            < PASSAGE AU POINT PRECEDENT,
         LR          X,A
         SB          AXMIN
         CP          PASDER          < S'IL EXISTE...
         JGE         GEN801          < OUI...
GEN712:  EQU         $               < OUI, C'EST LA FIN...
<
< "ROTATION" DES BUFFERS DE LIGNES :
<
GEN50:   EQU         $
         LA          ALIG
XWOR%1:  VAL         $=FCTA
         XM          ALIGM1
         IF          PASMAX-1,XEIF%,XEIF%,
         XM          ALIGM2
         IF          PASMAX-2,XEIF%,XEIF%,
         XM          ALIGM3
         IF          PASMAX-3,XEIF%,XEIF%,
         XM          ALIGM4
         IF          PASMAX-4,XEIF%,XEIF%,
         XM          ALIGM5
         IF          PASMAX-5,XEIF%,XEIF%,
         XM          ALIGM6
         IF          PASMAX-6,XEIF%,XEIF%,
         XM          ALIGM7
         IF          PASMAX-7,XEIF%,XEIF%,
         XM          ALIGM8
XEIF%:   VAL         ENDIF
XWOR%2:  VAL         $=FCTA
         IF          XWOR%2-XWOR%1-PASMAX,,XEIF%,
         IF          ATTENTION : INCOHERENCE !!!
XEIF%:   VAL         ENDIF
         STA         ALIG
         LA          ALJG
XWOR%1:  VAL         $=FCTA
         XM          ALJGM1
         IF          PASMAX-1,XEIF%,XEIF%,
         XM          ALJGM2
         IF          PASMAX-2,XEIF%,XEIF%,
         XM          ALJGM3
         IF          PASMAX-3,XEIF%,XEIF%,
         XM          ALJGM4
         IF          PASMAX-4,XEIF%,XEIF%,
         XM          ALJGM5
         IF          PASMAX-5,XEIF%,XEIF%,
         XM          ALJGM6
         IF          PASMAX-6,XEIF%,XEIF%,
         XM          ALJGM7
         IF          PASMAX-7,XEIF%,XEIF%,
         XM          ALJGM8
XEIF%:   VAL         ENDIF
XWOR%2:  VAL         $=FCTA
         IF          XWOR%2-XWOR%1-PASMAX,,XEIF%,
         IF          ATTENTION : INCOHERENCE !!!
XEIF%:   VAL         ENDIF
         STA         ALJG
<
<
<        P O U R S U I T E   D E   L A   G E N E R A T I O N  :
<
<
GEN20:   EQU         $
         ADRI        -I,Y            < PASSAGE A LA LIGNE PRECEDENTE :
         LR          Y,A
         CP          AYMIN           < EST-ON AU BOUT DE L'IMAGE ???
         JL          GEN40           < OUI, C'EST FINI...
         BSR         AGOTO
         WORD        GEN01           < NON...
GEN40:   EQU         $
         ADRI        I,W             < PASSAGE A LA COUCHE SUIVANTE :
         LR          W,A
         CP          NCOUCH          < EST-ON AU BOUT DE NOS PEINES ???
         JG          GEN901          < OUI, C'EST FINI (IL DOIT ETRE BIEN
                                     < TARD...).
         BSR         AGOTO
         WORD        GEN900          < NON...
GEN901:  EQU         $
         BSR         ATSFLO
<
<
<        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,L,K           < ON REINITIALISE 'C', 'L' ET 'K' AU CAS
                                     < D'UNE RE-ENTREE PAR UN 'ALT-MODE'...
         WORD        COM+DEPBAS      < 'C',
         WORD        LOC+DEPBAS      < 'L',
         WORD        STACK-DEPILE    < 'K'.
         BSR         AGOTO
         WORD        DEBUT4          < (A)=ADRESSE D'ITERATION SUR ALT-MODE...
         PAGE
<
<
<        U P D A T E S  :
<
<
         $EQU        AMPLIR
         FLOAT       1.5             < AMPLIFICATEUR DE LA FONCTION.
         $EQU        MOYENE
         FLOAT       <NIV256/XXXMOY<K<K
                                     < VALEUR MOYENNE DE LA FONCTION.
         $EQU        EXPOP0
         FLOAT       0.5             < EXPOSANT DE DECROISSANCE DE PONDERATION.
         $EQU        PASIX0
         WORD        50              < PAS INITIAL SUR 'OX'.
         $EQU        PASIY0
         WORD        50              < PAS INITIAL SUR 'OY'.
         $EQU        PASIZ0
         WORD        50              < PAS INITIAL SUR 'OZ'.
         $EQU        MRECUR
         WORD        1               < PROFONDEUR MAXIMALE DE RECURENCE.
         $EQU        GRAINE
         WORD        4660            < GRAINE DU GENERATEUR ALEATOIRE.
         $EQU        SUPRDN
         NTRN
         WORD        XXN255/XXXMOY   < SUP(RDN).
         TRN
         $EQU        INFRDN
         NTRN
         WORD        -XXN255/XXXMOY  < INF(RDN).
         TRN
         $EQU        MAXNIV
         WORD        XXN255          < NIVEAU MAXIMAL AUTORISE...
         $EQU        MINNIV
         WORD        XXNOIR          < NIVEAU MINIMAL AUTORISE...
         $EQU        FXL
         FLOAT       1000            < X(SOURCE LUMINEUSE).	
         $EQU        FYL
         FLOAT       1000            < Y(SOURCE LUMINEUSE).
         $EQU        FZL
         FLOAT       0               < Z(SOURCE LUMINEUSE).
         $EQU        NPENOM
         WORD        8               < LARGEUR DES ZONES DE PENOMBRE.
         $EQU        PASQ
         WORD        W               < PAS DE PARCOURS DE LA SPIRALE,
         $EQU        NPM
         WORD        15              < NOMBRE DE POINTS DE CHAQUE SPIRALE.
         $EQU        XCTCDA
         WORD        TV1             < POUR ATTEINDRE L'IMAGE 'TV1'...
         $EQU        PONRDN
         FLOAT       <W<K<K          < CONTRIBUTION DE LA GENERATION ALEATOIRE,
         $EQU        PONSPI
         FLOAT       <K<K<K          < CONTRIBUTION DES SPIRALES.
         $EQU        NCOUCH
XWOR%1:  VAL         ZCOUCH-I
         WORD        XWOR%1          < NOMBRE DE COUCHES VERTICALES (Z).
         $EQU        SCOUCH
         WORD        208             < SEUIL DE DEFINITION DE LA SURFACE.
         $EQU        ECOUCH
         WORD        1000            < DEFINITION DE L'EPAISSEUR DE LA SURFACE.
                                     < (+'SCOUCH'...)
         $EQU        FCOUCH
XWOR%2:  VAL         XWOR%1+I
         NTRN
         FLOAT       <NIV256/XWOR%2<K<K
         TRN
         $EQU        PASDER
         WORD        PASMAX          < PAS DE DERIVATION.
         $EQU        TXGAUS
XWOR%1:  VAL         XC512/XXXMOY
         WORD        XWOR%1          < TRANSLATION DES COORDONNEES 'X',
         $EQU        DXGAUS
XWOR%2:  VAL         XWOR%1/XXXMOY
         FLOAT       <XWOR%2*XWOR%2<NILK<NILK
                                     < NORMALISATEUR DE (X-TX)**2.
         $EQU        TYGAUS
XWOR%1:  VAL         XL512/XXXMOY
         WORD        XWOR%1          < TRANSLATION DES COORDONNEES 'Y',
         $EQU        DYGAUS
XWOR%2:  VAL         XWOR%1/XXXMOY
         FLOAT       <XWOR%2*XWOR%2<NILK<NILK
                                     < NORMALISATEUR DE (Y-TY)**2.
         $EQU        TZGAUS
XWOR%1:  VAL         ZCOUCH/XXXMOY
         WORD        XWOR%1          < TRANSLATION DES COORDONNEES 'Z',
         $EQU        DZGAUS
XWOR%2:  VAL         XWOR%1/XXXMOY
         FLOAT       <XWOR%2*XWOR%2<NILK<NILK
                                     < NORMALISATEUR DE (Z-TZ)**2.
         $EQU        TRANMT
         FLOAT       <K<K<K          < TRANSLATION FONCTION BANDE.
         $EQU        MULTMT
         FLOAT       <W<K<K          < ECHELLE FONCTION BANDE.
         $EQU        FH
         FLOAT       <K<K<K          < "DEPTH-CUEING" MAXIMAL...
         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.