```DF'SIOD ATTRACTEUR 1'
ED'SIOD ATTRACTEUR 1'
IN0
PAGE
IDP         "SIOD ATTRACTEUR 1"
\$EQU        \$-64            < A T T E N T I O N...
IDP         "ATTENTION : EST EN RECOUVREMENT DE -64 MOTS !!!"
<
<
<        A T T R A C T E U R   E T R A N G E   1  :
<
<
<        FONCTION :
<                      CE MODULE CALCULE L'ATTRACTEUR
<                    D'EQUATION SUIVANTE :
<
<        X(N+1)=A1*X(N)**2+A2*X(N)*Y(N)+A3*Y(N)**2+A4*X(N)+A5*Y(N)+A6
<        Y(N+1)=A7*X(N)**2+A8*X(N)*Y(N)+A9*Y(N)**2+A10*X(N)+A11*Y(N)+A12
<        C(N+1)=A13*X(N)+A14*Y(N)+A15
<
<                    OU C(N+1) DESIGNE LA COULEUR
<                    MODULO 'NIVMAX'...
<
<                    PUIS ON MARQUE LE POINT :
<                    XS=FK*X(N+1)+TRX,
<                    YS=FK*Y(N+1)+TRY,
<                    AVEC LA COULEUR C(N+1) MODULO 'NIVMAX'.
<
<
<        ATTRACTEUR DE HENON :
<                      IL S'OBTIENT EN FAISANT TOUS
<                    COEFFICIENTS A(I) NULS, SAUF :
<
<                    A1=-7/5,
<                    A5=1,
<                    A6=1,
<                    A10=3/10.
<
<
<        A T T E N T I O N  :
<                      MARQUE LE POINT (0,0) !!!
<
<
<        PARAMETRES :
A0::     VAL         0               < NOMBRE DE POINTS A CALCULER.
A1::     VAL         A0+1            < SUITE DES COEFFICIENTS DE X(N+1).
A2::     VAL         A1+1
A3::     VAL         A2+1
A4::     VAL         A3+1
A5::     VAL         A4+1
A6::     VAL         A5+1
A7::     VAL         A6+1            < SUITE DES COEFFICIENTS DE Y(N+1).
A8::     VAL         A7+1
A9::     VAL         A8+1
A10::    VAL         A9+1
A11::    VAL         A10+1
A12::    VAL         A11+1
A13::    VAL         A12+1           < SUITE DES COEFFICIENTS DE C(N+1).
A14::    VAL         A13+1
A15::    VAL         A14+1
<
<
<        L O C A L  :
<
<
LOCAL
FLOC:    EQU         \$
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
XNP1:    FLOAT       0               < MEMORISE LE POINT COURANT X(N+1),
YNP1:    FLOAT       0               < Y(N+1).
ASPU3:   WORD        SPU3            < RELAI...
PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         \$
<
< RECUPERATION DES PARAMETRES :
<
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
<
< INITIALISATION DE X(N) ET Y(N) :
<
FLD         VARU
FST         XNP1            < X(N)=VARU,
FLD         VARV
FST         YNP1            < Y(N)=VARV.
<
< ENTREE DU NOMBRE D'ITERATIONS :
<
LXI         A0
BSR         ASPCT
BSR         AROND
LR          A,X             < (X)=NOMBRE DE POINTS A CALCULER...
JAG         SPU1
QUIT        1               < ?!???!
SPU1:    EQU         \$
<
< BOUCLE D'ITERATION :
<
SPU3:    EQU         \$
FLD         XA1
FMP         XNP1
FMP         XNP1            < A1*X(N)**2.
FST         FWORK
FLD         XA2
FMP         XNP1
FMP         YNP1            < A2*X(N)*Y(N).
FST         FWORK
FLD         XA3
FMP         YNP1
FMP         YNP1            < A3*Y(N)**2.
FST         FWORK
FLD         XA4
FMP         XNP1            < A4*X(N).
FST         FWORK
FLD         XA5
FMP         YNP1            < A5*Y(N).
PSR         A,B             < FUTUR X(N+1).
FLD         XA7
FMP         XNP1
FMP         XNP1            < A7*X(N)**2.
FST         FWORK
FLD         XA8
FMP         XNP1
FMP         YNP1            < A8*X(N)*Y(N).
FST         FWORK
FLD         XA9
FMP         YNP1
FMP         YNP1            < A9*Y(N)**2.
FST         FWORK
FLD         XA10
FMP         XNP1            < A10*X(N).
FST         FWORK
FLD         XA11
FMP         YNP1            < A11*Y(N).
PSR         A,B             < FUTUR Y(N+1).
FLD         XA13
FMP         XNP1            < A13*X(N).
FST         FWORK
FLD         XA14
FMP         YNP1            < A14*Y(N).
BSR         AROND
ANDI        NIVMAX          < CALCUL DE LA COULEUR MODULO 'NIVAMX',
STA         FWORK           < ET SAVE...
PLR         A,B             < RECUPERATION DE Y(N+1)
FST         YNP1
FMP         FK
BSR         AROND           < POUR LE CALCUL DE 'YS' :
STA         YS              < QUE L'ON STORE, QUELQU'IL SOIT...
PLR         A,B             < RECUPERATION DE X(N+1),
FST         XNP1            < QUE L'ON MEMORISE...
FMP         FK
BSR         AROND           < POUR LE CALCUL DE 'XS' :
JAL         SPU2            < HORS-ECRAN...
CPI         NPOLM1          < ???
JG          SPU2            < HORS-ECRAN...
STA         XS
LA          YS              < TEST DE 'YS' :
JAL         SPU2            < 'YS' HORS-ECRAN...
CPI         NLIGM1          < ???
JG          SPU2            < HORS-ECRAN...
LA          FWORK           < (A)=COULEUR DE (XS,YS),
BSR         ASPRPS          < QUE L'ON MARQUE...
<
< FIN DE L'ITERATION :
<
SPU2:    EQU         \$
JDX         SPU4            < A L'ITERATION SUIVANTE...
JMP         SPU5
SPU4:    EQU         \$
BR          ASPU3           < RELAI...
SPU5:    EQU         \$
<
<
<        C O M P O S A N T E   E N   ' V '   E T   ' W '  :
<
<
SPV:     EQU         \$
SPW:     EQU         \$
FLD         F0
RSR
:F
:F
< <<'SIOD ATTRACTEUR 1'
DF'SIOD CHIFFRAGE 1'
ED'SIOD CHIFFRAGE 1'
IN0
PAGE
IDP         "SIOD CHIFFRAGE 1"
<
<
<        C H I F F R A G E   1  :
<
<
<        FONCTION :
<                      CE MODULE DEFINIT UNE
<                    TRANSFORMATION 'T' TELLE QUE
<                    T*T=1 ; ELLE PERMET DONC EN
<                    L'APPLIQUANT DE CHIFFRER UNE
<                    IMAGE, ET EN LA REAPPLIQUANT
<                    DE LA DECHIFFRER. ELLE UTILISE
<                    LA CONSTANTE MAGIQUE...
<
<
LOCAL
FLOC:    EQU         \$
MAGIC::  VAL         7               < FABULEUSE CONSTANTE MAGIQUE...
ACHIFR:  WORD        TCHIFR,X        < RELAI D'ACCES A LA LISTE DE CHIFFRAGE...
FCREST:: VAL         'FD00           < ACCES AU RESTE D'UNE DIVISION...
NBITCX:: VAL         NBITMO/NBRHEX   < NOMBRE DE BITS PAR CHIFFRE HEXA-DECIMAL.
TCHIFR:  EQU         \$               < TABLE DE CHIFFRAGE :
XWOR%2:  VAL         NBITMO-NBITCX
DO          BASE16
WORD        0=FCDO)MFFFF+1+BASE16-1*MAGIC/BASE16(0=FCREST>XWOR%2
PCHIFR:  WORD        CHIFRE          < S/P DE CHIFFRAGE...
PROG
<
<
<        M O D U L E   D E   C H I F F R A G E  :
<
<
<        ARGUMENT :
<                    (A,B)=COORDONNEE A CHIFFRER.
<
<
<        RESULTAT :
<                    (A,B)=COORDONNEE CHIFFREE.
<
<
CHIFRE:  EQU         \$
FIX                         < (A)=COORDONNEE ENTIERE,
LR          A,B             < QUE L'ON MET DANS 'B',
LAI         0               < ET CLEAR DE 'A'...
LXI         NBRHEX          < NOMBRE DE TOURS A FAIRE.
CHIFR1:  EQU         \$
SCLD        NBITCX          < (A)=CHIFFRE HEXA COURANT,
PSR         X
LR          A,X
LA          &ACHIFR         < ET CHIFFRAGE...
PLR         X
JDX         CHIFR1          < ET AU CHIFFRE SUIVANT...
SCRD        NBITMO-NBITCX   < (A)=COORDONNE ENTIERE CHIFFREE,
FLT                         < ET CONVERSION FLOTTANTE...
RSR
<
<
<        C O O R D O N N E E   E N   ' U '  :
<
<
SPU:     EQU         \$
FLD         VARU
BSR         PCHIFR          < CHIFFRAGE DE 'VARU'.
RSR
<
<
<        C O O R D O N N E   E N   ' V '  :
<
<
SPV:     EQU         \$
FLD         VARV
BSR         PCHIFR          < CHIFFRAGE DE 'VARV'.
RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         \$
FLD         F0              < ON NE BOUGE PAS...
RSR
:F
:F
< <<'SIOD CHIFFRAGE 1'
DF'SIOD CHIFFRAGE 2'
ED'SIOD CHIFFRAGE 2'
IN0
PAGE
IDP         "SIOD CHIFFRAGE 2"
<
<
<        C H I F F R A G E   2  :
<
<
<        FONCTION :
<                      CE MODULE CALCULE LE
<                    NOMBRE (XR,YR,NIVEAU(XR,YR)),
<                    QUI TIENT DONC SUR 19 BITS
<                    NUMEROTES DE 0 A 18 ; IL
<                    PROCEDE SUIVANT LES ARGUMENTS
<                    'A0',...,'A12' A UNE PERMUTATION
<                    DE CES 19 BITS, PUIS ON DECON-
<                    CATENE, CE QUI DONNE (XS,YS,
<                    NIVEAU(XS,YS)).
<
<
<        ARGUMENTS :
A0::     VAL         0               < PREMIER INDICE DE PERMUTATION...
<
<
<        L O C A L  :
<
<
LOCAL
FLOC:    EQU         \$
MOCG::   VAL         'FF00
MOCD::   VAL         '00FF
K::      VAL         0
<
< ZONE DE PERMUTATION :
<
SAVE:    EQU         \$
SAVE1:   WORD        0               < CONTIENDRA (XS,YS),
SAVE2:   WORD        0               <                     ET NIVEAU(XS,YS)...
<
< CONSTANTES :
<
FINITE:  FLOAT       1000000         < INFINI...
PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         \$
FLD         FINITE          < POUR FAIRE UN OVER-SCREEN...
RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         \$
FLD         FINITE          < POUR FAIRE UN OVER-SCREEN...
RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         \$
<
< CALCUL DU NOMBRE INITIAL :
<
STZ         SAVE1           < CLEAR DES
STZ         SAVE2           <           19 BITS...
BSR         ASPGPR          < (A)=NIVEAU(XR,YR),
SLRD        NCOOL           < QUE L'ON POUSSE DANS 'B',
LA          XR              < (A)=(0,XR),
SWBR        A,A             < (A)=(XR,0),
OR          YR              < (A,B)=(XR,YR,NIVEAU(XR,YR),...).
LXI         0               < (X)=INDEX DES BITS...
<
< BOUCLE DE PERMUTATION :
<
SPW1:    EQU         \$
TBT         0,X             < TEST DU BIT COURANT :
JNC         SPW2            < OK, NUL, DEJA CLEARE...
PSR         A,B,X           < A 1 : ON VA LE PERMUTER :
BSR         ASPCT           < RECUPERATION DE LA CONSTANTE D'INDEX (X),
BSR         AROND           < QUE L'ON MET EN ENTIER,
JAL         \$               < !??!???!
CPI         NBITMO+NCOOL
JGE         \$               < ???!??!?!!
LR          A,X             < (X)=PERMUTATION(X)...
SBTM        A0,X            < ET ON GENERE LA LISTE PERMUTEE...
PLR         A,B,X
SPW2:    EQU         \$
ADRI        1,X             < PASSAGE AU BIT SUIVANT...
XR          A,X
CPI         NBITMO+NCOOL    < S'IL EXISTE ???
XR          A,X
JL          SPW1            < OUI...
<
< GENERATION D'UN POINT :
<
LA          SAVE1
ANDI        MOCD
STA         YS              < GENERATION DE SON 'Y',
LA          SAVE1
SLRS        MOCG=K
STA         XS              <                        DE SON 'X',
LAI         0
LB          SAVE2
SLLD        NCOOL           < ET DE SON NIVEAU DANS (A)...
BSR         ASPRPS          < ET ON LE MARQUE...
<
< GENERATION DE LA COMPOSANTE :
<
FLD         F0
RSR
:F
:F
< <<'SIOD CHIFFRAGE 2'
DF'SIOD CONVOLUTION 1'
ED'SIOD CONVOLUTION 1'
IN0
PAGE
IDP         "SIOD CONVOLUTION 1"
<
<
<        N O Y A U   D E   C O N V O L U T I O N   1  :
<
<
<        FONCTION :
<                      CE MODULE EN CHAQUE POINT (XR,YR)=(XS,YS)
<                    CALCULE :
<                    SIGMA(NIVEAU(XR,YR)*CT(I)), OU 'CT' DESIGNE
<                    UNE CONSTANTE DE TRAVAIL, ET 'I' L'INDICE
<                    DE SOMMATION VARIANT DE 1 AU NOMBRE DE
<                    POINTS 'NPM' DE LA SPIRALE. ENSUITE
<                    LE POINT (XS,YS) RECOIT COMME NIVEAU
<                    LE SIGMA DIVISE PAR 'NPM', LE TOUT
<                    CALCULE MODULO 'NIVMAX'...
<                      ENSUITE, APRES "NORMALISATION"
<                    (MULTIPLICATION PAR 'MCUMUL'
<                    ET DIVISION PAR LE NOMBRE
<                    DE POINTS 'FNP' DE LA SPIRALE),
<                    SI CETTE SOMME SE TROUVE ENTRE
<                    LE MIN ('A25') ET LE MAX ('A26'),
<                    LE POINT EST MARQUE ; ON PEUT AINSI
<                    FAIRE DES OPERATIONS DE MORPHOLO-
<                    GIE MATHEMATIQUE :
<
<                    1 - EROSION : ON NE GARDE UN POINT
<                    QUE SI TOUTE LA SPIRALE CORRESPON-
<                    DANTE EST ENTIEREMENT PLEINE DE
<                    POINTS, DONC :
<                                    MIN=MAX=VALEUR MAX DU SIGMA.
<
<                    2 - DILATATION : ON MARQUE UN POINT
<                    DES QUE LA SPIRALE CORRESPONDANTE
<                    CONTIENT UN POINT, DONC :
<                                    MIN=1,
<                                    MAX=VALEUR MAX DU SIGMA.
<
<
<        ARGUMENTS :
A20::    VAL         '20             < NOMBRE DE POINTS 'NPM' DE CHAQUE SPIRALE,
A21::    VAL         A20+1           < PAS DE LA SPIRALE (+1 EN GENERAL),
A22::    VAL         A21+1           < QUE FAIRE LORS DE LA SORTIE HORS DE
< L'INTERVALLE (0,NIVMAX) :
< -1 : NIVEAUX<0 --> NOIR,
<      NIVEAUX>NIVMAX --> NOIR,
< 0  : NIVEAUX CALCULES MODULO NIVMAX+1,
< +1 : NIVEAUX<0 --> NOIR,
<      NIVEAUX>NIVMAX --> NIVMAX.
A23::    VAL         A22+1           < DIVISEUR DE 'CUMUL'.
A24::    VAL         A23+1           < MULTIPLICATEUR DE SIGMA/FNP.
A25::    VAL         A24+1           < MIN(MCUMUL*SIGMA/FNP),
A26::    VAL         A25+1           < MAX(MCUMUL*SIGMA/FNP).
<
<
<        L O C A L  :
<
<
LOCAL
FLOC:    EQU         \$
PASQ:    WORD        0               < ARGUMENT 'A21'.
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,
FNP:     FLOAT       0               < IDEM EN FLOTTANT.
NPM:     WORD        0               < NOMBRE DE POINTS ENTIER DE LA SPIRALE.
CUMUL:   FLOAT       0               < SIGMA SUR LA SPIRALE.
DCUMUL:  FLOAT       1               < DIVISEUR DE 'CUMUL'...
MCUMUL:  FLOAT       1               < MULTIPLICATEUR DE SIGMA/FNP.
FMIN:    FLOAT       0               < MIN(MCUMUL*SIGMA/FNP),
FMAX:    FLOAT       0               < MAX(MCUMUL*SIGMA/FNP).
MODET:   WORD        0               < ARGUMENT 'A22'.
FINFIN:  FLOAT       100000          < INFINI...
ASPIR:   WORD        SPIR            < CALCUL DU SIGMA SUR UNE SPIRALE...
IPREM:   WORD        0               < INDICATEUR DE PREMIERE ENTREE...
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
PROG
SPU:     EQU         \$
<
< TEST DU PREMIER POINT, ET
< INITIALISATION DU Z-BUFFER :
<
LA          IPREM           < EST-CE LA PREMIERE FOIS ???
JANE        SPU2            < NON...
IC          IPREM           < OUI, INITIALISATION...
<
< DEFINITION DE LA SPIRALE :
<
LXI         A20
BSR         ASPCT
FST         FNP
BSR         AROND
JALE        \$               < ?!?!?!?!!!!!
CPI         A20             < VALIDATION...
JGE         \$               < ??!??!?!
STA         NPM             < NOMBRE DE POINTS MAX...
LXI         A21
BSR         ASPCT
BSR         AROND
JALE        \$               < !??!?!?!
STA         PASQ            < PAS DE PARCOURS...
<
< ENTREE DU MODE DE TRACE :
<
LXI         A22
BSR         ASPCT
BSR         AROND
STA         MODET
<
< ENTREE DU NORMALISATEUR :
<
LXI         A23
BSR         ASPCT
FST         DCUMUL
<
< ENTREE DU MIN/MAX :
<
LXI         A24
BSR         ASPCT
FST         MCUMUL          < MULTIPLICATEUR DE SIGMA/FNP,
LXI         A25
BSR         ASPCT
FST         FMIN            < MIN(MCUMUL*SIGMA/FNP),
LXI         A26
BSR         ASPCT
FST         FMAX            < MAX(MCUMUL*SIGMA/FNP).
<
< CALCUL DE LA COMPOSANTE EN 'U' :
<
SPU2:    EQU         \$
FLD         FINFIN          < POUR UN OVER-SCREEN...
RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         \$
FLD         FINFIN          < POUR UN OVER-SCREEN...
RSR                         < ???!?
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         \$
LA          XR
LB          YR
PSR         A,B             < SAUVEGARDE DU POINT COURANT...
<
< CALCUL DU POINT COURANT :
<
FLD         VARU
FDV         KFU
FDV         KUZ
FST         FWORK
LA          TRX
FLT
FIX
STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
STA         XR              < CENTRE DE LA SPIRALE...
FLD         VARV
FDV         KFV
FDV         KVZ
FST         FWORK
LA          TRY
FLT
FIX
STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
STA         YR              < CENTRE DE LA SPIRALE...
<
< CONVOLUTION PROPREMENT DITE :
<
BSR         ASPIR           < MARQUAGE DU POINT COURANT (XS,YS)=(XR,YR)
<
< RETOUR :
<
PLR         A,B
STA         XR              < RESTAURATION
STB         YR              <              DU POINT COURANT...
FLD         F0              < ET PAS DE DEPLACEMENT...
RSR
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         \$
<
< INITIALISATION DE LA SPIRALE :
<
LA          XR
LB          YR
PSR         A,B             < SAUVEGARDE DU POINT (XR,YR).
FLD         F0
FST         CUMUL           < CUMUL <-- 0.
STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
LA          PASQ
STA         DELTAX          < DELTAX <-- +1,
STZ         DELTAY          < DELTAY <-- 0.
LAI         1
STA         LB0             < INITIALISATION DE LA LONGUEUR DU
< PREMIER BRAS DE LA SPIRALE.
SPMOY8:  EQU         \$
<
< PARCOURS D'UN BRAS :
<
SPMOY1:  EQU         \$
LA          LB0
STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPMOY2:  EQU         \$
IC          NP              < COMPTAGE DES POINTS TRAITES :
LA          NP
CP          NPM             < FINI ???
JG          SPMOY3          < OUI...
LA          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),
FLT                         < NIVEAU DU POINT COURANT,
LX          NP              < (X)=NUMERO DU POINT COURANT (DE 1 A NPM),
FMP         &ACT            < ET ON PONDERE LE NIVEAU PAR CT(X),
FST         CUMUL           < PUIS ON CUMULE...
SPMOY4:  EQU         \$
LA          XR
STA         XR
LA          YR
AD          DELTAY          < POINT COURANT (XS,YS).
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         \$
FLD         CUMUL           < VALEUR DU SIGMA,
FST         FWORK           < QUE L'ON SAUVEGARDE...
FDV         FNP             < QUE L'ON RAMENE AU NOMBRE DE POINTS,
FMP         MCUMUL          < QUE L'ON PONDERE...
FCAM        FMIN            < ALORS :
JL          SPMOYA          < TROP PETIT : POINT IGNORE...
FCAM        FMAX            < ALORS :
JG          SPMOYA          < TROP GRAND : POINT IGNORE...
FLD         FWORK           < OK, ON EST ENTRE 'MIN' ET 'MAX',
< RECUPERONS LE SIGMA...
FDV         DCUMUL          < NORMALISATION...
BSR         AROND
CPZ         MODET           < QUEL EST LE MODE DE TRACE ???
JNE         SPMOY6          < PAR SEUILLAGE...
ANDI        NIVMAX          < PAR MODULO...
JMP         SPMOY7          < VERS LA GENERATION...
SPMOY6:  EQU         \$
JAG         SPMOY9          < LE NIVEAU N'EST PAS NOIR...
LAI         0               < NOIR, OU NEGATIF --> NOIR...
JMP         SPMOY7          < VERS LE TRACE...
SPMOY9:  EQU         \$
CPI         NIVMAX
JLE         SPMOY7          < ON EST DANS L'INTERVALLE (0,NIVMAX)...
CPZ         MODET           < HORS DE CET INTERVALLE, QUEL EST LE
< MODE DE TRACE ???
LAI         0               < A PRIORI : NIVEAU>NIVMAX --> NOIR...
JL          SPMOY7          < ET OUI, VERS LA GENERATION...
LAI         NIVMAX          < ET NON : NIVEAU>NIVMAX --> NIVMAX...
SPMOY7:  EQU         \$
BSR         ASPRPS          < ET ON LE MARQUE...
SPMOYA:  EQU         \$
PLR         A,B
STA         XR              < RESTAURATION DE
STB         YR              <                 (XR,YR)...
RSR
:F
:F
< <<'SIOD CONVOLUTION 1'
DF'SIOD GRAPHIQUE 1'
ED'SIOD GRAPHIQUE 1'
IN0
PAGE
IDP         "SIOD GRAPHIQUE 1"
<
<
<        G R A P H I Q U E   1  :
<
<
<        FONCTION :
<                      CE MODULE PREND L'IMAGE RESIDENTE,
<                    DEFINIT UNE GRILLE (PASIX,PASIY), Y
<                    CALCULE EN CHAQUE NOEUD LE NIVEAU
<                    MOYEN DES POINTS CONTENUS DANS LA
<                    MAILLE COURANTE ; A PARTIR DE LA
<                    IL GENERE DANS L'ITEM1 (EN QUEUE)
<                    UN PROGRAMME GRAPHIQUE EQUIVALENT SOUS
<                    LA FORME :
<                                    >X((((D
<                                           =        /
<                                           =        /
<
<                                           =        /
<                                                     Y))))
<                    OU :
<                                    X=NOM A DONNER AU SOUS-PROGRAMME,
<                                    Y=CARACTERE DE FIN CARACTERISTIQUE DE
<                                      LA MATRICE DEFINIE...
<
<
<        ARGUMENTS :
A0::     VAL         0               < INDEX D'INSERTION DU PREMIER CARACTERE
< DANS L'ITEM1,
A1::     VAL         A0+1            < 'PASIX',
A2::     VAL         A1+1            < 'PASIY'.
A3::     VAL         A2+1            < NOM 'X' DU SOUS-PROGRAMME,
A4::     VAL         A3+1            < CARACTERE 'Y' DE FIN...
A5::     VAL         A4+1            < OPTIMISATION EN BOUT DE LIGNE :
< =0 : OUI, ON REDUIT LA LIGNE,
< #0 : NON, ON LA LAISSE INTEGRALE...
<
<
<        L O C A L  :
<
<
LOCAL
FLOC:    EQU         \$
PREM:    WORD        -1              < INDICATEUR DE PREMIER PASSAGE...
XA3:     WORD        0               < NOM DU SOUS-PROGRAMME,
XA4:     WORD        0               < ET CARACTERE DE FIN 'Y'...
XA5:     WORD        0               < PARAMETRE D'OPTIMISATION EN BOUT DE
< LIGNE.
KXA5:    WORD        0               < COMPTEUR DES "-"...
INDEX0:  WORD        0               < INDEX COURANT DE L'ITEM1 (POUR INSERER).
ANLIG1:  WORD        NLIGM1
AINFIN:  WORD        INFINI          < A CAUSE DE LA BASE 'L'...
PASIX:   WORD        0               < PAS SUR 'X',
PASIY:   WORD        0               < PAS SUR 'Y'.
LIGC:    WORD        -1              < NUMERO DE GRILLE HORIZONTALE COURANTE,
COLC:    WORD        -1              < NUMERO DE GRILLE VERTICALE COURANTE.
CUMUL:   WORD        0               < SIGMA(NIVEAUX(XR,YR)) DANS UNE MAILLE.
NPTS:    WORD        0               < NOMBRE DE POINTS DANS UNE MAILLE.
NCPM:    WORD        NBCAR*NBLIG-LNOM  < POUR NE PAS DEBORDER...
BCDA:    WORD        0               < BUFFER DE LA 'CDA',
ABCDA:   WORD        BCDA
SAVEC:   WORD        0               < CARACTERE COURANT POUR L'ITEM1...
TCDA:    WORD        SAVIT1+LTN      < ADRESSE DU PREMIER CARACTERE DE L'ITEM1
< DANS LA 'CDA'...
ASTIT:   WORD        STIT            < INSERTION D'UN CARACTERE DANS ITEM1...
ASPM:    WORD        SPM             < S/P D'INSERTION DES "-"...
ASPMT:   WORD        SPMT            < INSERTION DES "-" SI NECESSAIRE...
<
<
<        C A R A C T E R E S   G R A P H I Q U E S  :
<
<
XKSUP::  VAL         ">"             < DEBUT DE SOUS-PROGRAMME GRAPHIQUE.
XKPG::   VAL         "("
XKPD::   VAL         ")"
XKDEBP:: VAL         "D"             < DEBUT DU SOUS-PROGRAMME GRAPHIQUE.
XKDEBL:: VAL         "="             < DEBUT DE LIGNE DE MATRICE,
XKFIN::  VAL         "/"             < ET FIN.
XKNUL::  VAL         "-"             < CARACTERE D'ESPACEMENT...
<
<
<        R A N G E M E N T   D A N S   I T E M 1  :
<
<
<        ARGUMENTS :
<                    (A)=CARACTERE,
<                    (INDEX0)=INDEX COURANT.
<
<
<        RESULTAT :
<                    INDICATEURS SUIVANT QU'AVANT L'INSERTION IL Y A
<                    DEBORDEMENT DANS L'ITEM1...
<
<
PROG
STIT:    EQU         \$
PSR         A,B,X,Y
LBI         0               < CLEAR 'B',
STA         SAVEC           < CARACTERE A RANGER,
LA          INDEX0
CP          NCPM            < Y-A-T'IL PRE-DEBORDEMENT ???
JGE         STIT1           < OUI, ON NE FAIT RIEN...
SLRD        NOCMO=0         < POUR CONVERTIR EN UN INDEX-MOT,
<     CARACTERE,
LR          B,Y             < (Y)=0 : OCTET GAUCHE,
<    #0 : OCTET DROIT.
LB          ABCDA           < (B)=ADRESSE MEMOIRE UTILISATEUR,
LXI         1               < ET ON DEPLACE UN MOT...
PSR         A,X
RCDA
LA          BCDA            < (A)=MOT COURANT,
CPZR        Y               < OCTET DROIT OU GAUCHE ???
JNE         STIT2           < DROIT...
SWBR        A,A             < GAUCHE, ON PERMUTE...
STIT2:   EQU         \$
ANDI        'FF00           < CLEAR,
OR          SAVEC           < ET CONCATENATION...
JNE         STIT3           < OCTET DROIT...
SWBR        A,A             < GAUCHE, ON REPERMUTE...
STIT3:   EQU         \$
STA         BCDA
PLR         A,X
WCDA
LA          INDEX0          < (A)=INDEX COURANT...
IC          INDEX0          < POUR LE CARACTERE SUIVANT...
CP          NCPM            < POUR RESTAURER LES INDICATEURS...
STIT1:   EQU         \$
PLR         A,B,X,Y
RSR
<
<
<        I N S E R T I O N   D E S   " - "  :
<
<
SPM:     EQU         \$
PSR         A,X             < SAUVEGARDES...
LX          KXA5            < (X)=NOMBRE DE REPETITIONS DE "-" :
CPZR        X               < Y-EN-A-T'IL ???
JE          SPM1            < NON, ON SORT...
LAI         XKNUL           < OUI, (A)=CARACTERE 'ESPACE'...
SPM2:    EQU         \$
BSR         ASTIT           < INSERTION D'UN "-",
JDX         SPM2            < AU SUIVANT...
STZ         KXA5            < ET ON RAZE LE COMPTE D'ITERATIONS...
SPM1:    EQU         \$
PLR         A,X
RSR
<
<
<        I N S E R T I O N   D E S   " - "   S I   N E C E S S A I R E  :
<
<
SPMT:    EQU         \$
CPZ         XA5             < FAUT-IL OPTIMISER LES BOUTS DE
< LIGNE ???
JE          SPMT1           < OUI...
BSR         ASPM            < NON, INSERTION DE (KXA5) CARACTERES "-"
< EN BOUT DE LIGNE,
SPMT1:   EQU         \$
STZ         KXA5            < RAZ DU COMPTE D'ITERATIONS...
RSR
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         \$
<
< SAUVEGARDE DE (XR,YR), ET
< SYMETRIE PAR RAPPORT A OX :
<
LA          YR
LB          XR
PSR         A,B
SB          ANLIG1
NGR         A,A
STA         YR              < SYMETRIE/OX...
<
< TEST DE PREMIERE FOIS :
<
CPZ         PREM            < PREMIERE FOIS ???
JGE         SPU1            < NON...
IC          PREM            < OUI...
<
< ENTREE DES ARGUMENTS :
<
LXI         A0
BSR         ASPCT
BSR         AROND
JALE        \$
STA         INDEX0          < INDEX DE RANGEMENT DANS L'ITEM1,
LXI         A1
BSR         ASPCT
BSR         AROND
JALE        \$
STA         PASIX           < PAS EN 'X',
LXI         A2
BSR         ASPCT
BSR         AROND
JALE        \$
STA         PASIY           < PAS EN 'Y'.
LXI         A3
BSR         ASPCT
BSR         AROND
JALE        \$
STA         XA3             < NOM DU SOUS-PROGRAMME,
LXI         A4
BSR         ASPCT
BSR         AROND
JALE        \$
STA         XA4             < CARACTERE DE FIN...
LXI         A5
BSR         ASPCT
BSR         AROND
STA         XA5
<
< INITIALISATION DU BOUT DE ITEM1 :
<
LX          INDEX0
PSR         X               < SAVE 'INDEX0'...
LAI         " "             < (A)=CARACTERE DE CLEAR,
SPU2:    EQU         \$
BSR         ASTIT           < MISE A BLANC DU BOUT DE ITEM1...
JL          SPU2            < AU SUIVANT...
PLR         X
STX         INDEX0          < ET RESTAURATION DE ITEM1...
<
< INITIALISATION DU SOUS-PROGRAMME GRAPHIQUE :
<
LAI         XKSUP
BSR         ASTIT           < >
LA          XA3
BSR         ASTIT           < >X
LAI         XKPG
BSR         ASTIT           < >X(
BSR         ASTIT           < >X((
BSR         ASTIT           < >X(((
BSR         ASTIT           < >X((((
LAI         XKDEBP
BSR         ASTIT           < >X((((D
<
< TRAITEMENT DU POINT COURANT :
<
SPU1:    EQU         \$
LA          XR
SARD        NBITMO
DV          PASIX
CPZR        B               < EST-ON EN UN NOEUD ???
JNE         SPU3            < NON, RIEN A FAIRE...
LR          A,X             < PEUT-ETRE :
< (X)=NUMERO DE GRILLE VERTICALE,
LA          YR
SARD        NBITMO
DV          PASIY
CPZR        B               < EST-ON EN UN NOEUD ???
JNE         SPU3            < NON, RIEN A FAIRE...
LR          A,Y             < OUI :
< (Y)=NUMERO DE GRILLE HORIZONTALE.
<
< CAS D'UN NOEUD DE LA GRILLE :
<
CP          LIGC            < VIENT-ON DE CHANGER DE LIGNE ???
JE          SPU4            < NON...
STA         LIGC            < OUI :
CPZ         COLC            < DE PLUS, EST-CE LA PREMIERE ???
JL          SPU5            < OUI...
BSR         ASPMT           < NON, INSERTION DES "-" AVEC TEST...
LAI         XKFIN           < PUIS,
BSR         ASTIT           < FERMONS LA LIGNE PRECEDENTE,
SPU5:    EQU         \$
STX         COLC            < MEMORISONS LA COLONNE COURANTE...
LAI         XKDEBL
BSR         ASTIT           < ET OUVRONS LA NOUVELLE LIGNE...
<
< CALCUL DU NIVEAU MOYEN D'UNE MAILLE :
<
SPU4:    EQU         \$
STZ         NPTS            < RAZ DU NOMBRE DE POINTS,
STZ         CUMUL           < ET DU CUMUL DES NIVEAUX...
LA          XR
LX          PASIX
PSR         A               < SAVE 'XR'.
SPU6:    EQU         \$               < BOUCLE HORIZONTALE :
LA          YR
PSR         A,X             < SAVE 'YR' ET 'PASIX' COURANT...
LX          PASIY
SPU7:    EQU         \$               < BOUCLE VERTICALE :
IC          NPTS            < COMPTAGE DES POINTS,
BSR         ASPGPR          < (A)=NIVEAU(XR,YR),
STA         CUMUL           < CUMULE...
IC          YR              < AU POINT VERTICAL SUIVANT...
JDX         SPU7
PLR         A,X
STA         YR              < RESTAURATION DE 'YR',
IC          XR              < PASSAGE A LA COLONNE SUIVANTE,
JDX         SPU6
PLR         A
STA         XR              < RESTAURATION DE 'XR'.
LA          CUMUL
SARD        NBITMO
DV          NPTS            < CALCUL DU NIVEAU MOYEN,
CPI         "0"             < EST-CE LE NOIR ???
JNE         SPU9            < NON...
IC          KXA5            < OUI, COMPTAGE...
JMP         SPU3            < ET ON DIFFERE L'INSERTION, AU CAS OU
< IL S'AGIRAIT D'UN BOUT DE LIGNE...
SPU9:    EQU         \$
BSR         ASPM            < INSERTION PRELIMINAIRE DE "-" EN
< ATTENTE...
BSR         ASTIT           < RANGEMENT DU NIVEAU MOYEN COURANT.
<
< TEST DE FIN D'IMAGE :
<
SPU3:    EQU         \$
LA          XR
CPI         NPOLM1
JNE         SPU8            < NON...
LA          YR
JANE        SPU8            < NON...
<
< FERMETURE DU SOUS-PROGRAMME GRAPHIQUE :
<
BSR         ASPMT           < INSERTION DES "-" EN ATTENTE AVEC TEST...
LAI         XKFIN
BSR         ASTIT           < /
LA          XA4
BSR         ASTIT           < /Y
LAI         XKPD
BSR         ASTIT           < /Y)
BSR         ASTIT           < /Y))
BSR         ASTIT           < /Y)))
BSR         ASTIT           < /Y))))
<
< SORTIE :
<
SPU8:    EQU         \$
PLR         A,B
STB         XR
STA         YR
FLD         &AINFIN
RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         \$
FLD         &AINFIN
RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         \$
FLD         F0
RSR
:F
:F
< <<'SIOD GRAPHIQUE 1'
DF'SIOD LUMINANCE 1'
ED'SIOD LUMINANCE 1'
IN0
PAGE
IDP         "SIOD LUMINANCE 1"
<
<
<        C A L C U L   D E   L A   L U M I N A N C E   D E
<                    L ' I M A G E  :
<
<
<        FONCTION :
<                      CE MODULE CALCULE LA LUMINANCE
<                    DE L'IMAGE RESIDENTE SUIVANT LA
<                    FORMULE :
<                    Y=AR*R+AV*V+AB*B-ARV*(R+V)-AVB*(V+B)-ARB*(R+B)-ARVB*(R+V+B)
<                    OU 'R', 'V' ET 'B' SONT CALCULES
<                    A PARTIR DES REGISTRES DE COULEUR...
<
<
<        ARGUMENTS :
A0::     VAL         0               < =0 : IGNORER LES POINTS NOIRS,
< #0 : LES PRENDRE EN COMPTE...
A1::     VAL         A0+1            < FACTEUR MULTIPLICATIF DE LA LUMINANCE
< MOYENNE.
A2::     VAL         A1+1            < REGLAGE DU TELEVISEUR...
<
<
LOCAL
FLOC:    EQU         \$
<
< TABLE DES LUMINANCES ABSOLUES :
<
LMC::    VAL         NIVMAX+1        < NOMBRE DE LUMINANCES A MEMORISER.
MC:      EQU         \$               < TABLE DES LUMINANCES ABSOLUES.
DO          LMC
FLOAT       0
AMC:     WORD        MC,X            < RELAI VERS LA LISTE DES LUMINANCES.
NNIV::   VAL         16              < NOMBRE DE NIVEAUX PAR CANAL.
<
< RELAIS :
<
ASP1:    WORD        SP1             < S/P DE RECUPERATION D'UN NIVEAU DE GRIS,
ASP2:    WORD        SP2             < S/P DE CALCUL DE LA LUMINANCE.
ASPU1:   WORD        SPU1            < RELAI...
<
< DEFINITION DE LA LUMINANCE :
<
FAR:     FLOAT       0.575
FAV:     FLOAT       0.680
FAB:     FLOAT       0.510
FARV:    FLOAT       -0.290
FARB:    FLOAT       -0.236
FAVB:    FLOAT       -0.255
FARVB:   FLOAT       0.1695
FLR:     FLOAT       0               < LUMINANCE ROUGE SEUL,
FLV:     FLOAT       0               < LUMINANCE VERT SEUL,
FLB:     FLOAT       0               < LUMINANCE BLEU SEUL.
F16:     FLOAT       <NNIV<0<0
<
< CONSTANTES :
<
F10000:  FLOAT       10000           < POUR FAIRE DES OVER-SCREEN...
< COULEUR.
SAVNIV:  WORD        0               < VARAIABLE DE TRAVAIL.
XA0:     WORD        0               < DISCRIMINATEUR DES POINTS NOIRS...
FLOG2:   FLOAT       0.69315         < LOG(2).
F2:      FLOAT       2
F40:     FLOAT       40
XA1:     FLOAT       0               < CONSTANTE MULTIPLICATIVE.
XTV:     FLOAT       0               < REGLAGE DU TELEVISEUR.
XCUMUL:  FLOAT       0               < SIGMA(LUMINANCE DES POINTS).
XNPT:    FLOAT       0               < NOMBRE DE POINTS TRAITES.
<
< DONNEES DE CALCUL DE EXP(X) :
<
XNITER:: VAL         8               < PRECISION DU DEVELOPPEMENT DE EXP(X).
FWORK3:  FLOAT       0               < VARAIBLE DE TRAVAIL...
<
< EDITION DE LA LUMINANCE :
<
MLUM:    BYTE        '6D;" "
ASCI        "LUM="
MLUMX:   ASCI        "XXXX"
ASCI        " DIAPH="
MDIAPH:  ASCI        "YYYY"
LMLUM::  VAL         \$-MLUM*NOCMO
AMLUM:   WORD        MLUM,X          < RELAI DE GENERATION DE "XXXX".
DEMLUM:  WORD        '0202           < EDITION DE LA LUMINANCE...
WORD        MLUM-ZERO*NOCMO
WORD        LMLUM
AHEXEX:  WORD        HEXEX           < CONVERSION BINAIRE --> ASCI...
F10:     FLOAT       <BASE10<0<0
C10:     WORD        BASE10
C16:     WORD        BASE16
<
<
<        C A L C U L   D ' U N   N I V E A U   D E   G R I S  :
<
<
PROG
SP1:     EQU         \$
LAI         0               < CLEAR 'A',
LB          SAVNIV          < B=MOT COURANT DE LA MEMOIRE,
SLLD        NNIV=0          < A=NIVEAU DE GRIS COURANT,
STB         SAVNIV          < ET SATUVEGARDE DU MOT COURANT...
NGR         A,A             < NOIR=0 ET BLANC=15...
FLT                         < RENVOI DU NIVEAU DE GRIS EN FLOTTANT...
RSR
<
<
<        C U M U L   D E   L A   L U M I N A N C E  :
<
<
SP2:     EQU         \$
FST         FWORK
RSR
<
<
<        C O N V E R S I O N   B I N A I R E  --> A S C I  :
<
<
<        ARGUMENT :
<                    A=VALEUR,
<                    X=INDEX D'INSERTION...
<
<
HEXEX:   EQU         \$
<
< CONSTANTES :
<
NBITCX:: VAL         4               < NOMBRE DE BITS PAR CHIFFRE HEXA,
HA::     VAL         "A"
HNEUF::  VAL         "9"
Z::      VAL         1
I::      VAL         1
HZERO::  VAL         "0"
<
< INITIALISATION :
<
LR          A,B             < (B)=NOMBRE A CONVERTIR...
LYI         NBITMO/NBITCX   < 4 CONVERSIONS A FAIRE.
<
< BOUCLE DE DECODAGE :
<
Z324:    EQU         \$
LAI         0               < INITIALISATION DE A.
SLLD        NBITCX          < RECUPERATION D'UN NBRE DE
< 4 BITS DANS B.
CPI         BASE10-Z        < LA CONVERSION EST-ELLE EN CHIFFRE ?
JLE         Z325            < OUI , C'EST UN CHIFFRE.
ADRI        HA-HNEUF-Z,A    < CAS D'UNE LETTRE.
Z325:    EQU         \$
ADRI        HZERO,A         < CONVERSION EN ASCI.
STBY        &AMLUM          < ET RANGEMENT DANS LE TEXTE.
ADRI        I,X             < PROGRESSION DE L'INDEX
< DU TEXTE.
ADRI        -I,Y            < DECOMPTE DES CONVERSIONS.
CPZR        Y
JG          Z324            < C'EST PAS FINI ....
<
< SORTIE :
<
RSR
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         \$
LA          XR              < EST-CE LE PREMIER POINT DE L'IMAGE ???
OR          YR
JAE         SPU20           < OUI...
BR          ASPU1           < NON...
SPU20:   EQU         \$
<
< CALCUL DE LA LUMINANCE DES POINTS DE L'IMAGE :
<
LAI         NSPCOL
SBT         0
ACTD        1               < B=ADRESSE DE LA MEMOIRE DES COULEURS,
STB         MEMAD           < QUE L'ON SAUVEGARDE...
LXI         0               < X=INDEX DES NIVEAUX DE GRIS.
GCOUL1:  EQU         \$
FLD         F0
FST         FWORK           < INITIALISATION DE LA LUMINANCE...
ACTD        1               < QUE L'ON RECUPERE DANS 'B',
SLLD        NNIV=0          < ET QUE L'ON CADRE...
STB         SAVNIV
BSR         ASP1            < RECUPERATION DU BLEU,
FST         FLB
BSR         ASP1            < RECUPERATION DU VERT,
FST         FLV
BSR         ASP1            < RECUPERATION DU ROUGE,
FST         FLR
FMP         FAR
BSR         ASP2            < +AR*R,
FLD         FLV
FMP         FAV
BSR         ASP2            < +AV*V,
FLD         FLB
FMP         FAB
BSR         ASP2            < +AB*B,
SPU10:   EQU         \$
FCMZ        FLR
JE          SPU11
FCMZ        FLV
JE          SPU11
FLD         FLR
FMP         FARV
BSR         ASP2            < +ARV*(R+V),
SPU11:   EQU         \$
FCMZ        FLV
JE          SPU12
FCMZ        FLB
JE          SPU12
FLD         FLV
FMP         FAVB
BSR         ASP2            < +AVB*(V+B),
SPU12:   EQU         \$
FCMZ        FLR
JE          SPU13
FCMZ        FLB
JE          SPU13
FLD         FLR
FMP         FARB
BSR         ASP2            < +ARB*(R+B),
SPU13:   EQU         \$
FCMZ        FLR
JE          SPU14
FCMZ        FLV
JE          SPU14
FCMZ        FLB
JE          SPU14
FLD         FLR
FMP         FARVB
BSR         ASP2            < +ARVB*(R+V+B)...
SPU14:   EQU         \$
FCAM        F16             < SATURATION ???
JLE         SPU9            < NON...
FLD         F16             < OUI...
SPU9:    EQU         \$
FST         &AMC            < SAUVEGARDE DE LA LUMINANCE EQUIVALENTE
< DU NIVEAU DE GRIS=(X)...
IC          MEMAD           < AU MOT SUIVANT,
LR          X,A
CPI         NIVMAX          < S'IL EXISTE...
JLE         GCOUL1          < ET OUI...
<
< ENTREE DES PARAMETRES :
<
LXI         A0
BSR         ASPCT
FIX
STA         XA0             < DISCRIMINATEUR DES POINTS NOIRS.
LXI         A1
BSR         ASPCT
FST         XA1             < CONSTANTE MULTIPLICATIVE.
LXI         A2
BSR         ASPCT
FST         XTV             < REGLAGE DU TELEVISEUR...
BSR         AROND           < VALIDATION :
XTV0::   VAL         10              < MIN,
XTV1::   VAL         22              < MAX...
CPI         XTV0
JL          \$               < !??!?!??!!
CPI         XTV1
JG          \$               < ??!?!?
<
< INITIALISATIONS :
<
FLD         F0
FST         XCUMUL          < SIGMA(LUMINANCE),
FST         XNPT            < NOMBRE DE POINTS TRAITES.
<
< CAS DE TOUS LES POINTS :
<
SPU1:    EQU         \$
BSR         ASPGPS          < A=NIVEAU(XS,YS)...
LR          A,X             < X=NIVEAU DE GRIS,
FLD         &AMC            < (A,B)=LUMINANCE ABSOLUE DE CE POINT.
FCAZ                        < LE POINT EST-IL NOIR REELLEMENT ???
JNE         SPU3            < NON, ON LE TRAITE...
CPZ         XA0             < OUI, FAUT-IL L'IGNORER ???
JE          SPU4            < OUI, ON IGNORE LES POINTS REELLEMENT
< NOIRS...
SPU3:    EQU         \$               < LE POINT N'EST PAS NOIR, OU BIEN IL
< L'EST ET IL FAUT LE TRAITER...
FST         XCUMUL          < CUMUL DES LUMINANCES ABSOLUES.
FLD         XNPT
FST         XNPT            < ET COMPTAGE DES POINTS.
SPU4:    EQU         \$
<
< TEST DE FIN :
<
LA          YR
CPI         NLIGM1
JL          SPU2            < ON N'EST PAS SUR LA DERNIERE LIGNE...
LA          XR              < ON EST SUR LA DERNIERE LIGNE :
CPI         NPOLM1          < EST-CE LE DERNIER POINT ???
JL          SPU2            < NON...
<
< CAS DU DERNIER POINT DE L'IMAGE :
<
FLD         XCUMUL
FDV         XNPT
FST         FWORK           < FWORK=LUMINANCE MOYENNE CALCULEE.
FLD         F40             < 40,
FDV         XTV             < 40/REGLAGE,
FST         FWORK1
FLD         FWORK           < LUMINANCE,
FDV         F2              < LUMINANCE/2,
FSB         FWORK1          < LUMINANCE/2-40/REGLAGE,
< LOG(DIAPHRAGME)=L/2-40/R+2,
FMP         FLOG2           < POUR CALCULER EXP(LOG(DIAPHRAGME)) EN
< BASE 2...
<
< CALCUL DE L'EXPONENTIELLE :
<
FST         FWORK1          < FWORK1=LOG(DIAPHRAGME)*LOG(2).
FLD         F1
FST         FWORK2          < FWORK2=VALEUR COURANTE DU DEVELOPPEMENT,
LXI         XNITER          < (X)=NOMBRE DE TOURS...
SPU8:    EQU         \$
LR          X,A
FLT
FST         FWORK3          < 1/N,
FLD         FWORK1          < LOG(DIAPH)*LOG(2),
FDV         FWORK3          < LOG(DIAPH)*LOG(2)/N,
FMP         FWORK2          < (LOG(DIAPH)*LOG(2)/N)*CUMUL,
FST         FWORK2          < NOUVEAU CUMUL,
JDX         SPU8            < AU TERME PRECEDENT...
<
< EDITION DE LA LUMINANCE ET DU DIAPHRAGME :
<
FMP         F10
BSR         AROND           < (A)=16*DIAPHRAGME...
LXI         NBITMO/NBITCX
SPU6:    EQU         \$
SARD        NBITMO
DV          C10
PSR         B               < DECONCATENATION DES CHIFFRES DECIMAUX,
JDX         SPU6
LYI         0               < INITIALISATION DU CUMUL,
LXI         NBITMO/NBITCX
SPU7:    EQU         \$
LR          Y,A
MP          C16
PLR         Y
ADR         B,Y             < ET RECONCATENATION HEXA-DECIMALE...
JDX         SPU7
LR          Y,A
LXI         MDIAPH-MLUM*NOCMO
BSR         AHEXEX          < CONVERSION ASCI DU DIAPHRAGME...
FLD         FWORK           < RECUPERATION DE LA LUMINANCE,
FMP         XA1             < QUE L'ON "TRANSLATE"...
BSR         AROND           < (A)=LUMINANCE MOYENNE,
<    =SIGMA(LUMINANCE ABSOLUE)*A1*FKONS/
<     NOMBRE DE POINTS.
LXI         MLUMX-MLUM*NOCMO
BSR         AHEXEX          < CONVERSION ASCI DE LA LUMINANCE...
SVC         0
<
< SORTIE :
<
SPU2:    EQU         \$
<
< FIN :
<
SPV:     EQU         \$               < C O M P O S A N T E   E N   ' V '.
SPW:     EQU         \$               < C O M P O S A N T E   E N   ' W '.
FLD         F10000
RSR
:F
:F
< <<'SIOD LUMINANCE 1'
DF'SIOD MOVE RDN 1'
ED'SIOD MOVE RDN 1'
IN0
PAGE
IDP         "SIOD MOVE RDN 1"
<
<
<        M O V E   R D N   1  :
<
<
<        FONCTION :
<                      POUR CHAQUE POINT (XR,YR), ON
<                    PREND LE NIVEAU N=NIVEAU(XR,YR)
<                    DANS 'TV2' ; ON CALCULE ALORS 3
<                    NOMBRE ALEATOIRES, QUI VONT
<                    FORMER UN VECTEUR DEPLACEMENT
<                    APPLIQUE A (XR,YR) ; DONC AINSI
<                    TOUS LES POINTS AYANT LA MEME
<                    COULEUR ASSOCIEE DANS 'TV2' AURONT
<                    LE MEME DEPLACEMENT ALEATOIRE...
<
<                    VECTEURS DEPLACEMENTS :
<                                    A03 <= A00*RDN1(N)+A01*SIN(A02) <= A04,
<                                    A08 <= A05*RDN2(N)+A06*SIN(A07) <= A09,
<                                    A0D <= A0A*RDN3(N)+A0B*SIN(A0C) <= A0E.
<
<
<        PARAMETRES :
A00::    VAL         0
A01::    VAL         A00+1
A02::    VAL         A01+1
A03::    VAL         A02+1           < MIN(DELTA(X)),
A04::    VAL         A03+1           < MAX(DELTA(X)).
A05::    VAL         A04+1
A06::    VAL         A05+1
A07::    VAL         A06+1
A08::    VAL         A07+1           < MIN(DELTA(Y)),
A09::    VAL         A08+1           < MAX(DELTA(Y)).
A0A::    VAL         A09+1
A0B::    VAL         A0A+1
A0C::    VAL         A0B+1
A0D::    VAL         A0C+1           < MIN(DELTA(Z)),
A0E::    VAL         A0D+1           < MAX(DELTA(Z)).
A0F::    VAL         A0E+1           < PREMIER GENERATEUR ALEATOIRE,
A10::    VAL         A0F+1           < SECOND GENERATEUR ALEATOIRE,
A11::    VAL         A10+1           < TROISIEME GENERATEUR ALEATOIRE.
<
<
LOCAL
FLOC:    EQU         \$
PREM:    WORD        -1              < INDICATEUR DE PREMIER PASSAGE.
<
< PARAMETRES :
<
XFA00:   FLOAT       0
XFA01:   FLOAT       0
XFA02:   FLOAT       0
XFA03:   FLOAT       0
XFA04:   FLOAT       0
XFA05:   FLOAT       0
XFA06:   FLOAT       0
XFA07:   FLOAT       0
XFA08:   FLOAT       0
XFA09:   FLOAT       0
XFA0A:   FLOAT       0
XFA0B:   FLOAT       0
XFA0C:   FLOAT       0
XFA0D:   FLOAT       0
XFA0E:   FLOAT       0
PARAM1:  FLOAT       0
PARAM2:  FLOAT       0
PARAM3:  FLOAT       0
<
< VARIABLES DE MANOEUVRE :
<
FWORK4:  FLOAT       0
FWORK5:  FLOAT       0
XFSUP:   FLOAT       0               < BORNE SUP COURANTE,
XFINF:   FLOAT       0               < BORNE INF COURANTE.
<
< PARAMETRES DE GENERATION RDN :
<
INFIN1:  FLOAT       32768           < INFINI ENTIER,
INFIN2:  FLOAT       16384           < INFINI ENTIER/2...
<
< RELAIS :
<
ASPRDN:  WORD        SPRDN           < GENERATION ALEATOIRE.
PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         \$
<
< ENTREE DES PARAMETRES :
<
CPZ         PREM            < EST-CE LA PREMIERE FOIS ???
JGE         SPU1            < NON...
IC          PREM            < OUI, ON ENTRE LES PARAMETRES :
LXI         A00
BSR         ASPCT
FST         XFA00
LXI         A01
BSR         ASPCT
FST         XFA01
LXI         A02
BSR         ASPCT
FST         XFA02
LXI         A03
BSR         ASPCT
FST         XFA03
LXI         A04
BSR         ASPCT
FST         XFA04
LXI         A05
BSR         ASPCT
FST         XFA05
LXI         A06
BSR         ASPCT
FST         XFA06
LXI         A07
BSR         ASPCT
FST         XFA07
LXI         A08
BSR         ASPCT
FST         XFA08
LXI         A09
BSR         ASPCT
FST         XFA09
LXI         A0A
BSR         ASPCT
FST         XFA0A
LXI         A0B
BSR         ASPCT
FST         XFA0B
LXI         A0C
BSR         ASPCT
FST         XFA0C
LXI         A0D
BSR         ASPCT
FST         XFA0D
LXI         A0E
BSR         ASPCT
FST         XFA0E
LXI         A0F
BSR         ASPCT
FST         PARAM1
LXI         A10
BSR         ASPCT
FST         PARAM2
LXI         A11
BSR         ASPCT
FST         PARAM3
<
< CALCUL DE 'X' :
<
SPU1:    EQU         \$
FLD         XFA03
FST         XFINF           < BORNE INFERIEURE,
FLD         XFA04
FST         XFSUP           < BORNE SUPERIEURE,
FLD         PARAM1          < (A,B)=PARAMETRE INITIAL...
BSR         ASPRDN          < RDN1,
FMP         XFA00           < A00*RDN1,
FST         FWORK4
FLD         XFA02           < A02,
BSR         ASIN            < SIN(A02),
FMP         XFA01           < A01*SIN(A02),
FAD         VARU            < ET ENFIN, ON TRANSLATE LA COORDONNEE
< 'U' COURANTE...
RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         \$
<
< CALCUL DE 'Y' :
<
FLD         XFA08
FST         XFINF           < BORNE INFERIEURE,
FLD         XFA09
FST         XFSUP           < BORNE SUPERIEURE,
FLD         PARAM2          < (A,B)=PARAMETRE INITIAL...
BSR         ASPRDN          < RDN2,
FMP         XFA05           < A05*RDN2,
FST         FWORK4
FLD         XFA07           < A07,
BSR         ASIN            < SIN(A07),
FMP         XFA06           < A06*SIN(A07),
FAD         VARV            < ET ENFIN, ON TRANSLATE LA COORDONNEE
< 'V' COURANTE...
RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         \$
<
< CALCUL DE 'Z' :
<
FLD         XFA0D
FST         XFINF           < BORNE INFERIEURE,
FLD         XFA0E
FST         XFSUP           < BORNE SUPERIEURE,
FLD         PARAM3          < (A,B)=PARAMETRE INITIAL...
BSR         ASPRDN          < RDN3,
FMP         XFA0A           < A0A*RDN3,
FST         FWORK4
FLD         XFA0C           < A0C,
BSR         ASIN            < SIN(A0C),
FMP         XFA0B           < A0B*SIN(A0C),
< CE QUI DONNE LA COMPOSANTE 'W'...
RSR
PAGE
<
<
<        G E N E R A T I O N   A L E A T O I R E  :
<
<
<        ARGUMENTS :
<                    (A,B)=CONSTANTE D'INITIALISATION,
<                    (XFINF,XFSUP)=BORNES COURANTES.
<
<
<        RESULTAT :
<                    (A,B)=NOMBRE FLOTTANT ALEATOIRE COMPRIS
<                          ENTRE LA BORNE INF ET LE BORNE
<                          INFERIEURE, ET FONCTION DE (A)
<                          ET DU NIVEAU(XR,YR) DANS 'TV2'.
<
<
SPRDN:   EQU         \$
PSR         A,B             < SAUVEGARDE DE LA CONSTANTE INITIALE.
<
< ACCES A 'TV2' :
<
LA          CTCDA
STA         XCTCDA          < POUR ACCEDER A 'TV2'...
LA          XS
LB          YS
PSR         A,B             < SAUVEGARDE DE (XS,YS),
LA          XR
LB          YR
STB         YS              < ON FAIT :
STA         XS              <           (XS,YS)=(XR,YR)...
BSR         ASPGPS          < (A)=NIVEAU(XS,YS),
BSR         AFLT
BSR         ASIN            < POUR RIRE...
EORR        B,A
SWBR        A,A
BSR         AFLT
FST         FWORK           < QUE L'ON FLOTTE, ET SAUVEGARDE...
PLR         A,B
STB         YS              < RESTAURATION
STA         XS              <              DE (XS,YS),
STZ         XCTCDA          < ET RETOUR A 'TV1'...
<
< GENERATION ALEATOIRE :
<
PLR         A,B
FAD         FWORK           < A LAQUELLE ON AJOUTE LE NIVEAU
< DU POINT (XR,YR) DANS 'TV2',
BSR         ASIN            < DONT ON PREND LE SINUS,
EORR        B,A             < QUE L'ON CONVERTIT EN ENTIER,
SWBR        A,A             < POUR GENERER DU NEGATIF...
BSR         AFLT            < PUIS EN FLOTTANT...
<
< NORMALISATION :
<
FMP         F05             < RDN/2,
PSR         A,B             < SAVE RDN/2...
FST         FWORK4
FLD         XFSUP           < BORNE SUPERIEURE COURANTE,
FMP         FWORK4
FST         FWORK4
PLR         A,B             < RDN/2,
FSB         INFIN2          < (RDN-INFINI)/2,
FST         FWORK5
FLD         XFINF           < BORNE INFERIEURE COURANTE,
FMP         FWORK5
FST         FWORK5
FLD         FWORK4
FSB         FWORK5
FDV         INFIN1          < MISE A L'ECHELLE...
<
< SORTIE :
<
RSR
:F
:F
< <<'SIOD MOVE RDN 1'
DF'SIOD FACETTES 1'
ED'SIOD FACETTES 1'
IN0
PAGE
IDP         "SIOD FACETTES 1"
<
<
<        R E C U P E R A T I O N   D E S   F A C E T T E S   1  :
<
<
<        FONCTION :
<                      CE MODULE RECUPERE LES
<                    FACETTES "X/YYXXT" GENEREES
<                    PAR LA COMBINAISON DE " +"
<                    ET DU PROGRAMME DE MAILLAGE ;
<                    A CHAQUE PASSAGE DANS 'SPU',
<                    ON RECHERCHE LA FACETTE SUIVANTE
<                    ET ON LA VISUALISE SUR L'ECRAN
<                    APRES LUI AVOIR FAIT SUBIR LA
<                    MATRICE DE TRANSFORMATION COU-
<                    RANTE..
<
<
<        ARGUMENTS :
A0::     VAL         0               < DERNIER CARACTERE ATTENDU POUR LE NOM
< DES FACETTES :
< "0" : POUR LES FACETTES "INTERNES",
< "1" A "6" : POUR LES FACETTES "EXTERNES".
A1::     VAL         A0+1            < MOT 0 DE LA DEMANDE GRAPHIQUE,
A2::     VAL         A1+1            < MOT 1 DE LA DEMANDE GRAPHIQUE.
<
<
<
<
<        L O C A L  :
<
<
LOCAL
FLOC:    EQU         \$
IPREM:   WORD        0               < INDICATEUR DE PREMIER PASSAGE...
IFINI:   WORD        0               < =0 : ON PEUT EXPLORER LE CATALOGUE,
< #0 : ON A FINI L'EXPLORATION...
<
< RELAIS DIVERS :
<
AMATRB:  WORD        MATRB           < ACCES A LA MATRICE DE TRANSFORMATION.
APROJB:  WORD        PROJB           < PROJECTION 2D --> 3D.
AVISU:   WORD        VISU            < PASSAGE 'TV' --> 'VISU'...
<
< CONSTANTES :
<
XA0:     WORD        0               < DERNIER CARACTERE ATTENDU POUR CHAQUE
< NOM DE FACETTE ("0" : FACETTES INTERNES,
< ET DE "1" A "6" POUR LES FACETTES EXTER-
< NES).
FINITE:  FLOAT       1000000         < POUR UN OVERS-SCREEN...
<
< FACETTES PROJETTEES :
<
CA2D:    EQU         \$               < SOMMET 'A' 2D :
XSA:     WORD        0               < X(A),
YSA:     WORD        0               < Y(A).
CB2D:    EQU         \$               < SOMMET 'B' 2D :
XSB:     WORD        0               < X(B),
YSB:     WORD        0               < Y(B).
CC2D:    EQU         \$               < SOMMET 'C' 2D :
XSC:     WORD        0               < X(C),
YSC:     WORD        0               < Y(C).
<
<
<        D E F I N I T I O N   D E S   F A C E T T E S  :
<
<
ANFACE:  WORD        NFACET,X        < RELAI D'ACCES AU NOM DE LA FACETTE.
NFACET:  ASCI        "X/"            < NOM DES FACETTES "X/YYXX"...
NFACE1:  ASCI        "YYXX"          < DESTINE A CONTENIR L'INDICE TOPOLOGIQUE.
NFACE2:  BYTE        "Z";EOT
LNFACE:: VAL         \$-NFACET*NOCMO
< LONGUEUR DU NOM D'UNE FACETTE...
CF3D:    EQU         \$               < DEBUT DE LA LISTE DES SOMMETS :
CA3D:    EQU         \$               < SOMMET 'A' :
FXSA:    FLOAT       0               < XA,
FYSA:    FLOAT       0               < YA,
FZSA:    FLOAT       0               < ZA.
LBUF3D:: VAL         \$-CA3D
NA3D:    EQU         \$               < VECTEUR NORMAL EN 'A' :
XNA:     FLOAT       0               < XN(A),
YNA:     FLOAT       0               < YN(A),
ZNA:     FLOAT       0               < ZN(A).
VARUA:   FLOAT       0               < UA,
VARVA:   FLOAT       0               < VA.
IDENTA:  BYTE        0;0             < IDENTA.
CB3D:    EQU         \$               < SOMMET 'B' :
FXSB:    FLOAT       0               < XB,
FYSB:    FLOAT       0               < YB,
FZSB:    FLOAT       0               < ZB.
NB3D:    EQU         \$               < VECTEUR NORMAL EN 'B' :
XNB:     FLOAT       0               < XN(B),
YNB:     FLOAT       0               < YN(B),
ZNB:     FLOAT       0               < ZN(B).
VARUB:   FLOAT       0               < UB,
VARVB:   FLOAT       0               < VB.
IDENTB:  BYTE        0;0             < IDENTB.
CC3D:    EQU         \$               < SOMMET 'C' :
FXSC:    FLOAT       0               < XC,
FYSC:    FLOAT       0               < YC,
FZSC:    FLOAT       0               < ZC.
NC3D:    EQU         \$               < VECTEUR NORMAL EN 'C' :
XNC:     FLOAT       0               < XN(C),
YNC:     FLOAT       0               < YN(C),
ZNC:     FLOAT       0               < ZN(C).
VARUC:   FLOAT       0               < UC,
VARVC:   FLOAT       0               < VC.
IDENTC:  BYTE        0;0             < IDENTC.
PLAN3D:  EQU         \$               < DEFINITION DU PLAN :
PLANAF:  FLOAT       0               < A=XN,
PLANBF:  FLOAT       0               < B=YN,
PLANCF:  FLOAT       0               < C=ZN,
PLANDF:  FLOAT       0               < D.
LFACET:: VAL         \$-NFACET*NOCMO  < LONGUEUR TOTALE NOM+VALEUR D'UNE FACETTE.
<
< DONNEES D'ACCES A UNE FACETTE :
<
DEMSGN:  BYTE        '00;'02         < DEMANDE D'ACCES AU 'SGN' :
WORD        NFACET-ZERO*NOCMO
WORD        0               < LA LONGUEUR VARIE SUIVANT LE 'NVP'...
WORD        -1
XRAC:    WORD        0               < NOMBRE DE CARACTERES DE LA RACINE "X/",
SXRAC:   WORD        0               < (SXRAC)=(XRAC)-Z.
ASPSGN:  WORD        SPSGN           < SOUS-PROGRAMME D'ACCES AU 'SGN'...
<
< DONNEES GRAPHIQUES :
<
BGRAPH:  EQU         \$
MODE1:   BYTE        '00;'00         < OCTET GAUCHE=QUE FAIRE DES POINTS ANTE-
<              RIEURS DANS 'MEMTV',
< OCTET DROITE=POINTILLES.
MODE2:   BYTE        '01;'B0         < OCTET GAUCHE=TYPE DE LOGIQUE,
< OCTET DROITE=LA COULEUR DU TRACE SUR
<              LES 4 DERNIERS BITS.
YV1:     WORD        0               < Y1 VIDEO,
XV1:     WORD        0               < X1 VIDEO.
YV2:     WORD        0               < Y2 VIDEO,
XV2:     WORD        0               < X2 VIDEO.
YG1:     WORD        0               < Y1 GRAPHIQUE,
XG1:     WORD        0               < X1 GRAPHIQUE.
YG2:     WORD        0               < Y2 GRAPHIQUE,
XG2:     WORD        0               < X2 GRAPHIQUE.
LGRAPH:: VAL         \$-BGRAPH
DEMGRA:  WORD        TVDKU           < DEMANDE D'INTERPOLATION 12K...
WORD        BGRAPH-ZERO*NOCMO
WORD        LGRAPH*NOCMO
WORD        0
PROG
PAGE
<
<
<        A P P E L   D U   ' S G N '  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME PERMET
<                    D'APPELER LE 'SGN' POUR
<                    CONNAITRE SOIT LE SUIVANT
<                    SERIE, SOIT LE SUIVANT PA-
<                    RALLELE DE LA CHAINE DE CA-
<                    RACTERES COURANTE.
<
<
<        ARGUMENT :
<                    (A)='NVPLON', 'NVPNXS' OU 'NVPNXP',
<                    (X)=INDEX DU CARACTERE COURANT.
<
<
<        RESULTAT :
<                    (A)=CODES D'ERREUR EVENTUELS.
<
<
SPSGN:   EQU         \$
<
< INITIALISATIONS :
<
PSR         X               < SAUVEGARDE DE L'INDEX COURANT...
STBY        DEMSGN          < MISE EN PLACE DU 'NVP' CHOISI...
<
< VALIDATIONS :
<
CPZR        X
JGE         SPSGN1          < OK...
QUIT        1               < E R R E U R   P R O G R A M M E...
SPSGN1:  EQU         \$
<
< ACCES AU 'SGN' :
<
CPI         '80?SGNLON
JNE         SPSGN2          < CE N'EST PAS 'LON'...
LAI         LFACET          < CAS DE 'LON', ON MET ON PLACE LA LONGUEUR
< NOM+VALEUR...
JMP         SPSGN3
SPSGN2:  EQU         \$               < CAS DE 'NXP' ET 'NXS' :
LR          X,A             < ON CALCULE LA LONGUEUR DE LA CHAINE
SPSGN3:  EQU         \$
STA         DEMSGN+2        < MISE EN PLACE DE LA LONGUEUR
< COURANTE.
SVC         0               < APPEL DU 'SGN'.
<
< ET RETOUR :
<
LR          X,A             < A=CONDITIONS DE RETOUR.
PLR         X               < RESTAURE X COURANT.
RSR
PAGE
<
<
<        P A S S A G E   ' T V '   -->   ' V I S U '  :
<
<
VISU:    EQU         \$
<
< CONVERSION DE 'X' :
<
LA          XS
SLLS        DEDX
STA         XS
<
< CONVERSION DE 'Y' :
<
LRM         A
WORD        NLIGM1
SB          YS
SLLS        DEDY
STA         YS
<
< ET RETOUR :
<
RSR
PAGE
<
<
<        A C C E S   A   L A   M A T R I C E   D E   T R A N S F O R M A T I O N
<        P O U R   U N   S O M M E T   D E   L A   F A C E T T E  :
<
<
<        ARGUMENT :
<
<
MATRB:   EQU         \$
LRM         B,X
WORD        FXS
WORD        LBUF3D
MOVE                        < LE SOMMET EST MIS DANS LE POINT
< COURANT, AFIN QUE 'MATR' FONCTIONNE
< CORRECTEMENT...
PSR         L               < SAVE LE 'L' LOCAL...
LRM         L
WORD        LOC+'80         < ET MISE DE 'L' DE " +"...
USE         L,LOC+'80
<     FORMER,
BSR         AMATR           < ET TRANSFORMATION GEOMETRIQUE...
PLR         L               < RESTAURE LE 'L' LOCAL...
USE         L
RSR
PAGE
<
<
<        P R O J E C T I O N  :
<
<
<        ARGUMENT :
<                    (FXS,FYS,FZS)=POINT 3D.
<
<
<        RESULTAT :
<                    (A)=YS,
<                    (XS,YS)=POINT 2D.
<
<
PROJB:   EQU         \$
PSR         L               < SAVE LE 'L' LOCAL...
LRM         L
WORD        LOC+'80         < ET MISE DE 'L' DE " +"...
USE         L,LOC+'80
BSR         APROJ           < PROJECTION 2D --> 3D...
PLR         L               < RESTAURE LE 'L' LOCAL...
USE         L
RSR
PAGE
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         \$
CPZ         IFINI           < A-T'ON FINI L'EXPLORATION DU CATALOGUE ??
JNE         SPU3            < OUI, ON SORT...
<
<
<        P A R C O U R S   D U   C A T A L O G U E   " X / "  :
<
<
LX          SXRAC           < (X)=A PRIORI LA VALEUR SAUVEGARDEE
<     DE 'XRAC'...
CPZ         IPREM           < EST-CE LA PREMIERE FOIS ???
JG          E102            < NON, ON GARDE 'X', ET ON VA CHERCHER LE
< NOM SUIVANT...
<
< INITIALISATIONS DES CONSTANTES :
<
IC          IPREM           < OUI, IL FAUT INITIALISER 'X'...
LXI         A0
BSR         ASPCT
BSR         AROND
STA         XA0             < ENTREE DU DERNIER CARACTERE DES NOMS
< DES FACETTES...
LXI         A1
BSR         ASPCT
BSR         AROND
STA         MODE1           < PREMIER MOT DE MODE GRAPHIQUE,
LXI         A2
BSR         ASPCT
BSR         AROND
STA         MODE2           < DEUXIEME MOT DE MODE GRAPHIQUE.
<
< INITIALISATION DU PARCOURS :
<
LXI         NFACE1-NFACET*NOCMO
STX         XRAC            < (XRAC)=LONGUEUR DE LA RACINE,
<
<        B O U C L E   D E   R E C U P E R A T I O N  :
<
E100:    EQU         \$
LAI         '89             < (A)='NVPNXS'...
BSR         ASPSGN          < DEMANDE DE NEXT-SERIE.
CPI         '05             < TEST DU CODE D'ERREUR.
JE          E103            < IL N'Y A PAS DE NEXT SERIE...
JAE         E101            < OK, LE NEXT-SERIE EXISTE.
LR          X,A
CP          XRAC            < EST-ON DE RETOUR SUR LA RACINE ???
JL          E106            < OUI, ON ARRETE LE PARCOURS DU CATALOGUE.
ADRI        -1,X            < DANS LES AUTRES CAS D'ERREURS,
< ON FAIT UN RETOUR ARRIERE, CAR
< EN EFFET ON NE DOIT PLUS SAVOIR
< OU L'ON EN EST SUITE A UN
< DELETE SIMULTANE...
JMP         E100            < N'ETANT PAS DE RETOUR SUR
< LA RACINE, ON CONTINUE.
<
< CAS OU IL Y A UN NEXT-SERIE :
<
E101:    EQU         \$
LBY         &ANFACE         < RECUPERATION DE CE NEXT-SERIE.
CPI         EOT             < EST-CE UNE FIN DE NOM ???
JNE         E100            < NON, ON CONTINUE A RECUPERER.
LBY         &ANFACE         < RECUPERONS LE CARACTERE PRECEDENT :
CP          XA0             < EST-CE LA CARACTERE PARAMETRE ATTENDU ???
JNE         E102            < NON, LE NOM EST IGNORE...
<
< ACCES A LA VALEUR COURANTE :
<
LAI         '80?SGNLON      < (A)='NVPLON' (SOUS ":SYS"...).
BSR         ASPSGN          < CHARGEMENT DE LA VALEUR...
ACTD        3               < ACCES A LA TAILLE DE LA VALEUR CHARGEE :
LR          B,A             < (A)=NOMBRE D'OCTETS OCCUPES :
CPI         LFACET-LNFACE   < EST-CE BIEN CE QUE L'ON ATTEND ???
JNE         E102            < NON, ON L'IGNORE...
<
<
<        T R A I T E M E N T   D E   L A   F A C E T T E
<                    C O U R A N T E  :
<
<
PSR         A,B,X
<
< TRANSFORMATION ET PROJECTION DE 'A' :
<
BSR         AMATRB          < TRANSFORMATION GEOMETRIQUE DE 'A',
BSR         APROJB          < PROJECTION DE 'A'.
BSR         AVISU           < ET MISE AU FORMAT VISU...
LA          XS
STA         XSA
LA          YS
STA         YSA
<
< TRANSFORMATION ET PROJECTION DE 'B' :
<
BSR         AMATRB          < TRANSFORMATION GEOMETRIQUE DE 'B',
BSR         APROJB          < PROJECTION DE 'B'.
BSR         AVISU           < ET MISE AU FORMAT VISU...
LA          XS
STA         XSB
LA          YS
STA         YSB
<
< TRANSFORMATION ET PROJECTION DE 'C' :
<
BSR         AMATRB          < TRANSFORMATION GEOMETRIQUE DE 'C',
BSR         APROJB          < PROJECTION DE 'C'.
BSR         AVISU           < ET MISE AU FORMAT VISU...
LA          XS
STA         XSC
LA          YS
STA         YSC
<
< TRACE GRAPHIQUE :
<
LB          XSA
STB         XG1
LB          YSA
STB         YG1
LB          XSB
STB         XG2
LB          YSB
STB         YG2
SVC         0               < TRACE DE 'AB'...
LB          XSC
STB         XG1
LB          YSC
STB         YG1
SVC         0               < TRACE DE 'CB'...
LB          XSA
STB         XG2
LB          YSA
STB         YG2
SVC         0               < TRACE DE 'CA'...
<
< FIN DE LA FACETTE COURANTE :
<
PLR         A,B,X
SPU2:    EQU         \$
STX         SXRAC           < ON SAUVEGARDE 'X' POUR LE TOUR SUIVANT...
SPU3:    EQU         \$               < CAS OU L'EXPLORATION DU CATALOGUE
< EST ACHEVEE...
FLD         FINITE          < POUR UN OVERSCREEN...
RSR
<
< RECHERCHE DU NEXT-PARALLELE :
<
E102:    EQU         \$
E103:    EQU         E102            < ENTRY DE 1ERE RECHERCHE NEXT-
< SERIE (CF. RACINE D'UN CATALOGUE)
LAI         '88
BSR         ASPSGN          < RECHERCHE NEXT-PARALLELE.
CPI         '05             < TEST DU CODE D'ERREUR.
JE          E105            < CAS DU NEXT-PARALLELE QUI
< N'EXISTE PAS...
JANE        E100            < AUTRES CAS DU SUREMENT A UN
< DELETE SIMULTANE QUI DESORIENTE!!!
<
< CAS OU IL Y A UN NEXT-PARALLELE :
<
E104:    EQU         \$
LBY         &ANFACE         < RECUPERATION DE CELUI-CI.
STBY        &ANFACE         < ET ON LE MET A SA BONNE PLACE.
JMP         E100            < ET RETOUR A LA BOUCLE DE
< RECUPERATION.
<
< CAS OU IL N'Y A PAS DE NEXT-PARALLELE :
<
E105:    EQU         \$
ADRI        -1,X            < RETOUR ARRIERE DANS LE NOM.
LR          X,A             < POUR VALIDATION.
CP          XRAC            < EST-ON DE RETOUR SUR LA RACINE ???
JGE         E102            < NON, ON CONTINUE...
<
< FIN DE PARCOURS :
<
E106:    EQU         \$
IC          IFINI           < AFIN DE NE PLUS EXPLORER...
JMP         SPU3            < ET ON SORT SANS RIEN FAIRE...
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         \$
FLD         FINITE          < POUR UN OVER-SCREEN...
RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         \$
FLD         FINITE          < POUR UN OVERS-SCREEN...
RSR
:F
:F
< <<'SIOD FACETTES 1'
DF'SIOD AUTOMATE 1'
ED'SIOD AUTOMATE 1'
IN0
PAGE
IDP         "SIOD AUTOMATE 1"
<
<
<        A U T O M A T E S   C E L L U L A I R E S   1  :
<
<
<        FONCTION :
<                      CE MODULE EXAMINE EN CHAQUE
<                    POINT LA PATTERN DES VOISINS
<                    (DEFINIE PAR UNE SPIRALE DE
<                    'A20' POINTS DEFINIS PAR LES
<                    LISTES DE NIVEAUX 'A01', 'A02',...)
<                    S'IL Y A COINCIDENCE, LE
<                    POINT CENTRAL EST MARQUE AVEC
<                    LA COULEUR 'A22', SINON, IL
<                    EST EFFACE AVEC 'A23'... LE MOT
<                    COINCIDENCE SIGNIFIANT QUE LE
<                    NIVEAU DU POINT COURANT DE LA
<                    SPIRALE EN COURS D'EXPLORATION
<                    EST A 1 DANS LA LISTE COURANTE
<                    (DE MEME RANG QUE LE POINT) 'AX'.
<
<
<        ARGUMENTS :
A20::    VAL         '20             < NOMBRE DE POINTS 'NPM' DE CHAQUE SPIRALE,
A21::    VAL         A20+1           < PAS DE LA SPIRALE (+1 EN GENERAL),
A22::    VAL         A21+1           < COULEUR DE MARQUAGE,
A23::    VAL         A22+1           < COULEUR D'EFFACEMENT.
A24::    VAL         A23+1           < COMMENT GERER LES "HORS-ECRAN" :
< =0 : FAIRE COMME S'IL Y AVAIT COINCIDENCE
< #0 : PAS DE COINCIDENCE ==> EFFACAGE
<      IMMEDIAT...
<
<
<        L O C A L  :
<
<
LOCAL
FLOC:    EQU         \$
PASQ:    WORD        0               < ARGUMENT 'A21'.
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,
FNP:     FLOAT       0               < IDEM EN FLOTTANT.
NPM:     WORD        0               < NOMBRE DE POINTS ENTIER DE LA SPIRALE.
COULMA:  WORD        0               < COULEUR DE MARQUAGE ('A22'),
COULRA:  WORD        0               < COULEUR D'EFFACEMENT ('A23').
OVSCR:   WORD        0               < GESTION DES "HORS-ECRAN" :
< =0 : POURSUIVRE L'EXPLORATION DE LA
<      SPIALE COMME S'IL Y AVAIT EU
<      COINCIDENCE,
< #0 : EFFACER IMMEDIATEMENT...
FINFIN:  FLOAT       100000          < INFINI...
ASPIR:   WORD        SPIR            < CALCUL DU SIGMA SUR UNE SPIRALE...
IPREM:   WORD        0               < INDICATEUR DE PREMIERE ENTREE...
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
PROG
SPU:     EQU         \$
<
< TEST DU PREMIER POINT, ET
< INITIALISATION DU Z-BUFFER :
<
LA          IPREM           < EST-CE LA PREMIERE FOIS ???
JANE        SPU2            < NON...
IC          IPREM           < OUI, INITIALISATION...
<
< DEFINITION DE LA SPIRALE :
<
LXI         A20
BSR         ASPCT
FST         FNP
BSR         AROND
JALE        \$               < ?!?!?!?!!!!!
CPI         A20             < VALIDATION...
JGE         \$               < ??!??!?!
STA         NPM             < NOMBRE DE POINTS MAX...
LXI         A21
BSR         ASPCT
BSR         AROND
JALE        \$               < !??!?!?!
STA         PASQ            < PAS DE PARCOURS...
<
< ENTREE DES COULEURS :
<
LXI         A22
BSR         ASPCT
BSR         AROND
STA         COULMA          < COULEUR DE MARQUAGE,
LXI         A23
BSR         ASPCT
BSR         AROND
STA         COULRA          < COULEUR D'EFFACEMENT.
<
< GESTION DES "HORS-ECRAN" :
<
LXI         A24
BSR         ASPCT
BSR         AROND
STA         OVSCR
<
< CALCUL DE LA COMPOSANTE EN 'U' :
<
SPU2:    EQU         \$
FLD         FINFIN          < POUR UN OVER-SCREEN...
RSR                         < ?!???!
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         \$
FLD         FINFIN          < POUR UN OVER-SCREEN...
RSR                         < ???!?
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         \$
LA          XR
LB          YR
PSR         A,B             < SAUVEGARDE DU POINT COURANT...
<
< CALCUL DU POINT COURANT :
<
FLD         VARU
FDV         KFU
FDV         KUZ
FST         FWORK
LA          TRX
FLT
FIX
STA         XS              < COORDONNEE 'X' DU PREMIER SOMMET,
STA         XR              < CENTRE DE LA SPIRALE...
FLD         VARV
FDV         KFV
FDV         KVZ
FST         FWORK
LA          TRY
FLT
FIX
STA         YS              < COORDONNEE 'Y' DU PREMIER SOMMET,
STA         YR              < CENTRE DE LA SPIRALE...
<
< CONVOLUTION PROPREMENT DITE :
<
BSR         ASPIR           < MARQUAGE DU POINT COURANT (XS,YS)=(XR,YR)
<
< RETOUR :
<
PLR         A,B
STA         XR              < RESTAURATION
STB         YR              <              DU POINT COURANT...
FLD         F0              < ET PAS DE DEPLACEMENT...
RSR
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         \$
<
< INITIALISATION DE LA SPIRALE :
<
LA          XR
LB          YR
PSR         A,B             < SAUVEGARDE DU POINT (XR,YR).
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         SPMOYB          < LE POINT EST HORS-ECRAN...
CPI         NPOLM1
JG          SPMOYB          < HORS-ECRAN...
LA          YR
JAL         SPMOYB          < HORS-ECRAN...
CPI         NLIGM1
JG          SPMOYB          < HORS-ECRAN...
BSR         ASPGPR          < A=NIVEAU(XR,YR),
LR          A,Y             < (Y)=NIVEAU DU POINT COURANT.
LX          NP              < (X)=NUMERO DU POINT COURANT (DE 1 A NPM),
BSR         ASPCT           < ACCES A LA LISTE DES NIVEAUX :
BSR         AFIX            < (A)=LISTE DES NIVEAUX SIGNIFICATIFS (1),
LR          Y,X             < (X)=NIVEAU DU POINT COURANT,
TBT         0,X             < ALORS, Y-A-T'IL COINCIDENCE ???
JNC         SPMOYC          < NON, ON EFFACE IMMEDIATEMENT...
SPMOY4:  EQU         \$               < OUI, ON POURSUIT L'EXPLORATION...
LA          XR
STA         XR
LA          YR
AD          DELTAY          < POINT COURANT (XS,YS).
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
<
< GESTION DES "HORS-ECRAN" :
<
SPMOYB:  EQU         \$
CPZ         OVSCR           < QUE FAIRE ???
JE          SPMOY4          < FAIRE COMME S'IL Y AVAIT EU COINCIDENCE..
SPMOYC:  EQU         \$
LA          COULRA          < NON,
< (A)=COULEUR D'EFFACEMENT...
JMP         SPMOY7          < VERS L'EFFACEMENT...
<
< GENERATION DU POINT (XS,YS) :
<
SPMOY3:  EQU         \$
LA          COULMA          < (A)=COULEUR DE MARQUAGE...
SPMOY7:  EQU         \$
BSR         ASPRPS          < ET ON LE MARQUE, OU ON L'EFFACE...
SPMOYA:  EQU         \$
PLR         A,B
STA         XR              < RESTAURATION DE
STB         YR              <                 (XR,YR)...
RSR
:F
:F
< <<'SIOD AUTOMATE 1'
```