DATE
         PROG
         TRN
<
<
<        D E F I N I T I O N S   G E N E R A L E S  :
<
<
XUNDEF:: VAL         -1              < POUR NE DEFINIR QUE LES 'XX...' DANS LES
                                     < FICHIERS DE DEFINITION...
         CALL        #SIP DEFINITION CTTE#
<
< PREPARATION DE L'APPEL DE #SIP UTILITAIRES# :
<
XXXDEF:  VAL         XUNDEF
XXXLOC:  VAL         XUNDEF
XXXTAB:  VAL         XUNDEF
XXXPRO:  VAL         XUNDEF
         CALL        #SIP UTILITAIRES#
<
<
<        D E F I N I T I O N   D E   L ' I M A G E  :
<
<
XXXVEC:  VAL         XUNDEF          < AFIN DE NE DEFINIR QUE LES 'XXVEC'...
         CALL        #SIP VECTEUR 512#
XXXVEC:  VAL         XXVEC1          < DEFINITION DES CONSTANTES IMAGE/VECTEUR.
         CALL        #SIP VECTEUR 512#
         PAGE
<
<
<        O P T I O N S   D ' A S S E M B L A G E  :
<
<
XOPT01: @
XWOR%1:  VAL         KOLF=FMASK+KOLTES=FVAL
XWOR%1:  VAL         KOLC=FMASK+KDP=FVAL?XWOR%1
XWOR%2:  VAL         KOLTED=FMASK+KOL0=FVAL
XWOR%2:  VAL         KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2
XWOR%3:  VAL         XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT...
XWOR%4:  VAL         MSYMBI=FMASK+KOL0=FVAL
XWOR%4:  VAL         MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4
XWOR%5:  VAL         XWOR%4=FCSYMT   < ETAT DU SYMBOLE 'XOPT01'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
XOPT01:: VAL         EXIST           < TRACE GRAPHIQUE, ET VERIFICATIONS CROI-
                                     < SEES DES EQUATIONS CALCULEES...
XEIF%:   VAL         ENDIF
         PAGE
<
<
<        B A S   D E   L A   M E M O I R E  :
<
<
ZERO:    EQU         $
         DZS         PEPROG-D+Z
<
< POINT D'ENTREE :
<
ENTRY:   EQU         $
         LRM         A,K
         WORD        DEBUT           < POINT D'ENTREE DU PROGRAMME,
         WORD        STACK-DEPILE    < INITIALISATION DE LA PILE.
         PSR         A
         RSR                         < ON EFFECTUE AINSI UN 'GOTO' 'DEBUT'...
         PAGE
<
<
<        M E S S A G E S  :
<
<
         TABLE
<
<
<        C O M M O N  :
<
<
         COMMON
COM:     EQU         $
<
< MOT DESTINE AU BLOC FLOTTANT :
<
COMFLO:  WORD        NILK            < MOT "BIDON" DESTINE AU BLOC FLOTTANT
                                     < POUR QU'IL Y FIT SES MERDES...
ATSFLO:  WORD        TSFLO           < POUR TESTER DE TEMPS EN TEMPS 'COMFLO'...
<
< INDICATEURS DE CONTROLE :
<
IERASE:  WORD        EXIST           < EFFACER ('EXIST'), OU NON ('NEXIST')
                                     < L'ECRAN 512...
IQUIT:   WORD        EXIST           < S'ARRETER ('EXIST') OU PAS ('NEXIST')
                                     < APRES CHAQUE IMAGE (POINT D'ARRET).
IVIDEO:  WORD        NEXIST          < DOIT-ON GENERE UNE IMAGE SUR LE
                                     < DISQUE VIDE ('EXIST') OU PAS ('NEXIST').
RAYON:   WORD        NILK            < RAYON DE LA PARTICULE DE BASE...
MRAYON:  WORD        NILK            < POUR DETERMINER LE NOMBRE DE NIVEAUX
                                     < UTILISES POUR LA PARTICULE...
NIMAGE:  WORD        NILK            < NOMBRE D'IMAGES A GENERER.
NFILAM:  WORD        NILK            < NOMBRE DE FILAMENTS A TRACER.
NPOINT:  WORD        NILK            < NOMBRE DE POINTS PAR FILAMENT.
IDEGRA:  WORD        EXIST           < MODE DE TRACE DES FILAMENTS :
                                     < 'EXIST'  : DEGRADE,
                                     < 'NEXIST' : COULEUR UNIFORME EGALE AU
                                     <            NUMERO DU FILAMENT.
GRARVR:  WORD        NILK            < GRARVR DU GENERATEUR ALEATOIRE...
SUPRVR:  FLOAT       <NILK<NILK<NILK < SUP(RVR),
INFRVR:  FLOAT       <NILK<NILK<NILK < INF(RVR).
PASRVR:  FLOAT       <NILK<NILK<NILK < PAS(SUP,INF).
GRARVT:  WORD        NILK            < GRARVT DU GENERATEUR ALEATOIRE...
SUPRVT:  FLOAT       <NILK<NILK<NILK < SUP(RVT),
INFRVT:  FLOAT       <NILK<NILK<NILK < INF(RVT).
PASRVT:  FLOAT       <NILK<NILK<NILK < PAS(SUP,INF).
GRARDR:  WORD        NILK            < GRARDR DU GENERATEUR ALEATOIRE...
SUPRDR:  FLOAT       <NILK<NILK<NILK < SUP(RDR),
INFRDR:  FLOAT       <NILK<NILK<NILK < INF(RDR).
PASRDR:  FLOAT       <NILK<NILK<NILK < PAS(SUP,INF).
GRARDT:  WORD        NILK            < GRARDT DU GENERATEUR ALEATOIRE...
SUPRDT:  FLOAT       <NILK<NILK<NILK < SUP(RDT),
INFRDT:  FLOAT       <NILK<NILK<NILK < INF(RDT).
PASRDT:  FLOAT       <NILK<NILK<NILK < PAS(SUP,INF).
<
< RELAIS DIVERS :
<
ADEB9:   WORD        DEBUT9
<
< CONSTANTES FLOTTANTES DE BASE :
<
F0:      FLOAT       <K<K<K          < REMISE A ZERO FLOTTANTE...
F1:      FLOAT       <W<K<K          < L'UNITE EN FLOTTANT...
XXXLOC:  VAL         YYYFLO          < 'YYYFLO'.
         CALL        #SIP UTILITAIRES#
<
< VARIABLES DE MANOEUVRE :
<
FWORK1:  FLOAT       <NILK<NILK<NILK
FWORK2:  FLOAT       <NILK<NILK<NILK
<
< DEMANDE DE TEMPORISATION
< APRES EFFACEMENT :
<
TEMPO:   BYTE        NVPSER;FONDOR
         WORD        NILK            < INUTILE...
         WORD        XXXMOY          < 2 PETITES SECONDES...
XXXLOC:  VAL         YYYGOT          < 'YYYGOT'.
         CALL        #SIP UTILITAIRES#
XXXVEC:  VAL         XXVEC2          < DEFINITION DES DONNEES DU VECTEUR 512...
         CALL        #SIP VECTEUR 512#
APOINT:  WORD        POINT           < SOUS-PROGRAMME DE MARQUAGE D'UN POINT
                                     < DE COORDONNEES (X), DONT LE NIVEAU EST
                                     < CALCULE VIA LA TABLE 'LNIVO'.
ALNIVO:  WORD        LNIVO,X         < TABLE DE CORRESPONDANCE DES NIVEAUX POUR
                                     < LE SOUS-PROGRAMME 'POINT'.
<
< ACCES AUX REGISTRES DE CONTROLE :
<
ACTRL1:  WORD        RCTRL1
ACTRL2:  WORD        RCTRL2
<
< DONNEES DE GESTION DES
< COORDONNEES POLAIRES :
<
XGCENT:  FLOAT       <NILK<NILK<NILK < XGRAPHIQUE(CENTRE DU CERCLE),
YGCENT:  FLOAT       <NILK<NILK<NILK < YGRAPHIQUE(CENTRE DU CERCLE).
TETA:    FLOAT       <NILK<NILK<NILK < ANGLE POLAIRE COURANT,
DTETA:   FLOAT       <NILK<NILK<NILK < ET SON INCREMENT.
RHO:     FLOAT       <NILK<NILK<NILK < RAYON POLAIRE COURANT,
DRHO:    FLOAT       <NILK<NILK<NILK < ET SON INCREMENT.
<
< PARAMETRES GENERAUX DES GENERATEURS ALEATOIRES :
<
INF32:   FLOAT       32768
INF64:   FLOAT       65536
FWORK4:  FLOAT       <NILK<NILK<NILK
FWORK5:  FLOAT       <NILK<NILK<NILK
<
< PARAMETRES DU GENERATEUR 'RVR' :
<
RVR:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RVR1:    WORD        5189            < CONSTANTE
RVR2:    WORD        6791            < DE CALCUL DES
RVR3::   VAL         19              < NOMBRE ALEATOIRES...
RVR4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RVR5:    WORD        4021
RVR6::   VAL         23
RVR64:   FLOAT       <NILK<NILK<NILK < SUPRVR/65536.
RVRMIS:  FLOAT       <NILK<NILK<NILK < 1-(INF/SUP),
RVRPIS:  FLOAT       <NILK<NILK<NILK < 32768*(1+(INF/SUP)).
ASPRVR:  WORD        SPRVR           < GENERATEUR ALEATOIRE 2D.
<
< PARAMETRES DU GENERATEUR 'RVT' :
<
RVT:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RVT1:    WORD        5189            < CONSTANTE
RVT2:    WORD        6791            < DE CALCUL DES
RVT3::   VAL         19              < NOMBRE ALEATOIRES...
RVT4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RVT5:    WORD        4021
RVT6::   VAL         23
RVT64:   FLOAT       <NILK<NILK<NILK < SUPRVT/65536.
RVTMIS:  FLOAT       <NILK<NILK<NILK < 1-(INF/SUP),
RVTPIS:  FLOAT       <NILK<NILK<NILK < 32768*(1+(INF/SUP)).
ASPRVT:  WORD        SPRVT           < GENERATEUR ALEATOIRE 2D.
<
< PARAMETRES DU GENERATEUR 'RDR' :
<
RDR:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RDR1:    WORD        5189            < CONSTANTE
RDR2:    WORD        6791            < DE CALCUL DES
RDR3::   VAL         19              < NOMBRE ALEATOIRES...
RDR4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RDR5:    WORD        4021
RDR6::   VAL         23
RDR64:   FLOAT       <NILK<NILK<NILK < SUPRDR/65536.
RDRMIS:  FLOAT       <NILK<NILK<NILK < 1-(INF/SUP),
RDRPIS:  FLOAT       <NILK<NILK<NILK < 32768*(1+(INF/SUP)).
ASPRDR:  WORD        SPRDR           < GENERATEUR ALEATOIRE 2D.
<
< PARAMETRES DU GENERATEUR 'RDT' :
<
RDT:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RDT1:    WORD        5189            < CONSTANTE
RDT2:    WORD        6791            < DE CALCUL DES
RDT3::   VAL         19              < NOMBRE ALEATOIRES...
RDT4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RDT5:    WORD        4021
RDT6::   VAL         23
RDT64:   FLOAT       <NILK<NILK<NILK < SUPRDT/65536.
RDTMIS:  FLOAT       <NILK<NILK<NILK < 1-(INF/SUP),
RDTPIS:  FLOAT       <NILK<NILK<NILK < 32768*(1+(INF/SUP)).
ASPRDT:  WORD        SPRDT           < GENERATEUR ALEATOIRE 2D.
<
< DONNEES DE TRACE DES FILAMENTS :
<
FINVER:  FLOAT       <NILK<NILK<NILK < 'FINVER' VAUT +1 OU -1 ; IL VARIE EN
                                     < BASCULE D'UN FILAMENT A L'AUTRE, CE QUI
                                     < PERMET DE FAIRE VARIER LEUR ENROULEMENT
                                     < GENERAL...
<
< DONNEES DE TRACE DE LA PARTICULE :
<
RAYON2:  WORD        NILK            < RAYON CONVERTI EN 'TV'...
ACERCL:  WORD        CERCLE          < SOUS-PROGRAMME DE TRACE.
         PAGE
<
<
<        L O C A L  :
<
<
         LOCAL
LOC:     EQU         $
<
< CONSTANTES DE CALCUL DES SINUS ET COSINUS :
<
ASIN:    WORD        SIN             < S/P DE CALCUL DU SINUS,
ACOS:    WORD        COS             < ET DU COSINUS.
SCWOR1:  FLOAT       <NILK<NILK<NILK
SCWOR2:  FLOAT       <NILK<NILK<NILK
ISIGSC:  WORD        NILK            < SIGNE...
DEUXPI:  FLOAT       6.2831853       < 2 PI
PI3141:  FLOAT       3.1415926       < PI
PISUR2:  FLOAT       1.5707963       < PI/2
POLSC1:  FLOAT       -0.6459636      < COEFFICIENTS
POLSC2:  FLOAT       0.7968969E-1    <              DU
POLSC3:  FLOAT       -0.4673766E-2   <                 POLYNOME
POLSC4:  FLOAT       0.1514842E-3    <                          SIN(X)/COS(X).
<
< GESTION DU DISQUE VIDEO :
<
BUFVIW:  BYTE        "J";KCR
XWOR%1:  VAL         '0000000@@@@(MOCD
XWOR%3:  VAL         $-BUFVIW*NOCMO
         IF          XWOR%1-K,XEIF%,,XEIF%
XWOR%3:  VAL         XWOR%3-W
XEIF%:   VAL         ENDIF
LBUFVW:: VAL         XWOR%3          < LONGUEUR DE LA COMMANDE AU DISQUE
                                     < VIDEO...
XWOR%2:  VAL         COSBT?XASSIM=FMASK(K?NVPVDK=FCINST
DEMVIW:  BYTE        XWOR%2;FAVW     < COMMANDE DE L'ECRITURE SUR LE DISQUE
                                     < VIDEO...
         WORD        BUFVIW=FCTA*NOCMO
         WORD        LBUFVW
BUFVIR:  DZS         W               < BUFFER DE LECTURE DES ACQUITTEMENTS.
LBUFVR:: VAL         $-BUFVIR*NOCMO
DEMVIR:  BYTE        XWOR%2;FAVR     < LECTURE DES ACQUITTEMENTS DU DISQUE.
         WORD        BUFVIR=FCTA*NOCMO
         WORD        LBUFVR
<
< DONNEES DE SAUVEGARDES :
<
SVSRVR:  FLOAT       <NILK<NILK<NILK < 'SUPRVR',
SVIRVR:  FLOAT       <NILK<NILK<NILK < 'INFRVR'.
SVSRVT:  FLOAT       <NILK<NILK<NILK < 'SUPRVT',
SVIRVT:  FLOAT       <NILK<NILK<NILK < 'INFRVT'.
SVSRDR:  FLOAT       <NILK<NILK<NILK < 'SUPRDR',
SVIRDR:  FLOAT       <NILK<NILK<NILK < 'INFRDR'.
SVSRDT:  FLOAT       <NILK<NILK<NILK < 'SUPRDT',
SVIRDT:  FLOAT       <NILK<NILK<NILK < 'INFRDT'.
<
<
<        C O N S T A N T E   M A G I Q U E  :
<
<
MAGIK::  VAL         7               < CONSTANTE MAGIQUE...
         IF          K*MAGIK/BASE16(K=FCREST-K,,XEIF%,
         IF          ATTENTION : IL FAUT MAGIK(K)=K POUR
         IF          SIMPLIFIER LES CHOSES EN BASE 16 !!!
XEIF%:   VAL         ENDIF
XWOR%3:  VAL         MAGIK           < CONSTANTE MAGIQUE...
XWOR%7:  VAL         K               < INITIALISATION DU CUMUL...
         NTRN
         DO          BASE16
XWOR%7:  VAL K=FCDO*XWOR%3/BASE16(K=FCREST?COSBT=FMASK(K?XWOR%7=FCINST
XWOR%8:  VAL         K               < INITIALISATION DU CUMUL...
         DO          BASE16
XWOR%8:  VAL K=FCDO?COSBT=FMASK(K?XWOR%8=FCINST
         TRN
         IF          XWOR%7-XWOR%8,,XEIF%,
         IF          ATTENTION : LA CONSTANTE MAGIQUE 'MAGIK'
         IF          N'OPERE PAS UNE PERMUTATION DES 16 CHIFFRES
         IF          DE 0 A F !!!
XEIF%:   VAL         ENDIF
         IF          K*MAGIK/BASE10(K=FCREST-K,,XEIF%,
         IF          ATTENTION : IL FAUT MAGIK(K)=K POUR
         IF          SIMPLIFIER LES CHOSES EN BASE 10 !!!
XEIF%:   VAL         ENDIF
XWOR%3:  VAL         MAGIK           < CONSTANTE MAGIQUE...
XWOR%7:  VAL         K               < INITIALISATION DU CUMUL...
         NTRN
         DO          BASE10
XWOR%7:  VAL K=FCDO*XWOR%3/BASE10(K=FCREST?COSBT=FMASK(K?XWOR%7=FCINST
XWOR%8:  VAL         K               < INITIALISATION DU CUMUL...
         DO          BASE10
XWOR%8:  VAL K=FCDO?COSBT=FMASK(K?XWOR%8=FCINST
         TRN
         IF          XWOR%7-XWOR%8,,XEIF%,
         IF          ATTENTION : LA CONSTANTE MAGIQUE 'MAGIK'
         IF          N'OPERE PAS UNE PERMUTATION DES 10 CHIFFRES
         IF          DE 0 A 9 !!!
XEIF%:   VAL         ENDIF
AMAGIK:  WORD        MAGIK
ASHUFL:  WORD        SHUFLE          < MODIFICATION DE (X,Y)...
         PAGE
<
<
<        T A B L E   D E   T R A N S C O D A G E   D E S   N I V E A U X  :
<
<
<        ARGUMENTS D'ASSEMBLAGE :
<                    ND=DIVISEUR DES NIVEAUX DE 'LNIVO' (0 OU 2),
<                    NI=TRANSLATION DES NIVEAUX DE 'LNIVO' (0 OU 128)...
<
<
NI:     @
XWOR%1:  VAL         KOLF=FMASK+KOLTES=FVAL
XWOR%1:  VAL         KOLC=FMASK+KDP=FVAL?XWOR%1
XWOR%2:  VAL         KOLTED=FMASK+KOL0=FVAL
XWOR%2:  VAL         KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2
XWOR%3:  VAL         XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT...
XWOR%4:  VAL         MSYMBI=FMASK+KOL0=FVAL
XWOR%4:  VAL         MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4
XWOR%5:  VAL         XWOR%4=FCSYMT   < ETAT DU SYMBOLE 'NI'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
NI::     VAL         XXNOIR          < LE NIVEAU INITIAL SERA LE NIVEAU NOIR.
XEIF%:   VAL         ENDIF
ND:     @
XWOR%1:  VAL         KOLF=FMASK+KOLTES=FVAL
XWOR%1:  VAL         KOLC=FMASK+KDP=FVAL?XWOR%1
XWOR%2:  VAL         KOLTED=FMASK+KOL0=FVAL
XWOR%2:  VAL         KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2
XWOR%3:  VAL         XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT...
XWOR%4:  VAL         MSYMBI=FMASK+KOL0=FVAL
XWOR%4:  VAL         MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4
XWOR%5:  VAL         XWOR%4=FCSYMT   < ETAT DU SYMBOLE 'ND'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
ND::     VAL         W               < PAS DE DIVISEUR DES NIVEAUX...
XEIF%:   VAL         ENDIF
LNIVO:   EQU         $
         NTRN
XWOR%1:  VAL         NIV256+NOCMO-E/NOCMO
XWOR%2:  VAL         NIV256/NOCMO(K=FCREST
         TRN
XWOR%3:  VAL         NIV256+XWOR%2
                                     < INCREMENT DES OCTETS GAUCHES,
XWOR%4:  VAL         XWOR%3+NOCMO-Z
                                     < INCREMENT DES OCTETS DROITS.
         NTRN
<*******************************************************************************
         DO          XWOR%1
   BYTE K=FCDO)MFFFF+N-Z*NOCMO+XWOR%3/ND+NI;K=FCDO)MFFFF+N-Z*NOCMO+XWOR%4/ND+NI
XWOR%5:  VAL         '0000000@@@@    < RECUPERATION DU DERNIER MOT,
<*******************************************************************************
         TRN
         IF          XWOR%2-K,,XEIF%,
XWOR%5:  VAL         XWOR%5(MOCG     < DANS LE CAS D'UNE TABLE DE LONGUEUR
                                     < IMPAIRE, ON EFFACE LE DERNIER OCTET
                                     < GENERE,
         $EQU        $-D             < ON REVIENT D'UN MOT EN ARRIERE,
         WORD        XWOR%5          < ET ON REGENERE LE DERNIER MOT...
XEIF%:   VAL         ENDIF
         NLS
         DO          XC512
         FLOAT       <NILK<NILK<NILK < LIGNE PRECEDENTE.
         LST
         PAGE
<
<
<        P I L E   D E   T R A V A I L  :
<
<
STACK:   EQU         $
         DZS         64
         PROG
XXXVEC:  VAL         XXVEC3          < DEFINITION DES PROGRAMMES VECTEUR 512...
         CALL        #SIP VECTEUR 512#
         PAGE
<
<
<        M A R Q U A G E   D ' U N   P O I N T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME MARQUE
<                    LE POINT ARGUMENT (X,Y) AVEC
<                    COMME NIVEAU, LE NIVEAU ARGU-
<                    MENT (A) TRANSCODE VIA LA TA-
<                    BLE 'LNIVO', CE QUI PERMET PAR
<                    EXEMPLE LA SUPERPOSITION DE
<                    PLUSIEURS IMAGES, EN FAISANT
<                    QUE LEURS TABLES 'LNIVO' SOIENT
<                    COMPLEMENTAIRES...
<
<
<        ARGUMENTS :
<                    (A)=NIVEAU,
<                    (X,Y)=COORDONNEES DU POINT.
<
<
<        RESULTAT :
<                    (A)=NIVEAU TRANSCODE.
<
<
POINT:   EQU         $
         PSR         A,B
         LR          A,B             < (B)=NIVEAU DU TRACE.
<
< TEST DES "HORS-ECRAN" :
<
         LR          X,A             < (A)=COORDONNEE 'X' ET VALIDATION :
         JAL         POINT1          < HORS-ECRAN...
         CP          VECTNC
         JG          POINT1          < HORS-ECRAN...
         LR          Y,A             < (A)=COORDONNEE 'Y' ET VALIDATION :
         JAL         POINT1          < HORS-ECRAN...
         CP          VECTNL
         JG          POINT1          < HORS-ECRAN...
<
< TRANSCODAGE DU NIVEAU :
<
         PSR         X               < SAUVEGARDE DE LA COORDONNEE 'X'...
         LR          B,X             < (X)=NIVEAU ARGUMENT,
         LBY         &ALNIVO         < (A)=NIVEAU TRANSCODE,
         PLR         X               < RESTAURE :
                                     < (X)=COORDONNEE 'X'.
<
< MARQUAGE DU POINT :
<
         BSR         ASTORP          < MARQUAGE : (X,Y) <-- (A)...
<
< ET RETOUR :
<
POINT1:  EQU         $
         PLR         A,B
         RSR
         PAGE
<
<
<        T E S T   P E R I O D I Q U E   D E   ' C O M F L O '  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME EST
<                    APPELE DERRIERE CHAQUE
<                    'FDV' EXPLICITE AINSI
<                    QU'APRES LES APPELS DE
<                    'RAC' ET 'CRAMR'...
<
<
TSFLO:   EQU         $
         PSR         A
         LA          COMFLO          < TEST DE 'COMFLO' PAR UN 'LA' AFIN DE NE
                                     < PAS MODIFIER LES CODES (CARY & CO)...
         JAE         TSFLO1          < OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
                                     < ON A :
                                     < (A)=INDICATEURS FLOTTANTS...
                                     < BIT 0 : UNDERFLOW,
                                     < BIT 1 : OVERFLOW,
                                     < BIT 2 : DIVISION PAR ZERO,
                                     < BIT 3 : 'FIX' IMPOSSIBLE.
         STZ         COMFLO          < PUIS RAZ, CAR CES INDICATEURS SONT
                                     < REMANENTS...
TSFLO1:  EQU         $
         PLR         A
         RSR
XXXPRO:  VAL         YYYGOT          < 'YYYGOT'.
         CALL        #SIP UTILITAIRES#
XXXPRO:  VAL         YYYFLO          < 'YYYFLO'.
         CALL        #SIP UTILITAIRES#
         PAGE
<
<
<        G E N E R A T E U R   R E D O N N A N T   T O U J O U R S
<        L E   M E M E   V E C T E U R   A L E A T O I R E   E N
<        U N   P O I N T   D O N N E  :
<
<
<        ARGUMENT :
<                    (X,Y)=COORDONNEES DU POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=RVR(XS,YS,GRARVR).
<
<
SPRVR:   EQU         $
<
< GENERATION ALEATOIRE :
<
         LR          X,A             < (A)=COORDONNEE 'X',
         EORR        B,A             < ET ON SE RAMENE SUR UN MOT...
         STA         FWORK4          < SAVE F1(XS)...
         LR          Y,A             < (A)=COORDONNEE 'Y',
         EOR         RVR1            < ??!???!
         STA         FWORK5          < SAVE F2(YS)...
         MP          FWORK4          < ET ON CONSTRUIT
         XR          A,B             < UNE FONCTION UNIQUE
         AD          FWORK5          < DU NOEUD COURANT,
         SB          FWORK4          < TELLE QUE :
                                     < F(X,Y)#F(Y,X),
                                     < F(X,Y)=X*Y+Y-X.
         EORR        B,A
         MP          GRARVR          < D'OU F(GRARVR,X,Y), TELLE QUE :
                                     < F(X,Y)#F(Y,X) AFIN D'EVITER UNE SYMETRIE
                                     < PAR RAPPORT A UNE DIAGONALE...
         EORR        B,A
         MP          AMAGIK          < DONT ON FAIT UN "SHUFFLING"...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
<
< MISE A L'ECHELLE :
<
<
<        NOTA :
<                      ON DOIT POUR METTRE LA
<                    VALEUR 'RVR' A L'ECHELLE
<                    CALCULER L'EXPRESSION :
<
<                    (SUP/(-32768))*(-RVR/2+16384+(RVR/2-16384)*(INF/SUP)),
<
<                    QUI SE SIMPLIFIE EN :
<
<                    (SUP/65536)*(RVR*(1-(INF/SUP))+32768*(1+(INF/SUP))).
<
         FLT                         < ON FLOTTE 'RVR',
         FMP         RVRMIS          < RVR*(1-(INF/SUP)),
         FAD         RVRPIS          < RVR*(1-(INF/SUP))+32768*(1+(INF/SUP)),
         FMP         RVR64           < (SUP/65536)*(...).
<
< ET SORTIE :
<
         RSR
         PAGE
<
<
<        G E N E R A T E U R   R E D O N N A N T   T O U J O U R S
<        L E   M E M E   V E C T E U R   A L E A T O I R E   E N
<        U N   P O I N T   D O N N E  :
<
<
<        ARGUMENT :
<                    (X,Y)=COORDONNEES DU POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=RVT(XS,YS,GRARVT).
<
<
SPRVT:   EQU         $
<
< GENERATION ALEATOIRE :
<
         LR          X,A             < (A)=COORDONNEE 'X',
         EORR        B,A             < ET ON SE RAMENE SUR UN MOT...
         STA         FWORK4          < SAVE F1(XS)...
         LR          Y,A             < (A)=COORDONNEE 'Y',
         EOR         RVT1            < ??!???!
         STA         FWORK5          < SAVE F2(YS)...
         MP          FWORK4          < ET ON CONSTRUIT
         XR          A,B             < UNE FONCTION UNIQUE
         AD          FWORK5          < DU NOEUD COURANT,
         SB          FWORK4          < TELLE QUE :
                                     < F(X,Y)#F(Y,X),
                                     < F(X,Y)=X*Y+Y-X.
         EORR        B,A
         MP          GRARVT          < D'OU F(GRARVT,X,Y), TELLE QUE :
                                     < F(X,Y)#F(Y,X) AFIN D'EVITER UNE SYMETRIE
                                     < PAR RAPPORT A UNE DIAGONALE...
         EORR        B,A
         MP          AMAGIK          < DONT ON FAIT UN "SHUFFLING"...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
<
< MISE A L'ECHELLE :
<
<
<        NOTA :
<                      ON DOIT POUR METTRE LA
<                    VALEUR 'RVT' A L'ECHELLE
<                    CALCULER L'EXPRESSION :
<
<                    (SUP/(-32768))*(-RVT/2+16384+(RVT/2-16384)*(INF/SUP)),
<
<                    QUI SE SIMPLIFIE EN :
<
<                    (SUP/65536)*(RVT*(1-(INF/SUP))+32768*(1+(INF/SUP))).
<
         FLT                         < ON FLOTTE 'RVT',
         FMP         RVTMIS          < RVT*(1-(INF/SUP)),
         FAD         RVTPIS          < RVT*(1-(INF/SUP))+32768*(1+(INF/SUP)),
         FMP         RVT64           < (SUP/65536)*(...).
<
< ET SORTIE :
<
         RSR
         PAGE
<
<
<        G E N E R A T E U R   R E D O N N A N T   T O U J O U R S
<        L E   M E M E   V E C T E U R   A L E A T O I R E   E N
<        U N   P O I N T   D O N N E  :
<
<
<        ARGUMENT :
<                    (X,Y)=COORDONNEES DU POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=RDR(XS,YS,GRARDR).
<
<
SPRDR:   EQU         $
<
< GENERATION ALEATOIRE :
<
         LR          X,A             < (A)=COORDONNEE 'X',
         EORR        B,A             < ET ON SE RAMENE SUR UN MOT...
         STA         FWORK4          < SAVE F1(XS)...
         LR          Y,A             < (A)=COORDONNEE 'Y',
         EOR         RDR1            < ??!???!
         STA         FWORK5          < SAVE F2(YS)...
         MP          FWORK4          < ET ON CONSTRUIT
         XR          A,B             < UNE FONCTION UNIQUE
         AD          FWORK5          < DU NOEUD COURANT,
         SB          FWORK4          < TELLE QUE :
                                     < F(X,Y)#F(Y,X),
                                     < F(X,Y)=X*Y+Y-X.
         EORR        B,A
         MP          GRARDR          < D'OU F(GRARDR,X,Y), TELLE QUE :
                                     < F(X,Y)#F(Y,X) AFIN D'EVITER UNE SYMETRIE
                                     < PAR RAPPORT A UNE DIAGONALE...
         EORR        B,A
         MP          AMAGIK          < DONT ON FAIT UN "SHUFFLING"...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
<
< MISE A L'ECHELLE :
<
<
<        NOTA :
<                      ON DOIT POUR METTRE LA
<                    VALEUR 'RDR' A L'ECHELLE
<                    CALCULER L'EXPRESSION :
<
<                    (SUP/(-32768))*(-RDR/2+16384+(RDR/2-16384)*(INF/SUP)),
<
<                    QUI SE SIMPLIFIE EN :
<
<                    (SUP/65536)*(RDR*(1-(INF/SUP))+32768*(1+(INF/SUP))).
<
         FLT                         < ON FLOTTE 'RDR',
         FMP         RDRMIS          < RDR*(1-(INF/SUP)),
         FAD         RDRPIS          < RDR*(1-(INF/SUP))+32768*(1+(INF/SUP)),
         FMP         RDR64           < (SUP/65536)*(...).
<
< ET SORTIE :
<
         RSR
         PAGE
<
<
<        G E N E R A T E U R   R E D O N N A N T   T O U J O U R S
<        L E   M E M E   V E C T E U R   A L E A T O I R E   E N
<        U N   P O I N T   D O N N E  :
<
<
<        ARGUMENT :
<                    (X,Y)=COORDONNEES DU POINT COURANT.
<
<
<        RESULTAT :
<                    (A,B)=RDT(XS,YS,GRARDT).
<
<
SPRDT:   EQU         $
<
< GENERATION ALEATOIRE :
<
         LR          X,A             < (A)=COORDONNEE 'X',
         EORR        B,A             < ET ON SE RAMENE SUR UN MOT...
         STA         FWORK4          < SAVE F1(XS)...
         LR          Y,A             < (A)=COORDONNEE 'Y',
         EOR         RDT1            < ??!???!
         STA         FWORK5          < SAVE F2(YS)...
         MP          FWORK4          < ET ON CONSTRUIT
         XR          A,B             < UNE FONCTION UNIQUE
         AD          FWORK5          < DU NOEUD COURANT,
         SB          FWORK4          < TELLE QUE :
                                     < F(X,Y)#F(Y,X),
                                     < F(X,Y)=X*Y+Y-X.
         EORR        B,A
         MP          GRARDT          < D'OU F(GRARDT,X,Y), TELLE QUE :
                                     < F(X,Y)#F(Y,X) AFIN D'EVITER UNE SYMETRIE
                                     < PAR RAPPORT A UNE DIAGONALE...
         EORR        B,A
         MP          AMAGIK          < DONT ON FAIT UN "SHUFFLING"...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
<
< MISE A L'ECHELLE :
<
<
<        NOTA :
<                      ON DOIT POUR METTRE LA
<                    VALEUR 'RDT' A L'ECHELLE
<                    CALCULER L'EXPRESSION :
<
<                    (SUP/(-32768))*(-RDT/2+16384+(RDT/2-16384)*(INF/SUP)),
<
<                    QUI SE SIMPLIFIE EN :
<
<                    (SUP/65536)*(RDT*(1-(INF/SUP))+32768*(1+(INF/SUP))).
<
         FLT                         < ON FLOTTE 'RDT',
         FMP         RDTMIS          < RDT*(1-(INF/SUP)),
         FAD         RDTPIS          < RDT*(1-(INF/SUP))+32768*(1+(INF/SUP)),
         FMP         RDT64           < (SUP/65536)*(...).
<
< ET SORTIE :
<
         RSR
         PAGE
<
<
<        C H A M B A R D E M E N T   D E   ( X , Y )  :
<
<
<        ARGUMENT :
<                    (X,Y)="COORDONNEES LOCALES".
<
<
<        RESULTAT :
<                    (X,Y)="COORDONNEES CHAMBARDEES".
<
<
SHUFLE:  EQU         $
         PSR         A,B
         LR          X,A
         MP          AMAGIK
         EORR        B,A
         MP          GRARDT
         EORR        B,A
         MP          GRARVT
         EORR        B,A
         LR          A,X             < (X)='X' CHAMBARDEE,
         LR          Y,A
         MP          AMAGIK
         EORR        B,A
         MP          GRARDR
         EORR        B,A
         MP          GRARVR
         EORR        B,A
         LR          A,Y             < (Y)='Y' CHAMBARDEE.
         PLR         A,B
         RSR
         PAGE
<
<
<        C A L C U L   S I N U S   E T   C O S I N U S  :
<
<
<        ARGUMENT :
<                    (A,B)=ANGLE EN RADIANS,
<
<
<        RESULTAT :
<                    (A,B)=LIGNE TRIGONOMETRIQUE DEMANDEE.
<
<
COS:     EQU         $               < ENTRY 'COSINUS' :
         FSB         PISUR2          < (A,B)=TETA-PI/2,
         BSR         AFNEG           < (A,B)=PI/2-TETA.
SIN:     EQU         $               < ENTRY 'SINUS' :
<
< INITIALISATIONS ET
< PREPARATION DE L'ANGLE :
<
         #/FST#      SCWOR1          < SAVE TEMPORAIRE DE L'ANGLE.
         STZ         ISIGSC
         JAGE        PSC072
         BSR         AFNEG
         #/FST#      SCWOR1
         IC          ISIGSC
PSC072:  EQU         $
         FDV         DEUXPI
         BSR         AFIX
         BSR         AFLT
         FMP         DEUXPI
         FSB         SCWOR1
         BSR         AFNEG
         FCAM        PI3141
         JL          PSC073
         FSB         PI3141
         IC          ISIGSC
PSC073:  EQU         $
         FCAM        PISUR2
         JL          PSC074
         FSB         PI3141
         BSR         AFNEG
PSC074:  EQU         $
<
< CALCUL DU POLYNOME :
<
         FDV         PISUR2
         #/FST#      SCWOR1
         FMP         SCWOR1
         #/FST#      SCWOR2
         FMP         POLSC4
         FAD         POLSC3
         FMP         SCWOR2
         FAD         POLSC2
         FMP         SCWOR2
         FAD         POLSC1
         FMP         SCWOR2
         FAD         PISUR2
         FMP         SCWOR1
         DC          ISIGSC
         JNE         PSC075
         BSR         AFNEG
PSC075:  EQU         $
<
< ET RETOUR :
<
         BSR         ATSFLO
         RSR
         PAGE
<
<
<        T R A C E   D ' U N   D I S Q U E  :
<
<
<        FONCTION :
<                      CE MODULE TRACE UN DISQUE EN
<                    DEGRADE DESTINE A REPRESENTER
<                    UNE SPHERE PROJETEE.
<
<
<        ARGUMENTS :
<                    (X,Y)=CENTRE DU DISQUE.
<
<
CERCLE:  EQU         $
<
< INITIALISATIONS :
<
         PSR         X,Y
         LR          X,B             < (B)='X' DU CENTRE,
         PSR         Y               < SAUVEGARDE DE 'Y' DU CENTRE.
         LA          RAYON2
         SBR         A,X             < ON SE PLACE EN HAUT ET A GAUCHE
         SBR         A,Y             < D'UN CARRE CIRCONSCRIT AU DISQUE.
         STX         VECTX1          < INITIALISATION DE L'ABSCISSE INITIALE
                                     < DE CHAQUE LIGNE,
         STY         VECTY1          < INITIALISATION DE LA COORDONNEE 'Y'.
         PLR         Y               < ON A :
                                     < (B,Y)=COORDONNEES DU CENTRE.
<
< BALAYAGE VERTICAL :
<
         LX          RAYON2
         ADR         X,X
         ADRI        Z,X             < (X)=NOMBRE DE LIGNES A BALAYER.
CERCL1:  EQU         $
         LA          VECTX1
         PSR         A,X             < SAUVEGARDE DE L'ABSCISSE INITIALE
                                     < DE CHAQUE LIGNE (A) ET DU NOMBRE DE
                                     < LIGNES A TRACER (X).
<
< BALAYAGE HORIZONTAL :
<
         LX          RAYON2
         ADR         X,X
         ADRI        Z,X             < (X)=NOMBRE DE LIGNES A BALAYER.
CERCL2:  EQU         $
         PSR         B               < SAUVEGARDE DE LA COORDONNEE 'X'
                                     < DU CENTRE.
         LA          VECTX1          < X1,
         SBR         B,A             < X1-XC,
         BSR         AFLT
         #/FST#      FWORK1          < X1-XC,
         FMP         FWORK1          < (X1-XC)**2,
         BSR         ASFWOR
         LA          VECTY1          < Y1,
         SBR         Y,A             < Y1-YC ((XC,YC) DESIGNE LE CENTRE).
         BSR         AFLT
         #/FST#      FWORK2          < Y1-YC,
         FMP         FWORK2          < (Y1-YC)**2,
         BSR         APFWOR          < (X1-XC)**2+(Y1-YC)**2,
         BSR         ARAC            < ET CALCUL DE LA DISTANCE DU POINT
                                     < COURANT (X1,Y1) AU CENTRE (XC,YC) :
         BSR         ATSFLO
         BSR         AROND
         CP          RAYON2          < EST-ON HORS DU DISQUE ??
         JGE         CERCL3          < OUI, ON IGNORE CE POINT...
         SB          RAYON2          < NON :
         NGR         A,A             < (A)=DISTANCE DU POINT COURANT AU BORD
                                     <     DU DISQUE.
         MP          MRAYON
         DV          RAYON2          < (A)=NIVEAU(DISTANCE AU CENTRE,Z).
         ADRI        I,A             < AFIN D'EVITER LE NOIR...
CERCL6:  EQU         $
         PSR         X,Y
         LX          VECTX1
         LY          VECTY1
         BSR         APOINT          < MARQUAGE DE (X,Y) AVEC LE NIVEAU (A).
         PLR         X,Y
CERCL3:  EQU         $
         PLR         B               < RESTAURE L'ABSCISSE DU CENTRE,
         IC          VECTX1          < ET PROGRESSION SUR LA LIGNE,
         JDX         CERCL2          < A CONDITION DE N'ETRE POINT EN BOUT
                                     < DE LIGNE...
         PLR         A,X             < RESTAURE :
                                     < (A)='VECTX1' DE DEBUT DE LIGNE,
                                     < (X)=NOMBRE DE LIGNES A TRACER...
         STA         VECTX1          < ON SE PLACE EN DEBUT
         IC          VECTY1          < DE LA NOUVELLE LIGNE,
         JDX         CERCL1          < SI ELLE EXISTE...
<
< ET RETOUR :
<
         PLR         X,Y
CERCL4:  EQU         $
         RSR
         PAGE
<
<
<        P O I N T   D ' E N T R E E  :
<
<
DEBUT:   EQU         $
<
< INITIALISATION DES REGISTRES :
<
         LRM         C,L,K
         WORD        COM+DEPBAS      < POSITIONNEMENT DE 'C',
         WORD        LOC+DEPBAS      < DE 'L',
         WORD        STACK-DEPILE    < ET DE 'K'.
<
< CONNEXION A LA 'CDA' :
<
         LAI         PAGER
         BSR         AGPCDA          < AFIN D'ATTEINDRE LA MEMOIRE DU '68000'
                                     < ET LA MEMOIRE 'SOLAR' QUI LA PRECEDE
                                     < AFIN D'Y METTRE 'BUF'...
<
< SAUVEGARDES DES (SUP,INF)(RDN) :
<
         #/FLD#      SUPRVR
         #/FST#      SVSRVR
         #/FLD#      INFRVR
         #/FST#      SVIRVR
         #/FLD#      SUPRVT
         #/FST#      SVSRVT
         #/FLD#      INFRVT
         #/FST#      SVIRVT
         #/FLD#      SUPRDR
         #/FST#      SVSRDR
         #/FLD#      INFRDR
         #/FST#      SVIRDR
         #/FLD#      SUPRDT
         #/FST#      SVSRDT
         #/FLD#      INFRDT
         #/FST#      SVIRDT
<
<
<        E N T R Y   D E   R E B O U C L A G E  :
<
<
DEBUT4:  EQU         $
DEBUT9:  EQU         $
<
< MODIFICATION A PRIORI DU 'PRESC' :
<
         LRM         A
         WORD        DEBUT5          < POUR 'XXXPRE'...
         ACTD        XXXPRE          < ON CHANGE ALORS SYSTEMATIQUEMENT APRES
                                     < PASSAGE ICI LE 'PRESC' DU PROGRAMME, AFIN
                                     < DE REVENIR SUR LA VISUALISATION APRES
                                     < CHAQUE ALT-MODE (VIA 'DEBUT5'...).
<
< RESTAURATION DES (SUP,INF)(RDN) :
<
         #/FLD#      SVSRVR
         #/FST#      SUPRVR
         #/FLD#      SVIRVR
         #/FST#      INFRVR
         #/FLD#      SVSRVT
         #/FST#      SUPRVT
         #/FLD#      SVIRVT
         #/FST#      INFRVT
         #/FLD#      SVSRDR
         #/FST#      SUPRDR
         #/FLD#      SVIRDR
         #/FST#      INFRDR
         #/FLD#      SVSRDT
         #/FST#      SUPRDT
         #/FLD#      SVIRDT
         #/FST#      INFRDT
<
<
<        I N I T I A L I S A T I O N S  :
<
<
INIT01:  EQU         $
<
< INITIALISATION A PRIORI
< DES TRACES GRAPHIQUES :
<
         LRM         A,B,X,Y
         WORD        CORBT?BANTI=FMASK(K=FCINST
         WORD        MMOT
         WORD        K
         WORD        COSBT?VELODD=FMASK(K?VECTSB=FCINST
         STA         VECANT          < PAS D'ANTI-ALIASING,
         STB         VEPOIN          < PAS DE POINTILLE,
         STX         VEDECA          < PAS DE DECALAGE DES NIVEAUX,
         STY         VECTRS          < MODE 'SBT' EN LOGIQUE BINAIRE.
<
<
<        I T E R A T I O N   S U R   C H A Q U E   I M A G E  :
<
<
         LX          NIMAGE          < (X)=NOMBRE D'IMAGES A GENERER.
FIL100:  EQU         $
         PSR         X
<
< GENERATEUR ALEATOIRE :
<
         #/FLD#      INFRVR          < BORNE INFERIEURE ('INF'),
         FDV         SUPRVR          < INF/SUP,
         PSR         A,B             < ET SAVE...
         FSB         F1              < (INF/SUP)-1,
         FNEG                        < 1-(INF/SUP),
         #/FST#      RVRMIS          < RVRMIS=1-(INF/SUP).
         PLR         A,B             < INF/SUP,
         FAD         F1              < 1+(INF/SUP),
         FMP         INF32           < 32768*(1+(INF/SUP)),
         #/FST#      RVRPIS          < RVRPIS=32768*(1+(INF/SUP)).
         #/FLD#      SUPRVR          < SUP,
         FDV         INF64           < SUP/65536,
         #/FST#      RVR64           < SUP64=SUP/65536.
<
< GENERATEUR ALEATOIRE :
<
         #/FLD#      INFRVT          < BORNE INFERIEURE ('INF'),
         FDV         SUPRVT          < INF/SUP,
         PSR         A,B             < ET SAVE...
         FSB         F1              < (INF/SUP)-1,
         FNEG                        < 1-(INF/SUP),
         #/FST#      RVTMIS          < RVTMIS=1-(INF/SUP).
         PLR         A,B             < INF/SUP,
         FAD         F1              < 1+(INF/SUP),
         FMP         INF32           < 32768*(1+(INF/SUP)),
         #/FST#      RVTPIS          < RVTPIS=32768*(1+(INF/SUP)).
         #/FLD#      SUPRVT          < SUP,
         FDV         INF64           < SUP/65536,
         #/FST#      RVT64           < SUP64=SUP/65536.
<
< GENERATEUR ALEATOIRE :
<
         #/FLD#      INFRDR          < BORNE INFERIEURE ('INF'),
         FDV         SUPRDR          < INF/SUP,
         PSR         A,B             < ET SAVE...
         FSB         F1              < (INF/SUP)-1,
         FNEG                        < 1-(INF/SUP),
         #/FST#      RDRMIS          < RDRMIS=1-(INF/SUP).
         PLR         A,B             < INF/SUP,
         FAD         F1              < 1+(INF/SUP),
         FMP         INF32           < 32768*(1+(INF/SUP)),
         #/FST#      RDRPIS          < RDRPIS=32768*(1+(INF/SUP)).
         #/FLD#      SUPRDR          < SUP,
         FDV         INF64           < SUP/65536,
         #/FST#      RDR64           < SUP64=SUP/65536.
<
< GENERATEUR ALEATOIRE :
<
         #/FLD#      INFRDT          < BORNE INFERIEURE ('INF'),
         FDV         SUPRDT          < INF/SUP,
         PSR         A,B             < ET SAVE...
         FSB         F1              < (INF/SUP)-1,
         FNEG                        < 1-(INF/SUP),
         #/FST#      RDTMIS          < RDTMIS=1-(INF/SUP).
         PLR         A,B             < INF/SUP,
         FAD         F1              < 1+(INF/SUP),
         FMP         INF32           < 32768*(1+(INF/SUP)),
         #/FST#      RDTPIS          < RDTPIS=32768*(1+(INF/SUP)).
         #/FLD#      SUPRDT          < SUP,
         FDV         INF64           < SUP/65536,
         #/FST#      RDT64           < SUP64=SUP/65536.
<
< INITIALISATIONS DE L'IMAGEUR :
<
GEN69:   EQU         $
         CPZ         IERASE          < FAUT-IL EFFACER ???
         JE          GEN69N          < NON...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST CI-DESSUS EST IDIOT !!!
XEIF%:   VAL         ENDIF
<
< EFFACEMENT DE L'ECRAN :
<
XWOR%1:  VAL         NIV256=K
         IF          BIT>XWOR%1-NIV256,,XWOR%,
         IF          ATTENTION : LE CALCUL DU MASQUE SELECTANT TOUS
         IF          LES PLANS EST ABSURDE !!!
XWOR%:   VAL         ENDIF
         LAI         NIV256-MASK)MOCD
         STA         MCDAJ
         LA          ARPLAN          < (A)=ADRESSE DU REGISTRE DE SELECTION...
         BSR         APWCDA          < ET ON SELECTIONNE TOUS LES PLANS...
         LAI         ERASE
         STA         MCDAJ
         LA          ARCMD
         BSR         APWCDA          < EFFACEMENT DE L'ECRAN, ET REINITIALISA-
                                     < TION DE TOUS LES REGISTRES...
         LAD         TEMPO
         SVC                         < ET ON FAIT UN PETIT DODO...
         LAI         XCTRL1
         STA         MCDAJ
         LA          ACTRL1
         BSR         APWCDA          < INITIALISATION DE 'CTRL1'.
         LAI         XCTRL2
         STA         MCDAJ
         LA          ACTRL2
         BSR         APWCDA          < INITIALISATION DE 'CTRL2'.
GEN69N:  EQU         $
<
<
<        T R A C E   D E   L A   P A R T I C U L E  :
<
<
         LA          RAYON
         SARS        XXDEDX?XXDEDY
         STA         RAYON2          < VALEUR DU RAYON EN FORMAT 'TV'...
         IF          XXDEDX-XXDEDY,,XEIF%,
         IF          ATTENTION !!!
XEIF%:   VAL         ENDIF
         #/FLD#      XGCENT          < X(CENTRE),
         BSR         AROND
         SARS        XXDEDX
         LR          A,X             < CONVERSION VIDEO...
         #/FLD#      YGCENT          < Y(CENTRE),
         BSR         AROND
         SARS        XXDEDY
         LR          A,Y             < CONVERSION VIDEO...
         BSR         ACERCL          < ET TRACE DE LA PARTICULE...
<
<
<        G E N E R A T I O N   D E S   F I L A M E N T S  :
<
<
         #/FLD#      F1
         #/FST#      FINVER          < INITIALISATION DE LA BASCULE DES SENS
                                     < D'ENROULEMENT...
         LX          NFILAM          < (X)=NOMBRE DE FILAMENTS A GENERER,
         LYI         RVR3+RVT3+RDR3+RDT3
                                     < (Y)=POUR LES GENERATEURS 'RVT' ET 'RVR'.
FIL01:   EQU         $
         STX         VECTNI          < ON UTILISE LE NUMERO DE FILAMENT COMME
                                     < COULEUR DE TRACE A PRIORI...
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IDEGRA          < EN FAIT, FAUT-IL UN DEGRADE ???
         JE          FIL31           < NON, LA COULEUR SERA UNIFORME...
         LAI         XXN255          < OUI :
         STA         VECTNI          < ON PART DU MAX...
FIL31:   EQU         $
         PSR         X,Y
         BSR         ASHUFL          < CHAMBARDEMENT DE (X,Y)...
<
< INITIALISATION DU FILAMENT COURANT :
<
         BSR         ASPRVR
         #/FST#      RHO             < RAYON POLAIRE INITIAL,
         BSR         ASPRVT
         #/FST#      TETA            < ANGLE POLAIRE INITIAL.
         BSR         ACOS            < COS(TETA),
         FMP         RHO             < RHO*COS(TETA),
         FAD         XGCENT          < XC+RHO*COS(TETA),
         BSR         AROND
         STA         VECGX2          < ABSCISSE DU POINT DE DEPART.
         #/FLD#      TETA            < TETA,
         BSR         ASIN            < SIN(TETA),
         FMP         RHO             < RHO*SIN(TETA),
         FAD         YGCENT          < YC+RHO*SIN(TETA),
         BSR         AROND
         STA         VECGY2          < ORDONNEE DU POINT DE DEPART.
<
< GENERATION D'UN FILAMENT :
<
         LR          X,Y             < (Y)=NUMERO DE FILAMENT COURANT,
         LX          NPOINT          < (X)=NOMBRE DE POINTS (OU SEGMENTS)
                                     <     D'UN FILAMENT.
                                     < NOAT : (X,Y)=(NUMERO DE POINT,NUMERO DE
                                     <              FILAMENT) SONT APPELES LES
                                     <              "COORDONNEES LOCALES", ET
                                     <              SONT UTILISEES PAR LES GENE-
                                     <              RATEURS ALEATOIRES...
FIL02:   EQU         $
         PSR         X,Y
         BSR         ASHUFL          < CHAMBARDEMENT DE (X,Y)...
         LA          VECGX2          < POINT
         LB          VECGY2          <       PRECEDENT (OU DE DEPART LA PREMIERE
                                     <       FOIS...),
         STB         VECGY1          < QUI DEVIENT LE
         STA         VECGX1          <                POINT COURANT.
FIL12:   EQU         $
         BSR         ASPRDR
         #/FST#      DRHO            < INCREMENT DE RHO,
         BSR         ASPRDT
         FMP         FINVER          < AFIN D'INVERSER LE SENS D'ENROULEMENT.
         #/FST#      DTETA           < INCREMENT DE TETA.
         FAD         TETA
         #/FST#      TETA            < PROGRESSION DE TETA.
         BSR         ACOS            < COS(TETA),
         FMP         DRHO            < DRHO*COS(TETA),
         BSR         AROND
         AD          VECGX1
         STA         VECGX2          < X(POINT COURANT).
         FLT
         FSB         XGCENT
         #/FST#      FWORK4
         FMP         FWORK4
         #/FST#      FWORK4          < CARRE D'UN COTE DU TRIANGLE RECTANGLE.
         #/FLD#      TETA            < TETA,
         BSR         ASIN            < SIN(TETA),
         FMP         DRHO            < DRHO*SIN(TETA),
         BSR         AROND
         AD          VECGY1
         STA         VECGY2          < Y(POINT COURANT).
         FLT
         FSB         YGCENT
         #/FST#      FWORK5
         FMP         FWORK5          < CARRE DE L'AUTRE COTE DU TRIANGLE
                                     < RECTANGLE,
         FAD         FWORK4          < CARRE DE L'HYPOTHENUSE,
         BSR         ARAC            < HYPOTHENUSE,
         BSR         AROND
         CP          RAYON           < Y-A-T'IL CONTACT AVEC LA PARTICULE ???
         JGE         FIL11           < NON, OK...
         ADRI        I,Y             < OUI, ON MODIFIE LES ARGUMENTS DU
                                     < GENERATEUR 'RDR'...
         JMP         FIL12           < VERS LA REGENERATION DE 'DRHO'...
FIL11:   EQU         $
         BSR         AVE512          < TRACE DU SEGMENT COURANT...
         CPZ         IDEGRA          < EST-ON DANS LE MODE DEGRADE ???
         JE          FIL32           < NON, UNIFORME...
         DC          VECTNI          < OUI, ON DECREMENTE...
FIL32:   EQU         $
         PLR         X,Y
         JDX         FIL02           < ET PASSAGE AU POINT SUIVANT...
         #/FLD#      FINVER
         FNEG
         #/FST#      FINVER          < BASCULE DU SENS D'ENROULEMENT...
         PLR         X,Y
         JDX         FIL01           < PUIS AU FILAMENT SUIVANT...
<
<
<        T R A I T E M E N T   D E   F I N  :
<
<
         CPZ         IQUIT           < FAUT-IL S'ARRETER ???
         JE          GEN410          < NON...
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST CI-DESSUS EST IDIOT !!!
XEIF%:   VAL         ENDIF
         QUIT        XXQUIT          < OUI...
GEN410:  EQU         $
<
< GENERATION SUR LE DISQUE VIDEO :
<
         CPZ         IVIDEO          < FAUT-IL ECRIRE ???
         JE          GEN400          < NON...
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST CI-DESSUS EST IDIOT !!!
XEIF%:   VAL         ENDIF
         PSR         X               < OUI :
         LAD         DEMVIW
         SVC                         < ON ECRIT L'IMAGE COURANTE...
         LAD         DEMVIR
         SVC                         < ET ON ATTEND L'ACQUITTEMENT...
         PLR         X
GEN400:  EQU         $
<
< MODIFICATION DES BORNES
< DES GENERATEURS ALEATOIRES :
<
         #/FLD#      SUPRVR
         FSB         PASRVR
         #/FST#      SUPRVR
         #/FLD#      INFRVR
         FAD         PASRVR
         #/FST#      INFRVR
         #/FLD#      SUPRVT
         FSB         PASRVT
         #/FST#      SUPRVT
         #/FLD#      INFRVT
         FAD         PASRVT
         #/FST#      INFRVT
         #/FLD#      SUPRDR
         FSB         PASRDR
         #/FST#      SUPRDR
         #/FLD#      INFRDR
         FAD         PASRDR
         #/FST#      INFRDR
         #/FLD#      SUPRDT
         FSB         PASRDT
         #/FST#      SUPRDT
         #/FLD#      INFRDT
         FAD         PASRDT
         #/FST#      INFRDT
<
< PASSAGE A L'IMAGE SUIVANTE :
<
         PLR         X               < (X)=NOMBRE D'IMAGES A GENERER,
         JDX         FIL101          < PASSAGE A LA SUIVANTE...
         JMP         FIL102          < C'EST FINI...
FIL101:  EQU         $
         BSR         AGOTO
         WORD        FIL100          < VERS L'IMAGE SUIVANTE...
FIL102:  EQU         $
<
<
<        E N T R Y   A L T - M O D E  :
<
<
DEBUT5:  EQU         $
         QUIT        XXQUIT          < A T T E N T E ...
         LRM         C,L,K           < ON REINITIALISE 'C' ET 'K' AU CAS
                                     < D'UNE RE-ENTREE PAR UN 'ALT-MODE'...
         WORD        COM+DEPBAS      < 'C',
         WORD        LOC+DEPBAS      < 'L',
         WORD        STACK-DEPILE    < 'K'.
         BSR         AGOTO
         WORD        DEBUT4          < (A)=ADRESSE D'ITERATION SUR ALT-MODE...
         PAGE
<
<
<        U P D A T E S  :
<
<
XRAYON:: VAL         32              < RAYON DE LA PARTICULE...
         $EQU        RAYON
         WORD        XRAYON          < RAYON DE LA PARTICULE...
         $EQU        MRAYON
         WORD        XRAYON          < POUR LE NOMBRE DE NIVEAUX DE COULEUR...
         $EQU        NIMAGE
         WORD        1               < NOMBRE D'IMAGES A GENERER...
         $EQU        NFILAM
         WORD        XXN255-I-XRAYON < NOMBRE DE FILAMENTS..
         $EQU        NPOINT
         WORD        XXN255-I-XRAYON < NOMBRE DE POINTS PAR FILAMENT.
         $EQU        XGCENT
         FLOAT       512             < XGRAPHIQUE(CENTRE DU CERCLE),
         $EQU        YGCENT
         FLOAT       512             < YGRAPHIQUE(CENTRE DU CERCLE).
         $EQU        GRARVR
         WORD        '1234           < GRARVR DU GENERATEUR ALEATOIRE.
         $EQU        SUPRVR
         NTRN
         FLOAT       <XRAYON<K<K     < SUP(RVR).
         TRN
         $EQU        INFRVR
         NTRN
         FLOAT       <XRAYON<K<K     < INF(RVR).
         TRN
         $EQU        PASRVR
         FLOAT       0               < PAS(RVR).
         $EQU        GRARVT
         WORD        '2345           < GRARVT DU GENERATEUR ALEATOIRE.
         $EQU        SUPRVT
         NTRN
         FLOAT       6.28            < SUP(RVT).
         TRN
         $EQU        INFRVT
         NTRN
         FLOAT       0               < INF(RVT).
         TRN
         $EQU        PASRVT
         FLOAT       0               < PAS(RVT).
         $EQU        GRARDR
         WORD        '3456           < GRARDR DU GENERATEUR ALEATOIRE.
         $EQU        SUPRDR
         NTRN
         FLOAT       5               < SUP(RDR).
         TRN
         $EQU        INFRDR
         NTRN
         FLOAT       1               < INF(RDR).
         TRN
         $EQU        PASRDR
         FLOAT       0               < PAS(RDR).
         $EQU        GRARDT
         WORD        '4567           < GRARDT DU GENERATEUR ALEATOIRE.
         $EQU        SUPRDT
         NTRN
         FLOAT       0.30            < SUP(RDT).
         TRN
         $EQU        INFRDT
         NTRN
         FLOAT       -0.30           < INF(RDT).
         TRN
         $EQU        PASRDT
         FLOAT       0.003           < PAS(RDT).
         PAGE
<
<
<        T A B L E   D E S   S Y M B O L E S  :
<
<
         IF          '00000000000@,XEIF%,,XEIF%
         EST
XEIF%:   VAL         ENDIF
         DATE
         END         DEBUT



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