DF'SIOT CONFORME 1'
ED'SIOT CONFORME 1'
IN0
         PAGE
         IDP         "SIOT CONFORME 1"
         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
<
<
<        T R A N S F O R M A T I O N S   C O N F O R M E S   1  :
<
<
<        FONCTION :
<                      CE MODULE CALCULE LA TRANS-
<                    FORMATION SUIVANTE (DONT LES
<                    TRANSFORMATIONS Z2 ET 1/Z SONT
<                    DES CAS PARTICULIERS) :
<
<        X=(A0*X+A1*X**2+A2*X*Y+A3*Y**2+A4*Y)/D,
<        Y=(A5*X+A6*X**2+A7*X*Y+A8*Y**2+A9*Y)/D,
<        Z=0,
<                    AVEC :
<        D=A10+A11*X+A12*X**2+A13*X*Y+A14*Y**2+A15*Y.
<
<
<                    TRANSFORMATION CONFORME : Z=Z**2 :
<                                    A1=1,
<                                    A3=-1,
<                                    A7=2,
<                                    A10=1.
<                                    (TOUS LES AUTRES A(I) ETANT NULS).
<
<
<                    TRANSFORMATION CONFORME : Z=1/Z :
<                                    A0=1,
<                                    A9=-1,
<                                    A12=1,
<                                    A14=1.
<                                    (TOUS LES AUTRES A(I) ETANT NULS).
<
<
<        PARAMETRES :
A0::     VAL         0               < COEFFICIENTS DU NUMERATEUR DE 'X' :
A1::     VAL         A0+1
A2::     VAL         A1+1
A3::     VAL         A2+1
A4::     VAL         A3+1
A5::     VAL         A4+1            < COEFFICIENTS DU NUMERATEUR DE 'Y' :
A6::     VAL         A5+1
A7::     VAL         A6+1
A8::     VAL         A7+1
A9::     VAL         A8+1
A10::    VAL         A9+1            < COEFFICIENTS DU DENOMINATEUR DE X ET Y :
A11::    VAL         A10+1
A12::    VAL         A11+1
A13::    VAL         A12+1
A14::    VAL         A13+1
A15::    VAL         A14+1
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
XA0:     FLOAT       0
XA1:     FLOAT       0
XA2:     FLOAT       0
XA3:     FLOAT       0
XA4:     FLOAT       0
XA5:     FLOAT       0
XA6:     FLOAT       0
XA7:     FLOAT       0
XA8:     FLOAT       0
XA9:     FLOAT       0
XA10:    FLOAT       0
XA11:    FLOAT       0
XA12:    FLOAT       0
XA13:    FLOAT       0
XA14:    FLOAT       0
XA15:    FLOAT       0
DENOM:   FLOAT       0
ASPAD:   WORD        SPAD            < S/P DE CUMUL DE 'FWORK'...
         PROG
<
<
<        C U M U L  :
<
<
SPAD:    EQU         $
         FAD         FWORK
         FST         FWORK
         RSR
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
<
< RECUPERATION DES PARAMETRES :
<
         LXI         A0
         BSR         ASPCT
         FST         XA0
         LXI         A1
         BSR         ASPCT
         FST         XA1
         LXI         A2
         BSR         ASPCT
         FST         XA2
         LXI         A3
         BSR         ASPCT
         FST         XA3
         LXI         A4
         BSR         ASPCT
         FST         XA4
         LXI         A5
         BSR         ASPCT
         FST         XA5
         LXI         A6
         BSR         ASPCT
         FST         XA6
         LXI         A7
         BSR         ASPCT
         FST         XA7
         LXI         A8
         BSR         ASPCT
         FST         XA8
         LXI         A9
         BSR         ASPCT
         FST         XA9
         LXI         A10
         BSR         ASPCT
         FST         XA10
         LXI         A11
         BSR         ASPCT
         FST         XA11
         LXI         A12
         BSR         ASPCT
         FST         XA12
         LXI         A13
         BSR         ASPCT
         FST         XA13
         LXI         A14
         BSR         ASPCT
         FST         XA14
         LXI         A15
         BSR         ASPCT
         FST         XA15
<
< CALCUL DU DENOMINATEUR :
<
         FLD         VARV
         FMP         XA15            < A15*Y,
         FST         FWORK
         FLD         VARV
         FMP         VARV
         FMP         XA14
         BSR         ASPAD           < +A14*Y**2,
         FLD         VARV
         FMP         VARU
         FMP         XA13
         BSR         ASPAD           < +A13*X*Y,
         FLD         VARU
         FMP         VARU
         FMP         XA12
         BSR         ASPAD           < +A12*X**2,
         FLD         VARU
         FMP         XA11
         BSR         ASPAD           < +A11*X,
         FAD         XA10            < +A10,
         FST         DENOM           < DENOMINATEUR DE 'X' ET 'Y'.
<
< CALCUL DE 'X' :
<
         FLD         VARV
         FMP         XA4
         FST         FWORK           < A4*Y,
         FLD         VARV
         FMP         VARV
         FMP         XA3
         BSR         ASPAD           < +A3*Y**2,
         FLD         VARV
         FMP         VARU
         FMP         XA2
         BSR         ASPAD           < +A2*X*Y,
         FLD         VARU
         FMP         VARU
         FMP         XA1
         BSR         ASPAD           < +A1*X**2,
         FLD         VARU
         FMP         XA0
         BSR         ASPAD           < +A0*X,
         FDV         DENOM           < /DENOMINATEUR...
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         VARV
         FMP         XA9
         FST         FWORK           < A9*Y,
         FLD         VARV
         FMP         VARV
         FMP         XA8
         BSR         ASPAD           < +A8*Y**2,
         FLD         VARV
         FMP         VARU
         FMP         XA7
         BSR         ASPAD           < +A7*X*Y,
         FLD         VARU
         FMP         VARU
         FMP         XA6
         BSR         ASPAD           < +A6*X**2,
         FLD         VARU
         FMP         XA5
         BSR         ASPAD           < +A5*X,
         FDV         DENOM           < /DENOMINATEUR...
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT CONFORME 1'
DF'SIOT CONFORME 2'
ED'SIOT CONFORME 2'
IN0
         PAGE
         IDP         "SIOT CONFORME 2"
<
<
<        T R A N S F O R M A T I O N S   C O N F O R M E S   2  :
<
<
<        FONCTION :
<                      CE MODULE CALCULE LA TRANS-
<                    FORMATION SUIVANTE (DONT LES
<                    TRANSFORMATIONS Z2 ET 1/Z SONT
<                    DES CAS PARTICULIERS) :
<
<        X=(A16+A0*X+A1*X**2+A2*X*Y+A3*Y**2+A4*Y)/D,
<        Y=(A17+A5*X+A6*X**2+A7*X*Y+A8*Y**2+A9*Y)/D,
<        Z=0,
<                    AVEC :
<        D=A10+A11*X+A12*X**2+A13*X*Y+A14*Y**2+A15*Y.
<
<                    ET EN ITERANT 'XA18' FOIS LA TRANSFOR-
<                    MATION, CALCULANT AINSI :
<
<                    Z=F(F(...F(Z)...)).
<
<
<                    TRANSFORMATION CONFORME : Z=Z**2 :
<                                    A1=1,
<                                    A3=-1,
<                                    A7=2,
<                                    A10=1.
<                                    (TOUS LES AUTRES A(I) ETANT NULS).
<
<
<                    TRANSFORMATION CONFORME : Z=1/Z :
<                                    A0=1,
<                                    A9=-1,
<                                    A12=1,
<                                    A14=1.
<                                    (TOUS LES AUTRES A(I) ETANT NULS).
<
<
<        PARAMETRES :
A0::     VAL         0               < COEFFICIENTS DU NUMERATEUR DE 'X' :
A1::     VAL         A0+1
A2::     VAL         A1+1
A3::     VAL         A2+1
A4::     VAL         A3+1
A5::     VAL         A4+1            < COEFFICIENTS DU NUMERATEUR DE 'Y' :
A6::     VAL         A5+1
A7::     VAL         A6+1
A8::     VAL         A7+1
A9::     VAL         A8+1
A10::    VAL         A9+1            < COEFFICIENTS DU DENOMINATEUR DE X ET Y :
A11::    VAL         A10+1
A12::    VAL         A11+1
A13::    VAL         A12+1
A14::    VAL         A13+1
A15::    VAL         A14+1
A16::    VAL         A15+1
A17::    VAL         A16+1
A18::    VAL         A17+1           < NOMBRE D'ITERATION MAX DE LA FONCTION.
A19::    VAL         A18+1           < MODULE MAX, AU DELA DUQUEL ON IGNORE
                                     < LES POINTS EN RENVOYANT L'INFINI...
A20::    VAL         A19+1           < QUI DOIT-ON TRACER ???
                                     < =0 : LE COUPLE (X,Y) INITIAL,
                                     < #0 : LE COUPLE (X,Y) FINAL.
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
PREM:    WORD        -1              < INDICATEUR DE PREMIER PASSAGE...
XA0:     FLOAT       0
XA1:     FLOAT       0
XA2:     FLOAT       0
XA3:     FLOAT       0
XA4:     FLOAT       0
XA5:     FLOAT       0
XA6:     FLOAT       0
XA7:     FLOAT       0
XA8:     FLOAT       0
XA9:     FLOAT       0
XA10:    FLOAT       0
XA11:    FLOAT       0
XA12:    FLOAT       0
XA13:    FLOAT       0
XA14:    FLOAT       0
XA15:    FLOAT       0
XA16:    FLOAT       0
XA17:    FLOAT       0
XA18:    WORD        0               < NOMBRE D'ITERATIONS DE LA FONCTION...
XA19:    FLOAT       0               < MODULE COURANT : RAC(X**2+Y**2).
XA20:    WORD        0               < QUI DOIT-ON TRACER :
                                     < =0 : (VARU,VARV) INITIAL,
                                     < #0 : (SVARU,SVARV) FINAL.
FINFIN:  FLOAT       100000          < INFINI...
SVARU:   FLOAT       0               < 'U' COURANT,
SVARV:   FLOAT       0               < 'V' COURANT.
DENOM:   FLOAT       0
ASPAD:   WORD        SPAD            < S/P DE CUMUL DE 'FWORK'...
ASPU2:   WORD        SPU2            < RELAI...
         PROG
<
<
<        C U M U L  :
<
<
SPAD:    EQU         $
         FAD         FWORK
         FST         FWORK
         RSR
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
<
< RECUPERATION DES PARAMETRES :
<
         CPZ         PREM            < EST-CE LA PREMIERE FOIS...
         JGE         SPU1            < NON...
         IC          PREM            < OUI, ENTRONS LES PARAMETRES...
         LXI         A0
         BSR         ASPCT
         FST         XA0
         LXI         A1
         BSR         ASPCT
         FST         XA1
         LXI         A2
         BSR         ASPCT
         FST         XA2
         LXI         A3
         BSR         ASPCT
         FST         XA3
         LXI         A4
         BSR         ASPCT
         FST         XA4
         LXI         A5
         BSR         ASPCT
         FST         XA5
         LXI         A6
         BSR         ASPCT
         FST         XA6
         LXI         A7
         BSR         ASPCT
         FST         XA7
         LXI         A8
         BSR         ASPCT
         FST         XA8
         LXI         A9
         BSR         ASPCT
         FST         XA9
         LXI         A10
         BSR         ASPCT
         FST         XA10
         LXI         A11
         BSR         ASPCT
         FST         XA11
         LXI         A12
         BSR         ASPCT
         FST         XA12
         LXI         A13
         BSR         ASPCT
         FST         XA13
         LXI         A14
         BSR         ASPCT
         FST         XA14
         LXI         A15
         BSR         ASPCT
         FST         XA15
         LXI         A16
         BSR         ASPCT
         FST         XA16
         LXI         A17
         BSR         ASPCT
         FST         XA17
         LXI         A18
         BSR         ASPCT
         BSR         AROND
         JALE        $               < ?!????!?!
         STA         XA18            < NOMBRE D'ITERATIONS MAX...
         LXI         A19
         BSR         ASPCT
         FCAZ
         JLE         $               < ??!?!?!
         FST         XA19            < MODULE MAX...
         LXI         A20
         BSR         ASPCT
         BSR         AROND
         STA         XA20            < QUI DOIT-ON TRACER ???
SPU1:    EQU         $
<
< INITIALISATION DE L'ITERATION :
<
         PSR         X
         LX          XA18            < (X)=NOMBRE D'ITERATIONS...
         FLD         VARU
         FST         SVARU           < PARTIE REELLE COURANTE DU 'Z',
         FLD         VARV
         FST         SVARV           < PARTIE IMAGINAIRE COURANTE DU 'Z'.
<
< BOUCLE D'ITERATION DE LA FONCTION :
<
SPU2:    EQU         $
<
< CALCUL DU DENOMINATEUR :
<
         FLD         SVARV
         FMP         XA15            < A15*Y,
         FST         FWORK
         FLD         SVARV
         FMP         SVARV
         FMP         XA14
         BSR         ASPAD           < +A14*Y**2,
         FLD         SVARV
         FMP         SVARU
         FMP         XA13
         BSR         ASPAD           < +A13*X*Y,
         FLD         SVARU
         FMP         SVARU
         FMP         XA12
         BSR         ASPAD           < +A12*X**2,
         FLD         SVARU
         FMP         XA11
         BSR         ASPAD           < +A11*X,
         FAD         XA10            < +A10,
         FST         DENOM           < DENOMINATEUR DE 'X' ET 'Y'.
<
< CALCUL DE 'X' :
<
         FLD         SVARV
         FMP         XA4
         FST         FWORK           < A4*Y,
         FLD         SVARV
         FMP         SVARV
         FMP         XA3
         BSR         ASPAD           < +A3*Y**2,
         FLD         SVARV
         FMP         SVARU
         FMP         XA2
         BSR         ASPAD           < +A2*X*Y,
         FLD         SVARU
         FMP         SVARU
         FMP         XA1
         BSR         ASPAD           < +A1*X**2,
         FLD         SVARU
         FMP         XA0
         BSR         ASPAD           < +A0*X,
         FAD         XA16            < +A16,
         FDV         DENOM           < /DENOMINATEUR...
         PSR         A,B             < SAUVEGARDE DE LA PARTIE REELLE...
<
< CALCUL DE 'Y' :
<
         FLD         SVARV
         FMP         XA9
         FST         FWORK           < A9*Y,
         FLD         SVARV
         FMP         SVARV
         FMP         XA8
         BSR         ASPAD           < +A8*Y**2,
         FLD         SVARV
         FMP         SVARU
         FMP         XA7
         BSR         ASPAD           < +A7*X*Y,
         FLD         SVARU
         FMP         SVARU
         FMP         XA6
         BSR         ASPAD           < +A6*X**2,
         FLD         SVARU
         FMP         XA5
         BSR         ASPAD           < +A5*X,
         FAD         XA17            < +A17,
         FDV         DENOM           < /DENOMINATEUR...
         FST         SVARV           < NOUVELLE PARTIE IMAGINAIRE,
         PLR         A,B
         FST         SVARU           < NOUVELLE PARTIE REELLE...
         JDX         SPU5            < A L'ITERATION SUIVANTE...
         JMP         SPU6            < C'EST FINI...
SPU5:    EQU         $
         BR          ASPU2           < RELAI VERS LE TOUR SUIVANT...
SPU6:    EQU         $
         PLR         X               < C'EST FINI,
<
< CALCUL DU MODULE COURANT :
<
         FLD         SVARU
         FMP         SVARU
         FST         FWORK           < X**2,
         FLD         SVARV
         FMP         SVARV           < Y**2,
         FAD         FWORK           < X**2+Y**2,
         BSR         ARAC            < RAC(X**2+Y**2),
         FCAM        XA19            < TROP GRAND ???
         JG          SPU7            < OUI, ON IGNORE LE POINT COURANT...
         CPZ         XA20            < NON, OK, MAIS QUI DOIT-ON TRACER ???
         JNE         SPU3            < (SVARU,SVARV) CALCULES...
         FLD         VARU            < NON, (VARU,VARV) INITIAUX...
         FST         SVARU
         FLD         VARV
         FST         SVARV
         JMP         SPU3            < VERS LE RETOUR...
SPU7:    EQU         $
         FLD         FINFIN          < ON IGNORE LE POINT COURANT :
         FST         SVARV           < (EN RENVOYANT
         FST         SVARU           <               L'INFINI...)
SPU3:    EQU         $
         FLD         SVARU           < (A,B)=PARTIE REELLE...
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         SVARV           < (A,B)=PARTIE IMAGINAIRE...
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT CONFORME 2'
DF'SIOT COS2X/(X+1)'
ED'SIOT COS2X/(X+1)'
IN0
         PAGE
         IDP         "SIOT COS2X/(X+1)"
<
<
<        F O N C T I O N   ( ( C O S ( X ) ) * * 2 ) / ( A B S ( X ) + 1 )  :
<
<
<        FONCTION :
<                      CE MODULE CALCULE UN CHAMP DE DEPLACE-
<                    MENT TEL QUE :
<                    DELTA(X)=0,
<                    DELTA(Y)=A0*((COS(X))**2)/(A1*ABS(X)+1),
<                    DELTA(Z)=0.
<
<
<        ARGUMENT :
<                    A0000=CONSTANTE MULTIPLICATIVE DE DELTA(Y).
<                    A0001=CONSTANTE MULTIPLICATIVE DE ABS(X).
A0::     VAL         0
A1::     VAL         A0+1
<
<
         LOCAL
FLOC:    EQU         $
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         FLD         F0
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         LXI         A1
         BSR         ASPCT
         FST         FWORK           < A1.
         FLD         VARU
         FCAZ
         JGE         SPV1            < X>=0...
         FNEG                        < X<0, ON CHANGE SON SIGNE...
SPV1:    EQU         $
         FMP         FWORK           < A1*ABS(X).
         FAD         F1
         FST         FWORK           < A1*ABS(X)+1.
         LXI         A0
         BSR         ASPCT
         FST         FWORK1          < A0.
         FLD         VARU
         BSR         ACOS
         FST         FWORK2          < COS(X).
         FMP         FWORK2          < (COS(X))**2.
         FMP         FWORK1          < A0*((COS(X))**2).
         FDV         FWORK           < A0*((COS(X))**2)/(A1*ABS(X)+1).
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT COS2X/(X+1)'
DF'SIOT COS2X/(X2+1)'
ED'SIOT COS2X/(X2+1)'
IN0
         PAGE
         IDP         "SIOT COS2X/(X2+1)"
<
<
<        F O N C T I O N   ( ( C O S ( X ) ) * * 2 ) / ( X * * 2 + 1 )  :
<
<
<        FONCTION :
<                      CE MODULE CALCULE UN CHAMP DE DEPLACE-
<                    MENT TEL QUE :
<                                    DELTA(X)=0,
<                                    DELTA(Y)=A0*((COS(X))**2)/(X**2+1),
<                                    DELTA(Z)=0.
<
<
<        ARGUMENT :
<                    A0000=CONSTANTE MULTIPLICATIVE DE DELTA(Y).
A0::     VAL         0
<
<
         LOCAL
FLOC:    EQU         $
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         FLD         F0
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         VARU
         FMP         VARU
         FAD         F1
         FST         FWORK           < X**2+1.
         LXI         A0
         BSR         ASPCT
         FST         FWORK1          < A0.
         FLD         VARU
         BSR         ACOS
         FST         FWORK2          < COS(X).
         FMP         FWORK2          < (COS(X))**2.
         FMP         FWORK1          < A0*((COS(X))**2).
         FDV         FWORK           < A0*((COS(X))**2)/(X**2+1).
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT COS2X/(X2+1)'
DF'SIOT FUITE'
ED'SIOT FUITE'
IN0
         PAGE
         IDP         "SIOT FUITE"
<
<
<        C O N S T R U C T I O N   D ' U N E   F U I T E  :
<
<
<        FONCTION :
<                      JOINT TOUS LES POINTS DE L'IMAGE A UN POINT
<                    FIXE EN ARRIERE DE L'ECRAN...
<
<
<        NOTA :
<                      S'UTILISE AVEC TOUS LES COEFFICIENTS
<                    MULTIPLICATEURS 'K...' EGAUX A 1...
<
<
<        ARGUMENTS :
A0000::  VAL         0               < X(POINT DE FUITE),
A0001::  VAL         A0000+1         < Y(POINT DE FUITE),
A0002::  VAL         A0001+1         < Z(POINT DE FUITE).
<
<
         LOCAL
FLOC:    EQU         $
         PROG
<
<
<        D E P L A C E M E N T   ' U '  :
<
<
SPU:     EQU         $
         LXI         A0000
         BSR         ASPCT
         FSB         VARU
         RSR
<
<
<        D E P L A C E M E N T   ' V '  :
<
<
SPV:     EQU         $
         LXI         A0001
         BSR         ASPCT
         FSB         VARV
         RSR
<
<
<        D E P L A C E M E N T  ' W '  :
<
<
SPW:     EQU         $
         LXI         A0002
         BSR         ASPCT
         FSB         VARW
         RSR
:F
:F
< <<'SIOT FUITE'
DF'SIOT MAGRITTE 1'
ED'SIOT MAGRITTE 1'
IN0
         PAGE
         IDP         "SIOT MAGRITTE 1"
<
<
<        M A G R I T T E   1  :
<
<
<        FONCTION :
<                      CE MODULE INSERE L'IMAGE
<                    FIGURANT EN 'MEMTV2' DANS LES
<                    CONTOURS DE L'IMAGE RESIDENTE
<                    ET L'AFFICHE DANS L'IMAGE
<                    SCRATCH 'MEMTV'...
<
<
<        ATTENTION :
<                      LE POINT (0,0) EST MARQUE
<                    IL FAUT DONC ENSUITE L'ELIMINER
<                    SI NECESSAIRE...
<
<
         LOCAL
FLOC:    EQU         $
SX1:     WORD        0               < PREMIER POINT NON NOIR A LA VERTICALE
                                     < DU POINT ARGUMENT (XR,YR).
SXN:     WORD        0               < DERNIER POINT NON NOIR A LA VERTICALE
                                     < DU POINT ARGUMENT (XR,YR).
SY1:     WORD        0               < PREMIER POINT NON NOIR A L'HORIZONTALE
                                     < DU POINT ARGUMENT (XR,YR).
SYN:     WORD        0               < DERNIER POINT NOIR A L'HORIZONTALE
                                     < DU POINT ARGUMENT (XR,YR).
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
<
< DEFINITION DE LA VERTICALE EN 'XR' :
<
         LA          YR
         PSR         A               < SAVE 'YR',
         STZ         YR              < ET ON COMMENCE EN HAUT :
SPU1:    EQU         $
         BSR         ASPGPR          < A=NIVEAU DU POINT (XR,YR) COURANT :
         JANE        SPU2            < ON S'ARRETE AU PREMIER NON NOIR...
         IC          YR              < SINON,
         JMP         SPU1            < AU SUIVANT...
SPU2:    EQU         $
         LAI         NLIGM1          < ET ON REPART EN BAS,
         XM          YR
         STA         SY1             < EN SAUVANT LE PREMIER...
SPU3:    EQU         $
         BSR         ASPGPR          < A=NIVEAU DU POINT (XR,YR) COURANT :
         JANE        SPU4            < ON S'ARRETE AU DERNIER NON NOIR...
         DC          YR              < SINON,
         JMP         SPU3            < AU PRECEDENT...
SPU4:    EQU         $
         IC          YR              < POUR EVITER LES DENOMINATEURS NULS.
         PLR         A
         XM          YR              < ON RESTAURE 'YR',
         STA         SYN             < EN SAUVANT LE DERNIER...
<
< RECHERCHE DE L'HORIZONTALE :
<
         LA          XR
         PSR         A
         STZ         XR              < ON COMMENCE A GAUCHE :
SPU5:    EQU         $
         BSR         ASPGPR          < A=NIVEAU DU POINT (XR,YR) COURANT :
         JANE        SPU6            < ON S'ARRETE AU PREMIER NON NOIR...
         IC          XR              < SINON,
         JMP         SPU5            < AU SUIVANT...
SPU6:    EQU         $
         LAI         NPOLM1
         XM          XR              < ET ON REPART A DROITE...
         STA         SX1             < EN SAUVANT LE PREMIER...
SPU7:    EQU         $
         BSR         ASPGPR          < A=NIVEAU DU POINT (XR,YR) COURANT :
         JANE        SPU8            < ON S'ARRETE AU DERNIER NON NOIR...
         DC          XR              < SINON,
         JMP         SPU7            < AU SUIVANT...
SPU8:    EQU         $
         IC          XR              < POUR EVITER LES DENOMINATEURS NULS.
         PLR         A
         XM          XR              < RESTAURATION DE 'XR',
         STA         SXN             < ET ON SAUVE LE DERNIER...
<
< GENERATION DE 'XS' :
<
         LA          SXN
         SB          SX1
         FLT
         FST         FWORK
         LA          XR
         SB          SX1
         FLT
         FDV         FWORK
         FST         FWORK
         LAI         NPOLM1
         FLT
         FMP         FWORK
         BSR         AROND
         STA         XS              < XS=NPOLM1*(XR-SX1)/(SXN-SX1).
<
< GENERATION DE 'YS' :
<
         LA          SYN
         SB          SY1
         FLT
         FST         FWORK
         LA          YR
         SB          SY1
         FLT
         FDV         FWORK
         FST         FWORK
         LAI         NLIGM1
         FLT
         FMP         FWORK
         BSR         AROND
         STA         YS              < YS=NLIGM1*(YR-SY1)/(SYN-SY1).
<
< ACCES AU POINT (XS,YS) DE 'MEMTV2' :
<
         LA          CTCDA
         STA         XCTCDA
         BSR         ASPGPS          < A=NIVEAU(XS,YS) DE 'MEMTV2' :
         STZ         XCTCDA
         LB          XR
         STB         XS
         LB          YR
         STB         YS
         BSR         ASPRPS          < QUE L'ON MET EN (XR,YR) DE 'MEMTV1'...
         FLD         F0              < ET ON SE PLACE A L'ORIGINE...
                                     < ON MARQUE DONC TOUJOURS LE MEME
                                     < POINT (0,0) !!!
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         F0              < ET ON SE PLACE A L'ORIGINE...
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT MAGRITTE 1'
DF'SIOT MAGRITTE 2'
ED'SIOT MAGRITTE 2'
IN0
         PAGE
         IDP         "SIOT MAGRITTE 2"
<
<
<        M A G R I T T E   2  :
<
<
<        FONCTION :
<                      CE MODULE INSERE L'IMAGE
<                    FIGURANT EN 'MEMTV2' DANS LES
<                    CONTOURS DE L'IMAGE RESIDENTE
<                    ET L'AFFICHE DANS L'IMAGE
<                    SCRATCH 'MEMTV'...
<                      POUR CELA, EN CHAQUE POINT (XR,YR),
<                    ELLE DETERMINE LA VERTICALE (SY1,SYN)
<                    DEFINIE PAR LES BARYCENTRES DE
<                    SES POINTS EXTREMES NON NOIRS, ET
<                    L'HORIZONTALE (SX1,SXN) DEFINIE DE
<                    MEME... LES POINTS SONT PONDERES PAR
<                    LEUR NIVEAU DE GRIS.
<
<
<        PARAMETRES :
A0::     VAL         0               < A0='NPM'=NOMBRE DE POINTS D'UNE SPIRALE,
A1::     VAL         A0+1            < A1='PASQ'=PAS DE PARCOURS.
<
<
<        ATTENTION :
<                      LE POINT (0,0) EST MARQUE
<                    IL FAUT DONC ENSUITE L'ELIMINER
<                    SI NECESSAIRE...
<
<
         LOCAL
FLOC:    EQU         $
<
< PARAMETRES DE LA SPIRALE :
<
NPM:     WORD        0               < A0=NOMBRE DE POINTS DE LA SPIRALE.
PASQ:    WORD        0               < A1=PAS DE PARCOURS DE LA SPIRALE.
<
< VARIABLES DE CONSTRUCTION DE LA SPIRALE :
<
DELTAX:  WORD        0               < PAS DE PARCOURS SUR 'X',
DELTAY:  WORD        0               < PAS DE PARCOURS SUR 'Y'.
NP:      WORD        0               < NOMBRE COURANT DE POINTS TRAITES.
LB0:     WORD        0               < LONGUEUR PREVUE DU BRAS COURANT,
LB:      WORD        0               < LONGUEUR COURANTE DU BRAS COURANT.
CUMUL:   WORD        0               < CUMUL=SIGMA(N(I)) I=1...NPM,
CUMULX:  WORD        0               < CUMULX=SIGMA(N(I)*X(I)) I=1...NPM,
CUMULY:  WORD        0               < CUMULY=SIGMA(N(I)*Y(I)) I=1...NPM.
ABARYC:  WORD        BARYC           < CALCUL BARYCENTRE AUTOUR DE (XR,YR).
<
< DEFINITION HORIZONTALE ET VERTICALE :
<
SX1:     WORD        0               < PREMIER POINT NON NOIR A L'HORIZONTALE
                                     < DU POINT ARGUMENT (XR,YR).
SXN:     WORD        0               < DERNIER POINT NON NOIR A L'HORIZONTALE
                                     < DU POINT ARGUMENT (XR,YR).
SY1:     WORD        0               < PREMIER POINT NON NOIR A LA VERTICALE
                                     < DU POINT ARGUMENT (XR,YR).
SYN:     WORD        0               < DERNIER POINT NON NOIR A LA VERTICALE
                                     < DU POINT ARGUMENT (XR,YR).
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         LXI         A0
         BSR         ASPCT
         BSR         AROND
         STA         NPM
         LXI         A1
         BSR         ASPCT
         BSR         AROND
         STA         PASQ
<
< DEFINITION DE LA VERTICALE EN 'XR' :
<
         LA          YR
         PSR         A               < SAVE 'YR',
         STZ         YR              < ET ON COMMENCE EN HAUT :
SPU1:    EQU         $
         BSR         ASPGPR          < A=NIVEAU DU POINT (XR,YR) COURANT :
         JANE        SPU2            < ON S'ARRETE AU PREMIER NON NOIR...
         IC          YR              < SINON,
         JMP         SPU1            < AU SUIVANT...
SPU2:    EQU         $
         BSR         ABARYC          < CALCUL DU BARYCENTRE AUTOUR DE (XR,YR),
         LAI         NLIGM1          < ET ON REPART EN BAS,
         XM          YR
         STY         SY1             < EN SAUVANT LE BARYCENTRE...
SPU3:    EQU         $
         BSR         ASPGPR          < A=NIVEAU DU POINT (XR,YR) COURANT :
         JANE        SPU4            < ON S'ARRETE AU DERNIER NON NOIR...
         DC          YR              < SINON,
         JMP         SPU3            < AU PRECEDENT...
SPU4:    EQU         $
         IC          YR              < POUR EVITER LES DENOMINATEURS NULS...
         BSR         ABARYC          < CALCUL DU BARYCENTRE AUTOUR DE (XR,YR),
         PLR         A
         XM          YR              < ON RESTAURE 'YR',
         STY         SYN             < EN SAUVANT LE BARYCENTRE...
<
< RECHERCHE DE L'HORIZONTALE EN 'YR' :
<
         LA          XR
         PSR         A
         STZ         XR              < ON COMMENCE A GAUCHE :
SPU5:    EQU         $
         BSR         ASPGPR          < A=NIVEAU DU POINT (XR,YR) COURANT :
         JANE        SPU6            < ON S'ARRETE AU PREMIER NON NOIR...
         IC          XR              < SINON,
         JMP         SPU5            < AU SUIVANT...
SPU6:    EQU         $
         BSR         ABARYC          < CALCUL DU BARYCENTRE AUTOUR DE (XR,YR),
         LAI         NPOLM1
         XM          XR              < ET ON REPART A DROITE...
         STX         SX1             < EN SAUVANT LE BARYCENTRE...
SPU7:    EQU         $
         BSR         ASPGPR          < A=NIVEAU DU POINT (XR,YR) COURANT :
         JANE        SPU8            < ON S'ARRETE AU DERNIER NON NOIR...
         DC          XR              < SINON,
         JMP         SPU7            < AU SUIVANT...
SPU8:    EQU         $
         IC          XR              < POUR EVITER LES DENOMINATEURS NULS...
         BSR         ABARYC          < CALCUL DU BARYCENTRE AUTOUR DE (XR,YR),
         PLR         A
         XM          XR              < RESTAURATION DE 'XR',
         STX         SXN             < EN SAUVANT LE BARYCENTRE...
<
< GENERATION DE 'XS' :
<
         LA          SXN
         SB          SX1
         STA         WORK1
         LA          XR
         SB          SX1
         STA         WORK2
         LAI         NPOLM1
         MP          WORK2
         DV          WORK1
         STA         XS              < XS=NPOLM1*(XR-SX1)/(SXN-SX1).
<
< GENERATION DE 'YS' :
<
         LA          SYN
         SB          SY1
         STA         WORK1
         LA          YR
         SB          SY1
         STA         WORK2
         LAI         NLIGM1
         MP          WORK2
         DV          WORK1
         STA         YS              < YS=NLIGM1*(YR-SY1)/(SYN-SY1).
<
< ACCES AU POINT (XS,YS) DE 'MEMTV2' :
<
         LA          CTCDA
         STA         XCTCDA
         BSR         ASPGPS          < A=NIVEAU(XS,YS) DE 'MEMTV2' :
         STZ         XCTCDA
         LB          XR
         STB         XS
         LB          YR
         STB         YS
         BSR         ASPRPS          < QUE L'ON MET EN (XR,YR) DE 'MEMTV1'...
         FLD         F0              < ET ON SE PLACE A L'ORIGINE...
                                     < ON MARQUE DONC TOUJOURS LE MEME
                                     < POINT (0,0) !!!
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         F0              < ET ON SE PLACE A L'ORIGINE...
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
<
<
<        B A R Y C E N T R E   A U T O U R   D ' U N   P O I N T  :
<
<
BARYC:   EQU         $
         LA          XR
         LB          YR
         PSR         A,B             < SAUVEGARDE DU POINT (XR,YR).
         STZ         CUMUL           < CUMUL <-- 0,
         STZ         CUMULX          < CUMULX <-- 0,
         STZ         CUMULY          < CUMULY <-- 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          XR              < NON :
         JAL         SPMOY4          < LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPMOY4          < HORS-ECRAN...
         LA          YR
         JAL         SPMOY4          < HORS-ECRAN...
         CPI         NLIGM1
         JG          SPMOY4          < HORS-ECRAN...
         BSR         ASPGPR          < A=NIVEAU(XR,YR),
         PSR         A               < SAUVEGARDE DU NIVEAU N(XR,YR),
         PSR         A               < IDEM...
         AD          CUMUL
         STA         CUMUL           < CUMUL=SIGMA(NIVEAU(XR,YR)),
         PLR         A
         MP          XR
         LR          B,A
         AD          CUMULX
         STA         CUMULX          < CUMULX=SIGMA(N(XR,YR)*XR),
         PLR         A
         MP          YR
         LR          B,A
         AD          CUMULY
         STA         CUMULY          < CUMULY=SIGMA(N(XR,YR)*YR).
SPMOY4:  EQU         $
         LA          XR
         AD          DELTAX          < CHANGEMENT DE
         STA         XR
         LA          YR
         AD          DELTAY          < POINT COURANT (XR,YR).
         STA         YR
         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         XR              < RESTAURATION
         STB         YR              < DE (XR,YR),
         LA          CUMULX
         SARD        NBITMO
         DV          CUMUL
         LR          A,X             < X=COORDONNEE DU BARYCENTRE,
         LA          CUMULY
         SARD        NBITMO
         DV          CUMUL
         LR          A,Y             < Y=COORDONNEE DU BARYCENTRE...
         RSR
:F
:F
< <<'SIOT MAGRITTE 2'
DF'SIOT MAGRITTE 3'
ED'SIOT MAGRITTE 3'
IN0
         PAGE
         IDP         "SIOT MAGRITTE 3"
<
<
<        M A G R I T T E   3  :
<
<
<        FONCTION :
<                      CE MODULE INSERE L'IMAGE
<                    FIGURANT EN 'MEMTV2' DANS LES
<                    CONTOURS DE L'IMAGE RESIDENTE
<                    ET L'AFFICHE DANS L'IMAGE
<                    SCRATCH 'MEMTV'...
<                      POUR CELA, EN CHAQUE POINT (XR,YR),
<                    ELLE DETERMINE LA VERTICALE (SY1,SYN)
<                    DEFINIE PAR LES BARYCENTRES DE
<                    SES POINTS EXTREMES NON NOIRS, ET
<                    L'HORIZONTALE (SX1,SXN) DEFINIE DE
<                    MEME... ON ELIMINE AINSI LES POINTS
<                    NOIRS QUI COMPTE POUR 0, ALORS QUE
<                    LES AUTRES COMPTENT POUR 1.
<
<
<        PARAMETRES :
A0::     VAL         0               < A0='NPM'=NOMBRE DE POINTS D'UNE SPIRALE,
A1::     VAL         A0+1            < A1='PASQ'=PAS DE PARCOURS.
<
<
<        ATTENTION :
<                      LE POINT (0,0) EST MARQUE
<                    IL FAUT DONC ENSUITE L'ELIMINER
<                    SI NECESSAIRE...
<
<
         LOCAL
FLOC:    EQU         $
<
< PARAMETRES DE LA SPIRALE :
<
NPM:     WORD        0               < A0=NOMBRE DE POINTS DE LA SPIRALE.
PASQ:    WORD        0               < A1=PAS DE PARCOURS DE LA SPIRALE.
<
< VARIABLES DE CONSTRUCTION DE LA SPIRALE :
<
DELTAX:  WORD        0               < PAS DE PARCOURS SUR 'X',
DELTAY:  WORD        0               < PAS DE PARCOURS SUR 'Y'.
NP:      WORD        0               < NOMBRE COURANT DE POINTS TRAITES.
LB0:     WORD        0               < LONGUEUR PREVUE DU BRAS COURANT,
LB:      WORD        0               < LONGUEUR COURANTE DU BRAS COURANT.
CUMUL:   WORD        0               < CUMUL=SIGMA(N(I)) I=1...NPM,
CUMULX:  WORD        0               < CUMULX=SIGMA(X(I)) I=1...NPM,
CUMULY:  WORD        0               < CUMULY=SIGMA(Y(I)) I=1...NPM.
ABARYC:  WORD        BARYC           < CALCUL BARYCENTRE AUTOUR DE (XR,YR).
<
< DEFINITION HORIZONTALE ET VERTICALE :
<
SX1:     WORD        0               < PREMIER POINT NON NOIR A L'HORIZONTALE
                                     < DU POINT ARGUMENT (XR,YR).
SXN:     WORD        0               < DERNIER POINT NON NOIR A L'HORIZONTALE
                                     < DU POINT ARGUMENT (XR,YR).
SY1:     WORD        0               < PREMIER POINT NON NOIR A LA VERTICALE
                                     < DU POINT ARGUMENT (XR,YR).
SYN:     WORD        0               < DERNIER POINT NON NOIR A LA VERTICALE
                                     < DU POINT ARGUMENT (XR,YR).
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         LXI         A0
         BSR         ASPCT
         BSR         AROND
         STA         NPM
         LXI         A1
         BSR         ASPCT
         BSR         AROND
         STA         PASQ
<
< DEFINITION DE LA VERTICALE EN 'XR' :
<
         LA          YR
         PSR         A               < SAVE 'YR',
         STZ         YR              < ET ON COMMENCE EN HAUT :
SPU1:    EQU         $
         BSR         ASPGPR          < A=NIVEAU DU POINT (XR,YR) COURANT :
         JANE        SPU2            < ON S'ARRETE AU PREMIER NON NOIR...
         IC          YR              < SINON,
         JMP         SPU1            < AU SUIVANT...
SPU2:    EQU         $
         BSR         ABARYC          < CALCUL DU BARYCENTRE AUTOUR DE (XR,YR),
         LAI         NLIGM1          < ET ON REPART EN BAS,
         XM          YR
         STY         SY1             < EN SAUVANT LE BARYCENTRE...
SPU3:    EQU         $
         BSR         ASPGPR          < A=NIVEAU DU POINT (XR,YR) COURANT :
         JANE        SPU4            < ON S'ARRETE AU DERNIER NON NOIR...
         DC          YR              < SINON,
         JMP         SPU3            < AU PRECEDENT...
SPU4:    EQU         $
         IC          YR              < POUR EVITER LES DENOMINATEURS NULS...
         BSR         ABARYC          < CALCUL DU BARYCENTRE AUTOUR DE (XR,YR),
         PLR         A
         XM          YR              < ON RESTAURE 'YR',
         STY         SYN             < EN SAUVANT LE BARYCENTRE...
<
< RECHERCHE DE L'HORIZONTALE EN 'YR' :
<
         LA          XR
         PSR         A
         STZ         XR              < ON COMMENCE A GAUCHE :
SPU5:    EQU         $
         BSR         ASPGPR          < A=NIVEAU DU POINT (XR,YR) COURANT :
         JANE        SPU6            < ON S'ARRETE AU PREMIER NON NOIR...
         IC          XR              < SINON,
         JMP         SPU5            < AU SUIVANT...
SPU6:    EQU         $
         BSR         ABARYC          < CALCUL DU BARYCENTRE AUTOUR DE (XR,YR),
         LAI         NPOLM1
         XM          XR              < ET ON REPART A DROITE...
         STX         SX1             < EN SAUVANT LE BARYCENTRE...
SPU7:    EQU         $
         BSR         ASPGPR          < A=NIVEAU DU POINT (XR,YR) COURANT :
         JANE        SPU8            < ON S'ARRETE AU DERNIER NON NOIR...
         DC          XR              < SINON,
         JMP         SPU7            < AU SUIVANT...
SPU8:    EQU         $
         IC          XR              < POUR EVITER LES DENOMINATEURS NULS...
         BSR         ABARYC          < CALCUL DU BARYCENTRE AUTOUR DE (XR,YR),
         PLR         A
         XM          XR              < RESTAURATION DE 'XR',
         STX         SXN             < EN SAUVANT LE BARYCENTRE...
<
< GENERATION DE 'XS' :
<
         LA          SXN
         SB          SX1
         STA         WORK1
         LA          XR
         SB          SX1
         STA         WORK2
         LAI         NPOLM1
         MP          WORK2
         DV          WORK1
         STA         XS              < XS=NPOLM1*(XR-SX1)/(SXN-SX1).
<
< GENERATION DE 'YS' :
<
         LA          SYN
         SB          SY1
         STA         WORK1
         LA          YR
         SB          SY1
         STA         WORK2
         LAI         NLIGM1
         MP          WORK2
         DV          WORK1
         STA         YS              < YS=NLIGM1*(YR-SY1)/(SYN-SY1).
<
< ACCES AU POINT (XS,YS) DE 'MEMTV2' :
<
         LA          CTCDA
         STA         XCTCDA
         BSR         ASPGPS          < A=NIVEAU(XS,YS) DE 'MEMTV2' :
         STZ         XCTCDA
         LB          XR
         STB         XS
         LB          YR
         STB         YS
         BSR         ASPRPS          < QUE L'ON MET EN (XR,YR) DE 'MEMTV1'...
         FLD         F0              < ET ON SE PLACE A L'ORIGINE...
                                     < ON MARQUE DONC TOUJOURS LE MEME
                                     < POINT (0,0) !!!
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         F0              < ET ON SE PLACE A L'ORIGINE...
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
<
<
<        B A R Y C E N T R E   A U T O U R   D ' U N   P O I N T  :
<
<
BARYC:   EQU         $
         LA          XR
         LB          YR
         PSR         A,B             < SAUVEGARDE DU POINT (XR,YR).
         STZ         CUMUL           < CUMUL <-- 0,
         STZ         CUMULX          < CUMULX <-- 0,
         STZ         CUMULY          < CUMULY <-- 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          XR              < NON :
         JAL         SPMOY4          < LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPMOY4          < HORS-ECRAN...
         LA          YR
         JAL         SPMOY4          < HORS-ECRAN...
         CPI         NLIGM1
         JG          SPMOY4          < HORS-ECRAN...
         BSR         ASPGPR          < A=NIVEAU(XR,YR),
         JAE         SPMOY4          < POINT NOIR, ON L'IGNORE...
         IC          CUMUL           < COMPTAGE DES POINTS NON NOIRS.
         LA          CUMULX
         AD          XR
         STA         CUMULX          < CUMULX=SIGMA(XR),
         LA          CUMULY
         AD          YR
         STA         CUMULY          < CUMULY=SIGMA(YR).
SPMOY4:  EQU         $
         LA          XR
         AD          DELTAX          < CHANGEMENT DE
         STA         XR
         LA          YR
         AD          DELTAY          < POINT COURANT (XR,YR).
         STA         YR
         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         XR              < RESTAURATION
         STB         YR              < DE (XR,YR),
         LA          CUMULX
         SARD        NBITMO
         DV          CUMUL
         LR          A,X             < X=COORDONNEE DU BARYCENTRE,
         LA          CUMULY
         SARD        NBITMO
         DV          CUMUL
         LR          A,Y             < Y=COORDONNEE DU BARYCENTRE...
         RSR
:F
:F
< <<'SIOT MAGRITTE 3'
DF'SIOT MAGRITTE 4'
ED'SIOT MAGRITTE 4'
IN0
         PAGE
         IDP         "SIOT MAGRITTE 4"
<
<
<        T R A N S F O R M A T I O N   M A G R I T T E   4  :
<
<
<        FONCTION :
<                      CE MODULE, EN CHAQUE POINT
<                    (XR,YR) EXAMINE LA REPARTITION
<                    DES MASSES (C'EST-A-DIRE DES
<                    POINTS NON NOIRS) A GAUCHE, EN
<                    BAS, A DROITE ET EN HAUT. A PARTIR
<                    DES 4 CENTRES DE GRAVITE AINSI
<                    DETERMINES, IL CALCULE LES CORDONNEES
<                    TRANSFORMEES (XS,YS), CE QUI PER-
<                    MET D'ACCEDER AU NIVEAU DE CE POINT
<                    (XS,YS) DANS 'TV2' QUE L'ON ATTRIBUE
<                    AU POINT (XS,YS)=(XR,YR) DE 'TV1'...
<                      UNE DEUXIEME METHODE EST IMPLEMENTEE,
<                    ELLE COMPTE LES POINTS NOIRS A DROITE ET
<                    A GAUCHE (RESPECTIVEMENT EN HAUT ET
<                    EN BAS) DU POINT COURANT (XR,YR), ET
<                    EN DEDUIT LES POSITIONS RELATIVES DES
<                    TROUS, ET DONC LA TORSION DE L'IMAGE
<                    'TV2'.
<                      C'EST CETTE DEUXIEME METHODE QUI
<                    DONNE LE MEILLEUR RESULTAT !!!
<
<
<        ARGUMENTS :
A0::     VAL         0               < INCREMENT SUR OX DE PASSAGE D'UN POINT
                                     < A UN AUTRE POUR LE CALCUL DES 'G' ;
A1::     VAL         A0+1            < DE MEME SUR OY...
A2::     VAL         A1+1            < MODE DE CALCUL :
                                     < =0 : CENTRES DE GRAVITES,
                                     < #0 : COMPTAGE DES POINTS NOIRS.
<
<
         LOCAL
FLOC:    EQU         $
PREM:    WORD        0               < INDICATEUR DE PREMIER PASSAGE...
XRP:     WORD        NPOLM1          < POINT
YRP:     WORD        NLIGM1          <       PRECEDENT.
SXC:     WORD        0               < SAUVEGARDE DU
SYC:     WORD        0               <               POINT COURANT (XR,YR).
XG:      WORD        0               < CENTRE DE GRAVITE GAUCHE,
XD:      WORD        0               < CENTRE DE GRAVITE DROITE,
YG:      WORD        0               < CENTRE DE GRAVITE HAUT,
YD:      WORD        0               < CENTRE DE GRAVITE BAS.
ASPU12:  WORD        SPU12           < SORTIE SUR POINT (XR,YR) NON NOIR...
XA0:     WORD        0               < INCREMENT SUR OX,
XA1:     WORD        0               < INCREMENT SUR OY.
XA2:     WORD        0               < MODE DE CALCUL :
                                     < =0 : CENTRES DE GRAVITES DES POINTS
                                     <      NON NOIRS,
                                     < #0 : COMPTAGE DES POINTS NOIRS.
FINFIN:  FLOAT       1000
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
<
< AU PREMIER PASSAGE, ENTREE DES
< INCREMENTS SUR OX ET OY :
<
         CPZ         PREM            < PREMIER PASSAGE ???
         JG          SPU50           < NON...
         IC          PREM            < OUI :
         LXI         A2
         BSR         ASPCT
         BSR         AROND
         STA         XA2             < MODE DE CALCUL...
         LXI         A0
         BSR         ASPCT
         BSR         AROND
         JALE        $
         STA         XA0             < INCREMENT SUR OX,
         LXI         A1
         BSR         ASPCT
         BSR         AROND
         JALE        $
         STA         XA1             < INCREMENT SUR OY.
SPU50:   EQU         $
<
< ON NE FAIT CALCULER LES CENTRES
< DE GRAVITE SUR LES POINTS NOIRS
< DE L'IMAGE RESIDENTE :
<
         BSR         ASPGPR          < (A)=NIVEAU(XR,YR) :
         JAE         SPU13           < OK, LE POINT EST NOIR...
         BR          ASPU12          < IL N'EST PAS NOIR, ON L'IGNORE...
SPU13:   EQU         $
<
< SAUVEGARDE DU POINT COURANT :
<
         LA          XR
         LB          YR
         STB         SYC
         STA         SXC
<
< TEST DE LA NECESSITE DU
< CALCUL DES CENTRES DE GRAVITE :
<
         CPZ         XA2             < MODE ???
         JNE         SPU10           < PAR COMPTAGE DES POINTS NOIRS...
         LA          YR              < PAR 'G' :
         CP          YRP             < EST-ON SUR LA MEME HORIZONTALE ???
         JNE         SPU10           < NON, CALCUL NECESSAIRE...
         LA          XR
         SB          XRP
         CPI         1               < OUI, EST-ON VOISIN DU POINT PRECEDENT ???
         JE          SPU20           < OUI, LA REPARTITION HORIZONTALE DES
                                     < MASSES N'A PAS CHANGEE, ON VA CALCULER
                                     < UNIQUEMENT SUR LA VERTICALE...
SPU10:   EQU         $
<
< RECHERCHE DE 'G' HORIZONTAL GAUCHE :
<
         LAI         -1
         STA         XR              < INITIALISATION POINT DE DEPART.
         FLD         F0
         FST         FWORK1          < INITIALISATION DU CUMUL,
         LXI         0               < INITIALISATION DU COMPTAGE DE POINTS
                                     < NON NOIRS RECONTRES JUSQU'A 'SXC'.
         LYI         0               < COMPTAGE DES NOIRS...
SPU1:    EQU         $
         LA          XR              < AU POINT SUIVANT :
         AD          XA0
         STA         XR
         CP          SXC             < EST-CE LE POINT COURANT ???
         JGE         SPU2            < OUI, FIN DE LA RECHERCHE A GAUCHE...
         BSR         ASPGPR          < NON, TEST DU POINT (XR,YR) :
         ADRI        1,Y             < A PRIORI...
         JAE         SPU1            < IL EST NOIR, ON L'IGNORE...
         ADRI        -1,Y            < CORRECTION...
         LA          XR              < IL N'EST PAS NOIR,
         FLT
         FAD         FWORK1
         FST         FWORK1          < ON LE CUMULE,
         ADRI        1,X             < ET ON LE COMPTE...
         JMP         SPU1            < VERS LE POINT SUIVANT...
SPU2:    EQU         $
         LR          Y,A             < (A)=NOMBRE DE POINTS NOIRS...
         MP          XA0
         LR          B,A             < SCALING...
         CPZ         XA2             < MODE ???
         JNE         SPU31           < COMPTAGE POINTS NOIRS...
         LAI         0               < A PRIORI... (CENTRES DE GRAVITE)
         CPZR        X               < A-T'ON RENCONTRE DES POINTS ???
         JE          SPU31           < NON, ON PREND 'SXC'...
         LR          X,A             < OUI :
         FLT
         FST         FWORK2          < NOMBRE DE POINTS NON NOIRS,
         FLD         FWORK1          < SIGMA DE LEURS ABSCISSES,
         FDV         FWORK2
         BSR         AROND
SPU31:   EQU         $
         STA         XG              < CE QUI DONNE LE 'G' HORIZONTAL GAUCHE...
<
< RECHERCHE DU 'G' HORIZONTAL DROITE :
<
         LAI         NPOLM1
         ADRI        1,A
         STA         XR              < INITIALISATION DU POINT DE DEPART.
         FLD         F0
         FST         FWORK1          < INITIALISATION DU CUMUL,
         LXI         0               < INITIALISATION DU COMPTAGE DE POINTS
                                     < NON NOIRS RENCONTRES JUSQU'A 'SXC'.
         LYI         0               < COMPTAGE DES NOIRS...
SPU3:    EQU         $
         LA          XR              < AU POINT PRECEDENT :
         SB          XA0
         STA         XR
         CP          SXC             < EST-CE LE POINT COURANT ???
         JLE         SPU4            < OUI, FIN DE LA RECHERCHE A DROITE...
         BSR         ASPGPR          < NON, TEST DU POINT (XR,YR) :
         ADRI        1,Y             < A PRIORI...
         JAE         SPU3            < IL EST NOIR, ON L'IGNORE...
         ADRI        -1,Y            < CORRECTION...
         LA          XR              < IL N'EST PAS NOIR,
         FLT
         FAD         FWORK1
         FST         FWORK1          < ON LE CUMULE,
         ADRI        1,X             < ET ON LE COMPTE...
         JMP         SPU3            < VERS LE POINT PRECEDENT...
SPU4:    EQU         $
         LR          Y,A             < (A)=COMPTE DES NOIRS...
         MP          XA0
         LR          B,A             < SCALING...
         CPZ         XA2             < MODE ???
         JNE         SPU32           < COMPTAGE DES POINTS NOIRS...
         LAI         NPOLM1          < A PRIORI... (CENTRES DE GRAVITE)
         CPZR        X               < A-T'ON RENCONTRE DES POINTS ???
         JE          SPU32           < NON, ON PREND 'SXC'...
         LR          X,A             < OUI...
         FLT
         FST         FWORK2          < NOMBRE DE POINTS NON NOIRS,
         FLD         FWORK1          < SIGMA DE LEURS ABSCISSES,
         FDV         FWORK2
         BSR         AROND
SPU32:   EQU         $
         STA         XD              < CE QUI DONNE LE 'G' HORIZONTAL DROITE...
<
< RECHERCHE DE 'G' VERTICAL HAUT :
<
         LA          SXC
         STA         XR              < RESTAURE 'XR'...
SPU20:   EQU         $               < CAS OU LES 'G' HORIZONTAUX NE SONT PAS
                                     < A CALCULER...
         LAI         -1
         STA         YR              < INITIALISATION POINT DE DEPART.
         FLD         F0
         FST         FWORK1          < INITIALISATION DU CUMUL,
         LXI         0               < INITIALISATION DU COMPTAGE DE POINTS
                                     < NON NOIRS RECONTRES JUSQU'A 'SYC'.
         LYI         0               < COMPTAGE DES POINTS NOIRS...
SPU5:    EQU         $
         LA          YR              < AU POINT SUIVANT :
         AD          XA1
         STA         YR
         CP          SYC             < EST-CE LE POINT COURANT ???
         JGE         SPU6            < OUI, FIN DE LA RECHERCHE EN HAUT...
         BSR         ASPGPR          < NON, TEST DU POINT (XR,YR) :
         ADRI        1,Y             < A PRIORI...
         JAE         SPU5            < IL EST NOIR, ON L'IGNORE...
         ADRI        -1,Y            < CORRECTION...
         LA          YR              < IL N'EST PAS NOIR,
         FLT
         FAD         FWORK1
         FST         FWORK1          < ON LE CUMULE,
         ADRI        1,X             < ET ON LE COMPTE...
         JMP         SPU5            < VERS LE POINT SUIVANT...
SPU6:    EQU         $
         LR          Y,A             < (A)=NOMBRE DE POINTS NOIRS...
         MP          XA1
         LR          B,A             < SCALING...
         CPZ         XA2             < MODE ???
         JNE         SPU33           < COMPTAGE DES POINT NOIRS...
         LAI         0               < A PRIORI... (CENTRES DE GRAVITE)
         CPZR        X               < A-T'ON RENCONTRE DES POINTS ???
         JE          SPU33           < NON, ON PREND 'SYC'...
         LR          X,A
         FLT
         FST         FWORK2          < NOMBRE DE POINTS NON NOIRS,
         FLD         FWORK1          < SIGMA DE LEURS ORDONNEES,
         FDV         FWORK2
         BSR         AROND
SPU33:   EQU         $
         STA         YG              < CE QUI DONNE LE 'G' VERTICAL HAUT...
<
< RECHERCHE DU 'G' VERTICAL BAS :
<
         LAI         NLIGM1
         ADRI        1,A
         STA         YR              < INITIALISATION DU POINT DE DEPART.
         FLD         F0
         FST         FWORK1          < INITIALISATION DU CUMUL,
         LXI         0               < INITIALISATION DU COMPTAGE DE POINTS
                                     < NON NOIRS RENCONTRES JUSQU'A 'SYC'.
         LYI         0               < COMPTAGE DES POINTS NOIRS...
SPU7:    EQU         $
         LA          YR              < AU POINT PRECEDENT :
         SB          XA1
         STA         YR
         CP          SYC             < EST-CE LE POINT COURANT ???
         JLE         SPU8            < OUI, FIN DE LA RECHERCHE EN BAS...
         BSR         ASPGPR          < NON, TEST DU POINT (XR,YR) :
         ADRI        1,Y             < A PRIORI...
         JAE         SPU7            < IL EST NOIR, ON L'IGNORE...
         ADRI        -1,Y            < CORRECTION...
         LA          YR              < IL N'EST PAS NOIR,
         FLT
         FAD         FWORK1
         FST         FWORK1          < ON LE CUMULE,
         ADRI        1,X             < ET ON LE COMPTE...
         JMP         SPU7            < VERS LE POINT PRECEDENT...
SPU8:    EQU         $
         LR          Y,A             < (A)=NOMBRE DE POINTS NOIRS...
         MP          XA1
         LR          B,A             < SCALING...
         CPZ         XA2             < MODE ???
         JNE         SPU34           < COMPTAGE DES POINTS NOIRS...
         LAI         NLIGM1          < A PRIORI... (CENTRES DE GRAVITE)
         CPZR        X               < A-T'ON RENCONTRE DES POINTS ???
         JE          SPU34           < NON, ON PREND 'SYC'...
         LR          X,A
         FLT
         FST         FWORK2          < NOMBRE DE POINTS NON NOIRS,
         FLD         FWORK1          < SIGMA DE LEURS ORDONNEES,
         FDV         FWORK2
         BSR         AROND
SPU34:   EQU         $
         STA         YD              < CE QUI DONNE LE 'G' VERTICAL BAS...
<
< RESTAURATION DU POINT COURANT :
<
         LA          SYC
         STA         YR
<
< MEMORISATION DU POINT COURANT :
<
SPU11:   EQU         $
         LA          XR
         LB          YR
         STB         YRP
         STA         XRP
<
< CALCUL DU POINT (XS,YS) :
<
         CPZ         XA2             < MODE ???
         JE          SPU60           < CENTRES DE GRAVITE...
         LA          XG              < COMPTAGE DES POINTS NOIRS :
         FLT
         FST         FWORK1          < FWORK1=XG,
         LA          XG
         AD          XD
         FLT
         FST         FWORK2          < FWORK2=XG+XD,
         JMP         SPU61
SPU60:   EQU         $               < CENTRES DE GRAVITE :
         LA          XR
         SB          XG
         FLT
         FST         FWORK1          < FWORK1=XR-XG,
         LA          XD
         SB          XR
         FLT                         < XD-XR,
         FAD         FWORK1          < (XD-XR)+(XR-XG),
         FST         FWORK2          < FWORK2=XD-XG,
SPU61:   EQU         $
         LAI         NPOLM1
         FLT
         FMP         FWORK1
         FDV         FWORK2
         BSR         AROND
         STA         XS              < XS=255*(XR-XG)/(XD-XG) SI 'G',
                                     <   =255*XG/(XG+XD) SI COMPTAGE NOIRS.
         CPZ         XA2             < MODE ???
         JE          SPU62           < CENTRES DE GRAVITE...
         LA          YG              < COMPTAGE DES POINTS NOIRS :
         FLT
         FST         FWORK1          < FWORK1=YG,
         LA          YG
         AD          YD
         FLT
         FST         FWORK2          < FWORK2=YG+YD,
         JMP         SPU63
SPU62:   EQU         $               < CENTRES DE GRAVITE :
         LA          YR
         SB          YG
         FLT
         FST         FWORK1          < FWORK1=YR-YG,
         LA          YD
         SB          YR
         FLT                         < YD-YR,
         FAD         FWORK1          < (YD-YR)+(YR-YG),
         FST         FWORK2          < FWORK2=YD-YG,
SPU63:   EQU         $
         LAI         NLIGM1
         FLT
         FMP         FWORK1
         FDV         FWORK2
         BSR         AROND
         STA         YS              < YS=255*(YR-YG)/(YD-YG) SI 'G',
                                     <   =255*YG/(YG+YD) SI COMPTAGE NOIRS.
<
< ACCES AU POINT (XS,YS) DE 'MEMTV2' :
<
         LA          CTCDA
         STA         XCTCDA
         BSR         ASPGPS          < A=NIVEAU(XS,YS) DE 'MEMTV2' :
         STZ         XCTCDA
         LB          XR
         STB         XS
         LB          YR
         STB         YS
         BSR         ASPRPS          < QUE L'ON MET EN (XR,YR) DE 'MEMTV1'...
SPU12:   EQU         $
         FLD         FINFIN          < ON NE BOUGE PAS...
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         FINFIN          < ON NE BOUGE PAS...
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT MAGRITTE 4'
DF'SIOT MAGRITTE 5'
ED'SIOT MAGRITTE 5'
IN0
         PAGE
         IDP         "SIOT MAGRITTE 5"
<
<
<        T R A N S F O R M A T I O N   M A G R I T T E   5  :
<
<
<        FONCTION :
<                      CE MODULE, EN CHAQUE POINT
<                    (XR,YR) EXAMINE LA REPARTITION
<                    DES MASSES (C'EST-A-DIRE DES
<                    POINTS NON NOIRS) A GAUCHE, EN
<                    BAS, A DROITE ET EN HAUT. A PARTIR
<                    DES 4 CENTRES DE GRAVITE AINSI
<                    DETERMINES, IL CALCULE LES CORDONNEES
<                    TRANSFORMEES (XS,YS), CE QUI PER-
<                    MET D'ACCEDER A UN NIVEAU MOYEN AUTOUR DE
<                    CE POINT (XS,YS) DANS 'TV2' QUE L'ON ATTRIBUE
<                    AU POINT (XS,YS)=(XR,YR) DE 'TV1'...
<                      UNE DEUXIEME METHODE EST IMPLEMENTEE,
<                    ELLE COMPTE LES POINTS NOIRS A DROITE ET
<                    A GAUCHE (RESPECTIVEMENT EN HAUT ET
<                    EN BAS) DU POINT COURANT (XR,YR), ET
<                    EN DEDUIT LES POSITIONS RELATIVES DES
<                    TROUS, ET DONC LA TORSION DE L'IMAGE
<                    'TV2'.
<                      C'EST CETTE DEUXIEME METHODE QUI
<                    DONNE LE MEILLEUR RESULTAT !!!
<
<
<        ARGUMENTS :
A0::     VAL         0               < INCREMENT SUR OX DE PASSAGE D'UN POINT
                                     < A UN AUTRE POUR LE CALCUL DES 'G' ;
A1::     VAL         A0+1            < DE MEME SUR OY...
A2::     VAL         A1+1            < MODE DE CALCUL :
                                     < =0 : CENTRES DE GRAVITES,
                                     < #0 : COMPTAGE DES POINTS NOIRS.
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            < MODE DE PARCOURS DE LA SPIRALE :
                                     < -1 : RECHERCHE DU NIVEAU MIN,
                                     <  0 : RECHERCHE DU NIVEAU MOYEN,
                                     < +1 : RECHERCHE DU NIVEAU MAX.
<
<
         LOCAL
FLOC:    EQU         $
PREM:    WORD        0               < INDICATEUR DE PREMIER PASSAGE...
XRP:     WORD        NPOLM1          < POINT
YRP:     WORD        NLIGM1          <       PRECEDENT.
SXC:     WORD        0               < SAUVEGARDE DU
SYC:     WORD        0               <               POINT COURANT (XR,YR).
XG:      WORD        0               < CENTRE DE GRAVITE GAUCHE,
XD:      WORD        0               < CENTRE DE GRAVITE DROITE,
YG:      WORD        0               < CENTRE DE GRAVITE HAUT,
YD:      WORD        0               < CENTRE DE GRAVITE BAS.
ASPU12:  WORD        SPU12           < SORTIE SUR POINT (XR,YR) NON NOIR...
XA0:     WORD        0               < INCREMENT SUR OX,
XA1:     WORD        0               < INCREMENT SUR OY.
XA2:     WORD        0               < MODE DE CALCUL :
                                     < =0 : CENTRES DE GRAVITES DES POINTS
                                     <      NON NOIRS,
                                     < #0 : COMPTAGE DES POINTS NOIRS.
FINFIN:  FLOAT       1000
<
< DEFINITION DE LA SPIRALE :
<
SPIMOD:  WORD        0               < MODE DE PARCOURS (CF. 'A5').
SPIMIN:  WORD        0               < MIN COURANT SUR UNE SPIRALE,
CUMUL:   WORD        0               < SIGMA(NIVEAU(XS,YS)) SUR UNE SPIRALE,
SPIMAX:  WORD        0               < MAX COURANT SUR UNE SPIRALE.
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.
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
<
< TEST DU PREMIER PASSAGE :
<
         CPZ         PREM            < PREMIER PASSAGE ???
         JG          SPU50           < NON...
         IC          PREM            < OUI :
<
< ENTREE DES INCTREMENTS SUR OX ET OY :
<
         LXI         A2
         BSR         ASPCT
         BSR         AROND
         STA         XA2             < MODE DE CALCUL...
         LXI         A0
         BSR         ASPCT
         BSR         AROND
         JALE        $
         STA         XA0             < INCREMENT SUR OX,
         LXI         A1
         BSR         ASPCT
         BSR         AROND
         JALE        $
         STA         XA1             < INCREMENT SUR OY.
<
< DEFINITION DE LA SPIRALE :
<
         LXI         A3
         BSR         ASPCT
         FST         FNP
         FIX
         STA         NPM             < NOMBRE DE POINTS MAX...
         JALE        $               < ??!??!?!
         LXI         A4
         BSR         ASPCT
         BSR         AROND
         STA         PASQ            < PAS DE PARCOURS...
         LXI         A5
         BSR         ASPCT
         BSR         AROND
         STA         SPIMOD          < MODE DE PARCOURS DE LA SPIRALE...
SPU50:   EQU         $
<
< ON NE FAIT CALCULER LES CENTRES
< DE GRAVITE SUR LES POINTS NOIRS
< DE L'IMAGE RESIDENTE :
<
         BSR         ASPGPR          < (A)=NIVEAU(XR,YR) :
         JAE         SPU13           < OK, LE POINT EST NOIR...
         BR          ASPU12          < IL N'EST PAS NOIR, ON L'IGNORE...
SPU13:   EQU         $
<
< SAUVEGARDE DU POINT COURANT :
<
         LA          XR
         LB          YR
         STB         SYC
         STA         SXC
<
< TEST DE LA NECESSITE DU
< CALCUL DES CENTRES DE GRAVITE :
<
         CPZ         XA2             < MODE ???
         JNE         SPU10           < PAR COMPTAGE DES POINTS NOIRS...
         LA          YR              < PAR 'G' :
         CP          YRP             < EST-ON SUR LA MEME HORIZONTALE ???
         JNE         SPU10           < NON, CALCUL NECESSAIRE...
         LA          XR
         SB          XRP
         CPI         1               < OUI, EST-ON VOISIN DU POINT PRECEDENT ???
         JE          SPU20           < OUI, LA REPARTITION HORIZONTALE DES
                                     < MASSES N'A PAS CHANGEE, ON VA CALCULER
                                     < UNIQUEMENT SUR LA VERTICALE...
SPU10:   EQU         $
<
< RECHERCHE DE 'G' HORIZONTAL GAUCHE :
<
         LAI         -1
         STA         XR              < INITIALISATION POINT DE DEPART.
         FLD         F0
         FST         FWORK1          < INITIALISATION DU CUMUL,
         LXI         0               < INITIALISATION DU COMPTAGE DE POINTS
                                     < NON NOIRS RECONTRES JUSQU'A 'SXC'.
         LYI         0               < COMPTAGE DES NOIRS...
SPU1:    EQU         $
         LA          XR              < AU POINT SUIVANT :
         AD          XA0
         STA         XR
         CP          SXC             < EST-CE LE POINT COURANT ???
         JGE         SPU2            < OUI, FIN DE LA RECHERCHE A GAUCHE...
         BSR         ASPGPR          < NON, TEST DU POINT (XR,YR) :
         ADRI        1,Y             < A PRIORI...
         JAE         SPU1            < IL EST NOIR, ON L'IGNORE...
         ADRI        -1,Y            < CORRECTION...
         LA          XR              < IL N'EST PAS NOIR,
         FLT
         FAD         FWORK1
         FST         FWORK1          < ON LE CUMULE,
         ADRI        1,X             < ET ON LE COMPTE...
         JMP         SPU1            < VERS LE POINT SUIVANT...
SPU2:    EQU         $
         LR          Y,A             < (A)=NOMBRE DE POINTS NOIRS...
         MP          XA0
         LR          B,A             < SCALING...
         CPZ         XA2             < MODE ???
         JNE         SPU31           < COMPTAGE POINTS NOIRS...
         LAI         0               < A PRIORI... (CENTRES DE GRAVITE)
         CPZR        X               < A-T'ON RENCONTRE DES POINTS ???
         JE          SPU31           < NON, ON PREND 'SXC'...
         LR          X,A             < OUI :
         FLT
         FST         FWORK2          < NOMBRE DE POINTS NON NOIRS,
         FLD         FWORK1          < SIGMA DE LEURS ABSCISSES,
         FDV         FWORK2
         BSR         AROND
SPU31:   EQU         $
         STA         XG              < CE QUI DONNE LE 'G' HORIZONTAL GAUCHE...
<
< RECHERCHE DU 'G' HORIZONTAL DROITE :
<
         LAI         NPOLM1
         ADRI        1,A
         STA         XR              < INITIALISATION DU POINT DE DEPART.
         FLD         F0
         FST         FWORK1          < INITIALISATION DU CUMUL,
         LXI         0               < INITIALISATION DU COMPTAGE DE POINTS
                                     < NON NOIRS RENCONTRES JUSQU'A 'SXC'.
         LYI         0               < COMPTAGE DES NOIRS...
SPU3:    EQU         $
         LA          XR              < AU POINT PRECEDENT :
         SB          XA0
         STA         XR
         CP          SXC             < EST-CE LE POINT COURANT ???
         JLE         SPU4            < OUI, FIN DE LA RECHERCHE A DROITE...
         BSR         ASPGPR          < NON, TEST DU POINT (XR,YR) :
         ADRI        1,Y             < A PRIORI...
         JAE         SPU3            < IL EST NOIR, ON L'IGNORE...
         ADRI        -1,Y            < CORRECTION...
         LA          XR              < IL N'EST PAS NOIR,
         FLT
         FAD         FWORK1
         FST         FWORK1          < ON LE CUMULE,
         ADRI        1,X             < ET ON LE COMPTE...
         JMP         SPU3            < VERS LE POINT PRECEDENT...
SPU4:    EQU         $
         LR          Y,A             < (A)=COMPTE DES NOIRS...
         MP          XA0
         LR          B,A             < SCALING...
         CPZ         XA2             < MODE ???
         JNE         SPU32           < COMPTAGE DES POINTS NOIRS...
         LAI         NPOLM1          < A PRIORI... (CENTRES DE GRAVITE)
         CPZR        X               < A-T'ON RENCONTRE DES POINTS ???
         JE          SPU32           < NON, ON PREND 'SXC'...
         LR          X,A             < OUI...
         FLT
         FST         FWORK2          < NOMBRE DE POINTS NON NOIRS,
         FLD         FWORK1          < SIGMA DE LEURS ABSCISSES,
         FDV         FWORK2
         BSR         AROND
SPU32:   EQU         $
         STA         XD              < CE QUI DONNE LE 'G' HORIZONTAL DROITE...
<
< RECHERCHE DE 'G' VERTICAL HAUT :
<
         LA          SXC
         STA         XR              < RESTAURE 'XR'...
SPU20:   EQU         $               < CAS OU LES 'G' HORIZONTAUX NE SONT PAS
                                     < A CALCULER...
         LAI         -1
         STA         YR              < INITIALISATION POINT DE DEPART.
         FLD         F0
         FST         FWORK1          < INITIALISATION DU CUMUL,
         LXI         0               < INITIALISATION DU COMPTAGE DE POINTS
                                     < NON NOIRS RECONTRES JUSQU'A 'SYC'.
         LYI         0               < COMPTAGE DES POINTS NOIRS...
SPU5:    EQU         $
         LA          YR              < AU POINT SUIVANT :
         AD          XA1
         STA         YR
         CP          SYC             < EST-CE LE POINT COURANT ???
         JGE         SPU6            < OUI, FIN DE LA RECHERCHE EN HAUT...
         BSR         ASPGPR          < NON, TEST DU POINT (XR,YR) :
         ADRI        1,Y             < A PRIORI...
         JAE         SPU5            < IL EST NOIR, ON L'IGNORE...
         ADRI        -1,Y            < CORRECTION...
         LA          YR              < IL N'EST PAS NOIR,
         FLT
         FAD         FWORK1
         FST         FWORK1          < ON LE CUMULE,
         ADRI        1,X             < ET ON LE COMPTE...
         JMP         SPU5            < VERS LE POINT SUIVANT...
SPU6:    EQU         $
         LR          Y,A             < (A)=NOMBRE DE POINTS NOIRS...
         MP          XA1
         LR          B,A             < SCALING...
         CPZ         XA2             < MODE ???
         JNE         SPU33           < COMPTAGE DES POINT NOIRS...
         LAI         0               < A PRIORI... (CENTRES DE GRAVITE)
         CPZR        X               < A-T'ON RENCONTRE DES POINTS ???
         JE          SPU33           < NON, ON PREND 'SYC'...
         LR          X,A
         FLT
         FST         FWORK2          < NOMBRE DE POINTS NON NOIRS,
         FLD         FWORK1          < SIGMA DE LEURS ORDONNEES,
         FDV         FWORK2
         BSR         AROND
SPU33:   EQU         $
         STA         YG              < CE QUI DONNE LE 'G' VERTICAL HAUT...
<
< RECHERCHE DU 'G' VERTICAL BAS :
<
         LAI         NLIGM1
         ADRI        1,A
         STA         YR              < INITIALISATION DU POINT DE DEPART.
         FLD         F0
         FST         FWORK1          < INITIALISATION DU CUMUL,
         LXI         0               < INITIALISATION DU COMPTAGE DE POINTS
                                     < NON NOIRS RENCONTRES JUSQU'A 'SYC'.
         LYI         0               < COMPTAGE DES POINTS NOIRS...
SPU7:    EQU         $
         LA          YR              < AU POINT PRECEDENT :
         SB          XA1
         STA         YR
         CP          SYC             < EST-CE LE POINT COURANT ???
         JLE         SPU8            < OUI, FIN DE LA RECHERCHE EN BAS...
         BSR         ASPGPR          < NON, TEST DU POINT (XR,YR) :
         ADRI        1,Y             < A PRIORI...
         JAE         SPU7            < IL EST NOIR, ON L'IGNORE...
         ADRI        -1,Y            < CORRECTION...
         LA          YR              < IL N'EST PAS NOIR,
         FLT
         FAD         FWORK1
         FST         FWORK1          < ON LE CUMULE,
         ADRI        1,X             < ET ON LE COMPTE...
         JMP         SPU7            < VERS LE POINT PRECEDENT...
SPU8:    EQU         $
         LR          Y,A             < (A)=NOMBRE DE POINTS NOIRS...
         MP          XA1
         LR          B,A             < SCALING...
         CPZ         XA2             < MODE ???
         JNE         SPU34           < COMPTAGE DES POINTS NOIRS...
         LAI         NLIGM1          < A PRIORI... (CENTRES DE GRAVITE)
         CPZR        X               < A-T'ON RENCONTRE DES POINTS ???
         JE          SPU34           < NON, ON PREND 'SYC'...
         LR          X,A
         FLT
         FST         FWORK2          < NOMBRE DE POINTS NON NOIRS,
         FLD         FWORK1          < SIGMA DE LEURS ORDONNEES,
         FDV         FWORK2
         BSR         AROND
SPU34:   EQU         $
         STA         YD              < CE QUI DONNE LE 'G' VERTICAL BAS...
<
< RESTAURATION DU POINT COURANT :
<
         LA          SYC
         STA         YR
<
< MEMORISATION DU POINT COURANT :
<
SPU11:   EQU         $
         LA          XR
         LB          YR
         STB         YRP
         STA         XRP
<
< CALCUL DU POINT (XS,YS) :
<
         CPZ         XA2             < MODE ???
         JE          SPU60           < CENTRES DE GRAVITE...
         LA          XG              < COMPTAGE DES POINTS NOIRS :
         FLT
         FST         FWORK1          < FWORK1=XG,
         LA          XG
         AD          XD
         FLT
         FST         FWORK2          < FWORK2=XG+XD,
         JMP         SPU61
SPU60:   EQU         $               < CENTRES DE GRAVITE :
         LA          XR
         SB          XG
         FLT
         FST         FWORK1          < FWORK1=XR-XG,
         LA          XD
         SB          XR
         FLT                         < XD-XR,
         FAD         FWORK1          < (XD-XR)+(XR-XG),
         FST         FWORK2          < FWORK2=XD-XG,
SPU61:   EQU         $
         LAI         NPOLM1
         FLT
         FMP         FWORK1
         FDV         FWORK2
         BSR         AROND
         STA         XS              < XS=255*(XR-XG)/(XD-XG) SI 'G',
                                     <   =255*XG/(XG+XD) SI COMPTAGE NOIRS.
         CPZ         XA2             < MODE ???
         JE          SPU62           < CENTRES DE GRAVITE...
         LA          YG              < COMPTAGE DES POINTS NOIRS :
         FLT
         FST         FWORK1          < FWORK1=YG,
         LA          YG
         AD          YD
         FLT
         FST         FWORK2          < FWORK2=YG+YD,
         JMP         SPU63
SPU62:   EQU         $               < CENTRES DE GRAVITE :
         LA          YR
         SB          YG
         FLT
         FST         FWORK1          < FWORK1=YR-YG,
         LA          YD
         SB          YR
         FLT                         < YD-YR,
         FAD         FWORK1          < (YD-YR)+(YR-YG),
         FST         FWORK2          < FWORK2=YD-YG,
SPU63:   EQU         $
         LAI         NLIGM1
         FLT
         FMP         FWORK1
         FDV         FWORK2
         BSR         AROND
         STA         YS              < YS=255*(YR-YG)/(YD-YG) SI 'G',
                                     <   =255*YG/(YG+YD) SI COMPTAGE NOIRS.
<
<
<        G E N E R A T I O N   D ' U N E   S P I R A L E
<        A U T O U R   D E   ( X S , Y S )   D E   ' T V 2 '  :
<
<
         LA          CTCDA
         STA         XCTCDA          < PASSAGE SUR 'TV2'...
<
< INITIALISATION DE LA SPIRALE :
<
         LA          XS
         LB          YS
         PSR         A,B             < SAUVEGARDE DU POINT (XS,YS).
         LAI         NIVMAX+1
         STA         SPIMIN          < MIN(NIVEAUX)...
         STZ         CUMUL           < CUMUL <-- 0.
         LAI         -NIVMAX-1
         STA         SPIMAX          < MAX(NIVEAUX)...
         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),
         CP          SPIMIN
         JGE         SPMOY9
         STA         SPIMIN          < MEMORISATION DU NIVEAU MIN...
SPMOY9:  EQU         $
         CP          SPIMAX
         JLE         SPMOYA
         STA         SPIMAX          < MEMORISATION DE NIVEAU MAX...
SPMOYA:  EQU         $
         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),
<
< GENERATION D'UN NIVEAU :
<
         CPZ         SPIMOD          < QUEL EST LE MODE DE GENERATION ???
         LA          SPIMIN
         JL          SPU70           < PAR LE MIN(NIVEAUX)...
         LA          SPIMAX
         JG          SPU70           < PAR LE MAX(NIVEAUX)...
         LA          CUMUL           < PAR LA MOYENNE :
         FLT
         FDV         FNP
         BSR         AROND
SPU70:   EQU         $               < (A)=NIVEAU...
         STZ         XCTCDA          < RETOUR A 'TV1'...
<
< GENERATION DE L'IMAGE DISTORDUE :
<
         LB          XR
         STB         XS
         LB          YR
         STB         YS
         BSR         ASPRPS          < QUE L'ON MET EN (XR,YR) DE 'MEMTV1'...
SPU12:   EQU         $
         FLD         FINFIN          < ON NE BOUGE PAS...
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         FINFIN          < ON NE BOUGE PAS...
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT MAGRITTE 5'
DF'SIOT NEUTRE'
ED'SIOT NEUTRE'
IN0
<
         IDP         "SIOT NEUTRE"
<
<        N E U T R E  :
<
<
<        FONCTION :
<                      CE MODULE NE FAIT RIEN, CE
<                    QUI PERMET PAR EXEMPLE DE METTRE
<                    EN PERSPECTIVE UNE IMAGE PLATTE
<                    PAR CHANGEMENT DE LA MATRICE
<                    DE TRANSFORMATION...
<
<
<        ARGUMENTS :
A0::     VAL         0               < TRANSLATION EN 'X',
A1::     VAL         A0+1            < TRANSLATION EN 'Y',
A2::     VAL         A1+1            < TRANSLATION EN 'Z'.
<
<
         LOCAL
FLOC:    EQU         $
PREM:    WORD        0               < INDICATEUR DE PREMIER PASSAGE...
XFA0:    FLOAT       0
XFA1:    FLOAT       0
XFA2:    FLOAT       0
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
<
< ENTREE DES PARAMETRES :
<
         CPZ         PREM            < PREMIER PASSAGE ???
         JG          SPU1            < NON...
         IC          PREM            < OUI, ON LE MEMORISE...
         LXI         A0
         BSR         ASPCT
         FST         XFA0
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
<
< CALCUL DE LA COORDONNEE :
<
SPU1:    EQU         $
         FLD         VARU
         FAD         XFA0            < ET TRANSLATION...
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         VARV
         FAD         XFA1            < ET TRANSLATION...
         RSR
<
<
<         C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         XFA2
         RSR
:F
:F
< <<'SIOT NEUTRE'
DF'SIOT ONDES P C'
ED'SIOT ONDES P C'
IN0
         PAGE
         IDP         "SIOT ONDES P C"
<
<
<        C A L C U L   D ' U N E   O N D E   P  :
<
<
<        FONCTION :
<                      CALCULER UNE ONDE P D'EQUATION :
<                    U=COS(-X+2*PI*T),
<                    V=0,
<                    W=0.
<                      DE PLUS ON FAIT LES CONVENTIONS DE
<                    COULEUR SUIVANTES :
<                    U>0 : XXB,
<                    U=0 : XXV,
<                    U<0 : XXR.
<
<
         LOCAL
XXB::    VAL         4               < BLEU,
XXV::    VAL         4               < BLEU,
XXR::    VAL         2               < VERT.
FLOC:    EQU         $
P2PI:    FLOAT       6.283
         PROG
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
         FLD         VART
         FMP         P2PI
         FSB         VARU
         FST         FWORK
         BSR         ASIN            < CALCUL DE LA DERIVEE SIN(-X+2*PI*T),
         FCAZ                        < ???
         LAI         XXB             < BLEU A PRIORI...
         JG          SPU1            < OUI...
         LAI         XXV             < VERT A PRIORI...
         JE          SPU1            < OUI...
         LAI         XXR             < IL NE RESTE QUE LE ROUGE...
SPU1:    EQU         $
         STA         KCOUL           < MAJ MODE DE TRACE DES VECTEURS...
         BSR         ASPRPR          < ON MODIFIE L'IMAGE RESIDENTE...
         FLD         FWORK
         BSR         ACOS            < CALCUL DU DEPLACEMENT COS(-X+2*PI*T).
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         FLD         F0
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT ONDES P C'
DF'SIOT ONDES PS2'
ED'SIOT ONDES PS2'
IN0
         PAGE
         IDP         "SIOT ONDES PS2"
<
<
<        O N D E S   P S 2  :
<
<
<        FONCTION :
<                      ON CALCULE LE VECTEUR DEPLACEMENT DE
<                    COORDONNEES :
<                    U=A0000*COS(A0001*X+A0002*T),
<                    V=A0003*SIN(A0004*X+A0005*T).
<
<
<        NOTA :
<                      CE PROGRAMME S'APPELLE 'PS2',
<                    ET NON PAS 'PS1', CAR IL EXISTE
<                    DEJA UN ITEM 'ONDES PS1'...
<
<
         LOCAL
FLOC:    EQU         $
A0::     VAL         0
A1::     VAL         1
A2::     VAL         2
A3::     VAL         3
A4::     VAL         4
A5::     VAL         5
         PROG
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
         LXI         A1
         BSR         ASPCT
         FMP         VARU
         FST         FWORK
         LXI         A2
         BSR         ASPCT
         FMP         VART
         FAD         FWORK
         BSR         ACOS
         FST         FWORK
         LXI         A0
         BSR         ASPCT
         FMP         FWORK           < A0*COS(A1*X+A2*T).
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         LXI         A4
         BSR         ASPCT
         FMP         VARU
         FST         FWORK
         LXI         A5
         BSR         ASPCT
         FMP         VART
         FAD         FWORK
         BSR         ASIN
         FST         FWORK
         LXI         A3
         BSR         ASPCT
         FMP         FWORK           < A3*SIN(A4*X+A5*T).
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT ONDES PS2'
DF'SIOT ONDES S C'
ED'SIOT ONDES S C'
IN0
         PAGE
         IDP         "SIOT ONDES S C"
<
<
<        C A L C U L   D ' U N E   O N D E   S  :
<
<
<        FONCTION :
<                      CALCULER UNE ONDE P D'EQUATION :
<                    U=0,
<                    V=COS(-X+2*PI*T),
<                    W=0.
<                      DE PLUS ON FAIT LES CONVENTIONS DE
<                    COULEUR SUIVANTES :
<                    V>0 : XXB,
<                    V=0 : XXV,
<                    V<0 : XXR.
<
<
         LOCAL
XXB::    VAL         4               < BLEU,
XXV::    VAL         4               < BLEU,
XXR::    VAL         2               < VERT.
FLOC:    EQU         $
P2PI:    FLOAT       6.283
         PROG
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
         FLD         F0
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         FLD         VART
         FMP         P2PI
         FSB         VARU
         FST         FWORK
         BSR         ASIN            < CALCUL DE LA DERIVEE SIN(-X+2*PI*T),
         FCAZ                        < ???
         LAI         XXB             < BLEU A PRIORI...
         JG          SPV1            < OUI...
         LAI         XXV             < VERT A PRIORI...
         JE          SPV1            < OUI...
         LAI         XXR             < IL NE RESTE QUE LE ROUGE...
SPV1:    EQU         $
         STA         KCOUL           < MAJ MODE DE TRACE DES VECTEURS...
         BSR         ASPRPR          < ON MODIFIE L'IMAGE RESIDENTE...
         FLD         FWORK
         BSR         ACOS            < CALCUL DU DEPLACEMENT COS(-X+2*PI*T).
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT ONDES S C'
DF'SIOT POISSON'
ED'SIOT POISSON'
IN0
         PAGE
         IDP         "SIOT POISSON"
<
<
<        F O N C T I O N   " P O I S S O N "  :
<
<
<        FONCTION :
<                      ON CALCULE LA TRANSFORMATION SUIVANTE :
<                    U=X,
<                    V=Y+(A0*Y/(A1*(X**2)+1)),
<                    W=0.
<                      CELA DONNE UNE TRANSFORMATION EXAGERANT
<                    LE CENTRE DE L'IMAGE SUIVANT UNE DIRECTION
<                    VERTICALE (CF. LE 'Y' MULTIPLICATEUR DE
<                    DE 1/(X**2+1) ). CELA DONNE UNE SORTE
<                    DE BOURSOUFLURE...
<
<
<        NOTA :
<                      ON L'APPELLE AINSI, CAR ELLE SERT
<                    A FAIRE UN IMAGE DE MC. ESCHER EN
<                    FORME D'ARETES DE POISSON...
<
<
<        PARAMETRES :
A0000::  VAL         0               < COEFFICIENT DE Y,
A0001::  VAL         A0000+1         < COEFFICIENT DE X**2.
<
<
         LOCAL
FLOC:    EQU         $
XA0:     FLOAT       0
XA1:     FLOAT       0
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         FLD         VARU
         FDV         FK
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
<
< ENTREE DES PARAMETRES :
<
         LXI         A0000
         BSR         ASPCT
         FST         XA0
         LXI         A0001
         BSR         ASPCT
         FST         XA1
<
< CALCUL DU POINT :
<
         FLD         VARU
         FMP         VARU
         FDV         FK
         FDV         FK
         FMP         XA1
         FAD         F1
         FST         FWORK
         FLD         VARV
         FDV         FK
         FMP         XA0
         FDV         FWORK
         FMP         FK
         FST         FWORK
         FLD         VARV
         FDV         FK
         FAD         FWORK
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT POISSON'
DF'SIOT POLAIRE'
ED'SIOT POLAIRE'
IN0
         PAGE
         IDP         "SIOT POLAIRE"
<
<
<        T R A N S F O R M A T I O N   P O L A I R E  :
<
<
<        FONCTION :
<                      CE PROGRAMME CALCULE :
<                    U=X*COS(Y),
<                    V=X*SIN(Y),
<                    W=0,
<                      U, V ET W ETANT DES DEPLACEMENTS ABSOLUS...
<
<
         LOCAL
FLOC:    EQU         $
         PROG
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
         FLD         VARV
         BSR         ACOS
         FMP         VARU            < VARU*COS(VARV).
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         FLD         VARV
         BSR         ASIN
         FMP         VARU            < VARU*SIN(VARV).
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT POLAIRE'
DF'SIOT POLAIRE 1'
ED'SIOT POLAIRE 1'
IN0
         PAGE
         IDP         "SIOT POLAIRE 1"
<
<
<        T R A N S F O R M A T I O N   P O L A I R E   1  :
<
<
<        FONCTION :
<                      CE PROGRAMME CALCULE :
<                    U=X*COS(Y/X),
<                    V=X*SIN(Y/X),
<                    W=0,
<                      U, V ET W ETANT DES DEPLACEMENTS ABSOLUS...
<
<
         LOCAL
FLOC:    EQU         $
         PROG
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
         FLD         VARV
         FDV         VARU
         BSR         ACOS
         FMP         VARU            < VARU*COS(VARV/VARU).
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         FLD         VARV
         FDV         VARU
         BSR         ASIN
         FMP         VARU            < VARU*SIN(VARV/VARU).
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT POLAIRE 1'
DF'SIOT POLAIRE 2'
ED'SIOT POLAIRE 2'
IN0
         PAGE
         IDP         "SIOT POLAIRE 2"
<
<
<        T R A N S F O R M A T I O N   P O L A I R E   2  :
<
<
<        FONCTION :
<                      CE PROGRAMME CALCULE :
<                    U=X/RAC(1+TG(Y)**2),
<                    V=X*TG(Y)/RAC(1+TG(Y)**2),
<                    W=0,
<                      U, V ET W ETANT DES DEPLACEMENTS ABSOLUS...
<
<
<        ARGUMENT :
A0::     VAL         0               < VALEUR DE EPSILON...
<
<
         LOCAL
FLOC:    EQU         $
XF1:     FLOAT       1
XFWORK:  FLOAT       0
FEPS:    FLOAT       0               < EPSILON D'EVALUATION DE LA POSITION DE
                                     < 'VARV' PAR RAPPORT A PI/2.
ASP1:    WORD        SP1             < TEST PAR RAPPORT A PI/2 ET 3*PI/2.
ATG:     WORD        TG              < S/P DE CALCUL DE LA TANGENTE...
ZZZ116:  DZS         2
ZZZ117:  WORD        '7F7D;'FFFF     < +INFINI
ZZZ118:  WORD        '807D;'0001     < -INFINI
ZZZ106:  EQU         PISUR2
         PROG
<
<
<        C A L C U L   D E   T G  :
<
<
<        ARGUMENT :
<                    (A,B)=ARGUMENT EN RADIAN.
<
<
<        RESULTAT :
<                    (A,B)=TG(ARGUMENT).
<
<
TG:      EQU         $
         FST         FWORK
         FSB         ZZZ106
         FNEG
         BSR         ASIN
         FST         ZZZ116
         FLD         FWORK
         BSR         ASIN
         FCMZ        ZZZ116
         JE          ZZZ121
         FDV         ZZZ116
ZZZ123:  EQU         $
<
< RETOUR :
<
         PSR         A,B             < SAVE LA TANGENTE,
         FLD         FWORK
         FABS
         FCAM        PISUR2          < COMMENT EST L'ARGUMENT ???
         PLR         A,B             < RESTAURE LA TANGENTE,
         JL          TG2             < L'ARGUMENT EST ENTRE -PI/2 ET +PI/2...
         FNEG                        < DANS LES AUTRE CAS ON INVERSE POUR RENDRE
                                     < LA TANGENTE "CONTINUE"...
TG2:     EQU         $
         RSR
ZZZ121:  EQU         $
         FCAZ
         JL          ZZZ122
         FLD         ZZZ117
         JMP         ZZZ123
ZZZ122:  EQU         $
         FLD         ZZZ118
         JMP         ZZZ123
<
<
<        T E S T   P A R   R A P P O R T   A   P I / 2   E T   3 * P I / 2  :
<
<
SP1:     EQU         $
         FLD         VARV            < ARGUMENT,
         FSB         PISUR2
         FABS
         FCAM        FEPS            < TEST PAR RAPPORT A PI/2...
         JLE         SP11            < PRES...
         FLD         VARV
         DO          3
         FSB         PISUR2
         FABS
         FCAM        FEPS            < TEST PAR RAPPORT A 3*PI/2...
SP11:    EQU         $
         RSR
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
         LXI         A0
         BSR         ASPCT
         FST         FEPS            < RECUPERATION DE EPSILON...
         BSR         ASP1            < POSITION DE 'VARV' PAR RAPPORT A PI/2 :
         JG          SPU1            < LOIN...
         FLD         F0              < PRES : X=0...
         JMP         SPU2
SPU1:    EQU         $
         FLD         VARV
         BSR         ATG
         FST         FWORK
         FMP         FWORK
         FAD         XF1
         BSR         ARAC
         FST         FWORK
         FLD         VARU
         FDV         FWORK           < X/RAC(1+TG(Y)**2).
SPU2:    EQU         $
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         BSR         ASP1            < POSITION DE 'VARV' PAR RAPPORT A PI/2 :
         JG          SPV1            < LOIN...
         FLD         VARU            < PRES : Y=X...
         JMP         SPV2
SPV1:    EQU         $
         FLD         VARV
         BSR         ATG
         FST         XFWORK
         FMP         XFWORK
         FAD         XF1
         BSR         ARAC
         FST         FWORK
         FLD         VARU
         FMP         XFWORK
         FDV         FWORK           < X*TG(Y)/RAC(1+TG(Y)**2).
SPV2:    EQU         $
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT POLAIRE 2'
DF'SIOT POLAIRE 3'
ED'SIOT POLAIRE 3'
IN0
         PAGE
         IDP         "SIOT POLAIRE 3"
<
<
<        T R A N S F O R M A T I O N   P O L A I R E   3  :
<
<
<        FONCTION :
<                      CE PROGRAMME CALCULE :
<                    U=X/RAC(1+Y**2),
<                    V=X*Y/RAC(1+Y**2),
<                    W=0,
<                      U, V ET W ETANT DES DEPLACEMENTS ABSOLUS...
<
<
         LOCAL
FLOC:    EQU         $
XF1:     FLOAT       1
         PROG
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
         FLD         VARV
         FMP         VARV
         FAD         XF1
         BSR         ARAC
         FST         FWORK
         FLD         VARU
         FDV         FWORK           < X/RAC(1+Y**2).
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         FLD         VARV
         FMP         VARV
         FAD         XF1
         BSR         ARAC
         FST         FWORK
         FLD         VARU
         FMP         VARV
         FDV         FWORK           < X*Y/RAC(1+Y**2).
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT POLAIRE 3'
DF'SIOT RDN'
ED'SIOT RDN'
IN0
         PAGE
         IDP         "SIOT RDN"
<
<
<                    R D N
<        P O I N T S   A L E A T O I R E S  :
<
<
<        FONCTION :
<                      LA FONCTION DEVELOPPE DONNE UN
<                    VECTEUR DE COMPOSANTES ALEATOIRES :
<
<
<        ARGUMENT :
<                    A0000=BORNE SUPERIEURE DES NOMBRES ALEATOIRES,
<                    A0001=BORNE INFERIEURE.
A0000::  VAL         0
A0001::  VAL         1
<
<
         LOCAL
FLOC:    EQU         $
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RDN1:    WORD        5189            < CONSTANTE
RDN2:    WORD        6791            < DE CALCUL DES
RDN3::   VAL         19              < NOMBRE ALEATOIRES...
RDN4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RDN5:    WORD        4021
RDN6::   VAL         23
POINTS:  WORD        16807
ARDN:    WORD        SPRDN           < GENERATEUR DE NOMBRES ALEATOIRES.
XA0000:  WORD        0               < BORNE SUPERIEURE,
XA0001:  WORD        0               < BORNE INFERIEURE...
         PROG
<
<
<        G E N E R A T E U R   A L E A T O I R E  :
<
<
SPRDN:   EQU         $
         LXI         A0000
         BSR         ASPCT
         FIX
         STA         XA0000          < BORNE SUPERIEURE,
         LXI         A0001
         BSR         ASPCT
         FIX
         STA         XA0001          < ET BORNE INFERIEURE...
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         XR
         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         YR
         EOR         F1+1
         AD          RDN2
SPMOYF:  EQU         $
         STA         RDN4
         EOR         MCDAB
         EOR         RDN
         CP          XA0000          < ???
         JG          SPRDN1          < TROP GRAND...
         CP          XA0001          < ???
         JL          SPRDN1          < TROP PETIT...
         FLT
         RSR
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
         BSR         ARDN
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         BSR         ARDN
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         BSR         ARDN
         RSR
:F
:F
< <<'SIOT RDN'
DF'SIOT RDN 1'
ED'SIOT RDN 1'
IN0
         PAGE
         IDP         "SIOT RDN 1"
<
<
<                    R D N   1
<        ( R H O , T E T A )   A L E A T O I R E S  :
<
<
<        FONCTION :
<                      LA FONCTION DEVELOPPE DONNE UN
<                    VECTEUR DE COMPOSANTES ALEATOIRES,
<                    EN CALCULANT UN MODULE ET UN ANGLE
<                    ALEATOIRES, QUI CHACUN SONT COMPARES
<                    A DES BORNES (INF,SUP)...
<
<
<        ARGUMENTS :
<                    A0=BORNE INFERIEURE DE TETA (EN DEG90*DEGRES),
<                    A1=BORNE SUPERIEURE DE TETA (EN DEG90*DEGRES),
<                    A2=BORNE INFERIEURE DE RHO,
<                    A3=BORNE SUPERIEURE DE RHO.
<
<
A0::     VAL         0
A1::     VAL         A0+1
A2::     VAL         A1+1
A3::     VAL         A2+1
<
<
         LOCAL
FLOC:    EQU         $
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RDN1:    WORD        5189            < CONSTANTE
RDN2:    WORD        6791            < DE CALCUL DES
RDN3::   VAL         19              < NOMBRE ALEATOIRES...
RDN4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RDN5:    WORD        4021
RDN6::   VAL         23
RDN7::   VAL         3
POINTS:  WORD        16807
ARDN:    WORD        SPRDN           < GENERATEUR DE NOMBRES ALEATOIRES.
RDNT:    FLOAT       0               < ANGLE TETA ALEATOIRE,
INFT:    FLOAT       0               < BORNE INFERIEURE DE TETA,
SUPT:    FLOAT       0               < BORNE SUPERIEURE DE TETA.
RDNM:    FLOAT       0               < MODULE RHO ALEATOIRE,
INFM:    FLOAT       0               < BORNE INFERIEURE DE RHO,
SUPM:    FLOAT       0               < BORNE SUPERIEURE DE RHO.
DEG90::  VAL         90              < FACTEUR D'ECHELLE DES BORNES...
F180:    FLOAT       <180*DEG90<0<0  < 180 DEGRES=PI RADIANS...
         PROG
<
<
<        G E N E R A T E U R   A L E A T O I R E  :
<
<
SPRDN:   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         XR
         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         YR
         EOR         F1+1
         AD          RDN2
SPMOYF:  EQU         $
         STA         RDN4
         EOR         MCDAB
         EOR         RDN
         FLT
         RSR
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
         LXI         A0
         BSR         ASPCT
         FST         INFT
         LXI         A1
         BSR         ASPCT
         FST         SUPT
         LXI         A2
         BSR         ASPCT
         FST         INFM
         LXI         A3
         BSR         ASPCT
         FST         SUPM
<
< MODULE ALEATOIRE :
<
SPU1:    EQU         $
         BSR         ARDN            < GENERATION D'UN NOMBRE ALEATOIRE :
         FCAM        INFM
         JL          SPU11           < IL NE SATISFAIT PAS AUX CONTRAINTES...
         FCAM        SUPM
         JG          SPU11           < IDEM...
         FST         RDNM            < OK, VOICI LE RHO ALEATOIRE...
<
< ANGLE ALEATOIRE :
<
SPU2:    EQU         $
         BSR         ARDN            < GENERATION D'UN NOMBRE ALEATOIRE :
         FCAM        INFT
         JL          SPU21           < IL NE SATISFAIT PAS AUX CONTRAINTES...
         FCAM        SUPT
         JG          SPU21           < IDEM...
         FMP         PI3141
         FDV         F180            < CONVERSION EN RADIANS,
         FST         RDNT            < OK, VOICI LE TETA ALEATOIRE...
<
< CALCUL DU VECTEUR ALEATOIRE :
<
         BSR         ACOS
         FMP         RDNM            < U=RHO*COS(TETA).
         RSR
<
< NON SATISFACTION AUX CONTRAINTES :
< ON MODIFIE LE GENERATEUR, AFIN
< D'EVITER DES BOUCLAGES...
<
SPU11:   EQU         $
         LA          RDN
         LB          RDN4
         SCRD        RDN7
         STB         RDN4
         STA         RDN
         JMP         SPU1
SPU21:   EQU         $
         LA          RDN
         LB          RDN4
         SCLD        RDN7
         STB         RDN4
         STA         RDN
         JMP         SPU2
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         FLD         RDNT
         BSR         ASIN
         FMP         RDNM            < V=RHO*SIN(TETA).
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT RDN 1'
DF'SIOT RDN 2'
ED'SIOT RDN 2'
IN0
         PAGE
         IDP         "SIOT RDN 2"
<
<
<                    R D N   2
<        ( R H O , T E T A )   A L E A T O I R E S  :
<
<
<        FONCTION :
<                      LA FONCTION DEVELOPPE DONNE UN
<                    VECTEUR DE COMPOSANTES ALEATOIRES,
<                    EN CALCULANT UN MODULE ET UN ANGLE
<                    ALEATOIRES, QUI CHACUN SONT COMPARES
<                    A DES BORNES (INF,SUP)...
<                      LORSQU'ON A OBTENU UN DEPLACEMENT 'D',
<                    ON L'APPLIQUE AU POINT (XR,YR) INDEPENDAM-
<                    MENT DE LA MATRICE DE TRANSFORMATION (???!),
<                    ET ON REGARDE OU EST LE POINT :
<                    (XS,XS) <-- (XR,YR)+FK*'D',
<                    S'IL SORT DE L'ECRAN, ON LE RAMENE AU BORD
<                    DE CELUI-CI, ET S'IL TOMBE SUR UN POINT
<                    DEJA OCCUPE, ON REFAIT UN TIRAGE ALEATOIRE...
<
<
<        ARGUMENTS :
<                    A0=BORNE INFERIEURE DE TETA (EN DEG90*DEGRES),
<                    A1=BORNE SUPERIEURE DE TETA (EN DEG90*DEGRES),
<                    A2=BORNE INFERIEURE DE RHO,
<                    A3=BORNE SUPERIEURE DE RHO.
<
<
A0::     VAL         0
A1::     VAL         A0+1
A2::     VAL         A1+1
A3::     VAL         A2+1
<
<
         LOCAL
FLOC:    EQU         $
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RDN1:    WORD        5189            < CONSTANTE
RDN2:    WORD        6791            < DE CALCUL DES
RDN3::   VAL         19              < NOMBRE ALEATOIRES...
RDN4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RDN5:    WORD        4021
RDN6::   VAL         23
RDN7::   VAL         3
POINTS:  WORD        16807
ARDN:    WORD        SPRDN           < GENERATEUR DE NOMBRES ALEATOIRES.
RDNT:    FLOAT       0               < ANGLE TETA ALEATOIRE,
INFT:    FLOAT       0               < BORNE INFERIEURE DE TETA,
SUPT:    FLOAT       0               < BORNE SUPERIEURE DE TETA.
RDNM:    FLOAT       0               < MODULE RHO ALEATOIRE,
INFM:    FLOAT       0               < BORNE INFERIEURE DE RHO,
SUPM:    FLOAT       0               < BORNE SUPERIEURE DE RHO.
DEG90::  VAL         90              < FACTEUR D'ECHELLE DES BORNES...
F180:    FLOAT       <180*DEG90<0<0  < 180 DEGRES=PI RADIANS...
         PROG
<
<
<        G E N E R A T E U R   A L E A T O I R E  :
<
<
SPRDN:   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         XR
         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         YR
         EOR         F1+1
         AD          RDN2
SPMOYF:  EQU         $
         STA         RDN4
         EOR         MCDAB
         EOR         RDN
         FLT
         RSR
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
         LXI         A0
         BSR         ASPCT
         FST         INFT
         LXI         A1
         BSR         ASPCT
         FST         SUPT
         LXI         A2
         BSR         ASPCT
         FST         INFM
         LXI         A3
         BSR         ASPCT
         FST         SUPM
<
< MODULE ALEATOIRE :
<
SPU1:    EQU         $
         BSR         ARDN            < GENERATION D'UN NOMBRE ALEATOIRE :
         FCAM        INFM
         JL          SPU11           < IL NE SATISFAIT PAS AUX CONTRAINTES...
         FCAM        SUPM
         JG          SPU11           < IDEM...
         FST         RDNM            < OK, VOICI LE RHO ALEATOIRE...
<
< ANGLE ALEATOIRE :
<
SPU2:    EQU         $
         BSR         ARDN            < GENERATION D'UN NOMBRE ALEATOIRE :
         FCAM        INFT
         JL          SPU21           < IL NE SATISFAIT PAS AUX CONTRAINTES...
         FCAM        SUPT
         JG          SPU21           < IDEM...
         FMP         PI3141
         FDV         F180            < CONVERSION EN RADIANS,
         FST         RDNT            < OK, VOICI LE TETA ALEATOIRE...
<
< CALCUL DU VECTEUR ALEATOIRE :
<
         BSR         ACOS
         FMP         RDNM            < U=RHO*COS(TETA).
         FMP         FK
         FAD         FXR
         BSR         AROND
         AD          TRX
         JAGE        SPU3            < OK...
         LAI         0               < HORS-ECRAN...
SPU3:    EQU         $
         CPI         NPOLM1
         JLE         SPU31           < OK...
         LAI         NPOLM1          < HORS-ECRAN...
SPU31:   EQU         $
         STA         XS              < XS=XR+FK*VECU.
         FLD         RDNT            < ACCES AU TETA ALEATOIRE :
         BSR         ASIN
         FMP         RDNM            < V=RHO*SIN(TETA) (PROVISOIRE...).
         FMP         FK
         FAD         FYR
         BSR         AROND
         AD          TRY
         JAGE        SPU32           < OK...
         LAI         0               < HORS-ECRAN...
SPU32:   EQU         $
         CPI         NLIGM1
         JLE         SPU33           < OK...
         LAI         NLIGM1          < HORS-ECRAN...
SPU33:   EQU         $
         STA         YS              < YS=YR+FK*VECV.
         BSR         ASPGPS          < A=NIVEAU(XS,YS) :
         JAE         SPU5            < OK, LE POINT (XS,YS) EST LIBRE...
         FLD         F0              < ET BIEN NON, IL EST OCCUPE,
         FST         VECV            < ON NE DEPLACE PAS LE POINT (XR,YR).
         JMP         SPU51
SPU5:    EQU         $
         LA          YS
         SB          TRY
         FLT
         FSB         FYR
         FDV         FK
         FST         VECV            < COMPOSANTE 'V' ALEATOIRE FINALE...
         LA          XS
         SB          TRX
         FLT
         FSB         FYR
         FDV         FK              < COMPOSANTE 'U' ALEATOIRE FINALE...
SPU51:   EQU         $
         RSR
<
< NON SATISFACTION AUX CONTRAINTES :
< ON MODIFIE LE GENERATEUR, AFIN
< D'EVITER DES BOUCLAGES...
<
SPU11:   EQU         $
         LA          RDN
         LB          RDN4
         SCRD        RDN7
         STB         RDN4
         STA         RDN
         JMP         SPU1
SPU21:   EQU         $
         LA          RDN
         LB          RDN4
         SCLD        RDN7
         STB         RDN4
         STA         RDN
         JMP         SPU2
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         FLD         VECV
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT RDN 2'
DF'SIOT RDN 3'
ED'SIOT RDN 3'
IN0
         PAGE
         IDP         "SIOT RDN 3"
<
<
<                    R D N   3  :
<        P O I N T S   A L E A T O I R E S  :
<
<
<        FONCTION :
<                      LA FONCTION DEVELOPPE DONNE UN
<                    VECTEUR DE COMPOSANTES ALEATOIRES ;
<                    IL RENORMALISE A PRIORI LES COMPO-
<                    SANTES ALEATOIRES DANS LE SEGMENT
<                    (INF,SUP).
<
<
<        ARGUMENT :
<                    A0000=BORNE SUPERIEURE DE RDN(U),
<                    A0001=BORNE INFERIEURE DE RDN(U),
<                    A0002=MULTIPLICATEUR DU DEPLACEMENT EN 'U',
<                    A0003=SUP(RDN(V)),
<                    A0004=INF(RDN(V)),
<                    A0005=MUL(RDN(V)),
<                    A0006=SUP(RDN(W)),
<                    A0007=INF(RDN(W)),
<                    A0008=MUL(RDN(W)).
A0000::  VAL         0
A0001::  VAL         A0000+1
A0002::  VAL         A0001+1
A0003::  VAL         A0002+1
A0004::  VAL         A0003+1
A0005::  VAL         A0004+1
A0006::  VAL         A0005+1
A0007::  VAL         A0006+1
A0008::  VAL         A0007+1
<
<
         LOCAL
FLOC:    EQU         $
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RDN1:    WORD        5189            < CONSTANTE
RDN2:    WORD        6791            < DE CALCUL DES
RDN3::   VAL         19              < NOMBRE ALEATOIRES...
RDN4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RDN5:    WORD        4021
RDN6::   VAL         23
POINTS:  WORD        16807
ARDN:    WORD        SPRDN           < GENERATEUR DE NOMBRES ALEATOIRES.
XA0000:  WORD        0               < BORNE SUPERIEURE,
XA0001:  WORD        0               < BORNE INFERIEURE...
FMUL:    FLOAT       0               < MULTIPLICATEUR...
INFINI:  FLOAT       32768
INFIN2:  FLOAT       16384           < INFINI/2...
FWORK4:  FLOAT       0
FWORK5:  FLOAT       0
         PROG
<
<
<        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         XR
         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         YR
         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         INFINI          < MISE A L'ECHELLE...
         FIX
         CP          XA0000          < ???
         JG          SPRDN3          < ERREUR...
         CP          XA0001          < ???
         JL          SPRDN3          < ERREUR...
         FLT
         FMP         FMUL
         RSR
SPRDN3:  EQU         $
         QUIT        1
         JMP         SPRDN2
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
         LXI         A0000
         BSR         ASPCT
         FIX
         STA         XA0000          < BORNE SUPERIEURE,
         LXI         A0001
         BSR         ASPCT
         FIX
         STA         XA0001          < ET BORNE INFERIEURE...
         LXI         A0002
         BSR         ASPCT
         FST         FMUL
         BSR         ARDN
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         LXI         A0003
         BSR         ASPCT
         FIX
         STA         XA0000          < BORNE SUPERIEURE,
         LXI         A0004
         BSR         ASPCT
         FIX
         STA         XA0001          < ET BORNE INFERIEURE...
         LXI         A0005
         BSR         ASPCT
         FST         FMUL
         BSR         ARDN
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         LXI         A0006
         BSR         ASPCT
         FIX
         STA         XA0000          < BORNE SUPERIEURE,
         LXI         A0007
         BSR         ASPCT
         FIX
         STA         XA0001          < ET BORNE INFERIEURE...
         LXI         A0008
         BSR         ASPCT
         FST         FMUL
         BSR         ARDN
         RSR
:F
:F
< <<'SIOT RDN 3'
DF'SIOT RDN 4'
ED'SIOT RDN 4'
IN0
         PAGE
         IDP         "SIOT RDN 4"
<
<
<                    R D N   4  :
<        P O I N T S   A L E A T O I R E S  :
<                    ( T 4 )
<
<
<        FONCTION :
<                      LA FONCTION DEVELOPPE DONNE UN
<                    VECTEUR DE COMPOSANTES ALEATOIRES ;
<                    IL RENORMALISE A PRIORI LES COMPO-
<                    SANTES ALEATOIRES DANS LE SEGMENT
<                    (INF,SUP) QUI EST EN FAIT RECALCULER
<                    POUR CHAQUE POINT :
<                    INF=KI-ABS(COORDONNEE),
<                    SUP=KS-ABS(COORDONNEE),
<                    AVEC : KS>KU...
<
<
<        ARGUMENT :
<                    A0000=KS(RDN(U)),
<                    A0001=KI(RDN(U)),
<                    A0002=MULTIPLICATEUR DU DEPLACEMENT EN 'U',
<                    A0003=KS(RDN(V)),
<                    A0004=KI(RDN(V)),
<                    A0005=MUL(RDN(V)),
<                    A0006=KS(RDN(W)),
<                    A0007=KI(RDN(W)),
<                    A0008=MUL(RDN(W)).
A0000::  VAL         0
A0001::  VAL         A0000+1
A0002::  VAL         A0001+1
A0003::  VAL         A0002+1
A0004::  VAL         A0003+1
A0005::  VAL         A0004+1
A0006::  VAL         A0005+1
A0007::  VAL         A0006+1
A0008::  VAL         A0007+1
<
<
         LOCAL
FLOC:    EQU         $
ASP1:    WORD        SP1
ASP2:    WORD        SP2
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RDN1:    WORD        5189            < CONSTANTE
RDN2:    WORD        6791            < DE CALCUL DES
RDN3::   VAL         19              < NOMBRE ALEATOIRES...
RDN4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RDN5:    WORD        4021
RDN6::   VAL         23
POINTS:  WORD        16807
ARDN:    WORD        SQRDN           < GENERATEUR DE NOMBRES ALEATOIRES.
XA0000:  WORD        0               < BORNE SUPERIEURE,
XA0001:  WORD        0               < BORNE INFERIEURE...
FMUL:    FLOAT       0               < MULTIPLICATEUR...
INFINI:  FLOAT       32768
INFIN2:  FLOAT       16384           < INFINI/2...
FWORK4:  FLOAT       0
FWORK5:  FLOAT       0
         PROG
<
<
<        S / P   D E   C A L C U L   D E S   S E U I L S  :
<
<
<        ARGUMENT :
<                    X=NUMERO DE LA CONSTANTE A RECUPERER,
<
<
<        RESULTAT :
<                    A=SEUIL.
<
<
SP1:     EQU         $
         BSR         ASPCT           < RECUPERATION DE LA CONSTANTE (X),
         FAD         FWORK           < +(-ABS(COORDONNEE)),
         FIX
         JAGE        SP11
         LAI         0               < NEGATIF, ON TRONQUE...
SP11:    EQU         $
         RSR
<
<
<        A C C E S   C O O R D O N N E E  :
<
<
SP2:     EQU         $
         FABS
         FNEG
         FST         FWORK
         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         XR
         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         YR
         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         INFINI          < MISE A L'ECHELLE...
         FIX
         CP          XA0000          < ???
         JG          SPRDN3          < ERREUR...
         CP          XA0001          < ???
         JL          SPRDN3          < ERREUR...
         FLT
         FMP         FMUL
         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         $
         FLT                         < FLOTTAISON DU DISCRIMINATEUR DE VARU,
                                     < VARV ET VARW...
         FAD         VARU
         FAD         VARV
         FAD         VARW            < DISCRIMINATEUR+VARU+VARV+VARW,
         FST         FWORK4
         FLD         VARU
         FMP         VARV
         FAD         FWORK4
         BSR         ASIN            < DONT ON PREND LE SINUS...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
         JMP         SPRDN2          < QUE L'ON CONSIDERE ENTIER...
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
         FLD         VARV
         BSR         ASP2            < -ABS(VARV).
         LXI         A0000
         BSR         ASP1            < CALCUL DU SEUIL...
         STA         XA0000          < BORNE SUPERIEURE,
         LXI         A0001
         BSR         ASP1            < CALCUL DU SEUIL...
         STA         XA0001          < ET BORNE INFERIEURE...
         LXI         A0002
         BSR         ASPCT
         FST         FMUL
         LA          RDN1            < (A)=DISCRIMINATEUR DE 'VARU'...
         BSR         ARDN
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         FLD         VARU
         BSR         ASP2            < -ABS(VARU).
         LXI         A0003
         BSR         ASP1            < CALCUL DU SEUIL...
         STA         XA0000          < BORNE SUPERIEURE,
         LXI         A0004
         BSR         ASP1            < CALCUL DU SEUIL...
         STA         XA0001          < ET BORNE INFERIEURE...
         LXI         A0005
         BSR         ASPCT
         FST         FMUL
         LA          RDN2            < (A)=DISCRIMINATEUR DE 'VARV'...
         BSR         ARDN
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         FLD         VARW
         BSR         ASP2            < -ABS(VARW).
         LXI         A0006
         BSR         ASP1            < CALCUL DU SEUIL...
         STA         XA0000          < BORNE SUPERIEURE,
         LXI         A0007
         BSR         ASP1            < CALCUL DU SEUIL...
         STA         XA0001          < ET BORNE INFERIEURE...
         LXI         A0008
         BSR         ASPCT
         FST         FMUL
         LA          RDN4            < (A)=DISCRIMINATEUR DE 'VARW'...
         BSR         ARDN
         RSR
:F
:F
< <<'SIOT RDN 4'
DF'SIOT RDN 5'
ED'SIOT RDN 5'
IN0
         PAGE
         IDP         "SIOT RDN 5"
<
<
<                    R D N   5  :
<        P O I N T S   A L E A T O I R E S  :
<                    ( T 6 )
<
<
<        FONCTION :
<                      LA FONCTION DEVELOPPE DONNE UN
<                    VECTEUR DE COMPOSANTES ALEATOIRES ;
<                    IL RENORMALISE A PRIORI LES COMPO-
<                    SANTES ALEATOIRES DANS LE SEGMENT
<                    (INF,SUP) QUI EST EN FAIT RECALCULER
<                    POUR CHAQUE POINT :
<                    INF=KI-ABS(COORDONNEE),
<                    SUP=KS-ABS(COORDONNEE),
<                    AVEC : KS>KU...
<                      DE PLUS IL EST ADAPTE A 'T6',
<                    CAR IL REDONNE TOUJOURS LES
<                    MEMES NOMBRE ALEATOIRES POUR
<                    UN TRIPLET (VARU,VARV,VARW)
<                    DONNE...
<
<
<        ARGUMENT :
<                    A0000=KS(RDN(U)),
<                    A0001=KI(RDN(U)),
<                    A0002=MULTIPLICATEUR DU DEPLACEMENT EN 'U',
<                    A0003=KS(RDN(V)),
<                    A0004=KI(RDN(V)),
<                    A0005=MUL(RDN(V)),
<                    A0006=KS(RDN(W)),
<                    A0007=KI(RDN(W)),
<                    A0008=MUL(RDN(W)).
A0000::  VAL         0
A0001::  VAL         A0000+1
A0002::  VAL         A0001+1
A0003::  VAL         A0002+1
A0004::  VAL         A0003+1
A0005::  VAL         A0004+1
A0006::  VAL         A0005+1
A0007::  VAL         A0006+1
A0008::  VAL         A0007+1
<
<
         LOCAL
FLOC:    EQU         $
ASP1:    WORD        SP1
ASP2:    WORD        SP2
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RDN1:    WORD        5189            < CONSTANTE
RDN2:    WORD        6791            < DE CALCUL DES
RDN3::   VAL         19              < NOMBRE ALEATOIRES...
RDN4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RDN5:    WORD        4021
RDN6::   VAL         23
POINTS:  WORD        16807
ARDN:    WORD        SQRDN           < GENERATEUR DE NOMBRES ALEATOIRES.
XA0000:  WORD        0               < BORNE SUPERIEURE,
XA0001:  WORD        0               < BORNE INFERIEURE...
FMUL:    FLOAT       0               < MULTIPLICATEUR...
INFINI:  FLOAT       32768
INFIN2:  FLOAT       16384           < INFINI/2...
FWORK4:  FLOAT       0
FWORK5:  FLOAT       0
         PROG
<
<
<        S / P   D E   C A L C U L   D E S   S E U I L S  :
<
<
<        ARGUMENT :
<                    X=NUMERO DE LA CONSTANTE A RECUPERER,
<
<
<        RESULTAT :
<                    A=SEUIL.
<
<
SP1:     EQU         $
         BSR         ASPCT           < RECUPERATION DE LA CONSTANTE (X),
         FAD         FWORK           < +(-ABS(COORDONNEE)),
         FIX
         JAGE        SP11
         LAI         0               < NEGATIF, ON TRONQUE...
SP11:    EQU         $
         RSR
<
<
<        A C C E S   C O O R D O N N E E  :
<
<
SP2:     EQU         $
         FABS
         FNEG
         FST         FWORK
         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         XR
         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         YR
         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         INFINI          < MISE A L'ECHELLE...
         FIX
         CP          XA0000          < ???
         JG          SPRDN3          < ERREUR...
         CP          XA0001          < ???
         JL          SPRDN3          < ERREUR...
         FLT
         FMP         FMUL
         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         $
         FLT                         < FLOTTAISON DU DISCRIMINATEUR DE VARU,
                                     < VARV ET VARW...
         FAD         VARU
         FAD         VARV
         FAD         VARW            < DISCRIMINATEUR+VARU+VARV+VARW,
         FST         FWORK4
         FLD         VARU
         FMP         VARV
         FAD         FWORK4
         BSR         ASIN            < DONT ON PREND LE SINUS...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
         JMP         SPRDN2          < QUE L'ON CONSIDERE ENTIER...
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
         FLD         VARV
         BSR         ASP2            < -ABS(VARV).
         LXI         A0000
         BSR         ASP1            < CALCUL DU SEUIL...
         STA         XA0000          < BORNE SUPERIEURE,
         LXI         A0001
         BSR         ASP1            < CALCUL DU SEUIL...
         STA         XA0001          < ET BORNE INFERIEURE...
         LXI         A0002
         BSR         ASPCT
         FST         FMUL
         LA          RDN1            < (A)=DISCRIMINATEUR DE 'VARU'...
         BSR         ARDN
         FAD         VARU
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         FLD         VARU
         BSR         ASP2            < -ABS(VARU).
         LXI         A0003
         BSR         ASP1            < CALCUL DU SEUIL...
         STA         XA0000          < BORNE SUPERIEURE,
         LXI         A0004
         BSR         ASP1            < CALCUL DU SEUIL...
         STA         XA0001          < ET BORNE INFERIEURE...
         LXI         A0005
         BSR         ASPCT
         FST         FMUL
         LA          RDN2            < (A)=DISCRIMINATEUR DE 'VARV'...
         BSR         ARDN
         FAD         VARV
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         FLD         VARW
         BSR         ASP2            < -ABS(VARW).
         LXI         A0006
         BSR         ASP1            < CALCUL DU SEUIL...
         STA         XA0000          < BORNE SUPERIEURE,
         LXI         A0007
         BSR         ASP1            < CALCUL DU SEUIL...
         STA         XA0001          < ET BORNE INFERIEURE...
         LXI         A0008
         BSR         ASPCT
         FST         FMUL
         LA          RDN4            < (A)=DISCRIMINATEUR DE 'VARW'...
         BSR         ARDN
         FAD         VARW
         RSR
:F
:F
< <<'SIOT RDN 5'
DF'SIOT RDN 6'
ED'SIOT RDN 6'
IN0
         PAGE
         IDP         "SIOT RDN 6"
<
<
<                    R D N   6  :
<        P O I N T S   A L E A T O I R E S  :
<                    ( T 6 )
<
<
<        FONCTION :
<                      LA FONCTION DEVELOPPE DONNE UN
<                    VECTEUR DE COMPOSANTES ALEATOIRES ;
<                    IL RENORMALISE A PRIORI LES COMPO-
<                    SANTES ALEATOIRES DANS LE SEGMENT
<                    (INF,SUP).
<                      CE GENERATEUR DONNE POUR CHAQUE
<                    TRIPLET (VARU,VARV,VARW) UN
<                    VECTEUR ALEATOIRE FONCTION UNIQUEMENT
<                    DU POINT COURANT...
<
<
<        ARGUMENT :
<                    A0000=BORNE SUPERIEURE DE RDN(U),
<                    A0001=BORNE INFERIEURE DE RDN(U),
<                    A0002=MULTIPLICATEUR DU DEPLACEMENT EN 'U',
<                    A0003=SUP(RDN(V)),
<                    A0004=INF(RDN(V)),
<                    A0005=MUL(RDN(V)),
<                    A0006=SUP(RDN(W)),
<                    A0007=INF(RDN(W)),
<                    A0008=MUL(RDN(W)).
A0000::  VAL         0
A0001::  VAL         A0000+1
A0002::  VAL         A0001+1
A0003::  VAL         A0002+1
A0004::  VAL         A0003+1
A0005::  VAL         A0004+1
A0006::  VAL         A0005+1
A0007::  VAL         A0006+1
A0008::  VAL         A0007+1
<
<
         LOCAL
FLOC:    EQU         $
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RDN1:    WORD        5189            < CONSTANTE
RDN2:    WORD        6791            < DE CALCUL DES
RDN3::   VAL         19              < NOMBRE ALEATOIRES...
RDN4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RDN5:    WORD        4021
RDN6::   VAL         23
POINTS:  WORD        16807
ARDN:    WORD        SQRDN           < GENERATEUR DE NOMBRES ALEATOIRES.
XA0000:  WORD        0               < BORNE SUPERIEURE,
XA0001:  WORD        0               < BORNE INFERIEURE...
FMUL:    FLOAT       0               < MULTIPLICATEUR...
INFINI:  FLOAT       32768
INFIN2:  FLOAT       16384           < INFINI/2...
FWORK4:  FLOAT       0
FWORK5:  FLOAT       0
         PROG
<
<
<        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         XR
         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         YR
         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         INFINI          < MISE A L'ECHELLE...
         FIX
         CP          XA0000          < ???
         JG          SPRDN3          < ERREUR...
         CP          XA0001          < ???
         JL          SPRDN3          < ERREUR...
         FLT
         FMP         FMUL
         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         $
         FLT                         < FLOTTAISON DU DISCRIMINATEUR DE VARU,
                                     < VARV ET VARW...
         FAD         VARU
         FAD         VARV
         FAD         VARW            < DISCRIMINATEUR+VARU+VARV+VARW,
         FST         FWORK4
         FLD         VARU
         FMP         VARV
         FAD         FWORK4
         BSR         ASIN            < DONT ON PREND LE SINUS...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
         JMP         SPRDN2          < QUE L'ON CONSIDERE ENTIER...
<
<
<        C O M P O S A N T E   ' U '  :
<
<
SPU:     EQU         $
         LXI         A0000
         BSR         ASPCT
         FIX
         STA         XA0000          < BORNE SUPERIEURE,
         LXI         A0001
         BSR         ASPCT
         FIX
         STA         XA0001          < ET BORNE INFERIEURE...
         LXI         A0002
         BSR         ASPCT
         FST         FMUL
         LA          RDN1
         BSR         ARDN
         FAD         VARU
         RSR
<
<
<        C O M P O S A N T E   ' V '  :
<
<
SPV:     EQU         $
         LXI         A0003
         BSR         ASPCT
         FIX
         STA         XA0000          < BORNE SUPERIEURE,
         LXI         A0004
         BSR         ASPCT
         FIX
         STA         XA0001          < ET BORNE INFERIEURE...
         LXI         A0005
         BSR         ASPCT
         FST         FMUL
         LA          RDN2
         BSR         ARDN
         FAD         VARV
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         LXI         A0006
         BSR         ASPCT
         FIX
         STA         XA0000          < BORNE SUPERIEURE,
         LXI         A0007
         BSR         ASPCT
         FIX
         STA         XA0001          < ET BORNE INFERIEURE...
         LXI         A0008
         BSR         ASPCT
         FST         FMUL
         LA          RDN4
         BSR         ARDN
         FAD         VARW
         RSR
:F
:F
< <<'SIOT RDN 6'
DF'SIOT ROTATION OX'
ED'SIOT ROTATION OX'
IN0
         PAGE
         IDP         "SIOT ROTATION OX"
<
<
<        R O T A T I O N   A U T O U R   D E   L ' A X E   O X  :
<
<
<        FONCTION :
<                      CE MODULE PERMET DE FAIRE
<                    TOURNER L'IMAGE AUTOUR DE
<                    L'AXE OX D'UN ANGLE QUELCONQUE :
<                                    X=U,
<                                    Y=V*COS(TETA),
<                                    Z=V*SIN(TETA).
<
<
<        PARAMETRE :
A0::     VAL         0               < ANGLE DE LA ROTATION 'TETA' EN RADIAN;
<
<
         LOCAL
FLOC:    EQU         $
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         FLD         VARU            < X=U...
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         LXI         A0
         BSR         ASPCT           < TETA,
         BSR         ACOS            < COS(TETA),
         FMP         VARV            < Y=V*COS(TETA).
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         LXI         A0
         BSR         ASPCT           < TETA,
         BSR         ASIN            < SIN(TETA),
         FMP         VARV            < Z=V*SIN(TETA).
         RSR
:F
:F
< <<'SIOT ROTATION OX'
DF'SIOT TOURBILLONS 1'
ED'SIOT TOURBILLONS 1'
IN0
         PAGE
         IDP         "SIOT TOURBILLONS 1"
<
<
<        T O U R B I L L O N S   1  :
<
<
<        MODELE :
<                      ON CONSIDERE LA FONCTION : D=R/(R**2+1),
<                    SA COURBE REPRESENTATIVE EST UNE FONCTION
<                    DU TROISIEME DEGRE AVEC UN MINIMA (-1,-1/2),
<                    UN MAXIMA (+1,+1/2) ET 3 POINTS D'INFLEXION.
<                      ON CONSIDERE ENSUITE LE RAYON POLAIRE
<                    EN CHAQUE POINT (X,Y) ; ON PASSE DONC EN
<                    COORDONNEES POLAIRES (X,Y) <--> (RHO,TETA).
<                    LE 'R' PRECEDENT DEVIENT LE 'RHO', ET LE 'D'
<                    DEFINIT UN VECTEUR DEPLACEMENT DU POINT (X,Y)
<                    ORTHOGONAL AU RAYON POLAIRE 'RHO' ; CE VECTEUR
<                    DEPLACEMENT A POUR COORDONNEES :
<                                    U=-Y/(RHO**2+1),
<                                    V=+X/(RHO**2+1),
<                                    W=0,
<
<
         LOCAL
FLOC:    EQU         $
RHO2P1:  FLOAT       0
ASPRHO:  WORD        SPRHO           < CALCUL DU RAYON POLAIRE.
         PROG
<
<
<        C A L C U L   D E   R H O * * 2 + 1  :
<
<
SPRHO:   EQU         $
         FLD         VARU
         FMP         VARU
         FST         FWORK
         FLD         VARV
         FMP         VARV
         FAD         FWORK
         FAD         F1
         FST         RHO2P1          < RHO2P1=VARU**2+VARV**2+1.
         RSR
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         BSR         ASPRHO
         FLD         VARV
         FNEG
         FDV         RHO2P1          < -VARV/RHO2P1.
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         BSR         ASPRHO
         FLD         VARU
         FDV         RHO2P1          < VARV/RHO2P1.
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT TOURBILLONS 1'
DF'SIOT TOURBILLONS 2'
ED'SIOT TOURBILLONS 2'
IN0
         PAGE
         IDP         "SIOT TOURBILLONS 2"
<
<
<        T O U R B I L L O N S   2  :
<
<
<        MODELE :
<                      ON CONSIDERE LA FONCTION : D=R/(R**2+1),
<                    SA COURBE REPRESENTATIVE EST UNE FONCTION
<                    DU TROISIEME DEGRE AVEC UN MINIMA (-1,-1/2),
<                    UN MAXIMA (+1,+1/2) ET 3 POINTS D'INFLEXION.
<                      ON CONSIDERE ENSUITE LE RAYON POLAIRE
<                    EN CHAQUE POINT (X,Y) ; ON PASSE DONC EN
<                    COORDONNEES POLAIRES (X,Y) <--> (RHO,TETA).
<                    LE 'R' PRECEDENT DEVIENT LE 'RHO', ET LE 'D'
<                    DEFINIT UN VECTEUR DEPLACEMENT DU POINT (X,Y)
<                    ORTHOGONAL AU RAYON POLAIRE 'RHO' ; CE VECTEUR
<                    DEPLACEMENT A POUR COORDONNEES :
<                                    U=-Y/(RHO**2+1),
<                                    V=+X/(RHO**2+1),
<                                    W=0,
<        NOTA :
<                    SI A0000=0 : ON INITIALISE LE Z-BUFFER AVEC LES COORDON-
<                                 FLOTTANTES DES POINTS DE L'IMAGE,
<                    SI A0000=1 : ON ITERE LA TRANSFORMATION TOURBILLONNAIRE
<                                 A PARTIR DES COORDONNEES STOCKEES DANS
<                                 LE Z-BUFFER.
<
<
         LOCAL
FLOC:    EQU         $
RHO2P1:  FLOAT       0
ASPRHO:  WORD        SPRHO           < CALCUL DU RAYON POLAIRE.
ASP1:    WORD        SP1             < RANGEMENT DANS LE Z-BUFFER,
ASP2:    WORD        SP2             < ACCES A UN MOT DU Z-BUFFER.
ASP3:    WORD        SP3             < ACCES A 4-MOTS DU Z-BUFFER.
NPTS:    WORD        0               < NOMBRE DE POINTS DANS L'IMAGE DE BASE.
XNPTS:   WORD        0               < NOMBRE COURANT DE POINTS TRAITES LORS
                                     < D'UNE ITERATION.
XAD1:    WORD        0               < ADRESSE COURANTE DE RANGEMENT,
XAD2:    WORD        0               < ADRESSE COURANTE D'ACCES.
         PROG
<
<
<        C A L C U L   D E   R H O * * 2 + 1  :
<
<
SPRHO:   EQU         $
         FLD         VARU
         FMP         VARU
         FST         FWORK
         FLD         VARV
         FMP         VARV
         FAD         FWORK
         FAD         F1
         FST         RHO2P1          < RHO2P1=VARU**2+VARV**2+1.
         RSR
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         LXI         0
         BSR         ASPCT           < ACCES A 'A 0000' :
         FCAZ                        < EST-CE LA PREMIERE FOIS ???
         JNE         SPU1            < NON...
<
< CAS DE LA PREMIERE FOIS : INITIALISATION DU Z-BUFFER :
<
         IC          NPTS            < COMPTAGE DES POINTS RENCONTRES.
         FLD         VARU
         BSR         ASP1            < RANGEMENT DE B(VARU),
         LR          A,B
         BSR         ASP1            < RANGEMENT DE A(VARU),
         FLD         VARV
         BSR         ASP1            < RANGEMENT DE B(VARV),
         LR          A,B
         BSR         ASP1            < RANGEMENT DE A(VARV).
         FLD         F0              < PAS DE DEPLACEMENT LA PREMIERE FOIS...
         JMP         SPU2            < ET C'EST TOUT...
<
< CAS DES FOIS SUIVANTES : ITERATION SUR LE Z-BUFFER :
<
SPU1:    EQU         $
         IC          XNPTS           < COMPTAGE DES POINTS DE CETTE ITERATION...
         BSR         ASP3            < ACCES A VARU ET VARV.
         LA          XAD2
         ADRI        -4,A            < CAR ON VA RE-UTILISER CE BLOC...
         STA         XAD2
         BSR         ASPRHO
         FLD         VARV
         FNEG
         FDV         RHO2P1          < -VARV/RHO2P1.
SPU2:    EQU         $
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         LXI         0
         BSR         ASPCT
         FCAZ                        < EST-CE LA PREMIERE FOIS ???
         JNE         SPV1            < NON...
<
< CAS DE LA PREMIERE FOIS :
<
         FLD         F0              < OUI, PAS DE DEPLACEMENT...
         JMP         SPV2
<
< CAS DES ITERATIONS SUIVANTES :
<
SPV1:    EQU         $
         BSR         ASP3            < ACCES A VARU ET VARV.
         LA          NPTS
         CP          XNPTS           < EST-ON AU BOUT DE L'IMAGE ???
         JNE         SPV3            < NON...
         STZ         XNPTS           < OUI, ON REINITIALISE LES COMPTEURS,
         STZ         XAD2            < ET LES ADRESSES...
SPV3:    EQU         $
         FLD         FXS
         FMP         KFU             < ON SUPPOSE QUE KUX=KUY=1...
         BSR         ASP1            < RANGEMENT DE B(FXS),
         LR          A,B
         BSR         ASP1            < RANGEMENT DE A(FXS),
         FLD         FYS
         FMP         KFV             < ON SUPPOSE QUE KVX=KVY=1...
         BSR         ASP1            < RANGEMENT DE B(FYS),
         LR          A,B
         BSR         ASP1            < RANGEMENT DE A(FYS).
         LA          XNPTS           < EST-ON AU DEBUT ???
         CPI         1
         JNE         SPU4            < NON...
         STZ         XAD1            < OUI, REINITIALISATION DE L'ADRESSE...
SPU4:    EQU         $
         BSR         ASPRHO
         FLD         VARU
         FDV         RHO2P1          < VARU/RHO2P1.
SPV2:    EQU         $
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
<
<
<        S T O R E   D A N S   L E   Z - B U F F E R  :
<
<
<        ARGUMENT :
<                    B=VALEUR A RANGER,
<                    XAD1=ADRESSE DE RANGEMENT.
<
<
SP1:     EQU         $
         CPZ         ZBUF            < Z-BUFFER ???
         JNE         SP11            < OK, INACTIF...
         QUIT        1               < ACTIF ??!???!
SP11:    EQU         $
         STZ         ZBUF            < ACTIVATION...
         PSR         A
         LA          XAD1            < A=ADRESSE DE RANGEMENT,
         LYI         YSTORE          < Y=FONCTION DE RANGEMENT,
         BSR         AGZB            < RANGEMENT DE LA VALEUR (B).
         PLR         A
         IC          XAD1            < PROGRESSION DE L'ADRESSE...
         IC          ZBUF            < INHIBITION DU Z-BUFFER...
         RSR
<
<
<        A C C E S   A U   Z - B U F F E R  :
<
<
<        ARGUMENT :
<                    XAD2=ADRESSE D'ACCES.
<
<
<        RESULTAT :
<                    B=VALEUR.
<
<
SP2:     EQU         $
         STZ         ZBUF            < ACTIVATION DU Z-BUFFER...
         PSR         A
         LA          XAD2            < A=ADRESSE D'ACCES,
         LYI         YLOAD           < Y=FONCTION D'ACCES,
         BSR         AGZB            < B=VALEUR.
         PLR         A
         IC          XAD2            < PROGRESSION DE L'ADRESSE...
         IC          ZBUF            < INHIBITION DU Z-BUFFER...
         RSR
<
<
<        A C C E S   A   V A R U   E T   V A R V  :
<                    E T   X R   E T   Y R  :
<
<
SP3:     EQU         $
         BSR         ASP2            < ACCES A B(VARU),
         LR          B,A
         BSR         ASP2            < ACCES A A(VARU),
         XR          A,B
         FST         VARU            < ACCES A VARU,
         FDV         KFU             < ON SUPPOSE KUX=KUY=1...
         FST         FXR
         BSR         ASP2            < ACCES A B(VARV),
         LR          B,A
         BSR         ASP2            < ACCES A A(VARV),
         XR          A,B
         FST         VARV            < ACCES A VARV.
         FDV         KFV             < ON SUPPOSE KVX=KVY=1...
         FST         FYR
         RSR
:F
:F
< <<'SIOT TOURBILLONS 2'
DF'SIOT TOURBILLONS 3'
ED'SIOT TOURBILLONS 3'
IN0
         PAGE
         IDP         "SIOT TOURBILLONS 3"
<
<
<        T O U R B I L L O N S   3  :
<
<
<        MODELE :
<                      ON CONSIDERE LA FONCTION : D=R/(R**2+1),
<                    SA COURBE REPRESENTATIVE EST UNE FONCTION
<                    DU TROISIEME DEGRE AVEC UN MINIMA (-1,-1/2),
<                    UN MAXIMA (+1,+1/2) ET 3 POINTS D'INFLEXION.
<                      ON CONSIDERE ENSUITE LE RAYON POLAIRE
<                    EN CHAQUE POINT (X,Y) ; ON PASSE DONC EN
<                    COORDONNEES POLAIRES (X,Y) <--> (RHO,TETA).
<                    LE 'R' PRECEDENT DEVIENT LE 'RHO', ET LE 'D'
<                    DEFINIT UN DEPLACEMENT DU POINT (X,Y),
<                    SUIVANT LA LOI :
<                    (X)   (COS(D) -SIN(D)) (X)
<                    ( ) = (              )*( )
<                    (Y)   (SIN(D)  COS(D)) (Y)
<                                    W=0,
<        NOTA :
<                    SI A0000=0 : ON INITIALISE LE Z-BUFFER AVEC LES COORDON-
<                                 FLOTTANTES DES POINTS DE L'IMAGE,
<                    SI A0000=1 : ON ITERE LA TRANSFORMATION TOURBILLONNAIRE
<                                 A PARTIR DES COORDONNEES STOCKEES DANS
<                                 LE Z-BUFFER.
<                    A0001=FACTEUR D'ECHELLE DE L'ANGLE 'D'.
<
<
         LOCAL
FLOC:    EQU         $
XCOS:    EQU         DXDU            < COS(D).
XSIN:    EQU         DXDV            < SIN(D).
ASPRHO:  WORD        SPRHO           < CALCUL DU RAYON POLAIRE.
ASP1:    WORD        SP1             < RANGEMENT DANS LE Z-BUFFER,
ASP2:    WORD        SP2             < ACCES A UN MOT DU Z-BUFFER.
ASP3:    WORD        SP3             < ACCES A 4-MOTS DU Z-BUFFER.
NPTS:    EQU         DYDU+1          < NOMBRE DE POINTS DANS L'IMAGE DE BASE.
XNPTS:   EQU         DYDV+1          < NOMBRE COURANT DE POINTS TRAITES LORS
                                     < D'UNE ITERATION.
XAD1:    EQU         DZDU+1          < ADRESSE COURANTE DE RANGEMENT,
XAD2:    EQU         DZDV+1          < ADRESSE COURANTE D'ACCES.
A0::     VAL         0               < INDICATEUR D'INITIALISATION.
A1::     VAL         1               < CONSTANTE D'ECHELLE DE 'D'...
         PROG
<
<
<        C A L C U L   D E   R H O * * 2 + 1  :
<
<
SPRHO:   EQU         $
         FLD         VARU
         FMP         VARU
         FST         FWORK
         FLD         VARV
         FMP         VARV
         FAD         FWORK
         FAD         F1
         FST         FWORK2          < U**2+V**2+1.
         FSB         F1
         BSR         ARAC
         FST         FWORK1          < RAC(U**2+V**2).
         LXI         A1
         BSR         ASPCT
         FMP         FWORK1
         FDV         FWORK2
         FST         FWORK
         BSR         ACOS
         FST         XCOS            < XCOS=COS(A1*RAC(U**2+V**2)/(U**2+V**2+1).
         FLD         FWORK
         BSR         ASIN
         FST         XSIN            < XSIN=SIN(A1*RAC(U**2+V**2)/(U**2+V**2+1).
         RSR
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         LXI         A0
         BSR         ASPCT           < ACCES A 'A 0000' :
         FCAZ                        < EST-CE LA PREMIERE FOIS ???
         JNE         SPU1            < NON...
<
< CAS DE LA PREMIERE FOIS : INITIALISATION DU Z-BUFFER :
<
         IC          NPTS            < COMPTAGE DES POINTS RENCONTRES.
         FLD         VARU
         BSR         ASP1            < RANGEMENT DE B(VARU),
         LR          A,B
         BSR         ASP1            < RANGEMENT DE A(VARU),
         FLD         VARV
         BSR         ASP1            < RANGEMENT DE B(VARV),
         LR          A,B
         BSR         ASP1            < RANGEMENT DE A(VARV).
         FLD         F0              < PAS DE DEPLACEMENT LA PREMIERE FOIS...
         JMP         SPU2            < ET C'EST TOUT...
<
< CAS DES FOIS SUIVANTES : ITERATION SUR LE Z-BUFFER :
<
SPU1:    EQU         $
         IC          XNPTS           < COMPTAGE DES POINTS DE CETTE ITERATION...
         BSR         ASP3            < ACCES A VARU ET VARV.
         LA          XAD2
         ADRI        -4,A            < CAR ON VA RE-UTILISER CE BLOC...
         STA         XAD2
         BSR         ASPRHO          < CALCUL DE 'XSIN' ET 'XCOS'.
         FLD         XSIN
         FMP         VARV
         FST         FWORK
         FLD         XCOS
         FMP         VARU
         FSB         FWORK
         FDV         KFU
         FSB         FXR
         FDV         FK
SPU2:    EQU         $
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         LXI         A0
         BSR         ASPCT
         FCAZ                        < EST-CE LA PREMIERE FOIS ???
         JNE         SPV1            < NON...
<
< CAS DE LA PREMIERE FOIS :
<
         FLD         F0              < OUI, PAS DE DEPLACEMENT...
         JMP         SPV2
<
< CAS DES ITERATIONS SUIVANTES :
<
SPV1:    EQU         $
         BSR         ASP3            < ACCES A VARU ET VARV.
         LA          NPTS
         CP          XNPTS           < EST-ON AU BOUT DE L'IMAGE ???
         JNE         SPV3            < NON...
         STZ         XNPTS           < OUI, ON REINITIALISE LES COMPTEURS,
         STZ         XAD2            < ET LES ADRESSES...
SPV3:    EQU         $
         FLD         FXS
         FMP         KFU             < ON SUPPOSE QUE KUX=KUY=1...
         BSR         ASP1            < RANGEMENT DE B(FXS),
         LR          A,B
         BSR         ASP1            < RANGEMENT DE A(FXS),
         FLD         FYS
         FMP         KFV             < ON SUPPOSE QUE KVX=KVY=1...
         BSR         ASP1            < RANGEMENT DE B(FYS),
         LR          A,B
         BSR         ASP1            < RANGEMENT DE A(FYS).
         LA          XNPTS           < EST-ON AU DEBUT ???
         CPI         1
         JNE         SPU4            < NON...
         STZ         XAD1            < OUI, REINITIALISATION DE L'ADRESSE...
SPU4:    EQU         $
         FLD         XSIN
         FMP         VARU
         FST         FWORK
         FLD         XCOS
         FMP         VARV
         FAD         FWORK
         FDV         KFV
         FSB         FYR
         FDV         FK
SPV2:    EQU         $
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
<
<
<        S T O R E   D A N S   L E   Z - B U F F E R  :
<
<
<        ARGUMENT :
<                    B=VALEUR A RANGER,
<                    XAD1=ADRESSE DE RANGEMENT.
<
<
SP1:     EQU         $
         CPZ         ZBUF            < Z-BUFFER ???
         JNE         SP11            < OK, INACTIF...
         QUIT        1               < ACTIF ??!???!
SP11:    EQU         $
         STZ         ZBUF            < ACTIVATION...
         PSR         A
         LA          XAD1            < A=ADRESSE DE RANGEMENT,
         LYI         YSTORE          < Y=FONCTION DE RANGEMENT,
         BSR         AGZB            < RANGEMENT DE LA VALEUR (B).
         PLR         A
         IC          XAD1            < PROGRESSION DE L'ADRESSE...
         IC          ZBUF            < INHIBITION DU Z-BUFFER...
         RSR
<
<
<        A C C E S   A U   Z - B U F F E R  :
<
<
<        ARGUMENT :
<                    XAD2=ADRESSE D'ACCES.
<
<
<        RESULTAT :
<                    B=VALEUR.
<
<
SP2:     EQU         $
         STZ         ZBUF            < ACTIVATION DU Z-BUFFER...
         PSR         A
         LA          XAD2            < A=ADRESSE D'ACCES,
         LYI         YLOAD           < Y=FONCTION D'ACCES,
         BSR         AGZB            < B=VALEUR.
         PLR         A
         IC          XAD2            < PROGRESSION DE L'ADRESSE...
         IC          ZBUF            < INHIBITION DU Z-BUFFER...
         RSR
<
<
<        A C C E S   A   V A R U   E T   V A R V  :
<                    E T   X R   E T   Y R  :
<
<
SP3:     EQU         $
         BSR         ASP2            < ACCES A B(VARU),
         LR          B,A
         BSR         ASP2            < ACCES A A(VARU),
         XR          A,B
         FST         VARU            < ACCES A VARU,
         FDV         KFU             < ON SUPPOSE KUX=KUY=1...
         FST         FXR
         BSR         ASP2            < ACCES A B(VARV),
         LR          B,A
         BSR         ASP2            < ACCES A A(VARV),
         XR          A,B
         FST         VARV            < ACCES A VARV.
         FDV         KFV             < ON SUPPOSE KVX=KVY=1...
         FST         FYR
         RSR
:F
:F
< <<'SIOT TOURBILLONS 3'
DF'SIOT TOURBILLONS 4'
ED'SIOT TOURBILLONS 4'
IN0
         PAGE
         IDP         "SIOT TOURBILLONS 4"
<
<
<        T O U R B I L L O N S   4  :
<
<
<        MODELE :
<                      ON CONSIDERE LA FONCTION : D=A2*(A1*R-R**2),
<                      ON CONSIDERE ENSUITE LE RAYON POLAIRE
<                    EN CHAQUE POINT (X,Y) ; ON PASSE DONC EN
<                    COORDONNEES POLAIRES (X,Y) <--> (RHO,TETA).
<                    LE 'R' PRECEDENT DEVIENT LE 'RHO', ET LE 'D'
<                    DEFINIT UN DEPLACEMENT DU POINT (X,Y),
<                    SUIVANT LA LOI :
<                    (X)   (COS(D) -SIN(D)) (X)
<                    ( ) = (              )*( )
<                    (Y)   (SIN(D)  COS(D)) (Y)
<        NOTA :
<                    SI A0000=0 : ON INITIALISE LE Z-BUFFER AVEC LES COORDON-
<                                 FLOTTANTES DES POINTS DE L'IMAGE,
<                    SI A0000=1 : ON ITERE LA TRANSFORMATION TOURBILLONNAIRE
<                                 A PARTIR DES COORDONNEES STOCKEES DANS
<                                 LE Z-BUFFER.
<                    A0001=FACTEUR D'ECHELLE DE L'ANGLE 'D'.
<
<
         LOCAL
FLOC:    EQU         $
XCOS:    EQU         DXDU            < COS(D).
XSIN:    EQU         DXDV            < SIN(D).
ASP1:    WORD        SP1             < RANGEMENT DE 'A' DANS LE Z-BUFFER,
ASP4:    WORD        SP4             < RANGEMENT DE (A,B) DANS LE Z-BUFFER,
ASP2:    WORD        SP2             < ACCES A UN MOT DU Z-BUFFER.
ASP3:    WORD        SP3             < ACCES A 4-MOTS DU Z-BUFFER.
NPTS:    EQU         DYDU+1          < NOMBRE DE POINTS DANS L'IMAGE DE BASE.
XNPTS:   EQU         DYDV+1          < NOMBRE COURANT DE POINTS TRAITES LORS
                                     < D'UNE ITERATION.
XAD1:    EQU         DZDU+1          < ADRESSE COURANTE DE RANGEMENT,
XAD2:    EQU         DZDV+1          < ADRESSE COURANTE D'ACCES.
A0::     VAL         0               < INDICATEUR D'INITIALISATION.
A1::     VAL         1
A2::     VAL         2               < CONSTANTE D'ECHELLE.
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         LXI         A0
         BSR         ASPCT           < ACCES A 'A 0000' :
         FCAZ                        < EST-CE LA PREMIERE FOIS ???
         JNE         SPU1            < NON...
<
< CAS DE LA PREMIERE FOIS : INITIALISATION DU Z-BUFFER :
<
         IC          NPTS            < COMPTAGE DES POINTS RENCONTRES.
         FLD         VARU
         BSR         ASP4            < RANGEMENT DE 'VARU'.
         FLD         VARV
         BSR         ASP4            < RANGEMENT DE 'VARV'.
         FLD         F0              < PAS DE DEPLACEMENT LA PREMIERE FOIS...
         JMP         SPU2            < ET C'EST TOUT...
<
< CAS DES FOIS SUIVANTES : ITERATION SUR LE Z-BUFFER :
<
SPU1:    EQU         $
         IC          XNPTS           < COMPTAGE DES POINTS DE CETTE ITERATION...
         BSR         ASP3            < ACCES A VARU ET VARV.
         LA          XAD2
         ADRI        -4,A            < CAR ON VA RE-UTILISER CE BLOC...
         STA         XAD2
         FLD         VARU
         FMP         VARU
         FST         FWORK
         FLD         VARV
         FMP         VARV
         FAD         FWORK
         FST         FWORK2          < U**2+V*2.
         BSR         ARAC
         FST         FWORK1          < RHO=RAC(U**2+V**2).
         LXI         A1
         BSR         ASPCT
         FMP         FWORK1
         FSB         FWORK2
         FCAZ
         JGE         SPRHO1
         FLD         F0              < SUPPRESSION DES VALEURS NEGATIVES...
SPRHO1:  EQU         $
         FST         FWORK
         LXI         A2
         BSR         ASPCT
         FMP         FWORK
         FST         FWORK           < TETA=A2*(A1*RHO-RHO**2).
         BSR         ACOS
         FST         XCOS            < XCOS=COS(TETA),
         FLD         FWORK
         BSR         ASIN
         FST         XSIN            < XSIN=SIN(TETA).
         FLD         XSIN
         FMP         VARV
         FST         FWORK
         FLD         XCOS
         FMP         VARU
         FSB         FWORK
         FDV         KFU
         FSB         FXR
         FDV         FK
SPU2:    EQU         $
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         LXI         A0
         BSR         ASPCT
         FCAZ                        < EST-CE LA PREMIERE FOIS ???
         JNE         SPV1            < NON...
<
< CAS DE LA PREMIERE FOIS :
<
         FLD         F0              < OUI, PAS DE DEPLACEMENT...
         JMP         SPV2
<
< CAS DES ITERATIONS SUIVANTES :
<
SPV1:    EQU         $
         BSR         ASP3            < ACCES A VARU ET VARV.
         LA          NPTS
         CP          XNPTS           < EST-ON AU BOUT DE L'IMAGE ???
         JNE         SPV3            < NON...
         STZ         XNPTS           < OUI, ON REINITIALISE LES COMPTEURS,
         STZ         XAD2            < ET LES ADRESSES...
SPV3:    EQU         $
         FLD         FXS
         FMP         KFU             < ON SUPPOSE QUE KUX=KUY=1...
         BSR         ASP4            < RANGEMENT DE 'FXS'.
         FLD         FYS
         FMP         KFV             < ON SUPPOSE QUE KVX=KVY=1...
         BSR         ASP4            < RANGEMENT DE 'FYS'.
         LA          XNPTS           < EST-ON AU DEBUT ???
         CPI         1
         JNE         SPU4            < NON...
         STZ         XAD1            < OUI, REINITIALISATION DE L'ADRESSE...
SPU4:    EQU         $
         FLD         XSIN
         FMP         VARU
         FST         FWORK
         FLD         XCOS
         FMP         VARV
         FAD         FWORK
         FDV         KFV
         FSB         FYR
         FDV         FK
SPV2:    EQU         $
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
<
<
<        S T O R E   D A N S   L E   Z - B U F F E R  :
<
<
<        ARGUMENT :
<                    B=VALEUR A RANGER,
<                    XAD1=ADRESSE DE RANGEMENT.
<
<
SP1:     EQU         $
         CPZ         ZBUF            < Z-BUFFER ???
         JNE         SP11            < OK, INACTIF...
         QUIT        1               < ACTIF ??!???!
SP11:    EQU         $
         STZ         ZBUF            < ACTIVATION...
         PSR         A
         LA          XAD1            < A=ADRESSE DE RANGEMENT,
         LYI         YSTORE          < Y=FONCTION DE RANGEMENT,
         BSR         AGZB            < RANGEMENT DE LA VALEUR (B).
         PLR         A
         IC          XAD1            < PROGRESSION DE L'ADRESSE...
         IC          ZBUF            < INHIBITION DU Z-BUFFER...
         RSR
SP4:     EQU         $
         BSR         ASP1            < RANGEMENT DE 'B',
         LR          A,B
         BSR         ASP1            < RANGEMENT DE 'A'.
         RSR
<
<
<        A C C E S   A U   Z - B U F F E R  :
<
<
<        ARGUMENT :
<                    XAD2=ADRESSE D'ACCES.
<
<
<        RESULTAT :
<                    B=VALEUR.
<
<
SP2:     EQU         $
         STZ         ZBUF            < ACTIVATION DU Z-BUFFER...
         PSR         A
         LA          XAD2            < A=ADRESSE D'ACCES,
         LYI         YLOAD           < Y=FONCTION D'ACCES,
         BSR         AGZB            < B=VALEUR.
         PLR         A
         IC          XAD2            < PROGRESSION DE L'ADRESSE...
         IC          ZBUF            < INHIBITION DU Z-BUFFER...
         RSR
<
<
<        A C C E S   A   V A R U   E T   V A R V  :
<                    E T   X R   E T   Y R  :
<
<
SP3:     EQU         $
         BSR         ASP2            < ACCES A B(VARU),
         LR          B,A
         BSR         ASP2            < ACCES A A(VARU),
         XR          A,B
         FST         VARU            < ACCES A VARU,
         FDV         KFU             < ON SUPPOSE KUX=KUY=1...
         FST         FXR
         BSR         ASP2            < ACCES A B(VARV),
         LR          B,A
         BSR         ASP2            < ACCES A A(VARV),
         XR          A,B
         FST         VARV            < ACCES A VARV.
         FDV         KFV             < ON SUPPOSE KVX=KVY=1...
         FST         FYR
         RSR
:F
:F
< <<'SIOT TOURBILLONS 4'
DF'SIOT TOURBILLONS 5'
ED'SIOT TOURBILLONS 5'
IN0
         PAGE
         IDP         "SIOT TOURBILLONS 5"
<
<
<        T O U R B I L L O N S   5  :
<
<
<        MODELE :
<                      ON CONSIDERE LA FONCTION : D=R/(R**2+1),
<                    SA COURBE REPRESENTATIVE EST UNE FONCTION
<                    DU TROISIEME DEGRE AVEC UN MINIMA (-1,-1/2),
<                    UN MAXIMA (+1,+1/2) ET 3 POINTS D'INFLEXION.
<                      ON CONSIDERE ENSUITE LE RAYON POLAIRE
<                    EN CHAQUE POINT (X,Y) ; ON PASSE DONC EN
<                    COORDONNEES POLAIRES (X,Y) <--> (RHO,TETA).
<                    LE 'R' PRECEDENT DEVIENT LE 'RHO', ET LE 'D'
<                    DEFINIT UN VECTEUR DEPLACEMENT DU POINT (X,Y)
<                    ORIENTE DE 'TETA' PAR RAPPORT AU RAYON ; CE VECTEUR
<                    DEPLACEMENT A POUR COORDONNEES :
<                                    U=-A1*(X*COS(TETA)-Y*SIN(TETA))/(RHO**2+1),
<                                    V=+A2*(X*SIN(TETA)+Y*COS(TETA))/(RHO**2+1),
<                                    W=0,
<        NOTA :
<                    SI A0000=0 : ON INITIALISE LE Z-BUFFER AVEC LES COORDON-
<                                 FLOTTANTES DES POINTS DE L'IMAGE,
<                    SI A0000=1 : ON ITERE LA TRANSFORMATION TOURBILLONNAIRE
<                                 A PARTIR DES COORDONNEES STOCKEES DANS
<                                 LE Z-BUFFER.
<
<
<        PARAMETRES :
A0::     VAL         0               < INDICATEUR DE PREMIERE FOIS (0),
A1::     VAL         A0+1            < AMPLIFICATEUR DE 'U',
A2::     VAL         A1+1            < AMPLIFICATEUR DE 'V',
A3::     VAL         A2+1            < ANGLE 'TETA' DE LA ROTATION.
AN::     VAL         A3+1            < LAST PARAMETER...
LFLOAT:: VAL         2               < LONGUEUR D'UNE CONSTANTE FLOTTANTE.
<
<
         LOCAL
FLOC:    EQU         $
RHO2P1:  FLOAT       0
ASPRHO:  WORD        SPRHO           < CALCUL DU RAYON POLAIRE.
ASP1:    WORD        SP1             < RANGEMENT DANS LE Z-BUFFER,
ASP2:    WORD        SP2             < ACCES A UN MOT DU Z-BUFFER.
ASP3:    WORD        SP3             < ACCES A 4-MOTS DU Z-BUFFER.
NPTS:    WORD        0               < NOMBRE DE POINTS DANS L'IMAGE DE BASE.
XNPTS:   WORD        0               < NOMBRE COURANT DE POINTS TRAITES LORS
                                     < D'UNE ITERATION.
XAD1:    WORD        0               < ADRESSE COURANTE DE RANGEMENT,
XAD2:    WORD        0               < ADRESSE COURANTE D'ACCES.
FA1:     FLOAT       0
FA2:     FLOAT       0
COSTET:  FLOAT       0               < COS(TETA),
SINTET:  FLOAT       1               < SIN(TETA).
         PROG
<
<
<        C A L C U L   D E   R H O * * 2 + 1  :
<
<
SPRHO:   EQU         $
         FLD         VARU
         FMP         VARU
         FST         FWORK
         FLD         VARV
         FMP         VARV
         FAD         FWORK
         FAD         F1
         FST         RHO2P1          < RHO2P1=VARU**2+VARV**2+1.
         RSR
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
<
< ENTREE DES COEFFICIENTS D'AMPLIFICATION :
<
         LXI         A1
         BSR         ASPCT
         FST         FA1
         LXI         A2
         BSR         ASPCT
         FST         FA2
<
< ANGLE 'TETA' DE ROTATION :
<
         LXI         A3
         BSR         ASPCT
         PSR         A,B             < 'TETA',
         BSR         ACOS
         FST         COSTET          < COS(TETA),
         PLR         A,B
         BSR         ASIN
         FST         SINTET          < SIN(TETA).
         LXI         A0
         BSR         ASPCT           < ACCES A 'A 0000' :
         FCAZ                        < EST-CE LA PREMIERE FOIS ???
         JNE         SPU1            < NON...
<
< CAS DE LA PREMIERE FOIS : INITIALISATION DU Z-BUFFER :
<
         IC          NPTS            < COMPTAGE DES POINTS RENCONTRES.
         FLD         VARU
         BSR         ASP1            < RANGEMENT DE B(VARU),
         LR          A,B
         BSR         ASP1            < RANGEMENT DE A(VARU),
         FLD         VARV
         BSR         ASP1            < RANGEMENT DE B(VARV),
         LR          A,B
         BSR         ASP1            < RANGEMENT DE A(VARV).
         JMP         SPW             < PAS DE DEPLACEMENT LA PREMIERE FOIS...
<
< CAS DES FOIS SUIVANTES : ITERATION SUR LE Z-BUFFER :
<
SPU1:    EQU         $
         IC          XNPTS           < COMPTAGE DES POINTS DE CETTE ITERATION...
         BSR         ASP3            < ACCES A VARU ET VARV.
         LA          XAD2
         ADRI        -4,A            < CAR ON VA RE-UTILISER CE BLOC...
         STA         XAD2
         BSR         ASPRHO
         FLD         VARV
         FMP         SINTET          < V*SIN(TETA),
         FST         FWORK
         FLD         VARU
         FMP         COSTET          < U*COS(TETA),
         FSB         FWORK           < U*COS(TETA)-V*SIN(TETA),
         FDV         RHO2P1          < (U*COS(TETA)-V*SIN(TETA))/RHO2P1.
         FMP         FA1             < AMPLIFICATION...
SPU2:    EQU         $
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         LXI         A0
         BSR         ASPCT
         FCAZ                        < EST-CE LA PREMIERE FOIS ???
         JE          SPW             < OUI, PAS DE DEPLACEMENT...
<
< CAS DES ITERATIONS SUIVANTES :
<
SPV1:    EQU         $
         BSR         ASP3            < ACCES A VARU ET VARV.
         LA          NPTS
         CP          XNPTS           < EST-ON AU BOUT DE L'IMAGE ???
         JNE         SPV3            < NON...
         STZ         XNPTS           < OUI, ON REINITIALISE LES COMPTEURS,
         STZ         XAD2            < ET LES ADRESSES...
SPV3:    EQU         $
         FLD         FXS
         FMP         KFU             < ON SUPPOSE QUE KUX=KUY=1...
         BSR         ASP1            < RANGEMENT DE B(FXS),
         LR          A,B
         BSR         ASP1            < RANGEMENT DE A(FXS),
         FLD         FYS
         FMP         KFV             < ON SUPPOSE QUE KVX=KVY=1...
         BSR         ASP1            < RANGEMENT DE B(FYS),
         LR          A,B
         BSR         ASP1            < RANGEMENT DE A(FYS).
         LA          XNPTS           < EST-ON AU DEBUT ???
         CPI         1
         JNE         SPU4            < NON...
         STZ         XAD1            < OUI, REINITIALISATION DE L'ADRESSE...
SPU4:    EQU         $
         BSR         ASPRHO
         FLD         VARV
         FMP         COSTET          < V*COS(TETA),
         FST         FWORK
         FLD         VARU
         FMP         SINTET          < U*SIN(TETA),
         FAD         FWORK           < U*SIN(TETA)+V*COS(TETA),
         FDV         RHO2P1          < (U*SIN(TETA)+V*COS(TETA))/RHO2P1.
         FMP         FA2             < AMPLIFICATION...
SPV2:    EQU         $
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
<
<
<        S T O R E   D A N S   L E   Z - B U F F E R  :
<
<
<        ARGUMENT :
<                    B=VALEUR A RANGER,
<                    XAD1=ADRESSE DE RANGEMENT.
<
<
SP1:     EQU         $
         CPZ         ZBUF            < Z-BUFFER ???
         JNE         SP11            < OK, INACTIF...
         QUIT        1               < ACTIF ??!???!
SP11:    EQU         $
         STZ         ZBUF            < ACTIVATION...
         PSR         A
         LA          XAD1            < A=ADRESSE DE RANGEMENT,
         LYI         YSTORE          < Y=FONCTION DE RANGEMENT,
         BSR         AGZB            < RANGEMENT DE LA VALEUR (B).
         PLR         A
         IC          XAD1            < PROGRESSION DE L'ADRESSE...
         IC          ZBUF            < INHIBITION DU Z-BUFFER...
         RSR
<
<
<        A C C E S   A U   Z - B U F F E R  :
<
<
<        ARGUMENT :
<                    XAD2=ADRESSE D'ACCES.
<
<
<        RESULTAT :
<                    B=VALEUR.
<
<
SP2:     EQU         $
         STZ         ZBUF            < ACTIVATION DU Z-BUFFER...
         PSR         A
         LA          XAD2            < A=ADRESSE D'ACCES,
         LYI         YLOAD           < Y=FONCTION D'ACCES,
         BSR         AGZB            < B=VALEUR.
         PLR         A
         IC          XAD2            < PROGRESSION DE L'ADRESSE...
         IC          ZBUF            < INHIBITION DU Z-BUFFER...
         RSR
<
<
<        A C C E S   A   V A R U   E T   V A R V  :
<                    E T   X R   E T   Y R  :
<
<
SP3:     EQU         $
         BSR         ASP2            < ACCES A B(VARU),
         LR          B,A
         BSR         ASP2            < ACCES A A(VARU),
         XR          A,B
         FST         VARU            < ACCES A VARU,
         FDV         KFU             < ON SUPPOSE KUX=KUY=1...
         FST         FXR
         BSR         ASP2            < ACCES A B(VARV),
         LR          B,A
         BSR         ASP2            < ACCES A A(VARV),
         XR          A,B
         FST         VARV            < ACCES A VARV.
         FDV         KFV             < ON SUPPOSE KVX=KVY=1...
         FST         FYR
         RSR
:F
:F
< <<'SIOT TOURBILLONS 5'
DF'SIOT VASARELY'
ED'SIOT VASARELY'
IN0
         PAGE
         IDP         "SIOT VASARELY"
<
<
<        F O N C T I O N   " V A S A R E L Y "  :
<
<
<        FONCTION :
<                      ON CALCULE LA TRANSFORMATION SUIVANTE :
<                    U=X+(A0*X/(A1*(Y**2)+1)),
<                    V=Y+(A2*Y/(A3*(X**2)+1)),
<                    W=0.
<                      CELA DONNE UNE TRANSFORMATION EXAGERANT
<                    LE CENTRE DE L'IMAGE EN DONNANT UNE
<                    SORTE DE BOURSOUFLURE...
<
<
<        PARAMETRES :
A0000::  VAL         0               < COEFFICIENT DE X,
A0001::  VAL         A0000+1         < COEFFICIENT DE Y**2.
A0002::  VAL         A0001+1         < COEFFICIENT DE Y,
A0003::  VAL         A0002+1         < COEFFICIENT DE X**2.
<
<
         LOCAL
FLOC:    EQU         $
XA0:     FLOAT       0
XA1:     FLOAT       0
XA2:     FLOAT       0
XA3:     FLOAT       0
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
<
< ENTREE DES PARAMETRES :
<
         LXI         A0000
         BSR         ASPCT
         FST         XA0
         LXI         A0001
         BSR         ASPCT
         FST         XA1
<
< CALCUL DU POINT :
<
         FLD         VARV
         FMP         VARV
         FDV         FK
         FDV         FK
         FMP         XA1
         FAD         F1
         FST         FWORK
         FLD         VARU
         FDV         FK
         FMP         XA0
         FDV         FWORK
         FMP         FK
         FST         FWORK
         FLD         VARU
         FDV         FK
         FAD         FWORK
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
<
< ENTREE DES PARAMETRES :
<
         LXI         A0002
         BSR         ASPCT
         FST         XA2
         LXI         A0003
         BSR         ASPCT
         FST         XA3
<
< CALCUL DU POINT :
<
         FLD         VARU
         FMP         VARU
         FDV         FK
         FDV         FK
         FMP         XA3
         FAD         F1
         FST         FWORK
         FLD         VARV
         FDV         FK
         FMP         XA2
         FDV         FWORK
         FMP         FK
         FST         FWORK
         FLD         VARV
         FDV         FK
         FAD         FWORK
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT VASARELY'
DF'SIOT VASARELY 1'
ED'SIOT VASARELY 1'
IN0
         PAGE
         IDP         "SIOT VASARELY 1"
<
<
<        F O N C T I O N   " V A S A R E L Y   1 "  :
<
<
<        MODELE :
<                      ON CONSIDERE LA FONCTION : D=R/(R**2+1),
<                    SA COURBE REPRESENTATIVE EST UNE FONCTION
<                    DU TROISIEME DEGRE AVEC UN MINIMA (-1,-1/2),
<                    UN MAXIMA (+1,+1/2) ET 3 POINTS D'INFLEXION.
<                      ON CONSIDERE ENSUITE LE RAYON POLAIRE
<                    EN CHAQUE POINT (X,Y) ; ON PASSE DONC EN
<                    COORDONNEES POLAIRES (X,Y) <--> (RHO,TETA).
<                    LE 'R' PRECEDENT DEVIENT LE 'RHO', ET LE 'D'
<                    DEFINIT UN VECTEUR DEPLACEMENT DU POINT (X,Y)
<                    COLINEAIRE AU RAYON POLAIRE 'RHO' ; CE VECTEUR
<                    DEPLACEMENT A POUR COORDONNEES :
<                                    U=+A0*(A4*X+A5*Y)/(RHO**2+1),
<                                    V=+A1*(A6*X+A7*Y)/(RHO**2+1),
<                                    W=0,
<                    AVEC :
<                                    RHO=A2*(X**2)+A3*(Y**2).
<                    ET :
<                                    (A4,A5,A6,A7) EST UNE MATRICE
<                                    DE TRANSFORMATION QUI PERMET
<                                    PAR EXEMPLE DE FAIRE TOURNER
<                                    LA DEFORMATION, EN PRENANT :
<
<                                    A4=COS(TETA),
<                                    A5=-SIN(TETA),
<                                    A6=SIN(TETA),
<                                    A7=COS(TETA)...
<
<
<        NOTA :
<                      C'EST CETTE TRANSFORMATION QUI
<                    PERMET DE FAIRE PARLER, OU CLIGNER
<                    DES YEUX...
<
<
<        PARAMETRES :
A0::     VAL         0               < COEFFICIENT DE X,
A1::     VAL         A0+1            < COEFFICIENT DE Y,
A2::     VAL         A1+1            < COEFFICIENT DE X2,
A3::     VAL         A2+1            < COEFFICIENT DE Y2,
A4::     VAL         A3+1            < MATRICE
A5::     VAL         A4+1            <         DE TRANSFORMATION
A6::     VAL         A5+1            <                           DES
A7::     VAL         A6+1            <                               (X,Y).
<
<
         LOCAL
FLOC:    EQU         $
<
< CONSTANTES :
<
PREM:    WORD        -1              < INDICATEUR DE PREMIER PASSAGE...
XFA0:    FLOAT       0
XFA1:    FLOAT       0
XFA2:    FLOAT       0
XFA3:    FLOAT       0
XFA4:    FLOAT       0
XFA5:    FLOAT       0
XFA6:    FLOAT       0
XFA7:    FLOAT       0
<
< RELAIS DIVERS :
<
RHO2P1:  FLOAT       0
ASPRHO:  WORD        SPRHO           < CALCUL DU RAYON POLAIRE.
         PROG
<
<
<        C A L C U L   D E   R H O * * 2 + 1  :
<
<
SPRHO:   EQU         $
         FLD         XFA2
         FMP         VARU
         FMP         VARU
         FDV         FK
         FDV         FK
         FST         FWORK
         FLD         XFA3
         FMP         VARV
         FMP         VARV
         FDV         FK
         FDV         FK
         FAD         FWORK
         FAD         F1
         FST         RHO2P1          < RHO2P1=1+A2*VARU**2+A3*VARV**2.
         RSR
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
<
< ENTREE DES PARAMETRES :
<
         CPZ         PREM            < EST-CE LE PREMIER PASSAGE ???
         JGE         SPU1            < NON, INUTILE...
         IC          PREM            < OUI, ON LE MEMORISE, ET ON ENTRE :
         LXI         A0
         BSR         ASPCT
         FST         XFA0
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
         LXI         A3
         BSR         ASPCT
         FST         XFA3
         LXI         A4
         BSR         ASPCT
         FST         XFA4
         LXI         A5
         BSR         ASPCT
         FST         XFA5
         LXI         A6
         BSR         ASPCT
         FST         XFA6
         LXI         A7
         BSR         ASPCT
         FST         XFA7
<
< CALCUL DE 'X' :
<
SPU1:    EQU         $
         BSR         ASPRHO
         FLD         XFA4            < A4,
         FMP         VARU            < A4*U,
         BSR         ASFWOR
         FLD         XFA5            < A5,
         FMP         VARV            < A5*V,
         BSR         APWORK          < A4*U+A5*V,
         FMP         XFA0            < A0*(A4*U+A5*V),
         FDV         FK
         FDV         RHO2P1          < +A0*(A4*U+A5*V)/RHO2P1.
         FST         FWORK
         FLD         VARU            < ET ENFIN, "DEFORMATION" DE 'U',
         FDV         FK
         FAD         FWORK           < PAR TRANSLATION...
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
<
< CALCUL DE 'Y' :
<
         BSR         ASPRHO
         FLD         XFA6            < A6,
         FMP         VARU            < A6*U,
         BSR         ASFWOR
         FLD         XFA7            < A7,
         FMP         VARV            < A7*V,
         BSR         APWORK          < A6*U+A7*V,
         FMP         XFA1            < A1*(A6*U+A7*V),
         FDV         FK
         FDV         RHO2P1          < +A1*(A6*U+A7*V)/RHO2P1.
         FST         FWORK
         FLD         VARV            < ET ENFIN, "DEFORMATION" DE 'V',
         FDV         FK
         FAD         FWORK           < PAR TRANSLATION...
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
<
< CALCUL DE 'Z' :
<
         FLD         F0
         RSR
:F
:F
< <<'SIOT VASARELY 1'
DF'SIOT VASARELY 2'
ED'SIOT VASARELY 2'
IN0
         PAGE
         IDP         "SIOT VASARELY 2"
<
<
<        F O N C T I O N   " V A S A R E L Y   2 "  :
<
<
<        MODELE :
<                      ON CONSIDERE LE VECTEUR
<                    DEPLACEMENT SUIVANT :
<
<                                    U=(A0+A4*X+A5*Y)/RAC(RHO),
<                                    V=(A1+A6*X+A7*Y)/RAC(RHO),
<                                    W=0,
<                    AVEC :
<                                    RHO=A8+A2*(X**2)+A3*(Y**2).
<                    EN REALITE, LE SIGNE AFFECTE
<                    AUX COMPOSANTES DU VECTEUR
<                    DEPLACEMENT EST CELUI DES
<                    COORDONNEES : 'U' EST DU SIGNE
<                    DE 'X' ET 'V' DE CELUI DE
<                    'Y'...
<                    ET :
<                                    (A4,A5,A6,A7) EST UNE MATRICE
<                                    DE TRANSFORMATION QUI PERMET
<                                    PAR EXEMPLE DE FAIRE TOURNER
<                                    LA DEFORMATION, EN PRENANT :
<
<                                    A4=COS(TETA),
<                                    A5=-SIN(TETA),
<                                    A6=SIN(TETA),
<                                    A7=COS(TETA)...
<
<
<        PARAMETRES :
A0::     VAL         0
A1::     VAL         A0+1
A2::     VAL         A1+1            < COEFFICIENT DE X2,
A3::     VAL         A2+1            < COEFFICIENT DE Y2,
A4::     VAL         A3+1            < MATRICE
A5::     VAL         A4+1            <         DE TRANSFORMATION
A6::     VAL         A5+1            <                           DES
A7::     VAL         A6+1            <                               (X,Y).
A8::     VAL         A7+1
<
<
         LOCAL
FLOC:    EQU         $
<
< CONSTANTES :
<
PREM:    WORD        -1              < INDICATEUR DE PREMIER PASSAGE...
XFA0:    FLOAT       0
XFA1:    FLOAT       0
XFA2:    FLOAT       0
XFA3:    FLOAT       0
XFA4:    FLOAT       0
XFA5:    FLOAT       0
XFA6:    FLOAT       0
XFA7:    FLOAT       0
XFA8:    FLOAT       0
<
< RELAIS DIVERS :
<
RHO2P1:  FLOAT       0
ASPRHO:  WORD        SPRHO           < CALCUL DU RAYON POLAIRE.
         PROG
<
<
<        C A L C U L   D E   R H O * * 2 + 1  :
<
<
SPRHO:   EQU         $
         FLD         XFA2            < A2,
         FMP         VARU            < A2*X,
         FMP         VARU            < A2*X*X,
         FDV         FK
         FDV         FK
         FST         FWORK
         FLD         XFA3            < A3,
         FMP         VARV            < A3*Y,
         FMP         VARV            < A3*Y*Y,
         FDV         FK
         FDV         FK
         FAD         FWORK           < A2*X*X+A3*Y*Y,
         FAD         XFA8            < A8+A2*X*X+A3*Y*Y,
         BSR         ARAC            < RAC(A8+A2*X*X+A3*Y*Y),
         FST         RHO2P1          < ET RANGEMENT...
         RSR
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
<
< ENTREE DES PARAMETRES :
<
         CPZ         PREM            < EST-CE LE PREMIER PASSAGE ???
         JGE         SPU1            < NON, INUTILE...
         IC          PREM            < OUI, ON LE MEMORISE, ET ON ENTRE :
         LXI         A0
         BSR         ASPCT
         FST         XFA0
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         LXI         A2
         BSR         ASPCT
         FST         XFA2
         LXI         A3
         BSR         ASPCT
         FST         XFA3
         LXI         A4
         BSR         ASPCT
         FST         XFA4
         LXI         A5
         BSR         ASPCT
         FST         XFA5
         LXI         A6
         BSR         ASPCT
         FST         XFA6
         LXI         A7
         BSR         ASPCT
         FST         XFA7
         LXI         A8
         BSR         ASPCT
         FST         XFA8
<
< CALCUL DE 'X' :
<
SPU1:    EQU         $
         BSR         ASPRHO
         FLD         XFA4            < A4,
         FMP         VARU            < A4*U,
         BSR         ASFWOR
         FLD         XFA5            < A5,
         FMP         VARV            < A5*V,
         BSR         APWORK          < A4*U+A5*V,
         FAD         XFA0            < (A0+A4*U+A5*V),
         FDV         FK
         FDV         RHO2P1          < +(A0+A4*U+A5*V)/RHO2P1.
         FST         FWORK
         FLD         VARU            < ET ENFIN, "DEFORMATION" DE 'U',
         FDV         FK
         FCMZ        VARU            < QUEL EST LE SIGNE DE 'X' ???
         JE          SPU3            < NUL, ON L'IGNORE...
         JG          SPU2            < POSITIF...
         FSB         FWORK           < NEGATIF, ON RETRANCHE LE DEPLACEMENT...
         JMP         SPU3
SPU2:    EQU         $
         FAD         FWORK           < POSITIF, ON AJOUTE LE DEPLACEMENT...
SPU3:    EQU         $
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
<
< CALCUL DE 'Y' :
<
         BSR         ASPRHO
         FLD         XFA6            < A6,
         FMP         VARU            < A6*U,
         BSR         ASFWOR
         FLD         XFA7            < A7,
         FMP         VARV            < A7*V,
         BSR         APWORK          < A6*U+A7*V,
         FAD         XFA1            < (A1+A6*U+A7*V),
         FDV         FK
         FDV         RHO2P1          < +(A1+A6*U+A7*V)/RHO2P1.
         FST         FWORK
         FLD         VARV            < ET ENFIN, "DEFORMATION" DE 'V',
         FDV         FK
         FCMZ        VARV            < QUEL EST LE SIGNE DE 'Y' ???
         JE          SPV3            < NUL, ON L'IGNORE...
         JG          SPV2            < POSITIF...
         FSB         FWORK           < NEGATIF, ON RETRANCHE LE DEPLACEMENT...
         JMP         SPV3
SPV2:    EQU         $
         FAD         FWORK           < POSITIF, ON AJOUTE LE DEPLACEMENT...
SPV3:    EQU         $
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
<
< CALCUL DE 'Z' :
<
         FLD         F0
         RSR
:F
:F
< <<'SIOT VASARELY 2'
DF'SIOT X2+X P'
ED'SIOT X2+X P'
IN0
         PAGE
         IDP         "SIOT X2+X P"
<
<
<        F O N C T I O N   X * * 2 + X   P  :
<
<
<        MODELE :
<                      ON CALCULE LE VECTEUR DE COMPOSANTES
<                    (U,V,W) TELLES QUE :
<                    U=P**2+P SI P**2+P<0,
<                     =0 SINON...
<                    V=0,
<                    W=0,
<                      AVEC :
<                    P=X-T.
<
<
         LOCAL
FLOC:    EQU         $
FWORKX:  FLOAT       0               < TRAVAIL...
FM1:     FLOAT       -1
         PROG
<
<
<        C O M P O S A N T E   U  :
<
<
SPU:     EQU         $
         FLD         VARU
         FSB         VART            < ON FORME U-T,
         FST         FWORKX          < U-T,
         FMP         FWORKX          < (U-T)**2,
         FAD         FWORKX          < (U-T)**2+(U-T),
         FCAZ
         JG          SPU1            < SI FONCTION>0 : ON L'ANNULE...
SPU2:    EQU         $
         RSR
SPU1:    EQU         $
         FLD         F0              < CAS OU LA FONCTION EST NULLE...
         JMP         SPU2
<
<
<        C O M P O S A N T E   V  :
<
<
SPV:     EQU         $
         FLD         F0              < ELLE EST NULLE...
         RSR
<
<
<        C O M P O S A N T E   W  :
<
<
SPW:     EQU         $
         FLD         F0              < ELLE EST NULLE...
         RSR
:F
:F
< <<'SIOT X2+X P'
DF'SIOT X2+X P 2'
ED'SIOT X2+X P 2'
IN0
         PAGE
         IDP         "SIOT X2+X P 2"
<
<
<        F O N C T I O N S   X * * 2 + X   P  :
<
<
<        MODELE :
<                      ON CALCULE LE VECTEUR DE COMPOSANTES
<                    (U,V,W) TELLES QUE :
<                    U=P**2+P SI P**2+P<0 0 SINON
<                      +Q**2+Q SI Q**2+Q<0 0 SINON.
<                    V=0,
<                    W=0,
<                      AVEC :
<                    P=U-T.
<                    Q=-U-T+2.
<
<
         LOCAL
FLOC:    EQU         $
FWORKX:  FLOAT       0               < TRAVAIL...
FM1:     FLOAT       -1
FPOLM1:  FLOAT       <+NPOLM1+1<0<0
         PROG
<
<
<        C O M P O S A N T E   U  :
<
<
SPU:     EQU         $
         FLD         VARU
         FSB         VART            < ON FORME U-T,
         FST         FWORKX          < U-T,
         FMP         FWORKX          < (U-T)**2,
         FAD         FWORKX          < (U-T)**2+(U-T),
         FCAZ
         JLE         SPU1            < FONCTION NEGATIVE...
         FLD         F0              < SI POSITIVE, ON L'ANNULLE...
SPU1:    EQU         $
         FST         FWORK
         FLD         FPOLM1
         FMP         KFU             < EN GENERAL 2=256/128...
         FSB         VARU
         FSB         VART
         FST         FWORKX          < -U-T+2,
         FMP         FWORKX          < (-U-T+2)**2,
         FAD         FWORKX          < (-U-T+2)**2+(-U-T+2).
         FCAZ
         JLE         SPU2            < FONCTION NEGATIVE...
         FLD         F0              < SI POSITIVE, ON L'ANNULE...
SPU2:    EQU         $
         FAD         FWORK           < CUMUL DES 2 FONCTIONS...
         RSR
<
<
<        C O M P O S A N T E   V  :
<
<
SPV:     EQU         $
         FLD         F0              < ELLE EST NULLE...
         RSR
<
<
<        C O M P O S A N T E   W  :
<
<
SPW:     EQU         $
         FLD         F0              < ELLE EST NULLE...
         RSR
:F
:F
< <<'SIOT X2+X P 2'
DF'SIOT X2+X S'
ED'SIOT X2+X S'
IN0
         PAGE
         IDP         "SIOT X2+X S"
<
<
<        F O N C T I O N   X * * 2 + X   S  :
<
<
<        MODELE :
<                      ON CALCULE LE VECTEUR DE COMPOSANTES
<                    (U,V,W) TELLES QUE :
<                    U=0,
<                    V=P**2+P SI P**2+P<0,
<                     =0 SINON...
<                    W=0,
<                      AVEC :
<                    P=X-T.
<
<
         LOCAL
FLOC:    EQU         $
FWORKX:  FLOAT       0               < TRAVAIL...
FM1:     FLOAT       -1
         PROG
<
<
<        C O M P O S A N T E   U  :
<
<
SPU:     EQU         $
         FLD         F0              < ELLE EST NULLE...
         RSR
<
<
<        C O M P O S A N T E   V  :
<
<
SPV:     EQU         $
         FLD         VARU
         FSB         VART            < ON FORME U-T,
         FST         FWORKX          < U-T,
         FMP         FWORKX          < (U-T)**2,
         FAD         FWORKX          < (U-T)**2+(U-T),
         FCAZ
         JG          SPV1            < SI FONCTION>0 : ON L'ANNULE...
SPV2:    EQU         $
         RSR
SPV1:    EQU         $
         FLD         F0              < CAS OU LA FONCTION EST NULLE...
         JMP         SPV2
<
<
<        C O M P O S A N T E   W  :
<
<
SPW:     EQU         $
         FLD         F0              < ELLE EST NULLE...
         RSR
:F
:F
< <<'SIOT X2+X S'
DF'SIOT Y/(X2+1)'
ED'SIOT Y/(X2+1)'
IN0
         PAGE
         IDP         "SIOT Y/(X2+1)"
<
<
<        F O N C T I O N   Y / ( X * * 2 + 1 )  :
<
<
<        FONCTION :
<                      ON CALCULE LE VECTEUR DEPLACEMENT :
<                    U=0,
<                    V=Y/(X**2+1),
<                    W=0.
<                      CELA DONNE UNE TRANSFORMATION EXAGERANT
<                    LE CENTRE DE L'IMAGE SUIVANT UNE DIRECTION
<                    VERTICALE (CF. LE 'Y' MULTIPLICATEUR DE
<                    DE 1/(X**2+1) ). CELA DONNE UNE SORTE
<                    DE BOURSOUFLURE...
<
<
         LOCAL
FLOC:    EQU         $
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         FLD         F0
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         VARU
         FMP         VARU
         FAD         F1
         FST         FWORK
         FLD         VARV
         FDV         FWORK
         RSR
<
<
<        C O M P O S A N T E   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT Y/(X2+1)'
DF'SIOT Z**ALPHA 1'
ED'SIOT Z**ALPHA 1'
IN0
         PAGE
         IDP         "SIOT Z**ALPHA 1"
<
<
<        T R A N S F O R M A T I O N   Z = Z * * A L P H A  :
<        FONCTION :
<                      CALCULE UNE GENEREALISATION
<                    DE LA TRANSFORMATION COMPLEXE
<                    Z=Z**ALPHA, TELLE QUE :
<
<                                    X=(RHO**ALPHR)*COS(ALPHT*TETA),
<                                    Y=(RHO**ALPHR)*SIN(ALPHT*TETA),
<
<                    OU LES EXPOSANTS DE RHO ET TETA
<                    SONT DIFFERENTS L'UN DE L'AUTRE...
<
<
<
<
<        ARGUMENT :
A0::     VAL         0               < EXPOSANT 'ALPHR'...
A1::     VAL         A0+1            < EXPOSANT 'ALPHT'...
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
<
< CONSTANTES :
<
PREM:    WORD        -1              < INDICATEUR DE PREMIER PASSAGE...
ALPHR:   FLOAT       0               < EXPOSANT DE 'RHO',
ALPHT:   FLOAT       0               < EXPOSANT DE 'TETA'.
FRHO:    FLOAT       0               < MODULE DE Z=U+I*V:
                                     < RHO=RAC(U*U+V*V).
FTETA:   FLOAT       0               < ARGUMENT DE Z=U+I*V :
                                     < TETA=ARCTG(V/U).
FINFIN:  FLOAT       1000000         < INFINI...
<
< RELAIS DE SOUS-PROGRAMMES :
<
ARAK:    WORD        RAK             < CALCUL D'UNE PUISSANCE QUELCONQUE.
AARCTG:  WORD        ARCTG           < CALCUL D'UN ARC-TANGENTE.
<
< POUR LE CALCUL DU LOGARITHME :
<
ZZZ001:  FLOAT       0               < NB FLOTTANT
ZZZ002:  FLOAT       0
ZZZ003:  FLOAT       0
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:  WORD        0               < 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...
<
< DONNEES POUR LE CALCUL DE ARCTG :
<
ATGLOC:  EQU         $
ATGT1:   FLOAT       0               < ZONE DE TRAVAIL 1.
ATGT2:   FLOAT       0               < ZONE DE TRAVAIL 2.
ATGT3:   FLOAT       0               < ZONE DE TRAVAIL 3.
ATGSDX:  WORD        0               < INDICATEUR "SIGNE DE X ARGUMENT":
                                     < = 0 : POSITIF OU NUL;
                                     < < 0 : NEGATIF.
ATGPSC:  FLOAT       0.0548862
                                     < ^^ TG(PI/12).
ATGPS2:  FLOAT       1.5707963
                                     < ^^ PI/2.
ATGPS3:  FLOAT       1.0471975
                                     < ^^ PI/3.
ATGPS6:  FLOAT       0.5235988
                                     < ^^ PI/6.
ATGUN:   FLOAT       1.0
ATGR3:   FLOAT       1.7320508
                                     < ^^ RACINE DE 3.
ATGP1:   FLOAT       0.6031058       < COEFFICIENT
ATGP2:   FLOAT       0.0516045       <             DU
ATGP3:   FLOAT       0.5591371       <                POLYNOME
ATGP4:   FLOAT       1.4087812       <                         ARCTG(X)=...
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         CPZ         PREM            < EST-CE LA PREMIERE FOIS ???
         JGE         SPU1            < CAS DES FOIS SUIVANTES...
<
< CAS DE LA PREMIERE FOIS :
<
         IC          PREM            < ON LE MEMORISE...
         LXI         A0
         BSR         ASPCT
         FST         ALPHR           < ENTREE DE L'EXPOSANT DE 'RHO',
         LXI         A1
         BSR         ASPCT
         FST         ALPHT           < ET DE 'TETA'...
<
< CALCUL DE X=(RHO**ALPHR)*COS(ALPHT*TETA) :
<
SPU1:    EQU         $
         FLD         VARU            < U,
         FMP         VARU            < U*U,
         BSR         ASFWOR
         FLD         VARV            < V,
         FMP         VARV            < V*V,
         BSR         APWORK          < U*U+V*V,
         BSR         ARAC            < RAC(U*U+V*V),
         FST         FRHO            < CALCUL DU MODULE DE U+I*V...
         FLD         FINFIN          < AU CAS OU U=0 :
         FCMZ        VARV            < ET V ???
         JGE         SPU3            < POSITIF...
         BSR         AFNEG           < NEGATIF, ON INVERSE L'INFINI...
SPU3:    EQU         $
         FCMZ        VARU            < U=0 ???
         JE          SPU2            < ET OUI : V/U=INFINI...
         FLD         VARV            < V,
         FDV         VARU            < V/U,
SPU2:    EQU         $
         BSR         AARCTG          < ARCTG(V/U),
         FST         FTETA           < CALCUL DE L'ARGUMENT DE U+I*V...
         FMP         ALPHT           < ALPHT*TETA,
         BSR         ACOS            < COS(ALPHT*TETA),
         BSR         ASFWOR
         FLD         FRHO            < RHO,
         BSR         ARAK            < RHO**ALPHR,
         FMP         FWORK           < X=(RHO**ALPHR)*COS(ALPHT*TETA).
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
<
< CALCUL DE Y=(RHO**ALPHR)*SIN(ALPHT*TETA) :
<
         FLD         VARU            < U,
         FMP         VARU            < U*U,
         BSR         ASFWOR
         FLD         VARV            < V,
         FMP         VARV            < V*V,
         BSR         APWORK          < U*U+V*V,
         BSR         ARAC            < RAC(U*U+V*V),
         FST         FRHO            < CALCUL DU MODULE DE U+I*V...
         FLD         FINFIN          < AU CAS OU U=0 :
         FCMZ        VARV            < ET V ???
         JGE         SPV2            < POSITIF...
         BSR         AFNEG           < NEGATIF, ON INVERSE L'INFINI...
SPV2:    EQU         $
         FCMZ        VARU            < U=0 ???
         JE          SPV1            < ET OUI : V/U=INFINI...
         FLD         VARV            < V,
         FDV         VARU            < V/U,
SPV1:    EQU         $
         BSR         AARCTG          < ARCTG(V/U),
         FST         FTETA           < CALCUL DE L'ARGUMENT DE U+I*V...
         FMP         ALPHT           < ALPHT*TETA,
         BSR         ASIN            < SIN(ALPHT*TETA),
         BSR         ASFWOR
         FLD         FRHO            < RHO,
         BSR         ARAK            < RHO**ALPHR,
         FMP         FWORK           < X=(RHO**ALPHR)*SIN(ALPHT*TETA).
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         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 E   L ' E X P O S A N T  :
<
<
         FMP         ALPHR           < ET ON CALCULE ALPHR*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
         LAI         0
         RBT         8
         LBI         0
         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
<
<
<        C A L C U L   D E   A R C T G  :
<
<
<        ARGUMENT :
<                    (A,B)=TG(TETA),
<
<
<        RESULTAT :
<                    (A,B)=TETA.
<
<
ARCTG:   EQU         $               < E N T R Y   ' A R C T G ( X ) '.
         STZ         ATGSDX          < X ARGUMENT POSITIF OU NUL A PRIORI.
         BSR         AFCAZ
         JGE         ARCTG1
         DC          ATGSDX          < X ARGUMENT NEGATIF.
ARCTG1:  EQU         $
         BSR         AFABS           < U = ABS(X).
         FCAM        ATGUN
         JGE         ARCTG2
<
< U < 1 : J RECOIT 0.
<
         LXI         0
         JMP         ARCTG3
ARCTG2:  EQU         $
<
< U >= 1 : J RECOIT 2 ET U RECOIT 1/U.
<
         LXI         2               < J = 2.
         FST         ATGT1
         FLD         ATGUN
         FDV         ATGT1           < U = 1/U.
ARCTG3:  EQU         $
         FCAM        ATGPSC          < COMPARER U A TG(PI/12).
         JG          ARCTG4
<
< U <= TG(PI/12) : J RECOIT J+2.
<
         ADRI        2,X             < J = J + 2.
         JMP         ARCTG5
ARCTG4:  EQU         $
<
< U > TG(PI/12) : J RECOIT J+1 ET
< U RECOIT  (U * RACINE(3) - 1) / (RACINE(3) + U).
<
         ADRI        1,X             < J = J + 1.
         FST         ATGT1
         FMP         ATGR3
         FSB         ATGUN
         PSR         A,B
         FLD         ATGR3
         FAD         ATGT1
         FST         ATGT1
         PLR         A,B
         FDV         ATGT1           < U=(U*RACINE(3)-1)/(RACINE(3)+U).
ARCTG5:  EQU         $
<
< FORMER Y = U * P(U ** 2) LES COEFFICIENTS DU POLYNOME ETANT ATGP1, ATGP2
< ATGP3 ET ATGP4. ON CALCULE :
< Y = U * (P1 - P2 * U ** 2 + (P3 / (P4 + U ** 2)).
<
         FST         ATGT1           < TRAV1 = U.
         FMP         ATGT1
         FST         ATGT3           < TRAV3 = U ** 2.
         FAD         ATGP4
         FST         ATGT2
         FLD         ATGP3
         FDV         ATGT2
         FAD         ATGP1
         PSR         A,B
         FLD         ATGP2
         FMP         ATGT3
         FST         ATGT3
         PLR         A,B
         FSB         ATGT3           < Y = P(U ** 2).
         FMP         ATGT1           < Y = U * P( U ** 2).
         FST         ATGT1           < TRAV1 = U * P (U ** 2).
<
< BRANCHEMENT SELON VALEUR DE J (REGISTRE 'X').
<
         ADRI        -2,X
         CPZR        X
         JE          ARCTG6
         JL          ARCTG7
         ADRI        -1,X
         CPZR        X
         JE          ARCTG8
<
< FAIRE Y = PI / 2 - Y.
<
         FLD         ATGPS2
         JMP         ARCTG9
ARCTG8:  EQU         $
<
< FAIRE Y = PI / 3 - Y.
<
         FLD         ATGPS3
ARCTG9:  EQU         $
         FSB         ATGT1           < - Y.
         JMP         ARCTG6
ARCTG7:  EQU         $
<
< FAIRE Y = PI / 6 + Y.
<
         FAD         ATGPS6
ARCTG6:  EQU         $
<
< AFFECTER A Y LE SIGNE DU X ARGUMENT.
<
         CPZ         ATGSDX          < SIGNE DU X ARGUMENT.
         JL          ARCTGA
<
< X ARGUMENT POSITIF OU NUL, IL FAUT QUE Y LE SOIT.
<
         BSR         AFCAZ
         JGE         ARCTGB
         BSR         AFNEG
         JMP         ARCTGB
ARCTGA:  EQU         $
<
< X ARGUMENT NEGATIF, IL FAUT QUE Y LE SOIT.
<
         BSR         AFCAZ
         JL          ARCTGB
         BSR         AFNEG
ARCTGB:  EQU         $
         FCMZ        VARU            < EST-ON A DROITE OU A GAUCHE DE 'V' ???
         JGE         ARCTGC          < A DROITE...
         FAD         PI3141          < A GAUCHE...
ARCTGC:  EQU         $
         RSR
:F
:F
< <<'SIOT Z**ALPHA 1'
DF'SIOT ZOOM 1'
ED'SIOT ZOOM 1'
IN0
         PAGE
         IDP         "SIOT ZOOM 1"
<
<
<        Z O O M   1  :
<
<
<        FONCTION :
<                      CE MODULE REALISE UN ZOOM
<                    DE RAPPORT QUELCONQUE.
<
<
<        ARGUMENTS :
A0::     VAL         0               < RAPPORT SUR OX,
A1::     VAL         A0+1            < RAPPORT SUR OY.
<
<
         LOCAL
FLOC:    EQU         $
PREM:    WORD        0               < INDICATEUR DE PREMIER PASSAGE.
XFA0:    FLOAT       0               < RAPPORT SUR OX,
XFA1:    FLOAT       0               < RAPPORT SUR OY.
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         CPZ         PREM            < EST-CE LE PREMIER PASSAGE ???
         JG          SPU1            < NON...
         IC          PREM            < OUI...
<
< ENTREE DES RAPPORTS :
<
         LXI         A0
         BSR         ASPCT
         FST         XFA0            < RAPPORT SUR OX,
         LXI         A1
         BSR         ASPCT
         FST         XFA1            < RAPPORT SUR OY.
<
< ZOOM SUR OX :
<
SPU1:    EQU         $
         FLD         VARU
         FMP         XFA0
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
<
< ZOOM SUR OY :
<
         FLD         VARV
         FMP         XFA1
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIOT ZOOM 1'
DF'SIOT ROTATE CONF 1'
ED'SIOT ROTATE CONF 1'
IN0
         PAGE
         IDP         "SIOT ROTATE CONF 1"
<
<
<        R O T A T I O N   C O N F O R M E   1  :
<
<
<        FONCTION :
<                      CE MODULE PERMET D'EFFECTUER
<                    DES ROTATIONS "CONSERVATIVES",
<                    C'EST-A-DIRE CONFORMES : ELLES
<                    CONSERVENT LES CERCLES ET LES
<                    ANGLES ; ON COMMENCE PAR ENTRER
<                    CONVERSATIONNELLEMENT LA DEFINI-
<                    TION DE LA ROTATION PAR 3 POINTS
<                    (A,O,B), 'O' ETANT LE CENTRE
<                    DE LA ROTATION...
<                      4 COMMANDES SONT DISPONIBLES :
<                    "A", "O" ET "B" POUR DEFINIR
<                    LES 3 POINTS (A,O,B), ET "F" EN
<                    FIN DE DEFINITION, QUI EST D'AILLEURS
<                    REFUSEE SI L'UN DES 3 POINTS N'A
<                    PAS ETE DEFINI (C'EST-A-DIRE SI
<                    SON ABSCISSE EST NULLE...).
<
<
<        ARGUMENTS :
A0::     VAL         0               < PARAMETRE DE COMPENSATION DU FORMAT
                                     < RECTANGULAIRE DE LA TELEVISION ; EN
                                     < GENERAL : A0=3/4.
A1::     VAL         A0+1            < PARAMETRE DE COMPENSATION DE DISTORSIONS
                                     < DE REGLAGE ; SI L'IMAGE EST UNE IMAGE
                                     < ENTREE PAR CAMERA : A1=20/19 (BASE 10),
                                     < SINON, A1=1...
A2::     VAL         A1+1            < =0 : EFFACER L'ECRAN AVANT,
                                     < #0 : LE LAISSER TEL QUEL...
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
<
< INDICATEUR DE PREMIERE FOIS :
<
IPREM:   WORD        -1
<
< DONNEES D'ACCES AU CURSEUR GRAPHIQUE :
<
CURSOR:  BYTE        "N";0           < CARACTERE DE DEBLOCAGE DU
                                     < CURSEUR (ERREUR A PRIORI).
         DZS         2               < COORDONNEES Y ET X.
OG:      WORD        '0103           < OPEN GRAPHIQUE DE '01.
CU:      WORD        '0106           < MISE EN FONCTION DU CURSEUR
         WORD        0               < GRAPHIQUE DE '01 (AMDEM=0).
LCU:     WORD        '0109           < LECTURE CURSEUR GRAPHIQUE
         WORD        CURSOR-ZERO*2   < DE '01.
         WORD        6
CG:      WORD        '0104           < CLOSE GRAPHIQUE DE '01.
<
< FORMAT DE L'IMAGE :
<
C3:      WORD        3               < POUR ACCEDER A
C4:      WORD        4               <                L'IMAGE ENTIERE...
ANLIG:   WORD        NLIGM1          < NOMBRE DE LIGNES-1 DE L'IMAGE,
NMPL:    WORD        CNMPL           < NOMBRE DE POINTS PAR LIGNE...
ARAZI:   WORD        0               < POUR RAZER L'ECRAN...
<
< POINTS ARGUMENTS :
<
FXA:     FLOAT       0               < X(A),
FYA:     FLOAT       0               < Y(A).
FXO:     FLOAT       0               < X(O),
FYO:     FLOAT       0               < Y(O).
FXB:     FLOAT       0               < X(B),
FYB:     FLOAT       0               < Y(B).
FX1:     FLOAT       0               < X1=XA-XO.
FY1:     FLOAT       0               < Y1=YA-YO.
FX2:     FLOAT       0               < X2=XB-XO.
FY2:     FLOAT       0               < Y2=YB-YO.
FMODUL:  FLOAT       0               < PRODUIT DU MODULE DES VECTEURS BA ET BC.
<
< MATRICE DE ROTATION :
<
FMA11:   FLOAT       0
FMA12:   FLOAT       0
FMA21:   FLOAT       0
FMA22:   FLOAT       0
FXBENT:  FLOAT       0               < CENTRE DE
FYBENT:  FLOAT       0               <           LA ROTATION.
<
< VARIABLES DE TRAVAIL :
<
FWORK4:  FLOAT       0
FWORK5:  FLOAT       0
FWORK6:  FLOAT       0
<
< ARGUMENTS :
<
XFA0:    FLOAT       0               < 'A0'.
XFA1:    FLOAT       0               < 'A1'.
<
< RELAIS :
<
ACLIGN:  WORD        CLIGN           < CLIGNOTTEMENT D'UN POINT (X,Y)...
ASPU1:   WORD        SPU1            < RELAI...
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         CPZ         IPREM           < EST-CE LA PREMIERE FOIS ???
         JL          SPU2            < OUI, ALLONS INITIALISER...
         BR          ASPU1           < NON, ALLONS TRANSFORMER...
SPU2:    EQU         $
         IC          IPREM           < MEMORISONS CETTE INITIALISATION...
<
< ENTREE DES PARAMETRES :
<
         LXI         A0
         BSR         ASPCT
         FST         XFA0
         FCAZ
         JE          $               < A CAUSE DES DIVISIONS PAR 0...
         LXI         A1
         BSR         ASPCT
         FST         XFA1
         FCAZ
         JE          $               < A CAUSE DES DIVISIONS PAR 0...
<
< ENTREE DE LA DEFINITION DE LA ROTATION :
<
CUR1:    EQU         $
         LAD         OG
         SVC         0               < OPEN GRAPHIQUE.
         LAD         CU
         SVC         0               < MISE EN FONCTION CURSEUR.
         LAD         LCU
         SVC         0               < LECTURE DU CURSEUR.
<
<        NOTA :
<                      ON NE TESTE PAS LES ERREURS
<                    EN RETOUR (CAS DU PASSAGE EN
<                    BATCH...), CAR 'CURSOR' EST INITIALISE
<                    PAR 'N'.
<
         LA          CURSOR+1        < Y(CURSEUR).
         MP          C4              < MISE AU
         DV          C3              <         FORMAT TELEVISION...
         SLRS        DEDY            < REDUCTION VIDEO.
         SB          ANLIG           < LES AXES GRAPHIQUES ET
                                     < VIDEOS SONT INVERES.
         NGR         A,Y             < Y=Y(CURSEUR VIDEO).
         LA          CURSOR+2        < X(CURSEUR).
         SLRS        DEDX            < REDUCTION VIDEO.
         LR          A,X             < X=X(CURSEUR VIDEO).
         BSR         ACLIGN          < CLIGNOTEMENT DU POINT (X,Y).
         LBY         CURSOR          < A=COMMANDE ASSOCIEE.
<
< ANALYSE DE LA COMMANDE, SONT RECONNUES :
<
<                    "A" : DEFINITION DU PREMIER POINT,
<                    "O" : DEFINITION DU DEUXIEME POINT (SOMMET DE L'ANGLE),
<                    "B" : DEFINITION DU TROISIEME POINT,
<                    "F" : FIN DE DEFINITION.
<
         CPI         "F"
         JE          CUR2            < FIN DE L'ENTREE DES POINTS...
         CPI         "A"
         JE          CUR3            < ENTREE DU 1ER POINT (A),
         CPI         "O"
         JE          CUR4            < ENTREE DU 2EME POINT (SOMMET O),
         CPI         "B"
         JNE         CUR1            < ERREUR...
<
< ENTREE DU 3EME POINT (B) :
<
CUR5:    EQU         $
         LR          X,A
         BSR         AFLT
         FST         FXB             < X(B),
         LR          Y,A
         BSR         AFLT
         FST         FYB             < Y(B).
         JMP         CUR1            < VERS LA COMMANDE SUIVANTE...
<
< ENTREE DU 1ER POINT (A) :
<
CUR3:    EQU         $
         LR          X,A
         BSR         AFLT
         FST         FXA             < X(A),
         LR          Y,A
         BSR         AFLT
         FST         FYA             < Y(A).
         JMP         CUR1            < VERS LA COMMANDE SUIVANTE...
<
< ENTREE DU SOMMET (O) :
<
CUR4:    EQU         $
         LR          X,A
         BSR         AFLT
         FST         FXO             < X(O),
         LR          Y,A
         BSR         AFLT
         FST         FYO             < Y(O).
         JMP         CUR1            < VERS LA COMMANDE SUIVANTE...
<
< FIN DES COMMANDES :
<
CUR2:    EQU         $
         LAD         CG
         SVC         0               < ON NE SAIT JAMAIS...
         FCMZ        FXA
         JE          CUR1            < ON INTERDIT LES COORDONNEES NULLES, ON
                                     < VALIDE AINSI QUE LES 3 POINTS (A,O,B)
                                     < ONT ETE INITIALISE...
         FCMZ        FXO
         JE          CUR1
         FCMZ        FXB
         JE          CUR1            < (NOTA : INUTILE DE VALIDER 'Y'...)
<
< EFFACEMENT DE L'ECRAN :
<
         LXI         A2
         BSR         ASPCT
         BSR         AROND
         JANE        SPU3            < ON LE LAISSE TEL QUEL...
         LRM         A,B,X
         WORD        0               < (A)=ADRESSE RELATIVE A 'MEMTV',
         WORD        ARAZI           < (B)=ADRESSE DU MOT DEC CLEAR,
         WORD        LIMAG*NCOOL     < (X)=NOMBRE DE MOTS A EFFACER...
SPU4:    EQU         $
         PSR         X
         LXI         1
         WCDA
         ADRI        1,A             < PASSAGE AU MOT SUIVANT...
         PLR         X
         JDX         SPU4
SPU3:    EQU         $
<
< CALCUL DE L'ANGLE 'TETA' :
<
         FLD         FXA             < XA,
         FSB         FXO             < XA-XO,
         BSR         ASFWOR
         FMP         FWORK           < (XA-XO)**2,
         FST         FWORK5
         FLD         FYA             < YA,
         FSB         FYO             < YA-YO,
         BSR         ASFWOR
         FMP         FWORK           < (YA-YO)**2,
         FAD         FWORK5          < (XA-XO)**2+(YA-YO)**2,
         BSR         ARAC            < RAC((XA-XO)**2+(YA-YO)**2),
         FST         FWORK5
         FLD         FXB             < XB,
         FSB         FXO             < XB-XO,
         BSR         ASFWOR
         FMP         FWORK           < (XB-XO)**2,
         FST         FWORK6
         FLD         FYB             < YB,
         FSB         FYO             < YB-YO,
         BSR         ASFWOR
         FMP         FWORK           < (YB-YO)**2,
         FAD         FWORK6          < (XB-XO)**2+(YB-YO)**2,
         BSR         ARAC            < RAC((XB-XO)**2+(YB-YO)**2),
         FMP         FWORK5          < RAC((XA-XO)**2+(YA-YO)**2)*RAC(
                                     < (XB-XO)**2+(YB-YO)**2),
         FST         FMODUL
         FLD         FXA             < XA,
         FSB         FXO             < XA-XO,
         FST         FX1             < X1=XA-XO,
         FLD         FXB             < XB,
         FSB         FXO             < XB-XO,
         FST         FX2             < X2=XB-XO,
         FMP         FX1             < (XA-XO)*(XB-XO),
         FST         FWORK4
         FLD         FYA             < YA,
         FSB         FYO             < YA-YO,
         FST         FY1             < Y1=YA-YO,
         FLD         FYB             < YB,
         FSB         FYO             < YB-YO,
         FST         FY2             < Y2=YB-YO,
         FMP         FY1             < (YA-YO)*(YB-YO),
         FAD         FWORK4          < (XA-XO)*(XB-XO)+(YA-YO)*(YB-YO),
         FDV         FMODUL          < DONNE COS(TETA)...
<
< CALCUL DE LA MATRICE DE ROTATION
< CONSERVANT LES CERCLES ET LES
< ANGLES, SOIT :
<
<        COS(TETA)                   A0*A1*SIN(TETA)
<        -SIN(TETA)/A0/A1            COS(TETA)
<
         FST         FMA11           < ELEMENT A11 DE LA MATRICE,
         FST         FMA22           < ELEMENT A22 DE LA MATRICE...
         FLD         FX1             < X1,
         FMP         FY2             < X1*Y2,
         BSR         ASFWOR
         FLD         FX2             < X2,
         FMP         FY1             < X2*Y1,
         FSB         FWORK           < X2*Y1-X1*Y2,
         FDV         FMODUL          < ET PAR DIVISION PAR LE PRODUIT DES
                                     < MODULES, ON TROUVE SIN(TETA)...
         BSR         ASFWOR
         FMP         XFA0            < A0*SIN(TETA),
         FMP         XFA1            < A1*A0*SIN(TETA),
         FST         FMA12           < ELEMENT A12 DE LA MATRICE...
         FLD         FWORK           < SIN(TETA),
         FDV         XFA0            < SIN(TETA)/A0,
         FDV         XFA1            < SIN(TETA)/A0/A1,
         BSR         AFNEG
         FST         FMA21           < ELEMENT A21 DE LA MATRICE...
<
< TRANSFORMATION :
<
SPU1:    EQU         $
<
< CALCUL DU CENTRE DE LA ROTATION :
<
         LA          TRX
         BSR         AFLT
         FSB         FXO
         BSR         AFNEG
         FMP         KFU
         FMP         KUX
         FST         FXBENT          < X(CENTRE)=KUX*KFU*X(O).
         LA          TRY
         BSR         AFLT
         FSB         FYO
         BSR         AFNEG
         FMP         KFV
         FMP         KVX
         FST         FYBENT          < Y(CENTRE)=KVX*KFV*Y(O).
<
< ROTATION "CONSERVATIVE" :
<
         FLD         VARU            < U,
         FSB         FXBENT          < U-X(CENTRE),
         FMP         FMA11           < A11*(U-X(CENTRE)),
         BSR         ASFWOR
         FLD         VARV            < V,
         FSB         FYBENT          < V-Y(CENTRE),
         FMP         FMA12           < A12*(V-Y(CENTRE)),
         BSR         APWORK          < A11*(U-X(CENTRE))+A12*(V-Y(CENTRE)).
         FAD         FXBENT          < ET TRANSLATION...
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
<
< CALCUL DU CENTRE DE LA ROTATION :
<
         LA          TRX
         BSR         AFLT
         FSB         FXO
         BSR         AFNEG
         FMP         KFU
         FMP         KUY
         FST         FXBENT          < X(CENTRE)=KUY*KFU*X(O).
         LA          TRY
         BSR         AFLT
         FSB         FYO
         BSR         AFNEG
         FMP         KFV
         FMP         KVY
         FST         FYBENT          < Y(CENTRE)=KVY*KFV*Y(O).
<
< ROTATION "CONSERVATIVE" :
<
         FLD         VARU            < U,
         FSB         FXBENT          < U-X(CENTRE),
         FMP         FMA21           < A21*(U-X(CENTRE)),
         BSR         ASFWOR
         FLD         VARV            < V,
         FSB         FYBENT          < V-Y(CENTRE),
         FMP         FMA22           < A22*(V-Y(CENTRE)),
         BSR         APWORK          < A21*(U-X(CENTRE))+A22*(V-Y(CENTRE)).
         FAD         FYBENT          < ET TRANSLATION...
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
<
<
<        C L I G N O T E M E N T   D ' U N   P O I N T  :
<
<
<        ARGUMENT :
<                    (X,Y)=POINT COURANT.
<
<
CLIGN:   EQU         $
         PSR         A,B,X,Y
         STX         XR              < ON SE PLACE
         STY         YR
         STX         XS
         STY         YS              <             AU POINT COURANT...
         BSR         ASPGPS          < (A)=NIVEAU(X,Y)...
         PSR         A               < AND SAVE IT...
         LXI         4               < (X)=NOMBRE DE CLIGNOTEMENTS...
CLIGN1:  EQU         $
         PSR         X
         LAI         NIVMAX          < ON AFFICHE UN POINT BLANC,
         BSR         ASPRPS          < ET ON VISUALISE...
         LXI         0
CLIGN2:  EQU         $
         HALT                        < ON ATTEND UN PEU...
         CPZR        X
         JNE         CLIGN2
         LAI         NIVMAX)NIVMAX   < ON AFFICHE UN POINT NOIR,
         BSR         ASPRPS          < ET ON VISUALISE...
         LXI         0
CLIGN3:  EQU         $
         HALT                        < ET ON ATTEND UN PEU...
         CPZR        X
         JNE         CLIGN3
         PLR         X
         JDX         CLIGN1          < ET ON RECOMMENCE...
         PLR         A
         BSR         ASPRPS          < PUIS ON RESTAURE LE POINT COURANT...
         PLR         A,B,X,Y
         RSR
:F
:F
< <<'SIOT ROTATE CONF 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.