NMP:     VAL         " +"
NMPROC:: VAL         NMP             < ATTENTION " +" N'A PAS DE VERSION NON
                                     < INTERPRETATIVE...
         IDP         " + - VERSION DE ' =' SPACIEUSE..."
         IDP         "RELEASE 03/05/1983"
         EOT         #SIP OPTIONS +#
         EOT         #SIP DEFINITION CMS5#
         EOT         #SIP DEF PROCESSEUR#
         PROG
         WORD        TW              < POINT D'ENTREE...
         WORD        0
PTW:     EQU         $               < DOIT VALOIR '12...
         LRP         L
         BR          -2,L            < ENTREE DANS LE PROCESSEUR...
         EOT         #SIP DEFINITION ITEM#
ITEM2:   EQU         ZERO+PILE-LTNI-LTNI
ITEM1:   EQU         ITEM2+LTNI
         EOT         #SIP IMAGE 256#
NBITMO:  VAL         16              < NOMBRE DE BITS PAR MOT.
NOCMO:   VAL         2               < NOMBRE D'OCTETS PAR MOT...
NBITOC:  VAL         NBITMO/NOCMO    < NOMBRE DE BITS PAR OCTET...
NBRHEX:  VAL         4               < NOMBRE DE CHIFFRES HEXAS PAR MOT.
BIT:     VAL         1
NMOTL:   VAL         CNMPL           < NOMBRE DE MOTS PAR LIGNE.
NLIG:    VAL         LIMAG/NMOTL     < NOMBRE DE LIGNES PAR TRAME.
NLIGM1:  VAL         NLIG-1          < ORDONNEE MAXIMALE.
XWOR%1:  VAL         NLIGM1+1
XWOR%2:  VAL         XWOR%1=0
         IF          BIT>XWOR%2-XWOR%1,,XWOR%,
         IF          ATTENTION : 'NLIGM1' DOIT ETRE UN MASQUE !!!
XWOR%:   VAL         0
NPOLM1:  VAL         NMOTL*NBITMO-1  < ABSCISSE MAXIMALE.
XWOR%1:  VAL         NPOLM1+1
XWOR%2:  VAL         XWOR%1=0
         IF          BIT>XWOR%2-XWOR%1,,XWOR%,
         IF          ATTENTION : 'NPOLM1' DOIT ETRE UN MASQUE !!!
XWOR%:   VAL         0
NCOOL:   VAL         3               < NOMBRE DE COULEURS DE BASE.
NIVMAX:  VAL         BIT>NCOOL-BIT   < NIVEAU MAX RECONNU.
MFFFF:   VAL         'FFFF           < MASQUE DU MOT.
EOT:     VAL         '04             < CARACTERE 'EOT'.
SGNDLN:  VAL         3               < FONCTION DE DELETE SGN,
SGNSTN:  VAL         4               < FONCTION DE STORE SGN,
SGNLON:  VAL         5               < FONCTION DE LOAD SOUS ACN SGN,
SGNLNS:  VAL         6               < FONCTION DE LOAD SOUS :SYS SGN.
         PAGE
<
<
<        D E F I N I T I O N   D E   L ' I M A G E  :
<
<
NOM:     EQU         ZERO+PILE+5-LNOM
<
< IMAGE VISUALISEE :
<
IMAG:    EQU         NOM+LNOM
IMAGE:   EQU         IMAG
IMAGR:   EQU         IMAGE+0
IMAGV:   EQU         IMAGR+LIMAG
IMAGB:   EQU         IMAGV+LIMAG
TV1::    VAL         0               < ADRESSE DE LA MEMOIRE DE VISUALISATION
                                     < EN 'CDAI'.
         IF          TV1-0,,XWOR%,
         IF          TV1 DOIT ETRE NUL, SINON, DE NOMBREUSES
         IF          SEQUENCES DE CODE SONT MAUVAISES !!!
XWOR%:   VAL         0
<
< MASQUE DE L'IMAGE :
<
AMASK::  VAL         NCOOL*LIMAG+TV1 < ADRESSE DU MASQUE DANS LA 'CDA'.
<
< Z-BUFFER RESIDENT :
<
IZBUF::  VAL         AMASK+LIMAG     < DEBUT DU BLOC COURANT DU Z-BUFFER DANS
                                     < LA 'CDA' QUAND ON EST EN '!CDAI'...
LIZBUF:: VAL         '1000/2         < LE Z-BUFFER EST DECOUPE EN BLOCS DE
                                     < 2K MOTS,
LEZBUF:: VAL         2               < MAIS, OH SURPRISES, LE Z-BUFFER DE " +"
                                     < PEUT CONTENIR EN OPTION DES ENTREES DE
                                     < 2 MOTS :
ZBUF0::  MOT         0               < PREMIER MOT (OBLIGATOIRE D'UNE ENTREE),
ZBUF1::  MOT         ZBUF0+1         < DEUXIEME MOT (FACULTATIF ; NE MANGE PAS
                                     < DE PLACE LORSQU'IL EST ABSENT...).
NZBUF::  VAL         16*2*LEZBUF     < CE QUI FAIT DONC 32 BLOCS (OU 64...).
IZBUF1:: VAL         IZBUF+LIZBUF    < ET EN RESIDENT ON A 2 BUFFERS 'IZBUF'
                                     < ET 'IZBUF1'...
XWOR%1:  VAL         1024
XWOR%2:  VAL         LIZBUF/XWOR%1*NZBUF
XWOR%3:  VAL         LIMAG/XWOR%1*NBITMO*LEZBUF
         IF          XWOR%3-XWOR%2,,XWOR%,
         IF          ATTENTION : LIZBUF ET NZBUF INCOMPATIBLES !!!
XWOR%:   VAL         0
LSDKU::  VAL         128
NSDKU::  VAL         LIZBUF/LSDKU    < INCREMENT DE PASSAGE D'UN BLOC DU
                                     < Z-BUFFER AU SUIVANT SUR 'DKU'...
<
< IMAGE 'TV2' :
<
TV2::    VAL         IZBUF1+LIZBUF   < ADRESSE DE LA DEUXIEME IMAGE SCRATCH
                                     < UTILISEE EN PARTICULIER POUR LA MODU-
                                     < LATION D'AMPLITUDE SUR LA NORMALE.
<
< POUR SAUVEGARDER L'ITEM1 EN ENTIER :
<
SAVIT1:: VAL         NCOOL*LIMAG+TV2 < ZONE DE SAUVEGARDE DE L'ITEM1 EN
                                     < ENTIER...
LNOMP:   VAL         LNOM-1          < LONGUEUR UTILE DU NOM (A CAUSE DE
                                     < L'EOT A PRIORI...
         PAGE
         IF          XOPT05-XXX512,XOPT5,,XOPT5
ENDIF::  VAL         0               < A CAUSE DU #SIP IMAGE 512# QUI SUIT...
XXXIMA:  VAL         -1              < POUR NE DEFINIR QUE 'XXIMA'...
         EOT         #SIP IMAGE 512#
XXXIMA:  VAL         XXIMA1
         EOT         #SIP IMAGE 512#
YYYIMA:: VAL         YYYIM1
XOPT5:   VAL         0
         PROG
         PAGE
<
<
<        M E S S A G E S  :
<
<
MMCDA:   BYTE        5;'6D
MCDAI:   ASCI        "!CDA"
         IF          XOPT05-XXX256,XOPT5,,XOPT5
CDA256:: VAL         "I"
         BYTE        CDA256;EOT
XOPT5:   VAL         0
         IF          XOPT05-XXX512,XOPT5,,XOPT5
CDA512:: VAL         "J"
BMCDAI:  BYTE        CDA512;"+";PAGER='FA00(MOCD;EOT
XOPT5:   VAL         0
MCDA:    ASCI        "!CDA"
         BYTE        EOT;0
REP:     DZS         NBRHEX/NOCMO    < BUFFER DES REPONSES.
MERR:    BYTE        1;"?"
<
< PILE DU PROCESSEUR :
<
LSTACK:: VAL         44+8            < LONGUEUR DE LA PILE DE TRAVAIL.
STACK:   EQU         $
         DZS         LSTACK
         PAGE
<
<
<        L O C A L  :
<
<
         LOCAL
LOC:     EQU         $
<
< CONSTANTES :
<
NSD:     ASCI        "SD"            < NOM DE L'OVERLAY D'APPEL.
TCALL:   WORD        "GE";"EI"       < NOM DES OVERLAYS DE RETOUR SI ALT-MODE.
NCALL:   WORD        TCALL,X
NPCALL:  WORD        0               < NOM DU PROCESSEUR DE RETOUR SI ALT-MODE.
SAVEK:   WORD        0               < SAUVEGARDE DU REGISTRE 'K'.
KIN:     WORD        -1              < COMPTEUR DES ENTREES...
KIN2:    WORD        -1              < INDICATEUR DE SAUVEGARDE DE L'ITEM1
                                     < FAITE (SI =0).
NMOTS:   WORD        LTNI            < POUR NE RAZER QUE L'ITEM2...
IMASKO:  WORD        0               < 0 : MASK OFF,
                                     < 1 : MASK ON...
ICOLLI:  WORD        0               < INDICATEUR DE COLLISION :
                                     < =0 : FAUSSE COLLISION,
                                     < #0 : VRAIE COLLISION (SUR LES 3 COORDON-
                                     <      NEES).
<
< DONNEES DE SIMULATION DES ENTREES :
<
IEG:     WORD        0               < INDEX COURANT DE L'ITEM1.
NCP:     WORD        NBCAR*NBLIG-LNOM  < LONGUEUR MAX D'UN ITEM,
                                       < ON RETRANCHE LNOM, CAR LE NOM
                                       < D'UNE IMAGE DOIT ETRE IMPERATIVEMENT
                                       < DEVANT L'IMAGE...
AI1:     WORD        ITEM1+LTN,X     < RELAI D'ACCES A L'ITEM1.
ABUFC:   WORD        0               < RELAI D'ACCES AU BUFFER COURANT.
<
< RELAIS DE TABLES, D'IMAGES...
<
ACOM:    WORD        KOM,X           < TABLE DES COMMANDES RECONNUES.
AMERR:   EQU         MERR            < MESSAGE D'ERREUR.
AREP:    WORD        REP             < ACCES AU BUFFER DE REPONSE...
AREPX:   WORD        REP,X           < DE MEME EN INDEXE...
AMCDAI:  EQU         MCDAI           < !CDAI.
AMCDA:   EQU         MCDA            < !CDA.
AMMCDA:  EQU         MMCDA           < !CDA.
AITEM2:  WORD        ITEM2-1,X       < POUR RAZER LES ITEMS 1 ET 2.
AEOT:    WORD        NOM+LNOMP       < POUR FORCER UN EOT...
         IF          XOPT08-XXXOUI,XOPT8,,XOPT8
ANMAIL:  WORD        NMAIL1,X        < RELAI VERS LE NOM HEXA-DECIMAL D'UN
                                     < NOEUD DU MAILLAGE.
XOPT8:   VAL         0
<
< RELAIS DE SOUS-PROGRAMMES :
<
AOVL:    WORD        OVL             < CHARGEMENT DES OVERLAYS...
ARITEM:  WORD        RITEM           < ENVOI DE "!CDAI", ET RESTAURATION DE
                                     < L'ITEM1...
AENTER:  WORD        ENTER           < ENTREE DE QUELQUE CHOSE SUR LA VISU...
AIN:     WORD        IN              < ENTREE D'UN CARACTERE,
AIHEX:   WORD        IHEX            < ENTREE DE 4 CHIFFRES HEXA-DECIMAUX,
AIFLOT:  WORD        IFLOT           < ENTREE D'UNE CONSTANTE FLOTTANTE.
AIFLOS:  WORD        IFLOS           < ENTREE D'UNE CONSTANTE FLOTTANTE
                                     < D'ADRESSE DONNEE.
AHEX:    WORD        HEX             < CONVERSION DE 4 CHIFFRES HEXAS EN BINAIRE
ACCI:    WORD        CCI             < ACCES AU CCI.
AGOSGN:  WORD        GOSGN           < POUR ACCEDER AU SGN...
ASPTR:   WORD        SPTR            < (XS,YS) <-- TRANS(XR,YR).
ASPTR1:  WORD        SPTR1           < SORTIE DU S/P DE TRANS...
APTRAN:  WORD        PTRANS          < COEFFICIENT MATRICE 3*3.
AMATR:   WORD        MATR            < APPLICATION DE LA TRANSFORMATION
                                     < MATRICIELLE EVENTUELLEMENT.
APROJ:   WORD        PROJ            < PROJECTION 3D --> 2D.
ASPOP:   WORD        SPOP            < APPLICATION DE LA TRANSFORMATION...
ALOOP:   WORD        LOOP            < BOUCLE DE L'INTERROGATION.
AERROR:  WORD        ERROR           < BRANCHEMENT EN ERREUR...
AQUAD4:  WORD        QUAD4           < RELAI VERS QUAD4.
AQUAD3:  WORD        QUAD3           < RELAI VERS QUAD3.
ASPVU:   WORD        SPVU            < CALCUL DE 'TU',
ASPVV:   WORD        SPVV            < CALCUL DE 'TV',
ASPVW:   WORD        SPVW            < CALCUL DE 'TW'.
ASTXS:   WORD        STXS            < STORE 'FXS',
ASTYS:   WORD        STYS            < 'FYS',
ASTZS:   WORD        STZS            < ET 'FZS'.
AINTER:  WORD        PINTER          < SOUS-PROGRAMME D'INTERPOLATION SUR
                                     < UN CARRE...
APIN:    EQU         AIN
APIHEX:  EQU         AIHEX
AALTM:   WORD        ALTM            < TRAITEMENT DES RETOURS BRUTAUX...
ANECL:   WORD        NECL            < RELAI...
PTNVU:   WORD        SPTR1X          < RELAI...
<
< DEMANDES A CMS5 :
<
DEMIN:   WORD        '0101           < ENTREE D'UN CARACTERE DE REPONSE.
         WORD        REP-ZERO*NOCMO
         WORD        1
DEMHEX:  WORD        '0101           < ENTREE D'UN NOMBRE HEXA-DECIMAL.
         WORD        REP-ZERO*NOCMO
         WORD        NBRHEX
DEMOUT:  WORD        '0202           < ECRITURE D'UN MESSAGE SUR LA VISU.
         WORD        MERR-ZERO*NOCMO+1
         WORD        1               < MESSAGE D'ERREUR POUR " P"...
DEMMEM:  WORD        4               < DEMANDE DE 16 K MOTS...
RELMEM:  WORD        4               < RETOUR A 4K MOTS...
         WORD        '8000
         WORD        '2000
NOMBB::  VAL         ","             < NOM DE LA BRANCHE D'OVERLAY.
NOMOV1:: VAL         " ">NBITOC?NOMBB
DEMCC:   WORD        2               < ACCES AU CCI INTERPRETATIF.
         WORD        0               < ADRESSE DE LA CARTE.
         WORD        80
NOMIN:   WORD        '0101           < ENTREE DU NOM D'UNE IMAGE.
         WORD        NOM-ZERO*NOCMO
         WORD        LNOMP*NOCMO
SGN:     WORD        '0002           < POUR LES ACCES AU SGN.
         WORD        NOM-ZERO*NOCMO
         WORD        LIMAG*NCOOL+LNOM*NOCMO
         WORD        -1              < LA VALEUR SUIT LE NOM...
TVDKU:   VAL         '8A01           < ACCES A 'DKU' POUR LA 'TV'.
DEMTV0:  WORD        TVDKU           < DEMANDE D'ENVOI D'UNE IMAGE DE 'TV'
                                     < EN MODE ENTRELACE.
         WORD        IMAGE-ZERO*NOCMO
         WORD        LIMAG*NOCMO*NCOOL
         WORD        0
DEMOVL:  BYTE        '80?SGNLNS;'02  < CHARGEMENT PARTIEL DE L'OVERLAY.
         WORD        OVLTZ2
         WORD        LOVL2
         WORD        -1
DEMOVG:  BYTE        '80?SGNLNS;'02  < CHARGEMENT GLOBAL DE L'OVERLAY.
         WORD        OVLTZ2
         WORD        LOVLG
         WORD        -1
DEMLOD:  BYTE        '80?SGNLNS;'02  < DEMANDE DE CHARGEMENT DE "GE".
         WORD        BRANCH-ZERO*NOCMO
         WORD        ZERO-BRANCH+PILE-LTNI-LTNI*NOCMO
         WORD        -1
         IF          XOPT08-XXXOUI,XOPT8,,XOPT8
DEMDMA:  BYTE        '80?SGNDLN;'02  < DEMANDE DE DELETE D'UN NOEUD ANTERIEUR.
         WORD        NMAIL2
         WORD        LNMAIL
         WORD        -1
DEMSMA:  BYTE        '80?SGNSTN;'02  < DEMANDE DE CREATION D'UN NOEUD.
         WORD        NMAIL2
         WORD        LMAIL
         WORD        -1
XOPT8:   VAL         0
<
< DONNEES POUR DETERMINER LA TRANSFORMEE
< DU CARRE DE BASE DU MAILLAGE DE L'IMAGE
< DE BASE :
<
IINTER:  WORD        0               < INDICATEUR D'INTERPOLATION DANS LES
                                     < CARRES DE BASE :
                                     < =0 : OUI, ON INTERPOLE ==> SURFACE PRES-
                                     <      QUE SANS TROUS...
                                     < =1 : NON, MODE RAPIDE ; CHAQUE POINT
                                     <      DONNE NAISSANCE A UN POINT SUR LA
                                     <      SURFACE QUI EST ALORS FAITE QUE DE
                                     <      TROUS, MAIS CELA VA TELLEMENT PLUS
                                     <      VITE...
SCALD:   FLOAT       1               < FACTEUR D'ECHELLE DE LA PLUS GRANDE
                                     < DIAGONALE DE LA TRANSFORMEE DU CARRE
                                     < DE BASE (1 EN GENERAL, SAUF CAS VICIEUX
                                     < DES IMAGES FRACTALES...).
FPASU:   FLOAT       0               < PAS DU MAILLAGE INTERIEUR AU CARRE
                                     < LE LONG DE 'U',
FPASV:   FLOAT       0               < ET LE LONG DE 'V' ; ILS SONT DIFFERENTS
                                     < A CAUSE DE 'FDELX' ET 'FDELY' DE SOUS-
                                     < ECHANTILLONNAGE...
                                     < UNITE DE L'IMAGE DE BASE.
IDERIV:  WORD        1               < 1 : LES CONSTANTES DE DERIVATION 'FHU/V'
                                     <     ET 'F2H' SONT FIXES ARBITRAIREMENT
                                     <     A L'INITIALISATION OU PAR LA COMMAN-
                                     <     DE "X XXXX YYYY", TEL QUE LA FRACTION
                                     <     XXXX/YYYY>0...
                                     < 0 : DANS LE CAS, OU L'ON DONNE LA
                                     <     FRACTION XXXX/YYYY<0, ALORS LA CONS-
                                     <     TANTE DE DERIVATION 'FHU/V' EST RECAL
                                     <     CULEE POUR CHAQUE CARRE DE BASE TELLE
                                     <     QUE : FH=FKH*FPAS (TRES UTILE POUR LE
                                     <     FONCTIONS FRACTALES).
FKH:     FLOAT       0               < MULTIPLICATEUR DE 'FPAS' POUR DONNER
                                     < 'FH' LORSQUE IDERIV=0 ; FKH=-XXXX/YYYY.
MINU:    FLOAT       0               < MIN(U),
MAXU:    FLOAT       0               < MAX(U).
MINV:    FLOAT       0               < MIN(V),
MAXV:    FLOAT       0               < MAX(V).
INFINI:  FLOAT       100000
IALIAS:  WORD        0               < 0 : PAS D'INTERPOLATION SUR LES NIVEAUX,
                                     < 1 : INTERPOLATION SUR LES NIVEAUX DE
                                     <     GRIS A L'INTERIEUR DE LA TRANSFORMEE
                                     <     DE CHAQUE CARRE ELEMENTAIRE EN
                                     <     AUTORISANT TOUS LES NIVEAUX DU
                                     <     NOIR AU BLANC,
                                     < -1: DE MEME, EN COMPRIMANT LES NIVEAUX
                                     <     ENTRE LE ROUGE ET LE BLANC...
<
< DEFINITION D'UNE LISTE DE
< 4 VALEURS A INTERPOLER :
<
NFLOT::  VAL         4               < NOMBRE DE VALEURS...
LFLOT::  VAL         2               < LONGUEUR D'UN NOMBRE FLOTTANT.
FLOT1::  MOT         0               < PREMIER ELEMENT,
FLOT2::  MOT         FLOT1+LFLOT     < DEUXIEME ELEMENT,
FLOT3::  MOT         FLOT2+LFLOT     < TROISIEME ELEMENT,
FLOT4::  MOT         FLOT3+LFLOT     < QUATRIEME ELEMENT.
<
< LISTE DES NIVEAUX :
<
FNIV:    EQU         $
         DO          NFLOT
         FLOAT       0
FNIV1:   EQU         FNIV+FLOT1
FNIV2:   EQU         FNIV+FLOT2
FNIV3:   EQU         FNIV+FLOT3
FNIV4:   EQU         FNIV+FLOT4
<
< LISTE DES VALEURS 'VECU' :
<
LVECU:   EQU         $
         DO          NFLOT
         FLOAT       0
VECU1:   EQU         LVECU+FLOT1
VECU2:   EQU         LVECU+FLOT2
VECU3:   EQU         LVECU+FLOT3
VECU4:   EQU         LVECU+FLOT4
<
< LISTE DES VALEURS 'VECV' :
<
LVECV:   EQU         $
         DO          NFLOT
         FLOAT       0
VECV1:   EQU         LVECV+FLOT1
VECV2:   EQU         LVECV+FLOT2
VECV3:   EQU         LVECV+FLOT3
VECV4:   EQU         LVECV+FLOT4
<
< LISTE DES VALEURS 'VECW' :
<
LVECW:   EQU         $
         DO          NFLOT
         FLOAT       0
VECW1:   EQU         LVECW+FLOT1
VECW2:   EQU         LVECW+FLOT2
VECW3:   EQU         LVECW+FLOT3
VECW4:   EQU         LVECW+FLOT4
<
< DERIVEES DE LA SURFACE :
<
DXDU:    FLOAT       0               < DX/DU,
DXDV:    FLOAT       0               < DX/DV,
DYDU:    FLOAT       0               < DY/DU,
DYDV:    FLOAT       0               < DY/DV,
DZDU:    FLOAT       0               < DZ/DU,
DZDV:    FLOAT       0               < DZ/DV.
         IF          XOPT05-XXX256,XOPT5,,XOPT5
<
< DONNEES D'ATTRIBUTION DES NIVEAUX :
<
FCDO::   VAL         'F800           < FONCTION COMPTE DES 'DO'.
XWOR%1:  VAL         NIVMAX+1
AATNIV:  WORD        ATNIV,X         < RELAI D'ACCES A LA TABLE D'ATTRIBUTION
                                     < DES NIVEAUX DE GRIS EN FONCTION DES
                                     < NIVEAUX CALCULES.
ATNIV:   EQU         $
         DO          XWOR%1/NOCMO
         BYTE    0=FCDO)MFFFF+1-1*NOCMO+XWOR%1;0=FCDO)MFFFF+1-1*NOCMO+XWOR%1+1
<
< GESTION DE LA TRANSPARENCE :
<
LTRANS:  WORD        0               < LISTE DE BITS : LE BIT DE RANG X S'IL
                                     < EST A 1 INDIQUE QUE LE NIVEAU DE GRIS
                                     < EGAL A X EST TRANSPARENT.
NM1:     WORD        0               < NIVEAU D'UN POINT ANTERIEUR,
NM2:     WORD        0               < NIVEAU MODULE D'UN POINT POSTERIEUR.
XOPT5:   VAL         0
         IF          XOPT05-XXX512,XOPT5,,XOPT5
<
< NIVEAU D'UN POINT :
<
NM2:     WORD        0               < NIVEAU DU POINT A MARQUER.
XOPT5:   VAL         0
<
< DONNEES DE PROJECTION :
<
SINT:    FLOAT       -0.5
COST:    FLOAT       0.86602
IPROJ:   WORD        0               < 0 : PROJECTION PAR COST,SINT ;
                                     < 1 : PROJECTION PERSPECTIVE.
PZ:      FLOAT       0
<
< DONNEES DE DERIVATION DE LA SURFACE :
<
         IF          XOPT08-XXXNON,XOPT8,,XOPT8
NX:      FLOAT       0               < X(NORMALE),
NY:      FLOAT       0               < Y(NORMALE),
NZ:      FLOAT       0               < Z(NORMALE).
XOPT8:   VAL         0
FKN:     FLOAT       1               < MULTIPLICATEUR DE LA NORMALE, A INVERSER
                                     < PARFOIS (VOIR LE CAS DE BOY...).
NORMN:   FLOAT       1               < NORME(NORMALE) ; ON L'INITIALISE A 1,
                                     < A CAUSE DU GENERATEUR DE MAILLAGE, AU
                                     < CAS OU L'ECLAIRAGE NE SERAIT PAS ACTIF...
FHEPS:   FLOAT       10              < POUR FAIRE QUE FHU#FHV D'UN PETIT PEU...
                                     < (ET CECI POUR LE PROBLEME RENCONTRE
                                     < LORSQUE U=V ==> U+FHU=V+FHV ==>
                                     < X(U+FHU)=X(V+FHV),... CE QUI DONNE
                                     < DES DERIVEES PARTIELLES EGALES, CE
                                     < QUI PEUT PARFOIS DONNER DES VECTEURS
                                     < NORMAUX DE NORME NUL !!!)
<
< POSITION DE L'OBSERVATEUR :
<
OX:      WORD        0
OY:      WORD        0
OZ:      WORD        0
         IF          XOPT06-XXXOUI,XOPT6,,XOPT6
<
< DONNEES DE COLORIAGE :
<
BUFCOU:  WORD        0
LBUFC::  VAL         $-BUFCOU
MASCOL:  WORD        '0FFF           < POUR ELIMINER LES 4 BITS DE TETE...
DEMCOU:  BYTE        '8B;'02         < DEMANDE DE COLORIAGE...
         WORD        BUFCOU-ZERO*NOCMO
         WORD        LBUFC*NOCMO
XOPT6:   VAL         0
         IF          XOPT01-XXXOUI,XOPT1,,XOPT1
<
< DEFINITION DU PLAN DE COUPE :
<
PLAN1::  VAL         1
PLANI::  VAL         30000           < PETIT INFINI...
PLANA:   FLOAT       <PLAN1<0<0      < COEFFICIENT 'A',
PLANB:   FLOAT       <PLAN1<0<0      < COEFFICIENT 'B',
PLANC:   FLOAT       <PLAN1<0<0      < COEFFICIENT 'C',
PLAND:   FLOAT       <PLANI<0<0      < COEFFICIENT 'D'.
XOPT1:   VAL         0
<
< GESTION DES "TRANCHES"
< A 'X', 'Y' OU 'Z' CONSTANTS :
<
TRANCX:  FLOAT       0               < INACTIF SI NUL,
TRANCY:  FLOAT       0               < INACTIF SI NUL,
TRANCZ:  FLOAT       0               < INACTIF SI NUL.
TRANCM:  FLOAT       1               < AMPLIFICATEUR DES NIVEAUX...
         IF          XOPT03-XXXOUI,XOPT3,,XOPT3
<
< TRACE ANAGLYPHIQUE :
<
FANAG:   FLOAT       0               < =0 : NON,
                                     < #0 : OUI, ET ALORS LE DEPLACEMENT DES
                                     <      POINTS VAUT (PANAG*FK+FZS)/FANAG.
PANAG:   FLOAT       0               < DEFINITION DU PLAN DE CONVERGENCE DES
                                     < YEUX...
ATANAG:  WORD        TANAG,X         < ACCES A LA TABLE DE "MULTIPLICATION"
                                     < DES NIVEAUX ANAGLYPHIQUES...
XCNOIR:: VAL         0               < NOIR,
XCRMAX:: VAL         1               < ROUGE MAX (COMPATIBLE "RVB-IC"),
XCVMAX:: VAL         2               < VERT MAX (COMPATIBLE "RVB-IC"),
XCRMIN:: VAL         6               < ROUGE MIN,
XCVMIN:: VAL         7               < VERT MIN,
XCJMAX:: VAL         3               < JAUNE MAX (COMPATIBLE "RVB-IC"),
XCJMOY:: VAL         4               < JAUNE MOYEN,
XCJMIN:: VAL         5               < JAUNE MIN.
                                     < NOTA : CES COULEURS SONT CHOISIES DE
                                     < FACON A CE QUE :
                                     < RMAX+VMAX=JMAX AVEC LES COULEURS
                                     < TRANSPARENTES...
XCDELT:: VAL         XCVMAX-XCRMAX   < PASSAGE DU ROUGE AU VERT (QU'IL SOIT
                                     < MIN OU MAX...).
         IF          XCVMIN-XCRMIN-XCDELT,,XWOR%,
         IF          ATTENTION : LE COMMENTAIRE PRECEDENT EST FAUX !!!
XWOR%:   VAL         0
         IF          XCRMAX-1,,XWOR%,
         IF          ATTENTION : INCOMPATIBILITE "RVB-IC" !!!
XWOR%:   VAL         0
         IF          XCVMAX-2,,XWOR%,
         IF          ATTENTION : INCOMPATIBILITE "RVB-IC" !!!
XWOR%:   VAL         0
         IF          XCJMAX-3,,XWOR%,
         IF          ATTENTION : INCOMPATIBILITE "RVB-IC" !!!
XWOR%:   VAL         0
TANAG:   EQU         $
         IF          XCRMAX-XCNOIR,,,XWOR%
         IF          ATTENTION : IL FAUT PERMUTER DES COLONNES DE 'TANAG' !!!
XWOR%:   VAL         0
         IF          XCVMAX-XCRMAX,,,XWOR%
         IF          ATTENTION : IL FAUT PERMUTER DES COLONNES DE 'TANAG' !!!
XWOR%:   VAL         0
         IF          XCJMAX-XCVMAX,,,XWOR%
         IF          ATTENTION : IL FAUT PERMUTER DES COLONNES DE 'TANAG' !!!
XWOR%:   VAL         0
         IF          XCJMOY-XCJMAX,,,XWOR%
         IF          ATTENTION : IL FAUT PERMUTER DES COLONNES DE 'TANAG' !!!
XWOR%:   VAL         0
         IF          XCJMIN-XCJMOY,,,XWOR%
         IF          ATTENTION : IL FAUT PERMUTER DES COLONNES DE 'TANAG' !!!
XWOR%:   VAL         0
         IF          XCRMIN-XCJMIN,,,XWOR%
         IF          ATTENTION : IL FAUT PERMUTER DES COLONNES DE 'TANAG' !!!
XWOR%:   VAL         0
         IF          XCVMIN-XCRMIN,,,XWOR%
         IF          ATTENTION : IL FAUT PERMUTER DES COLONNES DE 'TANAG' !!!
XWOR%:   VAL         0
XWOR%0:  VAL         NIVMAX+1/NOCMO*XCNOIR
         $EQU        TANAG+XWOR%0
         BYTE        XCNOIR;XCRMAX;XCVMAX;XCJMAX;XCJMOY;XCJMIN;XCRMIN;XCVMIN
XWOR%1:  VAL         NIVMAX+1/NOCMO*XCRMAX
         $EQU        TANAG+XWOR%1
         BYTE        XCRMAX;XCRMAX;XCJMAX;XCJMAX;XCJMOY;XCJMOY;XCRMAX;XCJMOY
XWOR%2:  VAL         NIVMAX+1/NOCMO*XCVMAX
         $EQU        TANAG+XWOR%2
         BYTE        XCVMAX;XCJMAX;XCVMAX;XCJMAX;XCJMOY;XCJMOY;XCJMOY;XCVMAX
XWOR%3:  VAL         NIVMAX+1/NOCMO*XCJMAX
         $EQU        TANAG+XWOR%3
         BYTE        XCJMAX;XCJMAX;XCJMAX;XCJMAX;XCJMAX;XCJMAX;XCJMAX;XCJMAX
XWOR%4:  VAL         NIVMAX+1/NOCMO*XCJMOY
         $EQU        TANAG+XWOR%4
         BYTE        XCJMOY;XCJMOY;XCJMOY;XCJMAX;XCJMOY;XCJMOY;XCJMOY;XCJMOY
XWOR%5:  VAL         NIVMAX+1/NOCMO*XCJMIN
         $EQU        TANAG+XWOR%5
         BYTE        XCJMIN;XCJMOY;XCJMOY;XCJMAX;XCJMOY;XCJMIN;XCJMIN;XCJMIN
XWOR%6:  VAL         NIVMAX+1/NOCMO*XCRMIN
         $EQU        TANAG+XWOR%6
         BYTE        XCRMIN;XCRMAX;XCJMOY;XCJMAX;XCJMOY;XCJMIN;XCRMIN;XCJMIN
XWOR%7:  VAL         NIVMAX+1/NOCMO*XCVMIN
         $EQU        TANAG+XWOR%7
         BYTE        XCVMIN;XCJMOY;XCVMAX;XCJMAX;XCJMOY;XCJMIN;XCJMIN;XCVMIN
XWOR%8:  VAL         NIVMAX+1
XWOR%8:  VAL         XWOR%8/NOCMO*XWOR%8
         $EQU        TANAG+XWOR%8
XOPT3:   VAL         0
         IF          XOPT05-XXX512,XOPT5,,XOPT5
XXXIMA:  VAL         XXIMA2
         EOT         #SIP IMAGE 512#
<
< ADRESSE DES REGISTRES DE CONTROLE :
<
ACTRL1:  WORD        RCTRL1
ACTRL2:  WORD        RCTRL2
XXXIMA:  VAL         XXIMA4
         EOT         #SIP IMAGE 512#
<
< POUR LES CHANGEMENTS D'ECHELLE :
<
AYMAX:   WORD        YMAX            < POUR INVERSER LES AXES 'Y'...
XOPT5:   VAL         0
         PAGE
<
<
<        D E S C R I P T E U R   D E S   B U F F E R S
<                    D U   Z - B U F F E R  :
<
<
         DSEC
DZBUF:   EQU         $
BAGE02:  WORD        0               < POIDS FORT DE L'AGE,
BAGE01:  WORD        0               < POIDS FAIBLE DE L'AGE,
                                     < AGE : A CHAQUE OPERATION SUR LE Z-BUFFER,
                                     <       ON INCREMENTE L'AGE DES 2 BUFFERS.
                                     <       A L'INITIALISATION, ON METTRA UN
                                     <       GRAND AGE (CF. 'FMAX') AFIN DE
                                     <       CHOISIR UN BUFFER INOCCUPE...
BADR:    WORD        0               < ADR : ADRESSE EN 'CDAI' DU BUFFER.
SDKU:    WORD        0               < NUMERO DU BLOC COURANT,
MDKU:    WORD        0               < COMPTAGE DES MODIFICATIONS DU BLOC
                                     < COURANT.
LDZBUF:: VAL         $-DZBUF         < LONGUEUR DU DESCRIPTEUR...
         PAGE
<
<
<        C O M M O N  :
<
<
         COMMON
COMON:   WORD        0               < MOT RESERVE POUR LE BLOC FLOTTANT.
<
< ACCES AU Z-BUFFER :
<
YLOAD::  VAL         0               < MODE LOAD,
YSTORE:: VAL         1               < MODE STORE.
ZBUF:    WORD        0               < 0 : Z-BUFFER ACTIF (MODE NORMAL)...
                                     < 1 : INACTIF, MAIS DANGEREUX...
TRZBUF:  WORD        ZBUF0-1         < INDICATEUR DU NOMBRE DE MOTS DE CHAQUE
                                     < ENTREE DU Z-BUFFER :
                                     < TRZBUF<0 : UNE ENTREE,
                                     < TRZBUF>=0 : DEUX ENTREES, LE CONTENU DE
                                     <             'TRZBUF' DONNANT ALORS LE
                                     <             NUMERO DU MOT COURANT...
RDKU:    BYTE        '8A;'0C         < 'DKU' --> 'MEMTV' EN QUANTA=1.
         WORD        IZBUF*NOCMO
         WORD        LIZBUF*NOCMO
         WORD        0
WDKU:    BYTE        '8A;'0E         < 'MEMTV' --> 'DKU' EN QUANTA=1.
         WORD        IZBUF*NOCMO
         WORD        LIZBUF*NOCMO
         WORD        0
FMAX::   VAL         10000           < POUR UN GRAND AGE INITIAL...
BUF1:    EQU         $               < PREMIER BUFFER :
BAGE12:  WORD        FMAX
BAGE11:  WORD        0
         WORD        IZBUF
         WORD        -1              < PAS DE BLOC COURANT.
         WORD        0
BUF2:    EQU         $               < DEUXIEME BUFFER :
BAGE22:  WORD        FMAX
BAGE21:  WORD        0
         WORD        IZBUF1
         WORD        -1              < PAS DE BLOC COURANT.
         WORD        0
XZMAX::  VAL         '7FFF           < PLUS GRAND NOMBRE ENTIER POSITIF.
ZMAX:    WORD        XZMAX           < PLUS GRAND NOMBRE POSITIF...
ASPDKU:  WORD        SPDKU           < ECRITURE DU BLOC COURANT...
AGZB:    WORD        GZB             < ACCES GENERAL AU Z-BUFFER...
<
< SOURCE LUMINEUSE :
<
IECL:    WORD        0               < 0 : PAS D'ECLAIRAGE DE LA SURFACE,
                                     < 1 : ECLAIRAGE...
SX:      WORD        0               < X(SOURCE),
SY:      WORD        0               < Y(SOURCE),
SZ:      WORD        0               < Z(SOURCE).
MSX:     FLOAT       0               < X(POINT --> SOURCE),
MSY:     FLOAT       0               < Y(POINT --> SOURCE),
MSZ:     FLOAT       0               < Z(POINT --> SOURCE).
NORMS:   FLOAT       0               < NORME(POINT --> SOURCE).
FCOEF:   FLOAT       1               < COEFFICIENT D'INTENSITE LUMINEUSE.
                                     < (INITIALISE SUR PAS DE MODULATION)
         IF          XOPT05-XXX256,XOPT5,,XOPT5
XWOR%8:  VAL         3               < LOGARITHME DECIMAL DE XWOR%9,
XWOR%9:  VAL         1
         DO          XWOR%8
XWOR%9:  VAL         XWOR%9*10       < CALCUL DE 10 PUISSANCE XWOR%8.
F6S7:    FLOAT       <NIVMAX-1*XWOR%9/NIVMAX+1<0<-XWOR%8
XOPT5:   VAL         0
         IF          XOPT05-XXX512,XOPT5,,XOPT5
F6S7:    FLOAT       0.996078        < JE NE PEUX PAS LE PARAMETRER CORRECTE-
                                     < MENT ; ELLE VAUT :
                                     < (NIV256-2)/(NIV256-1)=254/255.
XOPT5:   VAL         0
ACOEF:   WORD        COEF            < CALCUL DE LA MODULATION LUMINEUSE.
IINT:    WORD        0               < INDICATEUR DE TRACE DE L'INTERIEUR DES
                                     < SURFACES :
                                     < =0 : TRACER INTERIEUR ET EXTERIEUR,
                                     < =1 : NE TRACER QUE L'EXTERIEUR.
ICOS:    WORD        0               < MODE TRAITEMENT DU 'COS' DES RAYONS
                                     < LUMINEUX :
                                     < 0 : PRIS ENTRE (-1,+1), ET TRANSLATION
                                     <     DANS (0,+1) PAR MULTIPLICATION
                                     <     PAR 1/2 ;
                                     < 1 : MISE DANS (0,+1) PAR UNE VALEUR
                                     < ABSOLUE.
EXCOS:   WORD        1               < EXPOSANT ENTIER DU 'COS' POUR CALCULER
                                     < LA MODULATION D'ECLAIRAGE.
                                     < IMPLICITEMENT, ON CALCULE COSINUS**1...
<
< CONSTANTES UTILES :
<
XR:      WORD        0               < COORDONNEE X D'UN POINT RESIDENT,
YR:      WORD        0               < COORDONNEE Y D'UN POINT RESIDENT,
XS:      WORD        0               < COORDONNEE X D'UN POINT SCRATCH,
YS:      WORD        0               < COORDONNEE Y D'UN POINT SCRATCH.
         IF          XOPT05-XXX512,XOPT5,,XOPT5
XDEF1::  VAL         K               < FAUX 512 (256 DUPLIQUE PAR CARRE 2*2),
XDEF2::  VAL         XDEF1+I         < VRAI 512...
IDEF:    WORD        XDEF1           < INDICATEUR DE FAUX OU DE VRAI 512 (VOIR
                                     < LA COMMANDE "M").
XS2:     WORD        0               < EN VRAI 512 : (XS2)=2*(XS),
YS2:     WORD        0               < EN VRAI 512 : (YS2)=2*(YS).
XOPT5:   VAL         0
POINTC:  BYTE        0;0             < MEMORISE LE (YS,XS) DU POINT QUE L'ON
                                     < VIENT DE MARQUER ; A NOTER QUE CE DIS-
                                     < POSITIF MERDE SI LE PREMIER POINT QUE
                                     < MARQUE EST PRECISEMENT YS=XS=0 QUI EST
                                     < LA VALEUR INITIALE DE 'POINTC'...
IPTC:    WORD        0               < =0 : NE PAS OPTIMISER PAR 'POINTC',
                                     <  1 : OPTIMISER...
ORGX:    WORD        0               < ORIGINE EN X DE L'IMAGE SCRATCH
                                     < PAR RAPPORT A L'IMAGE RESIDENTE,
ORGY:    WORD        0               < DE MEME, ORIGINE EN Y...
NPAS:    WORD        0               < =INVERSE DE 'FPAS', C'EST-A-DIRE LE
                                     < NOMBRE DE PAS SUR 'U' ET SUR 'V' A
                                     < L'INTERIEUR DE LA TRANSFORMEE DU CARRE
                                     < DE BASE.
<
< POUR ACCEDER AUX IMAGES :
<
SAVER:   WORD        0               < SAUVEGARDE D'UN MOT DE LA TRAME
                                     < RESIDENTE ROUGE,
SAVEV:   WORD        0               < DE MEME POUR LE VERT,
SAVEB:   WORD        0               < DE MEME POUR LE BLEU.
MCDAR:   EQU         SAVER           < SAUVEGARDE D'UN MOT DE LA TRAME
                                     < SCRATCH ROUGE,
MCDAV:   EQU         SAVEV           < DE MEME POUR LE VERT,
MCDAB:   EQU         SAVEB           < DE MEME POUR LE BLEU.
XCTCDA:  WORD        0
CTCDA:   WORD        TV2-TV1         < POUR ATTEINDRE 'TV2'...
MODX:    WORD        1               < 0 : "TORE" SUR LES X,
                                     < 1 : L'IMAGE SCRATCH NE SE REFERME PAS...
MODY:    WORD        1               < DE MEME SUR L'AXE DES Y.
WORK1:   WORD        0               < VARIABLE DE TRAVAIL...
MCDAM:   WORD        0               < MOT COURANT DE LA 'CDA'.
AIMAGR:  WORD        IMAGR,X         < RELAI TRAME ROUGE,
AIMAGV:  WORD        IMAGV,X         < RELAI TRAME VERTE,
AIMAGB:  WORD        IMAGB,X         < RELAI TRAME BLEUE.
<
< RELAIS :
<
         IF          XOPT05-XXX256,XOPT5,,XOPT5
ASPAPR:  WORD        SPAPR           < ACCES A UN POINT RESIDENT (X,Y).
ASPAPS:  WORD        SPAPS           < ACCES A UN POINT SCRATCH (X,Y).
ASPSPS:  WORD        SPSPS           < RANGEMENT D'UN POINT SCRATCH (X,Y).
AGETS:   WORD        GETS            < PARTIE COMMUNE A 'SPSPS' ET 'SPAPS'.
ASPGPR:  EQU         ASPAPR
ASPGPS:  EQU         ASPAPS
ASPRPS:  EQU         ASPSPS
ASPGR:   EQU         ASPGPR
ASPGS:   EQU         ASPGPS
ASPRS:   EQU         ASPRPS
ASPGRA:  WORD        SPGRA           < ACCES A UN POINT RESIDENT ET CONVERSION
                                     < FLOTTANTE SI INTERPOLATION DES NIVEAUX
                                     < DE GRIS DANS LE CARRE ELEMENTAIRE.
ASPGPF:  WORD        SPGPF           < CALCUL D'UN PSEUDO-NIVEAU DE GRIS
                                     < RESIDENT LORS DU SOUS-ECHANTILLONNAGE...
ADECAL:  WORD        DECAL           < POUR 'SPSPS'...
XOPT5:   VAL         0
         IF          XOPT05-XXX512,XOPT5,,XOPT5
ASPGPR:  WORD        SPAPR           < ACCES AU POINT (XR,YR).
ASPGRA:  WORD        SPGRA           < UTILISE S'IL Y A INTERPOLATION DANS LE
                                     < CARRE ELEMENTAIRE...
ASPGPF:  WORD        SPGPF           < CALCUL D'UN NIVEAU DE GRIS LORS DES
                                     < SOUS-ECHANTILLONNAGES.
ASPRS:   WORD        SPSPS           < RANGEMENT DU POINT (XS,YS).
ASPGPS:  WORD        SPAPS           < ACCES A UN POINT (XS,YS)...
AGETS:   WORD        GETS            < POUR ACCEDER AUX 3 BITS D'UN POINT...
XOPT5:   VAL         0
         IF          XOPT07-XXXOUI,XOPT7,,XOPT7
ASPSPR:  WORD        SPSPR           < MARQUAGE D'UN POINT RESIDENT (XR,YR).
ASPRPR:  EQU         ASPSPR
XOPT7:   VAL         0
ARAC:    WORD        RAC             < EXTRACTION D'UNE RACINE CARREE...
AFABS:   WORD        FABS            < 'FABS' FLOTTANT,
AFCAZ:   WORD        FCAZ            < 'FCAZ' FLOTTANT,
AFIX:    WORD        FIX             < 'FIX' FLOTTANT,
AFLT:    WORD        FLT             < 'FLT' FLOTTANT,
AFNEG:   WORD        FNEG            < 'FNEG' FLOTTANT.
ASFWOR:  WORD        SFWORK          < 'FST''FWORK'.
APWORK:  WORD        PWORK           < 'FAD FWORK', PUIS 'FST FWORK'...
<
< SOUS-PROGRAMMES SPECIFIQUES :
<
ASPU:    WORD        SPU             < CALCUL
ASPV:    WORD        SPV             <        DIRECT
ASPW:    WORD        SPW             <               DE LA FONCTION.
SPUVW:   EQU         $
ASPUP:   WORD        SPUP            < COMPOSANTE 'U' D'UN VECTEUR,
XSPU::   VAL         $-SPUVW-1       < INDEX COMPOSANTE U.
ASPVP:   WORD        SPVP            < COMPOSANTE 'V',
XSPV::   VAL         $-SPUVW-1       < INDEX COMPOSANTE V.
ASPWP:   WORD        SPWP            < ET COMPOSANTE 'W'...
XSPW::   VAL         $-SPUVW-1       < INDEX COMPOSANTE W.
ASPUVW:  WORD        SPUVW,X         < RELAI VERS LES SOUS-PROGRAMMES...
ADERIV:  WORD        DERIVE          < SOUS-PROGRAMME DE DERIVATION.
AROND:   WORD        ROND            < ARRONDI FLOTTANT ET CONVERSION ENTIERE.
AEXTU:   WORD        EXTU            < CALCUL DE MIN(U) ET DE MAX(U).
AEXTV:   WORD        EXTV            < CALCUL DE MIN(V) ET DE MAX(V).
<
< CONSTANTES DE CALCUL DES SINUS ET COSINUS :
<
ASIN:    WORD        SIN             < S/P DE CALCUL DU SINUS,
ACOS:    WORD        COS             < ET DU COSINUS.
ZZZ061:  DZS         2               < NB EN FLOTTANT
ZZZ062:  DZS         2
ZZZ063:  DZS         1               < SIGNE
DEUXPI:  FLOAT       6.2831853       < 2 PI
PI3141:  FLOAT       3.1415926       < PI
PISUR2:  FLOAT       1.5707963       < PI/2
ZZZ067:  EQU         PISUR2          < CSTES DU POLYNOME
ZZZ068:  WORD        'AD00;'5110
ZZZ069:  WORD        '51FD;'9A2C
ZZZ070:  WORD        'B3F9;'6CCE
ZZZ071:  WORD        '4FF4;'6BDD
<
< DONNEES DE LA TRANSFORMATION MATRICIELLE :
<
M11:     FLOAT       1
M12:     FLOAT       0
M13:     FLOAT       0
M21:     FLOAT       0
M22:     FLOAT       1
M23:     FLOAT       0
M31:     FLOAT       0
M32:     FLOAT       0
M33:     FLOAT       1
AM:      WORD        M11,X           < ACCES A LA MATRICE TRI-DIMENSIONNELLE.
KRX:     FLOAT       0               < X(CENTRE DE LA TRANSFORMATION),
KRY:     FLOAT       0               < Y(...),
KRZ:     FLOAT       0               < Z(...).
ITRANS:  WORD        0               < 0 : PAS DE TRANSFORMATION MATRICIELLE
                                     <     AVANT LE TRACE DES VECTEURS.
                                     < 1 : TRANSFORMATION MATRICIELLE.
<
< DONNES DE SOUS-ECHANTILLONNNAGE :
<
FDELX:   FLOAT       1               < PAS SUR OX,
FDELY:   FLOAT       1               < PAS SUR OY.
FKDEL:   FLOAT       1               < MULTIPLICATEUR DE 'FDELX' ET 'FDELY'
                                     < POUR CALCULER LA PORTEE DE L'INTERPO-
                                     < LATION DE SOUS-ECHANTILLONNAGE.
FSIGCO:  FLOAT       0               < CUMUL DES COEFFICIENTS D'INTERPOLATION,
FSIGNI:  FLOAT       0               < CUMUL DES NIVEAUX PONDERES...
<
< DONNES DIVERSES :
<
F1:      FLOAT       1
F3:      FLOAT       3               < INUTILE EN GENERAL (SAUF 'BOY'...).
BORNS:   WORD        XZMAX           < ON NE CONSERVE LES POINTS (XS,YS,ZS)
BORNI:   WORD        MFFFF)XZMAX     < QUE SI (BORNI)<=(ZS)<=(BORNS).
<
< DONNEES D'ARRONDI :
<
F05:     FLOAT       0.5
<
< DONNEES POUR LA FONCTION :
<
INTER1:  WORD        0               < =0 : INITIALISATION DES COMPOSANTES 'VECU
                                     <   'VECV' ET 'VECW' ;
                                     < #0 : L'INITIALISATION EST FAITE...
INTER2:  WORD        0               < =0 : CALCUL SYSTEMATIQUE DE LA FONCTION
                                     <      EN CHAQUE POINT,
                                     < #0 : ON INTERPOLE LA FONCTION DANS LE
                                     <      CARRE ELEMENTAIRE.
F0:      FLOAT       0
FWORK1:  FLOAT       0               < TRAVAIL...
FWORK2:  FLOAT       0               < TRAVAIL...
<
< TRANSLATION :
<
TRX:     WORD        0               < CX,
TRY:     WORD        0               < CY,
TRZ:     WORD        0               < CZ.
<
< FACTEURS D'ECHELLES "LOCAUX" :
<
VECU:    FLOAT       0
VECV:    FLOAT       0
VECW:    FLOAT       0
KFU:     FLOAT       1
KFV:     FLOAT       1
KFW:     FLOAT       1
KFT:     FLOAT       1
KUX:     FLOAT       1
KVX:     FLOAT       1
KWX:     FLOAT       1
KTX:     FLOAT       1
KUY:     FLOAT       1
KVY:     FLOAT       1
KWY:     FLOAT       1
KTY:     FLOAT       1
KUZ:     FLOAT       1
KVZ:     FLOAT       1
KWZ:     FLOAT       1
KTZ:     FLOAT       1
FXR:     FLOAT       0
FYR:     FLOAT       0
FZR:     FLOAT       0
FTR:     FLOAT       0
<
< DONNEES INSEPARABLES POUVANT
< DONNER NAISSANCE A UN NOEUD
< DE MAILLAGE SI 'XOPT08' :
<
         IF          XOPT08-XXXOUI,XOPT8,,XOPT8
NMAIL:   ASCI        "X*"
NMAIL1:  ASCI        "YYXX"
         BYTE        '04;0
XWOR%1:  VAL         NMAIL-ZERO*NOCMO
NMAIL2:  EQU         ZERO+XWOR%1     < ADRESSE-OCTET DE 'NMAIL'.
XWOR%1:  VAL         $-NMAIL*NOCMO
LNMAIL:  EQU         ZERO+XWOR%1-1   < LONGUEUR DU NOM DE MAILLE...
XOPT8:   VAL         0
FXS:     FLOAT       0               < COORDONNEE 'X' 3D,
FYS:     FLOAT       0               < COORDONNEE 'Y' 3D,
FZS:     FLOAT       0               < COORDONNEE 'Z' 3D.
         IF          XOPT08-XXXOUI,XOPT8,,XOPT8
NX:      FLOAT       0               < X(NORMALE) NORMALISE,
NY:      FLOAT       0               < Y(NORMALE) NORMALISE,
NZ:      FLOAT       0               < Z(NORMALE) NORMALISE.
XOPT8:   VAL         0
VARUVW:  EQU         $
VARU:    FLOAT       0               < COORDONNEE CURVILIGNE 'U',
XVARU::  VAL         $-VARUVW-2      < INDEX COORDONNEE U.
VARV:    FLOAT       0               < COORDONNEE CURVILIGNE 'V'.
XVARV::  VAL         $-VARUVW-2      < INDEX COORDONNEE V.
         IF          XOPT08-XXXOUI,XOPT8,,XOPT8
XWOR%1:  VAL         $-NMAIL*NOCMO
LMAIL:   EQU         ZERO+XWOR%1     < LONGUEUR DE L'ITEM DE NOEUD.
XOPT8:   VAL         0
VARW:    FLOAT       0
XVARW::  VAL         $-VARUVW-2      < INDEX COORDONNEE W.
VART:    FLOAT       0
XVART::  VAL         $-VARUVW-2      < INDEX COORDONNEE T.
FINCU:   FLOAT       0               < INCREMENT DE 'FXR' DANS LE CARRE DE BASE.
XFINCU:: VAL         $-VARUVW-2      < INDEX DE 'FINCU'...
FINCV:   FLOAT       0               < INCREMENT DE 'FYR' DANS LE CARRE DE BASE.
XFINCV:: VAL         $-VARUVW-2      < INDEX DE 'FINCV'...
XLASTX:: VAL         $-VARUVW-2      < DERNIER INDEX...
YVARU:   WORD        XVARU           < =XVARU SI INTER2=0,
                                     < =XFINCU SI      =1.
YVARV:   WORD        XVARV           < =XVARV SI INTER2=0,
                                     < =XFINCV SI      =1.
AVAR:    WORD        VARUVW,X        < REALI D'ACCES AUX COORDONNEES.
<
< FACTEUR GENERAL D'ECHELLE :
<
FK:      FLOAT       1
<
< CONSTANTES DE DERIVATION :
<
FHU:     FLOAT       0.01            < PAS DE DERIVATION NUMERIQUEPAR RAPPORT
                                     < A 'U',
FHV:     FLOAT       0.011           < ET PAR RAPPORT A 'V'...
F2H:     FLOAT       0.02            < EN FAIT, 'F2H' EST RECALCULEE A CHAQUE
                                     < APPEL DE 'ADERIV'...
<
< DEFINITION DE L'ACCELERATEUR
< DES ACCES A 'TV1' ET 'TV2' :
<
ASHPR:  @
         IF          5=XFSYMB,XWOR%,,XWOR%
ASHPR::  VAL         53              < ON SE DONNE UN NOMBRE PREMIER,
XWOR%:   VAL         0
         IF          ASHPR,XWOR%,XWOR%,
LASHT:   WORD        ASHPR           < POUR FAIRE DES CALCULS MODULO 'ASHPR'.
SAVYX:   BYTE        0;0             < POUR MEMORISER UN COUPLE (Y,X).
INOC::   VAL         -1              < ETAT INOCCUPE D'UNE ENTREE DE LA TABLE.
ASHT1::  VAL         0               < POUR ACCEDER A LA PARTIE (Y,X) DE LA
                                     < TABLE,
ASHT2::  VAL         ASHT1+ASHPR     < POUR ACCEDER A LA PARTIE TV1/TV2/NIVEAU
                                     < DE LA TABLE.
XWOR%:   VAL         0
<
< CONSTANTES DE TRAVAIL ACCESSIBLES
< AU SOUS-PROGRAMME SPECIFIQUE PAR
< INDEXATION DOUBLE-MOT :
<
NCT:    @
         IF          3=XFSYMB,XWOR%,,XWOR%
NCT::    VAL         48+5-4          < NOMBRE DE CONSTANTES DE TRAVAIL.
XWOR%:   VAL         0
ACT:     WORD        CT,X            < RELAI D'ACCES.
ASPCT:   WORD        SPCT            < SOUS-PROGRAMME COMMUN D'ACCES.
FWORK:   FLOAT       0               < VARIABLE DE TRAVAIL, MISE ICI A CAUSE
                                     < DE LA SATURATION DU COMMON...
CT:      EQU         $
         DO          NCT
         FLOAT       1
         PAGE
<
<
<        T A B L E   D E S   C O M M A N D E S  :
<
<
REP0:    VAL         "+"             < PREMIERE COMMANDE.
KOM:     EQU         $-REP0          < ELLES COMMENCENT A "+"...
         WORD        STORE           < + : STORE SGN LE RESIDENT
         WORD        ERROR           < ,
         WORD        DELETE          < - : DELETE SGN LE RESIDENT
         WORD        PDEF            < . : CHOIX VRAI/FAUX 512 (512)
         WORD        DANAG           < / : DEFINITION DES TRACES ANAGLYPHIQUES
         WORD        MOV0            < 0 : TV <-- RESIDENT R+V+B
         WORD        ERROR           < 1
         WORD        ERROR           < 2
         WORD        ERROR           < 3
         WORD        MOV4            < 4 : RESIDENT <-- TV R+V+B
         WORD        ERROR           < 5
         WORD        ERROR           < 6
         WORD        ERROR           < 7
         WORD        STV2            < 8 : TV2 <-- RESIDENT
         WORD        GTV2            < 9 : RESIDENT <-- TV2
         WORD        OBS             < : : POSITION DE L'OBSERVATEUR
         WORD        ERROR           < ;
         WORD        DBORNS          < < : DEFINITION DE LA BORNE SUP DES ZS
         WORD        DTRANS          < = : DEFINITION DE LA MATRICE M(I,J)
         WORD        DBORNI          < > : DEFINITION DE LA BORNE INF DES ZS
         WORD        PATNIV          < ? : ATTRIBUTION DES NIVEAUX DE GRIS (256)
         WORD        ZPIN            < @ : ENTREE DE 'ZR' ET 'TR'
         WORD        GCT             < A : ENTREE CONSTANTES DE TRAVAIL
         WORD        MZBUF           < B : INITIALISATION DU Z-BUFFER
         WORD        CVP             < C : CHOIX VECTEUR/POINT
         WORD        DISP            < D : RESIDENT <-- IMAGE SGN
         WORD        PSCALD          < E : ENTREE DE L'ECHELLE DIAGONALE
         WORD        GOGE            < F : FIN
         WORD        SOUSEC          < G : ENTREE DU SOUS-ECHANTILLONNAGE
         WORD        CDER            < H : ENTREE CONSTANTE DE DERIVATION
         WORD        RAPIDE          < I : INTERPOLATION DES CARRES DE BASE
                                     <     ET DE LA FONCTION
         WORD        TRANCH          < J : ENTREE DES TRANCHES A X/Y/Z CONSTANT
         WORD        INFK            < K : ENTREE CTTE TRANSFORMATION
         WORD        IEXCOS          < L : ENTREE DE L'EXPOSANT DU COSINUS
         WORD        ERROR           < M
         WORD        NAME            < N : NOMME L'IMAGE RESIDENTE
         WORD        OPTIMI          < O : OPTIMISER PAR 'POINTC' OUI/NON
         WORD        INCOST          < P : ENTREE DU COST DE PROJECTION
         WORD        DFPLAN          < Q : DEFINITION DU PLAN DE COUPE
         WORD        TRANSM          < R : DEFINITION TRANSFORMATION MATRICIELLE
         WORD        EFFACE          < S : EFFACEMENT DE L'ECRAN (512)
         WORD        TRANS           < T : TRACE DU CHAMP DE VECTEURS
         WORD        COLOR           < U : ENVOI DES ORDRES DE COLORIAGE
         WORD        VITRE           < V : GESTION DES TRANSPARENCES (512)
         WORD        GOCCI           < W : RETOUR TEMPORAIRE AU CCI
         WORD        GORGX           < X : POSITIONNEMENT DE 'ORGX'
         WORD        GORGY           < Y : POSITIONNEMENT DE 'ORGY'
         WORD        PROJE           < Z : ACTION SUR LE MODE DE PROJECTION
REPZ:    VAL         $-KOM-1         < DERNIERE COMMANDE.
         PAGE
         PROG
         PAGE
<
<
<        R E T O U R   A   ' G E '  :
<
<
GOGE:    EQU         $
         LAI         BRANCH-ZERO
         LR          A,W             < W=ADRESSE DE LA BRANCHE...
         LA          NSD
         STA         0,W             < GENERATION DU NOM DE L'OVERALY,
         ACTD        4               < A='IDESC',
         ORI         "0"             < CONVERTI EN ASCI,
         STBY        2,W             < QUI FAIT PARTIE DU NOM...
         LAI         SGNLON
         STBY        DEMLOD          < MISE EN MODE 'LOAD SOUS ACN'...
         STZ         CDRET,W         < RETOUR OK...
GOGE2:   EQU         $
         CPZ         KIN2            < L'ITEM1 A-T'IL EST SAUVEGARDE ???
         JL          GOGE5           < NON, RIEN A RESTAURER...
         BSR         ARITEM          < RESTAURATION DE L'ITEM1...
         LA          SAVEK
         LR          A,K             < ET RESTAURATION DE 'K'...
GOGE5:   EQU         $
         CPZ         ZBUF            < ALORS ???
         JNE         GOGE4           < Z-BUFFER INACTIF...
         PSR         W               < Z-BUFFER ACTIF :
         LRM         W
         WORD        BUF1            < (W)=ADRESSE DU 1ER DESCRIPTEUR,
         BSR         ASPDKU          < REECRITURE DU 1ER BLOC SI NECESSAIRE,
         ADRI        LDZBUF,W
         BSR         ASPDKU          < ET DU SECOND...
         PLR         W
GOGE4:   EQU         $
         LA          IEG
         STA         MODCAL,W        < RENVOI DE L'INDEX COURANT DE ITEM1,
         LAI         AMCDA-ZERO
         BSR         ACCI            < ENVOI DE !CDA.
         LX          NMOTS
GOGE3:   EQU         $
         STZ         &AITEM2         < RAZ DE L'ITEM2...
         JDX         GOGE3
GOGE1:   EQU         $
         LAD         DEMLOD
         BSR         AOVL            < ET TENTATIVE DE CHARGEMENT...
         QUIT        1               < EN CAS D'ERREUR,
         JMP         GOGE1           < ET ON RETENTE...
<
<
<        T R A I T E M E N T   D E S   A L T - M O D E S  :
<
<
ALTM:    EQU         $
         LAI         BRANCH-ZERO
         LR          A,W             < W=ADRESSE DE LA BRANCHE...
         LA          NPCALL
         JANE        ALTM1           < OK...
         LA          MODCAL,W        < MODCAL EST ENCORE A SA VALEUR INITIALE.
         LXI         0               < "GE" A PRIORI...
         TBT         0               < "EI" OU "GE" ???
         ADCR        X
         LA          &NCALL          < A=OVERLAY A APPELER...
ALTM1:   EQU         $
         STA         0,W             < DANS LE CAS D'UN ALT-MODE, ON REVIENT
                                     < DIRECTEMENT A "GE" OU A "EI"...
         LAI         " "             < ON RESTAURE, AU CAS OU LE ALT-MODE
         STBY        2,W             < APPARAITRAIT DANS 'GOGE'...
         LAI         SGNLNS          < IDEM...
         STBY        DEMLOD
         LAI         2
         STA         CDRET,W         < TRANSMISSION DU ALT-MODE...
         JMP         GOGE2
         PAGE
<
<
<        E N T R Y  :
<
<
TW:      EQU         $
         LRM         C,L
         WORD        COMON+128       < C=BASE DU COMMON...
         WORD        LOC+128         < L=BASE DU LOCAL...
         LAD         DEMOVL
         SVC         0               < CHARGEMENT DE LA BRANCHE D'OVERLAY...
         STZ         XCTCDA          < AU CAS OU UN MALHEUREUX ALT-MODE...
         IC          KIN             < COMPTAGE DES ENTREES :
         JG          ALTM            < ABORT IMMEDIAT SUR ALT-MODE...
         LA          CDRET,W         < A=RELAI D'ACCES A ITEM1/ITEM2...
         CP          AI1             < SEUL ITEM1 EST AUTORISE...
         JNE         ALTM            < L'ITEM2 PROVOQUE UN ABORT...
         LA          MODCAL,W        < A=INDEX INITIAL DE L'ITEM1...
         LXI         0               < "GE" A PRIORI...
         TBT         0               < "GE" (0) OU "EI" (1) ???
         ADCR        X
         RBT         0
         STA         IEG
         LA          &NCALL
         STA         NPCALL          < NOM DU PROCESSEUR A APPELER SUR LA
                                     < RECEPTION D'UN ALT-MODE.
         LR          K,A             < CAS DE LA PREMIERE,
         STA         SAVEK           < SAUVEGARDE DE K...
         IC          KIN2            < ET VOILA, LES SAUVEGARDES SONT FAITES...
         LRM         K
         WORD        STACK-1         < INITIALISATION DE K...
         LAI         AMCDAI-ZERO
         BSR         ACCI            < ENVOI DE !CDAI...
         JNE         GOGE            < ET BIEN CELA NE MARCHE PAS...
         LRM         A,B,X           < SAUVEGARDE DE L'ITEM1 :
         WORD        SAVIT1          < (A)=ADRESSE DE LA SAUVEGARDE DANS 'CDAI',
         WORD        ITEM1           < (B)=ADRESSE DE L'ITEM1 A SAUVEGARDER,
         WORD        LTNI            < (X)=LONGUEUR D'UN ITEM.
         WCDA
                                     < SAUVEGARDE DE L'ITEM1...
         STZ         IMASKO          < MISE DU MASQUE OFF A PRIORI...
         LAD         DEMMEM
         SVC         0               < PASSAGE A 16 K...
         LAI         '18
         WORD        '1E15
         LR          B,X             < X=ORIGINE DE LA 'CDAI'.
         LAI         '19
         WORD        '1E15
         SBR         X,B
XWOR%1:  VAL         -4              < B=LONGUEUR UTILE DE LA 'CDAP'/'CDAI',
         LRM         A
         WORD        IZBUF-TV1>XWOR%1 < A=LONGUEUR NECESSAIRE (IMAGE+MASQUE),
         CPR         A,B             < CELA SUFFIT-IL ???
         JL          GOGE            < B<A : INSUFFISANT POUR TRAVAILLER...
TW13:    EQU         $
         BSR         APIN
         STZ         IMASKO          < OFF A PRIORI...
         CPI         "N"
         JE          TW14            < OK, IMASKO=0 ==> OFF...
         IC          IMASKO          < A PRIORI, IMASKO=1 ==> ON...
         CPI         "O"
         JNE         TW13            < ?!??!??!
TW14:    EQU         $
         PAGE
<
<
<        B O U C L E   D ' I N T E R R O G A T I O N  :
<
<
LOOP:    EQU         $
         BSR         APIN            < ENTREE DE LA COMMANDE...
         CPI         REP0            < ET VALIDATION...
         JL          TW12            < ERREUR...
         CPI         REPZ            < VALIDATION, SUITE...
         JG          TW12            < ERREUR...
         LR          A,X             < X=COMMANDE DEMANDEE,
         BR          &ACOM           < BRANCHEMENT AU MODULE SPECIFIQUE...
TW12:    EQU         $
<
<
<        T R A I T E M E N T   D E S   E R R E U R S  :
<
<
ERROR:   EQU         $
         LAD         DEMOUT
         SVC         0               < EDITION DU MESSAGE D'ERREUR...
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        A C C E S   A U   C C I  :
<
<
GOCCI:   EQU         $
         QUIT        1               < ACCES AU CCI INTERACTIF...
         BR          ALOOP
         PAGE
<
<
<        E N T R E E   D ' U N   C A R A C T E R E  :
<
<
<        ARGUMENT :
<                    A=ADRESSE D'UN MESSAGE SI 'PIN'.
<
<
<        RESULTAT :
<                    A=CARACTERE ENTRE.
<
<
IN:      EQU         $
         LAD         DEMIN
         BSR         AENTER
         LBY         &AREP           < A=CARACTERE REPONSE.
         RSR
         PAGE
<
<
<        E F F A C E M E N T   D E   L ' E C R A N  :
<
<
         IF          XOPT05-XXX256,XOPT5,,XOPT5
EFFACE:  EQU         ERROR
XOPT5:   VAL         0
         IF          XOPT05-XXX512,XOPT5,,XOPT5
EFFACE:  EQU         $
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...
         LAI         XCTRL1
         STA         MCDAJ
         LA          ACTRL1
         BSR         APWCDA          < INITIALISATION DE 'CTRL1'.
         LAI         XCTRL2
         STA         MCDAJ
         LA          ACTRL2
         BSR         APWCDA          < INITIALISATION DE 'CTRL2'.
         BR          ALOOP           < ET A LA BOUCLE D'INTERROGATION...
XOPT5:   VAL         0
         PAGE
<
<
<        M O D U L E S   D ' A C C E S   A U   S G N  :
<
<
<        FONCTION :
<                      PERMETTENT L'ACCES AU SGN
<                    POUR LES IMAGES SUIVANT :
<                    N : NOMME L'IMAGE RESIDENTE,
<                        JUSQU'A UNE COMMANDE 'N'
<                        SUIVANTE,
<                    D : AFFICHE L'IMAGE PRECEDEMMENT
<                        NOMMEE PAR 'N'.
<                    + : CREE L'IMAGE PRECEDEMMENT
<                        NOMMEE PAR 'N',
<                    - : DETRUIT L'IMAGE PRECEDEMMENT
<                        NOMMEE PAR 'N'.
<
<
NAME:    EQU         $
         LAD         NOMIN
         BSR         AENTER          < ENTREE DU NOM COURANT,
         LAI         EOT
         STBY        &AEOT           < ET ON FORCE A PRIORI UN 'EOT'...
         BR          ALOOP           < ET C'EST TOUT...
<
< SOUS-PROGRAMME GENERAL D'ACCES AU SGN :
<
GOSGN:   EQU         $               < RESPONSABLE DE TOUS LES ACCES SGN...
         STBY        SGN             < MISE EN PLACE DU 'NVP' ARGUMENT,
         LAI         LNOM*NOCMO
         STA         SGN+3           < A PRIORI...
         LAD         SGN
         SVC         0               < ET ENVOI DE LA DEMANDE...
         RSR
<
< MODULES SPECIFIQUES :
<
DISP:    EQU         $               < COMMANDE 'D' :
         LAI         SGNLON          < ON COMMENCE PAR L'ACN DU DEMANDEUR,
         BSR         AGOSGN
         JE          DISP1           < OK, IL EXISTE...
         LAI         SGNLNS          < NON, ON TENTE SOUS :SYS...
         BSR         AGOSGN
         JE          DISP1           < OK...
DISP2:   EQU         $
         BR          AERROR          < TRAITEMENT DES ERREURS...
DISP1:   EQU         $
         BR          ALOOP           < VERS LA BOUCLE SI OK...
DELETE:  EQU         $               < COMMANDE '-' :
         LAI         SGNDLN
DELET1:  EQU         $
         BSR         AGOSGN
         JE          DISP1           < OK...
         JMP         DISP2           < ERREUR...
STORE:   EQU         $               < COMMANDE '+' :
         LAI         SGNSTN
         JMP         DELET1
         PAGE
<
<
<        A C T I O N   S U R   L E   Z - B U F F E R  :
<
<
MZBUF:   EQU         $
         STZ         ZBUF            < A PRIORI, Z-BUFFER ACTIF...
         STZ         TRZBUF
         DC          TRZBUF          < A PRIORI CHAQUE ENTREE DU Z-BUFFER
                                     < N'AURA QU'UN MOT...
         BSR         AIN             < ENTREE D'UN CARACTERE...
<
<        REPONSES RECONNUES :
<
<                    N : PAS D'UTILISATION DU Z-BUFFER,
<                    O : UTILISATION DU Z-BUFFER (ET UTILISATION DE CELUI
<                        QUI EST DEJA SUR 'DKU'...),
<                    I : UTILISATION DU Z-BUFFER ET INITIALISATION
<                        AVEC L'INFINI...
<                    P : IDEM A "O", AVEC FILTRAGE FINAL,
<                    J : IDEM A "I", AVEC FILTRAGE FINAL.
<
         CPI         "N"
         JE          MZBUF6          < PAS DE Z-BUFFER...
         CPI         "O"
         JE          MZBUF4          < UITILISATION DU Z-BUFFER ET UN SEUL
                                     < MOT PAR ENTREE...
         CPI         "I"
         IF          XOPT02-XXXOUI,XOPT2,,XOPT2
         JE          MZBUF1          < INITIALISATION ET 1 MOT PAR ENTREE...
         STZ         TRZBUF          < A PRIORI, LE NOMBRE DE MOTS PAR ENTREE
                                     < SERA 2...
         CPI         "P"
         JE          MZBUF4          < IDENTIQUE A "O" MAIS AVEC 2 MOTS/ENTREE.
         CPI         "J"             < (COMMANDE IDENTIQUE A "I" MAIS AVEC
                                     < 2 MOTS/ENTREE...)
XOPT2:   VAL         0
         JNE         MZBUF3          < ERREUR : ON INHIBE LE Z-BUFFER !!!
<
< INITIALISATION DU Z-BUFFER :
<
MZBUF1:  EQU         $               < CAS DE "I" ET "J" :
         LB          ZMAX            < ON SE PLACE LE PLUS LOIN POSSIBLE
                                     < DE L'OBSERVATEUR, ET VU L'ORIENTATION
                                     < DE L'AXE DES Z, C'EST A +L'INFINI...
         LAI         0               < A=ADRESSE DU MOT COURANT DU Z-BUFFER.
         LYI         YSTORE          < POUR ECRIRE DANS LE Z-BUFFER.
MZBUF5:  EQU         $
         BSR         AGZB            < INITIALISATION DU Z-BUFFER.
         ADRI        1,A             < AU MOT SUIVANT...
         JANE        MZBUF5
         IF          XOPT02-XXXOUI,XOPT2,,XOPT2
         CPZ         TRZBUF          < 1 OU 2 MOTS PAR ENTREE ???
         JL          MZBUF7          < 1 SEUL, OK...
         IF          ZBUF1-1,,XWOR%,
         IF          ATTENTION : LE 'IC' EST IDIOT !!!
XWOR%:   VAL         0
         IC          TRZBUF          < TRZBUF=1, AFIN D'INITIALISER LE 2EME MOT,
         LBI         0               < (B)=VALEUR D'INITIALISATION...
                                     < A NOTER QUE :
                                     < (A)=0 (CF. LE 'JANE'...)
MZBUF8:  EQU         $
         BSR         AGZB            < CLEAR LES MOTS 1 DE CHAQUE ENTREE...
         ADRI        1,A             < PASSAGE A L'ENTREE SUIVANTE...
         JANE        MZBUF8          < SI ELLE EXISTE...
         STZ         TRZBUF          < ENFIN, RETOUR SUR LE MOT 0 DE CHAQUE
                                     < ENTREE...
MZBUF7:  EQU         $
XOPT2:   VAL         0
         JMP         MZBUF4          < ET LE Z-BUFFER EST AUTORISE...
<
< AUTORISATION DU Z-BUFFER OU PAS :
<
MZBUF6:  EQU         $
         IC          ZBUF            < ZBUF=1 : PAS DE Z-BUFFER...
MZBUF4:  EQU         $               < CAS DE "O" ET "P" :
         BR          ALOOP           < ET C'EST TOUT...
MZBUF3:  EQU         $
         IC          ZBUF            < ON DESACTIVE LE Z-BUFFER,
         DC          TRZBUF          < ET ON REVIENT A 1 MOT/ENTREE...
         BR          AERROR
         PAGE
<
<
<        O P T I M I S A T I O N   ' P O I N T C '  :
<
<
OPTIMI:  EQU         $
         STZ         IPTC            < IPTC=0 : PAS D'OPTIMISATION A PRIORI...
         BSR         AIN             < ENTREE DE LA REPONSE...
         CPI         "N"
         JE          OPTIM1          < PAS D'OPTIMISATION...
         IC          IPTC            < IPTC=1 : OPTIMISATION A PRIORI...
         CPI         "O"
         JNE         OPTIMI          < !?!??!?!!
OPTIM1:  EQU         $
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        E N T R E E   ' Z R '   E T   ' T R '
<
<
ZPIN:    EQU         $
         LAD         FZR             < ENTREE DE 'FZR'.
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         LAD         FTR             < ENTREE DE 'FTR'...
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        E N T R E E   D E   C X / C Y / K F U / K F V / K F W  :
<
<
DTRANS:  EQU         $
DTRAN1:  EQU         $
         BSR         APIHEX          < ENTREE DE 4 CHIFFRES HEXADECIMAUX.
         JNE         DTRAN1          < ERREUR...
         STA         TRX
DTRAN2:  EQU         $
         BSR         APIHEX          < ENTREE DE 4 CHIFFRES HEXADECIMAUX.
         JNE         DTRAN2          < ERREUR...
         STA         TRY
DTRAN5:  EQU         $
         LAD         KFU
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
DTRAN6:  EQU         $
         LAD         KFV
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
DTRAN7:  EQU         $
         LAD         KFW
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
DTRAN3:  EQU         $
         LAD         KFT
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
<
<
<        E N T R E E   D E S   C O E F F I C I E N T S
<        K U X , K V X , ... , K T Z  :
<
<
         LAD         KUX
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         LAD         KVX
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         LAD         KWX
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         LAD         KTX
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         LAD         KUY
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         LAD         KVY
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         LAD         KWY
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         LAD         KTY
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         LAD         KUZ
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         LAD         KVZ
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         LAD         KWZ
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         LAD         KTZ
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
DTRAN4:  EQU         $
         BR          ALOOP           < EASY ??!?!?!
         PAGE
<
<
<        E N T R E E   D E   ' O R G X '   E T   ' O R G Y '  :
<
<
GORGX:   EQU         $
         STZ         MODX            < TORE A PRIORI...
         BSR         APIHEX          < ENTREE DE ORGX...
         JE          GORGX1          < OK...
GORGX2:  EQU         $
         BR          AERROR          < ET NON...
GORGX1:  EQU         $
         NGR         A,A
         STA         ORGX
GORGX3:  EQU         $
         BSR         APIN            < ENTREE DE LA REPONSE...
         CPI         "O"
         JE          GORGX4          < TORE...
         CPI         "N"
         JNE         GORGX3          < ERREUR...
         IC          MODX            < CE N'EST PAS LE MODE TORE...
GORGX4:  EQU         $
         BR          ALOOP           < OK...
GORGY:   EQU         $
         STZ         MODY            < MODE TORE A PRIORI...
         BSR         APIHEX          < ENTREE DE ORGY...
         JNE         GORGX2          < ERREUR...
         NGR         A,A
         STA         ORGY
GORGY3:  EQU         $
         BSR         APIN            < ENTREE DE LA REPONSE...
         CPI         "O"
         JE          GORGY4          < TORE...
         CPI         "N"
         JNE         GORGY3          < ERREUR...
         IC          MODY            < CE N'EST PAS LE MODE TORE...
GORGY4:  EQU         $
         BR          ALOOP           < OK...
         PAGE
<
<
<        D E F I N I T I O N   D U   T R A C E  :
<
<
CVP:     EQU         $
<
<
<        E C L A I R A G E ? ? ?
<
<
ECLAIR:  EQU         $
         BSR         APIN
         FLD         F1
         FST         FCOEF           < A PRIORI, ON DONNE A 'FCOEF' LA VALEUR
                                     < DE MODULATION MAX...
         LBY         &AREP           < A=REPONSE...
         STZ         IECL            < IECL=0 : NON A PRIORI...
         CPI         "N"
         JE          ECL1            < NON...
         IC          IECL            < IECL=1 : OUI A PRIORI...
         CPI         "O"
         JNE         ECLAIR          < ?!!??!!
<
< SI OUI, ON RENTRE LES COORDONNEES DE LA SOURCE :
<
ECL2:    EQU         $
         BSR         APIHEX
         JNE         ECL2            < ERREUR...
         STA         SX              < X(SOURCE)...
ECL3:    EQU         $
         BSR         APIHEX
         JNE         ECL3            < ERREUR...
         STA         SY              < Y(SOURCE)...
ECL4:    EQU         $
         BSR         APIHEX
         JNE         ECL4            < ERREUR...
         STA         SZ              < Z(SOURCE)...
ECL1:    EQU         $
<
<
<        I N T E R P O L A T I O N   A N T I - A L I A S I N G  :
<
<
ALIAS1:  EQU         $
         BSR         APIN            < ENTREE DE O/N...
         STZ         IALIAS          < IALIAS=0 : "N" A PRIORI...
         CPI         "N"
         JE          ALIAS2          < "N"...
         CPI         "R"
         JNE         ALIAS3          < NON...
         DC          IALIAS          < OUI : IALIAS=-1 (<0), ON COMPRIMERA
                                     < ENTRE LE ROUGE ET LE BLANC...
         JMP         ALIAS2          < ET C'EST TOUT...
ALIAS3:  EQU         $
         CPI         "O"
         JNE         ALIAS1          < ??!????!
         IC          IALIAS          < IALIAS=1 : "O"...
                                     < (ON PRENDRA TOUS LES NIVEAUX DU NOIR
                                     < AU BLANC...)
ALIAS2:  EQU         $
<
< DOIT-ON TRACER INTERIEUR ET EXTERIEUR ???
<
EINT1:   EQU         $
         BSR         APIN            < (A)=REPONSE,
         STZ         IINT            < IINT=0 : INTERIEUR ET EXTERIEUR A PRIORI,
         CPI         "O"             < ALORS ???
         JE          EINT2           < OUI, INTERIEUR ET EXTERIEUR...
         CPI         "N"             < NON, ALORS ???
         JNE         EINT1           < ?!???!?!
         IC          IINT            < IINT=1 : EXTERIEUR UNIQUEMENT...
EINT2:   EQU         $
<
< INVERSION DE LA NORMALE ???
<
ENORM1:  EQU         $
         BSR         APIN            < (A)=REPONSE :
         LBI         1               < "P" (POSITIF) A PRIORI...
         CPI         "P"
         JE          ENORM2          < OUI, POSITIF...
         CPI         "N"
         JNE         ENORM1          < ????!??!!?
         NGR         B,B             < "N" (NEGATIF) : ON INVERSE...
ENORM2:  EQU         $
         LR          B,A
         BSR         AFLT
         FST         FKN             < FKN=+1 ("P"),
                                     <    =-1 ("N").
<
< TRAITEMENT DES COSINUS :
<
ECOS1:   EQU         $
         BSR         APIN            < (A)=REPONSE :
         STZ         ICOS            < ICOS=0 : A PRIORI, MODE NORMALE...
         CPI         "N"             < NORMAL ???
         JE          ECOS2           < OUI, ICOS=0...
         CPI         "A"             < VALEUR ABSOLUE ???
         JNE         ECOS1           < ?!??!???!
         IC          ICOS            < ICOS=1 : VALEUR ABSOLUE...
ECOS2:   EQU         $
<
< SORTIE :
<
CVP1:    EQU         $
         BR          ALOOP           < VERS L'INTERROGATION...
         PAGE
<
<
<        E N T R E E   D E S   T R A N C H E S
<        A   ' X ' ,   ' Y '   O U   ' Z '   C O N S T A N T  :
<
<
TRANCH:  EQU         $
         LAD         TRANCM
         BSR         AIFLOS          < AMPLIFICATEUR DES NIVEAUX...
         LAD         TRANCX
         BSR         AIFLOS          < TRANCHE X,
         LAD         TRANCY
         BSR         AIFLOS          < TRANCHE Y,
         LAD         TRANCZ
         BSR         AIFLOS          < TRANCHE Z.
         BR          ALOOP           < VERS L'INTERROGATION...
         PAGE
<
<
<        D E F I N I T I O N   D E S   T R A C E S
<                    A N A G L Y P H I Q U E S  :
<
<
         IF          XOPT03-XXXOUI,XOPT3,,XOPT3
DANAG:   EQU         $
         LAD         FANAG
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE 'FANAG'.
         LAD         PANAG
         BSR         AIFLOS          < ENTREE DU PLAN DE CONVERGENCE DES YEUX.
         BR          ALOOP           < VERS L'INTERROGATION...
XOPT3:   VAL         0
         IF          XOPT03-XXXNON,XOPT3,,XOPT3
DANAG:   EQU         ERROR
XOPT3:   VAL         0
         PAGE
<
<
<        E N T R E E   D E   L ' E X P O S A N T   D U   C O S I N U S  :
<
<
IEXCOS:  EQU         $
IEXCO1:  EQU         $
         BSR         APIHEX          < ENTREE D'UNE VALEUR ENTIERE :
         JNE         IEXCO1          < ERREUR...
         JALE        IEXCO1          < ELLE DOIT ETRE STRICTEMENT POSITIVE...
         STA         EXCOS           < OK...
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        F A U T - I L   I N T E R P O L E R   S U R   L E S
<                    C A R R E S   D E   B A S E
<        E T   D E   L A   F O N C T I O N  :
<
<
RAPIDE:  EQU         $
<
< MODE RAPIDE, OU INTERPOLATION
< SUR LE CARRE DE BASE :
<
RAPID1:  EQU         $
         BSR         APIN            < (A)=REPONSE :
         STZ         IINTER          < IINTER=0 : OUI A PRIORI...
         CPI         "O"             < ???
         JE          RAPID2          < ON INTERPOLE, C'EST LE MODE LENT...
         CPI         "N"             < ???
         JNE         RAPID1          < ?!??!??!?!
         IC          IINTER          < IINTER=1 : ON N'INTERPOLE PAS, C'EST
                                     < LE MODE RAPIDE... (PLEIN DE TROUS)
RAPID2:  EQU         $
<
< FAUT-IL CALCULER SYSTEMA-
< TIQUEMENT LA FONCTION, OU
< BIEN L'INTERPOLER :
<
RAPID3:  EQU         $
         BSR         APIN            < (A)=REPONSE :
         STZ         INTER2          < INTER2=0 : "N" A PRIORI...
         LXI         XVARU           < POUR 'YVARU',
         LYI         XVARV           < ET 'YVARV'...
         CPI         "N"             < ???
         JE          RAPID4          < =0 : ON CALCULERA LA FONCTION SYSTE-
                                     <      MATIQUEMENT...
         CPI         "O"             < ???
         JNE         RAPID3          < ?!????!?
         IC          INTER2          < INTER2=1 : "O", ON INTERPOLERA LA
                                     < FONCTION DANS LE CARRE DE BASE...
         LXI         XFINCU          < POUR 'YVARU',
         LYI         XFINCV          < ET 'YVARV'...
RAPID4:  EQU         $
         STX         YVARU           < 'YVARU' ET 'YVARV' SONT
         STY         YVARV           < FONCTION DE 'INTER2'...
         BR          ALOOP           < ET RETOUR A L'INTERROGATION...
         PAGE
<
<
<        P O S I T I O N   D E   L ' O B S E R V A T E U R  :
<
<
OBS:     EQU         $
OBS1:    EQU         $
         BSR         APIHEX
         JNE         OBS1            < ERREUR...
         STA         OX              < X(OBSERVATEUR).
OBS2:    EQU         $
         BSR         APIHEX
         JNE         OBS2            < ERREUR...
         STA         OY              < Y(OBSERVATEUR).
OBS3:    EQU         $
         BSR         APIHEX
         JNE         OBS3            < ERREUR...
         STA         OZ              < Z(OBSERVATEUR).
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        E N T R E E   D E   M ( I , J )  :
<
<
<        ARGUMENT :
<                    A = ADRESSE DU MESSAGE POUR 'TW',
<                        NUMERO DE L'ELEMENT POUR 'TX'.
<
<
<        RESULTAT :
<                    A,B = COEFFICIENT EN FLOTTANT.
<
<
PTRANS:  EQU         $
         PSR         X,Y
         LR          A,X             < SAVE LE NUMERO DE L'ELEMENT,
         SLRD        NBRHEX
         ORI         "0"             < CONVERSION ASCI DU NUMERO,
         SLLS        NBRHEX
XWOR%:   VAL         -NBRHEX
         ORI         "0">XWOR%       < SUITE...
         SLLD        NBRHEX
         LR          X,A
         ADRI        -'11,A
         SLRD        NBRHEX
         LR          A,X
         ADR         A,A
         ADR         A,X             < X=TRIPLE DU PREMIER CHIFFRE,
         LAI         0
         SLLD        NBRHEX
         ADR         A,X             < X=CONVERSION LINEAIRE DU NUMERO DE
                                     < L'ELEMENT : 11 --> 0, 12 --> 1,...
         ADR         X,X             < ET ON DOUBLE CAR IL S'AGIT D'UNE
                                     < MATRICE FLOTTANTE...
PTRAN1:  EQU         $
         BSR         APIHEX          < ET CONVERSION...
         JNE         PTRAN1          < ERREUR...
         LR          A,Y             < Y=NUMERATEUR...
         BSR         APIHEX          < ET CONVERSION...
         JNE         PTRAN1          < ERREUR...
         BSR         AFLT
         BSR         ASFWOR          < SAUVEGARDE DU DENOMINATEUR...
         LR          Y,A
         BSR         AFLT            < CALCUL DU NUMERATEUR,
         FDV         FWORK           < (A,B)=NUMERATEUR/DENOMINATEUR.
         FST         &AM             < QUE L'ON RANGE DANS LA MATRICE...
         PLR         X,Y
         RSR
         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 ???
<
<
TRANSM:  EQU         $
         BSR         APIN            < ENTREE DE LA REPONSE :
         STZ         ITRANS          < NON A PRIORI...
         CPI         "N"
         JE          PIC4            < "NON"...
         IC          ITRANS          < OUI A PRIORI...
         CPI         "O"
         JNE         TRANSM          < ????!?!?
         LAI         '11
         BSR         APTRAN          < ENTREE DE M11,
         LAI         '12
         BSR         APTRAN          < ENTREE DE M12,
         LAI         '13
         BSR         APTRAN          < ENTREE DE M13,
         LAI         '21
         BSR         APTRAN          < ENTREE DE M21,
         LAI         '22
         BSR         APTRAN          < ENTREE DE M22,
         LAI         '23
         BSR         APTRAN          < ENTREE DE M23,
         LAI         '31
         BSR         APTRAN          < ENTREE DE M31,
         LAI         '32
         BSR         APTRAN          < ENTREE DE M32,
         LAI         '33
         BSR         APTRAN          < ENTREE DE M33.
PIC1:    EQU         $
         BSR         APIHEX
         JNE         PIC1            < ????!
         BSR         AFLT
         FST         KRX             < ENTREE DE KRX,
PIC2:    EQU         $
         BSR         APIHEX
         JNE         PIC2            < ??!!!!
         BSR         AFLT
         FST         KRY             < ENTREE DE KRY,
PIC3:    EQU         $
         BSR         APIHEX
         JNE         PIC3            < ??!??!
         BSR         AFLT
         FST         KRZ             < ENTREE DE KRZ.
<
< SORTIE :
<
PIC4:    EQU         $
         BR          ALOOP           < ???!?!
         PAGE
<
<
<        C H O I X   D U   M O D E   D E   P R O J E C T I O N  :
<
<
PROJE:   EQU         $
         BSR         APIN            < ENTREE DU MODE :
                                     < 0 : PAR COST,SINT ;
                                     < 1 : EN PERSPECTIVE.
         ADRI        -"0",A
         JAL         PROJE           < ERREUR...
         CPI         1
         JG          PROJE           < ERREUR...
         STA         IPROJ           < RANGEMENT DU MODE...
         JAE         PROJE2          < PAR COST,SINT...
PROJE1:  EQU         $               < EN PERSPECTIVE...
         BSR         APIHEX          < ENTREE DE PZ.
         JNE         PROJE1          < ERREUR...
         BSR         AFLT
         FST         PZ              < PZ=POSITION DE L'ECRAN.
PROJE2:  EQU         $
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        E N T R E E   D U   C O S T  :
<
<
<        FONCTION :
<                      ON PEUT CHANGER LE 'COST' DE
<                    LA PROJECTION MODE 0, ET PAR
<                    EXEMPLE PASSER DE COS(30)=0.86602
<                    QUI EST LA VALEUR IMPLICITE A
<                    0.5 QUI ASSURE LA COMPATIBILITE
<                    AVEC 'GR'/'GT'...
<
<
INCOST:  EQU         $
         LAD         COST            < CE QUI DONNE 'COST'...
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         BR          ALOOP           < ET C'EST TOUT, POURQUOI S'EN PRIVER...
         PAGE
<
<
<        E N T R E E   D E   ' S C A L D '  :
<
<
<        FONCTION :
<                      DANS DES CAS TRES VICIEUX,
<                    LA PLUS GRANDE DIAGONALE DE
<                    LA TRNSFORMEE DU CARRE DE BASE
<                    PEUT ETRE SOUS-ESTIMEE ; DANS
<                    CES CONDITIONS, ON PEUT LA
<                    MODIFIER PAR LE FACTEUR 'SCALD'...
<
<
PSCALD:  EQU         $
         LAD         SCALD           < CE QUI DONNE 'SCALD'...
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         BR          ALOOP           < FACILE, N'EST-IL PAS ???
         PAGE
<
<
<        E N T R E E   D U   S O U S - E C H A N T I L L O N N A G E  :
<
<
SOUSEC:  EQU         $
SOUSE1:  EQU         $
         BSR         AIFLOT
         FCAM        F1
         JL          SOUSE1          < ERREUR...
         FST         FDELX           < PAS SUR OX...
SOUSE2:  EQU         $
         BSR         AIFLOT
         FCAM        F1
         JL          SOUSE2          < ERREUR...
         FST         FDELY           < PAS SUR OY...
SOUSE3:  EQU         $
         BSR         AIFLOT
         JLE         SOUSE3          < ERREUR...
         FST         FKDEL           < MULTIPLICATEUR DE 'FDELX' ET 'FDELY'...
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
         IF          XOPT05-XXX512,XOPT5,,XOPT5
<
<
<        C H O I X   V R A I / F A U X   5 1 2  :
<
<
PDEF:    EQU         $
<
< ENTREE DU MODE CHOISI :
<
PDEF3:   EQU         $
         BSR         APIN            < ENTREE DU CHOIX QUI A ETE FAIT :
         ADRI        -"0",A          < DECODAGE BINAIRE,
         JAL         PDEF3           < BERKKK...
         CPI         XDEF2           < VALIDATION SUPERIEURE...
         JG          PDEF3           < RE-BERKKK....
         IF          XDEF1-K,,XWOR%,
         IF          ATTENTION : CES VALIDATIONS SONT INSUFFISANTES !!!
XWOR%:   VAL         0
         STA         IDEF            < MEMORISATION DU MODE DEMANDE.
<
< PREPARATION DE L'ECHANTILLONNAGE :
<
         FLD         F1              < FAUX 512 A PRIORI...
         CPZ         IDEF            < ALORS ???
         JE          PDEF1           < FAUX 512...
         FLD         F05             < VRAI 512...
PDEF1:   EQU         $
         FST         FDELX           < FDELX=1 SI FAUX 512,
                                     <      =1/2 SI VRAI 512.
         FST         FDELY           < FDELY=1 SI FAUX 512,
                                     <      =1/2 SI VRAI 512.
         FLD         F1
         FDV         FDELX           < (OU 'FDELY'...)
         FST         FKDEL           < FKDEL=1 SI FAUX 512,
                                     <     =2 SI VRAI 512.
         BR          ALOOP           < VERS LA COMMANDE SUIVANTE...
XOPT5:   VAL         0
         IF          XOPT05-XXX256,XOPT5,,XOPT5
PDEF:    EQU         ERROR
XOPT5:   VAL         0
         PAGE
<
<
<        E N T R E E   D ' U N   N O M B R E   H E X A D E C I M A L
<                    E T   C O N V E R S I O N  :
<
<
<        ARGUMENT :
<                    A=ADRESSE D'UN MESSAGE SI 'PIHEX'.
<
<
<        RESULTAT :
<                    VOIR 'HEX'...
<
<
IHEX:    EQU         $
         LAD         DEMHEX
         BSR         AENTER
         BSR         AHEX            < A=NOMBRE HEXADECIMAL, ET CODES CONDITION.
         RSR
         PAGE
<
<
<        E N T R E E   D ' U N E   C O N S T A N T E   F L O T T A N T E  :
<
<
<        RESULTAT :
<                    A,B=CONSTANTE FLOTTANTE.
<                    INDICATEURS POSITIONNES PAR 'FCAZ'.
<
<
IFLOT:   EQU         $
         PSR         X,Y
IFLOT1:  EQU         $
         BSR         APIHEX          < ENTREE DU NUMERATEUR,
         JNE         IFLOT1          < ERREUR...
         LR          A,Y             < Y=NUMERATEUR.
         BSR         APIHEX          < ENTREE DU DENOMINATEUR,
         JNE         IFLOT1          < ERREUR...
         JAE         IFLOT1          < IL NE PEUT ETRE NUL !!!
         BSR         AFLT
         BSR         ASFWOR          < DENOMINATEUR,
         LR          Y,A
         BSR         AFLT            < NUMERATEUR,
         FDV         FWORK           < RESULTAT=NUMERATEUR/DENOMINATEUR.
         BSR         AFCAZ           < ????
         PLR         X,Y
         RSR
<
<
<        E N T R E E   D ' U N E   C O N S T A N T E   F L O T T A N T E
<                    D E   N O M   D O N N E  :
<
<
<        ARGUMENT :
<                    (A)=ADRESSE DE LA CONSTANTE.
<
<
IFLOS:   EQU         $
         PSR         W
         LR          A,W             < (W)=ADRESSE DE LA COSTANTE FLOTTANTE.
         BSR         AIFLOT          < (A,B)=CONSTANTE FLOTTANTE,
         FST         0,W             < QUE L'ON RANGE A L'ADRESSE ARGUMENT...
         PLR         W
         RSR
         PAGE
<
<
<        E N T R E E   D E   L A   C O N S T A N T E   ' K '
<
<
INFK:    EQU         $
         BSR         AIFLOT          < ENTREE DE FK...
         JLE         INFK            < 'K' DOIT ETRE STRICTEMENT POSITIVE...
         FST         FK              < OK...
         BR          ALOOP
         PAGE
<
<
<        C O N S T A N T E   D E   D E R I V A T I O N  :
<
<
<        ATTENTION :
<                      ON RENTRE LA FRACTION XXXX/YYYY ;
<                    DEUX CAS SE RENCONTRENT ALORS :
<                    XXXX/YYYY>0 : FH=XXXX/YYYY,
<                    XXXX/YYYY<0 : FH=FKH*FPAS RECALCULEE POUR
<                                  CHAQUE CARRE DE BASE.
<
<
CDER:    EQU         $
         BSR         AIFLOT          < ENTREE DE H :
         STZ         IDERIV          < IDERIV=0 A PRIORI...
         BSR         AFCAZ           < QUE VAUT LE NOMBRE FLOTTANT ENTRE ???
         JE          CDER            < NUL, ERREUR...
         JG          CDER2           < POSITIF, FH=XXXX/YYYY...
         BSR         AFNEG           < NEGATIF,
         FST         FKH             < FKH=-XXXX/YYYY ET IDERIV=0.
         JMP         CDER1           < 'FH' SERA RECALCULE SYSTEMATIQUEMENT...
CDER2:   EQU         $
         IC          IDERIV          < 'FH' A PRIORI : IDERIV=1#0...
         FST         FHU             < CE QUI DONNE 'FHU',
         BSR         ASFWOR
         FDV         FHEPS
         FAD         FWORK
         FST         FHV             < FHV=FHU+(FHU/10)...
CDER1:   EQU         $
         BR          ALOOP
         PAGE
<
<
<        E N T R E E   D ' U N E   C O N S T A N T E
<                    D E   T R A V A I L  :
<
<
GCT:     EQU         $
         BSR         AIHEX           < ENTREE DU NUMERO :
         JNE         GCT             < ERREUR...
         JAL         GCT             < ERREUR...
         CPI         NCT
         JGE         GCT             < ERREUR...
         ADR         A,A
         LR          A,X             < X=INDEX DOUBLE-MOT DE LA CONSTANTE...
         LAD         &ACT
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         BR          ALOOP
         PAGE
<
<
<        <  :  D E F I N I T I O N   D E   B O R N S  :
<
<
DBORNS:  EQU         $
         BSR         AIHEX           < ENTREE DE LA BORNE SUPERIEURE :
         JNE         DBORNS          < ERREUR...
         CP          BORNI           < VALIDATION RELATIVE...
         JL          DBORNS          < ERREUR...
         STA         BORNS           < OK...
         BR          ALOOP           < ET C'EST TOUT...
<
<
<        >  :  D E F I N I T I O N   D E   B O R N I  :
<
<
DBORNI:  EQU         $
         BSR         AIHEX           < ENTREE DE LA BORNE INFERIEURE :
         JNE         DBORNI          < ERREUR...
         CP          BORNS           < VALIDATION RELATIVE...
         JG          DBORNI          < ERREUR...
         STA         BORNI           < OK...
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        D E F I N I T I O N   D U   P L A N   D E   C O U P E  :
<                    A * X + B * Y + C * Z + D = 0
<
<
         IF          XOPT01-XXXOUI,XOPT1,,XOPT1
DFPLAN:  EQU         $
         LAD         PLANA           < COEFFICIENT 'A',
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         LAD         PLANB           < COEFFICIENT 'B',
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         LAD         PLANC           < COEFFICIENT 'C',
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         LAD         PLAND           < COEFFICIENT 'D'.
         BSR         AIFLOS          < ENTREE DE LA CONSTANTE D'ADRESSE 'A'.
         BR          ALOOP           < ET C'EST TOUT...
XOPT1:   VAL         0
         IF          XOPT01-XXXNON,XOPT1,,XOPT1
DFPLAN:  EQU         ERROR
XOPT1:   VAL         0
         PAGE
<
<
<        G E S T I O N   D E   L A   T R A N S P A R E N C E  :
<
<
         IF          XOPT05-XXX256,XOPT5,,XOPT5
VITRE:   EQU         $
         BSR         AIN             < ENTREE DU NIVEAU DE GRIS "0" A "7"),
         ADRI        -"0",A          < CONVERSION...
         JAL         VITRE           < ERREUR...
         CPI         NIVMAX
         JG          VITRE           < ERREUR...
         LR          A,X             < X=NIVEAU DEMANDE,
         LB          LTRANS          < B=LISTE DES TRANSPARENCES.
         BSR         AIN             < ENTREE DE O (ON) / N (OFF) :
         CPI         "O"
         JE          VITRE1          < "ON"...
         CPI         "N"
         JNE         VITRE           < ON RECOMMENCE TOUT...
<
< SUPPRESSION DE LA TRANSPARENCE :
<
         RBT         NBITMO,X
         JMP         VITRE2
<
< MISE EN PLACE DE LA TRANSPARENCE :
<
VITRE1:  EQU         $
         SBT         NBITMO,X
VITRE2:  EQU         $
         STB         LTRANS
         BR          ALOOP
XOPT5:   VAL         0
         IF          XOPT05-XXX512,XOPT5,,XOPT5
VITRE:   EQU         ERROR           < PAS DE TRANSPARENCE EN 512*512.
XOPT5:   VAL         0
<*******************************************************************************
         JMP         JMPOVL          < ET ON SAUTE L'EN-TETE DE LA BRANCHE...
<
<
<        B R A N C H E   D ' O V E R L A Y  :
<
<
DEBOV1:  EQU         $
XWOR%1:  VAL         DEBOV1-ZERO*NOCMO
OVLTZ2:  EQU         ZERO+XWOR%1     < ADRESSE-OCTET DE LA BRANCHE...
         BYTE        " ";NOMBB
         ASCI        "    "
         BYTE        '04;'D0
XWOR%1:  VAL         ITEM2-ZERO
         IF          $-ZERO-XWOR%1,XWOR%,,
         IF          ATTENTION : LA RACINE DE L'OVERLAY EST TROP LONGUE !!!
XWOR%:   VAL         0
JMPOVL:  EQU         $
<*******************************************************************************
         PAGE
         IF          XOPT05-XXX512,XOPT5,,XOPT5
XXXIMA:  VAL         XXIMA3
         EOT         #SIP IMAGE 512#
XXXIMA:  VAL         XXIMA5
         EOT         #SIP IMAGE 512#
XOPT5:   VAL         0
         PAGE
<
<
<        E N T R E E   D E   L ' A T T R I B U T I O N
<                    D E S   N I V E A U X  :
<
<
         IF          XOPT05-XXX256,XOPT5,,XOPT5
PATNIV:  EQU         $
         LXI         0               < (X)=INDEX DES NIVEAUX,
PATNI1:  EQU         $
         BSR         AIN             < ENTREE D'UN CARACTERE DANS 'A' :
         ADRI        -"0",A          < CONVERSION BINAIRE,
         JAL         PATNI1          < ERREUR...
         CPI         NIVMAX          < ???
         JG          PATNI1          < ERREUR...
         STBY        &AATNIV         < MEMORISATION DE LA VALEUR (A) DU NIVEAU
                                     < A AFFICHER REELLEMENT LORSQUE LE NIVEAU
                                     < (X) EST CALCULE...
         ADRI        1,X             < AU NIVEAU SUIVANT,
         LR          X,A
         CPI         NIVMAX          < S'IL EXISTE ???
         JLE         PATNI1          < OUI...
         BR          ALOOP           < NON, ON SORT...
XOPT5:   VAL         0
         IF          XOPT05-XXX512,XOPT5,,XOPT5
PATNIV:  EQU         ERROR           < PAS DE REATTRIBUTION EN 512*512...
XOPT5:   VAL         0
         PAGE
<
<
<        E N V O I   D E S   C O U L E U R S  :
<
<
<        FONCTION :
<                      ON MET UN TEL MODULE DANS
<                    " +" (ANALOGUE A CELUI DE "TV")
<                    AFIN DE PERMETTRE DES CHANGEMENTS
<                    RAPIDES DE COULEURS ENTRE 2 IMAGES
<                    DIFFUSEES AVEC LA FONCTION D'ENTRE-
<                    LACAGE DE CMS5...
<
<
<        FORMAT :
<                    U<CARACTERE>XYZT OU <CARACTERE> ET LE CHIFFRE
<                    'X' SONT IGNORES AFIN D'ETRE COMPATIBLE AVEC 'TV'...
<
<
         IF          XOPT06-XXXOUI,XOPT6,,XOPT6
COLOR:   EQU         $
         BSR         AIN             < ENTREE D'UN CARACTERE QUELCONQUE...
                                     < (QUI EST IGNORE AFIN D'ETRE COMPATI-
                                     < BLE AVEC 'TV')
COLOR1:  EQU         $
         BSR         AIHEX           < ENTREE DU CODE COULEUR DANS LE STYLE
                                     < DE "TV" :
                                     < 0XYZ, OU :
                                     < X=LISTE DES CANAUX DE SORTIE DANS L'ORDRE
                                     <   B ('0400), V ('0200) ET B ('0100) ;
                                     < Y=NUMERO DU REGISTRE QUE L'ON CHARGE DE
                                     <   0 A 15 (JEUX 0 ET 1) ;
                                     < Z=NIVEAU (DU MIN=15 AU MAX=0).
         JNE         COLOR1          < ERREUR...
         AND         MASCOL          < SUPPRESSION DES 4 BITS DE TETE...
         STA         BUFCOU
         LAD         DEMCOU
         SVC         0               < ET COLORIAGE...
         BR          ALOOP           < ET C'EST TOUT...
XOPT6:   VAL         0
         IF          XOPT06-XXXNON,XOPT6,,XOPT6
COLOR:   EQU         ERROR           < PAS D'ACCES AUX 'LUT' 256 EN 512*512...
XOPT6:   VAL         0
         PAGE
<
<
<        A C C E S   A   T V 2  :
<
<
STV2:    EQU         $
         LRM         A,B,X
         WORD        TV2
         WORD        IMAGE
         WORD        LIMAG*NCOOL
         WCDA
         BR          ALOOP
GTV2:    EQU         $
         LRM         A,B,X
         WORD        TV2
         WORD        IMAGE
         WORD        LIMAG*NCOOL
         RCDA
         BR          ALOOP
         PAGE
<
<
<        E N T R E E   D E   Q U E L Q U E   C H O S E  :
<
<
<        ARGUMENT :
<                    A=ADRESSE DE LA DEMANDE.
<
<
ENTER:   EQU         $
         PSR         A,X,Y,W
         LR          A,W             < W=ADRESSE DE LA DEMANDE :
         LA          1,W             < A=ADRESSE OCTET DU BUFFER,
         LYI         0               < Y=INDEX DU BUFFER,
         SLRS        NOCMO=0         < CONVERSION EN UNE ADRESSE MOT,
         ADCR        Y               < Y=INDEX INITIAL DU BUFFER COURANT.
         SBT         0               < MISE EN PLACE DU BIT INDEX,
         STA         ABUFC           < ET GENERATION DU RELAI VERS LE BUFFER.
         LX          2,W             < X=NOMBRE D'OCTETS MAX A DEPLACER...
ENTER2:  EQU         $
         PSR         X
         LA          IEG             < A=INDEX COURANT DE L'ITEM1,
         CP          NCP             < ET VALIDATION ???
         JL          ENTER3          < OK...
         BR          AALTM           < NON, ON FAIT COMME SI UN ALT-MODE
                                     < ETAIT ARRIVE...
ENTER3:  EQU         $
         IC          IEG             < PROGRESSION DE L'INDEX DE L'ITEM1.
         LR          A,X             < X=INDEX D'ACCES A L'ITEM1,
         LBY         &AI1            < A=CARACTERE COURANT DE L'ITEM1,
         CPI         " "             < EST-CE L'ELEMENT NEUTRE ???
         JNE         ENTER6          < NON...
         PLR         X               < OUI,
         LR          X,A
         CP          2,W             < EST-ON EN TETE DU MESSAGE ???
         JE          ENTER2          < OUI, ON IGNORE LE 'SPACE'...
         PSR         X               < NON, ON LE CONSERVE...
         LAI         " "             < RESTAURATION DE 'A'...
ENTER6:  EQU         $
         CPI         ";"             < EST-CE LA FIN DE MESSAGE ???
         JNE         ENTER4          < NON,
         LAI         '04             < OUI, ON LE REMPLACE PAR 'EOT'...
ENTER4:  EQU         $
         LR          Y,X
         STBY        &ABUFC          < ET RANGEMENT DANS LE BUFFER...
         ADRI        1,Y             < PROGRESSION DE L'INDEX BUFFER.
         PLR         X
         CPI         '04             < EST-CE UNE FIN DE MESSAGE ???
         JE          ENTER5          < OUI, ON ARRETE LA...
         JDX         ENTER2          < NON, ON CONTINUE...
ENTER5:  EQU         $
         PLR         A,X,Y,W
         RSR
         PAGE
<
<
<        C O N V E R S I O N   H E X A   -->   B I N A I R E  :
<
<
<        ARGUMENT :
<                    LE BUFFER 'REP'.
<
<
<        RESULTAT :
<                    B=0 : (A)=VALEUR BINAIRE,
<                    B#0 : ERREUR DE SYNTAXE HEXA-DECIMALE.
<                    LES INDICATEURS POSITIONNES SUR (B).
<
<
HEX:     EQU         $
BASE10:  VAL         10
BASE16:  VAL         16
         PSR         X,Y
         LYI         NBRHEX
         LXI         0               < INDEX DU BUFFER DE REPONSE.
         LBI         0               < CLEAR LE REGISTRE B.
HEX1:    EQU         $
         LBY         &AREPX          < A=CARACTERE COURANT DU BUFFER.
         ADRI        -"0",A
         JAL         HEX4            < ERREUR : CARACTERE NON RECONNU.
         CPI         BASE10          < EST-CE UN CHIFFRE ???
         JL          HEX2            < OUI , C'EST UN CHIFFRE.
         ADRI        -"A"+"9"+1,A    < NON.
         CPI         BASE10          < VALIDATION.
         JL          HEX4            < ERREUR : CARACTERE NON RECONNU.
         CPI         BASE16          < VALIDATION.
         JGE         HEX4            < ERREUR : CARACTERE NON RECONNU.
HEX2:    EQU         $
         SCRS        NBITMO/NBRHEX   < MISE DES 4 BITS EN TETE DE A.
         SCLD        NBITMO/NBRHEX   < ET CONCATENATION A B.
         ADRI        1,X             < PROGRESSION DE L'INDEX.
         CPR         X,Y             < EST-CE FINI ???
         JNE         HEX1            < NON , ON CONTINUE.
         LR          B,A             < A=VALEUR BINAIRE DE (REP).
         LBI         0               < B=0 : ETOUR OK.
HEX3:    EQU         $
         PLR         X,Y
         CPZR        B               < POSITIONNEMENT DES INDICATEURS.
         RSR
<
< RETOURS EN ERREUR :
<
HEX4:    EQU         $
         LR          B,A             < A=VALEUR COURANTE...
         LBI         1               < B#0.
         JMP         HEX3            < VERS LA SORTIE ...
         PAGE
<
<
<        E N V O I   D ' U N E   C A R T E   A U   C C I  :
<
<
<        ARGUMENT :
<                    A=ADRESSE MOT DE LA CARTE.
<
<
CCI:     EQU         $
         ADR         A,A             < CONVERSION EN UNE ADRESSE OCTET.
         STA         DEMCC+1
         LAD         DEMCC
         SVC         0               < ET ENVOI DE LA CARTE...
         RSR
         PAGE
<
<
<        M O U V E M E N T S   R E S I D E N T  <-->  T V  :
<
<
MOV0:    EQU         $               < RESIDENT R+V+B --> TV.
         LAD         DEMTV0
         SVC         0               < BLEU.
         BR          ALOOP
MOV4:    EQU         $               < TV R+V+B --> RESIDENT.
         LRM         A,B,X
         WORD        TV1
         WORD        IMAGE
         WORD        LIMAG*NCOOL
         RCDA
         BR          ALOOP
         PAGE
<
<
<        A C C E S   A U   Z - B U F F E R  :
<
<
<        UTILISATION DES REGISTRES :
<                    A=ADRESSE D'UN MOT DANS LE Z-BUFFER (YS/XS),
<                    B=INFORMATION (INT(FZS)) A Y METTRE, OU RESULTAT...
<                    Y=YLOAD/YSTORE SUIVANT LE SENS...
<                    TRZBUF=-1 : UN MOT PAR ENTREE,
<                          =0  : 2 MOTS/ENTREE, ET ON RECHERCHE LE MOT0,
<                          =+1 : 2 MOTS/ENTREE, ET ON RECHERCHE LE MOT1.
<
<
GZB:     EQU         $
         STB         MCDAR           < AU CAS OU CE SERAIT 'YSTORE'...
         PSR         A,X,W
         LBI         0
         LXI         LEZBUF=0
         CPZ         TRZBUF          < UN OU DEUX MOTS PAR ENTREE ???
         SBCR        X               < X=0 : 1 MOT/ENTREE (TRZBUF<0),
                                     < X=1 : 2 MOTS PAR ENTREE (TRZBUF>=0).
XWOR%1:  VAL         LIZBUF=0
         SCLD        NBITMO-XWOR%1,X < B=NUMERO DE BLOC,
         SLRS        NBITMO-XWOR%1,X < A=ADRESSE DANS LE BLOC.
                                     < (L'ADRESSE EST DE MOT SI (X)=0,
                                     < OU DE DOUBLE-MOT SI (X)=1)
         CPZ         TRZBUF          < 1 OU 2 MOTS PAR ENTREE ???
         JL          GZB0            < 1 SEUL, (A) EST BON...
         SLLS        0,X             < CONVERSION EN UNE ADRESSE-MOT,
         AD          TRZBUF          < 2, IL FAUT AJOUTER LE NUMERO DU MOT
                                     < CHOISI POUR AVOIR SON ADRESSE...
GZB0:    EQU         $
         XR          A,B             < A=NUMERO DE BLOC, B=ADRESSE DANS LE BLOC.
         USE         W,DZBUF
         LRM         W
         WORD        BUF1            < (W)=DESCRIPTEUR DU PREMIER BUFFER :
         CP          SDKU            < EST-ON DANS LE PREMIER BUFFER ???
         JE          GZB2            < OUI...
         ADRI        LDZBUF,W        < NON,
         CP          SDKU            < EST-ON DANS LE DEUXIEME ???
         JE          GZB2            < OUI...
<
< REECRITURE DU BLOC COURANT LORSQU'IL A ETE MODIFIE :
<
         PSR         A,B             < SAVE LE BLOC DEMANDE ET LE DEPLACEMENT.
         LA          BAGE02          < TEST DES POIDS FORTS DE L'AGE :
         CP          BAGE02-DZBUF-LDZBUF,W
         JG          GZB7            < LE DEUXIEME EST LE PLUS VIEUX, ON
                                     < L'ELIMINE...
         JL          GZB10           < LE PREMIER, ON L'ELIMINE...
XWOR%1:  VAL         1               < ON DOUTE : IL FAUT TESTER LES POIDS
                                     < FAIBLES, MAIS ATTENTION AUX NOMBRES
                                     < NEGATIFS...
         LA          BAGE01-DZBUF-LDZBUF,W
         SLRD        NBITMO+XWOR%1   < (B)=POIDS FAIBLES DE L'AGE DU PREMIER/2.
         LA          BAGE01
         SLRS        XWOR%1          < (A)=POIDS FAIBLES DE L'AGE DU SECOND/2,
         SBR         B,A             < ALORS QUI EST LE PLUS VIEUX ???
                                     < (A)=(AGE2-AGE1)/2.
         JAG         GZB7            < LE DEUXIEME, ON L'ELIMINE...
GZB10:   EQU         $
         ADRI        -LDZBUF,W       < LE PREMIER, ON L'ELIMINE...
GZB7:    EQU         $
         STZ         BAGE01
         STZ         BAGE02          < ON RAJEUNIT LE BLOC QUE L'ON ELIMINE...
         BSR         ASPDKU          < ECRITURE DU BLOC COURANT S'IL EXISTE
                                     < ET S'IL A ETE MODIFIE...
         PLR         A,B             < RESTAURE LE BLOC DEMANDE ET LE DEPLACE-
                                     < MENT A L'INTERIEUR...
<
< LECTURE DU BLOC DEMANDE :
<
GZB3:    EQU         $
         STA         SDKU            < NOUVEAU BLOC COURANT,
         STZ         MDKU            < PAS ENCORE MODIFIE...
XWOR%1:  VAL         NSDKU=0
         SLLS        XWOR%1          < CONVERSION EN UNE ADRESSE DKU...
         STA         RDKU+3
         LAD         RDKU
         SVC         0               < LECTURE DU BLOC DEMANDE...
<
< ACCES AU MOT DEMANDE :
<
GZB2:    EQU         $
         LA          BADR            < (A)=ADRESSE DU BUFFER,
         ADR         A,B             < B=ADRESSE DU MOT DEMANDE DANS LA 'CDAI'.
         LAD         MCDAR
         XR          A,B             < A=ADRESSE DU MOT DANS LA 'CDAI',
                                     < B=ADRESSE DU MOT OU RANGER/PRENDRE
                                     <   L'INFORMATION.
         LXI         1               < X=1 MOT A TRANSFERER...
         CPZR        Y               < QUEL EST LE SENS DE L'OPERATION ???
         JE          GZB4            < LOAD...
         IC          MDKU            < STORE : DANS CE CAS, ON COMPTABILISE
                                     < LA MISE A JOUR...
         JNE         GZB9            < OK...
         QUIT        1               < PASSAGE PAR 0... TRES MAUVAIS... PASSER
                                     < SUR DOUBLE MOT COMME POUR 'BAGE'...
GZB9:    EQU         $
         WCDA
         JMP         GZB5
GZB4:    EQU         $
         RCDA
GZB5:    EQU         $
         IC          BAGE11          < LES 2 BUFFERS VONT VIEILLIR ENSEMBLE :
         JNE         GZB1            < OK...
         IC          BAGE12          < POIDS FORTS...
GZB1:    EQU         $
         IC          BAGE21          < POIDS FAIBLES...
         JNE         GZB8            < OK...
         IC          BAGE22          < POIDS FORTS...
GZB8:    EQU         $
         LB          MCDAR           < QUELQUE SOIT LE MODE 'B' EST BON...
         PLR         A,X,W
         RSR
<
<
<        E C R I T U R E   B L O C   C O U R A N T  :
<
<
SPDKU:   EQU         $
         LA          SDKU            < A=BLOC COURANT...
XWOR%1:  VAL         NSDKU=0
         IF          BIT>XWOR%1-NSDKU,,XWOR%,
         IF          ATTENTION : NSDKU DOIT ETRE UNE PUISSANCE DE 2 !!!
XWOR%:   VAL         0
         SLLS        XWOR%1          < CONVERSION EN UNE ADRESSE SUR DKU...
         STA         WDKU+3
         LA          BADR            < (A)=ADRESSE MOT DU BUFFER,
         SLLS        NOCMO=0
         STA         WDKU+1          < QUE L'ON CONVERTIT EN OCTET POUR
         STA         RDKU+1          < L'ECRITURE ET LA LECTURE...
         CPZ         SDKU            < EN FAIT, LE BLOC EXISTE-T'IL ???
         JL          GZB6            < NON, RIEN A FAIRE...
         CPZ         MDKU            < OUI, MAIS A-T'IL ETE MODIFIE ???
         JE          GZB6            < NON, RIEN A ECRIRE NON PLUS...
         LAD         WDKU
         SVC         0               < REECRITURE DU BLOC COURANT...
         JE          GZB6            < OK...
         QUIT        1               < DKU ?!??!??!!!
GZB6:    EQU         $
         RSR
         PAGE
<
<
<        A R R O N D I   F L O T T A N T  :
<
<
ROND:    EQU         $
         JAL         ROND1           < NOMBRE NEGATIF...
         FAD         F05             < NOMBRE POSITIF...
         JMP         ROND2
ROND1:   EQU         $
         FSB         F05
ROND2:   EQU         $
         BSR         AFIX
         RSR
         PAGE
<
<
<        ' F A B S ' ,   ' F C A Z ' ,   ' F I X ' ,   ' F L T '
<                    E T   ' F N E G '   F L O T T A N T S ,
<                    E T   S T O R E   ' F W O R K '  :
<
<
<        NOTA :
<                      CES SOUS-PROGRAMMES EXISTENT
<                    POUR DES RAISONS D'ENCOMBRE-
<                    MENT MEMOIRE, LES INSTRUCTIONS
<                    CORRESPONDANTES OCUPANT 2 MOTS,
<                    ALORS QU'UN 'BSR' N'EN OCCUPE
<                    QU'UN SEUL...
<
<
FABS:    EQU         $
         FABS
         RSR
FCAZ:    EQU         $
         FCAZ
         RSR
FIX:     EQU         $
         FIX
         RSR
FLT:     EQU         $
         FLT
         RSR
FNEG:    EQU         $
         FNEG
         RSR
SFWORK:  EQU         $
         FST         FWORK
         RSR
         PAGE
<
<
<        O P E R A T I O N S   I N T E R - I M A G E S  :
<
<
TRANS:   EQU         $               < APPLICATION DE M(I,J).
<
< CHARGEMENT DE L'OVERLAY ENTIER :
<
         LAD         DEMOVG
         SVC         0
<
< TRANSFORMATION :
<
         LRM         A
         WORD        SPTR
         STA         ASPTR           < ACCES AU MODULE DE TRANSFORMATION DE
                                     < CHAQUE POINT...
         BSR         ASPOP
         IF          XOPT02-XXXOUI,XOPT2,,XOPT2
<
< GENERATION PLUS FINE AVEC
< FILTRAGE EVENTUEL :
<
         CPZ         TRZBUF          < 1 OU 2 MOTS PAR ENTREE DU Z-BUFFER ???
         JL          TRANS1          < 1 SEUL, RIEN DE PLUS A FAIRE...
         IF          ZBUF1-1,,XWOR%,
         IF          ATTENTION : LE 'IC' QUI SUIT EST IDIOT !!!
XWOR%:   VAL         0
         STZ         TRZBUF
         IC          TRZBUF          < TRZBUF=1 : AFIN D'ATTEINDRE LE MOT 1
                                     < DE CHAQUE ENTREE DU Z-BUFFER...
         LA          IMASKO
         PSR         A               < SAUVEGARDE DE 'IMASKO',
         STZ         IMASKO          < ET INHIBITION DU Z-BUFFER, CAR LE MASQUE
                                     < COURANT NE CORRESPOND PLUS A L'IMAGE
                                     < GENEREE...
         LRM         A
         WORD        SPTS
         STA         ASPTR           < ACCES AU MODULE DE RELECTURE DES MOTS 1
                                     < DU Z-BUFFER SUIVANT LES PARAMETRES DE
                                     < MASQUE, D'ORIGINE,... COURANTS...
         BSR         ASPOP           < GENERATION PLUS FINE DE L'IMAGE...
         PLR         A
         STA         IMASKO          < RESTAURE 'IMASKO'...
         IF          ZBUF0-0,,XWOR%,
         IF          ATTENTION : LE 'STZ' EST IDIOT !!!
XWOR%:   VAL         0
         STZ         TRZBUF          < RETOUR AU MOT0 A PRIORI...
TRANS1:  EQU         $
XOPT2:   VAL         0
<
< RESTAURATION DE L'ITEM1 :
<
         BSR         ARITEM          < RESTAURATION DE L'ITEM1...
<
< RETOUR A L'INTERPRETEUR :
<
         BR          ALOOP
         PAGE
<
<
<        R E S T A U R A T I O N   D E   L ' I T E M 1  :
<
<
<        FONCTION :
<                      ETANT DONNE QUE L'OVERLAY
<                    REFERENCE DANS #SI FONCTION#
<                    PEUT EMETTRE UN "!CDAJ...", IL
<                    CONVIENT DE REEMETTRE UN "!CDAI"
<                    AVANT DE RESTAURER L'ITEM1...
<
<
RITEM:   EQU         $
<
< RETOUR A LA 'CDAI' :
<
         LAI         AMCDAI-ZERO
         BSR         ACCI            < RETOUR A "!CDAI", AU CAS OU UN "!CDAJ"
                                     < AURAIT ETE EMIS...
                                     < ON FAIT CELA AUSSI POUR LA RAISON
                                     < SUIVANTE : A L'ENTREE DANS " +", ON
                                     < REGARDE SI LA 'CDA' EST ACCESSIBLE ;
                                     < SI ELLE NE L'EST PAS, ON FAIT UN RETOUR
                                     < IMMEDIAT A 'GE', PAR 'GOGE' ; CE MODULE
                                     < APPELLE LE SOUS-PROGRAMME PRESENT (SOIT
                                     < 'RITEM') : OR, LA 'CDA' ETANT INACCES-
                                     < SIBLE, LE 'RCDA' QUI SUIT PROVOQUERA UNE
                                     < TRAPPE...
         JNE         RITEM1          < RIEN A FAIRE, CAR LA 'CDA' EST INAC-
                                     < CESSIBLE...
<
< RESTAURATION DE L'ITEM1 :
<
         LRM         A,B,X           < OUI :
         WORD        SAVIT1          < (A)=ADRESSE DE LA SAUVEGARDE DANS 'CDAI',
         WORD        ITEM1           < (B)=ADRESSE DE L'ITEM1 A SAUVEGARDER,
         WORD        LTNI            < (X)=LONGUEUR D'UN ITEM.
         RCDA
                                     < RESTAURATION DE L'ITEM1...
RITEM1:  EQU         $
<
< RETOUR :
<
         RSR
         PAGE
         IF          XOPT02-XXXOUI,XOPT2,,XOPT2
<
<
<        F I L T R A G E   F I N A L   D E   L ' I M A G E  :
<
<
SPTS:    EQU         $
         PSR         A,B,X,Y
         LA          YS
         SWBR        A,A
         OR          XS              < (A)=(YS,XS) POUR ACCEDER LE Z-BUFFER,
         LYI         YLOAD           < (Y)=FONCTION DE LECTURE,
         BSR         AGZB            < ACCES DANS 'B' AU MOT1 DU Z-BUFFER (A
                                     < NOTER QUE 'TRZBUF' EST DEJA POSITIONNE).
SIGPT::  VAL         NBITMO-NCOOL/2  < NOMBRE DE BITS POUR METTRE LE NOMBRE DE
                                     < POINTS EN COLLISION SUR (XS,YS),
SIGNIV:: VAL         SIGPT+NCOOL     < NOMBRE DE BITS POUR METTRE LE SIGMA
                                     < DE LEURS NIVEAUX...
         LAI         0               < CLEAR 'A'...
         SLLD        NBITMO-SIGNIV
         JAE         SPTS1           < PAS DE POINT A MARQUER EN (XS,YS)...
         PSR         B
         BSR         AFLT
         BSR         ASFWOR          < (A,B)=NOMBRE DE POINTS EN COLLISION,
         PLR         A
         SLRS        NBITMO-SIGNIV   < (A)=SIGMA DE LEURS NIVEAUX,
         BSR         AFLT
         FDV         FWORK           < (A,B)=NIVEAU MOYEN DE CES POINTS...
         BSR         AROND
         BSR         ASPRS           < QUE L'ON FORCE EN (XS,YS)...
SPTS1:   EQU         $
         PLR         A,B,X,Y
         RSR                         < ET C'EST TOUT, POURQUOI S'EN PRIVER...
         IF          $-ITEM1,XWOR%,,
         IF          ATTENTION : IL FAUT QUE TOUS LES MODULES QUI
         IF          PRECEDENT SE SITUENT AVANT L'ITEM2 ; ON PEUT
         IF          JOUER POUR CELA SUR 'NCT' !!!
XWOR%:   VAL         0
XOPT2:   VAL         0
         PAGE
<
<
<        S O U S - P R O G R A M M E   D E   T R A N S F O R M A T I O N  :
<
<
<        FONCTION :
<
<
SPTR:    EQU         $
         PSR         A,B,X,Y
<
<
<        T R A N S F O R M E E   D U   C A R R E
<        E L E M E N T A I R E   P A R   ' T '  :
<
<
         STZ         NPAS
         IC          NPAS            < NPAS=1 A PRIORI...
         STZ         INTER1          < AFIN D'INITIALISER LES 'VECU', 'VECV'
                                     < ET 'VECW'...
         FLD         INFINI
         FST         MINU            < INITIALISATION
         FST         MINV            <                DES DIFFERENTS MIN.
         BSR         AFNEG
         FST         MAXU            < INITIALISATION
         FST         MAXV            <                DES DIFFERENTS MAX.
         FLD         F0
         FST         FINCU           < AFIN D'ATTEINDRE (XR,YR)...
         FST         FINCV
         BSR         ASPGPF
         FST         FNIV1           < NIVEAU(XR,YR).
         CPZ         INTER2          < FAUT-IL INTERPOLER LA FONCTION OU BIEN
                                     < LA CALCULER EN CHAQUE POINT ???
         JNE         MODRAR          < IL FAUT INTERPOLER, DONC CALCULER
                                     < 'VECU1',...
         CPZ         IINTER          < EST-CE LE MODE RAPIDE ???
         JNE         MODRAQ          < OUI, PAS DE TRANSFORMATION DU CARRE
                                     < DE BASE...
MODRAR:  EQU         $
         BSR         ASPVU           < NON, ON Y VA...
         FST         VECU1
                                     < VECU1=TU(XR,YR).
         BSR         ASPVV
         FST         VECV1
                                     < VECV1=TV(XR,YR).
         BSR         ASPVW
         FST         VECW1
                                     < VECW1=TW(XR,YR).
         FLD         FXR             < PASSAGE AU POINT (XR+1,YR).
         FAD         FDELX
         FST         FXR
         BSR         ASPGRA
         FST         FNIV2           < NIVEAU(XR+1,YR).
         BSR         ASPVU
         FST         VECU2
                                     < VECU2=TU(XR+1,YR).
         BSR         ASPVV
         FST         VECV2
                                     < VECV2=TV(XR+1,YR).
         BSR         ASPVW
         FST         VECW2
                                     < VECW2=TW(XR+1,YR).
         FLD         FYR             < PASSAGE AU POINT (XR+1,YR+1).
         FAD         FDELY
         FST         FYR
         BSR         ASPGRA
         FST         FNIV3           < NIVEAU(XR+1,YR+1).
         BSR         ASPVU
         FST         VECU3
                                     < VECU3=TU(XR+1,YR+1).
         BSR         ASPVV
         FST         VECV3
                                     < VECV3=TV(XR+1,YR+1).
         BSR         ASPVW
         FST         VECW3
                                     < VECW3=TW(XR+1,YR+1).
         FLD         FXR             < PASSAGE AU POINT (XR,YR+1).
         FSB         FDELX
         FST         FXR
         BSR         ASPGRA
         FST         FNIV4           < NIVEAU(XR,YR+1).
         BSR         ASPVU
         FST         VECU4
                                     < VECU4=TU(XR,YR+1).
         BSR         ASPVV
         FST         VECV4
                                     < VECV4=TV(XR,YR+1).
         BSR         ASPVW
         FST         VECW4
                                     < VECW4=TW(XR,YR+1).
         FLD         FYR             < RETOUR A (XR,YR)...
         FSB         FDELY
         FST         FYR
MODRAQ:  EQU         $
         IC          INTER1          < ET VOILA, L'INITIALISATION DES
                                     < 'VECU', 'VECV' ET 'VECW' EST FAITE.
<
< ON DISPOSE MAINTENANT D'UN PARALLELEPIPEDE
< RECTANGLE DEFINI PAR L'UNE DE SES DIAGONALES
< (MINU,MINV,MINW)-(MAXU,MAXV,MAXW) :
<
         CPZ         IINTER          < NE SERAIT-CE PAS LE MODE RAPIDE ???
         JNE         MODRAP          < OUI, PAS D'INTERPOLATION...
         FLD         VECU1
         BSR         ASTXS
         FLD         VECV1
         BSR         ASTYS
         FLD         VECW1
         BSR         ASTZS
         LAD         FXS             < AFIN DE TRANSFORMER (FXS,FYS,FZS)...
         BSR         AMATR           < TRANSFORMATION MATRICIELLE,
         BSR         APROJ           < PUIS PROJECTION...
         BSR         AFLT
         BSR         AEXTV           < RECHERCHE DE MIN(YS) ET MAX(YS).
         LA          XS
         BSR         AFLT
         BSR         AEXTU           < RECHERCHE DE MIN(XS) ET MAX(XS).
         FLD         VECU2
         BSR         ASTXS
         FLD         VECV2
         BSR         ASTYS
         FLD         VECW2
         BSR         ASTZS
         LAD         FXS             < AFIN DE TRANSFORMER (FXS,FYS,FZS)...
         BSR         AMATR           < TRANSFORMATION MATRICIELLE,
         BSR         APROJ           < PUIS PROJECTION...
         BSR         AFLT
         BSR         AEXTV           < RECHERCHE DE MIN(YS) ET MAX(YS).
         LA          XS
         BSR         AFLT
         BSR         AEXTU           < RECHERCHE DE MIN(XS) ET MAX(XS).
         FLD         VECU3
         BSR         ASTXS
         FLD         VECV3
         BSR         ASTYS
         FLD         VECW3
         BSR         ASTZS
         LAD         FXS             < AFIN DE TRANSFORMER (FXS,FYS,FZS)...
         BSR         AMATR           < TRANSFORMATION MATRICIELLE,
         BSR         APROJ           < PUIS PROJECTION...
         BSR         AFLT
         BSR         AEXTV           < RECHERCHE DE MIN(YS) ET MAX(YS).
         LA          XS
         BSR         AFLT
         BSR         AEXTU           < RECHERCHE DE MIN(XS) ET MAX(XS).
         FLD         VECU4
         BSR         ASTXS
         FLD         VECV4
         BSR         ASTYS
         FLD         VECW4
         BSR         ASTZS
         LAD         FXS             < AFIN DE TRANSFORMER (FXS,FYS,FZS)...
         BSR         AMATR           < TRANSFORMATION MATRICIELLE,
         BSR         APROJ           < PUIS PROJECTION...
         BSR         AFLT
         BSR         AEXTV           < RECHERCHE DE MIN(YS) ET MAX(YS).
         LA          XS
         BSR         AFLT
         BSR         AEXTU           < RECHERCHE DE MIN(XS) ET MAX(XS).
         FLD         MAXU
         FSB         MINU
         BSR         ASFWOR
         FMP         FWORK
         FST         FWORK1
         FLD         MAXV
         FSB         MINV
         BSR         ASFWOR
         FMP         FWORK
         FAD         FWORK1          < (A,B)=CARRE DE SA PLUS GRANDE DIAGONALE.
         BSR         ARAC            < CALCUL DE LA LONGUEUR DE LA PLUS GRANDE
                                     < DIAGONALE...
         BSR         AFCAZ
         JG          QUAD5           < OK, LA LONGUEUR EST POSITIVE...
MODRAP:  EQU         $               < CAS OU L'ON N'INTERPOLE PAS...
         FLD         F05             < SINON, ON EN PREND UNE INFERIEURE A 1...
QUAD5:   EQU         $
         FMP         SCALD           < AMPLIFICATION EVENTUELLE...
         BSR         ASFWOR          < FWORK=MAX(M1M3,M2M4)*SCALD.
         IF          XOPT05-XXX512,XOPT5,,XOPT5
         CPZ         IDEF            < QUELLE EST LA DEFINITION ???
         JE          QUAD97          < FAUX 512...
         BSR         APWORK          < VRAI 512, IL FAUT DOUBLER LE NOMBRE DE
                                     < POINTS CALCULES...
QUAD97:  EQU         $
XOPT5:   VAL         0
         BSR         AFIX
         ADRI        1,A
         STA         NPAS            < NPAS=NOMBRE DE MAILLE DANS CHAQUE
                                     < DIRECTION X ET Y DU CARRE DE BASE.
         FLD         FDELX
         FDV         FWORK           < 1/MAX(M1M3,M2M4),
         FCAM        F1
         JLE         QUAD2           < 1/MAX<=1, OK...
         FLD         F1              < ON MINORE SINON...
QUAD2:   EQU         $
         FST         FPASU           < FPASU=FDELX/MAX(M1M3,M2M4)...
         CPZ         IDERIV          < EST-CE 'FH' VARIABLE ???
         JNE         QUAD7           < NON...
         FMP         FKH
         FST         FHU             < OUI : FHU=FKH*FPASU.
QUAD7:   EQU         $
         FLD         FDELY
         FDV         FWORK
         FCAM        F1
         JLE         QUAD6           < OK...
         FLD         F1              < ON MINORE...
QUAD6:   EQU         $
         FST         FPASV           < FPASV=FDELY/MAX(M1M3,M2M4)...
<
< CALCUL EVENTUEL DE 'FH' :
<
         CPZ         IDERIV          < EST-CE 'FH' VARIABLE ???
         JNE         QUAD1           < NON...
         FMP         FKH
         FST         FHV             < OUI : FHV=FKH*FPASV.
         FCAM        FHU             < (FHV)=(FHU) ???
         JNE         QUAD80          < OK, ILS DIFFERENT...
         FDV         FHEPS           < S'ILS SONT EGAUX :
         FAD         FHV             < ON FAIT :
         FST         FHV             < FHV=FHU+(FHU/10)...
QUAD80:  EQU         $
QUAD1:   EQU         $
<
< ITERATION SUR 'XR' PAR PAS DE 'FINCU' :
<
         LX          NPAS            < X=NOMBRE D'ITERATIONS SUR X...
QUAD3:   EQU         $
         FLD         F0
         FST         FINCV
         PSR         X
<
< ITERATION SUR 'YR' PAR PAS DE 'FINCV' :
<
         LX          NPAS            < X=NOMBRE D'ITERATIONS SUR Y...
QUAD4:   EQU         $
         PSR         X
<
<
<        C A L C U L   D U   V E C T E U R  :
<
<
<
< COMPOSANTE 'U' :
<
         BSR         ASPVU
         FST         VECU            < COMPOSANTE EN 'U' DU VECTEUR.
<
< COMPOSANTE 'V' :
<
         BSR         ASPVV
         FST         VECV            < COMPOSANTE EN 'V' DU VECTEUR.
<
< COMPOSANTE 'W' :
<
         BSR         ASPVW
         FST         VECW            < COMPOSANTE EN 'W' DU VECTEUR.
<
<
<        R E P R E S E N T A T I O N   G R A P H I Q U E  :
<
<
         FLD         VECU
         FMP         FK
         FST         VECU
         FST         FXS             < FXS=VECU,
         FLD         VECV
         FMP         FK
         FST         VECV
         FST         FYS             < FYS=VECV,
         FLD         VECW
         FMP         FK
         FST         VECW
         FST         FZS             < FZS=VECW.
         LAD         FXS             < AFIN DE TRANSFORMER (FXS,FYS,FZS).
         BSR         AMATR           < TRANSFORMATION MATRICIELLE : ON LA FAIT
                                     < (EVENTUELLEMENT) AVANT L'ECLAIRAGE AFIN
                                     < QUE SOURCE LUMINEUSE, ET OBSERVATEUR
                                     < SOIENT DANS L'ESPACE ABSOLU, INDEPENDANT
                                     < DES TRANSFORMATIONS...
<
<
<        P R O J E C T I O N  :
<
<
         BSR         APROJ           < PROJECTION 3D --> 2D...
<
< TEST DES HORS-ECRAN :
<
         LA          XS
         CPZ         MODX            < EST-ON SUR UN X-TORE ???
         JE          SPTT3           < OUI...
         JAL         APTNVU          < NON, ET XS EST OVERSCREEN...
         CPI         NPOLM1
         JG          APTNVU          < DE MEME...
         JMP         SPTT4           < OK, XS EST DANS L'ECRAN...
SPTT3:   EQU         $               < CAS OU L'ON EST SUR UN X-TORE :
         ANDI        NPOLM1
         STA         XS              < CALCUL MODULO DE XS...
SPTT4:   EQU         $
         LA          YS
         CPZ         MODY            < EST-ON SUR UN Y-TORE ???
         JE          SPTT6           < OUI...
         JAL         APTNVU          < NON, ET YS EST OVERSCREEN...
         CPI         NLIGM1
         JG          APTNVU          < DE MEME...
         JMP         SPTT7
SPTT6:   EQU         $               < CAS OU L'ON EST SUR UN Y-TORE :
         ANDI        NLIGM1
         STA         YS              < CALCUL MODULO DE YS...
SPTT7:   EQU         $
<
< MEMORISATION DU POINT (XS,YS) :
<
         LA          YS
         SWBR        A,A
         OR          XS              < (A)=(YS,XS), COMPATIBLE AVEC LE Z-BUFFER,
         XM          POINTC          < ET ON LE MEMORISE.
         IF          XOPT05-XXX512,XOPT5,,XOPT5
         CPZ         IDEF            < QUELLE EST LA DEFINITION ???
         JNE         SPTT9           < VRAI 512, PAS D'OPTIMISATION (ON NE
                                     < PEUT PAS MEMORISER 2 COORDONNEES 512
                                     < SUR 1 MOT !!!).
XOPT5:   VAL         0
         CPZ         IPTC            < FAUT-IL OPTIMISER PAR 'POINTC' ???
         JE          SPTT9           < NON...
         CP          POINTC          < EST-CE LE POINT QUE L'ON A MARQUE AU
                                     < TOUR PRECEDENT ???
                                     < A T T E N T I O N  : CE TEST EST MAUVAIS
                                     < SI LE PREMIER POINT QUE L'ONMARQUE EST
                                     < L'ORIGINE YS=XS=0 (VOIR LA VALEUR INITIA-
                                     < LE DE 'POINTC'...).
         JNE         SPTT9           < NON, ON LE MARQUE...
APTNVU:  BR          PTNVU           < VERS 'APTNVU'...
SPTT9:   EQU         $
<
<
<        C A L C U L   D E S   6   D E R I V E E S   P A R T I E L L E S  :
<
<
         LA          IECL            < MAIS EST-CE NECESSAIRE...
         OR          IINT
         JAE         DERI30          < NI ECLAIRAGE, NI INTERIEUR/EXTERIEUR...
         LA          XS              < OUI :
         LB          YS
         PSR         A,B             < SAUVEGARDONS (XS,YS), ON NE SAIT JAMAIS..
         LYI         XSPU
         LX          YVARU
         LAD         FHU
         BSR         ADERIV
         FST         DXDU            < CALCUL DE DX/DU.
         LX          YVARV
         LAD         FHV
         BSR         ADERIV
         FST         DXDV            < CALCUL DE DX/DV.
         LYI         XSPV
         LX          YVARU
         LAD         FHU
         BSR         ADERIV
         FST         DYDU            < CALCUL DE DY/DU.
         LX          YVARV
         LAD         FHV
         BSR         ADERIV
         FST         DYDV            < CALCUL DE DY/DV.
         LYI         XSPW
         LX          YVARU
         LAD         FHU
         BSR         ADERIV
         FST         DZDU            < CALCUL DE DZ/DU.
         LX          YVARV
         LAD         FHV
         BSR         ADERIV
         FST         DZDV            < CALCUL DE DZ/DV.
         PLR         A,B
         STB         YS              < RESTAURONS
         STA         XS              <            (XS,YS)...
DERI30:  EQU         $
         IF          XOPT01-XXXOUI,XOPT1,,XOPT1
<
< ELIMINATION DES POINTS AU-DESSUS
< DU PLAN DE COUPE A*X+B*Y+C*Z+D=0 :
<
         FLD         FXS             < X,
         FMP         PLANA           < A*X,
         BSR         ASFWOR
         FLD         FYS             < Y,
         FMP         PLANB           < B*Y,
         BSR         APWORK          < A*X+B*Y,
         FLD         FZS             < Z,
         FMP         PLANC           < C*Z,
         BSR         APWORK          < A*X+B*Y+C*Z,
         FAD         PLAND           < A*X+B*Y+C*Z+D,
         BSR         AFCAZ           < ALORS AU-DESSUS OU AU-DESSOUS ???
         JL          PTNVU1          < AU-DESSUS, ON NE TRACE RIEN...
XOPT1:   VAL         0
<
< AU-DESSOUS, ECLAIRONS...
<
         LA          IECL
         OR          IINT
         JANE        SPTR21          < ECLAIRAGE OU INTERIEUR/EXTERIEUR...
         BR          ANECL           < NON, ALLONS PROJETER DIRECTEMENT...
SPTR21:  EQU         $
<
< DETERMINATION DU VECTEUR NORMAL N :
<
         FLD         DZDU
         FMP         DYDV
         BSR         ASFWOR
         FLD         DYDU
         FMP         DZDV
         FSB         FWORK
         FMP         FKN             < INVERSION EVENTUELLE DE LA NORMALE...
         FST         NX              < NX=(DY/DU)*(DZ/DV)-(DZ/DU)*(DY/DV).
         FLD         DXDU
         FMP         DZDV
         BSR         ASFWOR
         FLD         DZDU
         FMP         DXDV
         FSB         FWORK
         FMP         FKN             < INVERSION EVENTUELLE DE LA NORMALE...
         FST         NY              < NY=(DZ/DU)*(DX/DV)-(DX/DU)*(DZ/DV).
         FLD         DYDU
         FMP         DXDV
         BSR         ASFWOR
         FLD         DXDU
         FMP         DYDV
         FSB         FWORK
         FMP         FKN             < INVERSION EVENTUELLE DE LA NORMALE...
         FST         NZ              < NZ=(DX/DU)*(DY/DV)-(DY/DU)*(DX/DV).
         LAD         NX              < AFIN DE TRANSFORMER (NX,NY,NZ)...
         BSR         AMATR           < TRANSFORMATION DE LA NORMALE...
<
< DETERMINATION DU VECTEUR OBSERVATION :
<
         CPZ         IINT            < TRACE-T'ON INTERIEUR ET EXTERIEUR ???
         JE          PTVU            < OUI...
         LA          OX
         SB          TRX             < CHANGEMENT DE REFERENTIEL,
         BSR         AFLT
         FSB         FXS             < (A,B)=X(OBSERVATEUR),
         FMP         NX
         BSR         ASFWOR          < NX*X(VECTEUR OBSERVATION),
         LA          OY
         SB          TRY             < CHANGEMENT DE REFERENTIEL,
         BSR         AFLT
         FSB         FYS             < (A,B)=Y(OBSERVATEUR),
         FMP         NY
         BSR         APWORK          < +NY*Y(VECTEUR OBSERVATION),
         LA          OZ
         BSR         AFLT
         FSB         FZS             < (A,B)=Z(OBSERVATEUR),
         FMP         NZ
         BSR         APWORK          < +NZ*Z(VECTEUR OBSERVATION),
         BSR         AFCAZ           < (A,B)=PRODUIT SCALAIRE ENTRE LE VECTEUR
                                     <       NORMAL EN (FXS,FYS,FZS) ET LE
                                     <       VECTEUR OBSERVATION (JOIGNANT LE
                                     <       POINT COURANT (FXS,FYS,FZS) A
                                     <       L'OBSERVATEUR) ; ON TESTE AINSI
                                     <       SI L'OBSERVATEUR VOIT L'INTERIEUR
                                     <       OU L'EXTERIEUR DE LA SURFACE ???
         JG          PTVU            < L'EXTERIEUR, ON TRACE...
PTNVU1:  EQU         $               < CAS DU PLAN DE COUPE...
         BR          PTNVU           < L'INTERIEUR, ON NE TRACE PAS...
PTVU:    EQU         $
         CPZ         IECL            < MAIS AU FAIT, ECLAIRE-T'ON ???
         JNE         PTVU1           < OUI...
         BR          ANECL           < NON, ALLONS TRACER...
PTVU1:   EQU         $
<
< CALCUL DE LA NORME DU VECTEUR NORMAL :
<
         FLD         NZ
         FMP         NZ
         BSR         ASFWOR
         FLD         NY
         FMP         NY
         BSR         APWORK
         FLD         NX
         FMP         NX
         BSR         APWORK
         BSR         ARAC
         FST         NORMN           < NORME(N)=RAC(NX*NX+NY*NY+NZ*NZ).
         BSR         AFCAZ
         JG          EOK1            < OK, NORMN>0...
         QUIT        1               < ?!?!???!?!
EOK1:    EQU         $
         CPZ         IECL            < ECLAIRE-T'ON ???
         JE          SPTR90          < NON, DONC ON FAIT DE LA MODULATION-N...
<
< CALCUL DU VECTEUR 'MS' ALLANT DU POINT
< COURANT (XS,YS,ZS) A LA SOURCE LUMINEUSE :
<
         LA          SX
         SB          TRX             < CHANGEMENT DE REFERENTIEL,
         BSR         AFLT
         FSB         FXS
         FST         MSX             < X(MS).
         LA          SY
         SB          TRY
         BSR         AFLT
         FSB         FYS
         FST         MSY             < Y(MS).
         LA          SZ
         BSR         AFLT
         FSB         FZS
         FST         MSZ             < Z(MS).
<
< CALCUL DE LA NORME DU VECTEUR 'MS' :
<
         FMP         MSZ
         BSR         ASFWOR
         FLD         MSY
         FMP         MSY
         BSR         APWORK
         FLD         MSX
         FMP         MSX
         BSR         APWORK
         BSR         ARAC
         FST         NORMS           < NORME(MS)=RAC(MSX*MSX+MSY*MSY+MSZ*MSZ).
         BSR         AFCAZ
         JG          EOK2            < OK, NORMS>0...
         QUIT        1               < ??!???!!
EOK2:    EQU         $
<
< CALCUL DE L'INCIDENCE DES RAYONS LUMINEUX
< EN (XS,YS,ZS), SOIT CALCUL DU PRODUIT
< SCALAIRE N.MS :
<
         FLD         NX
         FMP         MSX
         BSR         ASFWOR
         FLD         NY
         FMP         MSY
         BSR         APWORK
         FLD         NZ
         FMP         MSZ
         BSR         APWORK          < NX*MSX+NY*MSY+NZ*MSZ,
         FDV         NORMN
         FDV         NORMS           < ON DISPOSE ICI DU 'COS' DE L'ANGLE
                                     < D'INCIDENCE DES RAYONS LUMINEUX...
<
< CALCUL DE LA MODULATION LUMINEUSE :
<
         BSR         ASFWOR          < COSINUS...
         FLD         F1              < INITIALISATION DU CALCUL DE :
                                     < COSINUS**EXCOS.
         LX          EXCOS           < (X)=EXPOSANT DU COSINUS,
SPTR87:  EQU         $
         FMP         FWORK           < CALCUL ITERATIF DE LA PUISSANCE...
         JDX         SPTR87
         CPZ         ICOS            < QUEL EST LE TRAITEMENT DES COSINUS ???
         JE          SPTR93          < NORMAL...
         BSR         AFABS           < VALEUR ABSOLUE... ; EN FAIT ON
                                     < PREND LA VALEUR ABSOLUE, MAIS CES
                                     < VALEURS SERONT PEUT-ETRE IGNOREES CAR
                                     < CORRESPONDANT A DES NORMALES OPPOSEES
                                     < A L'OBSERVATEUR SI OBSERVATEUR ET
                                     < SOURCE LUMINEUSE SONT CONFONDUES...
         JMP         SPTR94
SPTR93:  EQU         $
         FMP         F05             < QUE L'ON RAMENE DANS LE SEGMENT
                                     < (-0.5,+0.5),
         FAD         F05             < PUIS DANS (0,+1)...
SPTR94:  EQU         $
         FST         FCOEF           < CE QUI DONNE LE COEFFICIENT DE
                                     < MODULATION DES NIVEAUX...
SPTR90:  EQU         $
<
<
<        E L I M I N A T I O N   D E S   P A R T I E S   C A C H E E S  :
<                    ( E T   N I V E A U )
<
<
NECL:    EQU         $
<
< RECUPERATION DU POINT SOURCE (M2) :
<
         FLD         FNIV1           < NIVEAU(XR,YR) A PRIORI...
         CPZ         IINTER          < EST-CE LE MODE RAPIDE ???
         JNE         QUAD50          < OUI, PAS D'INTERPOLATION...
         CPZ         IALIAS          < INTERPOLATION DES NIVEAUX DE GRIS ???
         JE          QUAD50          < NON...
<
< INTERPOLATION DES NIVEAUX DE GRIS DANS LE CARRE ELEMENTAIRE :
<
         LAD         FNIV
         BSR         AINTER
         CPZ         IALIAS          < ALORS : ROUGE-->BLANC ???
         JG          QUAD50          < OUI...
         FMP         F6S7            < AFIN DE NE PAS
         FAD         F1              <                CREER DE NOIR...
QUAD50:  EQU         $
         BSR         AROND           < ET CONVERSION ENTIERE...
         STA         NM2             < NM2=NIVEAU CALCULE A INSCRIRE...
         IF          XOPT04-XXXOUI,XOPT4,,XOPT4
<
< RECUPERATION DU POINT DESTINATION (M1) :
< (LORSQUE L'OPTION EST ABSENTE, C'EST
< LA VALEUR INITIALE (NM1)=0 QUI EST
< UTILISEE...)
<
         BSR         ASPGS
         STA         NM1             < NM1=NIVEAU PRESENT ANTERIEUREMENT...
XOPT4:   VAL         0
<
< CALCUL DE LA PROFONDEUR DU POINT COURANT :
<
         FLD         FZS             < PROFONDEUR DU POINT M2,
         BSR         AFIX
         JNV         SPTR22          < OK...
         LA          ZMAX            < OVERFLOW, ON PREND L'INFINI ENTIER,
         CPZ         FZS             < POSITIF OU NEGATIF ???
         JG          SPTR22          < +
         NGR         A,A             < -
SPTR22:  EQU         $
         CP          BORNS
         JG          SPTR1X          < (ZS)>(BORNS) : POINT IGNORE...
         CP          BORNI
         JL          SPTR1X          < (ZS)<(BORNI) : POINT IGNORE...
<
< UTILISATION DU Z-BUFFER :
<
         LR          A,X             < X=PROFONDEUR DU POINT M2=INT(FZS(XS,YS)).
         LA          POINTC          < A=YS/XS=ADRESSE D'ACCES AU Z-BUFFER.
         LR          X,B             < AU CAS OU Z-BUFFER INACTIF...
         CPZ         ZBUF            < ALORS ???
         JNE         SPTR70          < ET OUI, INACTIF...
         LYI         YLOAD
         BSR         AGZB            < B=PROFONDEUR DU POINT ANTERIEUR M1,
SPTR70:  EQU         $
         CPR         X,B             < POSITION RELATIVE DE M1 ET M2...
         LR          X,Y             < Y=SAUVEGARDE DE LA PROFONDEUR DE M2.
         IF          XOPT05-XXX256,XOPT5,,XOPT5
         LA          LTRANS          < A=LISTE DES TRANSPARENCES...
         JL          SPTR52          < B<X : LE POINT M2 EST A TRACER PLUS
                                     < LOIN DE L'ECRAN QUE M1...
         STZ         ICOLLI          < (B)>(X) A PRIORI...
         JG          SPTR55          < ET OUI, C'EST UNE FAUSSE COLLISION, CAR
                                     < LES COORDONNEES Z SONT DIFFERENTES ; IL
                                     < FAUDRA REINITIALISER LE MOT1 DU Z-BUFFER.
         IC          ICOLLI          < (B)=(X) : C'EST UNE VRAIE COLLISION, IL
                                     < FAUDRA CUMULER LES POINTS...
SPTR55:  EQU         $
<
< CAS OU LE POINT M2 EST A TRACER PLUS PRES QUE M1 :
<
<         Y  I       / Z
<            I      /
<            I     *  M1=POINT ANTERIEUR,
<            I    /
<            I   /
<            I  *  M2=NOUVEAU POINT.
<            I /
<            I/----------------------------> X
<            /
<
<
         LX          NM2
         TBT         0,X             < LE POINT M2 ETANT EN AVANT, EST-IL
                                     < TRANSPARENT ???
         LA          NM2
         JC          SPTR53          < OUI, M2 EST TRANSPARENT... ON DOIT
                                     < DONC CUMULER M1 ET M2...
         JMP         SPTR54          < NON, M2 ECRASE DONC M1...
<
< CAS OU LE POINT M2 EST A TRACER PLUS LOIN QUE M1 :
<
<         Y  I       / Z
<            I      /
<            I     *  M2=NOUVEAU POINT,
<            I    /
<            I   /
<            I  *  M1=POINT ANTERIEUR.
<            I /
<            I/----------------------------> X
<            /
<
<
SPTR52:  EQU         $
         LX          NM1
         TBT         0,X             < LE POINT M1 ETANT EN AVANT, EST-IL
                                     < TRANSPARENT ???
         JNC         SPTR1X          < NON, DONC M2 EST INVISIBLE...
         LA          NM2
<
< TRANSPARENCE :
<
SPTR53:  EQU         $
         OR          NM1             < NIVEAU=NM1.OR.NM2
SPTR54:  EQU         $
XOPT5:   VAL         0
         IF          XOPT05-XXX512,XOPT5,,XOPT5
         JL          SPTR1X          < 'M2' EST DERRIERE 'M1', DONC INVISIBLE.
         STZ         ICOLLI          < FAUSSE COLLISION A PRIORI...
         JG          SPTR55          < ET OUI...
         IC          ICOLLI          < ET NON, C'EST UNE VRAIE COLLISION, IL
                                     < FAUDRA CUMULER LES POINTS...
SPTR55:  EQU         $
         LA          NM2             < (A)=NIIVEAU DU POINT 'M2'.
XOPT5:   VAL         0
         XM          POINTC          < POINTC=NIVEAU A METTRE DANS L'IMAGE,
                                     < A=YS/XS=ADRESSE D'ACCES AU Z-BUFFER,
         LR          Y,B             < B=PROFONDEUR DE M2,
         CPZ         ZBUF            < ALORS ???
         JNE         SPTR71          < Z-BUFFER INACTIF...
         LYI         YSTORE
         BSR         AGZB            < QUE L'ON INSERE DANS LE Z-BUFFER...
SPTR71:  EQU         $
         XM          POINTC          < A=NIVEAU,
                                     < ET RESTAURE 'POINTC'...
         BSR         ACOEF           < MODULATION LUMINEUSE EVENTUELLE...
         IF          XOPT03-XXXNON,XOPT3,,XOPT3
         BSR         ASPRS           < GENERATION DU SCRATCH SANS FILTRAGE...
XOPT3:   VAL         0
         IF          XOPT03-XXXOUI,XOPT3,,XOPT3
<
< TRACE EVENTUELLEMENT ANAGLYPHIQUE :
<
         LB          XS
         PSR         A,B             < SAUVEGARDE DU NIVEAU ET DE 'XS'.
         FCMZ        FANAG           < EST-CE DEMANDE ???
         JE          SPTR80          < NON, (A)=NIVEAU FINAL DE (XS,YS)...
         LYI         XCRMAX          < (Y)=ROUGE MAX A PRIORI,
         CPI         NIVMAX/2        < LE NIVEAU (A) COURANT EST-IL FORT OU
                                     < FAIBLE ???
         JG          SPTR81          < FORT : ON GARDE LE MAX...
         LYI         XCRMIN          < FAIBLE : (Y)=ROUGE MIN.
SPTR81:  EQU         $
         FLD         PANAG           < PLAN DE CONVERGENCE DES YEUX,
         FMP         FK              < PRISE EN COMPTE DE L'ECHELLE,
         FAD         FZS             < ET TRANSLATION DU 'Z'...
         FDV         FANAG
         BSR         AROND
         LR          A,X             < (X)=CONSTANTE DE TRANSLATION A GAUCHE
                                     <     PUIS A DROITE DU POINT (XS,YS)
                                     <     FONCTION DE 'FZS'...
         LA          XS
         PSR         A               < SAUVEGARDE DE (XS,YS),
                                     < (ON FAIT AINSI, A CAUSE DES OVERS-
                                     < SCREENS...)
         SBR         X,A             < PUIS,
         STA         XS              <       DECALAGE A GAUCHE,
         LR          Y,A             < (A)=NIVEAU DE ROUGE COURANT...
         BSR         ASPRS           < TRACE DU POINT (XS-X,YS) AVEC LE NIVEAU
                                     < ROUGE (Y).
         PLR         A               < RESTAURE (XS,YS),
         ADR         X,A             < PUIS,
         STA         XS              <       DECALAGE A DROITE,
         LR          Y,A
         ADRI        XCDELT,A        < PASSAGE DU ROUGE AU VERT...
SPTR80:  EQU         $
         BSR         ASPRS           < TRACE DU POINT (XS,YS) AVEC LE NIVEAU
                                     < CALCULE S'IL N'Y A PAS D'ANAGLYPHES,
                                     < ET DU POINT (XS+X,YS) AVEC LE NIVEAU
                                     < VERT (Y)+XCDELT SI OUI...
         PLR         A,B             < RESTAURATION DU NIVEAU ET DE 'XS'.
         STB         XS
XOPT3:   VAL         0
         IF          XOPT02-XXXOUI,XOPT2,,XOPT2
<
< PREPARATION DU FILTRAGE FINAL :
<
         CPZ         TRZBUF          < EST-IL NECESSAIRE ???
         JL          SPTR1Z          < NON...
         LR          A,X             < OUI, (X)=NIVEAU QUE L'ON VIENT DE FORCER,
         IF          ZBUF1-1,,XWOR%,
         IF          ATTENTION : LE 'IC' EST IDIOT !!!
XWOR%:   VAL         0
         STZ         TRZBUF
         IC          TRZBUF          < AFIN D'ATTEINDRE LE MOT1 DE L'ENTREE,
         LBI         0               < REINITIALISATION DU MOT1 A PRIORI...
         CPZ         ICOLLI          < Y-A-T'IL EU COLLISION REELLE ???
         JE          SPTR56          < NON, ON REINITIALISE LE CUMUL...
         LA          POINTC          < (A)=ADRESSE COURANTE DANS LE Z-BUFFER,
         LYI         YLOAD
         BSR         AGZB            < (B)=MOT1 DE L'ENTREE COURANTE :
         LAI         0
         SLLD        NBITMO-SIGNIV   < (A)=NOMBRE DE POINTS ACTUELLEMENT EN
                                     < COLLISION SUR (XS,YS),
         CPI         1>SIGPT-1       < OVERFLOW ???
         JGE         SPTR1Z          < OUI, ON IGNORE LE POINT COURANT...
         ADRI        1,A             < NON, ON COMPTE LE POINT COURANT,
         SLRD        NBITMO-SIGNIV   < RECADRAGE,
         ADR         X,B             < ET ON CUMULE LE NIVEAU COURANT DANS
                                     < SON CHAMP...
SPTR56:  EQU         $
         LA          POINTC
         LYI         YSTORE
         BSR         AGZB            < ET ON REECRIT LE MOT1 CUMULE...
         IF          ZBUF0-0,,XWOR%,
         IF          ATTENTION : LE 'STZ' EST IDIOT !!!
XWOR%:   VAL         0
         STZ         TRZBUF          < RETOUR SUR LE MOT0...
SPTR1Z:  EQU         $
XOPT2:   VAL         0
SPTR1X:  EQU         $
         IF          XOPT08-XXXOUI,XOPT8,,XOPT8
<
< GENERATION DU NOM DU NOEUD :
< (POUR CHAQUE POINT (FXS,FYS,FZS),
< ON CREE UN ITEM DONT LE NOM EST
< "X*<YR,XR>" ET QUI CONTIENT DANS
< L'ORDRE (FXS,FYS,FZS),(NX.NY,NZ),
< (VARU,VARV)) :
<
         LA          YR
         SWBR        A,A
         OR          XR
         LR          A,B             < (B)=(YR,XR)=FUTUR NOM DU NOEUD,
         LYI         NBRHEX          < (Y)=NOMBRE DE CHIFFRES A CODER,
         LXI         0               < (X)=INDEX COURANT DES CARACTERES.
GMAIL1:  EQU         $
         LAI         0               < CLEAR,
         SLLD        NBITMO/NBRHEX   < DECONCATENATION,
         CPI         BASE10          < EST-CE UN CHIFFRE DECIMAL ???
         JL          GMAIL2          < OUI...
         ADRI        "A"-"9"-1,A     < NON, HEXA-DECIMAL...
GMAIL2:  EQU         $
         ADRI        "0",A           < CODAGE ASCI,
         STBY        &ANMAIL         < ET GENERATION DU NOM...
         ADRI        1,X             < PASSAGE AU CARACTERE SUIVANT,
         ADRI        -1,Y
         CPZR        Y               < S'IL EXISTE ???
         JG          GMAIL1          < ET OUI...
<
< NORMALISATION DE LA NORMALE :
<
         FLD         NX
         FDV         NORMN
         FST         NX
         FLD         NY
         FDV         NORMN
         FST         NY
         FLD         NZ
         FDV         NORMN
         FST         NZ
<
< CREATION DU NOEUD :
<
         LAD         DEMDMA
         SVC         0               < DESTRUCTION PREALABLE...
         LAD         DEMSMA
         SVC         0               < ET CREATION DU NOEUD COURANT...
XOPT8:   VAL         0
<
< ITERATION SUR LE MAILLAGE DU CARRE DE BASE :
<
         PLR         X
         FLD         FINCV
         FAD         FPASV
         FST         FINCV           < PROGRESSION DE 'FINCV'...
         JDX         QUAD40          < AU POINT SUIVANT SUR 'Y'...
         PLR         X
         FLD         FINCU
         FAD         FPASU
         FST         FINCU           < PROGRESSION DE 'FINCU'...
         JDX         QUAD30          < AU POINT SUIVANT SUR 'X'...
<
< SORTIE DU MODULE :
<
SPTR1:   EQU         $
         PLR         A,B,X,Y
         RSR
QUAD40:  EQU         $
         BR          AQUAD4
QUAD30:  EQU         $
         BR          AQUAD3
         PAGE
<
<
<        C U M U L   ' F W O R K '  :
<
<
PWORK:   EQU         $
         FAD         FWORK
         BSR         ASFWOR
         RSR
         PAGE
<
<
<        S T O R E   C O O R D O N N E E S  :
<
<
STXS:    EQU         $
         FMP         FK
         FST         FXS
         RSR
STYS:    EQU         $
         FMP         FK
         FST         FYS
         RSR
STZS:    EQU         $
         FMP         FK
         FST         FZS
         RSR
         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
<                    E V E N T U E L L E  :
<
<
<        ARGUMENTS :
<                    (A)=ADRESSE DE (COORX,COORY,COORZ) AVANT TRANSFORMATION.
<
<
<        RESULTAT :
<                    (COORX,COORY,COORZ)=POINT APRES TRANSFORMATION.
<
<
XXFLOT:  FLOAT       0
LXFLOT:: VAL         $-XXFLOT        < LONGUEUR D'UN NOMBRE FLOTTANT...
         $EQU        XXFLOT          < ANNULATION DU CODE GENERE.
COORX::  MOT         0
COORY::  MOT         COORX+LXFLOT
COORZ::  MOT         COORY+LXFLOT
MATR:    EQU         $
         CPZ         ITRANS          < Y-A-T'IL UNE TRANSFORMATION COURANTE ???
         JE          TRANSX          < NON...
         PSR         Y,W             < OUI :
         LR          A,W             < (W)=ADRESSE DU VECTEUR A TRANSFORMER...
         LRM         A
         WORD        FXS             < (A)=ADRESSE DE (FXS,FYS,FZS),
         LYI         1               < (Y)#0 : MODE VECTEUR A PRIORI.
         CPR         A,W             < EST-CE UN POINT ???
         JNE         TRANSV          < NON, DONC UN VECTEUR...
         LYI         0               < (Y)=0 : MODE POINT.
         FLD         COORX,W
         FSB         KRX
         FST         COORX,W
         FLD         COORY,W
         FSB         KRY
         FST         COORY,W
         FLD         COORZ,W
         FSB         KRZ
         FST         COORZ,W
TRANSV:  EQU         $               < CAS DES VECTEURS...
         FLD         COORX,W
         FMP         M11
         BSR         ASFWOR
         FLD         COORY,W
         FMP         M12
         BSR         APWORK
         FLD         COORZ,W
         FMP         M13
         BSR         APWORK
         CPZR        Y               < POINT OU VECTEUR ???
         JNE         TRANXS          < VECTEUR...
         FAD         KRX             < POINT...
TRANXS:  EQU         $
         PSR         A,B             < FXS=M11*(XR-KRX)+M12*(YR-KRY)
                                     <     +M13*(ZR-KRZ)+KRX.
         FLD         COORX,W
         FMP         M21
         BSR         ASFWOR
         FLD         COORY,W
         FMP         M22
         BSR         APWORK
         FLD         COORZ,W
         FMP         M23
         BSR         APWORK
         CPZR        Y               < POINT OU VECTEUR ???
         JNE         TRANYS          < VECTEUR...
         FAD         KRY             < POINT...
TRANYS:  EQU         $
         PSR         A,B             < FYS=M21*(XR-KRX)+M22*(YR-KRY)
                                     <     +M23*(ZR-KRZ)+KRY.
         FLD         COORX,W
         FMP         M31
         BSR         ASFWOR
         FLD         COORY,W
         FMP         M32
         BSR         APWORK
         FLD         COORZ,W
         FMP         M33
         BSR         APWORK
         CPZR        Y               < POINT OU VECTEUR ???
         JNE         TRANZS          < VECTEUR...
         FAD         KRZ             < POINT...
TRANZS:  EQU         $
         FST         COORZ,W         < FZS=M31*(XR-KRX)+M32*(YR-KRY)
                                     <     +M33*(ZR-KRZ)+KRZ.
         PLR         A,B
         FST         COORY,W
         PLR         A,B
         FST         COORX,W
         PLR         Y,W
TRANSX:  EQU         $
         RSR
         PAGE
<
<
<        P R O J E C T I O N  :
<
<
<        ARGUMENT :
<                    (FXS,FYS,FZS)=POINT 3D.
<
<
<        RESULTAT :
<                    (A)=YS,
<                    (XS,YS)=POINT 2D.
<
<
PROJ:    EQU         $
         IF          XOPT05-XXX512,XOPT5,,XOPT5
         CPZ         IDEF            < VRAI OU FAUX 512 ???
         JE          PROJ1           < FAUX, ON CONSERVE (FXS,FYS,FZS)...
<
< CAS DU VRAI 512, ON DOUBLE
< LA DEFINITION :
<
         FLD         FXS
         FDV         F05
         FST         FXS             < FXS=2*FXS,
         FLD         FYS
         FDV         F05
         FST         FYS             < FYS=2*FYS,
         FLD         FZS
         FDV         F05
         FST         FZS             < FZS=2*FZS.
PROJ1:   EQU         $
XOPT5:   VAL         0
         FLD         FZS
         CPZ         IPROJ           < TYPE DE PROJECTION ???
         JE          SPTRX1          < PAR SINT,COST...
<
< PROJECTION PERSPECTIVE :
<
         FDV         PZ
         FSB         F1
         BSR         AFNEG
         BSR         ASFWOR          < 1-(FZS/PZ)
         BSR         AFCAZ
         JNE         EOK3            < OK, 1-(FZS/PZ)#0...
         QUIT        1               < ??!????!
EOK3:    EQU         $
         FLD         FXS
         FDV         FWORK           < FXS/(1-(FZS/PZ))
         JMP         SPTRX2
<
< PROJECTION PAR SINT,COST :
<
SPTRX1:  EQU         $
         FMP         COST            < ET ON PROJETTE...
         FAD         FXS
SPTRX2:  EQU         $
         BSR         AROND
         AD          TRX             < RE-TRANSLATION...
         IF          XOPT05-XXX512,XOPT5,,XOPT5
         CPZ         IDEF            < QUELLE EST LA DEFINITION ???
         JE          PROJ4           < FAUX 512...
         AD          TRX             < VRAI 512, ON DOUBLE 'TRX'...
PROJ4:   EQU         $
XOPT5:   VAL         0
         STA         XS              < XS=X+Z*COST.
         CPZ         IPROJ           < TYPE DE PROJECTION ???
         JE          SPTRX3          < PAR SINT,COST...
<
< PROJECTION PERSPECTIVE :
<
         FLD         FYS
         FDV         FWORK           < FYS/(1-(FZS/PZ))
         JMP         SPTRX4
<
< PROJECTION PAR SINT,COST :
<
SPTRX3:  EQU         $
         FLD         FZS
         FMP         SINT
         FAD         FYS
SPTRX4:  EQU         $
         BSR         AROND
         AD          TRY             < RE-TRANSLATION...
         IF          XOPT05-XXX512,XOPT5,,XOPT5
         CPZ         IDEF            < QUELLE EST LA DEFINITION ???
         JE          PROJ5           < FAUX 512...
         AD          TRY             < VRAI 512, ON DOUBLE 'TRY'...
PROJ5:   EQU         $
XOPT5:   VAL         0
         STA         YS              < YS=Y+Z*SINT.
         IF          XOPT05-XXX512,XOPT5,,XOPT5
         CPZ         IDEF            < VRAI OU FAUX 512 ???
         JE          PROJ2           < FAUX...
<
< CAS DU VRAI 512, ON
< REPASSE ARTIFICIELLEMENT
< AU 256 (CE QUI PERMET DE
< NE PAS MODIFIER CONSIDE-
< RABLEMENT LE PROGRAMME,
< ET EN PARTICULIER LE Z-BUFFER) :
<
         STA         YS2             < (YS2)=VRAIE COORDONNEE 'Y' PROJETEE...
         TRN
XWOR%1:  VAL         YMAX+I
XWOR%2:  VAL         NLIG
XWOR%3:  VAL         XWOR%1/XWOR%2
XWOR%4:  VAL         XMAX+I
XWOR%5:  VAL         NPOLM1+I
XWOR%6:  VAL         XWOR%4/XWOR%5
         IF          XWOR%3-XWOR%6,,XWOR%,
         IF          COMME C'EST BIZARRE !!!
XWOR%:   VAL         0
         NTRN
         SARS        XWOR%3=K        < REDUCTION :
         STA         YS              < (YS)=(YS2)/2,
         LA          XS
         STA         XS2             < (XS2)=VRAIE COORDONNEE 'X' PROJETEE...
         SARS        XWOR%6=K        < REDUCTION :
         STA         XS              < (XS)=(XS2)/2.
         LA          YS              < (A)=(YS) POUR RESPECTER L'INTERFACE...
PROJ2:   EQU         $
XOPT5:   VAL         0
<
< SORTIE :
<
         RSR                         < RENVOIE : (A)=YS...
         PAGE
<
<
<        M I N ( U )   E T   M A X ( U )  :
<
<
EXTU:    EQU         $
         FCAM        MAXU
         JLE         EXTU1
         FST         MAXU            < MAX(U).
EXTU1:   EQU         $
         FCAM        MINU
         JGE         EXTU2
         FST         MINU            < MIN(U).
EXTU2:   EQU         $
         RSR
<
<
<        M I N ( V )   E T   M A X ( V )  :
<
<
EXTV:    EQU         $
         FCAM        MAXV
         JLE         EXTV1
         FST         MAXV            < MAX(V).
EXTV1:   EQU         $
         FCAM        MINV
         JGE         EXTV2
         FST         MINV            < MIN(V).
EXTV2:   EQU         $
         RSR
         PAGE
<
<
<        O P E R A T I O N   I N T E R - I M A G E S  :
<
<
<        FONCTION :
<                      CETTE VERSION PROVISOIRE REALISE
<                    L'OPERATION .OP. DE LA FACON
<                    SUIVANTE :
<                    RESIDENT <-- (RESIDENT).OP.(SCRATCH)
<                    CETTE OPERATION N'ETANT EFFECTUEE
<                    QUE POUR LES BITS A 1 DU MASQUE...
<
<
SPOP:    EQU         $
         PSR         A,B,X,Y
<
< INITIALISATIONS ET BOUCLES :
<
         LY          ORGY
         STY         YS              < ORDONNEE SCRATCH.
         LA          TRY
         NGR         A,A
         BSR         AFLT
         FST         FYR             < FYR=-TRY,
         BSR         AFIX
         AD          TRY
         STA         YR              < YR=FYR+TRY=0.
SPOP1:   EQU         $
         LX          ORGX
         STX         XS
         LA          TRX
         NGR         A,A
         BSR         AFLT
         FST         FXR             < FXR=-TRX,
         BSR         AFIX
         AD          TRX
         STA         XR              < XR=FXR+TRX=0.
SPOP2:   EQU         $
         LX          XS
         LY          YS
         PSR         X,Y             < SAUVEGARDE DE 'XS' ET 'YS'...
         IF          XOPT05-XXX512,XOPT5,,XOPT5
         CPZ         IDEF            < QUELLE EST LA DEFINITION ???
         JNE         SPOP20          < VRAI 512, ON SAUTE CE QUI SUIT...
XOPT5:   VAL         0
         LA          XS
         CPZ         MODX            < EST-ON SUR UN X-TORE ???
         JE          SPOP3           < OUI...
         JAL         SPOP5           < NON, ET XS EST OVERSCREEN...
         CPI         NPOLM1
         JG          SPOP5           < DE MEME...
         JMP         SPOP4           < OK, XS EST DANS L'ECRAN...
SPOP3:   EQU         $               < CAS OU L'ON EST SUR UN X-TORE :
         ANDI        NPOLM1
         STA         XS              < CALCUL MODULO DE XS...
SPOP4:   EQU         $
         LA          YS
         CPZ         MODY            < EST-ON SUR UN Y-TORE ???
         JE          SPOP6           < OUI...
         JAL         SPOP5           < NON, ET YS EST OVERSCREEN...
         CPI         NLIGM1
         JG          SPOP5           < DE MEME...
         JMP         SPOP7
SPOP6:   EQU         $               < CAS OU L'ON EST SUR UN Y-TORE :
         ANDI        NLIGM1
         STA         YS              < CALCUL MODULO DE YS...
SPOP7:   EQU         $
         IF          XOPT05-XXX512,XOPT5,,XOPT5
SPOP20:  EQU         $
XOPT5:   VAL         0
         CPZ         IMASKO
         JE          SPOP8           < LE MASQUE EST OFF...
<
< GESTION DU MASQUE :
<
         PSR         X,Y
         FLD         FYR
         BSR         AFIX
         AD          TRY
         STA         YR              < YR=FYR+TRY,
         LR          A,Y             < (Y)=COORDONNE Y RESIDENTE.
         FLD         FXR
         BSR         AFIX
         AD          TRX
         STA         XR              < XR=FXR+TRX,
         LR          A,X             < (A)=(X)=COORDONNEE X RESIDENTE.
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1   < B=NUMERO DU MOT SUR LA LIGNE,
         SLRS        NBITMO-XWOR%1   < A=NUMERO DU BIT DANS LE MOT,
         LR          A,X             < X=NUMERO DU BIT DANS LE MOT,
         XR          Y,B
         SLLD        NMOTL=0+NBITMO
         ORR         A,Y             < Y=NUMERO DU MOT DANS LE MASQUE,
         LRM         A
         WORD        AMASK
         ADR         Y,A             < A=ADRESSE DU MOT DANS LA 'CDA'.
         PSR         X
         LRM         B,X
         WORD        MCDAM           < B=ADRESSE DU MOT DE TRANSIT,
         WORD        1               < X=NOMBRE DE MOTS A DEPLACER.
         RCDA
         PLR         X
         LA          MCDAM           < ACCES AU MASQUE,
         TBT         0,X             < ALORS ???
         PLR         X,Y
         JNC         SPOP5           < LE MOT (X,Y) EST MASQUE...
<
< TRANSFORMATION :
<
SPOP8:   EQU         $
         BSR         ASPTR           < EXECUTION DE L'OPERATION VARIABLE .OP.
                                     < SUR LE COUPLE DE POINTS (X,Y).
<
< PROGRESSION :
<
SPOP5:   EQU         $
         PLR         X,Y             < RESTAURATION DE XS ET YS...
         STX         XS
         STY         YS
         IC          XS              < PROGRESSION DE XS,
         FLD         FXR             < ET DE XR,
         FAD         FDELX
         FST         FXR
         BSR         AFIX
         AD          TRX
         STA         XR              < XR=E(FXR+FDELX).
         CPI         NPOLM1          < EST-ON EN BOUT DE LIGNE ???
         JLE         SPOP2           < NON... BALAYAGE HORIZONTAL...
         IC          YS              < OUI, PROGRESSION DE YS,
         FLD         FYR             < ET DE FYR...
         FAD         FDELY
         FST         FYR
         BSR         AFIX
         AD          TRY
         STA         YR              < YR=E(FYR+FDELY).
         CPI         NLIGM1          < EST-ON EN BOUT D'IMAGE ???
         JLE         SPOP1           < NON, BALAYAGE VERTICAL...
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        C A L C U L   D E   L A   T R A N S F O R M E E
<        E N   ' U '   D I R E C T   O U   P A R
<                    I N T E R P O L A T I O N  :
<
<
SPUP:    EQU         $
         LA          INTER1          < INDICATEUR D'INITIALISATION 'VECU'...
         AND         INTER2          < .AND. INDICATEUR DE CHOIX ENTRE LE MODE
                                     < DIRECT ET L'INTERPOLATION,
         JANE        SPUP1           < CE N'EST PAS L'INITIALISATION, ET IL
                                     < FAUT INTERPOLER...
<
< CAS OU IL FAUT CALCULER LA
< FONCTION DIRECTEMENT (OU BIEN
< ON EST EN TRAIN D'INITIALISER
< 'VECU', OU BIEN LE MODE DIRECT
< EST DEMANDE) :
<
         PSR         L
         LRM         L
         WORD        FLOC+'80
         BSR         ASPU            < ET VOILA...
SPUP4:   EQU         $               < SORTIE...
         PLR         L
         JMP         SPUP2
<
< CAS DU CALCUL DIRECT ET EXPLICITE :
<
SPUP1:   EQU         $
         LAD         LVECU
SPUP3:   EQU         $               < INTERPOLATION...
         BSR         AINTER          < INTERPOLATION DES 'VECU', 'VECV' ET
                                     < 'VECW'...
<
< RETOUR :
<
SPUP2:   EQU         $
         RSR
<
<
<        C A L C U L   D E   L A   T R A N S F O R M E E
<        E N   ' V '   D I R E C T   O U   P A R
<                    I N T E R P O L A T I O N  :
<
<
SPVP:    EQU         $
         LA          INTER1          < INDICATEUR D'INITIALISATION 'VECV'...
         AND         INTER2          < .AND. INDICATEUR DE CHOIX ENTRE LE MODE
                                     < DIRECT ET L'INTERPOLATION,
         JANE        SPVP1           < CE N'EST PAS L'INITIALISATION, ET IL
                                     < FAUT INTERPOLER...
<
< CAS OU IL FAUT CALCULER LA
< FONCTION DIRECTEMENT (OU BIEN
< ON EST EN TRAIN D'INITIALISER
< 'VECV', OU BIEN LE MODE DIRECT
< EST DEMANDE) :
<
         PSR         L
         LRM         L
         WORD        FLOC+'80
         BSR         ASPV            < ET VOILA...
         JMP         SPUP4           < VERS LA SORTIE...
<
< CAS DU CALCUL DIRECT ET EXPLICITE :
<
SPVP1:   EQU         $
         LAD         LVECV
         JMP         SPUP3           < VERS L'INTERPOLATION DES 'VECV'...
<
<
<        C A L C U L   D E   L A   T R A N S F O R M E E
<        E N   ' W '   D I R E C T   O U   P A R
<                    I N T E R P O L A T I O N  :
<
<
SPWP:    EQU         $
         LA          INTER1          < INDICATEUR D'INITIALISATION 'VECW'...
         AND         INTER2          < .AND. INDICATEUR DE CHOIX ENTRE LE MODE
                                     < DIRECT ET L'INTERPOLATION,
         JANE        SPWP1           < CE N'EST PAS L'INITIALISATION, ET IL
                                     < FAUT INTERPOLER...
<
< CAS OU IL FAUT CALCULER LA
< FONCTION DIRECTEMENT (OU BIEN
< ON EST EN TRAIN D'INITIALISER
< 'VECW', OU BIEN LE MODE DIRECT
< EST DEMANDE) :
<
         PSR         L
         LRM         L
         WORD        FLOC+'80
         BSR         ASPW            < ET VOILA...
         JMP         SPUP4           < VERS LA SORTIE...
<
< CAS DU CALCUL DIRECT ET EXPLICITE :
<
SPWP1:   EQU         $
         LAD         LVECW
         JMP         SPUP3           < VERS L'INTERPOLATION DES 'VECW'...
         PAGE
<
<
<        I N T E R P O L A T I O N   S U R   U N   C A R R E  :
<
<
<        ARGUMENT :
<                    (A)=ADRESSE D'UNE LISTE DE 4 VALEURS
<                        A INTERPOLER SUR UN CARRE DE BASE.
<
<
<        RESULTAT :
<                    (A,B)=VALEUR INTERPOLEE.
<
<
PINTER:  EQU         $
         PSR         W
         LR          A,W             < (W)=ADRESSE DE LA LISTE DES 4 VALEURS
                                     <     A INTERPOLER.
         FLD         FDELX
         FSB         FINCU
         FST         FWORK1          < W1=FDELX-FU,
         FLD         FDELY
         FSB         FINCV
         FST         FWORK2          < W2=FDELY-FV,
         FMP         FWORK1
         FMP         FLOT1,W
         BSR         ASFWOR          < (FDELX-FU)*(FDELY-FV)*N1,
         FLD         FINCU
         FMP         FWORK2
         FMP         FLOT2,W
         BSR         APWORK          < +FU*(FDELY-FV)*N2,
         FLD         FINCU
         FMP         FINCV
         FMP         FLOT3,W
         BSR         APWORK          < +FU*FV*N3,
         FLD         FWORK1
         FMP         FINCV
         FMP         FLOT4,W
         BSR         APWORK          < +(FDELX-FU)*FV*N4,
         FDV         FDELX           < ET
         FDV         FDELY           <    NORMALISATION...
         PLR         W
         RSR
         PAGE
<
<
<        T R A N S F O R M A T I O N   E N   ' U '  :
<
<
SPVU:    EQU         $
         FLD         FXR
         FAD         FINCU           < TRANSLATION SUR LE MAILLAGE...
         FMP         KFU
         FMP         KUX
         FST         VARU            < U=KUX*KFU*FXR.
         FLD         FYR
         FAD         FINCV           < TRANSLATION SUR LE MAILLAGE...
         FMP         KFV
         FMP         KVX
         FST         VARV            < V=KVX*KFV*FYR.
         FLD         FZR
         FMP         KFW
         FMP         KWX
         FST         VARW            < W=KWX*KFW*FZR.
         FLD         FTR
         FMP         KFT
         FMP         KTX
         FST         VART            < T=KTX*KFT*FTR.
         BSR         ASPUP
         RSR
<
<
<        T R A N S F O R M A T I O N   E N   ' V '  :
<
<
SPVV:    EQU         $
         FLD         FXR
         FAD         FINCU           < TRANSLATION SUR LE MAILLAGE...
         FMP         KFU
         FMP         KUY
         FST         VARU            < U=KUY*KFU*FXR.
         FLD         FYR
         FAD         FINCV           < TRANSLATION SUR LE MAILLAGE...
         FMP         KFV
         FMP         KVY
         FST         VARV            < V=KVY*KFV*FYR.
         FLD         FZR
         FMP         KFW
         FMP         KWY
         FST         VARW            < W=KWY*KFW*FZR.
         FLD         FTR
         FMP         KFT
         FMP         KTY
         FST         VART            < T=KTY*KFT*FTR.
         BSR         ASPVP
         RSR
<
<
<        T R A N S F O R M A T I O N   E N   ' W '  :
<
<
SPVW:    EQU         $
         FLD         FXR
         FAD         FINCU           < TRANSLATION SUR LE MAILLAGE...
         FMP         KFU
         FMP         KUZ
         FST         VARU            < U=KUZ*KFU*FXR.
         FLD         FYR
         FAD         FINCV           < TRANSLATION SUR LE MAILLAGE...
         FMP         KFV
         FMP         KVZ
         FST         VARV            < V=KVZ*KFV*FYR.
         FLD         FZR
         FMP         KFW
         FMP         KWZ
         FST         VARW            < W=KWZ*KFW*FZR.
         FLD         FTR
         FMP         KFT
         FMP         KTZ
         FST         VART            < T=KTZ*KFT*FTR.
         BSR         ASPWP
         RSR
         PAGE
<
<
<        D E R I V A T I O N   N U M E R I Q U E  :
<
<
<        ARGUMENTS :
<                    (A)=ADRESSE DU PAS DE DERIVATION 'FHU/V',
<                    Y=NUMERO DE LA FONCTION QUE L'ON DESIRE DERIVER
<                      (XSPU, XSPV OU XSPW),
<                    X=NUMERO DE LA VARIABLE PAR RAPPORT A LAQUELLE
<                      ON DERIVE (XVARU, XVARV, XVARW OU XVART).
<
<
<        RESULTAT :
<                    A,B=VALEUR DE LA DERIVEE AU POINT CONSIDERE.
<
<
DERIVE:  EQU         $
<
< ACCES AU PAS DE DERIVATION :
<
FH::     VAL         0               < ACCES A 'FHU/V'...
         PSR         W
         LR          A,W             < (W)=ADRESSE DU PAS DE DERIVATION 'FH',
         FLD         FH,W
         FDV         F05
         FST         F2H             < ET CALCUL DE F2H=2*FH...
<
< VALIDATION DE LA FONCTION :
<
         LR          Y,A             < VALIDATION DE LA FONCTION :
         JAL         DERIV1          < ERREUR...
         CPI         XSPW
         JLE         DERIV2          < OK...
DERIV1:  EQU         $
         QUIT        1               < !?!?!??!
DERIV2:  EQU         $
         LR          X,A             < VALIDATION DE LA VARIABLE DE DERIVATION :
         TBT         NBITMO-1
         JC          DERIV3
         JAL         DERIV3
         CPI         XLASTX
         JLE         DERIV4
DERIV3:  EQU         $
         QUIT        1               < !?!??!??!
DERIV4:  EQU         $
<
< CALCUL DE LA DERIVEE :
<
         FLD         &AVAR           < VARIABLE ALPHA,
         PSR         A,B             < SAUVEGARDE DE ALPHA...
         FAD         FH,W            < 'FHU/V'...
         FST         &AVAR
         PSR         X,Y
         LR          Y,X
         BSR         &ASPUVW
         PLR         X,Y
         PSR         A,B             < F(ALPHA+H).
         FLD         &AVAR
         FSB         F2H
         FST         &AVAR
         PSR         X,Y
         LR          Y,X
         BSR         &ASPUVW
         PLR         X,Y
         BSR         ASFWOR          < F(ALPHA-H).
         PLR         A,B
         FSB         FWORK
         FDV         F2H
         BSR         ASFWOR          < DERIVEE=(F(ALPHA+H)-F(ALPHA-H))/(2*H).
         PLR         A,B             < RESTAURE ALPHA...
         FST         &AVAR
         FLD         FWORK           < (A,B)=VALEUR DE LA DERIVEE.
         PLR         W
         RSR
         PAGE
<
<
<        C O E F F I C I E N T   D ' I N T E N S I T E
<                    L U M I N E U S E  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME MODULE LE
<                    NIVEAU LUMINEUX D'UN POINT PAR
<                    UN COEFFICIENT CALCULEE A PARTIR
<                    DE L'ANGLE D'INCIDENCE DES RAYONS
<                    LUMINEUX.
<                      DE PLUS, IL GERE MAINTENANT
<                    LES TRANCHES A COORDONNEES
<                    CONSTANTES, EN AUTORISANT LES
<                    MODULOS SUR LES NIVEAUX...
<
<
<        ARGUMENT :
<                    A=NIVEAU A MODULER,
<
<
<        RESULTAT :
<                    A=NIVEAU MODULE...
<
<
COEF:    EQU         $
         JAE         COEF1           < NIVEAU NUL...
         IF          XOPT05-XXX512,XOPT5,,XOPT5
XWOR%3:  VAL         NIVMAX+I        < NOMBRE DE NIVEAUX EN 256*256.
XWOR%1:  VAL         NIV256/XWOR%3=K < DECALAGE POUR PASSER D'UN NIVEAU EN
                                     < 256*256 A UN NIVEAU EN 512*512.
         SLLS        XWOR%1          < PASSAGE DE 8 A 256 NIVEAUX !!!
XOPT5:   VAL         0
         PSR         A,B
         FLD         FCOEF
         FMP         TRANCM          < AMPLIFICATION A PRIORI...
         FCMZ        TRANCX          < TRANCHE 'X' :
         JE          COEF4           < NON,
         FMP         FXS             < OUI...
         FDV         TRANCX
COEF4:   EQU         $
         FCMZ        TRANCY          < TRANCHE 'Y' :
         JE          COEF5           < NON,
         FMP         FYS             < OUI...
         FDV         TRANCY
COEF5:   EQU         $
         FCMZ        TRANCZ          < TRANCHE 'Z' :
         JE          COEF6           < NON,
         FMP         FZS             < OUI...
         FDV         TRANCZ
COEF6:   EQU         $
         BSR         ASFWOR          < ET MISE A JOUR EVENTUELLE DU COEF...
         FCAM        F1              < LE COEFFICIENT NE SERAIT-IL PAS UNITE ???
         PLR         A,B
         JE          COEF1           < OUI, RIEN A FAIRE, LE NIVEAU RESTE
                                     < INCHANGE...
         BSR         AFLT
         FMP         FWORK           < PRISE EN COMPTE DE L'INCIDENCE...
         FMP         F6S7            < AFIN DE NE PAS
         FAD         F1              <                CREER DE NOIR...
         BSR         AROND           < ET CONVERSION ENTIERE...
COEF1:   EQU         $
         IF          XOPT05-XXX256,XOPT5,,XOPT5
         ANDI        NIVMAX          < ET ON TRAVAILLE MODULO...
         PSR         X
         LR          A,X             < (X)=NIVEAU CALCULE,
         LBY         &AATNIV         < (A)=NIVEAU ASSOCIE A AFFICHER...
         PLR         X
XOPT5:   VAL         0
         IF          XOPT05-XXX512,XOPT5,,XOPT5
         ANDI        NIV256-I        < ET ON TRAVAILLE MODULO...
XOPT5:   VAL         0
COEF3:   EQU         $
         RSR
         PAGE
<
<
<        A C C E S   C O N S T A N T E   D E   T R A V A I L  :
<
<
<        ARGUMENT :
<                    X=NUMERO DE LA CONSTANTE (DE 0 A NCT-1), ET NON PAS
<                      SON INDEX EN DOUBLE-MOTS !!!
<
<
<        RESULTAT :
<                    A,B=VALEUR DE LA CONSTANTE.
<
<
SPCT:    EQU         $
         LR          X,A             < VALIDATION DU NUMERO :
         JAL         SPCT1           < ERREUR...
         CPI         NCT
         JL          SPCT2           < OK...
SPCT1:   EQU         $
         QUIT        1               < ?!??!?!
SPCT2:   EQU         $
         PSR         X
         ADR         X,X             < INDEX DOUBLE-MOTS,
         FLD         &ACT            < (A,B)=CONSTANTE DE TRAVAIL...
         PLR         X
         RSR
         PAGE
<
<
<        C A L C U L   S I N U S   E T   C O S I N U S  :
<
<
<        ARGUMENT :
<                    A,B = ANGLE EN RADIANS,
<
<
<        RESULTAT :
<                    A,B = LIGNE TRIGONOMETRIQUE DEMANDEE.
<
<
COS:     EQU         $               < ENTRY 'COSINUS' :
         FSB         PISUR2          < A,B = TETA-PI/2,
         BSR         AFNEG           < A,B = PI/2-TETA.
SIN:     EQU         $               < ENTRY 'SINUS' :
         FST         ZZZ061          < SAVE TEMPORAIRE DE L'ANGLE.
         STZ         ZZZ063
         JAGE        ZZZ072
         BSR         AFNEG
         FST         ZZZ061
         IC          ZZZ063
ZZZ072:  EQU         $
         FDV         DEUXPI
         BSR         AFIX
         BSR         AFLT
         FMP         DEUXPI
         FSB         ZZZ061
         BSR         AFNEG
         FCAM        PI3141
         JL          ZZZ073
         FSB         PI3141
         IC          ZZZ063
ZZZ073:  EQU         $
         FCAM        PISUR2
         JL          ZZZ074
         FSB         PI3141
         BSR         AFNEG
ZZZ074:  EQU         $
         FDV         PISUR2
         FST         ZZZ061
         FMP         ZZZ061
         FST         ZZZ062
         FMP         ZZZ071
         FAD         ZZZ070
         FMP         ZZZ062
         FAD         ZZZ069
         FMP         ZZZ062
         FAD         ZZZ068
         FMP         ZZZ062
         FAD         ZZZ067
         FMP         ZZZ061
         DC          ZZZ063
         JNE         ZZZ075
         BSR         AFNEG
ZZZ075:  EQU         $
         RSR
         PAGE
<
<
<        A C C E S   A   U N   P O I N T   R E S I D E N T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RECONSTITUE
<                    LE NIVEAU ASSOCIE A 3 BITS
<                    PARALLELES.
<
<
<        ARGUMENT :
<                    XR,YR = COORDONNEES DU POINT,
<
<
<        RESULTAT :
<                    A = NIVEAU DE GRIS DU POINT, SOIT R+V*2+B*4.
<
<
SPAPR:   EQU         $
         PSR         B,X,Y
         IF          NLIGM1-NPOLM1,,XWOR%,
         IF          ATTENTION : CE QUI SUIT EST IDIOT !!!
XWOR%:   VAL         0
         LA          XR
         OR          YR
         CPI         NLIGM1?NPOLM1   < 'XR' OU 'YR' SONT-IL TROP GRANDS ???
                                     < (A CAUSE DE L'INTERPOLATION ENTRE LES
                                     < NIVEAUX DE GRIS DANS LES CARRES
                                     < ELEMENTAIRES).
         LAI         0               < OUI A PRIORI : A=NIVEAU DU NOIR...
         JG          SPAPR1          < ET OUI, ON PREND LE NOIR...
         LX          XR              < X=ABSCISSE,
         LY          YR              < Y=ORDONNEE.
         LR          X,A             < A=COORDONNEE X,
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1   < B=NUMERO DE MOT DANS LA LIGNE,
         SLRS        NBITMO-XWOR%1   < A=NUMERO DE BIT DANS LE MOT,
         LXI         NBITMO-BIT
         SBR         A,X             < X=DECALAGE D'ACCES AU BIT COURANT.
         XR          Y,B             < Y=NUMERO DU MOT DANS LA LIGNE,
         SLLD        NMOTL=0
         IF          NBITMO-NMOTL,,XWOR%,
         IF          ATTENTION : LA CONCATENATION QUI SUIT EST COMPLETEMENT
         IF          STUPIDE !!!
XWOR%:   VAL         0
         ORR         B,Y             < Y=NUMERO DU MOT DANS LA TRAME.
         XR          Y,X
         LA          &AIMAGB         < ACCES A LA TRAME BLEU,
         PSR         A
         LA          &AIMAGV         < ACCES A LA TRAME BLEUE,
         PSR         A
         LA          &AIMAGR         < ACCES A LA TRAME ROUGE.
         XR          X,Y
         SLRS        0,X
         SLRD        BIT             < RECUPERATION D'UN BIT ROUGE,
         PLR         A
         SLRS        0,X
         SLRD        BIT             < RECUPERATION D'UN BIT VERT,
         PLR         A
         SLRS        0,X
         ANDI        BIT             < RECUPERATION D'UN BIT BLEU.
         SLLD        NCOOL-BIT       < A=NIVEAU DE GRIS DU POINT (X,Y).
SPAPR1:  EQU         $
         PLR         B,X,Y
         RSR
<
<
<        C A S   D E   L ' I N T E R P O L A T I O N  :
<
<
<        RESULTAT :
<                    A,B=NIVEAU(XR,YR) S'IL Y A INTERPOLATION DES
<                        NIVEAUX DE GRIS ; SINON, (A,B) N'EST PAS
<                        SIGNIFICATIF...
<
<
SPGRA:   EQU         $
         CPZ         IALIAS          < INTERPOLATION ???
         JE          SPGRA1          < NON...
         BSR         ASPGPF          < OUI, (A,B)=NIVEAU(XR,YR).
SPGRA1:  EQU         $
         RSR
         PAGE
         IF          XOPT07-XXXOUI,XOPT7,,XOPT7
<
<
<        R A N G E M E N T   D ' U N   P O I N T   R E S I D E N T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RANGE LE
<                    NIVEAU D'UN POINT SUR 3 BITS
<                    PARALLELES.
<
<
<        ARGUMENTS :
<                    XR,YR = COORDONNEES DU POINT,
<                    A = SON NIVEAU DE GRIS.
<
<
SPSPR:   EQU         $
         PSR         A,B,X,Y
         LX          XR              < X=ABSCISSE,
         LY          YR              < Y=ORDONNEE.
         PSR         A
         LR          X,A
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1
         SLRS        NBITMO-XWOR%1
         LR          A,X             < X=NUMERO DE BITS.
         XR          Y,B
         SLLD        NMOTL=0
         ORR         B,Y             < Y=NUMERO DU MOT DANS LA TRAME.
         PLR         A               < A=NIVEAU DE GRIS DU POINT.
         SLRD        NCOOL           < ET MISE DANS B...
         XR          X,Y
         LA          &AIMAGR         < ACCES A UN MOT ROUGE,
         STA         SAVER
         LA          &AIMAGV         < ACCES A UN MOT VERT,
         STA         SAVEV
         LA          &AIMAGB         < ACCES A UN MOT BLEU.
         XR          X,Y
         SCLS        0,X
         SLLD        BIT             < RECUPERATION DU BIT BLEU,
         SCRS        BIT,X
         STA         SAVEB
         LA          SAVEV
         SCLS        0,X
         SLLD        BIT             < RECUPERATION DU BIT VERT,
         SCRS        BIT,X
         STA         SAVEV
         LA          SAVER
         SCLS        0,X
         SLLD        BIT             < RECUPERATION DU BIT ROUGE,
         SCRS        BIT,X
         XR          X,Y
         STA         &AIMAGR         < RANGEMENT DU MOT ROUGE,
         LA          SAVEV
         STA         &AIMAGV         < RANGEMENT DU MOT VERT,
         LA          SAVEB
         STA         &AIMAGB         < RANGEMENT DU MOT BLEU.
         PLR         A,B,X,Y
         RSR
XOPT7:   VAL         0
         PAGE
<
<
<        S O U S - E C H A N T I L L O N N A G E
<        D E   L ' I M A G E   R E S I D E N T E  :
<
<
<        FONCTION :
<                      CE MODULE PERMET DE SOUS-
<                    ECHANTILLONNER L'IMAGE RESIDENTE
<                    (XR,YR) PAR INTERPOLATION SUR
<                    UN NOMBRE DE POINTS VARIANT
<                    AVEC LE PAS D'ECHANTILLONNAGE ;
<                    CETTE INTERPOLATION LINEAIRE
<                    EST PONDEREE EN FONCTION DE
<                    LA DISTANCE DES POINTS.	
<
<
<        ARGUMENTS :
<                    (FXR,FYR)=POINT FLOTTANT COURANT,
<                    (FDELX,FDELY)=PAS DE SOUS-ECHANTILLONNAGE.
<
<
<        RESULTAT :
<                    (A,B)=NIVEAU DE GRIS INTERPOLE.
<
<
SPGPF:   EQU         $
         IF          XOPT05-XXX512,XOPT5,,XOPT5
         CPZ         IDEF            < QUELLE EST LA DEFINITION ???
         JNE         ETI102          < VRAI 512, IL FAUT INTERPOLER...
XOPT5:   VAL         0
<
< OPTIMISATION POSSIBLE :
<
         FLD         F1
         FDV         FKDEL           < AFIN DE TESTER AUSSI FKDEL=1...
         FCAM        FDELX
         JNE         ETI102          < LE PAS SUR OX N'EST PAS UNITE...
         FCAM        FDELY
         JNE         ETI102          < LE PAS SUR OY N'EST PAS UNITE...
         FLD         FXR             < LE PAS SUR OX ET SUR OY SONT UNITES,
         BSR         AFIX
         AD          TRX
         STA         XR              < XR=FXR+TRX.
         FLD         FYR
         BSR         AFIX
         AD          TRY
         STA         YR              < YR=FYR+TRY.
         BSR         ASPGPR          < LE NIVEAU EST PRIS DIRECTEMENT SUR LE
                                     < POINT COURANT (XR,YR)=(FXR,FYR)...
         BSR         AFLT            < ET ON FLOTTE...
         RSR                         < ET C'EST TOUT...
                                     < (ON A SUPPRIME LE 'JMP ETI103' POUR DES
                                     < RAISONS LIEES AUX SAUTS SUPERIEURS A
                                     < 128 MOTS...).
<
< ET NON, IL FAUT INTERPOLER :
<
ETI102:  EQU         $
         LA          XR
         LB          YR
         PSR         A,B,X           < SAUVEGARDE DE (XR,YR)...
<
< INITIALISATION DES CUMULS :
<
         FLD         F0
         FST         FSIGCO          < SIGMA DES COEFFICIENTS DE PONDERATION,
         FST         FSIGNI          < SIGMA DES NIVEAUX PONDERES.
<
< CALCUL DES INTERVALLES DE VARIATION :
<
         FLD         FDELX
         FMP         FKDEL
         FST         FWORK1          < FWORK1=FKDEL*FDELX,
         FLD         FDELY
         FMP         FKDEL
         FST         FWORK2          < FWORK2=FKDEL*FDELY.
<
< PARCOURS SELON OY :
<
         FAD         FYR
         BSR         AFIX
         AD          TRY
         LR          A,X             < (X)=E(FYR+FDELY)+TRY,
         FLD         FWORK2
         BSR         AFNEG           < -FDELY*FKDEL,
         FAD         FYR
         BSR         AFIX
         AD          TRY
         STA         YR              < YR=E(FYR-FDELY)+TRY,
         SBR         A,X
         ADRI        1,X             < (X)=NOMBRE DE PAS SUR OY...
<
< PARCOURS SELON OX :
<
ETI100:  EQU         $
         LA          YR
         JAL         ETI104          < HORS-IMAGE RESIDENTE...
         CPI         NLIGM1
         JG          ETI105          < HORS-IMAGE RESIDENTE...
         PSR         X               < SAVE LE DECOMPTE LE LONG DE OY,
         FLD         FWORK1
         FAD         FXR
         BSR         AFIX
         AD          TRX
         LR          A,X             < (X)=E(FXR+FDELX)+TRX,
         FLD         FWORK1
         BSR         AFNEG           < -FDELX*FKDEL,
         FAD         FXR
         BSR         AFIX
         AD          TRX
         STA         XR              < XR=E(FXR-FDELX)+TRX,
         SBR         A,X
         ADRI        1,X             < (X)=NOMBRE DE PAS SUR OX...
<
< CUMUL DU POINT COURANT (XR,YR) :
<
ETI101:  EQU         $
         LA          XR
         JAL         ETI106          < HORS-IMAGE RESIDENTE...
         CPI         NPOLM1
         JG          ETI107          < HORS-IMAGE RESIDENTE...
         LA          XR
         SB          TRX
         BSR         AFLT
         FSB         FXR
         BSR         AFABS
         BSR         AFNEG
         FAD         FWORK1
         FDV         FWORK1
         BSR         AFABS
         BSR         ASFWOR          < PONDERATION LE LONG DE OX :
                                     < ABS(FDELX-ABS(XR-FXR))/FDELX.
         LA          YR
         SB          TRY
         BSR         AFLT
         FSB         FYR
         BSR         AFABS
         BSR         AFNEG
         FAD         FWORK2
         FDV         FWORK2          < PONDERATION LE LONG DE OY :
         BSR         AFABS           < ABS(FDELY-ABS(YR-FYR))/FDELY.
         FMP         FWORK           < LA PONDERATION DE (XR,YR) EST LE PRODUIT
         BSR         ASFWOR          < DES PONDERATIONS SUIVANT OX ET OY...
         FAD         FSIGCO          < CUMUL DES PONDERATIONS...
         FST         FSIGCO
         BSR         ASPGPR          < (A)=NIVEAU(XR,YR),
         BSR         AFLT
         FMP         FWORK           < QUE L'ON PONDERE,
         FAD         FSIGNI          < ET QUE L'ON CUMULE...
         FST         FSIGNI
<
< PROGRESSION LE LONG DE OX :
<
ETI106:  EQU         $               < HORS-IMAGE RESIDENTE A GAUCHE...
         IC          XR
         JDX         ETI101          < SI NECESSAIRE...
<
< PROGRESSION LE LONG DE OY :
<
ETI107:  EQU         $               < HORS-IMAGE RESIDENTE A DROITE...
         PLR         X
ETI104:  EQU         $               < HORS-IMAGE RESIDENTE EN HAUT...
         IC          YR
         JDX         ETI100          < SI NECESSAIRE...
<
< GENERATION DU NIVEAU INTERPOLE :
<
ETI105:  EQU         $               < HORS-IMAGE RESIDENTE EN BAS...
         PLR         A,B,X
         STB         YR              < RESTAURATION
         STA         XR              <              DE (XR,YR).
         FLD         FSIGNI
         FDV         FSIGCO          < NIVEAU=SIGMA(NIVEAUX PONDERES)/SIGMA(CO-
                                     <        EFFICIENT DE PONDERATION).
<
< SORTIE :
<
ETI103:  EQU         $
         RSR                         < THAT'S ALL FOLK ?!???!?!
         PAGE
<
<
<        A C C E S   A   U N   P O I N T   S C R A T C H  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RECONSTITUE
<                    LE NIVEAU ASSOCIE A 3 BITS
<                    PARALLELES.
<
<
<        ARGUMENTS :
<                    XS,YS = COORDONNEES DU POINT SCRATCH,
<
<
<        RESULTAT :
<                    A=NIVEAU DE GRIS DU POINT SCRATCH.
<
<
SPAPS:   EQU         $
         PSR         B,X,Y,W
         LX          XS              < X=ABSCISSE,
         LY          YS              < Y=ORDONNEE.
         IF          XOPT05-XXX512,XOPT5,,XOPT5
         CPZ         XCTCDA          < ATTEINT-ON 'TV1' OU 'TV2' ???
         JNE         SPAPS3          < 'TV2', DONC UNE IMAGE 256*256...
<
<        C A S   D E S   I M A G E S   5 1 2 * 5 1 2  :
<
         PSR         L               < 'TV1', DONC UNE IMAGE 512*512...
         LRM         L
         WORD        LOC+128         < ET CECI, A CAUSE DES OVERLAYS...
         BSR         ALOADP          < (A)=NIVEAU(X,Y).
         PLR         L
         JMP         SPAPS2          < ET ON SORT...
<
<        C A S   D E S   I M A G E S   2 5 6 * 2 5 6  :
<
SPAPS3:  EQU         $
XOPT5:   VAL         0
         IF          ASHPR,XWOR%,XWOR%,
<
< TENTATIVE D'ACCELERATION :
<
         SWBR        Y,B
         ORR         X,B             < (B)=(Y,X),
         STB         SAVYX           < ET SAUVEGARDE...
         RBT         NBITMO          < SUPRESSION DU BIT DE SIGNE DE 'B' AFIN
                                     < QUE LE RESTE SOIT POSITIF OU NUL,
         LRM         W
         WORD        ASHT            < (W)=ADRESSE DE LA TABLE D'ACCELERATION.
         LAI         0
         DV          LASHT           < (B)=COUPLE (Y,X) MODULO 'ASHPR',
         ADR         B,W             < CE QUI DONNE DANS 'W' L'ADRESSE D'UNE
                                     < ENTREE :
         LA          ASHT1,W
         CP          SAVYX           < L'ENTREE COURANTE CONTIENT-ELLE (Y,X) ???
         JNE         SPAPS1          < NON, IL FAUT ACCEDER REELLEMENT A 'TV1'/
                                     < 'TV2'...
         LA          ASHT2,W         < OUI, MAIS
         EOR         XCTCDA          < ON VA ANSI REGARDER SIMULTANEMENT SI
                                     < L'ENTREE EST OCCUPEE, ET SI OUI, S'IL
                                     < Y A COINCIDENCE AVEC 'TV1'/'TV2'...
         JAL         SPAPS1          < ET BIEN NON, CE N'EST PAS (XS,YS)...
         CPI         NIVMAX          < ALORS ???
         JLE         SPAPS2          < ON A TROUVE (XS,YS), ET 'TV1'/'TV2' EST
                                     < LE MEME, ALORS :
                                     < (A)=NIVEAU(XS,YS)...
XWOR%:   VAL         0
<
< ACCES REEL AU POINT (XS,YS) :
<
SPAPS1:  EQU         $
         LR          X,A
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1   < B=NUMERO DU MOT DANS LA LIGNE,
         SLRS        NBITMO-XWOR%1
         LXI         NBITMO-BIT
         SBR         A,X             < X=DECALAGE D'ACCES AUX BITS,
         PSR         X
         XR          Y,B
         SLLD        NMOTL=0+NBITMO
         ORR         Y,A             < A=NUMERO DU MOT DANS LA TRAME.
         AD          XCTCDA          < POUR PERMETTRE UN ACCES A TV1/TV2...
         BSR         AGETS           < ACCES A LA 'CDAI'...
         PLR         X               < RESTAURATION DU DECALAGE,
         LA          MCDAR
         SLRS        0,X
         SLRD        BIT             < RECUPERATION D'UN BIT ROUGE,
         LA          MCDAV
         SLRS        0,X
         SLRD        BIT             < RECUPERATION D'UN BIT VERT,
         LA          MCDAB
         SLRS        0,X
         ANDI        BIT             < RECUPERATION D'UN BIT BLEU,
         SLLD        NCOOL-BIT       < A=NIVEAU DE GRIS DU POINT.
         IF          ASHPR,XWOR%9,XWOR%9,
<
< MEMORISATION DE (XS,YS) :
<
         OR          XCTCDA          < (A)='TV1'/'TV2',NIVEAU(XS,YS) :
         IF          TV1?TV2(NIVMAX,,XWOR%,
         IF          ATTENTION : LA CONCATENATION 'TV1'/'TV2' ET NIVEAU
         IF          EST IMPOSSIBLE !!!
XWOR%:   VAL         0
         STA         ASHT2,W         < MEMORISATION DE LA TRANSLATION ET DU
                                     < NIVEAU,
         ANDI        NIVMAX          < ET RESTAURATION DU NIVEAU(XS,YS)...
         LB          SAVYX
         STB         ASHT1,W         < ET MEMORISATION DE (XS,YS)...
XWOR%9:  VAL         0
<
< SORTIE DU MODULE :
<
SPAPS2:  EQU         $
         PLR         B,X,Y,W
         RSR
         PAGE
         IF          ASHPR,XWOR%,XWOR%,
<
<
<        T A B L E   A   A C C E S   A L E A T O I R E  :
<
<
ASHT:    EQU         $
         DO          ASHPR
         BYTE        0;0             < COUPLES (Y,X).
         DO          ASHPR
         WORD        INOC            < ETAT INOCCUPE.
XWOR%:   VAL         0
         PAGE
         IF          XOPT05-XXX256,XOPT5,,XOPT5
<
<
<        R A N G E M E N T   D ' U N   P O I N T   S C R A T C H  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RANGE LE
<                    NIVEAU D'UN POINT SUR 3 BITS
<                    PARALLELES EN SCRATCH.
<
<
<        AGUMENTS :
<                    XS,YS = COORDONNEES DU POINT,
<                    A = SON NIVEAU DE GRIS.
<
<
SPSPS:   EQU         $
         PSR         A,B,X,Y
         LX          XS              < POSITIONNEMENT AU POINT
         LY          YS              < SCRATCH (XS,YS).
         IF          XOPT03-XXXOUI,XOPT3,,XOPT3
<
< TEST DES OVER-SCREEN :
<
         PSR         A               < SAUVEGARDE DU NIVEAU.
         LR          X,A             < (A)=XS :
         CPZ         MODX            < EST-ON SUR UN X-TORE ???
         JE          SPSPS2          < OUI...
         JAL         SPSPS3          < NON, ET OVER-SCREEN...
         CPI         NPOLM1
         JG          SPSPS3          < OVER-SCREEN...
SPSPS2:  EQU         $
         ANDI        NPOLM1          < ON PEUT ALORS CALCULER 'XS' MODULO...
         LR          A,X             < (X)=XS DANS L'ECRAN...
         LR          Y,A             < (A)=YS :
         CPZ         MODY            < EST-ON SUR UN Y-TORE ???
         JE          SPSPS4          < OUI...
         JAL         SPSPS3          < NON, ET OVERS-SCREEN...
         CPI         NLIGM1
         JG          SPSPS3          < OVER-SCREEN...
SPSPS4:  EQU         $
         ANDI        NLIGM1          < ON PEUT ALORS CALCULER 'YS' MODULO...
         LR          A,Y             < (Y)=YS DANS L'ECRAN...
         PLR         A               < RESTAURATION DU NIVEAU...
         FCMZ        FANAG           < Y-A-T'IL DES ANAGLYPHES ???
         JE          SPSPS6          < NON...
         STZ         XCTCDA          < ACCES A 'TV1'...
         STX         XS              < MISE A JOUR
         STY         YS              < DU POINT REEL A TRACER...
         LR          A,B             < OUI, IL FAUT TRACER AVEC UN .OR. :
         BSR         ASPGS           < (A)=NIVEAU ANTERIEUR,
<
<        TABLE DE "MULTIPLICATION" DES COULEURS ANAGLYPHIQUES :
<
<                   !ROUGE *ROUGE *VERT  *VERT  *JAUNE *JAUNE *JAUNE
<                   !MIN   *MAX   *MIN   *MAX   *MAX   *MOY   *MIN
<                   !  6   *  1   *  7   *  2   *  3   *  4   *  5
<                   !      *      *      *      *      *      *
<-------------------------------------------------------------------------------
< ROUGE MIN    6    !  6   *  1   *  5   *  4   *  3   *  4   *  5
<===============================================================================
< ROUGE MAX    1    !  1   *  1   *  4   *  3   *  3   *  4   *  4
<===============================================================================
< VERT MIN     7    !  5   *  4   *  7   *  2   *  3   *  4   *  5
<===============================================================================
< VERT MAX     2    !  4   *  3   *  2   *  2   *  3   *  4   *  4
<===============================================================================
< JAUNE MAX    3    !  3   *  3   *  3   *  3   *  3   *  3   *  3
<===============================================================================
< JAUNE MOY    4    !  4   *  4   *  4   *  4   *  3   *  4   *  4
<===============================================================================
< JAUNE MIN    5    !  5   *  4   *  5   *  4   *  3   *  4   *  5
<
<                    (SACHANT QUE LE NOIR '0' NE CHANGE PAS LES COULEURS)
<
         SLLS        NIVMAX+1=0
         ORR         A,B             < ON CONCATENE LES 2 NIVEAUX, SACHANT
                                     < QUE LA TABLE DE MULTIPLICATION EST
                                     < SYMETRIQUE...
         XR          B,X
         LBY         &ATANAG         < (A)=NIVEAU RESULTANT...
         XR          B,X             < RESTAURATION DE X...
SPSPS6:  EQU         $
XOPT3:   VAL         0
         PSR         A,W             < SAUVEGARDE DU NOUVEAU NIVEAU...
         IF          ASHPR,XWOR%,XWOR%,
<
< MISE A JOUR EVENTUELLE DE L'ACCELERATEUR :
<
         SWBR        Y,B
         ORR         X,B             < (B)=(Y,X),
         PSR         A,B             < SAUVEGARDE DU NIVEAU (A) ET DE (Y,X) EN
                                     < (B).
         RBT         NBITMO          < SUPRESSION DU BIT DE SIGNE DE 'B' AFIN
                                     < QUE LE RESTE SOIT POSITIF OU NUL,
         LRM         W
         WORD        ASHT            < (W)=ADRESSE DE LA TABLE D'ACCELERATION.
         LAI         0
         DV          LASHT           < (B)=COUPLE (Y,X) MODULO 'ASHPR',
         ADR         B,W             < CE QUI DONNE DANS 'W' L'ADRESSE D'UNE
                                     < ENTREE :
         PLR         A,B             < RESTAURATION :
                                     < (A)=NIVEAU(XS,YS),
                                     < (B)=(YS,XS).
         OR          XCTCDA
         XR          A,B             < (A)=(YS,XS),
                                     < (B)='TV1'/'TV2', NIVEAU.
         CP          ASHT1,W         < EST-CE LE MEME (YS,XS) ???
         JNE         SPSPS1          < NON, ON NE TOUCHE PAS A LA TABLE...
         LA          ASHT2,W         < OUI, COMPARONS 'TV1'/'TV2'...
         EORR        B,A
         JAL         SPSPS1          < DIFFERENT, OU ENTREE INOCCUPEE POUR
                                     < LE COUPLE (0,0)...
         CPI         NIVMAX
         JG          SPSPS1          < MEME REMARQUE...
         STB         ASHT2,W         < OK, IL S'AGIT DU MEME POINT, ON MET
                                     < EVENTUELLEMENT A JOUR LE NIVEAU...
XWOR%:   VAL         0
<
< RANGEMENT :
<
SPSPS1:  EQU         $
         LR          X,A
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1
         SLRS        NBITMO-XWOR%1
         LXI         NBITMO-BIT
         SBR         A,X             < X=AMPLITUDE DU DECALAGE...
         PSR         X
         XR          Y,B
         SLLD        NMOTL=0+NBITMO
         ORR         Y,A             < A=ADRESSE DU MOT ROUGE CONTENANT
                                     < (XS,YS) DANS LA 'CDA'...
         BSR         AGETS           < ACCES A LA 'CDAI'...
         PLR         X               < X=AMPLITUDE DU DECALAGE,
         STA         WORK1           < SAUVEGARDE DE LA DERNIERE ADRESSE...
         PLR         A,W             < A=NIVEAU DE GRIS DE (XS,YS).
         SLRD        NCOOL           < ET CADRAGE DANS 'B'...
         LA          MCDAB           < MSE A JOUR DU BLEU,
         BSR         ADECAL          < CONCATENATION...
         STA         MCDAB
         LA          MCDAV           < MISE A JOUR DU VERT,
         BSR         ADECAL          < CONCATENATION...
         STA         MCDAV
         LA          MCDAR           < MISE A JOUR DU ROUGE.
         BSR         ADECAL          < CONCATENATION...
         STA         MCDAR
         LA          WORK1           < A=ADRESSE EN 'CDA' DU BLEU...
         LRM         B,X
         WORD        MCDAB
         WORD        1
         WCDA
                                     < MISE A JOUR DU BLEU,
         LRM         B,X
         WORD        MCDAV
         WORD        1
         SBR         Y,A
         WCDA
                                     < MISE A JOUR DU VERT,
         LRM         B,X
         WORD        MCDAR
         WORD        1
         SBR         Y,A
         WCDA
                                     < MISE A JOUR DU ROUGE.
SPSPS5:  EQU         $
         PLR         A,B,X,Y
         RSR
         IF          XOPT03-XXXOUI,XOPT3,,XOPT3
<
< SORTIE OVER-SCREEN :
<
SPSPS3:  EQU         $
         PLR         A               < RESTAURATION DU NIVEAU,
         JMP         SPSPS5          < VERS LA SORTIE...
XOPT3:   VAL         0
<
<
<        C O N C A T E N A T I O N  :
<
<
DECAL:   EQU         $
         SCRS        0,X
         SLRS        BIT
         SLLD        BIT
         SCLS        0,X
         RSR
XOPT5:   VAL         0
         PAGE
<
<
<        A C C E S   ' C D A I '  :
<
<
<        FONCTION :
<                      IL S'AGIT D'UN MODULE DE
<                    LECTURE DE LA 'CDAI' COMMUN
<                    A 'SPSPS' ET 'SPAPS'.
<
<
GETS:    EQU         $
         LRM         B,X,Y
         WORD        MCDAR
         WORD        1
         WORD        LIMAG           < Y=POUR PASSER D'UNE COULEUR A L'AUTRE.
         RCDA
                                     < ACCES AU MOT ROUGE,
         LRM         B,X
         WORD        MCDAV
         WORD        1
         ADR         Y,A
         RCDA
                                     < ACCES AU MOT VERT,
         LRM         B,X
         WORD        MCDAB
         WORD        1
         ADR         Y,A
         RCDA
                                     < ACCES AU MOT BLEU.
         RSR
         PAGE
         IF          XOPT05-XXX512,XOPT5,,XOPT5
<
<
<        M A R Q U A G E   D ' U N   P A V E   D E   4   P O I N T S  :
<
<
<        FONCTION :
<                      DANS UN PREMIER TEMPS, ON
<                    N'UTILISE PAS LA DEFINITION
<                    512*512, MAIS UNIQUEMENT LES
<                    256 COULEURS ; ET CECI A CAUSE
<                    DE L ATAILLE DU Z-BUFFER, ET
<                    AUTRES CHOSES...
<
<
<        ARGUMENTS :
<                    (XS,YS)=COORDONNEES DANS (0,255),
<                    (A)=NIVEAU(XS,YS).
<
<
SPSPS:   EQU         $
         PSR         B,X,Y           < SAUVEGARDES...
<
< CHOIX DU MODE :
<
         CPZ         IDEF            < VRAI OU FAUX 512 ???
         JNE         SPSPS6          < VRAI 512...
<
< CAS DU FAUX 512, CHAN-
< GEMENT D'ECHELLE :
<
         LX          XS              < (X)=(XS),
         LY          YS              < (Y)=(YS)...
         ADR         X,X             < ET ON DOUBLE
         ADR         Y,Y             <              LES ECHELLES...
         LB          AYMAX
         SBR         B,Y
         NGR         Y,Y             < EN EFFET, LES AXES DES 'Y' DES 2
                                     < SYSTEMES SONT INVERSES...
<
< MARQUAGE D'UN CARRE :
<
         BSR         ASTORP          < (X,Y) <-- (A),
         ADRI        I,X
         BSR         ASTORP          < (X+1,Y) <-- (A),
         ADRI        -I,Y
         BSR         ASTORP          < (X+1,Y-1) <-- (A),
         ADRI        -I,X
         BSR         ASTORP          < (X,Y-1) <-- (A).
<
< SORTIE :
<
SPSPS5:  EQU         $
         PLR         B,X,Y
         RSR
<
< CAS DU VRAI 512 :
<
SPSPS6:  EQU         $
         LX          XS2             < (X)=(XS2),
         LY          YS2             < (Y)=(YS2),
         LB          AYMAX
         SBR         B,Y
         NGR         Y,Y             < INVERSION DE L'AXE 'Y'...
         BSR         ASTORP          < (X,Y) <-- (A).
         JMP         SPSPS5          < ET C'EST TOUT...
<
< SORTIES EN OVER-SCREEN :
<
SPSPS3:  EQU         $
         PLR         A               < RESTAURATION DU NIVEAU...
         JMP         SPSPS5          < VERS LA SORTIE...
XOPT5:   VAL         0
         PAGE
<
<
<        E X T R A C T I O N   D ' U N E   R A C I N E   C A R R E E  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME EXTRAIT LA
<                    RACINE CARREE D'UN NOMBRE PAR
<                    LA METHODE DE NEWTON, C'EST-A-DIRE
<                    A PARTIR DE LA SUITE :
<                    U(N+1)=(U(N)+K/U(N))/2,
<                    OU K DESIGNE LE NOMBRE DONT ON
<                    EXTRAIT LA RACINE...
<
<
<        ARGUMENT :
<                    A,B=NOMBRE DONT ON EXTRAIT LA RACINE.
<
<
<        RESULTAT :
<                    A,B=RACINE DU NOMBRE ARGUMENT.
<
<
RAC:     EQU         $
         BSR         AFCAZ
         JE          RAC2            < NOMBRE=0 ==> RACINE=0...
         JG          RAC3            < OK, NOMBRE>0...
         QUIT        1               < ??!??!?!
RAC3:    EQU         $
         PSR         X,Y
         LR          A,X             < X ET
         LR          B,Y             < Y MEMORISENT LE NOMBRE ARGUMENT.
RAC1:    EQU         $
         BSR         ASFWOR
         LR          X,A
         LR          Y,B
         FDV         FWORK           < K/U(N),
         FAD         FWORK           < U(N)+K/U(N),
         FMP         F05             < (U(N)+K/U(N))/2.
         FCAM        FWORK           < TEST DE FIN ???
         JNE         RAC1            < NON...
         PLR         X,Y
RAC2:    EQU         $
         RSR
         EOT         #SIP FONCTION#
         PAGE
<
<
<        A U   C A S   O U ...
<
<
FLOC:   @
         IF          4=XFSYMB('0080)'0080,XWOR%,,XWOR%
         LOCAL
FLOC:    EQU         $
XWOR%:   VAL         0
SPU:    @
         IF          3=XFSYMB('0080)'0080,XWOR%,,XWOR%
         PROG
SPU:     EQU         $
         FLD         VARU            < ELEMENT NEUTRE...
         RSR
XWOR%:   VAL         0
SPV:    @
         IF          3=XFSYMB('0080)'0080,XWOR%,,XWOR%
         PROG
SPV:     EQU         $
         FLD         VARV            < ELEMENT NEUTRE...
         RSR
XWOR%:   VAL         0
SPW:    @
         IF          3=XFSYMB('0080)'0080,XWOR%,,XWOR%
         PROG
SPW:     EQU         $
         FLD         F0              < ELEMENT NEUTRE...
         RSR
XWOR%:   VAL         0
         PAGE
<
<
<        F I N   D E   L ' O V E R L A Y  :
<
<
XWOR%1:  VAL         $-DEBOV1*NOCMO
LOVLG:   EQU         ZERO+XWOR%1
         IF          ITEM1-$,XWOR%,XWOR%,
LOVL2:   EQU         LOVLG           < POUR LE CHARGEMENT PARTIEL.
XWOR%:   VAL         0
         IF          ITEM1-$,,,XWOR%
XWOR%1:  VAL         ITEM1-DEBOV1*NOCMO
LOVL2:   EQU         ZERO+XWOR%1     < ON TRONQUE LORSQUE L'OVERLAY ECRASE
                                     < L'ITEM1...
XWOR%:   VAL         0
         PAGE
<
<
<        G E N E R A T I O N   E T   V A L I D A T I O N  :
<
<
         IF          $-ZERO-PILE,XWOR%,,
         IF          ATTENTION : LA BRANCHE D'OVERLAY EST TROP LONGUE !!!
XWOR%:   VAL         0
         PAGE
<
<
<        G E N E R A T I O N   D U   P R O C E S S E U R :
<
<
         LOCAL
XXXLOC:  EQU         $
XXXCCI:  WORD        1               < RETOUR AU CCI.
XXXMOK:  BYTE        '6D;"O"
         ASCI        "K!"            < MESSAGE 'OK!'.
XXXDOK:  WORD        '0202           < ENVOI DU MESSAGE 'OK'.
         WORD        XXXMOK-ZERO*NOCMO
         WORD        4
GENOV1:  WORD        '8402           < DEMANDE DE GENERATION DU PROCESSEUR.
         WORD        BRANCH-ZERO*NOCMO
         WORD        ZERO-BRANCH+PILE-LTNI-LTNI*NOCMO
         WORD        -1
GENOV2:  WORD        '8402           < GENERATION DE L'OVERLAY.
         WORD        DEBOV1-ZERO*NOCMO
         WORD        LOVLG
         WORD        -1
XXXPIL:  DZS         2               < PILE DE GENERATION.
         PROG
         USE         L,XXXLOC+'80
         WORD        XXXLOC+'80      < VALEUR INITIALE DE LA BASE L.
XXXGEN:  EQU         $
         LRP         L               < INITIALISATION DE LA BASE L.
         LA          -1,L
         LR          A,L
         LAD         XXXPIL-1        < INITIALISATION DE L'ADRESSE DE PILE.
         LR          A,K
<
<        TENTATIVE DE GENERATION DE L'OVERLAY 1.
<
XXXGN7:  EQU         $
         LAD         GENOV1          < GENERATION DU PROCESSEUR.
         SVC         0
         JE          XXXGN8          < OK ...
<
<        ERREUR - L'OVERLAY EXISTE DEJA.
<
         LAD         XXXCCI          < RETOUR CCI.
         SVC         0
         JMP         XXXGN7          < ET REESSAI.
<
<        BONNE GENERATION.
<
XXXGN8:  EQU         $
         LAD         XXXDOK          < ENVOI MESSAGE OK.
         SVC         0
         LAD         XXXCCI          < ET RETOUR AU CCI.
         SVC         0
<
< TENTATIVE DE GENERATION :
<
XXXGN1:  EQU         $
         LAD         GENOV2          < GENERATION DE L'OVERLAY.
         SVC         0               < ENVOI DEMANDE DE GENERATION.
         JNE         XXXGN2          < ERREUR : IL EXISTE DEJA!!!
<
< OK , BONNE GENERATION :
<
         LAD         XXXDOK
         SVC         0               < ENVOI DU MESSAGE OK.
<
< RETOUR DEFINITIF AU CCI :
<
XXXGN3:  EQU         $
         LAD         XXXCCI
         SVC         0               < RETOUR AU CCI.
         JMP         XXXGN3          < CAS DES !GO.
<
< CAS DES ERREURS DE GENERATION :
< LE PROCESSEUR EXISTE DEJA:
<
XXXGN2:  EQU         $
         LAD         XXXCCI
         SVC         0               < RETOUR PROVISOIRE AU CCI.
         JMP         XXXGN1          < TRY AGAIN LA GENERATION.
         END         XXXGEN



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