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
<
<
<        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         $
         DZS         LBUFMT/NOCMO
<
<
<        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 :
<
AMPLI:   FLOAT       <NILK<NILK<NILK < MULTIPLICATEUR 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.
NMM:     WORD        NILK            < NOMBRE DE POINTS DES SPIR-MAPS GENEREES
                                     < A PARTIR DES IMAGES 'TV1'/'TV2'.
EXPOP0:  FLOAT       <NILK<NILK<NILK < EXPOSANT DE CALCUL DES EXPONENTIELLES.
ALPHA:   FLOAT       <NILK<NILK<NILK < FACTEUR DE TENTATIVE D'ELIMINATION DES
                                     < PICS "VISUELS" PAR FILTRAGE...
PASIX0:  WORD        NILK            < PAS SUR OX,
PASIY0:  WORD        NILK            < PAS SUR OY.
GRAINE:  WORD        NILK            < GRAINE DE 'RDN'...
SUPRDN:  WORD        NILK            < SUP(RDN),
INFRDN:  WORD        NILK            < INF(RDN).
AMPLIR:  FLOAT       <NILK<NILK<NILK < AMPLIFICATEUR DES VALEURS ALEATOIRES
                                     < CORRELEES...
MAXNIV:  WORD        NILK            < MAXIMUM DES NIVEAUX TRACES,
MINNIV:  WORD        NILK            < MINIMUM DES NIVEAUX TRACES.
IERASE:  WORD        NEXIST          < EFFACER ('EXIST'), OU NON ('NEXIST')
                                     < L'ECRAN 512...
IOMBRE:  WORD        EXIST           < TRACER ('EXIST') OU PAS ('NEXIST') LES
                                     < OMBRES PORTEES...
NPENOM:  WORD        NILK            < LARGEUR DE LA ZONE DE PENOMBRE (DOIT
                                     < ETRE STRICTEMENT POSITIVE) ; SI LA VALEUR
                                     < EST 1, IL N'Y EN A PAS...
IALIAS:  WORD        NEXIST          < FAIRE ('EXIST') OU PAS ('NEXIST') UN
                                     < TRAITEMENT ANTI-ALIASING...
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...
IDEPTH:  WORD        NEXIST          < FAIRE ('EXIST') OU PAS ('NEXIST') DU
                                     < "DEPTH-CUEING" CONSISTANT A MODULER LES
                                     < NIVEAUX PAR LA PROFONDEUR DE LA SCENE...
                                     < NOTA : CETTE OPTION N'EST PRISE EN
                                     < COMPTE QUE S'IL Y A "OMBRES PORTEES",
                                     < C'EST-A-DIRE SI : (IOMBRE)='EXIST'...
TRDNX:   WORD        K               < TRANSLATION EN 'X' DU CHAMP RDN,
TRDNY:   WORD        K               < TRANSLATION EN 'Y' DU CHAMP RDN.
IRDNRC:  WORD        NEXIST          < GENERER ('EXIST') ALEATOIREMENT LE
                                     < NOMBRE D'ITERATIONS DE LA FONCTION
                                     < 'NRECUR' OU PAS ('NEXIST').
GRAINR:  WORD        NILK            < GRAINE DU GENERATEUR DE 'NRECUR'...
INFREC:  WORD        NILK            < BORNE INFERIEURE DE 'NRECUR',
SUPREC:  WORD        NILK            < BORNE SUPERIEURE DE 'NRECUR' LORSQUE
                                     < CELUI-CI EST GENERE ALEATOIREMENT...
IMODTV:  WORD        NEXIST          < MODULER ('EXIST') OU NE PAS MODULER
                                     < ('NEXIST') L'INTENSITE LUMINEUSE MAXI-
                                     < MALE PAR L'IMAGE 'TV2' ; CETTE OPTION
                                     < N'A DE SENS QUE SI (IOMBRE)='EXIST'...
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"...
IVIDEO:  WORD        NEXIST          < ECRIRE ('EXIST') L'IMAGE COURANTE SUR LE
                                     < DISQUE VIDEO OU PAS ('NEXIST').
IQUIT:   WORD        EXIST           < S'ARRETER ('EXIST') OU PAS ('NEXIST')
                                     < APRES CHAQUE IMAGE (POINT D'ARRET).
IPERS:   WORD        EXIST           < TRACER EN PERSPECTIVE ('EXIST') OU EN
                                     < VUE D'AVION ('NEXIST').
FPERSB:  FLOAT       <NILK<NILK<NILK < CONSTANTE PERMETTANT DE SIMULER UNE
                                     < "FUITE" DE LA PERSPECTIVE : EN EFFET,
                                     < ON MULTIPLIERA LES NIVEAUX CALCULES PAR
                                     < LA FONCTION :
                                     < (1-B)*Y/255+B, OU 'B' EST 'FPERSB' ; DE
                                     < PLUS, ON CHOISIRA 'B' DANS (0,1) ; AVEC
                                     < B=1, IL N'Y AURA PAS DE FUITE...
ITEXTU:  WORD        NEXIST          < DOIT-ON ('EXIST') OU PAS ('NEXIST')
                                     < TEXTURER LA MONTAGNE AVEC UNE FONCTION
                                     < ALEATOIRE RAN(X,Y,Z) ???
SCOUCH:  WORD        NILK            < SEUIL DONNANT LE NIVEAU FRONTIERE ENTRE
                                     < L'EXTERIEUR ET L'INTERIEUR DE LA SUR-
                                     < FACE ALEATOIRE.
AMPLYR:  FLOAT       <NILK<NILK<NILK < AMPLYFICATEUR DU RESULTAT FINAL.
MOYENF:  FLOAT       <NILK<NILK<NILK < VALEUR MOYENFE DU RESULTAT FINAL.
MAXREK:: VAL         MAXREC          < VALEUR MAXIMALE DE 'NREKUR'...
MREKUR:  WORD        NILK            < NOMBRE DE REKURSIONS MAXIMAL LORS DE LA
                                     < SOMMATION DES FUNCTION ALEATOIRES.
EXPOQ0:  FLOAT       <NILK<NILK<NILK < EXPOSANT DE CALCUL DES EXPONENTIELLES.
PAZIX0:  WORD        NILK            < PAZ SUR OX,
PAZIY0:  WORD        NILK            < PAZ SUR OY,
PAZIZ0:  WORD        NILK            < PAZ SUR OZ.
GRAINF:  WORD        NILK            < GRAINF DE 'RAN'...
SUPRAN:  WORD        NILK            < SUP(RAN),
INFRAN:  WORD        NILK            < INF(RAN).
TRONIV:  WORD        NEXIST          < TRONQUER BRUTALEMENT ('EXIST') OU UTILI-
                                     < SER UNE FUNCTION EN DENTS DE SCIE
                                     < ('NEXIST') POUR LES VALEURS DU CHAMP...
NFUNCT:  WORD        NEXIST          < INDICATEUR DE MODULATION DE LA FUNCTION
                                     < 'RAN' CALCULEE :
                                     < 'NEXIST' : PAZ DE MODULATION,
                                     < TOUTE AUTRE VALEUR INDEXE UNE FUNCTION
                                     < DE MODULATION TELLE 'FGAUSS'...
FGAUSS:: VAL         EXIST           < INDEX DE LA MODULATION GAUSSIENNE QUI
                                     < VA CENTRER LA GENERATION AU CENTRE DU
                                     < CUBE VISUALISE...
TRANX:   WORD        K               < TRANSLATION EN 'X' DU CHAMP RAN,
TRANY:   WORD        K               < TRANSLATION EN 'Y' DU CHAMP RAN,
TRANZ:   WORD        K               < TRANSLATION EN 'Z' DU CHAMP RAN.
IALEAT:  WORD        EXIST           < LA TEXTURE SERA-T'ELLE ALEATOIRE
                                     < ('EXIST') OU UTILISERA-T'ELLE UNE
                                     < COMBINAISON LINEAIRE DES COORDONNEES
                                     < (XS,YS,ZS) ('NEXIST'), DONT LES COEF-
                                     < FICIENTS SUIVENT :
FALTX:   FLOAT       <NILK<NILK<NILK < COEFFICIENT DE 'XS',
FALTY:   FLOAT       <NILK<NILK<NILK < COEFFICIENT DE 'YS',
FALTZ:   FLOAT       <NILK<NILK<NILK < COEFFICIENT DE 'ZS',
FALTR:   FLOAT       <NILK<NILK<NILK < CONSTANTE DE TRANSLATION.
NDM:     WORD        NILK            < NOMBRE DE POINTS DES SPIR-DEPS GENEREES
                                     < A PARTIR DES IMAGES 'TV1'/'TV2'.
FCOEFA:  FLOAT       <NILK<NILK<NILK < POUR PONDERER LA SOMME DES POINTS SUR
                                     < UNE SPIR-DEP DE DEPLACEMENT VERTICAL.
FCOEFB:  FLOAT       <NILK<NILK<NILK < POUR PONDERER LES EXPOSANTS DES EXPO-
                                     < NENTIELLES DE PONDERATION DES POINTS
                                     < D'UNE SPIR-DEP DE DEPLACEMENT VERTICAL.
IMODMT:  WORD        NEXIST          < N'A DE SENS QUE SI (IBANDE)='EXIST',
                                     < C'EST-A-DIRE SI L'ON FAIT UNE ENTREE
                                     < A PARTIR DE LA BANDE MAGNETIQUE ; ALORS,
                                     < 'IMODMT' INDIQUE SI L'ON DOIT N'UTILISER
                                     < ('NEXIST') QUE LE CONTENU DE LA BANDE,
                                     < OU BIEN ('EXIST') SI L'ON DOIT SOMMER
                                     < CE DERNIER A UNE CONTRIBUTION ALEATOIRE
                                     < ET/OU SPIRALE...
FHOMO:   FLOAT       <NILK<NILK<NILK < POUR AGRANDIR OU REDUIRE HOMOTHETIQUEMENT
                                     < LE CHAMP ALEATOIRE...
         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,
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       <W+W<K<K        < Z(N) : VAUT 2 (1+1) CAR LE VECTEUR
                                     <        NORMAL EST EN FAIT LA SOMME DE
                                     <        DEUX VECTEURS NORMAUX VOISINS...
<
< 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).
<
< BUFFER DES LIGNES CONSECUTIVES :
<
ALIGP2:  WORD        LIGP2,X         < RELAI VERS LA LIGNE SUIVANTE-SUIVANTE,
ALIGP1:  WORD        LIGP1,X         < RELAI VERS LA LIGNE SUIVANTE,
ALIG:    WORD        LIG,X           < RELAI VERS LA LIGNE COURANTE,
ALIGM1:  WORD        LIGM1,X         < RELAI VERS LA LIGNE PRECEDENTE.
<
< POUR CALCULER L'ECLAIRAGE :
<
FNIVC:   FLOAT       <NILK<NILK<NILK < NIVEAU MAXIMAL COURANT (VAUT 'FNIVMX'
                                     < OU 'FNIVMX' MOINS UNE FRACTION DE
                                     < 'FNIVOM' SUIVANT L'OMBRAGE...).
FNIVMX:  FLOAT       <XXN255<K<K
         NTRN
FNIVOM:  FLOAT       <-XXN255/XXXMOY<K<K
         TRN
FPENOM:  FLOAT       <NILK<NILK<NILK < BAISSE MAXIMALE DU NIVEAU D'ECLAIRAGE
                                     < DANS LA ZONE D'OMBRE : 'FPENOM' DONNE EN
                                     < FAIT L'INVERSE DE 'FNIVOM/NPENOM'.
FIVMX7:  FLOAT       <NIVMX7<K<K     < POUR MODULER L'INTENSITE LUMINEUSE
                                     < MAXIMALE PAR L'IMAGE 'TV2'...
FHP:     FLOAT       <NILK<NILK<NILK < FHP=255*FH,
F255MH:  FLOAT       <NILK<NILK<NILK < F255MH=255-FHP.
<
< VARIABLES MONTAGNEUSES :
<
GXS:     FLOAT       <NILK<NILK<NILK < COORDONNEES ABSOLUES
GYS:     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 < POUR NORMALISER LA FONCTION ALEATOIRE.
<
< DEFINITION DE LA GRILLE :
<
NRECUR:  WORD        NILK            < NOMBRE COURANT DE RECURSIONS...
SRECUR:  WORD        NILK            < ET SAUVEGARDE AU CAS OU EN FAIT 'NRECUR'
                                     < EST CALCULE ALEATOIREMENT...
PASIX:   WORD        NILK            < PAS SUR 'OX',
PASIY:   WORD        NILK            < PAS SUR 'OY'.
FPASIX:  FLOAT       <NILK<NILK<NILK < DE MEME
FPASIY:  FLOAT       <NILK<NILK<NILK <         EN FLOTTANT...
XNOEUD:  WORD        NILK            < X(NOEUD HAUT-GAUCHE) DE LA MAILLE,
YNOEUD:  WORD        NILK            < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE.
AFNIV1:  FLOAT       <NILK<NILK<NILK
AFNIV2:  FLOAT       <NILK<NILK<NILK
AFNIV3:  FLOAT       <NILK<NILK<NILK
AFNIV4:  FLOAT       <NILK<NILK<NILK
KITER:   WORD        NILK            < COMPTAGE DES RECURSIONS...
         PAGE
<
<
<        L O C A L  :
<
<
         LOCAL
LOC:     EQU         $
<
< RELAIS MONTAGNEUX :
<
AFONCT:  WORD        FONCT           < CALCUL DE LA FONCTION COURANTE.
AFONKT:  WORD        FONCT           < IDEM LORS DES ENTREES BANDES ET SI L'ON
                                     < A : (IMODMT)='EXIST'.
<
< 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 <      L'INTERPOLATION...
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)).
SUP64R:  FLOAT       <NILK<NILK<NILK < SUPREC/65536,
UNMISR:  FLOAT       <NILK<NILK<NILK < 1-(INFREC/SUPREC),
UNPISR:  FLOAT       <NILK<NILK<NILK < 32768*(1+INFREC/SUPREC)).
<
< 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:  EQU         F05             < 2 (PAR L'INTERMEDIAIRE DE SON INVERSE).
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 :
<
XXMASK:: VAL         MOCG
XX7F::   VAL         '7F             < MAXIMUM POSITIF,
XX80::   VAL         -'80            < MIMIMUM NEGATIF.
<
< RELAIS DE SOUS-PROGRAMMES :
<
ASPRDN:  WORD        SPRDN           < GENERATEUR ALEATOIRE DONNANT UNE VALEUR
                                     < RDN(XS,YS,KITER,GRAINE).
APRDNR:  WORD        SPRDNR          < GENERATEUR ALEATOIRE DONNANT UNE VALEUR
                                     < RDN(XS,YS,GRAINR) ET UTILISE LORS DE LA
                                     < GENERATION ALEATOIRE DE 'NRECUR'...
EXPOP:   FLOAT       <NILK<NILK<NILK < EXPOSANT COURANT...
ARAK:    WORD        RAK             < CALCUL DE LA PUISSANCE P/(2**Q) D'UN
                                     < NOMBRE...
<
< VARAIBLES DE MANOEUVRE :
<
FWORK1:  FLOAT       <NILK<NILK<NILK
FWORK2:  FLOAT       <NILK<NILK<NILK
<
< POUR LE CALCUL D'UNE
< INTENSITE LUMINEUSE :
<
AINTEN:  WORD        INTEN           < SOUS-PROGRAMME DE CALCUL DE L'INTENSITE
                                     < LUMINEUSE AU POINT COURANT.
NIVBAS:: VAL         XXNOIR+I        < NIVEAU MINIMAL...
FNIVBA:  FLOAT       <NIVBAS<K<K     < POUR ELIMINER LA GENERATION DE POINTS
                                     < NOIRS...
INTENH:  FLOAT       <NILK<NILK<NILK < INTENSITE "HAUTE",
INTENB:  FLOAT       <NILK<NILK<NILK < INTENSITE "BASSE",
PINTEN:  FLOAT       <NILK<NILK<NILK < PAS D'INTERPOLATION DE L'INTENSITE...
                                     < (DE "HAUT" VERS "BAS"...)
AINT:    WORD        INTH,X          < ACCES A LA LISTE DES 'INTH' DE LA LIGNE
                                     < COURANTE (Y+I),
AINTM1:  WORD        INTHM1,X        < ACCES A LA LISTE DES 'INTH' DE LA LIGNE
                                     < PRECEDENTE (Y).
<
< DONNEES DE L'ANTI-ALIASING :
<
ASEGV:   WORD        SEGV            < SOUS-PROGRAMME DE TRACE D'UN SEGMENT
                                     < VERTICAL (SERT AUSSI POUR LE MODE
                                     < NON ANTI-ALIASING...).
LSTENH:  FLOAT       <NILK<NILK<NILK < MEMORISE 'INTENH' DU VECTEUR VERTICAL
                                     < PRECEDENT.
LSTGY2:  WORD        NILK            < MEMORISE 'VECGY2' DU VECTEUR VERTICAL
                                     < PRECEDENT.
ALISTY:  WORD        LISTY,X         < RELAI D'ACCES A LA LSITE DE DETECTION
                                     < DES DISCONTINUITES : POUR CHAQUE ABSCISSE
                                     < 'X', ELLE MEMORISE L'ORDONNEE 'Y' DU
                                     < DERNIER VECTEUR VERTICAL TRACE...
ALNOVI:  WORD        LNOVI,X         < RELAI VERS LA TABLE INVERSE DE 'LNIVO',
                                     < ET QUI PERMET DE RETROUVER APPROXIMATI-
                                     < VEMENT (CORRESPONDANCE NON BIJECTIVE...)
                                     < LE NIVEAU CALCULE A PARTIR DU NIVEAU
                                     < TRACE.
<
< 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.
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         53              < 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 SPIR-MAP
< DE CALCUL D'UN SIGMA(X,Y) :
<
PASM:    WORD        NILK            < PAS DE PARCOURS DE LA SPIR-MAP,
DELTAX:  WORD        NILK            < VECTEUR TRANSLATION
DELTAY:  WORD        NILK            <                     COMPLEXE COURANT.
LB:      WORD        NILK            < LONGUEUR DES
LB0:     WORD        NILK            <              BRANCHES DE LA SPIR-MAP.
NP:      WORD        NILK            < NOMBRE DE POINT COURANT,
FNMM:    FLOAT       <NILK<NILK<NILK < NOMBRE DE POINTS FLOTTANT DE LA SPIR-MAP.
<
< SIGMA(X,Y) SUR UNE SPIR-MAP :
<
F2::     FLOAT       <XXXMOY<K<K
F4::     FLOAT       <XXXMOY*XXXMOY<K<K
CUMUL:   WORD        NILK            < SIGMA(NIVEAU(X,Y)).
ASPIRM:  WORD        SPIRAM          < SOUS-PROGRAMME DE CALCUL DE 'CUMUL'...
<
< DEFINITION DE LA SPIR-DEP
< DE CALCUL D'UN SIGMA(X,Y) :
<
XWOR%1:  VAL         XXXMOY=K
XWOR%1:  VAL         -XWOR%1
XCENTR:  WORD        NPOLM1>XWOR%1   < DEFINITION DU
YCENTR:  WORD        NLIGM1>XWOR%1   <               CENTRE DE 'TV1'/'TV2'.
PASD:    WORD        NILK            < PAS DE PARCOURS DE LA SPIR-DEP,
                                     < NOTA : 'NP', 'DELTAX', 'DELTAY', 'LB' ET
                                     < 'LB0' SONT COMMUNS AVEC LA SPIR-DEP DE CA
                                     < DE L'IMAGE MAPPEE...
<
< SIGMA(X,Y) SUR UNE SPIR-DEP :
<
ALCOEF:  WORD        LCOEF,X         < RELAI D'ACCES A LA LISTE DES COEFFICIENTS
                                     < DE PONDERATION DES SPIR-DEPS...
FCOEFC:  FLOAT       <NILK<NILK<NILK < SIGMA(COEFFICIENTS)/FCOEFA.
FCUMUL:  FLOAT       <NILK<NILK<NILK < SIGMA(NIVEAU(X,Y)).
ASPIRD:  WORD        SPIRAD          < SOUS-PROGRAMME DE CALCUL DE 'CUMUL'...
<
< PARTICIPATIONS RELATIVES DE
< LA GENERATION ALEATOIRE ET
< DE LA SOMMATION SUR UNE
< SPIR-MAP CENTREE EN (256,256) :
<
PONRDN:  FLOAT       <NILK<NILK<NILK < CONTRIBUTION DE LA GENERATION ALEATOIRE,
PONSPI:  FLOAT       <NILK<NILK<NILK < CONTRIBUTION DES SPIR-MAPS.
<
<
<        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...
<
< TRANSLATION DE LA FUNCTION :
<
ICOUCH:  WORD        NILK            < VAUT F(SCOUCH) SUIVANT LA MODULATION
                                     < DE RAN(X,Y,Z), VOIR A CE PROPOS LES
                                     < FUNCTIONS DU TYPE 'FGAUS'...
<
< MISE D'UN NIVEAU DANS (MINNIV,MAXNIV) :
<
F255:    WORD        XXN255
F511:    WORD        NIV256+NIV256-Z
APNIV:   WORD        PNIV            < SOUS-PROGRAMME DE MISE DANS (MINNIV,
                                     < MAXNIV).
<
< VARIABLES TEXTUREUSES :
<
ZS:      WORD        NILK            < AFIN DE COMPLETER (XS,YS)...
HXS:     FLOAT       <NILK<NILK<NILK < COORDONNEES
HYS:     FLOAT       <NILK<NILK<NILK <             ABSOLUES
HZS:     FLOAT       <NILK<NILK<NILK <                      DU POINT COURANT.
FKUMR:   FLOAT       <NILK<NILK<NILK < SIGMA DES FUNCTIONS ALEATOIRES
                                     < SCALANTES.
FPONT:   FLOAT       <NILK<NILK<NILK < POUR LES PONDERER...
FPONT0:  FLOAT       <NILK<NILK<NILK < VALEUR INITIALE DE LA PONDERATION :
                                     < FPONT0=RAC(PAZIX*PAZIY).
RENORN:  FLOAT       <NILK<NILK<NILK < DONNE LE SIGMA DES 'FPONT' SCALANTS
                                     < DIVISE PAR 'FPONT0', ET PERMET DE CAL-
                                     < CULER LA FUNCTION ALEATOIRE DANS UN
                                     < SEGMENT PREDETERMINE, ET QUI EST :
                                     < (INFRAN*AMPLY*AMPLYR,SUPRAN*AMPLY*AMPLYR)
<
< RELAIS DE TEXTURAGE :
<
TEXTUR:  WORD        NILK            < CONSTANTE DE TRANSLATION CALCULEE ET
                                     < APPLIQUEE AU NIVEAU DES POINTS, CE QUI
                                     < DEFINIT LA TEXTURE...
AFUNCT:  WORD        FUNCT           < CALCUL DE LA FUNCTION COURANTE.
ANTEXT:  WORD        NTEXT           < RELAI...
<
< DEFINITION DE LA GRILLE :
<
NREKUR:  WORD        NILK            < NOMBRE COURANT DE REKURSIONS...
PAZIX:   WORD        NILK            < PAZ SUR 'OX',
PAZIY:   WORD        NILK            < PAZ SUR 'OY',
PAZIZ:   WORD        NILK            < PAZ SUR 'OZ'.
FPAZIX:  FLOAT       <NILK<NILK<NILK < DE MEME
FPAZIY:  FLOAT       <NILK<NILK<NILK <         EN
FPAZIZ:  FLOAT       <NILK<NILK<NILK <            FLOTTANT...
AFNJV1:  FLOAT       <NILK<NILK<NILK
AFNJV2:  FLOAT       <NILK<NILK<NILK
AFNJV3:  FLOAT       <NILK<NILK<NILK
AFNJV4:  FLOAT       <NILK<NILK<NILK
AFNJV5:  FLOAT       <NILK<NILK<NILK
AFNJV6:  FLOAT       <NILK<NILK<NILK
AFNJV7:  FLOAT       <NILK<NILK<NILK
AFNJV8:  FLOAT       <NILK<NILK<NILK
KJTER:   WORD        NILK            < COMPTAGE DES REKURSIONS...
<
< PARAMETRES DU GENERATEUR ALEATOIRE :
<
RAN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RAN1:    WORD        5189            < CONSTANTE
RAN2:    WORD        6791            < DE CALCUL DES
RAN3::   VAL         19              < NOMBRE ALEATOIRES...
RAN4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RAN5:    WORD        4021
RAN6::   VAL         23
HJNCU:   FLOAT       <NILK<NILK<NILK < POUR
HJNCV:   FLOAT       <NILK<NILK<NILK
HJNCW:   FLOAT       <NILK<NILK<NILK <      L'INTERPOLATION...
HJNCU1:  FLOAT       <NILK<NILK<NILK < HJNCU1=1-HJNCU,
HJNCV1:  FLOAT       <NILK<NILK<NILK < HJNCV1=1-HJNCV,
HJNCW1:  FLOAT       <NILK<NILK<NILK < HJNCW1=1-HJNCW.
GSUP:    FLOAT       <NILK<NILK<NILK < 'SUPRAN' EN FLOTTANT,
GINF:    FLOAT       <NILK<NILK<NILK < 'INFRAN' EN FLOTTANT.
ZUP64:   FLOAT       <NILK<NILK<NILK < SUP/65536,
UNMJS:   FLOAT       <NILK<NILK<NILK < 1-(INF/SUP),
UNPJS:   FLOAT       <NILK<NILK<NILK < 32768*(1+(INF/SUP)).
F3:      FLOAT       <DIMGRA<K<K     < POUR CALCULER UNE RACINE CUBIQUE (PASSA-
                                     < D'UN VOLUME A UNE DIMENSION...).
AMPLY:   FLOAT       <NILK<NILK<NILK < AMPLYFICATEUR DU SIGMA DES 'FPONT'
                                     < CALCULE A PARTIR DE 'NREKUR'.
XAMPLY:: VAL         31              < POUR CALCULER 'KAMPLY'...
KAMPLY:  FLOAT       <XAMPLY-I<K<K   < POUR CALCULER 'AMPLY' A PARTIR DE
                                     < 'NREKUR'...
ASPRAN:  WORD        SPRAN           < SOUS-PROGRAMME DE GENERATION ALEATOIRE
                                     < TRI-DIMENSIONNELLE...
<
< 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.
<
< PARTICIPATIONS RELATIVES DE
< LA GENERATION ALEATOIRE ET
< DE LA SOMMATION SUR UNE
< SPIR-MAP CENTREE EN (256,256) :
<
PONRAN:  FLOAT       <NILK<NILK<NILK < CONTRIBUTION DE LA GENERATION ALEATOIRE,
PONSPJ:  FLOAT       <NILK<NILK<NILK < CONTRIBUTION DES SPIR-MAPS.
<
< DONNEES DE TRANSCODAGE DES TEXTURES :
<
ALTIVO:  WORD        LTIVO,X         < LISTE DE TRANSCODAGE.
FIV255:  FLOAT       <NIV256-Z<K<K   < POUR OBTENIR UNE VALEUR DANS (0,1).
<
< RELAIS D'ACCES AUX LISTES
< DE DESCRIPTION DU MAILLAGE
< POUR LE TEXTURAGE TRI-DIMENSIONNEL :
<
ALPAZX:  WORD        LPAZX,X         < RELAI D'ACCES A 'PAZIX' FLOTTANT,
ALPZIX:  WORD        LPZIX,X         < RELAI D'ACCES A 'PAZIX' ENTIER.
ALPAZY:  WORD        LPAZY,X         < RELAI D'ACCES A 'PAZIY' FLOTTANT,
ALPZIY:  WORD        LPZIY,X         < RELAI D'ACCES A 'PAZIY' ENTIER.
ALPAZZ:  WORD        LPAZZ,X         < RELAI D'ACCES A 'PAZIZ' FLOTTANT,
ALPZIZ:  WORD        LPZIZ,X         < RELAI D'ACCES A 'PAZIZ' ENTIER.
ALPONT:  WORD        LPONT,X         < RELAI D'ACCES A 'FPONT'.
<
< DONNEES DE "FUITE" :
<
FPERSA:  FLOAT       <NILK<NILK<NILK < FPERSA=(1-FPERSB)/255,
FPERSK:  FLOAT       <NILK<NILK<NILK < FPERSK=FPERSA*Y+FPERSB, OU 'Y' EST LA
                                     < COORDONNEE 'Y'.
<
< CONSTANTES DE CALCUL
< DES OMBRES PORTEES :
<
PRAYON:  FLOAT       <NILK<NILK<NILK < PENTE DE LA DROITE "RAYON LUMINEUX"
                                     < ALLANT DE LA SOURCE LUMINEUSE AU POINT
                                     < DE COTE MAXIMALE COURANT, EN FAISANT LES
                                     < HYPOTHESES SUIVANTES :
                                     < 1 - ON TRACE DE DROITE A GAUCHE,
                                     < 2 - ON SUPPOSE CE RAYON LUMINEUX CONTENU
                                     < DANS LE PLAN DE PROJECTION (Z=0)...
                                     < ENFIN, ON A :
                                     < PRAYON=(YMAX-YL)/(XMAX-XL).
INCIX::  VAL         -I              < ON PARCOURT DONC LES LIGNES DE LA DROITE
                                     < VERS LA GAUCHE...
<
< DONNEES DE PROJECTION :
<
TRX:     WORD        NILK            < TRANSLATION EN 'X',
TRY:     WORD        NILK            < TRANSLATION EN 'Y'.
         PAGE
<
<
<        G E S T I O N   D U   D I S Q U E - V I D E O  :
<
<
BUFVIW:  BYTE        "J";KCR
XWOR%1:  VAL         '0000000@@@@(MOCD
XWOR%3:  VAL         $-BUFVIW*NOCMO
         IF          XWOR%1-K,XEIF%,,XEIF%
XWOR%3:  VAL         XWOR%3-W
XEIF%:   VAL         ENDIF
LBUFVW:: VAL         XWOR%3          < LONGUEUR DE LA COMMANDE AU DISQUE
                                     < VIDEO...
XWOR%2:  VAL         COSBT?XASSIM=FMASK(K?NVPVDK=FCINST
DEMVIW:  BYTE        XWOR%2;FAVW     < COMMANDE DE L'ECRITURE SUR LE DISQUE
                                     < VIDEO...
         WORD        BUFVIW=FCTA*NOCMO
         WORD        LBUFVW
BUFVIR:  DZS         W               < BUFFER DE LECTURE DES ACQUITTEMENTS.
LBUFVR:: VAL         $-BUFVIR*NOCMO
DEMVIR:  BYTE        XWOR%2;FAVR     < LECTURE DES ACQUITTEMENTS DU DISQUE.
         WORD        BUFVIR=FCTA*NOCMO
         WORD        LBUFVR
         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
<
<
<        T A B L E   D E S   P O N D E R A T I O N S   D E S
<        P O I N T S   D ' U N E   S P I R - D E P   D E
<        D E P L A C E M E N T   V E R T I C A L  :
<
<
MAXNDM:: VAL         32              < NOMBRE DE POINTS MAX...
LCOEF:   EQU         $
         DO          MAXNDM
         FLOAT       <NILK<NILK<NILK
         PAGE
<
<
<        T A B L E   D E   T R A N S C O D A G E   D E S   N I V E A U X  :
<
<
<        ARGUMENTS D'ASSEMBLAGE :
<                    ND=DIVISEUR DES NIVEAUX DE 'LNIVO' (0 OU 2),
<                    NI=TRANSLATION DES NIVEAUX DE 'LNIVO' (0 OU 128)...
<
<
NI:     @
XWOR%1:  VAL         KOLF=FMASK+KOLTES=FVAL
XWOR%1:  VAL         KOLC=FMASK+KDP=FVAL?XWOR%1
XWOR%2:  VAL         KOLTED=FMASK+KOL0=FVAL
XWOR%2:  VAL         KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2
XWOR%3:  VAL         XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT...
XWOR%4:  VAL         MSYMBI=FMASK+KOL0=FVAL
XWOR%4:  VAL         MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4
XWOR%5:  VAL         XWOR%4=FCSYMT   < ETAT DU SYMBOLE 'NI'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
NI::     VAL         XXNOIR          < LE NIVEAU INITIAL SERA LE NIVEAU NOIR.
XEIF%:   VAL         ENDIF
ND:     @
XWOR%1:  VAL         KOLF=FMASK+KOLTES=FVAL
XWOR%1:  VAL         KOLC=FMASK+KDP=FVAL?XWOR%1
XWOR%2:  VAL         KOLTED=FMASK+KOL0=FVAL
XWOR%2:  VAL         KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2
XWOR%3:  VAL         XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT...
XWOR%4:  VAL         MSYMBI=FMASK+KOL0=FVAL
XWOR%4:  VAL         MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4
XWOR%5:  VAL         XWOR%4=FCSYMT   < ETAT DU SYMBOLE 'ND'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
ND::     VAL         W               < PAS DE DIVISEUR DES NIVEAUX...
XEIF%:   VAL         ENDIF
LNIVO:   EQU         $
         NTRN
XWOR%1:  VAL         NIV256+NOCMO-E/NOCMO
XWOR%2:  VAL         NIV256/NOCMO(K=FCREST
         TRN
XWOR%3:  VAL         NIV256+XWOR%2
                                     < INCREMENT DES OCTETS GAUCHES,
XWOR%4:  VAL         XWOR%3+NOCMO-Z
                                     < INCREMENT DES OCTETS DROITS.
         NTRN
<*******************************************************************************
         DO          XWOR%1
   BYTE K=FCDO)MFFFF+N-Z*NOCMO+XWOR%3/ND+NI;K=FCDO)MFFFF+N-Z*NOCMO+XWOR%4/ND+NI
XWOR%5:  VAL         '0000000@@@@    < RECUPERATION DU DERNIER MOT,
<*******************************************************************************
         TRN
         IF          XWOR%2-K,,XEIF%,
XWOR%5:  VAL         XWOR%5(MOCG     < DANS LE CAS D'UNE TABLE DE LONGUEUR
                                     < IMPAIRE, ON EFFACE LE DERNIER OCTET
                                     < GENERE,
         $EQU        $-D             < ON REVIENT D'UN MOT EN ARRIERE,
         WORD        XWOR%5          < ET ON REGENERE LE DERNIER MOT...
XEIF%:   VAL         ENDIF
<
<
<        T A B L E   I N V E R S E   D E   ' L N I V O '  :
<
<
<        NOTA :
<                      DANS LA MESURE OU PLUSIEURS
<                    NIVEAUX CALCULES PEUVENT DONNER
<                    NAISSANCE AU MEME NIVEAU TRACE,
<                    LA CORRESPONDANCE N'EST PAS BI-
<                    JECTIVE, ET DONC 'LNOVI' NE DON-
<                    QU'APPROXIMATIVEMENT L'INVERSE
<                    DE 'LNIVO'...
<
<
LNOVI:   EQU         $
         DO          XWOR%1
         BYTE        NILK;NILK
         PAGE
<
<
<        T A B L E   D E   T R A N S C O D A G E   D E S   T E X T U R E S  :
<
<
<        FONCTION :
<                      ON VA DECOUPER L'ESPACE DES TEXTURES
<                    EN 'N' BANDES DE 'BW' NIVEAUX DE LARGE,
<                    ET DONC TEL QUE : N*BW=256. PAR EXEMPLE
<                    S'IL N'Y A PAS DE TEXTURES (N=1), LA
<                    LARGEUR SERA : BW=256. SI L'ON SOUHAITE
<                    4 TYPES DE TEXTURES, ON FERA BW=64, ET LES
<                    4 TYPES UTILISERONT LES GROUPES DE NIVEAUX
<                    ('00,'3F), ('40,'7F), ('80,'BF) ET ('C0,'FF)
<                    EN SORTIE, ET ON REDUIRA LES NIVEAUX
<                    DISPONIBLES EN PRENANT : ND=4 ET NI=0.
<
<
<        ARGUMENTS D'ASSEMBLAGE :
<                    BW=LARGEUR DES BANDES DE TEXTURAGE (256 SI PAS DE TEXTURE),
<                    TB=TRANSLATION DES NIVEAUX DE 'LTIVO'.
<
<
TB:     @
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 'TB'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
TB::     VAL         XXNOIR          < LE NIVEAU ITITIAL SERA LE NIVEAU NOIR.
XEIF%:   VAL         ENDIF
BW:     @
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 'BW'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
BW::     VAL         NIV256          < UNE SEULE BANDE DE 256 NIVEAUX DE LARGE.
XEIF%:   VAL         ENDIF
LTIVO:   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.
X%3:     VAL         XWOR%3          < POUR REDUIRE LA LONGUEUR
X%4:     VAL         XWOR%4          <                          DU "...BYTE...".
         NTRN
<*******************************************************************************
         DO          XWOR%1
   BYTE K=FCDO)MFFFF+N-Z*NOCMO+X%3/BW*BW+TB;K=FCDO)MFFFF+N-Z*NOCMO+X%4/BW*BW+TB
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   D E   T E X T U R A G E   3 D  :
<
<
LPAZX:   EQU         $
         NLS
         DO          MAXREK
         FLOAT       <NILK<NILK<NILK < 'PAZIX'.
         LST
LPZIX:   EQU         $
         NLS
         DO          MAXREK
         WORD        NILK
         LST
LPAZY:   EQU         $
         NLS
         DO          MAXREK
         FLOAT       <NILK<NILK<NILK < 'PAZIY',
         LST
LPZIY:   EQU         $
         NLS
         DO          MAXREK
         WORD        NILK
         LST
LPAZZ:   EQU         $
         NLS
         DO          MAXREK
         FLOAT       <NILK<NILK<NILK < 'PAZIZ'.
         LST
LPZIZ:   EQU         $
         NLS
         DO          MAXREK
         WORD        NILK
         LST
LPONT:   EQU         $
         NLS
         DO          MAXREK
         FLOAT       <NILK<NILK<NILK < 'FPONT'.
         LST
         PAGE
<
<
<        T A B L E   D E   D E T E C T I O N   D E S
<        D I S C O N T I N U I T E S   P O U R   LE
<        T R A I T E M E N T   A N T I - A L I A S I N G  :
<
<
LISTY:   EQU         $
         DZS         XC512
         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
LPOND:   EQU         $
         NLS
         DO          MAXREC
         FLOAT       <NILK<NILK<NILK < 'FPOND'.
         LST
         PAGE
<
<
<        L I S T E   D E S   I N T E N S I T E S   H A U T E S  :
<
<
INTH:    EQU         $
         NLS
         DO          XC512
         FLOAT       <NILK<NILK<NILK < LIGNE COURANTE.
         LST
INTHM1:  EQU         $
         NLS
         DO          XC512
         FLOAT       <NILK<NILK<NILK < LIGNE PRECEDENTE.
         LST
         PAGE
<
<
<        B U F F E R   D E   T R O I S   L I G N E S   C O N S E C U T I V E S
<
<
LIGP2:   EQU         $
         NLS
         DO          XC512
         FLOAT       <NILK<NILK<NILK < LIGNE SUIVANTE-SUIVANTE.
         LST
LIGP1:   EQU         $
         NLS
         DO          XC512
         FLOAT       <NILK<NILK<NILK < LIGNE SUIVANTE.
         LST
LIG:     EQU         $
         NLS
         DO          XC512
         FLOAT       <NILK<NILK<NILK < LIGNE COURANTE.
         LST
LIGM1:   EQU         $
         NLS
         DO          XC512
         FLOAT       <NILK<NILK<NILK < LIGNE PRECEDENTE.
         LST
         PAGE
<
<
<        P I L E   D E   T R A V A I L  :
<
<
STACK:   EQU         $
         DZS         64
         PROG
         NLS
XXXVEC:  VAL         XXVEC3          < DEFINITION DES PROGRAMMES VECTEUR 512...
         CALL        #SIP VECTEUR 512#
         LST
         PAGE
<
<
<        M A R Q U A G E   D ' U N   P O I N T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME MARQUE
<                    LE POINT ARGUMENT (X,Y) AVEC
<                    COMME NIVEAU, LE NIVEAU ARGU-
<                    MENT (A) TRANSCODE VIA LA TA-
<                    BLE 'LNIVO', CE QUI PERMET PAR
<                    EXEMPLE LA SUPERPOSITION DE
<                    PLUSIEURS IMAGES, EN FAISANT
<                    QUE LEURS TABLES 'LNIVO' SOIENT
<                    COMPLEMENTAIRES...
<
<
<        ARGUMENTS :
<                    (A)=NIVEAU,
<                    (X,Y)=COORDONNEES DU POINT.
<
<
<        RESULTAT :
<                    (A)=NIVEAU TRANSCODE.
<
<
POINT:   EQU         $
<
< 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'.
<
< TEXTURAGE EVENTUEL :
<
         CPZ         ITEXTU          < DOIT-ON TEXTURER ???
         JE          POINT1          < NON...
         AD          TEXTUR          < OUI, ON TRANSLATE LE NIVEAU DU POINT,
         BSR         APNIV           < ET ON LE MET DANS (MINNIV,MAXNIV)...
POINT1:  EQU         $
<
< MARQUAGE DU POINT :
<
         BSR         ASTORP          < MARQUAGE : (X,Y) <-- (A)...
<
< 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
         NLS
XXXPRO:  VAL         YYYGOT          < 'YYYGOT'.
         CALL        #SIP UTILITAIRES#
XXXPRO:  VAL         YYYFLO          < 'YYYFLO'.
         CALL        #SIP UTILITAIRES#
         LST
         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  :
<
<
<        FONCTION :
<                      CE GENERATEUR EST UTILISE
<                    POUR LE CALCUL DES ALTITUDES
<                    ALEATOIRES.
<
<
<        ARGUMENT :
<                    (X,Y)=COORDONNEES DU POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=RDN(XS,YS,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
         MP          GRAINE          < D'OU F(GRAINE,KITER,X,Y), 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
<
<
<        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  :
<
<
<        FONCTION :
<                      CE GENERATEUR EST UTILISE
<                    POUR LES CALCULS ALEATOIRES
<                    DE 'NRECUR'.
<
<
<        ARGUMENT :
<                    (X,Y)=COORDONNEES DU POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=RDN(XS,YS,GRAINE).
<
<
SPRDNR:  EQU         $
<
< GENERATION ALEATOIRE :
<
         LR          X,A             < (A)=COORDONNEE 'X',
         EORR        B,A             < ET ON SE RAMENE SUR UN MOT...
         STA         FWORK4          < SAVE F1(XS)...
         LR          Y,A             < (A)=COORDONNEE 'Y',
         EOR         RDN1            < ??!???!
         STA         FWORK5          < SAVE F2(YS)...
         MP          FWORK4          < ET ON CONSTRUIT
         XR          A,B             < UNE FONCTION UNIQUE
         AD          FWORK5          < DU NOEUD COURANT,
         SB          FWORK4          < TELLE QUE :
                                     < F(X,Y)#F(Y,X),
                                     < F(X,Y)=X*Y+Y-X.
         EORR        B,A
         MP          GRAINR          < D'OU F(GRAINF,X,Y), 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,
         FLT                         < ON FLOTTE 'RDN',
<
< 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))).
<
         FMP         UNMISR          < RDN*(1-(INF/SUP)),
         FAD         UNPISR          < RDN*(1-(INF/SUP))+32768*(1+(INF/SUP)),
         FMP         SUP64R          < (SUP/65536)*(...).
<
< ET RETOUR :
<
         RSR
         PAGE
<
<
<        S O M M A T I O N   S U R   U N E   S P I R - M A P
<        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).
<
<
SPIRAM:  EQU         $
<
< INITIALISATION DE LA SPIR-MAP :
<
         PSR         X,Y             < SAUVEGARDE DU POINT (X,Y).
         STZ         CUMUL           < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         LA          PASM
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         W
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIR-MAP.
<
< PARCOURS D'UN BRAS :
<
SPIRM1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPIRM2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NMM             < FINI ???
         JG          SPIRM3          < OUI...
         LR          X,A             < NON, TEST DE LA COORDONNEE 'X' :
         JAL         SPIRM4          < LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPIRM4          < HORS-ECRAN...
         LR          Y,A             < TEST DE LA COORDONNEE 'Y' :
         JAL         SPIRM4          < HORS-ECRAN...
         CPI         NLIGM1
         JG          SPIRM4          < 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         SPIRM6          < 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         SPIRM6          < ET BIEN NON, CE N'EST PAS (X,Y)...
         CPI         NIVMX7          < ALORS ???
         JLE         SPIRM7          < ON A TROUVE (X,Y), ET 'TV1'/'TV2' EST
                                     < LE MEME, ALORS :
                                     < (A)=NIVEAU(X,Y)...
<
< ACCES REEL AU POINT (X,Y) :
<
SPIRM6:  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 :
<
SPIRM7:  EQU         $
         PLR         X,Y
         AD          CUMUL           < ET
         STA         CUMUL           < CUMULE...
<
< PARCOURS DE LA SPIR-MAP :
<
SPIRM4:  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          SPIRM2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPIRM5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPIRM5:  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         SPIRM1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (X,Y) :
<
SPIRM3:  EQU         $
         PLR         X,Y             < RESTAURATION DU POINT COURANT (X,Y).
<
< NORMALISATION DU CUMUL :
<
         LA          CUMUL
         FLT
         FDV         FNMM
         RSR
         PAGE
<
<
<        S O M M A T I O N   S U R   U N E   S P I R - D E P
<        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).
<
<
SPIRAD:  EQU         $
<
< INITIALISATION DE LA SPIR-DEP :
<
         PSR         X,Y             < SAUVEGARDE DU POINT (X,Y).
         #/FLD#      F0
         #/FST#      FCUMUL          < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         LA          PASD
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         W
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIR-DEP.
<
< PARCOURS D'UN BRAS :
<
SPIRD1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPIRD2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NDM             < FINI ???
         JG          SPIRD3          < OUI...
         LR          X,A             < NON, TEST DE LA COORDONNEE 'X' :
         JAL         SPIRD4          < LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPIRD4          < HORS-ECRAN...
         LR          Y,A             < TEST DE LA COORDONNEE 'Y' :
         JAL         SPIRD4          < HORS-ECRAN...
         CPI         NLIGM1
         JG          SPIRD4          < 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         SPIRD6          < 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         SPIRD6          < ET BIEN NON, CE N'EST PAS (X,Y)...
         CPI         NIVMX7          < ALORS ???
         JLE         SPIRD7          < ON A TROUVE (X,Y), ET 'TV1'/'TV2' EST
                                     < LE MEME, ALORS :
                                     < (A)=NIVEAU(X,Y)...
<
< ACCES REEL AU POINT (X,Y) :
<
SPIRD6:  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 :
<
SPIRD7:  EQU         $
         LX          NP
         ADRI        -I,X
         ADR         X,X             < (X)=INDEX FLOTTANT DU POINT COURANT...
         FLT                         < FLOTTAGE DU NIVEAU CALCULE,
         FMP         &ALCOEF         < PONDERATION,
         FAD         FCUMUL          < ET
         #/FST#      FCUMUL          <    CUMUL...
         PLR         X,Y
<
< PARCOURS DE LA SPIR-DEP :
<
SPIRD4:  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          SPIRD2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPIRD5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPIRD5:  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         SPIRD1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (X,Y) :
<
SPIRD3:  EQU         $
         PLR         X,Y             < RESTAURATION DU POINT COURANT (X,Y).
<
< NORMALISATION DU CUMUL :
<
         #/FLD#      FCUMUL
         FDV         FCOEFC
         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)=POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=((MOYENE)+(AMPLI)*F(XS,YS))*(CONTRIBUTION ALEATOIRE)+
<                          (F(SIGMA(NIVEAU(X,Y)))*(CONTRIBUTION DES SPIR-MAPS).
<
<
FONCT:   EQU         $
         PSR         X,Y             < SAUVEGARDES...
<
< FLOTTAGE DU POINT COURANT :
<
         LR          X,A             < COORDONNEE 'X' :
         AD          TRDNX           < TRANSLATION EN 'X' DU GENERATEUR,
         FLT
         FMP         FHOMO           < HOMOTHETIE...
         #/FST#      GXS             < COORDONNEE 'XS' DU POINT COURANT.
         FIX
         STA         XS
         LR          Y,A             < COORDONNEE 'Y' :
         AD          TRDNY           < TRANSLATION EN 'Y' DU GENERATEUR,
         FLT
         FMP         FHOMO           < HOMOTHETIE...
         #/FST#      GYS             < COORDONNEE 'YS' DU POINT COURANT.
         FIX
         STA         YS
<
< DISCRIMINATION DES
< CONTRIBUTIONS ALEATOIRES
< ET DES SPIR-MAPS :
<
         #/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
                                     < SPIR-MAPS, 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         $
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT VA MERDER !!!
XEIF%:   VAL         ENDIF
         CPZ         IRDNRC          < GENERE-T'ON 'NRECUR' ALEATOIREMENT ???
         JNE         FONCTA          < OUI...
         BSR         AGOTO
         WORD        FONCTN          < NON...
FONCTA:  EQU         $
<
<
<        G E N E R A T I O N   D E   ' N R E C U R '
<        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 FONKTIONS
                                     < ALEATOIRES SCALANTES...
<
< ITERATION POUR CHAQUE
< FONKTION ALEATOIRE :
<
         STZ         KITER           < INITIALISATION DES RECURSIONS...
         LXI         K               < (X)=INDEX DES RECURSIONS...
FONKT5:  EQU         $
         IC          KITER           < COMPTAGE DES RECURSIONS...
<
< INITIALISATION DU MAILLAGE :
<
         LA          &ALPSIX
         STA         PASIX           < 'PASIX' ENTIER,
         LA          &ALPSIY
         STA         PASIY           < 'PASIY' ENTIER.
         PSR         X
         ADR         X,X             < PASSAGE A UN INDEX FLOTTANT...
         FLD         &ALPASX
         #/FST#      FPASIX          < 'PASIX' FLOTTANT,
         FLD         &ALPASY
         #/FST#      FPASIY          < 'PASIY' 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 HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE,
         LA          YS
         SARD        NBITMO
         DV          PASIY
         MP          PASIY
         LR          B,Y             < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE.
         LA          XS
         CPR         A,X             < EST-ON EN UN NOEUD ???
         JNE         FONKT3          < NON...
         LA          YS              < PEUT-ETRE :
         CPR         A,Y             < EST-ON EN UN NOEUD ???
         JNE         FONKT3          < NON, INTERPOLONS...
<
< CAS OU LE POINT (XS,YS)
< COURANT EST UN NOEUD :
<
         BSR         APRDNR          < LE POINT COURANT EST UN NOEUD...
         JMP         FONKT4          < VERS L'ACCES A LA VALEUR DU NOEUD...
<
< CAS OU LE POINT (XS,YS)
< COURANT N'EST PAS UN NOEUD :
<
FONKT3:  EQU         $
         NGR         X,A             < ABSCISSE DU NOEUD "HAUT-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 "HAUT-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.
         BSR         APRDNR
         #/FST#      AFNIV1          < NIVEAU(XNOEUD,YNOEUD),
         LA          PASIX
         ADR         A,X
         BSR         APRDNR
         #/FST#      AFNIV2          < NIVEAU(XNOEUD+PASIX,YNOEUD),
         LA          PASIY
         ADR         A,Y
         BSR         APRDNR
         #/FST#      AFNIV3          < NIVEAU(XNOEUD+PASIX,YNOEUD+PASIY),
         LA          PASIX
         SBR         A,X
         BSR         APRDNR
         #/FST#      AFNIV4          < NIVEAU(XNOEUD,YNOEUD+PASIY).
<
< INTERPOLATION ENTRE LES
< QUATRE SOMMETS D'UN CARRE
< PORTANT LES VALEURS (NIV1,
< NIV2,NIV3,NIV4), LES COOR-
< DONNEES DU POINT DANS LE
< CARRE ETANT (HINCU,HINCV) :
<
<
<        NOTA :
<                      ON DOIT INTERPOLER ENTRE
<                    LES NIVEAUX (N1,N2,N3,N4) SUR
<                    LES SOMMETS ((1-U,1-V),(U,1-V),(U,V),(1-U,V)),
<                    CE QUI CONDUIT A CALCULER LA
<                    FORMULE :
<
<                    (1-U)*(1-V)*N1+U*(1-V)*N2+U*V*N3+(1-U)*V*N4,
<
<                    QUI SE REECRIT, EN SUPPOSANT U#0 :
<
<                    (1-V)*((1-U)*N1+U*N2)+V*(U*N3+(1-U)*N4),
<
<                    SOIT :
<
<                    U*(1-V)*(N2+((1-U)/U)*N1)+U*V*(N3+((1-U)/U)*N4),
<
<                    ET ENFIN (SI U#0) :
<
<                    U*((1-V)*(N2+((1-U)/U)*N1)+V*(N3+((1-U)/U)*N4)).
<
<                    OU (SI V#0) :
<
<                    V*((1-U)*(N4+((1-V)/V)*N1)+U*(N3+((1-V)/V)*N2)).
<
         FCMZ        HINCU           < 'U' EST-IL NUL ???
         JNE         FONKT8          < NON, ON PEUT DIVISER PAR LUI...
         FCMZ        HINCV           < 'V' EST-IL NUL ???
         JNE         FONKT9          < NON, ON PEUT DIVISER PAR LUI...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
         JMP         FONKT7          < ET ON SORT...
<
< CAS OU 'V' EST NON NUL :
<
FONKT9:  EQU         $
         #/FLD#      F1              < 1,
         FSB         HINCU           < 1-U,
         #/FST#      FWORK1          < W1=1-U.
         #/FLD#      F1              < 1,
         FSB         HINCV           < 1-V,
         FDV         HINCV           < (1-V)/V,
         PSR         A,B             < ET SAVE...
         FMP         AFNIV1          < ((1-V)/V)*N1,
         FAD         AFNIV4          < N4+((1-V)/V)*N1,
         FMP         FWORK1          < (1-U)*(N4+((1-V)/V)*N1,
         #/FST#      FWORK           < ET SAVE...
         PLR         A,B             < (1-V)/V,
         FMP         AFNIV2          < ((1-V)/V)*N2,
         FAD         AFNIV3          < N3+((1-V)/V)*N2,
         FMP         HINCU           < U*(N3+((1-V)/V)*N2),
         FAD         FWORK           < (1-U)*(N4+((1-V)/V)*N1)
                                     < +U*(N3+((1-V)/V)*N2),
         FMP         HINCV           < V*(...).
         JMP         FONKT7          < ET L'INTERPOLATION EST FINIE...
<
< CAS OU 'U' EST NON NUL :
<
FONKT8:  EQU         $
         #/FLD#      F1              < 1,
         FSB         HINCV           < 1-V,
         #/FST#      FWORK1          < W1=1-V.
         #/FLD#      F1              < 1,
         FSB         HINCU           < 1-U,
         FDV         HINCU           < (1-U)/U,
         PSR         A,B             < ET SAVE...
         FMP         AFNIV1          < ((1-U)/U)*N1,
         FAD         AFNIV2          < N2+((1-U)/U)*N1,
         FMP         FWORK1          < (1-V)*(N2+((1-U)/U)*N1,
         #/FST#      FWORK           < ET SAVE...
         PLR         A,B             < (1-U)/U,
         FMP         AFNIV4          < ((1-U)/U)*N4,
         FAD         AFNIV3          < N3+((1-U)/U)*N4,
         FMP         HINCV           < V*(N3+((1-U)/U)*N4),
         FAD         FWORK           < (1-V)*(N2+((1-U)/U)*N1)
                                     < +V*(N3+((1-U)/U)*N4),
         FMP         HINCU           < U*(...).
<
< FIN DE L'INTERPOLATION :
<
FONKT7:  EQU         $
<
< RESTAURATION DE (XS,YS) :
<
FONKT4:  EQU         $
         PLR         X
<
< CALCUL RECURSIF DE LA FONKTION :
<
         FMP         FPOND           < ET ON PONDERE PAR LES 'FPOND'
                                     < AFIN D'OBTENIR DES VALEURS ALEATOIRES
                                     < DECROISSANTES STATISTIQUEMENT...
         FAD         FCUMR           < QUE L'ON CUMULE,
         #/FST#      FCUMR           < ON A AINSI EN CHAQUE POINT UNE SOMME
                                     < DE FONKTION 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          SRECUR          < EST-CE FINI ???
         JGE         FONKT2          < OUI, ON ARRETE LA...
         BSR         AGOTO
         WORD        FONKT5          < NON, ON CONTINUE...
FONKT2:  EQU         $
<
< FIN DE RECURSION :
<
         #/FLD#      FCUMR           < (A,B)=SOMME DES FONCTION ALEATOIRES...
<
< 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))).
<
         FMP         UNMISR          < RDN*(1-(INF/SUP)),
         FAD         UNPISR          < RDN*(1-(INF/SUP))+32768*(1+(INF/SUP)),
         FMP         SUP64R          < (SUP/65536)*(...).
         BSR         AROND
         STA         NRECUR          < NOMBRE ALEATOIRE D'ITERATIONS...
FONCTN:  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.
         PSR         X
         ADR         X,X             < PASSAGE A UN INDEX FLOTTANT...
         FLD         &ALPASX
         #/FST#      FPASIX          < 'PASIX' FLOTTANT,
         FLD         &ALPASY
         #/FST#      FPASIY          < 'PASIY' 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 HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE,
         LA          YS
         SARD        NBITMO
         DV          PASIY
         MP          PASIY
         LR          B,Y             < Y(NOEUD HAUT-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...
<
< CAS OU LE POINT (XS,YS)
< COURANT EST UN NOEUD :
<
         BSR         ASPRDN          < LE POINT COURANT EST UN NOEUD...
         JMP         FONCT4          < VERS L'ACCES A LA VALEUR DU NOEUD...
<
< CAS OU LE POINT (XS,YS)
< COURANT N'EST PAS UN NOEUD :
<
FONCT3:  EQU         $
         NGR         X,A             < ABSCISSE DU NOEUD "HAUT-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 "HAUT-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.
         BSR         ASPRDN
         #/FST#      AFNIV1          < NIVEAU(XNOEUD,YNOEUD),
         LA          PASIX
         ADR         A,X
         BSR         ASPRDN
         #/FST#      AFNIV2          < NIVEAU(XNOEUD+PASIX,YNOEUD),
         LA          PASIY
         ADR         A,Y
         BSR         ASPRDN
         #/FST#      AFNIV3          < NIVEAU(XNOEUD+PASIX,YNOEUD+PASIY),
         LA          PASIX
         SBR         A,X
         BSR         ASPRDN
         #/FST#      AFNIV4          < NIVEAU(XNOEUD,YNOEUD+PASIY).
<
< INTERPOLATION ENTRE LES
< QUATRE SOMMETS D'UN CARRE
< PORTANT LES VALEURS (NIV1,
< NIV2,NIV3,NIV4), LES COOR-
< DONNEES DU POINT DANS LE
< CARRE ETANT (HINCU,HINCV) :
<
<
<        NOTA :
<                      ON DOIT INTERPOLER ENTRE
<                    LES NIVEAUX (N1,N2,N3,N4) SUR
<                    LES SOMMETS ((1-U,1-V),(U,1-V),(U,V),(1-U,V)),
<                    CE QUI CONDUIT A CALCULER LA
<                    FORMULE :
<
<                    (1-U)*(1-V)*N1+U*(1-V)*N2+U*V*N3+(1-U)*V*N4,
<
<                    QUI SE REECRIT, EN SUPPOSANT U#0 :
<
<                    (1-V)*((1-U)*N1+U*N2)+V*(U*N3+(1-U)*N4),
<
<                    SOIT :
<
<                    U*(1-V)*(N2+((1-U)/U)*N1)+U*V*(N3+((1-U)/U)*N4),
<
<                    ET ENFIN (SI U#0) :
<
<                    U*((1-V)*(N2+((1-U)/U)*N1)+V*(N3+((1-U)/U)*N4)).
<
<                    OU (SI V#0) :
<
<                    V*((1-U)*(N4+((1-V)/V)*N1)+U*(N3+((1-V)/V)*N2)).
<
         FCMZ        HINCU           < 'U' EST-IL NUL ???
         JNE         FONCT8          < NON, ON PEUT DIVISER PAR LUI...
         FCMZ        HINCV           < 'V' EST-IL NUL ???
         JNE         FONCT9          < NON, ON PEUT DIVISER PAR LUI...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
         JMP         FONCT7          < ET ON SORT...
<
< CAS OU 'V' EST NON NUL :
<
FONCT9:  EQU         $
         #/FLD#      F1              < 1,
         FSB         HINCU           < 1-U,
         #/FST#      FWORK1          < W1=1-U.
         #/FLD#      F1              < 1,
         FSB         HINCV           < 1-V,
         FDV         HINCV           < (1-V)/V,
         PSR         A,B             < ET SAVE...
         FMP         AFNIV1          < ((1-V)/V)*N1,
         FAD         AFNIV4          < N4+((1-V)/V)*N1,
         FMP         FWORK1          < (1-U)*(N4+((1-V)/V)*N1,
         #/FST#      FWORK           < ET SAVE...
         PLR         A,B             < (1-V)/V,
         FMP         AFNIV2          < ((1-V)/V)*N2,
         FAD         AFNIV3          < N3+((1-V)/V)*N2,
         FMP         HINCU           < U*(N3+((1-V)/V)*N2),
         FAD         FWORK           < (1-U)*(N4+((1-V)/V)*N1)
                                     < +U*(N3+((1-V)/V)*N2),
         FMP         HINCV           < V*(...).
         JMP         FONCT7          < ET L'INTERPOLATION EST FINIE...
<
< CAS OU 'U' EST NON NUL :
<
FONCT8:  EQU         $
         #/FLD#      F1              < 1,
         FSB         HINCV           < 1-V,
         #/FST#      FWORK1          < W1=1-V.
         #/FLD#      F1              < 1,
         FSB         HINCU           < 1-U,
         FDV         HINCU           < (1-U)/U,
         PSR         A,B             < ET SAVE...
         FMP         AFNIV1          < ((1-U)/U)*N1,
         FAD         AFNIV2          < N2+((1-U)/U)*N1,
         FMP         FWORK1          < (1-V)*(N2+((1-U)/U)*N1,
         #/FST#      FWORK           < ET SAVE...
         PLR         A,B             < (1-U)/U,
         FMP         AFNIV4          < ((1-U)/U)*N4,
         FAD         AFNIV3          < N3+((1-U)/U)*N4,
         FMP         HINCV           < V*(N3+((1-U)/U)*N4),
         FAD         FWORK           < (1-V)*(N2+((1-U)/U)*N1)
                                     < +V*(N3+((1-U)/U)*N4),
         FMP         HINCU           < U*(...).
<
< FIN DE L'INTERPOLATION :
<
FONCT7:  EQU         $
<
< RESTAURATION DE (XS,YS) :
<
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...
         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...
         FMP         RENORM          < QUE L'ON NORMALISE...
<
< 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 SPIR-MAPS (256,256) :
<
         FCMZ        PONSPI          < LES SPIR-MAPS 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 - D E P 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 SPIR-DEPS 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         ASPIRD          < (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         ASPIRD          < (A,B)=SIGMA(NIVEAU(X,Y)),
         #/FST#      FWORK           < ET SAVE...
         ADRI        I,Y
         BSR         ASPIRD          < (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         ASPIRD          < (A,B)=SIGMA(NIVEAU(X,Y)),
         #/FST#      FWORK           < ET SAVE...
         ADRI        I,X
         BSR         ASPIRD          < (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         ASPIRD          < (A,B)=SIGMA(NIVEAU(X,Y)),
         #/FST#      FWORK1
         ADRI        I,X
         BSR         ASPIRD          < (A,B)=SIGMA(NIVEAU(X+1,Y)),
         #/FST#      FWORK2
         ADRI        I,Y
         BSR         ASPIRD          < (A,B)=SIGMA(NIVEAU(X+1,Y-1)),
         #/FST#      FWORK
         ADRI        -I,X
         BSR         ASPIRD          < (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 "SPIR-DEP" :
<
FONC09:  EQU         $
         FMP         PONSPI          < ET CONTRIBUTION DES SPIR-DEPS...
<
<
<        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 SPIR-DEPS.
FONCT0:  EQU         $
<
< HOMOTHETIE :
<
         FMP         FHOMO
<
< RETOUR :
<
         PLR         X,Y
         RSR
         PAGE
<
<
<        G E N E R A T E U R   R E D O N N A N T   T O U J O U R S
<        L E   M E M E   V E C T E U R   A L E A T O I R E   E N
<        U N   P O I N T   D O N N E  :
<
<
<        ARGUMENT :
<                    (X,Y,W)=COORDONNEES DU POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=RAN(XS,YS,ZS,KJTER,GRAINF).
<
<
SPRAN:   EQU         $
<
< GENERATION ALEATOIRE :
<
         LR          X,A             < (A)=COORDONNEE 'X',
         MP          KJTER           < ON UTILISE 'KJTER' AFIN DE FAIRE
                                     < VARIER LA GENERATION ALEATOIRE A (X,Y)
                                     < CONSTANT SUIVANT LE NIVEAU DE REKUR-
                                     < SIVITE...
         EORR        B,A             < ET ON SE RAMENE SUR UN MOT...
         STA         FWORK4          < SAVE F1(XS)...
         LR          Y,A             < (A)=COORDONNEE 'Y',
         EOR         RAN1            < ??!???!
         STA         FWORK5          < SAVE F2(YS)...
         MP          FWORK4          < ET ON CONSTRUIT
         XR          A,B             < UNE FUNCTION 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          GRAINF          < D'OU F(GRAINF,KJTER,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 'RAN' A L'ECHELLE
<                    CALCULER L'EXPRESSION :
<
<                    (SUP/(-32768))*(-RAN/2+16384+(RAN/2-16384)*(INF/SUP)),
<
<                    QUI SE SIMPLIFIE EN :
<
<                    (SUP/65536)*(RAN*(1-(INF/SUP))+32768*(1+(INF/SUP))).
<
         FLT                         < ON FLOTTE 'RAN',
         FMP         UNMJS           < RAN*(1-(INF/SUP)),
         FAD         UNPJS           < RAN*(1-(INF/SUP))+32768*(1+(INF/SUP)),
         FMP         ZUP64           < (SUP/65536)*(...).
<
< ET SORTIE :
<
         RSR
         PAGE
<
<
<        C A L C U L   D ' U N E   T E X T U R E   3 D   P A R
<        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 :
<                    (TEXTUR)=((MOYENF)+(AMPLY)*F(XS,YS,ZS))*(CONTRIBUTION ALEAT
<                               (F(SIGMA(NIVEAU(X,Y)))*(CONTRIBUTION DES SPIR-MA
<
<
FUNCT:   EQU         $
         PSR         A,B             < SAUVEGARDES...
         PSR         X,Y,W           < SAUVEGARDES...
<
< FLOTTAGE DU POINT COURANT :
<
         LR          X,A             < COORDONNEE 'X' :
         AD          TRANX           < TRANSLATION EN 'X' DU GENERATEUR,
         FLT
         FMP         FHOMO
         #/FST#      HXS             < COORDONNEE 'XS' DU POINT COURANT.
         FIX
         STA         XS
         LR          Y,A             < COORDONNEE 'Y' :
         AD          TRANY           < TRANSLATION EN 'Y' DU GENERATEUR,
         FLT
         FMP         FHOMO
         #/FST#      HYS             < COORDONNEE 'YS' DU POINT COURANT.
         FIX
         STA         YS
         LR          W,A             < COORDONNEE 'Z' :
         AD          TRANZ           < TRANSLATION EN 'Z' DU GENERATEUR,
         FLT
         FMP         FHOMO
         #/FST#      HZS             < COORDONNEE 'ZS' DU POINT COURANT.
         FIX
         STA         ZS
<
< CHOIX DU TYPE DE TEXTURE :
<
         CPZ         IALEAT          < EST-ELLE ALEATOIRE ???
         JNE         FUNCT8          < OUI...
<
< CAS D'UNE TEXTURE QUI EST
< EN FAIT UNE COMBINAISON
< LINEAIRE DES COORDONNEES
< (XS,YS,ZS), CE QUI PERMET
< PAR EXEMPLE DE NE PRENDRE
< EN COMPTE QUE 'ZS'
< ET FAIRE AINSI DES LIGNES DE NIVEAUX :
<
         #/FLD#      FXS             < XS,
         FMP         FALTX           < FALTX*XS,
         BSR         ASFWOR
         #/FLD#      FYS             < YS,
         FMP         FALTY           < FALTY*YS,
         BSR         APFWOR          < FALTX*XS+FALTY*YS,
         #/FLD#      FZS             < ZS,
         FMP         FALTZ           < FALTZ*ZS,
         BSR         APFWOR          < FALTX*XS+FALTY*YS+FALTZ*ZS,
         FAD         FALTR           < FALTX*XS+FALTY*YS+FALTZ*ZS+FALTR.
         PLR         X,Y,W           < RESTAURATIONS,
         BSR         AGOTO
         WORD        FUNCT7          < ET VERS LA SORTIE...
<
< DISCRIMINATION DES
< CONTRIBUTIONS ALEATOIRES
< ET DES SPIR-MAPS :
<
FUNCT8:  EQU         $
         #/FLD#      PONRAN          < (A,B)=PONDERATION ALEATOIRE :
         FCAZ                        < EXISTE-T'ELLE ???
         JNE         FUNCT1          < OUI, ALLONS LA CALCULER...
         BSR         AGOTO
         WORD        FUNCT6          < NON, ALLONS VERS LA CONTRIBUTION DES
                                     < SPIR-MAPS, 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  :
<
<
FUNCT1:  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#      FKUMR           < INITIALISATION DU CUMUL DES FUNCTIONS
                                     < ALEATOIRES SCALANTES...
<
< ITERATION POUR CHAQUE
< FUNCTION ALEATOIRE :
<
         STZ         KJTER           < INITIALISATION DES REKURSIONS...
         LXI         K               < (X)=INDEX DES REKURSIONS...
FUNCT5:  EQU         $
         IC          KJTER           < COMPTAGE DES REKURSIONS...
<
< INITIALISATION DU MAILLAGE :
<
         LA          &ALPZIX
         STA         PAZIX           < 'PAZIX' ENTIER,
         LA          &ALPZIY
         STA         PAZIY           < 'PAZIY' ENTIER,
         LA          &ALPZIZ
         STA         PAZIZ           < 'PAZIZ' ENTIER.
         PSR         X
         ADR         X,X             < PAZSAGE A UN INDEX FLOTTANT...
         FLD         &ALPAZX
         #/FST#      FPAZIX          < 'PAZIX' FLOTTANT,
         FLD         &ALPAZY
         #/FST#      FPAZIY          < 'PAZIY' FLOTTANT.
         FLD         &ALPAZZ
         #/FST#      FPAZIZ          < 'PAZIZ' FLOTTANT.
         FLD         &ALPONT
         #/FST#      FPONT           < 'FPONT'.
<
< REKHERCHE DU NOEUD
< VOISIN PAR "DEFAUT" :
<
         LA          XS
         SARD        NBITMO
         DV          PAZIX
         MP          PAZIX
         LR          B,X             < X(NOEUD BAS-GAUCHE) DE LA MAILLE
                                     < COURANTE,
         LA          YS
         SARD        NBITMO
         DV          PAZIY
         MP          PAZIY
         LR          B,Y             < Y(NOEUD BAS-GAUCHE) DE LA MAILLE
                                     < COURANTE.
         LA          ZS
         SARD        NBITMO
         DV          PAZIZ
         MP          PAZIZ
         LR          B,W             < Z(NOEUD BAS-GAUCHE) DE LA MAILLE
                                     < COURANTE.
         LA          XS
         CPR         A,X             < EST-ON EN UN NOEUD ???
         JNE         FUNCT3          < NON...
         LA          YS              < PEUT-ETRE :
         CPR         A,Y             < EST-ON EN UN NOEUD ???
         JNE         FUNCT3          < NON, INTERPOLONS...
         LA          ZS              < PEUT-ETRE :
         CPR         A,W             < EST-ON EN UN NOEUD ???
         JNE         FUNCT3          < NON, INTERPOLONS...
<
< CAS OU LE POINT (XS,YS,ZS)
< COURANT EST UN NOEUD :
<
         BSR         ASPRAN          < LE POINT COURANT EST UN NOEUD...
         BSR         AGOTO
         WORD        FUNCT4          < VERS L'ACCES A LA VALEUR DU NOEUD...
<
< CAS OU LE POINT (XS,YS,ZS)
< COURANT N'EST PAZ UN NOEUD :
<
FUNCT3:  EQU         $
         NGR         X,A             < ABSCISSE DU NOEUD "BAS-GAUCHE"...
         FLT
         FAD         HXS             < X-XNOEUD,
         FDV         FPAZIX          < (X-XNOEUD)/PAZIX,
         #/FST#      HJNCU           < 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         HYS             < Y-YNOEUD,
         FDV         FPAZIY          < (Y-YNOEUD)/PAZIY,
         #/FST#      HJNCV           < 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         HZS             < Z-ZNOEUD,
         FDV         FPAZIZ          < (Z-ZNOEUD)/PAZIZ,
         #/FST#      HJNCW           < 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         ASPRAN
         #/FST#      AFNJV1          < NIVEAU(XN,YN,ZN),
         LA          PAZIX
         ADR         A,X
         BSR         ASPRAN
         #/FST#      AFNJV2          < NIVEAU(XN+PAZIX,YN,ZN),
         LA          PAZIY
         ADR         A,Y
         BSR         ASPRAN
         #/FST#      AFNJV3          < NIVEAU(XN+PAZIX,YN+PAZIY,ZN),
         LA          PAZIX
         SBR         A,X
         BSR         ASPRAN
         #/FST#      AFNJV4          < NIVEAU(XN,YN+PAZIY,ZN),
         LA          PAZIZ
         ADR         A,W
         BSR         ASPRAN
         #/FST#      AFNJV5          < NIVEAU(XN,YN+PAZIY,ZN+PAZIZ),
         LA          PAZIX
         ADR         A,X
         BSR         ASPRAN
         #/FST#      AFNJV6          < NIVEAU(XN+PAZIX,YN+PAZIY,ZN+PAZIZ),
         LA          PAZIY
         SBR         A,Y
         BSR         ASPRAN
         #/FST#      AFNJV7          < NIVEAU(XN+PAZIX,YN,ZN+PAZIZ),
         LA          PAZIX
         SBR         A,X
         BSR         ASPRAN
         #/FST#      AFNJV8          < NIVEAU(XN,YN,ZN+PAZIZ).
<
< 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 (HJNCU,HJNCV,HJNCW) :
<
<
<        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         HJNCU           < 1-U,
         #/FST#      HJNCU1          < HJNCU1=1-HJNCU.
         #/FLD#      F1              < 1,
         FSB         HJNCV           < 1-V,
         #/FST#      HJNCV1          < HJNCV1=1-HJNCV.
         #/FLD#      F1              < 1,
         FSB         HJNCW           < 1-W,
         #/FST#      HJNCW1          < HJNCW1=1-HJNCW.
<
< INTERPOLATION TRI-DIMENSIONNELLE :
<
                                     < 1-W,
         FMP         AFNJV1          < (1-W)*N1,
         #/FST#      FWORK
         #/FLD#      HJNCW           < W,
         FMP         AFNJV8          < W*N8,
         FAD         FWORK           < (1-W)*N1+W*N8,
         FMP         HJNCU1          < (1-U)*((1-W)*N1+W*N8),
         #/FST#      FWORK1          < ET SAVE...
         #/FLD#      HJNCW1          < 1-W,
         FMP         AFNJV2          < (1-W)*N2,
         #/FST#      FWORK
         #/FLD#      HJNCW           < W,
         FMP         AFNJV7          < W*N7,
         FAD         FWORK           < (1-W)*N2+W*N7,
         FMP         HJNCU           < U*((1-W)*N2+W*N7),
         FAD         FWORK1          < U*((1-W)*N2+W*N7)+(1-U)*((1-W)*N1+W*N8),
         FMP         HJNCV1          < (1-V)*(U*((1-W)*N2+W*N7)
                                     <        +(1-U)*((1-W)*N1+W*N8)),
         #/FST#      FWORK1          < ET SAVE...
         #/FLD#      HJNCW1          < 1-W,
         FMP         AFNJV3          < (1-W)*N3,
         #/FST#      FWORK
         #/FLD#      HJNCW           < W,
         FMP         AFNJV6          < W*N6,
         FAD         FWORK           < (1-W)*N3+W*N6,
         FMP         HJNCU           < U*((1-W)*N3+W*N6),
         #/FST#      FWORK2          < ET SAVE...
         #/FLD#      HJNCW1          < 1-W,
         FMP         AFNJV4          < (1-W)*N4,
         #/FST#      FWORK
         #/FLD#      HJNCW           < W,
         FMP         AFNJV5          < W*N5,
         FAD         FWORK           < (1-W)*N4+W*N5,
         FMP         HJNCU1          < (1-U)*((1-W)*N4+W*N5),
         FAD         FWORK2          < (1-U)*((1-W)*N4+W*N5)+U*((1-W)*N3+W*N6),
         FMP         HJNCV           < V*((1-U)*((1-W)*N4+W*N5)
                                     <    +U*((1-W)*N3+W*N6)),
         FAD         FWORK1          < CUMUL GENERAL...
<
< FIN DE L'INTERPOLATION :
<
FUNCT4:  EQU         $
         PLR         X
<
< CALCUL REKURSIF DE LA FUNCTION :
<
         FMP         FPONT           < ET ON PONDERE PAR LES 'FPONT'
                                     < AFIN D'OBTENIR DES VALEURS ALEATOIRES
                                     < DECROISSANTES STATISTIQUEMENT...
                                     < NOTA : ON NE DIVISE PLUS PAR 'FPONT0',
                                     < CAR LA DEFINITION DE 'RENORN' INCLUE
                                     < SON INVERSE, ET DONC : FPONT0/FPONT0=1...
         FAD         FKUMR           < QUE L'ON CUMULE,
         #/FST#      FKUMR           < ON A AINSI EN CHAQUE POINT UNE SOMME
                                     < DE FUNCTION ALEATOIRE DONT LA FREQUENCE
                                     < AUGMENTE PROGRESSIVEMENT PAR REDUCTION
                                     < DE LA MAILLE, MAIS DONT L'AMPLYTUDE
                                     < DIMINUE STATISTIQUEMENT...
<
< PAZSAGE A LA COMPOSANTE SUIVANTE :
<
         ADRI        I,X             < PROGRESSION DE L'INDEX DE REKURSION...
         LR          X,A
         CP          NREKUR          < EST-CE FINI ???
         JGE         FUNCT2          < OUI, ON ARRETE LA...
         BSR         AGOTO
         WORD        FUNCT5          < NON, ON CONTINUE...
FUNCT2:  EQU         $
<
< FIN DE REKURSION :
<
         #/FLD#      FKUMR           < ET ON RENVOIE LA SOMME DES
                                     < FUNCTIONS ALEATOIRES...
         FDV         RENORN          < ET ON MULTIPLIE PAR 'AMPLY', 'AMPLYR',
                                     < ET ON DIVISE PAR LE SIGMA DES 'FPONT'...
<
< CALCUL FINAL DE LA
< CONTRIBUTION ALEATOIRE :
<
         FAD         MOYENF          < ET TRANSLATION.
         FMP         PONRAN          < ET PONDERATION PAR LA CONTRIBUTION
                                     < ALEATOIRE...
FUNCT6:  EQU         $
<
< TEST DE LA CONTRIBUTION
< DES SPIR-MAPS (256,256) :
<
         FCMZ        PONSPJ          < LES SPIR-MAPS SONT-ELLES LA ???
         JE          FUNCT0          < NON, (A,B) DONNE LA FUNCTION...
<
<
<        C O N T R I B U T I O N   D E S   S P I R - D E P 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 SPIR-DEPS 2*(256,256) :
<
         LA          XS              < (A)=ABSCISSE '512',
         SLRS        XC512/NPOL=K
         LR          A,X             < (X)=ABSCISSE '256'.
         JC          FUNC01          < ELLE NE "TOMBE PAZ 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          FUNC02          < ELLE NE "TOMBE PAZ 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         ASPIRD          < (A,B)=SIGMA(NIVEAU(X,Y)).
         FMP         F4              < ET ON LE QUADRUPLE :
                                     < (A,B)=4*SIGMA(NIVEAU(X,Y)).
         JMP         FUNC09          < VERS LA SORTIE...
<
< CAS D'UN POINT '512'
< ENTRE DEUX POINTS '256'
< SUR UNE VERTICALE :
<
FUNC02:  EQU         $
         BSR         ASPIRD          < (A,B)=SIGMA(NIVEAU(X,Y)),
         #/FST#      FWORK           < ET SAVE...
         ADRI        I,Y
         BSR         ASPIRD          < (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         FUNC09          < VERS LA SORTIE...
<
< AUTRES CAS :
<
FUNC01:  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          FUNC03          < ELLE NE "TOMBE PAZ 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         ASPIRD          < (A,B)=SIGMA(NIVEAU(X,Y)),
         #/FST#      FWORK           < ET SAVE...
         ADRI        I,X
         BSR         ASPIRD          < (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         FUNC09          < VERS LA SORTIE...
<
< CAS D'UN POINT '512' AU
< CENTRE D'UN CARRE FAIT
< DE QUATRE POINTS '256' :
<
FUNC03:  EQU         $
         BSR         ASPIRD          < (A,B)=SIGMA(NIVEAU(X,Y)),
         #/FST#      FWORK1
         ADRI        I,X
         BSR         ASPIRD          < (A,B)=SIGMA(NIVEAU(X+1,Y)),
         #/FST#      FWORK2
         ADRI        I,Y
         BSR         ASPIRD          < (A,B)=SIGMA(NIVEAU(X+1,Y+1)),
         #/FST#      FWORK
         ADRI        -I,X
         BSR         ASPIRD          < (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 "SPIR-DEP" :
<
FUNC09:  EQU         $
         FMP         PONSPJ          < ET CONTRIBUTION DES SPIR-DEPS...
<
<
<        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 SPIR-DEPS.
<
<
<        M O D U L A T I O N  :
<
<
FUNCT0:  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         NFUNCT          < Y-A-T'IL UNE MODULATION ???
         JE          FUNCT7          < NON, (A,B) EST BON...
         PSR         A,B             < OUI, ON EMPILE LA VALEUR COURANTE DE
                                     < LA FUNCTION RAN(X,Y,Z)...
         PSR         X,Y,W           < ET SAUVEGARDE DES COORDONNEES, ON NE
                                     < SAIT JAMAIS...
         LA          NFUNCT          < (A)=INDEX DE LA FUNCTION 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)=RAN(X,Y,Z) COURANTE,
         JMP         FUNCT7          < 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 :
<
GINFUN:  EQU         $
         #/FST#      FWORK           < SAUVEGARDE DU FACTEUR MULTIPLICATIF,
         PLR         X,Y,W           < RESTAURATION DES COORDONNEES (X,Y,Z)...
         PLR         A,B             < (A,B)=RAN(X,Y,Z),
         FMP         FWORK           < ET MODULATION...
FUNCT7:  EQU         $
<
< HOMOTHETIE :
<
         FMP         FHOMO
<
< CALCUL DE LA TRANSLATION DE TEXTURAGE :
<
         PSR         X
         BSR         AROND           < (A)=VALEUR ALEATOIRE,
         BSR         APNIV           < CORECTION...
                                     < (NOTA : CE SOUS-PROGRAMME EST AUSSI
                                     < APPELE AILLEURS, ET CES APPELS POUR-
                                     < RAIENT ETRE SUPPRIMES, MAIS ON NE SAIT
                                     < JAMAIS...).
         LR          A,X             < (X)=INDEX ALEATOIRE,
         LBY         &ALTIVO         < (A)=TRANSLATION DE TEXTURAGE...
         STA         TEXTUR          < ET SAUVEGARDE POUR 'POINT'...
         PLR         X
<
< RETOUR :
<
         PLR         A,B             < RESTAURATIONS...
         RSR
         PAGE
<
<
<        M I S E   D ' U N   N I V E A U
<        D A N S   ( M I N N I V , M A X N I V )  :
<
<
<        ARGUMENT :
<                    (A)=NIVEAU A VALIDER.
<
<
<        RESULTAT :
<                    (A)=NIVEAU DANS (MINNIV,MAXNIV).
<
<
PNIV:    EQU         $
         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         $
         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...
<
< MISE A L'ECHELLE :
<
         FLT                         < ET PASSAGE EN FLOTTANT...
         FAD         TRANMT          < TRANSLATION ET
         FMP         MULTMT          <                MISE A L'ECHELLE...
<
< PRISE EN COMPTE DE LA
< GENERATION ALEATOIRE
< ET DES SPIR-DEPS :
<
         PLR         X               < RESTAURATION DE LA COORDONNEE 'X'...
         CPZ         IMODMT          < FAUT-IL LES IGNORER ???
         JE          NIVO4           < OUI ('NEXIST')...
         PSR         A,B             < NON : SAUVEGARDE DE L'ENTREE BANDE,
         BSR         AFONKT          < (A,B)=CONTRIBUTION ALEATOIRE ET DES
                                     <       SPIR-DEPS,
         #/FST#      FWORK           < QUE L'ON SAUVEGARDE,
         PLR         A,B
         FAD         FWORK           < ET CUMUL GENERAL :
                                     < 'BANDE'+'ALEATOIRE'+'SPIR-DEP'.
NIVO4:   EQU         $
<
< ET RETOUR :
<
         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#      POLEX2
         FDV         POLEX7
         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
<
<
<        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 :
<                    (X)=COORDONNEE 'X' (PERMET D'INDEXER LE 'Z'...),
<                    (FXN,FYN,FZN)=COORDONNEES DU VECTEUR NORMAL,
<                    (FXL,FYL,FZL)=COORDONNEES DE LA SOURCE LUMINEUSE.
<
<
<        RESULTAT :
<                    (A,B)=INTENSITE LUMINEUSE.
<
<
INTEN:   EQU         $
<
< INITIALISATIONS :
<
         PSR         X               < SAUVEGARDE DE LA COORDONNEE 'X'...
         ADR         X,X             < ET PASSAGE A UN INDEX FLOTTANT...
<
< 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,
<
< RECHERCHE DE Z(A) :
<
         FLD         &ALIG           < Z(A),
         PLR         X               < (X)=COORDONNEE 'X'...
<
< CALCUL DU RAYON LUMINEUX :
<
         FSB         FZL             < Z(A)-Z(L),
         FNEG
         #/FST#      FZS             < (FZS)=Z(L)-Z(A).
         LR          Y,A             < Y(A),
         FLT
         FSB         FYL             < Y(A)-Y(L),
         FNEG
         #/FST#      FYS             < (FYS)=Y(L)-Y(A).
         LR          X,A             < X(A),
         FLT
         FSB         FXL             < X(A)-X(L),
         FNEG
         #/FST#      FXS             < (FXS)=X(L)-X(A).
<
< 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         GEN33           < NON, OK...
         #/FLD#      FNIVBA          < OUI, ON LE "SATURE"...
GEN33:   EQU         $
<
< ET RETOUR :
<
         BSR         ATSFLO
         RSR
         PAGE
<
<
<        T R A C E   D ' U N   S E G M E N T   V E R T I C A L  :
<
<
<        ARGUMENTS :
<                    (VECGX1,VECGY1)=COORDONNEES DU POINT "BAS",
<                    (VECGX2,VECGY2)=COORDONNEES DU POINT "HAUT",
<                    (INTENB)=NIVEAU "BAS",
<                    (INTENH)=NIVEAU "HAUT".
<
<
SEGV:    EQU         $
         CPZ         IPERS           < EST-CE UNE VUE D'AVION ???
         JNE         SEGV20          < NON, UNE PERSPECTIVE...
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST CI-DESSUS VA MERDER !!!
XEIF%:   VAL         ENDIF
<
< CAS DE LA VUE D'AVION :
<
         #/FLD#      INTENH
         BSR         AROND           < (A)=NIVEAU D'ECLAIRAGE DU POINT COURANT,
         CPZ         ITEXTU          < DOIT-ON TEXTURER ???
         JE          SEGV30          < NON...
         PSR         A,W             < OUI, SAUVEGARDE DE 'W' ET DU NIVEAU...
         LA          VECGY2
         LR          A,W             < (X,Y,W)=COORDONNEES (X,Y,Z) DU POINT
                                     <         TRI-DIMENSIONNEL COURANT,
         BSR         AFUNCT          < (TEXTUR)=TRANSLATION DE TEXTURAGE (X,Y,Z)
         PLR         A,W
SEGV30:  EQU         $
         BSR         APOINT          < ET MARQUAGE DE CELUI-CI (X,Y).
         JMP         SEGV21          < ET C'EST TOUT...
<
< CAS DE LA PERSPECTIVE :
<
SEGV20:  EQU         $
<
< INITIALISATIONS :
<
         PSR         X,Y,W           < SAUVEGARDE DES COORDONNEES 'X' ET 'Y'...
                                     < ET DE 'W'...
         LR          Y,W             < (W)=SAUVEGARDE DE LA COORDONNEE 'Y'...
<
< CALCUL DU NOMBRE DE POINTS :
<
         LA          VECGY2          < (A)=ORDONNEE "HAUTE",
         SB          VECGY1          < (A)=ORDONNEE "HAUTE"-ORDONNEE "BASSE",
         LR          A,X             < (A)=NOMBRE D'INTERVALLES,
         ADRI        Z,X             < (X)=NOMBRE DE POINTS A TRACER...
         JAE         SEGV00          < RIEN A FAIRE, PAS D'INTERVALLE...
         JAG         SEGV01          < OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
SEGV01:  EQU         $
<
< CALCUL DU PAS D'INTER-
< POLATION DES NIVEAUX :
<
         FLT                         < IL Y A AU MOINS UN INTERVALLE :
         #/FST#      FWORK1
         #/FLD#      INTENB          < (A,B)=INTENSITE "BASSE",
         FSB         INTENH          < (A,B)=INTENSITE "BASSE"-INTENSITE "HAUTE"
         FDV         FWORK1          < (A,B)=PAS D'INTERPOLATION DE L'INTENSITE
                                     <       LUMINEUSE...
         #/FST#      PINTEN          < ET MEMORISATION...
SEGV00:  EQU         $
<
< TRACE POINT A POINT :
<
         LY          VECGY2          < (Y)=ORDONNEE "HAUTE",
         #/FLD#      INTENH          < (A,B)=INTENSITE LUMINEUSE COURANTE,
SEGV10:  EQU         $
         PSR         A,B,X           < QUE L'ON SAUVEGARDE, AINSI QUE LE DE-
                                     < COMPTE DES POINTS A TRACER...
         BSR         AROND           < (A)=NIVEAU ENTIER DU POINT COURANT,
         LX          VECGX2          < (X)=(VECGX1)=(VECGX2)=ABSCISSE DU POINT
                                     <     COURANT,
                                     < (Y)=ORDONNEE OK...
         CPZ         ITEXTU          < DOIT-ON TEXTURER ???
         JE          SEGV31          < NON...
         XR          Y,W             < OUI,
                                     < (X,Y,W)=COORDONNEES (X,Y,Z) DU POINT
                                     <         TRI-DIMENSIONNEL COURANT,
         BSR         AFUNCT          < (TEXTUR)=TRANSLATION DE TEXTURAGE (X,Y,Z)
         XR          Y,W             < RESTAURE 'Y' ET 'W'...
SEGV31:  EQU         $
         BSR         APOINT          < ET TRACE DU POINT COURANT...
         PLR         A,B,X           < RESTAURE :
                                     < (X)=DECOMPTE DES POINTS,
                                     < (A,B)=NIVEAU COURANT,
         FAD         PINTEN          < QUE L'ON MODIFIE...
         ADRI        -I,Y            < ET MODIFICATION DE L'ORDONNEE...
         JDX         SEGV10          < VERS LE POINT COURANT, S'IL EXISTE...
<
< ET RETOUR :
<
         PLR         X,Y,W           < ET ENFIN, RESTAURE :
                                     < (X,Y)=COORDONNES COURANTES DE GENERATION.
SEGV21:  EQU         $
         RSR
         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         $
<
< INITIALISATION DES DIFFERENTS
< POINTEURS "ROTATIFS" :
<
         LRM         A,B,X,Y
         WORD        LIGP2,X         < RELAI VERS LA LIGNE SUIVANTE-SUIVANTE,
         WORD        LIGP1,X         < RELAI VERS LA LIGNE SUIVANTE,
         WORD        LIG,X           < RELAI VERS LA LIGNE COURANTE,
         WORD        LIGM1,X         < RELAI VERS LA LIGNE PRECEDENTE.
         STA         ALIGP2
         STB         ALIGP1
         STX         ALIG
         STY         ALIGM1
         LRM         A,B
         WORD        INTH,X          < ACCES A LA LISTE DES 'INTH' DE LA LIGNE
                                     < COURANTE (Y+I),
         WORD        INTHM1,X        < ACCES A LA LISTE DES 'INTH' DE LA LIGNE
                                     < PRECEDENTE (Y).
         STA         AINT
         STB         AINTM1
<
< MISE EN PLACE DE LA
< SOURCE DE LA FONCTION :
<
         LA          AFONKT          < (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...
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         INIT20          < ON FERA DU SEQUENTIEL STRICT...
         STA         DEMMT+ARGESC    < ADRESSE DU PREMIER BLOC A LIRE,
INIT20:  EQU         $
         LA          ZBUFMT
         STA         IBUFMT          < POUR FORCER LA PREMIERE LECTURE...
<
< INITIALISATION DES
< DIFFERENTS BUFFERS :
<
         LX          VECTNC          < (X)=INDEX DES INITIALISATIONS...
         ADR         X,X             < PASSAGE A UN INDEX FLOTTANT...
         IF          DFLOT-W-W,,XEIF%,
         IF          ATTENTION : CE QUI PRECEDE EST IDIOT !!!
XEIF%:   VAL         ENDIF
         #/FLD#      F0              < (A,B)=VALEUR D'INITIALISATION DES
                                     <       BUFFERS DE LIGNE...
INIT02:  EQU         $
         FST         &ALIGP2         < INITIALISATION
         FST         &ALIGP1         <                DES
         FST         &ALIG           <                    BUFFERS
         FST         &ALIGM1         <                            DE LIGNE...
         FST         &AINT           < LISTE
         FST         &AINTM1         <       DES 'INTH'...
         ADRI        -I*DFLOT,X      < ET REGRESSION,
         CPZR        X               < EST-CE FINI ???
         JGE         INIT02          < NON...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST CI-DESSOUS EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IALIAS          < L'ANTI-ALIASING EST-IL DEMANDE ???
         JE          INIT04          < NON, RIEN A FAIRE...
         LX          VECTNC          < OUI, (X)=INDEX DES INITIALISATIONS...
         LYI         K-I-I           < (Y)=VALEUR INEXISTANTE D'ORDONNEE...
INIT03:  EQU         $
         STY         &ALISTY         < INITIALISATION DU BUFFER DE DETECTION
                                     < DES DISCONTINUITES...
         ADRI        -I,X            < ET REGRESSION,
         CPZR        X               < EST-CE FINI ???
         JGE         INIT03          < NON...
INIT04:  EQU         $
<
< INVERSION DE 'LNIVO' :
<
XXINIT:: VAL         NIVBAS          < VALEUR TRES ARBITRAIRE D'INITIALISATION
                                     < DES ENTREES DE 'LNOVI' QUI NE FIGURENT
                                     < PAS DANS 'LNIVO' ; NOTONS MALGRE TOUT
                                     < QU'IL EVITE L'UTILISATION DU NOIR...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST CI-DESSOUS EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IALIAS          < L'ANTI-ALIASING EST-IL DEMANDE ???
         JE          INIT07          < NON, RIEN A FAIRE...
         LXI         XXN255          < (X)=INDEX D'INITIALISATION DE 'LNOVI',
         LAI         XXINIT          < (A)=VALEUR (FINALEMENT ASSEZ ARBITRAIRE)
                                     <     DES ENTREES NON UTILISEES DE 'LNOVI'.
INIT05:  EQU         $
         STBY        &ALNOVI         < INITIALISATION,
         ADRI        -I,X            < PASSAGE A L'ENTREE PRECEDENTE,
         CPZR        X               < SI ELLE EXISTE...
         JGE         INIT05          < OUI...
         IF          XXNOIR-K,,XEIF%,
         IF          ATTENTION : LE TEST DE FIN EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
         LXI         XXN255          < (X)=INDEX D'INVERSION DE 'LNIVO',
                                     <     DONNE LE 'NIVEAU CALCULE',
INIT06:  EQU         $
         LBY         &ALNIVO         < (A)=NIVEAU TRACE(NIVEAU CALCULE),
         XR          A,X
         STBY        &ALNOVI         < (A)=NIVEAU CALCULE(NIVEAU TRACE).
                                     < NOTA : RAPPELONS QUE LA CORRESPONDANCE
                                     < N'EST PAS BIJECTIVE, ET QUE LA MEME
                                     < ENTREE PEUT ETRE POSITIONNE PLUSIEURS
                                     < FOIS ; SEULE LA DERNIERE CORRESPONDANCE
                                     < EST CONSERVEE...
         XR          A,X
         ADRI        -I,X            < PASSAGE A L'ENTREE PRECEDENTE,
         CPZR        X               < SI ELLE EXISTE...
         JGE         INIT06          < OUI...
         IF          XXNOIR-K,,XEIF%,
         IF          ATTENTION : LE TEST DE FIN EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
INIT07:  EQU         $
<
< 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 SPIR-MAPS :
<
         LA          NMM
         FLT
         #/FST#      FNMM            < FLOTTAGE DE 'NMM'...
<
<
<        I N I T I A L I S A T I O N   D U   C A L C U L
<        D E S   S P I R - D E P S   D E   D E P L A C E M E N T
<                    V E R T I C A L  :
<
<
         LA          NDM
         CPI         MAXNDM          < ET VALIDATION DE 'NDM'...
         JLE         SPIRI7          < OK...
         QUIT        XXQUIT          < E R R E U R   P A R A M E T R E ...
SPIRI7:  EQU         $
         LX          XCENTR          < DEFINITION DU
         LY          YCENTR          <               CENTRE DE 'TV1'/'TV2'.
<
< INITIALISATION DE LA SPIR-DEP :
<
         #/FLD#      F0
         #/FST#      FCOEFC          < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         LA          PASD
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         W
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIR-DEP.
<
< PARCOURS D'UN BRAS :
<
SPIRI1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPIRI2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NDM             < FINI ???
         JG          SPIRI3          < OUI...
         LR          X,A             < NON, TEST DE LA COORDONNEE 'X' :
         JAL         SPIRI4          < LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPIRI4          < HORS-ECRAN...
         LR          Y,A             < TEST DE LA COORDONNEE 'Y' :
         JAL         SPIRI4          < HORS-ECRAN...
         CPI         NLIGM1
         JG          SPIRI4          < HORS-ECRAN...
<
< CALCUL DU COEFFICIENT
< DE PONDERATION DE CHAQUE
< POINT D'UNE SPIR-DEP :
<
         PSR         X
         LR          X,A
         SB          XCENTR
         FLT
         #/FST#      FWORK1          < ON VA TRAVAILLER EN RELATIF PAR RAPPORT
                                     < AU CENTRE D'UNE SPIR-DEP QUELCONQUE...
         FMP         FWORK1          < XR**2 (OU 'R' SIGNIFIE 'RELATIF'...),
         #/FST#      FWORK
         LX          NP
         ADRI        -I,X
         ADR         X,X             < (X)=INDEX FLOTTANT DU FUTUR COEFFICIENT
                                     <     DE PONDERATION QUE L'ON CALCULE...
         LR          Y,A
         SB          YCENTR
         FLT
         #/FST#      FWORK2          < YR,
         FMP         FWORK2          < YR**2,
         FAD         FWORK           < XR**2+YR**2, SOIT LE CARRE DU RAYON
                                     < POLAIRE DU POINT COURANT AU CENTRE DE
                                     < LA SPIR-DEP...
         FMP         FCOEFB          < QUE L'ON PONDERE (EN GENERAL PAR -1,
                                     < AFIN D'AVOIR UNE GAUSSIENNE...),
         BSR         AEXPON          < ET ON EXPONENTIE,
         FST         &ALCOEF         < CE QUI DONNE LE COEFFICIENT DE PONDERA-
                                     < TION DU POINT COURANT DE LA SPIR-DEP DE
                                     < RANG (NP)-1.
         FAD         FCOEFC
         #/FST#      FCOEFC          < ET L'ON CUMULE...
         PLR         X
<
< PARCOURS DE LA SPIR-DEP :
<
SPIRI4:  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          SPIRI2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPIRI5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPIRI5:  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         SPIRI1          < VERS LA BRANCHE SUIVANTE
<
< FIN DU CALCUL DES COEFFICIENTS
< DE PONDERATION D'UNE SPIR-DEP :
<
SPIRI3:  EQU         $
         #/FLD#      FCOEFC
         FDV         FCOEFA
         #/FST#      FCOEFC          < ET PONDERATION DE LA SOMME DES
                                     < COEFFICIENTS...
<
< PAS INITIAUX DU MAILLAGE :
<
         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*K*K CE QUI DONNE
                                     < L'AIRE DE LA MAILLE ELEMENTAIRE...
         BSR         ARAC
         #/FST#      FPOND0          < LA PONDERATION INITIALE DES FONCTIONS
                                     < ALEATOIRES EST EN FAIT LA TAILLE DE LA
                                     < MAILLE...
<
< 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...
<
< INITIALISATION DU CALCUL DES "FUITES" :
<
         LA          VECTNL          < 255,
         FLT
         #/FST#      FWORK
         #/FLD#      F1              < 1,
         FSB         FPERSB          < 1-FPERSB,
         FDV         FWORK           < (1-FPERSB)/255,
         #/FST#      FPERSA          < FPERSA=(1-FPERSB)/255.
<
< 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          GEN400          < NON, RIEN A VALIDER...
GEN401:  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 MONTAGNE (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         GEN402          < ERREUR : 'ZL' EST NON NUL !!!
         #/FLD#      FXL
         BSR         AROND
         CP          VECTNC
         JG          GEN400          < OK, LA SOURCE LUMINEUSE EST A DROITE DE
                                     < LA MONTAGNE...
GEN402:  EQU         $
         QUIT        XXQUIT          < ERREUR SUR LA SOURCE LUMINEUSE, ON
                                     < REDEMANDE LES PARAMETRES...
         JMP         GEN401          < ET ON REVALIDE...
GEN400:  EQU         $
         #/FLD#      FNIVMX
         #/FST#      FNIVC           < ON INITIALISE A PRIORI 'FNIVC' POUR
                                     < LE CAS OU L'OMBRAGE N'EST PAS DEMANDE...
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
         FDV         FNIVOM
         #/FST#      FPENOM          < FPENOM=NPENOM/FNIVOM.
<
<
<        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'.
         #/FLD#      FPOND0
         #/FST#      FPOND           < 'FPOND'.
<
< REDUCTION RECURSIVE DU MAILLAGE :
<
         #/FLD#      EXPOP0
         #/FST#      EXPOP           < INITIALISATION DE L'EXPOSANT...
         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...
         FAD         FPASIX
         BSR         AROND           < (A)=PASIX+PASIY,
         PLR         X               < RESTAURE L'INDEX DE RECURSION...
         ADRI        I,X             < PASSAGE A LA RECURSION SUIVANTE...
         CPI         W+W             < EST-ON ARRIVE A UNE MAILLE IRREDUCTIBLE,
                                     < SOIT ELEMENTAIRE (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...
         STX         SRECUR          < ET DE SA SAUVEGARDE AU CAS OU EN FAIT
                                     < IL SERAIT CALCULE ALEATOIREMENT...
<
< INITIALISATION DU GENERATEUR
< ALEATOIRE DE 'NRECUR' :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT VA MERDER !!!
XEIF%:   VAL         ENDIF
         CPZ         IRDNRC          < EST-CE NECESSAIRE ???
         JE          GEN223          < NON...
         LA          SUPREC          < OUI :
         CP          NRECUR          < ET VALIDATION :
         JLE         GEN221          < OK...
         LA          NRECUR          < ON PREND MIN(NRECUR,SUPREC)...
GEN221:  EQU         $
         LR          A,Y             < (Y)=MIN(NRECUR,SUPREC)...
         FLT
         #/FST#      FSUP            < BORNE SUPERIEURE ('SUP'),
         LA          INFREC
         CPR         Y,A             < ET VALIDATION :
         JLE         GEN222          < OK...
         LR          Y,A             < ON PREND MIN(MIN(NRECUR,SUPREC),INFREC)..
GEN222:  EQU         $
         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#      UNMISR          < UNMIS=1-(INF/SUP).
         PLR         A,B             < INF/SUP,
         FAD         F1              < 1+(INF/SUP),
         FMP         INF32           < 32768*(1+(INF/SUP)),
         #/FST#      UNPISR          < UNPIS=32768*(1+(INF/SUP)).
         #/FLD#      FSUP            < SUP,
         FDV         INF64           < SUP/65536,
         #/FST#      SUP64R          < SUP64=SUP/65536.
GEN223:  EQU         $
<
< FACTEUR DE RENORMALISATION :
<
         #/FLD#      AMPLI
         FMP         AMPLIR
         FDV         FPOND0
         #/FST#      RENORM          < RENORM=AMPLI*AMPLIR/FPOND0.
<
<
<        I N I T I A L I S A T I O N S   D E   T E X T U R A G E
<                    T R I - D I M E N S I O N N E L  :
<
<
         CPZ         ITEXTU          < Y-AURA-T'IL TEXTURAGE ???
         JNE         GEN999          < OUI, INITIALISONS...
         BR          ANTEXT          < NON...
GEN999:  EQU         $
<
< DEFINITION DU SEUIL
< DE DEFINITION DE LA
< SURFACE :
<
         LB          SCOUCH          < (B)=SEUIL A PRIORI ('SCOUCH')...
         LA          NFUNCT          < (A)=FUNCTION DE MODULATION DE LA FUNCTION
                                     <     ALEATOIRE RAN(X,Y,Z) :
         CPI         FGAUSS          < EST-CE LA MODULATION GAUSSIENNE ???
         JNE         INIT30          < 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...
INIT30:  EQU         $
         STB         ICOUCH          < MISE A JOUR DU SEUIL COURANT DE DEFINI-
                                     < TION DE LA SURFACE...
<
< GENERATEUR ALEATOIRE :
<
         LA          SUPRAN
         FLT
         #/FST#      GSUP            < BORNE SUPERIEURE ('SUP'),
         LA          INFRAN
         FLT
         #/FST#      GINF            < BORNE INFERIEURE ('INF'),
         FDV         GSUP            < INF/SUP,
         PSR         A,B             < ET SAVE...
         FSB         F1              < (INF/SUP)-1,
         FNEG                        < 1-(INF/SUP),
         #/FST#      UNMJS           < UNMJS=1-(INF/SUP).
         PLR         A,B             < INF/SUP,
         FAD         F1              < 1+(INF/SUP),
         FMP         INF32           < 32768*(1+(INF/SUP)),
         #/FST#      UNPJS           < UNPJS=32768*(1+(INF/SUP)).
         #/FLD#      GSUP            < SUP,
         FDV         INF64           < SUP/65536,
         #/FST#      ZUP64           < ZUP64=SUP/65536.
<
< PAZ INITIAUX DU MAILLAGE :
<
         #/FLD#      F1
         FDV         F3
         #/FST#      EXPOP           < POUR CALCULER UNE RACINE CUBIQUE POUR
                                     < PAZSER D'UN VOLUME A UNE DIMENSION...
         LA          PAZIX0          < VALEUR INITIALE DE 'PAZIX' :
         JALE        $               < ???
         STA         PAZIX           < PAZ EN 'X',
         FLT
         #/FST#      FWORK           < ET SAUVEGARDE...
         LA          PAZIY0          < VALEUR INITIALE DE 'PAZIY' :
         JALE        $               < ???
         STA         PAZIY           < ET PAZ EN 'Y'...
         FLT
         FMP         FWORK           < CALCUL DE PAZIX*PAZIY...
         #/FST#      FWORK
         LA          PAZIZ0          < VALEUR INITIALE DE 'PAZIZ' :
         JALE        $               < ???
         STA         PAZIZ           < ET PAZ EN 'Z'...
         FLT
         FMP         FWORK           < ET CALCUL DE PAZIX*PAZIY*PAZIZ, SOIT LE
                                     < VOLUME DE LA PLUS GRANDE MAILLE INITIALE,
         BSR         ARAK
         #/FST#      FPONT0          < LA PONDERATION INITIALE DES FUNCTIONS
                                     < ALEATOIRES EST EN FAIT LA TAILLE DE LA
                                     < MAILLE...
<
< INITIALISATION DU REDUC-
< TEUR REKURSIF :
<
         #/FLD#      EXPOQ0
         #/FST#      EXPOP
<
<
<        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  :
<
<
GEN700:  EQU         $
         LA          MREKUR          < VALIDATION DE 'MREKUR' :
         JALE        GEN701          < MAUVAIS...
         CPI         MAXREK          < ALORS ???
         JLE         GEN702          < OK...
GEN701:  EQU         $
         QUIT        XXQUIT          < E R R E U R   U T I L I S A T E U R ...
         JMP         GEN700          < ET ON RE-VALIDE...
GEN702:  EQU         $
<
< INITIALISATIONS :
<
         LA          PAZIX
         FLT
         #/FST#      FPAZIX          < 'PAZIX',
         LA          PAZIY
         FLT
         #/FST#      FPAZIY          < 'PAZIY',
         LA          PAZIZ
         FLT
         #/FST#      FPAZIZ          < 'PAZIZ'.
         #/FLD#      FPONT0
         #/FST#      FPONT           < 'FPONT'.
<
< REDUCTION REKURSIVE DU MAILLAGE :
<
         LXI         K               < (X)=INDEX DE REKURSION...
GEN710:  EQU         $
         PSR         X
         LR          X,Y             < (Y)=INDEX ENTIER,
         ADR         X,X             < PAZSAGE A UN INDEX FLOTTANT...
         #/FLD#      FPONT
         FST         &ALPONT         < 'LPONT',
         BSR         ARAK            < EXPONENTIATION,
         #/FST#      FPONT           < ET REDUCTION...
         #/FLD#      FPAZIX
         FST         &ALPAZX         < 'PAZIX' FLOTTANT,
         PSR         A,B,X
         LR          Y,X
         BSR         AROND
         STA         &ALPZIX         < 'PAZIX' ENTIER.
         PLR         A,B,X
         BSR         ARAK            < EXPONENTIATION,
         #/FST#      FPAZIX          < ET REDUCTION...
         #/FLD#      FPAZIY
         FST         &ALPAZY         < 'PAZIY' FLOTTANT,
         PSR         A,B,X
         LR          Y,X
         BSR         AROND
         STA         &ALPZIY         < 'PAZIY' ENTIER.
         PLR         A,B,X
         BSR         ARAK            < EXPONENTIATION,
         #/FST#      FPAZIY          < ET REDUCTION...
         #/FLD#      FPAZIZ
         FST         &ALPAZZ         < 'PAZIZ' FLOTTANT,
         PSR         A,B,X
         LR          Y,X
         BSR         AROND
         STA         &ALPZIZ         < 'PAZIZ' ENTIER.
         PLR         A,B,X
         BSR         ARAK            < EXPONENTIATION,
         #/FST#      FPAZIZ          < ET REDUCTION...
         FAD         FPAZIY
         FAD         FPAZIX
         BSR         AROND           < (A)=PAZIX+PAZIY+PAZIZ,
         PLR         X               < RESTAURE L'INDEX DE REKURSION...
         ADRI        I,X             < PAZSAGE A LA REKURSION SUIVANTE...
         CPI         W+W+W           < EST-ON ARRIVE A UNE MAILLE IRREDUCTIBLE,
                                     < SOIT ELEMENTAIRE (1*1*1) ???
         JE          GEN720          < OUI, ON ARRETE LA...
         LR          X,A             < NON,
         CP          MREKUR          < MAIS A-T'ON ATTEINT LE MAXIMUM ???
         JL          GEN710          < NON, ON CONTINUE...
GEN720:  EQU         $
         STX         NREKUR          < MISE EN PLACE DU 'NREKUR' A UTILISER...
<
< CALCUL DU FACTEUR DE
< RENORNALISATION DE LA
< FUNCTION ALEATOIRE :
<
         LR          X,A             < (A)='NREKUR',
         FLT                         < QUE L'ON FLOTTE...
         FAD         KAMPLY
         FSB         F1
         FDV         KAMPLY
         #/FST#      AMPLY           < (AMPLY)=(NREKUR+30)/31...
         #/FLD#      F0              < INITIALISATION DU SIGMA DES 'FPONT',
GEN910:  EQU         $
         PSR         X
         ADRI        -IJIJDX,X
         ADR         X,X             < PAZSAGE A UN INDEX FLOTTANT...
         FAD         &ALPONT         < CALCUL DE SIGMA(FPONT),
         PLR         X
         JDX         GEN910          < AU SUIVANT...
         FDV         AMPLY
         FDV         AMPLYR
         #/FST#      RENORN          < RENORN=SIGMA(FPONT)/(AMPLY*AMPLYR).
NTEXT:   EQU         $
<
<
<        G E N E R A T I O N   D E   L ' I M A G E  :
<
<
GEN69:   EQU         $
<
< REINITIALISATION DES REGISTRES
< DE L'IMAGEUR :
<
         LRM         A
         WORD        INFINY          < AFIN DE BIEN REPARTIR...
         STA         SNIVOP
         STA         SXHP
         STA         SXLP
         STA         SYHP
         STA         SYLP
         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  :
<
<
         LYI         K               < (Y)=COORDONNEE 'Y'.
GEN01:   EQU         $
         LR          Y,A             < Y,
         FLT
         FMP         FPERSA          < FPERSA*Y,
         FAD         FPERSB          < FPERSA*Y+FPERSB,
         #/FST#      FPERSK          < FPERSK=FPERSA*Y+FPERSB, SOIT LA CONSTANTE
                                     < DE CALCUL DES "FUITES"...
         LXI         K               < (X)=COORDONNEE 'X'.
GEN02:   EQU         $
         BSR         AFONCT          < CALCUL DANS (A,B) DE LA SOMME
                                     < PONDEREE DES FONCTIONS ALEATOIRES,
                                     < ASSOCIEE AU POINT COURANT (X,Y)
                                     < SANS OUBLIER LES CONTRIBUTIONS DES
                                     < SPIR-MAPS EVENTUELLEMENT...
         FMP         FPERSK          < ET MISE EN "FUITE", EN MULTIPLIANT PAR
                                     < UNE CONSTANTE APPARTENANT A (FPERSB,1),
                                     < ET FONCTION DE 'Y'...
         IF          DFLOT-XXXMOY,,XEIF%,
         IF          ATTENTION : LES 'ADR' VONT MERDER !!!
XEIF%:   VAL         ENDIF
         PSR         X
         ADR         X,X             < PASSAGE A UNE INDEX FLOTTANT...
         FST         &ALIGP2         < ET ON MEMORISE Z(X,Y) DANS LA LIGNE
                                     < SUIVANTE-SUIVANTE...
         PLR         X
         ADRI        I,X             < PROGRESSION SUR LA LIGNE :
         LR          X,A
         CP          VECTNC          < EST-ON AU BOUT ???
         JLE         GEN02           < NON...
<
<
<        T E N T A T I V E   D ' E L I M I N A T I O N
<        D E S   P I C S   P A R   F I L T R A G E  :
<
<
<        FONCTION :
<                      CONSIDERONS 3 POINTS SUC-
<                    CESSIFS : A(X-I), M(X), B(X+I).
<                    POUR CHAQUE POINT M(X), ON VA
<                    TESTER :
<
<                    SI : Z(M(X)) > Z(A(X-I)) ET Z(M(X)) > Z(B(X+I)),
<                    ALORS : Z(M(X)) <-- ALPHA*(Z(A(X-I))+Z(B(X+I)))/2+
<                                        (1-ALPHA)*Z(M(X)),
<
<                      PUIS, CONSIDERONS 3 POINTS SUC-
<                    CESSIFS : A(Y), M(Y+I), B(Y+I+I).
<                    POUR CHAQUE POINT M(Y+I), ON VA
<                    TESTER :
<
<                    SI : Z(M(Y+I)) > Z(A(Y)) ET Z(M(Y+I)) > Z(B(Y+I+I)),
<                    ALORS : Z(M(Y+I)) <-- ALPHA*(Z(A(Y))+Z(B(Y+I+I)))/2+
<                                          (1-ALPHA)*Z(M(Y+I)),
<
<                    C'EST-A-DIRE QUE SI LE POINT 'M'
<                    EST AU-DESSUS DE 'A' ET 'B', CE
<                    QUI GENERE UN PLI, ALORS ON REDES-
<                    CEND 'M'...
<                      ENFIN, ON FAIT DE MEME, EN
<                    TESTANT 'M' PAR RAPPORT A LA
<                    POSITION EN-DESSOUS DE "A" ET
<                    "B", AUQUEL CAS ON LE REMONTE...
<
<
         #/FLD#      F1
         FSB         ALPHA
         #/FST#      FWORK1          < (FWORK1)=1-ALPHA.
         #/FLD#      ALPHA
         FMP         F05
         #/FST#      FWORK2          < (FWORK2)=ALPHA/2.
<
< TRAITEMENT LE LONG DE 'X' :
<
         LXI         W               < ON NE COMMENCE PAS SUR LE PREMIER POINT..
GEN120:  EQU         $
         PSR         X
         ADR         X,X             < PASSAGE A UN INDEX FLOTTANT...
         FLD         &ALIGP2         < Z(M(X)),
         ADRI        -DFLOT,X
         FCAM        &ALIGP2         < COMPARAISON A Z(A(X-I)) :
         JL          GEN122          < OK, 'M' EST AU-DESSOUS DE 'A'...
         ADRI        DFLOT+DFLOT,X   < 'M' EST AU-DESSUS DE 'A',
         FCAM        &ALIGP2         < COMPARAISON A Z(B(X+I)) :
         JL          GEN121          < OK, 'M' EST AU-DESSOUS DE 'B' ET AU-
                                     < DESSUS DE 'A'...
GEN124:  EQU         $               < CAS OU 'M' EST AU-DESSUS DE 'A' ET 'B',
                                     < OU BIEN AU-DESSOUS DE 'A' ET 'B'...
         FMP         FWORK1          < Z(M(X))*(1-ALPHA),
         #/FST#      FWORK           < ET SAUVEGARDE...
         FLD         &ALIGP2         < Z(B(X+I)),
         ADRI        -DFLOT-DFLOT,X
         FAD         &ALIGP2         < Z(A(X-I))+Z(B(X+I)),
         FMP         FWORK2          < ALPHA*(Z(A(X-I))+Z(B(X+I)))/2,
         FAD         FWORK           < +(1-ALPHA)*Z(M(X)),
         ADRI        DFLOT,X
         FST         &ALIGP2         < D'OU LE NOUVEAU Z(M(X))...
         JMP         GEN121          < VERS LE POINT SUIVANT...
GEN122:  EQU         $
         ADRI        DFLOT+DFLOT,X
         FCAM        &ALIGP2         < COMPARAISON A Z(B(X+I)) :
         JL          GEN124          < 'M' EST AU-DESSOUS DE 'B' (ET DE 'A'...).
GEN121:  EQU         $
         PLR         X               < RESTAURE LA COORDONNEE 'X',
         ADRI        I,X             < PASSAGE AU POINT SUIVANT,
         LR          X,A
         CP          VECTNC          < S'IL EXISTE...
         JL          GEN120          < OUI, MAIS ON NE TRAITE PAS LE DERNIER
                                     < POINT...
<
< DISCRIMINATION DE LA PREMIERE
< ET DE LA DEUXIEME LIGNE :
<
         LR          Y,A             < (A)=ORDONNEE COURANTE :
         CPI         W               < EST-ON SUR LA PREMIERE OU SUR LA
                                     < DEUXIEME LIGNE ???
         JLE         GEN300          < OUI, IL FAUT AU MOINS 3 LIGNES POUR
                                     < POUVOIR FILTRER, ON ATTEND DONC...
<
< TRAITEMENT LE LONG DE 'Y' :
<
         LXI         K               < ON COMMENCE SUR LE PREMIER POINT...
GEN130:  EQU         $
         PSR         X
         ADR         X,X             < PASSAGE A UN INDEX FLOTTANT...
         FLD         &ALIGP1         < Z(M(Y+I)),
         FCAM        &ALIG           < COMPARAISON A Z(A(Y)) :
         JL          GEN132          < OK, 'M' EST AU-DESSOUS DE 'A'...
         FCAM        &ALIGP2         < COMPARAISON A Z(B(Y+I+I)) :
         JL          GEN131          < OK, 'M' EST AU-DESSOUS DE 'B' ET AU-
                                     < DESSUS DE 'A'...
GEN134:  EQU         $               < CAS OU 'M' EST AU-DESSUS DE 'A' ET 'B',
                                     < OU BIEN AU-DESSOUS DE 'A' ET 'B'...
         FMP         FWORK1          < Z(M(Y+I))*(1-ALPHA),
         #/FST#      FWORK           < ET SAUVEGARDE...
         FLD         &ALIGP2         < Z(B(Y+I+I)),
         FAD         &ALIG           < Z(A(Y))+Z(B(Y+I+I)),
         FMP         FWORK2          < ALPHA*(Z(A(Y))+Z(B(Y+I+I)))/2,
         FAD         FWORK           < +(1-ALPHA)*Z(M(Y+I)),
         FST         &ALIGP1         < D'OU LE NOUVEAU Z(M(Y+I))...
         JMP         GEN131          < VERS LE POINT SUIVANT...
GEN132:  EQU         $
         FCAM        &ALIGP2         < COMPARAISON A Z(B(Y+I+I)) :
         JL          GEN134          < 'M' EST AU DESSOUS DE 'B' (ET DE 'A'...).
GEN131:  EQU         $
         PLR         X               < RESTAURE LA COORDONNEE 'X',
         ADRI        I,X             < PASSAGE AU POINT SUIVANT,
         LR          X,A
         CP          VECTNC          < S'IL EXISTE...
         JLE         GEN130          < OUI...
GEN300:  EQU         $
<
< DISCRIMINATION DE LA PREMIERE, DE LA
< DEUXIEME ET DE LA TROISIEME LIGNE :
<
         LR          Y,A             < (A)=ORDONNEE COURANTE :
YPLAN2:: VAL         W+W             < ORDONNEE DU PLAN VERTICAL 2...
         CPI         YPLAN2          < EST-ON SUR LA PREMIERE, LA DEU-
                                     < XIEME OU LA TROISIEME LIGNE ???
         JG          GEN21           < NON, ON PEUT GENERER LE RELIEF...
         BSR         AGOTO
         WORD        GEN50           < OUI, ATTENDONS LA LIGNE SUIVANTE...
                                     < (MAIS ROTATION DES BUFFERS DE LIGNE
                                     < MALGRE TOUT...)
GEN21:   EQU         $
<
<
<        G E N E R A T I O N   D U   R E L I E F  :
<
<
         STZ         PRAYON          < AU DEBUT DE CHAQUE NOUVELLE LIGNE, ON
                                     < ATTRIBUE A 'PRAYON' UNE VALEUR IMPOS-
                                     < SIBLE EN FLOTTANT...
                                     < ET CE AFIN DE FORCER SON CALCUL...
         STZ         LSTENH          < AU DEBUT DE CHAQUE LIGNE, ON DONNE A
                                     < 'LSTENH' UNE VALEUR INACESSIBLE EN
                                     < FLOTTANT, QUI PERMETTRA DE SAVOIR
                                     < ULTERIEUREMENT QU'ON EN EST OU PAS AU
                                     < PREMIER VECTEUR VERTICAL D'UNE LIGNE...
         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)).
         IF          INCIX+I,,XEIF%,
         IF          ATTENTION : L'INITIALISATION DE 'X'
         IF          DOIT ETRE FAITE AVEC 0 !!!
XEIF%:   VAL         ENDIF
GEN30:   EQU         $
<
< CALCUL DU VECTEUR "VERTICAL"
< A TRACER POUR CONSTRUIRE LE
< RELIEF DE LA MONTAGNE :
<
         LR          X,A             < X(A),
         AD          TRX             < TRANSLATION,
         STA         VECGX1          < (VECGX1)=ABSCISSE DU VECTEUR VECTICAL,
         STA         VECGX2          < (VECGX2)=(VECGX1), CAR VERTICAL...
         PSR         X
         ADR         X,X             < PASSAGE A UN INDEX FLOTTANT...
         FLD         &ALIGP1         < Z(BAS),
         BSR         AROND
         SBR         Y,A             < Z(BAS)-Y(A),
         AD          TRY             < TRANSLATION,
         STA         VECGY1          < (VECGY1)=ORDONNEE DU "BAS" DU VECTEUR
                                     <          VERTICAL...
         FLD         &ALIG           < Z(A)=Z(HAUT),
         BSR         AROND
         LR          A,B             < (B)=SAUVEGARDE DE Z(HAUT)...
         SBR         Y,A             < Z(HAUT)-Y(A),
         ADRI        I,A             < Z(HAUT)-(Y(A)-1), (Y-1 POUR LA LIGNE
                                     < D'AVANT LA LIGNE SUIVANTE...
         PLR         X
         AD          TRY             < TRANSLATION,
         STA         VECGY2          < (VECGY2)=ORDONNEE DU "HAUT" DU VECTEUR
                                     <          VERTICAL...
<
< TEST DES OMBRES PORTEES :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST CI-DESSOUS EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IOMBRE          < L'OMBRAGE EST-IL DEMANDE ???
         JNE         AGN420          < OUI...
         BSR         AGOTO
         WORD        GEN420          < NON, RIEN A FAIRE...
AGN420:  EQU         $
         LR          B,A             < (A)=Z(HAUT)...
         CPZ         PRAYON          < OUI, ALORS EST-ON EN DEBUT DE LIGNE ???
         JE          GEN412          < OUI, IL FAUT INITIALISER 'PRAYON'...
<
< TEST DE VISIBILITE DU
< POINT COURANT DEPUIS
< LA SOUCE LUMINEUSE :
<
         PSR         A               < SAUVEGARDE DE L'ORDONNEE DU "HAUT" DU
                                     < VECTEUR COURANT, NOTEE 'YC'.
         LR          X,A             < ABSCISSE, NOTEE 'XC',
         FLT
         FSB         FXL             < XC-XL,
         FMP         PRAYON          < ((YH-YL)/(XH-XL))*(XC-XL),
         FAD         FYL             < YL+((YH-YL)/(XH-XL))*(XC-XL), CE QUI
                                     < DONNE LE SEUIL DE VISIBILITE DEPUIS LA
                                     < SOURCE LUMINEUSE,
         FIX
         LR          A,B             < (B)=PLUS PETITE ORDONNEE "HAUTE" D'UN
                                     <     VECTEUR QUE L'ON VOIT DEPUIS 'S',
         PLR         A               < (A)=ORDONNEE "HAUTE" DU VECTEUR COURANT,
         CPR         B,A             < ALORS LE VECTEUR COURANT EST-IL VU
                                     < DEPUIS LA SOURCE LUMINEUSE ???
         JLE         GEN410          < (A) <= (B) : NON, IL EST EN-DESSOUS DU
                                     < SEUIL DE VISIBILITE...
<
< CAS OU L'ON EST VISIBLE
< DEPUIS LA SOURCE LUMINEUSE,
< OU BIEN DE LA PREMIERE
< FOIS :
<
GEN412:  EQU         $
         PSR         A               < RE-SAUVEGARDE DE L'ORDONNEE "HAUTE"...
         LR          X,A             < ABSCISSE (NOTEE 'XH') DU VECTEUR "MAXI-
                                     < MAL" COURANT, C'EST-A-DIRE VU DEPUIS LA
                                     < SOURCE LUMINEUSE, SACHANT QUE L'ON TRACE
                                     < DE DROITE A GAUCHE...
         FLT
         FSB         FXL             < XH-XL,
         #/FST#      FWORK           < ET SAVE...
         PLR         A               < YH,
         FLT
         FSB         FYL             < YH-YL,
         FDV         FWORK           < (YH-YL)/(XH-XL),
         #/FST#      PRAYON          < PRAYON=(YH-YL)/(XL-XH).
         #/FLD#      FNIVMX          < (A,B)=NIVEAU LUMINEUX MAXIMAL PUIQU'ON
                                     <       EST VU, DONC AU SOLEIL...
         JMP         GEN411          < VERS LA MISE EN PLACE DE 'FNIVC'...
<
< CAS OU L'ON EST INVISIBLE
< DEPUIS LA SOURCE LUMINEUSE :
<
GEN410:  EQU         $
         SBR         B,A
         NGR         A,A             < (A)=DISTANCE D'INVISIBILITE (STRICTE-
                                     <     MENT POSITIVE).
         CP          NPENOM          < EST-ON DANS LA PENOMBRE ???
         JL          GEN433          < OUI, IL FAUT INTERPOLER POUR OBTENIR
                                     < LE NIVEAU MAXIMAL...
         #/FLD#      FNIVOM          < NON, OU BIEN ON NE CALCULE PAS LA
                                     < PENOMBRE :
                                     < (A,B)=VALEUR DU DECREMENT DU NIVEAU
                                     <       MAXIMAL D'ECLAIRAGE POUR PASSER
                                     <       DANS LA ZONE D'OMBRE...
         JMP         GEN434
GEN433:  EQU         $
         FLT                         < (A,B)=DISTANCE D'INVISIBILITE,
         FDV         FPENOM          < (A,B)=VALEUR ABSOLUE DU DECREMENT DU
                                     <       NIVEAU MAXIMAL D'ECLAIRAGE DANS LA
                                     <       LA ZONE DE PENOMBRE COURANTE...
GEN434:  EQU         $
         FAD         FNIVMX          < (A,B)=NIVEAU LUMINEUX MAXIMAL DE LA
                                     <       ZONE D'OMBRE OU DE PENOMBRE DANS
                                     <       LAQUELLE ON SE SITUE...
<
< MISE EN PLACE DE 'FNIVC' :
<
GEN411:  EQU         $
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IDEPTH          < FAIT-ON DU "DEPTH-CUEING" ???
         JE          GEN421          < NON, (A,B) EST BON...
         PSR         A,B             < OUI, SAUVEGARDE DE (A,B)...
                                     < RAPPEL : L'OPTION "DEPTH-CUEING" N'EST
                                     < PRISE EN COMPTE QU'AVEC LES OMBRES
                                     < PORTEES A CAUSE DES PROBLEMES D'INI-
                                     < TIALISATION DE 'FNIVC' SINON...
         LR          Y,A             < Y,
         SLRS        XL512/NIV256=K  < REDUCTION DE LA COORDONNEE 'Y',
         JANE        GEN422          < NON NUL...
         LAI         Z               < ON NE PEUT CONSERVER LES VALEURS NULLES,
GEN422:  EQU         $
         FLT
         #/FST#      FWORK
         PLR         A,B             < RESTAURATION DU 'FNIVC',
         FDV         FNIVMX          < ET MODULATION
         FMP         FWORK           <               PAR LA COORDONNEE 'Y'...
         FMP         F255MH          < PUIS ON PLACE CETTE VALEUR DE (0,255)
         FAD         FHP             < DANS LE SEGMENT (FHP,255)...
GEN421:  EQU         $
         #/FST#      FNIVC
<
<
<        M O D U L A T I O N   E V E N T U E L L E   P A R   ' T V 2 '  :
<
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT VA MERDER !!!
XEIF%:   VAL         ENDIF
         CPZ         IMODTV          < FAUT-IL MODULER PAR 'TV2' ???
         JE          GEN423          < NON...
         PSR         X,Y             < OUI, SAUVEGARDE DES COORDONNEES DU
                                     < POINT COURANT (X,Y) EN 512*512...
<
< TEST DE LA POSITION
< DU POINT COURANT (X,Y) :
< DE LA MAILLE (512,512)
< PAR RAPPORT A LA MAILLE
< DES SPIR-MAPS 2*(256,256) :
<
         LR          X,A             < (A)=ABSCISSE '512',
         SLRS        XC512/NPOL=K
         LR          A,X             < (X)=ABSCISSE '256'.
         JC          MAPTV1          < ELLE NE "TOMBE PAS JUSTE"...
         LR          Y,A             < (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          MAPTV2          < 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         ASPIRM          < (A,B)=SIGMA(NIVEAU(X,Y)).
         FMP         F4              < ET ON LE QUADRUPLE :
                                     < (A,B)=4*SIGMA(NIVEAU(X,Y)).
         JMP         MAPTV9          < VERS LA SORTIE...
<
< CAS D'UN POINT '512'
< ENTRE DEUX POINTS '256'
< SUR UNE VERTICALE :
<
MAPTV2:  EQU         $
         BSR         ASPIRM          < (A,B)=SIGMA(NIVEAU(X,Y)),
         #/FST#      FWORK           < ET SAVE...
         ADRI        I,Y
         BSR         ASPIRM          < (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         MAPTV9          < VERS LA SORTIE...
<
< AUTRES CAS :
<
MAPTV1:  EQU         $
         LR          Y,A             < (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          MAPTV3          < 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         ASPIRM          < (A,B)=SIGMA(NIVEAU(X,Y)),
         #/FST#      FWORK           < ET SAVE...
         ADRI        I,X
         BSR         ASPIRM          < (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         MAPTV9          < VERS LA SORTIE...
<
< CAS D'UN POINT '512' AU
< CENTRE D'UN CARRE FAIT
< DE QUATRE POINTS '256' :
<
MAPTV3:  EQU         $
         BSR         ASPIRM          < (A,B)=SIGMA(NIVEAU(X,Y)),
         #/FST#      FWORK1
         ADRI        I,X
         BSR         ASPIRM          < (A,B)=SIGMA(NIVEAU(X+1,Y)),
         #/FST#      FWORK2
         ADRI        I,Y
         BSR         ASPIRM          < (A,B)=SIGMA(NIVEAU(X+1,Y-1)),
         #/FST#      FWORK
         ADRI        -I,X
         BSR         ASPIRM          < (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 "SPIR-MAP" :
<
MAPTV9:  EQU         $
         FDV         F4              < POUR SE RAMENER ULTERIEUREMENT DANS
                                     < LE SEGMENT (0,1)...
         FDV         FIVMX7          < QUE L'ON NORMALISE,
         FMP         FNIVC           < ET QUI MODULE
         #/FST#      FNIVC           <               L'INTENSITE LUMINEUSE...
         PLR         X,Y             < RESTAURE LE POINT COURANT (X,Y)...
GEN423:  EQU         $
GEN420:  EQU         $
<
< CALCUL DE L'INTENSITE LUMINEUSE "HAUTE" :
<
         LR          Y,A             < (A)=ORDONNEE COURANTE :
YPLAN3:: VAL         YPLAN2+I        < ORDONNEE DU PLAN VERTICAL 3...
         CPI         YPLAN3          < 'INTENH' EXISTE-T'ELLE ???
         JLE         GEN801          < NON, PAS ENCORE, ON NE VA PAS TRACER...
         PSR         X               < OUI, SAUVEGARDE DE L'ABSCISSE 'X',
         ADR         X,X             < PASSAGE A UN INDEX FLOTTANT,
         FLD         &AINTM1         < (A,B)=INTENSITE LUMINEUSE "HAUTE",
         #/FST#      INTENH          < ET SAUVEGARDE...
         PLR         X               < RESTAURATION DU POINT COURANT 'A'...
GEN801:  EQU         $
<
< GENERATION DE LA NORMALE "BASSE" :
<
<
<        CALCUL :
<                      ON CONSIDERE LA FACETTE TRIANGULAIRE :
<                    (A(X,Y+I,Z(A)),B(X-I,Y+I,Z(B)),C(X,Y,Z(C))),
<                    ELLE DEFINIT UN PLAN D'EQUATION :
<
<                                    I  X-XA  Y-YA  Z-ZA  I
<                                    I  XB-XA YB-YA ZB-ZA I = 0
<                                    I  XC-XA YC-YA ZC-ZA I
<
<                    SOIT, PAR DEFINITION :
<
<                                    I  X-XA  Y-YA  Z-ZA  I
<                                    I   -1     0   ZB-ZA I = 0
<                                    I    0    -1   ZC-ZA I
<
<                    LA NORMALE DE CETTE FACETTE EST
<                    DONC LE VECTEUR DE COORDONNEES :
<
<                                    ((ZB-ZA),(ZC-ZA),1).
<
         PSR         X
         ADR         X,X             < PASSAGE A UN INDEX FLOTTANT...
         ADRI        -DFLOT,X
         FLD         &ALIGP1         < Z(B),
         ADRI        DFLOT,X
         FSB         &ALIGP1         < Z(B)-Z(A),
         #/FST#      FXN             < X(N)=Z(B)-Z(A).
         FLD         &ALIG           < Z(C),
         FSB         &ALIGP1         < Z(C)-Z(A),
         #/FST#      FYN             < Y(N)=Z(C)-Z(A).
                                     < NOTA : Z(N) VAUT TOUJOURS 2...
<
< PASSAGE DU RESEAU TRIANGULAIRE
< AU RESEAU CARRE DE BASE :
<
<
<        CALCUL :
<                      ON CONSIDERE LA FACETTE TRIANGULAIRE :
<                    (D(X-I,Y,Z(D)),B(X-I,Y+I,Z(B)),C(X,Y,Z(C))),
<                    ELLE DEFINIT UN PLAN D'EQUATION :
<
<                                    I  X-XD  Y-YD  Z-ZD  I
<                                    I  XB-XD YB-YD ZB-ZD I = 0
<                                    I  XC-XD YC-YD ZC-ZD I
<
<                    SOIT, PAR DEFINITION :
<
<                                    I  X-XD  Y-YD  Z-ZD  I
<                                    I    0     1   ZB-ZD I = 0
<                                    I    1     0   ZC-ZD I
<
<                    LA NORMALE DE CETTE FACETTE EST
<                    DONC LE VECTEUR DE COORDONNEES :
<
<                                    ((ZC-ZD),(ZB-ZD),-1),
<
<                    OU EN INVERSANT L'ORIENTATION :
<
<                                    (-(ZC-ZD),-(ZB-ZD),1).
<
<                      ENFIN, ON FAIT LA MOYENNE ENTRE
<                    CETTE NORMALE (-(ZB-ZD),-(ZC-ZD),1),
<                    ET LA NORMALE CALCULEE PRECEDEMMENT...
<
         FLD         &ALIG           < Z(C),
         ADRI        -DFLOT,X
         FSB         &ALIG           < Z(C)-Z(D),
         FSB         FXN             < -X(N)+(Z(C)-Z(D)),
         FNEG
         #/FST#      FXN             < CE QUI DONNE X(N) SUR LA MAILLE CARREE.
         FLD         &ALIGP1         < Z(B),
         FSB         &ALIG           < Z(B)-Z(D),
         FSB         FYN             < -Y(N)+(Z(B)-Z(D)),
         FNEG
         #/FST#      FYN             < CE QUI DONNE Y(N) SUR LA MAILLE CARREE.
                                     < NOTA : Z(N) VAUT TOUJOURS 2...
         ADRI        DFLOT,X         < ET RETOUR SUR LE POINT 'A'...
<
< CALCUL DE L'INTENSITE LUMINEUSE "BASSE" :
<
         PLR         X               < RESTAURATION DE LA COORDONNEE 'X'...
         BSR         AINTEN          < (A,B)=INTENSITE LUMINEUSE "BASSE",
         #/FST#      INTENB          < ET SAUVEGARDE...
         PSR         X               < RE-SAUVEGARDE DE 'X',
         ADR         X,X             < PASSAGE A UN INDEX FLOTTANT,
         FST         &AINT           < ET SAUVEGARDE DANS LA LIGNE COURANTE...
         PLR         X               < ET RESTAURE 'X'...
<
< TEST DE VISIBILITE :
< (NOTA : AUTREFOIS, CE
< TEST SE TROUVAIT JUSTE
< DERRIERE 'GEN420', MAIS
< EN FAIT IL FAUT LE METTRE
< ICI AFIN QUE LA LISTE 'INT'
< SOIT A JOUR...)
<
         CPZ         IPERS           < EST-CE UNE VUE D'AVION ???
         JE          GEN80           < OUI, DONC PAS DE LIGNES CACHEES !!!
         LA          VECGY2          < (A)=ORDONNEE DU "HAUT" DU VECTEUR
                                     <     VERTICAL...
         CP          VECGY1          < ALORS, LE "HAUT" EST-IL BIEN AU-DESSUS
                                     < DU "BAS" ???
         JGE         GEN80           < OUI...
         BSR         AGOTO
         WORD        GEN32           < NON, ON IGNORE CE VECTEUR...
GEN80:   EQU         $
<
< TRACE DU VECTEUR :
<
         LR          Y,A             < (A)=ORDONNEE COURANTE :
         CPI         YPLAN3          < CONNAIT-ON 'INTENH' ???
         JLE         GEN802          < NON, ON NE TRACE PAS...
         BSR         ASEGV           < TRACE NORMAL...
<
< TEST DE L'ANTI-ALIASING :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LES TESTS CI-DESSOUS SONT IDIOTS !!!
XEIF%:   VAL         ENDIF
         CPZ         IPERS           < EST-CE UNE VUE D'AVION ???
         JE          GEN520          < OUI, DONC PAS D'ANTI-ALIASING...
         CPZ         IALIAS          < NON, L'ANTI-ALIASING EST-IL DEMANDE ???
         JE          GEN520          < NON, RIEN A FAIRE...
<
< OUI, TRAITEMENT ANTI-ALIASING :
<
         LA          VECGY2          < (A)=ORDONNEE "HAUTE" COURANTE,
         XM          LSTGY2          < (A)=ORDONNEE "HAUTE" PRECEDENTE, ET MISE
                                     <     A JOUR DE 'LSTGY2'...
         STA         FWORK2          < ET SAUVEGARDE DE 'LSTGY2' AVANT SA MISE
                                     < A JOUR POUR UNE UTILISATION ULTERIEURE...
         #/FLD#      LSTENH          < (A,B)=INTENSITE LUMINEUSE "HAUTE" DU
                                     <       VECTEUR VERTICAL PRECEDENT A
                                     <       PRIORI...
         #/FST#      FWORK1          < ET SAUVEGARDE DE 'LSTENH' AVANT SA MISE
                                     < A JOUR, POUR UNE UTILISATION ULTE-
                                     < RIEURE...
         #/FLD#      INTENH
         #/FST#      LSTENH          < ET MISE A JOUR DE 'LSTENH'...
         LA          &ALISTY         < BON, MAINTENANT QUE L'ON A CORRECTEMENT
                                     < POSITIONNE 'LSTGY2' ET 'LSTENH', EST-ON
                                     < EN PRESENCE D'UNE DISCONTINUITE ???
                                     < (A)=NUMERO DE LA LIGNE CORRESPONDANT
                                     <     AU DERNIER VECTEUR VERTICAL TRACE
                                     <     AVEC LE NUMERO DE COLONNE (X) OU
                                     <     ABSCISSE COURANTE,
         ADRI        I,A
         STY         &ALISTY         < ET MISE-A-JOUR DE LA LISTE 'LISTY'...
         CPR         A,Y             < Y-A-T'IL DISCONTINUITE ???
         JE          GEN520          < NON, PUISQU'IL Y A UNE DIFFERENCE D'UNE
                                     < SEULE UNITE...
         ADRI        -INCIX,X        < OUI :
         LA          &ALISTY         < (A)=NUMERO DE LA LIGNE CORRESPONDANT
                                     <     A L'HYPOTHETIQUE VECTEUR VERTICAL
                                     <     PRECEDENT...
         ADRI        INCIX,X
         CPR         A,Y             < A-T'ON EFFECTIVEMENT TRAITE LE VECTEUR
                                     < VERTICAL PRECEDENT SUR CETTE MEME LIGNE
                                     < D'ORDONNEE (Y) ???
         JNE         GEN520          < NON, ON NE PEUT DONC RIEN FAIRE...
         CPZ         FWORK1          < EST-CE EN FAIT LE PREMIER POINT DE LA
                                     < LIGNE COURANTE ???
         JE          GEN520          < OUI, RIEN A FAIRE...
         LA          FWORK2          < (A)=ORDONNEE "HAUTE" PRECEDENTE,
         STA         VECGY1          < ET MISE EN PLACE A PRIORI DE L'ORDONNEE
                                     < "BASSE" DU TRACE ANTI-ALIASING...
         CP          VECGY2          < ET COMPARAISON A L'ORDONNEE "HAUTE" DU
                                     < POINT COURANT :
         JE          GEN520          < RIEN A FAIRE, ON EST SUR UN PALIER
                                     < HORIZONTAL...
         JG          GEN501          < (LSTGY2) > (VECGY2) : LE POINT "HAUT"
                                     < COURANT EST AU-DESSOUS DU POINT "HAUT"
                                     < PRECEDENT, C'EST DONC LE VECTEUR COURANT
                                     < QU'IL CONVIENT DE MODIFIER...
         IF          INCIX+I,,XEIF%,
         IF          ATTENTION : IL FAUT REMPLACER LES 'IC'
         IF          QUI SUIVENT PAR DES 'DC' !!!
XEIF%:   VAL         ENDIF
         IC          VECGX1          < ET PASSAGE SUR LE VECTEUR
         IC          VECGX2          <                           PRECEDENT...
         #/FLD#      FWORK1          < (A,B)=INTENSITE LUMINEUSE "HAUTE" DU
                                     <       VECTEUR VERTICAL COURANT...
         JMP         GEN502          < VERS LE TRACE...
GEN501:  EQU         $
         LA          VECGY1          < DANS LE CAS OU LE POINT "HAUT" COURANT
         XM          VECGY2          < EST AU-DESSOUS DU POINT "HAUT" PRECEDENT,
         STA         VECGY1          < ON PERMUTE 'VECGY1' ET 'VECGY2'...
                                     < NOTA : (VECGX1)=(VECGX2), DONC IL EST
                                     < INUTILE DE LES PERMUTER...
         #/FLD#      INTENH          < (A,B)=INTENSITE LUMINEUSE "HAUTE"...
GEN502:  EQU         $
         #/FST#      INTENB          < ET L'INTENSITE "BASSE" COURANTE EST
                                     < SOIT L'INTENSITE "HAUTE", SOIT L'INTE-
                                     < SITE "HAUTE" DU VECTEUR PRECEDENT,
                                     < SUIVANT QUE L'ON MODIFIE LE VECTEUR
                                     < COURANT OU LE VECTEUR PRECEDENT...
         PSR         X,Y             < OUI, IL FAUT FAIRE DE L'ANTI-ALIASING...
         LX          VECGX2          < (X)=ABSCISSE DU POINT "HAUT",
         LY          VECGY2          < (Y)=ORDONNEE DU POINT "HAUT",
         BSR         ALOADP          < RENVOIE :
                                     < (A)=NIVEAU DE TRACE DU POINT (X,Y),
         LR          A,X
         LBY         &ALNOVI         < (A)=NIVEAU CALCULE APPROXIMATIF DU
                                     <     POINT (X,Y),
         FLT                         < QUE L'ON FLOTTE...
         PLR         X,Y
         #/FST#      INTENH          < ET CECI AFIN D'INTERPOLER A PARTIR DU
                                     < NIVEAU PRESENT ANTERIEUREMENT, OU A
                                     < PARTIR DU NIVEAU DE NOIR, SI LE NIVEAU
                                     < TROUVE PAR 'LOADP' NE FIGURE PAS DANS
                                     < 'LNIVO' (C'EST LE CAS PAR EXEMPLE DE LA
                                     < SUPERPOSITION DE 2 IMAGES...).
         BSR         ASEGV           < ET CORRECTION ANTI-ALIASING SOIT DU
                                     < VECTEUR COURANT, SOIT DU VECTEUR
                                     < PRECEDENT, SUIVANT LEURS TAILLES
                                     < RELATIVES...
GEN520:  EQU         $
GEN802:  EQU         $
<
< PASSAGE AU VECTEUR VERTICAL SUIVANT :
<
GEN32:   EQU         $
         ADRI        INCIX,X         < REGRESSION DE L'ABSCISSSE,
         LR          X,A
         CPI         W               < EST-ON EN DEBUT DE LIGNE ???
                                     < ET CE AFIN DE POUVOIR TRAITER DES TRIAN-
                                     < GLES DU TYPE :
                                     < (A(X,Y),B(X-I,Y),C(X,Y-I))...
         JL          GEN31           < OUI, ON ABANDONNE...
         BSR         AGOTO
         WORD        GEN30           < NON, ON CONTINUE LE TRACE...
GEN31:   EQU         $
<
< "ROTATION" DES BUFFERS DE LIGNES :
<
GEN50:   EQU         $
         LA          ALIGM1          < LIGNE PRECEDENTE,
         XM          ALIGP2          < QUI EST ECRASEE...
         XM          ALIGP1          < LA LIGNE SUIVANTE-SUIVANTE DEVIENT LA
                                     < LIGNE SUIVANTE,
         XM          ALIG            < LA LIGNE SUIVANTE DEVIENT LA LIGNE
                                     < COURANTE,
         STA         ALIGM1          < ET LA LIGNE COURANTE DEVIENT LA LIGNE
                                     < PRECEDENTE...
         LA          AINTM1          < LIGNE PRECEDENTE,
         XM          AINT            < QUI EST ECRASEE,
         STA         AINTM1          < ET LA LIGNE COURANTE DEVIENT LA LIGNE
                                     < PRECEDENTE...
<
<
<        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 SUIVANTE :
         LR          Y,A
         CP          VECTNL          < EST-ON AU BOUT DE L'IMAGE ???
         JG          GEN40           < OUI, C'EST FINI...
         BSR         AGOTO
         WORD        GEN01           < NON...
GEN40:   EQU         $
         BSR         ATSFLO
<
< TRAITEMENT DE FIN...
<
         CPZ         IQUIT           < FAUT-IL S'ARRETER ???
         JE          GEN610          < NON...
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST CI-DESSUS EST IDIOT !!!
XEIF%:   VAL         ENDIF
         QUIT        XXQUIT          < OUI...
GEN610:  EQU         $
         CPZ         IVIDEO          < FAUT-IL ECRIRE ???
         JE          GEN600          < NON...
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST CI-DESSUS EST IDIOT !!!
XEIF%:   VAL         ENDIF
         PSR         X               < OUI :
         LRM         A
         WORD        DEMVIW
         SVC                         < ON ECRIT L'IMAGE COURANTE...
         LRM         A
         WORD        DEMVIR
         SVC                         < ET ON ATTEND L'ACQUITTEMENT...
         PLR         X
GEN600:  EQU         $
<
< PASSAGE A L'IMAGE SUIVANTE :
<
         BSR         AGOTO           < ET ON ITERE EVENTUELLEMENT...
         WORD        DEBUT4
<
<
<        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    D E F I N I T I O N   S U R F A C E   3 D  :
<
<
         $EQU        AMPLI
         FLOAT       1               < AMPLIFICATEUR DE LA FONCTION.
         $EQU        MOYENE
         FLOAT       <NIV256/XXXMOY<K<K
                                     < VALEUR MOYENNE DE LA FONCTION.
         $EQU        EXPOP0
         FLOAT       0.9             < EXPOSANT DE DECROISSANCE DE PONDERATION.
         $EQU        PASIX0
         WORD        200             < PAS INITIAL SUR 'OX'.
         $EQU        PASIY0
         WORD        200             < PAS INITIAL SUR 'OY'.
         $EQU        MRECUR
         WORD        32              < PROFONDEUR MAXIMALE DE RECURENCE.
         $EQU        GRAINE
         WORD        5713            < GRAINE DU GENERATEUR ALEATOIRE.
         $EQU        SUPRDN
         NTRN
         WORD        XXN255/XXXMOY   < SUP(RDN).
         TRN
         $EQU        INFRDN
         NTRN
         WORD        -XXN255/XXXMOY  < INF(RDN).
         TRN
         $EQU        AMPLIR
         FLOAT       <W<K<K          < AMPLIFICATEUR DE L'ALEATOIRE.
<
<
<        U P D A T E S   T R A C E   F I N A L  :
<
<
         $EQU        MAXNIV
         WORD        XXN255          < NIVEAU MAXIMAL AUTORISE...
         $EQU        MINNIV
         WORD        XXNOIR+Z        < NIVEAU MINIMAL AUTORISE...
<
<
<        U P D A T E S   E C L A I R A G E  :
<
<
         $EQU        TRX
         WORD        0               < TRANSLATION EN 'X'.
         $EQU        TRY
         WORD        128             < TRANSLATION EN 'Y'.
         $EQU        FXL
         FLOAT       1000            < X(SOURCE LUMINEUSE).	
         $EQU        FYL
         FLOAT       400             < Y(SOURCE LUMINEUSE).
         $EQU        FZL
         FLOAT       0               < Z(SOURCE LUMINEUSE).
         $EQU        NPENOM
         WORD        12              < LARGEUR DE LA ZONE DE PENOMBRE.
<
<
<        U P D A T E S   F I L T R A G E  :
<
<
         $EQU        ALPHA
         FLOAT       0.5             < CONSTANTE D'ELIMINATION DES PICS.
<
<
<        M O D U L A T I N   D E   L A   L U M I N A N C E        :
<        P A R   ' T V 1 '   ( ' I M O D T V ' )  :
<
<
         $EQU        PASM
         WORD        W               < PAS DE PARCOURS DE LA SPIR-MAP,
         $EQU        NMM
         WORD        15              < NOMBRE DE POINTS DE CHAQUE SPIR-MAP.
         $EQU        XCTCDA
         WORD        TV1             < POUR ATTEINDRE L'IMAGE 'TV1'...
<
<
<        C O N T R I B U T I O N   A L E A T O I R E / ' T V 2 '
<        A   L A   D E F I N I T I O N   D E   L A   S U R F A C E  :
<
<
         $EQU        PONRDN
         FLOAT       <W<K<K          < CONTRIBUTION DE LA GENERATION ALEATOIRE,
         $EQU        PONSPI
         FLOAT       <K<K<K          < CONTRIBUTION DES SPIR-MAPS.
<
<
<        E N T R E E   B A N D E   M A G N E T I Q U E  :
<
<
         $EQU        TRANMT
         FLOAT       <K<K<K          < TRANSLATION FONCTION BANDE.
         $EQU        MULTMT
         FLOAT       <W<K<K          < ECHELLE FONCTION BANDE.
<
<
<        U P D A T E S   T E X T U R A G E   3 D  :
<
<
         $EQU        GRAINR
         WORD        9237            < GRAINE DU GENERATEUR DE 'NRECUR'.
         $EQU        FH
         FLOAT       <K<K<K          < "DEPTH-CUEING" MAXIMAL...
         $EQU        FPERSB
         FLOAT       <W<K<K          < PAS DE MISE EN "FUITE" A PRIORI...
         $EQU        AMPLYR
         FLOAT       1.5             < AMPLYFICATEUR DE LA FUNCTION.
         $EQU        MOYENF
         FLOAT       <NIV256/XXXMOY<K<K
                                     < VALEUR MOYENNE DE LA FUNCTION.
         $EQU        EXPOQ0
         FLOAT       0.5             < EXPOSANT DE DECROISSANCE DE PONDERATION.
         $EQU        PAZIX0
         WORD        50              < PAZ INITIAL SUR 'OX'.
         $EQU        PAZIY0
         WORD        50              < PAZ INITIAL SUR 'OY'.
         $EQU        PAZIZ0
         WORD        50              < PAZ INITIAL SUR 'OZ'.
         $EQU        MREKUR
         WORD        1               < PROFONDEUR MAXIMALE DE REKURENCE.
         $EQU        GRAINF
         WORD        4660            < GRAINF DU GENERATEUR ALEATOIRE.
         $EQU        SUPRAN
         NTRN
         WORD        XXN255/XXXMOY   < SUP(RAN).
         TRN
         $EQU        INFRAN
         NTRN
         WORD        -XXN255/XXXMOY  < INF(RAN).
         TRN
<
<
<        U P D A T E S   G A U S S I E N N E   T E X T U R A G E   3 D  :
<
<
         $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.
<
<
<        C O N T R I B U T I O N S   D E S   T E X T U R A G E S   3 D
<                    ( ' I T E X T U ' )  :
<
<
         $EQU        PONRAN
         FLOAT       <W<K<K          < CONTRIBUTION TEXTURE ALEATOIRE,
         $EQU        PONSPJ
         FLOAT       <K<K<K          < CONTRIBUTION TEXTURE SPIR-MAP : PRENDRE
                                     < 0 (ABSENCE) OU 256/7/4=8 (PRESENCE ; 256,
                                     < AFIN DE BALAYER TOUTE LA PLAGE,
                                     < DIVISE PAR 7 AFIN DE COMPENSER LA
                                     < MULTIPLICATION PAR LA NIVEAU MAX DES
                                     < IMAGES 'TV2' ET DIVISER PAR 4 POUR COM-
                                     < PENSER LA MULTIPLICATION PAR 4 DES
                                     < RESULTATS DE 'SPIRD'...).
<
<
<        S E U I L L A G E   P A R   D E S   P L A N S   D E   C O U P E  :
<
<
         $EQU        FALTX
         FLOAT       <K<K<K
         $EQU        FALTY
         FLOAT       <K<K<K
         $EQU        FALTZ
         FLOAT       <W<K<K          < AINSI, ON TEXTURE PAR 'ZS'...
         $EQU        FALTR
         FLOAT       <K<K<K
<
<
<        S U P E R P O S I T I O N   D ' U N   C H A M P   D ' A L T I T U D E S
<        D E F I N I   P A R   ' T V 2 '   ( ' P O N S P I ' )  :
<
<
         $EQU        PASD
         WORD        W               < PAS DE PARCOURS DE LA SPIR-DEP,
         $EQU        NDM
         WORD        15              < NOMBRE DE POINTS DE CHAQUE SPIR-DEP.
         $EQU        FCOEFB
         FLOAT       -1.0            < COEFFICIENT DES EXPOSANTS DES EXPO-
                                     < NENTIELLES DE PONDERATION DES POINTS
                                     < DES SPIR-DEPS.
         $EQU        FCOEFA
         FLOAT       1.0             < POUR PONDERER LA SOMME DES POINTS SUR
                                     < UNE SPIR-DEP DE MODULATION VERTICALE...
<
<
<        H O M O T H E T I E   D U   C H A M P  :
<
<
         $EQU        FHOMO
         FLOAT       1.0             < A PRIORI, PAS D'HOMOTHETIE...
         PAGE
<
<
<        T A B L E   D E S   S Y M B O L E S  :
<
<
         IF          '00000000000@,XEIF%,,XEIF%
         EST
XEIF%:   VAL         ENDIF
         DATE
         END         DEBUT



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