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
<
< BUFFER BANDE :
<
LBUFMT: @
XWOR%1:  VAL         KOLF=FMASK+KOLTES=FVAL
XWOR%1:  VAL         KOLC=FMASK+KDP=FVAL?XWOR%1
XWOR%2:  VAL         KOLTED=FMASK+KOL0=FVAL
XWOR%2:  VAL         KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2
XWOR%3:  VAL         XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT...
XWOR%4:  VAL         MSYMBI=FMASK+KOL0=FVAL
XWOR%4:  VAL         MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4
XWOR%5:  VAL         XWOR%4=FCSYMT   < ETAT DU SYMBOLE 'LBUFMT'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
LBUFMT:: VAL         4096
XEIF%:   VAL         ENDIF
BUFMT:   EQU         $
         DZS         LBUFMT/NOCMO
<
<
<        C O M M O N  :
<
<
         COMMON
COM:     EQU         $
<
< MOT DESTINE AU BLOC FLOTTANT :
<
COMFLO:  WORD        NILK            < MOT "BIDON" DESTINE AU BLOC FLOTTANT
                                     < POUR QU'IL Y FIT SES MERDES...
ATSFLO:  WORD        TSFLO           < POUR TESTER DE TEMPS EN TEMPS 'COMFLO'...
<
< INDICATEURS DE CONTROLE :
<
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          < ECRIRE ('EXIST') L'IMAGE COURANTE SUR LE
                                     < DISQUE VIDEO OU PAS ('NEXIST').
ABLOC0:  WORD        K               < ADRESSE DU PREMIER BLOC A LIRE.
LBLOC:   WORD        LBUFMT          < LONGUEUR DES BLOCS PHYSIQUES SUR LA
                                     < BANDE.
IVISD:   WORD        EXIST           < TRACER ('EXIST') OU PAS ('NEXIST') LES
                                     < DISQUES SYMBOLISANT LES SITES.
TXMIN:   WORD        NILK            < AFIN DE DEFINIR LA TRANCHE D'ESPACE
TXMAX:   WORD        NILK            < A VISUALISER : X DANS (TXMIN,TXMAX).
TYMIN:   WORD        NILK            < AFIN DE DEFINIR LA TRANCHE D'ESPACE
TYMAX:   WORD        NILK            < A VISUALISER : Y DANS (TYMIN,TYMAX).
TZMIN:   WORD        NILK            < AFIN DE DEFINIR LA TRANCHE D'ESPACE
TZMAX:   WORD        NILK            < A VISUALISER : Z DANS (TZMIN,TZMAX).
RAYON:   WORD        NILK            < RAYON DES ETOILES.
INEW1:   WORD        NEXIST          < MODE DE CHOIX DES COULEURS DES DISQUES
                                     < ET DES CONNEXIONS :
                                     < 'NEXIST' : LES CONNEXIONS SONT 2 FOIS PLU
                                     <            PLUS SOMBRES QUE LES PARTIES
                                     <            LES PLUS LUMINEUSES DES
                                     <            DISQUES, ET LES PARTIES DES
                                     <            DISQUES LES PLUS SOMBRES (AU
                                     <            BORD VONT PRATIQUEMENT JUS-
                                     <            QU'AU NOIR) ET ENFIN, LES
                                     <            CONNEXIONS UTILISENT DES
                                     <            NIVEAUX PRIS PAR LES DISQUES.
                                     < 'EXIST'  : LES COULEURS UTILISEES SONT
                                     <            PROPRES A CHAQUE PLAN 'Z' ;
                                     <            2 PLANS PARALLELES NE PEUVENT
                                     <            UTILISER LES MEMES...
GRARDN:  WORD        NILK            < GRAINEDU GENERATEUR ALEATOIRE...
SUPRDN:  FLOAT       <NILK<NILK<NILK < SUP(RDN),
INFRDN:  FLOAT       <NILK<NILK<NILK < INF(RDN).
GRARDM:  WORD        NILK            < GRAINE DU GENERATEUR ALEATOIRE...
SUPRDM:  FLOAT       <NILK<NILK<NILK < SUP(RDM),
INFRDM:  FLOAT       <NILK<NILK<NILK < INF(RDM).
FA50:    FLOAT       <NILK<NILK<NILK
FA0:     FLOAT       <NILK<NILK<NILK
FA1:     FLOAT       <NILK<NILK<NILK
FA11:    FLOAT       <NILK<NILK<NILK
FA12:    FLOAT       <NILK<NILK<NILK
FA21:    FLOAT       <NILK<NILK<NILK
FA22:    FLOAT       <NILK<NILK<NILK
FA31:    FLOAT       <NILK<NILK<NILK
FA23:    FLOAT       <NILK<NILK<NILK
FA13:    FLOAT       <NILK<NILK<NILK
FA2:     FLOAT       <NILK<NILK<NILK
FA41:    FLOAT       <NILK<NILK<NILK
FA3:     FLOAT       <NILK<NILK<NILK
<
< 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
<
< SAUVEGARDE DES COORDONNEES :
<
COORD:   EQU         $               < LISTE DES COORDONNEES :
SAVEX:   WORD        NILK
SAVEY:   WORD        NILK
SAVEZ:   WORD        NILK
PAGE0::  VAL         K               < PREMIERE PAGE DE LA 'CDAJ'.
RANG:    WORD        NILK            < RANG DE LA PARTICULE COURANTE...
<
< DONNEES DE PROJECTION :
<
COST:    FLOAT       <NILK<NILK<NILK < COS(TETA) DONNE EN ARGUMENT,
SINT:    FLOAT       <NILK<NILK<NILK < SIN(TETA) CALCULE A PARTIR DE COS(TETA).
LOGX::   VAL         9               < LOG2(DIM(X)),
LOGY::   VAL         9               < LOG2(DIM(Y)),
LOGZ::   VAL         9               < LOG2(DIM(Z)).
DECX::   VAL         K               < AMPLIFICATEUR DE 'X',
DECY::   VAL         DECX            < AMPLIFICATEUR DE 'Y',
DECZ::   VAL         LOGZ+I          < AMPLIFICATEUR DE 'Z' (ON PREND CETTE
                                     < VALEUR POUR SHUNTER LA PROJECTION, SINON
                                     < IL FAUT PRENDRE 'DECX').
TRANSX:  WORD        NILK            < TRANSLATION DE 'X',
TRANSY:  WORD        NILK            < TRANSLATION DE 'Y' (PROJETES).
APROJ:   WORD        PROJ            < SOUS-PROGRAMME DE PROJECTION :
                                     < (X,Y,W) --> (X,Y).
<
< DONNEES DE TRACE D'UN DISQUE :
<
LONGX::  VAL         BIT>LOGX        < LONGUEUR DE L'AXE 'X',
LONGY::  VAL         BIT>LOGY        < LONGUEUR DE L'AXE 'Y',
LONGZ::  VAL         BIT>LOGZ        < LONGUEUR DE L'AXE 'Z'.
XWOR%1:  VAL         XXN255+I
XWOR%2:  VAL         BIT>LOGZ
         TRN
XWOR%3:  VAL         XWOR%2/XWOR%1=K
         NTRN
XWOR%4:  VAL         XWOR%1=K-LOGZ   < POUR AMPLIFIER LA COORDONNEE 'Z' LORS
DECZDK:: VAL         -XWOR%4         < DU TRACE DES DISQUES.
         IF          DECZDK-XWOR%3,XEIF%,XEIF%,
         IF          ATTENTION : 'DECZDK' EST TROP GRAND !!!
XEIF%:   VAL         ENDIF
SAVEZP:  WORD        NILK            < POUR SAUVEGARDER LA COORDONNEE 'Z'
                                     < AMPLIFIEE...
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).
<
< DONNEES DE CALCUL DE 'ARCTG' :
<
ATGT1:   FLOAT       <NILK<NILK<NILK < ZONE DE TRAVAIL NUMERO 1,
ATGT2:   FLOAT       <NILK<NILK<NILK < ZONE DE TRAVAIL NUMERO 2,
ATGT3:   FLOAT       <NILK<NILK<NILK < ZONE DE TRAVAIL NUMERO 3.
ATGSDX:  WORD        NILK            < INDICATEUR "SIGNE DE X ARGUMENT":
                                     < = 0 : POSITIF OU NUL;
                                     < < 0 : NEGATIF.
ATGPSC:  FLOAT       0.0548862       < TG(PI/12).
ATGPS2:  FLOAT       1.5707963       < PI/2.
ATGPS3:  FLOAT       1.0471975       < PI/3.
ATGPS6:  FLOAT       0.5235988       < PI/6.
ATGUN:   EQU         F1
ATGR3:   FLOAT       1.7320508       < RACINE(3).
ATGP1:   FLOAT       0.6031058       < COEFFICIENTS
ATGP2:   FLOAT       0.0516045       <              (P1,P2,P3,P4)
ATGP3:   FLOAT       0.5591371       <                            DU
ATGP4:   FLOAT       1.4087812       <                               POLYNOME.
AARCTG:  WORD        ARCTG           < SOUS-PROGRAMME DE CALCUL.
PI:      FLOAT       3.1415927       < PI,
<
< POUR LE CALCUL DU LOGARITHME :
<
POLLO1:  FLOAT       <NILK<NILK<NILK < VARAIBLE DE MANOEUVRE...
POLLO2:  FLOAT       <NILK<NILK<NILK
POLLO3:  FLOAT       <NILK<NILK<NILK
POLLO4:  FLOAT       0.7071067       < RACINE(2)/2.
POLLO5:  FLOAT       1.2920088       < COEFFICIENTS
POLLO6:  FLOAT       2.6398577       <              DU
POLLO7:  FLOAT       1.656763        <                 DEVELOPPEMENT.
POLLO8:  EQU         F05             < CONSTANTE 1/2.
POLLO9:  FLOAT       0.6931472       < LN(2).
<
< POUR LE CALCUL DE L'EXPONENTIELLE :
<
POLEX1:  EQU         POLLO1          < VARIABLE DE MANOEUVRE...
POLEX2:  EQU         POLLO2
POLEX3:  EQU         POLLO3
POLEX4:  FLOAT       1.442695        < LOG2(E).
POLEX5:  WORD        NILK            < RELEVE DE L'EXPOSANT
POLEX6:  EQU         F1              < 1.0
POLEX7:  FLOAT       2               < 2.
POLEX8:  FLOAT       87.417488       < COEFFICIENTS
POLEX9:  FLOAT       0.0346573       <              DU
POLEY0:  FLOAT       -17830.91       <                 DEVELOPPEMENT.
POLEY1:  FLOAT       9.9545955
SIGNE:   WORD        NILK            < POUR DETERMINER LE SIGNE DE X**Y...
<
< POUR CALCULER
< LES EXPOSANTS :
<
XXMASK:: VAL         MOCG
XX7F::   VAL         '7F             < MAXIMUM POSITIF,
XX80::   VAL         -'80            < MIMIMUM NEGATIF.
<
< RELAIS DE SOUS-PROGRAMMES :
<
ARAK:    WORD        RAK             < CALCUL D'UNE PUISSANCE REELLE QUELCONQUE.
AEXP:    WORD        EXPON           < CALCUL D'UNE EXPONENTIELLE (BASE 'E').
<
< VARIABLES DE MANOEUVRE :
<
EXPOP:   FLOAT       <NILK<NILK<NILK < EXPOSANT COURANT...
<
< PARAMETRES GENERAUX DES GENERATEURS ALEATOIRES :
<
INF32:   FLOAT       32768
INF64:   FLOAT       65536
FWORK4:  FLOAT       <NILK<NILK<NILK
FWORK5:  FLOAT       <NILK<NILK<NILK
<
< PARAMETRES DU GENERATEUR 'RDN' :
<
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RDN1:    WORD        5189            < CONSTANTE
RDN2:    WORD        6791            < DE CALCUL DES
RDN3::   VAL         19              < NOMBRE ALEATOIRES...
RDN4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RDN5:    WORD        4021
RDN6::   VAL         23
RDN64:   FLOAT       <NILK<NILK<NILK < SUPRDN/65536.
RDNMIS:  FLOAT       <NILK<NILK<NILK < 1-(INF/SUP),
RDNPIS:  FLOAT       <NILK<NILK<NILK < 32768*(1+(INF/SUP)).
ASPRDN:  WORD        SPRDN           < GENERATEUR ALEATOIRE 2D.
<
< PARAMETRES DU GENERATEUR 'RDM' :
<
RDM:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RDM1:    WORD        5189            < CONSTANTE
RDM2:    WORD        6791            < DE CALCUL DES
RDM3::   VAL         19              < NOMBRE ALEATOIRES...
RDM4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RDM5:    WORD        4021
RDM6::   VAL         23
RDM64:   FLOAT       <NILK<NILK<NILK < SUPRDM/65536.
RDMMIS:  FLOAT       <NILK<NILK<NILK < 1-(INF/SUP),
RDMPIS:  FLOAT       <NILK<NILK<NILK < 32768*(1+(INF/SUP)).
ASPRDM:  WORD        SPRDM           < GENERATEUR ALEATOIRE 2D.
<
< DONNEES DE CALCUL DU
< CHAMP F(RHO,TETA) :
<
CHAMP:   FLOAT       <NILK<NILK<NILK < VALEUR DU CHAMP F(RHO,TETA).
RHO:     FLOAT       <NILK<NILK<NILK < RAYON POLAIRE,
TETA:    FLOAT       <NILK<NILK<NILK < ANGLE POLAIRE.
ZR:      FLOAT       <NILK<NILK<NILK < ABSCISSE FLOTTANTE DU POINT COURANT,
ZI:      FLOAT       <NILK<NILK<NILK < ORDONNEE FLOTTANTE DU POINT COURANT.
XCENTR:  FLOAT       <NILK<NILK<NILK < ABSCISSE DU CENTRE DU CHAMP,
YCENTR:  FLOAT       <NILK<NILK<NILK < ORDONNEE DU CENTRE DU CHAMP.
F255:    FLOAT       <XXN255<K<K     < DERNIERE COULEUR...
<
< GESTION DU DEROULEUR :
<
LBLOC0:  WORD        LBUFMT          < POUR VALIDER 'LBLOC'...
NVPMT::  VAL         '0B             < 'NVP' D'ACCES AU DEROULEUR DE BANDES.
DEMMT:   BYTE        NVPMT;XFMTRA    < DEMANDE DE LECTURE A ACCES DIRECT.
         WORD        BUFMT=FCTA*NOCMO
         WORD        LBUFMT
         WORD        NILK            < ADRESSE DU BLOC COURANT.
         IF          Z-I,,XEIF%,
         IF          ATTENTION : L'INITIALISATION DE 'IBUFMT' ET
         IF          'ZBUFMT' SERA MAUVAISE !!!
XEIF%:   VAL         ENDIF
IBUFMT:  WORD        LBUFMT-Z+I      < INDEX COURANT DU BUFFER 'MT',
ZBUFMT:  WORD        LBUFMT-Z+I      < ET POUR FORCER LA LECTURE DU PREMIER
                                     < BLOC DE CHAQUE IMAGE...
ABUFMT:  WORD        BUFMT,X         < ET RELAI D'ACCES...
AGOCT:   WORD        GOCT            < SOUS-PROGRAMME D'ACCES AU NIVEAU COURANT.
AGMOT:   WORD        GMOT            < RECUPERATION D'UN MOT (2 OCTETS).
<
< 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
<
< GENERATION DES SEQUENCES PERIODIQUES :
<
<        ARGUMENTS :
<                    (KP1,KP2,KP3)=CHIFFRES (CENTAINE,DIZAINE,UNITE)
<                                  DU PAS, SOIT LA PERIODE DU MOUVEMENT
<                                  EXPRIMEE EN NOMBRE D'IMAGES.
<                    (NPERIO)     =LE NOMBRE DE PERIODES A REPRESENTER.
<
NPERIO: @
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 'NPERIO'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
NPERIO:: VAL         K               < 'NPERIO' EST ABSENT...
XEIF%:   VAL         ENDIF
KP1:    @
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 'KP1'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
KP1::    VAL         K               < 'KP1' EST ABSENT...
XEIF%:   VAL         ENDIF
KP2:    @
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 'KP2'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
KP2::    VAL         K               < 'KP2' EST ABSENT...
XEIF%:   VAL         ENDIF
KP3:    @
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 'KP3'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
KP3::    VAL         K               < 'KP3' EST ABSENT...
XEIF%:   VAL         ENDIF
MULTIS:  VAL         EXIST           < A PRIORI, ON VA GENERER LA SEQUENCE
                                     < PLUSIEURS FOIS...
         IF          NPERIO-K,XEIF%1,,XEIF%1
         IF          KP1-K,XEIF%2,,XEIF%2
         IF          KP2-K,XEIF%3,,XEIF%3
         IF          KP3-K,XEIF%4,,XEIF%4
MULTIS:  VAL         NEXIST          < ET BIEN NON, LA SEQUENCE NE SERA
                                     < GENEREE QU'UNE SEULE FOIS...
XEIF%4:  VAL         ENDIF
XEIF%3:  VAL         ENDIF
XEIF%2:  VAL         ENDIF
XEIF%1:  VAL         ENDIF
         IF          MULTIS-EXIST,XEIF%9,,XEIF%9
BUFVIG:  BYTE        "(";KCR
XWOR%1:  VAL         '0000000@@@@(MOCD
XWOR%3:  VAL         $-BUFVIG*NOCMO
         IF          XWOR%1-K,XEIF%,,XEIF%
XWOR%3:  VAL         XWOR%3-W
XEIF%:   VAL         ENDIF
LBUVIG:: VAL         XWOR%3          < LONGUEUR DE LA COMMANDE AU DISQUE
                                     < VIDEO...
XWOR%2:  VAL         COSBT?XASSIM=FMASK(K?NVPVDK=FCINST
DEMVIG:  BYTE        XWOR%2;FAVW     < COMMANDE DE MEMORISATION DE L'ADRESSE
                                     < DE DEBUT D'ITERATION...
         WORD        BUFVIG=FCTA*NOCMO
         WORD        LBUVIG
BUFVIN:  EQU         $
         IF          KP1-K,,XEIF%2,
         BYTE        "P";KP1=FCBA(MOCD;KP2=FCBA(MOCD;KP3=FCBA(MOCD;KCR
XWOR%1:  VAL         '0000000@@@@(MOCD
XEIF%2:  VAL         ENDIF
         IF          KP1-K,XEIF%1,,XEIF%1
         IF          KP2-K,,XEIF%2,
         BYTE        "P";KP2=FCBA(MOCD;KP3=FCBA(MOCD;KCR
XWOR%1:  VAL         '0000000@@@@(MOCD
XEIF%2:  VAL         ENDIF
         IF          KP2-K,XEIF%2,,XEIF%2
         IF          KP3-K,,XEIF%3,
         BYTE        "P";KP3=FCBA(MOCD;KCR
XWOR%1:  VAL         '0000000@@@@(MOCD
XEIF%3:  VAL         ENDIF
         IF          KP3-K,XEIF%3,,XEIF%3
         IF          ATTENTION (KP1,KP2,KP3) EST NUL !!!
XEIF%3:  VAL         ENDIF
XEIF%2:  VAL         ENDIF
XEIF%1:  VAL         ENDIF
XWOR%3:  VAL         $-BUFVIN*NOCMO
         IF          XWOR%1-K,XEIF%,,XEIF%
XWOR%3:  VAL         XWOR%3-W
XEIF%:   VAL         ENDIF
LBUVIN:: VAL         XWOR%3          < LONGUEUR DE LA COMMANDE AU DISQUE
                                     < VIDEO...
XWOR%2:  VAL         COSBT?XASSIM=FMASK(K?NVPVDK=FCINST
DEMVIN:  BYTE        XWOR%2;FAVW     < COMMANDE DE MISE EN PLACE DU PAS
                                     < VARIABLE...
         WORD        BUFVIN=FCTA*NOCMO
         WORD        LBUVIN
BUFVI1:  BYTE        "P";"1";KCR;NILK
XWOR%1:  VAL         '0000000@@@@(MOCD
XWOR%3:  VAL         $-BUFVI1*NOCMO
         IF          XWOR%1-K,XEIF%,,XEIF%
XWOR%3:  VAL         XWOR%3-W
XEIF%:   VAL         ENDIF
LBUVI1:: VAL         XWOR%3          < LONGUEUR DE LA COMMANDE AU DISQUE
                                     < VIDEO...
XWOR%2:  VAL         COSBT?XASSIM=FMASK(K?NVPVDK=FCINST
DEMVI1:  BYTE        XWOR%2;FAVW     < COMMANDE DE RETOUR AU PAS UNITE...
         WORD        BUFVI1=FCTA*NOCMO
         WORD        LBUVI1
BUFVID:  BYTE        ")";KCR
XWOR%1:  VAL         '0000000@@@@(MOCD
XWOR%3:  VAL         $-BUFVID*NOCMO
         IF          XWOR%1-K,XEIF%,,XEIF%
XWOR%3:  VAL         XWOR%3-W
XEIF%:   VAL         ENDIF
LBUVID:: VAL         XWOR%3          < LONGUEUR DE LA COMMANDE AU DISQUE
                                     < VIDEO...
XWOR%2:  VAL         COSBT?XASSIM=FMASK(K?NVPVDK=FCINST
DEMVID:  BYTE        XWOR%2;FAVW     < COMMANDE DE RETOUR EN DEBUT D'ITERATION.
         WORD        BUFVID=FCTA*NOCMO
         WORD        LBUVID
BUFVIC:  BYTE        KCR;NILK
XWOR%1:  VAL         '0000000@@@@(MOCD
XWOR%3:  VAL         $-BUFVIC*NOCMO
         IF          XWOR%1-K,XEIF%,,XEIF%
XWOR%3:  VAL         XWOR%3-W
XEIF%:   VAL         ENDIF
LBUVIC:: VAL         XWOR%3          < LONGUEUR DE LA COMMANDE AU DISQUE
                                     < VIDEO...
XWOR%2:  VAL         COSBT?XASSIM=FMASK(K?NVPVDK=FCINST
DEMVIC:  BYTE        XWOR%2;FAVW     < COMMANDE DE PASSAGE A L'IMAGE SUIVANTE.
         WORD        BUFVIC=FCTA*NOCMO
         WORD        LBUVIC
XEIF%9:  VAL         ENDIF
<
<
<        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
         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
         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...
         NLS
         CALL        #SIP VECTEUR 512#
         LST
         PAGE
<
<
<        M A R Q U A G E   D ' U N   P O I N T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME MARQUE
<                    LE POINT ARGUMENT (X,Y) AVEC
<                    COMME NIVEAU, LE NIVEAU ARGU-
<                    MENT (A) TRANSCODE VIA LA TA-
<                    BLE 'LNIVO', CE QUI PERMET PAR
<                    EXEMPLE LA SUPERPOSITION DE
<                    PLUSIEURS IMAGES, EN FAISANT
<                    QUE LEURS TABLES 'LNIVO' SOIENT
<                    COMPLEMENTAIRES...
<
<
<        ARGUMENTS :
<                    (A)=NIVEAU,
<                    (X,Y)=COORDONNEES DU POINT.
<
<
<        RESULTAT :
<                    (A)=NIVEAU TRANSCODE.
<
<
POINT:   EQU         $
         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'.
         NLS
         CALL        #SIP UTILITAIRES#
         LST
XXXPRO:  VAL         YYYFLO          < 'YYYFLO'.
         NLS
         CALL        #SIP UTILITAIRES#
         LST
         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         $
         CPZ         IVISD           < FAUT-IL TRACER LES DISQUES ???
         JE          CERCL4          < NON...
<
< VOISINNAGE DU BORD DE L'ECRAN :
<
         LR          X,A             < VALIDATION DE 'X' :
         CP          RAYON
         JLE         CERCL4          < TROP NEGATIF...
         AD          RAYON
         CP          VECTNC
         JGE         CERCL4          < TROP POSITIF...
         LR          Y,A             < VALIDATION DE 'Y' :
         CP          RAYON
         JLE         CERCL4          < TROP NEGATIF...
         AD          RAYON
         CP          VECTNL
         JGE         CERCL4          < TROP POSITIF...
<
< INITIALISATIONS :
<
         PSR         X,Y
         LR          X,B             < (B)='X' DU CENTRE,
         PSR         Y               < SAUVEGARDE DE 'Y' DU CENTRE.
         LA          RAYON
         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'.
         LA          SAVEZ
         ADRI        Z,A             < POUR EVITER LE NOIR...
         SLRS        DECZDK          < AMPLIFICATION...
         ADRI        -Z,A            < ET DESATURATION...
         STA         SAVEZP          < SAUVEGARDE DE LA COORDONNEE 'Z'.
         PLR         Y               < ON A :
                                     < (B,Y)=COORDONNEES DU CENTRE.
         CPZ         RAYON           < LE RAYON EST-IL NUL ???
         JG          CERCL8          < NON...
         BSR         APOINT          < OUI, ON MARQUE LE CENTRE DU CERCLE (X,Y)
                                     < AVEC LE NIVEAU 'SAVEZP'.
         JMP         CERCL9          < ET ON SORT...
CERCL8:  EQU         $
<
< BALAYAGE VERTICAL :
<
         LX          RAYON
         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          RAYON
         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          RAYON           < EST-ON HORS DU DISQUE ??
         JGE         CERCL3          < OUI, ON IGNORE CE POINT...
         SB          RAYON           < NON :
         NGR         A,A             < (A)=DISTANCE DU POINT COURANT AU BORD
                                     <     DU DISQUE.
         CPZ         INEW1           < CHOIX DES NIVEAUX :
         JE          CERCL5          < 2 PLANS 'Z' PARALLELES PEUVENT UTILISER
                                     < DES NIVEAUX COMMUNS...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST CI-DESSUS EST IDIOT !!!
XEIF%:   VAL         ENDIF
         ADRI        Z,A             < DANS CETTE METHODE, LES NIVEAUX SONT
                                     < PROPRES A UN PLAN 'Z'... CE QUI PERMET
                                     < DE LES DISTINGUER...
         LR          A,B             < (B)=DISTANCE AU BORD DU DISQUE TELLE
                                     <     QU'ELLE NE SOIT PAS NULLE.
         LA          SAVEZ           < Z,
         SLRS        DECZDK          < CADRAGE,
         ADR         B,A             < (A)=NIVEAU FONCTION DE LA DISTANCE AU
                                     <     BORD ET DU 'Z'...
                                     < NOTA : AUTREFOIS, C'ETAIT UN 'ORR' POUR
                                     <        CONCATENER, MAIS DANS LA MESURE
                                     <        OU 'DECZDK' PEUT ETRE NUL, IL
                                     <        FAUT FAIRE UNE OPERATION ARITH-
                                     <        METIQUE...
         JMP         CERCL6          < VERS LE TRACE...
CERCL5:  EQU         $
         MP          SAVEZP          < DANS CETTE METHODE, 2 PLANS 'Z' PEUVENT
                                     < UTILISER LES MEMES NIVEAUX (EN FAIT SE
                                     < RECOUVRIR...).
         DV          RAYON           < (A)=NIVEAU(DISTANCE AU CENTRE,Z).
CERCL6:  EQU         $
         JAG         CERCL7          < OK...
         ADRI        Z,A             < POUR EVITER LE NOIR...
CERCL7:  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 :
<
CERCL9:  EQU         $
         PLR         X,Y
CERCL4:  EQU         $
         RSR
         PAGE
<
<
<        P R O J E C T I O N  :
<
<
<        ARGUMENTS :
<                    (X,Y,W)=POINT TRI-DIMENSIONNEL.
<
<
<        RESULTATS :
<                    (X,Y)=POINT PROJETE.
<
<
PROJ:    EQU         $
         PSR         A,B
         LR          X,A
         SLRS        DECX
         LR          A,X             < AMPLIFICATION DE 'X'.
         LR          Y,A
         SLRS        DECY
         LR          A,Y             < AMPLIFICATION DE 'Y'.
         LR          W,A
         SLRS        DECZ
         FLT
         PSR         A,B             < PRISE EN COMPTE DE 'Z' :
         FMP         COST
         BSR         AROND
         AD          TRANSX          < ET TRANSLATION,
         ADR         A,X             < X(PROJETE)=X+Z*COS(TETA)+TRANSX.
         PLR         A,B             < PRISE EN COMPTE DE 'Z' :
         FMP         SINT
         BSR         AROND
         SB          TRANSY          < ET TRANSLATION,
         SBR         A,Y             < Y(PROJETE)=Y-Z*SIN(TETA)+TRANSY.
         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
<
<
<        C A L C U L   D E   L A   F O N C T I O N   ' A R C T G '  :
<
<
<        ARGUMENT:
<                    (A,B)=VALEUR ARGUMENT.
<
<
<        RESULTAT:
<                    (A,B)='ARCTG' DE L'ARGUMENT EN RADIANS.
<
<
ARCTG:   EQU         $
<
< SAUVEGARDES ET INITIALISATIONS.
<
         PSR         X,L
         STZ         ATGSDX          < ARGUMENT 'X' POSITIF OU NUL A PRIORI.
         FCAZ
         JGE         ARCTG1
         DC          ATGSDX          < ARGUMENT 'X' NEGATIF.
ARCTG1:  EQU         $
         FABS                        < U = ABS(X).
         FCAM        ATGUN
         JGE         ARCTG2
<
< U < 1 : J RECOIT 0.
<
         LXI         K
         JMP         ARCTG3
ARCTG2:  EQU         $
<
< U >= 1 : J RECOIT 2 ET U RECOIT 1/U.
<
         LXI         W+W             < J = 2.
         FST         ATGT1
         FLD         ATGUN
         FDV         ATGT1           < U = 1/U.
ARCTG3:  EQU         $
         FCAM        ATGPSC          < COMPARER U A TG(PI/12).
         JG          ARCTG4
<
< U <= TG(PI/12) : J RECOIT J+2.
<
         ADRI        I+I,X           < J = J + 2.
         JMP         ARCTG5
ARCTG4:  EQU         $
<
< U > TG(PI/12) : J RECOIT J+1 ET
< U RECOIT  (U * RACINE(3) - 1) / (RACINE(3) + U).
<
         ADRI        I,X             < J = J + 1.
         FST         ATGT1
         FMP         ATGR3
         FSB         ATGUN
         PSR         A,B
         FLD         ATGR3
         FAD         ATGT1
         FST         ATGT1
         PLR         A,B
         FDV         ATGT1           < U=(U*RACINE(3)-1)/(RACINE(3)+U).
ARCTG5:  EQU         $
<
< FORMER Y = U * P(U ** 2) LES COEFFICIENTS DU POLYNOME ETANT ATGP1, ATGP2
< ATGP3 ET ATGP4. ON CALCULE :
< Y = U * (P1 - P2 * U ** 2 + (P3 / (P4 + U ** 2)).
<
         FST         ATGT1           < TRAV1 = U.
         FMP         ATGT1
         FST         ATGT3           < TRAV3 = U ** 2.
         FAD         ATGP4
         FST         ATGT2
         FLD         ATGP3
         FDV         ATGT2
         FAD         ATGP1
         PSR         A,B
         FLD         ATGP2
         FMP         ATGT3
         FST         ATGT3
         PLR         A,B
         FSB         ATGT3           < Y = P(U ** 2).
         FMP         ATGT1           < Y = U * P( U ** 2).
         FST         ATGT1           < TRAV1 = U * P (U ** 2).
<
< BRANCHEMENT SELON VALEUR DE J (REGISTRE 'X').
<
         ADRI        -I-I,X
         CPZR        X
         JE          ARCTG6
         JL          ARCTG7
         ADRI        -I,X
         CPZR        X
         JE          ARCTG8
<
< FAIRE Y = PI / 2 - Y.
<
         FLD         ATGPS2
         JMP         ARCTG9
ARCTG8:  EQU         $
<
< FAIRE Y = PI / 3 - Y.
<
         FLD         ATGPS3
ARCTG9:  EQU         $
         FSB         ATGT1           < - Y.
         JMP         ARCTG6
ARCTG7:  EQU         $
<
< FAIRE Y = PI / 6 + Y.
<
         FAD         ATGPS6
ARCTG6:  EQU         $
<
< AFFECTER A Y LE SIGNE DU X ARGUMENT.
<
         CPZ         ATGSDX          < SIGNE DU X ARGUMENT.
         JL          ARCTGA
<
< X ARGUMENT POSITIF OU NUL, IL FAUT QUE Y LE SOIT.
<
         FCAZ
         JGE         ARCTGB
         FNEG
         JMP         ARCTGB
ARCTGA:  EQU         $
<
< X ARGUMENT NEGATIF, IL FAUT QUE Y LE SOIT.
<
         FCAZ
         JL          ARCTGB
         FNEG
ARCTGB:  EQU         $
<
< RESTAURATIONS ET FIN...
<
         PLR         X,L
         RSR
         PAGE
<
<
<        C A L C U L   D ' U N E   P U I S S A N C E
<        Q U E L C O N Q U E   R E E L L E   ' P '  :
<
<
<        ARGUMENT :
<                    (A,B)=NOMBRE 'N' ARGUMENT,
<
<
<        RESULTAT :
<                    (A,B)='N' A LA PUISSANCE P.
<
<
RAK:     EQU         $
         PSR         Y
<
<
<        L O G   N E P E R I E N  :
<
<
LOGN:    EQU         $
         STZ         SIGNE           < =0 : SIGNE "+" A PRIORI...
         FCAZ
         JGE         LOGN1           < POSITIF...
         IC          SIGNE           < =1 : SIGNE "-"...
LOGN1:   EQU         $
         LR          A,Y
         FABS
         ANDI        XXMASK
         #/FST#      POLLO3
         FAD         POLLO4
         #/FST#      POLLO2
         LR          Y,A
         SWBR        A
         SARS        XXMASK=K
         FLT
         #/FST#      POLLO1
         #/FLD#      POLLO3
         FSB         POLLO4
         FDV         POLLO2
         #/FST#      POLLO3
         FMP         POLLO3
         FNEG
         FAD         POLLO7
         #/FST#      POLLO2
         #/FLD#      POLLO6
         FDV         POLLO2
         FAD         POLLO5
         FMP         POLLO3
         FSB         POLLO8
         FAD         POLLO1
         FMP         POLLO9
<
<
<        G E S T I O N   D U   S I G N E   D E   L ' E X P O S A N T  :
<
<
         PSR         A,B             < SAVE LE 'LOG'...
         #/FLD#      EXPOP
         FABS
         BSR         AROND           < ON PREND LA PARTIE ENTIERE (PAR EXCES
                                     < OU PAR DEFAUT) DE LA VALEUR ABSOLUE DE
                                     < L'EXPOSANT...
         TBT         NBITMO-B        < QUELLE EST SA PARITE ???
         JC          RAK1            < IMPAIRE, 'SIGNE' RESTE TEL QUEL...
         STZ         SIGNE           < PAIRE : ON FORCE "+" (SIGNE INCHANGE)...
RAK1:    EQU         $
         PLR         A,B             < RESTAURATION DU LOG,
         FMP         EXPOP           < ET ON CALCULE P*LOG...
<
<
<        E X P O N E N T I E L L E  :
<
<
EXP:     EQU         $
         FMP         POLEX4
         #/FST#      POLEX3
         FIX
         STA         POLEX5
         FLT
         FCAM        POLEX3
         JNV         EXPON3
         #/FLD#      POLEX6
         #/FST#      POLEX3
         JMP         EXPON5
EXPON3:  EQU         $
         CPZ         POLEX3
         JGE         EXPON4
         DC          POLEX5
         LA          POLEX5
         FLT
EXPON4:  EQU         $
         FSB         POLEX3
         FNEG
         #/FST#      POLEX2
         FMP         POLEX2
         #/FST#      POLEX1
         FAD         POLEX8
         #/FST#      POLEX3
         #/FLD#      POLEY0
         FDV         POLEX3
         FAD         POLEX1
         FMP         POLEX9
         FAD         POLEY1
         FSB         POLEX2
         #/FST#      POLEX3
         #/FLD#      POLEX7
         FMP         POLEX2
         FDV         POLEX3
         FAD         POLEX6
         #/FST#      POLEX3
EXPON5:  EQU         $
         SWBR        A
         SARS        XXMASK=K
         AD          POLEX5
         CPI         XX7F
         JG          $               < E R R E U R   P R O G R A M M E ...
         CPI         XX80
         JGE         EXPON6
         #/FLD#      F0              < ON PREND LE MINIMUM...
         JMP         EXPON7
EXPON6:  EQU         $
XWOR%1:  VAL         XXMASK=K
XWOR%1:  VAL         -XWOR%1
         ANDI        XXMASK>XWOR%1
         STA         POLEX5
         LA          POLEX3
         ANDI        XXMASK
         AD          POLEX5
EXPON7:  EQU         $
         CPZ         SIGNE           < PRISE EN COMPTE DU SIGNE SIMULE :
         JE          EXP1            < POSITIF, ON LAISSE LE RESULTAT TEL QUEL..
         FNEG                        < NEGATIF, ON INVERSE...
EXP1:    EQU         $
         BSR         ATSFLO
         PLR         Y
         RSR
<
<
<        E X P O N E N T I E L L E  :
<
<
EXPON:   EQU         $
         PSR         Y
         STZ         SIGNE           < "+" A PRIORI...
         JMP         EXP             < VERS LE CALCUL DE L'EXPONENTIELLE...
         PAGE
<
<
<        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)=RDN(XS,YS,GRARDN).
<
<
SPRDN:   EQU         $
<
< GENERATION ALEATOIRE :
<
         LR          X,A             < (A)=COORDONNEE 'X',
         EORR        B,A             < ET ON SE RAMENE SUR UN MOT...
         STA         FWORK4          < SAVE F1(XS)...
         LR          Y,A             < (A)=COORDONNEE 'Y',
         EOR         RDN1            < ??!???!
         STA         FWORK5          < SAVE F2(YS)...
         MP          FWORK4          < ET ON CONSTRUIT
         XR          A,B             < UNE FONCTION UNIQUE
         AD          FWORK5          < DU NOEUD COURANT,
         SB          FWORK4          < TELLE QUE :
                                     < F(X,Y)#F(Y,X),
                                     < F(X,Y)=X*Y+Y-X.
         EORR        B,A
         MP          GRARDN          < D'OU F(GRARDN,X,Y), TELLE QUE :
                                     < F(X,Y)#F(Y,X) AFIN D'EVITER UNE SYMETRIE
                                     < PAR RAPPORT A UNE DIAGONALE...
         EORR        B,A
         MP          AMAGIK          < DONT ON FAIT UN "SHUFFLING"...
         EORR        B,A             < ON CUMULE LES 2 MOTS,
<
< MISE A L'ECHELLE :
<
<
<        NOTA :
<                      ON DOIT POUR METTRE LA
<                    VALEUR 'RDN' A L'ECHELLE
<                    CALCULER L'EXPRESSION :
<
<                    (SUP/(-32768))*(-RDN/2+16384+(RDN/2-16384)*(INF/SUP)),
<
<                    QUI SE SIMPLIFIE EN :
<
<                    (SUP/65536)*(RDN*(1-(INF/SUP))+32768*(1+(INF/SUP))).
<
         FLT                         < ON FLOTTE 'RDN',
         FMP         RDNMIS          < RDN*(1-(INF/SUP)),
         FAD         RDNPIS          < RDN*(1-(INF/SUP))+32768*(1+(INF/SUP)),
         FMP         RDN64           < (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)=RDM(XS,YS,GRARDM).
<
<
SPRDM:   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         RDM1            < ??!???!
         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          GRARDM          < D'OU F(GRARDM,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 'RDM' A L'ECHELLE
<                    CALCULER L'EXPRESSION :
<
<                    (SUP/(-32768))*(-RDM/2+16384+(RDM/2-16384)*(INF/SUP)),
<
<                    QUI SE SIMPLIFIE EN :
<
<                    (SUP/65536)*(RDM*(1-(INF/SUP))+32768*(1+(INF/SUP))).
<
         FLT                         < ON FLOTTE 'RDM',
         FMP         RDMMIS          < RDM*(1-(INF/SUP)),
         FAD         RDMPIS          < RDM*(1-(INF/SUP))+32768*(1+(INF/SUP)),
         FMP         RDM64           < (SUP/65536)*(...).
<
< ET SORTIE :
<
         RSR
         PAGE
<
<
<        A C C E S   A   L ' O C T E T   C O U R A N T  :
<
<
<        ARGUMENT :
<                    (IBUFMT)=INDEX DE L'OCTET COURANT.
<
<
<        RESULTAT :
<                    (A)=OCTET COURANT.
<
<
GOCT:    EQU         $
<
< INITIALISATIONS :
<
         PSR         B,X
<
< TEST DE L'ETAT DU BUFFER :
<
         LA          IBUFMT          < (A)=INDEX COURANT :
         CP          ZBUFMT          < LE BUFFER A-T'IL ETE VIDE (OU EST-CE
                                     < L'ETAT INITIAL) ???
         JL          GOCT1           < NON...
<
< CAS OU LE BUFFER EST VIDE :
<
GOCT2:   EQU         $
         LAD         DEMMT           < (A)=ADRESSE DE LA DEMANDE,
         SVC                         < QUE L'ON ENVOIE...
         JE          GOCT3           < OK...
         QUIT        XXQUIT          < E R R E U R   D ' A S S I G N A T I O N..
         JMP         GOCT2           < ET ON RE-TENTE, OU BIEN ON ARRETE S'IL
                                     < S'AGIT D'UN 'TAPE-MARK'...
GOCT3:   EQU         $
         IC          DEMMT+ARGESC    < PREPARATION DE L'ADRESSE DU BLOC SUIVANT,
         ACTD        XXXSIZ          < RECUPERATION DE LA 'BOX'...
         LR          B,A             < (A)=NOMBRE D'OCTETS REELS DU BLOC :
         CP          DEMMT+COESC     < LE BUFFER EST-IL BON ???
         JNE         GOCT2           < NON, ON LIT L'ENREGISTREMENT SUIVANT...
         LAI         K               < (A)=INDEX DU PREMIER OCTET.
<
< ACCES A L'OCTET COURANT :
<
GOCT1:   EQU         $
         LR          A,X             < (X)=INDEX DE L'OCTET COURANT,
         LBY         &ABUFMT         < (A)=OCTET COURANT...
         ADRI        I,X             < ET PREPARATION DE
         STX         IBUFMT          <                   L'ACCES SUIVANT...
<
< ET RETOUR :
<
         PLR         B,X
         RSR
         PAGE
<
<
<        R E C U P E R A T I O N   D E   2   O C T E T S  :
<
<
<        RESULTAT :
<                    (A)=UN MOT (2 OCTETS).
<
<
GMOT:    EQU         $
         PSR         B
         BSR         AGOCT           < RECUPERATION DU PREMIER OCTET,
         SWBR        A,B             < ET MISE DANS 'B'.
         BSR         AGOCT           < RECUPERATION DU SECOND OCTET,
         ORR         B,A             < ET CONCATENATION DES 2 OCTETS.
         PLR         B
         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'...
<
<
<        E N T R Y   D E   R E B O U C L A G E  :
<
<
DEBUT4:  EQU         $
         LA          ABLOC0
         STA         DEMMT+ARGESC    < MISE EN PLACE DE L'ADRESSE DU PREMIER
                                     < BLOC A LIRE...
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'...).
<
<
<        I N I T I A L I S A T I O N S  :
<
<
INIT01:  EQU         $
<
< GESTION DE LA BANDE :
<
INIT10:  EQU         $
         LA          LBLOC           < (A)=LONGUEUR DES BLOCS PHYSIQUES SUR
                                     <     LA BANDE :
         JALE        INIT11          < BERKKK...
         CP          LBLOC0          < VALIDATION :
         JLE         INIT12          < OK...
INIT11:  EQU         $
         QUIT        XXQUIT          < E R R E U R   P A R A M E T R E ...
         JMP         INIT10          < ET ON RETENTE...
INIT12:  EQU         $
         STA         DEMMT+COESC     < ET ON INITIALISE LA DEMANDE DE LECTURE...
         STA         ZBUFMT
         STA         IBUFMT          < POUR PROVOQUER LA LECTURE DU PREMIER
                                     < BLOC...
<
< 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.
<
< GENERATEUR ALEATOIRE :
<
         #/FLD#      INFRDN          < BORNE INFERIEURE ('INF'),
         FDV         SUPRDN          < INF/SUP,
         PSR         A,B             < ET SAVE...
         FSB         F1              < (INF/SUP)-1,
         FNEG                        < 1-(INF/SUP),
         #/FST#      RDNMIS          < RDNMIS=1-(INF/SUP).
         PLR         A,B             < INF/SUP,
         FAD         F1              < 1+(INF/SUP),
         FMP         INF32           < 32768*(1+(INF/SUP)),
         #/FST#      RDNPIS          < RDNPIS=32768*(1+(INF/SUP)).
         #/FLD#      SUPRDN          < SUP,
         FDV         INF64           < SUP/65536,
         #/FST#      RDN64           < SUP64=SUP/65536.
<
< GENERATEUR ALEATOIRE :
<
         #/FLD#      INFRDM          < BORNE INFERIEURE ('INF'),
         FDV         SUPRDM          < INF/SUP,
         PSR         A,B             < ET SAVE...
         FSB         F1              < (INF/SUP)-1,
         FNEG                        < 1-(INF/SUP),
         #/FST#      RDMMIS          < RDMMIS=1-(INF/SUP).
         PLR         A,B             < INF/SUP,
         FAD         F1              < 1+(INF/SUP),
         FMP         INF32           < 32768*(1+(INF/SUP)),
         #/FST#      RDMPIS          < RDMPIS=32768*(1+(INF/SUP)).
         #/FLD#      SUPRDM          < SUP,
         FDV         INF64           < SUP/65536,
         #/FST#      RDM64           < SUP64=SUP/65536.
<
< DONNEES DE PROJECTION :
<
         #/FLD#      COST            < COS(TETA),
         FMP         COST            < COS(TETA)**2,
         FSB         F1
         FNEG                        < 1-COS(TETA)**2,
         BSR         ARAC
         #/FST#      SINT            < SIN(TETA).
<
< 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         $
<
<
<        G E N E R A T I O N   D U   C H A M P   F ( R H O , T E T A )  :
<
<
<        DEFINITION :
<                      LE CHAMP F(RHO,TETA) CONTIENT TROIS
<                    COMPOSANTES : LA PREMIERE CORRESPOND
<                    A UNE SPIRALE A 'A21' BRANCHES, LA
<                    SECONDE A UNE TACHE GAUSSIENNE CENTREE,
<                    ET ENFIN, LA TROISIEME A UN NIVEAU
<                    CONSTANT ; ON A :
<
<        F(RHO,TETA)=A0*(A1*((A11+A12*SIN(A21*TETA+A22*EXP(A31*RHO)+A23))/A13
<                        A2*EXP(A41*RHO*RHO)+
<                        A3),
<
<                    PUIS :
<
<        F(RHO,TETA)=A50*(EXP(F(RHO,TETA))-1),
<
<                      ON NOTERA QUE LA PHASE DE L'ANGLE
<                    'TETA' EST UNE FONCTION DU TYPE "SPIRALE
<                    LOGARITHMIQUE", ET DONC INDUIT LA
<                    STRUCTURE SPIRALEE.
<
<
         LYI         K               < (Y)=ORDONNEE COURANTE,
GEN100:  EQU         $
         LXI         K               < (X)=ABSCISSE COURANTE.
GEN101:  EQU         $
         PSR         X,Y
<
< PASSAGE AUX COORDONNEES CENTREES :
<
         LR          X,A             < ABSCISSE :
         FLT
         FSB         XCENTR
         #/FST#      ZR              < ABSCISSE FLOTTANTE CENTREE...
         LR          Y,A             < ORDONNEE :
         FLT
         FSB         YCENTR
         #/FST#      ZI              < ORDONNEE FLOTTANTE CENTREE...
<
< CALCUL DU RAYON POLAIRE :
<
         FMP         ZI              < ZI**2,
         #/FST#      FWORK
         #/FLD#      ZR              < ZR,
         FMP         ZR              < ZR**2,
         FAD         FWORK           < ZR**2+ZI**2,
         BSR         ARAC
         #/FST#      RHO             < RAYON POLAIRE (RHO).
<
< CALCUL DE L'ANGLE POLAIRE :
<
         FCMZ        ZR              < LA TANGENTE NE SERAIT-ELLE PAS INFINIE ??
         JNE         GEN81           < NON...
         #/FLD#      ATGPS2          < OUI, L'ARGUMENT VAUT DONC +/- PI/2.
         FCMZ        ZI              < "+" OU "-" ???
         JGE         GEN82           < +PI/2.
         FNEG                        < -PI/2,
         FAD         DEUXPI          < OU 3*PI/2...
         JMP         GEN82           < VERS LE CALCUL DU NIVEAU...
GEN81:   EQU         $
         #/FLD#      ZI              < 'ZR' N'EST PAS NUL,
         FDV         ZR              < ON CALCULE DONC LA TANGENTE DE L'ARGUMENT
         FABS                        < AFIN DE CALCULER L'ARC-TANGENTE DANS
                                     < LE SEGMENT (0,PI/2)...
         BSR         AARCTG          < PUIS L'ARC-TANGENTE.
         FCMZ        ZR
         JGE         GEN83
         FCMZ        ZI
         JGE         GEN84
         FAD         PI              < ZR<0 ET ZI<0   : PI+ARCTG...
         JMP         GEN89
GEN84:   EQU         $
         FSB         PI
         FNEG                        < ZR<0 ET ZI>=0  : PI-ARCTG...
         JMP         GEN89
GEN83:   EQU         $
         FCMZ        ZI
         JGE         GEN85
         FSB         DEUXPI
         FNEG                        < ZR>=0 ET ZI<0  : 2*PI-ARCTG...
         JMP         GEN89
GEN85:   EQU         $               < ZR>=0 ET ZI>=0 : ARCTG...
GEN89:   EQU         $
GEN82:   EQU         $
         #/FST#      TETA            < ANGLE POLAIRE (TETA).
<
< CALCUL DE LA PHASE "SPIRALEE" :
<
         #/FLD#      RHO             < RHO,
         FMP         FA31            < A31*RHO,
         BSR         AEXP            < EXP(A31*RHO),
         FMP         FA22            < A22*EXP(A31*RHO).
<
< CALCUL DE L'ANGLE :
<
         FAD         FA23            < A22*EXP(A31*RHO)+A23,
         #/FST#      FWORK
         #/FLD#      TETA            < TETA,
         FMP         FA21            < A21*TETA,
         FAD         FWORK           < A21*TETA+A22*EXP(A31*RHO)+A23, ANGLE
                                     < QUE L'ON VA NOTER 'ALPHA'.
<
< CALCUL DE LA CONTRIBUTION
< "SPIRALEE" :
<
         BSR         ASIN            < SIN(ALPHA),
         FMP         FA12            < A12*SIN(ALPHA),
         FAD         FA11            < A11+A12*SIN(ALPHA),
         FDV         FA13            < (A11+A12*SIN(ALPHA))/A13,
         FMP         FA1             < A1*(A11+A12*SIN(ALPHA))/A13, QUE L'ON
                                     < VA NOTER "SPIRALE".
         #/FST#      FWORK
<
< CALCUL DE LA CONTRIBUTION
< "GAUSSIENNE" :
<
         #/FLD#      RHO             < RHO,
         FMP         RHO             < RHO*RHO,
         FMP         FA41            < A41*RHO*RHO,
         BSR         AEXP            < EXP(A41*RHO*RHO),
         FMP         FA2             < A2*EXP(A41*RHO*RHO), QUE L'ON
                                     < NOTE "GAUSS".
<
< CALCUL DU CHAMP F(RHO,TETA) :
<
         FAD         FWORK           < SPIRALE+GAUSS,
         FAD         FA3             < SPIRALE+GAUSS+A3,
         FMP         FA0             < A0*(SPIRALE+GAUSS+A3),
<
< ACCENTUATION DES MAXIMUM :
<
         BSR         AEXP            < EXP(A0*(SPIRALE+GAUSS+A3)),
         FSB         F1              < EXP(A0*(SPIRALE+GAUSS+A3))-1,
         FMP         FA50            < A50*(EXP(A0*(SPIRALE+GAUSS+A3))-1).
         #/FST#      CHAMP           < CE QUI DONNE LE CHAMP...
<<
<< TEST :
<<
         JMP         TEST1           <<
         FMP         F255            <<
         BSR         AROND
         ANDI        'FF             <<
         BSR         APOINT          <<
         JMP         GEN300          <<
TEST1:   EQU         $               <<
<
< GENERATION DE LA GALAXIE :
<
         BSR         ASPRDN          < GENERATION D'UN NOMBRE ALEATOIRE :
         FCAM        CHAMP
         JG          GEN300          < RDN > CHAMP : PAS D'ETOILE...
         BSR         ASPRDM
         BSR         AROND           < GENERATION D'UN
         STA         SAVEZ           <                 NIVEAU ALEATOIRE...
         BSR         ACERCL          < RDN < CHAMP : ON MARQUE UNE ETOILE...
GEN300:  EQU         $
<
< PASSAGE AU POINT SUIVANT :
<
         PLR         X,Y
         ADRI        I,X
         LR          X,A
         CP          VECTNC          < EXISTE-T'IL ???
         JG          GEN201          < NON...
         BSR         AGOTO           < OUI...
         WORD        GEN101          < OUI...
GEN201:  EQU         $
<
< NON, PASSAGE A LA LIGNE SUIVANTE :
<
         ADRI        I,Y
         LR          Y,A
         CP          VECTNL          < EXISTE-T'ELLE ???
         JG          GEN200          < NON...
         BSR         AGOTO           < OUI...
         WORD        GEN100          < OUI...
GEN200:  EQU         $
<
<
<        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         $
         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 :
         IF          MULTIS-NEXIST,XEIF%,,XEIF%
         LAD         DEMVIW
         SVC                         < ON ECRIT L'IMAGE COURANTE...
         LAD         DEMVIR
         SVC                         < ET ON ATTEND L'ACQUITTEMENT...
XEIF%:   VAL         ENDIF
         IF          MULTIS-EXIST,XEIF%,,XEIF%
         LAD         DEMVIG
         SVC                         < ON MEMORISE L'ADRESSE COURANTE...
         LAD         DEMVIR
         SVC                         < ATTENTE DE L'ACQUITTEMENT...
         LAD         DEMVIN
         SVC                         < ON ENVOIE LE PAS (KP1,KP2,KP3)...
         LAD         DEMVIR
         SVC                         < ATTENTE DE L'ACQUITTEMENT...
         LRM         X
         WORD        NPERIO          < (X)=NOMBRE D'IMAGES A ECRIRE=NOMBRE
                                     <     DE PERIODES.
GEN999:  EQU         $
         PSR         X
         LAD         DEMVIW
         SVC                         < ECRITURE D'UNE IMAGE...
         LAD         DEMVIR
         SVC                         < ATTENTE DE L'ACQUITTEMENT...
         PLR         X
         JDX         GEN999          < VERS L'IMAGE SUIVANTE...
         LAD         DEMVI1
         SVC                         < RESTAURATION DU PAS UNITE...
         LAD         DEMVIR
         SVC                         < ATTENTE DE L'ACQUITTEMENT...
         LAD         DEMVID
         SVC                         < RETOUR EN DEBUT DE SEQUENCE...
         LAD         DEMVIR
         SVC                         < ATTENTE DE L'ACQUITTEMENT...
         LAD         DEMVIC
         SVC                         < ET PROGRESSION UNITAIRE DE L'IMAGE
                                     < COURANTE...
         LAD         DEMVIR
         SVC                         < ATTENTE DE L'ACQUITTEMENT...
XEIF%:   VAL         ENDIF
         PLR         X
GEN400:  EQU         $
         BR          ADEB9           < A L'IMAGE SUIVANTE...
<
<
<        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  :
<
<
         $EQU        COST
         FLOAT       0.8             < COS(TETA).
         $EQU        TRANSX
         WORD        0               < TRANSLATION DE X(PROJETE).
         $EQU        TRANSY
         WORD        0               < TRANSLATION DE Y(PROJETE).
         $EQU        RAYON
         WORD        0               < RAYON DES PARTICULES.
         $EQU        GRARDN
         WORD        '1234           < GRARDN DU GENERATEUR ALEATOIRE.
         $EQU        SUPRDN
         NTRN
         FLOAT       1               < SUP(RDN).
         TRN
         $EQU        INFRDN
         NTRN
         FLOAT       0               < INF(RDN).
         TRN
         $EQU        GRARDM
         WORD        '5678           < GRARDM DU GENERATEUR ALEATOIRE.
         $EQU        SUPRDM
         NTRN
         FLOAT       <BIT>LOGZ-Z<K<K < SUP(RDM).
         TRN
         $EQU        INFRDM
         NTRN
         FLOAT       <W<K<K          < INF(RDM).
         TRN
         $EQU        XCENTR
         FLOAT       <XMAX+Z/XXXMOY<K<K
                                     < ABSCISSE DU CENTRE DU CHAMP,
         $EQU        YCENTR
         FLOAT       <YMAX+Z/XXXMOY<K<K
                                     < ORDONNEE DU CENTRE DU CHAMP.
         $EQU        FA0
         FLOAT       4
         $EQU        FA1
         FLOAT       0.8             < CONTRIBUTION DES SPIRALES.
         $EQU        FA2
         FLOAT       0.8             < CONTRIBUTION GAUSSIENNE.
         $EQU        FA3
         FLOAT       0
         $EQU        FA11
         FLOAT       1
         $EQU        FA12
         FLOAT       1
         $EQU        FA13
         FLOAT       2
         $EQU        FA41
         FLOAT       -64.E-6         < CE QUI EST EN GROS 4*(1/256)**2...
         $EQU        FA21
         FLOAT       2               < NOMBRE DE BRAS DE LA SPIRALE.
         $EQU        FA22
         FLOAT       1
         $EQU        FA31
         FLOAT       4.E-3           < CE QUI EST EN GROS 1/256...
         $EQU        FA23
         FLOAT       0
         $EQU        FA50
         FLOAT       0.02
         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-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2024.