NMPROC:  VAL         "3D"            < NOM DU PROCESSEUR.
         IDP         "3D - RELEASE 01/06/1979"
         IDP         "JOHN F. COLONNA"
<
<
<        E D I T E U R   G R A P H I Q U E
<        T R I - D I M E N S I O N N E L  :
<
<
DIM:     VAL         3
SIZE:    VAL         1024            < NBRE DE POINTS LINEAIRES
                                     < ADRESSABLES D'UN ECRAN.
         EOT         #SIP DEF PROCESSEUR#
         WORD        GRAPH           < ADRESSE DE LANCEMENT DE CETTE
                                     < BRANCHE D'OVERLAY.
<
<        Z O N E   D E   R E S T A R T  :
<
         LOCAL
         WORD        0               < POUR FAIRE $=$+1.
         PROG
PGRAPH:  EQU         $               < A NOTER : P='12 !!!!!
         LRP         L
         BR          -2,L            < ENTREE DANS LA BARNCHE '3D'.
         EOT         #SIP DEFINITION ITEM#
         PAGE
<
<
<        E S P A C E   L I B R E   D E   T R A V A I L  :
<
<
FREE:    VAL         '1000           < CET ESPACE EST IMPLANTE
                                     < DANS LE 2 DERNIERS K MEMOIRE
                                     < DES 6K DEMANDES.
         PAGE
<
<        M A T R I C E S   D E   T R A N S F O R M A T I O N  :
<
         TABLE
TC:      VAL         1               < NUMERO DE LA 1ERE TRANSFORMATION.
MATRIX:  EQU         $
<
< TRANSFORMATIONS LIBRES LAISSEES A LA
< LIBRE DISPOSITION DE L'UTILISATEUR (INITIALISEES
< PAR L'ELEMENT NEUTRE) :
<
TUS1:    VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        0
         WORD        1;0;0;0;1;0;0;0;1
         WORD        1
<
< NBRE DE TRANSFORMATIONS LIBRES :
<
NTUS:    VAL         TC-TUS1
<
< ROTATION DE +16 DEGRE AUTOUR DE OX :
<
TRPOX:   VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        25
         WORD        25;0;0;0;24;-7;0;7;24
         WORD        22
<
< ROTATION DE +16 DEGRE AUTOUR DE OY :
<
TRPOY:   VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        25
         WORD        24;0;7;0;25;0;-7;0;24
         WORD        22
<
< ROTATION DE +16 DEGRE AUTOUR DE OZ :
<
TRPOZ:   VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        25
         WORD        24;-7;0;7;24;0;0;0;25
         WORD        22
<
< ROTATION DE -16 DEGRE AUTOUR DE OX :
<
TRMOX:   VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        25
         WORD        25;0;0;0;24;7;0;-7;24
         WORD        22
<
< ROTATION DE -16 DEGRE AUTOUR DE OY :
<
TRMOY:   VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        25
         WORD        24;0;-7;0;25;0;7;0;24
         WORD        22
<
< ROTATION DE -16 DEGRE AUTOUR DE OZ :
<
TRMOZ:   VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        25
         WORD        24;7;0;-7;24;0;0;0;25
         WORD        22
<
< ROTATION DE +PI/2 AUTOUR DE OX :
<
TR1OX:   VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        0
         WORD        1;0;0;0;0;-1;0;1;0
         WORD        4
<
< ROTATION DE +PI/2 AUTOUR DE OY :
<
TR1OY:   VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        0
         WORD        0;0;1;0;1;0;-1;0;0
         WORD        4
<
< ROTATION DE +PI/2 AUTOUR DE OZ :
<
TR1OZ:   VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        0
         WORD        0;-1;0;1;0;0;0;0;1
         WORD        4
<
< ROTATION DE -PI/2 AUTOUR DE OX :
<
TR3OX:   VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        0
         WORD        1;0;0;0;0;1;0;-1;0
         WORD        4
<
< ROTATION DE -PI/2 AUTOUR DE OY :
<
TR3OY:   VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        0
         WORD        0;0;-1;0;1;0;1;0;0
         WORD        4
<
< ROTATION DE -PI/2 AUTOUR DE OZ :
<
TR3OZ:   VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        0
         WORD        0;1;0;-1;0;0;0;0;1
         WORD        4
<
< SYMETRIE PLANNE PARALLELE A OX :
<
TSPOX:   VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        0
         WORD        -1;0;0;0;1;0;0;0;1
         WORD        2
<
< SYMETRIE PLANNE PARALLELE A OY :
<
TSPOY:   VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        0
         WORD        1;0;0;0;-1;0;0;0;1
         WORD        2
<
< SYMETRIE PLANNE PARALLELE A OZ :
<
TSPOZ:   VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        0
         WORD        1;0;0;0;1;0;0;0;-1
         WORD        2
<
< SUBSTITUTION OX,OY :
<
TEXY:    VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        0
         WORD        0;1;0;1;0;0;0;0;1
         WORD        2
<
< SUBSTITUTION OY,OZ :
<
TEYZ:    VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        0
         WORD        1;0;0;0;0;1;0;1;0
         WORD        2
<
< SUBSTITUTION OZ,OX :
<
TEZX:    VAL         TC
TC:      VAL         TC+1            < +1 SUR LE NUMERO TRANSFORMATION.
         WORD        0
         WORD        0;0;1;0;1;0;1;0;0
         WORD        2
<
< NOMBRE DE TRANSFORMATIONS RECONNUES :
<
NT:      VAL         TC-1
<
<        L I S T E   D E S   C U R S E U R S   V I R T U E L S  :
<
NCV:     VAL         20              < NBRE DE CURSEURS VIRTUELS.
LCV:     VAL         FREE
FREE:    VAL         2*DIM*NCV+FREE
<
<        L I S T E   D E S   E C H E L L E S   C O U R A N T E S  :
<
NSCAL:   VAL         20              < NBRE D'ECHELLES COURANTES.
LSCAL:   VAL         FREE
FREE:    VAL         DIM+1*NSCAL+FREE
<
<        L I S T E   D E S   T R A N S F O R M A T I O N S
<                    C O U R A N T E S  :
<
NTC:     VAL         20              < NBRE DE TRANSFORMATIONS COURANTES.
LTC:     VAL         FREE
FREE:    VAL         NT+2/2+2*NTC+FREE
         PAGE
<
<
<        C O M M O N  :
<
<
         COMMON
COM:     EQU         $
<
<        A C C E S   A   L ' I N T E R P R E T E U R  :
<
<        NOTA :
<                      CES 2 ROUTINES DOIVENT ABSOLUMENT
<                    ETRE RELAYEES PAR LES 2 PREMIERS
<                    MOTS DU COMMON , AFIN D'AVOIR DES
<                    DEPLACEMENTS D'ACCES AU COMMON CONNUS
<                    FACILEMENT DU PROGRAMME APPELANT.
<
AINT:    WORD        INT             < PASSAGE AU MODE INTERPRETATIF ,
                                     < AVEC ((K)) COMME ARGUMENT.
AINTA:   WORD        INTA            < PASSAGE AU MODE INTERPRETATIF ,
                                     < AVEC (A) COMME ARGUMENT.
<
<        L I S T E   D E S   D E S C R I P T E U R S
<                    D E   C O N T E X T E  :
<
LCON:    WORD        $+1,X
         WORD        CONCV           < DESCRIPTEUR 0 (CURSEUR VIRTUEL).
         WORD        CONSCA          < DESCRIPTEUR 1 (ECHELLE).
         WORD        CONTC           < DESCRIPTEUR 2 (TRANSFORMATION).
<
<        C U R S E U R   V I R T U E L  :
<
CV:      EQU         $
         DZS         2*DIM
X:       VAL         0
Y:       VAL         1
Z:       VAL         2
CVL:     EQU         CV              < CURSEUR VIRTUEL RAPPORTE AU
                                     < REFERENTIEL LOCAL INSTANTANE.
CVG:     EQU         CV+DIM          < CURSEUR VIRTUEL GLOBAL
                                     < RAPPORTE A L'ECRAN TRI-DI-
                                     < MENSIONNEL DE LA VISU (!!!!).
XL:      EQU         CVL+X
YL:      EQU         CVL+Y
ZL:      EQU         CVL+Z
XG:      EQU         CVG+X
YG:      EQU         CVG+Y
ZG:      EQU         CVG+Z
<
< CONTEXTE CURSEUR VIRTUEL COURANT :
<
CONCV:   EQU         $
NUMCV:   WORD        0               < NUMERO*2*DIM DU CURSEUR
                                     < VIRTUEL COURANT.
ALCV:    WORD        LCV             < ADRESSE DE LA LISTE DES
                                     < CURSEURS VIRTUELS.
C6:      WORD        2*DIM           < CONSTANTE MULTIPLICATIVE.
ANCV:    WORD        NCV             < NBRE MAX DE CV COURANTS.
ACV:     WORD        CV              < @CURSEUR VIRTUEL COURANT.
         WORD        0               < POINTEUR DE PILE (MODE PS/PL).
<
<        D E P L A C E M E N T   V E C T O R I E L   D E   C V  :
<
DV:      EQU         $
         DZS         DIM             < LE VECTEUR DV CONTIENT LES
                                     < DEPLACEMENT DE CV LORS DES
                                     < COMMANDES 1,2,3,4,5,6.
<
<        F A C T E U R S   D ' E C H E L L E  :
<
DX:      WORD        1               < INITIALISE A 1 POINT SUR OX.
DY:      WORD        1               < INITIALISE A UN POINT SUR OY.
DZ:      WORD        1               < INITIALISE A UN POINT SUR OZ.
SCALE:   WORD        1               < FACTEUR D'ECHELLE COMMUN
                                     < A DX,DY,DZ.
<
< CONTEXTE ECHELLE COURANTE :
<
CONSCA:  EQU         $
NUMSCA:  WORD        0               < NUMERO*(DIM+1) DE L'ECHELLE
                                     < COURANTE.
ALSCAL:  WORD        LSCAL           < ADRESSE DE LA LISTE DES
                                     < ECHELLES COURANTES.
CSCAL:   WORD        DIM+1           < CONSTANTE DE TRANSLATION ET
                                     < CONSTANTE MULTIPLICATIVE.
ANSCAL:  WORD        NSCAL           < NBRE MAX D'ECHELLES COURANTES.
ASCA:    WORD        DX              < ADRESSE DE L'ECHELLE COURANTE.
         WORD        0               < POINTEUR DE PILE (MODE PS/PL).
<
<        S E G M E N T   C O U R A N T  :
<
SEG:     EQU         $
         DZS         2*DIM
SEGORG:  EQU         SEG             < ORIGINE DU SEGMENT COURANT.
SEGEXT:  EQU         SEG+DIM         < EXTREMITE DU SEGMENT COURANT.
<
<        P R O J E C T I O N   D U   S E G M E N T   C O U R A N T  :
<
SEG2:    EQU         $               < PROJECTION PLANNE DE SEGC.
<
<        NOTA :
<                      LES 4 PREMIERS MOTS DE SEG2
<                    CONTIENNENT M1 ET M2 , ET LES
<                    4 DERNIERS N1 ET N2.
<
         DO          4
         DZS         2               < COUPLE (Z,X).
         DZS         2               < TAMPON DE PRUDENCE (CF. LE CAS
                                     < OU 2 POINTS NON OVERCREEN
                                     < ONT ETE DECOUVERTS ; LORS DE
                                     < LA RECHERCHE DU POINT D'INTER-
                                     < SECTION SUIVANT , W POINTE A LA
                                     < SUITE DE 'INTER' .....)
SEGOR2:  EQU         SEG2            < PROJECTION DE L'ORIGINE
                                     < DU SEGMENT COURANT.
SEGEX2:  EQU         SEG2+2          < PROJECTION DE L'EXTREMITE DU
                                     < SEGMENT COURANT.
<
< EXTREMITES M1 ET M2 DU SEGMENT COURANT PROJETE :
<
NZ:      VAL         0               < COORDONNEE VERTICALE DE M1/M2.
NX:      VAL         1               < COORDONNEE HORIZONTALE DE M1/M2.
X1:      EQU         SEGOR2+NX       < X(M1).
Z1:      EQU         SEGOR2+NZ       < Z(M1).
X2:      EQU         SEGEX2+NX       < X(M2).
Z2:      EQU         SEGEX2+NZ       < Z(M2).
<
< EQUATION DE LA DROITE SUPPORT DU SEGMENT
< COURANT PROJETE SUR L'ECRAN :
<
P1:      WORD        0               < P1=Z2-Z1.
MP1:     WORD        0               < MP1=-P1.
P2:      WORD        0               < P2=X2-X1.
P3:      DZS         2               < P3=X2*Z1-X1*Z2.
                                     < (DOUBLE PRECISION).
<
< DEFINITION DES POINTS M1,M2,N1,N2 :
< (DANS LA ZONE SEG2)
<
M1:      VAL         0
M2:      VAL         2
N1:      VAL         4
N2:      VAL         6
<
< POINTS D'INTERSECTION DE LA DROITE M1M2 AVEC L'ECRAN :
<
INTER:   EQU         SEG2+N1         < SOIENT N1 ET N2 CES 2 POINTS ,
                                     < S'ILS EXISTENT.
<
< CONSTANTE DE TRAVAIL :
<
INFINI:  WORD        '8000
ACALX:   WORD        CALX            < CALCUL DE X , Z ETANT DONNE.
ACALZ:   WORD        CALZ            < CALCUL DE Z , X ETANT DONNE.
                                     < (SUR LA DROITE M1M2).
AOVS:    WORD        OVS             < TEST DES OVER-SCREEN.
BORNE:   WORD        SIZE-1          < COORDONNEE MAXIMALE ACCESSIBLE
                                     < EN X ET Z SUR L'ECRAN.
<
<        T R A N S F O R M A T I O N S   G E O M E T R I Q U E S
<                    E L E M E N T A I R E S  :
<
<        FORMAT :
<                      LES TRANSFORMATIONS GEOMETRIQUES ELEMENTAIRES
<                    SONT DEFINIES A L'AIDE DE MATRICES
<                    ORTHOGONALES 3*3 , DONT LE FORMAT EST LE
<                    SUIVANT :
<
<                    M=DIV,(A11,A12,A13,A21,A22,A23,A31,A32,A33),PERIOD.
<
DIV:     VAL         0               < DIV EST LE DIVISEUR DES COEF-
                                     < FICIENTS ENTIERS DES MATRICES
                                     < DE TRANSFORMATIONS ; SI CELUI-CI
                                     < VAUT 0 , IL EST ASSIMILE A 1.
A11:     VAL         1
A12:     VAL         2
A13:     VAL         3
A21:     VAL         4
A22:     VAL         5
A23:     VAL         6
A31:     VAL         7
A32:     VAL         8
A33:     VAL         9
PERIOD:  VAL         10              < PERIOD DONNE LE 'DEGRE'
                                     < D'IDEMPOTENCE DE CHAQUE
                                     < TRANSFORMATION T :
                                     < SI PERIOD=N :
                                     < T*T*...(N FOIS)...*T=O.
                                     < (ELEMENT NEUTRE).
CTE1:    VAL         DIM*DIM+2       < NBRE D'ELEMENTS D'1NE MATRICE.
<
< TRANSFORMATION COURANTE :
<
TRANST:  VAL         FREE            < NBRE D'ITERATIONS DE CHAQUE
                                     < TRANSFORMATION ELEMENTAIRE , A
                                     < RAISON DE 1 OCTET POUR CHAQUE.
TRANSN:  WORD        TRANST+'8000    < RELAI INDEX INDIRECT VERS TRANST.
TRANSC:  DZS         2               < 1 BIT PAR TRANSFORMATION
                                     < ELEMENTAIRE PRESENTE.
<
< CONTEXTE TRANSFORMATION COURANTE :
<
CONTC:   EQU         $
NUMTC:   WORD        0               < NUMERO*(NT+2/2+2) DE LA
                                     < TRANSFORMATION COURANTE.
ALTC:    WORD        LTC             < ADRESSE DE LA LISTE DES
                                     < TRANSFORMATIONCS COURANTES.
CTC:     WORD        NT+2/2+2        < CONSTANTE MULTIPLICATIVE ET
                                     < DE TRANSLATION.
ANTC:    WORD        NTC             < NBRE MAX DE TRANSFORMATIONS
                                     < COURANTES.
ATC:     WORD        TRANST          < @TRANSFORMATION COURANTE.
FREE:    VAL         NT+2/2+FREE
         WORD        0               < POINTEUR DE PILE (MODE PS/PL).
<
< CONSTANTES DE TRAVAIL :
<
AMAT:    WORD        MATRIX-CTE1     < @ DE LA MATRICE 0 DES TRANSFOR-
                                     < MATIONS ORTHOGONALES.
AMATC:   WORD        0               < RELAI VERS LA MATRICE DE LA
                                     < TRANSFORMATION ELEMENTAIRE
                                     < COURANTE.
AMATCX:  WORD        0               < RELAI INDEXE VERS LA MATRICE
                                     < DE LA TRANSFORMATION ELEMENTAIRE
                                     < COURANTE.
C11:     WORD        CTE1            < NBRE D'ELEMENTS D'1NE MATRICE
                                     < DE TRANSFORMATION ELEMENTAIRE.
ACOMP:   WORD        COMPUT          < ROUTINE OPERANT LES PRODUITS
                                     < MATRICIELS PARTIELS.
<
<        P R O J E C T I O N   P L A N N E  :
<
<
< PSEUDO-MATRICE DE PROJECTION PLANNE :
<
MPROJ:   WORD        5
         WORD        4               < COSINUS(PROJECTION)=4/5.
         WORD        3               < SINUS(PROJECTION)=3/5.
C512:    WORD        SIZE/2          < POUR ATTEINDRE LE CENTRE REEL
                                     < DE L'ECRAN.
APROJ:   WORD        PROJ            < ROUTINE DE PROJECTION D'1N
                                     < POINT DU 3-ESPACE SUR LE
                                     < PLAN DE L'ECRAN.
<
<        C O N S T A N T E S   D E   R E C U R S I V I T E  :
<
ATEST:   WORD        TEST            < ADRESSE D'UNE INSTRUCTION DE
                                     < TEST (JMP/JE/JNE/...) MODIFIEE
                                     < DYNAMIQUEMENT.
<
<        C O N S T A N T E S   S O D O M E  :
<
AIC:     WORD        ZERO+PILE-LTNI-LTNI+LTN,X
                                     < ADRESSE DE L'ITEM COURANT CON-
                                     < TENANT LE PROGRAMME GRAPHIQUE
                                     < (ITEM2).
                                     < (RELAI INDEXE).
LOVL:    WORD        ZERO-BRANCH+PILE-LTNI-LTNI*2
                                     < LONGUEUR EN OCTETS DES BRANCHES
                                     < DES OVERLAYS DE SODOME.
APILEG:  WORD        PILE-1          < POUR INITIALISER K AVEC LA
                                     < PILE DE 'GE' LORS DES RETOURS
                                     < A 'GE'.
<        A T T E N T I O N  :
<                      CES DEFINITIONS DOIVENT ETRE
<                    IMPLEMENTEES AVANT LA MODIFICATION
<                    DE LA VALEUR DE 'PILE' !!!!!
NCALL:   WORD        $+1,X;"GE";"EI" < NOM DES OVERLAYS SUIVANTS.
AOVL:    WORD        OVL             < ROUTINE DE CHARGEMENT DES
                                     < OVERLAYS SUIVANTS.
<
<        D E M A N D E S   A   C M S 4  :
<
OG:      WORD        '0203           < MISE EN GRAPHIQUE DE LA VISU.
CG:      WORD        '0204           < RETOUR EN ALPHA-NUMERIQUE.
WG:      WORD        '020A           < ECRITURE GRAPHIQUE.
         WORD        SEGOR2-ZERO*2
         WORD        8               < 'ECRITURE' D'UN SEGMENT.
DERASE:  WORD        '0205           < EFFACEMENT DE L'ECRAN.
CCI:     WORD        '0001           < RETOUR AU CCI.
DEMCCI:  EQU         CCI             < RETOUR AU CCI.
DEMMEM:  WORD        '0004           < DEMANDE D'ALLOCATION 6K MEMOIRE ,
                                     < ET DE RETOUR A 4K MEMOIRE.
         WORD        0
         WORD        '3000           < INITIALISEE SUR 6K MEMOIRE.
DEMSGN:  WORD        '8402           < INITIALIISE EN 'STORE' POUR
                                     < LA GENERATION DE CETTE BRANCHE.
         WORD        BRANCH-ZERO*2   < @OCTET DE LA BRANCHE.
         WORD        ZERO-BRANCH+PILE-LTNI-LTNI*2
         WORD        -1              < LA VALEUR SUIT LE NOM.
<
<        P I L E   D E   T R A V A I L  :
<
PILE:    VAL         FREE+1          < EN QUEUE POUR FAIRE UNE VIOLATION
                                     < MEMOIRE EN CAS DE DEBORDEMENT
                                     < DE LA PILE PAR LE HAUT.
<
<        C O N S T A N T E S   G E N E R A L E S  :
<
APILE:   WORD        PILE-1
DUMY1:   WORD        0               < WORKING STORAGE (TEMPORARY).
DUMY2:   WORD        0               < WORKING STORAGE (TEMPORARY).
<
<        C O N S T A N T E S   I N T E R P R E T A T I V E S  :
<
ATINT:   WORD        TINT            < ROUTINE DES TEST DU MODE
                                     < INTERPRETATIF.
ALIST:   WORD        0               < RELAI VERS LA LISTE A INTERPRETER
                                     < (=0 EN MODE NON INTERPRETATIF).
SAVEA:   WORD        0               < POUR INITIALISER A AVANT CHAUQE
                                     < APPEL INTERPRETATIF DE PRIMITIVE.
SAVEB:   WORD        0               < DE MEME POUR B.
SAVEX:   WORD        0               < IDEM POUR X.
<
<        P R I M I T I V E S   D U   S Y S T E M E  :
<
PRIM:    EQU         $
AERR:    WORD        ERREUR          < TRAITEMENT DES ERREURS.
<
< PRIMITIVES DE RECURSIVITE :
<
ABR:     WORD        BOREC           < 'BEGIN' RECURSIVITE.
AER:     WORD        EOREC           < 'END' RECURSIVITE INCONDITIONNELLE
AERI:    WORD        EORECI          < 'END' RECURSIVITE 'JIX'.
AERD:    WORD        EORECD          < 'END' RECURSIVITE 'JDX'.
APG:     WORD        PG              < BEGIN RECURSIVITE INTERPRETATIVE.
APD:     WORD        PD              < END RECURSIVITE JDX INTERPRET.
ASDES:   WORD        SDES            < APPEL DE SOUS-DESSIN.
ACALL:   WORD        CALL            < APPEL TRANSLATABLE DE ROUTINE.
AGO:     WORD        GO              < GOTO INCONDITIONNEL.
AGOGE:   WORD        GOGE            < GOTO SI 'GE'.
AGONE:   WORD        GONE            < GOTO SI 'NE'.
AGOGT:   WORD        GOGT            < GOTO SI 'GT'.
AGOLT:   WORD        GOLT            < GOTO SI 'LT'.
AGOEQ:   WORD        GOEQ            < GOTO SI 'EQ'.
AGOLE:   WORD        GOLE            < GOTO SI 'LE'.
<
< PRIMITIVES DE TRANSFORMATIONS :
<
AT:      WORD        TRANS           < AJOUT TRANSFORMATION ELEM.
ART:     WORD        RTRANS          < SUPPRESION TRANSFORMATION ELEM.
AVIDE:   WORD        VIDE            < RETOUR A L'ELEMENT NEUTRE.
ACT:     WORD        CREAT           < CREATION TRANSFORMATION USER.
APX:     WORD        PX              < PROJECTION PARALLELE A OX.
APY:     WORD        PY              < PROJECTION PARALLELE A OY.
APZ:     WORD        PZ              < PROJECTION PARALLELE A OZ.
ATRPM:   WORD        TRPM            < MEMORISATION ROTATION.
ATQ13:   WORD        TQ13            < MEMORISATION QUADRATURE.
ATUS:    WORD        TUS             < MEMORISATION TRANSFO. USER.
ATSP:    WORD        TSP             < MEMORISATION SYMETRIE.
ATECH:   WORD        TECH            < MEMORISATION SUBSTITUTION.
<
< PRIMITIVES D'ECHELLE :
<
AMS:     WORD        MSCALE          < MODIFICATION DE 'SCALE'.
AMDX:    WORD        MDX             < MODIFICATION DE DX.
AMDY:    WORD        MDY             < MODIFICATION DE DY.
AMDZ:    WORD        MDZ             < MODIFICATION DE DZ.
AMD:     WORD        MD              < MODIFICATION DE DX,DY,DZ.
AMDXP:   WORD        MDXP            < INCREMENTATION DE DX.
AMDYP:   WORD        MDYP            < INCREMENTATION DE DY.
AMDZP:   WORD        MDZP            < INCREMENTATION DE DZ.
AMDXM:   WORD        MDXM            < DECREMENTATION DE DX.
AMDYM:   WORD        MDYM            < DECREMENTATION DE DY.
AMDZM:   WORD        MDZM            < DECREMENTATION DE DZ.
AMP:     WORD        MP              < INCREMENTATION DE DX,DY,DZ.
AMM:     WORD        MM              < DECREMENTATION DE DX,DY,DZ.
<
< PRIMITIVES DE CHANGEMENT DE CONTEXTE :
<
AMCV:    WORD        MCV             < POSITIONNEMENT ABSOLU CV COURANT.
AMCVA:   WORD        MCVA            < POSIT. ABS. CV COURANT , ARG. (A)
ACHCV:   WORD        CHCV            < CHANGEMENT DU CV COURANT.
ACHSCA:  WORD        CHSCA           < CHANGEMENT ECHELLE COURANTE.
ACHTC:   WORD        CHTC            < CHANGEMENT TRANS. COURANTE.
APSCV:   WORD        PSCV            < PUSH CV.
APLCV:   WORD        PLCV            < PULL CV.
APSSCA:  WORD        PSSCA           < PUSH SCALE.
APLSCA:  WORD        PLSCA           < PULL SCALE.
APSTC:   WORD        PSTC            < PUSH TC.
APLTC:   WORD        PLTC            < PULL TC.
<
< PRIMITIVES DE DEPLACEMENT ET DE TRACE :
<
AD1:     WORD        D1              < 1 : DEPLACEMENT DELTA(X)>0.
AD2:     WORD        D2              < 2 : DEPLACEMENT DELTA(Y)>0.
AD3:     WORD        D3              < 3 : DEPLACEMENT DELTA(Z)>0.
AD4:     WORD        D4              < 4 : DEPLACEMENT DELTA(X)<0.
AD5:     WORD        D5              < 5 : DEPLACEMENT DELTA(Y)<0.
AD6:     WORD        D6              < 6 : DEPLACEMENT DELTA(Z)<0.
APA:     WORD        PA              < A : ORIGINE D'UN SEGMENT.
APB:     WORD        PB              < B : EXTREMITE SEQUENTIELLE SEG.
ACI:     WORD        GOCCI           < C : RETOUR AU CCI.
AERAS:   WORD        ERASE           < E : EFFACEMENT DE L'ECRAN.
AGE:     WORD        GOBGE           < F : RETOUR A SODOME.
AO:      WORD        CVO             < O : MISE CV COURANT A L'ORIGINE.
AFIN:    WORD        FININT          < P : FIN DE LISTE A INTERPRETER.
APS:     WORD        PS              < S : EXTREMITE ETOILEE SEGMENT.
<
< PRIMITIVES REGISTRES :
<
ARA:     WORD        RA              < INITIALISATION REGISTRE A.
ARB:     WORD        RB              < INITIALISATION REGISTRE B.
ARX:     WORD        RX              < INITIALISATION REGISTRE X.
AEGAL:   WORD        EGAL            < RECUPERATION CTTE HEXADECIMALE.
<
< ACCES A LA GRAMMAIRE ET AUX PRIMITIVES :
<
APRIM:   WORD        PRIM-COM-'80    < POUR RECONSTITUER UN DEPLACEMENT
                                     < DANS LE COOMON D'ACCES AUX
                                     < ROUTINES PRIMITIVES.
ACRINT:  WORD        CRINT           < ADRESSE DU BSR DYNAMIQUE
                                     < D'ACCES AUX PRIMITIVES.
ACHSGR:  WORD        CHSGR           < ADRESSE DU 'LA' DYNAMIQUE
                                     < DE CHANGEMENT DE GRAMMAIRE.
AG0:     WORD        G0              < ADRESSE DE LA GRAMMAIRE INITIALE.
AGT1:    WORD        GT1             < GRAMMAIRE DES TRANSFORMATIONS.
AGTRPM:  WORD        GTRPM           < GRAMMAIRE DES ROTATIONS.
AGTQ13:  WORD        GTQ13           < GRAMMAIRE DES QUADRATURES.
AGTUS:   WORD        GTUS            < GRAMMAIRE DES TRANSFO. USER.
AGTSP:   WORD        GTSP            < GRAMMAIRE DES SYMETRIES.
AGTECH:  WORD        GTECH           < GRAMMAIRE DES SUBSTITUTIONS.
AGPL:    WORD        GPL             < GRAMMAIRE DES PUSH C/S/T.
AGPS:    WORD        GPS             < GRAMMAIRE DES PULL C/S/T.
AGPRO:   WORD        GPRO            < GRAMMAIRE DES PROJECTIONS.
AGREG:   WORD        GREG            < GRAMMAIRE DES REGISTRES.
AGPM:    WORD        GPM             < GRAMMAIRE +/- SUR DELTA X/Y/Z.
AGINI:   WORD        GINI            < GRAMMAIRE INITIALISATIONS.
<
<
<        G R A M M A I R E   I N T E R P R E T A T I V E  :
<
<
<        FORMAT :
<                      CHAQUE ENTREE EST FAITE D'UN MOT
<                    DONT LE FORMAT EST LE SUIVANT :
<                    OCTET0=CARACTERE A RECONNAITRE ('00
<                    INDIQUE UNE FIN D'ALTERNATIVE) ,
<                    OCTET1=SI BIT0=0 : INDEX D'ACCES A LA PRIMITIVE
<                    ASSOCIE PAR RAPPORT A 'PRIM'.
<                           SI BIT0=1 : INDEX D'ACCES A L'ADRESSE
<                    DE LA NOUVELLE GRAMMAIRE.
<                      UNE SUITE D'ALTERNATIVES REPRESENTE
<                    UN PARALLELE.
<
<
<        G R A M M A I R E   I N I T I A L E  :
<
<
G0:      EQU         $
         BYTE        "1";AD1-PRIM
         BYTE        "2";AD2-PRIM
         BYTE        "3";AD3-PRIM
         BYTE        "4";AD4-PRIM
         BYTE        "5";AD5-PRIM
         BYTE        "6";AD6-PRIM
         BYTE        "B";APB-PRIM
         BYTE        "A";APA-PRIM
         BYTE        "$";AFIN-PRIM
         BYTE        "S";APS-PRIM
         BYTE        "T"+'80;AGT1-PRIM < VERS LA GRAMMAIRE DES TRANSFO.
         BYTE        "(";APG-PRIM    < BEGIN RECURSIVITE.
         BYTE        ")";APD-PRIM    < END RECURSIVITE JDX.
         BYTE        "&";ASDES-PRIM
         BYTE        "M"+'80;AGINI-PRIM
         BYTE        "=";AEGAL-PRIM
         BYTE        "R"+'80;AGREG-PRIM
         BYTE        "D"+'80;AGPM-PRIM
<
< PRIMITIVES PEU FREQUENTES :
<
         BYTE        ";"+'80;AG0-PRIM  < SEPARATEUR FACULTATIF.
         BYTE        "E";AERAS-PRIM
         BYTE        "F";AGE-PRIM
         BYTE        "P"+'80;AGPRO-PRIM
         BYTE        "O"+'80;AGPL-PRIM
         BYTE        "I"+'80;AGPS-PRIM
         BYTE        "C";ACI-PRIM
         BYTE        '00;AERR-PRIM   < FIN DU PARALLELE.
<
<
<        G R A M M A I R E   D E S   T R A N S F O R M A T I O N S  :
<
<
GT1:     EQU         $
         BYTE        "R"+'80;AGTRPM-PRIM
         BYTE        "Q"+'80;AGTQ13-PRIM
         BYTE        "U"+'80;AGTUS-PRIM
         BYTE        "S"+'80;AGTSP-PRIM
         BYTE        "E"+'80;AGTECH-PRIM
         BYTE        "+";AT-PRIM
         BYTE        "-";ART-PRIM
         BYTE        "0";AVIDE-PRIM
         BYTE        '00;AERR-PRIM   < FIN DU PARALLELE.
<
<
<        G R A M M A I R E   D E S   R O T A T I O N S  :
<
<
GTRPM:   EQU         $
         BYTE        "1";ATRPM-PRIM  < +16 DEGRE AUTOUR DE OX.
         BYTE        "2";ATRPM-PRIM  < +16 DEGRE AUTOUR DE OY.
         BYTE        "3";ATRPM-PRIM  < +16 DEGRE AUTOUR DE OZ.
         BYTE        "4";ATRPM-PRIM  < -16 DEGRE AUTOUR DE OX.
         BYTE        "5";ATRPM-PRIM  < -16 DEGRE AUTOUR DE OY.
         BYTE        "6";ATRPM-PRIM  < -16 DEGRE AUTOUR DE OZ.
         BYTE        '00;AERR-PRIM   < FIN DE PARALLELE.
<
<
<        G R A M M A I R E   D E S   Q U A D R A T U R E S  :
<
<
GTQ13:   EQU         $
         BYTE        "1";ATQ13-PRIM  < +PI/2 AUTOUR DE OX.
         BYTE        "2";ATQ13-PRIM  < +PI/2 AUTOUR DE OY.
         BYTE        "3";ATQ13-PRIM  < +PI/2 AUTOUR DE OZ.
         BYTE        "4";ATQ13-PRIM  < -PI/2 AUTOUR DE OX.
         BYTE        "5";ATQ13-PRIM  < -PI/2 AUTOUR DE OY.
         BYTE        "6";ATQ13-PRIM  < -PI/2 AUTOUR DE OZ.
         BYTE        '00;AERR-PRIM   < FIN DE PARALLELE.
<
<
<        G R A M M A I R E   D E S   T R A N S F O .   U S E R  :
<
<
GTUS:    EQU         $
         BYTE        "1";ATUS-PRIM
         BYTE        '00;AERR-PRIM   < FIN DE PARALLELE.
<
<
<        G R A M M A I R E   D E S   S Y M E T R I E S  :
<
<
GTSP:    EQU         $
         BYTE        "1";ATSP-PRIM
         BYTE        "2";ATSP-PRIM
         BYTE        "3";ATSP-PRIM
         BYTE        '00;AERR-PRIM   < FIN DE PARALLELE.
<
<
<        G R A M M A I R E   D E S   S U B S T I T U T I O N S  :
<
<
GTECH:   EQU         $
         BYTE        "1";ATECH-PRIM  < SUBSTITUTION DE OX,OY.
         BYTE        "2";ATECH-PRIM  < SUBSTITUTION DE OY,OZ.
         BYTE        "3";ATECH-PRIM  < SUBSTITUTION DE OZ,OX.
         BYTE        '00;AERR-PRIM   < FIN DE PARALLELE.
<
<
<        G R A M M A I R E   I N I T I A L I S A T I O N
<                    E C H E L L E S  :
<
<
GINI:    EQU         $
         BYTE        "S";AMS-PRIM    < INITIALISATION 'SCALE'.
         BYTE        "1";AMDX-PRIM   < INITIALISATION DELTA(X).
         BYTE        "2";AMDY-PRIM   < INITIALISATION DELTA(Y).
         BYTE        "3";AMDZ-PRIM   < INITIALISATION DELTA(Z).
         BYTE        "D";AMD-PRIM    < INITIALISATION DES 3 DELTAS.
         BYTE        '00;AERR-PRIM   < FIN DE PARALLELE.
<
<
<        G R A M M A I R E   D E S   P U S H  :
<
<
GPS:     EQU         $
         BYTE        "C";APSCV-PRIM  < PUSH CURSEUR VIRTUEL.
         BYTE        "S";APSSCA-PRIM < PUSH SCALE.
         BYTE        "T";APSTC-PRIM  < PUSH TRANSFORMATION.
         BYTE        '00;AERR-PRIM   < FIN DE PARALLELE.
<
<
<        G R A M M A I R E   D E S   P U L L  :
<
<
GPL:     EQU         $
         BYTE        "C";APLCV-PRIM  < PULL CURSEUR VIRTUEL.
         BYTE        "S";APLSCA-PRIM < PULL SCALE.
         BYTE        "T";APLTC-PRIM  < PULL TRANSFORMATION.
         BYTE        "R";AO-PRIM     < RETOUR A L'ORIGINE DU CV.
         BYTE        '00;AERR-PRIM   < FIN DE PARALLELE.
<
<
<        G R A M M A I R E   D E S   P R O J E C T I O N S  :
<
<
GPRO:    EQU         $
         BYTE        "1";APX-PRIM    < PROJECTION PARALLELE A OX.
         BYTE        "2";APY-PRIM    < PROJECTION PARALLELE A OY.
         BYTE        "3";APZ-PRIM    < PROJECTION PARALLELE A OZ.
         BYTE        '00;AERR-PRIM   < FIN DE PARALLELE.
<
<
<        G R A M M A I R E   D E S   R E G I S T R E S  :
<
<
GREG:    EQU         $
         BYTE        "A";ARA-PRIM    < SELECTION REGISTRE A.
         BYTE        "B";ARB-PRIM    < SELECTION REGISTRE B.
         BYTE        "X";ARX-PRIM    < SELECTION REGISTRE X.
         BYTE        '00;AERR-PRIM   < FIN DE PRARLLELE.
<
<
<        G R A M M A I R E   D E S   M O D I F I C A T I O N S  :
<
<
GPM:     EQU         $
         BYTE        "1";AMDXP-PRIM  < INCREMENTATION DELTA(X).
         BYTE        "2";AMDYP-PRIM  < INCREMENTATION DE DELTA(Y).
         BYTE        "3";AMDZP-PRIM  < INCREMENTATION DE DELTA(Z).
         BYTE        "4";AMDXM-PRIM  < DECREMENTATION DELTA(X).
         BYTE        "5";AMDYM-PRIM  < DECREMENTATION DELTA(Y).
         BYTE        "6";AMDZM-PRIM  < DECREMENTATION DELTA(Z).
         BYTE        "+";AMP-PRIM    < INCREMENTATION DES 3 DELTAS.
         BYTE        "-";AMM-PRIM    < DECREMENTATION DES 3 DELTAS.
         BYTE        '00;AERR-PRIM   < FIN DE PARALLELE.
         PROG
         PAGE
<
<
<        S Y N T A X E   I N T E R P R E T A T I V E  :
<
<
<        'TR'('1'/'2'/'3'/'3'/'4'/'5'/'6')::=<DESIGNATION DE TRPOX(1),
<                    TRPOY(2) , TRPOZ(3) , TRMOX(4) , TRMOY(5) ,
<                    TRMOZ(6)> ,
<        'TQ'('1'/'2'/'3'/'4'/'5'/'6')::=<DESIGNATION  TR1OX(1) , TR1OY
<                    (2) , TR1OZ(3) , TR3OX(4) , TR3OY(5) , TR3OZ(6)> ,
<        'TU1'::=<DESIGNATION DE TUS1> ,
<        'TS'('1'/'2'/'3')::=<DESIGNATION DE TSPOX(1) ,
<                    TSPOY(2) , TSPOZ(3)> ,
<        'TE'('1'/'2'/'3')::=<DESIGNATION DE TEXY(1) ,
<                    TEYZ(2) , TEZX(3)> ,
<        'T0'::=<RETOUR A L'ELEMENT NEUTRE> ,
<        'T+'::=<AJOUT TRANSFORMATION ELEMENTAIRE> ,
<        'T-'::=<SUPPRESSION TRANSFORMATION ELEMENTAIRE> ,
<        '1'::=<DEPLACEMENT X POSITIF> ,
<        '2'::=<DEPLACEMENT Y POSITIF> ,
<        '3'::=<DEPLACEMENT Z POSITIF> ,
<        '4'::=<DEPLACEMENT X NEGATIF> ,
<        '5'::=<DEPLACEMENT Y NEGATIF> ,
<        '6'::=<DEPLACEMENT Z NEGATIF> ,
<        'A'::=<ORIGINE D'UN SEGMENT> ,
<        'B'::=<EXTREMITE SEQUENTIELLE D'UN SEGMENT> ,
<        'S'::=<EXTREMITE ETOILEE D'UN SEGMENT> ,
<        '$'::=<FIN DE LISTE INTERPRETATIVE> ,
<        'P'('1'/'2'/'3')::=<PROJECTION PARALLELE A OX/OY/OZ> ,
<        'E'::=<EFFACEMENT DE L'ECRAN> ,
<        'F'::=<RETOUR A 'GE'> ,
<        'OR'::=<RETOUR DU CURSEUR VIRTUEL A L'ORIGINE> ,
<        'I'('C'/'S'/'T')::=<PUSH CV/SCALE/TRANSFORMATION> ,
<        'O'('C'/'S'/'T')::=<PULL CV/SCALE/TRANSFORMATION> ,
<        'D'('1'/'2'/'3')::=<INCREMENTATION DELTA(X(1)/Y(2)/Z(3))> ,
<        'D'('4'/'5'/'6')::=<DECREMENTATION DELTA(X(4)/Y(5)/Z(6))> ,
<        'D'('+'/'-')::=<INCREMENTATION/DECREMENTATION DES 3 DELTAS> ,
<        'MS'::=<INITIALISATION DE SCALE AVEC (B)> ,
<        'M'('1'/'2'/'3')::=<INITIALISATION DE DELTA(X(1)/Y(2)/Z(3))
<                    AVEC (B)> ,
<        'MD'::=<INITIALISATION DES 3 DELTAS AVEC (B)> ,
<        '='::=<DECLARATION CONSTANTE> ,
<        'R'('A'/'B'/'X')::=<INITIALISATION DE A/B/X AVEC CONSTANTE> ,
<        '('::=<BEGIN RECURSIVITE> ,
<        ')'::=<END RECURSIVITE JDX> ,
<        '&'::=<APPEL DE SOUS-DESSIN (ROUTINE/TEXTE)> ,
<        'C'::=<RETOUR AU CCI> ,
         PAGE
         PROG        PROG1
<
<
<        I N T E R P R E T E U R   G R A P H I Q U E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE APPELEE PAR UN BSR
<                    EXPLICITE , PERMET DE TRAVAILLER EN
<                    MODE INTERPRETATIF , C'EST-A-DIRE
<                    DE DONNER LES ORDRES GRAPHQUES SOUS
<                    FORME DE TEXTES ASCI.
<
<
<        NOTA :
<                      'INT' PERMET UNE INTERPRETATION
<                    TRANSLATABLE DES TEXTES , C'EST-A-DIRE
<                    SANS CONNAITRE LEUR ADRESSE PAR L'INTER-
<                    MEDIAIRE D'UNE BASE.
<
<
<        ARGUMENT :
<                    A=@DU TEXTE ASCI A INTERPRETER POUR 'INTA' ,
<                    MOT(K)=@DU TEXTE ASCI A INTERPRETER POUR 'INT' ,
<                           C'EST-A-DIRE LE MOT SUIVANT LE BSR
<                           CONTIENT L'@DU TEXTE ASCI.
<
<
<        UTILISATION DES REGISTRES :
<                    Y=CARACTERE RECONNU ,
<                    L=BASE DE LA GRAMMAIRE COURANTE ,
<                    A=SAVEA ,
<                    B=SAVEB ,
<                    X=SAVEX.
<
<
INT:     EQU         $               < ENTRY 'ARGUMENT ((K))'.
         LR          K,W             < W POINTE L'ADRESSE DE L'ADRESSE
                                     < DU TEXTE A INTERPRETER.
         IC          0,W             < CALCUL DE L'ADRESSE REELLE
                                     < DE RETOUR A L'APPELANT.
         PLR         W               < W=ADRESSE+1 DU TEXTE A
                                     < INTERPRETER.
         ADRI        1,K             < ANNULATION DES EFFETS DU 'PLR'.
         PSR         A,B,X,Y         < SAVE LES REGISTRES DE L'APPELANT.
         LA          -1,W            < A=@DU TEXTE A INTERPRETER.
         JMP         E142            < VERS L'INTERPRETATION.
INTA:    EQU         $               < ENTRY 'ARGUMENT (A)'.
         PSR         A,B,X,Y         < SAVE LES REGISTRES DE L'APPELANT.
<
< INITIALISATION DE L'INTERPRETATION :
<
E142:    EQU         $
         LB          ALIST
         PSR         B,L,W           < SAVE ALIST , L & W.
         SBT         0               < GENERATION DU BIT INDEX.
         STA         ALIST           < MISE EN PLACE DU RELAI INDEXE
                                     < INDIRECT D'ACCES AU TEXTE.
         LXI         0               < INDEX DU TEXTE A INTERPRETER.
         LA          AG0
         LR          A,L             < L=@GRAMMAIRE INITIALE.
<
< BOUCLE D'INTERPRETATION :
<
E50:     EQU         $
         LBY         &ALIST          < RECUPERATION DU CARACTERE
                                     < COURANT DU TEXTE.
         JAE         E151            < PRIMITIVE 'ELEMENT NEUTRE'
                                     < ('00).
         CPI         '20
         JE          E151            < PRIMITIVE 'ELEMENT NEUTRE'
                                     < ('SPACE').
         LR          A,Y             < Y=CARACTERE COURANT.
<
< ANALYSE DU CARACTERE COURANT :
<
         PSR         L               < SAVE GRAMMAIRE COURANTE.
E300:    EQU         $
         LBY         0,L             < RECUPERATION DU CARACTERE
                                     < CONTENU DANS LE NOEUD COURANT
                                     < DE LA GRAMMIRE (L).
         JAE         E301            < CAS OU ON EST TOMBE SUR LA FIN
                                     < D'UN PARALLELE , ON ABANDONNE
                                     < L'ANALYSE.
         RBT         8               < RAZ A PRIORI DU BIT DE DISCRI-
                                     < MINATION DES PRIMITIVES ET
                                     < DES CHANGEMENTS DE GRAMMAIRE.
         CPR         A,Y             < LE CARACTERE CONTENU DANS LE
                                     < NOEUD EST-IL LE CARACTERE
                                     < COURANT DU TEXTE ????
         JE          E301            < OUI , C'EST BON ....
         ADRI        1,L             < SINON , ON PASSE AU NOEUD SUIVANT
                                     < DE LA GRAMMAIRE COURANTE.
         JMP         E300            < VERS LA POURSUITE DE L'ANALYSE.
<
< TRAITEMENT DES CARACTERES RECONNUS ,
< OU DES FIN DE PARALLELES :
<
E301:    EQU         $
         LA          0,L
         ANDI        'FF             < RECUPERATION DE L'INDEX D'ACCES
                                     < A LA PRIMITIVE ASSOCIEE.
         AD          APRIM           < CALCUL DU DEPLACEMENT DANS LE
                                     < COMMON POUR ACCES AU RELAI
                                     < VERS LA PRIMITIVE.
         CPZ         0,L             < DISCRIMINATION DES APPELS DE
                                     < PRIMITIVES , DES CHANGEMENTS
                                     < DE GRAMMAIRES.
         PLR         L               < RESTAURE LA GRAMMAIRE COURANTE.
         JL          E302            < CAS D'UN CHANGEMENT DE GRAMMAIRE.
<
< CAS D'UN APPEL DE PRIMITIVES :
<
         STA         &ACRINT
         LAI         '46             < CODE DU 'BSR' BASE PAR 'C'.
         STBY        &ACRINT         < GENERATION D'UN BSR D'ACCES
                                     < A LA PRIMITIVE ASSOCIEE AU
                                     < CARACTERE RECONNU.
<
< PREPARATION DES REGISTRES :
<
         PSR         X               < SAVE L'INDEX COURANT DU TEXTE.
         LA          SAVEA
         LB          SAVEB
         LX          SAVEX
<        NOTA :
<                    Y=CARACTERE COURANT RECONNU.
CRINT:   BSR         AFIN            < BSR DYNAMIQUE D'ACCES ALA
                                     < PRIMITIVE COURANTE  (INITIALISE
                                     < AVEC UNE FIN D'INTERPRETATION).
<
< RETOUR DES PRIMITIVES :
<
<
<        A T T T E N T I O N  :
<                      LA BASE L A PU ETRE MODIFIEE PAR
<                    LA PRIMITIVE DONT ON REVIENT ,
<                    AFIN D'ACCEDER A UNE AUTRE GRAMMAIRE.
<
         STA         SAVEA           < SAVE LE REGISTRE A EN RETOUR.
         STB         SAVEB           < SAVE LE REGISTRE B EN RETOUR.
         STX         SAVEX           < SAVE LE REGISTRE X EN RETOUR.
         PLR         X               < RESTAURE INDEX COURANT DU TEXTE.
<
< ENTRY POUR RECURSIVITE INTERPRETATIVE :
<
E151:    EQU         $               < ENTRY POUR LES PRIMITIVES
                                     < 'ELEMENT NEUTRE' ('00 , 'SPACE').
         ADRI        1,X             < PASSAGE AU CARACTERE SUIVANT.
         JMP         E50             < VERS L'INTERPRETATION DU
                                     < CARACTERE SUIVANT.
<
< CAS D'UN CHANGEMENT DE GRAMMAIRE :
<
E302:    EQU         $
         STA         &ACHSGR
         LAI         '50             < CODE DU 'LA' BASE PAR 'C'.
         STBY        &ACHSGR         < GENERATION D'UN 'LA' D'ACCES
                                     < A L'ADRESSE DE LA NOUVELLE
                                     < GRAMMAIRE.
CHSGR:   LA          AG0             < 'LA' DYNAMIQUE DE RECUPERATION
                                     < DE L'ADRESSE D'1NE GRAMMAIRE ;
                                     < INITIALISE AVEC 'AG0'.
         LR          A,L             < L=@DE LA NOUVELLE GRAMMAIRE.
         JMP         E151            < VERS L'ACCES AU CARACTERE
                                     < SUIVANT.
<
<        F I N   D ' I N T E R P R E T A T I O N  :
<
FININT:  EQU         $
         ADRI        -2,K            < AFIN D'ANNULER LES EFFETS DU
                                     < 'BSR AFIN' ET DU 'PSR X' DE
                                     < SAUVEGARDE DE L'INDEX DU TEXTE ,
                                     < LES INVERSES (RSR ET PLR) NE
                                     < SERONT PAS EXECUTES ....
         PLR         B,L,W           < RESTAURE ALIST , L & W.
         STB         ALIST
         PLR         A,B,X,Y         < RESTAURATION DES REGISTRES
                                     < DE L'APPELANT.
         RSR                         < RETOUR A L'APPELANT.
<
<
<        T E S T   D U   M O D E   E T   R E T O U R   A   L A
<        G R A M M A I R E   I N I T I A L E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE PERMET EN MODE INTERPRETATIF
<                    DE RESTAURER LA GRAMMAIRE INITIALE
<                    DANS LA BASE L.
<
<
TINT:    EQU         $
         CPZ         ALIST           < TEST DU MODE INTERPRETATIF ???
         JE          E320            < RIEN A FAIRE , ON EST EN MODE
                                     < NON INTERPRETATIF.
<
< CAS DU MODE INTERPRETATIF :
<
         LR          A,L             < SAVE A DANS L.
         LA          AG0             < A=@GRAMMAIRE INITIALE.
         XR          A,L             < RESTAURE A & L.
E320:    EQU         $
         RSR
<
<        C A S   D E S   E R R E U R S  :
<
E51:     EQU         $
         BSR         AERR            < AFIN D'AVOIR DANS LA PILE K
                                     < L'ADRESSE D'ERREUR.
ERREUR:  EQU         $
         ACTD                        < ON FAIT TRAPPER LE PROGRAMME.
         JMP         ERREUR          < BOUCLAGE.
         PAGE
<
<
<        I N T E R P R E T A T I O N   D E
<        L A   R E C U R S I V I T E  :
<
<
<        FONCTION :
<                      CES 2 ROUTINES PERMETTENT UNE
<                    STRUCTURE RECURSIVE DES TEXTES
<                    A INTERPRETER.
<
<
<        B E G I N   R E C U R S I V I T E  :
<
<
PG:      EQU         $               < '('.
         BSR         ABR             < APPEL DU 'BEGIN RECURSIVITE'.
<
< ENTRY POUR END RECURSIVITE JDX AVEC (X)#0 :
<
         STX         SAVEX           < SAVE LE REGISTRE X ...
         LX          -2,W            < RESTAURE L'INDEX DE L'INTER-
                                     < PRETEUR (POINTANT SUR '(').
         JMP         E151            < VERS L'INTERPRETATION DU
                                     < CARACTERE SUIVANT '('.
<
<
<        E N D   R E C U R S I V I T E   J D X  :
<
<
PD:      EQU         $               < APRES SODOME , ON AURA TOUT VU....
         PLR         X,W             < X=INDEX DE L'INTERPRETEUR ,
                                     < POINTANT SUR ')' ; DE PLUS
                                     < ON ECRASE W POUR ANNULER
                                     < LES EFFETS DU 'BSR APD'.
         PSR         A,X             < AINSI , ON RE-SAUVEGARDE L'
                                     < INDEX DE L'2NTERPRETEUR
                                     < DECALE D'UN MOT DANS LA PILE.
         ADRI        -2,K            < CETTE SAUVEGARDE N'EST QUE
                                     < TEMPORAIRE , ET NON MEMORISEE
                                     < DANS LE REGISTRE K.
                                     < (K POINTE LE CONTEXTE DE
                                     < RECURSIVITE (X)).
         BSR         AERD            < APPEL DE LA FIN DE RECURSIVITE
                                     < DE TYPE JDX.
<
< CAS OU LE CONTEXTE DE RECURSIVITE (X) PASSE PAR 0 :
<
         STX         SAVEX
         LX          4,W             < X=INDEX DE L'INTERPRETEUR ,
                                     < POINTANT SUR ')'.
         ADRI        -2,K            < ON RETABLIT LA PILE K.
         JMP         E151            < VERS L'ACCES AU CARACTERE
                                     < SUIVANT ')'.
         PAGE
<
<
<        A P P E L   I N T E R P R E T A T I F   D E
<                    S O U S - D E S S I N  :
<
<
<        FONCTION :
<                      CETTE ROUTINE PERMET A PARTIR
<                    D'UN TEXTE INTERPRETATIF D'EN
<                    APPELER UN AUTRE , OU BIEN UN SOUS-
<                    DESSIN EN LANGAGE MACHINE.
<                      L'ADRESSE DU SOUS-DESSIN (TEXTE/
<                    ROUTINE) EST SITUEE DANS LE MOT
<                    SUIVANT IMMEDIATEMENT LE CARACTERE
<                    D'APPEL '&' . SI LE BIT0 DE
<                    L'ADRESSE EST A 0 , IL S'AGIT D'1NE
<                    ROUTINE , SINON , IL S'AGIT D'UN
<                    TEXTE.
<
<
<                    BIT0(ADRESSE)=0 : APPEL ROUTINE ,
<                    BIT0(ADRESSE)=1 : APPEL TEXTE.
<                    FIN D'UN SOUS-TEXTE : '$' ,
<                    FIN D'UNE SOUS-ROUTINE : 'RSR'.
<
<
SDES:    EQU         $
         LR          K,W             < W POINTE L'ADRESSE DE RETOUR.
         LA          -1,W            < ACCES A L'INDEX CARACTERE
                                     < DE L'INTERPRETEUR.
         ADRI        2,A             < POUR ATTEINDRE LE MOT SUIVANT
                                     < LE CARACTERE COURANT.
         SLRS        1               < CONVERSION EN UN INDEX MOT.
         LR          A,X             < X=INDEX DE L'ADRESSE DU
                                     < SOUS-DESSIN (TEXTE/ROUTINE).
         LA          &ALIST          < A=@DU SOUS-DESSIN.
         JAGE        E410            < CAS DE L'APPEL D'UNE ROUTINE.
<
< CAS DE L'APPEL D'UN TEXTE :
<
         BSR         AINTA           < ENTREE RECURSIVE DANS L'INTER-
                                     < PRETEUR AVEC A COMME ARGUMENT.
<
< RETOUR DES SOUS-DESSINS :
<        '$' POUR LES TEXTES ,
<        'RSR' POUR LES ROUTINES.
<
E411:    EQU         $
         ADR         X,X             < L'INDEX MOT EST CONVERTI
                                     < EN UN INDEX OCTET.
         ADRI        1,X             < ET PASSAGE SUR L'OCTET1 DE
                                     < L'ADRESSE.
         ADRI        -2,K            < AFIN DE SUPPRIMER LES EFFETS
                                     < DU 'BSR ASDES' ET DU 'PSR X' ,
                                     < QUI SONT SAUTES.
         JMP         E151            < VERS L'INTERPRETATION DU
                                     < CARACTERE SUIVANT.
<
< CAS DE L'APPEL DE ROUTINES :
<
E410:    EQU         $
         LA          ALIST
         PSR         A,X,L           < SAVE ALIST , X & L.
         STZ         ALIST           < RETOUR AU MODE NON INTERPRETATIF.
         BSR         &1,W            < APPEL DE LA ROUTINE A L'AIDE
                                     < DE L'ANCIEN ALIST QUI EST
                                     < PRESENTEMENT DANS LA PILE K.
         PLR         A,X,L           < RESTAURATION ALIST , X & L.
         STA         ALIST
         JMP         E411            < VERS LE RETOUR DES SOUS-DESSINS.
         PAGE
<
<
<        I N T E R P R E T A T I O N   D E S
<        T R A N S F O R M A T I O N S  :
<
<
<        FONCTION :
<                      CES PRIMITIVES PERMETTENT DE
<                    MEMORISER DANS 'SAVEA' LE NOM DE
<                    LA TRANSFORMATION DEMANDEE.
<
<
<        ARGYMENT :
<                    Y=1 CARACTERE ASCI (DE "1" A "6").
<
<
<        RESULTAT :
<                    A=NOM DE LA TRANSFORMATION DEMANDEE.
<
<
TRPM:    EQU         $               < ENTRY ROTATIONS.
         LAI         TRPOX-"1"       < ACCES A LA 1ERE ROTATION.
         JMP         E310
TQ13:    EQU         $               < ENTRY QUADRATURES.
         LAI         TR1OX-"1"       < ACCES A LA 1ERE QUADRATURE.
         JMP         E310
TUS:     EQU         $               < ENTRY TRANSFORMATION USER.
         LAI         TUS1-"1"        < ACCES A LA 1ERE TRANSFO. USERR.
         JMP         E310
TSP:     EQU         $               < ENTRY SYMETRIES.
         LAI         TSPOX-"1"       < ACCES A LA 1ERE SYMETRIE.
         JMP         E310
TECH:    EQU         $               < ENTRY SUBSTITUTIONS.
         LAI         TEXY-"1"        < ACCES A LA 1ERE SUBSTITUTION.
<
< MEMORISATION DU NOM DE LA TRANSFORMATION DEMANDEE :
<
E310:    EQU         $
         ADR         Y,A             < ON AJOUTE LE CARACTERE ASCI
                                     < (DE "1" A "6") A (A).
<
< RETOUR A LA GRAMMAIRE INITIALE :
<
         BSR         ATINT           < RETOUR A LA GRAMMAIRE INITIALE?
         RSR                         < ET C'EST TOUT ....
         PAGE
<
<
<        I N T E R P R E T A T I O N   D E S   R E G I S T R E S  :
<
<
<        FONCTION :
<                      CES ROUTINES PERMETTENT D'INITIALISER
<                    L'UN DES REGISTRES A,B,X UTILISE
<                    PAR LES PRIMITIVES.
<
<
<        C O N S T A N T E   H E X A D E C I M A L E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE RECUPERE UNE CONSTANTE
<                    HEXADECIMALE DANS LA LISTE INTER-
<                    PRETATIVE ; ELLE EST LIMITEE A
<                    GAUCHE PAR LE SIGNE 'EGAL' ('=') ,
<                    ET A DROITE PAR LE 1ER CARACTERE NON
<                    RECONNU.
<
<
<        RESULTAT :
<                    DUMY2=VALEUR DE LA CONSTANTE ,
<                    MAJ DE L'INDEX CARACTERE DE L'INTERPRETEUR.
<
<
EGAL:    EQU         $
         LR          K,W             < AFIN DE BASER LA PILE DE
                                     < L'2NTERPRETEUR.
         PSR         A,B,X
         LX          -1,W            < X=INDEX CARACTERE COURANT DE
                                     < L'INTERPRETEUR.
         LBI         0               < NETTOYAGE DU REGISTRE DE CUMUL.
<
< BOUCLE DE RECUPERATION :
<
E400:    EQU         $
         ADRI        1,X             < PROGRESSION INDEX CARACTERE.
         LBY         &ALIST          < RECUPERATION 1 CARACTERE
                                     < DE LA LISTE INTERPRETATIVE.
         ADRI        -'30,A          < DECONVERSION ASCI.
         JAL         E401            < ARRET DE LA RECUPERATION.
         CPI         9               < EST-CE UN CHIFFRE DEVIMAL ???
         JLE         E402            < OUI.
         ADRI        -'41+'39+1,A    < TRANSLATION VERS LES LETTRES.
         CPI         'A
         JL          E401            < ARRET SUR LE 1ER CARACTERE
                                     < NON RECONNU.
         CPI         'F
         JG          E401            < ARRET DE LA RECHERCHE.
<
< CUMUL DE LA CONSTANTE :
<
E402:    EQU         $
         SCRS        4               < CADRAGE GAUCHE DANS A.
         SCLD        4               < CUMUL DANS B.
         JMP         E400            < AU CARACTERE SUIVANT.
<
< ARRET DE LA RECHERCHE SUR LE 1ERE CARACTERE NON RECONNU :
<
E401:    EQU         $
         STB         DUMY2           < SAVE TEMPORAIRE DANS DUMY2.
         ADRI        -1,X            < RETOUR ARRIERE (CF. L'INTERTEUR).
         STX         -1,W            < MISE A JOUR DE L'INDEX CARACTERE
                                     < COURANT DE L'INTERPRETEUR.
         PLR         A,B,X           < RESTAURE.
         RSR                         < ET RETOUR ....
<
<
<        I N I T I A L I S A T I O N   D E S   R E G I S T R E S  :
<
<
<        FONCTION :
<                      CES ROUTINES PERMETTENT D'INTIALISER
<                    SAVEA/SAVEB/SAVEX PAR L'INTERMEDIAIRE
<                    DE L'INTERPRETEUR.
<
<
<        ARGUMENT :
<                    DUMY2=VALEUR A DONNER A A/B/X.
<
<
RA:      EQU         $
         LA          DUMY2           < INITIALISATION DE A.
         JMP         E403
RB:      EQU         $
         LB          DUMY2           < INITIALISATION DE B.
         JMP         E403
RX:      EQU         $
         LX          DUMY2           < INITIALISATION DE X.
E403:    EQU         $
         BSR         ATINT           < RESTAURATION DE LA GRAMMAIRE
                                     < INITIALE ???
         RSR
         PAGE
<
<
<        G E S T I O N   T R A N S L A T A B L E
<        D E   L A   R E C U R S I V I T E  :
<
<
<        FONCTION :
<                      CES ROUTINES PERMETTENT DE DEFINIR
<                    DYNAMIQUEMENT DES BLOCS DE RECURSIVITE :
<                    1- BOREC : DEFINIT UN 'BEGIN' BLOC ,
<                    2- EOREC : DEFINIT UNE FIN DE BLOC AVEC RETOUR
<                      INCONDITIONNEL AU 'BEGIN' DE CE BLOC.
<                    3- EORECI : DEFINIT UNE FIN DE BLOC DE
<                      TYPE 'JIX' ,
<                    4- EORECD : DEFINIT UNE FIN DE BLOC DE
<                      TYPE 'JDX' .  ,
<                    5- ENFIN L'INSTRUCTION 'RSR' PERMET DE
<                      DEFINIR UNE FIN DE BLOC DE TYPE 'PROCEDURE' ,
<                      APPELEE PAR UN 'BSR' (CF. CALL).
<
<
<        NOTA :
<                      LE REGISTRE X FAIT PARTIE DU
<                    CONTEXTE DE RECURSIVITE , ET
<                    EST DONC EMPILER/DEPILER LORS
<                    DES BEGIN/END.
<
<
<        E N D   R E C U R S I V I T E   I N C O N D I T I O N N E L L E
<
<
EOREC:   EQU         $
         PLR         X,W             < RESTAURE LE CONTEXTE X ,
                                     < ET DE PLUS FAIT K<--(K)-1 ,
                                     < EN ECRASANT LE REGISTRE W.
                                     < (ON ANNULE DONC LE 'BSR EOREC')
                                     < S'IL N'Y A PAS EU D'ERREURS
                                     < D'UTILISATION , W POINTE SUR
                                     < L'ADRESSE DE L'ADRESSE DE
                                     < RETOUR DU 'BSR BOREC' ASSOCIE.
<
<
<        B E G I N   R E C U R S I V I T E  :
<
<
BOREC:   EQU         $
         LR          K,W             < ON MET DANS W L'ADRESSE DE
                                     < L'ADRESSE DE RETOUR SITUEE DANS
                                     < LA PILE K , APRES LE 'BSR
                                     < ABOREC'.
         PSR         X               < SAVE LE CONTEXTE X.
         BR          0,W             < PERMET DE FAIRE UN RETOUR A
                                     < LA SUITE DU 'BSR ABOREC' SANS
                                     < DEPILER (D'OU LA RECURSIVITE).
<
<
<        E N D   R E C U R S I V I T E   ' J I X '  :
<
<
EORECI:  EQU         $
         PLR         X,W             < RESTAURE LE CONTEXTE X , ET
                                     < ANNULE LES EFFETS DU 'BSR
                                     < AEORECI' EN ECRASANT W.
         JIX         BOREC           < DANS LE CAS OU (X)#0 , ON FAIT
                                     < UN FIN DE RECURSIVITE INCON-
                                     < DITIONNELLE.
<
< CAS OU X=0 (JDX & JIX) :
<
E141:    EQU         $
         ADRI        -1,K            < ON SUPPRIME LE 'BSR ABOREC'.
         LR          K,W             < (W)+3 POINTE DONC SUR L'ADRESSE
                                     < DE L'ADRESSE DE RETOUR DU
                                     < 'BSR AORECI/D'.
         BR          3,W             < RETOUR DU 'BSR AORECI/D'.
<
<
<        E N D   R E C U R S I V I T E   J D X  :
<
<
EORECD:  EQU         $
         PLR         X,W             < RESTAURE LE CONTEXTE X , ET
                                     < ANNULE LES EFFETS DU 'BSR
                                     < AORECD' EN ECRASANT W.
         JDX         BOREC           < DANS LE CAS OU (X)#0 : ON FAIT
                                     < UN RETOUR INCONDITIONNEL.
         JMP         E141            < CAS OU X=0 : RETOUR DU
                                     < 'BSR AEORECD'
<
<
<        A P P E L   T R A N S L A T A B L E   D E   R O U T I N E S  :
<
<
<        FONCTION :
<                      CETTE PRIMITIVE PERMET D'APPELER UNE
<                    ROUTINE (SOUS-GRAPHE,...) SANS QUE
<                    L'ADRESSE DE CELLE-CI SOIT DANS UNE ZONE
<                    BASEE.
<
<
<        ARGUMENT :
<                    MOT(K) : @DE LA ROUTINE (DANS LE MOT SUIVANT
<                             LE BSR).
<
<
CALL:    EQU         $
         LR          K,W             < W POINTE L'ADRESSE DU MOT
                                     < SUIVANT LE 'BSR ACALL'.
         IC          0,W             < CALCUL DE L'ADRESSE DE RETOUR
                                     < REELLE DU 'BSR ACALL'.
         PLR         W               < W CONTIENT MAINTENANT L'ADRESSE
                                     < DE RETOUR , SOIT L'ADRESSE+1
                                     < DE L'ADRESSE DE LA ROUTINE
                                     < A APPELER.
         ADRI        1,K             < ANNULATION DU 'PLR W' , POUR
                                     < FAIRE UN 'RSR' CORRECT DANS
                                     < LA ROUTINE APPELEE.
         BR          -1,W            < ENTREE DANS LA ROUTINE SANS BSR.
<
<
<        G O T O   T R A N S L A T A B L E S  :
<
<
<        FONCTION :
<                      CES ROUTINES PERMETTENT DE FAIRE
<                    DES BRANCHEMENTS CONDITIONNELS/
<                    INCONDITIONNELS SANS BASE ET SANS
<                    DEPLACEMENT.
<
<
<        ARGUMENTS :
<                    C & V POUR LES BRANCHEMENTS CONDITIONNELS ,
<                    MOT(K) : @ DE BRANCHEMENT SI CONDITION VERIFIEE.
<
<
GO:      EQU         $               < GOTO INCONDITIONNEL.
         PSR         A
         LAI         '00
         JMP         E170            < VERS LE TEST.
GOGE:    EQU         $               < GOTO SI 'GE'.
         PSR         A
         LAI         '01
         JMP         E170            < VERS LE TEST.
GONE:    EQU         $               < GOTO SI 'NE'.
         PSR         A
         LAI         '02
         JMP         E170            < VERS LE TEST.
GOGT:    EQU         $               < GOTO SI 'GT'.
         PSR         A
         LAI         '03
         JMP         E170            < VERS LE TEST.
GOLT:    EQU         $               < GOTO SI 'LT'.
         PSR         A
         LAI         '05
         JMP         E170            < VERS LE TEST.
GOEQ:    EQU         $               < GOTO SI 'EQ'.
         PSR         A
         LAI         '06
         JMP         E170            < VERS LE TEST.
GOLE:    EQU         $               < GOTO SI 'LE'.
         PSR         A
         LAI         '07
<
< MISE EN PLACE DE L'INSTRUCTION DYNAMIQUE DE TEST :
<
E170:    EQU         $
         STBY        &ATEST          < MISE EN PLACE DU CODE OPERATION
                                     < DE L'INSTRUCTION DE TEST ('TEST')
         PLR         A
<
<        A T T E N T I O N  :
<                      IL NE FAUT PAS UTILISER D'INSTRUCTIONS
<                    MODIFIANT LES INDICATEURS C & V PUISQU'ON
<                    DOIT LES TTESTER EN 'TEST'.
<
         LR          K,W             < W POINTE L'ADRESSE DU MOT
                                     < SUIVANT LE 'BSR' D'APPEL.
TEST:    JMP         E171            < INSTRUCTION DYNAMIQUE DE
                                     < BRANCHEMENT SI 'CONDITION
                                     < VERIFIEE'.
<
< CAS D'UNE CONDITION NON VERIFIEE :
<
         IC          0,W             < CALCUL DE L'ADRESSE DE RETOUR
                                     < REELLE DU BSR.
         RSR                         < RETOUR EN SEQUENCE POUR
                                     < 'CONDITION NON VERIFIEE'.
<
< CAS D'1NE CONDITION VERIFIEE :
<
E171:    EQU         $
         PLR         W               < W=@+1 DU MOT SUIVANT LE 'BSR' ;
                                     < DE PLUS AINSI ON RETABLIT LA
                                     < PILE K , CAR ON VA SORTIR DE
                                     < LA ROUTINE SANS 'RSR'.
         BR          0,W             < SORTIE EN RUPTURE DE SEQUENCE
                                     < POUR 'CONDITION VERIFIEE'.
         PAGE
<
<
<        P R I M I T I V E   R E T O U R   A   S O D O M E  :
<
<
<        FONCTION :
<                      CETTE PRIMITIVE PERMET DE FAIRE
<                    UN RETOUR VERS LA BRANCHE APPELANTE
<                    (GE/EI) DE SODOME.
<
<
GOBGE:   EQU         $
         PSR         A,X
         LAD         CG              < RETOUR AU MODE ALPHA-NUMERIQUE.
         SVC         0               < (C'EST MIEUX POUR SODOME....)
         LB          APILEG          < RECUPERATION DE LA PILE DE 'GE'.
         XR          B,K             < SAVE LE K DE TRAVAIL , ET
                                     < REINITIALISE K AVEC
                                     < LA PILE DE 'GE'.
         LY          DEMMEM+2        < SAVE LA LONGUEUR DE 6K MOTS.
         LAI         0
         SBT         2
         STA         DEMMEM+2        < LA DEMANDE D'ALLOCATION MEMOIRE
                                     < EST MISE SUR 4K MOTS.
         LAD         DEMMEM
         SVC         0               < RETOUR A 4K MOTS.
         LAI         BRANCH-ZERO
         LR          A,W             < W=@BRANCH.
         STZ         MODCAL,W        < REINITIALISATION DU MODE
                                     < D'APPEL AU CAS OU LE RETOUR
                                     < AURAIT LIEU VERS 'GE'.
<
< PREPARATION DE DEMSGN :
<
         LAI         6
         STBY        DEMSGN          < MISE EN PLACE DU NVP DE LOAD
                                     < SOUS :SYS.
         LAI         BRANCH-ZERO*2
         STA         DEMSGN+1        < MISE EN PLACE DE L'ADRESSE
                                     < OCTETS DE LA BRANCHE.
         LA          LOVL
         STA         DEMSGN+2        < MISE EN PLACE DE LA LONGUEUR
                                     < OCTETS DES BRANCHES OVERLAY.
         LAD         DEMSGN          < A=@DEMSGN ; W=@BRANCH.
         BSR         AOVL            < TENTATIVE DE CHARGEMENT.
<
< ERREUR DE CHARGEMENT :
<
         STY         DEMMEM+2        < RESTAURE 6K MOTS.
         LAD         DEMMEM
         SVC         0               < ON REDEMANDE LES 6K MOTS.
         LR          B,K             < ET ON REPASSE SUR LA PILE
                                     < DE TRAVAIL.
         JMP         E191            < CAS DES RETOURS EN ERREUR (POUR
                                     < CHARGEMENT IMPOSSIBLE) , ON PASSE
                                     < LA MAIN AU CCI.
<
<
<        P R I M I T I V E   :   R E T O U R   A U   C C I  :
<
<
GOCCI:   EQU         $
         PSR         A,X             < AU CAS OU ON FERAIT !GO.
E191:    EQU         $               < CAS DES RETOURS EN ERREUR
                                     < DES CHARGEMENTS D'OVERALY.
         LAD         CCI
E180:    EQU         $               < ENTRY 'ERASE'.
         SVC         0
         PLR         A,X
         RSR                         < DIFFICILE , N'EST-IL PAS ....
         PAGE
<
<
<        P R I M I T I V E   E R
<        D ' E F F A C E M E N T   E C R A N  :
<
<
ERASE:   EQU         $
         PSR         A,X             < QUELLE PRUDENCE !!!
         LAD         DERASE
         JMP         E180            < VERS L'EXECUTION DE L'ERASE.
         PAGE
         PROG        PROG6
<
<
<        C U R S E U R   V I R T U E L   C O U R A N T  :
<
<
<        FONCTION :
<                      CES QUELQUES ROUTINES PERMETTENT
<                    DE DEPLACER EN ABSOLU LE CURSEUR
<                    VIRTUEL COURANT , DE LE METTRE A
<                    L'ORIGINE , ET ENFIN DE CHANGER DE
<                    CHANGER DE CURSEUR VIRTUEL COURANT.
<
<
<        M I S E   A   L ' O R I G I N E   C V  :
<
<
CVO:     EQU         $
         STZ         XG
         STZ         YG
         STZ         ZG
<
< ENTRY POUR POSITIONNEMENT ABSOLU DU CV :
<
E90:     EQU         $
         STZ         XL
         STZ         YL
         STZ         ZL
         BSR         ATINT           < RETOUR A LA GRAMMAIRE INITIALE ??
         RSR
<
<
<        P O S I T I O N N E M E N T   A B S O L U   C V  :
<
<
<        ARGUMENT :
<        1- MCV :
<                    (K)=@LISTE COORDONNEES (X,Y,Z) A DONNER
<                        AU CV COURANT ,
<        2- MCVA :
<                    A=@ D'1NE LISTE DE COORDONNEES (X,Y,Z)
<                      A DONNER AU CV COURANT.
<
<
<        NOTA :
<                      LES COORDONNEES LOCALES SONT RAZEES !!!!
<
<
MCV:     EQU         $
         LR          K,W             < W POINTE L'ADRESSE DE L'
                                     < ADRESSE DE LA LISTE DE COORDONNEE
                                     < A DONNER AU CV COURANT.
         IC          0,W             < CALCUL DE L'ADRESSE REELLE
                                     < DE RETOUR.
         PLR         W               < W=@+1 DE LA LISTE DES COOR-
                                     < DONNEES (X,Y,Z).
         ADRI        1,K             < RATTRAPAGE DU PLR.
         PSR         A,B,X
         LA          -1,W            < A=@LISTE (X,Y,Z).
         JMP         E170A           < VERS LE POSITIONNEMENT.
MCVA:    EQU         $
         PSR         A,B,X
E170A:   EQU         $               < ENTRY 'MCV'.
         ADRI        -1,A            < POUR PERMETTRE UNE INDEXATION
                                     < PAR RAPPORT A 1.
         SBT         0               < POSITIONNEMENT DU BIT INDEX.
         STA         DUMY1           < GENERATION DU RELAI D'ACCES
                                     < A LA LISTE DES COORDONNEES.
         LAD         ZG
         LR          A,W             < W=@DE LA DERNIERE COORDONNEE
                                     < GLOBALE DU CV COURANT.
         LXI         DIM             < NBRE DE COORDONNEES GLOBALES
                                     < DU CV.
<
< BOUCLE DE DEPLACEMENT GLOBAL DU CV :
<
E91:     EQU         $
         LA          &DUMY1          < RECUPERATION DES NOUVELLES
                                     < COORDONNEES DANS L'ORDRE Z,Y,X.
         MP          SCALE           < PRISE EN COMPTE DU FACTEUR
                                     < D'ECHELLE.
         JAG         E92             < ERREUR : OVERFLOW.
         STB         0,W             < OK , SAVE NOUVELLE COORDONNEE.
                                     < (GLOBALE!!!).
         ADRI        -1,W            < PASSAGE A LA COORDONNEE
                                     < GLOBALE PRECEDENTE DU CV COURANT.
         JDX         E91             < SUIVANT.
         PLR         A,B,X
         JMP         E90             < VERS LA MISE A L'ORIGINE DES
                                     < COORDONNEES LOCALES DU CV
                                     < COURANT.
<
< TRAITEMENT DES ERREURS :
<
E92:     EQU         $
         BSR         AERR            < POUR CONNAITRE L'ADRESSE
                                     < D'ERREUR.
<
<
<        C H A N G E M E N T   D E   C V   C O U R A N T  :
<
<
<        FONCTION :
<                      ON PEUT A L'AIDE DE CETTE ROUTINE
<                    CHANGER DE CV COURANT , AVEC OU
<                    SANS SAUVEGARDE , ET AVEC OU SANS
<                    REINITIALISATION.
<
<
<        ARGUMENT :
<                    A=NUMERO DU NOUVEAU CV (COMPRIS ENTRE 0 ET NCV-1) ,
<                    B=FONCTION DEMANDEE :
<                      BIT15(B)=1 : SAUVEGARDE DU CV COURANT
<                                   DANS SA ZONE ,
<                      BIT14(B)=1 : INITIALISATION DE CV , AVEC LE
<                                   CV DONT LE NUMERO EST DANS A.
<
<
CHCV:    EQU         $
         PSR         A,B,X,Y
         LXI         0               < MEMORISATION CHANGEMENT
                                     < CURSEUR VIRTUEL COURANT.
         JMP         CHGCON          < VERS LE CHANGEMENT DE CONTEXTE.
<
<
<        C H A N G E M E N T   E C H E L L E   C O U R A N T E  :
<
<
<        FONCTION & ARGUMENT IDENTIQUES A CV , MAIS
<        APPLIQUES A L'ECHELLE COURANTE.
<
<
CHSCA:   EQU         $
         PSR         A,B,X,Y
         LXI         1               < MEMORISATION CHANGEMENT
                                     < ECHELLE COURANTE.
         JMP         CHGCON          < VERS LE CHANGEMENT DE CONTEXTE.
<
<
<        C H A N G E M E N T   D E   T R A N S F O R M A T I O N
<                    C O U R A N T E  :
<
<
<        FONCTION & ARGUMENTS IDENTIQUES A CV ,
<        MAIS APPLIQUES A TC.
<
<
CHTC:    EQU         $
         PSR         A,B,X,Y
         LXI         2               < MEMORISATION CHANGEMENT DE TC.
         JMP         CHGCON          < VERS LE CHANGEMENT DE CONTEXTE.
<
<
<        C H A N G E M E N T   D E   C O N T E X T E
<                    C O U R A N T  :
<
<
<        FONCTION :
<                      ON DISTINGUE DANS LE SYSTEME 3 CONTEXTES
<                    DIFFERENTS :
<                    - LE CURSEUR VIRTUEL ,
<                    - LA TRANSFORMATION COURANTE ,
<                    - L'ECHELLE COURANTE ;
<                      CHAQUN D'EUX EST DECRIT PAR UN
<                    DESCRIPTEUR DE CONTEXTE , DONT LE FORMAT
<                    EST LE SUIVANT :
NUM:     VAL         0               < MOT0 : NUMERO CONTEXTE COURANT.
AL:      VAL         1               < MOT1 : @LISTE DE LA ZONE DE
                                     <         SAVE DES CONTEXTES.
CT:      VAL         2               < MOT2 : CONSTANTE DE TRANSLATION.
AN:      VAL         3               < MOT3 : NBRE MAX DE CONTEXTES.
ACON:    VAL         4               < MOT4 : @CONTEXTE COURANT (TC,....)
KCON:    VAL         5               < MOT5 : POINTEUR DE PILE , LORS-
                                     <        -QUE LES CONTEXTES SONT
                                     <        UTILISES EN PUSH/PULL.
<
<
<        ARGUMENT :
<                    CF. LA ROUTINE 'CHCV' , AVEC DE PLUS :
<                    X=NUMERO DU DESCRIPTEUR UTILISE :
<                     =0 : CV ,
<                     =1 : ECHELLE ,
<                     =2 : TRANSFORMATION (TC).
<
<
<        NOTA :
<                    W=@DESCRIPTEUR DE CONTEXTE.
<
<
CHGCON:  EQU         $
         LX          &LCON
         LR          X,W             < W=@DESCRIPTEUR DE CONTEXTE.
E112:    EQU         $               < ENTRY MODE PUSH/PULL.
         JAL         E92             < ERREUR DE NUMERO DE CONTEXTE.
         CP          AN,W            < VALIDATION.
         JGE         E92             < ERREUR DE NUMERO DE CONTEXTE.
         LR          B,Y             < Y=FONCTION DEMANDEE.
         MP          CT,W            < CALCUL DU NUMERO DE CONTEXTE
                                     < DEMANDE AFIN D'Y ACCEDER
                                     < DANS LA LISTE DE SAVE.
         STB         DUMY1           < SAVE LE DEPLACEMENT VERS LE
                                     < CONTEXTE DEMANDE DANS DUMY1.
<
< VALIDATION DE LA FONCTION :
<
         LR          Y,A             < A=FONCTION DEMANDEE.
         JAL         E92             < ERREUR DE FONCTION.
         CPI         3               < (BIT14 & BIT15).
         JG          E92             < ERREUR DE FONCTION.
<
< SAUVEGARDE EVENTUELLE DU CONTEXTE COURANT :
<
         TBT         15              < SAVE CONTEXTE EST-IL DEMANDE ???
         JNC         E102            < NON ...
         LA          AL,W
         AD          NUM,W
         LR          A,B             < B=RECEPTEUR=@ZONE CONTENANT
                                     < LE CONTEXTE COURANT.
         LA          ACON,W          < A=@EMETTEUR=@CONTEXTE COURANT.
         LX          CT,W            < NBRE DE MOTS A DEPLACER.
         MOVE                        < SAVE LE CONTEXTE COURANT.
<
< INITIALISATION EVENTUELLE DU CONTEXTE :
<
E102:    EQU         $
         LR          Y,B             < B=FONCTION DEMANDEE.
         TBT         14+16           < INITIALISATION CONTEXTE DEMANDEE?
         LB          ACON,W          < B=RECEPTEUR=@CONTEXTE.
         LA          DUMY1
         STA         NUM,W           < MEMORISATION DU NUMERO DU
                                     < NOUVEAU CONTEXTE COURANT.
         JNC         E101            < NON PAS D'INITIALISATION ...
         AD          AL,W            < A=@EMETTEUR=@ZONE DE SAVE
                                     < DU CONTEXTE DEMANDE.
         LX          CT,W            < NBRE DE MOTS A DEPLACER.
         MOVE                        < INITIALISATION CONTEXTE COURANT.
<
< SORTIE DE LA ROUTINE :
<
E101:    EQU         $
         BSR         ATINT           < RETOUR A LA GRAMMAIRE INITIALE?
         PLR         A,B,X,Y
         RSR
<
<
<        C H A N G E M E N T S   D E   C O N T E X T E S
<                    E N   M O D E   P U S H / P U L L  :
<
<
<        FONCTION :
<                      CES PRIMITIVES PERMETTENT D'UTILISER
<                    LES ZONES DE SAUVEGARDE DE CONTEXTE EN
<                    MODE PUSH/PULL , LE NUMERO DU
<                    CONTEXTE 'DEMANDE' ETANT GERE COMME
<                    UN POINTEUR DE PILE (KCON).
<
<
<        NOTA :
<                    PAS D'ARGUMENTS.
<
<
<        P U S H   C V  :
<
<
PSCV:    EQU         $
         PSR         A,B,X,Y
         LXI         0               < MEMORISATION 'CV'.
         LBI         1               < BIT15(B)=1 : SAVE CONTEXTE.
         JMP         E110            < VERS LE TRAITEMENT DES PUSH.
<
<
<        P U L L   C V  :
<
<
PLCV:    EQU         $
         PSR         A,B,X,Y
         LXI         0               < MEMORISATION 'CV'.
         LBI         2               < BIT14(B)=1 : INIT. CONTEXTE.
         JMP         E111            < VERS LE TRAITEMENT DES PULL.
<
<
<        P U S H   E C H E L L E  :
<
<
PSSCA:   EQU         $
         PSR         A,B,X,Y
         LXI         1               < MEMORISATION 'SCALE'.
         LBI         1               < BIT15(B)=1 : SAVE CONTEXTE.
         JMP         E110            < VERS LE TRAITEMENT DES PUSH.
<
<
<        P U L L   E C H E L L E  :
<
<
PLSCA:   EQU         $
         PSR         A,B,X,Y
         LXI         1               < MEMORISATION 'SCALE'.
         LBI         2               < BIT14(B)=1 : INIT. CONTEXTE.
         JMP         E111            < VERS LE TRAITEMENT DES PULL.
<
<
<        P U S H   T R A N S F O R M A T I O N  :
<
<
PSTC:    EQU         $
         PSR         A,B,X,Y
         LXI         2               < MEMORISATION 'TC'.
         LBI         1               < BIT15(B)=1 : SAVE CONTEXTE.
         JMP         E110            < VERS LE TRAITEMENT DES PUSH.
<
<
<        P U L L   T R A N S F O R M A T I O N  :
<
<
PLTC:    EQU         $
         PSR         A,B,X,Y
         LXI         2               < MEMORISATION 'TC'.
         LBI         2               < BIT14(B)=1 : INIT. CONTEXTE.
         JMP         E111            < VERS LE TRAITEMENT DES PULL.
<
<
<        P U S H   C O N T E X T E  :
<
<
<        ARGUMENT :
<                    X=NUMERO DU DESCRIPTEUR DE CONTEXTE ,
<                    B=1.
<
<
E110:    EQU         $
         LX          &LCON
         LR          X,W             < W=@CONTEXTE DONT ON FAIT LE PUSH.
         LA          KCON,W          < A=POINTEUR DE PILE DU CONTEXTE.
         IC          KCON,W          < PROGRESSION POINTEUR DE PILE
                                     < DU CONTEXTE SANS VERIFICATION.
         JMP         E112            < VERS LE CHANGEMENT DE CONTEXTE.
<
<
<        P U L L   C O N T E X T E  :
<
<
<        ARGUMENT :
<                    X=NUMERO DU DESCRIPTEUR DONT ON ON FAIT LE PULL ,
<                    B=2.
<
<
E111:    EQU         $
         LX          &LCON
         LR          X,W             < W=@DESCRIPTEUR DU CONTEXTE
                                     < DONT ON FAIT LE PULL.
         DC          KCON,W          < DECREMENTATION DU POINTEUR
                                     < DE PILE DU CONTEXTE SANS
                                     < VERIFICATION.
         LA          KCON,W          < A=POINTEUR DE PILE DU CONTEXTE.
         JMP         E112            < VERS LE CHANGEMENT DE CONTEXTE.
         PAGE
         PROG        PROG2
<
<
<        M O D I F I C A T I O N S   D E
<        S C A L E   ,   D X   ,   D Y   ,   D Z  :
<
<
<
<        FONCTION :
<                      CES PRIMITIVES PERMETTENT DE
<                    MODIFIER SCALE,DX,DY,DZ , ET
<                    D'INCREMENTER/DECREMENTER DX,DY,DZ
<                    A PARTIR DE SCALE.
<
<
<        M O D I F I C A T I O N   D E   S C A L E  :
<
<
<        ARGUMENT :
<                    B=VALEUR A DONNER A SCALE.
<
<
MSCALE:  EQU         $
         CPZR        B               < VALIDATION DE LA NOUVELLE VALEUR.
         JLE         E80             < ERREUR.
         STB         SCALE           < MODIFICATION DE SCALE.
         BSR         ATINT           < RETOUR A LA GRAMMAIRE INITIALE?
         RSR
<
< TRAITEMENT COMMUN DES ERREURS :
<
E80:     EQU         $
         BSR         AERR            < POUR CONNAITRE L'ADRESSE D'ERREUR
<
<
<        M O D I F I C A T I O N   D E   D X  :
<
<
<        ARGUMENT :
<                    B=VALEUR A DONNER A DX.
<
<
MDX:     EQU         $
         PSR         A,B             < PAR PRUDENCE.
         LAD         DX              < A=@DX.
         JMP         E81             < VERS L'EXECUTION.
<
<
<        M O D I F I C A T I O N   D E   D Y  :
<
<
<        ARGUMENT :
<                    B=VALEUR A DONNER A DY.
<
<
MDY:     EQU         $
         PSR         A,B             < QUEL LUXE !!!
         LAD         DY              < A=@DY.
         JMP         E81             < VERS L'EXECUTION.
<
<
<        M O D I F I C A T I O N   D E   D Z  :
<
<
<        ARGUMENT :
<                    B=VALEUR A DONNER A DZ.
<
<
MDZ:     EQU         $
         PSR         A,B             < PRUDENCE ....
         LAD         DZ              < A=@DZ.
<
< TRONC COMMUN AUX MODIFICATIONS DE DX,DY,DZ :
<
E81:     EQU         $
         LR          A,W             < W=@DX/DY/DZ.
         LR          B,A             < A=VALEUR A DONNER A DX/DY/DZ.
         MP          SCALE           < PRISE EN COMPTE DU FACTEUR
                                     < D'ECHELLE.
         JANE        E80             < ERREUR : OVERFLOW.
         LR          B,A             < A=VALEUR DU RESULTAT.
<
< ENTRY 'OPERATION SUR DX,DY,DZ' :
<
E86:     EQU         $
         JALE        E80             < ERREUR : OVERFLOW DU RESULTAT.
         CP          BORNE           < VALIDATION ...
         JG          E80             < ERREUR : OVERFLOW DU RESULTAT.
         STA         0,W             < RANGEMENT DE LA NOUVELLE VALEUR
                                     < DE DX/DY/DZ SI OK.
<
< SORTIES DES ROUTINES :
<
E132:    EQU         $               < CAS OU LE +/- PORTE SUR UN DELTA
                                     < POUR LEQUEL L'AXE CORRESPONDANT
                                     < EST L'AXE DE PROJECTION.
         BSR         ATINT           < RETOUR A LA GRAMMAIRE INITIALE??
         PLR         A,B
         RSR
<
<
<        M O D I F I C A T I O N   D E   D X   &   D Y   &   D Z  :
<
<
<        ARGUMENT :
<                    B=VALEUR A DONNER A DX & DY & DZ.
<
<
MD:      EQU         $
         BSR         AMDX            < MODIFICATION DE DX.
         BSR         AMDY            < MODIFICATION DE DY.
         BSR         AMDZ            < MODIFICATION DE DZ.
         RSR                         < AIN'T IT HARD ????
<
<
<        D X <--- ( D X ) + ( S C A L E )  :
<
<
MDXP:    EQU         $
         PSR         A,B
         LAD         DX              < A=@DX.
         JMP         E82             < VERS LE TRONC COMMUN.
<
<
<        D Y <--- ( D Y ) + ( S C A L E )  :
<
<
MDYP:    EQU         $
         PSR         A,B
         LAD         DY              < A=@DY.
         JMP         E82             < VERS LE TRONC COMMUN.
<
<
<        D Z <--- ( D Z ) + ( S C A L E )  :
<
<
MDZP:    EQU         $
         PSR         A,B
         LAD         DZ              < A=@DZ.
<
< TRONC COMMUN A + SUR DX/DY/DZ :
<
E82:     EQU         $
         LBI         0               < B=0 : MEMORISATION '+'.
         JMP         E83             < VERS LE TRONC COMMUN.
<
<
<        D X <--- ( D X ) - ( S C A L E )  :
<
<
MDXM:    EQU         $
         PSR         A,B
         LAD         DX              < A=@DX.
         JMP         E84             < VERS LE TRONC COMMUN.
<
<
<        D Y <--- ( D Y ) - ( S C A L E )  :
<
<
MDYM:    EQU         $
         PSR         A,B
         LAD         DY              < A=@DY.
         JMP         E84             < VERS LE TRONC COMMUN.
<
<
<        D Z <--- ( D Z ) - ( S C A L E )  :
<
<
MDZM:    EQU         $
         PSR         A,B
         LAD         DZ              < A=@DZ.
<
< TRONC COMMUN A - SUR DX/DY/DZ :
<
E84:     EQU         $
         LBI         1               < B=1 : MEMORISATION '-'.
<
< TRONC COMMUN A +/- SUR DX/DY/DZ :
<
E83:     EQU         $
         LR          A,W             < W=@DX/DY/DZ.
         CPZ         0,W             < Y-A-T'IL UNE PROJECTION
                                     < PARALLELE A CET AXE ???
         JE          E132            < OUI , EN CONSEQUENCES , ON
                                     < NE MODIFIE PAS CE DELTA !!
         LA          SCALE           < A=+SCALE.
         CPZR        B               < DISCRIMINATION OPERATION +/-.
         JE          E85             < C'EST UN '+' QUI EST DEMANDE.
         NGR         A,A             < A=-SCALE SI '-' DEMANDE.
E85:     EQU         $
         AD          0,W             < A=DX/DY/DZ+/-SCALE.
         JMP         E86             < VERS LA VALIDATION DU RESULTAT :
<
<
<        A J O U T   D E   S C A L E   A   D X   &   D Y   &   D Z  :
<
<
MP:      EQU         $
         BSR         AMDXP           < DX<--(DX)+(SCALE).
         BSR         AMDYP           < DY<--(DY)+(SCALE).
         BSR         AMDZP           < DZ<--(DZ)+(SCALE).
         RSR
<
<
<        M O I N S   S C A L E   S U R   D X   &   D Y   &   D Z  :
<
<
MM:      EQU         $
         BSR         AMDXM           < DX<--(DX)-(SCALE).
         BSR         AMDYM           < DY<--(DY)-(SCALE).
         BSR         AMDZM           < DZ<--(DZ)-(SCALE).
         RSR
<
<
<        P R O J E C T I O N S   P A R A L L E L E S   A U X   A X E S  :
<
<
<        FONCTION :
<                      CES 3 PRIMITIVES PERMETTENT DE
<                    PROJTER LES DESSINS SUR LES PLANS
<                    DE COORDONNEES , C'EST-A-DIRE
<                    PARALLELEMENT AUX AXES.
<
<
<        P R O J E C T I O N   S U R   ( O Y , O Z )  :
<
PX:      EQU         $
         STZ         DX              < PROJECTION PARALLELE A OX.
         JMP         E340            < VERS LA SORTIE ....
<
<        P R O J E C T I O N   S U R   ( O X , O Z )  :
<
PY:      EQU         $
         STZ         DY              < PROJECTION PARALLELE A DY.
         JMP         E340            < VERS LA SORTIE ....
<
<        P R O J E C T I O N   S U R   ( O X , O Y )  :
<
PZ:      EQU         $
         STZ         DZ              < PROJECTION PARALLELE A DZ.
E340:    EQU         $
         BSR         ATINT           < RETOUR A LA GRAMMAIRE INITIALE??
         RSR
         PAGE
         PROG        PROG3
<
<
<        D E F I N I T I O N   D E   L A
<        T R A N S F O R M A T I O N   C O U R A N T E  :
<
<
<        FONCTION :
<                      CETTE PRIMITIVE PERMET DE METTRE A JOUR ,
<                    OU DE REMETTRE A L'ETAT ELEMENT
<                    NEUTRE , LA TRANSFORMATION COURANTE.
<                    ELLE TIENT COMPTE DES DEGRES D'IDEMPOTENCE
<                    DE CHAQUE TRANSFORMATION ELEMENTAIRE.
<                      ON A ACCES A 3 FONCTIONS DIFFERENTES :
<                    - T<--ELEMENT NEUTRE ,
<                    - T<--T+T(X) ,
<                    - T<--T-T(X).
<
<
<        ARGUMENT :
<                    A=NUMERO DE LA TRANSFORMATION ELEMENTAIRE QUE
<                      L'ON VEUT AJOUTER OU RETRANCHER A LA
<                      TRANSFORMATION COURANTE ,
<                    A=0 : ON REMET LA TRANSFORMATION COURANTE
<                          A L'ETAT ELEMENT NEUTRE.
<
<
<        S U P P R E S S I O N   T R A N S F O R M A T I O N
<                    E L E M E N T A I R E  :
<
RTRANS:  EQU         $
         PSR         A,B,X,Y         < QUELLE PRUDENCE !!!
         LBI         0               < MEMORISATION 'SUPPRESSION D'UNE
                                     < TRANSFORMATION ELEMENTAIRE'.
         JMP         E75             < VERS L'EXECUTION.
<
<        A J O U T   D ' U N E   T R A N S F O R M A T I O N
<                    E L E M E N T A I R E  :
<
TRANS:   EQU         $
         PSR         A,B,X,Y         < QUELLE PRUDENCE !!!
         LBI         1               < MEMORISATION 'AJOUT D'UNE
                                     < TRANSFORMATION ELEMENTAIRE'.
<
< TRAITEMENT COMMUN A +/- :
<
E75:     EQU         $
         JAL         E70             < ERREUR DE TRANSFORMATION.
         JAE         E71             < RETOUR A L'ELEMENT NEUTRE.
         CPI         NT              < VALIDATION.
         JG          E70             < ERREUR DE NUMERO.
<
< MISE A JOUR DE LA TRANSFORMATION COURANTE :
<
         LR          A,X             < X=NUMERO DEMANDE.
         CPZR        B               < DISCRIMINATION +/- ????
         JE          E76             < SUPPRESSION D'UNE TRANSFORMATION.
<
< AJOUT D'UNE TRANSFORMATION :
<
         MP          C11
         XR          A,B             < A NOTER : B=0.
         AD          AMAT
         LR          A,W             < W=@MATRICE DE LA TRANSFORMATION
                                     < ELEMENTAIRE DEMANDEE.
         LBY         &TRANSN         < A=COMPTE COURANT D'ITERATIONS.
         ADRI        1,A             < +1 SUR LE COMPTE D'ITERATIONS.
         XR          A,B             < A=0 ; B=COMPTE D'ITERATIONS.
         DV          PERIOD,W        < B=NBRE REEL D'ITERATIONS.
<
< TRONC COMMUN AJOUT/SUPPRESSION :
<
E76:     EQU         $
         LR          B,A
         STBY        &TRANSN         < MAJ DU COMPTE D'ITERATIONS.
         CPZR        B               < TEST DE SUPPRESSION DE LA
                                     < TRANSFORMATION ELEMENTAIRE ????
         LA          TRANSC
         LB          TRANSC+1        < ACCES AUX INDICATEURS DE
                                     < PRESENCE.
         SBT         0,X             < AJOUT A PRIORI.
         JNE         E74             < EFFECTIVEMENT , ON AJOUTE CETTE
                                     < TRANSFORMATION ELEMENTAIRE.
         RBT         0,X             < ET NON , IL FAUT LA SUPPRIMER ....
E74:     EQU         $
         STA         TRANSC          < MAJ DES INDICATEURS DE
         STB         TRANSC+1        < DE PRESENCE.
         JMP         E73             < VERS LA SORTIE ....
<
< RETOUR A L'ETAT ELEMENT NEUTRE :
<
VIDE:    EQU         $               < ENTRY DIRECTE DE RETOUR A
                                     < L'ELEMENT NEUTRE.
         PSR         A,B,X,Y
         LAI         0               < POUR RAZER LES OCCURENCES.
E71:     EQU         $
         STZ         TRANSC          < REMISE A 0 DES INDICATEURS DE
         STZ         TRANSC+1        < DE PRESENCE.
         LXI         NT              < A NOTER QU'ON A ICI : A=0 !!!!!
<
< BOUCLE DE RAZ DES COMPTES D'ITERATIONS :
<
E72:     EQU         $
         STBY        &TRANSN
         JDX         E72             < AU SUIVANT.
<
< SORTIE DES ROUTINES :
<
E73:     EQU         $
         BSR         ATINT           < RETOUR A LA GRAMMAIRE INITIALE??
         PLR         A,B,X,Y
         RSR
<
<
<        C R E A T I O N   D ' U N E   N O U V E L L E
<        T R A N S F O R M A T I O N   U S E R  :
<
<
<        FONCTION :
<                      PERMET DE CREER UNE NOUVELLE
<                    TRANSFORMATION (TUS1/TUS2/TUS3) ,
<                    EN DONNANT COMME ARGUMENT LE NUMERO
<                    DE CELLE QUE L'3N VEUT CREER , ET
<                    L'ADRESSE DE LA MATRICE DE TRANSFORMATION
<                    SUR DIM*DIM+2 MOTS.
<
<
<        ARGUMENTS :
<                    A=NUMERO DE LA TRANSFORMATION (TUS1/TUS2/TUS3) ,
<                    ((K))=@DE LA MATRICE DE LA NOUVELLE TRANSFORMATION.
<
<
CREAT:   EQU         $
         LR          K,W             < W POINTE SUR L'ADRESSE DE
                                     < L'ADRESSE DE LA MATRICE
                                     < DE TRANSFORMATION (CF. ADRESSE
                                     < DE RETOUR DU BSR).
         IC          0,W             < CALCUL DE L'ADRESSE DE RETOUR.
         PLR         W               < W=@+1 DE L'ADRESSE DE LA
                                     < MATRICE ARGUMENT.
         ADRI        1,K             < AFIN D'ANNULER LES EFFETS DU PLR.
         PSR         A,B,X,Y
<
< VALIDATION DU NUMERO DEMANDE :
<
         JALE        E70             < ERREUR DE NUMERO.
         CPI         NTUS            < VALIDATION.
         JG          E70             < ERREUR DE NUMERO.
<
< CREATION DE LA TRANSFORMATION :
<
         MP          C11
         LA          AMAT
         ADR         A,B             < B=@DESTINATRICE DANS LA
                                     < ZONE DES TRANSFORMATIONS
                                     < ELEMENTAIRES ('MATRIX').
         LA          -1,W            < A=ADRESSE DE LA MATRICE
                                     < ARGUMENT=EMETTEUR ; B=RECEPTEUR.
         LX          C11             < X=NBRE DE MOTS A DEPLACER.
         MOVE                        < INITIALISATION DE LA NOUVELLE
                                     < TRANSFORMATION.
         JMP         E73             < VERS LA SORTIE.
<
< TRAITEMENT DES ERREURS :
<
E70:     EQU         $
         BSR         AERR            < AFIN DE CONNAITRE L'ADRESSE
                                     < D'ERREUR.
         PAGE
         PROG        PROG4
<
<
<        D E P L A C E M E N T S   D U   C U R S E U R
<                    V I R T U E L  :
<
<
<        FONCTION :
<                      ON DISTINGE 6 DEPLACEMENTS DIFFERENTS :
<                    1 : DELTA(X)>0 ,
<                    4 : DELTA(X)<0 ,
<                    2 : DELTA(Y)>0 ,
<                    5 : DELTA(Y)<0 ,
<                    3 : DELTA(Z)>0 ,
<                    6 : DELTA(Z)<0.
<                      TOUS LES DELTA ETANT REPERES DANS LE
<                    REFERENTIEL LOCAL.
<
<
<
<        DEPLACEMENT DELTA(X)>0 :
<
D1:      EQU         $
         PSR         A,B,X,Y         < QUELLE PRUDENCE !!!
         LA          DX              < A=DX.
         JMP         E1
<
< DEPLACEMENT DELTA(X)<0 :
<
D4:      EQU         $
         PSR         A,B,X,Y         < QUELLE PRUDENCE !!!
         LA          DX
         NGR         A,A             < A=-DX.
E1:      EQU         $
         LBI         0               < B=0.
         LYI         0               < Y=0.
         JMP         E2
<
< DEPLACEMENT DELTA(Y)>0 :
<
D2:      EQU         $
         PSR         A,B,X,Y         < QUELLE PRUDENCE !!!
         LB          DY              < B=DY.
         JMP         E3
<
< DEPLACEMENT DELTA(Y)<0 :
<
D5:      EQU         $
         PSR         A,B,X,Y         < QUELLE PRUDENCE !!!
         LB          DY
         NGR         B,B             < B=-DY.
E3:      EQU         $
         LAI         0               < A=0.
         LYI         0               < Y=0.
         JMP         E2
<
< DEPLACEMENT DELTA(Z)>0 :
<
D3:      EQU         $
         PSR         A,B,X,Y         < QUELLE PRUDENCE !!!
         LY          DZ              < Y=DZ.
         JMP         E4
<
< DEPLACEMENT DELTA(Z)<0 :
<
D6:      EQU         $
         PSR         A,B,X,Y         < QUELLE PRUDENCE !!!
         LY          DZ
         NGR         Y,Y             < Y=-DZ.
E4:      EQU         $
         LAI         0               < A=0.
         LBI         0               < B=0.
<
< CALCUL DU DEPLACEMENT VECTORIEL LOCAL DE CV :
<
E2:      EQU         $
<        ON A ICI :
<                    A=DELTAX ,
<                    B=DELTAY ,
<                    Y=DELTAZ.
<                    (CES DEPLACEMENTS ETANT LOCAUX).
         STA         DV+X            < DELTAX LOCAL.
         STB         DV+Y            < DELTAY LOCAL.
         STY         DV+Z            < DELTAZ LOCAL.
<
<        D E P L A C E M E N T   L O C A L   D E   C V  :
<
         AD          XL
         STA         XL              < XL<--(XL)+(DELTAX).
         LR          B,A             < A=DELTAX LOCAL.
         AD          YL
         STA         YL              < YL<--(YL)+(DELTAY).
         LR          Y,A             < A=DELTAZ . LOCAL.
         AD          ZL
         STA         ZL              < ZL<--(ZL)+(DELTAZ).
<
<        D E P L A C E M E N T   G L O B A L   D E   C V  :
<
         LA          TRANSC
         LB          TRANSC+1        < (A,B)=TRANSFORMATIONS ELEMEN-
                                     < TAIRES COURANTES.
<
< BOUCLE D'APPLICATION DE CHAQUE TRANSFORMATION ELEMENTAIRE :
<
E12:     EQU         $
         JANE        E10             < OK , IL EN RESTE AU MOINS UNE.
         CPZR        B
         JE          E11             < OU BIEN LA TRANSFORMATION
                                     < COURANTE EST L'ELEMENT NEUTRE ,
                                     < OU BIEN ON LES A TOUTS
                                     < APPLIQUYEES.
<
< CAS OU IL RESTE AU MOINS UNE TRANSFORMATION
< ELEMENTAIRE A APPLIQUER :
<
E10:     EQU         $
         DBT                         < X=NUMERO DE LA TRANSFORMATION
                                     < ELEMENTAIRE.
         RBT         0,X             < MEMORISATION DE SON APPLICATION.
         PSR         A,B             < SAUVEGARDE DE LA TRANSFORMATION
                                     < RESIDUELLE COURANTE.
         LBY         &TRANSN         < A=NBRE D'ITERATIONS DE LA
                                     < TRANSFORMATION ELEMENTAIRE (X).
         XR          A,X             < X=NBRE D'ITERATIONS ,
                                     < A=NUMERO DE LA TRANSFORMATION.
         MP          C11             < CALCUL DU DEPLACEMENT DE
                                     < MATRICE DE LA TRANSFORMATION
                                     < (X) PAR RAPPORT A 'MATRIX'.
         LA          AMAT            < A=@MATRIX.
         ADR         B,A             < A=@MATRICE DE LA TRANSFORMATION
                                     < ELEMENTAIRE (X).
         STA         AMATC           < GENERATION DU RELAI DIRECT
                                     < VERS LA MATRICE (X).
         SBT         0               < POSITIONNEMENT DU BIT INDEX.
         STA         AMATCX          < GENERATION DU RELAI INDEXE VERS
                                     < LA MATRICE (X).
<
< BOUCLE D'ITERATIONS DE LA TRANSFORMATION (X) :
<
E13:     EQU         $
         PSR         X               < SAVE LE COMPTE D'ITERATIONS
                                     < RESIDUEL.
         LXI         A33             < ON COMMENCE LES PRODUITS
                                     < MATRICIELS PAR L'ELEMENT
                                     < A33 DES MATRICES.
<
< CALCUL DU PRODUIT MATRICIEL DU DEPLACEMENT 'DV'
< PAR LA MATRICE DE TRANSFORMATION ELEMENTAIRE (X) :
<
E14:     EQU         $
         LYI         0               < INITIALISATION DU CUMUL
                                     < D'UN PRODUIT LIGNE DE LA MATRICE
                                     < PAR LE VECTEUR DEPLACEMENT DV.
         LA          DV+Z
         BSR         ACOMP           < Y=AI3*DVZ.
         LA          DV+Y
         BSR         ACOMP           < Y=AI2*DVY+AI3*DVZ.
         LA          DV+X
         BSR         ACOMP           < Y=AI1*DVX+AI2*DVY+AI3*DVZ.
         ADRI        1,X             < POUR PERMETTRE UN JDX CORRECT.
         PSR         Y               < SAVE AI1*DVX+AI2*DVY+AI3*DVZ.
         JDX         E14             < PASSAGE A LA LIGNE PRECEDENTE
                                     < DE LA MATRICE DE TRANSFORMATION.
         PLR         Y               < Y=A11*DVX+A12*DVY+A13*DVZ.
         STY         DV+X            < DVX<--A11*DVX+A12*DVY+A13*DVZ.
         PLR         Y               < Y=A21*DVX+A22*DVY+A23*DVZ.
         STY         DV+Y            < DVY<--A21*DVX+A22*DVY+A23*DVZ.
         PLR         Y               < Y=A31*DVX+A32*DVY+A33*DVZ.
         STY         DV+Z            < DVZ<--A31*DVX+A32*DVY+A33*DVZ.
         PLR         X               < RESTAURE LE COMPTE D'ITERATIONS
                                     < RESIDUELLES.
         JDX         E13             < ITERATION EVENTUELLE DE LA
                                     < TRANSFORAMTION ELEMENTAIRE
                                     < COURANTE.
         PLR         A,B             < RESTAURE LA TRANSFORMATION
                                     < RESIDUELLE.
         JMP         E12             < PASSAGE A L'EVENTUELLE TRANSFOR-
                                     < MATION ELEMENTAIRE SUIVANTE.
<
< DEPLACEMENT DU CVG :
<
E11:     EQU         $
         LA          DV+X
         AD          XG
         STA         XG              < XG<--(XG)+(DVX).
         LA          DV+Y
         AD          YG
         STA         YG              < YG<--(YG)+(DVY).
         LA          DV+Z
         AD          ZG
         STA         ZG              < ZG<--(ZG)+(DVZ).
         PLR         A,B,X,Y
         RSR                         < OUF ....!!..!
<
<
<        P R O D U I T S   M A T R I C I E L S   P A R T I E L S  :
<
<
<        ARGUMENT :
<                    A=UNE COORDONNEE DU VECTUER DEPLACEMENT 'DV'.
<                    Y=CUMUL COURANT D'UN PRODUIT D'UNE
<                      LIGNE PAR LE VECTEUR DV.
<                    X=INDEX DE L'ELEMENT COURANT DE LA
<                      MATRICE DE TRANSFORMATION ELEMENTAIRE COURANTE.
<
<
<        RESULTAT :
<                    Y=NOUVEL VALEUR DU PRODUIT LIGNE PARTIEL.
<                    X<(X)-1.
<
<
COMPUT:  EQU         $
         CPZ         &AMATCX
         JE          E700            < LE COEFFICIENT A(I,J) DE LA
                                     < MATRICE ETANT NUL , IL NE
                                     < PARTICIPE PAS AU CALCUL.
         MP          &AMATCX         < CALCUL DU PRODUIT DE LA
                                     < COORDONNEE DE DV PAR L'ELEMENT
                                     < COURANT DE LA MATRICE DE
                                     < TRANSFORMATION.
         CPZ         &AMATC          < TEST DU DIVISEUR DE LA MATRICE
                                     < DE TRANSFORMATION COURANTE.
         JE          E20             < ETANT NUL C'EST QU'IL VAUT
                                     < 1 , ET QU'ON A DONC RIEN A
                                     < FAIRE (!!??!?).
<
< CAS OU LA MATRICE DE TRANSFORMATION A UN
< DIVISEUR ; ON DOIT DONC FAIRE CETTE
< CETTE DIVISION EN OPERANT SOIT PAR EXCES
< SOIT PAR DEFAUT SUIVANT LES CAS :
<
         DV          &AMATC          < DIVISION DU PRODUIT COURANT
                                     < PAR LE DIVISEUR DE LA MATRICE.
         XR          A,B             < A=RESTE ; B=QUOTIENT.
         ADR         A,A             < A=2*RESTE.
         JAGE        E21             < CAS OU LES RESTE EST POSITIF.
         NGR         A,A             < CAS OU LES RESTE EST NEGATIF ,
                                     < ON CALCULE SA VALEUR ABSOLUE.
E21:     EQU         $
         CP          &AMATC          < COMPARAISON DE LA VALEUR
                                     < ABSOLUE DU DOUBLE DU RESTE AU
                                     < DIVISEUR DE LA MATRICE.
         JL          E20             < INFERIEUR , ON FAIT DONC UNE
                                     < DIVISION ENTIERE PAR DEFAUT.
<
< CAS D'UNE DIVISION PAR EXCES :
<
         CPZR        B               < TEST DU SIGNE DU QUOTIENT.
         JGE         E22             < CAS OU LE QUOTIENT EST POSITIF.
         ADRI        -2,B            < CAS OU LE QUOTIENT EST NEGATIF.
E22:     EQU         $
         ADRI        1,B             < ON FAIT ICI UNE DIVISION
                                     < ENTIERE PAR EXCES.
E20:     EQU         $
         ADR         B,Y             < CUMUL DU PRODUIT LIGNE.
E700:    EQU         $               < ENTRY 'COEFFICIENT A(I,J) NUL'.
         ADRI        -1,X            < PREPARATION DE L'2NDEX D'ACCES
                                     < A L'ELEMENT PRECEDENT DE LA
                                     < MATRICE DE TRANSFORMATION.
         RSR
         PAGE
         PROG        PROG5
<
<
<        P R O J E C T I O N   P L A N N E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE EST CHAGREE DE PROJETER
<                    SUR LE PLAN DE L'ECRAN L'UNE DES 2
<                    EXTREMITES DU SEGMENT COURANT . DE PLUS AUCUNE
<                    VERIFICATION N'EST FAITE A CE NIVEAU QUANT
<                    AUX 'OVERSCREEN' ....
<
<
<        ARGUMENT :
<                    W=@SEGORG/SEGEXT.
<
<
<        RESULTATS :
<                    A=COORDONNE HORIZONTALE X SUR L'ECRAN ,
<                    Y=COORDONNE VERTICALE Z SUR L'ECRAN.
<
<
PROJ:    EQU         $
         LAD         MPROJ           < ACCES A LA PSEUDO-MATRICE
                                     < DE PROJECTION PLANE.
         STA         AMATC           < GENERATION DE SON RELAI DIRECT.
         SBT         0               < BIT INDEX.
         STA         AMATCX          < GENERATION DE SON RELAI INDEXE.
         LY          C512            < INITIALISATION DU CUMUL DU
                                     < 'PRODUIT LIGNE' AU CENTRE DE
                                     < L'ECRAN.
         LXI         2               < ON COMMENCE AU 2EME ELEMENT
                                     < DE LA PSEUDO-MATRICE.
         LA          Y,W             < A=COORDONNEE Y DE L'EXTREMITE
                                     < ARGUMENT.
                                     < (SOIT YS).
         BSR         ACOMP           < Y=YS*SINUS(PROJECTION)+512.
         PSR         Y               < SAVE YS*SINUS(PROJECTION)+512.
         LY          C512            < REPOSITIONNEMENT AU CENTRE
                                     < DE L'ECRAN.
         LA          Y,W             < A=YS (ARGUMENT).
         BSR         ACOMP           < Y=YS*COSINUS(PROJECTION)+512.
         PLR         A               < RESTAURE A=YS*SINUS(PROJECTION)+
                                     < 512.
         AD          Z,W             < AJOUTONS L'EXTREMITE Z DE
                                     < L'EXTREMITE ARGUMENT (ZS).
         XR          A,Y             < ON A :
                                     < Y=ZS+YS*SINUS+512 ,
         AD          X,W             < AJOUTONS LA COORDONNEE X DE
                                     < L'EXTREMITE ARGUMENT (XS)  ,
                                     < ON A :
                                     < A=XS+YS*COSINUS+512.
         RSR
         PAGE
<
<
<        R E S O L U T I O N   D ' U N E   E Q U A T I O N
<        L I N E A I R E   E N   X   O U   Z  :
<
<
<        ARGUMENT :
<                    A=LA DONNE INITIALE (X OU Z) ,
<                    X=COMPTE COURANT DES OVERSCREEN ,
<                    W=@POINT D'INTERSECTION COURANT ('INTER').
<
<
<        RESULTAT :
<                    X<--(X)+1 , SI LA SOLUTION DE L'EQUATION
<                                PROPOSEE EST OVERSCREEN ,
<                    SINON : LE POINT D'INTERSECTION COURANT
<                            RECOIT LA SOLUTION (X,Z) DE L'EQUATION ,
<                            ET : W<--(W)+2.
<
<
<        C A L C U L   D E   X   ,   Z   E T A N T   D O N N E  :
<
<
CALX:    EQU         $
         STA         NZ,W            < SAVE A PRIORI LA DONNEE
                                     < INITIALE (Z).
         CPZ         P1              < LA RESOLUTION DE L'EQUATION
                                     < EST-ELLE POSSIBLE ?????
         JNE         E30             < OUI , OK.
<
< CAS D'UNE RESOLUTION IMPOSSIBLE (DIVISION PAR 0) :
<
E32:     EQU         $
         ADRI        1,X             < ET UN OVERCREEN DE PLUS ....
<
< RETOUR DES 2 ROUTINES :
<
E31:     EQU         $
         RSR
<
< CAS D'UNE RESOLUTION EN 'X' POSSIBLE :
<
E30:     EQU         $
         NGR         A,A             < A=-Z.
         MP          P2              < A,B=-Z*P2.
         LY          P3+1            < AFIN DE FAIRE UN CALCUL
                                     < DOUBLE-PRECISION.
         ADR         Y,B             < TOTALISATION PARTIELLE DE -Z*P2
                                     < ET DE P3.
         ADCR        A               < PROPAGATION DE LA RETENUE.
         AD          P3              < A,B=-Z*P2+P3.
         DV          MP1             < A=QUOTIENT PAR DEFAUT DE :
                                     < (-Z*P2+P3)/(-P1).
         STA         NX,W            < RANGEMENT DU X DE LA SOLUTION
                                     < A PRIORI.
<
< TEST D'OVERSCREEN :
<
E33:     EQU         $
         JAL         E32             < SOLUTION NEGATIVE REFUSEE.
         CP          BORNE
         JG          E32             < SOLUTION SUPERIEUR A BORNE
                                     < REFUSEE.
         ADRI        2,W             < LORSQUE LA SOLUTION EST DANS
                                     < L'ECRAN , ELLE DEVIENT UN POINT
                                     < D'INTERSECTION ADMIS.
         JMP         E31             < OK , RETOUR.
<
<
<        C A L C U L   D E   Z   ,   X   E T A N T   D O N N E  :
<
<
CALZ:    EQU         $
         STA         NX,W            < SAVE LA DONNEE INITIALE
                                     < (X) A PRIORI.
         CPZ         P2              < LA RESOLUTION DE L'EQUATION
                                     < PROPOSEE EST-ELLE POSSIBLE ????
         JE          E32             < NON , OVERSCREEN.
<
< CAS D'UNE RESOLUTION POSSIBLE :
<
         MP          P1              < A,B=X*P1.
         LY          P3+1            < POUR UN CALCUL DOUBLE-PRECISION.
         ADR         Y,B             < TOTALISATION PARTIELLE DE
                                     < X*P1 ET DE P3.
         ADCR        A               < PROPAGATION DE LA RETENUE.
         AD          P3              < SUITE DE LA TOTALISATION.
         DV          P2              < A=QUOTIENT PAR DEFAUT DE
                                     < X*P1/P2.
         STA         NZ,W            < SAVE A PRIORI LA SOLUTION Z.
         JMP         E33             < VERS LE TEST D'OVERSCREEN DE
                                     < LA SOLUTION Z OBTENUE.
         PAGE
<
<
<        O R I G I N E   D U   S E G M E N T   C O U R A N T  :
<
<
<        FONCTION :
<                      CETTE ROUTINE FIXE L'ORIGINE DU
<                    SEGMENT COURANT A 6'EMPLACEMENT DU
<                    CURSEUR VIRTUEL GLOBAL.
<
<
PA:      EQU         $
         PSR         A,B,X           < QUELLE PRUDENCE !!!
         LAD         SEGORG
         LR          A,B             < B=@SEGORG=@RECEPTEUR.
         LAD         CVG             < A=@CURSEUR VIRTUEL GLOBAL
                                     <  =@ EMETTEUR.
         LXI         DIM             < X=NBRE DE COORDONNEES A DEPLACER.
         MOVE                        < MISE EN PLACE DE L'ORIGINE
                                     < DU SEGMENT COURANT.
         PLR         A,B,X
         RSR
         PAGE
<
<
<        E X T R E M I T E   S   D U   S E G M E N T   C O U R A N T  :
<
<
<        FONCTION :
<                      CETTE PRIMITIVE FIXE L'EXTREMITE DU
<                    SEGMENT COURANT A L'EMPLACEMENT DU CURSEUR
<                    VIRTUEL GLOBAL , PUIS PROJETTE LE SEGEMENT COURANT
<                    SUR LE PLAN DE LA VISU ; ET ENFIN AVANT
<                    LA VISUALISATION , ELLE CALCULE LES INTERSECTIONS
<                    AVEC LES BORDS DE L'ECRAN.
<
<
<        NOTA :
<                      LA PRIMITIVE 'S' SERA UTILISEE
<                    PAR LA PRIMITIVE 'B'.
<
<
PS:      EQU         $
         PSR         A,B,X,Y         < QUELLE PRUDENCE !!!!
         LAD         SEGEXT
         LR          A,B             < B=@SEGEXT=@RECEPTEUR.
         LAD         CVG             < A=@CVG=@EMETTEUR.
         LXI         DIM             < X=NBRE DE COORDONNEES A DEPLACER.
         MOVE                        < MISE EN PLACE EXTREMITE DU
                                     < SEGMENT COURANT.
<
< PROJECTION DE L'EXTREMITE DU SEGEMENT COURANT :
<
         LR          B,W             < W=@SEGEXT=@EXTREMITE DU
                                     < SEGMENT COURANT.
         BSR         APROJ           < PROJECTION DE L'EXTRMITE.
         STA         X2              < COORDONNE X2 DU POINT M2.
         STY         Z2              < COORDONNE Z2 DU POINT M2.
<
< PROJECTION DE L'ORIGINE DU SEGMENT COURANT :
<
         ADRI        SEGORG-SEGEXT,W < W=@SEGORG SEGMENT COURANT.
         BSR         APROJ           < PROJECTION DE L'ORIGINE.
         STA         X1              < COORDONNEE X1 DU POINT M1.
         STY         Z1              < COORDONNEE Z1 DU POINT M1.
<
< TEST D'INCLUSION DE M1M2 DANS L'ECRAN :
<
         LA          X1
         BSR         AOVS            < TEST D'OVERSCREEN X1.
         LA          Z1
         BSR         AOVS            < TEST D'OVERSCREE DE Z1.
         LA          X2
         BSR         AOVS            < TEST D'OVERCREEN DE X2.
         LA          Z2
         BSR         AOVS            < TEST D'OVERSCREEN DE Z2.
         JMP         E41             < LORSQU'ON ARRIVE ICI , C'EST
                                     < QU'AUCUNE DES COORDONNEES X1,
                                     < Z1,X2,Z2 N'EST OVERSCREEN.
<
< ROUTINE DE TEST D'OVERSCREEN :
<
OVS:     EQU         $
         JAL         E42             < UNE COORDONNEE NEGATIVE EST
                                     < OVERSCREEN.
         CP          BORNE
         JG          E42             < UNE COORDONNEE SUPERIEURE A
                                     < BORNE EST OVERCREEN.
         RSR                         < LE RETOUR A LIEU LORSQUE LA
                                     < COORDONNEE EST DANS L'ECRAN.
<
< CAS OU AU MOINS UNE COORDONNEE EST OVERSCREEN :
<
E42:     EQU         $               < CAS OU UN OVERCREEN EST SUR.
         ADRI        -1,K            < RATTRAPAGE DE LA PILE K ,
                                     < LORSQU'1N RSR N'A PAS ETE FAIT.
<
< CALCUL DES PARAMETRES DE LA DROITE M1M2 :
<
<        L'EQUATION DE LA DROITE EST : X*MP1+Z*MP2=P3,
<        AVEC :
<        P1=Z2-Z1 ,
<        P2=X2-X1 ,
<        P3=X2*Z1-X1*Z2.
<        DE PLUS :
<        A X DONNE : Z=(X*P1+P3)/P2 SI P2#0 ,
<        A Z DONNE : X=(-Z*P2+P3)/MP1 SI P1#0.
<
         LA          Z2
         SB          Z1
         STA         P1              < P1=Z2-Z1.
         NGR         A,A
         STA         MP1             < MP1=-P1.
         LA          X2
         SB          X1
         STA         P2              < P2=X2-X1.
         LA          X2
         MP          Z1              < A,B=X2*Z1.
         STA         P3
         STB         P3+1            < RANGEMENT TEMPORAIRE.
         LA          X1
         NGR         A,A
         MP          Z2              < A,B=-X1*Z2.
         LY          P3+1            < POUR UN CALCUL EN DOUBLE-
                                     < PRECISION.
         ADR         Y,B             < TOTALISATION PARTIELLE.
         ADCR        A               < PROPAGATION DE LA RETENUE.
         STB         P3+1
         AD          P3              < POURSUITE DU CUMUL.
         STA         P3              < P3=X2*Z1-X1*Z2 , EN DOUBLE-
                                     < PRECISION.
<
< CALCUL DE L'INTERSECTION DE M1M2 AVEC L'ECRAN :
<
         LAD         INTER
         LR          A,W             < INITIALISATION DE W SUR LE 1ER
                                     < POINT D'INTERSECTION.
         LXI         0               < RAZ DU COMPTE DES OVERSCREEN.
         LAI         0
         BSR         ACALZ           < CALCUL DE Z POUR X=0.
         LA          BORNE
         BSR         ACALZ           < CALCUL DE Z POUR X=BORNE.
         LAI         0
         BSR         ACALX           < CALCUL DE X POUR Z=0.
         LA          BORNE
         BSR         ACALX           < CALCUL DE X POUR Z=BORNE.
<
< TEST DE L'OVERSCREEN COMPLET DE LA DROITE M1M2 :
<
         LR          X,A             < A=COMPTE DE OVERSCREEN RENCONTRES.
         CPI         2
         JG          E40             < SI LE NBRE D'OVERSCREEN EST
                                     < SUPERIEUR A 2, ON ADMET QUE
                                     < LA DROITE M1M2 EST INVISIBLE ....
<
< CALCUL DE (N1,N2).INTER.(M1,M2)
< (N1 ET N2 ETANT LES 2 POINTS D'INTERSECTION
< NON OVERSCREEN).
<
<
< PREPARATION DU TRI DES POINTS M1,M2,N1,N2 :
<
         LAD         SEG2+NZ
         LR          A,W             < W=@DES COORDONNEES DE M1.
         LXI         NX-NZ
         LA          P1              < A=P1.
         JAGE        E69             < P1>=0.
         NGR         A,A             < A=-P1 ; ON MET DONC DANS A
                                     < LA VALEUR ABSOLUE DE P1.
E69:     EQU         $
         CP          SCALE           < LA DROITE M1M2 EST-ELLE
                                     < HORIZONTALE ????
                                     < (AUX ERREURS DE CALCUL PRES...)
         JGE         E60             < NON , LE TRI VA ETRE FAIT SUR Z.
         ADRI        NX-NZ,W         < OUI , LE TRI VA ETRE FAIT SUR X.
         LXI         NZ-NX           < POUR LES PERMUTATIONS DE
                                     < 2EME COORDONNEES.
E60:     EQU         $
         LYI         0               < Y MEMORISE LES PERMUTATIONS
                                     < QUI VONT ETRE OPEREES.
<
< TRI DE M1 ET M2 AFIN D'OBTENIR LA RELATION M1<M2 :
<
         LA          M1,W
         LB          M2,W
         CPR         A,B
         JGE         E61             < RIEN A FAIRE , ON A DEJA : M1<M2.
         STA         M2,W            < SINON , ON ECHANGE M1 ET M2.
         STB         M1,W
         ADRI        1,Y             < BIT15(Y) : PERMUTATION M1,M2.
E61:     EQU         $
<
< TRI DE N1 ET N2 AFIN D'OBTENIR : N1<N2 :
<
         LA          N1,W
         LB          N2,W
         CPR         A,B
         JGE         E62             < RIEN A FAIRE , ON A DEJA N1<N2.
         STA         N2,W            < SINON , ON ECHANGE N1 ET N2.
         STB         N1,W
         ADRI        2,Y             < BIT14(Y) : PERMUTATION N1,N2.
E62:     EQU         $
<
< ELIMINATION DES CAS IMPOSSIBLES OU INVISIBLES :
<
         LA          M1,W
         CP          N2,W
         JGE         E40             < M1>N2 : M1M2 EST INVISIBLE.
         LA          M2,W
         CP          N1,W
         JLE         E40             < M2<N1 : M1M2 EST INVISIBLE.
<
< CHOIX DU 'PLUS GRAND' PARMI M1 ET N1 :
<
         LA          N1,W
         CP          M1,W
         JLE         E63             < N1<M1 : ON GARDE M1.
         STA         M1,W            < SINON N1 DEVIENT M1.
         ADRI        4,Y             < BIT15(Y) : PERMUTATION M1,N1.
E63:     EQU         $
<
< CHOIX DU 'PLUS PETIT' PARMI M2 ET N2 :
<
         LA          N2,W
         CP          M2,W
         JGE         E64             < M2<N2 : ON GARDE M2.
         STA         M2,W            < SINON , N2 DEVIENT M2.
         ADRI        8,Y             < BIT12(Y) : PERMUTATION M2,N2.
E64:     EQU         $
<
< PERMUTATION DES 2EME COORDONNEES DES POINTS M1,M2,N1,N2 :
<
         LR          Y,A             < A=INDICATEUR DES PERMUTATIONS.
         ADR         X,W             < POSITIONNEMENT DE W SUR LA
                                     < COORDONNEE (X OU Z) NON ENCORE
                                     < PERMUTEE.
<
< PERMUTATION M1,M2 :
<
         TBT         15
         JNC         E65             < M1 ET M2 SONT INCHANGES.
         LB          M1,W
         LY          M2,W
         STY         M1,W
         STB         M2,W
E65:     EQU         $
<
< PERMUTATION DE N1,N2 :
<
         TBT         14
         JNC         E66             < N1 ET N2 SONT INCHANGES.
         LB          N1,W
         LY          N2,W
         STY         N1,W
         STB         N2,W
E66:     EQU         $
<
< PERMUTATION DE M1,N1 :
<
         TBT         13
         JNC         E67             < M1 ET N1 SONT INCHANGES.
         LB          M1,W
         LY          N1,W
         STY         M1,W
         STB         N1,W
E67:     EQU         $
<
< PERMUTATION DE M2,N2 :
<
         TBT         12
         JNC         E68             < M2 ET N2 SONT INCHANGES.
         LB          M2,W
         LY          N2,W
         STY         M2,W
         STB         N2,W
E68:     EQU         $
<
<
<        C O R R E C T I O N   D ' E R R E U R S   D E   C A L C U L  :
<
<
<        FONCTION :
<                      DES ERREURS DE CALCUL (DIVISION ENTIERE) ,
<                    FONT QUE DES POINTS D'UNE MEMEME DROITE ,
<                    AYANT UNE COORDONNEE IDENTIQUE (X OU Z) ,
<                    ONT LEURS AUTRES COORDONNEES (Z OU X)
<                    DIFFERENTES . ON RETABLIT ICI LES
<                    COINCIDENCES.
<
<
         LAD         SEG2+NZ
         LR          A,W             < W POINTE SUR LA 1ERE COORDONNEE
                                     < DU POINT M1.
         LXI         2*2             < ON VA VERIFIER LES 2 COORDONNEES
                                     < DES 2 POINTS M1 ET M2.
<
< BOUCLE DE VERIFICATION :
<
E602:    EQU         $
         LA          0,W             < A=UNE COORDONNEE Z/X DE M1/M2.
         JAGE        E600
         LAI         0               < SI L'ARGUMENT EST NEGATIF , ON
                                     < LE REND NUL.
E600:    EQU         $
         CP          BORNE           < TEST OVERSCREEN POSITIF.
         JLE         E601            < OK , ARGUMENT DANS L'ECRAN.
         LA          BORNE           < SI L'ARGUMENT EST HORS L'ECRAN
                                     < POSITIF , ON LUI DONNE LA
                                     < VALEUR 'BORNE'.
E601:    EQU         $
         STA         0,W             < MISE A JOUR EVENTUELLE D'UNE
                                     < COORDONNEE Z/X DE M1/M2.
         ADRI        1,W             < PASSAGE A LA COORDONNEE
         JDX         E602            < SUIVANTE.
<
<
<        A F F I C H A G E   D U   S E G M E N T
<        C O U R A N T   P R O J E T E  :
<
<
E41:     EQU         $               < CAS OU LE SEGMENT COURANT EST
                                     < TOUT ENTIER DANS L'ECRAN.
         LAD         OG              < PASSAGE AU MODE GRAPHIQUE.
         SVC         0
         JNE         E450            < CAS DES CTRL-X-OFF.
         LAD         WG              < AFFICHAGE DU SEGMENT COURANT.
         SVC         0
         JNE         E450            < CAS DES CTRL-X-OFF.
E40:     EQU         $               < CAS OU LE SEGMENT COURANT EST
                                     < ENTIEREMENT A L'EXTERIEUR
                                     < DE L'ECRAN.
         PLR         A,B,X,Y
         RSR
<
< CAS DES CTRL-X-OFF : ON ABORTE LE
< DESSIN ET ON FAIT UN RETOUR A 'GE' :
<
E450:    EQU         $
         BSR         AGE             < RETOUR A 'GE'.
         JMP         E40             < ????
         PAGE
<
<
<        E X T R E M I T E   B   D U   S E G M E N T   C O U R A N T  :
<
<
<        FONCTION :
<                      FONCTION IDENTIQUE A LA PRIMITIVE 'PS' ,
<                    MAIS A LA FIN DU TRAVAIL , L'EXTREMITE DU
<                    SEGMENT COURANT DEVIENT LA NOUVELLE
<                    ORIGINE DE CELUI-CI.
<
<
PB:      EQU         $
         BSR         APS             < EXECUTION DE LA PRIMITIVE 'PS'.
<
< CHANGEMENT DE L'ORIGINE DU SEGMENT COURANT :
<
         PSR         A,B,X           < PAR PRUDENCE ...
         LAD         SEGORG
         LR          A,B             < B=@SEGORG=@RECEPTEUR.
         ADRI        SEGEXT-SEGORG,A < A=@SEGEXT=@EMETTEUR.
         LXI         DIM             < X=NBRE DE COORDONEES A DEPLACER.
         MOVE                        < CHANGEMENT D'ORIGINE.
         PLR         A,B,X
         RSR
         PAGE
         PROG        PROG8
<
<
<        E N T R Y   D U   P R O C E S S E U R   ' 3 D '  :
<
<
<        FONCTION :
<                      CETTE ENTRY EST UTILISEE LORS DES
<                    APPELS DE '3D' PAR SODOME ;
<                    ELLE INITIALISE LES BASES , ET PASSE
<                    LA MAIN AU PROGRAMME GRAPHIQUE DONT
<                    L'ADRESSE DE LANCEMENT EST DANS LE
<                    MOT0 DU CORPS DE L'ITEM COURANT
<                    (ITEM2).
<
<
         WORD        COM+128         < VALEUR INITIALE DE LA BASE C.
         WORD        BRANCH          < VALEUR INITIALE DE LA BASE W.
GRAPH:   EQU         $               < ENTRY POINT.
         LRP         K
         ADRI        -1,K
         PLR         C,W             < INITIALISATION DE C & W.
         LAD         DEMMEM
         QUIT                        < DEMANDE D'ALLOCATION 6K
                                     < MEMOIRE SANS UTILISER LA PILE K.
         LA          APILE
         LR          A,K             < INITIALISATION DE LA PILE K.
<
< INITIALISATION DE L'EN-TETE DU PROCESSEUR '3D' :
<
         LX          MODCAL,W        < X=IDENTIFICATEUR DE L'APPELANT.
         LA          &NCALL
         STA         0,W             < MISE EN PLACE DU NOM (2
                                     < CARACTERES) DE L'OVERLAY A
                                     < APPELER EN RETOUR (PRIMITVE
                                     < 'AGOGE').
         STZ         CDRET,W         < INITIALISATION DU RETOUR A 'GE'
                                     < PAR LE FILS "0".
<
< TEST DU MODE D'ENTREE :
<
         ADRI        ZERO-PGRAPH,L   < L=@LOCAL(GE) SI APPEL PAR 'GE' ,
                                     < L=PGRAPH SI APPEL PAR DEBUG (;).
         CPZR        L               < ENTRY PAR DEBUG ???
         JE          ABORT           < OUI , ON VA DONC FAIRE UN RETOUR
                                     < IMMEDIAT A 'GE'.
<
< VALIDATION DU TYPE DE L'ITEM COURANT :
<
         LXI         IINDIC-LTN*2    < INDEX OCTET DU TYPE DANS
                                     < L'EN-TETE DE L'ITEM.
         LBY         &AIC            < ACCES AU TYPE.
         CPI         "P"             < EST-CE LE TYPE 'P' ????
         JNE         ABORT           < NON , ABORT DU PROCESSEUR '3D'.
<
< INITIALISATION DE LA TRANSFORMATION COURANTE :
< (A CAUSE DE L'ALLOCATION MEMOIRE)
<
         BSR         AVIDE           < RETOUR A L'ELEMENT NEUTRE.
<
< EXECUTION DU PROGRAMME GRAPHIQUE :
<
         LXI         0               < POSITIONNEMENT SUR LE MOT0.
         BR          &AIC            < LE MOT0 DU CORPS DE L'ITEM
                                     < COURANT (ITEM2) CONTIENT
                                     < L'ADRESSE DE DEPART.
<
< ABORT POUR RESTART-DEBUG :
<
ABORT:   EQU         $
         LAI         BRANCH-ZERO
         LR          A,W             < W=@BRANCH
         LAI         2               < EN CAS DE ALT-MODE, LE RETOUR
         STA         CDRET,W         < A 'GE' SE FAIT PAR LE FILS "2".
         BSR         AGE             < PRIMITIVE RETOUR A 'GE'.
         JMP         ABORT           < ET BOUCLAGE DESSUS AU CAS OU
                                     < IL AURAIT FALLU APPELER LE
                                     < CCI POUR DEFAUT DU SGN ....
<
<
<        V A L I D A T I O N   I M P L A N T A T I O N  :
<
<
PILE:    VAL         'FF0-6          < A T T E N T I O N  !!!!!!!!
X12:     EQU         ZERO+PILE-LTNI-LTNI
X10:     VAL         X12-$
ZEROV:   EQU         ZERO+X10        < ERREUR D'ASSEMBLAGE SI ERREUR
                                     < D'2MPLANTATION.
         DZS         X10+1           < QUELLE PROPRETE !!!
TOP:     EQU         $               < SOMMET DE '3 DIM'.
         EOT         #SIP GEN PROCESSEUR#



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