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).
NHORIZ:  WORD        NILK            < DONNE LE NOMBRE DE PARTICULES VIRTUELLES
                                     < DEFINISSANT L'HORIZON ; LEUR RANG EST
                                     < DANS (0,NHORIZ-1).
RAYONP:  WORD        NILK            < RAYON DES PARTICULES.
BASEP:   WORD        NILK            < NUMERO DE LA PREMIERE COULEUR UTILISEE
                                     < POUR LES PARTICULES.
NCOLP:   WORD        NILK            < NOMBRE DE COULEURS POUR LES PARTICULES.
RAYONH:  WORD        NILK            < RAYON DES PARTICULES VIRTUELLES.
BASEH:   WORD        NILK            < NUMERO DE LA PREMIERE COULEUR UTILISEE
                                     < POUR LES PARTICULES VIRTUELLES DE
                                     < L'HORIZON.
NCOLH:   WORD        NILK            < NOMBRE DE COULEURS POUR LES PARTICULES
                                     < VIRTUELLES DE L'HORIZON.
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...
IVISDI:  WORD        EXIST           < DOIT-ON VISUALISER LES PARTICULES DANS
                                     < L'ORDRE DE LECTURE ('EXIST').
IVISDX:  WORD        NEXIST          < DOIT-ON CREER UNE FENETRE (OZ,OX) ???
MULX:    WORD        NILK            < POUR FAIRE
DIVX:    WORD        NILK            <            UNE HOMOTHETIE,
TRXX:    WORD        NILK            < ET UNE TRANSLATION
TRXY:    WORD        NILK            <                    DE LA FENETRE ASSOCIEE
                                     < AU PLAN (OZ,OX).
IVISDY:  WORD        NEXIST          < DOIT-ON CREER UNE FENETRE (OY,OZ) ???
MULY:    WORD        NILK            < POUR FAIRE
DIVY:    WORD        NILK            <            UNE HOMOTHETIE,
TRYX:    WORD        NILK            < ET UNE TRANSLATION
TRYY:    WORD        NILK            <                    DE LA FENETRE ASSOCIEE
                                     < AU PLAN (OY,OZ).
IVISDZ:  WORD        NEXIST          < DOIT-ON CREER UNE FENETRE (OX,OY) ???
MULZ:    WORD        NILK            < POUR FAIRE
DIVZ:    WORD        NILK            <            UNE HOMOTHETIE,
TRZX:    WORD        NILK            < ET UNE TRANSLATION
TRZY:    WORD        NILK            <                    DE LA FENETRE ASSOCIEE
                                     < AU PLAN (OX,OY).
<
< MATRICE DE TRANSFORMATION :
<
MAT11:   FLOAT       <NILK<NILK<NILK
MAT12:   FLOAT       <NILK<NILK<NILK
MAT13:   FLOAT       <NILK<NILK<NILK
TRMATX:  WORD        NILK            < TRANSLATION APRES MULTIPLICATION PAR LA
                                     < MATRICE 'MAT'.
IMODX:   WORD        NEXIST          < PAS DE MODULO SUR L'AXE 'OX' TRANSFORME,
MAT21:   FLOAT       <NILK<NILK<NILK
MAT22:   FLOAT       <NILK<NILK<NILK
MAT23:   FLOAT       <NILK<NILK<NILK
TRMATY:  WORD        NILK            < TRANSLATION APRES MULTIPLICATION PAR LA
                                     < MATRICE 'MAT'.
IMODY:   WORD        NEXIST          < PAS DE MODULO SUR L'AYE 'OY' TRANSFORME,
MAT31:   FLOAT       <NILK<NILK<NILK
MAT32:   FLOAT       <NILK<NILK<NILK
MAT33:   FLOAT       <NILK<NILK<NILK
TRMATZ:  WORD        NILK            < TRANSLATION APRES MULTIPLICATION PAR LA
                                     < MATRICE 'MAT'.
IMODZ:   WORD        NEXIST          < PAS DE MODULO SUR L'AZE 'OZ' TRANSFORME,
<
< 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 :
<
SAVEX:   WORD        NILK
SAVEY:   WORD        NILK
SAVEZ:   WORD        NILK
SAVET:   WORD        NILK
<
< 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...
RAYON:   WORD        NILK            < RAYON DU DISQUE COURANT.
BASE:    WORD        NILK            < NUMERO DE LA PREMIERE COULEUR DISPONI-
                                     < BLE.
NCOL:    WORD        NILK            < NOMBRE DE COULEURS DISPONIBLES.
ANIV:    WORD        NIV256          < NOMBRE DE COULEURS TOTAL.
ACERCL:  WORD        CERCLE          < SOUS-PROGRAMME DE TRACE.
AMARKP:  WORD        MARKP           < MARQUAGE D'UNE PARTICULE, L'ECRAN ETANT
                                     < LE PLAN (OX,OY) ET CE SANS HOMOTHETIE.
AMARKX:  WORD        MARKX           < MARQUAGE D'UNE PARTICULE, L'ECRAN
                                     < ETANT LE PLAN (OY,OZ) AVEC HOMOTHETIE.
AMARKY:  WORD        MARKY           < MARQUAGE D'UNE PARTICULE, L'ECRAN
                                     < ETANT LE PLAN (OZ,OX) AVEC HOMOTHETIE.
AMARKZ:  WORD        MARKZ           < MARQUAGE D'UNE PARTICULE, L'ECRAN
                                     < ETANT LE PLAN (OX,OY) AVEC HOMOTHETIE.
<
< DONNEES DE LA TRANSFORMATION
< MATRICIELLE (MATIJ) :
<
APRMAT:  WORD        PRMAT           < SOUS-PROGRAMME DE TRANSFORMATION.
BLOGXN:  WORD        BIT>LOGX-N
BLOGYN:  WORD        BIT>LOGY-N
BLOGZN:  WORD        BIT>LOGZ-N
<
< 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).
<
< DONNEES DIVERSES :
<
VITESS:  WORD        NILK            < VITESSE,
REDSH:   WORD        NILK            < RED-SHIFT,
DENSIT:  WORD        NILK            < DENSITE DE MASSE,
ENERGI:  WORD        NILK            < ET ENERGIE DES PARTICULES.
RANG:    WORD        NILK            < RANG DE LA PARTICULE DANS LE NUAGE.
<
< GESTION DE LA LISTE DES PARTICULES :
<
ALISTP:  WORD        LISTP,X         < RELAI D'ACCES A LA LISTE.
DEMMEM:  WORD        4               < DEMANDE MEMEOIRE
         WORD        0
         WORD        '8000           <                  DE 16K-MOTS.
<
< 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
<
<
<        L I S T E   D E S   P A R T I C U L E S  :
<
<
         DSEC        DPARTI          < DEFINITION D'UNE ENTREE :
PARTI:   EQU         $
PARTIX:  WORD        NILK            < COORDONNEE 'X',
PARTIY:  WORD        NILK            < COORDONNEE 'Y',
PARTIZ:  WORD        NILK            < COORDONNEE 'Z',
PARTIT:  WORD        NILK            < TEMPS PROPRE DE L'OBSERVATEUR,
PARTIV:  WORD        NILK            < VITESSE DE LA PARTICULE,
PARTIH:  WORD        NILK            < RED-SHIFT,
PARTIR:  WORD        NILK            < RANG DE LA PARTICULE (SOIT SON IDENTITE).
ARG:     BYTE        NILK;NILK       < COUPLE (DENSITE,ENERGIE).
LENTR::  VAL         $-PARTI*NOCMO   < LONGUEUR D'UNE ENTREE.
         TABLE
NBUF::   VAL         4               < LA LISTE PARTICULES TIENT DANS 4 BUFFERS
                                     < "BANDE"...
         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...
         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
<
<
<        T R A N S F O R M A T I O N   M A T R I C I E L L E  :
<
<
<        ARGUMENT :
<                    (X,Y,W)=COORDONNEES (X,Y,Z).
<
<
<        RESULTAT :
<                    (X)=A11*X+A12*Y+A13*Z+TRMATX EVENTUELLEMENT MODULO,
<                    (Y)=A21*X+A22*Y+A23*Z+TRMATY EVENTUELLEMENT MODULO,
<                    (W)=A31*X+A32*Y+A33*Z+TRMATZ EVENTUELLEMENT MODULO.
<
<
PRMAT:   EQU         $
<
< CALCUL DU NOUVEL 'X' :
<
         LR          X,A             < X,
         FLT
         FMP         MAT11           < A11*X,
         BSR         ASFWOR
         LR          Y,A             < Y,
         FLT
         FMP         MAT12           < A12*Y,
         BSR         APFWOR          < A11*X+A12*Y,
         LR          W,A             < Z,
         FLT
         FMP         MAT13           < A13*Z,
         BSR         APFWOR          < A11*X+A12*Y+A13*Z,
         FAD         TRMATX          < A11*X+A12*Y+A13*Z+TRANSX,
         BSR         AROND
         CPZ         IMODX           < FAUT-IL CALCULER MODULO SUR 'OX' ???
         JE          PRMAT1          < NON...
         AND         BLOGXN          < OUI...
PRMAT1:  EQU         $
         PSR         A               < SAUVEGARDE DU NOUVEL 'X'...
<
< CALCUL DU NOUVEL 'Y' :
<
         LR          X,A             < X,
         FLT
         FMP         MAT21           < A21*X,
         BSR         ASFWOR
         LR          Y,A             < Y,
         FLT
         FMP         MAT22           < A22*Y,
         BSR         APFWOR          < A21*X+A22*Y,
         LR          W,A             < Z,
         FLT
         FMP         MAT23           < A23*Z,
         BSR         APFWOR          < A21*X+A22*Y+A23*Z,
         FAD         TRMATY          < A21*X+A22*Y+A23*Z+TRANSY,
         BSR         AROND
         CPZ         IMODY           < FAUT-IL CALCULER MODULO SUR 'OY' ???
         JE          PRMAT2          < NON...
         AND         BLOGYN          < OUI...
PRMAT2:  EQU         $
         PSR         A               < SAUVEGARDE DU NOUVEL 'Y'...
<
< CALCUL DU NOUVEAU 'Z' :
<
         LR          X,A             < X,
         FLT
         FMP         MAT31           < A31*X,
         BSR         ASFWOR
         LR          Y,A             < Y,
         FLT
         FMP         MAT32           < A32*Y,
         BSR         APFWOR          < A31*X+A32*Y,
         LR          W,A             < Z,
         FLT
         FMP         MAT33           < A33*Z,
         BSR         APFWOR          < A31*X+A32*Y+A33*Z,
         FAD         TRMATZ          < A31*X+A32*Y+A33*Z+TRANSZ,
         BSR         AROND
         CPZ         IMODZ           < FAUT-IL CALCULER MODULO SUR 'OZ' ???
         JE          PRMAT3          < NON...
         AND         BLOGZN          < OUI...
PRMAT3:  EQU         $
         LR          A,W             < Z,
         PLR         A
         LR          A,Y             < Y,
         PLR         A
         LR          A,X             < X.
<
< RETOUR :
<
         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         $
         CPZ         IVISD           < FAUT-IL TRACER LES DISQUES ???
         JE          CERCL4          < NON...
<
< 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.
<
< 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         $
         MP          NCOL
         DV          ANIV
         AD          BASE            < (A)=COULEUR RAMENEE DANS LE SEGMENT
                                     <     (BASE,BASE+NCOL-1).
         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 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
<
<
<        M A R Q U A G E   D ' U N E   P A R T I C U L E
<        L E   P L A N   ( O X , O Y )   E T A N T   L ' E C R A N  :
<
<
<        ARGUMENT :
<                    (X,Y)=COORDONNEE 2D DU CENTRE,
<                    (W)=TROISIEME COORDONNEE DE CE POINT.
<
<
MARKP:   EQU         $
         PSR         A,B,X,Y
         LR          W,A             < (A)=TROISIEME COORDONNEE :
         CP          TZMIN
         JL          MARKP0          < EN ARRIERE DE LA TRANCHE...
         CP          TZMAX
         JG          MARKP0          < EN AVANT DE LA TRANCHE...
         PSR         X,Y
         LB          RAYONP          < A PRIORI
         LX          BASEP           <          IL S'AGIT D'UNE
         LY          NCOLP           <                          PARTICULE REEL.
         LA          RANG            < (A)=RANG DE LA PARTICULE :
         CP          NHORIZ          < EST-CE UNE DES PARTICULES VIRTUELLES
                                     < DEFINISSANT L'HORIZON ???
         JGE         MARKP1          < NON...
         LB          RAYONH          < OUI : IL S'AGIT D'UNE
         LX          BASEH           <                       PARTICULE
         LY          NCOLH           < VIRTUELLE DE L'HORIZON.
MARKP1:  EQU         $
         STB         RAYON           < RAYON COURANT,
         STX         BASE            < PREMIERE COULEUR COURANTE,
         STY         NCOL            < NOMBRE DE COULEURS COURANT.
         PLR         X,Y
         LR          X,A
         LR          A,X             <    TRANSLATION.
         LR          Y,A
         LR          A,Y             <    TRANSLATION.
         BSR         ACERCL          < ET MARQUAGE DU SITE COURANT PAR SPHERES,
MARKP0:  EQU         $
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        M A R Q U A G E   D ' U N E   P A R T I C U L E
<        L E   P L A N   ( O Y , O Z )   E T A N T   L ' E C R A N  :
<
<
<        ARGUMENT :
<                    (X,Y)=COORDONNEE 2D DU CENTRE,
<                    (W)=TROISIEME COORDONNEE DE CE POINT.
<
<
MARKX:   EQU         $
         PSR         A,B,X,Y
         LR          W,A             < (A)=TROISIEME COORDONNEE :
         CP          TXMIN
         JL          MARKX0          < EN ARRIERE DE LA TRANCHE...
         CP          TXMAX
         JG          MARKX0          < EN AVANT DE LA TRANCHE...
         PSR         X,Y
         LB          RAYONP          < A PRIORI
         LX          BASEP           <          IL S'AGIT D'UNE
         LY          NCOLP           <                          PARTICULE REEL.
         LA          RANG            < (A)=RANG DE LA PARTICULE :
         CP          NHORIZ          < EST-CE UNE DES PARTICULES VIRTUELLES
                                     < DEFINISSANT L'HORIZON ???
         JGE         MARKX1          < NON...
         LB          RAYONH          < OUI : IL S'AGIT D'UNE
         LX          BASEH           <                       PARTICULE
         LY          NCOLH           < VIRTUELLE DE L'HORIZON.
MARKX1:  EQU         $
         LR          B,A
         MP          MULX            < HOMOTHETIE
         DV          DIVX            <            POUR REDUCTION...
         STA         RAYON           < RAYON COURANT,
         STX         BASE            < PREMIERE COULEUR COURANTE,
         STY         NCOL            < NOMBRE DE COULEURS COURANT.
         PLR         X,Y
         LR          X,A
         MP          MULX            < HOMOTHETIE
         DV          DIVX            <            POUR REDUCTION,
         AD          TRXX            < ET
         LR          A,X             <    TRANSLATION.
         LR          Y,A
         MP          MULX            < HOMOTHETIE
         DV          DIVX            <            POUR REDUCTION.
         AD          TRXY            < ET
         LR          A,Y             <    TRANSLATION.
         BSR         ACERCL          < ET MARQUAGE DU SITE COURANT PAR SPHERES,
MARKX0:  EQU         $
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        M A R Q U A G E   D ' U N E   P A R T I C U L E
<        L E   P L A N   ( O Z , O X )   E T A N T   L ' E C R A N  :
<
<
<        ARGUMENT :
<                    (X,Y)=COORDONNEE 2D DU CENTRE,
<                    (W)=TROISIEME COORDONNEE DE CE POINT.
<
<
MARKY:   EQU         $
         PSR         A,B,X,Y
         LR          W,A             < (A)=TROISIEME COORDONNEE :
         CP          TYMIN
         JL          MARKY0          < EN ARRIERE DE LA TRANCHE...
         CP          TYMAX
         JG          MARKY0          < EN AVANT DE LA TRANCHE...
         PSR         X,Y
         LB          RAYONP          < A PRIORI
         LX          BASEP           <          IL S'AGIT D'UNE
         LY          NCOLP           <                          PARTICULE REEL.
         LA          RANG            < (A)=RANG DE LA PARTICULE :
         CP          NHORIZ          < EST-CE UNE DES PARTICULES VIRTUELLES
                                     < DEFINISSANT L'HORIZON ???
         JGE         MARKY1          < NON...
         LB          RAYONH          < OUI : IL S'AGIT D'UNE
         LX          BASEH           <                       PARTICULE
         LY          NCOLH           < VIRTUELLE DE L'HORIZON.
MARKY1:  EQU         $
         LR          B,A
         MP          MULY            < HOMOTHETIE
         DV          DIVY            <            POUR REDUCTION...
         STA         RAYON           < RAYON COURANT,
         STX         BASE            < PREMIERE COULEUR COURANTE,
         STY         NCOL            < NOMBRE DE COULEURS COURANT.
         PLR         X,Y
         LR          X,A
         MP          MULY            < HOMOTHETIE
         DV          DIVY            <            POUR REDUCTION,
         AD          TRYX            < ET
         LR          A,X             <    TRANSLATION.
         LR          Y,A
         MP          MULY            < HOMOTHETIE
         DV          DIVY            <            POUR REDUCTION.
         AD          TRYY            < ET
         LR          A,Y             <    TRANSLATION.
         BSR         ACERCL          < ET MARQUAGE DU SITE COURANT PAR SPHERES,
MARKY0:  EQU         $
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        M A R Q U A G E   D ' U N E   P A R T I C U L E
<        L E   P L A N   ( O X , O Y )   E T A N T   L ' E C R A N  :
<
<
<        ARGUMENT :
<                    (X,Y)=COORDONNEE 2D DU CENTRE,
<                    (W)=TROISIEME COORDONNEE DE CE POINT.
<
<
MARKZ:   EQU         $
         PSR         A,B,X,Y
         LR          W,A             < (A)=TROISIEME COORDONNEE :
         CP          TZMIN
         JL          MARKZ0          < EN ARRIERE DE LA TRANCHE...
         CP          TZMAX
         JG          MARKZ0          < EN AVANT DE LA TRANCHE...
         PSR         X,Y
         LB          RAYONP          < A PRIORI
         LX          BASEP           <          IL S'AGIT D'UNE
         LY          NCOLP           <                          PARTICULE REEL.
         LA          RANG            < (A)=RANG DE LA PARTICULE :
         CP          NHORIZ          < EST-CE UNE DES PARTICULES VIRTUELLES
                                     < DEFINISSANT L'HORIZON ???
         JGE         MARKZ1          < NON...
         LB          RAYONH          < OUI : IL S'AGIT D'UNE
         LX          BASEH           <                       PARTICULE
         LY          NCOLH           < VIRTUELLE DE L'HORIZON.
MARKZ1:  EQU         $
         LR          B,A
         MP          MULZ            < HOMOTHETIE
         DV          DIVZ            <            POUR REDUCTION...
         STA         RAYON           < RAYON COURANT,
         STX         BASE            < PREMIERE COULEUR COURANTE,
         STY         NCOL            < NOMBRE DE COULEURS COURANT.
         PLR         X,Y
         LR          X,A
         MP          MULZ            < HOMOTHETIE
         DV          DIVZ            <            POUR REDUCTION,
         AD          TRZX            < ET
         LR          A,X             <    TRANSLATION.
         LR          Y,A
         MP          MULZ            < HOMOTHETIE
         DV          DIVZ            <            POUR REDUCTION.
         AD          TRZY            < ET
         LR          A,Y             <    TRANSLATION.
         BSR         ACERCL          < ET MARQUAGE DU SITE COURANT PAR SPHERES,
MARKZ0:  EQU         $
         PLR         A,B,X,Y
         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,K
         WORD        COM+DEPBAS      < POSITIONNEMENT DE 'C',
         WORD        STACK-DEPILE    < ET DE 'K'.
<
< DEMANDE D'ALLOCATION MEMOIRE :
<
         LAD         DEMMEM
         SVC
         JE          DEBUT1          < OK...
         QUIT        XXQUIT          < E R R E U R   S Y S T E M E ...
DEBUT1:  EQU         $
<
< 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.
<
< 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         $
<
<
<        V I S U A L I S A T I O N   D U   C H A M P   3 D  :
<
<
         LRM         X
         WORD        NBUF*LBUFMT/LENTR
                                     < (X)=NOMBRE DE POINTS A TRAITER.
TROU01:  EQU         $
<
< RECUPERATION DU POINT COURANT :
<
         PSR         X
         BSR         AGMOT
         LR          A,X             < COORDONNEE 'X',
         STA         SAVEX
         BSR         AGMOT
         LR          A,Y             < COORDONNEE 'Y',
         STA         SAVEY
         BSR         AGMOT
         LR          A,W             < COORDONNEE 'Z',
         STA         SAVEZ
         BSR         AGMOT
         STA         SAVET           < COORDONNEE 'T',
         BSR         AGMOT
         STA         VITESS          < VITESSE,
         BSR         AGMOT
         STA         REDSH           < REDSHIFT,
         BSR         AGMOT
         STA         RANG            < RANG DE LA PARTICULE.
         BSR         AGOCT
         STA         DENSIT          < PREMIER ARGUMENT (DENSITE),
         BSR         AGOCT
         STA         ENERGI          < DEUXIEME ARGUMENT (ENERGIE).
         PSR         X,Y,W
         LA          RANG            < (A)=RANG DE LA PARTICULE,
         SLLS        LENTR/NOCMO=K   < CONVERSION EN UN INDEX MOT,
         LR          A,X
         LAD         &ALISTP         < (A)=ADRESSE DE L'ENTREE,
         LR          A,W             < QUI VA ETRE BASEE PAR 'W'...
         LA          RANG
         STA         PARTIR-PARTI,W  < POUR VERIFIER...
         LA          SAVEX
         STA         PARTIX-PARTI,W  < COORDONNEE 'X',
         LA          SAVEY
         STA         PARTIY-PARTI,W  < COORDONNEE 'Y',
         LA          SAVEZ
         STA         PARTIZ-PARTI,W  < COORDONNEE 'Z',
         LA          SAVET
         STA         PARTIT-PARTI,W  < COORDONNEE 'T',
         LA          VITESS
         STA         PARTIV-PARTI,W  < VITESSE,
         LA          REDSH
         STA         PARTIH-PARTI,W  < REDSHIFT.
         LA          DENSIT
         SWBR        A,A
         OR          ENERGI
         STA         ARG-PARTI,W     < ARGUMENT (DENSITE,ENERGIE).
         PLR         X,Y,W
         CPZ         IVISDI          < DOIT-ON VISUALISER AU FUR ET
                                     < A MESURE ???
         JE          TROU02          < NON...
<
< VISUALISATION AU FUR ET A MESURE :
<
         BSR         APROJ           < PROJECTION (X,Y,W) --> (X,Y).
         BSR         AMARKP          < MARQUAGE DANS LE PLAN (OX,OY).
TROU02:  EQU         $
<
< PASSAGE AU POINT SUIVANT :
<
         PLR         X
         JDX         TROU01          < S'IL EXISTE...
<
<
<        V I S U A L I S A T I O N   D A N S   L E   P L A N   ( O Y , O Z )  :
<
<
         CPZ         IVISDX          < DOIT-ON OUVRIR CETTE FENETRE ???
         JE          TROUX0          < NON...
<
< BALAYAGE PLAN PAR PLAN :
<
         LRM         X,Y             < OUI :
         WORD        BIT>LOGX        < (X)=NOMBRE DE PLANS A TESTER,
         WORD        K               < (Y)=NUMERO DU PREMIER PLAN A TESTER.
TROUX1:  EQU         $
         PSR         X
<
< BALAYAGE DE LA LISTE DES PARTICULES :
<
         LRM         X,L
         WORD        NBUF*LBUFMT/LENTR
                                     < (X)=NOMBRE DE PARTICULES,
         WORD        LISTP           < (L)=ADRESSE DE LA LISTE DES PARTICULES.
TROUX3:  EQU         $
         LA          PARTIX-PARTI,L  < (A)=COORDONNEE 'X' DE LA PARTICULE
                                     <     COURANTE :
         CPR         A,Y             < EST-ELLE DANS LE PLAN COURANT ???
         JNE         TROUX2          < NON, ON L'IGNORE...
<
< TRAITEMENT D'UNE PARTICULE :
<
         PSR         X,Y,W           < OUI, ON LA TRAITE :
         LA          PARTIR-PARTI,L
         STA         RANG            < RANG DE LA PARTICULE.
         LX          PARTIY-PARTI,L  < (X)=COORDONNEE 'Y',
         LY          PARTIZ-PARTI,L  < (Y)=COORDONNEE 'Z',
         LA          PARTIX-PARTI,L  < (A)=COORDONNEE 'X',
         LR          A,W             < (W)=COORDONNEE 'Z'.
         STA         SAVEZ
         STY         SAVEY
         STX         SAVEX
         LA          PARTIT-PARTI,L
         STA         SAVET           < COORDONNEE 'T',
         LA          PARTIV-PARTI,L
         STA         VITESS          < VITESSE,
         LA          PARTIH-PARTI,L
         STA         REDSH           < RED-SHIFT,
         LA          ARG-PARTI,L
         ANDI        MOCD
         STA         ENERGI          < ENERGIE,
         LA          ARG-PARTI,L
         SLRS        MOCG=K
         STA         DENSIT          < DENSITE.
         BSR         APROJ           < PROJECTION (X,Y,W) --> (X,Y),
         BSR         AMARKX          < ET MARQUAGE...
         PLR         X,Y,W           < RESTAURATION,
TROUX2:  EQU         $
         ADRI        LENTR/NOCMO,L   < PASSAGE A L'ENTREE SUIVANTE,
         JDX         TROUX3          < ET A LA PARTICULE SUIVANTE...
         PLR         X               < SI TOUTE LA LISTE A ETE EXPLOREE,
         ADRI        I,Y             < ON PASSE AU PLAN SUIVANT,
         JDX         TROUX1          < S'IL EXISTE...
TROUX0:  EQU         $
<
<
<        V I S U A L I S A T I O N   D A N S   L E   P L A N   ( O Z , O X )  :
<
<
         CPZ         IVISDY          < DOIT-ON OUVRIR CETTE FENETRE ???
         JE          TROUY0          < NON...
<
< BALAYAGE PLAN PAR PLAN :
<
         LRM         X,Y             < OUI :
         WORD        BIT>LOGY        < (X)=NOMBRE DE PLANS A TESTER,
         WORD        K               < (Y)=NUMERO DU PREMIER PLAN A TESTER.
TROUY1:  EQU         $
         PSR         X
<
< BALAYAGE DE LA LISTE DES PARTICULES :
<
         LRM         X,L
         WORD        NBUF*LBUFMT/LENTR
                                     < (X)=NOMBRE DE PARTICULES,
         WORD        LISTP           < (L)=ADRESSE DE LA LISTE DES PARTICULES.
TROUY3:  EQU         $
         LA          PARTIY-PARTI,L  < (A)=COORDONNEE 'Y' DE LA PARTICULE
                                     <     COURANTE :
         CPR         A,Y             < EST-ELLE DANS LE PLAN COURANT ???
         JNE         TROUY2          < NON, ON L'IGNORE...
<
< TRAITEMENT D'UNE PARTICULE :
<
         PSR         X,Y,W           < OUI, ON LA TRAITE :
         LA          PARTIR-PARTI,L
         STA         RANG            < RANG DE LA PARTICULE.
         LX          PARTIZ-PARTI,L  < (X)=COORDONNEE 'Z',
         LY          PARTIX-PARTI,L  < (Y)=COORDONNEE 'X',
         LA          PARTIY-PARTI,L  < (A)=COORDONNEE 'Y',
         LR          A,W             < (W)=COORDONNEE 'Z'.
         STA         SAVEZ
         STY         SAVEY
         STX         SAVEX
         LA          PARTIT-PARTI,L
         STA         SAVET           < COORDONNEE 'T',
         LA          PARTIV-PARTI,L
         STA         VITESS          < VITESSE,
         LA          PARTIH-PARTI,L
         STA         REDSH           < RED-SHIFT,
         LA          ARG-PARTI,L
         ANDI        MOCD
         STA         ENERGI          < ENERGIE,
         LA          ARG-PARTI,L
         SLRS        MOCG=K
         STA         DENSIT          < DENSITE.
         BSR         APROJ           < PROJECTION (X,Y,W) --> (X,Y),
         BSR         AMARKY          < ET MARQUAGE...
         PLR         X,Y,W           < RESTAURATION,
TROUY2:  EQU         $
         ADRI        LENTR/NOCMO,L   < PASSAGE A L'ENTREE SUIVANTE,
         JDX         TROUY3          < ET A LA PARTICULE SUIVANTE...
         PLR         X               < SI TOUTE LA LISTE A ETE EXPLOREE,
         ADRI        I,Y             < ON PASSE AU PLAN SUIVANT,
         JDX         TROUY1          < S'IL EXISTE...
TROUY0:  EQU         $
<
<
<        V I S U A L I S A T I O N   D A N S   L E   P L A N   ( O X , O Y )  :
<
<
         CPZ         IVISDZ          < DOIT-ON OUVRIR CETTE FENETRE ???
         JE          TROUZ0          < NON...
<
< BALAYAGE PLAN PAR PLAN :
<
         LRM         X,Y             < OUI :
         WORD        BIT>LOGZ        < (X)=NOMBRE DE PLANS A TESTER,
         WORD        K               < (Y)=NUMERO DU PREMIER PLAN A TESTER.
TROUZ1:  EQU         $
         PSR         X
<
< BALAYAGE DE LA LISTE DES PARTICULES :
<
         LRM         X,L
         WORD        NBUF*LBUFMT/LENTR
                                     < (X)=NOMBRE DE PARTICULES,
         WORD        LISTP           < (L)=ADRESSE DE LA LISTE DES PARTICULES.
TROUZ3:  EQU         $
         LA          PARTIZ-PARTI,L  < (A)=COORDONNEE 'Z' DE LA PARTICULE
                                     <     COURANTE :
         CPR         A,Y             < EST-ELLE DANS LE PLAN COURANT ???
         JNE         TROUZ2          < NON, ON L'IGNORE...
<
< TRAITEMENT D'UNE PARTICULE :
<
         PSR         X,Y,W           < OUI, ON LA TRAITE :
         LA          PARTIR-PARTI,L
         STA         RANG            < RANG DE LA PARTICULE.
         LX          PARTIX-PARTI,L  < (X)=COORDONNEE 'X',
         LY          PARTIY-PARTI,L  < (Y)=COORDONNEE 'Y',
         LA          PARTIZ-PARTI,L  < (A)=COORDONNEE 'Z',
         LR          A,W             < (W)=COORDONNEE 'Z'.
         STA         SAVEZ
         STY         SAVEY
         STX         SAVEX
         LA          PARTIT-PARTI,L
         STA         SAVET           < COORDONNEE 'T',
         LA          PARTIV-PARTI,L
         STA         VITESS          < VITESSE,
         LA          PARTIH-PARTI,L
         STA         REDSH           < RED-SHIFT,
         LA          ARG-PARTI,L
         ANDI        MOCD
         STA         ENERGI          < ENERGIE,
         LA          ARG-PARTI,L
         SLRS        MOCG=K
         STA         DENSIT          < DENSITE.
         BSR         APROJ           < PROJECTION (X,Y,W) --> (X,Y),
         BSR         AMARKZ          < ET MARQUAGE...
         PLR         X,Y,W           < RESTAURATION,
TROUZ2:  EQU         $
         ADRI        LENTR/NOCMO,L   < PASSAGE A L'ENTREE SUIVANTE,
         JDX         TROUZ3          < ET A LA PARTICULE SUIVANTE...
         PLR         X               < SI TOUTE LA LISTE A ETE EXPLOREE,
         ADRI        I,Y             < ON PASSE AU PLAN SUIVANT,
         JDX         TROUZ1          < S'IL EXISTE...
TROUZ0:  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,K             < ON REINITIALISE 'C' ET 'K' AU CAS
                                     < D'UNE RE-ENTREE PAR UN 'ALT-MODE'...
         WORD        COM+DEPBAS      < 'C',
         WORD        STACK-DEPILE    < 'K'.
         BSR         AGOTO
         WORD        DEBUT4          < (A)=ADRESSE D'ITERATION SUR ALT-MODE...
         PAGE
<
<
<        L I S T E   D E S   P A R T I C U L E S  :
<
<
LISTP:   EQU         $               < LA LISTE DES PARTICULES SE TROUVENT
                                     < DANS UNE ZONE MEMOIRE ALLOUEE
                                     < DYNAMIQUEMENT...
         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        RAYONP
         WORD        4               < RAYON DES PARTICULES.
         $EQU        RAYONH
         WORD        2               < RAYON DES PARTICULES VIRTUELLES.
XWOR%1:  VAL         10
XWOR%2:  VAL         W
         $EQU        BASEH
         WORD        XWOR%2          < PREMIERE COULEUR PARTICULE VIRTUELLE.
         $EQU        BASEP
         WORD        XWOR%2+XWOR%1   < PREMIERE COULEUR DES PARTICULES.
         $EQU        NCOLH
         WORD        XWOR%1          < NOMBRE DE COULEURS PARTICULE VIRTUELLE.
         $EQU        NCOLP
         WORD        NIV256-XWOR%1-XWOR%2
                                     < NOMBRE DE COULEURS DES PARTICULES.
         $EQU        MULX
         WORD        W               < MULTIPLICATEUR POUR LA FENETRE (OZ,OX).
         $EQU        DIVX
         WORD        XXXMOY          < DIVISEUR POUR LA FENETRE (OZ,OX).
         $EQU        TRXX
         WORD        BIT>LOGX/XXXMOY < TRANSLATION DE
         $EQU        TRXY
         WORD        BIT>LOGY/XXXMOY <                LA FENETRE (OZ,OX)
         $EQU        MULY
         WORD        W               < MULTIPLICATEUR POUR LA FENETRE (OY,OZ).
         $EQU        DIVY
         WORD        XXXMOY          < DIVISEUR POUR LA FENETRE (OY,OZ).
         $EQU        TRYX
         WORD        K               < TRANSLATION DE
         $EQU        TRYY
         WORD        BIT>LOGY/XXXMOY <                LA FENETRE (OY,OZ)
         $EQU        MULZ
         WORD        W               < MULTIPLICATEUR POUR LA FENETRE (OX,OY).
         $EQU        DIVZ
         WORD        XXXMOY          < DIVISEUR POUR LA FENETRE (OX,OY).
         $EQU        TRZX
         WORD        K               < TRANSLATION DE
         $EQU        TRZY
         WORD        K               <                LA FENETRE (OX,OY)
         $EQU        TXMIN
         WORD        K               < FACE ARRIERE DE LA TRANCHE SUR OX,
         $EQU        TXMAX
         WORD        BIT>LOGX-Z      < FACE AVANT DE LA TRANCHE SUR OX.
         $EQU        TYMIN
         WORD        K               < FACE ARRIERE DE LA TRANCHE SUR OY,
         $EQU        TYMAX
         WORD        BIT>LOGY-Z      < FACE AVANT DE LA TRANCHE SUR OY.
         $EQU        TZMIN
         WORD        K               < FACE ARRIERE DE LA TRANCHE SUR OZ,
         $EQU        TZMAX
         WORD        BIT>LOGZ-Z      < FACE AVANT DE LA TRANCHE SUR OZ.
         $EQU        NHORIZ
         WORD        98              < NOMBRE DE PARTICULES VIRTUELLES "HORIZON"
         $EQU        MAT11
         FLOAT       1.0             < A11,
         $EQU        MAT12
         FLOAT       0.0             < A12,
         $EQU        MAT13
         FLOAT       0.0             < A13.
         $EQU        MAT21
         FLOAT       0.0             < A11,
         $EQU        MAT22
         FLOAT       1.0             < A22,
         $EQU        MAT23
         FLOAT       0.0             < A23.
         $EQU        MAT31
         FLOAT       0.0             < A31,
         $EQU        MAT32
         FLOAT       0.0             < A32,
         $EQU        MAT33
         FLOAT       1.0             < A33.
         $EQU        TRMATX
         WORD        0               < TRANSLATION SUR 'OX' TRANSFORME.
         $EQU        TRMATY
         WORD        0               < TRANSLATION SUR 'OY' TRANSFORME.
         $EQU        TRMATZ
         WORD        0               < TRANSLATION SUR 'OZ' TRANSFORME.
         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.