DF'SIOP CHAMP RDN 1'
ED'SIOP CHAMP RDN 1'
IN0
         PAGE
         IDP         "SIOP CHAMP RDN 1"
<
<
<        C H A M P   R D N   1  :
<
<
<        FONCTION :
<                      CE MODULE :
<                    1 - EN CHAQUE POINT DE LA GRILLE
<                    ARGUMENT TIRE UN NOMBRE AU HASARD
<                    ET LE CUMULE A LA VALEUR COURANTE
<                    DU NOEUD CORRESPONDANT ;
<                    2 - A L'INTERIEUR DE CHAQUE MAILLE
<                    IL INTERPOLE ENSUITE ;
<                    3 - ON DISPOSE ALORS D'UN TABLEAU
<                    DE VALEURS ALEATOIRES MAIS CORRE-
<                    LEES QUI SONT ATTRIBUES EN NIVEAU
<                    DE GRIS A L'IMAGE VISUALISEE APRES
<                    CUMUL AVEC L'IMAGE RESIDENTE...
<
<
<        ARGUMENT :
<                    A0000=BORNE SUPERIEURE DE RDN,
<                    A0001=BORNE INFERIEURE DE RDN,
<                    A0002=MULTIPLICATEUR DE RDN,
A0000::  VAL         0
A0001::  VAL         A0000+1
A0002::  VAL         A0001+1
A3::     VAL         A0002+1         < ACTION SUR LE TABLEAU DE VALEURS ALEA-
                                     < TOIRES CORRELEES (Z-BUFFER) :
                                     < =0 : L'INITIALISER A 0,
                                     < #0 : NE PAS L'INITIALISER.
A4::     VAL         A3+1            < PAS EN X DE LA GRILLE,
A5::     VAL         A4+1            < PAS EN Y DE LA GRILLE.
A6::     VAL         A5+1            < POUR LE GENERATEUR ALEATOIRE...
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
PREM:    WORD        -1              < INDICATEUR DE PREMIER PASSAGE.
<
< DEFINITION DE LA GRILLE :
<
PASIX:   WORD        0               < PAS SUR OX,
PASIY:   WORD        0               < PAS SUR OY.
XNOEUD:  WORD        0               < X(NOEUD HAUT-GAUCHE) DE LA MAILLE,
YNOEUD:  WORD        0               < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE.
POINTM:  WORD        0               < POINT COURANT DANS LA MAILLE SOUS LA
                                     < FORME (Y,X).
AFNIV1:  FLOAT       0
AFNIV2:  FLOAT       0
AFNIV3:  FLOAT       0
AFNIV4:  FLOAT       0
<
< OPTIMISATION DES ACCES AUX NOEUDS :
<
NOEUDS:: VAL         4               < NOMBRE DE NOEUDS D'UNE MAILLE,
ATOPTI:  WORD        TOPTI,X         < COUPLE (Y,X) DES NOEUDS MEMORISES.
TOPTI:   EQU         $
         DO          NOEUDS
         WORD        0
AVOPTI:  WORD        VOPTI,X         < LISTE DES VALEURS ALEATOIRES DES NOEUDS.
VOPTI:   EQU         $
         DO          NOEUDS
         WORD        0
ALOPTI:  WORD        LOPTI,X         < TABLE DES OCCUPATIONS DE 'LOPTI'/'VOPTI'.
LOPTI:   EQU         $
         DO          NOEUDS
         WORD        -1              < INITIALEMENT INOCCUPE...
<
< PARAMETRES DU GENERATEUR ALEATOIRE :
<
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
XA6:     WORD        0               < PARAMETRE VARIABLE...
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
XA0000:  WORD        0               < BORNE SUPERIEURE,
XA0001:  WORD        0               < BORNE INFERIEURE...
FMUL:    FLOAT       0               < MULTIPLICATEUR...
INFIN1:  FLOAT       32768
INFIN2:  FLOAT       16384           < INFINI/2...
FWORK4:  FLOAT       0
FWORK5:  FLOAT       0
HINCU:   FLOAT       0               < POUR
HINCV:   FLOAT       0               <      INTERPOLER...
<
< CONSTANTES DIVERSES :
<
FINFIN:  FLOAT       100000
<
< RELAIS DE SOUS-PROGRAMMES :
<
BINTER:  WORD        QINTER          < MODULE D'INTERPOLATION...
AQWORK:  WORD        PWORK           < 'FAD FWORK', PUIS 'FST FWORK'...
ARDN:    WORD        SQRDN           < GENERATEUR ALEATOIRE.
ASP1:    WORD        SP1             < ACCES AU Z-BUFFER...
ASPU1:   WORD        SPU1            < RELAI...
         PROG
<
<
<        I N T E R P O L A T I O N  :
<
<
<        NOTA :
<                      ON N'UTILISE PAS 'PINTER' DE
<                    'SI  +', CAR CELUI-CI UTILISE
<                    LA BASE 'L' POUR APPELER LE
<                    SOUS-PROGRAMME 'PWORK' !!!
<
<
QINTER:  EQU         $
         FLD         F1
         FSB         HINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         HINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         AFNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         HINCU
         FMP         FWORK2
         FMP         AFNIV2
         BSR         AQWORK          < +FU*(1-FV)*N2,
         FLD         HINCU
         FMP         HINCV
         FMP         AFNIV3
         BSR         AQWORK          < +FU*FV*N3,
         FLD         FWORK1
         FMP         HINCV
         FMP         AFNIV4
         BSR         AQWORK          < +(1-FU)*FV*N4,
         RSR
<
<
<        G E N E R A T E U R   A L E A T O I R E  :
<
<
SPRDN:   EQU         $
SPRDN1:  EQU         $
         LA          RDN             < GENERATION DE NOMBRES ALEATOIRES :
         EOR         POINTS          < ON INTRODUIT UN AUTRE PARAMETRE...
         EOR         MCDAR
         MP          RDN1
         SCRD        RDN3
         JANE        SPMOYC
         LR          B,A
         JANE        SPMOYC
         LA          F1              < REINITIALISATION...
         EOR         XS
         AD          F1+1            < ????
         AD          RDN2
SPMOYC:  EQU         $
         STA         RDN
         LA          RDN4            < CALCUL D'UN 2EME NOMBRE ALEATOIRE...
         MP          RDN5
         EOR         POINTS
         EOR         MCDAV
         SCRD        RDN6
         JANE        SPMOYF
         LR          B,A
         JANE        SPMOYF
         LA          F1
         EOR         YS
         EOR         F1+1
         AD          RDN2
SPMOYF:  EQU         $
         STA         RDN4
         EOR         MCDAB
         EOR         RDN
SPRDN2:  EQU         $
         FLT
         FMP         F05             < RDN/2,
         PSR         A,B             < SAVE RDN/2...
         FAD         INFIN2          < (RDN+INFINI)/2,
         FST         FWORK4
         LA          XA0000          < BORNE SUPERIEURE,
         FLT
         FMP         FWORK4
         FST         FWORK4
         PLR         A,B             < RDN/2,
         FSB         INFIN2          < (RDN-INFINI)/2,
         FST         FWORK5
         LA          XA0001          < BORNE INFERIEURE,
         FLT
         FMP         FWORK5
         FST         FWORK5
         FLD         FWORK4
         FSB         FWORK5
         FDV         INFIN1          < MISE A L'ECHELLE...
         FIX
         CP          XA0000          < ???
         JG          SPRDN3          < ERREUR...
         CP          XA0001          < ???
         JL          SPRDN3          < ERREUR...
         FLT
         FMP         FMUL
         BSR         AROND           < (A)=NOMBRE ALEATOIRE ENTIER...
         PLR         B
         RSR
SPRDN3:  EQU         $
         QUIT        1
         JMP         SPRDN2
<
<
<        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  :
<
<
SQRDN:   EQU         $
         PSR         B
         LA          YS
         SWBR        A,A
         OR          XS              < ON FORME UNE COMBINAISON BIUNIVOQUE
                                     < DE XS ET YS...
         AD          RDN1
         EOR         PASIX           < POUR DONNER DES CHOSES
         EOR         PASIY           < DIFFERENTES SUIVANT LA GRILLE...
         EOR         XA6             < PARAMETRE VARIABLE...
         FLT                         < INITIALISATION DU GENERATEUR...
         BSR         ASIN            < DONT ON PREND LE SINUS...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
         JMP         SPRDN2          < QUE L'ON CONSIDERE ENTIER...
<
<
<        A C C E S   Z - B U F F E R  :
<
<
<        ARGUMENT :
<                    (X,Y)=POINT COURANT,
<                    (B)=NUMERO (1/2/3/4) DU NOEUD.
<
<
<        RESULTAT :
<                    (A,B)=VALEUR FLOTTANTE ASSOCIEE A (X,Y)
<                          DANS LE TABLEAU ALEATOIRE CORRELE.
<
<
SP1:     EQU         $
         SWBR        Y,A
         ORR         X,A             < (A)=POINT COURANT (Y,X).
         PSR         X,Y
         LR          B,X             < (X)=NUMERO DU NOEUD :
         CPZ         &ALOPTI         < Y-A-T'IL QUELQUE CHOSE DANS L'ACCELE-
                                     < RATEUR D'ACCES ???
         JL          SP1A            < NON, RIEN A TESTER...
         CP          &ATOPTI         < OUI, EST-CE LE NOEUD QUE L'ON CHERCHE ???
         LB          &AVOPTI         < (B)=VALEUR ALEATOIRE A PRIORI...
         JE          SP1B            < OUI, LE NOEUD QUE L'ON CHERCHE EST
                                     < DEJA LA, (B) EST BON...
SP1A:    EQU         $               < LE NOEUD CHERCHE (A) N'EST PAS LA :
         STA         &ATOPTI         < ON L'Y MET (A),
         STZ         &ALOPTI         < ET L'ON MEMORISE CE FAIT...
         LYI         YLOAD
         BSR         AGZB            < ACCES DANS 'B' DE LA VALEUR ASSOCIEE
                                     < AU COUPLE (Y,X)...
         STB         &AVOPTI         < ET ON MEMORISE LA VALEUR...
SP1B:    EQU         $
         LR          B,A
         FLT                         < ET ON CONVERTIT EN FLOTTANT...
         PLR         X,Y
         RSR
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         CPZ         PREM            < EST-CE LA PREMIERE FOIS ???
         JL          SPU20           < OUI...
         BR          ASPU1           < NON...
SPU20:   EQU         $
         IC          PREM            < ON LE MEMORISE...
<
< ENTREE DES PARAMETRES
< DE GENERATION ALEATOIRE :
<
         LXI         A0000
         BSR         ASPCT
         FIX
         STA         XA0000          < BORNE SUPERIEURE,
         LXI         A0001
         BSR         ASPCT
         FIX
         STA         XA0001          < ET BORNE INFERIEURE...
         LXI         A0002
         BSR         ASPCT
         FCAZ
         JLE         $               < ????!?!
         FST         FMUL
         LXI         A6
         BSR         ASPCT
         BSR         AROND
         STA         XA6             < PARAMETRE D'INITIALISATION...
<
< INITAILISATION DU TABLEAU ???
<
         LXI         A3
         BSR         ASPCT
         BSR         AROND
         JANE        SPU2            < NON...
         LBI         0               < OUI : (B)=VALEUR INITIALE,
         LAI         0               < (A)=ADRESSE COURANTE,
         LYI         YSTORE          < (Y)=FONCTION D'ECRITURE...
SPU3:    EQU         $
         BSR         AGZB            < INITIALISATION DU TABLEAU ALEATOIRE...
         ADRI        1,A             < AU SUIVANT,
         JANE        SPU3            < SI EXISTE...
<
< ENTREE DE LA GRILLE :
<
SPU2:    EQU         $
         LXI         A4
         BSR         ASPCT
         BSR         AROND
         JALE        $               < ???
         STA         PASIX           < PAS EN 'X',
         LXI         A5
         BSR         ASPCT
         BSR         AROND
         JALE        $               < ???
         STA         PASIY           < ET PAS EN 'Y'...
<
< GENERATION ALEATOIRE AUX
< NOEUDS DE LA GRILLE :
<
         LYI         0               < (Y)=COORDONNEE 'Y',
SPU4:    EQU         $
         LXI         0               < (X)=COORDONNEE 'X'.
SPU5:    EQU         $
         STX         XS              < POUR LA GENERATION
         STY         YS              <                    ALEATOIRE...
         PSR         X,Y
         SWBR        Y,A
         ORR         X,A             < (A)=POINT COURANT (Y,X),
         PSR         A               < ET SAUVEGARDE...
         LYI         YLOAD
         BSR         AGZB            < (B)=CONTENU ANTERIEUR DE (X,Y),
         BSR         ARDN            < (A)=VALEUR ALEATOIRE COURANTE,
         ADR         A,B             < ET CUMUL,
         LYI         YSTORE
         PLR         A
         BSR         AGZB            < QUE L'ON REMET DANS LE TABLEAU EN (Y,X).
         PLR         X,Y             < RESTAURATION DU POINT COURANT,
         LR          X,A
         AD          PASIX
         LR          A,X             < PROGRESSION SUR LA GRILLE,
         CPI         NPOLM1
         JLE         SPU5            < SUR 'OX'...
         LR          Y,A             < PUIS SUR 'OY'...
         AD          PASIY
         LR          A,Y             < PROGRESSION SUR LA GRILLE,
         CPI         NLIGM1
         JLE         SPU4
<
< INTERPOLATION DANS CHAQUE MAILLE :
<
         LYI         0               < (Y)=COORDONNEE 'Y',
SPU14:   EQU         $
         LXI         0               < (X)=COORDONNEE 'X'.
SPU15:   EQU         $
         STX         XS              < POUR TRACER LE
         STY         YS              < POINT COURANT...
         PSR         X,Y             < SAUVEGARDE DU POINT COURANT,
         SWBR        Y,A
         ORR         X,A
         STA         POINTM          < POINT COURANT (Y,X).
         LR          X,A
         SARD        NBITMO
         DV          PASIX
         MP          PASIX
         STB         XNOEUD          < X(NOEUD HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE,
         LR          Y,A
         SARD        NBITMO
         DV          PASIY
         MP          PASIY
         STB         YNOEUD          < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE.
         LA          XS
         CP          XNOEUD          < EST-ON EN UN NOEUD ???
         JNE         SPU31           < NON...
         LA          YS              < PEUT-ETRE :
         CP          YNOEUD          < EST-ON EN UN NOEUD ???
         JNE         SPU31           < NON, INTERPOLONS...
         LA          POINTM          < (A)=POINT COURANT (YS,XS),
         LYI         YLOAD
         JMP         SPU30           < VERS L'ACCES A LA VALEUR DU NOEUD...
SPU31:   EQU         $
         LA          PASIX
         FLT
         FST         FWORK
         LR          X,A
         SB          XNOEUD          < X-XNOEUD,
         FLT
         FDV         FWORK           < (X-XNOEUD)/PASIX,
         FST         HINCU           < DISTANCE NORMALISEE A 1 LE LONG DE OX,
                                     < DU POINT COURANT AU NOEUD DE LA MAILLE.
         LA          PASIY
         FLT
         FST         FWORK
         LR          Y,A
         SB          YNOEUD          < Y-YNOEUD,
         FLT
         FDV         FWORK           < (Y-YNOEUD)/PASIY,
         FST         HINCV           < DISTANCE NORMALISEE A 1 LE LONG DE OY,
                                     < DU POINT COURANT AU NOEUD DE LA MAILLE.
         LX          XNOEUD
         LY          YNOEUD
         LBI         0               < PREMIER NOEUD :
         BSR         ASP1
         FST         AFNIV1          < NIVEAU(XNOEUD,YNOEUD),
         LA          XNOEUD
         AD          PASIX
         ANDI        NPOLM1          < ON TRAVAILLE A PRIORI SUR UN TORE...
         LR          A,X
         LBI         1               < DEUXIEME NOEUD :
         BSR         ASP1
         FST         AFNIV2          < NIVEAU(XNOEUD+PASIX,YNOEUD),
         LA          YNOEUD
         AD          PASIY
         ANDI        NLIGM1          < ON TRAVAILLE A PRIORI SUR UN TORE...
         LR          A,Y
         LBI         2               < TROISIEME NOEUD :
         BSR         ASP1
         FST         AFNIV3          < NIVEAU(XNOEUD+PASIX,YNOEUD+PASIY),
         LX          XNOEUD
         LBI         3               < QUATRIEME NOEUD :
         BSR         ASP1
         FST         AFNIV4          < NIVEAU(XNOEUD,YNOEUD+PASIY).
         BSR         BINTER          < ET INTERPOLATION...
         BSR         AROND           < CONVERSION ENTIERE,
         LR          A,B             < (B)=VALEUR INTERPOLEE ENTRE LES 4
                                     <     SOMMETS POUR LE POINT COURANT,
         LA          POINTM
         LYI         YSTORE
SPU30:   EQU         $               < CAS DES NOEUDS...
         BSR         AGZB            < QUE L'ON RANGE DANS LE TABLEAU...
         LR          B,A
         SLRS        NBITMO-NCOOL-1
         ANDI        NIVMAX
         BSR         ASPRPS          < ET ON TRACE POUR PATIENTER...
         PLR         X,Y             < RESTAURAYTION DU POINT COURANT,
         ADRI        1,X             < ET PASSAGE AU SUIVANT,
         LR          X,A
         CPI         NPOLM1
         JLE         SPU15           < LE LONG DE 'OX'...
         ADRI        1,Y             < PUIS DE 'OY'...
         LR          Y,A
         CPI         NLIGM1
         JLE         SPU14
<
< CAS DE TOUS LES POINTS (XR,YR) :
<
SPU1:    EQU         $
         LA          XR
         STA         XS
         LA          YR
         STA         YS
         SWBR        A,A
         OR          XR              < POINT COURANT=(YR,XR)=(YS,XS),
         LYI         YLOAD
         BSR         AGZB            < (B)=VALEUR ALEATOIRE ASSOCIEE,
         BSR         ASPGPR          < (A)=NIVEAU(XR,YR),
         XR          A,B
         SLRS        NBITMO-NCOOL-1  < QUE L'ON CONVERTIT EN NIVEAU DE GRIS,
         ADR         B,A             < ET CUMUL : NIVEAU(XR,YR)+RDN(XR,YR),
         ANDI        NIVMAX          < ET CALCUL MODULO...
         BSR         ASPRPS          < QUE L'ON FORCE EN (XS,YS)=(XR,YR)...
<
< SORTIE :
<
         FLD         FINFIN          < AFIN DE FAIRE UN OVERS-SCREEN...
         RSR
<
<
<        C O M P O S A N T E  E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         FINFIN          < AFIN DE FAIRE UN OVERS-SCREEN...
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOP CHAMP RDN 1'
DF'SIOP CHAMP RDN 2'
ED'SIOP CHAMP RDN 2'
IN0
         PAGE
         IDP         "SIOP CHAMP RDN 2"
<
<
<        C H A M P   R D N   2  :
<
<
<        FONCTION :
<                      CE MODULE :
<                    1 - EN CHAQUE POINT DE LA GRILLE
<                    ARGUMENT TIRE UN NOMBRE AU HASARD
<                    ET LE CUMULE A LA VALEUR COURANTE
<                    DU NOEUD CORRESPONDANT ;
<                    2 - A L'INTERIEUR DE CHAQUE MAILLE
<                    IL INTERPOLE ENSUITE ;
<                    3 - ON DISPOSE ALORS D'UN TABLEAU
<                    DE VALEURS ALEATOIRES MAIS CORRE-
<                    LEES QUI SONT ATTRIBUES EN NIVEAU
<                    DE GRIS A L'IMAGE VISUALISEE APRES
<                    CUMUL AVEC L'IMAGE RESIDENTE...
<
<
<        ARGUMENT :
<                    A0000=BORNE SUPERIEURE DE RDN,
<                    A0001=BORNE INFERIEURE DE RDN,
<                    A0002=MULTIPLICATEUR DE RDN,
A0000::  VAL         0
A0001::  VAL         A0000+1
A0002::  VAL         A0001+1
A3::     VAL         A0002+1         < ACTION SUR LE TABLEAU DE VALEURS ALEA-
                                     < TOIRES CORRELEES (Z-BUFFER) :
                                     < =0 : L'INITIALISER A 0,
                                     < #0 : NE PAS L'INITIALISER.
A4::     VAL         A3+1            < PAS EN X DE LA GRILLE,
A5::     VAL         A4+1            < PAS EN Y DE LA GRILLE.
A6::     VAL         A5+1            < POUR LE GENERATEUR ALEATOIRE...
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
PREM:    WORD        -1              < INDICATEUR DE PREMIER PASSAGE.
<
< DEFINITION DE LA GRILLE :
<
PASIX:   WORD        0               < PAS SUR OX,
PASIY:   WORD        0               < PAS SUR OY.
XNOEUD:  WORD        0               < X(NOEUD HAUT-GAUCHE) DE LA MAILLE,
YNOEUD:  WORD        0               < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE.
POINTM:  WORD        0               < POINT COURANT DANS LA MAILLE SOUS LA
                                     < FORME (Y,X).
AFNIV1:  FLOAT       0
AFNIV2:  FLOAT       0
AFNIV3:  FLOAT       0
AFNIV4:  FLOAT       0
<
< OPTIMISATION DES ACCES AUX NOEUDS :
<
NOEUDS:: VAL         4               < NOMBRE DE NOEUDS D'UNE MAILLE,
ATOPTI:  WORD        TOPTI,X         < COUPLE (Y,X) DES NOEUDS MEMORISES.
TOPTI:   EQU         $
         DO          NOEUDS
         WORD        0
AVOPTI:  WORD        VOPTI,X         < LISTE DES VALEURS ALEATOIRES DES NOEUDS.
VOPTI:   EQU         $
         DO          NOEUDS
         WORD        0
ALOPTI:  WORD        LOPTI,X         < TABLE DES OCCUPATIONS DE 'LOPTI'/'VOPTI'.
LOPTI:   EQU         $
         DO          NOEUDS
         WORD        -1              < INITIALEMENT INOCCUPE...
<
< PARAMETRES DU GENERATEUR ALEATOIRE :
<
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
XA6:     WORD        0               < PARAMETRE VARIABLE...
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
XA0000:  WORD        0               < BORNE SUPERIEURE,
XA0001:  WORD        0               < BORNE INFERIEURE...
FMUL:    FLOAT       0               < MULTIPLICATEUR...
INFIN1:  FLOAT       32768
INFIN2:  FLOAT       16384           < INFINI/2...
FWORK4:  FLOAT       0
FWORK5:  FLOAT       0
HINCU:   FLOAT       0               < POUR
HINCV:   FLOAT       0               <      INTERPOLER...
<
< CONSTANTES DIVERSES :
<
FINFIN:  FLOAT       100000
<
< RELAIS DE SOUS-PROGRAMMES :
<
BINTER:  WORD        QINTER          < MODULE D'INTERPOLATION...
AQWORK:  WORD        PWORK           < 'FAD FWORK', PUIS 'FST FWORK'...
ARDN:    WORD        SPRDN           < GENERATEUR ALEATOIRE.
ASP1:    WORD        SP1             < ACCES AU Z-BUFFER...
ASPU1:   WORD        SPU1            < RELAI...
         PROG
<
<
<        I N T E R P O L A T I O N  :
<
<
<        NOTA :
<                      ON N'UTILISE PAS 'PINTER' DE
<                    'SI  +', CAR CELUI-CI UTILISE
<                    LA BASE 'L' POUR APPELER LE
<                    SOUS-PROGRAMME 'PWORK' !!!
<
<
QINTER:  EQU         $
         FLD         F1
         FSB         HINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         HINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         AFNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         HINCU
         FMP         FWORK2
         FMP         AFNIV2
         BSR         AQWORK          < +FU*(1-FV)*N2,
         FLD         HINCU
         FMP         HINCV
         FMP         AFNIV3
         BSR         AQWORK          < +FU*FV*N3,
         FLD         FWORK1
         FMP         HINCV
         FMP         AFNIV4
         BSR         AQWORK          < +(1-FU)*FV*N4,
         RSR
<
<
<        G E N E R A T E U R   A L E A T O I R E  :
<
<
SPRDN:   EQU         $
         PSR         B
SPRDN1:  EQU         $
         LA          RDN             < GENERATION DE NOMBRES ALEATOIRES :
         EOR         POINTS          < ON INTRODUIT UN AUTRE PARAMETRE...
         EOR         XA6             < ET UN PARAMETRE VARIABLE D'APPEL...
         EOR         MCDAR
         MP          RDN1
         SCRD        RDN3
         JANE        SPMOYC
         LR          B,A
         JANE        SPMOYC
         LA          F1              < REINITIALISATION...
         EOR         XS
         AD          F1+1            < ????
         AD          RDN2
SPMOYC:  EQU         $
         STA         RDN
         LA          RDN4            < CALCUL D'UN 2EME NOMBRE ALEATOIRE...
         MP          RDN5
         EOR         POINTS
         EOR         MCDAV
         SCRD        RDN6
         JANE        SPMOYF
         LR          B,A
         JANE        SPMOYF
         LA          F1
         EOR         YS
         EOR         F1+1
         AD          RDN2
SPMOYF:  EQU         $
         STA         RDN4
         EOR         MCDAB
         EOR         RDN
SPRDN2:  EQU         $
         FLT
         FMP         F05             < RDN/2,
         PSR         A,B             < SAVE RDN/2...
         FAD         INFIN2          < (RDN+INFINI)/2,
         FST         FWORK4
         LA          XA0000          < BORNE SUPERIEURE,
         FLT
         FMP         FWORK4
         FST         FWORK4
         PLR         A,B             < RDN/2,
         FSB         INFIN2          < (RDN-INFINI)/2,
         FST         FWORK5
         LA          XA0001          < BORNE INFERIEURE,
         FLT
         FMP         FWORK5
         FST         FWORK5
         FLD         FWORK4
         FSB         FWORK5
         FDV         INFIN1          < MISE A L'ECHELLE...
         FIX
         CP          XA0000          < ???
         JG          SPRDN3          < ERREUR...
         CP          XA0001          < ???
         JL          SPRDN3          < ERREUR...
         FLT
         FMP         FMUL
         BSR         AROND           < CONVERSION EN ENTIER...
         PLR         B
         RSR
SPRDN3:  EQU         $
         QUIT        1
         JMP         SPRDN2
<
<
<        A C C E S   Z - B U F F E R  :
<
<
<        ARGUMENT :
<                    (X,Y)=POINT COURANT,
<                    (B)=NUMERO (1/2/3/4) DU NOEUD.
<
<
<        RESULTAT :
<                    (A,B)=VALEUR FLOTTANTE ASSOCIEE A (X,Y)
<                          DANS LE TABLEAU ALEATOIRE CORRELE.
<
<
SP1:     EQU         $
         SWBR        Y,A
         ORR         X,A             < (A)=POINT COURANT (Y,X).
         PSR         X,Y
         LR          B,X             < (X)=NUMERO DU NOEUD :
         CPZ         &ALOPTI         < Y-A-T'IL QUELQUE CHOSE DANS L'ACCELE-
                                     < RATEUR D'ACCES ???
         JL          SP1A            < NON, RIEN A TESTER...
         CP          &ATOPTI         < OUI, EST-CE LE NOEUD QUE L'ON CHERCHE ???
         LB          &AVOPTI         < (B)=VALEUR ALEATOIRE A PRIORI...
         JE          SP1B            < OUI, LE NOEUD QUE L'ON CHERCHE EST
                                     < DEJA LA, (B) EST BON...
SP1A:    EQU         $               < LE NOEUD CHERCHE (A) N'EST PAS LA :
         STA         &ATOPTI         < ON L'Y MET (A),
         STZ         &ALOPTI         < ET L'ON MEMORISE CE FAIT...
         LYI         YLOAD
         BSR         AGZB            < ACCES DANS 'B' DE LA VALEUR ASSOCIEE
                                     < AU COUPLE (Y,X)...
         STB         &AVOPTI         < ET ON MEMORISE LA VALEUR...
SP1B:    EQU         $
         LR          B,A
         FLT                         < ET ON CONVERTIT EN FLOTTANT...
         PLR         X,Y
         RSR
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         CPZ         PREM            < EST-CE LA PREMIERE FOIS ???
         JL          SPU20           < OUI...
         BR          ASPU1           < NON...
SPU20:   EQU         $
         IC          PREM            < ON LE MEMORISE...
<
< ENTREE DES PARAMETRES
< DE GENERATION ALEATOIRE :
<
         LXI         A0000
         BSR         ASPCT
         FIX
         STA         XA0000          < BORNE SUPERIEURE,
         LXI         A0001
         BSR         ASPCT
         FIX
         STA         XA0001          < ET BORNE INFERIEURE...
         LXI         A0002
         BSR         ASPCT
         FCAZ
         JLE         $               < ?!?!?!
         FST         FMUL
         LXI         A6
         BSR         ASPCT
         BSR         AROND
         STA         XA6             < POUR LE GENERATEUR...
<
< INITAILISATION DU TABLEAU ???
<
         LXI         A3
         BSR         ASPCT
         BSR         AROND
         JANE        SPU2            < NON...
         LBI         0               < OUI : (B)=VALEUR INITIALE,
         LAI         0               < (A)=ADRESSE COURANTE,
         LYI         YSTORE          < (Y)=FONCTION D'ECRITURE...
SPU3:    EQU         $
         BSR         AGZB            < INITIALISATION DU TABLEAU ALEATOIRE...
         ADRI        1,A             < AU SUIVANT,
         JANE        SPU3            < SI EXISTE...
<
< ENTREE DE LA GRILLE :
<
SPU2:    EQU         $
         LXI         A4
         BSR         ASPCT
         BSR         AROND
         JALE        $               < ???
         STA         PASIX           < PAS EN 'X',
         LXI         A5
         BSR         ASPCT
         BSR         AROND
         JALE        $               < ???
         STA         PASIY           < ET PAS EN 'Y'...
<
< GENERATION ALEATOIRE AUX
< NOEUDS DE LA GRILLE :
<
         LYI         0               < (Y)=COORDONNEE 'Y',
SPU4:    EQU         $
         LXI         0               < (X)=COORDONNEE 'X'.
SPU5:    EQU         $
         STX         XS              < POUR LA GENERATION
         STY         YS              <                    ALEATOIRE...
         PSR         X,Y
         SWBR        Y,A
         ORR         X,A             < (A)=POINT COURANT (Y,X),
         PSR         A               < ET SAUVEGARDE...
         LYI         YLOAD
         BSR         AGZB            < (B)=CONTENU ANTERIEUR DE (X,Y),
         BSR         ARDN            < (A)=VALEUR ALEATOIRE COURANTE,
         ADR         A,B             < ET CUMUL,
         LYI         YSTORE
         PLR         A
         BSR         AGZB            < QUE L'ON REMET DANS LE TABLEAU EN (Y,X).
         PLR         X,Y             < RESTAURATION DU POINT COURANT,
         LR          X,A
         AD          PASIX
         LR          A,X             < PROGRESSION SUR LA GRILLE,
         CPI         NPOLM1
         JLE         SPU5            < SUR 'OX'...
         LR          Y,A             < PUIS SUR 'OY'...
         AD          PASIY
         LR          A,Y             < PROGRESSION SUR LA GRILLE,
         CPI         NLIGM1
         JLE         SPU4
<
< INTERPOLATION DANS CHAQUE MAILLE :
<
         LYI         0               < (Y)=COORDONNEE 'Y',
SPU14:   EQU         $
         LXI         0               < (X)=COORDONNEE 'X'.
SPU15:   EQU         $
         STX         XS              < POUR TRACER LE
         STY         YS              < POINT COURANT...
         PSR         X,Y             < SAUVEGARDE DU POINT COURANT,
         SWBR        Y,A
         ORR         X,A
         STA         POINTM          < POINT COURANT (Y,X).
         LR          X,A
         SARD        NBITMO
         DV          PASIX
         MP          PASIX
         STB         XNOEUD          < X(NOEUD HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE,
         LR          Y,A
         SARD        NBITMO
         DV          PASIY
         MP          PASIY
         STB         YNOEUD          < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE.
         LA          XS
         CP          XNOEUD          < EST-ON EN UN NOEUD ???
         JNE         SPU31           < NON...
         LA          YS              < PEUT-ETRE :
         CP          YNOEUD          < EST-ON EN UN NOEUD ???
         JNE         SPU31           < NON, INTERPOLONS...
         LA          POINTM          < (A)=POINT COURANT (YS,XS),
         LYI         YLOAD
         JMP         SPU30           < VERS L'ACCES A LA VALEUR DU NOEUD...
SPU31:   EQU         $
         LA          PASIX
         FLT
         FST         FWORK
         LR          X,A
         SB          XNOEUD          < X-XNOEUD,
         FLT
         FDV         FWORK           < (X-XNOEUD)/PASIX,
         FST         HINCU           < DISTANCE NORMALISEE A 1 LE LONG DE OX,
                                     < DU POINT COURANT AU NOEUD DE LA MAILLE.
         LA          PASIY
         FLT
         FST         FWORK
         LR          Y,A
         SB          YNOEUD          < Y-YNOEUD,
         FLT
         FDV         FWORK           < (Y-YNOEUD)/PASIY,
         FST         HINCV           < DISTANCE NORMALISEE A 1 LE LONG DE OY,
                                     < DU POINT COURANT AU NOEUD DE LA MAILLE.
         LX          XNOEUD
         LY          YNOEUD
         LBI         0               < PREMIER NOEUD :
         BSR         ASP1
         FST         AFNIV1          < NIVEAU(XNOEUD,YNOEUD),
         LA          XNOEUD
         AD          PASIX
         ANDI        NPOLM1          < ON TRAVAILLE A PRIORI SUR UN TORE...
         LR          A,X
         LBI         1               < DEUXIEME NOEUD :
         BSR         ASP1
         FST         AFNIV2          < NIVEAU(XNOEUD+PASIX,YNOEUD),
         LA          YNOEUD
         AD          PASIY
         ANDI        NLIGM1          < ON TRAVAILLE A PRIORI SUR UN TORE...
         LR          A,Y
         LBI         2               < TROISIEME NOEUD :
         BSR         ASP1
         FST         AFNIV3          < NIVEAU(XNOEUD+PASIX,YNOEUD+PASIY),
         LX          XNOEUD
         LBI         3               < QUATRIEME NOEUD :
         BSR         ASP1
         FST         AFNIV4          < NIVEAU(XNOEUD,YNOEUD+PASIY).
         BSR         BINTER          < ET INTERPOLATION...
         BSR         AROND           < CONVERSION ENTIERE,
         LR          A,B             < (B)=VALEUR INTERPOLEE ENTRE LES 4
                                     <     SOMMETS POUR LE POINT COURANT,
         LA          POINTM
         LYI         YSTORE
SPU30:   EQU         $               < CAS DES NOEUDS...
         BSR         AGZB            < QUE L'ON RANGE DANS LE TABLEAU...
         LR          B,A
         SLRS        NBITMO-NCOOL-1
         ANDI        NIVMAX
         BSR         ASPRPS          < ET ON TRACE POUR PATIENTER...
         PLR         X,Y             < RESTAURAYTION DU POINT COURANT,
         ADRI        1,X             < ET PASSAGE AU SUIVANT,
         LR          X,A
         CPI         NPOLM1
         JLE         SPU15           < LE LONG DE 'OX'...
         ADRI        1,Y             < PUIS DE 'OY'...
         LR          Y,A
         CPI         NLIGM1
         JLE         SPU14
<
< CAS DE TOUS LES POINTS (XR,YR) :
<
SPU1:    EQU         $
         LA          XR
         STA         XS
         LA          YR
         STA         YS
         SWBR        A,A
         OR          XR              < POINT COURANT=(YR,XR)=(YS,XS),
         LYI         YLOAD
         BSR         AGZB            < (B)=VALEUR ALEATOIRE ASSOCIEE,
         BSR         ASPGPR          < (A)=NIVEAU(XR,YR),
         XR          A,B
         SLRS        NBITMO-NCOOL-1  < QUE L'ON CONVERTIT EN NIVEAU DE GRIS,
         ADR         B,A             < ET CUMUL : NIVEAU(XR,YR)+RDN(XR,YR),
         ANDI        NIVMAX          < ET CALCUL MODULO...
         BSR         ASPRPS          < QUE L'ON FORCE EN (XS,YS)=(XR,YR)...
<
< SORTIE :
<
         FLD         FINFIN          < AFIN DE FAIRE UN OVERS-SCREEN...
         RSR
<
<
<        C O M P O S A N T E  E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         FINFIN          < AFIN DE FAIRE UN OVERS-SCREEN...
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOP CHAMP RDN 2'
DF'SIOP MONTAGNE 1'
ED'SIOP MONTAGNE 1'
IN0
         PAGE
         IDP         "SIOP MONTAGNE 1"
<
<
<        G E N E R A T E U R   D E   M O N T A G N E S   1  :
<
<
<        FONCTION :
<                      CE MODULE UTILISE L'IMAGE
<                    SITUEE EN 'TV2', ET TRANSFORME
<                    SES NIVEAUX DE GRIS EN ALTITUDES...
<
<
<        ARGUMENTS :
<                    A0000=FACTEUR D'AMPLIFICATION DE 'W'.
<                    A0001=DEPLACEMENT DE 'U',
<                    A0002=DEPLACEMENT DE 'V'.
<                    A0003=0 : FAIRE L'INTERPOLATION SUR UN CARRE "ENTIER",
<                         =1 : NE PRENDRE QUE LE SOMMET (XS,YS).
A0::     VAL         0
A1::     VAL         A0+1
A2::     VAL         A1+1
A3::     VAL         A2+1
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
XINDIC:  WORD        0               < 0=INTERPOLER, 1=NE PAS INTERPOLER...
GNIV1:   FLOAT       0               < NIVEAU(XS,YS),
GNIV2:   FLOAT       0               < NIVEAU(XS+1,YS),
GNIV3:   FLOAT       0               < NIVEAU(XS+1,YS+1),
GNIV4:   FLOAT       0               < NIVEAU(XS,YS+1).
GINCU:   FLOAT       0               < COORDONNEES RELATIVES D'UN POINT
GINCV:   FLOAT       0               < DANS UN CARRE "ENTIER"...
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
         PROG
SPU:     EQU         $
         LXI         A1
         BSR         ASPCT
         FAD         VARU
         RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         LXI         A2
         BSR         ASPCT
         FAD         VARV
         RSR                         < ???!?
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
<
< CALCUL DU POINT COURANT :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         FLT
         FAD         FWORK
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         FLT
         FAD         FWORK
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
<
< POSITION DE CE POINT COURANT
< DANS UN CARRE A COORDONNEES
< ENTIERES :
<
         FLD         GXS
         FIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         FLT
         FSB         GXS
         FNEG
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         GYS
         FIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         FLT
         FSB         GYS
         FNEG
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         LXI         A3
         BSR         ASPCT
         BSR         AROND
         STA         XINDIC          < XINDIC=0/1.
         LA          CTCDA
         STA         XCTCDA          < POUR ATTEINDRE 'TV2'...
         BSR         ASPGPS
         FLT
         CPZ         XINDIC
         JNE         SPW1            < NON...
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ASPGPS
         FLT
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ASPGPS
         FLT
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ASPGPS
         FLT
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         GNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         GINCU
         FMP         FWORK2
         FMP         GNIV2
         FAD         FWORK
         FST         FWORK           < +FU*(1-FV)*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         FAD         FWORK
         FST         FWORK           < +FU*FV*N3,
         FLD         FWORK1
         FMP         GINCV
         FMP         GNIV4
         FAD         FWORK           < +(1-FU)*FV*N4,
<
< CALCUL DU DEPLACEMENT EN 'W' :
<
SPW1:    EQU         $
         FST         FWORK
         LXI         A0
         BSR         ASPCT
         FMP         FWORK
         STZ         XCTCDA          < POUR ATTEINDRE 'TV1'...
         RSR
:F
:F
< <<'SIOP MONTAGNE 1'
DF'SIOP MONTAGNE 2'
ED'SIOP MONTAGNE 2'
IN0
         PAGE
         IDP         "SIOP MONTAGNE 2"
         $EQU        $-32            < A T T E N T I O N ...
         IDP         "ATTENTION : EST EN RECOUVREMENT DE -32 MOTS !!!"
<
<
<        G E N E R A T E U R   D E   M O N T A G N E S   2  :
<
<
<        FONCTION :
<                      CE MODULE UTILISE L'IMAGE
<                    SITUEE EN 'TV2', ET TRANSFORME
<                    SES NIVEAUX DE GRIS EN ALTITUDES...
<                      POUR CE FAIRE, EN CHAQUE POINT ARGUMENT
<                    (VARU,VARV), IL RECHERCHE UN QUADRILATERE
<                    DE L'IMAGE 'TV2' INCLUANT CE POINT ; BIEN
<                    ENTENDU C'EST LE PLUS PETIT QUADRILATERE
<                    QUE L'ON RECHERCHE...
<
<
<        ARGUMENTS :
<                    A0000=FACTEUR D'AMPLIFICATION DE 'W'.
<                    A0001=DEPLACEMENT DE 'U',
<                    A0002=DEPLACEMENT DE 'V'.
A0::     VAL         0
A1::     VAL         A0+1
A2::     VAL         A1+1
LARG::   VAL         A2+1*2          < NOMMBRE DE MOTS OCCUPES PAR LES ARGU-
                                     < MENTS FLOTTANTS...
<
<
<        C O N T E X T E   D E S   S O M M E T S  :
<
<
         DSEC
NIVO:    EQU         $
FNIVO:   FLOAT       0               < NIVEAU FLOTTANT DU SOMMET COURANT,
XFNIVO:: VAL         FNIVO-NIVO
FU:      FLOAT       0               < VALEUR ABSOLUE DE LA DISTANCE SUR L'AXE
                                     < DES 'X' ENTRE LE SOMMET COURANT ET 'GXS',
XFU::    VAL         FU-NIVO
FV:      FLOAT       0               < VALEUR ABSOLUE DE LA DISATNCE SUR L'AXE
                                     < DES 'Y' ENTRE LE SOMMET COURANT ET 'GYS'.
XFV::    VAL         FV-NIVO
LNIVO::  VAL         $-NIVO          < LONGUEUR DU CONTEXTE...
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
GXS:     EQU         ZZZ061          < COORDONNEES ABSOLUES
GYS:     EQU         ZZZ062          < DE CE POINT...
BNIVO:   EQU         CT+LARG
NSOM::   VAL         4               < NOMBRE DE SOMMETS...
NIV1:    EQU         BNIVO           < PREMIER SOMMET,
NIV2:    EQU         NIV1+LNIVO      < DEUXIEME SOMMET,
NIV3:    EQU         NIV2+LNIVO      < TROISIEME SOMMET,
NIV4:    EQU         NIV3+LNIVO      < QUATRIEME SOMMET.
NIV5:    EQU         NIV4+LNIVO
SAVX:    EQU         FWORK2+0        < SAVE (XS,YS)
SAVY:    EQU         FWORK2+1        <              DU POINT COURANT.
XSP:     WORD        0               < SOMMET COURANT
YSP:     WORD        0               <                DU QUADRILATERE.
DELX:    WORD        0               < PAS DE PARCOURS
DELY:    WORD        0               <                 DU QUADRILATERE COURANT.
DELXP:   WORD        0
DELYP:   WORD        0
ASPIR:   WORD        SPIR            < SOUS-PROGRAMME DE RECHERCHE D'UN SOMMET
                                     < DE QUADRILATERE.
ACUMU:   WORD        CUMU            < CUMUL SUR 'FWORK',
ACUMU1:  WORD        CUMU1           < CUMUL SUR 'FWORK1'.
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
         PROG
SPU:     EQU         $
         LXI         A1
         BSR         ASPCT
         FAD         VARU
         RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         LXI         A2
         BSR         ASPCT
         FAD         VARV
         RSR                         < ???!?
<
<
<        C U M U L S  :
<
<
CUMU:    EQU         $
         FAD         FWORK
         FST         FWORK
         RSR
CUMU1:   EQU         $
         FAD         FWORK1
         FST         FWORK1
         RSR
<
<
<        R E C H E R C H E   D ' U N   S O M M E T
<        D U   Q U A D R I L A T E R E   C O U R A N T  :
<
<
<        ARGUMENTS :
<                    (GXS,GYS)=POINT COURANT FLOTTANT,
<                    (XS,YS)=POINT COURANT ENTIER,
<                    (DELX,DELY)=PAS DE PARCOURS DU QUADRILATERE
<                                A LA RECHERCHE DE L'UN DES 4 SOMMETS.
<                    W=ADRESSE DU CONTEXTE COURANT.
<
<
<        RESULTATS :
<                    FNIVO=NIVEAU DE GRIS DU SOMMET TROUVE DANS 'TV2',
<                    (FU,FV)=DISTANCE (EN VALEUR ABSOLUE DONC)
<                            SUR LES 2 AXES ENTRE LE SOMMET
<                            COURANT ET LE POINT (GXS,GYS).
<
<
SPIR:    EQU         $
         USE         W,NIVO
<
< SAVE LE POINT COURANT :
<
         LA          XS
         SB          DELX
         STA         SAVX
         LA          YS
         SB          DELY
         STA         SAVY
<
< PARCOURS D'UN CARRE SUIVANT (DELX,DELY)
< ET DONT UN SOMMET EST (XS,YS) :
<
SPIR1:   EQU         $
         LA          XS
         AD          DELX
         STA         XSP
         JAL         SPIR2           < RIEN TROUVE (HORS-ECRAN) : ON ARRETE...
         CPI         NPOLM1
         JG          SPIR2           < RIEN TROUVE (HORS-ECRAN) : ON SORT...
         LA          YS
         AD          DELY
         STA         YSP             < LE POINT (XSP,YSP) EST A L'OPPOSE (SUR
                                     < UNE DIAGONALE) DU POINT (SAVX,SAVY)
                                     < SUR LE CARRE COURANT...
         JAL         SPIR2           < RIEN TROUVE (HORS-ECRAN) : ON ARRETE...
         CPI         NLIGM1
         JG          SPIR2           < RIEN TROUVE (HORS-ECRAN) : ON SORT...
         STZ         DELXP           < PREPARATION DU PARCOURS DES 2 COTES
         STZ         DELYP           < DU CARRE ISSUS DU SOMMET (XSP,YSP).
<
< PARCOURS DES 2 COTES A LA
< RECHERCHE D'UN POINT SIGNIFICATIF
< A PARTIR DU SOMMET OPPOSE AU
< SOMMET (SAVX,SAVY) :
<
SPIR10:  EQU         $
         LA          XSP
         SB          DELXP
         CP          SAVX
         JE          SPIR3           < PASSAGE AU CARRE SUPERIEUR SUIVANT...
         STA         XS
         LA          YSP
         STA         YS
         BSR         ASPGPS          < EXAMEM D'UN POINT SUR LE COTE
                                     < HORIZONTAL COURANT...
         JANE        SPIR4           < ON S'ARRETE SUR LE PREMIER POINT
                                     < RENCONTRE...
         LA          YSP             < ET NON, ON PASSE AU COTE VERTICAL...
                                     < (NOTA : ON PASSE DU COTE VERTICAL
                                     < AU COTE HORIZONTAL EN BASCULE D'UN
                                     < POINT A L'AUTRE)
         SB          DELYP
         CP          SAVY
         JE          SPIR3           < PASSAGE AU CARRE SUPERIEUR SUIVANT...
         STA         YS
         LA          XSP
         STA         XS
         BSR         ASPGPS          < EXAMEM D'UN POINT SUR LE COTE
                                     < VERTICAL COURANT...
         JANE        SPIR4           < ON S'ARRETE SUR LE PREMIER POINT
                                     < RENCONTRE.
<
< POURSUITE DE L'EXAMEM DU
< CARRE COURANT :
<
         LA          DELXP
         AD          DELX
         STA         DELXP
         LA          DELYP
         AD          DELY
         STA         DELYP
         JMP         SPIR10          < VERS L'EXAMEM DE 2 POINTS SYMETRIQUES
                                     < PAR RAPPORT A LA DIAGONALE ALLANT DU
                                     < POINT (SAVX,SAVY) AU POINT (XSP,YSP).
<
< PASSAGE AU CARRE SUPERIEUR SUIVANT :
<
SPIR3:   EQU         $
         LA          XSP
         STA         XS              < ON SE PLACE SUR LE SOMMET MOBILE
         LA          YSP
         STA         YS              < COURANT,
         JMP         SPIR1           < VERS L'EXAMEM DE CE NOUVEAU CARRE...
<
< CAS OU L'ON A RIEN TROUVE
< (HORS-ECRAN) : ON PREND UN
< NIVEAU NOIR :
<
SPIR2:   EQU         $
         LAI         0
         JMP         SPIR20          < VERS LE RENVOI DU NIVEAU DE NOIR
                                     < ET D'UNE DISTANCE PLUS OU MOINS
                                     < FOLKLORIQUE...
<
< CAS OU L'ON A TROUVE UN POINT :
<
SPIR4:   EQU         $
         LB          XS
         STB         XSP
         LB          YS
         STB         YSP
<
< RENVOI DE LA DISTANCE SUR LES 2 AXES
< DU POINT TROUVE AU POINT (GXS,GYS) :
<
SPIR20:  EQU         $
         FLT
         FST         NIVO            < RENVOI DU NIVEAU FLOTTANT.
         LA          XSP
         FLT
         FSB         GXS
         FABS
         FST         FU              < DISTANCE SELON L'AXE DES 'X',
         LA          YSP
         FLT
         FSB         GYS
         FABS
         FST         FV              < DISTANCE SELON L'AXE DES 'Y'.
<
< RETOUR :
<
         LA          SAVX
         AD          DELX
         STA         XS              < RESTAURATION DU
         LA          SAVY
         AD          DELY
         STA         YS              <                 POINT (XS,YS).
         ADRI        LNIVO,W         < POUR LE CONTEXTE SUIVANT...
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         PSR         W
<
< CALCUL DU POINT COURANT :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         FLT
         FAD         FWORK
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         FIX
         STA         XS              < POINT ENTIER VOISIN...
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         FLT
         FAD         FWORK
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
         FIX
         STA         YS              < POINT ENTIER VOISIN...
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         LA          CTCDA
         STA         XCTCDA          < POUR ATTEINDRE 'TV2'...
         LRM         W
         WORD        BNIVO           < INITIALISATION DE LA BASE DES CONTEXTES
                                     < DES 4 SOMMETS.
         LAI         1
         STA         DELX
         STA         DELY
         BSR         ASPIR           < RECHERCHE D'UN SOMMET DANS LE PREMIER
                                     < QUADRANT (+1,+1).
         LAI         -1
         STA         DELX
         BSR         ASPIR           < RECHERCHE D'UN SOMMET DANS LE DEUXIEME
                                     < QUADRANT (-1,+1).
         LAI         -1
         STA         DELY
         BSR         ASPIR           < RECHERCHE D'UN SOMMET DANS LE TROISIEME
                                     < QUADRANT (-1,-1).
         LAI         1
         STA         DELX
         BSR         ASPIR           < RECHERCHE D'UN SOMMET DANS LE QUATRIEME
                                     < QUADRANT (+1,-1).
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         NIV3+XFU-NIV5,W
         FMP         NIV3+XFV-NIV5,W
         FST         FWORK1          < INITIALISATION DE LA MISE A L'ECHELLE...
         FMP         NIV1+XFNIVO-NIV5,W
         FST         FWORK           < N1*FU3*FV3,
         FLD         NIV1+XFU-NIV5,W
         FMP         NIV1+XFV-NIV5,W
         PSR         A,B
         FMP         NIV3+XFNIVO-NIV5,W
         BSR         ACUMU           < +N3*FU1*FV1,
         FLD         NIV4+XFU-NIV5,W
         FMP         NIV4+XFV-NIV5,W
         PSR         A,B
         FMP         NIV2+XFNIVO-NIV5,W
         BSR         ACUMU           < +N2*FU4*FV4,
         FLD         NIV2+XFU-NIV5,W
         FMP         NIV2+XFV-NIV5,W
         PSR         A,B
         FMP         NIV4+XFNIVO-NIV5,W
         BSR         ACUMU           < +N4*FU2*FV2.
<
< CALCUL DU DEPLACEMENT EN 'W' :
<
         PLR         A,B
         BSR         ACUMU1          < FU3*FV3+FU2*FV2,
         PLR         A,B
         BSR         ACUMU1          < FU3*FV3+FU2*FV2+FU4*FV4,
         PLR         A,B
         BSR         ACUMU1          < FU3*FV3+FU2*FV2+FU4*FV4+FU1*FV1.
         LXI         A0
         BSR         ASPCT
         FMP         FWORK
         FDV         FWORK1          < ET MISE A L'ECHELLE...
         STZ         XCTCDA          < POUR ATTEINDRE 'TV1'...
         PLR         W
         RSR
:F
:F
< <<'SIOP MONTAGNE 2'
DF'SIOP MONTAGNE 3'
ED'SIOP MONTAGNE 3'
IN0
         PAGE
         IDP         "SIOP MONTAGNE 3"
<
<
<        G E N E R A T E U R   D E   M O N T A G N E S   3  :
<
<
<        FONCTION :
<                      CE MODULE UTILISE L'IMAGE
<                    SITUEE EN 'TV2', ET TRANSFORME
<                    SES NIVEAUX DE GRIS EN ALTITUDES...
<                      POUR CE FAIRE EN CHAQUE POINT
<                    (XS,YS) DE 'TV2' IL CENTRE UNE
<                    SPIRALE DE 'A3' POINTS, ET A
<                    PARTIR DE LA SOMME PONDEREE DES
<                    POINTS LA COMPOSANT, IL DEDUIT
<                    LA COMPOSANTE 'W'...
<
<
<        ARGUMENTS :
<                    A0000=FACTEUR D'AMPLIFICATION DE 'W'.
<                    A0001=DEPLACEMENT DE 'U',
<                    A0002=DEPLACEMENT DE 'V'.
<                    A0003=NOMBRE DE POINTS DE LA SPIRALE.
<                          (RIEN A FAIRE SI =0)
<                    A0004=PAS DE PARCOURS DE LA SPIRALE (1 EN GENERAL).
A0::     VAL         0
A1::     VAL         A0+1
A2::     VAL         A1+1
A3::     VAL         A2+1
A4::     VAL         A3+1
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
PREM:    WORD        0               < INDICATEUR DE PREMIER PASSAGE...
<
< DEFINITION DE LA SPIRALE :
<
CUMUL:   WORD        0               < SIGMA(NIVEAU(XS,YS)).
PASQ:    WORD        0               < ARGUMENT 'A4'.
DELTAX:  WORD        0
DELTAY:  WORD        0
LB:      WORD        0               < LONGUEUR DES
LB0:     WORD        0               <              BRANCHES DE LA SPIRALE.
NP:      WORD        0               < NOMBRE DE POINT COURANT,
NPM:     WORD        0               < NOMBRE DE POINTS ENTIER DE LA SPIRALE.
FNP:     FLOAT       0               < NOMBRE DE POINTS FLOTTANT DE LA SPIRALE.
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
GINCU:   FLOAT       0               < RESIDU DE L'ABSCISSE,
GINCV:   FLOAT       0               < RESIDU DE L'ORDONNEE.
GNIV1:   FLOAT       0               < SIGMA PONDERE DES NIVEAUX DE LA SPIRALE
                                     < CENTREE EN (XS,YS),
GNIV2:   FLOAT       0               < DE MEME EN (XS+1,YS),
GNIV3:   FLOAT       0               < DE MEME EN (XS+1,YS+1),
GNIV4:   FLOAT       0               < DE MEME EN (XS,YS+1).
<
< PARAMETRES :
<
XFA0:    FLOAT       0
XFA1:    FLOAT       0
XFA2:    FLOAT       0
<
< RELAIS :
<
ASPIR:   WORD        SPIR            < CALCUL DU SIGMA SUR UNE SPIRALE...
ASPW2:   WORD        SPW2            < RELAI DE SORTIE DE 'SPW'...
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
         PROG
SPU:     EQU         $
         CPZ         PREM            < PREMIER TOUR ???
         JG          SPU1            < OUI...
         IC          PREM            < NON, ENTREE DES PARAMETRES...
<
< DEFINITION DE LA SPIRALE :
<
         LXI         A3
         BSR         ASPCT
         FST         FNP
         FIX
         STA         NPM             < NOMBRE DE POINTS MAX...
         JAL         $               < ??!??!?!
         LXI         A4
         BSR         ASPCT
         BSR         AROND
         STA         PASQ            < PAS DE PARCOURS...
<
< DEFINITION DES TRANSLATIONS :
<
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
         LXI         A0
         BSR         ASPCT
         FST         XFA0
SPU1:    EQU         $
         FLD         XFA1
         FAD         VARU
         RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         XFA2
         FAD         VARV
         RSR                         < ???!?
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         CPZ         NPM             < LA SPIRALE EST-ELLE VIDE ???
         JG          SPW3            < NON...
         FLD         F0              < OUI, DEPLACEMENT NUL...
         BR          ASPW2           < ET C'EST TOUT...
SPW3:    EQU         $
<
< CALCUL DU POINT COURANT :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         FLT
         FAD         FWORK
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         FLT
         FAD         FWORK
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
<
< POSITION DE CE POINT COURANT
< DANS UN CARRE A COORDONNEES
< ENTIERES :
<
         FLD         GXS
         FIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         FLT
         FSB         GXS
         FNEG
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         GYS
         FIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         FLT
         FSB         GYS
         FNEG
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< PASSAGE SUR 'TV2' :
<
         LA          CTCDA
         STA         XCTCDA
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         BSR         ASPIR
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ASPIR
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ASPIR
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ASPIR
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         GNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         GINCU
         FMP         FWORK2
         FMP         GNIV2
         FAD         FWORK
         FST         FWORK           < +FU*(1-FV)*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         FAD         FWORK
         FST         FWORK           < +FU*FV*N3,
         FLD         FWORK1
         FMP         GINCV
         FMP         GNIV4
         FAD         FWORK           < +(1-FU)*FV*N4,
<
< CALCUL DU DEPLACEMENT EN 'W' :
<
SPW1:    EQU         $
         FMP         XFA0
         STZ         XCTCDA          < POUR ATTEINDRE 'TV1'...
<
< SORTIE :
<
SPW2:    EQU         $
         RSR
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         $
<
< INITIALISATION DE LA SPIRALE :
<
         LA          XS
         LB          YS
         PSR         A,B             < SAUVEGARDE DU POINT (XS,YS).
         STZ         CUMUL           < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         LA          PASQ
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         1
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIRALE.
SPMOY8:  EQU         $
<
< PARCOURS D'UN BRAS :
<
SPMOY1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPMOY2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NPM             < FINI ???
         JG          SPMOY3          < OUI...
         LA          XS              < NON :
         JAL         SPMOY4          < LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPMOY4          < HORS-ECRAN...
         LA          YS
         JAL         SPMOY4          < HORS-ECRAN...
         CPI         NLIGM1
         JG          SPMOY4          < HORS-ECRAN...
         BSR         ASPGPS          < A=NIVEAU(XS,YS),
         AD          CUMUL           < ET
         STA         CUMUL           < CUMULE...
SPMOY4:  EQU         $
         LA          XS
         AD          DELTAX          < CHANGEMENT DE
         STA         XS
         LA          YS
         AD          DELTAY          < POINT COURANT (XS,YS).
         STA         YS
         DC          LB              < DECOMPTAGE DES POINTS SUR LA BRANCHE :
         JG          SPMOY2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPMOY5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPMOY5:  EQU         $
         LA          DELTAY          < ON FAIT SUBIR AU NOMBRE COMPLEXE
         NGR         A,A             < (DX,DY) UNE ROTATION DE PI/2, SOIT
         LB          DELTAX          < UNE MULTIPLICATION PAR LA MATRICE
                                     < (0,-1,1,0)...
         STA         DELTAX          < DELTAX=-DELTAY,
         STB         DELTAY          < DELTAY=DELTAX.
         JMP         SPMOY1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (XS,YS) :
<
SPMOY3:  EQU         $
         PLR         A,B
         STA         XS              < RESTAURATION
         STB         YS              < DE (XS,YS),
<
< NORMALISATION DU CUMUL :
<
         LA          CUMUL
         FLT
         FDV         FNP
         RSR
:F
:F
< <<'SIOP MONTAGNE 3'
DF'SIOP MONTAGNE 4'
ED'SIOP MONTAGNE 4'
IN0
         PAGE
         IDP         "SIOP MONTAGNE 4"
         IF          NMPROC-" +",,XWOR%,
         $EQU        $-32            < A T T E N T I O N ...
         IDP         "ATTENTION : EST EN RECOUVREMENT DE -32 MOTS !!!"
XWOR%:   VAL         0
<
<
<        G E N E R A T E U R   D E   M O N T A G N E S   4  :
<
<
<        FONCTION :
<                      CE MODULE UTILISE L'IMAGE
<                    SITUEE EN 'TV2', ET TRANSFORME
<                    SES NIVEAUX DE GRIS EN ALTITUDES...
<                      POUR CE FAIRE EN CHAQUE POINT
<                    (XS,YS) DE 'TV2' IL CENTRE UNE
<                    SPIRALE DE 'A3' POINTS, ET A
<                    PARTIR DE LA SOMME PONDEREE DES
<                    POINTS LA COMPOSANT, IL DEDUIT
<                    LA COMPOSANTE 'W'...
<
<
<        NOTA :
<                      #SIOP MONTAGNE 4# N'EST QU'UNE
<                    VERSION OPTIMISEE DE #SIOP MONTAGNE 3#
<                    QUI MEMORISE DANS LE Z-BUFFER LES
<                    ASSOCIATIONS (YS,XS) --> (CUMUL SUR
<                    LA SPIRALE). AFIN DE NE PAS GENER
<                    L'ELIMINATION DES LIGNES CACHEES,
<                    LE BALAYAGE SE FERA D'ARRIERE EN
<                    AVANT...
<
<
<        ARGUMENTS :
<                    A0000=FACTEUR D'AMPLIFICATION DE 'W'.
<                    A0001=DEPLACEMENT DE 'U',
<                    A0002=DEPLACEMENT DE 'V'.
<                    A0003=NOMBRE DE POINTS DE LA SPIRALE.
<                    A0004=PAS DE PARCOURS DE LA SPIRALE (1 EN GENERAL).
A0::     VAL         0
A1::     VAL         A0+1
A2::     VAL         A1+1
A3::     VAL         A2+1
A4::     VAL         A3+1
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
FNP:     FLOAT       0               < NOMBRE DE POINTS FLOTTANT DE LA SPIRALE.
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
GINCU:   FLOAT       0               < RESIDU DE L'ABSCISSE,
GINCV:   FLOAT       0               < RESIDU DE L'ORDONNEE.
GNIV1:   FLOAT       0               < SIGMA PONDERE DES NIVEAUX DE LA SPIRALE
                                     < CENTREE EN (XS,YS),
GNIV2:   FLOAT       0               < DE MEME EN (XS+1,YS),
GNIV3:   FLOAT       0               < DE MEME EN (XS+1,YS+1),
GNIV4:   FLOAT       0               < DE MEME EN (XS,YS+1).
CUMUL:   WORD        0               < SIGMA(NIVEAU(XS,YS)).
PASQ:    WORD        0               < ARGUMENT 'A4'.
DELTAX:  WORD        0
DELTAY:  WORD        0
LB:      WORD        0               < LONGUEUR DES
LB0:     WORD        0               <              BRANCHES DE LA SPIRALE.
NP:      WORD        0               < NOMBRE DE POINT COURANT,
NPM:     WORD        0               < NOMBRE DE POINTS ENTIER DE LA SPIRALE.
ASPIR:   WORD        SPIR            < CALCUL DU SIGMA SUR UNE SPIRALE...
AFADW:   WORD        FADW            < 'FAD' PUIS 'FST' SUR 'FWORK'...
IPREM:   WORD        0               < INDICATEUR DE PREMIERE ENTREE POUR
                                     < L'INITIALISATION DU Z-BUFFER, ET PERMET
                                     < DE FAIRE : (A)=0=(YS,XS)...
FA0:     FLOAT       0               < AMPLIFICATEUR DE 'W'.
FA1:     FLOAT       0               < DEPLACEMENT SUR 'U',
FA2:     FLOAT       0               < ET SUR 'V'.
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
         PROG
SPU:     EQU         $
<
< TEST DU PREMIER POINT, ET
< INITIALISATION DU Z-BUFFER :
<
ZVIDE::  VAL         -1              < CODE INDIQUANT QUE LE Z-BUFFER EST VIDE.
         LA          IPREM           < EST-CE LA PREMIERE FOIS ???
         JANE        SPU2            < NON...
         IC          IPREM           < OUI, ON NOTERA QU'ALORS :
                                     < (A)=(YS,XS)=0 POUR 'AGZB'...
         LYI         YSTORE          < C'EST LE PREMIER POINT :
                                     < (Y)=FONCTION DE 'STORE Z-BUFFER',
         LBI         ZVIDE           < (B)=VALEUR D'INITIALISATION,
SPU1:    EQU         $
         BSR         AGZB            < INITIALISATION DU Z-BUFFER...
         ADRI        1,A             < PASSAGE AU (YS,XS) SUIVANT,
         JANE        SPU1            < S'IL EXISTE...
<
< DEPLACEMENT SUR X ET Y :
<
         LXI         A1
         BSR         ASPCT
         FST         FA1
         LXI         A2
         BSR         ASPCT
         FST         FA2
<
< AMPLIFICATEUR DE 'W' :
<
         LXI         A0
         BSR         ASPCT
         FST         FA0
<
< DEFINITION DE LA SPIRALE :
<
         LXI         A3
         BSR         ASPCT
         FST         FNP
         BSR         AROND
         STA         NPM             < NOMBRE DE POINTS MAX...
         LXI         A4
         BSR         ASPCT
         BSR         AROND
         STA         PASQ            < PAS DE PARCOURS...
<
< CALCUL DE LA COMPOSANTE EN 'U' :
<
SPU2:    EQU         $
         FLD         FA1
         FAD         VARU
         RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         FA2
         FAD         VARV
         RSR                         < ???!?
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
<
< CALCUL DU POINT COURANT, ET POSITION
< DE CE POINT DANS UN CARRE A
< COORDONNEES ENTIERES :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         FLT
         FAD         FWORK
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         FIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         FLT
         FSB         GXS
         FNEG
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         FLT
         FAD         FWORK
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
         FIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         FLT
         FSB         GYS
         FNEG
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< PASSAGE SUR 'TV2' :
<
         LA          CTCDA
         STA         XCTCDA
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         BSR         ASPIR
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ASPIR
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ASPIR
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ASPIR
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         GNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         GINCU
         FMP         FWORK2
         FMP         GNIV2
         BSR         AFADW           < +FU*(1-FV)*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         BSR         AFADW           < +FU*FV*N3,
         FLD         FWORK1
         FMP         GINCV
         FMP         GNIV4
         BSR         AFADW           < +(1-FU)*FV*N4,
<
< CALCUL DU DEPLACEMENT EN 'W' :
<
         FMP         FA0
         STZ         XCTCDA          < POUR ATTEINDRE 'TV1'...
         RSR
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         $
<
< LE COUPLE (XS,YS) EXISTE-T'IL
< DEJA DANS LE Z-BUFFER ???
<
         LA          YS
         SWBR        A,A
         OR          XS              < (A)=(YS,XS),
         LYI         YLOAD           < (Y)=FONCTION DE 'LOAD Z-BUFFER',
         BSR         AGZB            < (B)=VALEUR ASSOCIEE A (YS,XS) :
         LR          B,A
         CPI         ZVIDE           < EXISTE-T'ELLE ???
         JNE         SPMOY6          < OUI, ELLE DEVIENT LE 'CUMUL'...
<
< NON, IL FAUT LA CALCULER :
< INITIALISATION DE LA SPIRALE :
<
         LA          XS
         LB          YS
         PSR         A,B             < SAUVEGARDE DU POINT (XS,YS).
         STZ         CUMUL           < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         LA          PASQ
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         1
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIRALE.
SPMOY8:  EQU         $
<
< PARCOURS D'UN BRAS :
<
SPMOY1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPMOY2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NPM             < FINI ???
         JG          SPMOY3          < OUI...
         LA          XS              < NON :
         JAL         SPMOY4          < LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPMOY4          < HORS-ECRAN...
         LA          YS
         JAL         SPMOY4          < HORS-ECRAN...
         CPI         NLIGM1
         JG          SPMOY4          < HORS-ECRAN...
         BSR         ASPGPS          < A=NIVEAU(XS,YS),
         AD          CUMUL           < ET
         STA         CUMUL           < CUMULE...
SPMOY4:  EQU         $
         LA          XS
         AD          DELTAX          < CHANGEMENT DE
         STA         XS
         LA          YS
         AD          DELTAY          < POINT COURANT (XS,YS).
         STA         YS
         DC          LB              < DECOMPTAGE DES POINTS SUR LA BRANCHE :
         JG          SPMOY2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPMOY5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPMOY5:  EQU         $
         LA          DELTAY          < ON FAIT SUBIR AU NOMBRE COMPLEXE
         NGR         A,A             < (DX,DY) UNE ROTATION DE PI/2, SOIT
         LB          DELTAX          < UNE MULTIPLICATION PAR LA MATRICE
                                     < (0,-1,1,0)...
         STA         DELTAX          < DELTAX=-DELTAY,
         STB         DELTAY          < DELTAY=DELTAX.
         JMP         SPMOY1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (XS,YS) :
<
SPMOY3:  EQU         $
         PLR         A,B
         STA         XS              < RESTAURATION
         STB         YS              < DE (XS,YS),
<
< MEMORISATION DANS LE Z-BUFFER :
<
         SWBR        B,B
         ORR         B,A             < (A)=(YS,XS),
         LYI         YSTORE          < (Y)=FONCTION DE 'STORE Z-BUFFER',
         LB          CUMUL           < (B)=CUMUL-SPIRALE ASSOCIE A (XS,YS),
         BSR         AGZB            < QUE L'ON MET DANS LE Z-BUFFER...
<
< NORMALISATION DU CUMUL :
<
         LA          CUMUL
SPMOY6:  EQU         $               < CAS OU LE Z-BUFFER CONNAIT DEJA (XS,YS) :
         FLT
         FDV         FNP
         RSR
<
<
<        ' F A D ' + ' F S T '   S U R   ' F W O R K '  :
<
<
FADW:    EQU         $
         FAD         FWORK
         FST         FWORK
         RSR                         < ???!???!
:F
:F
< <<'SIOP MONTAGNE 4'
DF'SIOP MONTAGNE CHA 1'
ED'SIOP MONTAGNE CHA 1'
IN0
         PAGE
         IDP         "SIOP MONTAGNE CHA 1"
<
<
<        G E N E R A T E U R   D E   M O N T A G N E S   C H A M P   1  :
<
<
<        FONCTION :
<                      CE MODULE UTILISE LE TABLEAU
<                    ALEATOIRE CORRELEE GENERE DANS
<                    LE Z-BUFFER PAR 'CHAMP RDN 1'.
<
<
<        NOTA :
<                      IL MEMORISE DANS LE Z-BUFFER LES
<                    VALEURS ALEATOIRES CORRELEES; AFIN DE NE PAS GENER
<                    L'ELIMINATION DES LIGNES CACHEES,
<                    LE BALAYAGE SE FERA D'ARRIERE EN
<                    AVANT...
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON CHAMP 1#
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON CHAMP 1#
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
         PROG
SPU:     EQU         $
<
< TEST DU PREMIER POINT, ET
< INITIALISATION DES PARAMETRES :
<
         LA          PREM            < EST-CE LA PREMIERE FOIS ???
         JANE        SPU2            < NON...
         IC          PREM            < OUI...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON CHAMP 1#
<
< CALCUL DE LA COMPOSANTE EN 'U' :
<
SPU2:    EQU         $
         FLD         XFA1
         FAD         VARU
         RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         XFA2
         FAD         VARV
         RSR                         < ???!?
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F1
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON CHAMP 1#
:F
:F
< <<'SIOP MONTAGNE CHA 1'
DF'SIOP MONTAGNE CHA 2'
ED'SIOP MONTAGNE CHA 2'
IN0
         PAGE
         IDP         "SIOP MONTAGNE CHA 2"
<
<
<        G E N E R A T E U R   D E   M O N T A G N E S   C H A M P   2  :
<
<
<        FONCTION :
<                      CE MODULE GENERE DES MONTAGNE
<                    SUR UN PLAN, A L'AIDE DU GENERATEUR
<                    RECURSIF 'RAYON CHAMP 2'.
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON CHAMP 2#
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON CHAMP 2#
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
         PROG
SPU:     EQU         $
<
< TEST DU PREMIER POINT, ET
< INITIALISATION DES PARAMETRES :
<
         LA          PREM            < EST-CE LA PREMIERE FOIS ???
         JANE        SPU2            < NON...
         IC          PREM            < OUI...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON CHAMP 2#
<
< CALCUL DE LA COMPOSANTE EN 'U' :
<
SPU2:    EQU         $
         FLD         XFA1
         FAD         VARU
         RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         XFA2
         FAD         VARV
         RSR                         < ???!?
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F1
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON CHAMP 2#
:F
:F
< <<'SIOP MONTAGNE CHA 2'
DF'SIOP MONTAGNE CHA 3'
ED'SIOP MONTAGNE CHA 3'
IN0
         PAGE
         IDP         "SIOP MONTAGNE CHA 3"
<
<
<        G E N E R A T E U R   D E   M O N T A G N E S   C H A M P   3  :
<
<
<        FONCTION :
<                      CE MODULE GENERE DES MONTAGNE
<                    SUR UN PLAN, A L'AIDE DU GENERATEUR
<                    RECURSIF 'RAYON CHAMP 3'.
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON CHAMP 3#
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON CHAMP 3#
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
         PROG
SPU:     EQU         $
<
< TEST DU PREMIER POINT, ET
< INITIALISATION DES PARAMETRES :
<
         LA          PREM            < EST-CE LA PREMIERE FOIS ???
         JANE        SPU2            < NON...
         IC          PREM            < OUI...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON CHAMP 3#
<
< CALCUL DE LA COMPOSANTE EN 'U' :
<
SPU2:    EQU         $
         FLD         XFA1
         FAD         VARU
         RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         XFA2
         FAD         VARV
         RSR                         < ???!?
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F1
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON CHAMP 3#
:F
:F
< <<'SIOP MONTAGNE CHA 3'
DF'SIOP MONTAGNE CHA 4'
ED'SIOP MONTAGNE CHA 4'
IN0
         PAGE
         IDP         "SIOP MONTAGNE CHA 4"
<
<
<        G E N E R A T E U R   D E   M O N T A G N E S   C H A M P   4  :
<
<
<        FONCTION :
<                      CE MODULE GENERE DES MONTAGNE
<                    SUR UN PLAN, A L'AIDE DU GENERATEUR
<                    RECURSIF 'RAYON CHAMP 4' ; SA PARTICULA-
<                    RITE EST D'ETRE SCALANT : DE NOUVEAUX
<                    DETAILS APPARAISSENT A CHAQUE NOUVEL
<                    AGRANDISSEMENT...
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON CHAMP 4#
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON CHAMP 4#
<
< RELAIS INTERNES :
<
ASPU2:   WORD        SPU2
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
         PROG
SPU:     EQU         $
<
< TEST DU PREMIER POINT, ET
< INITIALISATION DES PARAMETRES :
<
         LA          PREM            < EST-CE LA PREMIERE FOIS ???
         JAE         SPU9            < OUI...
         BR          ASPU2           < NON...
SPU9:    EQU         $
         IC          PREM            < OUI...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON CHAMP 4#
<
< CALCUL DE LA COMPOSANTE EN 'U' :
<
SPU2:    EQU         $
         FLD         XFA6
         LYI         'FF00           < POUR LE GENERATEUR 'RDN',
         BSR         ARAYON          < GENERATION ALEATOIRE COHERENTE...
         FAD         XFA1            < TRANSLATION,
         FAD         VARU            < AINSI, ON DEFORME ET TRANSLATE LA
                                     < GRILLE DE BASE...
         RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         XFA7
         LYI         '00FF           < POUR LE GENERATEUR 'RDN',
         BSR         ARAYON          < GENERATION ALEATOIRE COHERENTE...
         FAD         XFA2            < TRANSLATION,
         FAD         VARV            < AINSI, ON DEFORME, ET TRANSLATE LA
                                     < GRILLE DE BASE...
         RSR                         < ???!?
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         XFA8
         LYI         '0000           < POUR LE GENERATEUR 'RDN',
         BSR         ARAYON          < GENERATION ALEATOIRE COHERENTE...
         FAD         XFA4            < ET TRANSLATION...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON CHAMP 4#
:F
:F
< <<'SIOP MONTAGNE CHA 4'
DF'SIOP MONTAGNE CHA 5'
ED'SIOP MONTAGNE CHA 5'
IN0
         PAGE
         IDP         "SIOP MONTAGNE CHA 5"
<
<
<        G E N E R A T E U R   D E   M O N T A G N E S   C H A M P   5  :
<
<
<        FONCTION :
<                      CE MODULE GENERE DES MONTAGNE
<                    SUR UN PLAN, A L'AIDE DU GENERATEUR
<                    RECURSIF 'RAYON CHAMP 5' ; SA PARTICULA-
<                    RITE EST D'ETRE SCALANT : DE NOUVEAUX
<                    DETAILS APPARAISSENT A CHAQUE NOUVEL
<                    AGRANDISSEMENT...
<                      LA DIFFERENCE ENTRE 'CHAMP 4' ET 'CHAMP 5'
<                    EST DANS LA FACON DE PONDERER LES FONCTIONS
<                    ALEATOIRES ADDITIVES, ET DE CALCULER LES
<                    MAILLES :
<
<                    CHAMP 4 :       MAILLE=RAK(MAILLE),
<                                    PONDERATION=RAK(PONDERATION),
<
<                    CHAMP 5 :       MAILLE=RAC(MAILLE),
<                                    PONDERATION=RAK(PONDERATION),
<
<                    OU 'RAC' DESIGNE LA RACINE CARREE, ET 'RAK',
<                    L'ELEVATION A LA PUISSANCE P/(2**Q)...
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON CHAMP 5#
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON CHAMP 5#
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
         PROG
SPU:     EQU         $
<
< TEST DU PREMIER POINT, ET
< INITIALISATION DES PARAMETRES :
<
         LA          PREM            < EST-CE LA PREMIERE FOIS ???
         JANE        SPU2            < NON...
         IC          PREM            < OUI...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON CHAMP 5#
<
< CALCUL DE LA COMPOSANTE EN 'U' :
<
SPU2:    EQU         $
         FLD         XFA1
         FAD         VARU
         RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         XFA2
         FAD         VARV
         RSR                         < ???!?
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F1
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON CHAMP 5#
:F
:F
< <<'SIOP MONTAGNE CHA 5'
DF'SIOP MONTAGNE CHA 6'
ED'SIOP MONTAGNE CHA 6'
IN0
         PAGE
         IDP         "SIOP MONTAGNE CHA 6"
<
<
<        G E N E R A T E U R   D E   M O N T A G N E S   C H A M P   6  :
<
<
<        FONCTION :
<                      CE MODULE GENERE DES MONTAGNE
<                    SUR UN PLAN, A L'AIDE DU GENERATEUR
<                    RECURSIF 'RAYON CHAMP 6' ; SA PARTICULA-
<                    RITE EST D'ETRE SCALANT : DE NOUVEAUX
<                    DETAILS APPARAISSENT A CHAQUE NOUVEL
<                    AGRANDISSEMENT...
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON CHAMP 6#
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON CHAMP 6#
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
         PROG
SPU:     EQU         $
<
< TEST DU PREMIER POINT, ET
< INITIALISATION DES PARAMETRES :
<
         LA          PREM            < EST-CE LA PREMIERE FOIS ???
         JANE        SPU2            < NON...
         IC          PREM            < OUI...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON CHAMP 6#
<
< CALCUL DE LA COMPOSANTE EN 'U' :
<
SPU2:    EQU         $
         FLD         XFA1
         FAD         VARU
         RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         XFA2
         FAD         VARV
         RSR                         < ???!?
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F1
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON CHAMP 6#
:F
:F
< <<'SIOP MONTAGNE CHA 6'
DF'SIOP MONTAGNE RDN 1'
ED'SIOP MONTAGNE RDN 1'
IN0
         PAGE
         IDP         "SIOP MONTAGNE RDN 1"
<
<
<        G E N E R A T E U R   D E   M O N T A G N E S   R D N   1  :
<
<
<        FONCTION :
<                      CE MODULE UTILISE L'IMAGE
<                    SITUEE EN 'TV2', ET TRANSFORME
<                    SES NIVEAUX DE GRIS EN ALTITUDES...
<                      POUR CE FAIRE EN CHAQUE POINT
<                    (XS,YS) DE 'TV2' IL CENTRE UNE
<                    SPIRALE DE 'A3' POINTS, ET A
<                    PARTIR DE LA SOMME PONDEREE DES
<                    POINTS LA COMPOSANT, IL DEDUIT
<                    LA COMPOSANTE 'W'... IL AJOUTE
<                    ENFIN UNE COMPOSANTE ALEATOIRE...
<
<
<        NOTA :
<                      IL MEMORISE DANS LE Z-BUFFER LES
<                    ASSOCIATIONS (YS,XS) --> (CUMUL SUR
<                    LA SPIRALE). AFIN DE NE PAS GENER
<                    L'ELIMINATION DES LIGNES CACHEES,
<                    LE BALAYAGE SE FERA D'ARRIERE EN
<                    AVANT...
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON RDN 1#
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON RDN 1#
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
         PROG
SPU:     EQU         $
<
< TEST DU PREMIER POINT, ET
< INITIALISATION DES PARAMETRES :
<
         LA          PREM            < EST-CE LA PREMIERE FOIS ???
         JANE        SPU2            < NON...
         IC          PREM            < OUI...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON RDN 1#
<
< CALCUL DE LA COMPOSANTE EN 'U' :
<
SPU2:    EQU         $
         FLD         XFA1
         FAD         VARU
         RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         XFA2
         FAD         VARV
         RSR                         < ???!?
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F1
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON RDN 1#
:F
:F
< <<'SIOP MONTAGNE RDN 1'
DF'SIOP MONTAGNE RDN 2'
ED'SIOP MONTAGNE RDN 2'
IN0
         PAGE
         IDP         "SIOP MONTAGNE RDN 2"
<
<
<        G E N E R A T E U R   D E   M O N T A G N E S   R D N   2  :
<
<
<        FONCTION :
<                      CE MODULE UTILISE L'IMAGE
<                    SITUEE EN 'TV2', ET TRANSFORME
<                    SES NIVEAUX DE GRIS EN ALTITUDES...
<                      POUR CE FAIRE EN CHAQUE POINT
<                    (XS,YS) DE 'TV2' IL CENTRE UNE
<                    SPIRALE DE 'A3' POINTS, ET A
<                    PARTIR DE LA SOMME PONDEREE DES
<                    POINTS LA COMPOSANT, IL DEDUIT
<                    LA COMPOSANTE 'W'... IL AJOUTE
<                    ENFIN UNE COMPOSANTE ALEATOIRE...
<                      ET POUR CLORE LE SPECTACLE, IL
<                    REALISE DANS CHAQUE TRANSFORMEE DE
<                    CARRE ELEMENTAIRE, UNE HOMOTHETIE
<                    DE 'TV2'...
<
<
<        NOTA :
<                      IL MEMORISE DANS LE Z-BUFFER LES
<                    ASSOCIATIONS (YS,XS) --> (CUMUL SUR
<                    LA SPIRALE). AFIN DE NE PAS GENER
<                    L'ELIMINATION DES LIGNES CACHEES,
<                    LE BALAYAGE SE FERA D'ARRIERE EN
<                    AVANT...
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON RDN 2#
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON RDN 2#
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
         PROG
SPU:     EQU         $
<
< TEST DU PREMIER POINT, ET
< INITIALISATION DES PARAMETRES :
<
         LA          PREM            < EST-CE LA PREMIERE FOIS ???
         JANE        SPU2            < NON...
         IC          PREM            < OUI...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON RDN 2#
<
< CALCUL DE LA COMPOSANTE EN 'U' :
<
SPU2:    EQU         $
         FLD         XFA1
         FAD         VARU
         RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         XFA2
         FAD         VARV
         RSR                         < ???!?
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F1
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON RDN 2#
:F
:F
< <<'SIOP MONTAGNE RDN 2'
DF'SIOP MONTAGNE RDN 3'
ED'SIOP MONTAGNE RDN 3'
IN0
         PAGE
         IDP         "SIOP MONTAGNE RDN 3"
<
<
<        G E N E R A T E U R   D E   M O N T A G N E S   R D N   3  :
<
<
<        FONCTION :
<                      CE MODULE UTILISE L'IMAGE
<                    SITUEE EN 'TV2', ET TRANSFORME
<                    SES NIVEAUX DE GRIS EN ALTITUDES...
<                      POUR CE FAIRE EN CHAQUE POINT
<                    (XS,YS) DE 'TV2' IL CENTRE UNE
<                    SPIRALE DE 'A3' POINTS, ET A
<                    PARTIR DE LA SOMME PONDEREE DES
<                    POINTS LA COMPOSANT, IL DEDUIT
<                    LA COMPOSANTE 'W'... IL AJOUTE
<                    ENFIN UNE COMPOSANTE ALEATOIRE...
<                      ET POUR CLORE LE SPECTACLE, IL
<                    REALISE DANS CHAQUE TRANSFORMEE DE
<                    CARRE ELEMENTAIRE, UNE HOMOTHETIE
<                    DE 'TV2'...
<
<
<        NOTA :
<                      IL MEMORISE DANS LE Z-BUFFER LES
<                    ASSOCIATIONS (YS,XS) --> (CUMUL SUR
<                    LA SPIRALE). AFIN DE NE PAS GENER
<                    L'ELIMINATION DES LIGNES CACHEES,
<                    LE BALAYAGE SE FERA D'ARRIERE EN
<                    AVANT...
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON RDN 3#
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON RDN 3#
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
         PROG
SPU:     EQU         $
<
< TEST DU PREMIER POINT, ET
< INITIALISATION DES PARAMETRES :
<
         LA          PREM            < EST-CE LA PREMIERE FOIS ???
         JANE        SPU2            < NON...
         IC          PREM            < OUI...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON RDN 3#
<
< CALCUL DE LA COMPOSANTE EN 'U' :
<
SPU2:    EQU         $
         FLD         XFA1
         FAD         VARU
         RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         XFA2
         FAD         VARV
         RSR                         < ???!?
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F1
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON RDN 3#
:F
:F
< <<'SIOP MONTAGNE RDN 3'
DF'SIOP PLANET 1'
ED'SIOP PLANET 1'
IN0
         PAGE
         IDP         "SIOP PLANET 1"
<
<
<        M I S E   S U R   U N E   P L A N E T E   1  :
<                    ( D ' A X E   Z )
<
<
<        EQUATION :
<                    X=R*COS(V)*COS(U),
<                    Y=R*COS(V)*SIN(U),
<                    Z=R*SIN(V).
<        OU :
<                      'R' EST UNE FONCTION R(XR,YR) CALCULEE
<                    COMME LA COORDONNEE 'Z' DE LA FONCTION
<                    F(XR,YR) DE #SIOP MONTAGNE 3# :
<                    R=CONSTANTE5+F(XR,YR).
<
<
<        ARGUMENTS :
<                    A0000=FACTEUR D'AMPLIFICATION DE L'EXTENSION
<                          F(XR,YR) DU RAYON.
<                    A0003=NOMBRE DE POINTS DE LA SPIRALE.
<                    A0004=PAS DE PARCOURS DE LA SPIRALE (1 EN GENERAL).
<                    A0005=VALEUR MINIMALE DU RAYON.
A0::     VAL         0
A1::     VAL         A0+1            < INUTILES (MAIS COMPATIBILITE
A2::     VAL         A1+1            < AVEC #MONTAGNE# ET #MONTAGNE 4#)...
A3::     VAL         A2+1
A4::     VAL         A3+1
A5::     VAL         A4+1
<
<
         LOCAL
FLOC:    EQU         $
CUMUL:   WORD        0               < SIGMA(NIVEAU(XS,YS)).
PASQ:    WORD        0               < ARGUMENT 'A4'.
DELTAX:  WORD        0
DELTAY:  WORD        0
LB:      WORD        0               < LONGUEUR DES
LB0:     WORD        0               <              BRANCHES DE LA SPIRALE.
NP:      WORD        0               < NOMBRE DE POINT COURANT,
NPM:     WORD        0               < NOMBRE DE POINTS ENTIER DE LA SPIRALE.
FNP:     FLOAT       0               < NOMBRE DE POINTS FLOTTANT DE LA SPIRALE.
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
GINCU:   FLOAT       0               < RESIDU DE L'ABSCISSE,
GINCV:   FLOAT       0               < RESIDU DE L'ORDONNEE.
GNIV1:   FLOAT       0               < SIGMA PONDERE DES NIVEAUX DE LA SPIRALE
                                     < CENTREE EN (XS,YS),
GNIV2:   FLOAT       0               < DE MEME EN (XS+1,YS),
GNIV3:   FLOAT       0               < DE MEME EN (XS+1,YS+1),
GNIV4:   FLOAT       0               < DE MEME EN (XS,YS+1).
PREM:    WORD        0               < INDICATEUR DE PREMIER PASSAGE.
FA0:     FLOAT       0               < CONSTANTE 'A0',
FA5:     FLOAT       0               < ET 'A5'.
ASPIR:   WORD        SPIR            < CALCUL DU SIGMA SUR UNE SPIRALE...
ARAYON:  WORD        RAYON           < CALCUL DE LA FONCTION COURANTE.
ARAYO3:  WORD        RAYON3          < RELAI...
         PROG
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
<
< EST-CE LE PREMIER PASSAGE ???
<
         CPZ         PREM            < ???
         JG          RAYON1          < NON...
         IC          PREM            < OUI, ON FAIT DES INITIALISATIONS...
<
< AMPLIFICATEUR DE LA VARIATION DU RAYON
< ET VALEUR MINIMALE DE CELUI-CI :
<
         LXI         A0
         BSR         ASPCT
         FST         FA0
         LXI         A5
         BSR         ASPCT
         FST         FA5
<
< DEFINITION DE LA SPIRALE :
<
         LXI         A3
         BSR         ASPCT
         FST         FNP
         FIX
         STA         NPM             < NOMBRE DE POINTS MAX...
         JAL         $               < ??!??!?!
         LXI         A4
         BSR         ASPCT
         BSR         AROND
         STA         PASQ            < PAS DE PARCOURS...
RAYON1:  EQU         $
         FLD         VARV
         BSR         ACOS
         FST         FWORK
         FLD         VARU
         BSR         ACOS
         FMP         FWORK
         BSR         ARAYON          < CALCUL DE R(X,Y)*COS(V)*COS(U)...
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         FLD         VARV
         BSR         ACOS
         FST         FWORK
         FLD         VARU
         BSR         ASIN
         FMP         FWORK
         BSR         ARAYON          < CALCUL DE R(X,Y)*COS(V)*SIN(U)...
         RSR
<
<
<        C O M P O S A N T E  ' W '  :
<
<
SPW:     EQU         $
         FLD         VARV
         BSR         ASIN
         BSR         ARAYON          < CALCUL DE R(X,Y)*SIN(V)...
         RSR
<
<
<        C A L C U L   D U   R A Y O N  :
<
<
<        RESULTAT :
<                    (A,B)=CONSTANTE5+F(XR,YR).
<
<
RAYON:   EQU         $
         CPZ         NPM             < Y-A-T'IL DES MONTAGNE ???
         JG          RAYON2          < OUI...
         BR          ARAYO3          < NON, RIEN A FAIRE...
RAYON2:  EQU         $
         PSR         A,B             < SAVE LE CUMUL INITIAL...
<
< CALCUL DU POINT COURANT ET
< POSITION DANS UN CARRE DE
< COORDONNEES ENTIERES :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         FLT
         FAD         FWORK
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         FIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         FLT
         FSB         GXS
         FNEG
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         FLT
         FAD         FWORK
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
         FIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         FLT
         FSB         GYS
         FNEG
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< PASSAGE SUR 'TV2' :
<
         LA          CTCDA
         STA         XCTCDA
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         BSR         ASPIR
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ASPIR
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ASPIR
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ASPIR
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         GNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         GINCU
         FMP         FWORK2
         FMP         GNIV2
         FAD         FWORK
         FST         FWORK           < +FU*(1-FV)*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         FAD         FWORK
         FST         FWORK           < +FU*FV*N3,
         FLD         FWORK1
         FMP         GINCV
         FMP         GNIV4
         FAD         FWORK           < +(1-FU)*FV*N4,
<
< CALCUL DE LA FONCTION COURANTE :
<
SPW1:    EQU         $
         FMP         FA0             < AMPLIFICATION,
         FAD         FA5             < ET TRANSLATION.
         FST         FWORK           < RAYON=FA5+FA0*F(XR,YR).
         PLR         A,B             < RESTAURATION DU CUMUL,
         FMP         FWORK           < ET CALCUL DE LA FONCTION COURANTE...
<
< RETOUR :
<
         STZ         XCTCDA          < POUR ATTEINDRE 'TV1'...
RAYON3:  EQU         $
         RSR
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         $
<
< INITIALISATION DE LA SPIRALE :
<
         LA          XS
         LB          YS
         PSR         A,B             < SAUVEGARDE DU POINT (XS,YS).
         STZ         CUMUL           < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         LA          PASQ
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         1
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIRALE.
SPMOY8:  EQU         $
<
< PARCOURS D'UN BRAS :
<
SPMOY1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPMOY2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NPM             < FINI ???
         JG          SPMOY3          < OUI...
         LA          XS              < NON :
         LB          YS
         PSR         A,B             < SAVE (XS,YS) AVANT LE TORE EVENTUEL...
         CPZ         MODX            < Y-A-T'IL X-TORE ???
         JE          SPMOY6          < OUI...
         JAL         SPMOY4          < NON, LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPMOY4          < HORS-ECRAN...
SPMOY6:  EQU         $
         ANDI        NPOLM1          < CALCUL MODULO...
         STA         XS              < MISE A JOUR DE XS.
         LR          B,A             < (A)=YS,
         CPZ         MODY            < EST-ON SUR UN Y-TORE ???
         JE          SPMOY7          < OUI...
         JAL         SPMOY4          < NON, LE POINT EST HORS-ECRAN...
         CPI         NLIGM1
         JG          SPMOY4          < HORS-ECRAN...
SPMOY7:  EQU         $
         ANDI        NLIGM1          < CALCUL MODULO...
         STA         YS              < MISE A JOUR DE YS.
         BSR         ASPGPS          < A=NIVEAU(XS,YS),
         AD          CUMUL           < ET
         STA         CUMUL           < CUMULE...
SPMOY4:  EQU         $
         PLR         A,B             < (A)=XS,
                                     < (B)=YS.
         AD          DELTAX          < CHANGEMENT DE
         STA         XS
         LR          B,A             < (A)=YS.
         AD          DELTAY          < POINT COURANT (XS,YS).
         STA         YS
         DC          LB              < DECOMPTAGE DES POINTS SUR LA BRANCHE :
         JG          SPMOY2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPMOY5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPMOY5:  EQU         $
         LA          DELTAY          < ON FAIT SUBIR AU NOMBRE COMPLEXE
         NGR         A,A             < (DX,DY) UNE ROTATION DE PI/2, SOIT
         LB          DELTAX          < UNE MULTIPLICATION PAR LA MATRICE
                                     < (0,-1,1,0)...
         STA         DELTAX          < DELTAX=-DELTAY,
         STB         DELTAY          < DELTAY=DELTAX.
         JMP         SPMOY1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (XS,YS) :
<
SPMOY3:  EQU         $
         PLR         A,B
         STA         XS              < RESTAURATION
         STB         YS              < DE (XS,YS),
<
< NORMALISATION DU CUMUL :
<
         LA          CUMUL
         FLT
         FDV         FNP
         RSR
:F
:F
< <<'SIOP PLANET 1'
DF'SIOP PLANET 2'
ED'SIOP PLANET 2'
IN0
         PAGE
         IDP         "SIOP PLANET 2"
<
<
<        M I S E   S U R   U N E   P L A N E T E   2  :
<                    ( D ' A X E   Z )
<
<
<        EQUATION :
<                    X=(A5+A0*F(XR,YR))*COS(V)*COS(U),
<                    Y=(A5+A0*F(XR,YR))*COS(V)*SIN(U),
<                    Z=(A5+A0*F(XR,YR))*SIN(V).
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON RDN 2#
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON RDN 2#
         PROG
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
<
< EST-CE LE PREMIER PASSAGE ???
<
         CPZ         PREM            < ???
         JG          SPU1            < NON...
         IC          PREM            < OUI, ON FAIT DES INITIALISATIONS...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON RDN 2#
SPU1:    EQU         $
         FLD         VARV
         BSR         ACOS
         FST         FWORK
         FLD         VARU
         BSR         ACOS
         FMP         FWORK
         BSR         ARAYON          < CALCUL DE R(X,Y)*COS(V)*COS(U)...
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         FLD         VARV
         BSR         ACOS
         FST         FWORK
         FLD         VARU
         BSR         ASIN
         FMP         FWORK
         BSR         ARAYON          < CALCUL DE R(X,Y)*COS(V)*SIN(U)...
         RSR
<
<
<        C O M P O S A N T E  ' W '  :
<
<
SPW:     EQU         $
         FLD         VARV
         BSR         ASIN
         BSR         ARAYON          < CALCUL DE R(X,Y)*SIN(V)...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON RDN 2#
:F
:F
< <<'SIOP PLANET 2'
DF'SIOP PLANET 3'
ED'SIOP PLANET 3'
IN0
         PAGE
         IDP         "SIOP PLANET 3"
<
<
<        M I S E   S U R   U N E   P L A N E T E   3  :
<                    ( D ' A X E   Z )
<
<
<        EQUATION :
<                    X=(A5+A0*F(XR,YR))*COS(V)*COS(U),
<                    Y=(A5+A0*F(XR,YR))*COS(V)*SIN(U),
<                    Z=(A5+A0*F(XR,YR))*SIN(V).
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON RDN 3#
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON RDN 3#
         PROG
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
<
< EST-CE LE PREMIER PASSAGE ???
<
         CPZ         PREM            < ???
         JG          SPU1            < NON...
         IC          PREM            < OUI, ON FAIT DES INITIALISATIONS...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON RDN 3#
SPU1:    EQU         $
         FLD         VARV
         BSR         ACOS
         FST         FWORK
         FLD         VARU
         BSR         ACOS
         FMP         FWORK
         BSR         ARAYON          < CALCUL DE R(X,Y)*COS(V)*COS(U)...
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         FLD         VARV
         BSR         ACOS
         FST         FWORK
         FLD         VARU
         BSR         ASIN
         FMP         FWORK
         BSR         ARAYON          < CALCUL DE R(X,Y)*COS(V)*SIN(U)...
         RSR
<
<
<        C O M P O S A N T E  ' W '  :
<
<
SPW:     EQU         $
         FLD         VARV
         BSR         ASIN
         BSR         ARAYON          < CALCUL DE R(X,Y)*SIN(V)...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON RDN 3#
:F
:F
< <<'SIOP PLANET 3'
DF'SIOP PLANET BOY 1'
ED'SIOP PLANET BOY 1'
IN0
         PAGE
         IDP         "SIOP PLANET BOY 1"
<
<
<        M I S E   S U R   U N E   P L A N E T E   B O Y   1  :
<
<
<        EQUATION :
<                    A(MU)=A6+A7*SIN(2*A9*MU-PI/3)+A8*SIN(A9*MU-PI/6),
<                    B(MU)=A6+A7*SIN(2*A9*MU-PI/3)-A8*SIN(A9*MU-PI/6),
<                    ALPHA=(PI/8)*SIN(A9*MU),
<                    X1=(A*A-B*B)/RAC(A*A+B*B)+A*COS(TETA)-B*SIN(TETA),
<                    Z1=RAC(A*A+B*B)+A*COS(TETA)+B*SIN(TETA),
<                    X=(X1*COS(MU)-Z1*SIN(ALPHA)*SIN(MU))*(A5+A0*F(XR,YR))+A1,
<                    Y=(X1*SIN(MU)+Z1*SIN(ALPHA)*COS(MU))*(A5+A0*F(XR,YR))+A2,
<                    Z=(Z1*COS(ALPHA))*(A5+A0*F(XR,YR)).
<        OU :
<                    A0000=FACTEUR D'AMPLIFICATION DE L'EXTENSION
<                          F(XR,YR) DU RAYON.
<                    A0001=DEPLACEMENT SUR L'AXE DES X,
<                    A0002=DEPLACEMENT SUR L'AXE DES Y,
<                    A0003=NOMBRE DE POINTS DE LA SPIRALE.
<                    A0004=PAS DE PARCOURS DE LA SPIRALE (1 EN GENERAL).
<                    A0005=VALEUR MINIMALE DU RAYON.
<                    TETA=U, ET VARIE SUR (0,2*PI),
<                    MU=V, ET VARIE SUR (0,PI),
<                    A0006=PARAMETRE 'A6',
<                    A0007=PARAMETRE 'A7',
<                    A0008=PARAMETRE 'A8',
<                    A0009=PARAMETRE 'A9'.
A0::     VAL         0
A1::     VAL         A0+1
A2::     VAL         A1+1
A3::     VAL         A2+1
A4::     VAL         A3+1
A5::     VAL         A4+1
A6::     VAL         A5+1
A7::     VAL         A6+1
A8::     VAL         A7+1
A9::     VAL         A8+1
<
<
         LOCAL
FLOC:    EQU         $
<
< VARIABLES MONTAGNEUSES :
<
CUMUL:   WORD        0               < SIGMA(NIVEAU(XS,YS)).
PASQ:    WORD        0               < ARGUMENT 'A4'.
DELTAX:  WORD        0
DELTAY:  WORD        0
LB:      WORD        0               < LONGUEUR DES
LB0:     WORD        0               <              BRANCHES DE LA SPIRALE.
NP:      WORD        0               < NOMBRE DE POINT COURANT,
NPM:     WORD        0               < NOMBRE DE POINTS ENTIER DE LA SPIRALE.
FNP:     FLOAT       0               < NOMBRE DE POINTS FLOTTANT DE LA SPIRALE.
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
GINCU:   FLOAT       0               < RESIDU DE L'ABSCISSE,
GINCV:   FLOAT       0               < RESIDU DE L'ORDONNEE.
GNIV1:   FLOAT       0               < SIGMA PONDERE DES NIVEAUX DE LA SPIRALE
                                     < CENTREE EN (XS,YS),
GNIV2:   FLOAT       0               < DE MEME EN (XS+1,YS),
GNIV3:   FLOAT       0               < DE MEME EN (XS+1,YS+1),
GNIV4:   FLOAT       0               < DE MEME EN (XS,YS+1).
PREM:    WORD        0               < INDICATEUR DE PREMIER PASSAGE.
FA0:     FLOAT       0               < CONSTANTE 'A0',
FA5:     FLOAT       0               < ET 'A5'.
<
< VARIABLES DE MANOEUVRE DE BOY :
<
WXF1:    FLOAT       0               < A8*SIN(A9*MU-PI/6), RAC(A*A+B*B), SIN(MU)
WXF2:    FLOAT       0               < A*COS(TETA), COS(MU).
WXF3:    FLOAT       0               < B*SIN(TETA), Z1*SIN(ALPHA).
WXF4:    FLOAT       0               < A*A, Z1*SIN(ALPHA)*SIN(MU),
                                     < Z1*SIN(ALPHA)*COS(MU).
WXF5:    FLOAT       0               < B*B.
XFA:     FLOAT       0               < A.
XFB:     FLOAT       0               < B.
XALPHA:  FLOAT       0               < ALPHA.
XX1:     FLOAT       0               < X1.
XZ1:     FLOAT       0               < Z1.
<
< PARAMETRES DE BOY :
<
XF10:    FLOAT       10              < A6.
XF141:   FLOAT       1.41            < A7.
XF198:   FLOAT       1.98            < A8.
XF3:     FLOAT       3               < ARGUMENT 'A9'.
PI:      EQU         PI3141
XF8:     FLOAT       8
XFPI6:   FLOAT       0.5235987       < PI/6.
XFA1:    FLOAT       0               < DEPLACEMENT SUR L'AXE DES X,
XFA2:    FLOAT       0               < ET SUR L'AXE DES Y.
<
< PARAMETRES :
<
TETA:    EQU         VARU
MU:      EQU         VARV
<
< SOUS-PROGRAMMES :
<
ASP1:    WORD        SP1             < CALCUL DES VALEURS UTILES...
ASPIR:   WORD        SPIR            < CALCUL DU SIGMA SUR UNE SPIRALE...
ARAYON:  WORD        RAYON           < CALCUL DE LA FONCTION COURANTE.
ARAYO1:  WORD        RAYON1          < RELAI...
         PROG
<
<
<        C A L C U L   D E S   P A R A M E T R E S  :
<
<
SP1:     EQU         $
<
< CALCUL DES VALEURS UTILISEES POUR
< LES 3 COMPOSANTES :
<
         FLD         MU
         FMP         XF3
         FSB         XFPI6
         PSR         A,B             < A9*MU-PI/6,
         BSR         ASIN            < SIN(A9*MU-PI/6),
         FMP         XF198
         FST         WXF1            < A8*SIN(A9*MU-PI/6).
         PLR         A,B             < A9*MU-PI/6,
         FDV         F05             < 2*A9*MU-PI/3,
         BSR         ASIN            < SIN(2*A9*MU-PI/3),
         FMP         XF141           < A7*SIN(2*A9*MU-PI/3),
         FAD         XF10            < A6+A7*SIN(2*A9*MU-PI/3),
         PSR         A,B
         FAD         WXF1
         FST         XFA             < A=A6+A7*SIN(2*A9*MU-PI/3)+A8*SIN(A9*MU-PI
         PLR         A,B             < A6+A7*SIN(2*A9*MU-PI/3),
         FSB         WXF1
         FST         XFB             < B=A6+A7*SIN(2*A9*MU-PI/3)-A8*SIN(A9*MU-PI
         FLD         MU
         FMP         XF3
         BSR         ASIN
         FMP         PI
         FDV         XF8
         FST         XALPHA          < ALPHA=(PI/8)*SIN(A9*MU).
         FLD         TETA
         BSR         ACOS
         FMP         XFA
         FST         WXF2            < A*COS(TETA).
         FLD         TETA
         BSR         ASIN
         FMP         XFB
         FST         WXF3            < B*SIN(TETA).
         FLD         XFA
         FMP         XFA
         FST         WXF4            < A*A.
         FLD         XFB
         FMP         XFB
         FST         WXF5            < B*B.
         FAD         WXF4            < A*A+B*B,
         BSR         ARAC
         FST         WXF1            < RAC(A*A+B*B).
         FLD         WXF4
         FSB         WXF5            < A*A-B*B,
         FDV         WXF1            < (A*A-B*B)/RAC(A*A+B*B),
         FAD         WXF2
         FSB         WXF3
         FST         XX1             < X1=(A*A-B*B)/RAC(A*A+B*B)+
                                     <    A*COS(TETA)-B*SIN(TETA).
         FLD         WXF1            < RAC(A*A+B*B),
         FAD         WXF2
         FAD         WXF3
         FST         XZ1             < Z1=RAC(A*A+B*B)+A*COS(TETA)+B*SIN(TETA).
         FLD         MU
         BSR         ASIN
         FST         WXF1            < SIN(MU).
         FLD         MU
         BSR         ACOS
         FST         WXF2            < COS(MU).
         FLD         XALPHA
         BSR         ASIN
         FMP         XZ1
         FST         WXF3            < Z1*SIN(ALPHA).
         RSR
<
<
<        C O O R D O N N E E   E N   ' U '  :
<
<
SPU:     EQU         $
<
< EST-CE LE PREMIER PASSAGE ???
<
         CPZ         PREM            < ???
         JG          SPU1            < NON...
         IC          PREM            < OUI, ON FAIT DES INITIALISATIONS...
<
< DEFINITION DE LA SURFACE DE BOY :
<
         LXI         A6
         BSR         ASPCT
         FST         XF10
         LXI         A7
         BSR         ASPCT
         FST         XF141
         LXI         A8
         BSR         ASPCT
         FST         XF198
         LXI         A9
         BSR         ASPCT
         FST         XF3
<
< AMPLIFICATEUR DE LA VARIATION DU RAYON
< ET VALEUR MINIMALE DE CELUI-CI :
<
         LXI         A0
         BSR         ASPCT
         FST         FA0
         LXI         A5
         BSR         ASPCT
         FST         FA5
<
< DEFINITION DE LA SPIRALE :
<
         LXI         A3
         BSR         ASPCT
         FST         FNP
         FIX
         STA         NPM             < NOMBRE DE POINTS MAX...
         JAL         $               < ??!??!?!
         LXI         A4
         BSR         ASPCT
         BSR         AROND
         STA         PASQ            < PAS DE PARCOURS...
<
< TRANSLATION SUR OX ET OY :
<
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
SPU1:    EQU         $
<
< CALCUL DES PARAMETRES DE BOY :
<
         BSR         ASP1            < CALCUL DES PARAMETRES ; RENVOIE :
                                     < Z1*SIN(ALPHA).
<
< COORDONNEE EN 'U' :
<
         FMP         WXF1            < Z1*SIN(ALPHA)*SIN(MU),
         FST         WXF4
         FLD         WXF2            < COS(MU),
         FMP         XX1             < X1*COS(MU),
         FSB         WXF4            < X=X1*COS(MU)-Z1*SIN(ALPHA)*SIN(MU).
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         FAD         XFA1            < ET TRANSLATION.
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         BSR         ASP1            < CALCUL DES PARAMETRES ; RENVOIE :
                                     < Z1*SIN(ALPHA),
         FMP         WXF2            < Z1*SIN(ALPHA)*COS(MU),
         FST         WXF4
         FLD         WXF1            < SIN(MU),
         FMP         XX1             < X1*SIN(MU),
         FAD         WXF4            < Y=X1*SIN(MU)+Z1*SIN(ALPHA)*COS(MU).
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         FAD         XFA2            < ET TRANSLATION.
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         BSR         ASP1            < CALCUL DES PARAMETRES...
         FLD         XALPHA
         BSR         ACOS
         FMP         XZ1             < Z=Z1*COS(ALPHA).
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         RSR
<
<
<        C A L C U L   D U   R A Y O N  :
<
<
<        ARGUMENT :
<                    (A,B)=FONCTION COURANTE.
<
<
<        RESULTAT :
<                    (A,B)=(CONSTANTE5+F(XR,YR))*(FONCTION COURANTE).
<
<
RAYON:   EQU         $
         CPZ         NPM             < LA SPIRALE EST-ELLE VIDE ???
         JG          RAYON2          < NON, ON VA L'EXPLORER...
         BR          ARAYO1          < OUI, RIEN A FAIRE...
RAYON2:  EQU         $
         PSR         A,B             < SAVE LE CUMUL INITIAL...
<
< CALCUL DU POINT COURANT ET
< POSITION DANS UN CARRE DE
< COORDONNEES ENTIERES :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         FLT
         FAD         FWORK
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         FIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         FLT
         FSB         GXS
         FNEG
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         FLT
         FAD         FWORK
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
         FIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         FLT
         FSB         GYS
         FNEG
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< PASSAGE SUR 'TV2' :
<
         LA          CTCDA
         STA         XCTCDA
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         BSR         ASPIR
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ASPIR
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ASPIR
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ASPIR
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         GNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         GINCU
         FMP         FWORK2
         FMP         GNIV2
         FAD         FWORK
         FST         FWORK           < +FU*(1-FV)*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         FAD         FWORK
         FST         FWORK           < +FU*FV*N3,
         FLD         FWORK1
         FMP         GINCV
         FMP         GNIV4
         FAD         FWORK           < +(1-FU)*FV*N4,
<
< CALCUL DE LA FONCTION COURANTE :
<
         FMP         FA0             < AMPLIFICATION,
         FAD         FA5             < ET TRANSLATION.
         FST         FWORK           < RAYON=FA5+FA0*F(XR,YR).
         PLR         A,B             < RESTAURATION DU CUMUL,
         FMP         FWORK           < ET CALCUL DE LA FONCTION COURANTE...
<
< RETOUR :
<
         STZ         XCTCDA          < POUR ATTEINDRE 'TV1'...
RAYON1:  EQU         $
         RSR
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         $
<
< INITIALISATION DE LA SPIRALE :
<
         LA          XS
         LB          YS
         PSR         A,B             < SAUVEGARDE DU POINT (XS,YS).
         STZ         CUMUL           < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         LA          PASQ
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         1
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIRALE.
SPMOY8:  EQU         $
<
< PARCOURS D'UN BRAS :
<
SPMOY1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPMOY2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NPM             < FINI ???
         JG          SPMOY3          < OUI...
         LA          XS              < NON :
         LB          YS
         PSR         A,B             < SAVE (XS,YS) AVANT LE TORE EVENTUEL...
         CPZ         MODX            < Y-A-T'IL X-TORE ???
         JE          SPMOY6          < OUI...
         JAL         SPMOY4          < NON, LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPMOY4          < HORS-ECRAN...
SPMOY6:  EQU         $
         ANDI        NPOLM1          < CALCUL MODULO...
         STA         XS              < MISE A JOUR DE XS.
         LR          B,A             < (A)=YS,
         CPZ         MODY            < EST-ON SUR UN Y-TORE ???
         JE          SPMOY7          < OUI...
         JAL         SPMOY4          < NON, LE POINT EST HORS-ECRAN...
         CPI         NLIGM1
         JG          SPMOY4          < HORS-ECRAN...
SPMOY7:  EQU         $
         ANDI        NLIGM1          < CALCUL MODULO...
         STA         YS              < MISE A JOUR DE YS.
         BSR         ASPGPS          < A=NIVEAU(XS,YS),
         AD          CUMUL           < ET
         STA         CUMUL           < CUMULE...
SPMOY4:  EQU         $
         PLR         A,B             < (A)=XS,
                                     < (B)=YS.
         AD          DELTAX          < CHANGEMENT DE
         STA         XS
         LR          B,A             < (A)=YS.
         AD          DELTAY          < POINT COURANT (XS,YS).
         STA         YS
         DC          LB              < DECOMPTAGE DES POINTS SUR LA BRANCHE :
         JG          SPMOY2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPMOY5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPMOY5:  EQU         $
         LA          DELTAY          < ON FAIT SUBIR AU NOMBRE COMPLEXE
         NGR         A,A             < (DX,DY) UNE ROTATION DE PI/2, SOIT
         LB          DELTAX          < UNE MULTIPLICATION PAR LA MATRICE
                                     < (0,-1,1,0)...
         STA         DELTAX          < DELTAX=-DELTAY,
         STB         DELTAY          < DELTAY=DELTAX.
         JMP         SPMOY1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (XS,YS) :
<
SPMOY3:  EQU         $
         PLR         A,B
         STA         XS              < RESTAURATION
         STB         YS              < DE (XS,YS),
<
< NORMALISATION DU CUMUL :
<
         LA          CUMUL
         FLT
         FDV         FNP
         RSR
:F
:F
< <<'SIOP PLANET BOY 1'
DF'SIOP PLANET BOY 2'
ED'SIOP PLANET BOY 2'
IN0
         PAGE
         IDP         "SIOP PLANET BOY 2"
<
<
<        M I S E   S U R   U N E   P L A N E T E   B O Y   2  :
<
<
<        EQUATION :
<                    A(MU)=A6+A7*SIN(2*A9*MU-PI/3)+A8*SIN(A9*MU-PI/6),
<                    B(MU)=A6+A7*SIN(2*A9*MU-PI/3)-A8*SIN(A9*MU-PI/6),
<                    ALPHA=(PI/8)*SIN(A9*MU),
<                    X1=(A*A-B*B)/RAC(A*A+B*B)+A*COS(TETA)-B*SIN(TETA),
<                    Z1=RAC(A*A+B*B)+A*COS(TETA)+B*SIN(TETA),
<                    X=(X1*COS(MU)-Z1*SIN(ALPHA)*SIN(MU))*(A5+A0*F(XR,YR))+A1,
<                    Y=(X1*SIN(MU)+Z1*SIN(ALPHA)*COS(MU))*(A5+A0*F(XR,YR))+A2,
<                    Z=(Z1*COS(ALPHA))*(A5+A0*F(XR,YR)).
<        OU :
<                    A0000=FACTEUR D'AMPLIFICATION DE L'EXTENSION
<                          F(XR,YR) DU RAYON.
<                    A0001=DEPLACEMENT SUR L'AXE DES X,
<                    A0002=DEPLACEMENT SUR L'AXE DES Y,
<                    A0003=NOMBRE DE POINTS DE LA SPIRALE.
<                    A0004=PAS DE PARCOURS DE LA SPIRALE (1 EN GENERAL).
<                    A0005=VALEUR MINIMALE DU RAYON.
<                    TETA=U, ET VARIE SUR (0,2*PI),
<                    MU=V, ET VARIE SUR (0,PI),
<                    A0006=PARAMETRE 'A6',
<                    A0007=PARAMETRE 'A7',
<                    A0008=PARAMETRE 'A8',
<                    A0009=PARAMETRE 'A9'.
XXXRDN:  VAL         1
         EOT         #SIOP RAYON RDN 2#
A6::     VAL         A5+1
A7::     VAL         A6+1
A8::     VAL         A7+1
A9::     VAL         A8+1
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON RDN 2#
<
< VARIABLES DE MANOEUVRE DE BOY :
<
WXF1:    FLOAT       0               < A8*SIN(A9*MU-PI/6), RAC(A*A+B*B), SIN(MU)
WXF2:    FLOAT       0               < A*COS(TETA), COS(MU).
WXF3:    FLOAT       0               < B*SIN(TETA), Z1*SIN(ALPHA).
WXF4:    FLOAT       0               < A*A, Z1*SIN(ALPHA)*SIN(MU),
                                     < Z1*SIN(ALPHA)*COS(MU).
WXF5:    FLOAT       0               < B*B.
XFA:     FLOAT       0               < A.
XFB:     FLOAT       0               < B.
XALPHA:  FLOAT       0               < ALPHA.
XX1:     FLOAT       0               < X1.
XZ1:     FLOAT       0               < Z1.
<
< PARAMETRES DE BOY :
<
XF10:    FLOAT       10              < A6.
XF141:   FLOAT       1.41            < A7.
XF198:   FLOAT       1.98            < A8.
XF3:     FLOAT       3               < ARGUMENT 'A9'.
PI:      EQU         PI3141
XF8:     FLOAT       8
XFPI6:   FLOAT       0.5235987       < PI/6.
<
< PARAMETRES :
<
TETA:    EQU         VARU
MU:      EQU         VARV
<
< SOUS-PROGRAMMES :
<
ASP1:    WORD        SP1             < CALCUL DES VALEURS UTILES...
         PROG
<
<
<        C A L C U L   D E S   P A R A M E T R E S  :
<
<
SP1:     EQU         $
<
< CALCUL DES VALEURS UTILISEES POUR
< LES 3 COMPOSANTES :
<
         FLD         MU
         FMP         XF3
         FSB         XFPI6
         PSR         A,B             < A9*MU-PI/6,
         BSR         ASIN            < SIN(A9*MU-PI/6),
         FMP         XF198
         FST         WXF1            < A8*SIN(A9*MU-PI/6).
         PLR         A,B             < A9*MU-PI/6,
         FDV         F05             < 2*A9*MU-PI/3,
         BSR         ASIN            < SIN(2*A9*MU-PI/3),
         FMP         XF141           < A7*SIN(2*A9*MU-PI/3),
         FAD         XF10            < A6+A7*SIN(2*A9*MU-PI/3),
         PSR         A,B
         FAD         WXF1
         FST         XFA             < A=A6+A7*SIN(2*A9*MU-PI/3)+A8*SIN(A9*MU-PI
         PLR         A,B             < A6+A7*SIN(2*A9*MU-PI/3),
         FSB         WXF1
         FST         XFB             < B=A6+A7*SIN(2*A9*MU-PI/3)-A8*SIN(A9*MU-PI
         FLD         MU
         FMP         XF3
         BSR         ASIN
         FMP         PI
         FDV         XF8
         FST         XALPHA          < ALPHA=(PI/8)*SIN(A9*MU).
         FLD         TETA
         BSR         ACOS
         FMP         XFA
         FST         WXF2            < A*COS(TETA).
         FLD         TETA
         BSR         ASIN
         FMP         XFB
         FST         WXF3            < B*SIN(TETA).
         FLD         XFA
         FMP         XFA
         FST         WXF4            < A*A.
         FLD         XFB
         FMP         XFB
         FST         WXF5            < B*B.
         FAD         WXF4            < A*A+B*B,
         BSR         ARAC
         FST         WXF1            < RAC(A*A+B*B).
         FLD         WXF4
         FSB         WXF5            < A*A-B*B,
         FDV         WXF1            < (A*A-B*B)/RAC(A*A+B*B),
         FAD         WXF2
         FSB         WXF3
         FST         XX1             < X1=(A*A-B*B)/RAC(A*A+B*B)+
                                     <    A*COS(TETA)-B*SIN(TETA).
         FLD         WXF1            < RAC(A*A+B*B),
         FAD         WXF2
         FAD         WXF3
         FST         XZ1             < Z1=RAC(A*A+B*B)+A*COS(TETA)+B*SIN(TETA).
         FLD         MU
         BSR         ASIN
         FST         WXF1            < SIN(MU).
         FLD         MU
         BSR         ACOS
         FST         WXF2            < COS(MU).
         FLD         XALPHA
         BSR         ASIN
         FMP         XZ1
         FST         WXF3            < Z1*SIN(ALPHA).
         RSR
<
<
<        C O O R D O N N E E   E N   ' U '  :
<
<
SPU:     EQU         $
<
< EST-CE LE PREMIER PASSAGE ???
<
         CPZ         PREM            < ???
         JG          SPU1            < NON...
         IC          PREM            < OUI, ON FAIT DES INITIALISATIONS...
<
< DEFINITION DE LA SURFACE DE BOY :
<
         LXI         A6
         BSR         ASPCT
         FST         XF10
         LXI         A7
         BSR         ASPCT
         FST         XF141
         LXI         A8
         BSR         ASPCT
         FST         XF198
         LXI         A9
         BSR         ASPCT
         FST         XF3
XXXRDN:  VAL         3
         EOT         #SIOP RAYON RDN 2#
SPU1:    EQU         $
<
< CALCUL DES PARAMETRES DE BOY :
<
         BSR         ASP1            < CALCUL DES PARAMETRES ; RENVOIE :
                                     < Z1*SIN(ALPHA).
<
< COORDONNEE EN 'U' :
<
         FMP         WXF1            < Z1*SIN(ALPHA)*SIN(MU),
         FST         WXF4
         FLD         WXF2            < COS(MU),
         FMP         XX1             < X1*COS(MU),
         FSB         WXF4            < X=X1*COS(MU)-Z1*SIN(ALPHA)*SIN(MU).
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         FAD         XFA1            < ET TRANSLATION.
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         BSR         ASP1            < CALCUL DES PARAMETRES ; RENVOIE :
                                     < Z1*SIN(ALPHA),
         FMP         WXF2            < Z1*SIN(ALPHA)*COS(MU),
         FST         WXF4
         FLD         WXF1            < SIN(MU),
         FMP         XX1             < X1*SIN(MU),
         FAD         WXF4            < Y=X1*SIN(MU)+Z1*SIN(ALPHA)*COS(MU).
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         FAD         XFA2            < ET TRANSLATION.
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         BSR         ASP1            < CALCUL DES PARAMETRES...
         FLD         XALPHA
         BSR         ACOS
         FMP         XZ1             < Z=Z1*COS(ALPHA).
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON RDN 2#
:F
:F
< <<'SIOP PLANET BOY 2'
DF'SIOP PLANET BOY 3'
ED'SIOP PLANET BOY 3'
IN0
         PAGE
         IDP         "SIOP PLANET BOY 3"
<
<
<        M I S E   S U R   U N E   P L A N E T E   B O Y   3  :
<
<
<        EQUATION :
<                    A(MU)=A6+A7*SIN(2*A9*MU-PI/3)+A8*SIN(A9*MU-PI/6),
<                    B(MU)=A6+A7*SIN(2*A9*MU-PI/3)-A8*SIN(A9*MU-PI/6),
<                    ALPHA=(PI/8)*SIN(A9*MU),
<                    X1=(A*A-B*B)/RAC(A*A+B*B)+A*COS(TETA)-B*SIN(TETA),
<                    Z1=RAC(A*A+B*B)+A*COS(TETA)+B*SIN(TETA),
<                    X=(X1*COS(MU)-Z1*SIN(ALPHA)*SIN(MU))*(A5+A0*F(XR,YR))+A1,
<                    Y=(X1*SIN(MU)+Z1*SIN(ALPHA)*COS(MU))*(A5+A0*F(XR,YR))+A2,
<                    Z=(Z1*COS(ALPHA))*(A5+A0*F(XR,YR)).
<        OU :
<                    A0000=FACTEUR D'AMPLIFICATION DE L'EXTENSION
<                          F(XR,YR) DU RAYON.
<                    A0001=DEPLACEMENT SUR L'AXE DES X,
<                    A0002=DEPLACEMENT SUR L'AXE DES Y,
<                    A0003=NOMBRE DE POINTS DE LA SPIRALE.
<                    A0004=PAS DE PARCOURS DE LA SPIRALE (1 EN GENERAL).
<                    A0005=VALEUR MINIMALE DU RAYON.
<                    TETA=U, ET VARIE SUR (0,2*PI),
<                    MU=V, ET VARIE SUR (0,PI),
<                    A0006=PARAMETRE 'A6',
<                    A0007=PARAMETRE 'A7',
<                    A0008=PARAMETRE 'A8',
<                    A0009=PARAMETRE 'A9'.
XXXRDN:  VAL         1
         EOT         #SIOP RAYON RDN 3#
A6::     VAL         A5+1
A7::     VAL         A6+1
A8::     VAL         A7+1
A9::     VAL         A8+1
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON RDN 3#
<
< VARIABLES DE MANOEUVRE DE BOY :
<
WXF1:    FLOAT       0               < A8*SIN(A9*MU-PI/6), RAC(A*A+B*B), SIN(MU)
WXF2:    FLOAT       0               < A*COS(TETA), COS(MU).
WXF3:    FLOAT       0               < B*SIN(TETA), Z1*SIN(ALPHA).
WXF4:    FLOAT       0               < A*A, Z1*SIN(ALPHA)*SIN(MU),
                                     < Z1*SIN(ALPHA)*COS(MU).
WXF5:    FLOAT       0               < B*B.
XFA:     FLOAT       0               < A.
XFB:     FLOAT       0               < B.
XALPHA:  FLOAT       0               < ALPHA.
XX1:     FLOAT       0               < X1.
XZ1:     FLOAT       0               < Z1.
<
< PARAMETRES DE BOY :
<
XF10:    FLOAT       10              < A6.
XF141:   FLOAT       1.41            < A7.
XF198:   FLOAT       1.98            < A8.
XF3:     FLOAT       3               < ARGUMENT 'A9'.
PI:      EQU         PI3141
XF8:     FLOAT       8
XFPI6:   FLOAT       0.5235987       < PI/6.
<
< PARAMETRES :
<
TETA:    EQU         VARU
MU:      EQU         VARV
<
< SOUS-PROGRAMMES :
<
ASP1:    WORD        SP1             < CALCUL DES VALEURS UTILES...
         PROG
<
<
<        C A L C U L   D E S   P A R A M E T R E S  :
<
<
SP1:     EQU         $
<
< CALCUL DES VALEURS UTILISEES POUR
< LES 3 COMPOSANTES :
<
         FLD         MU
         FMP         XF3
         FSB         XFPI6
         PSR         A,B             < A9*MU-PI/6,
         BSR         ASIN            < SIN(A9*MU-PI/6),
         FMP         XF198
         FST         WXF1            < A8*SIN(A9*MU-PI/6).
         PLR         A,B             < A9*MU-PI/6,
         FDV         F05             < 2*A9*MU-PI/3,
         BSR         ASIN            < SIN(2*A9*MU-PI/3),
         FMP         XF141           < A7*SIN(2*A9*MU-PI/3),
         FAD         XF10            < A6+A7*SIN(2*A9*MU-PI/3),
         PSR         A,B
         FAD         WXF1
         FST         XFA             < A=A6+A7*SIN(2*A9*MU-PI/3)+A8*SIN(A9*MU-PI
         PLR         A,B             < A6+A7*SIN(2*A9*MU-PI/3),
         FSB         WXF1
         FST         XFB             < B=A6+A7*SIN(2*A9*MU-PI/3)-A8*SIN(A9*MU-PI
         FLD         MU
         FMP         XF3
         BSR         ASIN
         FMP         PI
         FDV         XF8
         FST         XALPHA          < ALPHA=(PI/8)*SIN(A9*MU).
         FLD         TETA
         BSR         ACOS
         FMP         XFA
         FST         WXF2            < A*COS(TETA).
         FLD         TETA
         BSR         ASIN
         FMP         XFB
         FST         WXF3            < B*SIN(TETA).
         FLD         XFA
         FMP         XFA
         FST         WXF4            < A*A.
         FLD         XFB
         FMP         XFB
         FST         WXF5            < B*B.
         FAD         WXF4            < A*A+B*B,
         BSR         ARAC
         FST         WXF1            < RAC(A*A+B*B).
         FLD         WXF4
         FSB         WXF5            < A*A-B*B,
         FDV         WXF1            < (A*A-B*B)/RAC(A*A+B*B),
         FAD         WXF2
         FSB         WXF3
         FST         XX1             < X1=(A*A-B*B)/RAC(A*A+B*B)+
                                     <    A*COS(TETA)-B*SIN(TETA).
         FLD         WXF1            < RAC(A*A+B*B),
         FAD         WXF2
         FAD         WXF3
         FST         XZ1             < Z1=RAC(A*A+B*B)+A*COS(TETA)+B*SIN(TETA).
         FLD         MU
         BSR         ASIN
         FST         WXF1            < SIN(MU).
         FLD         MU
         BSR         ACOS
         FST         WXF2            < COS(MU).
         FLD         XALPHA
         BSR         ASIN
         FMP         XZ1
         FST         WXF3            < Z1*SIN(ALPHA).
         RSR
<
<
<        C O O R D O N N E E   E N   ' U '  :
<
<
SPU:     EQU         $
<
< EST-CE LE PREMIER PASSAGE ???
<
         CPZ         PREM            < ???
         JG          SPU1            < NON...
         IC          PREM            < OUI, ON FAIT DES INITIALISATIONS...
<
< DEFINITION DE LA SURFACE DE BOY :
<
         LXI         A6
         BSR         ASPCT
         FST         XF10
         LXI         A7
         BSR         ASPCT
         FST         XF141
         LXI         A8
         BSR         ASPCT
         FST         XF198
         LXI         A9
         BSR         ASPCT
         FST         XF3
XXXRDN:  VAL         3
         EOT         #SIOP RAYON RDN 3#
SPU1:    EQU         $
<
< CALCUL DES PARAMETRES DE BOY :
<
         BSR         ASP1            < CALCUL DES PARAMETRES ; RENVOIE :
                                     < Z1*SIN(ALPHA).
<
< COORDONNEE EN 'U' :
<
         FMP         WXF1            < Z1*SIN(ALPHA)*SIN(MU),
         FST         WXF4
         FLD         WXF2            < COS(MU),
         FMP         XX1             < X1*COS(MU),
         FSB         WXF4            < X=X1*COS(MU)-Z1*SIN(ALPHA)*SIN(MU).
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         FAD         XFA1            < ET TRANSLATION.
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         BSR         ASP1            < CALCUL DES PARAMETRES ; RENVOIE :
                                     < Z1*SIN(ALPHA),
         FMP         WXF2            < Z1*SIN(ALPHA)*COS(MU),
         FST         WXF4
         FLD         WXF1            < SIN(MU),
         FMP         XX1             < X1*SIN(MU),
         FAD         WXF4            < Y=X1*SIN(MU)+Z1*SIN(ALPHA)*COS(MU).
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         FAD         XFA2            < ET TRANSLATION.
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         BSR         ASP1            < CALCUL DES PARAMETRES...
         FLD         XALPHA
         BSR         ACOS
         FMP         XZ1             < Z=Z1*COS(ALPHA).
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON RDN 3#
:F
:F
< <<'SIOP PLANET BOY 3'
DF'SIOP PLANET CHAMP 3'
ED'SIOP PLANET CHAMP 3'
IN0
         PAGE
         IDP         "SIOP PLANET CHAMP 3"
<
<
<        M I S E   S U R   U N E   P L A N E T E   C H A M P   3  :
<                    ( D ' A X E   Z )
<
<
<        EQUATION :
<                    X=(A5+A0*F(XR,YR))*COS(V)*COS(U),
<                    Y=(A5+A0*F(XR,YR))*COS(V)*SIN(U),
<                    Z=(A5+A0*F(XR,YR))*SIN(V).
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON CHAMP 3#
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON CHAMP 3#
         PROG
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
<
< EST-CE LE PREMIER PASSAGE ???
<
         CPZ         PREM            < ???
         JG          SPU1            < NON...
         IC          PREM            < OUI, ON FAIT DES INITIALISATIONS...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON CHAMP 3#
SPU1:    EQU         $
         FLD         VARV
         BSR         ACOS
         FST         FWORK
         FLD         VARU
         BSR         ACOS
         FMP         FWORK
         BSR         ARAYON          < CALCUL DE R(X,Y)*COS(V)*COS(U)...
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         FLD         VARV
         BSR         ACOS
         FST         FWORK
         FLD         VARU
         BSR         ASIN
         FMP         FWORK
         BSR         ARAYON          < CALCUL DE R(X,Y)*COS(V)*SIN(U)...
         RSR
<
<
<        C O M P O S A N T E  ' W '  :
<
<
SPW:     EQU         $
         FLD         VARV
         BSR         ASIN
         BSR         ARAYON          < CALCUL DE R(X,Y)*SIN(V)...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON CHAMP 3#
:F
:F
< <<'SIOP PLANET CHAMP 3'
DF'SIOP PLANET CHAMP 4'
ED'SIOP PLANET CHAMP 4'
IN0
         PAGE
         IDP         "SIOP PLANET CHAMP 4"
<
<
<        M I S E   S U R   U N E   P L A N E T E   C H A M P   4  :
<                    ( D ' A X E   Z )
<
<
<        EQUATION :
<                    X=(A5+A0*F(XR,YR))*COS(V)*COS(U),
<                    Y=(A5+A0*F(XR,YR))*COS(V)*SIN(U),
<                    Z=(A5+A0*F(XR,YR))*SIN(V).
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON CHAMP 4#
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON CHAMP 4#
<
< RELAIS INTERNES :
<
ASPU1:   WORD        SPU1
         PROG
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
<
< EST-CE LE PREMIER PASSAGE ???
<
         CPZ         PREM            < ???
         JLE         SPU9            < OUI...
         BR          ASPU1           < NON...
SPU9:    EQU         $
         IC          PREM            < OUI, ON FAIT DES INITIALISATIONS...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON CHAMP 4#
SPU1:    EQU         $
         FLD         VARV
         BSR         ACOS
         FST         FWORK
         FLD         VARU
         BSR         ACOS
         FMP         FWORK
         BSR         ARAYON          < CALCUL DE R(X,Y)*COS(V)*COS(U)...
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         FLD         VARV
         BSR         ACOS
         FST         FWORK
         FLD         VARU
         BSR         ASIN
         FMP         FWORK
         BSR         ARAYON          < CALCUL DE R(X,Y)*COS(V)*SIN(U)...
         RSR
<
<
<        C O M P O S A N T E  ' W '  :
<
<
SPW:     EQU         $
         FLD         VARV
         BSR         ASIN
         BSR         ARAYON          < CALCUL DE R(X,Y)*SIN(V)...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON CHAMP 4#
:F
:F
< <<'SIOP PLANET CHAMP 4'
DF'SIOP PLANET CHAMP 6'
ED'SIOP PLANET CHAMP 6'
IN0
         PAGE
         IDP         "SIOP PLANET CHAMP 6"
<
<
<        M I S E   S U R   U N E   P L A N E T E   C H A M P   6  :
<                    ( D ' A X E   Z )
<
<
<        EQUATION :
<                    X=(A5+A0*F(XR,YR))*COS(V)*COS(U),
<                    Y=(A5+A0*F(XR,YR))*COS(V)*SIN(U),
<                    Z=(A5+A0*F(XR,YR))*SIN(V).
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON CHAMP 6#
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON CHAMP 6#
         PROG
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
<
< EST-CE LE PREMIER PASSAGE ???
<
         CPZ         PREM            < ???
         JG          SPU1            < NON...
         IC          PREM            < OUI, ON FAIT DES INITIALISATIONS...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON CHAMP 6#
SPU1:    EQU         $
         FLD         VARV
         BSR         ACOS
         FST         FWORK
         FLD         VARU
         BSR         ACOS
         FMP         FWORK
         BSR         ARAYON          < CALCUL DE R(X,Y)*COS(V)*COS(U)...
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         FLD         VARV
         BSR         ACOS
         FST         FWORK
         FLD         VARU
         BSR         ASIN
         FMP         FWORK
         BSR         ARAYON          < CALCUL DE R(X,Y)*COS(V)*SIN(U)...
         RSR
<
<
<        C O M P O S A N T E  ' W '  :
<
<
SPW:     EQU         $
         FLD         VARV
         BSR         ASIN
         BSR         ARAYON          < CALCUL DE R(X,Y)*SIN(V)...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON CHAMP 6#
:F
:F
< <<'SIOP PLANET CHAMP 6'
DF'SIOP PLANET CYL 1'
ED'SIOP PLANET CYL 1'
IN0
         PAGE
         IDP         "SIOP PLANET CYL 1"
<
<
<        M I S E   S U R   U N E   P L A N E T E   C Y L   1  :
<                    ( D ' A X E   Z )
<
<
<        EQUATION DU CYLINDRE :
<                    X=(A5+A0*F(XR,YR))*A12*COS(A10*U+A11*V),
<                    Y=(A5+A0*F(XR,YR))*A13*SIN(A10*U+A11*V),
<                    Z=(A5+A0*F(XR,YR))*A14*V.
<
<
<        NOTA :
<                      LE PARAMETRE 'A11' INTRODUIT
<                    UN DEPHASAGE SUR 'U' QUI PERMET
<                    AINSI DE TORDRE LE CYLINDRE.
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON 1#
A10::    VAL         '10
A11::    VAL         A10+1
A12::    VAL         A11+1
A13::    VAL         A12+1
A14::    VAL         A13+1
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON 1#
<
< DEFINITION DU CYLINDRE :
<
XFA10:   FLOAT       0               < 'A10',
XFA11:   FLOAT       0               < 'A11',
XFA12:   FLOAT       0               < 'A12',
XFA13:   FLOAT       0               < 'A13',
XFA14:   FLOAT       0               < 'A14'.
         PROG
<
<
<        C O M P O S A N T E   ' X '  :
<
<
SPU:     EQU         $
<
< ENTREE DES PARAMETRES AU PREMIER TOUR :
<
         CPZ         PREM            < EST-CE LE PREMIER TOUR ???
         JG          SPU1            < NON...
         IC          PREM            < OUI, ON ENTRE LES PARAMETRES...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON 1#
<
< DEFINITION DU CYLINDRE :
<
         LXI         A10
         BSR         ASPCT
         FST         XFA10
         LXI         A11
         BSR         ASPCT
         FST         XFA11
         LXI         A12
         BSR         ASPCT
         FST         XFA12
         LXI         A13
         BSR         ASPCT
         FST         XFA13
         LXI         A14
         BSR         ASPCT
         FST         XFA14
SPU1:    EQU         $
<
< CALCUL DE LA COMPOSANTE 'X' :
<
         FLD         VARU            < U,
         FMP         XFA10           < A10*U,
         FST         FWORK
         FLD         VARV            < V,
         FMP         XFA11           < A11*V,
         FAD         FWORK           < A10*U+A11*V,
         BSR         ACOS            < COS(A10*U+A11*V),
         FMP         XFA12           < X=A12*COS(A10*U+A11*V).
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         RSR
<
<
<        C O M P O S A N T E   ' Y '  :
<
<
SPV:     EQU         $
         FLD         VARU            < U,
         FMP         XFA10           < A10*U,
         FST         FWORK
         FLD         VARV            < V,
         FMP         XFA11           < A11*V,
         FAD         FWORK           < A10*U+A11*V,
         BSR         ASIN            < SIN(A10*U+A11*V),
         FMP         XFA13           < Y=A13*SIN(A10*U+A11*V).
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         RSR
<
<
<        C O M P O S A N T E   ' Z '  :
<
<
SPW:     EQU         $
         FLD         VARV            < V,
         FMP         XFA14           < Z=A134V.
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON 1#
:F
:F
< <<'SIOP PLANET CYL 1'
DF'SIOP PLANET KLEIN 1'
ED'SIOP PLANET KLEIN 1'
IN0
         PAGE
         IDP         "SIOP PLANET KLEIN 1"
<
<
<        M I S E   S U R   U N E   P L A N E T E   K L E I N   1  :
<
<
<        EQUATION :
<                    BETA=ALPHA/A13,
<                    A=SIN(TETA)*COS(BETA)+COS(TETA)*SIN(TETA)*SIN(BETA)+A9,
<                    X=A10*(A5+A0*F(XR,YR))*A*COS(A14*ALPHA)+A1,
<                    Y=A11*(A5+A0*F(XR,YR))*A*SIN(A15*ALPHA)+A2,
<                    Z=A12*(A5+A0*F(XR,YR))*(-SIN(TETA)*SIN(BETA)
<                      +COS(TETA)*SIN(TETA)*COS(BETA)),
<        AVEC :
<                    ALPHA=U*(2*PI-A7*PI)/(2*PI),
<                    TETA=V*2*A8+PI-A8*PI,
<        OU :
<                    U APPARTIENT A (0,2*PI),
<                    V APPARTIENT A (0,PI),
<                    ALPHA APPARTIENT A (0,2*PI-A7*PI),
<                    TETA APPARTIENT A (PI-A8*PI,PI+A8*PI).
<        OU :
<                    A0000=FACTEUR D'AMPLIFICATION DE L'EXTENSION
<                          F(XR,YR) DU RAYON.
<                    A0001=DEPLACEMENT SUR L'AXE DES X,
<                    A0002=DEPLACEMENT SUR L'AXE DES Y,
<                    A0003=NOMBRE DE POINTS DE LA SPIRALE.
<                    A0004=PAS DE PARCOURS DE LA SPIRALE (1 EN GENERAL).
<                    A0005=VALEUR MINIMALE DU RAYON.
<                    A0007 A A000F SONT DES PARAMETRES DE CONTROLE
<                    DE LA BOUTEILLE DE KLEIN ET DU RUBAN DE MOBIUS,
<                    AVEC EN GENERAL :
<                                    A0009=2, ET
<                                    A000D=2,
<                                    A000E=1,
<                                    A000F=1.
A0::     VAL         0
A1::     VAL         A0+1
A2::     VAL         A1+1
A3::     VAL         A2+1
A4::     VAL         A3+1
A5::     VAL         A4+1
A6::     VAL         A5+1
A7::     VAL         A6+1
A8::     VAL         A7+1
A9::     VAL         A8+1
A10::    VAL         A9+1
A11::    VAL         A10+1
A12::    VAL         A11+1
A13::    VAL         A12+1
A14::    VAL         A13+1
A15::    VAL         A14+1
<
<
         LOCAL
FLOC:    EQU         $
<
< VARIABLES MONTAGNEUSES :
<
CUMUL:   WORD        0               < SIGMA(NIVEAU(XS,YS)).
PASQ:    WORD        0               < ARGUMENT 'A4'.
DELTAX:  WORD        0
DELTAY:  WORD        0
LB:      WORD        0               < LONGUEUR DES
LB0:     WORD        0               <              BRANCHES DE LA SPIRALE.
NP:      WORD        0               < NOMBRE DE POINT COURANT,
NPM:     WORD        0               < NOMBRE DE POINTS ENTIER DE LA SPIRALE.
FNP:     FLOAT       0               < NOMBRE DE POINTS FLOTTANT DE LA SPIRALE.
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
GINCU:   FLOAT       0               < RESIDU DE L'ABSCISSE,
GINCV:   FLOAT       0               < RESIDU DE L'ORDONNEE.
GNIV1:   FLOAT       0               < SIGMA PONDERE DES NIVEAUX DE LA SPIRALE
                                     < CENTREE EN (XS,YS),
GNIV2:   FLOAT       0               < DE MEME EN (XS+1,YS),
GNIV3:   FLOAT       0               < DE MEME EN (XS+1,YS+1),
GNIV4:   FLOAT       0               < DE MEME EN (XS,YS+1).
PREM:    WORD        0               < INDICATEUR DE PREMIER PASSAGE.
FA0:     FLOAT       0               < CONSTANTE 'A0',
FA5:     FLOAT       0               < ET 'A5'.
<
< VARIABLES DE MANOEUVRE DE KLEIN :
<
WXFA1:   FLOAT       0
WXFA2:   FLOAT       0
WXFA3:   FLOAT       0
WXFA4:   FLOAT       0
WXFA5:   FLOAT       0
<
< PARAMETRES DE KLEIN :
<
PI:      EQU         PI3141
FA7:     FLOAT       0
FA8:     FLOAT       0
FA9:     FLOAT       0
FA10:    FLOAT       0
FA11:    FLOAT       0
FA12:    FLOAT       0
FA13:    FLOAT       0
FA14:    FLOAT       0
FA15:    FLOAT       0
XFA1:    FLOAT       0               < DEPLACEMENT SUR L'AXE DES X,
XFA2:    FLOAT       0               < ET SUR L'AXE DES Y.
<
< PARAMETRES :
<
TETA:    FLOAT       0
ALPHA:   FLOAT       0
<
< SOUS-PROGRAMMES :
<
ASP1:    WORD        SP1             < CALCUL DE LA FONCTION 'A'.
ASP2:    WORD        SP2             < CALCUL DE 'TETA' ET 'ALPHA'.
ASPIR:   WORD        SPIR            < CALCUL DU SIGMA SUR UNE SPIRALE...
ARAYON:  WORD        RAYON           < CALCUL DE LA FONCTION COURANTE.
ARAYO1:  WORD        RAYON1          < RELAI...
         PROG
<
<
<        C A L C U L   D E S   P A R A M E T R E S  :
<
<
SP1:     EQU         $
<
< CALCUL DES 2 ANGLES-PARAMETRES :
< (TETA ET ALPHA)
<
         BSR         ASP2
<
< CALCUL DE LA FONCTION 'A' :
<
         BSR         ASIN            < SIN(TETA),
         FST         WXFA1           < SIN(TETA),
         FLD         ALPHA
         FDV         FA13            < ALPHA/A13,
         FST         WXFA2           < ALPHA/A13,
         BSR         ACOS            < COS(ALPHA/A13),
         FMP         WXFA1           < SIN(TETA)*COS(ALPHA/A13),
         FST         WXFA3           < SIN(TETA)*COS(ALPHA/A13),
         FLD         TETA
         BSR         ACOS            < COS(TETA),
         FMP         WXFA1           < COS(TETA)*SIN(TETA),
         FST         WXFA4           < COS(TETA)*SIN(TETA),
         FLD         WXFA2           < ALPHA/A13,
         BSR         ASIN            < SIN(ALPHA/A13),
         FMP         WXFA4           < COS(TETA)*SIN(TETA)*SIN(ALPHA/A13),
         FAD         WXFA3           < SIN(TETA)*COS(ALPHA/A13)
                                     < +COS(TETA)*SIN(TETA)*SIN(ALPHA/13),
         FAD         FA9             < ET TRANSLATION DE +A9,
         FST         WXFA5           < CE QUI DONNE LA FONCTION 'A'...
         RSR
<
<
<        C A L C U L   D E   ' A L P H A '   E T   ' T E T A '  :
<
<
SP2:     EQU         $
         FLD         DEUXPI
         FSB         FA7             < 2*PI-A7*PI,
         FMP         VARU            < U*(2*PI-A7*PI),
         FDV         DEUXPI          < U*(2*PI-A7*PI)/(2*PI),
         FST         ALPHA           < SOIT 'ALPHA'...
         FLD         PI
         FMP         FA8             < PI*A8,
         FST         FWORK
         FLD         VARV
         FMP         FA8             < V*A8,
         FDV         F05             < V*2*A8 = (V/PI)*(2*PI*A8),
         FAD         PI              < (V*2*A8)+PI,
         FSB         FWORK           < (V*2*A8)+PI-PI*A8,
         FST         TETA            < SOIT 'TETA'...
         RSR
<
<
<        C O O R D O N N E E   E N   ' U '  :
<
<
SPU:     EQU         $
<
< EST-CE LE PREMIER PASSAGE ???
<
         CPZ         PREM            < ???
         JG          SPU1            < NON...
         IC          PREM            < OUI, ON FAIT DES INITIALISATIONS...
<
< DEFINITION DE LA SURFACE DE KLEIN :
<
         LXI         A7
         BSR         ASPCT
         FMP         PI
         FST         FA7             < A7*PI...
         LXI         A8
         BSR         ASPCT
         FST         FA8
         LXI         A9
         BSR         ASPCT
         FST         FA9
         LXI         A10
         BSR         ASPCT
         FST         FA10
         LXI         A11
         BSR         ASPCT
         FST         FA11
         LXI         A12
         BSR         ASPCT
         FST         FA12
         LXI         A13
         BSR         ASPCT
         FST         FA13
         LXI         A14
         BSR         ASPCT
         FST         FA14
         LXI         A15
         BSR         ASPCT
         FST         FA15
<
< AMPLIFICATEUR DE LA VARIATION DU RAYON
< ET VALEUR MINIMALE DE CELUI-CI :
<
         LXI         A0
         BSR         ASPCT
         FST         FA0
         LXI         A5
         BSR         ASPCT
         FST         FA5
<
< DEFINITION DE LA SPIRALE :
<
         LXI         A3
         BSR         ASPCT
         FST         FNP
         FIX
         STA         NPM             < NOMBRE DE POINTS MAX...
         JAL         $               < ??!??!?!
         LXI         A4
         BSR         ASPCT
         BSR         AROND
         STA         PASQ            < PAS DE PARCOURS...
<
< TRANSLATION SUR OX ET OY :
<
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
SPU1:    EQU         $
<
< CALCUL DES PARAMETRES DE KLEIN :
<
         BSR         ASP1            < CALCUL DES PARAMETRES ET DE LA
                                     < FONCTION 'A'.
<
< COORDONNEE EN 'U' :
<
         FLD         ALPHA           < ALPHA,
         FMP         FA14            < A14*ALPHA,
         BSR         ACOS            < COS(A14*ALPHA),
         FMP         WXFA5           < A*COS(A14*ALPHA),
         FMP         FA10            < A10*A*COS(A14*ALPHA)...
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         FAD         XFA1            < ET TRANSLATION.
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         BSR         ASP1            < CALCUL DES PARAMETRES ET DE LA
                                     < FONCTION 'A'.
         FLD         ALPHA           < ALPHA,
         FMP         FA15            < A15*ALPHA,
         BSR         ASIN            < SIN(A15*ALPHA),
         FMP         WXFA5           < A*SIN(A15*ALPHA),
         FMP         FA11            < A11*A*SIN(A15*ALPHA)...
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         FAD         XFA2            < ET TRANSLATION.
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         BSR         ASP2            < CALCUL DE 'TETA' ET 'ALPHA'.
         FLD         TETA
         BSR         ASIN            < SIN(TETA),
         FST         WXFA1           < SIN(TETA),
         FLD         ALPHA
         FDV         FA13            < ALPHA/A13,
         FST         WXFA2           < ALPHA/A13,
         BSR         ASIN            < SIN(ALPHA/A13),
         FMP         WXFA1           < SIN(TETA)*SIN(ALPHA/A13),
         FST         WXFA3           < SIN(TETA)*SIN(ALPHA/A13),
         FLD         TETA
         BSR         ACOS            < COS(TETA),
         FMP         WXFA1           < COS(TETA)*SIN(TETA),
         FST         WXFA4           < COS(TETA)*SIN(TETA),
         FLD         WXFA2           < ALPHA/A13,
         BSR         ACOS            < COS(ALPHA/A13),
         FMP         WXFA4           < COS(TETA)*SIN(TETA)*COS(ALPHA/A13),
         FSB         WXFA3           < -SIN(TETA)*SIN(ALPHA/A13)
                                     < +COS(TETA)*SIN(TETA)*COS(ALPHA/A13),
         FMP         FA12            < A12*(...),
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         RSR
<
<
<        C A L C U L   D U   R A Y O N  :
<
<
<        ARGUMENT :
<                    (A,B)=FONCTION COURANTE.
<
<
<        RESULTAT :
<                    (A,B)=(CONSTANTE5+F(XR,YR))*(FONCTION COURANTE).
<
<
RAYON:   EQU         $
         CPZ         NPM             < LA SPIRALE EST-ELLE VIDE ???
         JG          RAYON2          < NON, ON VA L'EXPLORER...
         BR          ARAYO1          < OUI, RIEN A FAIRE...
RAYON2:  EQU         $
         PSR         A,B             < SAVE LE CUMUL INITIAL...
<
< CALCUL DU POINT COURANT ET
< POSITION DANS UN CARRE DE
< COORDONNEES ENTIERES :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         FLT
         FAD         FWORK
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         FIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         FLT
         FSB         GXS
         FNEG
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         FLT
         FAD         FWORK
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
         FIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         FLT
         FSB         GYS
         FNEG
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< PASSAGE SUR 'TV2' :
<
         LA          CTCDA
         STA         XCTCDA
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         BSR         ASPIR
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ASPIR
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ASPIR
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ASPIR
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         GNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         GINCU
         FMP         FWORK2
         FMP         GNIV2
         FAD         FWORK
         FST         FWORK           < +FU*(1-FV)*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         FAD         FWORK
         FST         FWORK           < +FU*FV*N3,
         FLD         FWORK1
         FMP         GINCV
         FMP         GNIV4
         FAD         FWORK           < +(1-FU)*FV*N4,
<
< CALCUL DE LA FONCTION COURANTE :
<
         FMP         FA0             < AMPLIFICATION,
         FAD         FA5             < ET TRANSLATION.
         FST         FWORK           < RAYON=FA5+FA0*F(XR,YR).
         PLR         A,B             < RESTAURATION DU CUMUL,
         FMP         FWORK           < ET CALCUL DE LA FONCTION COURANTE...
<
< RETOUR :
<
         STZ         XCTCDA          < POUR ATTEINDRE 'TV1'...
RAYON1:  EQU         $
         RSR
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         $
<
< INITIALISATION DE LA SPIRALE :
<
         LA          XS
         LB          YS
         PSR         A,B             < SAUVEGARDE DU POINT (XS,YS).
         STZ         CUMUL           < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         LA          PASQ
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         1
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIRALE.
SPMOY8:  EQU         $
<
< PARCOURS D'UN BRAS :
<
SPMOY1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPMOY2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NPM             < FINI ???
         JG          SPMOY3          < OUI...
         LA          XS              < NON :
         LB          YS
         PSR         A,B             < SAVE (XS,YS) AVANT LE TORE EVENTUEL...
         CPZ         MODX            < Y-A-T'IL X-TORE ???
         JE          SPMOY6          < OUI...
         JAL         SPMOY4          < NON, LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPMOY4          < HORS-ECRAN...
SPMOY6:  EQU         $
         ANDI        NPOLM1          < CALCUL MODULO...
         STA         XS              < MISE A JOUR DE XS.
         LR          B,A             < (A)=YS,
         CPZ         MODY            < EST-ON SUR UN Y-TORE ???
         JE          SPMOY7          < OUI...
         JAL         SPMOY4          < NON, LE POINT EST HORS-ECRAN...
         CPI         NLIGM1
         JG          SPMOY4          < HORS-ECRAN...
SPMOY7:  EQU         $
         ANDI        NLIGM1          < CALCUL MODULO...
         STA         YS              < MISE A JOUR DE YS.
         BSR         ASPGPS          < A=NIVEAU(XS,YS),
         AD          CUMUL           < ET
         STA         CUMUL           < CUMULE...
SPMOY4:  EQU         $
         PLR         A,B             < (A)=XS,
                                     < (B)=YS.
         AD          DELTAX          < CHANGEMENT DE
         STA         XS
         LR          B,A             < (A)=YS.
         AD          DELTAY          < POINT COURANT (XS,YS).
         STA         YS
         DC          LB              < DECOMPTAGE DES POINTS SUR LA BRANCHE :
         JG          SPMOY2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPMOY5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPMOY5:  EQU         $
         LA          DELTAY          < ON FAIT SUBIR AU NOMBRE COMPLEXE
         NGR         A,A             < (DX,DY) UNE ROTATION DE PI/2, SOIT
         LB          DELTAX          < UNE MULTIPLICATION PAR LA MATRICE
                                     < (0,-1,1,0)...
         STA         DELTAX          < DELTAX=-DELTAY,
         STB         DELTAY          < DELTAY=DELTAX.
         JMP         SPMOY1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (XS,YS) :
<
SPMOY3:  EQU         $
         PLR         A,B
         STA         XS              < RESTAURATION
         STB         YS              < DE (XS,YS),
<
< NORMALISATION DU CUMUL :
<
         LA          CUMUL
         FLT
         FDV         FNP
         RSR
:F
:F
< <<'SIOP PLANET KLEIN 1'
DF'SIOP PLANET TORE 1'
ED'SIOP PLANET TORE 1'
IN0
         PAGE
         IDP         "SIOP PLANET TORE 1"
<
<
<        M I S E   S U R   U N E   P L A N E T E   T O R E   1  :
<                    ( D ' A X E   Z )
<
<
<        EQUATION DU TORE :
<                    X=(A6+A7*(A5+A0*F(XR+A1,YR))*COS(V))*COS(U)+A1,
<                    Y=(A6+A7*(A5+A0*F(XR+A2,YR))*COS(V))*SIN(U)+A2,
<                    Z=A7*(A5+A0*F(XR,YR))*SIN(V).
<        OU
<                    'A6' REPRESENTE LE GRAND RAYON, ET
<                    'A7' LE PETIT...
<
<
XXXRDN:  VAL         1
         EOT         #SIOP RAYON 1#
A6::     VAL         A5+1            < GRAND RAYON,
A7::     VAL         A6+1            < PETIT RAYON.
         LOCAL
FLOC:    EQU         $
<
< RAYONS DU TORE :
<
R1:      FLOAT       0
R2:      FLOAT       0
XXXRDN:  VAL         2
         EOT         #SIOP RAYON 1#
         PROG
<
<
<        C O O R D O N N E E   ' X '  :
<
<
SPU:     EQU         $
<
< ENTREE DES PARAMETRES :
<
         CPZ         PREM            < PREMIER PASSAGE ???
         JG          SPU1            < NON...
         IC          PREM            < OUI...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON 1#
         LXI         A6
         BSR         ASPCT
         FST         R1
         LXI         A7
         BSR         ASPCT
         FST         R2
<
< CALCUL DE LA COORDONNEE 'X' :
<
SPU1:    EQU         $
         FLD         VARV
         BSR         ACOS
         FMP         R2
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         FAD         R1
         FST         FWORK
         FLD         VARU
         BSR         ACOS
         FMP         FWORK
         FAD         XFA1            < TRANSLATION...
         RSR
<
<
<        C O O R D O N N E E   ' Y '  :
<
<
SPV:     EQU         $
         FLD         VARV
         BSR         ACOS
         FMP         R2
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         FAD         R1
         FST         FWORK
         FLD         VARU
         BSR         ASIN
         FMP         FWORK
         FAD         XFA2            < TRANSLATION...
         RSR
<
<
<        C O O R D O N N E E   ' Z '  :
<
<
SPW:     EQU         $
         FLD         VARV
         BSR         ASIN
         FMP         R2
         BSR         ARAYON          < MODULATION MONTAGNEUSE...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON 1#
:F
:F
< <<'SIOP PLANET TORE 1'
DF'SIOP RAYON 1'
ED'SIOP RAYON 1'
IN0
         NLS
         IDP         "SIOP RAYON 1"
<        R A Y O N   1  :
         IF          XXXRDN-1,XWOR%9,,XWOR%9
         LST
A0::     VAL         0               < AMPLIFICATEUR DE LA FONCTION MONTA-
                                     < GNEUSE F(XR,YR).
A1::     VAL         A0+1            < DEPLACEMENT SUR L'AXE DES 'X', A LA
                                     < CHARGE DU MODULE APPELANT...
A2::     VAL         A1+1            < DEPLACEMENT SUR L'AXE DES 'Y', A LA
                                     < CHARGE DU MODULE APPELANT...
A3::     VAL         A2+1            < NOMBRE DE POINTS DE LA SPIRALE ; SI
                                     < CELUI-CI EST NUL, IL N'Y A PAS DE CALCUL
                                     < DE FONCTION MONTAGNEUSE...
A4::     VAL         A3+1            < PAS DE PARCOURS DE LA SPIRALE (+1 EN
                                     < GENERAL...).
A5::     VAL         A4+1            < VALEUR MOYENNE DE LA FONCTION MONTA-
                                     < GNEUSE : A5+A0*F(XR,YR).
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-2,XWOR%9,,XWOR%9
         LST
<
< INDICATEUR DE PREMIER PASSAGE :
<
PREM:    WORD        0               < =0 : PREMIER PASSAGE,
                                     < #0 : PASSAGES SUIVANTS.
<
< VARIABLES MONTAGNEUSES :
<
CUMUL:   WORD        0               < SIGMA(NIVEAU(XS,YS)).
PASQ:    WORD        0               < ARGUMENT 'A4'.
DELTAX:  WORD        0
DELTAY:  WORD        0
LB:      WORD        0               < LONGUEUR DES
LB0:     WORD        0               <              BRANCHES DE LA SPIRALE.
NP:      WORD        0               < NOMBRE DE POINT COURANT,
NPM:     WORD        0               < NOMBRE DE POINTS ENTIER DE LA SPIRALE.
FNP:     FLOAT       0               < NOMBRE DE POINTS FLOTTANT DE LA SPIRALE.
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
GINCU:   FLOAT       0               < RESIDU DE L'ABSCISSE,
GINCV:   FLOAT       0               < RESIDU DE L'ORDONNEE.
GNIV1:   FLOAT       0               < SIGMA PONDERE DES NIVEAUX DE LA SPIRALE
                                     < CENTREE EN (XS,YS),
GNIV2:   FLOAT       0               < DE MEME EN (XS+1,YS),
GNIV3:   FLOAT       0               < DE MEME EN (XS+1,YS+1),
GNIV4:   FLOAT       0               < DE MEME EN (XS,YS+1).
FA0:     FLOAT       0               < CONSTANTE 'A0',
FA5:     FLOAT       0               < ET 'A5'.
<
< TRANSLATION SUR OX ET OY :
<
XFA1:    FLOAT       0               < 'OX',
XFA2:    FLOAT       0               < ET 'OY'...
<
< RELAIS MONTAGNEUX :
<
ASPIR:   WORD        SPIR            < CALCUL DU SIGMA SUR UNE SPIRALE...
ARAYON:  WORD        RAYON           < CALCUL DE LA FONCTION COURANTE.
ARAYO1:  WORD        RAYON1          < RELAI...
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-3,XWOR%9,,XWOR%9
         LST
<
< AMPLIFICATEUR DE LA VARIATION DU RAYON
< ET VALEUR MINIMALE DE CELUI-CI :
<
         LXI         A0
         BSR         ASPCT
         FST         FA0
         LXI         A5
         BSR         ASPCT
         FST         FA5
<
< DEFINITION DE LA SPIRALE :
<
         LXI         A3
         BSR         ASPCT
         FST         FNP
         FIX
         STA         NPM             < NOMBRE DE POINTS MAX...
         JAL         $               < ??!??!?!
         LXI         A4
         BSR         ASPCT
         BSR         AROND
         STA         PASQ            < PAS DE PARCOURS...
<
< TRANSLATION SUR OX ET OY :
<
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-4,XWOR%9,,XWOR%9
         LST
<
<
<        C A L C U L   D U   R A Y O N  :
<
<
<        ARGUMENT :
<                    (A,B)=FONCTION COURANTE.
<
<
<        RESULTAT :
<                    (A,B)=(A5+A0*F(XR,YR))*(FONCTION COURANTE).
<
<
RAYON:   EQU         $
         CPZ         NPM             < LA SPIRALE EST-ELLE VIDE ???
         JG          RAYON2          < NON, ON VA L'EXPLORER...
         BR          ARAYO1          < OUI, RIEN A FAIRE...
RAYON2:  EQU         $
         PSR         A,B             < SAVE LE CUMUL INITIAL...
<
< CALCUL DU POINT COURANT ET
< POSITION DANS UN CARRE DE
< COORDONNEES ENTIERES :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         FLT
         FAD         FWORK
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         FIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         FLT
         FSB         GXS
         FNEG
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         FLT
         FAD         FWORK
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
         FIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         FLT
         FSB         GYS
         FNEG
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< PASSAGE SUR 'TV2' :
<
         LA          CTCDA
         STA         XCTCDA
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         BSR         ASPIR
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ASPIR
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ASPIR
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ASPIR
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         GNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         GINCU
         FMP         FWORK2
         FMP         GNIV2
         FAD         FWORK
         FST         FWORK           < +FU*(1-FV)*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         FAD         FWORK
         FST         FWORK           < +FU*FV*N3,
         FLD         FWORK1
         FMP         GINCV
         FMP         GNIV4
         FAD         FWORK           < +(1-FU)*FV*N4,
<
< CALCUL DE LA FONCTION COURANTE :
<
         FMP         FA0             < AMPLIFICATION,
         FAD         FA5             < ET TRANSLATION.
         FST         FWORK           < RAYON=FA5+FA0*F(XR,YR).
         PLR         A,B             < RESTAURATION DU CUMUL,
         FMP         FWORK           < ET CALCUL DE LA FONCTION COURANTE...
<
< RETOUR :
<
         STZ         XCTCDA          < POUR ATTEINDRE 'TV1'...
RAYON1:  EQU         $
         RSR
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         $
<
< INITIALISATION DE LA SPIRALE :
<
         LA          XS
         LB          YS
         PSR         A,B             < SAUVEGARDE DU POINT (XS,YS).
         STZ         CUMUL           < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         LA          PASQ
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         1
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIRALE.
SPMOY8:  EQU         $
<
< PARCOURS D'UN BRAS :
<
SPMOY1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPMOY2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NPM             < FINI ???
         JG          SPMOY3          < OUI...
         LA          XS              < NON :
         LB          YS
         PSR         A,B             < SAVE (XS,YS) AVANT LE TORE EVENTUEL...
         CPZ         MODX            < Y-A-T'IL X-TORE ???
         JE          SPMOY6          < OUI...
         JAL         SPMOY4          < NON, LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPMOY4          < HORS-ECRAN...
SPMOY6:  EQU         $
         ANDI        NPOLM1          < CALCUL MODULO...
         STA         XS              < MISE A JOUR DE XS.
         LR          B,A             < (A)=YS,
         CPZ         MODY            < EST-ON SUR UN Y-TORE ???
         JE          SPMOY7          < OUI...
         JAL         SPMOY4          < NON, LE POINT EST HORS-ECRAN...
         CPI         NLIGM1
         JG          SPMOY4          < HORS-ECRAN...
SPMOY7:  EQU         $
         ANDI        NLIGM1          < CALCUL MODULO...
         STA         YS              < MISE A JOUR DE YS.
         BSR         ASPGPS          < A=NIVEAU(XS,YS),
         AD          CUMUL           < ET
         STA         CUMUL           < CUMULE...
SPMOY4:  EQU         $
         PLR         A,B             < (A)=XS,
                                     < (B)=YS.
         AD          DELTAX          < CHANGEMENT DE
         STA         XS
         LR          B,A             < (A)=YS.
         AD          DELTAY          < POINT COURANT (XS,YS).
         STA         YS
         DC          LB              < DECOMPTAGE DES POINTS SUR LA BRANCHE :
         JG          SPMOY2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPMOY5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPMOY5:  EQU         $
         LA          DELTAY          < ON FAIT SUBIR AU NOMBRE COMPLEXE
         NGR         A,A             < (DX,DY) UNE ROTATION DE PI/2, SOIT
         LB          DELTAX          < UNE MULTIPLICATION PAR LA MATRICE
                                     < (0,-1,1,0)...
         STA         DELTAX          < DELTAX=-DELTAY,
         STB         DELTAY          < DELTAY=DELTAX.
         JMP         SPMOY1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (XS,YS) :
<
SPMOY3:  EQU         $
         PLR         A,B
         STA         XS              < RESTAURATION
         STB         YS              < DE (XS,YS),
<
< NORMALISATION DU CUMUL :
<
         LA          CUMUL
         FLT
         FDV         FNP
         RSR
         NLS
XWOR%9:  VAL         0
         LST
:F
:F
< <<'SIOP RAYON 1'
DF'SIOP RAYON 2'
ED'SIOP RAYON 2'
IN0
         NLS
         IDP         "SIOP RAYON 2"
<        R A Y O N   2  :
         IF          XXXRDN-1,XWOR%9,,XWOR%9
         LST
A0::     VAL         0               < AMPLIFICATEUR DE LA FONCTION MONTA-
                                     < GNEUSE F(XS,YS).
A1::     VAL         A0+1            < DEPLACEMENT SUR L'AXE DES 'X', A LA
                                     < CHARGE DU MODULE APPELANT...
A2::     VAL         A1+1            < DEPLACEMENT SUR L'AXE DES 'Y', A LA
                                     < CHARGE DU MODULE APPELANT...
A3::     VAL         A2+1            < INUTILE...
                                     < (COMPATIBILITE AVEC #SIOP RAYON 1#)
A4::     VAL         A3+1            < INUTILE...
                                     < (COMPATIBILITE AVEC 'SIO RAYON 1')
A5::     VAL         A4+1            < VALEUR MOYENNE DE LA FONCTION MONTA-
                                     < GNEUSE : A5+A0*F(XS,YS).
A6::     VAL         A5+1            < AMPLIFICATEUR PARTIEL DE FXG*FXD.
A7::     VAL         A6+1            < AMPLIFICATEUR PARTIEL DE FYG*FYD.
A8::     VAL         A7+1            < PAS DE PARCOURS SUR OX,
A9::     VAL         A8+1            < ET SUR OY...
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-2,XWOR%9,,XWOR%9
         LST
<
< INDICATEUR DE PREMIER PASSAGE :
<
PREM:    WORD        0               < =0 : PREMIER PASSAGE,
                                     < #0 : PASSAGES SUIVANTS.
<
< VARIABLES MONTAGNEUSES :
<
XA6:     FLOAT       0               < AMPLI DE FXG*FXD,
XA7:     FLOAT       0               < AMPLI DE FYG*FYD.
FA0:     FLOAT       0               < CONSTANTE 'A0',
FA5:     FLOAT       0               < ET 'A5'.
<
< DONNEES D'INTERPOLATION :
<
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
GINCU:   FLOAT       0               < RESIDU DE L'ABSCISSE,
GINCV:   FLOAT       0               < RESIDU DE L'ORDONNEE.
GNIV1:   FLOAT       0               < SIGMA PONDERE DES NIVEAUX DE LA SPIRALE
                                     < CENTREE EN (XS,YS),
GNIV2:   FLOAT       0               < DE MEME EN (XS+1,YS),
GNIV3:   FLOAT       0               < DE MEME EN (XS+1,YS+1),
GNIV4:   FLOAT       0               < DE MEME EN (XS,YS+1).
<
< RECHERCHE DES POINTS NON NOIRS :
<
SXC:     WORD        0               < SAUVEGARDE DU
SYC:     WORD        0               <               POINT COURANT (XS,YS).
FXG:     FLOAT       0               < NOMBRE DE POINTS NON NOIRS SUR 'XG',
FXD:     FLOAT       0               < SUR 'XD',
FYG:     FLOAT       0               < SUR 'YG',
FYD:     FLOAT       0               < ET SUR 'YD'.
XA8:     WORD        0               < INCREMENT SUR OX,
XA9:     WORD        0               < INCREMENT SUR OY.
<
< TRANSLATION SUR OX ET OY :
<
XFA1:    FLOAT       0               < 'OX',
XFA2:    FLOAT       0               < ET 'OY'...
<
< RELAIS :
<
ARAYON:  WORD        RAYON           < BOURSOUFLURE...
ASPIR:   WORD        SPIR            < RECHERCHE DANS 4 DIRECTIONS...
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-3,XWOR%9,,XWOR%9
         LST
<
< PAS DE PARCOURS :
<
         LXI         A8
         BSR         ASPCT
         BSR         AROND
         STA         XA8             < SUR OX,
         LXI         A9
         BSR         ASPCT
         BSR         AROND
         STA         XA9             < ET SUR OY...
<
< AMPLIFICATEUR DE LA VARIATION DU RAYON
< ET VALEUR MINIMALE DE CELUI-CI :
<
         LXI         A0
         BSR         ASPCT
         FST         FA0
         LXI         A6
         BSR         ASPCT
         FST         XA6             < AMPLI DE FXG*FXD.
         LXI         A7
         BSR         ASPCT
         FST         XA7             < AMPLI DE FYG*FYD.
         LXI         A5
         BSR         ASPCT
         FST         FA5
<
< TRANSLATION SUR OX ET OY :
<
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-4,XWOR%9,,XWOR%9
         LST
<
<
<        C A L C U L   D U   R A Y O N  :
<
<
<        ARGUMENT :
<                    (A,B)=FONCTION COURANTE.
<
<
<        RESULTAT :
<                    (A,B)=(A5+A0*F(XS,YS))*(FONCTION COURANTE).
<
<
RAYON:   EQU         $
         PSR         A,B             < SAVE LE CUMUL INITIAL...
<
< CALCUL DU POINT COURANT ET
< POSITION DANS UN CARRE DE
< COORDONNEES ENTIERES :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         FLT
         FAD         FWORK
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         FIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         FLT
         FSB         GXS
         FNEG
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         FLT
         FAD         FWORK
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
         FIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         FLT
         FSB         GYS
         FNEG
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< PASSAGE SUR 'TV2' :
<
         LA          CTCDA
         STA         XCTCDA
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         BSR         ASPIR
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ASPIR
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ASPIR
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ASPIR
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         GNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         GINCU
         FMP         FWORK2
         FMP         GNIV2
         FAD         FWORK
         FST         FWORK           < +FU*(1-FV)*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         FAD         FWORK
         FST         FWORK           < +FU*FV*N3,
         FLD         FWORK1
         FMP         GINCV
         FMP         GNIV4
         FAD         FWORK           < +(1-FU)*FV*N4,
<
< CALCUL DE LA FONCTION COURANTE :
<
         FMP         FA0             < AMPLIFICATION,
         FAD         FA5             < ET TRANSLATION.
         FST         FWORK           < RAYON=FA5+FA0*F(XR,YR).
         PLR         A,B             < RESTAURATION DU CUMUL,
         FMP         FWORK           < ET CALCUL DE LA FONCTION COURANTE...
<
< RETOUR :
<
         STZ         XCTCDA          < POUR ATTEINDRE 'TV1'...
RAYON1:  EQU         $
         RSR
<
<
<        R E C H E R C H E   D A N S   4   D I R E C T I O N S  :
<
<
SPIR:    EQU         $
<
< SAUVEGARDE DU POINT COURANT :
<
         LA          XS
         LB          YS
         STB         SYC
         STA         SXC
<
< RECHERCHE DE 'G' HORIZONTAL GAUCHE :
<
         LAI         -1
         STA         XS              < INITIALISATION POINT DE DEPART.
         LXI         0               < INITIALISATION DU COMPTAGE DE POINTS
                                     < NON NOIRS RECONTRES JUSQU'A 'SXC'.
         LYI         0               < COMPTAGE DES NOIRS...
RAY1:    EQU         $
         LA          XS              < AU POINT SUIVANT :
         AD          XA8
         STA         XS
         CP          SXC             < EST-CE LE POINT COURANT ???
         JGE         RAY2            < OUI, FIN DE LA RECHERCHE A GAUCHE...
         BSR         ASPGPS          < NON, TEST DU POINT (XS,YS) :
         ADRI        1,Y             < A PRIORI...
         JAE         RAY1            < IL EST NOIR, ON L'IGNORE...
         ADRI        -1,Y            < CORRECTION...
         ADRI        1,X             < ET ON LE COMPTE...
         JMP         RAY1            < VERS LE POINT SUIVANT...
RAY2:    EQU         $
         LR          X,A             < (A)=NOMBRE DE POINTS NON NOIRS...
         FLT
         FST         FXG             < CE QUI DONNE LE 'G' HORIZONTAL GAUCHE...
<
< RECHERCHE DU 'G' HORIZONTAL DROITE :
<
         LAI         NPOLM1
         ADRI        1,A
         STA         XS              < INITIALISATION DU POINT DE DEPART.
         LXI         0               < INITIALISATION DU COMPTAGE DE POINTS
                                     < NON NOIRS RENCONTRES JUSQU'A 'SXC'.
         LYI         0               < COMPTAGE DES NOIRS...
RAY3:    EQU         $
         LA          XS              < AU POINT PRECEDENT :
         SB          XA8
         STA         XS
         CP          SXC             < EST-CE LE POINT COURANT ???
         JLE         RAY4            < OUI, FIN DE LA RECHERCHE A DROITE...
         BSR         ASPGPS          < NON, TEST DU POINT (XS,YS) :
         ADRI        1,Y             < A PRIORI...
         JAE         RAY3            < IL EST NOIR, ON L'IGNORE...
         ADRI        -1,Y            < CORRECTION...
         ADRI        1,X             < ET ON LE COMPTE...
         JMP         RAY3            < VERS LE POINT PRECEDENT...
RAY4:    EQU         $
         LR          X,A             < (A)=NOMBRE DE POINTS NON NOIRS...
         FLT
         FST         FXD             < CE QUI DONNE LE 'G' HORIZONTAL DROITE...
<
< RECHERCHE DE 'G' VERTICAL HAUT :
<
         LA          SXC
         STA         XS              < RESTAURE 'XS'...
RAY20:   EQU         $               < CAS OU LES 'G' HORIZONTAUX NE SONT PAS
                                     < A CALCULER...
         LAI         -1
         STA         YS              < INITIALISATION POINT DE DEPART.
         LXI         0               < INITIALISATION DU COMPTAGE DE POINTS
                                     < NON NOIRS RECONTRES JUSQU'A 'SYC'.
         LYI         0               < COMPTAGE DES POINTS NOIRS...
RAY5:    EQU         $
         LA          YS              < AU POINT SUIVANT :
         AD          XA9
         STA         YS
         CP          SYC             < EST-CE LE POINT COURANT ???
         JGE         RAY6            < OUI, FIN DE LA RECHERCHE EN HAUT...
         BSR         ASPGPS          < NON, TEST DU POINT (XS,YS) :
         ADRI        1,Y             < A PRIORI...
         JAE         RAY5            < IL EST NOIR, ON L'IGNORE...
         ADRI        -1,Y            < CORRECTION...
         ADRI        1,X             < ET ON LE COMPTE...
         JMP         RAY5            < VERS LE POINT SUIVANT...
RAY6:    EQU         $
         LR          X,A             < (A)=NOMBRE DE POINTS NON NOIRS...
         FLT
         FST         FYG             < CE QUI DONNE LE 'G' VERTICAL HAUT...
<
< RECHERCHE DU 'G' VERTICAL BAS :
<
         LAI         NLIGM1
         ADRI        1,A
         STA         YS              < INITIALISATION DU POINT DE DEPART.
         LXI         0               < INITIALISATION DU COMPTAGE DE POINTS
                                     < NON NOIRS RENCONTRES JUSQU'A 'SYC'.
         LYI         0               < COMPTAGE DES POINTS NOIRS...
RAY7:    EQU         $
         LA          YS              < AU POINT PRECEDENT :
         SB          XA9
         STA         YS
         CP          SYC             < EST-CE LE POINT COURANT ???
         JLE         RAY8            < OUI, FIN DE LA RECHERCHE EN BAS...
         BSR         ASPGPS          < NON, TEST DU POINT (XS,YS) :
         ADRI        1,Y             < A PRIORI...
         JAE         RAY7            < IL EST NOIR, ON L'IGNORE...
         ADRI        -1,Y            < CORRECTION...
         ADRI        1,X             < ET ON LE COMPTE...
         JMP         RAY7            < VERS LE POINT PRECEDENT...
RAY8:    EQU         $
         LR          X,A             < (A)=NOMBRE DE POINTS NON NOIRS...
         FLT
         FST         FYD             < CE QUI DONNE LE 'G' VERTICAL BAS...
<
< RESTAURATION DU POINT COURANT :
<
         LA          SYC
         STA         YS
<
< RETOUR A TV1 :
<
         STZ         XCTCDA
<
< CALCUL DE L'AMPLITUDE :
<
         FLD         FXG
         FMP         FXD
         FMP         XA6             < SCALING...
         FMP         FYG
         FMP         FYD
         FMP         XA7             < SCALING...
         RSR
         NLS
XWOR%9:  VAL         0
         LST
:F
:F
< <<'SIOP RAYON 2'
DF'SIOP RAYON CHAMP 1'
ED'SIOP RAYON CHAMP 1'
IN0
         NLS
         IDP         "SIOP RAYON CHAMP 1"
<        R A Y O N   C H A M P   1  :
         IF          XXXRDN-1,XWOR%9,,XWOR%9
         LST
A0::     VAL         0               < AMPLIFICATEUR DE LA FONCTION MONTA-
                                     < GNEUSE F(XR,YR).
A1::     VAL         A0+1            < DEPLACEMENT SUR L'AXE DES 'X', A LA
                                     < CHARGE DU MODULE APPELANT...
A2::     VAL         A1+1            < DEPLACEMENT SUR L'AXE DES 'Y', A LA
                                     < CHARGE DU MODULE APPELANT...
A3::     VAL         A2+1            < AMPLIFICATEUR DES VALEURS ALEATOIRES
                                     < CORRELEES.
A4::     VAL         A3+1            < INUTILISE...
A5::     VAL         A4+1            < VALEUR MOYENNE DE LA FONCTION MONTA-
                                     < GNEUSE : A5+A0*F(XR,YR).
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-2,XWOR%9,,XWOR%9
         LST
<
< INDICATEUR DE PREMIER PASSAGE :
<
PREM:    WORD        0               < =0 : PREMIER PASSAGE,
                                     < #0 : PASSAGES SUIVANTS.
<
< VARIABLES MONTAGNEUSES :
<
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
GINCU:   FLOAT       0               < RESIDU DE L'ABSCISSE,
GINCV:   FLOAT       0               < RESIDU DE L'ORDONNEE.
GNIV1:   FLOAT       0               < SIGMA PONDERE DES NIVEAUX DE LA SPIRALE
                                     < CENTREE EN (XS,YS),
GNIV2:   FLOAT       0               < DE MEME EN (XS+1,YS),
GNIV3:   FLOAT       0               < DE MEME EN (XS+1,YS+1),
GNIV4:   FLOAT       0               < DE MEME EN (XS,YS+1).
FA0:     FLOAT       0               < CONSTANTE 'A0',
FA3:     FLOAT       0               < AMPLIFICATEUR DES VALEURS ALEATOIRES
                                     < CORRELEES...
FA5:     FLOAT       0               < ET 'A5'.
<
< TRANSLATION SUR OX ET OY :
<
XFA1:    FLOAT       0               < 'OX',
XFA2:    FLOAT       0               < ET 'OY'...
<
< RELAIS MONTAGNEUX :
<
ASPIR:   WORD        SPIR            < CALCUL DU SIGMA SUR UNE SPIRALE...
ARAYON:  WORD        RAYON           < CALCUL DE LA FONCTION COURANTE.
ARAYO1:  WORD        RAYON1          < RELAI...
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-3,XWOR%9,,XWOR%9
         LST
<
< AMPLIFICATEUR DE LA VARIATION DU RAYON
< ET VALEUR MINIMALE DE CELUI-CI :
<
         LXI         A0
         BSR         ASPCT
         FST         FA0
         LXI         A5
         BSR         ASPCT
         FST         FA5
         LXI         A3
         BSR         ASPCT
         FST         FA3
<
< TRANSLATION SUR OX ET OY :
<
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-4,XWOR%9,,XWOR%9
         LST
<
<
<        C A L C U L   D U   R A Y O N  :
<
<
<        ARGUMENT :
<                    (A,B)=FONCTION COURANTE.
<
<
<        RESULTAT :
<                    (A,B)=(A5+A0*F(XR,YR))*(FONCTION COURANTE).
<
<
RAYON:   EQU         $
         FCMZ        FA0             < LA CONSTANTE MULTIPLICATIVE EST-ELLE
                                     < NULLE ???
         JNE         RAYON2          < NON, ON Y VA...
         BR          ARAYO1          < OUI, RIEN A FAIRE...
RAYON2:  EQU         $
         PSR         A,B             < SAVE LE CUMUL INITIAL...
<
< CALCUL DU POINT COURANT ET
< POSITION DANS UN CARRE DE
< COORDONNEES ENTIERES :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         FLT
         FAD         FWORK
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         FIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         FLT
         FSB         GXS
         FNEG
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         FLT
         FAD         FWORK
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
         FIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         FLT
         FSB         GYS
         FNEG
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         BSR         ASPIR
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ASPIR
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ASPIR
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ASPIR
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         GNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         GINCU
         FMP         FWORK2
         FMP         GNIV2
         FAD         FWORK
         FST         FWORK           < +FU*(1-FV)*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         FAD         FWORK
         FST         FWORK           < +FU*FV*N3,
         FLD         FWORK1
         FMP         GINCV
         FMP         GNIV4
         FAD         FWORK           < +(1-FU)*FV*N4,
<
< CALCUL DE LA FONCTION COURANTE :
<
         FMP         FA0             < AMPLIFICATION,
         FAD         FA5             < ET TRANSLATION.
         FST         FWORK           < RAYON=FA5+FA0*F(XR,YR).
         PLR         A,B             < RESTAURATION DU CUMUL,
         FMP         FWORK           < ET CALCUL DE LA FONCTION COURANTE...
<
< RETOUR :
<
RAYON1:  EQU         $
         RSR
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         $
         LA          YS
         SWBR        A,A
         OR          XS
         LYI         YLOAD
         BSR         AGZB            < ACCES A LA VALEUR DU TABLEAU ALEATOIRE
                                     < CORRELEE ASSOCIEE AU POINT (YS,XS),
         LR          B,A             < QUE L'ON MET DANS 'A',
         FLT
         FMP         FA3             < QUE L'ON NORMALISE...
         RSR
         NLS
XWOR%9:  VAL         0
         LST
:F
:F
< <<'SIOP RAYON CHAMP 1'
DF'SIOP RAYON CHAMP 2'
ED'SIOP RAYON CHAMP 2'
IN0
         NLS
         IDP         "SIOP RAYON CHAMP 2"
<        R A Y O N   C H A M P   2  :
         IF          XXXRDN-1,XWOR%9,,XWOR%9
         LST
A0::     VAL         0               < AMPLIFICATEUR DE LA FONCTION MONTA-
                                     < GNEUSE F(XR,YR).
A1::     VAL         A0+1            < DEPLACEMENT SUR L'AXE DES 'X', A LA
                                     < CHARGE DU MODULE APPELANT...
A2::     VAL         A1+1            < DEPLACEMENT SUR L'AXE DES 'Y', A LA
                                     < CHARGE DU MODULE APPELANT...
A3::     VAL         A2+1            < AMPLIFICATEUR DES VALEURS ALEATOIRES
                                     < CORRELEES.
A4::     VAL         A3+1            < INUTILISE...
A5::     VAL         A4+1            < VALEUR MOYENNE DE LA FONCTION MONTA-
                                     < GNEUSE : A5+A0*F(XR,YR).
A10::    VAL         '10             < BORNE SUP(RDN),
A11::    VAL         A10+1           < BORNE INF(RDN),
A12::    VAL         A11+1           < MULTIPLICATEUR(RDN).
A13::    VAL         A12+1           < INUTILISE...
A14::    VAL         A13+1           < PAS EN 'X' DE LA GRILLE DE DEPART,
A15::    VAL         A14+1           < PAS EN 'Y' DE LA GRILLE DE DEPART.
A16::    VAL         A15+1           < PARAMETRE DE DEFINITION DU GENERATEUR
                                     < ALEATOIRE...
A17::    VAL         A16+1           < NOMBRE DE RECURSION MAX LORS DE LA SOM-
                                     < MATION DES FONCTIONS ALEATOIRES.
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-2,XWOR%9,,XWOR%9
         LST
<
< INDICATEUR DE PREMIER PASSAGE :
<
PREM:    WORD        0               < =0 : PREMIER PASSAGE,
                                     < #0 : PASSAGES SUIVANTS.
<
< VARIABLES MONTAGNEUSES :
<
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
GINCU:   FLOAT       0               < RESIDU DE L'ABSCISSE,
GINCV:   FLOAT       0               < RESIDU DE L'ORDONNEE.
GNIV1:   FLOAT       0               < SIGMA PONDERE DES NIVEAUX DE LA SPIRALE
                                     < CENTREE EN (XS,YS),
GNIV2:   FLOAT       0               < DE MEME EN (XS+1,YS),
GNIV3:   FLOAT       0               < DE MEME EN (XS+1,YS+1),
GNIV4:   FLOAT       0               < DE MEME EN (XS,YS+1).
FA0:     FLOAT       0               < CONSTANTE 'A0',
FA3:     FLOAT       0               < AMPLIFICATEUR DES VALEURS ALEATOIRES
                                     < CORRELEES...
FA5:     FLOAT       0               < ET 'A5'.
FCUMR:   FLOAT       0               < SIGMA DES FONCTIONS ALEATOIRES
                                     < SCALANTES.
FPOND:   FLOAT       0               < POUR LES PONDERER...
FPOND0:: FLOAT       0               < VALEUR INITIALE DE LA PONDERATION :
                                     < FPOND0=RAC(PASIX*PASIY).
<
< TRANSLATION SUR OX ET OY :
<
XFA1:    FLOAT       0               < 'OX',
XFA2:    FLOAT       0               < ET 'OY'...
<
< RELAIS MONTAGNEUX :
<
ASPIR:   WORD        SPIR            < CALCUL DU SIGMA SUR UNE SPIRALE...
ARAYON:  WORD        RAYON           < CALCUL DE LA FONCTION COURANTE.
ARAYO1:  WORD        RAYON1          < RELAI...
<
< DEFINITION DE LA GRILLE :
<
PASIX:   WORD        0               < PAS SUR OX,
PASIY:   WORD        0               < PAS SUR OY.
XNOEUD:  WORD        0               < X(NOEUD HAUT-GAUCHE) DE LA MAILLE,
YNOEUD:  WORD        0               < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE.
POINTM:  WORD        0               < POINT COURANT DANS LA MAILLE SOUS LA
                                     < FORME (Y,X).
AFNIV1:  FLOAT       0
AFNIV2:  FLOAT       0
AFNIV3:  FLOAT       0
AFNIV4:  FLOAT       0
XA17:    WORD        0               < PARAMETRE 'A17'.
<
< PARAMETRES DU GENERATEUR ALEATOIRE :
<
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
XA16:    WORD        0               < PARAMETRE VARIABLE...
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
XA0010:  WORD        0               < BORNE SUPERIEURE,
XA0011:  WORD        0               < BORNE INFERIEURE...
FMUL:    FLOAT       0               < MULTIPLICATEUR...
INFIN1:  FLOAT       32768
INFIN2:  FLOAT       16384           < INFINI/2...
FWORK4:  FLOAT       0
FWORK5:  FLOAT       0
HINCU:   FLOAT       0               < POUR
HINCV:   FLOAT       0               <      INTERPOLER...
<
< RELAIS DE SOUS-PROGRAMMES :
<
BINTER:  WORD        QINTER          < MODULE D'INTERPOLATION...
AQWORK:  WORD        PWORK           < 'FAD FWORK', PUIS 'FST FWORK'...
ARDN:    WORD        SQRDN           < GENERATEUR ALEATOIRE.
APRDN:   WORD        PRDN            < CALCUL D'UNE VALEUR ALEATOIRE SUR LA
                                     < GRILLE COURANTE...
ASP1:    WORD        SP1             < APPEL DE 'RDN' ET FLOTTAISON...
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-3,XWOR%9,,XWOR%9
         LST
<
< AMPLIFICATEUR DE LA VARIATION DU RAYON
< ET VALEUR MINIMALE DE CELUI-CI :
<
         LXI         A0
         BSR         ASPCT
         FST         FA0
         LXI         A5
         BSR         ASPCT
         FST         FA5
         LXI         A3
         BSR         ASPCT
         FST         FA3
<
< TRANSLATION SUR OX ET OY :
<
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
<
< ENTREE DES PARAMETRES
< DE GENERATION ALEATOIRE :
<
         LXI         A10
         BSR         ASPCT
         FIX
         STA         XA0010          < BORNE SUPERIEURE,
         LXI         A11
         BSR         ASPCT
         FIX
         STA         XA0011          < ET BORNE INFERIEURE...
         LXI         A12
         BSR         ASPCT
         FCAZ
         JLE         $               < ????!?!
         FST         FMUL
         LXI         A16
         BSR         ASPCT
         BSR         AROND
         STA         XA16            < PARAMETRE D'INITIALISATION...
<
< ENTREE DE LA GRILLE :
<
         LXI         A14
         BSR         ASPCT
         FMP         FK              < POUR AVOIR UNE GENERATION SCALANTE...
         BSR         AROND
         JALE        $               < ???
         STA         PASIX           < PAS EN 'X',
         FLT
         FST         FWORK5
         LXI         A15
         BSR         ASPCT
         FMP         FK              < POUR AVOIR UNE GENERATION SCALANTE...
         BSR         AROND
         JALE        $               < ???
         STA         PASIY           < ET PAS EN 'Y'...
         FLT
         FMP         FWORK5          < CALCUL DE LA SUPERFICIE DE LA MAILLE...
         BSR         ARAC
         FST         FPOND0          < LA PONDERATION INITIALE DES FONCTIONS
                                     < ALEATOIRES EST EN FAIT LA TAILLE DE LA
                                     < MAILLE...
         LXI         A17
         BSR         ASPCT
         BSR         AROND
         JALE        $               < ?!?!???
         STA         XA17            < NOMBRE DE RECURSION MAX LORS DE LA
                                     < SOMMATION DES FONCTIONS ALEATOIRES.
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-4,XWOR%9,,XWOR%9
         LST
<
<
<        I N T E R P O L A T I O N  :
<
<
<        NOTA :
<                      ON N'UTILISE PAS 'PINTER' DE
<                    'SI  +', CAR CELUI-CI UTILISE
<                    LA BASE 'L' POUR APPELER LE
<                    SOUS-PROGRAMME 'PWORK' !!!
<
<
QINTER:  EQU         $
         FLD         F1
         FSB         HINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         HINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         AFNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         HINCU
         FMP         FWORK2
         FMP         AFNIV2
         BSR         AQWORK          < +FU*(1-FV)*N2,
         FLD         HINCU
         FMP         HINCV
         FMP         AFNIV3
         BSR         AQWORK          < +FU*FV*N3,
         FLD         FWORK1
         FMP         HINCV
         FMP         AFNIV4
         BSR         AQWORK          < +(1-FU)*FV*N4,
         RSR
<
<
<        C A L C U L   D E   R D N ( X S , Y S )  :
<
<
<        ARGUMENT :
<                    (XS,YS)=POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=VALEUR ALEATOIRE ASSOCIEE A (XS,YS)
<                          ISSUE DIRECTEMENT DE 'RDN' SI (XS,YS)
<                          EST UN NOEUD DE LA GRILLE COURANTE,
<                          ET UNE VALEUR INTERPOLEE SINON...
<
<
PRDN:    EQU         $
         PSR         X,Y
         LX          XS              < PLACONS NOUS AU
         LY          YS              < POINT COURANT...
         PSR         X,Y             < ET SAVE...
         SWBR        Y,A
         ORR         X,A
         STA         POINTM          < POINT COURANT (Y,X).
         LR          X,A
         SARD        NBITMO
         DV          PASIX
         MP          PASIX
         STB         XNOEUD          < X(NOEUD HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE,
         LR          Y,A
         SARD        NBITMO
         DV          PASIY
         MP          PASIY
         STB         YNOEUD          < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE.
         LA          XS
         CP          XNOEUD          < EST-ON EN UN NOEUD ???
         JNE         SPU31           < NON...
         LA          YS              < PEUT-ETRE :
         CP          YNOEUD          < EST-ON EN UN NOEUD ???
         JNE         SPU31           < NON, INTERPOLONS...
         BSR         ASP1            < LE POINT COURANT EST UN NOEUD...
         JMP         SPU30           < VERS L'ACCES A LA VALEUR DU NOEUD...
SPU31:   EQU         $
         LA          PASIX
         FLT
         FST         FWORK
         LR          X,A
         SB          XNOEUD          < X-XNOEUD,
         FLT
         FDV         FWORK           < (X-XNOEUD)/PASIX,
         FST         HINCU           < DISTANCE NORMALISEE A 1 LE LONG DE OX,
                                     < DU POINT COURANT AU NOEUD DE LA MAILLE.
         LA          PASIY
         FLT
         FST         FWORK
         LR          Y,A
         SB          YNOEUD          < Y-YNOEUD,
         FLT
         FDV         FWORK           < (Y-YNOEUD)/PASIY,
         FST         HINCV           < DISTANCE NORMALISEE A 1 LE LONG DE OY,
                                     < DU POINT COURANT AU NOEUD DE LA MAILLE.
         LX          XNOEUD
         LY          YNOEUD
         STX         XS              < ON SE PLACE AU NOEUD
         STY         YS              < HAUT-GAUCHE DE LA MAILLE...
         LBI         0               < PREMIER NOEUD :
         BSR         ASP1
         FST         AFNIV1          < NIVEAU(XNOEUD,YNOEUD),
         LA          XS
         AD          PASIX
         STA         XS
         LBI         1               < DEUXIEME NOEUD :
         BSR         ASP1
         FST         AFNIV2          < NIVEAU(XNOEUD+PASIX,YNOEUD),
         LA          YS
         AD          PASIY
         STA         YS
         LBI         2               < TROISIEME NOEUD :
         BSR         ASP1
         FST         AFNIV3          < NIVEAU(XNOEUD+PASIX,YNOEUD+PASIY),
         LA          XS
         SB          PASIX
         STA         XS
         LBI         3               < QUATRIEME NOEUD :
         BSR         ASP1
         FST         AFNIV4          < NIVEAU(XNOEUD,YNOEUD+PASIY).
         BSR         BINTER          < ET INTERPOLATION...
<
< SORTIE :
<
SPU30:   EQU         $
         PLR         X,Y
         STY         YS              < RESTAURE
         STX         XS              <          LE POINT COURANT...
         PLR         X,Y
         RSR
<
<
<        A C C E S   R D N  :
<
<
SP1:     EQU         $
         BSR         ARDN
         FLT
         RSR                         < FACILE...
<
<
<        G E N E R A T E U R   A L E A T O I R E  :
<
<
SPRDN:   EQU         $
SPRDN1:  EQU         $
         LA          RDN             < GENERATION DE NOMBRES ALEATOIRES :
         EOR         POINTS          < ON INTRODUIT UN AUTRE PARAMETRE...
         EOR         MCDAR
         MP          RDN1
         SCRD        RDN3
         JANE        SPMOYC
         LR          B,A
         JANE        SPMOYC
         LA          F1              < REINITIALISATION...
         EOR         XS
         AD          F1+1            < ????
         AD          RDN2
SPMOYC:  EQU         $
         STA         RDN
         LA          RDN4            < CALCUL D'UN 2EME NOMBRE ALEATOIRE...
         MP          RDN5
         EOR         POINTS
         EOR         MCDAV
         SCRD        RDN6
         JANE        SPMOYF
         LR          B,A
         JANE        SPMOYF
         LA          F1
         EOR         YS
         EOR         F1+1
         AD          RDN2
SPMOYF:  EQU         $
         STA         RDN4
         EOR         MCDAB
         EOR         RDN
SPRDN2:  EQU         $
         FLT
         FMP         F05             < RDN/2,
         PSR         A,B             < SAVE RDN/2...
         FAD         INFIN2          < (RDN+INFINI)/2,
         FST         FWORK4
         LA          XA0010          < BORNE SUPERIEURE,
         FLT
         FMP         FWORK4
         FST         FWORK4
         PLR         A,B             < RDN/2,
         FSB         INFIN2          < (RDN-INFINI)/2,
         FST         FWORK5
         LA          XA0011          < BORNE INFERIEURE,
         FLT
         FMP         FWORK5
         FST         FWORK5
         FLD         FWORK4
         FSB         FWORK5
         FDV         INFIN1          < MISE A L'ECHELLE...
         FIX
         CP          XA0010          < ???
         JG          SPRDN3          < ERREUR...
         CP          XA0011          < ???
         JL          SPRDN3          < ERREUR...
         FLT
         FMP         FMUL
         BSR         AROND           < (A)=NOMBRE ALEATOIRE ENTIER...
         PLR         B
         RSR
SPRDN3:  EQU         $
         QUIT        1
         JMP         SPRDN2
<
<
<        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  :
<
<
SQRDN:   EQU         $
         PSR         B
         LA          YS
         SWBR        A,A
         OR          XS              < ON FORME UNE COMBINAISON BIUNIVOQUE
                                     < DE XS ET YS...
         AD          RDN1
         PSR         A               < SAVE F(XS,YS),
         LA          PASIX
         FLT
         FST         FWORK5
         LA          PASIY
         FLT
         FMP         FWORK5
         FDV         FK              < AFIN D'AVOIR UNE FONCTION
         FDV         FK              <                           SCALANTE...
         SCRD        RDN6
         EORR        A,B             < (B)=G(PASIX,PASIY)
         PLR         A               < (A)=F(XS,YS),
         EORR        B,A             < (A)=H(XS,YS,PASIX,PASIY)...
         EOR         XA16            < PARAMETRE VARIABLE...
         FLT                         < INITIALISATION DU GENERATEUR...
         BSR         ASIN            < DONT ON PREND LE SINUS...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
         JMP         SPRDN2          < QUE L'ON CONSIDERE ENTIER...
<
<
<        C A L C U L   D U   R A Y O N  :
<
<
<        ARGUMENT :
<                    (A,B)=FONCTION COURANTE.
<
<
<        RESULTAT :
<                    (A,B)=(A5+A0*F(XR,YR))*(FONCTION COURANTE).
<
<
RAYON:   EQU         $
         FCMZ        FA0             < LA CONSTANTE MULTIPLICATIVE EST-ELLE
                                     < NULLE ???
         JNE         RAYON2          < NON, ON Y VA...
         BR          ARAYO1          < OUI, RIEN A FAIRE...
RAYON2:  EQU         $
         PSR         A,B             < SAVE LE CUMUL INITIAL...
<
< CALCUL DU POINT COURANT ET
< POSITION DANS UN CARRE DE
< COORDONNEES ENTIERES :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         FLT
         FAD         FWORK
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         FIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         FLT
         FSB         GXS
         FNEG
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         FLT
         FAD         FWORK
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
         FIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         FLT
         FSB         GYS
         FNEG
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         BSR         ASPIR
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ASPIR
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ASPIR
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ASPIR
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         GNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         GINCU
         FMP         FWORK2
         FMP         GNIV2
         FAD         FWORK
         FST         FWORK           < +FU*(1-FV)*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         FAD         FWORK
         FST         FWORK           < +FU*FV*N3,
         FLD         FWORK1
         FMP         GINCV
         FMP         GNIV4
         FAD         FWORK           < +(1-FU)*FV*N4,
<
< CALCUL DE LA FONCTION COURANTE :
<
         FMP         FA0             < AMPLIFICATION,
         FAD         FA5             < ET TRANSLATION.
         FST         FWORK           < RAYON=FA5+FA0*F(XR,YR).
         PLR         A,B             < RESTAURATION DU CUMUL,
         FMP         FWORK           < ET CALCUL DE LA FONCTION COURANTE...
<
< RETOUR :
<
RAYON1:  EQU         $
         RSR
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         $
<
< INITIALISATION ET SAUVEGARDES :
<
         LA          PASIX
         LB          PASIY
         PSR         A,B,X           < SAUVEGARDE DE (PASIX,PASIY)...
         FLD         F0
         FST         FCUMR           < INITIALISATION DU CUMUL DES FONCTIONS
                                     < ALEATOIRES SCALANTES...
         FLD         FPOND0
         FST         FPOND           < INITIALISATOON DE LA PONDERATTION DES
                                     < FONCTIONS ALEATOIRES...
<
< ITERATION POUR CHAQUE
< FONCTION ALEATOIRE :
<
         LX          XA17            < (X)=NOMBRE D'ITERATIONS MAX...
SPIR1:   EQU         $
MAILLE:: VAL         1               < PLUS PETITE MAILLE...
         LA          PASIX
         CPI         MAILLE          < A-T'ON ATTEINT LA DEFINITION DE L'ECRAN ?
         JG          SPIR2           < NON, ON SCALE...
         LA          PASIY
         CPI         MAILLE          < ALORS ???
         JLE         SPIR3           < OUI, ON EST SUR UNE MAILLE (1,1), ON
                                     < A FINI LA RECURSION...
SPIR2:   EQU         $
         BSR         APRDN           < (A,B)=VALEUR ALEATOIRE ASSOCIEE AU
                                     < POINT (XS,YS) ET A LA GRILLE COURANTE
                                     < (PASIX,PASIY)...
         FMP         FPOND
         FDV         FPOND0          < ET ON LA PONDERE PAR FPOND/FPOND0,
                                     < 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...
         FLD         FPOND
         BSR         ARAC
         FST         FPOND           < DECROISSANCE DES AMPLITUDES DES FONCTIONS
                                     < ALEATOIRES...
         LA          PASIX
         FLT
         BSR         ARAC            < ON REDUIT LA MAILLE, PAR :
                                     < MAILLE=RAC(MAILLE)...
         BSR         AROND
         STA         PASIX
         LA          PASIY
         FLT
         BSR         ARAC
         BSR         AROND
         STA         PASIY
         JDX         SPIR1           < ET ON ITERE JUSQU'A ATTEINDRE LA
                                     < DEFINITION DE L'ECRAN OU LE MAX DES
                                     < ITERATIONS...
<
< FIN DE RECURSION :
<
SPIR3:   EQU         $
         PLR         A,B,X           < ON RESTAURE
         STB         PASIY           < LA GRILLE
         STA         PASIX           < INITIALE...
         FLD         FCUMR           < ET ON RENVOIE LA SOMME DES
                                     < FONCTIONS ALEATOIRES...
         FMP         FA3             < QUE L'ON NORMALISE...
         RSR
         NLS
XWOR%9:  VAL         0
         LST
:F
:F
< <<'SIOP RAYON CHAMP 2'
DF'SIOP RAYON CHAMP 3'
ED'SIOP RAYON CHAMP 3'
IN0
         NLS
         IDP         "SIOP RAYON CHAMP 3"
<        R A Y O N   C H A M P   3  :
         IF          XXXRDN-1,XWOR%9,,XWOR%9
         LST
A0::     VAL         0               < AMPLIFICATEUR DE LA FONCTION MONTA-
                                     < GNEUSE F(XR,YR).
A1::     VAL         A0+1            < DEPLACEMENT SUR L'AXE DES 'X', A LA
                                     < CHARGE DU MODULE APPELANT...
A2::     VAL         A1+1            < DEPLACEMENT SUR L'AXE DES 'Y', A LA
                                     < CHARGE DU MODULE APPELANT...
A3::     VAL         A2+1            < AMPLIFICATEUR DES VALEURS ALEATOIRES
                                     < CORRELEES.
A4::     VAL         A3+1            < INUTILISE...
A5::     VAL         A4+1            < VALEUR MOYENNE DE LA FONCTION MONTA-
                                     < GNEUSE : A5+A0*F(XR,YR).
A10::    VAL         '10             < BORNE SUP(RDN),
A11::    VAL         A10+1           < BORNE INF(RDN),
A12::    VAL         A11+1           < MULTIPLICATEUR(RDN).
A13::    VAL         A12+1           < INUTILISE...
A14::    VAL         A13+1           < PAS EN 'X' DE LA GRILLE DE DEPART,
A15::    VAL         A14+1           < PAS EN 'Y' DE LA GRILLE DE DEPART.
A16::    VAL         A15+1           < PARAMETRE DE DEFINITION DU GENERATEUR
                                     < ALEATOIRE...
A17::    VAL         A16+1           < NOMBRE DE RECURSION MAX LORS DE LA SOM-
                                     < MATION DES FONCTIONS ALEATOIRES.
A18::    VAL         A17+1           < FACTEUR D'ECHELLE DES COORDONNEES...
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-2,XWOR%9,,XWOR%9
         LST
<
< INDICATEUR DE PREMIER PASSAGE :
<
PREM:    WORD        0               < =0 : PREMIER PASSAGE,
                                     < #0 : PASSAGES SUIVANTS.
<
< VARIABLES MONTAGNEUSES :
<
XA18:    FLOAT       0               < FACTEUR D'ECHELLE LOCAL DES COORDONNEES
                                     < ENVOYEES PAR ' +'...
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
GINCU:   FLOAT       0               < RESIDU DE L'ABSCISSE,
GINCV:   FLOAT       0               < RESIDU DE L'ORDONNEE.
GNIV1:   FLOAT       0               < SIGMA PONDERE DES FONCTIONS ALEATOIRES
                                     < CENTREE EN (XS,YS),
GNIV2:   FLOAT       0               < DE MEME EN (XS+1,YS),
GNIV3:   FLOAT       0               < DE MEME EN (XS+1,YS+1),
GNIV4:   FLOAT       0               < DE MEME EN (XS,YS+1).
FA0:     FLOAT       0               < CONSTANTE 'A0',
FA3:     FLOAT       0               < AMPLIFICATEUR DES VALEURS ALEATOIRES
                                     < CORRELEES...
FA5:     FLOAT       0               < ET 'A5'.
FCUMR:   FLOAT       0               < SIGMA DES FONCTIONS ALEATOIRES
                                     < SCALANTES.
FPOND:   FLOAT       0               < POUR LES PONDERER...
FPOND0:: FLOAT       0               < VALEUR INITIALE DE LA PONDERATION :
                                     < FPOND0=RAC(PASIX*PASIY).
<
< TRANSLATION SUR OX ET OY :
<
XFA1:    FLOAT       0               < 'OX',
XFA2:    FLOAT       0               < ET 'OY'...
<
< RELAIS MONTAGNEUX :
<
ARCRD:   WORD        RCRD            < CALCUL DU SIGMA SUR UNE RCRDALE...
ARAYON:  WORD        RAYON           < CALCUL DE LA FONCTION COURANTE.
ARAYO1:  WORD        RAYON1          < RELAI...
<
< DEFINITION DE LA GRILLE :
<
PASIX:   WORD        0               < PAS SUR OX,
PASIY:   WORD        0               < PAS SUR OY.
FPASIX:  FLOAT       0               < DE MEME
FPASIY:  FLOAT       0               <         EN FLOTTANT...
XNOEUD:  WORD        0               < X(NOEUD HAUT-GAUCHE) DE LA MAILLE,
YNOEUD:  WORD        0               < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE.
AFNIV1:  FLOAT       0
AFNIV2:  FLOAT       0
AFNIV3:  FLOAT       0
AFNIV4:  FLOAT       0
XA17:    WORD        0               < PARAMETRE 'A17'.
KITER:   WORD        0               < COMPTAGE DES RECURSIONS...
<
< PARAMETRES DU GENERATEUR ALEATOIRE :
<
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
XA16:    WORD        0               < PARAMETRE VARIABLE...
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
XA0010:  WORD        0               < BORNE SUPERIEURE,
XA0011:  WORD        0               < BORNE INFERIEURE...
FMUL:    FLOAT       0               < MULTIPLICATEUR...
INFIN1:  FLOAT       32768
INFIN2:  FLOAT       16384           < INFINI/2...
FWORK4:  FLOAT       0
FWORK5:  FLOAT       0
HINCU:   FLOAT       0               < POUR
HINCV:   FLOAT       0               <      L'INTERPOLATION...
<
< RELAIS DE SOUS-PROGRAMMES :
<
BINTER:  WORD        QINTER          < MODULE D'INTERPOLATION...
AQWORK:  WORD        PWORK           < 'FAD FWORK', PUIS 'FST FWORK'...
ARDN:    WORD        SQRDN           < GENERATEUR ALEATOIRE.
APRDN:   WORD        PRDN            < CALCUL D'UNE VALEUR ALEATOIRE SUR LA
                                     < GRILLE COURANTE...
ASP1:    WORD        SP1             < APPEL DE 'RDN' ET FLOTTAISON...
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-3,XWOR%9,,XWOR%9
         LST
<
< AMPLIFICATEUR DE LA VARIATION DU RAYON
< ET VALEUR MINIMALE DE CELUI-CI :
<
         LXI         A0
         BSR         ASPCT
         FST         FA0
         LXI         A5
         BSR         ASPCT
         FST         FA5
         LXI         A3
         BSR         ASPCT
         FST         FA3
<
< TRANSLATION SUR OX ET OY :
<
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
<
< ENTREE DES PARAMETRES
< DE GENERATION ALEATOIRE :
<
         LXI         A10
         BSR         ASPCT
         FIX
         STA         XA0010          < BORNE SUPERIEURE,
         LXI         A11
         BSR         ASPCT
         FIX
         STA         XA0011          < ET BORNE INFERIEURE...
         LXI         A12
         BSR         ASPCT
         FCAZ
         JLE         $               < ????!?!
         FST         FMUL
         LXI         A16
         BSR         ASPCT
         BSR         AROND
         STA         XA16            < PARAMETRE D'INITIALISATION...
<
< ENTREE DE LA GRILLE :
<
         LXI         A18
         BSR         ASPCT
         FCAZ
         JLE         $               < ??!?!??!
         FST         XA18            < FCATEUR D'ECHELLE LOCAL...
         LXI         A14
         BSR         ASPCT
         FMP         XA18            < POUR AVOIR UNE GENERATION SCALANTE...
         BSR         AROND
         JALE        $               < ???
         STA         PASIX           < PAS EN 'X',
         FLT
         FST         FWORK5          < FWORK5=PASIX...
         LXI         A15
         BSR         ASPCT
         FMP         XA18            < POUR AVOIR UNE GENERATION SCALANTE...
         BSR         AROND
         JALE        $               < ???
         STA         PASIY           < ET PAS EN 'Y'...
         FLT
         FMP         FWORK5          < 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...
         LXI         A17
         BSR         ASPCT
         BSR         AROND
         JALE        $               < ?!?!???
         STA         XA17            < NOMBRE DE RECURSION MAX LORS DE LA
                                     < SOMMATION DES FONCTIONS ALEATOIRES.
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-4,XWOR%9,,XWOR%9
         LST
<
<
<        I N T E R P O L A T I O N  :
<
<
<        NOTA :
<                      ON N'UTILISE PAS 'PINTER' DE
<                    'SI  +', CAR CELUI-CI UTILISE
<                    LA BASE 'L' POUR APPELER LE
<                    SOUS-PROGRAMME 'PWORK' !!!
<
<
QINTER:  EQU         $
         FLD         F1
         FSB         HINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         HINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         AFNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         HINCU
         FMP         FWORK2
         FMP         AFNIV2
         BSR         AQWORK          < +FU*(1-FV)*N2,
         FLD         HINCU
         FMP         HINCV
         FMP         AFNIV3
         BSR         AQWORK          < +FU*FV*N3,
         FLD         FWORK1
         FMP         HINCV
         FMP         AFNIV4
         BSR         AQWORK          < +(1-FU)*FV*N4,
         RSR
<
<
<        C A L C U L   D E   R D N ( X S , Y S )  :
<
<
<        ARGUMENT :
<                    (XS,YS)=POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=VALEUR ALEATOIRE ASSOCIEE A (XS,YS)
<                          ISSUE DIRECTEMENT DE 'RDN' SI (XS,YS)
<                          EST UN NOEUD DE LA GRILLE COURANTE,
<                          ET UNE VALEUR INTERPOLEE SINON...
<
<
PRDN:    EQU         $
         PSR         X,Y
         LX          XS              < PLACONS NOUS AU
         LY          YS              < POINT COURANT...
         PSR         X,Y             < ET SAVE...
         LR          X,A
         SARD        NBITMO
         DV          PASIX
         MP          PASIX
         STB         XNOEUD          < X(NOEUD HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE,
         LR          Y,A
         SARD        NBITMO
         DV          PASIY
         MP          PASIY
         STB         YNOEUD          < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE.
         LA          XS
         CP          XNOEUD          < EST-ON EN UN NOEUD ???
         JNE         SPU31           < NON...
         LA          YS              < PEUT-ETRE :
         CP          YNOEUD          < EST-ON EN UN NOEUD ???
         JNE         SPU31           < NON, INTERPOLONS...
         BSR         ASP1            < LE POINT COURANT EST UN NOEUD...
         JMP         SPU30           < VERS L'ACCES A LA VALEUR DU NOEUD...
SPU31:   EQU         $
         LA          XNOEUD
         NGR         A,A
         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.
         LA          YNOEUD
         NGR         A,A
         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.
         LX          XNOEUD
         LY          YNOEUD
         STX         XS              < ON SE PLACE AU NOEUD
         STY         YS              < HAUT-GAUCHE DE LA MAILLE...
         LBI         0               < PREMIER NOEUD :
         BSR         ASP1
         FST         AFNIV1          < NIVEAU(XNOEUD,YNOEUD),
         LA          XS
         AD          PASIX
         STA         XS
         LBI         1               < DEUXIEME NOEUD :
         BSR         ASP1
         FST         AFNIV2          < NIVEAU(XNOEUD+PASIX,YNOEUD),
         LA          YS
         AD          PASIY
         STA         YS
         LBI         2               < TROISIEME NOEUD :
         BSR         ASP1
         FST         AFNIV3          < NIVEAU(XNOEUD+PASIX,YNOEUD+PASIY),
         LA          XS
         SB          PASIX
         STA         XS
         LBI         3               < QUATRIEME NOEUD :
         BSR         ASP1
         FST         AFNIV4          < NIVEAU(XNOEUD,YNOEUD+PASIY).
         BSR         BINTER          < ET INTERPOLATION...
<
< SORTIE :
<
SPU30:   EQU         $
         PLR         X,Y
         STY         YS              < RESTAURE
         STX         XS              <          LE POINT COURANT...
         PLR         X,Y
         RSR
<
<
<        A C C E S   R D N  :
<
<
SP1:     EQU         $
         BSR         ARDN
         FLT
         RSR                         < FACILE...
<
<
<        G E N E R A T E U R   A L E A T O I R E  :
<
<
SPRDN2:  EQU         $
         FLT
         FMP         F05             < RDN/2,
         PSR         A,B             < SAVE RDN/2...
         FAD         INFIN2          < (RDN+INFINI)/2,
         FST         FWORK4
         LA          XA0010          < BORNE SUPERIEURE,
         FLT
         FMP         FWORK4
         FST         FWORK4
         PLR         A,B             < RDN/2,
         FSB         INFIN2          < (RDN-INFINI)/2,
         FST         FWORK5
         LA          XA0011          < BORNE INFERIEURE,
         FLT
         FMP         FWORK5
         FST         FWORK5
         FLD         FWORK4
         FSB         FWORK5
         FDV         INFIN1          < MISE A L'ECHELLE...
         FIX
         CP          XA0010          < ???
         JG          SPRDN3          < ERREUR...
         CP          XA0011          < ???
         JL          SPRDN3          < ERREUR...
         FLT
         FMP         FMUL
         BSR         AROND           < (A)=NOMBRE ALEATOIRE ENTIER...
         PLR         B
         RSR
SPRDN3:  EQU         $
         QUIT        1
         JMP         SPRDN2
<
<
<        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  :
<
<
SQRDN:   EQU         $
         PSR         B
         LA          XS
         FLT
         FST         FWORK4          < SAVE LE 'XS' FLOTTANT...
         LA          YS
         FLT
         FST         FWORK5          < SAVE LE 'YS' FLOTTANT...
         FMP         FWORK4          < ET ON CONSTRUIT
         FAD         FWORK5          < UNE FONCTION UNIQUE
         FAD         FWORK4          < DU NOEUD COURANT...
         EORR        B,A
         AD          RDN1
         MP          KITER           < AFIN DE GENERER TOUJOURS LES MEMES
                                     < NOMBRES ALEATOIRES AU MEME NIVEAU DE
                                     < RECURSION...
         EORR        B,A             < (A)=F(XS,YS,PASIX INITIAL,PASIY INITIAL).
         EOR         XA16            < PARAMETRE VARIABLE...
         FLT                         < INITIALISATION DU GENERATEUR...
         BSR         ASIN            < DONT ON PREND LE SINUS...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
         JMP         SPRDN2          < QUE L'ON CONSIDERE ENTIER...
<
<
<        C A L C U L   D U   R A Y O N  :
<
<
<        ARGUMENT :
<                    (A,B)=FONCTION COURANTE.
<
<
<        RESULTAT :
<                    (A,B)=(A5+A0*F(XR,YR))*(FONCTION COURANTE).
<
<
RAYON:   EQU         $
         FCMZ        FA0             < LA CONSTANTE MULTIPLICATIVE EST-ELLE
                                     < NULLE ???
         JNE         RAYON2          < NON, ON Y VA...
         BR          ARAYO1          < OUI, RIEN A FAIRE...
RAYON2:  EQU         $
         PSR         A,B             < SAVE LE CUMUL INITIAL...
<
< CALCUL DU POINT COURANT ET
< POSITION DANS UN CARRE DE
< COORDONNEES ENTIERES :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         FLT
         FAD         FWORK
         FMP         XA18            < SCALING...
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         FIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         FLT
         FSB         GXS
         FNEG
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         FLT
         FAD         FWORK
         FMP         XA18            < SCALING...
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
         FIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         FLT
         FSB         GYS
         FNEG
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         BSR         ARCRD
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ARCRD
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ARCRD
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ARCRD
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         GNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         GINCU
         FMP         FWORK2
         FMP         GNIV2
         FAD         FWORK
         FST         FWORK           < +FU*(1-FV)*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         FAD         FWORK
         FST         FWORK           < +FU*FV*N3,
         FLD         FWORK1
         FMP         GINCV
         FMP         GNIV4
         FAD         FWORK           < +(1-FU)*FV*N4,
<
< CALCUL DE LA FONCTION COURANTE :
<
         FMP         FA0             < AMPLIFICATION,
         FAD         FA5             < ET TRANSLATION.
         FST         FWORK           < RAYON=FA5+FA0*F(XR,YR).
         PLR         A,B             < RESTAURATION DU CUMUL,
         FMP         FWORK           < ET CALCUL DE LA FONCTION COURANTE...
<
< RETOUR :
<
RAYON1:  EQU         $
         RSR
<
<
<        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 "  :
<
<
RCRD:    EQU         $
<
< INITIALISATION ET SAUVEGARDES :
<
         LA          PASIX
         LB          PASIY
         PSR         A,B,X           < SAUVEGARDE DE (PASIX,PASIY)...
         FLD         F0
         FST         FCUMR           < INITIALISATION DU CUMUL DES FONCTIONS
                                     < ALEATOIRES SCALANTES...
         FLD         FPOND0
         FST         FPOND           < INITIALISATOON DE LA PONDERATTION DES
                                     < FONCTIONS ALEATOIRES...
<
< ITERATION POUR CHAQUE
< FONCTION ALEATOIRE :
<
         STZ         KITER           < INITIALISATION DES RECURSIONS...
         LX          XA17            < (X)=NOMBRE D'ITERATIONS MAX...
RCRD1:   EQU         $
         IC          KITER           < COMPTAGE DES RECURSIONS...
MAILLE:: VAL         1               < PLUS PETITE MAILLE...
         LA          PASIX
         CPI         MAILLE          < A-T'ON ATTEINT LA DEFINITION DE L'ECRAN ?
         JG          RCRD2           < NON, ON SCALE...
         LA          PASIY
         CPI         MAILLE          < ALORS ???
         JLE         RCRD3           < OUI, ON EST SUR UNE MAILLE (1,1), ON
                                     < A FINI LA RECURSION...
RCRD2:   EQU         $
         LA          PASIX
         FLT
         FST         FPASIX
         LA          PASIY
         FLT
         FST         FPASIY
         BSR         APRDN           < (A,B)=VALEUR ALEATOIRE ASSOCIEE AU
                                     < POINT (XS,YS) ET A LA GRILLE COURANTE
                                     < (PASIX,PASIY)...
         FMP         FPOND
         FDV         FPOND0          < ET ON LA PONDERE PAR FPOND/FPOND0,
                                     < 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...
         FLD         FPOND
         BSR         ARAC
         FST         FPOND           < DECROISSANCE DES AMPLITUDES DES FONCTIONS
                                     < ALEATOIRES...
         FLD         FPASIX
         BSR         ARAC            < ON REDUIT LA MAILLE, PAR :
                                     < MAILLE=RAC(MAILLE)...
         BSR         AROND
         STA         PASIX
         FLD         FPASIY
         BSR         ARAC
         BSR         AROND
         STA         PASIY
         JDX         RCRD1           < ET ON ITERE JUSQU'A ATTEINDRE LA
                                     < DEFINITION DE L'ECRAN OU LE MAX DES
                                     < ITERATIONS...
<
< FIN DE RECURSION :
<
RCRD3:   EQU         $
         PLR         A,B,X           < ON RESTAURE
         STB         PASIY           < LA GRILLE
         STA         PASIX           < INITIALE...
         FLD         FCUMR           < ET ON RENVOIE LA SOMME DES
                                     < FONCTIONS ALEATOIRES...
         FMP         FA3             < QUE L'ON NORMALISE...
         RSR
         NLS
XWOR%9:  VAL         0
         LST
:F
:F
< <<'SIOP RAYON CHAMP 3'
DF'SIOP RAYON CHAMP 4'
ED'SIOP RAYON CHAMP 4'
IN0
         NLS
         IDP         "SIOP RAYON CHAMP 4"
<        R A Y O N   C H A M P   4  :
         IF          XXXRDN-1,XWOR%9,,XWOR%9
         LST
A0::     VAL         0               < AMPLIFICATEUR DE LA FONCTION MONTA-
                                     < GNEUSE F(XR,YR).
A1::     VAL         A0+1            < DEPLACEMENT SUR L'AXE DES 'X', A LA
                                     < CHARGE DU MODULE APPELANT...
A2::     VAL         A1+1            < DEPLACEMENT SUR L'AXE DES 'Y', A LA
                                     < CHARGE DU MODULE APPELANT...
A3::     VAL         A2+1            < AMPLIFICATEUR DES VALEURS ALEATOIRES
                                     < CORRELEES.
A4::     VAL         A3+1            < DEPLACEMENT SUR L'AXE DE 'Z', A LA
                                     < CHARGE DU MODULE APPELANT...
A5::     VAL         A4+1            < VALEUR MOYENNE DE LA FONCTION MONTA-
                                     < GNEUSE : A5+A0*F(XR,YR).
A6::     VAL         A5+1            < AMPLIFICATION POUR 'X' DE A5+A0*F(XR,YR),
A7::     VAL         A6+1            < AMPLIFICATION POUR 'Y' DE A5+A0*F(XR,YR),
A8::     VAL         A7+1            < AMPLIFICATION POUR 'Z' DE A5+A0*F(XR,YR).
A10::    VAL         '10             < BORNE SUP(RDN),
A11::    VAL         A10+1           < BORNE INF(RDN),
A12::    VAL         A11+1           < MULTIPLICATEUR(RDN).
A13::    VAL         A12+1           < INUTILISE...
A14::    VAL         A13+1           < PAS EN 'X' DE LA GRILLE DE DEPART,
A15::    VAL         A14+1           < PAS EN 'Y' DE LA GRILLE DE DEPART.
A16::    VAL         A15+1           < PARAMETRE DE DEFINITION DU GENERATEUR
                                     < ALEATOIRE...
A17::    VAL         A16+1           < NOMBRE DE RECURSION MAX LORS DE LA SOM-
                                     < MATION DES FONCTIONS ALEATOIRES.
A18::    VAL         A17+1           < FACTEUR D'ECHELLE DES COORDONNEES...
A19::    VAL         A18+1           < EXPOSANT 'P' DES EXPONENTIELLES,
A1A::    VAL         A19+1           < ET 'Q', SACHANT QUE 'RAK' CALCULERA
                                     < LES PUISSANCES P/(2**Q)...
A20::    VAL         '20             < DISCRIMINATEUR DES CONTRAINTES INITIALES:
                                     < =0 : NON, GENERATION PUREMENT ALEATOIRE,
                                     < #0 : LA PREMIERE GENERATION (KITER=1)
                                     <      EST CONTRAINTE PAR 'TV2'...
A21::    VAL         A20+1           < NOMBRE DE POINTS MAX DE LA SPIRALE,
A22::    VAL         A21+1           < PAS DE PARCOURS DE LA SPIRALE,
A23::    VAL         A22+1           < FACTEUR D'AMPLIFICATION DES CONTRAINTES
                                     < APRES NORMALISATION...
A24::    VAL         A23+1           < GENERATION ALEATOIRE SUR UN TORE :
                                     < 0 : OUI, SUR UN TORE,
                                     < 1 : NON, SUR UN PLAN.
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-2,XWOR%9,,XWOR%9
         LST
<
< INDICATEUR DE PREMIER PASSAGE :
<
PREM:    WORD        0               < =0 : PREMIER PASSAGE,
                                     < #0 : PASSAGES SUIVANTS.
<
< VARIABLES MONTAGNEUSES :
<
XA18:    FLOAT       0               < FACTEUR D'ECHELLE LOCAL DES COORDONNEES
                                     < ENVOYEES PAR ' +'...
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
GINCU:   FLOAT       0               < RESIDU DE L'ABSCISSE,
GINCV:   FLOAT       0               < RESIDU DE L'ORDONNEE.
GNIV1:   FLOAT       0               < SIGMA PONDERE DES FONCTIONS ALEATOIRES
                                     < CENTREE EN (XS,YS),
GNIV2:   FLOAT       0               < DE MEME EN (XS+1,YS),
GNIV3:   FLOAT       0               < DE MEME EN (XS+1,YS+1),
GNIV4:   FLOAT       0               < DE MEME EN (XS,YS+1).
FA0:     FLOAT       0               < CONSTANTE 'A0',
FA3:     FLOAT       0               < AMPLIFICATEUR DES VALEURS ALEATOIRES
                                     < CORRELEES...
FA5:     FLOAT       0               < ET 'A5'.
FCUMR:   FLOAT       0               < SIGMA DES FONCTIONS ALEATOIRES
                                     < SCALANTES.
FPOND:   FLOAT       0               < POUR LES PONDERER...
FPOND0:: FLOAT       0               < VALEUR INITIALE DE LA PONDERATION :
                                     < FPOND0=RAC(PASIX*PASIY).
EXPOP:   WORD        0               < POUR CALCULER
EXPOQ:   WORD        0               <               LES PUISSANCES P/(2**Q)...
<
< DONNEES DES CONTRAINTES INITIALES :
<
XA20:    WORD        0               < =0 : PAS DE CONTRAINTES MAIS DU RDN,
                                     < #0 : CONTRAINTES INITIALES PAR 'TV2'...
FNP:     FLOAT       0               < NOMBRE DE POINTS FLOTTANT DE LA SPIRALE.
XA23:    FLOAT       0               < AMPLIFICATEUR DES CONDITIONS INITIALES...
CUMUL:   WORD        0               < SIGMA(NIVEAU(XS,YS)).
PASQ:    WORD        0               < ARGUMENT 'A4'.
DELTAX:  WORD        0
DELTAY:  WORD        0
LB:      WORD        0               < LONGUEUR DES
LB0:     WORD        0               <              BRANCHES DE LA SPIRALE.
NP:      WORD        0               < NOMBRE DE POINT COURANT,
NPM:     WORD        0               < NOMBRE DE POINTS ENTIER DE LA SPIRALE.
<
< TRANSLATION SUR LES 3 AXES :
<
XFA1:    FLOAT       0               < 'OX',
XFA2:    FLOAT       0               < 'OY',
XFA4:    FLOAT       0               < ET 'OZ'.
<
< AMPLIFICATION DE A5+A0*F(XR,YR) :
<
XFA6:    FLOAT       0               < POUR 'OX',
XFA7:    FLOAT       0               < POUR 'OY',
XFA8:    FLOAT       0               < ET POUR 'OZ'.
<
< RELAIS MONTAGNEUX :
<
APRDN5:  WORD        SPRDN5          < REALI...
ARCRD:   WORD        RCRD            < CALCUL DU CHAMP ALEATOIRE...
ARAYON:  WORD        RAYON           < CALCUL DE LA FONCTION COURANTE.
<
< DEFINITION DE LA GRILLE :
<
PASIX:   WORD        0               < PAS SUR OX,
PASIY:   WORD        0               < PAS SUR OY.
FPASIX:  FLOAT       0               < DE MEME
FPASIY:  FLOAT       0               <         EN FLOTTANT...
XNOEUD:  WORD        0               < X(NOEUD HAUT-GAUCHE) DE LA MAILLE,
YNOEUD:  WORD        0               < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE.
AFNIV1:  FLOAT       0
AFNIV2:  FLOAT       0
AFNIV3:  FLOAT       0
AFNIV4:  FLOAT       0
XA17:    WORD        0               < PARAMETRE 'A17'.
KITER:   WORD        0               < COMPTAGE DES RECURSIONS...
TOREXY:  WORD        0               < GENERATION ALEATOIRE SUR UN TORE :
                                     < 0 : OUI, SUR UN TORE,
                                     < 1 : NON, SUR UN PLAN.
MAXTOR:  WORD        0               < CONTIENT LA "LONGUEUR" DU TORE APRES
                                     < SCALING PAR 'XA18'...
MOYTOR:  WORD        0               < MOYTOR=MAXTOR/2.
<
< PARAMETRES DU GENERATEUR ALEATOIRE :
<
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
XA16:    WORD        0               < PARAMETRE VARIABLE...
RDN1:    WORD        5189            < CONSTANTE
XA0010:  WORD        0               < BORNE SUPERIEURE,
XA0011:  WORD        0               < BORNE INFERIEURE...
FMUL:    FLOAT       0               < MULTIPLICATEUR...
INFIN1:  FLOAT       32768
INFIN2:  FLOAT       16384           < INFINI/2...
FWORK4:  FLOAT       0
FWORK5:  FLOAT       0
HINCU:   FLOAT       0               < POUR
HINCV:   FLOAT       0               <      L'INTERPOLATION...
<
< RELAIS DE SOUS-PROGRAMMES :
<
BINTER:  WORD        QINTER          < MODULE D'INTERPOLATION...
AQWORK:  WORD        PWORK           < 'FAD FWORK', PUIS 'FST FWORK'...
ARDN:    WORD        SQRDN           < GENERATEUR ALEATOIRE.
APRDN:   WORD        PRDN            < CALCUL D'UNE VALEUR ALEATOIRE SUR LA
                                     < GRILLE COURANTE...
ARAK:    WORD        RAK             < CALCUL DE LA PUISSANCE P/(2**Q) D'UN
                                     < NOMBRE...
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-3,XWOR%9,,XWOR%9
         LST
<
< AMPLIFICATEUR DE LA VARIATION DU RAYON
< ET VALEUR MINIMALE DE CELUI-CI :
<
         LXI         A0
         BSR         ASPCT
         FST         FA0
         LXI         A5
         BSR         ASPCT
         FST         FA5
         LXI         A3
         BSR         ASPCT
         FST         FA3
<
< TRANSLATION LES 3 AXES :
<
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
         LXI         A4
         BSR         ASPCT
         FST         XFA4
<
< AMPLIFICATION DE A5+A0*F(XR,YR) :
<
         LXI         A6
         BSR         ASPCT
         FST         XFA6
         LXI         A7
         BSR         ASPCT
         FST         XFA7
         LXI         A8
         BSR         ASPCT
         FST         XFA8
<
< ENTREE DES PARAMETRES
< DE GENERATION ALEATOIRE :
<
         LXI         A10
         BSR         ASPCT
         BSR         AFIX
         STA         XA0010          < BORNE SUPERIEURE,
         LXI         A11
         BSR         ASPCT
         BSR         AFIX
         STA         XA0011          < ET BORNE INFERIEURE...
         LXI         A12
         BSR         ASPCT
         BSR         AFCAZ
         JLE         $               < ????!?!
         FST         FMUL
         LXI         A16
         BSR         ASPCT
         BSR         AROND
         STA         XA16            < PARAMETRE D'INITIALISATION...
<
< ENTREE DE LA GRILLE :
<
         LXI         A18
         BSR         ASPCT
         BSR         AFCAZ
         JLE         $               < ??!?!??!
         FST         XA18            < FCATEUR D'ECHELLE LOCAL...
         LXI         A14
         BSR         ASPCT
         FMP         XA18            < POUR AVOIR UNE GENERATION SCALANTE...
         BSR         AROND
         JALE        $               < ???
         STA         PASIX           < PAS EN 'X',
         BSR         AFLT
         FST         FWORK5          < FWORK5=PASIX...
         LXI         A15
         BSR         ASPCT
         FMP         XA18            < POUR AVOIR UNE GENERATION SCALANTE...
         BSR         AROND
         JALE        $               < ???
         STA         PASIY           < ET PAS EN 'Y'...
         BSR         AFLT
         FMP         FWORK5          < 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...
         LXI         A17
         BSR         ASPCT
         BSR         AROND
         JALE        $               < ?!?!???
         STA         XA17            < NOMBRE DE RECURSION MAX LORS DE LA
                                     < SOMMATION DES FONCTIONS ALEATOIRES.
         IF          NLIGM1-NPOLM1,,XWOR%,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XWOR%:   VAL         0
         LAI         NLIGM1?NPOLM1
         ADRI        1,A             < PARCE QU'UNE INSTRUCTION IMMEDIATE NE
                                     < PEUT CONTENIR QUE 8 BITS...
         BSR         AFLT            < FLOTTAGE,
         FMP         XA18            < SCALING,
         BSR         AROND           < FIXAGE,
         STA         MAXTOR          < CE QUI DONNE LA "LONGUEUR" DU TORE...
         SLRS        1
         STA         MOYTOR          < MOYTOR=MAXTOR/2...
<
< ENTREE DU CHOIX PLAN/TORE ???
<
         LXI         A24
         BSR         ASPCT
         BSR         AROND
         STA         TOREXY          < DEFINITION DU PLAN/TORE...
         JAE         SPU70           < TORE...
         STZ         MOYTOR          < PLAN, ON SUPPRIME LE CENTRAGE DES
                                     < GRILLES DE GENERATION ALEATOIRE...
SPU70:   EQU         $
<
< DEFINITION DES EXPONENTIATIONS :
<
         LXI         A19
         BSR         ASPCT
         BSR         AROND
         JALE        $               < ??!????!
         STA         EXPOP           < NUMERATEUR DE L'EXPOSANT,
         LXI         A1A
         BSR         ASPCT
         BSR         AROND
         STA         EXPOQ           < POUR CALCULER LE DENOMINATEUR 2**Q...
         LR          A,X
         LAI         1
         SLLS        0,X             < CALCUL DE 2**Q,
         CP          EXPOP           < A-T'ON : P<(2**Q) ???
         JLE         $               < ?!???!?!
<
< DEFINITION DE LA SPIRALE :
<
         LXI         A20
         BSR         ASPCT
         BSR         AROND
         STA         XA20            < CONTRAINTE OU PAS...
         LXI         A21
         BSR         ASPCT
         FST         FNP
         BSR         AROND
         JALE        $               < ?!??!?!
         STA         NPM             < NOMBRE DE POINTS MAX...
         LXI         A22
         BSR         ASPCT
         BSR         AROND
         STA         PASQ            < PAS DE PARCOURS...
         LXI         A23
         BSR         ASPCT
         FST         XA23            < AMPLIFICATEUR DES CONDITIONS INITIALES...
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-4,XWOR%9,,XWOR%9
         LST
<
<
<        I N T E R P O L A T I O N  :
<
<
<        NOTA :
<                      ON N'UTILISE PAS 'PINTER' DE
<                    'SI  +', CAR CELUI-CI UTILISE
<                    LA BASE 'L' POUR APPELER LE
<                    SOUS-PROGRAMME 'PWORK' !!!
<
<
QINTER:  EQU         $
         FLD         F1
         FSB         HINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         HINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         AFNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         HINCU
         FMP         FWORK2
         FMP         AFNIV2
         BSR         AQWORK          < +FU*(1-FV)*N2,
         FLD         HINCU
         FMP         HINCV
         FMP         AFNIV3
         BSR         AQWORK          < +FU*FV*N3,
         FLD         FWORK1
         FMP         HINCV
         FMP         AFNIV4
         BSR         AQWORK          < +(1-FU)*FV*N4,
         RSR
<
<
<        C A L C U L   D E   R D N ( X S , Y S )  :
<
<
<        ARGUMENT :
<                    (XS,YS)=POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=VALEUR ALEATOIRE ASSOCIEE A (XS,YS)
<                          ISSUE DIRECTEMENT DE 'RDN' SI (XS,YS)
<                          EST UN NOEUD DE LA GRILLE COURANTE,
<                          ET UNE VALEUR INTERPOLEE SINON...
<
<
PRDN:    EQU         $
         PSR         X,Y
         LX          XS              < PLACONS NOUS AU
         LY          YS              < POINT COURANT...
         PSR         X,Y             < ET SAVE...
<
< CALCUL DU "NOEUD SYMETRIQUE" :
<
         LR          X,A
         SB          MOYTOR          < AFIN D'AVOIR UN ENSEMBLE DE GRILLES
                                     < CENTREES SUR L'IMAGE, PERMETTANT LA SY-
                                     < METRIE AU NIVEAU DES BORDS...
         JAGE        PRDN20          < A DOITE, OK...
         ADRI        1,A             < A GAUCHE, IL N'Y A PAS DE POINT MILIEU
                                     < CAR 256 EST PAIR...
PRDN20:  EQU         $
         SARD        NBITMO
         DV          PASIX
         MP          PASIX
         LR          B,X             < (X)="DISTANCE" AU CENTRE...
         LR          B,A
         JAGE        PRDN10          < OK, POSITIF...
         NGR         A,A             < CAS DES TORES : ON FAIT UNE SYMETRIE...
PRDN10:  EQU         $
         AD          MOYTOR
         STA         XNOEUD          < X(NOEUD HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE,
         LR          Y,A
         SB          MOYTOR          < POUR LE CENTRAGE DES GRILLES...
         JAGE        PRDN21          < OK, A DROITE...
         ADRI        1,A             < A GAUCHE, IL N'Y A PAS DE POINT MILIEU...
PRDN21:  EQU         $
         SARD        NBITMO
         DV          PASIY
         MP          PASIY
         LR          B,Y             < (Y)="DISTANCE" AU CENTRE...
         LR          B,A
         JAGE        PRDN11          < OK, POSITIF...
         NGR         A,A             < CAS DES TORES : ON FAIT UNE SYMETRIE...
PRDN11:  EQU         $
         AD          MOYTOR
         STA         YNOEUD          < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE.
<
< CALCUL DU "VRAI NOEUD" :
<
         LA          MOYTOR
         ADR         A,X             < (X)=X-NOEUD AVANT SYMETRIE,
         ADR         A,Y             < (Y)=Y-NOEUD AVANT SYMETRIE DU TORE...
<
< GENERATION ALEATOIRE :
<
         LA          XS
         CPR         A,X             < EST-ON EN UN VRAI NOEUD (AVANT LA SYME-
                                     < TRIE EVENTUELLE DU TORE) ???
         JNE         SPU31           < NON...
         LA          YS              < PEUT-ETRE :
         CPR         A,Y             < EST-ON EN UN VRAI NOEUD ???
         JNE         SPU31           < NON, INTERPOLONS...
<
< GENERATION RDN EN UN NOEUD :
<
         LX          XNOEUD
         LY          YNOEUD
         STX         XS              < ON SE PLACE AU NOEUD
         STY         YS              < HAUT-GAUCHE DE LA MAILLE...
         BSR         ARDN            < LE POINT COURANT EST UN NOEUD...
         JMP         SPU30           < VERS L'ACCES A LA VALEUR DU NOEUD...
<
< GENERATION RDN EN UN POINT QUELCONQUE :
<
SPU31:   EQU         $
         NGR         X,A
         BSR         AFLT
         FAD         GXS             < X-XNOEUD,
         BSR         AFABS           < CAS DU TORE...
         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
         BSR         AFLT
         FAD         GYS             < Y-YNOEUD,
         BSR         AFABS           < CAS DU TORE...
         FDV         FPASIY          < (Y-YNOEUD)/PASIY,
         FST         HINCV           < DISTANCE NORMALISEE A 1 LE LONG DE OY,
                                     < DU POINT COURANT AU NOEUD DE LA MAILLE.
         LX          XNOEUD
         LY          YNOEUD
         STX         XS              < ON SE PLACE AU NOEUD
         STY         YS              < HAUT-GAUCHE DE LA MAILLE...
         BSR         ARDN
         FST         AFNIV1          < NIVEAU(XNOEUD,YNOEUD),
         LA          XS
         AD          PASIX
         STA         XS
         BSR         ARDN
         FST         AFNIV2          < NIVEAU(XNOEUD+PASIX,YNOEUD),
         LA          YS
         AD          PASIY
         STA         YS
         BSR         ARDN
         FST         AFNIV3          < NIVEAU(XNOEUD+PASIX,YNOEUD+PASIY),
         LA          XS
         SB          PASIX
         STA         XS
         BSR         ARDN
         FST         AFNIV4          < NIVEAU(XNOEUD,YNOEUD+PASIY).
         BSR         BINTER          < ET INTERPOLATION...
<
< SORTIE :
<
SPU30:   EQU         $
         PLR         X,Y
         STY         YS              < RESTAURE
         STX         XS              <          LE POINT COURANT...
         PLR         X,Y
         RSR
<
<
<        G E N E R A T E U R   A L E A T O I R E  :
<
<
SPRDN2:  EQU         $
         BSR         AFLT
SPRDN5:  EQU         $               < CAS DE L'ENTREE DES CONDITIONS INITIALES.
         FMP         F05             < RDN/2,
         PSR         A,B             < SAVE RDN/2...
         FAD         INFIN2          < (RDN+INFINI)/2,
         FST         FWORK4
         LA          XA0010          < BORNE SUPERIEURE,
         BSR         AFLT
         FMP         FWORK4
         FST         FWORK4
         PLR         A,B             < RDN/2,
         FSB         INFIN2          < (RDN-INFINI)/2,
         FST         FWORK5
         LA          XA0011          < BORNE INFERIEURE,
         BSR         AFLT
         FMP         FWORK5
         FST         FWORK5
         FLD         FWORK4
         FSB         FWORK5
         FDV         INFIN1          < MISE A L'ECHELLE...
         BSR         AFIX
         CP          XA0010          < ???
         JG          SPRDN2          < ON RECOMMENCE ; CE CAS PEUT SE PRODUIRE
                                     < AVEC LES CONTRAINTES PAR 'TV2'...
         CP          XA0011          < ???
         JL          SPRDN2          < ON ITERE (CF. 'TV2')...
         BSR         AFLT
         FMP         FMUL
<
< RESTAURATIONS ET SORTIE :
<
         FST         FWORK           < SAUVEGARDE DU 'RDN' COURANT,
         PLR         A,B
         STB         YS              < RESTAURATION
         STA         XS              <              DU POINT (XS,YS),
         FLD         FWORK           < ET DU NOMBRE ALEATOIRE GENERE...
         RSR
<
<
<        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  :
<
<
SQRDN:   EQU         $
<
< GESTION DU PLAN/TORE :
<
         LA          XS
         LB          YS
         PSR         A,B             < SAUVEGARDE DE (XS,YS) A PRIORI...
         CPZ         TOREXY          < EST-ON SUR UN PLAN OU UN TORE ???
         JNE         SQRDN4          < UN PLAN...
                                     < UN TORE, REDUCTION DE (XS,YS) :
SQRDN2:  EQU         $
         JAGE        SQRDN3          < OK, (XS) EST POSITIF...
         AD          MAXTOR          < NEGATIF, ON LE REND POSITIF...
         JMP         SQRDN2
SQRDN3:  EQU         $
         SARD        NBITMO
         DV          MAXTOR
         STB         XS              < ET ON CALCULE 'XS' MODULO 'MAXTOR'...
         LA          YS              < REDUCTION DE 'YS' :
SQRDN5:  EQU         $
         JAGE        SQRDN6          < OK, POSITIF...
         AD          MAXTOR          < NEGATIF, ON LE REND POSITIF...
         JMP         SQRDN5
SQRDN6:  EQU         $
         SARD        NBITMO
         DV          MAXTOR
         STB         YS              < ET ON CALCULE 'YS' MODULO 'MAXTOR'...
SQRDN4:  EQU         $
<
< DISCRIMINATIONS INITIALES :
<
         LA          KITER
         CPI         1               < EST-CE LA PREMIERE GENERATION ???
         JNE         SPRDN4          < NON, TIRAGE ALEATOIRE...
         CPZ         XA20            < OUI, FAUT-IL INITIALISER PAR DES
                                     < CONTRAINTES 'TV2' ???
         JNE         SPIR            < OUI...
<
<
<        G E N E R A T I O N   A L E A T O I R E  :
<
<
SPRDN4:  EQU         $
         LA          XS
         BSR         AFLT
         FST         FWORK4          < SAVE LE 'XS' FLOTTANT...
         LA          YS
         BSR         AFLT
         FST         FWORK5          < SAVE LE 'YS' FLOTTANT...
         FMP         FWORK4          < ET ON CONSTRUIT
         FAD         FWORK5          < UNE FONCTION UNIQUE
         FAD         FWORK4          < DU NOEUD COURANT...
         EORR        B,A
         AD          RDN1
         MP          KITER           < AFIN DE GENERER TOUJOURS LES MEMES
                                     < NOMBRES ALEATOIRES AU MEME NIVEAU DE
                                     < RECURSION...
         EORR        B,A             < (A)=F(XS,YS,PASIX INITIAL,PASIY INITIAL).
         EOR         XA16            < PARAMETRE VARIABLE...
         BSR         AFLT                < INITIALISATION DU GENERATEUR...
         BSR         ASIN            < DONT ON PREND LE SINUS...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
         JMP         SPRDN2          < QUE L'ON CONSIDERE ENTIER...
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         $
         LA          CTCDA
         STA         XCTCDA          < PASSAGE SUR 'TV2'...
<
< INITIALISATION DE LA SPIRALE :
<
         LA          XS
         LB          YS
         PSR         A,B             < SAUVEGARDE DU POINT (XS,YS).
         BSR         AFLT
         FDV         XA18
         BSR         AROND
         STA         XS              < RE-NORMALISATION...
         LA          YS
         BSR         AFLT
         FDV         XA18
         BSR         AROND
         STA         YS              < IDEM...
         STZ         CUMUL           < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         LA          PASQ
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         1
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIRALE.
SPMOY8:  EQU         $
<
< PARCOURS D'UN BRAS :
<
SPMOY1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPMOY2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NPM             < FINI ???
         JG          SPMOY3          < OUI...
         LA          XS              < NON :
         JAL         SPMOY4          < LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPMOY4          < HORS-ECRAN...
         LA          YS
         JAL         SPMOY4          < HORS-ECRAN...
         CPI         NLIGM1
         JG          SPMOY4          < HORS-ECRAN...
         BSR         ASPGPS          < A=NIVEAU(XS,YS),
         AD          CUMUL           < ET
         STA         CUMUL           < CUMULE...
SPMOY4:  EQU         $
         LA          XS
         AD          DELTAX          < CHANGEMENT DE
         STA         XS
         LA          YS
         AD          DELTAY          < POINT COURANT (XS,YS).
         STA         YS
         DC          LB              < DECOMPTAGE DES POINTS SUR LA BRANCHE :
         JG          SPMOY2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPMOY5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPMOY5:  EQU         $
         LA          DELTAY          < ON FAIT SUBIR AU NOMBRE COMPLEXE
         NGR         A,A             < (DX,DY) UNE ROTATION DE PI/2, SOIT
         LB          DELTAX          < UNE MULTIPLICATION PAR LA MATRICE
                                     < (0,-1,1,0)...
         STA         DELTAX          < DELTAX=-DELTAY,
         STB         DELTAY          < DELTAY=DELTAX.
         JMP         SPMOY1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (XS,YS) :
<
SPMOY3:  EQU         $
         PLR         A,B
         STA         XS              < RESTAURATION
         STB         YS              < DE (XS,YS),
<
< NORMALISATION DU CUMUL :
<
         LA          CUMUL
SPMOY6:  EQU         $               < CAS OU LE Z-BUFFER CONNAIT DEJA (XS,YS) :
         BSR         AFLT
         FDV         FNP
         FMP         XA23            < ET AMPLIFICATION...
<
< SORTIE :
<
         STZ         XCTCDA          < RETOUR SUR 'TV1'...
         BR          APRDN5          < VERS LA SORTIE...
<
<
<        C A L C U L   D U   R A Y O N  :
<
<
<        ARGUMENT :
<                    (A,B)=FONCTION COURANTE,
<                    (Y)=CONSTANTE POUR FAIRE UN 'EOR'
<                        SUR 'XA16' DE GENERATION 'RDN'.
<
<
<        RESULTAT :
<                    (A,B)=(A5+A0*F(XR,YR))*(FONCTION COURANTE).
<
<
RAYON1:  EQU         $
         RSR                         < SORTIE IMMEDIATE, PEU ELEGANTE, MAIS
                                     < IMPOSEE PAR DES SAUTS > A 128 MOTS !!!
RAYON:   EQU         $
         BSR         AFCAZ           < LA FONCTION COURANTE EST-ELLE NULLE ???
         JE          RAYON1          < OUI, RIEN A FAIRE...
         FCMZ        FA0             < LA CONSTANTE MULTIPLICATIVE EST-ELLE
                                     < NULLE ???
         JE          RAYON1          < OUI, RIEN A FAIRE...
RAYON2:  EQU         $
         PSR         A,B             < SAVE LE CUMUL INITIAL...
<
< MODIFICATION INVERSIBLE
< DU GENERATEUR 'RDN' :
<
         LA          XA16
         EORR        Y,A             < 'EORR' EST INVERSIBLE...
         STA         XA16            < AINSI, LE GENERATEUR 'RDN' SERA FONCTION
                                     < DE L'APPELANT, ET DONC DES 3 AXES...
<
< CALCUL DU POINT COURANT ET
< POSITION DANS UN CARRE DE
< COORDONNEES ENTIERES :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         BSR         AFLT
         FAD         FWORK
         FMP         XA18            < SCALING...
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         BSR         AFIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         BSR         AFLT
         FSB         GXS
         BSR         AFNEG
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         BSR         AFLT
         FAD         FWORK
         FMP         XA18            < SCALING...
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
         BSR         AFIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         BSR         AFLT
         FSB         GYS
         BSR         AFNEG
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         BSR         ARCRD
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ARCRD
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ARCRD
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ARCRD
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         GNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         GINCU
         FMP         FWORK2
         FMP         GNIV2
         BSR         AQWORK          < +FU*(1-FV)*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         BSR         AQWORK          < +FU*FV*N3,
         FLD         FWORK1
         FMP         GINCV
         FMP         GNIV4
         FAD         FWORK           < +(1-FU)*FV*N4,
<
< CALCUL DE LA FONCTION COURANTE :
<
         FMP         FA0             < AMPLIFICATION,
         FAD         FA5             < ET TRANSLATION.
         FST         FWORK           < RAYON=FA5+FA0*F(XR,YR).
         LA          XA16
         EORR        Y,A             < ON INVERSE LA MODIFICATION DU GENERATEUR
         STA         XA16            < ALEATOIRE...
         PLR         A,B             < RESTAURATION DU CUMUL,
         FMP         FWORK           < ET CALCUL DE LA FONCTION COURANTE...
<
< RETOUR :
<
         RSR
<
<
<        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 "  :
<
<
RCRD:    EQU         $
<
< INITIALISATION ET SAUVEGARDES :
<
         LA          PASIX
         LB          PASIY
         PSR         A,B,X,Y         < SAUVEGARDE DE (PASIX,PASIY)...
         FLD         F0
         FST         FCUMR           < INITIALISATION DU CUMUL DES FONCTIONS
                                     < ALEATOIRES SCALANTES...
         FLD         FPOND0
         FST         FPOND           < INITIALISATOON DE LA PONDERATTION DES
                                     < FONCTIONS ALEATOIRES...
<
< ITERATION POUR CHAQUE
< FONCTION ALEATOIRE :
<
         STZ         KITER           < INITIALISATION DES RECURSIONS...
         LX          XA17            < (X)=NOMBRE D'ITERATIONS MAX...
RCRD1:   EQU         $
         IC          KITER           < COMPTAGE DES RECURSIONS...
         LA          PASIX
         BSR         AFLT
         FST         FPASIX
         LA          PASIY
         BSR         AFLT
         FST         FPASIY
         BSR         APRDN           < (A,B)=VALEUR ALEATOIRE ASSOCIEE AU
                                     < POINT (XS,YS) ET A LA GRILLE COURANTE
                                     < (PASIX,PASIY)...
         FMP         FPOND
         FDV         FPOND0          < ET ON LA PONDERE PAR FPOND/FPOND0,
                                     < 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...
         FLD         FPOND
         BSR         ARAK
         FST         FPOND           < DECROISSANCE DES AMPLITUDES DES FONCTIONS
                                     < ALEATOIRES...
         FLD         FPASIX
         BSR         ARAK            < ON REDUIT LA MAILLE, PAR :
                                     < MAILLE=RAK(MAILLE)...
         BSR         AROND
         LY          PASIX           < (Y)=PASIX AVANT...
         STA         PASIX
         FLD         FPASIY
         BSR         ARAK
         BSR         AROND
         CP          PASIY           < EST-ON AU PLANCHER ???
         STA         PASIY
         JNE         RCRD2           < NON, ON ITERE, A MOINS QUE LE COMPTE
                                     < MAX SOIT ATTEINT...
         LR          Y,A
         CP          PASIX           < PEUT-ETRE...
         JE          RCRD3           < ET OUI, ON ARRETE LA...
RCRD2:   EQU         $               < PAS ENCORE LE PLANCHER...
         JDX         RCRD1           < ET ON ITERE JUSQU'A ATTEINDRE LA
                                     < DEFINITION DE L'ECRAN OU LE MAX DES
                                     < ITERATIONS...
<
< FIN DE RECURSION :
<
RCRD3:   EQU         $
         PLR         A,B,X,Y         < ON RESTAURE
         STB         PASIY           < LA GRILLE
         STA         PASIX           < INITIALE...
         FLD         FCUMR           < ET ON RENVOIE LA SOMME DES
                                     < FONCTIONS ALEATOIRES...
         FMP         FA3             < QUE L'ON NORMALISE...
         RSR
<
<
<        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   P / ( 2 * * Q )  :
<
<
<        ARGUMENT :
<                    (A,B)=NOMBRE 'N' ARGUMENT,
<
<
<        RESULTAT :
<                    (A,B)='N' A LA PUISSANCE P/(2**Q).
<
<
RAK:     EQU         $
         BSR         AFCAZ
         JE          RAK2            < NOMBRE=0 ==> RAKINE=0...
         JG          RAK3            < OK, NOMBRE>0...
         QUIT        1               < ??!??!?!
RAK3:    EQU         $
         PSR         X
<
< ELEVATION A LA PUISSANCE '1/(2**Q)' :
<
         LX          EXPOQ           < (X)=EXPOSANT DE 2**Q,
RAK6:    EQU         $
         BSR         ARAC            < ET ON CALCULE (A,B)**(1/(2**Q))...
         JDX         RAK6
<
< ELEVATION A LA PUISSANCE 'P' :
<
         LX          EXPOP           < (X)=EXPOSANT 'P',
         FST         FWORK           < (A,B)=NOMBRE ARGUMENT,
RAK4:    EQU         $
         ADRI        -1,X
         CPZR        X               < EST-CE FINI ???
         JE          RAK5            < OUI...
         FMP         FWORK           < NON, ON LE MULTIPLIE P-1 FOIS PAR
                                     < LUI-MEME...
         JMP         RAK4
RAK5:    EQU         $
         PLR         X
RAK2:    EQU         $
         RSR
         NLS
XWOR%9:  VAL         0
         LST
:F
:F
< <<'SIOP RAYON CHAMP 4'
DF'SIOP RAYON CHAMP 5'
ED'SIOP RAYON CHAMP 5'
IN0
         NLS
         IDP         "SIOP RAYON CHAMP 5"
<        R A Y O N   C H A M P   5  :
         IF          XXXRDN-1,XWOR%9,,XWOR%9
         LST
A0::     VAL         0               < AMPLIFICATEUR DE LA FONCTION MONTA-
                                     < GNEUSE F(XR,YR).
A1::     VAL         A0+1            < DEPLACEMENT SUR L'AXE DES 'X', A LA
                                     < CHARGE DU MODULE APPELANT...
A2::     VAL         A1+1            < DEPLACEMENT SUR L'AXE DES 'Y', A LA
                                     < CHARGE DU MODULE APPELANT...
A3::     VAL         A2+1            < AMPLIFICATEUR DES VALEURS ALEATOIRES
                                     < CORRELEES.
A4::     VAL         A3+1            < INUTILISE...
A5::     VAL         A4+1            < VALEUR MOYENNE DE LA FONCTION MONTA-
                                     < GNEUSE : A5+A0*F(XR,YR).
A10::    VAL         '10             < BORNE SUP(RDN),
A11::    VAL         A10+1           < BORNE INF(RDN),
A12::    VAL         A11+1           < MULTIPLICATEUR(RDN).
A13::    VAL         A12+1           < INUTILISE...
A14::    VAL         A13+1           < PAS EN 'X' DE LA GRILLE DE DEPART,
A15::    VAL         A14+1           < PAS EN 'Y' DE LA GRILLE DE DEPART.
A16::    VAL         A15+1           < PARAMETRE DE DEFINITION DU GENERATEUR
                                     < ALEATOIRE...
A17::    VAL         A16+1           < NOMBRE DE RECURSION MAX LORS DE LA SOM-
                                     < MATION DES FONCTIONS ALEATOIRES.
A18::    VAL         A17+1           < FACTEUR D'ECHELLE DES COORDONNEES...
A19::    VAL         A18+1           < EXPOSANT 'P' DES EXPONENTIELLES,
A1A::    VAL         A19+1           < ET 'Q', SACHANT QUE 'RAK' CALCULERA
                                     < LES PUISSANCES P/(2**Q)...
A20::    VAL         '20             < DISCRIMINATEUR DES CONTRAINTES INITIALES:
                                     < =0 : NON, GENERATION PUREMENT ALEATOIRE,
                                     < #0 : LA PREMIERE GENERATION (KITER=1)
                                     <      EST CONTRAINTE PAR 'TV2'...
A21::    VAL         A20+1           < NOMBRE DE POINTS MAX DE LA SPIRALE,
A22::    VAL         A21+1           < PAS DE PARCOURS DE LA SPIRALE,
A23::    VAL         A22+1           < FACTEUR D'AMPLIFICATION DES CONTRAINTES
                                     < APRES NORMALISATION...
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-2,XWOR%9,,XWOR%9
         LST
<
< INDICATEUR DE PREMIER PASSAGE :
<
PREM:    WORD        0               < =0 : PREMIER PASSAGE,
                                     < #0 : PASSAGES SUIVANTS.
<
< VARIABLES MONTAGNEUSES :
<
XA18:    FLOAT       0               < FACTEUR D'ECHELLE LOCAL DES COORDONNEES
                                     < ENVOYEES PAR ' +'...
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
GINCU:   FLOAT       0               < RESIDU DE L'ABSCISSE,
GINCV:   FLOAT       0               < RESIDU DE L'ORDONNEE.
GNIV1:   FLOAT       0               < SIGMA PONDERE DES FONCTIONS ALEATOIRES
                                     < CENTREE EN (XS,YS),
GNIV2:   FLOAT       0               < DE MEME EN (XS+1,YS),
GNIV3:   FLOAT       0               < DE MEME EN (XS+1,YS+1),
GNIV4:   FLOAT       0               < DE MEME EN (XS,YS+1).
FA0:     FLOAT       0               < CONSTANTE 'A0',
FA3:     FLOAT       0               < AMPLIFICATEUR DES VALEURS ALEATOIRES
                                     < CORRELEES...
FA5:     FLOAT       0               < ET 'A5'.
FCUMR:   FLOAT       0               < SIGMA DES FONCTIONS ALEATOIRES
                                     < SCALANTES.
FPOND:   FLOAT       0               < POUR LES PONDERER...
FPOND0:: FLOAT       0               < VALEUR INITIALE DE LA PONDERATION :
                                     < FPOND0=RAC(PASIX*PASIY).
EXPOP:   WORD        0               < POUR CALCULER
EXPOQ:   WORD        0               <               LES PUISSANCES P/(2**Q)...
EXPEPS:  FLOAT       0.01
<
< DONNEES DES CONTRAINTES INITIALES :
<
XA20:    WORD        0               < =0 : PAS DE CONTRAINTES MAIS DU RDN,
                                     < #0 : CONTRAINTES INITIALES PAR 'TV2'...
FNP:     FLOAT       0               < NOMBRE DE POINTS FLOTTANT DE LA SPIRALE.
XA23:    FLOAT       0               < AMPLIFICATEUR DES CONDITIONS INITIALES...
CUMUL:   WORD        0               < SIGMA(NIVEAU(XS,YS)).
PASQ:    WORD        0               < ARGUMENT 'A4'.
DELTAX:  WORD        0
DELTAY:  WORD        0
LB:      WORD        0               < LONGUEUR DES
LB0:     WORD        0               <              BRANCHES DE LA SPIRALE.
NP:      WORD        0               < NOMBRE DE POINT COURANT,
NPM:     WORD        0               < NOMBRE DE POINTS ENTIER DE LA SPIRALE.
<
< TRANSLATION SUR OX ET OY :
<
XFA1:    FLOAT       0               < 'OX',
XFA2:    FLOAT       0               < ET 'OY'...
<
< RELAIS MONTAGNEUX :
<
APRDN5:  WORD        SPRDN5          < REALI...
ARCRD:   WORD        RCRD            < CALCUL DU CHAMP ALEATOIRE...
ARAYON:  WORD        RAYON           < CALCUL DE LA FONCTION COURANTE.
<
< DEFINITION DE LA GRILLE :
<
PASIX:   WORD        0               < PAS SUR OX,
PASIY:   WORD        0               < PAS SUR OY.
FPASIX:  FLOAT       0               < DE MEME
FPASIY:  FLOAT       0               <         EN FLOTTANT...
XNOEUD:  WORD        0               < X(NOEUD HAUT-GAUCHE) DE LA MAILLE,
YNOEUD:  WORD        0               < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE.
AFNIV1:  FLOAT       0
AFNIV2:  FLOAT       0
AFNIV3:  FLOAT       0
AFNIV4:  FLOAT       0
XA17:    WORD        0               < PARAMETRE 'A17'.
KITER:   WORD        0               < COMPTAGE DES RECURSIONS...
<
< PARAMETRES DU GENERATEUR ALEATOIRE :
<
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
XA16:    WORD        0               < PARAMETRE VARIABLE...
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
XA0010:  WORD        0               < BORNE SUPERIEURE,
XA0011:  WORD        0               < BORNE INFERIEURE...
FMUL:    FLOAT       0               < MULTIPLICATEUR...
INFIN1:  FLOAT       32768
INFIN2:  FLOAT       16384           < INFINI/2...
FWORK4:  FLOAT       0
FWORK5:  FLOAT       0
HINCU:   FLOAT       0               < POUR
HINCV:   FLOAT       0               <      L'INTERPOLATION...
<
< RELAIS DE SOUS-PROGRAMMES :
<
BINTER:  WORD        QINTER          < MODULE D'INTERPOLATION...
AQWORK:  WORD        PWORK           < 'FAD FWORK', PUIS 'FST FWORK'...
ARDN:    WORD        SQRDN           < GENERATEUR ALEATOIRE.
APRDN:   WORD        PRDN            < CALCUL D'UNE VALEUR ALEATOIRE SUR LA
                                     < GRILLE COURANTE...
ARAK:    WORD        RAK             < CALCUL DE LA PUISSANCE P/(2**Q) D'UN
                                     < NOMBRE...
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-3,XWOR%9,,XWOR%9
         LST
<
< AMPLIFICATEUR DE LA VARIATION DU RAYON
< ET VALEUR MINIMALE DE CELUI-CI :
<
         LXI         A0
         BSR         ASPCT
         FST         FA0
         LXI         A5
         BSR         ASPCT
         FST         FA5
         LXI         A3
         BSR         ASPCT
         FST         FA3
<
< TRANSLATION SUR OX ET OY :
<
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
<
< ENTREE DES PARAMETRES
< DE GENERATION ALEATOIRE :
<
         LXI         A10
         BSR         ASPCT
         FIX
         STA         XA0010          < BORNE SUPERIEURE,
         LXI         A11
         BSR         ASPCT
         FIX
         STA         XA0011          < ET BORNE INFERIEURE...
         LXI         A12
         BSR         ASPCT
         FCAZ
         JLE         $               < ????!?!
         FST         FMUL
         LXI         A16
         BSR         ASPCT
         BSR         AROND
         STA         XA16            < PARAMETRE D'INITIALISATION...
<
< ENTREE DE LA GRILLE :
<
         LXI         A18
         BSR         ASPCT
         FCAZ
         JLE         $               < ??!?!??!
         FST         XA18            < FCATEUR D'ECHELLE LOCAL...
         LXI         A14
         BSR         ASPCT
         FMP         XA18            < POUR AVOIR UNE GENERATION SCALANTE...
         BSR         AROND
         JALE        $               < ???
         STA         PASIX           < PAS EN 'X',
         FLT
         FST         FWORK5          < FWORK5=PASIX...
         LXI         A15
         BSR         ASPCT
         FMP         XA18            < POUR AVOIR UNE GENERATION SCALANTE...
         BSR         AROND
         JALE        $               < ???
         STA         PASIY           < ET PAS EN 'Y'...
         FLT
         FMP         FWORK5          < 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...
         LXI         A17
         BSR         ASPCT
         BSR         AROND
         JALE        $               < ?!?!???
         STA         XA17            < NOMBRE DE RECURSION MAX LORS DE LA
                                     < SOMMATION DES FONCTIONS ALEATOIRES.
<
< DEFINITION DES EXPONENTIATIONS :
<
         LXI         A19
         BSR         ASPCT
         BSR         AROND
         JALE        $               < ??!????!
         STA         EXPOP           < NUMERATEUR DE L'EXPOSANT,
         LXI         A1A
         BSR         ASPCT
         BSR         AROND
         STA         EXPOQ           < POUR CALCULER LE DENOMINATEUR 2**Q...
         LR          A,X
         LAI         1
         SLLS        0,X             < CALCUL DE 2**Q,
         CP          EXPOP           < A-T'ON : P<(2**Q) ???
         JLE         $               < ?!???!?!
<
< DEFINITION DE LA SPIRALE :
<
         LXI         A20
         BSR         ASPCT
         BSR         AROND
         STA         XA20            < CONTRAINTE OU PAS...
         LXI         A21
         BSR         ASPCT
         FST         FNP
         BSR         AROND
         JALE        $               < ?!??!?!
         STA         NPM             < NOMBRE DE POINTS MAX...
         LXI         A22
         BSR         ASPCT
         BSR         AROND
         STA         PASQ            < PAS DE PARCOURS...
         LXI         A23
         BSR         ASPCT
         FST         XA23            < AMPLIFICATEUR DES CONDITIONS INITIALES...
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-4,XWOR%9,,XWOR%9
         LST
<
<
<        I N T E R P O L A T I O N  :
<
<
<        NOTA :
<                      ON N'UTILISE PAS 'PINTER' DE
<                    'SI  +', CAR CELUI-CI UTILISE
<                    LA BASE 'L' POUR APPELER LE
<                    SOUS-PROGRAMME 'PWORK' !!!
<
<
QINTER:  EQU         $
         FLD         F1
         FSB         HINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         HINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         AFNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         HINCU
         FMP         FWORK2
         FMP         AFNIV2
         BSR         AQWORK          < +FU*(1-FV)*N2,
         FLD         HINCU
         FMP         HINCV
         FMP         AFNIV3
         BSR         AQWORK          < +FU*FV*N3,
         FLD         FWORK1
         FMP         HINCV
         FMP         AFNIV4
         BSR         AQWORK          < +(1-FU)*FV*N4,
         RSR
<
<
<        C A L C U L   D E   R D N ( X S , Y S )  :
<
<
<        ARGUMENT :
<                    (XS,YS)=POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=VALEUR ALEATOIRE ASSOCIEE A (XS,YS)
<                          ISSUE DIRECTEMENT DE 'RDN' SI (XS,YS)
<                          EST UN NOEUD DE LA GRILLE COURANTE,
<                          ET UNE VALEUR INTERPOLEE SINON...
<
<
PRDN:    EQU         $
         PSR         X,Y
         LX          XS              < PLACONS NOUS AU
         LY          YS              < POINT COURANT...
         PSR         X,Y             < ET SAVE...
         LR          X,A
         SARD        NBITMO
         DV          PASIX
         MP          PASIX
         STB         XNOEUD          < X(NOEUD HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE,
         LR          Y,A
         SARD        NBITMO
         DV          PASIY
         MP          PASIY
         STB         YNOEUD          < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE.
         LA          XS
         CP          XNOEUD          < EST-ON EN UN NOEUD ???
         JNE         SPU31           < NON...
         LA          YS              < PEUT-ETRE :
         CP          YNOEUD          < EST-ON EN UN NOEUD ???
         JNE         SPU31           < NON, INTERPOLONS...
         BSR         ARDN            < LE POINT COURANT EST UN NOEUD...
         JMP         SPU30           < VERS L'ACCES A LA VALEUR DU NOEUD...
SPU31:   EQU         $
         LA          XNOEUD
         NGR         A,A
         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.
         LA          YNOEUD
         NGR         A,A
         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.
         LX          XNOEUD
         LY          YNOEUD
         STX         XS              < ON SE PLACE AU NOEUD
         STY         YS              < HAUT-GAUCHE DE LA MAILLE...
         BSR         ARDN
         FST         AFNIV1          < NIVEAU(XNOEUD,YNOEUD),
         LA          XS
         AD          PASIX
         STA         XS
         BSR         ARDN
         FST         AFNIV2          < NIVEAU(XNOEUD+PASIX,YNOEUD),
         LA          YS
         AD          PASIY
         STA         YS
         BSR         ARDN
         FST         AFNIV3          < NIVEAU(XNOEUD+PASIX,YNOEUD+PASIY),
         LA          XS
         SB          PASIX
         STA         XS
         BSR         ARDN
         FST         AFNIV4          < NIVEAU(XNOEUD,YNOEUD+PASIY).
         BSR         BINTER          < ET INTERPOLATION...
<
< SORTIE :
<
SPU30:   EQU         $
         PLR         X,Y
         STY         YS              < RESTAURE
         STX         XS              <          LE POINT COURANT...
         PLR         X,Y
         RSR
<
<
<        G E N E R A T E U R   A L E A T O I R E  :
<
<
SPRDN2:  EQU         $
         FLT
SPRDN5:  EQU         $               < CAS DE L'ENTREE DES CONDITIONS INITIALES.
         FMP         F05             < RDN/2,
         PSR         A,B             < SAVE RDN/2...
         FAD         INFIN2          < (RDN+INFINI)/2,
         FST         FWORK4
         LA          XA0010          < BORNE SUPERIEURE,
         FLT
         FMP         FWORK4
         FST         FWORK4
         PLR         A,B             < RDN/2,
         FSB         INFIN2          < (RDN-INFINI)/2,
         FST         FWORK5
         LA          XA0011          < BORNE INFERIEURE,
         FLT
         FMP         FWORK5
         FST         FWORK5
         FLD         FWORK4
         FSB         FWORK5
         FDV         INFIN1          < MISE A L'ECHELLE...
         FIX
         CP          XA0010          < ???
         JG          SPRDN2          < ON RECOMMENCE ; CE CAS PEUT SE PRODUIRE
                                     < AVEC LES CONTRAINTES PAR 'TV2'...
         CP          XA0011          < ???
         JL          SPRDN2          < ON ITERE (CF. 'TV2')...
         FLT
         FMP         FMUL
         RSR
<
<
<        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  :
<
<
SQRDN:   EQU         $
<
< DISCRIMINATIONS INITIALES :
<
         LA          KITER
         CPI         1               < EST-CE LA PREMIERE GENERATION ???
         JNE         SPRDN4          < NON, TIRAGE ALEATOIRE...
         CPZ         XA20            < OUI, FAUT-IL INITIALISER PAR DES
                                     < CONTRAINTES 'TV2' ???
         JNE         SPIR            < OUI...
<
<
<        G E N E R A T I O N   A L E A T O I R E  :
<
<
SPRDN4:  EQU         $
         LA          XS
         FLT
         FST         FWORK4          < SAVE LE 'XS' FLOTTANT...
         LA          YS
         FLT
         FST         FWORK5          < SAVE LE 'YS' FLOTTANT...
         FMP         FWORK4          < ET ON CONSTRUIT
         FAD         FWORK5          < UNE FONCTION UNIQUE
         FAD         FWORK4          < DU NOEUD COURANT...
         EORR        B,A
         AD          RDN1
         MP          KITER           < AFIN DE GENERER TOUJOURS LES MEMES
                                     < NOMBRES ALEATOIRES AU MEME NIVEAU DE
                                     < RECURSION...
         EORR        B,A             < (A)=F(XS,YS,PASIX INITIAL,PASIY INITIAL).
         EOR         XA16            < PARAMETRE VARIABLE...
         FLT                         < INITIALISATION DU GENERATEUR...
         BSR         ASIN            < DONT ON PREND LE SINUS...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
         JMP         SPRDN2          < QUE L'ON CONSIDERE ENTIER...
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         $
         LA          CTCDA
         STA         XCTCDA          < PASSAGE SUR 'TV2'...
<
< INITIALISATION DE LA SPIRALE :
<
         LA          XS
         LB          YS
         PSR         A,B             < SAUVEGARDE DU POINT (XS,YS).
         FLT
         FDV         XA18
         BSR         AROND
         STA         XS              < RE-NORMALISATION...
         LA          YS
         FLT
         FDV         XA18
         BSR         AROND
         STA         YS              < IDEM...
         STZ         CUMUL           < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         LA          PASQ
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         1
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIRALE.
SPMOY8:  EQU         $
<
< PARCOURS D'UN BRAS :
<
SPMOY1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPMOY2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NPM             < FINI ???
         JG          SPMOY3          < OUI...
         LA          XS              < NON :
         JAL         SPMOY4          < LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPMOY4          < HORS-ECRAN...
         LA          YS
         JAL         SPMOY4          < HORS-ECRAN...
         CPI         NLIGM1
         JG          SPMOY4          < HORS-ECRAN...
         BSR         ASPGPS          < A=NIVEAU(XS,YS),
         AD          CUMUL           < ET
         STA         CUMUL           < CUMULE...
SPMOY4:  EQU         $
         LA          XS
         AD          DELTAX          < CHANGEMENT DE
         STA         XS
         LA          YS
         AD          DELTAY          < POINT COURANT (XS,YS).
         STA         YS
         DC          LB              < DECOMPTAGE DES POINTS SUR LA BRANCHE :
         JG          SPMOY2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPMOY5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPMOY5:  EQU         $
         LA          DELTAY          < ON FAIT SUBIR AU NOMBRE COMPLEXE
         NGR         A,A             < (DX,DY) UNE ROTATION DE PI/2, SOIT
         LB          DELTAX          < UNE MULTIPLICATION PAR LA MATRICE
                                     < (0,-1,1,0)...
         STA         DELTAX          < DELTAX=-DELTAY,
         STB         DELTAY          < DELTAY=DELTAX.
         JMP         SPMOY1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (XS,YS) :
<
SPMOY3:  EQU         $
         PLR         A,B
         STA         XS              < RESTAURATION
         STB         YS              < DE (XS,YS),
<
< NORMALISATION DU CUMUL :
<
         LA          CUMUL
SPMOY6:  EQU         $               < CAS OU LE Z-BUFFER CONNAIT DEJA (XS,YS) :
         FLT
         FDV         FNP
         FMP         XA23            < ET AMPLIFICATION...
<
< SORTIE :
<
         STZ         XCTCDA          < RETOUR SUR 'TV1'...
         BR          APRDN5          < VERS LA SORTIE...
<
<
<        C A L C U L   D U   R A Y O N  :
<
<
<        ARGUMENT :
<                    (A,B)=FONCTION COURANTE.
<
<
<        RESULTAT :
<                    (A,B)=(A5+A0*F(XR,YR))*(FONCTION COURANTE).
<
<
RAYON:   EQU         $
         FCMZ        FA0             < LA CONSTANTE MULTIPLICATIVE EST-ELLE
                                     < NULLE ???
         JE          RAYON1          < OUI, RIEN A FAIRE...
RAYON2:  EQU         $
         PSR         A,B             < SAVE LE CUMUL INITIAL...
<
< CALCUL DU POINT COURANT ET
< POSITION DANS UN CARRE DE
< COORDONNEES ENTIERES :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         FLT
         FAD         FWORK
         FMP         XA18            < SCALING...
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         FIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         FLT
         FSB         GXS
         FNEG
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         FLT
         FAD         FWORK
         FMP         XA18            < SCALING...
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
         FIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         FLT
         FSB         GYS
         FNEG
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         BSR         ARCRD
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ARCRD
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ARCRD
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ARCRD
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         GNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         GINCU
         FMP         FWORK2
         FMP         GNIV2
         BSR         AQWORK          < +FU*(1-FV)*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         BSR         AQWORK          < +FU*FV*N3,
         FLD         FWORK1
         FMP         GINCV
         FMP         GNIV4
         FAD         FWORK           < +(1-FU)*FV*N4,
<
< CALCUL DE LA FONCTION COURANTE :
<
         FMP         FA0             < AMPLIFICATION,
         FAD         FA5             < ET TRANSLATION.
         FST         FWORK           < RAYON=FA5+FA0*F(XR,YR).
         PLR         A,B             < RESTAURATION DU CUMUL,
         FMP         FWORK           < ET CALCUL DE LA FONCTION COURANTE...
<
< RETOUR :
<
RAYON1:  EQU         $
         RSR
<
<
<        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 "  :
<
<
RCRD:    EQU         $
<
< INITIALISATION ET SAUVEGARDES :
<
         LA          PASIX
         LB          PASIY
         PSR         A,B,X           < SAUVEGARDE DE (PASIX,PASIY)...
         FLD         F0
         FST         FCUMR           < INITIALISATION DU CUMUL DES FONCTIONS
                                     < ALEATOIRES SCALANTES...
         FLD         FPOND0
         FST         FPOND           < INITIALISATOON DE LA PONDERATTION DES
                                     < FONCTIONS ALEATOIRES...
<
< ITERATION POUR CHAQUE
< FONCTION ALEATOIRE :
<
         STZ         KITER           < INITIALISATION DES RECURSIONS...
         LX          XA17            < (X)=NOMBRE D'ITERATIONS MAX...
RCRD1:   EQU         $
         IC          KITER           < COMPTAGE DES RECURSIONS...
         LA          PASIX
         FLT
         FST         FPASIX
         LA          PASIY
         FLT
         FST         FPASIY
         BSR         APRDN           < (A,B)=VALEUR ALEATOIRE ASSOCIEE AU
                                     < POINT (XS,YS) ET A LA GRILLE COURANTE
                                     < (PASIX,PASIY)...
         FMP         FPOND
         FDV         FPOND0          < ET ON LA PONDERE PAR FPOND/FPOND0,
                                     < 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...
         FLD         FPOND
         BSR         ARAK
         FST         FPOND           < DECROISSANCE DES AMPLITUDES DES FONCTIONS
                                     < ALEATOIRES...
         FLD         FPASIX
         BSR         ARAC            < ON REDUIT LA MAILLE, PAR :
                                     < MAILLE=RAC(MAILLE)...
                                     < A T T E N T I O N  : ON UTILISE 'RAC'
                                     < ET NON PAS 'RAK' COMME DANS #CHAMP 4#...
         BSR         AROND
         LY          PASIX           < (Y)=PASIX AVANT...
         STA         PASIX
         FLD         FPASIY
         BSR         ARAC
         BSR         AROND
         CP          PASIY           < EST-ON AU PLANCHER ???
         STA         PASIY
         JNE         RCRD2           < NON, ON ITERE, A MOINS QUE LE COMPTE
                                     < MAX SOIT ATTEINT...
         LR          Y,A
         CP          PASIX           < PEUT-ETRE...
         JE          RCRD3           < ET OUI, ON ARRETE LA...
RCRD2:   EQU         $               < PAS ENCORE LE PLANCHER...
         JDX         RCRD1           < ET ON ITERE JUSQU'A ATTEINDRE LA
                                     < DEFINITION DE L'ECRAN OU LE MAX DES
                                     < ITERATIONS...
<
< FIN DE RECURSION :
<
RCRD3:   EQU         $
         PLR         A,B,X           < ON RESTAURE
         STB         PASIY           < LA GRILLE
         STA         PASIX           < INITIALE...
         FLD         FCUMR           < ET ON RENVOIE LA SOMME DES
                                     < FONCTIONS ALEATOIRES...
         FMP         FA3             < QUE L'ON NORMALISE...
         RSR
<
<
<        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   P / ( 2 * * Q )  :
<
<
<        ARGUMENT :
<                    (A,B)=NOMBRE 'N' ARGUMENT,
<
<
<        RESULTAT :
<                    (A,B)='N' A LA PUISSANCE P/(2**Q).
<
<
RAK:     EQU         $
         FCAZ
         JE          RAK2            < NOMBRE=0 ==> RAKINE=0...
         JG          RAK3            < OK, NOMBRE>0...
         QUIT        1               < ??!??!?!
RAK3:    EQU         $
         PSR         X
<
< ELEVATION A LA PUISSANCE '1/(2**Q)' :
<
         LX          EXPOQ           < (X)=EXPOSANT DE 2**Q,
RAK6:    EQU         $
         BSR         ARAC            < ET ON CALCULE (A,B)**(1/(2**Q))...
         JDX         RAK6
<
< ELEVATION A LA PUISSANCE 'P' :
<
         LX          EXPOP           < (X)=EXPOSANT 'P',
         FST         FWORK           < (A,B)=NOMBRE ARGUMENT,
RAK4:    EQU         $
         ADRI        -1,X
         CPZR        X               < EST-CE FINI ???
         JE          RAK5            < OUI...
         FMP         FWORK           < NON, ON LE MULTIPLIE P-1 FOIS PAR
                                     < LUI-MEME...
         JMP         RAK4
RAK5:    EQU         $
         PLR         X
RAK2:    EQU         $
         RSR
         NLS
XWOR%9:  VAL         0
         LST
:F
:F
< <<'SIOP RAYON CHAMP 5'
DF'SIOP RAYON CHAMP 6'
ED'SIOP RAYON CHAMP 6'
IN0
         NLS
         IDP         "SIOP RAYON CHAMP 6"
<        R A Y O N   C H A M P   6  :
         IF          XXXRDN-1,XWOR%9,,XWOR%9
         LST
XXSPIR:: VAL         1               < 0 : GENERER LES CONTRAINTES INITIALES
                                     <     PAR DES SPIRALES SUR 'TV2',
                                     < 1 : NE PAS PRENDRE EN COMPTE DE
                                     <     CONTRAINTES INITIALES.
A0::     VAL         0               < AMPLIFICATEUR DE LA FONCTION MONTA-
                                     < GNEUSE F(XR,YR).
A1::     VAL         A0+1            < DEPLACEMENT SUR L'AXE DES 'X', A LA
                                     < CHARGE DU MODULE APPELANT...
A2::     VAL         A1+1            < DEPLACEMENT SUR L'AXE DES 'Y', A LA
                                     < CHARGE DU MODULE APPELANT...
A3::     VAL         A2+1            < AMPLIFICATEUR DES VALEURS ALEATOIRES
                                     < CORRELEES.
A4::     VAL         A3+1            < INUTILISE...
A5::     VAL         A4+1            < VALEUR MOYENNE DE LA FONCTION MONTA-
                                     < GNEUSE : A5+A0*F(XR,YR).
A10::    VAL         '10             < BORNE SUP(RDN),
A11::    VAL         A10+1           < BORNE INF(RDN),
A12::    VAL         A11+1           < MULTIPLICATEUR(RDN).
A13::    VAL         A12+1           < INUTILISE...
A14::    VAL         A13+1           < PAS EN 'X' DE LA GRILLE DE DEPART,
A15::    VAL         A14+1           < PAS EN 'Y' DE LA GRILLE DE DEPART.
A16::    VAL         A15+1           < PARAMETRE DE DEFINITION DU GENERATEUR
                                     < ALEATOIRE...
A17::    VAL         A16+1           < NOMBRE DE RECURSION MAX LORS DE LA SOM-
                                     < MATION DES FONCTIONS ALEATOIRES.
A18::    VAL         A17+1           < FACTEUR D'ECHELLE DES COORDONNEES...
A19::    VAL         A18+1           < EXPOSANT 'P' DES EXPONENTIELLES,
A20::    VAL         '20             < DISCRIMINATEUR DES CONTRAINTES INITIALES:
                                     < =0 : NON, GENERATION PUREMENT ALEATOIRE,
                                     < #0 : LA PREMIERE GENERATION (KITER=1)
                                     <      EST CONTRAINTE PAR 'TV2'...
A21::    VAL         A20+1           < NOMBRE DE POINTS MAX DE LA SPIRALE,
A22::    VAL         A21+1           < PAS DE PARCOURS DE LA SPIRALE,
A23::    VAL         A22+1           < FACTEUR D'AMPLIFICATION DES CONTRAINTES
                                     < APRES NORMALISATION...
A24::    VAL         A23+1           < GENERATION ALEATOIRE SUR UN X-TORE :
                                     < 0 : OUI, SUR UN X-TORE,
                                     < 1 : NON, SUR UN X-PLAN.
A25::    VAL         A24+1           < GENERATION ALEATOIRE SUR UN Y-TORE :
                                     < 0 : OUI, SUR UN Y-TORE,
                                     < 1 : NON, SUR UN Y-PLAN.
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-2,XWOR%9,,XWOR%9
         LST
<
< INDICATEUR DE PREMIER PASSAGE :
<
PREM:    WORD        0               < =0 : PREMIER PASSAGE,
                                     < #0 : PASSAGES SUIVANTS.
<
< VARIABLES MONTAGNEUSES :
<
XA18:    FLOAT       0               < FACTEUR D'ECHELLE LOCAL DES COORDONNEES
                                     < ENVOYEES PAR ' +'...
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
GINCU:   FLOAT       0               < RESIDU DE L'ABSCISSE,
GINCV:   FLOAT       0               < RESIDU DE L'ORDONNEE.
GNIV1:   FLOAT       0               < SIGMA PONDERE DES FONCTIONS ALEATOIRES
                                     < CENTREE EN (XS,YS),
GNIV2:   FLOAT       0               < DE MEME EN (XS+1,YS),
GNIV3:   FLOAT       0               < DE MEME EN (XS+1,YS+1),
GNIV4:   FLOAT       0               < DE MEME EN (XS,YS+1).
FA0:     FLOAT       0               < CONSTANTE 'A0',
FA3:     FLOAT       0               < AMPLIFICATEUR DES VALEURS ALEATOIRES
                                     < CORRELEES...
FA5:     FLOAT       0               < ET 'A5'.
FCUMR:   FLOAT       0               < SIGMA DES FONCTIONS ALEATOIRES
                                     < SCALANTES.
FPOND:   FLOAT       0               < POUR LES PONDERER...
FPOND0:: FLOAT       0               < VALEUR INITIALE DE LA PONDERATION :
                                     < FPOND0=RAC(PASIX*PASIY).
EXPOP:   FLOAT       0               < EXPOSANT DE CALCUL DES EXPONENTIELLES.
         IF          XXSPIR,XWOR%7,,XWOR%7
<
< DONNEES DES CONTRAINTES INITIALES :
<
XA20:    WORD        0               < =0 : PAS DE CONTRAINTES MAIS DU RDN,
                                     < #0 : CONTRAINTES INITIALES PAR 'TV2'...
FNP:     FLOAT       0               < NOMBRE DE POINTS FLOTTANT DE LA SPIRALE.
XA23:    FLOAT       0               < AMPLIFICATEUR DES CONDITIONS INITIALES...
CUMUL:   WORD        0               < SIGMA(NIVEAU(XS,YS)).
PASQ:    WORD        0               < ARGUMENT 'A4'.
DELTAX:  WORD        0
DELTAY:  WORD        0
LB:      WORD        0               < LONGUEUR DES
LB0:     WORD        0               <              BRANCHES DE LA SPIRALE.
NP:      WORD        0               < NOMBRE DE POINT COURANT,
NPM:     WORD        0               < NOMBRE DE POINTS ENTIER DE LA SPIRALE.
XWOR%7:  VAL         0
<
< TRANSLATION SUR OX ET OY :
<
XFA1:    FLOAT       0               < 'OX',
XFA2:    FLOAT       0               < ET 'OY'...
<
< RELAIS MONTAGNEUX :
<
         IF          XXSPIR,XWOR%7,,XWOR%7
APRDN5:  WORD        SPRDN5          < REALI...
XWOR%7:  VAL         0
ARCRD:   WORD        RCRD            < CALCUL DU CHAMP ALEATOIRE...
ARAYON:  WORD        RAYON           < CALCUL DE LA FONCTION COURANTE.
<
< DEFINITION DE LA GRILLE :
<
PASIX:   WORD        0               < PAS SUR OX,
PASIY:   WORD        0               < PAS SUR OY.
FPASIX:  FLOAT       0               < DE MEME
FPASIY:  FLOAT       0               <         EN FLOTTANT...
XNOEUD:  WORD        0               < X(NOEUD HAUT-GAUCHE) DE LA MAILLE,
YNOEUD:  WORD        0               < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE.
AFNIV1:  FLOAT       0
AFNIV2:  FLOAT       0
AFNIV3:  FLOAT       0
AFNIV4:  FLOAT       0
XA17:    WORD        0               < PARAMETRE 'A17'.
KITER:   WORD        0               < COMPTAGE DES RECURSIONS...
TOREX:   WORD        0               < GENERATION ALEATOIRE SUR UN X-TORE :
                                     < 0 : OUI, SUR UN X-TORE,
                                     < 1 : NON, SUR UN X-PLAN.
TOREY:   WORD        0               < GENERATION ALEATOIRE SUR UN Y-TORE :
                                     < 0 : OUI, SUR UN Y-TORE,
                                     < 1 : NON, SUR UN Y-PLAN.
MAXTOR:  WORD        0               < CONTIENT LA "LONGUEUR" DU TORE APRES
                                     < SCALING PAR 'XA18'...
<
< PARAMETRES DU GENERATEUR ALEATOIRE :
<
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
XA16:    WORD        0               < PARAMETRE VARIABLE...
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
XA0010:  WORD        0               < BORNE SUPERIEURE,
XA0011:  WORD        0               < BORNE INFERIEURE...
FMUL:    FLOAT       0               < MULTIPLICATEUR...
INFIN1:  FLOAT       32768
INFIN2:  FLOAT       16384           < INFINI/2...
FWORK4:  FLOAT       0
FWORK5:  FLOAT       0
HINCU:   FLOAT       0               < POUR
HINCV:   FLOAT       0               <      L'INTERPOLATION...
<
< POUR LE CALCUL DU LOGARITHME :
<
ZZZ001:  DZS         2               < NB FLOTTANT
ZZZ002:  DZS         2
ZZZ003:  DZS         2
ZZZ004:  WORD        '5A00;'8279     < RACINE(2)/2
ZZZ005:  WORD        '5201;'B046     < CSTES DU DEVELOPPEMENT
ZZZ006:  WORD        '5402;'79B7
ZZZ007:  WORD        '6A01;'0867
ZZZ008:  EQU         F05             < CSTE 0.5
ZZZ009:  WORD        '5800;'B90C     < CSTE LN(2)
ZZZ010:: VAL         'FF00           < MASQUE.
<
< POUR LE CALCUL DE L'EXPONENTIELLE :
<
ZZZ021:  EQU         ZZZ001          < NB EN FLOTTANT
ZZZ022:  EQU         ZZZ002
ZZZ023:  EQU         ZZZ003
ZZZ024:  WORD        '5C01;'551E     < LOG A BASE 2 DE E
ZZZ025:  DZS         1               < RELEVE DE L'EXPOSANT
ZZZ026:  EQU         F1              < 1.0
ZZZ027:  WORD        '4002;'0000     < 2.0
ZZZ028:  WORD        '5707;'6AE1     < CSTES DU POLYNOME
ZZZ029:  WORD        '46FC;'FA70
ZZZ030:  WORD        'BA0F;'5917
ZZZ031:  WORD        '4F04;'A303
ZZZ032:: VAL         ZZZ010          < MASQUE
SIGNE:   WORD        0               < POUR DETERMINER LE SIGNE DE X**Y...
<
< RELAIS DE SOUS-PROGRAMMES :
<
BINTER:  WORD        QINTER          < MODULE D'INTERPOLATION...
AQWORK:  WORD        PWORK           < 'FAD FWORK', PUIS 'FST FWORK'...
ARDN:    WORD        SQRDN           < GENERATEUR ALEATOIRE.
APRDN:   WORD        PRDN            < CALCUL D'UNE VALEUR ALEATOIRE SUR LA
                                     < GRILLE COURANTE...
ARAK:    WORD        RAK             < CALCUL DE LA PUISSANCE P/(2**Q) D'UN
                                     < NOMBRE...
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-3,XWOR%9,,XWOR%9
         LST
<
< AMPLIFICATEUR DE LA VARIATION DU RAYON
< ET VALEUR MINIMALE DE CELUI-CI :
<
         LXI         A0
         BSR         ASPCT
         FST         FA0
         LXI         A5
         BSR         ASPCT
         FST         FA5
         LXI         A3
         BSR         ASPCT
         FST         FA3
<
< TRANSLATION SUR OX ET OY :
<
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
<
< ENTREE DES PARAMETRES
< DE GENERATION ALEATOIRE :
<
         LXI         A10
         BSR         ASPCT
         BSR         AFIX
         STA         XA0010          < BORNE SUPERIEURE,
         LXI         A11
         BSR         ASPCT
         BSR         AFIX
         STA         XA0011          < ET BORNE INFERIEURE...
         LXI         A12
         BSR         ASPCT
         BSR         AFCAZ
         JLE         $               < ????!?!
         FST         FMUL
         LXI         A16
         BSR         ASPCT
         BSR         AROND
         STA         XA16            < PARAMETRE D'INITIALISATION...
<
< ENTREE DE LA GRILLE :
<
         LXI         A18
         BSR         ASPCT
         BSR         AFCAZ
         JLE         $               < ??!?!??!
         FST         XA18            < FCATEUR D'ECHELLE LOCAL...
         LXI         A14
         BSR         ASPCT
         FMP         XA18            < POUR AVOIR UNE GENERATION SCALANTE...
         BSR         AROND
         JALE        $               < ???
         STA         PASIX           < PAS EN 'X',
         BSR         AFLT
         FST         FWORK5          < FWORK5=PASIX...
         LXI         A15
         BSR         ASPCT
         FMP         XA18            < POUR AVOIR UNE GENERATION SCALANTE...
         BSR         AROND
         JALE        $               < ???
         STA         PASIY           < ET PAS EN 'Y'...
         BSR         AFLT
         FMP         FWORK5          < 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...
         LXI         A17
         BSR         ASPCT
         BSR         AROND
         JALE        $               < ?!?!???
         STA         XA17            < NOMBRE DE RECURSION MAX LORS DE LA
                                     < SOMMATION DES FONCTIONS ALEATOIRES.
         IF          NLIGM1-NPOLM1,,XWOR%,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XWOR%:   VAL         0
         LAI         NLIGM1?NPOLM1
         ADRI        1,A             < PARCE QU'UNE INSTRUCTION IMMEDIATE NE
                                     < PEUT CONTENIR QUE 8 BITS...
         BSR         AFLT            < FLOTTAGE,
         FMP         XA18            < SCALING,
         BSR         AROND           < FIXAGE,
         STA         MAXTOR          < CE QUI DONNE LA "LONGUEUR" DU TORE...
<
< ENTREE DES X/Y-TORES :
<
         LXI         A24
         BSR         ASPCT
         BSR         AROND
         STA         TOREX           < DEFINITION DU X-TORE.
         LXI         A25
         BSR         ASPCT
         BSR         AROND
         STA         TOREY           < DEFINITION DU Y-TORE.
<
< DEFINITION DES EXPONENTIATIONS :
<
         LXI         A19
         BSR         ASPCT
         FST         EXPOP
         IF          XXSPIR,XWOR%7,,XWOR%7
<
< DEFINITION DE LA SPIRALE :
<
         LXI         A20
         BSR         ASPCT
         BSR         AROND
         STA         XA20            < CONTRAINTE OU PAS...
         LXI         A21
         BSR         ASPCT
         FST         FNP
         BSR         AROND
         JALE        $               < ?!??!?!
         STA         NPM             < NOMBRE DE POINTS MAX...
         LXI         A22
         BSR         ASPCT
         BSR         AROND
         STA         PASQ            < PAS DE PARCOURS...
         LXI         A23
         BSR         ASPCT
         FST         XA23            < AMPLIFICATEUR DES CONDITIONS INITIALES...
XWOR%7:  VAL         0
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-4,XWOR%9,,XWOR%9
         LST
<
<
<        I N T E R P O L A T I O N  :
<
<
<        NOTA :
<                      ON N'UTILISE PAS 'PINTER' DE
<                    'SI  +', CAR CELUI-CI UTILISE
<                    LA BASE 'L' POUR APPELER LE
<                    SOUS-PROGRAMME 'PWORK' !!!
<
<
QINTER:  EQU         $
         FLD         F1
         FSB         HINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         HINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         AFNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         HINCU
         FMP         FWORK2
         FMP         AFNIV2
         BSR         AQWORK          < +FU*(1-FV)*N2,
         FLD         HINCU
         FMP         HINCV
         FMP         AFNIV3
         BSR         AQWORK          < +FU*FV*N3,
         FLD         FWORK1
         FMP         HINCV
         FMP         AFNIV4
         BSR         AQWORK          < +(1-FU)*FV*N4,
         RSR
<
<
<        C A L C U L   D E   R D N ( X S , Y S )  :
<
<
<        ARGUMENT :
<                    (XS,YS)=POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=VALEUR ALEATOIRE ASSOCIEE A (XS,YS)
<                          ISSUE DIRECTEMENT DE 'RDN' SI (XS,YS)
<                          EST UN NOEUD DE LA GRILLE COURANTE,
<                          ET UNE VALEUR INTERPOLEE SINON...
<
<
PRDN:    EQU         $
         PSR         X,Y
         LX          XS              < PLACONS NOUS AU
         LY          YS              < POINT COURANT...
         PSR         X,Y             < ET SAVE...
         LR          X,A
         SARD        NBITMO
         DV          PASIX
         MP          PASIX
         STB         XNOEUD          < X(NOEUD HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE,
         LR          Y,A
         SARD        NBITMO
         DV          PASIY
         MP          PASIY
         STB         YNOEUD          < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE
                                     < COURANTE.
         LA          XS
         CP          XNOEUD          < EST-ON EN UN NOEUD ???
         JNE         SPU31           < NON...
         LA          YS              < PEUT-ETRE :
         CP          YNOEUD          < EST-ON EN UN NOEUD ???
         JNE         SPU31           < NON, INTERPOLONS...
         BSR         ARDN            < LE POINT COURANT EST UN NOEUD...
         JMP         SPU30           < VERS L'ACCES A LA VALEUR DU NOEUD...
SPU31:   EQU         $
         LA          XNOEUD
         NGR         A,A
         BSR         AFLT
         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.
         LA          YNOEUD
         NGR         A,A
         BSR         AFLT
         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.
         LX          XNOEUD
         LY          YNOEUD
         STX         XS              < ON SE PLACE AU NOEUD
         STY         YS              < HAUT-GAUCHE DE LA MAILLE...
         BSR         ARDN
         FST         AFNIV1          < NIVEAU(XNOEUD,YNOEUD),
         LA          XS
         AD          PASIX
         STA         XS
         BSR         ARDN
         FST         AFNIV2          < NIVEAU(XNOEUD+PASIX,YNOEUD),
         LA          YS
         AD          PASIY
         STA         YS
         BSR         ARDN
         FST         AFNIV3          < NIVEAU(XNOEUD+PASIX,YNOEUD+PASIY),
         LA          XS
         SB          PASIX
         STA         XS
         BSR         ARDN
         FST         AFNIV4          < NIVEAU(XNOEUD,YNOEUD+PASIY).
         BSR         BINTER          < ET INTERPOLATION...
<
< SORTIE :
<
SPU30:   EQU         $
         PLR         X,Y
         STY         YS              < RESTAURE
         STX         XS              <          LE POINT COURANT...
         PLR         X,Y
         RSR
<
<
<        G E N E R A T E U R   A L E A T O I R E  :
<
<
SPRDN2:  EQU         $
         BSR         AFLT
SPRDN5:  EQU         $               < CAS DE L'ENTREE DES CONDITIONS INITIALES.
         FMP         F05             < RDN/2,
         PSR         A,B             < SAVE RDN/2...
         FAD         INFIN2          < (RDN+INFINI)/2,
         FST         FWORK4
         LA          XA0010          < BORNE SUPERIEURE,
         BSR         AFLT
         FMP         FWORK4
         FST         FWORK4
         PLR         A,B             < RDN/2,
         FSB         INFIN2          < (RDN-INFINI)/2,
         FST         FWORK5
         LA          XA0011          < BORNE INFERIEURE,
         BSR         AFLT
         FMP         FWORK5
         FST         FWORK5
         FLD         FWORK4
         FSB         FWORK5
         FDV         INFIN1          < MISE A L'ECHELLE...
         BSR         AFIX
         CP          XA0010          < ???
         JG          SPRDN2          < ON RECOMMENCE ; CE CAS PEUT SE PRODUIRE
                                     < AVEC LES CONTRAINTES PAR 'TV2'...
         CP          XA0011          < ???
         JL          SPRDN2          < ON ITERE (CF. 'TV2')...
         BSR         AFLT
         FMP         FMUL
<
< RESTAURATIONS ET SORTIE :
<
         FST         FWORK           < SAUVEGARDE DU 'RDN' COURANT,
         PLR         A,B
         STB         YS              < RESTAURATION
         STA         XS              <              DU POINT (XS,YS),
         FLD         FWORK           < ET DU NOMBRE ALEATOIRE GENERE...
         RSR
<
<
<        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  :
<
<
SQRDN:   EQU         $
<
< GESTION DES X/Y-TORES :
<
         LA          XS
         LB          YS
         PSR         A,B             < SAUVEGARDE DE (XS,YS) A PRIORI...
         CPZ         TOREX           < EST-ON SUR UN X-TORE ALEATOIRE ???
         JNE         SQRDN1          < NON...
         LA          XS              < OUI, REDUCTION DE 'XS' :
SQRDN2:  EQU         $
         JAGE        SQRDN3          < OK, POSITIF...
         AD          MAXTOR          < NEGATIF, ON LE REND POSITIF...
         JMP         SQRDN2
SQRDN3:  EQU         $
         SARD        NBITMO
         DV          MAXTOR
         STB         XS              < ET ON CALCULE 'XS' MODULO 'MAXTOR'...
SQRDN1:  EQU         $
         CPZ         TOREY           < EST-ON SUR UN Y-TORE ???
         JNE         SQRDN4          < NON...
         LA          YS              < OUI, REDUCTION DE 'YS' :
SQRDN5:  EQU         $
         JAGE        SQRDN6          < OK, POSITIF...
         AD          MAXTOR          < NEGATIF, ON LE REND POSITIF...
         JMP         SQRDN5
SQRDN6:  EQU         $
         SARD        NBITMO
         DV          MAXTOR
         STB         YS              < ET ON CALCULE 'YS' MODULO 'MAXTOR'...
SQRDN4:  EQU         $
         IF          XXSPIR,XWOR%7,,XWOR%7
<
< DISCRIMINATIONS INITIALES :
<
         LA          KITER
         CPI         1               < EST-CE LA PREMIERE GENERATION ???
         JNE         SPRDN4          < NON, TIRAGE ALEATOIRE...
         CPZ         XA20            < OUI, FAUT-IL INITIALISER PAR DES
                                     < CONTRAINTES 'TV2' ???
         JNE         SPIR            < OUI...
XWOR%7:  VAL         0
<
<
<        G E N E R A T I O N   A L E A T O I R E  :
<
<
SPRDN4:  EQU         $
         LA          XS
         BSR         AFLT
         FST         FWORK4          < SAVE LE 'XS' FLOTTANT...
         LA          YS
         BSR         AFLT
         FST         FWORK5          < SAVE LE 'YS' FLOTTANT...
         FMP         FWORK4          < ET ON CONSTRUIT
         FAD         FWORK5          < UNE FONCTION UNIQUE
         FSB         FWORK4          < DU NOEUD COURANT, AVEC :
                                     < (F(X,Y)#F(Y,X) !!!
         EORR        B,A
         AD          RDN1
         MP          KITER           < AFIN DE GENERER TOUJOURS LES MEMES
                                     < NOMBRES ALEATOIRES AU MEME NIVEAU DE
                                     < RECURSION...
         EORR        B,A             < (A)=F(XS,YS,PASIX INITIAL,PASIY INITIAL).
         EOR         XA16            < PARAMETRE VARIABLE...
         BSR         AFLT            < INITIALISATION DU GENERATEUR...
         BSR         ASIN            < DONT ON PREND LE SINUS...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
         JMP         SPRDN2          < QUE L'ON CONSIDERE ENTIER...
         IF          XXSPIR,XWOR%7,,XWOR%7
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         $
         LA          CTCDA
         STA         XCTCDA          < PASSAGE SUR 'TV2'...
<
< INITIALISATION DE LA SPIRALE :
<
         LA          XS
         LB          YS
         PSR         A,B             < SAUVEGARDE DU POINT (XS,YS).
         BSR         AFLT
         FDV         XA18
         BSR         AROND
         STA         XS              < RE-NORMALISATION...
         LA          YS
         BSR         AFLT
         FDV         XA18
         BSR         AROND
         STA         YS              < IDEM...
         STZ         CUMUL           < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         LA          PASQ
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         1
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIRALE.
SPMOY8:  EQU         $
<
< PARCOURS D'UN BRAS :
<
SPMOY1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPMOY2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NPM             < FINI ???
         JG          SPMOY3          < OUI...
         LA          XS              < NON :
         JAL         SPMOY4          < LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPMOY4          < HORS-ECRAN...
         LA          YS
         JAL         SPMOY4          < HORS-ECRAN...
         CPI         NLIGM1
         JG          SPMOY4          < HORS-ECRAN...
         BSR         ASPGPS          < A=NIVEAU(XS,YS),
         AD          CUMUL           < ET
         STA         CUMUL           < CUMULE...
SPMOY4:  EQU         $
         LA          XS
         AD          DELTAX          < CHANGEMENT DE
         STA         XS
         LA          YS
         AD          DELTAY          < POINT COURANT (XS,YS).
         STA         YS
         DC          LB              < DECOMPTAGE DES POINTS SUR LA BRANCHE :
         JG          SPMOY2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPMOY5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPMOY5:  EQU         $
         LA          DELTAY          < ON FAIT SUBIR AU NOMBRE COMPLEXE
         NGR         A,A             < (DX,DY) UNE ROTATION DE PI/2, SOIT
         LB          DELTAX          < UNE MULTIPLICATION PAR LA MATRICE
                                     < (0,-1,1,0)...
         STA         DELTAX          < DELTAX=-DELTAY,
         STB         DELTAY          < DELTAY=DELTAX.
         JMP         SPMOY1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (XS,YS) :
<
SPMOY3:  EQU         $
         PLR         A,B
         STA         XS              < RESTAURATION
         STB         YS              < DE (XS,YS),
<
< NORMALISATION DU CUMUL :
<
         LA          CUMUL
SPMOY6:  EQU         $               < CAS OU LE Z-BUFFER CONNAIT DEJA (XS,YS) :
         BSR         AFLT
         FDV         FNP
         FMP         XA23            < ET AMPLIFICATION...
<
< SORTIE :
<
         STZ         XCTCDA          < RETOUR SUR 'TV1'...
         BR          APRDN5          < VERS LA SORTIE...
XWOR%7:  VAL         0
<
<
<        C A L C U L   D U   R A Y O N  :
<
<
<        ARGUMENT :
<                    (A,B)=FONCTION COURANTE.
<
<
<        RESULTAT :
<                    (A,B)=(A5+A0*F(XR,YR))*(FONCTION COURANTE).
<
<
RAYON:   EQU         $
         FCMZ        FA0             < LA CONSTANTE MULTIPLICATIVE EST-ELLE
                                     < NULLE ???
         JE          RAYON1          < OUI, RIEN A FAIRE...
RAYON2:  EQU         $
         PSR         A,B             < SAVE LE CUMUL INITIAL...
<
< CALCUL DU POINT COURANT ET
< POSITION DANS UN CARRE DE
< COORDONNEES ENTIERES :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         BSR         AFLT
         FAD         FWORK
         FMP         XA18            < SCALING...
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         BSR         AFIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         BSR         AFLT
         FSB         GXS
         BSR         AFNEG
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         BSR         AFLT
         FAD         FWORK
         FMP         XA18            < SCALING...
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
         BSR         AFIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         BSR         AFLT
         FSB         GYS
         BSR         AFNEG
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         BSR         ARCRD
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ARCRD
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ARCRD
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ARCRD
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         GNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         GINCU
         FMP         FWORK2
         FMP         GNIV2
         BSR         AQWORK          < +FU*(1-FV)*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         BSR         AQWORK          < +FU*FV*N3,
         FLD         FWORK1
         FMP         GINCV
         FMP         GNIV4
         FAD         FWORK           < +(1-FU)*FV*N4,
<
< CALCUL DE LA FONCTION COURANTE :
<
         FMP         FA0             < AMPLIFICATION,
         FAD         FA5             < ET TRANSLATION.
         FST         FWORK           < RAYON=FA5+FA0*F(XR,YR).
         PLR         A,B             < RESTAURATION DU CUMUL,
         FMP         FWORK           < ET CALCUL DE LA FONCTION COURANTE...
<
< RETOUR :
<
RAYON1:  EQU         $
         RSR
<
<
<        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 "  :
<
<
RCRD:    EQU         $
<
< INITIALISATION ET SAUVEGARDES :
<
         LA          PASIX
         LB          PASIY
         PSR         A,B,X           < SAUVEGARDE DE (PASIX,PASIY)...
         FLD         F0
         FST         FCUMR           < INITIALISATION DU CUMUL DES FONCTIONS
                                     < ALEATOIRES SCALANTES...
         FLD         FPOND0
         FST         FPOND           < INITIALISATOON DE LA PONDERATTION DES
                                     < FONCTIONS ALEATOIRES...
<
< ITERATION POUR CHAQUE
< FONCTION ALEATOIRE :
<
         STZ         KITER           < INITIALISATION DES RECURSIONS...
         LX          XA17            < (X)=NOMBRE D'ITERATIONS MAX...
RCRD1:   EQU         $
         IC          KITER           < COMPTAGE DES RECURSIONS...
         LA          PASIX
         BSR         AFLT
         FST         FPASIX
         LA          PASIY
         BSR         AFLT
         FST         FPASIY
         BSR         APRDN           < (A,B)=VALEUR ALEATOIRE ASSOCIEE AU
                                     < POINT (XS,YS) ET A LA GRILLE COURANTE
                                     < (PASIX,PASIY)...
         FMP         FPOND
         FDV         FPOND0          < ET ON LA PONDERE PAR FPOND/FPOND0,
                                     < 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...
         FLD         FPOND
         BSR         ARAK
         FST         FPOND           < DECROISSANCE DES AMPLITUDES DES FONCTIONS
                                     < ALEATOIRES...
         FLD         FPASIX
         BSR         ARAK            < ON REDUIT LA MAILLE, PAR :
                                     < MAILLE=RAK(MAILLE)...
         BSR         AROND
         LY          PASIX           < (Y)=PASIX AVANT...
         STA         PASIX
         FLD         FPASIY
         BSR         ARAK
         BSR         AROND
         CP          PASIY           < EST-ON AU PLANCHER ???
         STA         PASIY
         JNE         RCRD2           < NON, ON ITERE, A MOINS QUE LE COMPTE
                                     < MAX SOIT ATTEINT...
         LR          Y,A
         CP          PASIX           < PEUT-ETRE...
         JE          RCRD3           < ET OUI, ON ARRETE LA...
RCRD2:   EQU         $               < PAS ENCORE LE PLANCHER...
         JDX         RCRD1           < ET ON ITERE JUSQU'A ATTEINDRE LA
                                     < DEFINITION DE L'ECRAN OU LE MAX DES
                                     < ITERATIONS...
<
< FIN DE RECURSION :
<
RCRD3:   EQU         $
         PLR         A,B,X           < ON RESTAURE
         STB         PASIY           < LA GRILLE
         STA         PASIX           < INITIALE...
         FLD         FCUMR           < ET ON RENVOIE LA SOMME DES
                                     < FONCTIONS ALEATOIRES...
         FMP         FA3             < QUE L'ON NORMALISE...
         RSR
<
<
<        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   P  :
<
<
<        ARGUMENT :
<                    (A,B)=NOMBRE 'N' ARGUMENT,
<
<
<        RESULTAT :
<                    (A,B)='N' A LA PUISSANCE P.
<
<
RAK:     EQU         $
<
<
<        L O G   N E P E R I E N  :
<
<
LOGN:    EQU         $
         STZ         SIGNE           < =0 : SIGNE "+" A PRIORI...
         BSR         AFCAZ
         JGE         LOGN1           < POSITIF...
         IC          SIGNE           < =1 : SIGNE "-"...
LOGN1:   EQU         $
         LR          A,Y
         BSR         AFABS
         ANDI        ZZZ010
         FST         ZZZ003
         FAD         ZZZ004
         FST         ZZZ002
         LR          Y,A
         SWBR        A
         SARS        8
         BSR         AFLT
         FST         ZZZ001
         FLD         ZZZ003
         FSB         ZZZ004
         FDV         ZZZ002
         FST         ZZZ003
         FMP         ZZZ003
         BSR         AFNEG
         FAD         ZZZ007
         FST         ZZZ002
         FLD         ZZZ006
         FDV         ZZZ002
         FAD         ZZZ005
         FMP         ZZZ003
         FSB         ZZZ008
         FAD         ZZZ001
         FMP         ZZZ009
<
<
<        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
         BSR         AFABS
         BSR         AROND           < ON PREND LA PARTIE ENTIERE (PAR EXCES
                                     < OU PAR DEFAUT) DE LA VALEUR ABSOLUE DE
                                     < L'EXPOSANT...
         TBT         NBITMO-1        < 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         ZZZ024
         FST         ZZZ023
         BSR         AFIX
         STA         ZZZ025
         BSR         AFLT
         FCAM        ZZZ023
         JNV         ZZZ033
         FLD         ZZZ026
         FST         ZZZ023
         JMP         ZZZ035
ZZZ033:  EQU         $
         CPZ         ZZZ023
         JGE         ZZZ034
         DC          ZZZ025
         LA          ZZZ025
         BSR         AFLT
ZZZ034:  EQU         $
         FSB         ZZZ023
         BSR         AFNEG
         FST         ZZZ022
         FMP         ZZZ022
         FST         ZZZ021
         FAD         ZZZ028
         FST         ZZZ023
         FLD         ZZZ030
         FDV         ZZZ023
         FAD         ZZZ021
         FMP         ZZZ029
         FAD         ZZZ031
         FSB         ZZZ022
         FST         ZZZ023
         FLD         ZZZ027
         FMP         ZZZ022
         FDV         ZZZ023
         FAD         ZZZ026
         FST         ZZZ023
ZZZ035:  EQU         $
         SWBR        A
         SARS        8
         AD          ZZZ025
         CPI         '7F
         JG          $
         CPI         -'80
         JGE         ZZZ036
         FLD         F0              < ON PREND LE MINIMUM...
         JMP         ZZZ037
ZZZ036:  EQU         $
         ANDI        'FF
         STA         ZZZ025
         LA          ZZZ023
         ANDI        ZZZ032
         AD          ZZZ025
ZZZ037:  EQU         $
         CPZ         SIGNE           < PRISE EN COMPTE DU SIGNE SIMULE :
         JE          EXP1            < POSITIF, ON LAISSE LE RESULTAT TEL QUEL..
         BSR         AFNEG           < NEGATIF, ON INVERSE...
EXP1:    EQU         $
         RSR
         NLS
XWOR%9:  VAL         0
         LST
:F
:F
< <<'SIOP RAYON CHAMP 6'
DF'SIOP RAYON RDN 1'
ED'SIOP RAYON RDN 1'
IN0
         NLS
         IDP         "SIOP RAYON RDN 1"
<        R A Y O N   R D N   1  :
         IF          XXXRDN-1,XWOR%9,,XWOR%9
         LST
A0::     VAL         0               < AMPLIFICATEUR DE LA FONCTION MONTA-
                                     < GNEUSE F(XR,YR).
A1::     VAL         A0+1            < DEPLACEMENT SUR L'AXE DES 'X', A LA
                                     < CHARGE DU MODULE APPELANT...
A2::     VAL         A1+1            < DEPLACEMENT SUR L'AXE DES 'Y', A LA
                                     < CHARGE DU MODULE APPELANT...
A3::     VAL         A2+1            < NOMBRE DE POINTS DE LA SPIRALE ; SI
                                     < CELUI-CI EST NUL, IL N'Y A PAS DE CALCUL
                                     < DE FONCTION MONTAGNEUSE...
A4::     VAL         A3+1            < PAS DE PARCOURS DE LA SPIRALE (+1 EN
                                     < GENERAL...).
A5::     VAL         A4+1            < VALEUR MOYENNE DE LA FONCTION MONTA-
                                     < GNEUSE : A5+A0*F(XR,YR).
A2F::    VAL         47              < POUR CALCULER LA BORNE SUPERIEURE DU
                                     < GENERATEUR ALEATOIRE...
A2E::    VAL         A2F-1           < ET SA BORNE INFERIEURE...
A2D::    VAL         A2E-1           < POUR INITIALISER LE GENERATEUR ; SI
                                     < CE PARAMETRE EST NUL, IL N'Y A
                                     < RIEN D'ALEATOIRE...
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-2,XWOR%9,,XWOR%9
         LST
<
< INDICATEUR DE PREMIER PASSAGE :
<
PREM:    WORD        0               < =0 : PREMIER PASSAGE,
                                     < #0 : PASSAGES SUIVANTS.
<
< VARIABLES MONTAGNEUSES :
<
CUMUL:   WORD        0               < SIGMA(NIVEAU(XS,YS)).
PASQ:    WORD        0               < ARGUMENT 'A4'.
DELTAX:  WORD        0
DELTAY:  WORD        0
LB:      WORD        0               < LONGUEUR DES
LB0:     WORD        0               <              BRANCHES DE LA SPIRALE.
NP:      WORD        0               < NOMBRE DE POINT COURANT,
NPM:     WORD        0               < NOMBRE DE POINTS ENTIER DE LA SPIRALE.
FNP:     FLOAT       0               < NOMBRE DE POINTS FLOTTANT DE LA SPIRALE.
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
GINCU:   FLOAT       0               < RESIDU DE L'ABSCISSE,
GINCV:   FLOAT       0               < RESIDU DE L'ORDONNEE.
GNIV1:   FLOAT       0               < SIGMA PONDERE DES NIVEAUX DE LA SPIRALE
                                     < CENTREE EN (XS,YS),
GNIV2:   FLOAT       0               < DE MEME EN (XS+1,YS),
GNIV3:   FLOAT       0               < DE MEME EN (XS+1,YS+1),
GNIV4:   FLOAT       0               < DE MEME EN (XS,YS+1).
FA0:     FLOAT       0               < CONSTANTE 'A0',
FA5:     FLOAT       0               < ET 'A5'.
<
< VARIABLES DU GENERATEUR ALEATOIRE :
<
BORSUP:  FLOAT       0               < BORNE SUPERIEURE DES NOMBRES GENERES,
BORINF:  FLOAT       0               < ET BORNE INFERIEURE.
RDNSUP:  FLOAT       32              < POUR CALCULER 'BORSUP',
                                     < (A NOTER QUE 32=2 FOIS L'INVERSE DU
                                     < MAX DE LA FONCTION FU*(1-FU)*FV*(1-FV)...
RDNINF:  FLOAT       0               < ET 'BORINF'.
RDNINI:  FLOAT       5731            < NOMBRE ALEATOIRE DE DEPART...
INFIN1:  FLOAT       32768
INFIN2:  FLOAT       16384           < INFIN1/2...
FWORK4:  FLOAT       0
FWORK5:  FLOAT       0
FWORK6:  FLOAT       0
<
< TRANSLATION SUR OX ET OY :
<
XFA1:    FLOAT       0               < 'OX',
XFA2:    FLOAT       0               < ET 'OY'...
<
< RELAIS MONTAGNEUX :
<
ASPIR:   WORD        SPIR            < CALCUL DU SIGMA SUR UNE SPIRALE...
ARAYON:  WORD        RAYON           < CALCUL DE LA FONCTION COURANTE.
ARAYO1:  WORD        RAYON1          < RELAI...
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-3,XWOR%9,,XWOR%9
         LST
<
< AMPLIFICATEUR DE LA VARIATION DU RAYON
< ET VALEUR MINIMALE DE CELUI-CI :
<
         LXI         A0
         BSR         ASPCT
         FST         FA0
         LXI         A5
         BSR         ASPCT
         FST         FA5
<
< DEFINITION DE LA SPIRALE :
<
         LXI         A3
         BSR         ASPCT
         FST         FNP
         FIX
         STA         NPM             < NOMBRE DE POINTS MAX...
         JAL         $               < ??!??!?!
         LXI         A4
         BSR         ASPCT
         BSR         AROND
         STA         PASQ            < PAS DE PARCOURS...
<
< TRANSLATION SUR OX ET OY :
<
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
<
< DEFINITION DU GENERATEUR RDN :
<
         LXI         A2E
         BSR         ASPCT
         FST         RDNINF          < POUR LA BORNE INFERIEURE,
         LXI         A2F
         BSR         ASPCT
         FST         RDNSUP          < ET LA BORNE SUPERIEURE...
         LXI         A2D
         BSR         ASPCT
         FST         RDNINI          < POUR INITIALISER LE GENERATEUR...
         NLS
XWOR%9:  VAL         0
         IF          XXXRDN-4,XWOR%9,,XWOR%9
         LST
<
<
<        C A L C U L   D U   R A Y O N  :
<
<
<        ARGUMENT :
<                    (A,B)=FONCTION COURANTE.
<
<
<        RESULTAT :
<                    (A,B)=(A5+A0*F(XR,YR))*(FONCTION COURANTE).
<
<
RAYON:   EQU         $
         CPZ         NPM             < LA SPIRALE EST-ELLE VIDE ???
         JG          RAYON2          < NON, ON VA L'EXPLORER...
         BR          ARAYO1          < OUI, RIEN A FAIRE...
RAYON2:  EQU         $
         PSR         A,B             < SAVE LE CUMUL INITIAL...
<
< CALCUL DU POINT COURANT ET
< POSITION DANS UN CARRE DE
< COORDONNEES ENTIERES :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         FLT
         FAD         FWORK
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         FIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         FLT
         FSB         GXS
         FNEG
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         FLT
         FAD         FWORK
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
         FIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         FLT
         FSB         GYS
         FNEG
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< PASSAGE SUR 'TV2' :
<
         LA          CTCDA
         STA         XCTCDA
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         BSR         ASPIR
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ASPIR
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ASPIR
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ASPIR
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         GNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         GINCU
         FMP         FWORK2
         FMP         GNIV2
         FAD         FWORK
         FST         FWORK           < +FU*(1-FV)*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         FAD         FWORK
         FST         FWORK           < +FU*FV*N3,
         FLD         FWORK1
         FMP         GINCV
         FMP         GNIV4
         FAD         FWORK           < +(1-FU)*FV*N4,
         FCMZ        RDNINI          < FAUT-IL DE L'ALEATOIRE ???
         JE          SPRDN4          < NON...
         FST         FWORK6          < SAUVEGARDE DU NIVEAU INTERPOLE SUIVANT
                                     < 'FU' ET 'FV'.
<
< GENERATION DES BORNES DU GENERATEUR :
<
         FLD         GINCU
         FMP         GINCV
         FMP         FWORK1
         FMP         FWORK2          < LA FONCTION FU*(1-FU)*FV*(1-FV)
                                     < DE VALEUR COMPRISE ENTRE 0 ET 1/16
                                     < S'ANNULE POUR FU=FV=0 OU FU=FV=1 ;
                                     < DE PLUS SON MAX CORRESPOND AUX VALEURS
                                     < MOYENNES DES VARIABLES 'FU' ET 'FV'...
         FABS                        < AU CAS OU LES VARIABLES SERAIENT NEGA-
                                     < TIVES (VOIR LES COEFFICIENTS 'KFU'...).
         PSR         A,B
         FMP         RDNINF          < MISE A L'ECHELLE...
         FST         BORINF          < BORNE INF DU GENERATEUR.
         PLR         A,B
         FMP         RDNSUP          < MISE A L'ECHELLE...
         FST         BORSUP          < BORNE SUP DU GENERATEUR...
<
< GENERATION DE RDN(FU,FV) :
<
         FLD         RDNINI          < INITIALISATION...
         FAD         VARU
         FAD         VARV
         FST         FWORK4
         FLD         VARU
         FMP         VARV
         FAD         FWORK4          < INI+FU+FV+FU*FV.
         BSR         ASIN            < DONT ON PREND LE SINUS...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
SPRDN2:  EQU         $
         FLT
         FMP         F05             < RDN/2,
         PSR         A,B             < SAVE RDN/2...
         FAD         INFIN2          < (RDN+INFIN1)/2,
         FST         FWORK4
         FLD         BORSUP          < BORNE SUPERIEURE,
         FMP         FWORK4
         FST         FWORK4
         PLR         A,B             < RDN/2,
         FSB         INFIN2          < (RDN-INFIN1)/2,
         FST         FWORK5
         FLD         BORINF          < BORNE INFERIEURE,
         FMP         FWORK5
         FST         FWORK5
         FLD         FWORK4
         FSB         FWORK5
         FDV         INFIN1          < MISE A L'ECHELLE...
         FCAM        BORSUP          < ???
         JG          SPRDN3          < ERREUR...
         FCAM        BORINF          < ???
         JGE         SPRDN1          < OK...
SPRDN3:  EQU         $
         QUIT        1
         JMP         SPRDN2
SPRDN1:  EQU         $
<
< GENERATION DU NIVEAU FINAL :
<
         FAD         FWORK6
SPRDN4:  EQU         $
<
< CALCUL DE LA FONCTION COURANTE :
<
         FMP         FA0             < AMPLIFICATION,
         FAD         FA5             < ET TRANSLATION.
         FST         FWORK           < RAYON=FA5+FA0*F(XR,YR).
         PLR         A,B             < RESTAURATION DU CUMUL,
         FMP         FWORK           < ET CALCUL DE LA FONCTION COURANTE...
<
< RETOUR :
<
         STZ         XCTCDA          < POUR ATTEINDRE 'TV1'...
RAYON1:  EQU         $
         RSR
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         $
<
< INITIALISATION DE LA SPIRALE :
<
         LA          XS
         LB          YS
         PSR         A,B             < SAUVEGARDE DU POINT (XS,YS).
         STZ         CUMUL           < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         LA          PASQ
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         1
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIRALE.
SPMOY8:  EQU         $
<
< PARCOURS D'UN BRAS :
<
SPMOY1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPMOY2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NPM             < FINI ???
         JG          SPMOY3          < OUI...
         LA          XS              < NON :
         LB          YS
         PSR         A,B             < SAVE (XS,YS) AVANT LE TORE EVENTUEL...
         CPZ         MODX            < Y-A-T'IL X-TORE ???
         JE          SPMOY6          < OUI...
         JAL         SPMOY4          < NON, LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPMOY4          < HORS-ECRAN...
SPMOY6:  EQU         $
         ANDI        NPOLM1          < CALCUL MODULO...
         STA         XS              < MISE A JOUR DE XS.
         LR          B,A             < (A)=YS,
         CPZ         MODY            < EST-ON SUR UN Y-TORE ???
         JE          SPMOY7          < OUI...
         JAL         SPMOY4          < NON, LE POINT EST HORS-ECRAN...
         CPI         NLIGM1
         JG          SPMOY4          < HORS-ECRAN...
SPMOY7:  EQU         $
         ANDI        NLIGM1          < CALCUL MODULO...
         STA         YS              < MISE A JOUR DE YS.
         BSR         ASPGPS          < A=NIVEAU(XS,YS),
         AD          CUMUL           < ET
         STA         CUMUL           < CUMULE...
SPMOY4:  EQU         $
         PLR         A,B             < (A)=XS,
                                     < (B)=YS.
         AD          DELTAX          < CHANGEMENT DE
         STA         XS
         LR          B,A             < (A)=YS.
         AD          DELTAY          < POINT COURANT (XS,YS).
         STA         YS
         DC          LB              < DECOMPTAGE DES POINTS SUR LA BRANCHE :
         JG          SPMOY2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPMOY5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPMOY5:  EQU         $
         LA          DELTAY          < ON FAIT SUBIR AU NOMBRE COMPLEXE
         NGR         A,A             < (DX,DY) UNE ROTATION DE PI/2, SOIT
         LB          DELTAX          < UNE MULTIPLICATION PAR LA MATRICE
                                     < (0,-1,1,0)...
         STA         DELTAX          < DELTAX=-DELTAY,
         STB         DELTAY          < DELTAY=DELTAX.
         JMP         SPMOY1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (XS,YS) :
<
SPMOY3:  EQU         $
         PLR         A,B
         STA         XS              < RESTAURATION
         STB         YS              < DE (XS,YS),
<
< NORMALISATION DU CUMUL :
<
         LA          CUMUL
         FLT
         FDV         FNP
         RSR
         NLS
XWOR%9:  VAL         0
         LST
:F
:F
< <<'SIOP RAYON RDN 1'
DF'SIOP RAYON RDN 2'
ED'SIOP RAYON RDN 2'
IN0
         NLS
         IDP         "SIOP RAYON RDN 2"
<        R A Y O N   R D N   2  :
         IF          XXXRDN-1,XWOR%,,XWOR%
         LST
A0::     VAL         0               < AMPLIFICATEUR DE LA FONCTION MONTA-
                                     < GNEUSE F(XR,YR).
A1::     VAL         A0+1            < DEPLACEMENT SUR L'AXE DES 'X', A LA
                                     < CHARGE DU MODULE APPELANT...
A2::     VAL         A1+1            < DEPLACEMENT SUR L'AXE DES 'Y', A LA
                                     < CHARGE DU MODULE APPELANT...
A3::     VAL         A2+1            < NOMBRE DE POINTS DE LA SPIRALE ; SI
                                     < CELUI-CI EST NUL, IL N'Y A PAS DE CALCUL
                                     < DE FONCTION MONTAGNEUSE...
A4::     VAL         A3+1            < PAS DE PARCOURS DE LA SPIRALE (+1 EN
                                     < GENERAL...).
A5::     VAL         A4+1            < VALEUR MOYENNE DE LA FONCTION MONTA-
                                     < GNEUSE : A5+A0*F(XR,YR).
A2F::    VAL         47              < POUR CALCULER LA BORNE SUPERIEURE DU
                                     < GENERATEUR ALEATOIRE...
A2E::    VAL         A2F-1           < ET SA BORNE INFERIEURE...
A2D::    VAL         A2E-1           < POUR INITIALISER LE GENERATEUR ; SI
                                     < CE PARAMETRE EST NUL, IL N'Y A
                                     < RIEN D'ALEATOIRE...
A2C::    VAL         A2D-1           < COEFFICIENT DU FACTEUR HOMOTHETIQUE LORS
                                     < DE LA RECURSION SUR 'TV2'...
         NLS
XWOR%:   VAL         0
         IF          XXXRDN-2,XWOR%,,XWOR%
         LST
<
< INDICATEUR DE PREMIER PASSAGE :
<
PREM:    WORD        0               < =0 : PREMIER PASSAGE,
                                     < #0 : PASSAGES SUIVANTS.
<
< VARIABLES MONTAGNEUSES :
<
CUMUL:   WORD        0               < SIGMA(NIVEAU(XS,YS)).
PASQ:    WORD        0               < ARGUMENT 'A4'.
DELTAX:  WORD        0
DELTAY:  WORD        0
LB:      WORD        0               < LONGUEUR DES
LB0:     WORD        0               <              BRANCHES DE LA SPIRALE.
NP:      WORD        0               < NOMBRE DE POINT COURANT,
NPM:     WORD        0               < NOMBRE DE POINTS ENTIER DE LA SPIRALE.
FNP:     FLOAT       0               < NOMBRE DE POINTS FLOTTANT DE LA SPIRALE.
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
GINCU:   FLOAT       0               < RESIDU DE L'ABSCISSE,
GINCV:   FLOAT       0               < RESIDU DE L'ORDONNEE.
GINCU1:  FLOAT       0               < GINCU1=1-GINCU,
GINCV1:  FLOAT       0               < GINCV1=1-GINCV.
GNIV1:   FLOAT       0               < SIGMA PONDERE DES NIVEAUX DE LA SPIRALE
                                     < CENTREE EN (XS,YS),
GNIV2:   FLOAT       0               < DE MEME EN (XS+1,YS),
GNIV3:   FLOAT       0               < DE MEME EN (XS+1,YS+1),
GNIV4:   FLOAT       0               < DE MEME EN (XS,YS+1).
FA0:     FLOAT       0               < CONSTANTE 'A0',
FA5:     FLOAT       0               < ET 'A5'.
<
< DONNEES DE RECURSION MONTAGNEUSE :
<
FTAILE:  FLOAT       <NMOTL*NBITMO?NLIG<0<0
         IF          NMOTL*NBITMO-NLIG,,XWOR%9,
         IF          ATTENTION : CE QUI PRECEDE EST IDIOT !!!
XWOR%9:  VAL         0
FHOMO:   FLOAT       0               < COEFFICIENT HOMOTHETIQUE 'A2C'.
FXPAS:   FLOAT       0               < 'NPAS' FLOTTANT.
<
< VARIABLES DU GENERATEUR ALEATOIRE :
<
BORSUP:  FLOAT       0               < BORNE SUPERIEURE DES NOMBRES GENERES,
BORINF:  FLOAT       0               < ET BORNE INFERIEURE.
RDNSUP:  FLOAT       32              < POUR CALCULER 'BORSUP',
                                     < (A NOTER QUE 32=2 FOIS L'INVERSE DU
                                     < MAX DE LA FONCTION FU*(1-FU)*FV*(1-FV)...
RDNINF:  FLOAT       0               < ET 'BORINF'.
RDNINI:  FLOAT       5731            < NOMBRE ALEATOIRE DE DEPART...
INFIN1:  FLOAT       32768
INFIN2:  FLOAT       16384           < INFIN1/2...
FWORK4:  FLOAT       0
FWORK5:  FLOAT       0
FWORK6:  FLOAT       0
<
< TRANSLATION SUR OX ET OY :
<
XFA1:    FLOAT       0               < 'OX',
XFA2:    FLOAT       0               < ET 'OY'...
<
< RELAIS MONTAGNEUX :
<
ASPIR:   WORD        SPIR            < CALCUL DU SIGMA SUR UNE SPIRALE...
ARAYON:  WORD        RAYON           < CALCUL DE LA FONCTION COURANTE.
ARAYO1:  WORD        RAYON1          < RELAI...
         NLS
XWOR%:   VAL         0
         IF          XXXRDN-3,XWOR%,,XWOR%
         LST
<
< AMPLIFICATEUR DE LA VARIATION DU RAYON
< ET VALEUR MINIMALE DE CELUI-CI :
<
         LXI         A0
         BSR         ASPCT
         FST         FA0
         LXI         A5
         BSR         ASPCT
         FST         FA5
<
< DEFINITION DE LA SPIRALE :
<
         LXI         A3
         BSR         ASPCT
         FST         FNP
         FIX
         STA         NPM             < NOMBRE DE POINTS MAX...
         JAL         $               < ??!??!?!
         LXI         A4
         BSR         ASPCT
         BSR         AROND
         STA         PASQ            < PAS DE PARCOURS...
<
< TRANSLATION SUR OX ET OY :
<
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
<
< DEFINITION DU GENERATEUR RDN :
<
         LXI         A2E
         BSR         ASPCT
         FST         RDNINF          < POUR LA BORNE INFERIEURE,
         LXI         A2F
         BSR         ASPCT
         FST         RDNSUP          < ET LA BORNE SUPERIEURE...
         LXI         A2D
         BSR         ASPCT
         FST         RDNINI          < POUR INITIALISER LE GENERATEUR...
<
< COEFFICIENT HOMOTHETIQUE SUR 'TV2' :
<
         LXI         A2C
         BSR         ASPCT
         FST         FHOMO
         NLS
XWOR%:   VAL         0
         IF          XXXRDN-4,XWOR%,,XWOR%
         LST
<
<
<        C A L C U L   D U   R A Y O N  :
<
<
<        ARGUMENT :
<                    (A,B)=FONCTION COURANTE.
<
<
<        RESULTAT :
<                    (A,B)=(A5+A0*F(XR,YR))*(FONCTION COURANTE).
<
<
RAYON:   EQU         $
         CPZ         NPM             < LA SPIRALE EST-ELLE VIDE ???
         JG          RAYON2          < NON, ON VA L'EXPLORER...
         BR          ARAYO1          < OUI, RIEN A FAIRE...
RAYON2:  EQU         $
         PSR         A,B             < SAVE LE CUMUL INITIAL...
<
< CALCUL DU POINT COURANT ET
< POSITION DANS UN CARRE DE
< COORDONNEES ENTIERES :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         FLT
         FAD         FWORK
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         FIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         FLT
         FSB         GXS
         FNEG
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         FLT
         FAD         FWORK
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
         FIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         FLT
         FSB         GYS
         FNEG
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< PASSAGE SUR 'TV2' :
<
         LA          CTCDA
         STA         XCTCDA
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         BSR         ASPIR
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ASPIR
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ASPIR
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ASPIR
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         GINCU1          < FU1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         GINCV1          < FV1=1-FV,
         FMP         GINCU1
         FMP         GNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         GINCU
         FMP         GINCV1
         FMP         GNIV2
         FAD         FWORK
         FST         FWORK           < +FU*(1-FV)*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         FAD         FWORK
         FST         FWORK           < +FU*FV*N3,
         FLD         GINCU1
         FMP         GINCV
         FMP         GNIV4
         FAD         FWORK           < +(1-FU)*FV*N4,
         FST         FWORK6          < SAUVEGARDE DU NIVEAU INTERPOLE SUIVANT
                                     < 'FU' ET 'FV'.
<
< RECURSION MONTAGNEUSE :
<
         LA          NPAS
         CPI         2               < Y-A-T'IL MOINS DE 3 PAS ???
         JLE         RAYON5          < OUI...
         FLT                         < NON :
         FST         FXPAS           < FXPAS=NOMBRE DE PAS...
         FLD         GINCU
         FMP         FTAILE
         FIX
         STA         XS              < XS=256*GINCU,
         FLD         GINCV
         FMP         FTAILE
         FIX
         STA         YS              < YS=256*GINCV : ON MAPPE 'TV2' DANS
                                     < CHAQUE TRANSFORMEE DE CARRE ELEMENTAIRE.
         LA          PASQ
         PSR         A               < SAUVEGARDE DU PAS ARGUMENT DE PARCOURS
                                     < DE LA SPIRALE DE BASE...
         FLD         FTAILE
         FDV         FXPAS
         BSR         AROND           < PAS SUR 'U' ET SUR 'V'=256/NPAS...
         STA         PASQ            < PASQ=PAS DE PARCOURS DE LA SPIRALE DANS
                                     < 'TV2' POUR MAPPER DANS LES CARRES ELEMEN-
                                     < TAIRES...
         BSR         ASPIR           < CALCUL DU NIVEAU CETTE FOIS-CI CALCULE
                                     < SUR UNE VERSION HOMOTHETIQUE DE 'TV2',
         FMP         FHOMO           < QUE L'ON MULTIPLIE PAR L'ARGUMENT 'A2C',
         FMP         FXPAS
         FDV         FTAILE          < ET QU'ON L'ON PONDERE PAR PAS/256...
         FAD         FWORK6          < QUE L'ON CUMULE AU NIVEAU DE BASE,
         FST         FWORK6          < ET QUE L'ON SAUVEGARDE...
         PLR         A
         STA         PASQ            < RESTAURE 'PASQ'...
RAYON5:  EQU         $
         FLD         FWORK6          < ET OUI, CA MARCHERA MIEUX AVEC...
         FCMZ        RDNINI          < FAUT-IL DE L'ALEATOIRE ???
         JE          SPRDN4          < NON...
<
< GENERATION DES BORNES DU GENERATEUR :
<
         FLD         GINCU
         FMP         GINCV
         FMP         GINCU1
         FMP         GINCV1          < LA FONCTION FU*(1-FU)*FV*(1-FV)
                                     < DE VALEUR COMPRISE ENTRE 0 ET 1/16
                                     < S'ANNULE POUR FU=FV=0 OU FU=FV=1 ;
                                     < DE PLUS SON MAX CORRESPOND AUX VALEURS
                                     < MOYENNES DES VARIABLES 'FU' ET 'FV'...
         FABS                        < AU CAS OU LES VARIABLES SERAIENT NEGA-
                                     < TIVES (VOIR LES COEFFICIENTS 'KFU'...).
         PSR         A,B
         FMP         RDNINF          < MISE A L'ECHELLE...
         FST         BORINF          < BORNE INF DU GENERATEUR.
         PLR         A,B
         FMP         RDNSUP          < MISE A L'ECHELLE...
         FST         BORSUP          < BORNE SUP DU GENERATEUR...
<
< GENERATION DE RDN(FU,FV) :
<
         FLD         RDNINI          < INITIALISATION...
         FAD         VARU
         FAD         VARV
         FST         FWORK4
         FLD         VARU
         FMP         VARV
         FAD         FWORK4          < INI+FU+FV+FU*FV.
         BSR         ASIN            < DONT ON PREND LE SINUS...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
SPRDN2:  EQU         $
         FLT
         FMP         F05             < RDN/2,
         PSR         A,B             < SAVE RDN/2...
         FAD         INFIN2          < (RDN+INFIN1)/2,
         FST         FWORK4
         FLD         BORSUP          < BORNE SUPERIEURE,
         FMP         FWORK4
         FST         FWORK4
         PLR         A,B             < RDN/2,
         FSB         INFIN2          < (RDN-INFIN1)/2,
         FST         FWORK5
         FLD         BORINF          < BORNE INFERIEURE,
         FMP         FWORK5
         FST         FWORK5
         FLD         FWORK4
         FSB         FWORK5
         FDV         INFIN1          < MISE A L'ECHELLE...
         FCAM        BORSUP          < ???
         JG          SPRDN3          < ERREUR...
         FCAM        BORINF          < ???
         JGE         SPRDN1          < OK...
SPRDN3:  EQU         $
         QUIT        1
         JMP         SPRDN2
SPRDN1:  EQU         $
<
< GENERATION DU NIVEAU FINAL :
<
         FAD         FWORK6
SPRDN4:  EQU         $
<
< CALCUL DE LA FONCTION COURANTE :
<
         FMP         FA0             < AMPLIFICATION,
         FAD         FA5             < ET TRANSLATION.
         FST         FWORK           < RAYON=FA5+FA0*F(XR,YR).
         PLR         A,B             < RESTAURATION DU CUMUL,
         FMP         FWORK           < ET CALCUL DE LA FONCTION COURANTE...
<
< RETOUR :
<
         STZ         XCTCDA          < POUR ATTEINDRE 'TV1'...
RAYON1:  EQU         $
         RSR
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         $
<
< INITIALISATION DE LA SPIRALE :
<
         LA          XS
         LB          YS
         PSR         A,B             < SAUVEGARDE DU POINT (XS,YS).
         STZ         CUMUL           < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         LA          PASQ
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         1
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIRALE.
SPMOY8:  EQU         $
<
< PARCOURS D'UN BRAS :
<
SPMOY1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPMOY2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NPM             < FINI ???
         JG          SPMOY3          < OUI...
         LA          XS              < NON :
         LB          YS
         PSR         A,B             < SAVE (XS,YS) AVANT LE TORE EVENTUEL...
         CPZ         MODX            < Y-A-T'IL X-TORE ???
         JE          SPMOY6          < OUI...
         JAL         SPMOY4          < NON, LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPMOY4          < HORS-ECRAN...
SPMOY6:  EQU         $
         ANDI        NPOLM1          < CALCUL MODULO...
         STA         XS              < MISE A JOUR DE XS.
         LR          B,A             < (A)=YS,
         CPZ         MODY            < EST-ON SUR UN Y-TORE ???
         JE          SPMOY7          < OUI...
         JAL         SPMOY4          < NON, LE POINT EST HORS-ECRAN...
         CPI         NLIGM1
         JG          SPMOY4          < HORS-ECRAN...
SPMOY7:  EQU         $
         ANDI        NLIGM1          < CALCUL MODULO...
         STA         YS              < MISE A JOUR DE YS.
         BSR         ASPGPS          < A=NIVEAU(XS,YS),
         AD          CUMUL           < ET
         STA         CUMUL           < CUMULE...
SPMOY4:  EQU         $
         PLR         A,B             < (A)=XS,
                                     < (B)=YS.
         AD          DELTAX          < CHANGEMENT DE
         STA         XS
         LR          B,A             < (A)=YS.
         AD          DELTAY          < POINT COURANT (XS,YS).
         STA         YS
         DC          LB              < DECOMPTAGE DES POINTS SUR LA BRANCHE :
         JG          SPMOY2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPMOY5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPMOY5:  EQU         $
         LA          DELTAY          < ON FAIT SUBIR AU NOMBRE COMPLEXE
         NGR         A,A             < (DX,DY) UNE ROTATION DE PI/2, SOIT
         LB          DELTAX          < UNE MULTIPLICATION PAR LA MATRICE
                                     < (0,-1,1,0)...
         STA         DELTAX          < DELTAX=-DELTAY,
         STB         DELTAY          < DELTAY=DELTAX.
         JMP         SPMOY1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (XS,YS) :
<
SPMOY3:  EQU         $
         PLR         A,B
         STA         XS              < RESTAURATION
         STB         YS              < DE (XS,YS),
<
< NORMALISATION DU CUMUL :
<
         LA          CUMUL
         FLT
         FDV         FNP
         RSR
         NLS
XWOR%:   VAL         0
         LST
:F
:F
< <<'SIOP RAYON RDN 2'
DF'SIOP RAYON RDN 3'
ED'SIOP RAYON RDN 3'
IN0
         NLS
         IDP         "SIOP RAYON RDN 3"
<        R A Y O N   R D N   3  :
         IF          XXXRDN-1,XWOR%,,XWOR%
         LST
A0::     VAL         0               < AMPLIFICATEUR DE LA FONCTION MONTA-
                                     < GNEUSE F(XR,YR).
A1::     VAL         A0+1            < DEPLACEMENT SUR L'AXE DES 'X', A LA
                                     < CHARGE DU MODULE APPELANT...
A2::     VAL         A1+1            < DEPLACEMENT SUR L'AXE DES 'Y', A LA
                                     < CHARGE DU MODULE APPELANT...
A3::     VAL         A2+1            < MAX DU NBRE DE POINTS DE LA SPIRALE ; SI
                                     < CELUI-CI EST NUL, IL N'Y A PAS DE CALCUL
                                     < DE FONCTION MONTAGNEUSE...
A4::     VAL         A3+1            < PAS DE PARCOURS DE LA SPIRALE (+1 EN
                                     < GENERAL...).
A5::     VAL         A4+1            < VALEUR MOYENNE DE LA FONCTION MONTA-
                                     < GNEUSE : A5+A0*F(XR,YR).
A2F::    VAL         47              < POUR CALCULER LA BORNE SUPERIEURE DU
                                     < GENERATEUR ALEATOIRE...
A2E::    VAL         A2F-1           < ET SA BORNE INFERIEURE...
A2D::    VAL         A2E-1           < POUR INITIALISER LE GENERATEUR ; SI
                                     < CE PARAMETRE EST NUL, IL N'Y A
                                     < RIEN D'ALEATOIRE...
A2C::    VAL         A2D-1           < MIN DU NOMBRE DE POINTS DE LA SPIRALE.
A2B::    VAL         A2C-1           < PARAMETRE VALANT NORMALEMENT +1 OU -1
                                     < ET DONNANT LA FORME DE LA COURBE DE
                                     < VARIATION DE 'NPM' DANS LA TRANSFORMEE
                                     < DU CARRE DE BASE :
                                     < +1 : PARABOLE VERS LE BAS,
                                     < -1 : PARABOLE VERS LE HAUT.
         NLS
XWOR%:   VAL         0
         IF          XXXRDN-2,XWOR%,,XWOR%
         LST
<
< INDICATEUR DE PREMIER PASSAGE :
<
PREM:    WORD        0               < =0 : PREMIER PASSAGE,
                                     < #0 : PASSAGES SUIVANTS.
<
< VARIABLES MONTAGNEUSES :
<
CUMUL:   FLOAT       0               < SIGMA(NIVEAU(XS,YS)*FNPK).
PASQ:    WORD        0               < ARGUMENT 'A4'.
DELTAX:  WORD        0
DELTAY:  WORD        0
LB:      WORD        0               < LONGUEUR DES
LB0:     WORD        0               <              BRANCHES DE LA SPIRALE.
FNP:     FLOAT       0               < NOMBRE DE POINTS FLOTTANT DE LA SPIRALE.
FMAXNP:  FLOAT       0               < MAX DU NOMBRE DE POINTS DE LA SPIRALE.
FMINNP:  FLOAT       0               < MIN DU NOMBRE DE POINTS DE LA SPIRALE.
FNPC:    FLOAT       0               < 'FNP' DEGRESSIF COURANT.
FNPK:    FLOAT       0               < COEFFICIENT DE PONDERATION (<=1) DES
                                     < NIVEAUX DES POINTS DE LA SPIRALE.
F4:      FLOAT       4
FA2B:    FLOAT       0               < COEFFICIENT 'A2B' MULTIPLIE PAR 4...
GXS:     FLOAT       0               < COORDONNEES ABSOLUES
GYS:     FLOAT       0               < DE CE POINT...
GINCU:   FLOAT       0               < RESIDU DE L'ABSCISSE,
GINCV:   FLOAT       0               < RESIDU DE L'ORDONNEE.
GINCU1:  FLOAT       0               < GINCU1=1-GINCU,
GINCV1:  FLOAT       0               < GINCV1=1-GINCV.
GNIV1:   FLOAT       0               < SIGMA PONDERE DES NIVEAUX DE LA SPIRALE
                                     < CENTREE EN (XS,YS),
GNIV2:   FLOAT       0               < DE MEME EN (XS+1,YS),
GNIV3:   FLOAT       0               < DE MEME EN (XS+1,YS+1),
GNIV4:   FLOAT       0               < DE MEME EN (XS,YS+1).
FA0:     FLOAT       0               < CONSTANTE 'A0',
FA5:     FLOAT       0               < ET 'A5'.
<
< VARIABLES DU GENERATEUR ALEATOIRE :
<
BORSUP:  FLOAT       0               < BORNE SUPERIEURE DES NOMBRES GENERES,
BORINF:  FLOAT       0               < ET BORNE INFERIEURE.
RDNSUP:  FLOAT       32              < POUR CALCULER 'BORSUP',
                                     < (A NOTER QUE 32=2 FOIS L'INVERSE DU
                                     < MAX DE LA FONCTION FU*(1-FU)*FV*(1-FV)...
RDNINF:  FLOAT       0               < ET 'BORINF'.
RDNINI:  FLOAT       5731            < NOMBRE ALEATOIRE DE DEPART...
INFIN1:  FLOAT       32768
INFIN2:  FLOAT       16384           < INFIN1/2...
FWORK4:  FLOAT       0
FWORK5:  FLOAT       0
FWORK6:  FLOAT       0
<
< TRANSLATION SUR OX ET OY :
<
XFA1:    FLOAT       0               < 'OX',
XFA2:    FLOAT       0               < ET 'OY'...
<
< RELAIS MONTAGNEUX :
<
ASPIR:   WORD        SPIR            < CALCUL DU SIGMA SUR UNE SPIRALE...
ARAYON:  WORD        RAYON           < CALCUL DE LA FONCTION COURANTE.
ARAYO1:  WORD        RAYON1          < RELAI...
         NLS
XWOR%:   VAL         0
         IF          XXXRDN-3,XWOR%,,XWOR%
         LST
<
< AMPLIFICATEUR DE LA VARIATION DU RAYON
< ET VALEUR MINIMALE DE CELUI-CI :
<
         LXI         A0
         BSR         ASPCT
         FST         FA0
         LXI         A5
         BSR         ASPCT
         FST         FA5
<
< DEFINITION DE LA SPIRALE :
<
         LXI         A2C
         BSR         ASPCT
         FST         FMINNP          < MIN(NBRE POINTS SPIRALE),
         FCAZ
         JALE        $               < ?!??!?!?!
         LXI         A3
         BSR         ASPCT
         FST         FMAXNP          < MAX(NBRE POINTS SPIRALE),
         FCAZ
         JAL         $               < ????!??!?!
         FSB         FMINNP
         FST         FA2B            < FA2B PROVISOIRE=MAX=MIN...
         LXI         A4
         BSR         ASPCT
         BSR         AROND
         STA         PASQ            < PAS DE PARCOURS...
         LXI         A2B
         BSR         ASPCT
         FMP         F4
         FMP         FA2B
         FST         FA2B            < FA2B=4*A2B*(MAX-MIN).
<
< TRANSLATION SUR OX ET OY :
<
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
<
< DEFINITION DU GENERATEUR RDN :
<
         LXI         A2E
         BSR         ASPCT
         FST         RDNINF          < POUR LA BORNE INFERIEURE,
         LXI         A2F
         BSR         ASPCT
         FST         RDNSUP          < ET LA BORNE SUPERIEURE...
         LXI         A2D
         BSR         ASPCT
         FST         RDNINI          < POUR INITIALISER LE GENERATEUR...
         NLS
XWOR%:   VAL         0
         IF          XXXRDN-4,XWOR%,,XWOR%
         LST
<
<
<        C A L C U L   D U   R A Y O N  :
<
<
<        FONCTION :
<                      CALCULE LA FONCTION MONTAGNEUSE
<                    MAIS LE NOMBRE DE POINTS SUR LA
<                    SPIRALE VARIE DANS LA TRANSFORMEE
<                    DU CARRE ELEMENTAIRE SUIVANT LA
<                    LOI :
<
<                    NPM=RAC((4*A2B*(MAX-MIN)*(ABS(FU)*(ABS(FU)-1))+MAX)*
<                            (4*A2B*(MAX-MIN)*(ABS(FV)*(ABS(FV)-1))+MAX))...
<
<
<        ARGUMENT :
<                    (A,B)=FONCTION COURANTE.
<
<
<        RESULTAT :
<                    (A,B)=(A5+A0*F(XR,YR))*(FONCTION COURANTE).
<
<
RAYON:   EQU         $
         FCMZ        FMAXNP          < LA SPIRALE EST-ELLE VIDE ???
         JG          RAYON2          < NON, ON VA L'EXPLORER...
         BR          ARAYO1          < OUI, RIEN A FAIRE...
RAYON2:  EQU         $
         PSR         A,B             < SAVE LE CUMUL INITIAL...
<
< CALCUL DU POINT COURANT ET
< POSITION DANS UN CARRE DE
< COORDONNEES ENTIERES :
<
         FLD         VARU
         FDV         KFU
         FDV         KUZ
         FST         FWORK
         LA          TRX
         FLT
         FAD         FWORK
         FST         GXS             < COORDONNEE 'XS' DU POINT COURANT,
         FIX
         STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
         FLT
         FSB         GXS
         FABS                        < POUR METTRE FU DANS L'INTERVALLE (0,1(,
         FST         GINCU           < POSITION SUR L'AXE DES 'X',
         FLD         VARV
         FDV         KFV
         FDV         KVZ
         FST         FWORK
         LA          TRY
         FLT
         FAD         FWORK
         FST         GYS             < COORDONNEE 'YS' DU POINT COURANT.
         FIX
         STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
         FLT
         FSB         GYS
         FABS                        < POUR METTRE FV DANS L'INTERVALLE (0,1(,
         FST         GINCV           < POSITION SUR L'AXE DES 'Y'.
<
< PASSAGE SUR 'TV2' :
<
         LA          CTCDA
         STA         XCTCDA
<
< CALCUL DU 'NPM' COURANT :
<
         FLD         GINCU           < ABS(FU),
         FSB         F1              < ABS(FU)-1,
         FMP         GINCU           < ABS(FU)*(ABS(FU)-1),
         FMP         FA2B            < 4*A2B*(MAX-MIN)*(ABS(FU)*(ABS(FU)-1)),
         FAD         FMAXNP          < 4*A2B*(MAX-MIN)*(ABS(FU)*(ABS(FU)-1))+MAX
         FST         FWORK2
         FLD         GINCV           < ABS(FV),
         FSB         F1              < ABS(FV)-1,
         FMP         GINCV           < ABS(FV)*(ABS(FV)-1),
         FMP         FA2B            < 4*A2B*(MAX-MIN)*(ABS(FV)*(ABS(FV)-1)),
         FAD         FMAXNP          < 4*A2B*(MAX-MIN)*(ABS(FV)*(ABS(FV)-1))+MAX
         FMP         FWORK2          < ...*...
         BSR         ARAC            < ET ON PREND LA RACINE CARREE...
         FST         FNP             < CE QUI DONNE LE NOMBRE DE POINTS DE
                                     < LA SPIRALE COURANTE (NON FORCEMENT
                                     < ENTIER...).
<
< CALCUL DES NIVEAUX DES 4 SOMMETS :
<
         BSR         ASPIR
         FST         GNIV1           < NIVEAU(XS,YS).
         IC          XS
         BSR         ASPIR
         FST         GNIV2           < NIVEAU(XS+1,YS).
         IC          YS
         BSR         ASPIR
         FST         GNIV3           < NIVEAU(XS+1,YS+1).
         DC          XS
         BSR         ASPIR
         FST         GNIV4           < NIVEAU(XS,YS+1).
         DC          YS              < RETOUR AU POINT DE DEPART...
<
< CALCUL DU NIVEAU INTERPOLE
< DANS LE CARRE "ENTIER" :
<
         FLD         F1
         FSB         GINCU
         FST         GINCU1          < FU1=1-FU,
         FLD         F1
         FSB         GINCV
         FST         GINCV1          < FV1=1-FV,
         FMP         GINCU1
         FMP         GNIV1
         FST         FWORK           < (1-ABS(FU))*(1-ABS(FV))*N1,
         FLD         GINCU
         FMP         GINCV1
         FMP         GNIV2
         FAD         FWORK
         FST         FWORK           < +ABS(FU)*(1-ABS(FV))*N2,
         FLD         GINCU
         FMP         GINCV
         FMP         GNIV3
         FAD         FWORK
         FST         FWORK           < +ABS(FU)*ABS(FV)*N3,
         FLD         GINCU1
         FMP         GINCV
         FMP         GNIV4
         FAD         FWORK           < +(1-ABS(FU))*ABS(FV)*N4,
         FST         FWORK6          < SAUVEGARDE DU NIVEAU INTERPOLE SUIVANT
                                     < 'FU' ET 'FV'.
         FCMZ        RDNINI          < FAUT-IL DE L'ALEATOIRE ???
         JE          SPRDN4          < NON...
<
< GENERATION DES BORNES DU GENERATEUR :
<
         FLD         GINCU
         FMP         GINCV
         FMP         GINCU1
         FMP         GINCV1          < LA FONCTION FU*(1-FU)*FV*(1-FV)
                                     < DE VALEUR COMPRISE ENTRE 0 ET 1/16
                                     < S'ANNULE POUR FU=FV=0 OU FU=FV=1 ;
                                     < DE PLUS SON MAX CORRESPOND AUX VALEURS
                                     < MOYENNES DES VARIABLES 'FU' ET 'FV'...
         FABS                        < AU CAS OU LES VARIABLES SERAIENT NEGA-
                                     < TIVES (VOIR LES COEFFICIENTS 'KFU'...).
         PSR         A,B
         FMP         RDNINF          < MISE A L'ECHELLE...
         FST         BORINF          < BORNE INF DU GENERATEUR.
         PLR         A,B
         FMP         RDNSUP          < MISE A L'ECHELLE...
         FST         BORSUP          < BORNE SUP DU GENERATEUR...
<
< GENERATION DE RDN(FU,FV) :
<
         FLD         RDNINI          < INITIALISATION...
         FAD         VARU
         FAD         VARV
         FST         FWORK4
         FLD         VARU
         FMP         VARV
         FAD         FWORK4          < INI+FU+FV+FU*FV.
         BSR         ASIN            < DONT ON PREND LE SINUS...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
SPRDN2:  EQU         $
         FLT
         FMP         F05             < RDN/2,
         PSR         A,B             < SAVE RDN/2...
         FAD         INFIN2          < (RDN+INFIN1)/2,
         FST         FWORK4
         FLD         BORSUP          < BORNE SUPERIEURE,
         FMP         FWORK4
         FST         FWORK4
         PLR         A,B             < RDN/2,
         FSB         INFIN2          < (RDN-INFIN1)/2,
         FST         FWORK5
         FLD         BORINF          < BORNE INFERIEURE,
         FMP         FWORK5
         FST         FWORK5
         FLD         FWORK4
         FSB         FWORK5
         FDV         INFIN1          < MISE A L'ECHELLE...
         FCAM        BORSUP          < ???
         JG          SPRDN3          < ERREUR...
         FCAM        BORINF          < ???
         JGE         SPRDN1          < OK...
SPRDN3:  EQU         $
         QUIT        1
         JMP         SPRDN2
SPRDN1:  EQU         $
<
< GENERATION DU NIVEAU FINAL :
<
         FAD         FWORK6
SPRDN4:  EQU         $
<
< CALCUL DE LA FONCTION COURANTE :
<
         FMP         FA0             < AMPLIFICATION,
         FAD         FA5             < ET TRANSLATION.
         FST         FWORK           < RAYON=FA5+FA0*F(XR,YR).
         PLR         A,B             < RESTAURATION DU CUMUL,
         FMP         FWORK           < ET CALCUL DE LA FONCTION COURANTE...
<
< RETOUR :
<
         STZ         XCTCDA          < POUR ATTEINDRE 'TV1'...
RAYON1:  EQU         $
         RSR
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         $
<
< INITIALISATION DE LA SPIRALE :
<
         LA          XS
         LB          YS
         PSR         A,B             < SAUVEGARDE DU POINT (XS,YS).
         FLD         F0
         FST         CUMUL           < INITIALISATION DU CUMUL PONDERE...
         FLD         F1
         FST         FNPK            < FNPK=1=COEFFICIENT DE PONDERATION DES
                                     < NIVEAUX=1 (SAUF PEUT-ETRE POUR LE DERNIER
                                     < POINT POUR LEQUEL IL PEUT ETRE INFERIEUR
                                     < A 1...).
         FAD         FNP
         FST         FNPC            < FNPC=FNP+1...
         LA          PASQ
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         1
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIRALE.
SPMOY8:  EQU         $
<
< PARCOURS D'UN BRAS :
<
SPMOY1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPMOY2:  EQU         $
         FLD         FNPC
         FSB         F1
         FST         FNPC            < DECREMENTATION DES POINTS TRAITES...
         FCAZ                        < EST-CE FINI...
         JLE         SPMOY3          < OUI...
         FCAM        F1              < NON, EST-CE LE DERNIER POINT ???
         JGE         SPMOY9          < NON, FNPK=1 (VALEUR INITIALE),
         FST         FNPK            < OUI, FNPK=VALEUR FRACTIONNAIRE RESIDUELLE
SPMOY9:  EQU         $
         LA          XS              < TRAITEMENT DU POINT COURANT :
         LB          YS
         PSR         A,B             < SAVE (XS,YS) AVANT LE TORE EVENTUEL...
         CPZ         MODX            < Y-A-T'IL X-TORE ???
         JE          SPMOY6          < OUI...
         JAL         SPMOY4          < NON, LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPMOY4          < HORS-ECRAN...
SPMOY6:  EQU         $
         ANDI        NPOLM1          < CALCUL MODULO...
         STA         XS              < MISE A JOUR DE XS.
         LR          B,A             < (A)=YS,
         CPZ         MODY            < EST-ON SUR UN Y-TORE ???
         JE          SPMOY7          < OUI...
         JAL         SPMOY4          < NON, LE POINT EST HORS-ECRAN...
         CPI         NLIGM1
         JG          SPMOY4          < HORS-ECRAN...
SPMOY7:  EQU         $
         ANDI        NLIGM1          < CALCUL MODULO...
         STA         YS              < MISE A JOUR DE YS.
         BSR         ASPGPS          < A=NIVEAU(XS,YS),
         FLT
         FMP         FNPK            < NIVEAU PONDERE DU POINT COURANT,
         FAD         CUMUL
         FST         CUMUL           < ET ON SOMME...
SPMOY4:  EQU         $
         PLR         A,B             < (A)=XS,
                                     < (B)=YS.
         AD          DELTAX          < CHANGEMENT DE
         STA         XS
         LR          B,A             < (A)=YS.
         AD          DELTAY          < POINT COURANT (XS,YS).
         STA         YS
         DC          LB              < DECOMPTAGE DES POINTS SUR LA BRANCHE :
         JG          SPMOY2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPMOY5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPMOY5:  EQU         $
         LA          DELTAY          < ON FAIT SUBIR AU NOMBRE COMPLEXE
         NGR         A,A             < (DX,DY) UNE ROTATION DE PI/2, SOIT
         LB          DELTAX          < UNE MULTIPLICATION PAR LA MATRICE
                                     < (0,-1,1,0)...
         STA         DELTAX          < DELTAX=-DELTAY,
         STB         DELTAY          < DELTAY=DELTAX.
         JMP         SPMOY1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (XS,YS) :
<
SPMOY3:  EQU         $
         PLR         A,B
         STA         XS              < RESTAURATION
         STB         YS              < DE (XS,YS),
<
< NORMALISATION DU CUMUL :
<
         FLD         CUMUL
         FDV         FNP
         RSR
         NLS
XWOR%:   VAL         0
         LST
:F
:F
< <<'SIOP RAYON RDN 3'
DF'SIOP SURFACE CHA 4'
ED'SIOP SURFACE CHA 4'
IN0
         PAGE
         IDP         "SIOP SURFACE CHA 4"
<
<
<        G E N E R A T E U R   D E   S U R F A C E S   C H A M P   4  :
<
<
<        FONCTION :
<                      CE MODULE GENERE DES SURFACES MONTAGNEUSES
<                    SUR UN PLAN, A L'AIDE DU GENERATEUR
<                    RECURSIF 'RAYON CHAMP 4' ; SA PARTICULA-
<                    RITE EST D'ETRE SCALANT : DE NOUVEAUX
<                    DETAILS APPARAISSENT A CHAQUE NOUVEL
<                    AGRANDISSEMENT...
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON CHAMP 4#
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON CHAMP 4#
<
< RELAIS INTERNES :
<
ASPU2:   WORD        SPU2
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
         PROG
SPU:     EQU         $
<
< TEST DU PREMIER POINT, ET
< INITIALISATION DES PARAMETRES :
<
         LA          PREM            < EST-CE LA PREMIERE FOIS ???
         JAE         SPU9            < OUI...
         BR          ASPU2           < NON...
SPU9:    EQU         $
         IC          PREM            < OUI...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON CHAMP 4#
<
< CALCUL DE LA COMPOSANTE EN 'U' :
<
SPU2:    EQU         $
         FLD         XFA6
         LYI         'FF00           < POUR LE GENERATEUR 'RDN',
         BSR         ARAYON          < GENERATION ALEATOIRE COHERENTE...
         FAD         XFA1            < TRANSLATION,
         RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         XFA7
         LYI         '00FF           < POUR LE GENERATEUR 'RDN',
         BSR         ARAYON          < GENERATION ALEATOIRE COHERENTE...
         FAD         XFA2            < TRANSLATION,
         RSR                         < ???!?
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         XFA8
         LYI         '0000           < POUR LE GENERATEUR 'RDN',
         BSR         ARAYON          < GENERATION ALEATOIRE COHERENTE...
         FAD         XFA4            < ET TRANSLATION...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON CHAMP 4#
:F
:F
< <<'SIOP SURFACE CHA 4'
DF'SIOP BOURSOUFLURE 1'
ED'SIOP BOURSOUFLURE 1'
IN0
         PAGE
         IDP         "SIOP BOURSOUFLURE 1"
         IDP         "SIOS BOURSOUFLURES 1"
<
<
<        B O U R S O U F L U R E S   1  :
<
<
<        FONCTION :
<                      CE MODULE UTILISE L'IMAGE
<                    'TV2' POUR "GONFLER" L'IMAGE
<                    RESIDENTE, ET CECI EN CALCULANT
<                    LA DENSITE DE POINTS NON NOIRS
<                    A DOITE, A GAUCHE, EN HAUT ET
<                    EN BAS DE CHAQUE POINT COURANT...
<
<
<        ARGUMENTS :
XXXRDN:  VAL         1
         EOT         #SIOP RAYON 2#
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
XXXRDN:  VAL         2
         EOT         #SIOP RAYON 2#
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
         PROG
SPU:     EQU         $
<
< TEST DU PREMIER POINT, ET
< INITIALISATION DES PARAMETRES :
<
         LA          PREM            < EST-CE LA PREMIERE FOIS ???
         JANE        SPU2            < NON...
         IC          PREM            < OUI...
XXXRDN:  VAL         3
         EOT         #SIOP RAYON 2#
<
< CALCUL DE LA COMPOSANTE EN 'U' :
<
SPU2:    EQU         $
         FLD         XFA1
         FAD         VARU
         RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         XFA2
         FAD         VARV
         RSR                         < ???!?
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F1
         BSR         ARAYON          < BOURSOUFLURE...
         RSR
XXXRDN:  VAL         4
         EOT         #SIOP RAYON 2#
:F
:F
< <<'SIOP BOURSOUFLURE 1'



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.