NMTZ:    VAL         "T6"
NMP:     VAL         " 0"
         IF          NMPROC-NMTZ,,XWOR%,
         IF          NMPROC-NMP,,XWOR%,
         IF          ATTENTION : 'NMPROC' EST MAUVAIS !!!
XWOR%:   VAL         0
         IF          NMPROC-NMTZ,XWOR%9,,XWOR%9
         IDP         "T6 - VERSION TRANSFORMATION QUELCONQUE DE TW"
XWOR%9:  VAL         0
         IF          NMPROC-NMP,XWOR%9,,XWOR%9
         IDP         " 0 - VERSION DE 'T6' INTERPRETATIVE"
XWOR%9:  VAL         0
         IDP         "RELEASE 29/06/1981"
         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
<
<
<        S E L E C T I O N   D U   M O D E   D ' E N T R E E  :
<
<
NMPROD:  VAL         NMPROC          < SAUVEGARDE DU NOM REEL DU PROCESSEUR,
                                     < ON NE SAIT JAMAIS ??!?!?!?
VISU:    VAL         0               < MODE D'ENTREE PAR LA VISU,
ITEM:    VAL         1               < MODE D'ENTREE PAR L'ITEM1.
MODE:    VAL         VISU            < A PRIORI, 'TW'/'TX' : ENTREE VISU...
         IF          NMPROC-NMP,XWOR%,,XWOR%
NMPROC:  VAL         NMTZ            < SI " 3", ON LE REMPLACE PAR "T3",
MODE:    VAL         ITEM            < AVEC ENTREE PAR L'ITEM1.
XWOR%:   VAL         0
         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
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
AMASK::  VAL         NCOOL*LIMAG+TV1 < ADRESSE DU MASQUE DANS LA 'CDA'.
IZBUF::  VAL         AMASK+LIMAG     < DEBUT DU BLOC COURANT DU Z-BUFFER DANS
                                     < LA 'CDA' QUAND ON EST EN '!CDAI'...
LIZBUF:: VAL         '1000           < LE Z-BUFFER EST DECOUPE EN BLOCS DE
                                     < 4K MOTS,
NZBUF::  VAL         16              < CE QUI FAIT DONC 16 BLOCS...
XWOR%1:  VAL         1024
XWOR%2:  VAL         LIZBUF/XWOR%1*NZBUF
XWOR%3:  VAL         LIMAG/XWOR%1*NBITMO
         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'...
TV2::    VAL         IZBUF+LIZBUF    < ADRESSE DE LA DEUXIEME IMAGE SCRATCH
                                     < UTILISEE EN PARTICULIER POUR LA MODU-
                                     < LATION D'AMPLITUDE SUR LA NORMALE.
LNOMP:   VAL         LNOM-1          < LONGUEUR UTILE DU NOM (A CAUSE DE
                                     < L'EOT A PRIORI...
         PROG
         PAGE
<
<
<        M E S S A G E S  :
<
<
MMCDA:   BYTE        5;'6D
MCDAI:   ASCI        "!CDA"
         BYTE        "I";EOT
MCDA:    ASCI        "!CDA"
         BYTE        EOT;0
REP:     DZS         NBRHEX/NOCMO    < BUFFER DES REPONSES.
MERR:    BYTE        1;"?"
         IF          MODE-VISU,XWOR%7,,XWOR%7
MINT:    BYTE        2;'6D;">";0
MNOM:    BYTE        5;'6D
         ASCI        "NOM="
MORGX:   BYTE        3;'6D
         ASCI        "X="
MORGY:   BYTE        3;'6D
         ASCI        "Y="
MTORE:   BYTE        6;'6D
         ASCI        "TORE? "
MK:      BYTE        3;'6D
         ASCI        "K="
MH:      BYTE        3;'6D
         ASCI        "H="
MCT:     BYTE        1;"="
MNMOD:   BYTE        7;'6D
         ASCI        "N-MOD?"
MN:      BYTE        3;'6D
         ASCI        "N="
MECL:    BYTE        5;'6D
         ASCI        "LIT?"
MALIAS:  BYTE        5;'6D
         ASCI        "INT?"
MESX:    BYTE        4;'6D
         ASCI        "SX= "
MESY:    BYTE        4;'6D
         ASCI        "SY= "
MESZ:    BYTE        4;'6D
         ASCI        "SZ= "
MPROJ:   BYTE        3;'6D
         ASCI        "P="
MODM:    BYTE        5;'6D
         ASCI        "MOD="
MASKO:   BYTE        7;'6D
         ASCI        "MK ON?"
MSLAS:   BYTE        1;"/"
MTRX:    BYTE        4;'6D
         ASCI        "CX= "
MTRY:    BYTE        4;'6D
         ASCI        "CY= "
MZR:     BYTE        4;'6D
         ASCI        "ZR= "
MTR:     BYTE        4;'6D
         ASCI        "TR= "
MKFU:    BYTE        5;'6D
         ASCI        "KFU="
MKFV:    BYTE        5;'6D
         ASCI        "KFV="
MKFW:    BYTE        5;'6D
         ASCI        "KFW="
MKFT:    BYTE        5;'6D
         ASCI        "KFT="
MKUX:    BYTE        5;'6D
         ASCI        "KUX="
MKVX:    BYTE        5;'6D
         ASCI        "KVX="
MKWX:    BYTE        5;'6D
         ASCI        "KWX="
MKTX:    BYTE        5;'6D
         ASCI        "KTX="
MKUY:    BYTE        5;'6D
         ASCI        "KUY="
MKVY:    BYTE        5;'6D
         ASCI        "KVY="
MKWY:    BYTE        5;'6D
         ASCI        "KWY="
MKTY:    BYTE        5;'6D
         ASCI        "KTY="
MKUZ:    BYTE        5;'6D
         ASCI        "KUZ="
MKVZ:    BYTE        5;'6D
         ASCI        "KVZ="
MKWZ:    BYTE        5;'6D
         ASCI        "KWZ="
MKTZ:    BYTE        5;'6D
         ASCI        "KTZ="
MKRX:    BYTE        4;'6D
         ASCI        "KX= "
MKRY:    BYTE        4;'6D
         ASCI        "KY= "
MKRZ:    BYTE        4;'6D
         ASCI        "KZ= "
MTRANS:  BYTE        7;'6D
         ASCI        "TRANS?"
XWOR%7:  VAL         0
<
< ZONE EN RECOUVREMENT :
<
BUFIN:   EQU         ITEM2+'518      < BUFFER D'ENTREE DES FONDS.
LBUFIN:  VAL         NBITMO/NOCMO
LBUFMH:  VAL         NPOLM1+1/NBITMO < LONGUEUR DU MASQUE HORIZONTAL,
LBUFMV:  VAL         NLIGM1+1/NBITMO < LONGUEUR DU MASQUE VERTICAL.
BUFMH:   EQU         BUFIN+LBUFIN    < MASQUE HORIZONTAL,
BUFMV:   EQU         BUFMH+LBUFMH    < MASQUE VERTICAL.
LSTACK:: VAL         30              < LONGUEUR DE LA PILE DE TRAVAIL.
STACK:   EQU         BUFMV+LBUFMV    < PILE DE TRAVAIL.
         IF          ITEM1-STACK-LSTACK,,,XWOR%
         IF          ATTENTION : LA ZONE EN RECOUVREMENT DE
         IF          L'ITEM2, RECOUVRE AUSSI L'ITEM1 !!!
XWOR%:   VAL         0
         PAGE
<
<
<        L O C A L  :
<
<
         LOCAL
LOC:     EQU         $
<
< CONSTANTES :
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
NGE:     ASCI        "GE"            < NOM DU PROCESSEUR DE RETOUR.
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
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.
XWOR%7:  VAL         0
SAVEK:   WORD        0               < SAUVEGARDE DU REGISTRE 'K'.
KIN:     WORD        -1              < COMPTEUR DES ENTREES...
         IF          MODE-VISU,XWOR%7,,XWOR%7
NMOTS:   WORD        2*LTNI          < LONGUEUR MOTS DES 2 ITEMS.
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
NMOTS:   WORD        LTNI            < POUR NE RAZER QUE L'ITEM2...
XWOR%7:  VAL         0
IMASKO:  WORD        0               < 0 : MASK OFF,
                                     < 1 : MASK ON...
         IF          MODE-ITEM,XWOR%7,,XWOR%7
<
< 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.
XWOR%7:  VAL         0
<
< RELAIS DE TABLES, D'IMAGES...
<
ACOM:    WORD        KOM,X           < TABLE DES COMMANDES RECONNUES.
AMERR:   EQU         MERR            < MESSAGE D'ERREUR.
         IF          MODE-VISU,XWOR%7,,XWOR%7
AMINT:   EQU         MINT            < MESSAGE D'INVITATION.
AMNOM:   EQU         MNOM            < "NOM="
AMORGX:  EQU         MORGX           < "ORGX="
AMORGY:  EQU         MORGY           < "ORGY="
AMTORE:  EQU         MTORE           < "TORE?"
AMASKO:  EQU         MASKO           < "MASK ON?"
AMSLAS:  EQU         MSLAS           < "/"
AMTRX:   EQU         MTRX            < "TX="
AMTRY:   EQU         MTRY            < "TY="
AMK:     EQU         MK              < "K="
AMH:     EQU         MH              < "H="
AMCT:    EQU         MCT             < "="
AMNMOD:  EQU         MNMOD           < "N-MOD?"
AMN:     EQU         MN              < "N="
AMECL:   EQU         MECL            < "ECLAIRAGE?"
AMALIA:  EQU         MALIAS          < "INTER?"
AMESX:   EQU         MESX            < "SX="
AMESY:   EQU         MESY            < "SY="
AMESZ:   EQU         MESZ            < "SZ="
AMZR:    EQU         MZR             < "ZR="
AMTR:    EQU         MTR             < "TR="
AMKFU:   EQU         MKFU            < "KFU="
AMKFV:   EQU         MKFV            < "KFV="
AMKFW:   EQU         MKFW            < "KFW="
AMKFT:   EQU         MKFT            < "KFT="
AMKUX:   EQU         MKUX            < "KUX="
AMKVX:   EQU         MKVX            < "KVX="
AMKWX:   EQU         MKWX            < "KWX="
AMKTX:   EQU         MKTX            < "KTX="
AMKUY:   EQU         MKUY            < "KUY="
AMKVY:   EQU         MKVY            < "KVY="
AMKWY:   EQU         MKWY            < "KWY="
AMKTY:   EQU         MKTY            < "KTY="
AMKUZ:   EQU         MKUZ            < "KUZ="
AMKVZ:   EQU         MKVZ            < "KVZ="
AMKWZ:   EQU         MKWZ            < "KWZ="
AMKTZ:   EQU         MKTZ            < "KTZ="
AMPROJ:  EQU         MPROJ           < "P="
AMODM:   EQU         MODM            < "MODE="
AMKRX:   EQU         MKRX            < "KX="
AMKRY:   EQU         MKRY            < "KY="
AMKRZ:   EQU         MKRZ            < "KZ"
AMTRAN:  EQU         MTRANS          < "TRANS?"
XWOR%7:  VAL         0
AREP:    WORD        REP             < ACCES AU BUFFER DE REPONSE...
AREPX:   WORD        REP,X           < DE MEME EN INDEXE...
ABUFIN:  WORD        BUFIN,X         < ACCES AU BUFFER DE GENERATION DU FOND.
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...
<
< RELAIS DE SOUS-PROGRAMMES :
<
AOVL:    WORD        OVL             < CHARGEMENT DES OVERLAYS...
         IF          MODE-VISU,XWOR%7,,XWOR%7
APRINT:  WORD        PRINT           < EDITION D'UN MESSAGE.
APIN:    WORD        PIN             < EDITION MESSAGE+ENTREE CARACTERE.
APIHEX:  WORD        PIHEX           < EDITION MESSAGE+ENTREE 4 CHIFFRES.
XWOR%7:  VAL         0
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.
AHEX:    WORD        HEX             < CONVERSION DE 4 CHIFFRES HEXAS EN BINAIRE
ACCI:    WORD        CCI             < ACCES AU CCI.
AGOSGN:  WORD        GOSGN           < POUR ACCEDER AU SGN...
ASPSCD:  WORD        SPSCD           < TRANSFERT BRUTAL EN SCRATCH.
ASPBCD:  WORD        SPBCD           < TRANSFERT EN RESIDENT SANS MASQUE.
APMOV5:  WORD        PMOV5           < TV R --> RESIDENT,
APMOV6:  WORD        PMOV6           < TV V --> RESIDENT,
APMOV7:  WORD        PMOV7           < TV B --> RESIDENT.
ASPTR:   WORD        SPTR            < (XS,YS) <-- TRANS(XR,YR).
ASPTR1:  WORD        SPTR1           < SORTIE DU S/P DE TRANS...
APTRAN:  WORD        PTRANS          < COEFFICIENT MATRICE 3*3.
ASP:     WORD        0               < RELAI VARIABLE CONTENANT L'ADRESSE DE
                                     < L'UN DES SOUS-PROGRAMMES PRECEDENTS.
ASPOP:   WORD        SPOP            < OPERATIONS INTER-IMAGES...
ALOOP:   WORD        LOOP            < BOUCLE DE L'INTERROGATION.
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'.
         IF          MODE-ITEM,XWOR%7,,XWOR%7
APIN:    EQU         AIN
APIHEX:  EQU         AIHEX
AALTM:   WORD        ALTM            < TRAITEMENT DES RETOURS BRUTAUX...
XWOR%7:  VAL         0
<
< 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
         IF          MODE-VISU,XWOR%7,,XWOR%7
NOMBB::  VAL         "Y"             < NOM DE LA BRANCHE D'OVERLAY.
NOMOV1:: VAL         " ">NBITOC?NOMBB
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
NOMBB::  VAL         "*"             < NOM DE LA BRANCHE D'OVERLAY.
NOMOV1:: VAL         " ">NBITOC?NOMBB
XWOR%7:  VAL         0
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'.
DEMTVR:  WORD        TVDKU           < ACCES AU ROUGE.
         WORD        IMAGR-ZERO*NOCMO
         WORD        LIMAG*NOCMO
         WORD        TVPR
DEMTVV:  WORD        TVDKU           < ACCES AU VERT.
         WORD        IMAGV-ZERO*NOCMO
         WORD        LIMAG*NOCMO
         WORD        TVPV
DEMTVB:  WORD        TVDKU           < ACCES AU BLEU.
         WORD        IMAGB-ZERO*NOCMO
         WORD        LIMAG*NOCMO
         WORD        TVPB
DEMTV:   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 DE L'OVERLAY DE 'TZ'.
         WORD        OVLTZ2
         WORD        LOVL2
         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          MODE-ITEM,XWOR%7,,XWOR%7
SITEM1:  DZS         LNOM/NOCMO      < POUR SAUVEGARDER LA FIN DE L'ITEM1.
XWOR%7:  VAL         0
<
< DONNEES POUR DETERMINER LA TRANSFORMEE
< DU CARRE DE BASE DU MAILLAGE DE L'IMAGE
< DE BASE :
<
FPAS:    FLOAT       0               < PAS DU MAILLAGE INTERIEUR AU CARRE
                                     < UNITE DE L'IMAGE DE BASE.
NPAS:    WORD        0               < NOMBRE DE PAS (=INVERSE DE 'FPAS').
FINCU:   FLOAT       0               < INCREMENT DE 'FXR' A L'INTERIEUR DU
                                     < CARRE DE BASE.
FINCV:   FLOAT       0               < DE MEME POUR 'FYR'...
VECU1:   FLOAT       0
VECU2:   FLOAT       0
VECU3:   FLOAT       0
VECU4:   FLOAT       0
VECV1:   FLOAT       0
VECV2:   FLOAT       0
VECV3:   FLOAT       0
VECV4:   FLOAT       0
VECW1:   FLOAT       0
VECW2:   FLOAT       0
VECW3:   FLOAT       0
VECW4:   FLOAT       0
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.
FNIV1:   FLOAT       0               < NIVEAU(XR,YR).
FNIV2:   FLOAT       0               < NIVEAU(XR+1,YR).
FNIV3:   FLOAT       0               < NIVEAU(XR+1,YR+1).
FNIV4:   FLOAT       0               < NIVEAU(XR,YR+1).
         PAGE
<
<
<        C O M M O N  :
<
<
         COMMON
COMON:   WORD        0               < MOT RESERVE POUR LE BLOC FLOTTANT.
<
< ACCES AU Z-BUFFER :
<
ZBUF:    WORD        0               < 0 : Z-BUFFER ACTIF (MODE NORMAL)...
                                     < 1 : INACTIF, MAIS DANGEREUX...
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
SDKU:    WORD        -1              < NUMERO DU BLOC COURANT, N'EXISTE PAS
                                     < AU CHARGEMENT.
MDKU:    WORD        0               < COMPTAGE DES MODIFS DU BLOC COURANT.
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...
<
< 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.
WORK2:   WORD        0               < VARIABLE DE TRAVAIL.
NM1:     WORD        0               < NIVEAU D'UN POINT ANTERIEUR,
NM2:     WORD        0               < NIVEAU MODULE D'UN POINT POSTERIEUR.
<
< DONNEES DE DERIVATION DE LA SURFACE :
<
DXDU:    EQU         VECU1           < DX/DU,
DXDV:    EQU         VECU2           < DX/DV,
DYDU:    EQU         VECU3           < DY/DU,
DYDV:    EQU         VECU4           < DY/DV,
DZDU:    EQU         VECV1           < DZ/DU,
DZDV:    EQU         VECV2           < DZ/DV.
NX:      EQU         VECV3           < X(NORMALE),
NY:      EQU         VECV4           < Y(NORMALE),
NZ:      EQU         VECW1           < Z(NORMALE).
NORMN:   EQU         VECW2           < NORME(NORMALE).
<
< N-MODULATION :
<
IMODN:   WORD        0               < 0 : PAS DE N-MODULATION,
                                     < 1 : ON DEPLACE LE POINT (XS,YS,ZS)
                                     <     LE LONG DE LA NORMALE PROPORTION-
                                     <     NELLEMENT AU NIVEAU DU POINT (XR,YR)
                                     <     DE L'IAMGE 'TV2'...
FMODN:   FLOAT       0               < CONSTANTE DE MODULATION.
<
< 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)
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
ACOEF:   WORD        COEF            < CALCUL DE LA MODULATION LUMINEUSE.
ANECL:   WORD        NECLX           < RELAI...
<
< CONSTANTES UTILES :
<
XR:      WORD        0               < COORDONNEE X D'UN POINT RESIDENT,
YR:      WORD        0               < COORDONNEE Y D'UN POINT RESIDENT,
ZR:      WORD        0               < COORDONNEE Z D'UN POINT RESIDENT,
TR:      WORD        0               < COORDONNEE T D'UN POINT RESIDENT.
XS:      WORD        0               < COORDONNEE X D'UN POINT SCRATCH,
YS:      WORD        0               < COORDONNEE Y D'UN POINT SCRATCH.
ORGX:    WORD        0               < ORIGINE EN X DE L'IMAGE SCRATCH
                                     < PAR RAPPORT A L'IMAGE RESIDENTE,
ORGY:    WORD        0               < DE MEME, ORIGINE EN Y...
<
< 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...
FWORK:   FLOAT       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 :
<
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).
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.
ARAC:    WORD        RAC             < EXTRACTION D'UNE RACINE CARREE...
<
< SOUS-PROGRAMMES SPECIFIQUES :
<
SPUVW:   EQU         $
ASPU:    WORD        SPU             < COMPOSANTE 'U' D'UN VECTEUR,
XSPU::   VAL         $-SPUVW-1       < INDEX COMPOSANTE U.
ASPV:    WORD        SPV             < COMPOSANTE 'V',
XSPV::   VAL         $-SPUVW-1       < INDEX COMPOSANTE V.
ASPW:    WORD        SPW             < 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.
<
< 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.
         IF          MODE-VISU,XWOR%7,,XWOR%7
MAT:     BYTE        6;'6D
         ASCI        " M"
MATN:    WORD        0               < NUMERO DE L'ELEMENT COURANT...
         ASCI        "= "
XWOR%7:  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
F1:      FLOAT       1
F3:      FLOAT       3
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 :
<
F0:      FLOAT       0
FWORK1:  FLOAT       0               < TRAVAIL...
FWORK2:  FLOAT       0               < TRAVAIL...
VARUVW:  EQU         $
VARU:    FLOAT       0
XVARU::  VAL         $-VARUVW-2      < INDEX COORDONNEE U.
VARV:    FLOAT       0
XVARV::  VAL         $-VARUVW-2      < INDEX COORDONNEE V.
VARW:    FLOAT       0
XVARW::  VAL         $-VARUVW-2      < INDEX COORDONNEE W.
VART:    FLOAT       0
XVART::  VAL         $-VARUVW-2      < INDEX COORDONNEE T.
AVAR:    WORD        VARUVW,X        < REALI D'ACCES AUX COORDONNEES.
TRX:     WORD        0               < CX,
TRY:     WORD        0               < CY,
TRZ:     WORD        0               < CZ.
VECU:    FLOAT       0
VECV:    FLOAT       0
VECW:    FLOAT       0
NORMG:   EQU         VECW3           < NORME DU GRADIENT(F).
XNORMG:  EQU         VECW4           < VARIE DE 1*FK A NORMG*FK.
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
FXS:     FLOAT       0
FYS:     FLOAT       0
FZS:     FLOAT       0
FK:      FLOAT       1
<
< CONSTANTES DE DERIVATION :
<
FH:      FLOAT       0.01            < PAS DE DERIVATION NUMERIQUE.
F2H:     FLOAT       0.02
<
< CONSTANTES DE TRAVAIL ACCESSIBLES
< AU SOUS-PROGRAMME SPECIFIQUE PAR
< INDEXATION DOUBLE-MOT :
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
NCT::    VAL         1               < NOMBRE DE CONSTANTES DE TRAVAIL.
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
NCT::    VAL         16              < NOMBRE DE CONSTANTES DE TRAVAIL.
XWOR%7:  VAL         0
ACT:     WORD        CT,X            < RELAI D'ACCES.
ASPCT:   WORD        SPCT            < SOUS-PROGRAMME COMMUN D'ACCES.
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
AERROR:  WORD        ERROR           < ,
         WORD        DELETE          < - : DELETE SGN LE RESIDENT
         WORD        ERROR           <.
         WORD        ERROR           < /
         WORD        MOV0            < 0 : TV <-- RESIDENT R+V+B
         WORD        MOV1            < 1 : TV <-- RESIDENT R
         WORD        MOV2            < 2 : TV <-- RESIDENT V
         WORD        MOV3            < 3 : TV <-- RESIDENT B
         WORD        MOV4            < 4 : RESIDENT <-- TV R+V+B
         WORD        MOV5            < 5 : RESIDENT <-- TV R
         WORD        MOV6            < 6 : RESIDENT <-- TV V
         WORD        MOV7            < 7 : RESIDENT <-- TV B
         WORD        STV2            < 8 : TV2 <-- RESIDENT
         WORD        GTV2            < 9 : RESIDENT <-- TV2
         WORD        ERROR           < :
         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        ERROR           < ?
         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        ERROR           < E
         WORD        GOGE            < F : FIN
         WORD        ERROR           < G
         WORD        CDER            < H : ENTREE CONSTANTE DE DERIVATION
         WORD        ERROR           < I
         WORD        ERROR           < J
         WORD        INFK            < K : ENTREE CTTE TRANSFORMATION
         WORD        IMLOAD          < L : RESIDENT <-- (SCRATCH) SANS MASQUE
         WORD        ERROR           < M
         WORD        NAME            < N : NOMME L'IMAGE RESIDENTE
         WORD        ERROR           < O
         WORD        ERROR           < P
         WORD        ERROR           < Q
         WORD        TRANSM          < R : DEFINITION TRANSFORMATION MATRICIELLE
         WORD        IMSAV           < S : SCRATCH <-- (RESIDENT)
         WORD        TRANS           < T : TRACE DU CHAMP DE VECTEURS
         WORD        ERROR           < U
         WORD        VITRE           < V : GESTION DES TRANSPARENCES
         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
         IF          MODE-VISU,XWOR%7,,XWOR%7
<
<
<        E D I T I O N   D ' U N   M E S S A G E  :
<
<
<        ARGUMENT :
<                    A=ADRESSE MOT DU MESSAGE, DONT LE
<                    PREMIER OCTET EST LA LONGUEUR.
<
<
PRINT:   EQU         $
         PSR         A,X,C
         LR          A,C
         ADR         A,A
         ADRI        1,A             < CALCUL DE L'ADRESSE OCTET DU MESSAGE.
         STA         DEMOUT+1
         LBY         0,C             < ACCES A LA LONGUEUR...
         STA         DEMOUT+2
         LAD         DEMOUT
         SVC         0               < ENVOI DU MESSAGE...
         PLR         A,X,C
         RSR
XWOR%7:  VAL         0
         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.
<
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
ENTER:   EQU         $
         PSR         X
         SVC         0               < ENVOI DE LA DEMANDE...
         PLR         X
         RSR
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
ENTER:   EQU         $
         PSR         A,X,Y,W
         LR          A,W             < W=ADRESSE DE LA DEMANDE :
         LRM         A
         WORD        '0101
         CP          0,W             < EST-CE BIEN UNE ENTREE AVEC ECHO
                                     < SUR LA VISU UTILISATEUR ???
         JE          ENTER1          < OUI...
         QUIT        1               < NON, ???!???!
ENTER1:  EQU         $
         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
XWOR%7:  VAL         0
         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 : RETOUR 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
<
<
<        R E T O U R   A   ' G E '  :
<
<
GOGE:    EQU         $
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         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         $
         LRM         A,B,X
         WORD        SITEM1          < A=ZONE DE SAUVEGARDE,
         WORD        NOM             < B=ZONE A RESTAURER,
         WORD        LNOM/NOCMO      < X=NOMBRE DE MOTS A RESTAURER.
         MOVE                        < RESTAURATION DU BOUT DE L'ITEM1...
         LX          NMOTS
GOGE3:   EQU         $
         STZ         &AITEM2         < RAZ DE L'ITEM2...
         JDX         GOGE3
XWOR%7:  VAL         0
         CPZ         ZBUF            < ALORS ???
         JNE         GOGE4           < Z-BUFFER INACTIF...
         BSR         ASPDKU          < ECRITURE DU BLOC COURANT SI NECESSAIRE...
GOGE4:   EQU         $
         LA          SAVEK
         LR          A,K             < RESTAURATION DE 'K'...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAD         RELMEM
         SVC         0               < RETOUR A 4K MOTS...
         LX          NMOTS           < X=NOMBRE DE MOTS A RAZER...
TW2:     EQU         $
         STZ         &AITEM2         < RAZE DES ITEMS 1 ET 2.
         JDX         TW2
         LAI         BRANCH-ZERO
         LR          A,W             < RESTAURATION DE 'W'.
         STZ         MODCAL,W        < REINITIALISATION DU MODE D'APPEL...
         LA          NGE
         STA         0,W             < MISE EN PLACE DU NOM DE "GE"...
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         LA          IEG
         STA         MODCAL,W        < RENVOI DE L'INDEX COURANT DE ITEM1,
XWOR%7:  VAL         0
         LAI         AMCDA-ZERO
         BSR         ACCI            < ENVOI DE !CDA.
GOGE1:   EQU         $
         LAD         DEMLOD
         BSR         AOVL            < ET TENTATIVE DE CHARGEMENT...
         QUIT        1               < EN CAS D'ERREUR,
         JMP         GOGE1           < ET ON RETENTE...
         IF          MODE-ITEM,XWOR%7,,XWOR%7
<
<
<        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
XWOR%7:  VAL         0
         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 :
         IF          MODE-VISU,XWOR%7,,XWOR%7
         JG          TW1             < CAS DES ALT-MODES...
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         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.
         LRM         A,B,X
         WORD        NOM             < A=ZONE A SAUVEGARDER,
         WORD        SITEM1          < B=ZONE DE SAUVEGARDE,
         WORD        LNOM/NOCMO      < X=NOMBRE DE MOTS.
         MOVE                        < SAUVEGARDE...
XWOR%7:  VAL         0
         LR          K,A             < CAS DE LA PREMIERE,
         STA         SAVEK           < SAUVEGARDE DE K...
TW1:     EQU         $
         LRM         K
         WORD        STACK-1         < INITIALISATION DE K...
TW20:    EQU         $
         LAI         AMCDAI-ZERO
         BSR         ACCI            < ENVOI DE !CDAI...
         JNE         GOGE            < ET BIEN CELA NE MARCHE PAS...
         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         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMASKO-ZERO
XWOR%7:  VAL         0
         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         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMINT-ZERO
XWOR%7:  VAL         0
         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         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMERR-ZERO
         BSR         APRINT          < ENVOI D'UN MESSAGE D'ERREUR...
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         LAD         DEMOUT
         SVC         0               < EDITION DU MESSAGE D'ERREUR...
XWOR%7:  VAL         0
         BR          ALOOP           < ET C'EST TOUT...
         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         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMNOM-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         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 :
< (LORS DES 'LNS' ET 'LON', IL REGARDE
< SI LA LONGUEUR DE L'IMAGE VAUT EXACTE-
< MENT LIMAG*NCOOL*NOCMO ; SI NON, ELLE
< REITERE L'OPERATION AVEC UN DELTA
< NOM-VALEUR DE -1 CORRESPONDANT A UNE
< ANCIENNE VERSION DU PROGRAMME)
<
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...
         LBY         SGN
         CPI         SGNDLN
         JE          GOSGN1          < CAS D'UN DELETE...
         CPI         SGNSTN
         JE          GOSGN1          < CAS D'UN STORE...
         ACTD        3               < CAS D'UN LOAD : B=LONGUEUR DE L'IMAGE,
         LRM         A
         WORD        LIMAG*NCOOL*NOCMO
         CPR         A,B             < S'AGIT-IL D'UNE ANCIENNE OU D'UNE
                                     < NOUVELLE IMAGE ???
         JE          GOSGN1          < NOUVELLE : DELTA=LNOM*NOCMO...
         LAI         -1              < ANCIENNE :
         STA         SGN+3           < IL FAUT LA RECUPERER AVEC DELTA=-1...
         LAD         SGN
         SVC         0               < ON REITERE LE LOAD...
GOSGN1:  EQU         $
         CPZR        X               < TEST DES CONDITIONS DE RETOUR...
         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 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...
<
<
GZB:     EQU         $
         STB         MCDAR           < AU CAS OU CE SERAIT 'YSTORE'...
         PSR         A,X
         LBI         0
XWOR%1:  VAL         LIZBUF=0
         SCLD        NBITMO-XWOR%1   < B=NUMERO DE BLOC,
         SLRS        NBITMO-XWOR%1   < A=ADRESSE DANS LE BLOC.
         XR          A,B             < A=NUMERO DE BLOC, B=ADRESSE DANS LE BLOC.
         CP          SDKU            < LE BLOC DEMANDE EST-IL LE BLOC COURANT ?
         JE          GZB2            < OUI...
<
< REECRITURE DU BLOC COURANT LORSQU'IL A ETE MODIFIE :
<
         PSR         A               < SAVE LE BLOC DEMANDE,
         BSR         ASPDKU          < ECRITURE DU BLOC COURANT S'IL EXISTE
                                     < ET S'IL A ETE MODIFIE...
         PLR         A               < RESTAURE LE BLOC DEMANDE...
<
< 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         $
         LRM         A
         WORD        IZBUF
         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...
YLOAD::  VAL         0               < MODE LOAD,
YSTORE:: VAL         1               < MODE STORE.
         CPZR        Y               < QUEL EST LE SENS DE L'OPERATION ???
         JE          GZB4            < LOAD...
         IC          MDKU            < STORE : DANS CE CAS, ON COMPTABILISE
                                     < LA MISE A JOUR...
         WCDA
         JMP         GZB5
GZB4:    EQU         $
         RCDA
GZB5:    EQU         $
         LB          MCDAR           < QUELQUE SOIT LE MODE 'B' EST BON...
         PLR         A,X
         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...
         JAL         GZB6            < IL N'EXISTE PAS, ON EST DONC A
                                     < L'INITIALISATION, ON NE PEUT
                                     < QUE LIRE LE Z-BUFFER SUR 'DKU'...
         CPZ         MDKU            < IL EXISTE, ALORS A-T'IL ETE MODIFIE ???
         JE          GZB6            < NON, INUTILE D'ECRIRE...
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
         LAD         WDKU
         SVC         0               < REECRITURE DU BLOC COURANT...
         JE          GZB6            < OK...
         QUIT        1               < DKU ?!??!??!!!
GZB6:    EQU         $
         RSR
         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...
         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...
<
         CPI         "N"
         JE          MZBUF6          < PAS DE Z-BUFFER...
         CPI         "O"
         JE          MZBUF4          < UITILISATION DU Z-BUFFER...
MZBUF7:  EQU         $
         CPI         "I"
         JNE         MZBUF3          < ERREUR : ON INHIBE LE Z-BUFFER !!!
<
< INITIALISATION DU Z-BUFFER :
<
         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
         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         $
         BR          ALOOP           < ET C'EST TOUT...
MZBUF3:  EQU         $
         BR          AERROR
         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         ASPGPR          < OUI, A=NIVEAU(XR,YR),
         FLT                         < ET CONVERSION FLOTTANTE...
SPGRA1:  EQU         $
         RSR
         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
         LX          XS              < X=ABSCISSE,
         LY          YS              < Y=ORDONNEE.
         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...
         LRM         B,X,Y
         WORD        MCDAR
         WORD        1
         WORD        LIMAG           < Y=LONGUEUR EN MOTS D'UNE TRAME.
         RCDA
                                     < ACCES A UN MOT ROUGE,
         LRM         B,X
         WORD        MCDAV
         WORD        1
         ADR         Y,A
         RCDA
                                     < ACCES A UN MOT VERT,
         LRM         B,X
         WORD        MCDAB
         WORD        1
         ADR         Y,A
         RCDA
                                     < ACCES A UN MOT BLEU.
         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.
         PLR         B,X,Y
         RSR
         PAGE
<
<
<        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
         PSR         A               < SAUVEGARDE DU NIVEAU,
         LX          XS              < DU POINT
         LY          YS              < SCRATCH (XS,YS).
         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'...
         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.
         PLR         X               < X=AMPLITUDE DU DECALAGE,
         STA         WORK1           < SAUVEGARDE DE LA DERNIERE ADRESSE...
         PLR         A               < A=NIVEAU DE GRIS DE (XS,YS).
         SLRD        NCOOL           < ET CADRAGE DANS 'B'...
         LA          MCDAB           < MSE A JOUR DU BLEU,
         SCRS        0,X
         SLRS        BIT
         SLLD        BIT
         SCLS        0,X
         STA         MCDAB
         LA          MCDAV           < MISE A JOUR DU VERT,
         SCRS        0,X
         SLRS        BIT
         SLLD        BIT
         SCLS        0,X
         STA         MCDAV
         LA          MCDAR           < MISE A JOUR DU ROUGE.
         SCRS        0,X
         SLRS        BIT
         SLLD        BIT
         SCLS        0,X
         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.
         PLR         A,B,X,Y
         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         DEMTV
         JMP         MOVX            < VERS L'ENVOI DE L'IMAGE...
MOV3:    EQU         $               < RESIDENT B --> TV.
         LAD         DEMTVB
MOVX:    EQU         $
         SVC         0               < BLEU.
         BR          ALOOP
MOV1:    EQU         $               < RESIDENT R --> TV.
         LAD         DEMTVR
         SVC         0               < ROUGE.
         BR          ALOOP
MOV2:    EQU         $               < RESIDENT V --> TV.
         LAD         DEMTVV
         SVC         0               < VERT.
         BR          ALOOP
PMOV5:   EQU         $               < TV R --> RESIDENT.
         LA          DEMTVR+3
         LR          A,B
         ORI         TVIN            < MISE EN ENTREE,
         STA         DEMTVR+3
         LAD         DEMTVR
         SVC         0               < ENTREE DU ROUGE,
         STB         DEMTVR+3        < ET RESTAURATION...
         RSR
PMOV6:   EQU         $               < TV V --> RESIDENT.
         LA          DEMTVV+3
         LR          A,B
         ORI         TVIN
         STA         DEMTVV+3
         LAD         DEMTVV
         SVC         0               < ENTREE DU VERT...
         STB         DEMTVV+3
         RSR
PMOV7:   EQU         $               < TV B --> RESIDENT.
         LA          DEMTVB+3
         LR          A,B
         ORI         TVIN
         STA         DEMTVB+3
         LAD         DEMTVB
         SVC         0               < ENTREE DU BLEU...
         STB         DEMTVB+3
         RSR
MOV4:    EQU         $               < TV R+V+B --> RESIDENT.
         BSR         APMOV5          < ROUGE,
         BSR         APMOV6          < VERT,
MOV7:    EQU         $               < TV B --> RESIDENT.
         BSR         APMOV7          < BLEU.
         BR          ALOOP
MOV5:    EQU         $               < TV R --> RESIDENT.
         BSR         APMOV5
         BR          ALOOP
MOV6:    EQU         $               < TV V --> RESIDENT.
         BSR         APMOV6
         BR          ALOOP
         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,
         FNEG                        < A,B = PI/2-TETA.
SIN:     EQU         $               < ENTRY 'SINUS' :
         FST         ZZZ061          < SAVE TEMPORAIRE DE L'ANGLE.
         STZ         ZZZ063
         JAGE        ZZZ072
         FNEG
         FST         ZZZ061
         IC          ZZZ063
ZZZ072:  EQU         $
         FDV         DEUXPI
         FIX
         FLT
         FMP         DEUXPI
         FSB         ZZZ061
         FNEG
         FCAM        PI3141
         JL          ZZZ073
         FSB         PI3141
         IC          ZZZ063
ZZZ073:  EQU         $
         FCAM        PISUR2
         JL          ZZZ074
         FSB         PI3141
         FNEG
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
         FNEG
ZZZ075:  EQU         $
         RSR
         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         $
         FCAZ
         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         $
         FST         FWORK
         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
         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         $
         FIX
         RSR
         PAGE
<
<
<        E N T R E E   ' Z R '   E T   ' T R '
<
<
ZPIN:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMZR-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         FZR             < ENTREE DE 'FZR'.
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTR-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         FTR             < ENTREE DE 'FTR'...
         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         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTRX-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DE 4 CHIFFRES HEXADECIMAUX.
         JNE         DTRAN1          < ERREUR...
         STA         TRX
DTRAN2:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTRY-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DE 4 CHIFFRES HEXADECIMAUX.
         JNE         DTRAN2          < ERREUR...
         STA         TRY
DTRAN5:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKFU-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         KFU
DTRAN6:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKFV-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         KFV
DTRAN7:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKFW-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         KFW
DTRAN3:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKFT-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         KFT
<
<
<        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  :
<
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKUX-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         KUX
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKVX-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         KVX
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKWX-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         KWX
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKTX-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         KTX
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKUY-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         KUY
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKVY-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         KVY
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKWY-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         KWY
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKTY-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         KTY
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKUZ-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         KUZ
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKVZ-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         KVZ
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKWZ-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         KWZ
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKTZ-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT
         FST         KTZ
DTRAN4:  EQU         $
         BR          ALOOP           < EASY ??!?!?!
         PAGE
         IF          MODE-ITEM,XWOR%5,,XWOR%5
<
<
<        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...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMORGX-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DE ORGX...
         JE          GORGX1          < OK...
GORGX2:  EQU         $
         BR          AERROR          < ET NON...
GORGX1:  EQU         $
         NGR         A,A
         STA         ORGX
GORGX3:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTORE-ZERO
XWOR%7:  VAL         0
         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...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMORGY-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DE ORGY...
         JNE         GORGX2          < ERREUR...
         NGR         A,A
         STA         ORGY
GORGY3:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTORE-ZERO
XWOR%7:  VAL         0
         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...
XWOR%5:  VAL         0
         PAGE
         IF          MODE-VISU,XWOR%5,,XWOR%5
<
<
<        D E R I V A T I O N   N U M E R I Q U E  :
<
<
<        ARGUMENTS :
<                    FH=CONSTANTE PROGRAMMABLE,
<                    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         $
         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         XVART
         JLE         DERIV4
DERIV3:  EQU         $
         QUIT        1               < !?!??!??!
DERIV4:  EQU         $
<
< CALCUL DE LA DERIVEE :
<
         FLD         &AVAR           < VARIABLE ALPHA,
         PSR         A,B,L           < SAUVEGARDE DE ALPHA, ET DE LA BASE L...
         LRM         L
         WORD        FLOC+'80        < POUR LE CALCUL DE LA FONCTION F.
         FAD         FH
         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
         FST         FWORK           < F(ALPHA-H).
         PLR         A,B
         FSB         FWORK
         FDV         F2H
         FST         FWORK           < DERIVEE=(F(ALPHA+H)-F(ALPHA-H))/(2*H).
         PLR         A,B,L           < RESTAURE ALPHA, ET LA BASE L.
         FST         &AVAR
         FLD         FWORK           < (A,B)=VALEUR DE LA DERIVEE.
         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.
<
<
<        ARGUMENT :
<                    A=NIVEAU A MODULER,
<
<
<        RESULTAT :
<                    A=NIVEAU MODULE...
<
<
COEF:    EQU         $
         JAE         COEF1           < NIVEAU NUL...
         FLT
         FMP         FCOEF           < PRISE EN COMPTE DE L'INCIDENCE...
         FMP         F6S7            < AFIN DE NE PAS
         FAD         F1              <                CREER DE NOIR...
         FIX                         < ET CONVERSION ENTIERE...
COEF1:   EQU         $
         RSR
XWOR%5:  VAL         0
         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
         IF          MODE-VISU,XWOR%7,,XWOR%7
         STA         MATN            < NUMERO EN ASCI DE L'ELEMENT...
XWOR%7:  VAL         0
         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         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAD         MAT             < A=ADRESSE DU MESSAGE MIJ=.
XWOR%7:  VAL         0
         BSR         APIHEX          < ET CONVERSION...
         JNE         PTRAN1          < ERREUR...
         LR          A,Y             < Y=NUMERATEUR...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMSLAS-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX          < ET CONVERSION...
         JNE         PTRAN1          < ERREUR...
         FLT
         FST         FWORK           < SAUVEGARDE DU DENOMINATEUR...
         LR          Y,A
         FLT                         < 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         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTRAN-ZERO
XWOR%7:  VAL         0
         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         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKRX-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX
         JNE         PIC1            < ????!
         FLT
         FST         KRX             < ENTREE DE KRX,
PIC2:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKRY-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX
         JNE         PIC2            < ??!!!!
         FLT
         FST         KRY             < ENTREE DE KRY,
PIC3:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMKRZ-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX
         JNE         PIC3            < ??!??!
         FLT
         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         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMODM-ZERO
XWOR%7:  VAL         0
         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...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMPROJ-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DE PZ.
         JNE         PROJE1          < ERREUR...
         FLT
         FST         PZ              < PZ=POSITION DE L'ECRAN.
PROJE2:  EQU         $
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
         IF          MODE-ITEM,XWOR%7,,XWOR%7
<
<
<        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
         LY          ORGY
         STY         YS              < ORDONNEE SCRATCH.
         LYI         0               < Y=ORDONNEE.
         STY         YR
SPOP1:   EQU         $
         LXI         0
         STX         XR              < X=ABSCISSE.
         LX          ORGX
         STX         XS
SPOP2:   EQU         $
         LX          XS
         LY          YS
         PSR         X,Y             < SAUVEGARDE DE 'XS' ET 'YS'...
         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         $
         CPZ         IMASKO
         JE          SPOP8           < LE MASQUE EST OFF...
         PSR         X,Y
         LX          XR              < X=COORDONNEE RESIDENTE,
         LY          YR              < AINSI QUE Y...
         LR          X,A
         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...
SPOP8:   EQU         $
         BSR         ASP             < EXECUTION DE L'OPERATION VARIABLE .OP.
                                     < SUR LE COUPLE DE POINTS (X,Y).
SPOP5:   EQU         $
         PLR         X,Y             < RESTAURATION DE XS ET YS...
         STX         XS
         STY         YS
         IC          XS              < PROGRESSION DE XS,
         IC          XR              < ET DE XR,
         LA          XR
         CPI         NPOLM1          < EST-ON EN BOUT DE LIGNE ???
         JLE         SPOP2           < NON... BALAYAGE HORIZONTAL...
         IC          YS              < OUI, PROGRESSION DE YS,
         IC          YR              < ET DE YR...
         LA          YR
         CPI         NLIGM1          < EST-ON EN BOUT D'IMAGE ???
         JLE         SPOP1           < NON, BALAYAGE VERTICAL...
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        O P E R A T I O N S   I N T E R - I M A G E S  :
<
<
IMSAV:   EQU         $               < ENVOI DU RESIDENT EN SCRATCH.
XLOAD:   EQU         $
         BR          AERROR          < OUI, SUR LA 'CDA-IMAGE', ET ALORS
                                     < GARE AUX MOVE DE PLUS D'UN MOT !!!
IMSAV1:  EQU         $
         BSR         ASPSCD
         BR          ALOOP
IMLOAD:  EQU         XLOAD           < RAPPEL DU SCRATCH EN RESIDENT SANS MASK.
TRANS:   EQU         $               < APPLICATION DE M(I,J).
         LB          ASPTR
         JMP         IM2
IM1:     EQU         $
IM2:     EQU         $
         STB         ASP             < RELAI DYNAMIQUE DE SOUS-PROGRAMME.
         BSR         ASPOP
         BR          ALOOP
XWOR%7:  VAL         0
         PAGE
<
<
<        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
         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
<
< DETERMINATION DE (XR,YR) :
<
         LA          XR
         SB          TRX
         FLT
         FST         FXR             < XR.
         LA          YR
         SB          TRY
         FLT
         FST         FYR             < YR.
         CPZ         ZBUF            < Z-BUFFER ???
         JE          SPTR10          < IL EST ACTIF, ON DIFFERE TOUS LES TESTS.
<
< CAS OU LE Z-BUFFER EST INHIBE :
<
         BSR         ASPGPR          < A=NIVEAU DU POINT (XR,YR).
SPTR1A:  EQU         $
         JANE        SPTR10          < POINT PRESENT...
         BR          ASPTR1          < DANS LE CAS RESIDENT --> SCRATH, LORSQUE
                                     < LE POINT (XR,YR) EST NOIR, ET LORSQUE
                                     < LE Z-BUFFER EST INHIBE, ON NE FAIT RIEN.
SPTR10:  EQU         $
<
<
<        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 '  :
<
<
         FLD         F0
         FST         FINCU           < AFIN D'ATTEINDRE (XR,YR)...
         FST         FINCV
         BSR         ASPGPR
         FLT
         FST         FNIV1           < NIVEAU(XR,YR).
         BSR         ASPVU
         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         F1
         FST         FXR
         IC          XR
         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         F1
         FST         FYR
         IC          YR
         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         F1
         FST         FXR
         DC          XR
         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         F1
         FST         FYR
         DC          YR
<
< ON DISPOSE D'UN QUADRILATERE (M1,M2,M3,M4)
< QUI EST LA TRANSFORMEE DU CARRE DE BASE
< DETERMINE A PARTIR DE (XR,YR) ;
< ON VA CHOISIR LA PLUS GRANDE DES
< 2 DIAGONALES M1M3 OU M2M4 :
<
         FLD         VECU3
         FSB         VECU1
         FST         FWORK
         FMP         FWORK
         FST         FWORK1
         FLD         VECV3
         FSB         VECV1
         FST         FWORK
         FMP         FWORK
         FAD         FWORK1
         FST         FWORK1
         FLD         VECW3
         FSB         VECW1
         FST         FWORK
         FMP         FWORK
         FAD         FWORK1
         FST         FWORK1          < PREMIERE DIAGONALE : M1M3.
         FLD         VECU4
         FSB         VECU2
         FST         FWORK
         FMP         FWORK
         FST         FWORK2
         FLD         VECV4
         FSB         VECV2
         FST         FWORK
         FMP         FWORK
         FAD         FWORK2
         FST         FWORK2
         FLD         VECW4
         FSB         VECW2
         FST         FWORK
         FMP         FWORK
         FAD         FWORK2
         FST         FWORK2          < DEUXIEME DIAGONALE : M2M4.
         FCAM        FWORK1          < QUELLE EST LA PLUS GRANDE ???
         JGE         QUAD1           < M2M4...
         FLD         FWORK1          < M1M3...
QUAD1:   EQU         $
         BSR         ARAC            < EN FAIT C'EST LE CARRE QUE L'ON
                                     < A CALCULE...
         FMP         FK              < ET OUI...
         FCAZ
         JG          QUAD5           < OK, LA LONGUEUR EST POSITIVE...
         FLD         F05             < SINON, ON EN PREND UNE INFERIEURE A 1...
QUAD5:   EQU         $
         FST         FWORK           < FWORK=MAX(M1M3,M2M4).
         FIX
         ADRI        1,A
         STA         NPAS            < NPAS=NOMBRE DE MAILLE DANS CHAQUE
                                     < DIRECTION X ET Y DU CARRE DE BASE.
         FLD         F1
         FDV         FWORK           < 1/MAX(M1M3,M2M4),
         FCAM        F1
         JLE         QUAD2           < 1/MAX<=1, OK...
         FLD         F1              < ON MINORE SINON...
QUAD2:   EQU         $
         FST         FPAS            < FPAS=1/MAX(M1M3,M2M4)...
<
< 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.
         LA          IECL
         OR          IMODN
         JAE         DERI30          < NI ECLAIRAGE, NI N-MODULATION...
         LYI         XSPU
         LXI         XVARU
         BSR         ADERIV
         FST         DXDU            < CALCUL DE DX/DU.
         LXI         XVARV
         BSR         ADERIV
         FST         DXDV            < CALCUL DE DX/DV.
DERI30:  EQU         $
<
< COMPOSANTE 'V' :
<
         BSR         ASPVV
         FST         VECV            < COMPOSANTE EN 'V' DU VECTEUR.
         LA          IECL
         OR          IMODN
         JAE         DERI31          < NI ECLAIRAGE, NI N-MODULATION...
         LYI         XSPV
         LXI         XVARU
         BSR         ADERIV
         FST         DYDU            < CALCUL DE DY/DU.
         LXI         XVARV
         BSR         ADERIV
         FST         DYDV            < CALCUL DE DY/DV.
DERI31:  EQU         $
<
< COMPOSANTE 'W' :
<
         BSR         ASPVW
         FST         VECW            < COMPOSANTE EN 'W' DU VECTEUR.
         LA          IECL
         OR          IMODN
         JAE         DERI32          < NI ECLAIRAGE, NI N-MODULATION...
         LYI         XSPW
         LXI         XVARU
         BSR         ADERIV
         FST         DZDU            < CALCUL DE DZ/DU.
         LXI         XVARV
         BSR         ADERIV
         FST         DZDV            < CALCUL DE DZ/DV.
DERI32:  EQU         $
GRAD14:  EQU         $
<
<
<        R E P R E S E N T A T I O N   G R A P H I Q U E  :
<
<
GRAD11:  EQU         $
GRAD2:   EQU         $
GRAD30:  EQU         $
         FLD         VECU
         FMP         FK
         FST         VECU
         FLD         VECV
         FMP         FK
         FST         VECV
         FLD         VECW
         FMP         FK
         FST         VECW
         FLD         VECU
         FST         FXS             < FXS=VECU,
         FLD         VECV
         FST         FYS             < FYS=VECV,
         FLD         VECW
GRAD16:  EQU         $
         FST         FZS             < FZS=VECW.
         LA          IECL
         OR          IMODN
         JANE        SPTR21          < ECLAIRAGE OU MODULATION-N...
         BR          ANECL           < NON, ALLONS PROJETER DIRECTEMENT...
SPTR21:  EQU         $
<
< DETERMINATION DU VECTEUR NORMAL N :
<
         FLD         DZDU
         FMP         DYDV
         FST         FWORK
         FLD         DYDU
         FMP         DZDV
         FSB         FWORK
         FST         NX              < NX=(DY/DU)*(DZ/DV)-(DZ/DU)*(DY/DV).
         FLD         DXDU
         FMP         DZDV
         FST         FWORK
         FLD         DZDU
         FMP         DXDV
         FSB         FWORK
         FST         NY              < NY=(DZ/DU)*(DX/DV)-(DX/DU)*(DZ/DV).
         FLD         DYDU
         FMP         DXDV
         FST         FWORK
         FLD         DXDU
         FMP         DYDV
         FSB         FWORK
         FST         NZ              < NZ=(DX/DU)*(DY/DV)-(DY/DU)*(DX/DV).
<
< CALCUL DE LA NORME DU VECTEUR NORMAL :
<
         FLD         NX
         FMP         NX
         FST         FWORK
         FLD         NY
         FMP         NY
         FAD         FWORK
         FST         FWORK
         FLD         NZ
         FMP         NZ
         FAD         FWORK
         BSR         ARAC
         FST         NORMN           < NORME(N)=RAC(NX*NX+NY*NY+NZ*NZ).
         FCAZ
         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,
         FLT
         FSB         FXS
         FST         MSX             < X(MS).
         LA          SY
         SB          TRY
         FLT
         FSB         FYS
         FST         MSY             < Y(MS).
         LA          SZ
         FLT
         FSB         FZS
         FST         MSZ             < Z(MS).
<
< CALCUL DE LA NORME DU VECTEUR 'MS' :
<
         FLD         MSX
         FMP         MSX
         FST         FWORK
         FLD         MSY
         FMP         MSY
         FAD         FWORK
         FST         FWORK
         FLD         MSZ
         FMP         MSZ
         FAD         FWORK
         BSR         ARAC
         FST         NORMS           < NORME(MS)=RAC(MSX*MSX+MSY*MSY+MSZ*MSZ).
         FCAZ
         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
         FST         FWORK
         FLD         NY
         FMP         MSY
         FAD         FWORK
         FST         FWORK
         FLD         NZ
         FMP         MSZ
         FAD         FWORK           < NX*MSX+NY*MSY+NZ*MSZ,
         FDV         NORMN
         FDV         NORMS           < ON DISPOSE ICI DU 'COS' DE L'ANGLE
                                     < D'INCIDENCE DES RAYONS LUMINEUX,
         FMP         F05             < QUE L'ON RAMENE DANS LE SEGMENT
                                     < (-0.5,+0.5),
         FAD         F05             < PUIS DANS (0,+1)...
         FST         FCOEF           < CE QUI DONNE LE COEFFICIENT DE
                                     < MODULATION DES NIVEAUX...
SPTR90:  EQU         $
         CPZ         IMODN           < MODULATION-N ???
         JE          SPTR91          < NON, ECLAIRAGE SEULEMENT...
<
< CAS DE LA MODULATION SUR LA NORMALE :
<
         LA          XR
         STA         XS              < POUR SE PLACER AU
         LA          YR
         STA         YS              < (U,V) DE TV2.
         LA          CTCDA
         STA         XCTCDA          < POUR ATTEINDRE TV2...
         BSR         ASPGPS          < A=NIVEAU(U,V) DANS TV2,
         STZ         XCTCDA          < POUR ATTEINDRE TV1...
         FLT
         FMP         FMODN           < FMODN*NIVEAU(U,V),
         FMP         FK              < FK*FMODN*NIVEAU(U,V),
         FST         FWORK           < CE QUI DONNE LA CONSTANTE DE MODULATION.
         FMP         NX
         FAD         FXS
         FST         FXS             < FXS <-- FXS+NX*FK*FMODN*NIVEAU(U,V).
         FLD         NY
         FMP         FWORK
         FAD         FYS
         FST         FYS             < FYS <-- FYS+NY*FK*FMODN*NIVEAU(U,V).
         FLD         NZ
         FMP         FWORK
         FAD         FZS
         FST         FZS             < FZS <-- FZS+NZ*FK*FMODN*NIVEAU(U,V).
SPTR91:  EQU         $
NECLX:   EQU         $
<
< TRANSFORMATION MATRICIELLE ???
<
GRAD13:  EQU         $
         CPZ         ITRANS
         JE          TRANSX          < NON...
         FLD         FXS
         FSB         KRX
         FST         FXS
         FLD         FYS
         FSB         KRY
         FST         FYS
         FLD         FZS
         FSB         KRZ
         FST         FZS
         FLD         FXS
         FMP         M11
         FST         FWORK
         FLD         FYS
         FMP         M12
         FAD         FWORK
         FST         FWORK
         FLD         FZS
         FMP         M13
         FAD         FWORK
         FAD         KRX
         PSR         A,B             < FXS=M11*(XR-KRX)+M12*(YR-KRY)
                                     <     +M13*(ZR-KRZ)+KRX.
         FLD         FXS
         FMP         M21
         FST         FWORK
         FLD         FYS
         FMP         M22
         FAD         FWORK
         FST         FWORK
         FLD         FZS
         FMP         M23
         FAD         FWORK
         FAD         KRY
         PSR         A,B             < FYS=M21*(XR-KRX)+M22*(YR-KRY)
                                     <     +M23*(ZR-KRZ)+KRY.
         FLD         FXS
         FMP         M31
         FST         FWORK
         FLD         FYS
         FMP         M32
         FAD         FWORK
         FST         FWORK
         FLD         FZS
         FMP         M33
         FAD         FWORK
         FAD         KRZ
         FST         FZS             < FZS=M31*(XR-KRX)+M32*(YR-KRY)
                                     <     +M33*(ZR-KRZ)+KRZ.
         PLR         A,B
         FST         FYS
         PLR         A,B
         FST         FXS
TRANSX:  EQU         $
<
< PROJECTION :
<
NECL:    EQU         $
         FLD         FZS
         CPZ         IPROJ           < TYPE DE PROJECTION ???
         JE          SPTRX1          < PAR SINT,COST...
<
< PROJECTION PERSPECTIVE :
<
         FDV         PZ
         FSB         F1
         FNEG
         FST         FWORK           < 1-(FZS/PZ)
         FCAZ
         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
         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
         STA         YS              < YS=Y+Z*SINT.
<
< TEST DES HORS-ECRAN :
<
SPTR4:   EQU         $
         LA          XS
         CPZ         MODX            < EST-ON SUR UN X-TORE ???
         JE          SPTT3           < OUI...
         JAL         SPTR1X          < NON, ET XS EST OVERSCREEN...
         CPI         NPOLM1
         JG          SPTR1X          < 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         SPTR1X          < NON, ET YS EST OVERSCREEN...
         CPI         NLIGM1
         JG          SPTR1X          < 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         $
<
< RECUPERATION DU POINT SOURCE (M2) :
<
         FLD         FNIV1           < NIVEAU(XR,YR) A PRIORI...
         CPZ         IALIAS          < INTERPOLATION DES NIVEAUX DE GRIS ???
         JE          QUAD50          < NON...
<
< INTERPOLATION DES NIVEAUX DE GRIS DANS LE CARRE ELEMENTAIRE :
<
         FLD         F1
         FSB         FINCU
         FST         FWORK1          < W1=1-FU,
         FLD         F1
         FSB         FINCV
         FST         FWORK2          < W2=1-FV,
         FMP         FWORK1
         FMP         FNIV1
         FST         FWORK           < (1-FU)*(1-FV)*N1,
         FLD         FINCU
         FMP         FWORK2
         FMP         FNIV2
         FAD         FWORK
         FST         FWORK           < +FU*(1-FV)*N2,
         FLD         FINCU
         FMP         FINCV
         FMP         FNIV3
         FAD         FWORK
         FST         FWORK           < +FU*FV*N3,
         FLD         FWORK1
         FMP         FINCV
         FMP         FNIV4
         FAD         FWORK           < +(1-FU)*FV*N4,
QUAD50:  EQU         $
         BSR         AROND           < ET CONVERSION ENTIERE...
         STA         NM2             < NM2=NIVEAU CALCULE A INSCRIRE...
<
< RECUPERATION DU POINT DESTINATION (M1) :
<
         BSR         ASPGS
         STA         NM1             < NM1=NIVEAU PRESENT ANTERIEUREMENT...
<
< CALCUL DE LA PROFONDEUR DU POINT COURANT :
<
         FLD         FZS             < PROFONDEUR DU POINT M2,
         FIX
         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          YS
         SWBR        A,A
         OR          XS
         STA         WORK2           < 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.
         LA          LTRANS          < A=LISTE DES TRANSPARENCES...
         JL          SPTR52          < B<X : LE POINT M2 EST A TRACER PLUS
                                     < LOIN DE L'ECRAN QUE M1...
<
< CAS OU LE POINT M2 EST A TRACER PLUS PRES QUE M1 :
<
         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 :
<
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         $
         XM          WORK2           < WORK2=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         $
         LA          WORK2           < A=NIVEAU,
         BSR         ACOEF           < MODULATION LUMINEUSE EVENTUELLE...
         BSR         ASPRS           < GENERATION DU SCRATCH...
SPTR1X:  EQU         $
<
< ITERATION SUR LE MAILLAGE DU CARRE DE BASE :
<
         PLR         X
         FLD         FINCV
         FAD         FPAS
         FST         FINCV           < PROGRESSION DE 'FINCV'...
         JDX         QUAD40          < AU POINT SUIVANT SUR 'Y'...
         PLR         X
         FLD         FINCU
         FAD         FPAS
         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
<
<
<        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.
         PSR         L
         LRM         L
         WORD        FLOC+'80
         BSR         ASPU
         PLR         L
         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.
         PSR         L
         LRM         L
         WORD        FLOC+'80
         BSR         ASPV
         PLR         L
         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.
         PSR         L
         LRM         L
         WORD        FLOC+'80
         BSR         ASPW
         PLR         L
         RSR
         PAGE
         IF          MODE-ITEM,XWOR%5,,XWOR%5
<
<
<        D E R I V A T I O N   N U M E R I Q U E  :
<
<
<        ARGUMENTS :
<                    FH=CONSTANTE PROGRAMMABLE,
<                    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         $
         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         XVART
         JLE         DERIV4
DERIV3:  EQU         $
         QUIT        1               < !?!??!??!
DERIV4:  EQU         $
<
< CALCUL DE LA DERIVEE :
<
         FLD         &AVAR           < VARIABLE ALPHA,
         PSR         A,B,L           < SAUVEGARDE DE ALPHA, ET DE LA BASE L...
         LRM         L
         WORD        FLOC+'80        < POUR LE CALCUL DE LA FONCTION F.
         FAD         FH
         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
         FST         FWORK           < F(ALPHA-H).
         PLR         A,B
         FSB         FWORK
         FDV         F2H
         FST         FWORK           < DERIVEE=(F(ALPHA+H)-F(ALPHA-H))/(2*H).
         PLR         A,B,L           < RESTAURE ALPHA, ET LA BASE L.
         FST         &AVAR
         FLD         FWORK           < (A,B)=VALEUR DE LA DERIVEE.
         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.
<
<
<        ARGUMENT :
<                    A=NIVEAU A MODULER,
<
<
<        RESULTAT :
<                    A=NIVEAU MODULE...
<
<
COEF:    EQU         $
         JAE         COEF1           < NIVEAU NUL...
         FLT
         FMP         FCOEF           < PRISE EN COMPTE DE L'INCIDENCE...
         FMP         F6S7            < AFIN DE NE PAS
         FAD         F1              <                CREER DE NOIR...
         FIX                         < ET CONVERSION ENTIERE...
COEF1:   EQU         $
         RSR
XWOR%5:  VAL         0
         PAGE
         IF          MODE-VISU,XWOR%7,,XWOR%7
<
<
<        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
         LY          ORGY
         STY         YS              < ORDONNEE SCRATCH.
         LYI         0               < Y=ORDONNEE.
         STY         YR
SPOP1:   EQU         $
         LXI         0
         STX         XR              < X=ABSCISSE.
         LX          ORGX
         STX         XS
SPOP2:   EQU         $
         LX          XS
         LY          YS
         PSR         X,Y             < SAUVEGARDE DE 'XS' ET 'YS'...
         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         $
         CPZ         IMASKO
         JE          SPOP8           < LE MASQUE EST OFF...
         PSR         X,Y
         LX          XR              < X=COORDONNEE RESIDENTE,
         LY          YR              < AINSI QUE Y...
         LR          X,A
         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...
SPOP8:   EQU         $
         BSR         ASP             < EXECUTION DE L'OPERATION VARIABLE .OP.
                                     < SUR LE COUPLE DE POINTS (X,Y).
SPOP5:   EQU         $
         PLR         X,Y             < RESTAURATION DE XS ET YS...
         STX         XS
         STY         YS
         IC          XS              < PROGRESSION DE XS,
         IC          XR              < ET DE XR,
         LA          XR
         CPI         NPOLM1          < EST-ON EN BOUT DE LIGNE ???
         JLE         SPOP2           < NON... BALAYAGE HORIZONTAL...
         IC          YS              < OUI, PROGRESSION DE YS,
         IC          YR              < ET DE YR...
         LA          YR
         CPI         NLIGM1          < EST-ON EN BOUT D'IMAGE ???
         JLE         SPOP1           < NON, BALAYAGE VERTICAL...
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        O P E R A T I O N S   I N T E R - I M A G E S  :
<
<
IMSAV:   EQU         $               < ENVOI DU RESIDENT EN SCRATCH.
XLOAD:   EQU         $
         BR          AERROR          < OUI, SUR LA 'CDA-IMAGE', ET ALORS
                                     < GARE AUX MOVE DE PLUS D'UN MOT !!!
IMSAV1:  EQU         $
         BSR         ASPSCD
         BR          ALOOP
IMLOAD:  EQU         XLOAD           < RAPPEL DU SCRATCH EN RESIDENT SANS MASK.
TRANS:   EQU         $               < APPLICATION DE M(I,J).
         LB          ASPTR
         JMP         IM2
IM1:     EQU         $
IM2:     EQU         $
         STB         ASP             < RELAI DYNAMIQUE DE SOUS-PROGRAMME.
         BSR         ASPOP
         BR          ALOOP
XWOR%7:  VAL         0
         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.
<
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
PIN:     EQU         $
         BSR         APRINT
XWOR%7:  VAL         0
IN:      EQU         $
         LAD         DEMIN
         BSR         AENTER
         LBY         &AREP           < A=CARACTERE REPONSE.
         RSR
         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'...
<
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
PIHEX:   EQU         $
         BSR         APRINT
XWOR%7:  VAL         0
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  :
<
<
<        ARGUMENT :
<                    A=ADRESSE D'UN MESSAGE EN MODE 'VISU'.
<
<
<        RESULTAT :
<                    A,B=CONSTANTE FLOTTANTE.
<                    INDICATEURS POSITIONNES PAR 'FCAZ'.
<
<
IFLOT:   EQU         $
         PSR         X,Y
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LR          A,X             < X=SAUVEGARDE DE L'ADRESSE MESSAGE.
IFLOT1:  EQU         $
         LR          X,A             < A=ADRESSE DU MESSAGE A EDITER...
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
IFLOT1:  EQU         $
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DU NUMERATEUR,
         JNE         IFLOT1          < ERREUR...
         LR          A,Y             < Y=NUMERATEUR.
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMSLAS-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DU DENOMINATEUR,
         JNE         IFLOT1          < ERREUR...
         JAE         IFLOT1          < IL NE PEUT ETRE NUL !!!
         FLT
         FST         FWORK           < DENOMINATEUR,
         LR          Y,A
         FLT                         < NUMERATEUR,
         FDV         FWORK           < RESULTAT=NUMERATEUR/DENOMINATEUR.
         FCAZ                        < ????
         PLR         X,Y
         RSR
         PAGE
<
<
<        E N T R E E   D E   L A   C O N S T A N T E   ' K '
<
<
INFK:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMK-ZERO
XWOR%7:  VAL         0
         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  :
<
<
CDER:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMH-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT          < ENTREE DE H :
         FST         FH
         FDV         F05
         FST         F2H             < ET CALCUL DE 2*H...
         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...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMCT-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT          < ENTREE DE LA CONSTANTE...
         FST         &ACT            < ET MEMORISATION...
         BR          ALOOP
         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
<
<
<        <  :  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
<
<
<        G E S T I O N   D E   L A   T R A N S P A R E N C E  :
<
<
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
         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         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMECL-ZERO
XWOR%7:  VAL         0
         BSR         APIN
         LAI         1
         FLT
         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         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMESX-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX
         JNE         ECL2            < ERREUR...
         STA         SX              < X(SOURCE)...
ECL3:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMESY-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX
         JNE         ECL3            < ERREUR...
         STA         SY              < Y(SOURCE)...
ECL4:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMESZ-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX
         JNE         ECL4            < ERREUR...
         STA         SZ              < Z(SOURCE)...
ECL1:    EQU         $
<
<
<        C O M M A N D E   D E   N - M O D U L A T I O N  :
<
<
CMODN:   EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMNMOD-ZERO
XWOR%7:  VAL         0
         BSR         APIN            < ENTREE D'UN CARACTERE O (ON) / N (OFF) :
         STZ         IMODN           < OFF A PRIORI...
         CPI         "N"
         JE          CMODN1          < OFF.
         CPI         "O"
         JNE         CMODN           < ?!??!
         IC          IMODN           < ON.
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMN-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT          < ENTREE DE LA CONSTANTE 'FN'...
         FST         FMODN
CMODN1:  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         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMALIA-ZERO
XWOR%7:  VAL         0
         BSR         APIN            < ENTREE DE O/N...
         STZ         IALIAS          < IALIAS=0 : "N" A PRIORI...
         CPI         "N"
         JE          ALIAS2          < "N"...
         CPI         "O"
         JNE         ALIAS1          < ??!????!
         IC          IALIAS          < IALIAS=1 : "O"...
ALIAS2:  EQU         $
<
< SORTIE :
<
CVP1:    EQU         $
         BR          ALOOP           < VERS L'INTERROGATION...
         PAGE
         IF          MODE-VISU,XWOR%5,,XWOR%5
<
<
<        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...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMORGX-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DE ORGX...
         JE          GORGX1          < OK...
GORGX2:  EQU         $
         BR          AERROR          < ET NON...
GORGX1:  EQU         $
         NGR         A,A
         STA         ORGX
GORGX3:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTORE-ZERO
XWOR%7:  VAL         0
         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...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMORGY-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DE ORGY...
         JNE         GORGX2          < ERREUR...
         NGR         A,A
         STA         ORGY
GORGY3:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTORE-ZERO
XWOR%7:  VAL         0
         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...
XWOR%5:  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
<
<
<        T R A N S F E R T S   R E S I D E N T - S C R A T C H  :
<
<
<        FONCTION :
<                      CE MODULE ASSURE LES TRANSFERTS
<                    BRUTAUX ENTRE LE RESIDENT, ET LE
<                    SCRATCH (QUI EST EN FAIT LA 'CDA').
<
<
SPSCD:   EQU         $
         PSR         A,B,X
         LRM         A,B,X
         WORD        0               < A=ADRESSE EN 'CDA',
         WORD        IMAGE           < B=ADRESSE EN RESIDENT,
         WORD        LIMAG*NCOOL     < X=NOMBRE DE MOTS A TRANSFERER.
         WCDA
                                     < TRANSFERT : RESIDENT --> SCRATCH.
         PLR         A,B,X
         RSR
SPBCD:   EQU         $               < TRANSFERT SANS MASQUE...
         PSR         A,B,X
         LRM         A,B,X
         WORD        0               < A=ADRESSE EN 'CDA',
         WORD        IMAGE           < B=ADRESSE EN RESIDENT,
         WORD        LIMAG*NCOOL     < X=NOMBRE DE MOTS A TRANSFERER.
         RCDA
                                     < TRANSFERT : SCRATCH --> RESIDENT.
         PLR         A,B,X
         RSR
         EOT         #SIP FONCTION#
         PAGE
<
<
<        A U   C A S   O U ...
<
<
FLOC:   @
         IF          4='F700('0080)'0080,XWOR%,,XWOR%
         LOCAL
FLOC:    EQU         $
XWOR%:   VAL         0
SPU:    @
         IF          3='F700('0080)'0080,XWOR%,,XWOR%
         PROG
SPU:     EQU         $
         RSR
XWOR%:   VAL         0
SPV:    @
         IF          3='F700('0080)'0080,XWOR%,,XWOR%
         PROG
SPV:     EQU         $
         RSR
XWOR%:   VAL         0
SPW:    @
         IF          3='F700('0080)'0080,XWOR%,,XWOR%
         PROG
SPW:     EQU         $
         RSR
XWOR%:   VAL         0
         PAGE
<
<
<        F I N   D E   L ' O V E R L A Y  :
<
<
XWOR%1:  VAL         $-DEBOV1*NOCMO
LOVL2:   EQU         ZERO+XWOR%1
         IF          BUFIN-$,,,XWOR%
         IF          ATTENTION : L'OVERLAY RECOUVRE LA
         IF          ZONE EN RECOUVREMENT DE L'ITEM2 !!!
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  :
<
<
XWOR%1:  VAL         ITEM2-BRANCH
         IF          $-DEBOV1-XWOR%1,XWOR%,,
         IF          ATTENTION : LA BRANCHE D'OVERLAY EST TROP LONGUE !!!
XWOR%:   VAL         0
         EOT         #SIP GEN PROCESSEUR#



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.