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#
<
<
<        D E F I N I T I O N   D E S   E S P A C E S  :
<
<
DIMGRA:: VAL         3               < ON TRACE DANS L'ESPACE EUCLIDIEN
                                     < A 3 DIMENSIONS...
DIMGR2:: VAL         DIMGRA-I        < ET UNE DIMENSION DE MOINS...
DIMSPH:: VAL         64              < RAYON MAXIMAL D'UNE SPHERE.
         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
<
<
<        D E F I N I T I O N   D U   B L O C    D E S C R I P T E U R
<                    D ' U N   P O I N T  :
<
<
NPOINT:: VAL         400             < NOMBRE DE POINTS DU NUAGE A GENERER...
         DSEC
DESCPT:  EQU         $
DCS3D:   EQU         $               < DEBUT DE LA LISTE DES COORDONNEES
                                     < TRI-DIMENSIONNELLES DANS L'ESPACE
                                     < EUCLIDIEN DE LA REPRESENTATION GRA-
                                     < PHIQUE :
DFXS:    FLOAT       <NILK<NILK<NILK < COORDONNEE 'X',
DFYS:    FLOAT       <NILK<NILK<NILK < COORDONNEE 'Y',
DFZS:    FLOAT       <NILK<NILK<NILK < COORDONNEE 'Z'.
         IF          $-DCS3D/DFLOT-DIMGRA,,XEIF%,
         IF          ATTENTION : LA LISTE DES COORDONNEES EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
DRAYON:  WORD        NILK            < RAYON DE LA SPHERE.
<
< FIN DU DESCRIPTEUR :
<
LDESCP:: VAL         $-DESCPT        < LONGUEUR DU DESCRIPTEUR...
         PAGE
<
<
<        M E S S A G E S  :
<
<
         TABLE
<
<
<        C O M M O N  :
<
<
         COMMON
COM:     EQU         $
<
< MOT DESTINE AU BLOC FLOTTANT :
<
COMFLO:  WORD        NILK            < MOT "BIDON" DESTINE AU BLOC FLOTTANT
                                     < POUR QU'IL Y FIT SES MERDES...
ATSFLO:  WORD        TSFLO           < POUR TESTER DE TEMPS EN TEMPS 'COMFLO'...
<
< INDICATEURS DE CONTROLE :
<
ANPOIN:  WORD        NPOINT          < NOMBRE COURANT DE POINTS DU NUAGE.
ADIMGR:  WORD        DIMGRA          < DIMENSION DE L'ESPACE GRAPHIQUE DE
                                     < REPRESENTATION.
XNIVP::  VAL         4               < PAS IMPLICITE DE PASSAGE D'UN NIVEAU
                                     < A L'AUTRE.
AXNIVP:  WORD        XNIVP           < PAS COURANT DE PASSAGE D'UN NIVEAU A
                                     < L'AUTRE...
IERASE:  WORD        NEXIST          < EFFACER ('EXIST'), OU NON ('NEXIST')
                                     < L'ECRAN 512...
         IF          XOPT01-EXIST,XOPT1,,XOPT1
IWGPT:   WORD        EXIST           < TRACER ('EXIST') OU PAS ('NEXIST') LE
                                     < NUAGE DE POINTS GENERE.
XOPT1:   VAL         ENDIF
<
< 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#
APWORK:  EQU         APFWOR          < POUR LA COMPATIBILITE AVEC LES OVERLAYS
                                     < DE " +" (CF. 'SIO...').
<
< DONNEES DE CALCUL D'UN
< PRODUIT SCALAIRE :
<
APRSCA:  WORD        PRSCA           < CE SOUS-PROGRAMME CALCULE LE PRODUIT
                                     < SCALAIRE DES 2 VECTEURS ARGUMENTS.
<
< POINT TRI-DIMENSIONNEL COURANT :
<
CS3D:    EQU         $               < DEBUT DES COORDONNEES 3D :
FXS:     FLOAT       <NILK<NILK<NILK < COORDONNEE 'X' 3D,
FYS:     FLOAT       <NILK<NILK<NILK < COORDONNEE 'Y' 3D,
FZS:     FLOAT       <NILK<NILK<NILK < COORDONNEE 'Z' 3D.
LBUF3D:: VAL         $-CS3D          < NOMBRE DE MOTS POUR UN POINT 3D...
         IF          LBUF3D/DFLOT-DIMGRA,,XEIF%,
         IF          ATTENTION : INCOHERENCE DANS LES
         IF          DIMENSIONS DE L'ESPACE DE TRACE GRAPHIQUE !!!
XEIF%:   VAL         ENDIF
<
< DONNEES DE 'MOVE' :
<
APMOV1:  WORD        PMOV1           < DEPLACEMENT DU POINT COURANT (DFXS,DFYS,
                                     < DFZS) VERS (FXS,FYS,FZS).
<
< DONNEES DE LA PROJECTION :
<
FACT:    FLOAT       <NILK<NILK<NILK < FACTEUR D'ECHELLE...
SFACT:   FLOAT       <NILK<NILK<NILK < SAUVEGARDE DE 'FACT' A CAUSE DES
                                     < ALT-MODES INTEMPESTIFS...
PZ:      FLOAT       <NILK<NILK<NILK < POSITION DU POINT DE VUE SUR L'AXE OZ,
                                     < QUI EST DEVANT L'ECRAN...
TRX:     WORD        NILK            < TRANSLATION DU
TRY:     WORD        NILK            <                TRACE (VISU ET RASTER).
CS2D:    EQU         $               < DEBUT DES COORDONNEES 2D :
YS:      WORD        NILK            < COORDONNEES 2D DU
XS:      WORD        NILK            <                   POINT 3D PROJETE...
LBUF2D:: VAL         $-CS2D          < NOMBRE DE MOTS NECESSAIRES POUR UN POINT,
LBUFGR:: VAL         LBUF2D+LBUF2D   < ET POUR UN VECTEUR.
COORDX:: VAL         XS-CS2D         < INDEX DE LA COORDONNEE 'X',
COORDY:: VAL         YS-CS2D         < INDEX DE LA COORDONNEE 'Y'.
APROJ:   WORD        PROJ            < SOUS-PROGRAMME DE PROJECTION 3D --> 2D...
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
< DONNEES DU TRACE GRAPHIQUE :
<
BUFGR:   EQU         $
BUFGR1:  DZS         LBUF2D          < ORIGINE D'UN VECTEUR,
BUFGR2:  DZS         LBUF2D          < ET EXTREMITE.
DEMOG:   BYTE        NVPOUT;FAVOG    < MISE EN GRAPHIQUE DE LA VISU.
DEMCG:   BYTE        NVPOUT;FAVCG    < RETOUR EN ALPHA-NUMERIQUE DE LA VISU.
DEMWG:   BYTE        NVPOUT;FAVWG    < ECRITURE GRAPHIQUE D'UN VECTEUR.
         WORD        BUFGR=FCTA*NOCMO
         WORD        LBUFGR*NOCMO
DEMWD0:  BYTE        NVPOUT;FAVWD    < DEMANDE DE MISE EN MODE NORMAL...
         BYTE        KESC;'60;KEOT
DEMWD1:  BYTE        NVPOUT;FAVWD    < DEMANDE DE MISE EN POINTILLES...
         BYTE        KESC;'61;KEOT
DEMWD2:  BYTE        NVPOUT;FAVWD    < DEMANDE DE MISE EN TIRETES...
         BYTE        KESC;'63;KEOT
<
< DEMANDE D'EFFACEMENT
< DE L'ECRAN DE LA VISU :
<
DEMERA:  BYTE        NVPOUT;FAVER    < DEMANDE D'EFFACEMENT DE L'ECRAN DE LA
                                     < VISU DE DIALOGUE.
XOPT1:   VAL         ENDIF
<
< 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        STORP           < RANGEMENT D'UN POINT POUR 'POINT'...
ALNIVO:  WORD        LNIVO,X         < TABLE DE CORRESPONDANCE DES NIVEAUX POUR
                                     < LE SOUS-PROGRAMME 'POINT'.
<
< ACCES AUX REGISTRES DE CONTROLE :
<
ACTRL1:  WORD        RCTRL1
ACTRL2:  WORD        RCTRL2
<
< DONNEES POUR LE GENERATEUR ALEATOIRE :
<
XTYPX::  VAL         3571            < TYPE "COORDONNEE X",
XTYPY::  VAL         XTYPX+567       < TYPE "COORDONNEE Y",
XTYPZ::  VAL         XTYPY+2391      < TYPE "COORDONNEE Z",
XTYPR::  VAL         XTYPZ+12491     < TYPE "RAYON DE LA SPHERE".
RDN7:    WORD        793             < DECOMPTEUR D'ACCES A LA SECONDE,
RDN8:    WORD        1               < VALEUR COURANTE DE 'RDN7'.
RDN9:    WORD        0               < SECONDE COURANTE...
RDN:     WORD        4397            < NOMBRE ALEATOIRE COURANT.
RDN1:    WORD        5189            < CONSTANTES DE CALCUL
RDN3::   VAL         19              < DES NOMBRE ALEATOIRES...
RDN4:    WORD        7993            < 2EME NOMBRE ALEATOIRE COURANT.
RDN5:    WORD        4021
RDN6::   VAL         23
POINTS:  WORD        16807
KRDN1:   WORD        0
KRDN2:   WORD        0
XKRDN1:: VAL         3               < INCREMENTEUR DE 'KRDN1'.
XKRDN2:: VAL         7               < DECOMPTEUR DE 'KRDN2'.
ASPRDN:  WORD        SPRDN           < GENERATEUR DE NOMBRES ALEATOIRES.
<
< DEFINITION DU NUAGE :
<
AMPOIN:  WORD        NPOINT          < NOMBRE MAXIMAL DE POINTS DU NUAGE.
<
< DEFINITION DES SPHERES,
< APPELEES AUSSI DISQUES :
<
XNIV0::  VAL         4               < PREMIER NIVEAU DU TRACE...
XEPAIS:  VAL         DIMSPH*XXXMOY+Z < DEFINITION DU PLUS GRAND CARRE CIRCONS-
                                     < CRIT A UN DISQUE (SPHERE PROJETEE).
AEPAIS:  WORD        XEPAIS          < DEFINITION DU COTE DU CARRE CIRCONS-
                                     < CRIT AU DISQUE COURANT,
DEPAIS:  WORD        XEPAIS-Z/XXXMOY < DEFINITION DU RAYON DU DISQUE COURANT.
         IF          DIMSPH*XNIVP-XXN255-Z,XEIF%,XEIF%,
         IF          ATTENTION : IL VA Y AVOIR DEBORDEMENT
         IF          DES NIVEAUX DE GRIS REPRESENTATIFS !!!
XEIF%:   VAL         ENDIF
SAVEX:   WORD        NILK            < COORDONNEES DU
SAVEY:   WORD        NILK            <                CENTRE.
ACERCL:  WORD        CERCLE          < REMPLISSAGE D'UN DISQUE...
<
< VARAIBLES DE MANOEUVRE :
<
FWORK1:  FLOAT       <NILK<NILK<NILK
FWORK2:  FLOAT       <NILK<NILK<NILK
         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
         USE         W,DESCPT
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         $
         $EQU        ASTORP
         WORD        POINT           < AFIN DE MARQUER VIA LA LISTE 'LNIVO'...
         $EQU        POINT
<
< TRANSCODAGE DU NIVEAU :
<
         PSR         X               < SAUVEGARDE DE LA COORDONNEE 'X'...
         LR          A,X             < (X)=NIVEAU ARGUMENT,
         LBY         &ALNIVO         < (A)=NIVEAU TRANSCODE,
         PLR         X               < RESTAURE :
                                     < (X)=COORDONNEE 'X'.
<
< MARQUAGE DU POINT :
<
         BSR         APOINT          < MARQUAGE : (X,Y) <-- (A)...
<
< ET RETOUR :
<
         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#
         PAGE
<
<
<        D E P L A C E M E N T   D U   P O I N T   C O U R A N T  :
<
<
<        ARGUMENTS :
<                    (W)=ADRESSE DU DESCRIPTEUR DE POINT COURANT.
<
<
PMOV1:   EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
<
< DEPLACEMENT :
<
         LAD         DCS3D           < (A)=ADRESSE DE L'EMETTEUR (DESCRIPTEUR
                                     <     COURANT),
         LRM         B,X
         WORD        CS3D            < (B)=ADRESSE DU POINT COURANT,
         WORD        LBUF3D          < (X)=NOMBRE DE POINTS A DEPLACER.
         MOVE                        < ET MOVE : DESCRIPTEUR --> (FXS,FYS,FZS).
<
< ET RETOUR :
<
         PLR         A,B,X
         RSR
         PAGE
<
<
<        P R O J E C T I O N   3 D   -->   2 D  :
<
<
<        ARGUMENT :
<                    (FXS,FYS,FZS)=POINT 3D.
<
<
<        RESULTAT :
<                    (XS,YS)=POINT 2D PROJETE SUIVANT 'IPROJ'.
<
<
PROJ:    EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B             < SAUVEGARDES...
         #/FLD#      FZS
<
< PROJECTION PERSPECTIVE SUR 'OX' :
<
         FDV         PZ
         BSR         ATSFLO
         FSB         F1
         BSR         AFNEG
         BSR         ASFWOR          < 1-(FZS/PZ)
         BSR         AFCAZ
         JNE         EOK3            < OK, 1-(FZS/PZ)#0...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
EOK3:    EQU         $
         #/FLD#      FXS
         FDV         FWORK           < FXS/(1-(FZS/PZ))
         BSR         ATSFLO
<
< CALCUL DE 'XS' :
<
         FDV         FACT            < MISE A L'ECHELLE 2D...
         BSR         AROND
         AD          TRX             < TRANSLATION 2D...
         STA         XS
<
< PROJECTION PERSPECTIVE SUR 'OY' :
<
         #/FLD#      FYS
         FDV         FWORK           < FYS/(1-(FZS/PZ))
         BSR         ATSFLO
<
< CALCUL DE 'YS' :
<
         FDV         FACT            < MISE A L'ECHELLE 2D...
         BSR         AROND
         AD          TRY             < TRANSLATION 2D...
         STA         YS
<
< SORTIE :
<
         PLR         A,B             < RESTAURATIONS...
         RSR
XXXPRO:  VAL         YYYFLO          < 'YYYFLO'.
         CALL        #SIP UTILITAIRES#
         PAGE
<
<
<        P R O D U I T   S C A L A I R E   D E   2   V E C T E U R S  :
<
<
<        ARGUMENTS :
<                    (A)=ADRESSE DU PREMIER VECTEUR 'VECT1',
<                    (B)=ADRESSE DU DEUXIEME VECTEUR 'VECT2'.
<
<
<        RESULTAT :
<                    (A,B)=VALEUR DU PRODUIT SCALAIRE...
<
<
<        ATTENTION :
<                    AUX BASES 'L' ET 'W' !!!
<
<
PRSCA:   EQU         $
VECT1X:: MOT         O               < X(VECT1),
VECT1Y:: MOT         VECT1X+DFLOT    < Y(VECT1),
VECT1Z:: MOT         VECT1Y+DFLOT    < Z(VECT1).
VECT2X:: MOT         O               < X(VECT2),
VECT2Y:: MOT         VECT2X+DFLOT    < Y(VECT2),
VECT2Z:: MOT         VECT2Y+DFLOT    < Z(VECT2).
<
< INITIALISATIONS :
<
         PSR         Y,L,W           < SAUVEGARDE DE 2 BASES ; MAIS 'C' NE DOIT
                                     < PAS ETRE UTILISEE A CAUSE DU BLOC FLOT-
                                     < TANT...
         LR          L,Y             < SAUVEGARDE DE 'L' DANS 'Y' POUR POUVOIR
                                     < ACCEDER EVENTUELLEMENT LE 'LOCAL'...
         LR          A,L             < (L)=BASE DU VECTEUR 'VECT1',
         LR          B,W             < (W)=BASE DU VECTEUR 'VECT2'.
<
< CALCUL DU PRODUIT SCALAIRE :
<
         #/FLD#      VECT1X,L        < X(1),
         FMP         VECT2X,W        < X(1)*X(2),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      VECT1Y,L        < Y(1),
         FMP         VECT2Y,W        < Y(1)*Y(2),
         BSR         APFWOR          < X(1)*X(2)+Y(1)*Y(2),
                                     < ET SAVE...
         #/FLD#      VECT1Z,L        < Z(1),
         FMP         VECT2Z,W        < Z(1)*Z(2),
         BSR         APFWOR          < (A,B)=X(1)*X(2)+Y(1)*Y(2)+Z(1)*Z(2),
                                     <       SOIT LE PRODUIT SCALAIRE DES 2
                                     <       VECTEURS 'VECT1' ET 'VECT2'...
                                     <       ET MISE DANS 'FWORK', ON NE SAIT
                                     <       JAMAIS...
<
< ET RETOUR :
<
         PLR         Y,L,W
         RSR
         PAGE
<
<
<        G E N E R A T E U R   A L E A T O I R E  :
<
<
<        ARGUMENT :
<                    (X)=FONCTION DU NUMERO DU POINT COURANT,
<                    (Y)=CODE FONCTION DU TYPE DE COORDONNEE (X/Y/Z).
<
<
<        RESULTAT :
<                    (A,B)=NOMBRE ALEATOIRE FLOTTANT.
<
<
SPRDN:   EQU         $
         LA          RDN             < GENERATION DE NOMBRES ALEATOIRES :
         EOR         POINTS          < ON INTRODUIT UN AUTRE PARAMETRE...
         MP          RDN1
         SCRD        RDN3
         JANE        SPMOYC
         LR          B,A
         JANE        SPMOYC
         LA          KRDN1
         ADRI        XKRDN1,A
         SCRS        XKRDN2
         STA         KRDN1           < PROGRESSION DE 'KRDN1'...
SPMOYC:  EQU         $
         EORR        X,A
         STA         RDN
         DC          RDN8
         LA          RDN9            < (A)=RDN9 A PRIORI...
         JNE         SPRDN1          < ET BIEN OUI... CE N'EST PAS L'HEURE...
         LA          RDN7            < C'EST L'HEURE D'ALLER CHERCHER
         STA         RDN8            < LA SECONDE COURANTE ??!?!??!
         ACTD        XXXTIM          < (A)=HEURE COURANTE EN MULTIPLE DE 2S.
         STA         RDN9            < ET MEMORISATION...
SPRDN1:  EQU         $
         EOR         RDN
         STA         RDN
         LA          RDN4            < CALCUL D'UN 2EME NOMBRE ALEATOIRE...
         MP          RDN5
         EOR         POINTS
         SCRD        RDN6
         JANE        SPMOYF
         LR          B,A
         JANE        SPMOYF
         LA          KRDN2
         ADRI        -XKRDN2,A
         SCRS        XKRDN1
         STA         KRDN2           < PROGRESSION DE 'KRDN2'...
SPMOYF:  EQU         $
         EORR        Y,A
         STA         RDN4
         EOR         RDN
         FLT                         < (A,B)=NOMBRE ALEATOIRE...
         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 (LE RAYON EST XEPAIS-Z/XXXMOY).
<
<
CERCLE:  EQU         $
<
< INITIALISATIONS :
<
         PSR         X,Y
         LR          X,B             < (B)='X' DU CENTRE,
         PSR         Y               < SAUVEGARDE DE 'Y' DU CENTRE.
         LA          DEPAIS
         SBR         A,X             < ON SE PLACE EN HAUT ET A GAUCHE
         SBR         A,Y             < D'UN CARRE CIRCONSCRIT AU DISQUE.
         STX         VECTX1          < INITIALISATION DE L'ABSCISSE INITIALE
                                     < DE CHAQUE LIGNE,
         STY         VECTY1          < INITIALISATION DE LA COORDONNEE 'Y'.
         PLR         Y               < ON A :
                                     < (B,Y)=COORDONNEES DU CENTRE.
<
< BALAYAGE VERTICAL :
<
         LX          DEPAIS          < (X)=NOMBRE DE LIGNES A BALAYER.
         ADRI        Z,X
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          DEPAIS          < (X)=NOMBRE DE POINTS PAR LIGNE.
         ADRI        Z,X
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          DEPAIS          < EST-ON HORS DU DISQUE ??
         JGE         CERCL3          < OUI, ON IGNORE CE POINT...
         SB          DEPAIS          < NON :
         NGR         A,A             < ON CALCULE DONC LE NIVEAU DU
                                     < POINT QUE L'ON VA TRACER :
         MP          AXNIVP
         ADRI        XNIV0,B
         STB         VENIVO          < CE NIVEAU EST PROPORTIONNEL A LA
                                     < DISTANCE AU CENTRE...
         LA          VECTX1
         LB          VECTY1
         PSR         A,B             < SAUVEGARDE DE (X1,Y1) VISU...
         SARS        XXDEDX
         STA         VECTX1          < PASSAGE AUX
         LR          B,A
         SARS        XXDEDY
         STA         VECTY1          <             COORDONNEES 512...
         BSR         VECTA1          < ET ON MARQUE LE POINT (X1,Y1)...
         PLR         A,B
         STA         VECTX1          < RESTAURE LES
         STB         VECTY1          <              COORDONNEES VISU...
CERCL3:  EQU         $
         PLR         B               < RESTAURE L'ABSCISSE DU CENTRE,
         DO          BIT>XXDEDX
         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
         DO          BIT>XXDEDY
         IC          VECTY1          < DE LA NOUVELLE LIGNE,
         JDX         CERCL1          < SI ELLE EXISTE...
<
< ET RETOUR :
<
         PLR         X,Y
         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'.
<
< 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  :
<
<
         #/FLD#      FACT            < SAUVEGARDE DE 'FACT'
         #/FST#      SFACT           <                      A CAUSE DES ALT-
                                     < MODES INTEMPESTIFS...
DEBUT4:  EQU         $
         #/FLD#      SFACT
         #/FST#      FACT            < AU CAS OU UN MALHEUREUX ALT-MODE...
<
< 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'...).
<
< VALIDATION DE 'ANPOIN' :
<
DEBUT9:  EQU         $
         LA          ANPOIN          < ACCES A 'ANPOIN' :
         JALE        DEBUTA          < ERREUR...
         CP          AMPOIN          < VALIDATION :
         JLE         DEBUTB          < OK...
DEBUTA:  EQU         $
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
         JMP         DEBUT9          < ET ON RE-TESTE !!!
DEBUTB:  EQU         $
<
< VALIDATION DE 'AEPAIS' :
<
DEBUTC:  EQU         $
         LA          AEPAIS          < (A)=EPAISSEUR DEMANDEE POUR LES
                                     <     RECTANGLES,
         JALE        DEBUTE          < ERREUR...
         CPI         XEPAIS
         JG          DEBUTE          < ERREUR...
         ADRI        -Z,A
         SLRS        XXXMOY=K        < CALCUL DE XEPAIS-Z/XXXMOY :
         JALE        DEBUTE          < ERREUR...
         JNC         DEBUTD          < OK, LA DIVISION TOMBE JUSTE...
DEBUTE:  EQU         $
         QUIT        XXQUIT          < 'AEPAIS' DOIT ETRE IMPAIR ET DE VALEUR
                                     < VALEUR CONVENABLE...
         JMP         DEBUTC          < ET ON RE-TESTE...
DEBUTD:  EQU         $
         STA         DEPAIS          < ET MEMORISATION DE XEPAIS-Z/XXXMOY...
<
<
<        G E N E R A T I O N   D U   N U A G E   D E   P O I N T S  :
<
<
         LX          ANPOIN          < (X)=NOMBRE DE POINTS A GENERER,
         LRM         W
         WORD        LPOINT          < (W)=ADRESSE DE BASE DE LA LISTE DES
                                     <     DESCIPTEURS DE POINTS.
GEN1:    EQU         $
<
< GENERATION DES COORDONNEES :
<
         LRM         Y
         WORD        XTYPX           < (Y)=TYPE "COORDONNEE X".
         BSR         ASPRDN          < (A,B)=NOMBRE ALEATOIRE,
         #/FST#      DFXS            < CE QUI DONNE 'X' ALEATOIRE.
         LRM         Y
         WORD        XTYPY           < (Y)=TYPE "COORDONNEE Y",
         BSR         ASPRDN          < (A,B)=NOMBRE ALEATOIRE,
         #/FST#      DFYS            < CE QUI DONNE 'Y' ALEATOIRE.
         #/FLD#      F0
         #/FST#      DFZS            < DFZS=0 A PRIORI...
         LA          ADIMGR
         CPI         DIMGRA          < COMBIEN DE DIMENSIONS POUR LA VISUALI-
                                     < SATION ???
         JNE         GEN5            < 2...
         LRM         Y               < 3...
         WORD        XTYPZ           < (Y)=TYPE "COORDONNEE Z",
         BSR         ASPRDN          < (A,B)=NOMBRE ALEATOIRE,
         #/FST#      DFZS            < CE QUI DONNE 'Z' ALEATOIRE.
GEN5:    EQU         $
<
< GENERATION DU RAYON :
<
         LRM         Y
         WORD        XTYPR           < (Y)=TYPE "RAYON".
GEN4:    EQU         $
         BSR         ASPRDN          < (A,B)=NOMBRE ALEATOIRE,
         BSR         AFABS           < SEULE LA VALEUR ABSOLUE EST INTERESSANTE,
         BSR         AFIX            < (A)=NOMBRE ENTIER POSITIF ALEATOIRE,
XWOR%1:  VAL         DIMSPH=K
         IF          BIT>XWOR%1-DIMSPH,,XEIF%,
         IF          ATTENTION : 'DIMSPH' DOIT ETRE UNE PUISSANCE DE 2 !!!
XEIF%:   VAL         ENDIF
         ANDI        DIMSPH-N        < CALCUL MODULO 'DIMSPH' DU RAYON...
         JAE         GEN4            < NUL, REFUSE...
         STA         DRAYON          < OK, MEMORISATION DU RAYON DE LA SPHERE
                                     < CENTREE SUR LE POINT COURANT...
<
< PASSAGE AU DESCRIPTEUR SUIVANT :
<
         ADRI        LDESCP,W        < PASSAGE AU DESCRIPTEUR SUIVANT,
         JDX         GEN1            < S'IL EXISTE...
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
<
<        T R A C E   D U   N U A G E   D E   P O I N T S  :
<
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IWGPT           < DOIT-ON TRACER LE NUAGE ???
         JE          GEN2            < NON...
         #/FLD#      FACT
         PSR         A,B             < SAUVEGARDE DE 'FACT'...
         FDV         F05
         #/FST#      FACT            < AFIN DE VOIR L'ENSEMBLE DU DESSIN...
         LAD         DEMERA          < OUI :
         SVC                         < ON EFFACE L'ECRAN.
         LX          ANPOIN          < (X)=NOMBRE DE POINTS A TRACER,
         LRM         W
         WORD        LPOINT          < (W)=ADRESSE DE LA LISTE DES DESCRIPTEURS.
GEN3:    EQU         $
         PSR         X
         BSR         APMOV1          < DEPLACEMENT DU DESCRIPTEUR COURANT (W)
                                     < VERS LE POINT COURANT (FXS,FYS,FZS),
         BSR         APROJ           < ET PROJECTION 2D --> 3D.
         LRM         A,B,X
         WORD        CS2D            < (A)=ADRESSE DU POINT 2D COURANT,
         WORD        BUFGR1          < (B)=ADRESSE DU BUFFER ORIGINE GRAPHIQUE,
         WORD        LBUF2D          < (X)=NOMBRE DE MOTS A DEPLACER,
         MOVE                        < ET MISE EN PLACE DE L'ORIGINE.
         LRM         B,X
         WORD        BUFGR2          < (B)=ADRESSE DU BUFFER EXTREMITE GRAPHIQUE
         WORD        LBUF2D          < (X)=NOMBRE DE MOTS A DEPLACER,
         MOVE                        < ET MISE EN PLACE DE L'EXTREMITE.
         LAD         DEMOG
         SVC                         < ET ON FAIT UNE MISE EN GRAPHIQUE, PERMET-
                                     < TANT PAR LA MEME OCCASION DE NE PAS
                                     < CHAINER LES POINTS ENTRE-EUX...
         LAD         DEMWG
         SVC                         < TRACE DU POINT COURANT...
         PLR         X               < RESTAURE LE DECOMPTE,
         ADRI        LDESCP,W        < PASSAGE AU DESCRIPTEUR SUIVANT,
         JDX         GEN3            < S'IL EXISTE...
         LAD         DEMCG
         SVC                         < ET RETOUR EN ALPHA-NUMERIQUE...
         PLR         A,B
         #/FST#      FACT            < RESTAURATION DE 'FACT'...
GEN2:    EQU         $
XOPT1:   VAL         ENDIF
<
<
<        G E N E R A T I O N   D E   L ' I M A G E  :
<
<
GEN69:   EQU         $
         QUIT        XXQUIT          < P O U R   R E F L E C H I R ...
         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'.
<
< INITIALISATION DES
< CONDITIONS DE TRACE :
<
GEN69N:  EQU         $
         LAI         VECTSB
         STA         VECTRS          < MISE EN MODE 'SBT', SOIT 'OU-FLOU',
         LRM         A
         WORD        XXN255+Z=K+I
         STA         VEDECA          < AFIN D'ECRASER LE NIVEAU ANTERIEUR...
<
< VISUALISATION DES POINTS DU NUAGE :
<
         LX          ANPOIN          < (X)=NOMBRE DE POINTS DANS LE NUAGE,
         LRM         W
         WORD        LPOINT          < (W)=ADRESSE DE LA BASE DES DEXCRIPTEURS.
GEN70:   EQU         $
         PSR         X               < SAUVEGARDE DU NOMBRE DE POINTS...
         BSR         APMOV1          < DEPLACEMENT DE P(I) --> (FXS,FYS),
         BSR         APROJ           < QUE L'ON PROJETTE,
         LRM         A,B,X
         WORD        CS2D            < (A)=ADRESSE DU POINT 2D COURANT,
         WORD        BUFGR1          < (B)=ADRESSE DU BUFFER ORIGINE GRAPHIQUE,
         WORD        LBUF2D          < (X)=NOMBRE DE MOTS A DEPLACER,
         MOVE                        < ET MISE EN PLACE DE L'ORIGINE P(I)...
         LA          DRAYON          < (A)=RAYON DE LA SPHERE,
         STA         DEPAIS          < CE QUI DONNE LE RAYON DU DISQUE,
         SLLS        XXXMOY=K
         ADRI        Z,A
         STA         AEPAIS          < ET LE COTE DU CARRE CIRCONSCRIT...
         LX          BUFGR1+COORDX
         LY          BUFGR1+COORDY
         BSR         ACERCL          < VISUALISATION DU POINT COURANT.
         PLR         X               < RESTAURE :
                                     < (X)=NOMBRE DE POINTS DU NUAGE...
         ADRI        LDESCP,W        < PASSAGE AU POINT P(I) SUIVANT,
         JDX         GEN70           < S'IL EXISTE...
<
<
<        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   D E S C R I P T E U R S   D E   P O I N T S  :
<
<
LPOINT:  EQU         $
         IF          LPOINT=FCTA,,,XEIF%
         IF          ATTENTION : A CAUSE DE 'VOISEX', TOUTES LES
         IF          ADRESSES DE 'LPOINT' DOIVENT ETRE STRICTEMENT
         IF          POSITIVES !!!
XEIF%:   VAL         ENDIF
         DO          NPOINT
         DZS         LDESCP
         IF          $=FCTA-K,,,XEIF%
         IF          ATTENTION : A CAUSE DE 'VOISEX',
         IF          TOUTES LES ADRESSES DE 'LPOINT'
         IF          DOIVENT ETRE STRICTEMENT POSITIVES !!!
XEIF%:   VAL         ENDIF
         PAGE
<
<
<        U P D A T E S  :
<
<
         $EQU        PZ
         FLOAT       1000            < POINT DE VUE DE L'OBSERVATEUR.
         $EQU        FACT
         FLOAT       70              < FACTEUR D'ECHELLE DE LA PROJECTION.
         $EQU        TRX
         WORD        SIZXVI/XXXMOY   < X-TRANSLATION GRAPHIQUE.
         $EQU        TRY
         WORD        SIZYVI/XXXMOY   < Y-TRANSLATION GRAPHIQUE.
         $EQU        ADIMGR
         WORD        DIMGR2          < DIMENSION DE L'ESPACE GRAPHIQUE.
         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.