NMPROC:  VAL         "GW"            < NOM DU PROCESSEUR.
DIM:     VAL         3               < POUR LE PROCESSEUR GV , LA
                                     < DIMENSION DE L'ESPACE EST
                                     < IMPLICITEMENT 3.
         IDP         "GW - RELEASE 01/06/1979"
         IDP         "JOHN F. COLONNA"
         EOT         #SIP DEFINITION CMS5#
         EOT         #SIP DEF PROCESSEUR#
         PROG
         WORD        GRAPH           < ADRESSE DE DEPART DU PROCESSEUR.
         WORD        0               < POUR FAIRE $=$+1.
PGRAPH:  EQU         $               < P DE LANCEMENT DE GRAPHIQUE2
                                     < LORS D'UN APPEL PAR !GE.
                                     < (A NOTER : P='12).
         LRP         L
         BR          -2,L            < ENTREE DANS LE PROCESSEUR.
         PAGE
         EOT         #SIP DEFINITION ITEM#
         PAGE
         EOT         #SIP IMAGE 256#
NOM:     EQU         ZERO+PILE+5-LNOM-2
IMAG:    EQU         NOM+LNOM+2      < IMAGE VIDEO.
         PAGE
<
<
<        P I L E   D E   R E C U R S I V I T E  :
<
<
<        FONCTION :
<                      CETTE PILE PERMET LA RECURSIVITE
<                    DU LANGAGE GRAPHIQUE : IMBRICATION
<                    DES APPELS DE PROGRAMMES , IMBRICATION
<                    DES BOUCLES DE REPETITIONS.
<
<
<        FORMAT :
<                      ELLE EST FAITE D'ENTREES
<                    DE DOUBLE-MOTS QUE L'ON EMPILE
<                    ET DEPILE SUIVANT LES BESOINS.
<
<
IR:      VAL         0               < MOT0 D'UNE ENTREE : CONTIENT
                                     < LA CAUSE DE L'EMPILEMENT ET
                                     < L'INDEX DE RETOUR AU DEPILEMENT.
                                     < BIT0=1 : MODE INTERACTIF DE GR ,
                                     < BIT1=1 : PUSH POUR REPETITIONS ,
                                     < BIT2=1 : PUSH POUR APPEL PROG.
                                     < BIT3=1 : PUSH POUR SAUT-PROGRAMME
CODREP:  VAL         '40             < PUSH POUR REPETITIONS.
BITREP:  VAL         1               < NUMERO DU BIT DE REPETITIONS.
CODPRO:  VAL         '20             < PUSH POUR APPEL PROGRAMME.
BITPRO:  VAL         2               < NUMERO DU BIT D'APPEL PROGRAMME.
                                     < A T T E N T I O N  : BITPRO
                                     < UTILISE AVEC BITDEF SIGNIFIE
                                     < QU'ON APPELLE UN PROGRAMME
                                     < AVEC CHANGEMENT D'ITEM COURANT.
CODDEF:  VAL         '10             < PUSH POUR DEFINITION PROGRAMME.
BITDEF:  VAL         3               < NUMERO DU BIT DE SAUT DEFINITION.
                                     < A T T E N T I O N  : BITDEF ,
                                     < UTILISE AVEC BITPRO , SIGNIFIE
                                     < Q'ON APPELLE UN PROGRAMME AVEC
                                     < CHANGEMENT DE L'ITEM COURANT.
CDCP:    VAL         1               < MOT1 D'UNE ENTREE : CONTIENT
                                     < LE COMPTE DES DO , ET LE COMPTE
                                     < ALGEBRIQUE DES PARENTHESES.
CD:      VAL         2*CDCP+0        < OCTET0(MOT1)=NBRE DE REPETITIONS
                                     < (DO) RESTANT A FAIRE (INDEX
                                     < DE TYPE OCTET).
CP:      VAL         2*CDCP+1        < OCTET1(MOT1)=COMPTE ALGEBRIQUE
                                     < DES PARENTHESES RENCONTREES
                                     < SOUS CE NIVEAU :
                                     < '(' : +1 ,
                                     < ')' : -1.
LEPR:    VAL         2               < NBRE DE MOTS OCCUPES PAR UNE
                                     < ENTREE DE LA PILE PIR.
LPR:     VAL         10              < NOMBRE D'ENTREES DE LA PILE
                                     < RECURSIVITE.
         PAGE
<
<        T R A N S F O R M A T I O N S   E L E M E N T A I R E S  :
<
TRP:     VAL         1               < ROTATION TRIGO. DE +15 DEGRE.
TRM:     VAL         2               < ROTATION ANTITRIGO DE -15 DEGRE.
TR1:     VAL         3               < ROTATION DE +PI/2.
TR3:     VAL         4               < ROTATION DE +3*PI/2 (-PI/2).
TSO:     VAL         5               < SYMETRIE PAR RAPPORT A L'ORIGINE.
TSX:     VAL         6               < SYMETRIE PAR RAPPORT A OX.
TSY:     VAL         7               < SYMETRIE PAR RAPPORT A OY.
TS1:     VAL         8               < SYMETRIE 1ERE BISSECTRICE.
TA:      VAL         9               < DESORTHOGONALISATION AIGUE.
TO:      VAL         10              < DESORTHOGONALISATION OBTUE.
TH:      VAL         11              < DESORTHOGONALISATION HAUTE.
TB:      VAL         12              < DESORTHOGONALISATION BASSE.
NT:      VAL         12              < NBRE DE TRANSFORMATIONS
                                     < ELEMENTAIRES RECONNUES.
         PAGE
<
<
<        L O C A L  :
<
<
         LOCAL       LOCGR
LOC:     EQU         $
<
<        B U F F E R S  :
<
CURSOR:  DZS         3               < RESULTAT D'UNE LECTURE GRAPHIQUE:
                                     < OCTET0=CARACTERE DE DEBLOCAGE
                                     <        DE LA VISU ,
                                     < MOT1=Y(CURSEUR GRAPHIQUE REEL) ,
                                     < MOT2=X(CURSEUR GRAPHIQUE REEL).
<
<        S E G M E N T   C O U R A N T  :
<
SEG:     DZS         4               < SEGMENT COURANT DU DESSIN.
SEGORG:  EQU         SEG             < POINT ORIGINE DU SEGMENT.
SEGEXT:  EQU         SEG+2           < POINT EXTREMITE DU SEGMENT.
<
<        C O N S T A N T E S  :
<
Y:       VAL         0               < CORRDONNEE Y D'UN POINT.
X:       VAL         1               < COORDONNEE X D'UN POINT.
WHOS:    WORD        0               < LISTE DES CONSTANTES A PUSHER/
                                     < PULLER DANS STACK.
<
< DEBUT DE LA LISTE DES CONSTANTES 'STACKABLES' :
<
CTTE:    WORD        1               < CONSTANTE DE GENERATION
                                     < GRAPHIQUE (1 INITIALEMENT).
CV:      DZS         2               < COORDONNEES Y ET X DU CURSEUR
                                     < GRAPHIQUE VIRTUEL.
DY1:     WORD        1               < PAS D'INCREMENTATION/DECRE-
                                     < MENTATION DE Y(CURSEUR VIRTUEL).
DX1:     WORD        1               < PAS D'INCREMENTATION/DECRE-
                                     < MENTATION DE X(CURSEUR VIRTUEL).
ARGF:    WORD        -1              < INDEX DE LA 1ERE PRIMITIVE
                                     < DE L'ARGUMENT FORMEL COURANT.
TRANS:   WORD        0               < MEMORISATION DES TRANSFORMATIONS
                                     < ELEMENTAIRES CONSTITUANT LA
                                     < TRANSFORMATION COURANTE PAR BITS :
                                     < BIT1 : PRESENCE DE 'RP' ,
                                     < BIT2 : PRESENCE DE 'RM' ,....
                                     < ......
                                     < BIT9 : PRESENCE DE 'S2'.
TTRANS:  DZS         NT+1/2+1        < COMPTE DES REPETITIONS DES
                                     < TRANSFORAMTIONS ELEMENTAIRES A
                                     < RAISON D'UN OCTET PAR TRANS-
                                     < FORMATION.
NSTACK:  VAL         $-WHOS-1        < NBRE DE CONSTANTES STACKABLES.
<
< FIN DE LA LISTE DES CONSTANTES 'STACKABLES' :
<
<
<        3 - C U R S E U R  :
<
X3:      VAL         0               < X(3-CURSEUR).
Y3:      VAL         1               < Y(3-CURSEUR).
Z3:      VAL         2               < Z(3-CURSEUR).
D3:      VAL         3               < EMPLACEMENT DU 1ER DELTA (DX3).
CV3:     DZS         DIM             < CONTIENT RESPECTIVEMENT :
                                     < X3,Y3,Z3,DX3,DY3,DZ3 DU 3-CURSEUR
         DO          DIM
         WORD        1               < LES PAS SONT INITIALISES A 1.
C1:      WORD        CV3+Y3,X        < RELAI INDEXE VERS LA COORDONNEE
                                     < DU 3-CURSEUR CONTENUE DANS CV+Y.
                                     < (INITIALISE SUR Y3).
C2:      WORD        CV3+X3,X        < RELAI VERS LA COORDONNEE DU
                                     < 3-CURSEUR CONTENUE DANS CV+X.
                                     < (INITIALISE SUR X3).
<
<        S A U V E G A R D E   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  :
<
SAVET:   EQU         $
         DO          DIM
         DZS         NT+1/2+1+1      < UNE ZONE PAR PLAN DE COORDONNEES.
AT:      WORD        SAVET           < ADRESSE DE LA ZONE DE SAUVEGARDE
                                     < DES TRANSFORMATIONS DANS LE
                                     < PLAN COURANT.
<
<        L O N G U E U R   D U   C O N T E X T E  :
<
LCON:    VAL         $-WHOS-1        < LONGUEUR MOTS DU CONTEXTE.
<
<        C O N S T A N T E S  :
<
RETSVC:  WORD        0               < CONDITIONS DE RETOURS DES SVC.
IEG:     WORD        0               < INDEX COURANT DU PROGRAMME
                                     < GRAPHIQUE : DONNE L'INSTRUCTION
                                     < GRAPHIQUE COURANTE , OU LA
                                     < SUIVANTE A EXECUTER (SUIVANT
                                     < L'INSTANT OU L'ON SE PLACE).
ACCEB:   WORD        LTNI            < CONSTANTE UTILISEE POUR LES
                                     < CHANGEMENTS D'ITEM , ET LE
                                     < PASSAGE D'UN ITEM A L'AUTRE :
                                     < ACCEB>0 : ITEM COURANT=ITEM1 ,
                                     < ACCEB<0 : ITEM COURANT=ITEM2.
                                     < (TRANSLATION DE TYPE MOT).
ALTNI2:  WORD        2*LTNI          < LONGUEUR MAX TOTALE D'UN
                                     < ITEM (EN-TETE+CORPS).
F3:      WORD        0               < FONCTION DE CODAGE DES <NOM>.
                                     < ET @ITEM DE RECHERCHE LORS DE
                                     < LA RECHERCHE DES PROGRAMMES.
                                     < CONTIENT AUSSI LA VARIABLE
                                     < TRANST UTILISEE LORS DES
                                     < DEPLACEMENTS DU CV.
ADXDY:   EQU         F3              < RELAI TEMPORAIRE VERS DX OU DY.
NCP:     WORD        NBCAR*NBLIG     < NBRE DE CARACTERES DANS L'ITEM.
NCALL:   WORD        $+1,X;"GE";"EI" < NOMS DES BRANCHES D'OVERLAY
                                     < DE RETOUR DE 'GR'.
AGON1:   WORD        N1              < NOEUD D'ACCES A LA PRIMITIVE
                                     < SUIVANTE LORS DE L'ANALYSE
                                     < SYNTAXIQUE DU LANGAGE.
AGON22:  WORD        N22             < NOEUD DE BRANCHEMENT LORS DE
                                     < LA RENCONTRE DE CARACTERES
                                     < HORS-LA PAGE (GET CARACTER).
KIN:     WORD        -1              < COMPTEUR DES ENTRIES DANS GR.
<
< CONSTANTES VIDEO :
<
WORKS:   WORD        0               < POUR SAUVER LE REGISTRE B
                                     < DANS 'MCVCR' LORSQUE LA PILE
                                     < K EST PLEINE...
NMPL:    WORD        CNMPL           < NBRE DE MOTS PAR LIGNE.
NLIG:    WORD        1024/RDY-1      < NBRE DE LIGNES-1 D'UNE IMAGE.
AIMAG:   WORD        IMAG            < ADRESSE DE L'IMAGE VIDEO.
ALI:     WORD        LIMAG           < LONGUEUR MOT DE L'IMAGE...
AAI:     WORD        IMAG-1,X        < RELAI DE RAZ IMAGE.
APILD:   WORD        PILD-1          < ADRESSE DE LA PILE DICHOTOMIQUE.
DICOX:   WORD        0               < X DU POINT VIDEO COURANT M.
DICOY:   WORD        0               < Y DU POINT VIDEO COURANT M.
DICOX1:  WORD        0               < X DE L'ORIGINE VIDEO COURANTE M1.
DICOY1:  WORD        0               < Y DE L'ORIGINE VIDEO COURANTE M1.
DICOX2:  WORD        0               < X EXTREMITE VIDEO COURANTE M2.
DICOY2:  WORD        0               < Y EXTREMITE VIDEO COURANTE M2.
APOINT:  WORD        POINT           < ADRESSE DE L'INSTRUCTION
                                     < SBT/RBT DE POSITIONNEMENT DES
                                     < POINTS VIDEO LORSQUE LA
                                     < BRANCHE 'V' EST RESIDENTE.
NBSEG:   WORD        0               < COMPTEUR DES SEGMENTS TRACES
                                     < SIT BIT0(NBSEG)=0.
         IF          ORDI-"T",XWOR%,,XWOR%
ASP3:    WORD        SP3             < ROUTINE DE STABILISATION
                                     < IMAGE SI :SYS (=0 SINON).
ACNSYS:  ASCI        ":SYS"
XWOR%:   VAL         0
         IF          ORDI-"S",XWOR%,,XWOR%
STABIL:  WORD        '8A01           < DEMANDE DE STABILISATION VIDEO.
         WORD        IMAG-ZERO*2
         WORD        LIMAG*2
         WORD        TVPV            < SUR LE PROCESSEUR VERT.
XWOR%:   VAL         0
ASTAB:   WORD        STAB            < STABILISATION VIDEO SI :SYS.
<
< CONSTANTES TRI-DIMENSIONNELLES :
<
ACV3:    WORD        CV3,X           < DONNE L'ADRESSE INDEXEE DE CV3.
MPROJ:   WORD        7;4;-3;3;4
<
<        F O R M A T   D E S   M A T R I C E S
<        D E   T R A N S F O R M A T I O N  :
<
DIV:     VAL         0               < MOT0 : CONTIENT UN DIVISEUR
                                     < COMMUN A TOUS LES COEFFICIENTS ;
                                     < ON PEUT DONC AINSI REPPRESENTER
                                     < LES COEFFICIENTS EN NBRE ENTIERS;
                                     < SI CE DIVISEUR EST EGAL A
                                     < L'UNITE (1) , ON PEUT LE
                                     < REMPLACER PAR 0 ....
                                     < OU TOUT NOMBRE NEGATIF , ET
                                     < PAR EXEMPLE DES RELAIS INDEXES !!!
A11:     VAL         1
A12:     VAL         2
A21:     VAL         3
A22:     VAL         4
NEUTRE:  VAL         5               < 'NEUTRE' DONNE LA PUISSANCE A
                                     < LAQUELLE IL FAUT ELEVER LA
                                     < MATRICE POUR OBTENIR L'OPERATEUR
                                     < NEUTRE (1,0,0,1).
<        ON A :
<                           (A11  A12)
<                    M=1/DIV(        )
<                           (A21  A22)
<
<        T R A N S F O R M A T I O N S   E L E M E N T A I R E S  :
<
MRP:     WORD        25;24;-7;7;24;22
MRM:     WORD        25;24;7;-7;24;22
MR1:     EQU         $
ATCOM:   WORD        TCOM-'20,X      < TABLE DES PRIMITIVES EN ACCES
                                     < DIRECT , TRANSLATEE PAR 'SPACE'.
         WORD        0;-1;1;0;4
MR3:     EQU         $
LWHOSI:  WORD        WHOS+NSTACK+1,X < REALI VERS LES CONSTANTES
                                     < STACKABLES AU 'PUSH'  IN STACK.
         WORD        0;1;-1;0;4
MSO:     EQU         $
LWHOSO:  WORD        WHOS,X          < RELAI VERS LES CONSTANTES
                                     < STACKABLES AU 'PUL'' IN STACK.
         WORD        -1;0;0;-1;2
MSX:     EQU         $
NTRANS:  WORD        TTRANS,X        < NBRE DE FOIS QUE LA TRANSFORMA-
                                     < TION ELEMENTAIRE DOIT ETRE
                                     < REPETE (UN OCTET PAR TRANS-
                                     < FORMATION).
         WORD        1;0;0;-1;2
MSY:     EQU         $
APRC:    WORD        PIR,X           < ENTREE COURANTE DANS LA PILE
                                     < DE RECURSIVITE.
         WORD        -1;0;0;1;2
MS1:     EQU         $
AI1:     WORD        ZERO+PILE-LTNI+LTN,X
                                     < RELAI VERS L'ITEM1 A PRIORI , POUR
                                     < METTRE LE TYPE 'D'.
         WORD        0;1;1;0;2
MA:      WORD        25;25;7;0;24
C1023:   WORD        1023            < NBRE DE POINTS-1 SUR UN AXE.
                                     < ET DEGRE D'IDEMPOTENCE DE MA.
MO:      WORD        25;25;-7;0;24
C1024:   WORD        1024            < NBRE DE POINTS SUR UN AXE.
                                     < ET DEGRE D'IDEMPOTENCE DE MO.
MH:      WORD        25;24;0;7;25
C100:    WORD        '100            < DEGRE D'IDEMPOTENCE DE MH ,
                                     < AINSI QUE CONSTANTE DE DECONCA-
                                     < TENATION DES PRIMITIVES DANS
                                     < L'INTERPRETEUR.
MB:      WORD        25;24;0;-7;25
CFFF:    WORD        '0FFF           < POUR RAZ DES BITS 0,1,2,3.
                                     < ET DEGRE D'IDEMPOTENCE DE 'MB'.
<
<        R E L A I   D E S   T A B L E S  :
<
AIC:     WORD        ZERO+PILE-LTNI+LTN,X
                                     < RELAI VERS L'ITEM COURANT.
AIR:     WORD        ZERO+PILE-LTNI+LTN,X
                                     < RELAI VERS L'ITEM DANS LEQUEL
                                     < ON RECHERCHE LA DEFINITION
                                     < D'UN PROGRAMME.
X1:      VAL         LEPR*LPR-LEPR   < NBRE DE MOTS DE PIR-'LEPR'.
BPR:     WORD        PIR             < BASE DE LA PILE DE RECURSIVITE.
TPR:     WORD        PIR+X1          < TOP DE LA PILE DE RECURSIVITE.
LSTACK:  VAL         16              < LONGUEUR DE 'STACK'.
ASTACK:  WORD        STACK           < RELAI POINTEUR DE 'STACK'.
ARACI:   WORD        RACB            < ADRESSE BRANCHE OVERLAY ' W'.
<
<        R E L A I   D E S   R O U T I N E S  :
<
AGOGER:  WORD        GOGER           < ADRESSE DE RETOUR SI ALT-MODE.
ASVC:    WORD        RSVC            < ROUTINE D'EXECUTION DES SVC.
AOVL:    WORD        OVL             < CHAGEMENT DES OVERLAYS.
ADIV:    WORD        DIVENT          < DIVISION ENTIERE PAR EXCES
                                     < OU PAR DEFAUT , SUIVANT LES CAS.
ACHKCV:  WORD        CHKCV           < CHECK UNE COORDONNEE DU
                                     < CURSEUR VIRTUEL.
AGTCAR:  WORD        GETCAR          < ACCES A UN CARACTERE DANS
                                     < LA RECHERCHE DES PROGRAMMES.
AGTK:    WORD        GTK             < ACCES A UN CARACTERE A CODER.
AEXE24:  WORD        EXEC24          < POUR SIMULATION INTERACTIVE
                                     < DES COMMANDES '2' ET '4'.
AEXE13:  WORD        EXEC13          < POUR SIMULATION INTERACTIVE
                                     < DES COMMANDES '1' ET '3''.
ASELDX:  WORD        SELDX           < POUR SELECTION INTERACTIVE DE DX.
ASELDY:  WORD        SELDY           < POUR SELECTION INTERACTIVE DE DY.
AMCVCR:  WORD        MCVCR           < POUR SIMULER LE DEPLACEMENT DU
                                     < CURSEUR VIRTUEL PAR LE CURSEUR
                                     < REEL EN INTERACTIF.
APRGI:   WORD        PRIMGI          < PRIMITIVE DE GET CARACTERE
                                     < EN VERSION INTERACTIVE.
ALOOPB:  WORD        LOOPB           < RETOUR DE L'INTERPRETEUR.
AE111:   WORD        E111            < RETOUR DE PRIMGI VERS PRIMG.
AGOGE:   WORD        GOGE            < RETOUR OK A 'GE' : L'ITEM
                                     < COURANT RECOIT LE TYPE 'D'.
APROJ:   WORD        PROJET          < ROUTINE DE PROJECTION PLANE.
ASPDXY:  WORD        SPDXY           < RESTAURATION DE 2 DES 3 PAS
                                     < A PARTIR DE DX ET DY.
ACHGTI:  WORD        CHGTI           < CHANGEMENT D'ITEM COURANT.
AVIDEO:  WORD        VIDEO           < MODULE DE CONVERSION DU
                                     < GRAPHIQUE EN VIDEO.
ADICO:   WORD        DICO            < ROUTINE RECURSIVE DICHOTOMIQUE.
ARETV:   WORD        RETV            < RETOUR DE LA CONVERSION VIDEO.
ASET:    WORD        SET             < ROUTINE DE MISE A 1 D'UN POINT.
<
<        D E M A N D E S   A   C M S 4  :
<
DEMBAC:  WORD        '0602           < DEMANDE DE 'LOAD SOUS :SYS' ,
                                     < AFIN DE FAIRE LE RETOUR A
                                     < L'APPELANT DE G3.
         WORD        BRANCH-ZERO*2
LOVL:    WORD        ZERO-BRANCH+PILE-LTNI-LTNI*2
                                     < LONGUEUR EN OCTETS DES BRANCHES
                                     < D'OVERLAY.
         WORD        -1
DEMSGN:  WORD        '0402           < DEMANDE AU SGN , INITIALISEE
                                     < EN STORE , AFIN DE GENERER
                                     < LORS DE !LOAD LA BRANCHE 'GR    '
         WORD        BRANCH-ZERO*2
         WORD        ZERO-BRANCH+PILE-LTNI-LTNI*2
         WORD        -1              < LA VALEUR SUIT LE NOM.
         IF          DIM-3,X100,,X100
DEMLOD:  WORD        '0602           < DEMANDE DE CHARGEMENT DES
                                     < BRANCHES D'OVERLAY DE G3.
         WORD        XWOR%A
         WORD        ZERO-BRANCH+PILE-LTNI-LTNI*2
         WORD        -1
COPY:    WORD        '0B07           < HARD-COPY.
         BYTE        '1B;'17;'8D;'1D
DEMOUT:  WORD        '0B02           < EMISSION MESSAGE.
         WORD        0
         WORD        0
DEMMEM:  WORD        '0004           < DEMANDE D'ALLOCATION 8K MOTS.
RELMEM:  WORD        '0004           < DEMANDE DE RETOUR A 4K MOTS.
         WORD        '5000           <10K MOTS='5000 OCTETS.
         WORD        '2000           < 4K MOTS='2000 OCTETS.
WG:      WORD        '0B0A           < ECRITURE GRAPHIQUE.
         WORD        SEG-ZERO*2
         WORD        8
OG:      WORD        '0B03           < OPEN GRAPHIQUE.
CU:      WORD        '0B06           < MISE EN FONCTION DU CURSEUR.
         WORD        0               < AMDEM DOIT ETRE NUL !!!
LG:      WORD        '0B09           < LECTURE DU CURSEUR GRAPHIQUE.
         WORD        CURSOR-ZERO*2
         WORD        6
CG:      WORD        '0B04           < CLOSE GRAPHQIE.
DERASE:  WORD        '0B05           < EFFACEMENT DE L'ECRAN VISU.
DEMDK:   WORD        '0C02           < ACCES DIRECT AU DISQUE DE
                                     < SWAPPING INITIALISE EN 'WRITE'.
         WORD        WHOS-ZERO+1*2   < @BUFFER=@LISTE DES CONSTANTES
                                     < STACKABLES.
         WORD        LCON*2
SAVE:    WORD        0               < ZONE DE SAUVEGARDE TEMPORAIRE ,
                                     < ET NUMERO RELATIF DU SECTEUR
                                     < A ECHANGER.
SLEEP:   WORD        '0005           < DEMANDE DE TEMPORISATION POUR
                                     < FAIRE UNE COPY.
ASAUT:   WORD        N1616           < ADRESSE DE TRAITEMENT DES
                                     < PRIMITIVES INHIBEES.
         WORD        15              < 15 SECONDES DE TEMPORISATION
                                     < POUR FAIRE UN HARD-COPY.
C5:      EQU         SLEEP           < CONSTANTE MULTIPLICATIVE 5.
DEMCCI:  EQU         MR1+3           < DEMANDE DE RETOUR AU CCI.
         PAGE
<
<        D E F I N I T I O N   D U
<        R E F E R E N T I E L   C O U R A N T  :
<
TRANST:  EQU         F3              < VALEUR TEMPORAIRE DE TRANS LORS
                                     < DES CALCULS DE CHANGEMENT DE
                                     < REFERENTIEL (CF. 1,2,3,4).
MTRANS:  WORD        $+1,X           < RELAIS VERS LES MATRICES DES
                                     < TRANSFORMATIONS ELEMENTAIRES.
ICALLI:  BYTE        4;MRP-ZERO      < L'OCTET0 CONTIENT DE PLUS LE
                                     < SEUIL D'APPELS IMPLICITES DES
                                     < PROGRAMMES POUR LES COMPTES DE
                                     < PARENTHESES.
         BYTE        MRM-ZERO;MR1-ZERO
         BYTE        MR3-ZERO;MSO-ZERO
         BYTE        MSX-ZERO;MSY-ZERO
         BYTE        MS1-ZERO;MA-ZERO
         BYTE        MO-ZERO;MH-ZERO
         BYTE        MB-ZERO;0
DV:      DZS         2               < VECTEUR DES DEPLACEMENTS EN X,Y
                                     < SUR LE REFERENTIEL LOCAL.
DVX:     EQU         DV+0            < AXE DES X.
DVY:     EQU         DV+1            < AXE DES Y.
         PAGE
<
<
<        E X E C U T I O N   D E S   S V C  :
<
<
<        ARGUMENT :
<                    A=@DEMANDE A CMS4.
<
<
<        RESULTATS :
<                    RETSVC=CONDITIONS DE RETOUR DE CMS4 ,
<                    INDICATEURS POSITIONNES EN FONCTION DES ERREURS.
<
<
         PROG
RSVC:    EQU         $
         PSR         X               < SAVE X.
         SVC         0               < ENVOI DE LA DEMANDE (A) A CMS4.
         STX         RETSVC          < SAVE LES CONDITIONS DE RETOUR.
         PLR         X               < RESTAURE X.
         RSR
         PAGE
<
<
<        D I V I S I O N   E N T I E R E  :
<
<
<        FONCTION :
<                      REALISER UNE DIVISION ENTIERE APR
<                    (DIV,W) PAR EXCES OU PAR DEFAUT
<                    SUIVANT LA NECESSITE , C'EST-A-DIRE
<                    SUIVANT LA POSITION DU DOUBLE DU
<                    RESTE PAR RAPPORT A (DIV,W).
<
<
<        ARGUMENT :
<                    B=DIVIDENDE ,
<                    W=@MATRICE DE TRANSFORMATION.
<
<
<        RESULTAT :
<                    B=QUOTIENT.
<
<
DIVENT:  EQU         $
         LR          B,A
         SARD        16              < ON MET LE DIVIDENDE SUR 32 BITS.
         DV          DIV,W           < EXECUTION DE LA DIVISION.
         ADR         B,B             < ON DOUBLE LE RESTE , SOIT 2*R.
         XR          A,B             < ON MET LE QUOTIENT DANS B.
                                     < (ET 2*R DANS A).
         JAGE        E70             < OK , ON : 2*R>=0.
         NGR         A,A             < SINON , ON LE REND POSITIF.
E70:     EQU         $
         CP          DIV,W           < TESTE DE LA POSITION DE 2*R
                                     < PAR RAPPORT AU DIVISEUR (DIV,W).
         JL          E45             < DANS LE CAS OU 2*R<DIVISEUR ,
                                     < ON FAIT UNE DIVISION PAR DEFAUT.
         CPZR        B               < TEST DU SIGNE DU QUOTIENT.
         JGE         E320            < QUOTIENT>=0 : ON FAIT B<--(B)+1.
         ADRI        -2,B            < QUOTIENT<0 : ON FAIT B<--(B)-1.
E320:    EQU         $
         ADRI        1,B             < DANS LE CAS OU 2*R>=DIVISEUR ,
                                     < ON FAIT UNE DIVISION PAR EXCES.
E45:     EQU         $
         RSR
         PAGE
<
<
<        C H E C K   C U R S E U R   V I R T U E L  :
<
<
<        FONCTION :
<                      CETTE ROUTINE TESTE LES OVERSCREEN
<                    DU CURSEUR VIRTUEL . S'IL APPARAIT
<                    UNE SORTIE DE L'ECRAN , ELLE LE
<                    FAIT REAPPARAITRE EN PASSANT PAR
<                    SON INFINI.
<
<
<        ARGUMENT :
<                    A=COORDONNEE X OU Y DU CURSEUR VIRTUEL.
<
<
<        RESULTAT :
<                    A=COORDONNEE X OU Y DU CURSEUR VIRTUEL.
<
<
CHKCV:   EQU         $
         JAL         E46             < LA COORDONNEE EST NEGATIVE.
         CP          C1024
         JGE         E47             < LA COORDONNEE EST TROP GRANDE.
<
< CAS OU LA COORDONNEE EST OK :
<
E48:     EQU         $
         RSR
<
< CAS D'OVERSCREEN :
<
E46:     EQU         $
         AD          C1024           < PASSAGE APR MOINS L'INFINI ..
         JMP         E48
E47:     EQU         $
         SB          C1024           < PASSAGE PAR PLUS L'INFINI ...
         JMP         E48
         PAGE
<
<
<        S O R T I E S   D E   G R A P H I Q U E 2  :
<
<
<        R E T O U R   A U   C C I  :
<
<
GOCCI:   EQU         $
<        ON A ICI :
<                    Y=CARACTERE COURANT NON RECONNU , ET
<                      D'INDEX (IEG)-1.
<                      (EN CAS D'EREUR DU PROGRAMME !!!)
<
< TRONC COMMUN CCI,!GE,ERREUR :
<
E10:     EQU         $
         LAD         DEMCCI
E11:     EQU         $               < ENTRY 'ERASE'.
         BSR         ASVC            < RETOUR AU CCI DE CMS4.
                                     < (OU EFFACEMENT ECRAN....)
<
< CAS D'UN RETOUR PAR !GO :
<
         LAD         OG
E965:    EQU         $               < ENTRY MAKE-COPY.
         BSR         ASVC            < RE-MISE EN GRAPHIQUE DE LA VISU.
         RSR                         < RETOUR A L'INTERPRETEUR ; A
                                     < NOTER QUE X EST POSITIONNE ...
<
<
<        R E T O U R   A   L ' A P P E L A N T   ( G E , E I )  :
<
<
<        CONDITIONS DE RETOUR :
<        (POUR LES APPELS PAR 'EI'/'GO')
<                    CDRET=0 : DESSIN AFFICHE ENTIEREMENT ,
<                    CDRET=2 : DESSIN ABORTE PAR CTRL-X-OFF.
<
<
GOGE:    EQU         $
<
< MAJ DU TYPE DE L'ITEM :
<
         LXI         IINDIC-LTN*2    < INDEX D'OCTET !!!
         LAI         "D"             < TYPE 'DESSIN'.
         STBY        &AI1            < (POUR L'ITEM1 !!!).
<
<        R E T O U R   E N   E R R E U R   A
<        L ' A P P E L A N T  :
<
GOGER:   EQU         $
         LAD         RELMEM
         SVC         0               < RETOUR A 4K MOTS.
         LX          RETSVC          < X=CONDITIONS DE RETOUR DU
                                     < SVC PRECEDENT.
<
< TRANSMISSION DES ARGUMENTS :
<
         LAI         BRANCH-ZERO
         LR          A,W             < REINITIALISATION DE W=@BRANCH.
         LA          MODCAL,W        < A=0 SI 'GE' , A=1 SI 'EI'.
         ADR         A,A             < A=0 SI 'GE' , A=2 SI 'EI'.
         ANDR        X,A             < A=0 , SI RETOUR PRECEDENT OK ,
                                     < A=2 SI RETOUR CTRL-X-OFF.
         STA         CDRET,W         < RENVOI DES CONDITIONS DE RETOUR.
         LX          MODCAL,W        < X=IDENTIFICATEUR DE L'APPELANT :
                                     < X=0 : APPEL PAR !GE ,
                                     <  =1 : APPEL PAR 'EI'.
         STZ         MODCAL,W        < REINITIALISATION DE MODCAL.
         LA          &NCALL          < RECUPERATION DU NOM DE LA
                                     < BRANCHE D'OVERLAY DE RETOUR,
                                     < QUI EST D'AILLEURS CELLE D'APPEL.
GOB:     EQU         $
         STA         0,W             < LE NOM DE LA BRANCHE D'OVERLAY
                                     < A APPELER EST 'GE'/'EI'.
<
< RETOUR A L'APPELANT :
<
         LAD         CG
         BSR         ASVC            < RETOUR EN ALPHA-NUMERIQUE DE
                                     < LA VISU.
         LAD         DEMBAC          < A=@DEMBAC.
<        A NOTER :
<                    (C)#0 : AINSI , SI LE PROCESSEUR 'EI' REPREND
<                            LA MAIN , IL NE CONFOND PAS CETTE
<                            ENTRY AVEC UNE GENERATION DE 'GO'.
         BSR         AOVL            < TENTATIVE DE CHARGEMENT DE LA
                                     < BRANCHE D'OVERLAY !GE.
<
< RETOUR EN ERREUR : ON SAIT QUE
< SI L'ON REVIENT ICI , C'EST QUE
< LE CHARGEMENT DE !GE N'A PU SE
< REALISER CORRECTEMENT , ON VA
< DONC REDONNER LA MAIN AU CCI , CAR
< CERATINEMENT !SGN MANQUE :
<
         JMP         E10             < VERS LE CCI.
<
<
<        E R R E U R S   A   L ' E X E C U T I O N
<        D U   P R O G R A M M E   G R A P H I Q U E  :
<
<
ERREUR:  EQU         GOCCI
         PAGE
<
<
<        T R A I T E M E N T   D E S   E R R E U R S
<                    D ' E X E C U T I O N  :
<
<
<        FONCTION :
<                      CETTE ROUTINE MET SI CELA EST
<                    POSSIBLE LE CARACTERE COURANT
<                    AIC(IEG) EN POSITION HAUTE PAR
<                    POSITIONNEMENT DE SONT BIT0 A 1.
<
<
<        RETOUR TOUJOURS EN ERREUR.
<
<
CARUP:   EQU         $
         LA          IEG             < ACCES A L'INDEX COURANT.
                                     < D'EXECUTION.
         LR          A,X             < NOTER : X=(IEG)#0 !!!
         CP          NCP             < EST-IL HORS-LA PAGE ???
         JGE         E510            < OUI , ON NE FAIT RIEN.
         ADRI        -1,X            < SINON : X=INDEX DU CARACTERE
                                     < EN ERREUR (IEG-1).
         LBY         &AIC            < ACCES AU CARACTERE COURANT.
         ORI         '80             < POSITIONNEMENT DE SON BIT0.
         STBY        &AIC            < ET REMISE DANS L'ITEM COURANT.
E510:    EQU         $
         RSR                         < RETOUR INDIFFERENT CAR APPELE
                                     < PAR UNE PRIMITIVE 'PCS'.
         PAGE
<
<
<        E F F A C E M E N T   E C R A N  :
<
<
ERASE:   EQU         $
         LX          ALI
ERAS1:   EQU         $
         STZ         &AAI            < EFFACEMENT VIDEO.
         JDX         ERAS1
         LAD         DERASE
         JMP         E11             < VERS L'EFFACEMENT DE L'ECRAN ,
                                     < PUIS LE RETOUR EN GRAPHIQUE.
         PAGE
<
<
<        M A K E   C O P Y  :
<
<
<        FONCTION :
<                      LA COMMANDE 'H' PERMET DE FAIRE
<                    UN HARD-COPY AVEC SA TEMPORISATION.
<
<
HCOPY:   EQU         $
         LAD         COPY
         BSR         ASVC            < ENVOI DE LA COMMANDE HARD-COPY.
         LAD         SLEEP
         JMP         E965            < VERS LA TEMPORISATION DE 1K
                                     < SECONDES.
         PAGE
<
<
<        M O D I F I C A T I O N   D E   L A   C O N S T A N T E
<        D E   G E N E R A T I O N   G R A P H I Q U E  :
<
<
<        ARGUMENT :
<                    SAVE=NOUVELLE VALEUR DE LA CONSTANTE.
<
<
<        RESULTAT :
<                    CTTE=(SAVE) ,
<                    X INDIFFERENT.
<
<
SCTTE:   EQU         $
         LA          SAVE            < RECUPERATION DE LA NOUVELLE
                                     < VALEUR A DONNER A CTTE.
         STA         CTTE            < MAJ DE CTTE.
         RSR                         < RETOUR INDIFFERENT (QUELQUE
                                     < SOIT X).
         PAGE
<
<
<        C H O I X   D E   L ' A F F I C H A G E
<        N O I R / B L A N C   E N   V I D E O  :
<
<
<        ARGUMENT :
<                    B='40 : DEMANDE D'AFFICHAGE EN BLANC ; ON
<                            VA POSITIONNER UN SBT 0,X ;
<                    B='00 : DEMANDE DE CHANGEMENT DE
<                            'COULEUR' : ON PASSE AU BLANC
<                            S'IL Y AVAIT DU NOIR ET INVERSE-
<                            MENT ; UN SBT DEVIENT UN RBT ,
<                            ET UN RBT DEVIENT UN SBT ....
<
<
COLOR:   EQU         $               < C'EST UN BIEN GRAND MOT !!!
         LA          &APOINT         < ACCES INSTRUCTION COURANTE.
         ORR         B,A
         IBT         9+16            < INVERSION DE L'ARGUMENT (B).
         EORR        B,A
         STA         &APOINT         < MAJ INSTRUCTION COURANTE.
         RSR
         PAGE
<
<
<        C O N S T R U C T I O N   D U
<        S E G M E N T   C O U R A N T  :
<
<
<        O R I G I N E  :
<
<
<        FONCTION :
<                      APPELE PAR 'A' , CE MODULE
<                    MET L'ORIGINE DU SEGMENT COURANT
<                    (SEGORG) A L'EMPLACEMENT COURANT
<                    DU CURSEUR VIRTUEL.
<
<
<        ARGUMENT :
<                    B=4 (=COMPTE D'OCTETS DU WG).
<
<
EXECA:   EQU         $
         STB         WG+2            < COMPTE D'OCTETS DU WG.
         LAI         SEGORG-ZERO*2
         STA         WG+1            < AFIN D'ENVOYER LES COORDONNEES
                                     < DE L'ORIGINE DU SEGMENT.
         BSR         APROJ           < PROJECTION DE L'ESPACE (X3,Y3,Z3)
                                     < SUR LE PLAN (X3,Y3).
         STY         SEGORG+Y        < Y(ORIGINE SEGMENT COURANT).
         STX         SEGORG+X        < X(ORIGINE SEGMENT COURANT).
         JMP         E841            < VERS L'OPEN GRAPHIQUE , ET
                                     < L'ENVOI DES COORDONNEES DE
                                     < L'ORIGINE ; A NOTER : B=4#0 !!!
<
<
<        E X T R E M I T E  :
<
<
<        FONCTION :
<                      CE MODULE EST APPELE PAR 'B' OU
<                    'S' . IL FIXE L'EXTREMITE DU SEGMENT
<                    COURANT A L'EMPLACEMENT DU CURSEUR
<                    VIRTUEL COURANT . ENSUITE IL AFFICHE
<                    SUR L'ECRAN CE SEGMENT COURANT ;
<                    ET ENFIN , POUR :
<                    'B' : L'EXTREMITE DU SEGMENT DEVIENT
<                          L'ORIGINE COURANTE ,
<                    'S' : L'ORIGINE COURANTE RESTE TELLE
<                          QUEL (C'EST LE MODE TRAVAIL
<                          EN ETOILE , PAR OPPOSITION DU
<                          MODE SEQUENTIEL DE 'B').
<
<
<        ARGUMENT :
<                    B=4 : MODE SEQUENTIEL ('B') ,
<                    B=8 : MODE ETOILE ('S').
<
<
<        RESULTAT :
<                    RETOUR A 'GE' IMMEDIAT SI CTRL-X-OFF !!!
<
<
EXECB:   EQU         $
EXECS:   EQU         $
         BR          AVIDEO          < VERS LA CONVERSION EN VIDEO.
RETV:    EQU         $               < RETOUR DE LA CONVERSION VIDEO.
         CPZR        B
         JE          E840            < CAS DE 'B' , PAS DE 'OG' , AFIN
                                     < DE CHAINER SUR LE POINT ENVOYE
                                     < PRECEDEMMENT.
E841:    EQU         $               < ENTRY 'A' OU 'S'.
         LAD         OG              < ENVOI D'UN 'GS'.
         BSR         ASVC            < POUR EVITER DES CHAINAGES DE
                                     < SEGMENTS DE TYPE A-->B ,
                                     < REALISES AUTOMATIQUEMENT PAR
                                     < LA VISU.
         JNE         E21             < ABORT POUR ERREURS (CTRL-X-OFF??)
E840:    EQU         $               < ENTRY 'B'.
         LAD         WG
E960:    EQU         $               < ENTRY 'EDITION DE MESSAGE'.
         BSR         ASVC            < ENVOI DE LA DEMANDE D'ECRITURE
                                     < GRAPHIQUE.
         JNE         E21             < ABORT POUR ERREURS (CTRL-X-OFF??)
<
< DISCRIMINATION DU MODE D'APPEL :
<
         CPZR        B
         JNE         E20             < CAS DU MODE 'S' (ET DE 'A' ,
                                     < POUR LEQUEL L'ORIGINE A DEJA ETE
                                     < MODIFIEE).
<
< MODE 'B' SEQUENTIEL :
<
E600:    EQU         $               < ENTRY 'A'.
         STY         SEGORG+Y        < Y(ORIGINE SEGMENT COURANT).
         STX         SEGORG+X        < X(ORIGINE SEGMENT COURANT).
<
< RETOUR OK :
<
E20:     EQU         $
<
< SORTIE DE LA ROUTINE :
<
E22:     EQU         $
         RSR
<
< SORTIE EN ERREUR :
<
E21:     EQU         $
         ADRI        -1,K            < RATTRAPGE DU RSR QUE L'ON SAUTE.
         BR          AGOGE           < VERS UN RETOUR OK A GE : L'
                                     < ITEM COURANT RECOIT LE TYPE 'D'.
         PAGE
<
<
<        P L A N   D E   P R O J E C T I O N  :
<
<
<        FONCTION :
<                      CETTE ROUTINE SELECTIONNE LE
<                    PLAN DE PROJECTION ET DE TRAVAIL
<                    CHOISIT PARMI LES 3 POSSIBLES :
<                    1- (X3,Y3)
<                    2- (Y3,Z3) ,
<                    3- (Z3,X3).
<                      LE 1ER AXE NOMME PEUT ETRE
<                    PARCOURU A L'AIDE DES COMMANDES
<                    '1' ET '3' , ALORS QUE LE 2EME
<                    PEUT L'ETRE A L'AIDE DE '2' ET '4'.
<                      POUR CE FAIRE , ELLE MEMORISE
<                    LA CONNEXION EXISTANT APRES LE
<                    CHOIX , ENTRE LES COORDONNEES X ET Y
<                    DU CURSEUR VIRTUEL , ET 2 DES 3
<                    COORDONNEES DU 3-CURSEUR CHOISIES
<                    PARMI (Y3,X3) , (Z3,Y3) , (X3,Z3).
<                      DE PLUS ELLE SAVE/RESTORE LES
<                    PAS SUR LES AXES ASSOCIES.
<
<
<        ARGUMENT :
<                    B=4 : CHOIX DE (X3,Y3) ,
<                     =9 : CHOIX DE (Y3,Z3) ,
<                     =2 : CHOIX DE (Z3,X3).
<
<
<        RESULTAT :
<                    RETOUR INDIFFERENT.
<
<
CHPLAN:  EQU         $
<
< SAUVEGARDE DE LA TRANSFORMATION COURANTE :
<
         PSR         B
         LAD         TRANS           < A=@EMETTEUR=@TRANSFORMATION
                                     < COURANTE.
         LB          AT              < B=@ZONE DE SAUVEGARDE RELATIVE
                                     < AU PLAN COURANT.
         LXI         NT+1/2+1+1      < X=NBRE DE MOTS A DEPLACER.
         MOVE                        < SAUVEGARDE.
         PLR         B
<
< SAUVEGARDE DU DX ET DY COURANT :
<
         BSR         ASPDXY
<
< CHANGEMENT DE PLAN :
<
         LR          B,A             < RECUPERATION DE L'ARGUMENT.
         SLRS        2               < A=NUMERO DE LA COORDONNEE DU
                                     < 3-CURSEUR CONTENUE DANS CV+Y.
         AD          ACV3
         STA         C1              < MISE EN PLACE DU RELAI D'ACCES
                                     < A LA COORDONNEE DU 3 CURSEUR
                                     < CONTENUE DANS CV+Y.
         LR          B,A             < RE-RECUPERATION DE L'ARGUMENT.
         ANDI        '03             < A=NUMERO DE LA COORDONNEE DU
                                     < 3-CURSEUR CONTENUE DANS CV+X.
         LR          A,Y             < Y=NUMERO DU PLAN SELECTIONNE :
                                     < Y=0 : Q1 ,
                                     < Y=1 : Q2 ,
                                     < Y=2 : Q3.
         AD          ACV3
         STA         C2              < MISE EN PLACE DU RELAI D'ACCES
                                     < A LA COORDONNEE DU 3-CURSEUR
                                     < CONTENUE DANS CV+X.
<
< INITIALISATIONS DES PAS DU CV :
< (A NOTER QU'ON A :
<        X=D3).
<
         LA          &C1
         STA         DY1             < NOUVEAU PAS DY.
         LA          &C2
         STA         DX1             < NOUVEAU PAS DX.
<
< RESTAURATION DE LA TRANSSFORMATION COURANTE
< RELATIVE AU PLAN (Y) :
<
         LBI         TRANS-ZERO      < B=@RECEPTEUR=@TRANSFORMATION
                                     < COURANTE.
         LAD         SAVET           < A=@ZONE DE SAUVEGARDE DES
                                     < 3 PLANS.
E700:    EQU         $
         CPZR        Y               < TEST SUR LE NUMERO DU PLAN.
         JE          E701            < OK , A CONTIENT L'ADRESSE
                                     < DE LA ZONE DE SAUVEGARDE
                                     < DU PLAN (Y).
         ADRI        NT+1/2+1+1,A    < SINON , PROGRESSION DE L'ADRESSE
                                     < DANS LA ZONE DE SAUVEGARDE.
         ADRI        -1,Y            < DECREMENTATION DU NUMERO DU PLAN.
         JMP         E700
E701:    EQU         $
         STA         AT              < SAVE L'@ DE LA ZONE DE SAUVE-
                                     < GARDE DU PLAN (Y).
                                     < A=@EMETTEUR ....
         LXI         NT+1/2+1+1      < X=NBRE DE MOTS A DEPLACER.
         MOVE                        < RESTAURATION DE LA TRANSFOR-
                                     < MATION COURANTE , ANOTER X=0 !!!!!
<
< MISE EN PLACE DES COORDONNEES DU CV :
< (ON A :
<        X=0)
<
         LA          &C1
         STA         CV+Y            < NOUVELLE COORDONNEE Y DU CV.
         LA          &C2
         STA         CV+X            < NOUVELLE COORDONNEE X DU CV.
         RSR                         < RETOUR EN ERREUR.
<
<
<        R E S T A U R A T I O N   D E   2   D E S   3   P A S  :
<
<
<        FONCTION :
<                      RESTAURE 2 DES 3 PAS DES AXES (X,Y,Z)
<                    A PARTIR DE DX,DY.
<
<
<        RESULTAT :
<                    X=D3.
<
<
SPDXY:   EQU         $
         LXI         D3              < X=INDEX D'ACCES A LA ZONE DES
                                     < PAS DX3,DY3,DZ3 DANS CV3.
         LA          DY1
         STA         &C1             < SAUVEGARDE DE DY.
         LA          DX1
         STA         &C2             < SAUVEGARDE DE DX.
         RSR
         PAGE
<
<
<        M O D I F I C A T I O N   D E
<        D X   E T / O U   D Y  :
<
<
<        S E L E C T I O N   D X   O U   D Y  :
<
<
<        FONCTION :
<                      METTRE DANS ADXDY L'ADRESSE
<                    DE DX OU CELLE DE DY.
<
<
<        RETOUR TOUJOURS EN ERREUR.
<
<
SELDX:   EQU         $
         LAD         DX1             < A=@DX.
         JMP         E26
SELDY:   EQU         $
         LAD         DY1             < A=@DY.
E26:     EQU         $
         STA         ADXDY           < MISE EN PLACE DU RELAI
                                     < TEMPORAIRE VERS DX OU DY.
<
< SORTIE TOUJOURS EN ERREUR DE 'SEL' ET 'EXEC' :
<
E520:    EQU         $
         LXI         1
         RSR                         < RETOUR EN ERREUR : X#0.
<
<
<        M O D I F I C A T I O N   D E   D X   O U   D Y  :
<
<
<        FONCTION :
<                      CES ROUTINES MODIFIENT LES VALEURS
<                    COURANTES DU D (DX OU DY) DONT
<                    L'ADRESSE EST DANS ADXDY.
<                    PAR LA SUITE LE 'D' SERA APPELE
<                    DELTA , LA CONSTANTE DONNEE EVENTUELLEMENT
<                    EN ARGUMENT SERA ALPHA , ET LA
<                    CONSTANTE COURANTE SERA CTTE.
<
<
<        RESULTAT :
<                      LE RETOUR EST TOUJOURS EN ERREUR.
<
<
<        D E L T A <---- ( D E L T A ) + C T T E  :
<
<
EXECP:   EQU         $
         LA          &ADXDY          < A=DELTA COURANT.
         AD          CTTE            < A=(DELTA)+CTTE.
         JMP         E23             < VERS LA VAILDATION.
<
<
<        D E L T A <---- ( D E L T A ) - C T T E  :
<
<
EXECM:   EQU         $
         LA          &ADXDY          < A=DELTA COURANT.
         SB          CTTE            < A=(DELTA)-CTTE.
         JMP         E23             < VERS LA VALIDATION.
<
<
<        D E L T A <---- C T T E * A L P H A  :
<
<
EXECK:   EQU         $
         LA          SAVE            < RECUPERATION DE LA CONSTANTE
                                     < DONNEE EN ARGUMENT (ALPHA)
                                     < DANS A A PARTIR DE (SAVE).
E24:     EQU         $               < ENTRY POUR EXECMU.
         MP          CTTE
         LR          B,A             < B=CTTE*(A PRECEDENT).
         JMP         E23             < VERS LA VALIDATION.
<
<
<        D E L T A <---- ( D E L T A ) * C T T E  :
<
<
EXECMU:  EQU         $
         LA          &ADXDY          < A=DELTA COURANT.
         JMP         E24             < VERS LA MULTIPLICATION PAR CTTE.
<
<
<        D E L T A <---- ( D E L T A ) / C T T E  :
<
<
EXECD:   EQU         $
         LAI         0               < INITIALISATION DE A.
         LB          &ADXDY          < B=DELTA COURANT.
         DV          CTTE            < DIVISION PAR CTTE ; A
                                     < CONTIENT LE NOUVEAU DELTA
                                     < (QUOTIENT).
<
< VALIDATION DU NOUVEAU DELTA (A) :
<
E23:     EQU         $
         JALE        E27             < CAS (A)<=0.
         CP          C1023
         JG          E28             < CAS (A)>=1024.
<
< MODIFICATION DU DELTA COURANT :
<
E29:     EQU         $
         STA         &ADXDY
         JMP         E520            < VERS UN RETOUR EN ERREUR.
<
< CAS DES OVERSCREEN :
<
E27:     EQU         $               < (A)<=0.
         AD          C1023           < PASSAGE PAR L'INFINI ....
         JMP         E23             < VERS LA REVALIDATION DU DELTA ...
E28:     EQU         $               < (A)>=1024.
         SB          C1023           < PASSAGE PAR MOINS L'INFINI.
         JMP         E23             < VERS LA REVALIDATION DU DELTA ...
         PAGE
<
<
<        D E P L A C E M E N T   D U   C U R S E U R
<                    V I R T U E L  :
<
<
<        PHILOSOPHIE :
<                      ON DISPOSE A L'EMPLACEMENT COURANT
<                    DU CURSEUR VIRTUEL D'UN REFERENTIEL
<                    LOCAL L(OX,OY) . LES DEPLACEMENTS DE TYPE
<                    '1','2','3','4' SONT ECRITS DANS
<                    L(OX,OY) . LE DEPLACEMENT REEL DU
<                    CURSEUR VIRTUEL RESULTANT , EST CALCULE
<                    A L'AIDE DE LA MATRICE DE TRANSFORMATION
<                    COURANTE 'T' , COMPOSEE PAR UN
<                    PRODUIT DE TRANSFORMATIONS ELEMENTAIRES :
<                    A(OX,OY)=T*L(OX,OY) , SOIT POUR
<                    LE CURSEUR VIRTUEL :
<                    A(DX,DY)=T*L(DX,DY) , CELUI-CI
<                    SE TROUVANT DEPLACER DU VECTEUR A(DX,DY).
<                    (ON A : DV=L(DX,DY)).
<
<
<        ARGUMENT :
<                    B=0 : DEPLACEMENTS '1' ET '2' ,
<                     =1#0 : DEPLACEMENTS '3' ET '4'.
<
<
<        RESULTAT :
<                    RETOUR INDIFFERENT.
<
<
<        D E P L A C E M E N T S   ' 1 '   E T   ' 3 '  :
<
<
EXEC13:  EQU         $
         LA          DX1
         LYI         0
         JMP         E50             < VERS LE CALCUL DE DV.
<
<
<        D E P L A C E M E N T S   ' 2 '   E T   ' 4 '  :
<
<
EXEC24:  EQU         $
         LAI         0
         LY          DY1
<
< TRONC COMMUN A TOUS LES DEPLACEMENTS :
<
<        ON A ICI :
<                    (A,Y)=DV INITIAL ; UNE DES
<                          2 COORDONNEES EST NULLE ,
<                          PUISQU'ON SE DEPLACE SUR L'UN
<                          DES AXES LOCAUX.
E50:     EQU         $
         CPZR        B               < TEST SUR L'INVERSION DU VECTEUR
                                     < (A,Y) INITIAL.
         JE          E51             < PAS D'INVERSION : CAS 1 ET 2.
         NGR         A,A             < CAS 3 ET 4.
         NGR         Y,Y             < CAS 3 ET 4.
<
< INITIALISATION DU VECTEUR DV :
<
E51:     EQU         $
         STA         DVX
         STY         DVY
<
< CALCUL DU PRODUIT MATRICIEL T*DV :
<
         LA          TRANS           < INDICATEUR DE PRESENCE DES
                                     < DIFFERENTES TRANSFORMATIONS
                                     < ELEMENTAIRES.
E41:     EQU         $
         JAE         E40             < LA TRANSFORMATION 'T' EST
                                     < L'ELEMENT NEUTRE , OU A ETE
                                     < ENTIEREMENT CALCULEE.
<
< RECUPERATION D'UNE TRANSFORMATION ELEMENTAIRE :
<
         DBT                         < X=TRANSFORMATION A EXECUTER.
         RBT         0,X             < MEMORISATION DE SON EXECUTION.
         STA         TRANST          < SAVE L'INDICATEUR DE PRESENCE
                                     < DES TRANSFORMATIONS ELEMENTAIRES.
<
< EXECUTION DE LA TRANSFORMATION
< ELEMENTAIRE DE NUMERO (X) :
<
         LBY         &MTRANS
         LR          A,W             < W=@DE LA MATRICE DE LA
                                     < TRANSFORMATION (X).
         LBY         &NTRANS
         LR          A,X             < X=NBRE DE FOIS QUE CETTE
                                     < TRANSFORMATION DOIT ETRE
                                     < ITEREE.
<
< BOUCLE D'ITERATION D'UNE TRANSFORMATION ELEMENTAIRE :
<
E42:     EQU         $
         LA          A11,W
         MP          DVX             < B=A11*DVX.
         LR          B,Y             < Y=A11*DVX.
         LA          A12,W
         MP          DVY             < B=A12*DVY.
         ADR         B,Y             < Y=A11*DVX+A12*DVY.
         LA          A21,W
         MP          DVX             < B=A21*DVX.
         PSR         B               < SAVE A21*DVX.
         LA          A22,W
         MP          DVY             < B=A22*DVY.
         PLR         A               < A=A21*DVX.
         ADR         A,B             < B=A21*DVX+A22*DVY.
         CPZ         DIV,W           < Y-A-T'IL UN DIVISEUR COMMUN
                                     < DIFFERENT DE 1 ???
         JLE         E44             < NON , RIEN A FAIRE.
         BSR         ADIV            < B=(A21*DVX+A22*DVY)/DIV.
         XR          Y,B             < Y=(A21*DVX+A22*DVY)/DIV ,
                                     < B=A11*DVX+A12*DVY.
         BSR         ADIV            < B=(A11*DVX+A12*DVY)/DIV.
         XR          Y,B             < Y=NOUVEAU DVX , ET B=NOUVEAU DVY.
<
< MISE A JOUR ITERATIVE DE DV :
<
E44:     EQU         $
         STY         DVX             < DVX=(A11*DVX+A12*DVY)/DIV.
         STB         DVY             < DVY=(A21*DVX+A22*DVY)/DIV.
         JDX         E42             < ITERATION EVENTUELLE DE LA
                                     < TRANSFORMATION ELEMENTAIRE
                                     < COURANTE.
         LA          TRANST          < RESTAURE L'INDICATEUR DES
                                     < TRANSFORMATIONS ELEMNTAIRES
                                     < PRESENTES.
         JMP         E41             < VERS L'EXECUTION DE LA SUIVANTE
                                     < EVENTUELLE.
<
< FIN DU CALCUL DE DV :
<
E40:     EQU         $
         LXI         0               < INDEX D'ACCES AU 3-CURSEUR.
<
< DEPLACEMENT DU CURSEUR VIRTUEL :
< (X,Y)<--(X,Y)+(DVX,DVY).
<
         LA          CV+X            < A=X(CURSEUR VIRTUEL).
         AD          DVX             < X<--(X)+(DVX).
         BSR         ACHKCV          < VALIDATION DU NOUVEAU X(CURSEUR
                                     < VIRTUEL).
         STA         CV+X            < X(CURSEUR VIRTUEL).
         IF          DIM-3,X100,,X100
         STA         &C2             < MAJ DU 3-CURSEUR FONCTION
                                     < DU PLAN DANS LE QUEL ON SE TROUVE
X100:    VAL         0
         LA          CV+Y            < A=Y(CURSEUR VIRTUEL).
         AD          DVY             < Y<--(Y)+(DVY).
         BSR         ACHKCV          < VALIDATION DU NOUVEAU Y(CURSEUR
                                     < VIRTUEL).
         STA         CV+Y            < Y(CURSEUR VIRTUEL).
         IF          DIM-3,X100,,X100
         STA         &C1             < MAJ DU 3-CURSEUR FONCTION DU
                                     < PLAN DANS LE QUEL ON SE TROUVE.
X100:    VAL         0
         RSR                         < RETOUR INDIFFERENT.
<
<
<        M I S E   A   L ' O R I G I N E  :
<
<
ORIGIN:  EQU         $
         STZ         CV+X            < LE CURSEUR VIRTUEL EST MIS
         STZ         CV+Y            < A L'ORIGINE DE L'ECRAN (0,0).
         STZ         &C1             < RAZ D'UNE PARTIE DU 3-CURSEUR.
         STZ         &C2             < RAZ D'UNE PARTIE DU 3-CURSEUR.
         RSR                         < RETOUR INDIFFERENT.
         PAGE
<
<
<        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  :
<
<
<        I N I T I A L I S A T I O N  :
<
<
<        FONCTION :
<                      CETTE ROUTINE REINITIALISE LA
<                    TRANSFORMATION COURANTE.
<                                    T=O (ELEMENT NEUTRE).
<
<
<        RESULTAT :
<                    X=0 (RETOUR OK).
<
<
ITRANS:  EQU         $
         STZ         TRANS           < RAZ LA PRESENCE DE TOUTES LES
                                     < TRANSFORMATIONS ELEMENTAIRES.
<
< RAZ DE LA TABLE DES COMPTES DE PRESENCE :
<
         LXI         NT              < X=NBRE DE TRANSFORMATIONS
                                     < ELEMENTAIRES RECONNUES.
         LAI         0
E60:     EQU         $
         STBY        &NTRANS         < RAZ DU NBRE D'OCCURENCE DE LA
                                     < TRANSFORMATION (X).
         JDX         E60
         RSR                         < RETOUR AVEC X=0 (OK).
<
<
<        M A J   T R A N S F O R M A T I O N   C O U R A N T E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE EFFECTUE LE
<                    PRODUIT FONCTIONNEL DE LA TRANSFORMATION
<                    COURANTE 'T' , AVEC LA TRANSFORMATION
<                    ELEMENTAIRE T(B) DONNEE EN ARGUMENT :
<                                    T=T*T(B).
<
<
<        NOTA :
<                      POUR SUPPRIMER UNE TRANSFORMATION
<                    ELEMENTAIRE , IL SUFFIT DE MULTIPLIER
<                    'T' PAR SON INVERSE :
<                                    RP-1=RM ,
<                                    RM-1=RP ,
<                                    R1-1=R3 ,
<                                    R3-1=R1 ,
<                                    SO-1=SO ,
<                                    SX-1=SX ,
<                                    SY-1=SY ,
<                                    S1-1=S1 ,
<                      ON REMARQUERA DE PLUS LES RELATIONS :
<                                    SX=SO*SY ,
<                                    SY=SO*SX ,
<                                    S1=SO*S2 ,
<                                    S2=SO*S1 ....
<                                    (S2 DESIGNANT LA SYMETRIE PAR
<                                    RAPPORT A LA 2EME BISSECTRICE).
<
<
<        ARGUMENT :
<                    B=NUMERO DE LA TRANSFORMATION ELEMENTAIRE
<                      QUI VA MULTIUPLER 'T' (A NOTER B#0 TOUJOURS !!!!).
<
<
<        RESULTAT :
<                    X#0 TOUJOURS (AFIN DE MINIMISER L'OCCUPATION
<                        DE LA GRAMMAIRE).
<
<
UTRANS:  EQU         $
         LR          B,X             < X=NUMERO DE LA TRANSFORMATION
                                     < ELEMENTAIRE ; A NOTER X#0 !!!!
         LBY         &MTRANS
         LR          A,W             < W=@DE LA MATRICE DE LA
                                     < TRANSFORMATION T(X).
         LBY         &NTRANS
         ADRI        1,A             < ET UNE ITERATION DE PLUS.
         SARD        16              < LE NBRE D'ITERATIONS SUR T(X)
                                     < EST ETENDU SUR 32 BITS.
         DV          NEUTRE,W        < ON CALCULE LE NBRE D'ITERATION
                                     < MODULO LA PUISSANCE QUI DONNE
                                     < L'OPERATION NEUTRE.
         LR          B,A             < A=RESTE DE LA DIVISION.
         STBY        &NTRANS         < NBRE D'ITERATIONS DE T(X).
                                     < (RESTE DE LA DIVISION).
         LA          TRANS           < ACCES A L'INDICATEUR DE PRESENCE
                                     < DES TRANSFORMATIONS ELEMENTAIRES.
         SBT         0,X             < T(X) PRESENTE A PRIORI.
         CPZR        B               < DOIT-ELLE ETRE ITEREE AU
                                     < MOINS UNE FOIS ???
         JNE         E410            < OUI , DONC ELLE EST PRESENTE.
         RBT         0,X             < SINON , ON LA REND ABSENTE.
E410:    EQU         $
         STA         TRANS           < MAJ DE L'INDICATEUR DE PRESENCE
                                     < DES TRANSFORMATIONS ELEMENTAIRES.
         RSR                         < RETOUR AVEC X#0.
         PAGE
<
<
<        A C C E S   D I R E C T   A U   D K  :
<
<
<        FONCTION :
<                      CE MODULE PERMET DE SAUVEGARDER ET
<                    DE RESTAURER 31 CONTEXTES DIFFERENTS
<                    CONSTITUES PAR LA LISTE DES CONSTANTES
<                    STACKABLES.
<
<
<        S A V E   O U   R E S T O R E  ? ? :
<
<
<        ARGUMENT :
<                    B=SENS (0/2) DE L'OPERATION.
<
<
ADSEC:   EQU         $
         STB         DEMDK           < MISE EN PLACE DE LA FONCTION.
         LAI         'C              < A=NVP D'ACCES DIRECT AU DKS.
         STBY        DEMDK           < MISE EN PLACE DU NVP D'ACCES.
         RSR
<
<
<        S A V E / R E S T O R E   C O N T E X T E  :
<
<
RWDK:    EQU         $
         LAD         DEMDK
         SVC         0               < EXECUTION DE LA DEMANDE.
         RSR                         < RETOUR AVEC LES CONDITIONS DE
                                     < RETOUR DE CMS4 DANS X.
         PAGE
<
<
<        S T A C K A G E   D E S   C O N S T A N T E S  :
<
<
<        PHILOSOPHIE :
<                      ON DISPOSE D'UNE PILE 'STACK' ,
<                    DANS LA QUELLE ON PUEUT EMPILER/
<                    DEPILER LES CONSTANTES , SOIT
<                    POUR LES SAUVEGARDER POUR RESTAURATION
<                    ULTERIEURE , SOIT POUR LES ECHANGER
<                    (CF. PUSH X , PUIS PULL Y ).
<                      SONT STACKABLES LES CONSTANTES
<                    SUIVANTES :
<                    1- CTTE : APPELEE 'K' POUR L'OCCASION ,
<                    2- CV : APPELE 'C' ,
<                    3- DY : APPELE 'Y' ,
<                    4- DX : APPELE 'X'.
<                    5- LA TRANSFORMATION COURANTE : APPELEE 'T'.
<                    6- L'ARGUMENT FORMEL : APPELE 'A'.
<
<
<        I N I T I A L I S A T I O N  :
<
<
<        ARGUMENT :
<                    B=0 : IL S'AGIT D'UN 'PULL' ,
<                     =1 : IL S'AGIT D'UN PUSH.
<
<
<        RESULTAT :
<                    SAVE=0 : 'PULL' ,
<                        =1 : 'PUSH'.
<
<
SWHOS:   EQU         $
         STB         SAVE            < MEMORISATION DU SENS DE
                                     < L'OPERATION SUR 'STACK'.
         STZ         WHOS            < RAZ DE LA LISTE DES CONSTANTES
                                     < ATRAITER.
         RSR
<
<
<        I N S E R T I O N   C O N S T A N T E S
<        D A N S   L A   L I S T E  :
<
<
<        ARGUMENT :
<                    B=NUMERO DE LA CONSTANTE A INSERER
<                    DANS LA LISTE 'WHOS' ; DANS LE CAS OU
<                    B EST NUL C'EST QUE L'OPERATION PORTE
<                    SUR LA TRANSFORMATION COURANTE.
<
<
<        RESULTAT :
<                    X#0 (TOUJOURS RETOUR EN ERREUR).
<
<
RWHOS:   EQU         $
         LXI         1               < LE STACKAGE PORTE SUR UN
                                     < SEUL MOT A PRIORI (CAS B#0).
         LR          B,Y             < Y=NUMERO DE LA CONSTANTE
                                     < EN CAUSE.
         CPZR        B               < EST-CE UNE OPERATION SUR 'T' ???
         JNE         E440            < NON , C'EST BON.
<
< CAS D'UNE OPERATION SUR 'T' :
<
         LXI         NT+1/2+1+1      < X=NBRE DE MOTS A EDPLACER
                                     < DANS LE CAS DE 'T'.
         LYI         TRANS-WHOS      < INDICE DU 1ER MOT A DEPLACER
                                     < POUR LA TRANSFORMATION 'T'.
<
< MISE A JOUR DE LA LISTE 'WHOS' :
<
E440:    EQU         $
         LA          WHOS            < ACCES A LA LISTE.
E441:    EQU         $
         XR          X,Y
         SBT         0,X             < MEMORISATION DE LA CONSTANTE.
                                     < (BIT(X)=1).
         XR          X,Y
         ADRI        1,Y             < PROGRESSION DU NUMERO DE LA
                                     < CONSTANTE (Y).
         JDX         E441            < CONSTANTE SUIVANTE.
         STA         WHOS            < MAJ DE LA LISTE.
         LXI         1               < POUR FAIRE UN RETOUR EN ERREUR.
         RSR                         < RETOUR EN ERREUR (TOUJOURS).
<
<
<        O P E R A T I O N   S U R   S T A C K  :
<
<
<        ARGUMENT :
<                    SAVE=SENS DE L'OPERATION :
<                        =0 : 'PULL' ,
<                        =1 : 'PUSH'.
<
<
<        RESULTAT :
<                    ERREUR SI L'OPERATION EST IMPOSSIBLE.
<
<
ESTACK:  EQU         $
         LY          ASTACK          < Y=@STACK.
         LB          WHOS            < B=LISTE DES CONSTANTES A TRAITER.
         CPZ         SAVE            < TEST DU SENS DE L'OPERATION.
         JE          E300            < CAS DES 'PULL'.
<
<        P U S H   I N   S T A C K  :
<
         LXI         -NSTACK
<
< BOUCLE DE 'PUSH' PAR CONSTANTE :
<
E301:    EQU         $
         TBT         16+NSTACK+1,X   < LA CONSTANTE(X) EST-ELLE
                                     < CONCERNEE ???
         JNC         E302            < NON.
         LA          &LWHOSI         < SI OUI , ACCES A LA CONSTANTE(X+
                                     < NSTACK+1).
         PUSH                        < ET EMPILEMENT DANS 'STACK'.
         JC          E303            < DEBORDEMENT DE 'STACK' PAR
                                     < LE HAUT ; ABORT AVEC AU
                                     < PEALABLE UNE DECREMENTATION DU
                                     < POINTEUR DE STACK !!!!??
E302:    EQU         $
         JIX         E301            < CONSTANTE SUIVANTE.
<        A NOTER :
<                    X=0 : RETOUR OK ...
<
< SORTIE DE LA ROUTINE :
<
E306:    EQU         $
         RSR
<
< DEBORDEMENT DE STACK PAR LE HAUT :
<
E303:    EQU         $
         DC          &ASTACK         < ON DECREMENTE LE POINTEUR
                                     < DE 'STACK' , CAR CETTE ANDOUILLE
                                     < DE MICRO-MACHINE L'A QUAND
                                     < MEME FAIT PROGRESSER !!?!?
         JMP         E306            < VERS LA SORTIE : A NOTER : X#0 !!
<
<        P U L L   I N   S T A C K  :
<
E300:    EQU         $
         LXI         NSTACK
<
< BOUCLE DE DESEMPILEMENT DES CONSTANTES : (A REBROUSSE POIL...)
<
E304:    EQU         $
         TBT         16,X            < LA CONSTANTE(X) EST-ELLE
                                     < CONCERNEE ???
         JNC         E305            < NON.
         PULL                        < SI OUI , ON LA DEPILE.
         JC          E307            < ERREUR : DEBORDEMENT PAR LE
                                     < BAS ; ON ABORTE , MAIS AU
                                     < PREALABLE , ON VA INCREMENTER
                                     < LE POINTEUR DE 'STACK'.
         STA         &LWHOSO         < SI OK , ON RESTAURE CONSTANTE(X).
E305:    EQU         $
         JDX         E304            < CONSTANTE SUIVANTE.
<
< RESTAURATION EVENTUELLE DU 3-CURSEUR
< ET DE 2 DES 3 PAS SUR (X,Y,Z) :
<
         LA          CV+Y
         STA         &C1             < A NOTER QUE : X=0.
         LA          CV+X
         STA         &C2
         BSR         ASPDXY          < RESTAURATION DE 2 DES 3 PAS.
         LXI         0               < RAZ DE X POUR UN RETOUR OK.
         JMP         E306            < RETOUR OK , CAR X=0 !!!!
<
< DEBORDEMENT DE 'STACK' PAR LE BAS :
<
E307:    EQU         $
         IC          &ASTACK         < IL FAUT RATTRAPPER LES BETISES
                                     < DE LA MICRO-MACHINE !?!?!
         JMP         E306            < VERS UNE SORTIE EN ERREUR (X#0).
         PAGE
<
<
<        A P P E L   P R O G R A M M E  :
<
<
<        S A V E   N O M   C H E R C H E  :
<
<
<        RESULTAT :
<                    SAVE=INDEX DU 1ER CARACTERE DU NOM CHERCHE ,
<                    X INDIFFERENT (APPEL SEQUENTIEL).
<
<
SAVNOM:  EQU         $
         LA          IEG             < IEG=INDEX 1ER CARACTERE DU NOM
                                     < DU PROGRAMME APPELE.
         STA         SAVE
         RSR                         < RETOU INDIFFERENT.
<
<
<        L A N C E M E N T   P R O G R A M M E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE PASSE LA MAIN
<                    AU PROGRAMME QUI A ETE APPELE.
<
<
<        ARGUMENT :
<                    SAVE=INDEX DE LA 1ERE COMMANDE DU PROGRAMME ( LA
<                         1ERE COMMANDE SUIT LA '(').
<
<
<        RESULTAT :
<                    X#0 : TOUJOURS RETOUR EN ERREUR.
<
<
START:   EQU         $
         LX          SAVE            < RECUPERATION DE L'INDEX DE
                                     < DEPART QUI EST IL FAUT LE
                                     < NOTER DIFFERENT DE 0 , DONC X#0.
         STX         IEG             < MISE EN PLACE DE L'INDEX DE LA
                                     < PROCHAINE COMMANDE A EXECUTER.
         RSR                         < RETOUR AVEC X#0 !!!
<
<
<        A C C E S   A   U N   C A R A C T E R E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE RECUPERE UN CARACTERE
<                    DE RANG (X) SOIT DANS LE NOM CHERCHE ,
<                    SOIT DANS UN NOM DEFINI . SI L'INDEX
<                    DEMANDE EST HORS LA PAGE , LA ROUTINE
<                    RETOURNE DIRECTEMENT A UNE ADRESSE
<                    D'ERREUR DANS LA ROUTINE LOOKP , QUI
<                    SEULE L'APPELLE.
<                      LA RECHERCHE S'EFFECTUE , SOIT
<                    DANS L'ITEM COURANT DANS LE CAS
<                    DE LOOKP , SOIT DANS L'AUTRE ITEM
<                    DANS LE CAS DE LOOKPB (RECHERCHE
<                    EN BIBLIOTHEQUE).
<
<
<        ARGUMENT :
<                    X=INDEX DU CARACTERE DEMANDE.
<
<
<        RESULTAT :
<                    A=CARACTERE SI OK ,
<                    X<--(X)+1 , SI OK (A NOTER QUE C'EST LE X ARGUMENT
<                                      QUI EST VALIDE , ET NON PAS
<                                      LE X RESULTAT).
<                    RETOUR DIRECT EN E81 , SI HORS-LA PAGE , ET
<                    ALORS X#0 ....
<
<
GETCAR:  EQU         $
         LR          X,A
         CP          NCP             < VALIDATION DE L'INDEX ARGUMENT.
         JE          E80             < SORTIE EN ERREUR ; A NOTER
                                     < QUE (X)>NCP N'EST PAS UNE ERREUR,
                                     < IL S'AGIT EN FAIT DU SAUT D'UN
                                     < ITEM A L'AUTRE POUR ACCEDER
                                     < AU NOM RECHERCHE.
<
< CAS D'UN INDEX VALIDE :
<
         LBY         &AIR            < A=CARACTERE DEMANDE.
         ADRI        1,X             < PROGRESSION DE L'INDEX
                                     < COURANT DES CARACTERES DE CE TYPE
                                     < (SOIT DU NOM CHERCHE , SOIT
                                     < D'UN NOM DEFINI).
         RSR                         < RETOUR.
<
< SORTIE EN ERREUR :
<
E80:     EQU         $
         ADRI        -1,K            < POUR SAUTER LE BSR D'APPEL.
         JMP         E81             < RETOUR DIRECT A LOOKP , AVEC
                                     < IL FAUT LE NOTER : X#0 !!!!
<
<
<        R E C H E R C H E   D ' U N   P R O G R A M M E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE RECHERCHE LE NOM
<                    D'UN PROGRAMME APPELE , DANS L'ITEM
<                    COURANT OU DANS L'AUTRE ITEM (BIBLIOTHEQUE).
<                      SUIVANT LA VALEUR DE KP , LA
<                    RECHERCHE EST LOCALE (RESTREINTE
<                    A LA MEME PROFONDEUR DE PARENTHESES ;
<                    KP=0) , OU GLOBALE (KP=-1).
<                    NOM CHERCHE : &<NOM>;....
<                                  #<NOM>;....
<                    NOM DEFINI : ><NOM>(....
<
<
<        ARGUMENT :
<                    SAVE=INDEX DU 1ER CARACTERE DU NOM CHERCHE ,
<                         C'EST-A-DIRE LE 1ER QUI SUIT '&'.
<
<
<        RESULTAT :
<                    X#0 : LE PROGRAMME CHERCHE N'EXISTE PAS ,
<                    X=0 , LE PROGRAMME CHERCHE EXISTE , ET ALORS :
<                    SAVE=INDEX DE LA 1ERE COMMANDE DU PROGRAMME ,
<                         (C'EST-A-DIRE , LA 1ERE QUI SUIT '(').
<
<
<
<        R E C H E R C H E   E N   B I B L I O T H E Q U E  :
<
LOOKPB:  EQU         $
<
< RECHERCHE EN BIBLIOTHEQUE (MODE GLOBAL) :
<
         LA          SAVE
         AD          ACCEB           < L'INDEX D'ACCES AU NOM RECHERCHE,
                                     < EST TRANSLATE DE FACON A ETRE
                                     < ACCESSIBLE A PARTIR DE L'AUTRE
                                     < ITEM (CF. AIR).
         AD          ACCEB           < (TRANSLATION OCTET).
         STA         SAVE
         LA          AIC
         SB          ACCEB           < L'ITEM DE RECHERCHE N'EST PAS
                                     < L'ITEM COURANT.
         JMP         E200            < VERS LA RECHERCHE.
<
<        R E C H E R C H E   D A N S   L ' I T E M   C O U R A N T  :
<
LOOKP:   EQU         $
         LA          AIC             < LA RECHERCHE SE FAIT DANS L'ITEM
                                     < COURANT.
E200:    EQU         $
<        ON A ICI :
<                    A=RELAI VERS L'ITEM QUI SERA UTILISE
<                      DANS LA RECHERCHE.
         STA         AIR             < MISE EN PLACE DU RELAI VERS
                                     < L'ITEM DE RECHERCHE.
         RBT         0               < RAZ DU BIT INDEX.
         STA         F3              < SAVE TEMPORAIRE DE L'@ITEM DE
                                     < RECHERCHE DANS F3.
         LXI         0               < INITIALISATION DE L'INDEX ITEM.
<        ON A ICI :
<                    X=INDEX DE DEBUT DE NIVEAU (EVENTUELLEMENT
<                      0 DANS LE CAS D'UNE RECHERCHE GLOBALE ,
<                      OU D'1NE RECHERCHE LOCALE OU IL N'Y
<                      AURAIT PAS DE '(' PRECEDENTE.
<
< BOUCLE DE RECHERCHE :
<
E71:     EQU         $
         LAI         ">"             < A=OCTET RECHERCHE (DEFINITION
                                     < D'UN PROGRAMME GRAPHIQUE.
         LB          F3              < B=@ZONE DE RECHERCHE.
         LY          NCP             < Y=NBRE D'OCTETS DANS LA ZONE.
         SBS                         < RECHERCHE DE '>' ???
         JC          E81             < '>' NON TROUVE : RETOUR ERREUR.
         ADRI        1,X             < OK , ON A TROUVE '>' , ON
                                     < LE DEPASSE ...
E422:    EQU         $
<
< CAS OU ON TROUVE LA DEFINITION D'UN PROGRAMME :
<
<        ON A ICI :
<                    X=INDEX DU 1ER CARACTERE DU NOM DEFINI.
         LY          SAVE            < Y=INDEX DU 1ER CARACTERE
                                     < DU NOM CHERCHE.
<
< COMPARAISON DU NOM DEFINI (X) ,
< ET DU NOM CHERCHE (Y) :
<
E72:     EQU         $
         BSR         AGTCAR          < ACCES A UN CARACTERE DE L'ITEM.
         LR          A,B             < B=CARACTERE (X) DE LA DEFINITION.
         XR          X,Y
         BSR         AGTCAR          < A=CARACTERE (X) DU NOM CHERCHE.
         XR          X,Y
         CPR         A,B             < TEST DE COINCIDENCE DES 2 NOMS ???
         JE          E72             < OK , POURSUIVONS LA COMPARAISON.
<
< CAS D'UNE NON-COINCIDENCE :
<
         CPI         ";"             < EST-ON SUR LA FIN DU NOM CHERCHE?
         JNE         E71             < NON , PASSONS AU CARACTERE
                                     < SUIVANT DE L'ITEM (X).
<
< CAS DE LA FIN DU NOM CHERCHE :
<
         LR          B,A
         CPI         "("             < EST-ON AUSSI SUR LA FIN DU
                                     < NOM QUI EST DEFINI ???
         JNE         E71             < NON , PASSONS AU CARACTERE
                                     < SUIVANT DE L'ITEM (X).
<
< CAS OU ON TROUVE LA DEFINITION DU NOM CHERCHE :
<
E987:    EQU         $               < ENTRY 'APPEL DE L'ARGUMENT
                                     < FORMEL COURANT'.
         STX         SAVE            < SAVE=INDEX 1ERE COMMANDE DE LA
                                     < DEFINITION.
         LXI         0               < RETOUR OK (NOM TROUVE) ...
<
< SORTIE DE LA ROUTINE :
<
E81:     EQU         $               < ENTRY 'HORS-LA PAGE'.
         RSR                         < RETOUR AVEC (X) ....
         PAGE
<
<
<        A P P E L   D E   L ' A R G U M E N T   F O R M E L
<                    C O U R A N T  :
<
<
CARGF:   EQU         $
         LX          ARGF            < X=INDEX PRESUME DE LA 1ERE
                                     < PRIMITIVE DE L'ARGUMENT FORMEL
                                     < COURANT SI CELUI-CI EXISTE ...
         CPZR        X               < EXISTE-T'IL ???
         JL          E81             < NON , ERREUR ....
         JMP         E987            < OUI , ON LE TRAITE COMME LA
                                     < RENCONTRE DE LA DEFINITION
                                     < D'UN PROGRAMME CHERCHE.
<
<
<        R E N C O N T R E   D E   L ' A R G U M E N T
<        F O R M E L   C O U R A N T  :
<
<
DARGF:   EQU         $
         LX          IEG             < X=INDEX DE LA 1ERE PRIMITIVE
                                     < DE L'ARGUMENT FORMEL COURANT.
         STX         ARGF            < QUE L'ON SAUVEGARDE D'UNE
                                     < MANIERE NON RECURSIVE DANS
                                     < ARGF.
         RSR                         < RETOUR AVEC X#0.
         PAGE
<
<
<        I N I T I A L I S A T I O N   D E   Y  :
<
<
<        FONCTION :
<                      PEMET D'INITIALISER Y POUR
<                    EXECUTION D'UN PUSH PAR LA SUITE.
<                    Y CONTIENT ALORS LE NBRE DE REPETITIONS
<                    A FAIRE SOUS LE NIVEAU DE RECURSIVITE
<                    CREE PAR LE PUSH.
<
<
<        ARGUMENT :
<                    B=VALEUR INITIALE DE Y.
<
<
<        RESULTAT :
<                    Y=VALEUR.
<                    X INDIFFERENT (APPEL EN SEQUENTIEL).
<
<
SETY:    EQU         $
         LR          B,Y             < Y=VALEUR INITIALE.
         RSR                         < RETOUR INDIFFERENT.
         PAGE
<
<
<        V A L I D A T I O N   D U   P R O G R A M M E  :
<
<
<        RESULTAT :
<                    X=0 : L'ITEM COURANT EST DE TYPE 'TEXTE' ,
<                          OU DE TYPE 'DESSIN' ,
<                     #0 : L'ITEM N'EST NI DE TYPE 'DESSIN' ,
<                          NI DE TYPE 'TEXTE'.
<
<
<
<        V A L I D A T I O N   B I B L I O T H E Q U E  :
<
CHECKB:  EQU         $
         LX          ACCEB
         NGR         X,X
         ADRI        IINDIC-LTN,X    < INDEX MOT D'ACCES AU TYPE.
         ADR         X,X             < CONVERSION EN INDEX OCTET.
         JMP         E205            < VERS LA VALIDATION.
<
<        V A L I D A T I O N   P R O G R A M M E   I N I T I A L  :
<
CHECKT:  EQU         $
         LXI         IINDIC-LTN*2    < (INDEX OCTETS)
E205:    EQU         $
<        ON A ICI :
<                    X=INDEX D'ACCES AU TYPE A PARTIR DE L'ITEM COURANT.
         LBY         &AIC            < ACCES AU TYPE DE L'ITEM COURANT.
         ORI         '10             < ON FORCE LE BIT10 , AFIN DE
                                     < TESTER SIMULTANEMENT 'D' ET 'T' ,
                                     < DONT LES CODES NE DIFFERENT QUE
                                     < PAR CE BIT ('44 ET '54).
         LXI         "T"             < X=TYPE ATTENDU ('TEXTE').
         SBR         A,X             < X=0 SI LE TYPE DE L'ITEM COURANT
                                     < EST 'TEXTE' OU 'DESSIN'.
         RSR                         < RETOUR AVEC (X).
         PAGE
<
<
<        M O D E   D E   F O N C T I O N N E M E N T   D E   G R  :
<
<
<        PHILOSOPHIE :
<                      GR PEUT FONCTIONNER SOUS 2 MODES :
<                    1- LE MODE PROGRAMME , POUR LE QUEL
<                    LES COMMANDES SONT RECUPEREES DANS
<                    ITEM1 PAR (IEG) ; ON A ALORS :
<                                    BIT0(MOT0(PIR))=0.
<                    2- LE MODE INTERACTIF (OU GENERATEUR
<                    DE PROGRAMME , POUR LEQUEL LES
<                    COMMANDES SONT RECUPEREES PAR
<                    L'INTERMEDIAIRE DU CURSEUR GRAPHIQUE ;
<                    LE CARACTERE LU EST MIS EN COMMANDE
<                    COURANTE DANS ITEM1 EN (IEG) ;
<                    DANS CE MODE ON A :
<                                    BIT0(MOT0(PIR))=1.
<
<
<        MODE INTRINSEQUE :
<                      LE FONCTIONNEMENT NORMAL DE GR
<                    EST LE MODE PROGRAMME ; C'EST CELUI
<                    QU'IL A AU CHARGEMENT , ET QU'ON
<                    LUI REDONNE A CHAQUE MONTEE DANS
<                    LA RECURSIVITE.
<
<
<        ARGUMENT :
<                    B='00 : MODE PROGRAMME DEMANDE ,
<                     ='01 : MODE INTERACTIF DEMANDE.
<
<
<        RESULTAT :
<                    RETOUR INDIFFERENT.
<        CAS DU MODE 'I' :
<                    IEG<--(IEG)-1 : ON FAIT UN RETOUR SUR LE CARACTERE
<                                    'I' POUR L'ECRASER PAR LE 1ER
<                                    CARACTERE INTERACTIF.
<
<
<        M O D E   I N T E R A C T I F  :
<
<
MODGRI:  EQU         $
         DC          IEG             < RETOUR CARACTERE SUR 'I' ,
                                     < POUR L'ECRASER.
<
<
<        M O D E   P R O G R A M M E  :
<
<
MODGR:   EQU         $
         LXI         IR
         LA          &APRC           < ACCES A L'ENTREE COURANTE DE PIR.
         SLLS        1               < A FIN DE RAZER LE BIT0(MOT0(PIR))
         SCRD        1               < ON MET AINSI EN PLACE LE MODE
                                     < DEMANDE QUI SE TROUVAIT EN
                                     < BIT15(B) DANS LE BIT0(A).
         STA         &APRC           < MAJ DE L'ENTREE COURANTE DE PIR.
         RSR
         PAGE
<
<
<        I N V E R S I O N   D E S   I N H I B I T I O N S
<                    D E   P R I M I T I V E S  :
<
<
<        FONCTION :
<                      SOIT LA COMMANDE :
<                    :<PRIMITIVE>
<                    ELLE A POUR EFFET D'INVERSER LE
<                    BIT0 DE L'ENTREE DE TCOM ASSOCIEE
<                    A <PRIMITIVE> . LORSQUE LE BIT0
<                    EST A 1 , ON FAIT UN SAUT IMPLICITE
<                    DANS LA GRAMMAIRE EN N1616 , QUI
<                    PERMET DE SIMULER UN SAUT DE DEFINITION
<                    DE SOUS-PROGRAMME ...
<                    (DANS LA MESURE OU UN '(' SUIT...)
<                      SOIT LA COMMANDE :
<                    "<PRIMITIVE>
<                    ELLE A POUR EFFET D'AUTORISER
<                    A PRIORI LA PRIMITIVE <PRIMITIVE> ,
<                    PAR MISE A 0 DU BIT0 DE SON ENTREE
<                    DANS TCOM.
<
<
<        ARGUMENT :
<                    Y=<PRIMITIVE>.
<                    B=0 : INVERSION DE <PRIMITIVE> ,
<                     =1 : AUTORISATION DE <PRIMITIVE>.
<
<
INVERS:  EQU         $
         LR          Y,X             < X=<PRIMITIVE> A INVERSER.
         LA          &ATCOM          < A=ENTREE DE TCOM POUR LA
                                     < <PRIMITIVE>.
         IBT         0               < INVERSION DU BIT0 A PRIORI.
         CPZR        B               < EST-CE EN FAIT UNE AUTORISATION ?
         JE          E988            < NON , UNE INVERSION.
         RBT         0               < ET OUI , AUTORISONS ....
E988:    EQU         $
         STA         &ATCOM          < MISE A JOUR DE TCOM.
         RSR                         < ET C'EST TOUT ...
         PAGE
<
<
<        E D I T E U R   G R A P H I Q U E  :
<
<
<        PHILOSOPHIE :
<                      CET EDITEUR GRAPHIQUE , PERMET A
<                    PARTIR D'UN PROGRAMME CREE SOUS 'ED'
<                    DE FAIRE DES DESSINS SUR LA VISU.
<                    LES MANIPULATIONS SUR CE DESSIN ,
<                    DU TYPE : EFFACER UNE PARTIE DU
<                    DESSIN , FAIRE SUBIR UNE TRANDSFORMATION
<                    A UNE PARTIE DU DESSIN , ... SONT
<                    FAITES AU NIVEAU DU TEXTE DU
<                    PROGRAMME.
<                      LE LANGAGE DE PROGRAMMATION EST
<                    LANGAGE RECURSIF A STRUCTURE DE
<                    BLOCS (STYLE ALGOL) : LES BLOCS
<                    SONT DELIMITES DANS LE LANAGE
<                    PAR DES COUPLES DE PARENTHESES
<                    '(' ET ')'.
<                      CETTE STRUCTURE DE BLOCS EST
<                    REALISEE A L'AIDE DE LA PILE
<                    DE RECURSIVITE 'PIR'.
<
<
<        CAS DE 'GV' :
<                      LA VISU D'EMISSION EST SUR
<                    LE NVP='0B ; CELLE-CI PEUT NE PAS
<                    ETRE ASSIGNEE ; DE PLUS SIMULTA-
<                    NEMENT , ON CONVERTIT LE DESSIN EN VIDEO.
<
<
<        UTILISATION DE GV :
<                    $;              DE PLUS UN APPEL A UNE BIBLIOTHE-
<                                    QUE VIDE INVERSE LES CONDITIONS DE
<                                    COMPTAGE DES SEGMENTS ET NUMEROTA-
<                                    TION SUR LE DESSIN.
<
<
         PROG
<
<
<        I N I T I A L I S A T I O N   D U   P R O C E S S E U R  :
<
<
<        FONCTION :
<                      CETTE ENTREE EST CELLE UTILISEE LORS
<                    DES APPELS PAR !GE.
<
<
APILE:   WORD        PILE-1          < POUR INITIALISER LE REGISTRE K.
         WORD        COM0            < INITIALISATION DE LA BASE C.
         WORD        LOC+'80         < INITIALOSATION DE LA BASE L.
GRAPH:   EQU         $
         LRP         K
         PLR         B,C,L,W         < INITIALISATION DE B , C , L , W.
                                     < W='LRP K' , FARFELUE!!!
         LR          B,K             < INITIALISATION DE K.
         IC          KIN             < COMPTAGE DES ENTRIES.
         JLE         NALTM           < CAS DE LA 1ERE ENTREE.
<
<        T R A I T E M E N T   D E S   A L T - M O D E S  :
<
         LAI         '13             < ALT-MODE EST ASSIMILE A UN
         STA         RETSVC          < UN CTRL-X-OFF...
         BR          AGOGER          < ABORT DE GW.
<
<        C H A R G E M E N T   D E   '   W ' :
<
NALTM:   EQU         $
         LAD         DEMMEM
         SVC         0               < DEMANDE 10K.
<
< CHARGEMENT DE L'OVERLAY DE 'GW' :
<
NOMBB:   VAL         "W"             < NOM DE LA BRANCHE.
NOMOV1:  VAL         " W"            < NOM DE L'OVERLAY.
         LAI         NOMBB
         SBT         2               < MISE D'UN 'SPACE' DEVANT.
         STA         &ARACI          < MOT0 DE LA BRANCHE.
         LAI         " "
         SBT         2               < A='SPACE''SPACE'.
         IC          ARACI
         STA         &ARACI          < MOT1 DE LA BRANCHE.
         IC          ARACI
         STA         &ARACI          < MOT2 DE LA BRANCHE.
         IC          ARACI
         LAI         '04             < CODE DE 'EOT'.
         STBY        &ARACI          < MOT3 DE LA BRANCHE.
         LAD         DEMLOD
E975:    EQU         $
         BSR         ASVC            < TENTATIVE DE CHARGEMENT
                                     < DE L'OVERLAY.
         CPZ         RETSVC
         JNE         E975            < ERREUR DE CHARGEMENT.
<
<        I N I T I A L I S A T I O N   D E   ' G R '  :
<
E976:    EQU         $
         IF          ORDI-"T",XWOR%,,XWOR%
         WORD        '1E25           < A,B=<ACNESC>.
         CP          ACNSYS
         JNE         NSYS
         LR          B,A
         CP          ACNSYS+1
         JE          CSYS            < ON EST SOUS :SYS...
NSYS:    EQU         $
         STZ         ASP3            < PAS DE STABILISATION VIDEO.
CSYS:    EQU         $
XWOR%:   VAL         0
         BSR         ASTAB           < ON STABILISE TOUT DE SUITE...
         JMP         LOOP            < ET C'EST PARTI...
         PAGE
<
<
<        P R I M I T I V E   ' G E T   C A R A C T E R '  :
<
<
<        FONCTION :
<                      SUIVANT LE MODE DE FONCTIONNEMENT
<                    COURANT DE GR , CETTE ROUTINE
<                    RECUPERE LE CARACTERE COURANT :
<                    1- DANS ITEM1 EN MODE PROGRAMME (BIT0(PIR)=0) ,
<                    2- PAR LECTURE DU CURSEUR GRAPHIQUE EN MODE
<                       INTERACTIF (BIT0(PIR)=1).
<                       (ET DE PLUS ELLE RANGE LE CARACTERE DE
<                       DEBLOCAGE DE LA VISU EN CARACTERE COURANT
<                       DE ITEM1).
<
<
<        ARGUMENT :
<                    B=0 : NE PAS TESTER LES CARACTERES 'A'/'B'/'S' ,
<                     #0 : TESTER LES CARACTERES D'EXTREMITE ('A'/
<                          'B'/'S') ET S'ILS SONT PRESENTS , LES
<                          INTERPRETER.
<
<
<        RESULTAT :
<                    Y=CARACTERE COURANT (IEG) DE L'ITEM COURANT.
<
<
PRIMG:   EQU         $
<
< VALIDATION DE IEG :
<
         LX          IEG             < X=INDEX D'EXECUTION DU PROGRAMME
                                     < GRAPHIQUE DAN SL'ITEM COURANT.
         LR          X,A
         CP          NCP             < VALIADTION DE L'INDEX IEG.
         LA          AGON22          < A=@NOEUD DE BRANCHEMENT SI
                                     < CARACTERE HORS-LA PAGE A PRIORI.
         JGE         E962            < ET OUI , HORS-LA PAGE ...
<
< ACCES AU CARACTERE COURANT (IEG) :
<
         LBY         &AIC            < A=CARACTERE COURANT.
<
< TEST DU MODE COURANT DE GR :
<
         LXI         IR
         CPZ         &APRC           < TEST DU BIT0 DU MOT0 DE L'ENTREE
                                     < COURANTE DE PIR.
         JL          E110            < CAS DU MODE INTERACTIF.
<
< CAS DE GR EN MODE PROGRAMME :
<
E111:    EQU         $
         IC          IEG             < PREPARATION DE L'ACCES AU
                                     < CARACTERE SUIVANT.
         CPI         "Z"             < VALIDATION SUPERIEURE DU
                                     < CARACTERE COURANT (ET CECI
                                     < A CAUSE DE ':').
         JG          E979            < ERREUR : CARACTERE NON RECONNU.
         LR          A,Y             < Y=CARACTERE COURANT (IEG) DE
                                     < L'ITEM COURANT.
         JMP         PRIMA           < VERS UN RETOUR OK A LOOPB.
<
< CAS DE GR EN MODE INTERACTIF :
<
E110:    EQU         $
         BR          APRGI           < VERS LA PRIMITIVE GET CARACTERE
                                     < EN MODE INTERACTIF.
         PAGE
<
<
<        S Y N T A X E  :
<
<
<        <NOM>::=<CARACTERE DIFFERENT DE ';' ET DE '!'>
<        <NOM>::=<NOM><CARACTERE DIFFERENT DE ';' ET DE '!'>
<        <COMMENTAIRE>::=<<NOM>;
<        <TEXTE A EDITER>::=<<NOM>!
<        A::=<ORIGINE VECTEUR>
<        B::=<EXTREMITE SEQUENTIELLE VECTEUR>
<        S::=<EXTREMITE ETOILEE VECTEUR>
<        <MISE A BLANC EN VIDEO>::=.
<        <NOIR SI BLANC/BLANC SI NOIR>::=,
<        <COMMANDE>::=<MISE A BLANC EN VIDEO>
<        <COMMANDE>::=<BLANC SI NOIR/NOIR SI BLANC>
<        <ORIGINE>::=O
<        I::=<MODE GR INTERACTIF>
<        P::=<MODE GR PROGRAMME>
<        K::=<CONSTANTE ECHELLE>
<        Z::=<EFFACEMENT ECRAN>
<        F::=<RETOUR A GE>
<        C::=<RETOUR AU CCI>
<        RP::=<ROTATION +TETA>
<        RM::=<ROTATION -TETA>
<        R1::=<ROTATION +PI/2>
<        R3::=<ROTATION -PI/2>
<        SO::=<SYMETRIE ORIGINE>
<        SX::=<SYMETRIE OX>
<        SY::=<SYMETRIE OY>
<        S1::=<SYMETRIE B1>
<        A::=<DESORTHOGONALISATION AIGUE>
<        O::=<DESORTHOGONALISATION OBTUE>
<        H::=<DESORTHOGONALISATION HAUTE>
<        B::=<DESORTHOGONALISATION BASSE>
<        T::=<OPERATEUR MATRICIEL D'ORIENTATION>
<        <TRANSFORMATION ELEMENTAIRE>::=RP/RM/R1/R3/SO/SX/SY/S1/A/O/H/B
<        T::=<TRANSFORMATION ELEMENTAIRE>
<        T::=T<TRANSFORMATION ELEMENTAIRE>
<        <DEFINITION TRANSFORMATION>::=T=<TRANSFORMATION ELEMENTAIRE>...
<                                      ...<TRANSFORMATION ELEMENTAIRE>;
<        <MODIFICATION TRANSFORMATION>::=T<TRANSFORMATION ELEMENTAIRE>...
<                                        ..<TRANSFORMATION ELEMENTAIRE>;
<        <DEFINITION PROGRAMME>::=><NOM>(<COMMANDE>..<COMMANDE>)
<        <APPEL GLOBAL PROGRAMME>::=&<NOM>;
<        <APPEL GLOBAL PROGRAMME BIBLIOTHEQUE>::=?<NOM>;
<        <APPEL PROGRAMME>::=<APPEL GLOBAL PROGRAMME>
<        <APPEL PROGRAMME>::=<APPEL GLOBAL PROGRAMME BIBLIOTHEQUE>
<        <ARGUMENT FORMEL>::==(<COMMANDE>...<COMMANDE>)
<        <APPEL ARGUMENT FORMEL>::='
<        <APPEL ARGUMENT FORMEL DE L'AUTRE ITEM>::=0
<        <CHARGEMENT BIBLIOTHEQUE>::=$<NOM>;
<        <Y(CURSEUR)>::=2
<        <X(CURSEUR)>::=1
<        <CURSEUR>::=<X(CURSEUR)>
<        <CURSEUR>::=<Y(CURSEUR)>
<        <CURSEUR>::=C
<        <NOM INTRINSEQUE>::=K/<CURSEUR>/Y/X/A/T
<        <PUSH>::=MI<NOM INTRINSEQUE>...<NOM INTRINSEQUE>;
<        <PULL>::=MO<NOM INTRINSEQUE>...<NOM INTRINSEQUE>;
<        <SAVE CONTEXTE>::=W<ARGUMENT>
<        <RESTAURE CONTEXTE>::=R<ARGUMENT>
<        <REPETITION>::=%<ARGUMENT>(<COMMANDE>...<COMMANDE>)
<        <ARGUMENT>::=1/2/.../9/A/B/.../X/Y/Z
<        <COMMANDE>::=Z/F/C
<        <COMMANDE>::=A/B/S/+/-/*/// /;
<        <COMMANDE>::=I/P
<        <COMMANDE>::=X+/X-/X*/X//Y+/Y-/Y*/Y//
<        <COMMANDE>::=K<ARGUMENT>
<        <COMMANDE>::=X<ARGUMENT>/Y<ARGUMENT>
<        <COMMANDE>::=<PUSH>/<PULL>
<        <COMMANDE>::=<APPEL PROGRAMME>
<        <COMMANDE>::=<CHARGEMENT BIBLIOTHEQUE>
<        <COMMANDE>::=<REPETITION>
<        <COMMANDE>::=<DEFINITION PROGRAMME>
<        <COMMANDE>::=<DEFINITION TRANSFORMATION>
<        <COMMANDE>::=<MODIFICATION TRANSFORMATION>
<        Q1::=<CHOIX PLAN (X3,Y3)>
<        Q2::=<CHOIX PLAN (Y3,Z3)>
<        Q3::=<CHOIX PLAN (Z3,X3)>
<        <COMMANDE>::=Q1/Q2/Q3
<        <COMMANDE>::=1/2/3/4
<        <COMMANDE>::=<ORIGINE>
<        <COMMANDE>::=K<ARGUMENT>
<        <COMMANDE>::=<COMMENTAIRE>
<        X+::=<DX:=(DX)+<CONSTANTE ECHELLE>>
<        X-::=<DX:=(DX)-<CONSTANTE ECHELLE>>
<        Y+::=<DY:=(DY)+<CONSTANTE ECHELLE>>
<        Y-::=<DY:=(DY)-<CONSTANTE ECHELLE>>
<        K<ARGUMENT>::=<<CONSTANTE ECHELLE>:=<ARGUMENT>>
<        X<ARGUMENT>::=<DX:=<CONSTANTE ECHELLE>*<ARGUMENT>>
<        Y<ARGUMENT>::=<DY:=<CONSTANTE ECHELLE>*<ARGUMENT>>
<        X*::=<DX:=(DX)*<CONSTANTE ECHELLE>>
<        X/::=<DX:=(DX)/<CONSTANTE ECHELLE>>
<        Y*::=<DY:=(DY)*<CONSTANTE ECHELLE>>
<        Y/::=<DY:=(DY)/<CONSTANTE ECHELLE>>
<        1::=<DX,0>
<        2::=<0,DY>
<        3::=<-DX,0>
<        4::=<0,-DY>
<        <DEPLACEMENT CURSEUR>:=T*1/2/3/4
<        +::=<X+><Y+>
<        -::=<X-><Y->
<        *::=<X*><Y*>
<        /::=<X/><Y/>
<        <INVERSION PRIMITIVE>::=:<PRIMITIVE>
<        <AUTORISATION PRIMITIVE>::="<PRIMITIVE>
<        <BRANCHEMENT : IEG<--(SAVE)>::=!
<        <PROGRAMME>::=<COMMANDE>....<COMMANDE>
<
< DEPLACEMENTS DANS L'ESPACE : ON ECRIRA LES
< PROGRAMMES SUIVANTS POUR SE DEPLACER
< SUR LES 3 DIMENSIONS D'ESPACE (X,Y,Z) :
<
<        1- X>0 :    >UP(Q1 1)
<        2- X<0 :    >UM(Q1 3)
<        3- Y>0 :    >VP(Q2 1)
<        4- Y<0 :    >VM(Q2 3)
<        5- Z>0 :    >WP(Q3 1)
<        6- Z<0 :    >WM(Q3 3)
         PAGE
<
<
<        I N T E R P R E T E U R   D E S
<        P R O G R A M M E S   G R A P H I Q U E S  :
<
<
<        F O R M A T   D E S   P R I M I T I V E S  :
<
<                    OCTET0=FONCTION (NOM DE LA PRIMITIVE) ,
<                          BIT0=1 (TOUJOURS) ,
<                          BIT1=0 : MOT2 (ET EVENTUELLEMENT MOT3)
<                                   PRESENT(S).
<                              =1 : L'EXECUTION EST SEQUENTIELLE
<                                   (ON PASSE A LA PRIMITIVE SUIVANTE
<                                   EN FAISANT +2 SUR LA BASE C).
<                          BIT2=1 : ARG2 ABSENT.
<                          BIT3=1 : LE NOEUD SUIVANT EST N1 (QUELQUE
<                                   SOIENT LES CONDITIONS DE RETOUR).
<                    OCTET1=ARGUMENT1 ,
<                    MOT1=ARGUMENT2 ,
<                    MOT2=@PRIMITIVE SUIVANTE EN CAS D'ERREUR (IL
<                         FAUT BIT1(MOT0)=0) ,
<                    MOT3=@PRIMITIVE SUIVANTE SI OK (IL FAUT :
<                         BIT1(MOT0)=0).
<
<
PR:      VAL         0               < NOM DE LA PRIMITIVE+ARGUMENT1.
BSEQ:    VAL         1               < BIT INDICATEUR DE PRIMITIVE
                                     < SEQUENTIELLE (1).
PBSEQ:   VAL         '40             < POUR POSITIONNER LE BIT 'BSEQ'.
LPRIM:   VAL         2               < LPRIM=1 : ARG2 EST ABSENT.
PLPRIM:  VAL         '20             < POUR POSITIONNER LE BIT 'LPRIM'.
GON1:    VAL         3               < BIT INDIQUANT QUE LE NOEUD
                                     < SUIVANT EST LE NOEUD N1 (1).
PGON1:   VAL         '10             < POUR POSITIONNER LE BIT 'GON1'.
ARG2:    VAL         1               < ARGUMENT2.
ADER:    VAL         2               < @PRIMITIVE SUIVANTE SI ERREUR.
ADOK:    VAL         3               < @PRIMITIVE SUIVANTE SI OK.
<
<
<        FONCTION    ARGUMENT1       ARGUMENT2
<
<        PC          (???)           @ROUTINE    CALL.
<-----------------------------------------------------------------------
<        PCI         (???)           @NOEUD      CALL ROUTINE RELAYEE
<                                                PAR LE NOEUD D'@ ARG2.
<-----------------------------------------------------------------------
<        PT          CARACTERE-ASCI              TEST-CARACTERE.
<-----------------------------------------------------------------------
<        PUSH                                    EMPILEMENT DANS PR.
<-----------------------------------------------------------------------
<        PULL                                    DEPILEMENT DE PR.
<-----------------------------------------------------------------------
<        PG                                      ACCES AU CARACTERE
<                                                COURANT DE L'ITEM1.
<-----------------------------------------------------------------------
<        PTD                                     TEST DIRECT DES
<                                                CARACTERES DE 'SPACE'
<                                                A 'Z' ; ON TROUVE
<                                                LA LISTE DES @NOEUDS
<                                                OU SE BRANCHER PAR
<                                                INDEXATION.
<
<
<        UTILISATION DES REGISTRES :
<                    B=ARGUMENT1.
<                    X=NOM PRIMITIVE , ET CONDITIONS D'EXECUTION
<                      EN RETOUR DES PRIMITIVES (0 SI OK) ,
<                    Y=EN GENERAL LE CARACTERE COURANT (IEG) DE
<                      L'ITEM COURANT.
<                    C=@PRIMITIVE COURANTE ,
<                    W=@BRANCH.
<
<
<        P R I M I T I V E S   A   A D R E S S E ( S )  :
<
PC:      VAL         1+'80           < PRIMITIVE 'CALL'.
PCI:     VAL         2+'80           < PRIMITIVE 'CALL INDIECT'.
PUSH:    VAL         3+'80+PLPRIM    < EMPILEMENT DANS PIR SANS ARG2.
PULL:    VAL         4+'80+PLPRIM    < DEPILEMENT DE PIR SANS ARG2.
PG:      VAL         5+'80+PLPRIM    < GET CARACTERE SANS ARG2.
PTD:     VAL         6+'80+PLPRIM    < TEST DIRECT DE CARACTERE.
PT:      VAL         7+'80           < PRIMITIVE 'TEST'.
<
<        A T T E N T I O N  :
<                      PRIMT DOIT ETRE LA DERNIERE PRIMITIVE
<                    A CAUSE DE LA TABLE D'AIGUILLAGE DE
<                    L'INTERPRETEUR.
<
PTM:     VAL         PT+PLPRIM       < PRIMITIVE 'TEST' SANS ARG2.
<
<        P R I M I T I V E S   S E Q U E N T I E L L E S  :
<
PCS:     VAL         PC+PBSEQ        < 'CALL' SEQUENTIEL.
PUSHS:   VAL         PUSH+PBSEQ      < 'PUSH' SEQUENTIEL.
PULLS:   VAL         PULL+PBSEQ      < 'PULL' SEQUENTIEL.
PGS:     VAL         PG+PBSEQ        < 'GET CARACT' SEQUENTIEL.
<
<
<        P R I M I T I V E   ' C A L L '  :
<
<
PRIMCI:  EQU         $
         LA          ARG2,C          < A=@NOEUD DE RELAI DE LA ROUTINE.
         LR          A,C             < C=@NOUVEAU NOEUD.
PRIMC:   EQU         $
         BSR         ARG2,C          < APPEL DE LA ROUTINE DONT
                                     < L'ADRESSE EST DONNEE PAR ARG2.
         JMP         LOOPB           < VERS LE RETOUR DES PRIMITIVES ,
                                     < X AYNAT ETE EVENTUELLEMENT
                                     < POSITIONNE PAR LA ROUTINE (ARG2).
<
<
<        T E S T   D I R E C T   C A R A C T E R E  :
<
<
PRIMTD:  EQU         $
         LXI         CP
         LBY         &APRC           < A=COMPTE COURANT DES PARENTHESES
                                     < SOUS CE NIVEAU DE RECURSIVITE.
         CPBY        ICALLI          < TEST PAR RAPPORT AU SEUIL ...
         LR          Y,A             < A=CARACTERE COURANT A PRIORI.
         JL          E979            < LORSQUE LE COMPTE COURANT EST
                                     < STRICTEMENT INFERIEUR A 4 ,
                                     < ON CONSERVE LE MODE NORMAL DES
                                     < PRIMITIVES ....
<
< CAS OU LE COMPTE DE PARENTHESES SOUS CE
< NIVEAU EST SUPERIEUR OU EGAL A 4 ,
< ON PROCEDE A L'APPEL IMPLICITE DE
< PROGRAMMES DE BIBLIOTHEQUE ...
< LE FORMAT DE LA BIBLIOTHEQUE DOIT ALORS
< ETRE SPECIAL , ET ETRE COMPOSEE EN TETE
< DE BLOCS DE 5 CARACTERES DU TYPE '&X; )' ,
< CLASSE PAR ORDRE CROISSANT DES VALEURS DES
< CARACTERES.
<
         CPI         ")"             < EST-CE UNE FERMANTE ???
         JE          E979            < OUI , ON LA CONSERVE.
         CPI         "("             < EST-CE UNE OUVRANTE ????
         JE          E979            < OUI , ON LA CONSERVE ...
         ADRI        -'20,A          < LES AUTRES CARACTERES SONT
                                     < TRANSLATES PAR RAPPORT A 'SPACE'.
         MP          C5              < ON MULTIPLIE PAR LA LONGUEUR
                                     < DES BLOCS D'EN-TETE DE LA
                                     < BIBLIOTHEQUE.
         STB         SAVE            < QUE L'ON MET DANS SAVE COMME
                                     < FUTUR POINT D'ENTREE D'UN
                                     < SOUS-PROGRAMME A APPEL IMPLICITE.
         LAI         "!"             < ET LE CARACTERE COURANT EST
                                     < REMPLACE PAR LE CARACTERE DE
                                     < BRANCHEMENT '!'.
E979:    EQU         $               < CARACTERE NON RECONNU LORS
                                     < DE GET-CARACTERE.
         LXI         1               < RETOUR EN ERREUR A PRIORI.
         CPI         "Z"             < VALIDATION SUPERIEURE DE (A).
         JG          LOOPB           < ERREUR : CARACTERE NON RECONNU.
         ADRI        -'20,A          < TRANSLATION PAR RAPPORT A 'SPACE'
         JAL         LOOPB           < ERREUR : CARACTERE NON RECONNU.
         LXI         0               < RETOUR OK (PAR PROPRETE).
         ADR         A,C             < SI LE CARACTERE EST DANS
                                     < LE SEGMENT ('SPACE','Z') IL
                                     < RECONNU , ET SERT D'INCREMENT
                                     < A LA BASE C POUR ATTEINDRE SON
                                     < NOEUD DE TRAITEMENT ; RETOUR OK.
         LA          ADER,C          < ACCES A L'ADRESSE DE TRAITEMENT
                                     < DE LA PRIMITIVE (Y).
         JAGE        E962            < OK , PRIMITIVE NON INHIBEE.
         LA          ASAUT           < LORSQUE LA PRIMITIVE EST INHIBEE ,
                                     < ON FAIT UN SUAT IMPLICITE DANS
                                     < LA GRAMMAIRE EN N1616.
         JMP         E962            < VERS LA BOUCLE DE L'INTERPRETEUR.
<
<
<        P R I M I T I V E   ' G O T O '  :
<
<
PRIMA:   EQU         $
         LXI         0               < IL SUFFIT DE FAIRE UN RETOUR OK.
<
<
<        R E T O U R   D E S   P R I M I TI V E S  :
<
<
LOOPB:   EQU         $
RAC:     EQU         $
<        ON A ICI :
<                    B=QUELQUE CHOSE (ARG1,....) ,
<                    X=CONDITION DE RETOUR DE LA PRIMITIVE (0 : OK).
         LA          PR,C            < POUR TESTER LES BITS 0 & 1
                                     < DE LA PRIMITIVE QUE L'ON VIENT
                                     < D'EXECUTER.
         TBT         GON1            < DOIT-ON ALLER AU NOEUD 'N1' ???
         JNC         E961            < NON.
         LA          AGON1           < OUI : A=@NOEUD N1.
         JMP         E962            < VERS LE SAUT EN N1.
E961:    EQU         $
         TBT         LPRIM           < ARG2 EST-IL ABSENT ????
         SBCR        C               < SI OUI , IL FAUT DECREMENTER
                                     < LA BASE C D'UNE UNITE.
         ADRI        ADER-PR,C       < CAS PRIMITIVE SEQUENTIELLE
                                     < A PRIORI.
         TBT         BSEQ            < TEST DU BIT 'SEQUENTIEL'.
         JC          LOOP            < EN EFFET LA PRIMITIVE QUE L'ON
                                     < VIENT D'EXECUTER EST DE TYPE
                                     < SEQUENTIELLE , (C) EST BONNE.
<
< CAS DES PRIMITIVES A ADRESSE(S) :
<
         CPZR        X               < COMMENT CELA S'EST-L PASSE ???
         JNE         E2              < MAL , ET VOUS ??? RETOUR
                                     < EN ERREUR PAR 'ADER'.
         ADRI        ADOK-ADER,C     < BIEN , RETOUR PAR 'ADOK'.
E2:      EQU         $
         LA          0,C             < ACCES A L'@PRIMITIVE SUIVANTE.
         JAL         LOOP            < EN FAIT CE QUE L'ON VIENT
                                     < D'ACCEDER EST LA PRIMITIVE
                                     < SUIVANTE ELLE-MEME (CF. BIT0=1).
                                     < (ET (C) EST DONC BON).
E962:    EQU         $               < CAS DES SAUTS IMPLICITES EN N1.
         LR          A,C             < SINON ON SE 'BRANCHE' SUR LA
                                     < PRIMITIVE SUIVANTE.
<
<
<        B O U C L E   D E   L ' I N T E R P R E T E U R
<                    G R A P H I Q U E  :
<
<
LOOP:    EQU         $
         LAI         0               < NETTOYAGE DE A.
         LB          PR,C            < ACCES A LA PRIMITIVE COURANTE.
         DV          C100            < DECONCATENATION : B=ARGUMENT1.
         ANDI        'F              < A=NOM DE LA PRIMITIVE (C).
         ADRP        A               < GOTO L'EXECUTION SPECIFIQUE.
<
<        T A B L E   D ' A I G U I L L A G E  :
<
         JMP         PRIMC           < PRIMITIVE 'CALL'.
         JMP         PRIMCI          < PRIMITIVE 'CALL INDIRECT'.
         JMP         PRIMPS          < PUSH.
         JMP         PRIMPL          < PULL.
         JMP         PRIMG           < PRIMITIVE 'GET CARACTERE'.
         JMP         PRIMTD          < PRIMITIVE 'TEST DIRECT CARACTERE'
<
<
<        P R I M I T I V E   ' T E S T   C A R A C T E R E '  :
<
<
<        ARGUMENT :
<                    Y=CARACTERE COURANT (IEG) DE L'ITEM COURANT ,
<                    B=CARACTERE ATTENDU.
<
<
<        RESULTAT :
<                    X=0 : (B)=(Y) ,
<                    X#0 : (B)#(Y).
<
<
PRIMT:   EQU         $
         LXI         1               < CARACTERE (B) NON RECONNU A
                                     < PRIORI ; IL EST A NOTER QUE LA
                                     < NON RECONNAISSANCE A LIEU PLUS
                                     < SOUVENT QUE LA RECONNAISSANCE
                                     < EN ANALYSE SYNTAXIQUE , C'EST
                                     < POURQUOI ON CHOISIT L'ERREUR
                                     < A PRIORI.
         CPR         Y,B             < TEST DE ECONNAISSANCE.
         JNE         LOOPB           < CARACTERE RECONNU , RETOUR
                                     < EN ERREUR A LOOPB.
<
< CAS OU LA RECONNAISSANCE A EU LIEU :
<
         JMP         PRIMA           < VERS UN RETOUR OK A LOOPB.
<
<
<         P U S H   P I L E   D E   R E C U R S I V I T E  :
<
<
<        ARGUMENT :
<                    B=0 : UNIQUEMENT COMPTER LES PARENTHESES '(' ,
<                    B=CAUSE DU PUSH#0 : EMPILEMENT REEL DANS PIR.
<                     ='40 : PUSH POUR REPEAT ,
<                     ='20 : PUSH POUR APPEL PROGRAMME.
<                     ='10 : PUSH POUR SAUT DE DEFINITION DE PROGRAMME.
<                     ='20+'10 : PUSH POUR APPEL PROGRAMME , AVEC
<                                CHANGEMENT D'ITEM COURANT.
<                    Y=NBRE DE REPETITIONS A FAIRE SOUS CE NIVEAU.
<                      (SIGNIFICATIF UNIQUEMENT SI B#0).
<
<
<        RESULTAT :
<                    X#0 : SI L'OPERATION DEMANDEE EST ILLICITE.
<
<
PRIMPS:  EQU         $
         CPZR        B               < EST-CE UN VRAI PUSH ????
         JE          E15             < NON , COMPTE DES '('.
         BSR         ASTAB           < ESSAI DE STABILISATION VIDEO.
<
< CAS DES PUSH VERITABLES :
<
         LA          APRC            < ACCES AU RELAI COURANT VERS PIR.
         RBT         0               < A=@ENTREE COURANTE DANS PIR.
         LXI         CDCP            < A PRIORI X=1#0 (RETOUR EN
                                     < ERREUR).
         CP          TPR             < EST-ON DEJA UA SOMMET DE PIR ???
         JGE         LOOPB           < OUI , RETOUR EN ERREUR ,
                                     < ON NE PEUT EMPILER : X=1#0 !!!
<
< CAS OU ON PEUT EMPILER :
<
         LA          APRC
         ADRI        LEPR,A          < PASSAGE SUR L'ENTREE SUIVANTE
                                     < DE PIR.
         STA         APRC
<
< INITIALISATION DE LA NOUVELLE ENTREE :
<
         SWBR        Y,A             < CD=(Y) (COMPTE DE REPETITIONS).
         ANDI        'FF00           < CLEAR L'OCTET 1 DE A.
         ORI         1               < CP=1 (COMPTE DE PARENTHESES).
         STA         &APRC           < MISE DANS LE MOT1 DE L'ENTREE
                                     < COURANTE DE PIR.
         LXI         IR              < RETOUR OK (X=IR=0).
         SWBR        B,A             < MISE DE LA CAUSE DU PUSH EN
                                     < OCTET0 DE A.
         AD          IEG             < RECUPERATION DE L'INDEX COURANT.
         TBT         BITREP          < EST-CE UN PUSH POUR REPETITIONS??
         SBCR        A               < SI OUI , RETOUR SUR '('.
         STA         &APRC           < MISE EN MOT0 DE LA NOUVELLE
                                     < ENTREE COURANTE DE PIR.
<
< TEST D'UN CHANGEMENT D'ITEM :
<
         TBT         BITPRO
         JNC         PRIMA           < CE N'EST PAS L'APPEL D'UN
                                     < PROGRAMME : RETOUR OK A LOOPB.
         TBT         BITDEF          < CAS D'UN APPEL PROGRAMME ,
                                     < Y-A-T'IL DE PLUS UN CHANGEMENT
                                     < D'ITEM COURANT ???
         JNC         PRIMA           < NON , RETOUR OK A LOOPB.
         BSR         ACHGTI          < CHANGEMENT D'ITEM COURANT.
E201:    EQU         $
<        ON A ICI :
<                    MOT0(ENTREE COURANTE PIR)=CAUSE-PUSH/INDEX-'(' ,
<                    OCTET2(ENTREE COURANTE PIR)=NBRE DE REPETITIONS ,
<                    OCTET3(ENTREE COURANTE PIR)=1 (COMPTE PARENTHESES).
         JMP         PRIMA           < VERS UN RETOUR OK A LOOPB.
<
< COMPTE DES '(' :
<
E15:     EQU         $
         LXI         CP
         LBY         &APRC           < ACCES AU COMPTE ALGEBRIQUE
                                     < DES PARENTHESES.
         ADRI        1,A             < ET UNE '(' DE PLUS.
         TBT         7               < CE COMPTE TIENT-IL DANS
                                     < UN OCTET ????
         JC          LOOPB           < NON , ERREUR : X=CP#0.
         STBY        &APRC           < SI LE COMPTE EST VALIDE , ON
                                     < MET A JOUR CP.
         JMP         PRIMA           < RETOUR OK A LOOPB.
<
<
<        P U L L    P I L E   D E   R E C U R S I V I T E  :
<
<
<        FONCTION :
<                      CE MODULE GERE POUR CHAQUE ENTREE
<                    COURANTE DE PIR , LES COMPTES DE
<                    BOUCLE DE REPETITIONS , ET LE COMPTE
<                    ALGEBRIQUE DES PARENTHESES (+1 POUR '(' ,
<                    -1 POUR ')') . LORSQUE LE COMPTE DE
<                    PARENTHESES PASSE PAR 0 , IL
<                    REGARDE SI IL Y A UNE REPETITION
<                    A FAIRE (C-A-D SI LE COMPTE DE
<                    REPETITIONS RESTANT A FAIRE EST #0).
<                    S'IL N'Y A PLUS DE REPETITIONS
<                    A FAIRE , IL Y A UN PULL VERITABLE
<                    D'EFFECTUER SUR PIR.
<
<
<        ARGUMENT :
<                    B#0 : PULL VERITABLE ,
<                    B=0 : FAIRE UNIQUEMENT -1 SUR LE CP COURANT.
<                          (PERMET DE COMPTER LES ')' ).
<
<
<        RESULTAT :
<                    X#0 : SI L'OPERATION DEMANDEE EST ILLICITE.
<                          OU SI CP=0 DANS LE CAS B=0.
<
<
PRIMPL:  EQU         $
<
< DECOMPTE DES PARENTHESES :
<
         LXI         CP
         LBY         &APRC           < ACCES AU COMPTE COURANT DES
                                     < PARENTHESES SOUS CE NIVEAU DE PIR
         JAE         LOOPB           < ERREUR : TROP DE ')' , A NOTER
                                     < QU'ON A : X=CP#0.
         ADRI        -1,A
         STBY        &APRC           < SINON , MAJ DU CP COURANT.
         JANE        PRIMA           < RETOUR OK SANS DEPILEMENT
                                     < SI LE CP NE PASSE PAR 0.
<
< CAS D'UN COMPTE DE PARENTHESES NUL :
<
         CPZR        B               < TEST DU MODE D'APPEL ???
         JE          LOOPB           < CAS B=0 : ON FAIT UN RETOUR
                                     < EN ERREUR (X#0) POUR ANNULATION
                                     < DU CP COURANT.
E101:    EQU         $
<
< DECOMPTE DES REPETITIONS :
<
         LXI         CD
         LBY         &APRC
         JAE         PRIMA           < CAS DE LA 1ERE ENTREE DE LA PILE,
                                     < IL NE FAUT SURTOUT PAS DEPILER ,
                                     < CAR ON TOMBERAIT EN ERREUR.
         ADRI        -1,A            < A=NBRE DE REPETITIONS RESTANT
                                     < A FAIRE SOUS CE NIVEAU DE PIR.
         JANE        E14             < IL RESTE AU MOINS UNE REPETITION
                                     < A FAIRE , ALLONS Y ....
<
< CAS OU IL N'Y A PLUS DE REPETITIONS
< A FAIRE , ON FAIT UN PULL VERITABLE SUR
< PIR ; A NOTER QUE L'INDEX IEG A
< LA VALEUR QUI LUI CONVIENT POUR
< PERMETTRE L'ACCES AU CARACTERE SUIVANT
< LA ')' :
<
         LA          APRC
         RBT         0               < ACCES A L'ADRESSE DE L'ENTREE
                                     < COURANTE DE PIR.
         LXI         1               < ERREUR A PRIORI.
         CP          BPR             < EST-ON DEJA A LA BASE DE LA PIR ?
         JLE         LOOPB           < OUI , RETOUR EN ERREUR : ON NE
                                     < PEUT ALLER PLUS BAS !!! (X=1).
<
< CAS OU ON PEUT DEPILER :
<
E90:     EQU         $               < ENTRY POUR RETOUR PROGRAMME.
         LA          APRC
         ADRI        -LEPR,A         < RETOUR SUR L'ENTREE PRECEDENTE
                                     < DE PIR.
         STA         APRC
         JMP         PRIMA           < VERS UN RETOUR OK A LOOPB.
<
< CAS OU IL RESTE AU MOINS UNE REPETITION :
<
E14:     EQU         $
         STBY        &APRC           < MAJ DU CD COURANT.
         LXI         IR
         LA          &APRC
         LR          A,B             < B=ENTREE 'IR' DE PIR.
         TBT         BITPRO          < EST-CE UN RETOUR DE PROGRAMME ???
         AND         CFFF            < RAZ DES BITS 0,1,2 ET 3.
         STA         IEG             < RETOUR AU DEBUT DE LA REPETITION.
         JNC         LOOPB           < CE N'EST PAS UN RETOUR DE
                                     < PROGRAMME , FAISON DONC UN
                                     < RETOUR OK ; A NOTER : X=IR=0 (OK)
<
< CAS D'UN RETOUR DE PROGRAMME :
<
         TBT         16+BITDEF
         JNC         E90             < C'EST UN RETOUR SANS CHANGEMENT
                                     < D'ITEM COURANT ; ALLONS DEPILER
                                     < LA RECURSIVITE PIR.
         BSR         ACHGTI          < CHANGEMENT D'ITEM COURANT.
         JMP         E90             < VERS LE DEPILEMENT DE LA
                                     < RECURSIVITE PIR.
         PAGE
<
<
<        C H A N G E M E N T   D ' I T E M   C O U R A N T  :
<
<
CHGTI:   EQU         $
         LA          ACCEB
         NGR         A,A             < LA CONSTANTE DE TRANSLATION
                                     < EST INVERSEE.
         STA         ACCEB
         AD          AIC
         STA         AIC             < TRANSLATION DE L'ITEM COURANT
                                     < (CETTE TRANSLATION EST POSITIVE ,
                                     < OU NEGATIVE).
         RSR
         PAGE
<
<
<        P R O G R A M M E   I N T E R P R E T A T I F
<        D ' I N T E R P R E T A T I O N   D E S
<        P R O G R A M M E S   G R A P H I Q U E S  :
<
<
<
<        R E T O U R   A U   C C I  :
<
N23:     BYTE        PC+PGON1;0
         WORD        GOCCI           < RETOUR CCI , PUIS RETOUR A GE.
<
<        E R R E U R S   D ' E X E C U T I O N   O U
<        C O M M A N D E   N O N   R E C O N N U E  :
<
N24:     EQU         $
N25:     EQU         $
N27:     EQU         $
         BYTE        PC+PGON1;0
         WORD        CARUP           < MISE EN POSITION HAUTE DU
                                     < CARACTERE ERRONNE EVENTUELLEMENT.
<
<        P R I M I T I V E S   N O N   R E C O N N U E S  :
<
N610:    EQU         N27             < CAS DES PRIMITIVES NON RECONNUES.
<
<        R E T O U R   E N   E R R E U R
<        A   L ' A P P E L A N T  :
<
N700:    BYTE        PCS;0
         WORD        GOGER           < RETOUR A L'APPELANT SANS TOUCHER
                                     < AU TYPE DE L'ITEM1.
<
<        R E T O U R   A   ! G E  :
<
N22:     BYTE        PCS;0
         WORD        GOGE            < TENTATIVE DE CHARGEMENT DE
                                     < L'OVERLAY !GE ; SI CE N'EST PAS
                                     < UNE REUSSITE , ON REND LA MAIN
                                     < AU CCI.
<
<        I N V E R S I O N   D E S   I N H I B I T I O N S  :
<
N940:    BYTE        PGS;0           < Y=<PRIMITIVE> A INVERSER.
         BYTE        PC+PGON1;0
         WORD        INVERS          < INVERSION DE LA PRIMITIVE
<
<        A U T O R I S A T I O N   P R I M I T I V E  :
<
N945:    BYTE        PGS;0           < Y=<PRIMITIVE> A AUTORISER.
         BYTE        PC+PGON1;1      < B=1 : AUTORISATION PRIMITIVE.
         WORD        INVERS          < AUTORISATION DE LA PRIMITIVE (Y).
<
<        T R A I T E M E N T   D E S   I N H I B I T I O N S  :
<
N1616:   EQU         $
         BYTE        PGS;1           < 1 AFIN DE POUVOIR RENTRER
                                     < CORRECTEMENT DANS LA BOUCLE
                                     < D'ANALYSE PRINCIPALE MEME
                                     < EN MODE INTERACTIF.
         BYTE        PTM;"("         < EST-CE UNE OUVRANTE ???
         WORD        N1617           < NON , ACCES A LA PRIMITIVE
                                     < SUIVANTE (Y).
         WORD        N1000           < DANS LE CAS D'UNE OUVRANTE ,
                                     < ON VA SAUTER TOUT CE QUI EST
                                     < ENTRE L'OUVRANTE ET LA FERMANTE.
<
<        E F F A C E M E N T   E C R A N  :
<
N21:     BYTE        PC+PGON1;0
         WORD        ERASE           < EFFACEMENT ECRAN.
<
<        H A R D - C O P Y  :
<
N750:    BYTE        PC+PGON1;0
         WORD        HCOPY           < HARD-COPY ET TEMPORISATION.
<
<        T R A I T E M E N T   D E S   ' ( '   S I M P L E S  :
<
N14:     BYTE        PUSH;0          < UNIQUEMENT POUR FAIRE +1 SUR CP.
         WORD        N27             < TROP DE '(' : ABORT ...
         WORD        N1              < OK , GO ON ...
<
<        T R A I T E M E N T   D E S   ' ) '  :
<
N15:     BYTE        PULL;1          < PULL VERITABLE.
         WORD        N27             < TROP DE ')' : ABORT.
         WORD        N1              < OK.
<
<        D E F I N I T I O N   A R G U M E N T   F O R M E L  :
<
N1001:   EQU         $
         BYTE        PGS;0           < ACCES AU CARACTERE COURANT (Y).
         BYTE        PTM;"("         < UNE '(' SUIT-ELLE LE SIGNE '=' ???
         WORD        N27             < NON , MISSING '(' ....
         BYTE        PC;0            < OUI , OK.
         WORD        DARGF           < SAVE DANS ARGF L'INDEX DE
                                     < LA 1ERE PRIMITIVE DE L'ARGUMENT
                                     < FORMEL COURANT.
         WORD        N1000           < RETOUR EN ERREUR DE DARGF POUR
                                     < ALLER VERS LE SAUT DE LA DEFINITION
                                     < D'UN PROGRAMME.
<
<        A P P E L   A R G U M E N T   F O R M E L  :
<
N941:    EQU         $
         BYTE        PC;0
         WORD        CARGF           < MISE DANS SAVE DE L'INDEX DE
                                     < LA 1ERE PRIMITIVE DE L'ARGUMENT
                                     < FORMEL (AFIN D'ASSIMILER DET
                                     < APPEL A L'APPEL D'UN PROGRAMME).
         WORD        N27             < ERREUR : PAS D'ARGUMENT FORMEL
                                     < COURANT !!!
         WORD        N942            < OK , ON FAIT COMME SI ON AVIT
                                     < TROUVE LA DEFINITION D'UN
                                     < PROGRAMME CHERCHE ...
<
<        A P P E L   A R G U M E N T   F O R M E L
<        D E   L ' A U T R E   I T E M  :
<
N9410:   EQU         $
         BYTE        PC;0
         WORD        CARGF           < MISE DANS SAVE DE L'INDEX DE LA
                                     < 1ERE PRIMITIVE DE L'ARGUMENT
                                     < FORMEL COURANT , S'IL EXISTE ....
         WORD        N27             < ERREUR , N'EXISTE PAS ...
         WORD        NCDIR           < OK , ON L'ASSIMILE A L'APPEL
                                     < D'UN PROGRAMME DE BIBLIOTHEQUE.
<
<        D E M A N D E   D E   R E P E T I T I O N S  :
<
N8:      BYTE        PGS;0           < ACCES AU CARACTERE COURANT (Y).
         BYTE        PC;0
         WORD        REPET1          < SAVREP=NBRE DE REPETITIONS
                                     < DEMANDEES.
         WORD        N27             < ERREUR : NBRE ERRONE.
N30:     BYTE        PGS;0           < ACCES AU CARACTERE COURANT (Y).
         BYTE        PTM;"("         < EST-CE UNE '(' ???
         WORD        N27             < ERREUR : MISSING '(' ...
         BYTE        PCS;0
         WORD        REPET2          < Y=NBRE DE REPETITIONS DEMANDEES.
         BYTE        PUSH;CODREP     < EMPILEMENT DE LA RECURSIVITE.
                                     < (Y=NBRE DE REPETITIONS).
         WORD        N27             < PUSH IMPOSSIBLE.
         WORD        N1              < ET LA BOUCLE EST LANCEE.
<
<        M O D I F I C A T I O N   C T T E  :
<
N31:     BYTE        PGS;0           < ACCES AU CARACTERE COURANT (Y).
         BYTE        PC;0
         WORD        REPET1          < RECUPERATION DE CTTE DANS
                                     < SAVE A PARTIR DE Y.
         WORD        N27             < ERREUR : CTTE ILLEGALE.
         BYTE        PC+PGON1;0
         WORD        SCTTE           < OK , MAJ DE CTTE.
<
<        C H A N G E M E N T   D E   P L A N  :
<
N600:    BYTE        PGS;0           < ACCES AU NUMERO DU PLAN.
         BYTE        PTM;"1"         < EST-CE LE PLAN 1 ???
         BYTE        PT;"2"          < EST-CE LE PLAN 2 ???
         WORD        N601            < SELECTION DU PLAN 1 (X3,Y3).
         BYTE        PT;"3"          < EST-CE LE PLAN 3 ???
         WORD        N602            < SELECTION DU PLAN 2 (Y3,Z3).
         WORD        N27             < ERREUR : PLAN NON RECONNU.
N603:    BYTE        PC+PGON1;2      < SELECTION DU PLAN (Z3,X3).
         WORD        CHPLAN
N601:    BYTE        PC+PGON1;4      < SELECTION DU PLAN (X3,Y3).
         WORD        CHPLAN
N602:    BYTE        PC+PGON1;9      < SELECTION DU PLAN (Y3,Z3).
         WORD        CHPLAN
<
<        E N T R Y   I N T E R P R E T A T I V E  :
<
COM0:    EQU         $
         BYTE        PC;0
         WORD        CHECKT          < VALIDATION DU TYPE DE L'ITEM
                                     < COURANT.
         WORD        N700            < ERREUR : IL N'A PAS LE TYPE
                                     < 'TEXTE'/'DESSIN' : RETOUR
                                     < A L'APPELANT (EI/GO/GE).
<
<        O R I G I N E   S E G M E N T   C O U R A N T   ' A '  :
<
N4:      BYTE        PC+PGON1;4      < A NOTER : B=4 !!!
         WORD        EXECA           < MISE EN PLACE DE L'ORIGINE
                                     < DU SEGMENT COURANT.
<
<        E X T R E M I T E   S E G M E N T   C O U R E N T   ' B '  :
<
N5:      BYTE        PC+PGON1;4      < A NOTER : B=4 !!!
         WORD        EXECB           < MISE EN PLACE DE L'EXTREMITE DU
                                     < SEGMENT COURANT , AFFICHAGE
                                     < DU SEGMENT COURANT , ET
                                     < MODIFICATION DEE SON ORIGINE.
<
<        E X T R E M I T E   S E G M E N T   C O U R A N T  ' S '  :
<
N6:      BYTE        PC+PGON1;8      < A NOTER : B=8 !!!
         WORD        EXECS           < MISE EN PLACE DE L'EXTREMITE DU
                                     < SEGMENT COURANT , ET AFFICHAGE
                                     < DE CELUI-CI.
<
<        M I S E   A   B L A N C   E N   V I D E O  :
<
N2000:   BYTE        PC+PGON1;'40    < A NOTER : B='40.
         WORD        COLOR
<
<        N O I R   S I   B L A N C / B L A N C   S I   N O I R  :
<
N2001:   BYTE        PC+PGON1;'00    < A NOTER : B='00.
         WORD        COLOR
<
<        M O D I F I C A T I O N   D E   D X   O U   D Y  :
<
N2:      BYTE        PC;0
         WORD        SELDX           < SELECTION DX.
         WORD        N32             < VERS LA MODIFICATION DE DX.
N3:      BYTE        PCS;0
         WORD        SELDY           < SELECTION DE DY.
N32:     BYTE        PGS;0           < ACCES AU CARACTERE COURANT POUR
                                     < IDENTIFIER LA MODIFICATION
                                     < DEMANDEE SUR DX OU DY.
         BYTE        PTM;"+"         < EST-CE UNE INCREMENTATION ???
         BYTE        PT;"-"          < EST-CE UNE DECREMENTATION ??
         WORD        N33             < INCREMENTATION DE DX OU DY.
         BYTE        PT;"*"          < EST-CE UNE MULTIPLICATION ???
         WORD        N34             < DECREMENTATION DE DX OU DY.
         BYTE        PT;"/"          < EST-CE UNE DIVISION ???
         WORD        N35             < MULTIPLICATION DE DX OU DY.
         WORD        N36             < PAS DE FONCTION RECONNUE ,
                                     < ALLONS TENTER L'INITIALISATION
                                     < DE DX OU DY.
<
<        D I V I S I O N   D E   D X   O U   D Y  :
<
N37:     BYTE        PC+PGON1;0      < DIVISION DE DX OU DY :
                                     < DX OU DY<--(DX OU DY)/CTTE.
         WORD        EXECD
<
<        I N I T I A L I S A T I O N   D E   D X   O U   D Y  :
<
N36:     BYTE        PC;0            < EST-CE L'INITIALISATION DE DX
                                     < OU DE DY ???
         WORD        REPET1          < TENTATIVE DE RECUPERATION DE
                                     < LA CONSTANTE DONNEE EN ARGU-
                                     < MENT (APPELEE ALPHA).
         WORD        N27             < ERREUR : MAUVAISE CONSTANTE.
         BYTE        PC+PGON1;0
         WORD        EXECK           < INITIALISATION DE DX OU DY :
                                     < DX OU DY<--CTTE*ALPHA.
<
<        I N C R E M E N T A T I O N   D E   D X   O U   D Y  :
<
N33:     BYTE        PC+PGON1;0      < INCREMENTATION DE DX OU DY :
                                     < DX OU DY<--(DX OU DY)+CTTE.
         WORD        EXECP
<
<        D E C R E M E N T A T I O N   D E   D X   O U   D Y  :
<
N34:     BYTE        PC+PGON1;0      < DECREMENTATION DE DX OU DY :
                                     < DX OU DY<--(DX OU DY)-CTTE.
         WORD        EXECM
<
<        M U L T I P L I C A T I O N   D E   D X   O U   D Y  :
<
N35:     BYTE        PC+PGON1;0      < MULTIPLICATION DE DX OU DY :
                                     < DX OU DY<--(DX OU DY)*CTTE.
         WORD        EXECMU
<
<        I N C R E M E N T A T I O N   D E   D X   E T   D Y  :
<
N17:     BYTE        PCS;0
         WORD        SELDX           < SELECTION DE DX.
         BYTE        PCS;0
         WORD        EXECP           < INCREMENTATION DE DX :
                                     < DX<--(DX)+CTTE.
         BYTE        PC;0
         WORD        SELDY           < SELECTION DE DY.
         WORD        N33             < VERS L'INCREMENTATION DE DY :
                                     < DY<--(DY)+CTTE.
<
<        D E C R E M E N T A T I O N   D E   D X   E T   D Y  :
<
N18:     BYTE        PCS;0
         WORD        SELDX           < SELECTION DE DX.
         BYTE        PCS;0
         WORD        EXECM           < DECREMENTATION DE DX :
                                     < DX<--(DX)-CTTE.
         BYTE        PC;0
         WORD        SELDY           < SELECTION DE DY.
         WORD        N34             < VERS LA DECREMENTATION DE DY :
                                     < DY<--(DY)-CTTE.
<
<        M U L T I P L I C A T I O N   D E   D X   E T   D Y  :
<
N19:     BYTE        PCS;0
         WORD        SELDX           < SELECTION DE DX.
         BYTE        PCS;0
         WORD        EXECMU          < MULTIPLICATION DE DX :
                                     < DX<--(DX)*CTTE.
         BYTE        PC;0
         WORD        SELDY           < SELECTION DE DY.
         WORD        N35             < VERS LA MULTIPLICATION DE DY :
                                     < DY<--(DY)*CTTE.
<
<        D I V I S I O N   D E   D X   E T   D Y  :
<
N20:     BYTE        PCS;0
         WORD        SELDX           < SELECTION DE DX.
         BYTE        PCS;0
         WORD        EXECD           < DIVISION DE DX :
                                     < DX<--(DX)/CTTE.
         BYTE        PC;0
         WORD        SELDY           < SELECTION DE DY.
         WORD        N37             < VERS LA DIVISION DE DY :
                                     < DY<--(DY)/CTTE.
<
<        D E P L A C E M E N T   1   E S T  :
<
N9:      BYTE        PC+PGON1;0      < A NOTER : B=0.
         WORD        EXEC13
<
<        D E P L A C E M E N T   2   N O R D  :
<
N10:     BYTE        PC+PGON1;0      < A NOTER : B=0.
         WORD        EXEC24
<
<        D E P L A C E M E N T   3   O U E S T  :
<
N11:     BYTE        PC+PGON1;1      < A NOTER : B=1#0.
         WORD        EXEC13
<
<        D E P L A C E M E N T   4   S U D  :
<
N12:     BYTE        PC+PGON1;1      < A NOTER : B=1#0.
         WORD        EXEC24
<
<        M I S E   A   L ' O R I G I N E   D E   C V  :
<
N400:    BYTE        PC+PGON1;0
         WORD        ORIGIN
<
<        T R A N S F O R M A T I O N   C O U R A N T E   ' T '  :
<
N13:     BYTE        PGS;0           < ACCES AU CARACTERE COURANT (Y).
         BYTE        PTM;"="         < EST-CE UNE REINITIALISATION
                                     < DE LA TRANSFORMATION COURANTE T.
         WORD        N70             < NON , ESSAYONS UN PRODUIT
                                     < FONCTIONNEL.
<
<        I N I T I A L I S A T I O N   D E   T  :
<
         BYTE        PCS;0
         WORD        ITRANS          < ON FAIT : T=O.
N51:     BYTE        PGS;0           < ACCES AU CARACTERE COURANT (Y).
N70:     BYTE        PTM;" "         < EST-CE L'ELEMENT NEUTRE ???
         BYTE        PT;"R"          < EST UNE ROTATION ???
         WORD        N51             < CAS DE L'ELEMENT NEUTRE ' '.
         BYTE        PT;"S"          < EST-CE UNE SYMETRIE ???
         WORD        N52             < CAS DES ROTATIONS.
         BYTE        PT;"A"          < DESORTHOGONALISATION AIGUE ???
         WORD        N53             < CAS DES SYMETRIES.
         BYTE        PT;"O"          < DESORTHOGONALISATION OBTUE ???
         WORD        N500            < DESORTHOGONALISATION AIGUE.
         BYTE        PT;"H"          < DESORTHOGONALISATION HAUTE ???
         WORD        N501            < DESORTHOGONALISATION OBTUE.
         BYTE        PT;"B"          < DESORTHOGONALISATION BASSE ???
         WORD        N502            < DESORTHOGONALISATION HAUTE.
         BYTE        PT;";"          < EST-CE LA FIN DE LA MODIFICATION?
         WORD        N503            < DESORTHOGONALISATION BASSE.
         WORD        N25             < ERREUR : CARACTERE NON RECONNU.
         WORD        N1              < CAS DU ';' : C'EST LA FIN DE
                                     < MODIFICATION : VERS L'ACCES
                                     < A LA COMMANDE SUIVANTE.
<
<        C A S   D E S   R O T A T I O N S  :
<
N52:     BYTE        PGS;0           < ACCES AU CARACTERE COURANT (Y).
         BYTE        PTM;"P"         < EST-CE UNE ROTATION +TETA ???
         BYTE        PT;"M"          < EST-CE UNE ROTATION -TETA ??
         WORD        N54             < CAS DES ROTATIONS +TETA.
         BYTE        PT;"1"          < EST-CE UNE ROTATION +PI/2 ???
         WORD        N55             < CAS DES ROTATIONS -TETA.
         BYTE        PT;"3"          < EST-CE UNE ROTATION -PI/2 ????
         WORD        N56             < CAS DES ROTATIONS +PI/2.
         WORD        N25             < ERREUR : CARACTERE NON RECONNU.
N57:     BYTE        PC;TR3          < ROTATION -PI/2.
         WORD        UTRANS
         WORD        N51             < OK , VERS LA SUIVANTE.
N54:     BYTE        PCI;TRP         < ROTATION +TETA.
         WORD        N57
N55:     BYTE        PCI;TRM         < ROTATION -TETA.
         WORD        N57
N56:     BYTE        PCI;TR1         < ROTATION +PI/2.
         WORD        N57
<
<        C A S   D E S   S Y M E T R I E S  :
<
N53:     BYTE        PGS;0           < ACCES AU CARACTERE COURANT (Y).
         BYTE        PTM;"O"         < EST-CE UNE SYMETRIE ORIGINE ???
         BYTE        PT;"X"          < EST-CE UNE SYMETRIE OX ???
         WORD        N58             < CAS DES SYMETRIES ORIGINE.
         BYTE        PT;"Y"          < EST-CE UNE SYMETRIE OY ???
         WORD        N59             < CAS DES SYMETRIES OX.
         BYTE        PT;"1"          < EST-CE UNE SYMETRIE B1 ???
         WORD        N60             < CAS DES SYMETRIES OY.
         WORD        N25             < ERREUR : CARACTERE NON RECONNU.
N61:     BYTE        PCI;TS1         < SYMETRIE 1ERE BISSECTRICE.
         WORD        N57
N58:     BYTE        PCI;TSO         < SYMETRIE ORIGINE.
         WORD        N57
N59:     BYTE        PCI;TSX         < SYMETRIE OX.
         WORD        N57
N60:     BYTE        PCI;TSY         < SYMETRIE OY.
         WORD        N57
<
<        D E S O R T H O G O N A L I S A T I O N   D E S
<                    A X E S   L O C A U X  :
<
N500:    BYTE        PCI;TA          < MODE AIGU.
         WORD        N57
N501:    BYTE        PCI;TO          < MODE OBTU.
         WORD        N57
N502:    BYTE        PCI;TH          < MODE HAUT.
         WORD        N57
N503:    BYTE        PCI;TB          < MODE BAS.
         WORD        N57
<
<        S A U T   D E F I N I T I O N   P R O G R A M M E  :
<
N16:     BYTE        PGS;0           < ACCES AU CARACTERE COURANT (Y).
         BYTE        PTM;"("         < RECHERCHE DE LA 1ERE '('.
         WORD        N16             < BOUCLAGE JUSQU'A TROUVER
                                     < LA 1ERE '('.
N1000:   EQU         $               < ENTRY POUR LE SAUT D'UN ARGUMENT
                                     < FORMLE COURANT.
         BYTE        PCS;1           < A NOTER : B=1 !!!
         WORD        SETY            < POUR FAIRE CD=1 LORS DU PUSH
                                     < QUI VA SUIVRE (Y=1).
         BYTE        PUSH;CODDEF     < EMPILEMENT DE LA RECURSIVITE
                                     < LORS DE LA RENCONTRE DE
                                     < LA 1ERE '('.
         WORD        N27             < PUSH IMPOSSIBLE.
N63:     BYTE        PGS;0           < ACCES AU CARACTERE COURANT (Y).
         BYTE        PTM;"("         < EST-CE UNE '(' ???
         BYTE        PT;")"          < EST-CE UNE ')' ???
         WORD        N64             < CAS DES '('.
         WORD        N63             < ON BOUCLE POUR LES CARACTERES
                                     < DIFFERENTS DE '(' ET ')'.
         BYTE        PULL;0          < -1 SUR CP POUR ')'.
         WORD        N65             < RETOUR POUR CP=0 : C'EST LA
                                     < FIN DE LA DEFINITION DU PROGRAMME
         WORD        N63             < CE N'EST PAS ENCORE LA ')'
                                     < DE FIN DE DEFINITION.
N64:     BYTE        PUSH;0          < +1 SUR CP POUR '('.
         WORD        N25             < PUSH IMPOSSIBLE ???
         WORD        N63             < OK ...
N65:     BYTE        PUSHS;0         < REMISE DE CP=1 LORS DE LA
                                     < RENCONTRE DE LA FIN DE
                                     < DEFINITION.
         BYTE        PULL;1          < PULL VERITABLE DE DEPILEMENT
                                     < DE LA RECURSIVITE.
         WORD        N25             < PULL IMPOSSIBLE ???
         WORD        N1              < OK , ACCES A LA COMMANDE SUIVANTE
<
<        A P P E L   P R O G R A M M E  :
<
N7:      EQU         $
N411:    BYTE        PCS;0
         WORD        SAVNOM          < SAVE=INDEX 1ER CARACTERE DU
                                     < NOM CHERCHE.
N80:     BYTE        PGS;0           < ACCES AU CARACTERE COURANT (Y).
         BYTE        PTM;";"         < EST-CE LA FIN DU PROGRAMME
                                     < CHERCHE ';' ???
         WORD        N80             < NON , ON CONTINUE LE PARCOURS.
         BYTE        PC;0
         WORD        LOOKP           < RECHERCHE DE LA DEFINITION DU
                                     < PROGRAMME APPELE.
                                     < (SI OK : SAVE=INDEX 1ERE
                                     < COMMANDE DU PROGRAMME).
         WORD        N300            < LE PROGRAMME N'EXISTE PAS
                                     < DANS L'ITEM COURANT.
N942:    EQU         $               < ENTRY POUR APPEL ARGUMENT FORMEL.
         BYTE        PCS;2           < A NOTER : B=2 !!!
         WORD        SETY            < FAIT : Y=2 , POUR LE PUSH
                                     < QUI VA SUIVRE.
         BYTE        PUSH;CODPRO     < EMPILEMENT DE LA RECURSUIVITE ,
                                     < AVEC CD=2 , ET IEG=INDEX DE
                                     < RETOUR (SUIT IMMEDIATEMENT ';').
                                     < AINSI LORS DU PULL DE FIN DE
                                     < PROGRAMME , PUISQUE CD=2 , ON
                                     < FERA UNE FAUSSE REPETITION ,
                                     < AVEC COMME INDEX DE BOUCLAGE ,
                                     < L'INDEX DE RETOUR (A LA SUITE
                                     < DE ';' ....
         WORD        N27             < ERREUR : PUSH IMPOSSIBLE.
N301:    BYTE        PC+PGON1;0
         WORD        START           < LANCEMENT DU PROGRAMME APPELE
                                     < A L'INDEX CONTENU DANS SAVE.
<
<        A P P E L   D I R E C T   D ' U N   P R O G R A M M E
<        E N   B I B L I O T H E Q U E  :
<
N860:    BYTE        PCS;0
         WORD        SAVNOM          < SAVE=INDEX DU 1ER CARACTERE
                                     < DU NOM CHERCHE.
N861:    BYTE        PGS;0           < ACCES AU CARACTERE COURANT (Y).
         BYTE        PTM;";"         < EST-CE LA FIN DU NOM CHERCHE ???
         WORD        N861            < NON , ON CONTINUE LE PARCOURS ...
<
<        R E C H E R C H E   E N   B I B L I O T H E Q U E  :
<
N300:    BYTE        PC;0
         WORD        CHECKB          < VALIDATION DE L'ITEM CONTENANT
                                     < LA BIBLIOTHEQUE PRESUMEE.
         WORD        N25             < LE TYPE N'EST PAS ACCEPTABLE ,
                                     < LE PROGRAMME N'EXISTE DONC PAS.
         BYTE        PC;0
         WORD        LOOKPB          < SINON , ON FAIT UNE RECHERCHE
                                     < DANS LA BIBLIOTHEQUE.
         WORD        N25             < LE PROGRAMME N'EXISTE VRAIMENT
                                     < PAS , ERREUR.
NCDIR:   EQU         $               < NOEUD D'APPEL IMPLICITE DES
                                     < PROGRAMMES DE BIBLIOTHEQUES
                                     < SPECIALES.
         BYTE        PCS;2
         WORD        SETY            < Y=2.
         BYTE        PUSH;CODPRO+CODDEF
                                     < ON FAIT UN PUSH POUR APPEL
                                     < PROGRAMME , AVEC CHANGEMENT
                                     < D'ITEM COURANT.
         WORD        N27             < ERREUR : PUSH IMPOSSIBLE.
         WORD        N301            < OK , START DANS LE PROGRAMME.
<
<        C H A R G E M E N T   B I B L I O T H E Q U E  :
<
N302:    BYTE        PCS;0
         WORD        SAVNOM          < SAUVEGARDE DANS 'SAVE' DE
                                     < L'INDEX DU 1ER CARACTERE DU
                                     < <NOM-BIBLIOTHEQUE>.
N303:    BYTE        PGS;0           < RECUPERATION DU <NOM> PAR
                                     < CARACTERE.
         BYTE        PTM;";"         < EST-CE LA FIN DE <NOM> ???
         WORD        N303            < ON BOUCLE SUR LA RECUPERATION
                                     < DU <NOM> JUSQU'A TROUVER UN ';'.
         BYTE        PC;0            < A NOTER : B=0 !!!
         WORD        LOADB           < TENTATIVE DE CHARGEMENT DE
                                     < LA BIBLIOTHEQUE.
         WORD        N25             < ERREUR : ELLE N'EXISTE PAS.
         BYTE        PC;0
         WORD        CHECKB          < DANS LE CAS OU ELLE EXISTE ,
                                     < ON VERIFIE SON TYPE 'T' OU 'D'.
         WORD        N25             < ERREUR : MAUVAIS TYPE.
         WORD        N1              < OK , VERS L'ACCES A LA
                                     < COMMANDE SUIVANTE.
<
<        O P E R A T I O N S   S U R   ' S T A C K '  :
<
N310:    BYTE        PGS;0           < ACCES AU CARACTERE COURANT (Y).
         BYTE        PTM;"I"         < EST-CE UN 'PUSH' (IN).
         BYTE        PT;"O"          < EST-CE UN 'PULL' (OUT).
         WORD        N311            < CAS DES MOVE IN STACK (PUSH).
         WORD        N27             < ERREUR : COMMANDE NON RECONNUE.
<
<        M O V E   O U T   ' P U L L '  :
<
         BYTE        PCI;0           < A NOTER : B=0.
         WORD        N311            < VERS LA MEMORISATION DU SENS.
<
<        M O V E   I N   ' P U S H '  :
<
N311:    BYTE        PCS;1           < A NOTER : B=1.
         WORD        SWHOS           < MEMORISATION DU SENS.
<
< RECUPEARTION DE LA LISTE DES CONSTANTES :
<
N312:    BYTE        PGS;0           < ACCES AU CARACTERE COURANT (Y).
         BYTE        PTM;"K"         < EST-CE 'K' ???
         BYTE        PT;"Y"          < EST-CE 'Y' ??
         WORD        N313            < INSERTION DE 'K' DANS LA LISTE.
         BYTE        PT;"X"          < EST-CE 'X' ??
         WORD        N314            < INSERTION DE 'Y' DANS LA LISTE.
         BYTE        PT;"T"          < EST-CE 'T' ??
         WORD        N315            < INSERTION DE 'X' DANS LA LISTE.
         BYTE        PT;"2"          < EST-CE Y(CURSEUR> ???
         WORD        N430            < INSERTION DE 'T' DANS LA LISTE.
         BYTE        PT;"1"          < EST-CE X(CURSEUR) ???
         WORD        N1010           < C'EST Y(CURSEUR).
         BYTE        PT;"A"          < EST-CE 'A' ???
         WORD        N1011           < C'EST X(CURSEUR).
         BYTE        PT;";"          < EST-CE LA FIN DE LISTE.
         WORD        N1002           < INSERTION DE 'A' DANS LA LISTE.
         BYTE        PT;"C"          < EST-CE 'C' ??
         WORD        N316            < FIN DE LISTE.
         WORD        N27             < ERREUR : ELEMENT NON RECONNU ...
<
< INSERTION DU CURSEUR DANS LA LISTE :
<
         BYTE        PCS;CV-WHOS+Y   < INSERTION Y(CURSEUR).
         WORD        RWHOS
N1011:   EQU         $               < INSERTION DE X(CURSEUR)
                                     < DANS LA LISTE.
         BYTE        PCI;CV-WHOS+X   < INSERYION X(CURSEUR).
         WORD        N313
<
< INSERTION DE Y(CURSEUR) DANS LA LISTE :
<
N1010:   BYTE        PCI;CV-WHOS+Y   < INSERTION DE Y(CURSEUR).
         WORD        N313
<
< INSERTION DE 'K' DANS LA LISTE :
<
N313:    BYTE        PC;CTTE-WHOS
         WORD        RWHOS
         WORD        N312            < ACCES A L'LEMENT SUIVANT (LE
                                     < RETOUR DE RWHOS EST TOUJOURS
                                     < EN ERREUR).
<
< INSERTION DE Y DANS LA LISTE :
<
N314:    BYTE        PCI;DY1-WHOS
         WORD        N313
<
< INSERTION DE 'X' DANS LA LISTE :
<
N315:    BYTE        PCI;DX1-WHOS
         WORD        N313
<
< INSERTION DE 'A' DANS LA LISTE :
<
N1002:   BYTE        PCI;ARGF-WHOS
         WORD        N313
<
< INSERTION DE 'T' DANS LA LISTE :
<
N430:    BYTE        PCI;0           < A NOTER : B=0 !!!! (CAS 'T').
         WORD        N313
<
< FIN DE LISTE :
<
N316:    BYTE        PC;0
         WORD        ESTACK          < EXECUTION DE L'OPERATION.
         WORD        N27             < ABORT : OPERATION IMPOSSIBLE.
         WORD        N1              < OK , ACCES COMMANDE SUIVANTE.
<
<        S A V E / R E S T A U R E   C O N T E X T E S  :
<
N920:    BYTE        PCI;0           < B=0=LECTURE (RESTAURATION).
         WORD        N921            < VERS LA PREPARATION DE DEMDK.
N921:    BYTE        PCS;2           < B=2=ECRITURE (SAUVEGARDE).
         WORD        ADSEC           < PREPARATION DE LA DEMANDE.
N922:    BYTE        PGS;0           < ACCES AU CARACTERE COURANT QUI
                                     < DONNE LE NUMERO DU CONTEXTE.
         BYTE        PC;0
         WORD        REPET1          < CALCUL DU NUMERO DU CONTEXTE
                                     < DANS SAVE (=DEMDK+3).
         WORD        N27             < ERREUR : ARGUMENT ERRONE.
         BYTE        PC;0
         WORD        RWDK            < SAVE/RESTAURE LE CONTEXTE.
         WORD        N27             < EREUR ...
         WORD        N1              < OK ....
<
<        M I S E   D E   G R   E N   M O D E   I N T E R A C T I F  :
<
N92:     BYTE        PC+PGON1;'01    < MISE EN MODE INTERACTIF ; A
                                     < NOTER : B=1.
         WORD        MODGRI          < ECRASEMENT DU CARACTERE 'I' ,
                                     < PUIS ROUTINE 'MODGR'.
<
<        M I S E   D E   G R   E N   M O D E   P R O G R A M M E  :
<
N93:     BYTE        PC+PGON1;'00    < MISE EN MODE PROGRAMME ; A
                                     < NOTER : B=0.
         WORD        MODGR
<
<        C O M M E N T A I R E   E T   T E X T E   A   E D I T E R  :
<
N340:    BYTE        PCS;0           < SAVE L'INDEX 1ER CARACTERE.
         WORD        SAVNOM
N800:    BYTE        PGS;0           < ACCES AU CARACTERE COURANT (Y).
         BYTE        PTM;";"         < EST-CE LA FIN D'UN COMMENTAIRE ???
         BYTE        PT;"!"          < EST-CE LA FIN D'UN TEXTE
                                     < A EDITER ???
         WORD        N1              < FIN D'UN COMMENTAIRE : VERS
                                     < L'ACCES A LA PRIMITIVE SUIVANTE.
         WORD        N800            < NIN '!' , NI ';' , VERS L'ACCES
                                     < AU CARACTERE SUIVANT.
         BYTE        PCS;4           < A NOTER : B=4 !!!
         WORD        EXECA           < POSITIONNEMENT DU CV , ET
                                     < DE LA VISU POUR AFFICHER
                                     < CORRECTEMENT LE TEXTE !!!
         BYTE        PC+PGON1;1      < EDITION DU TEXTE RENCONTRE ; A
                                     < NOTER : B=1#0 !!!
         WORD        TEXTE           < VERS N22 SI CTRL-X-OFF.
<
<        A C C E S   C O M M A N D E   C O U R A N T E  :
<
N1:      BYTE        PGS;1           < ACCES AU CARACTERE COURANT ; A
                                     < NOTER B#0 (!!!!) , AFIN DE
                                     < TESTER 'A'/'B'/'S' DANS LE
                                     < CAS DU MODE INTERACTIF ...
<
<        A N A L Y S E   D E   L A   C O M M A N D E  :
<
N1617:   EQU         $               < ENTRY SUITE A UNE PRIMITIVE
                                     < INHIBEE NON SUIVIE DE '('.
         BYTE        PTD;0           < TEST DIRECT DU CARACTERE COURANT.
         WORD        N22             < CAS DES PRIMITIVES HORS LE
                                     < SEGMENT ('>PACE','Z').
TCOM:    EQU         $               < LISTE DES PRIMITIVES A
                                     < A ACCES DIRECT.
         WORD        N1              < 'SPACE' ELEMENT NEUTRE
         WORD        NCDIR           < ! BRANCHEMENT : IEG<--(SAVE)
         WORD        N945            < " AUTORISATION PRIMITIVE
         WORD        N610            < #
         WORD        N302            < $ APPEL BIBLIOTHEQUE
         WORD        N8              < % BOUCLE DE REPETITIONS
         WORD        N7              < & APPEL GLOBAL DE PROGRAMME
         WORD        N941            < ' APPEL ARGUMENT FORMEL COURANT
         WORD        N14             < ( OPEN RECURSIVITE
         WORD        N15             < ) CLOSE RECURSIVITE
         WORD        N19             < * MULTIPLICATION D(X) ET D(Y)
         WORD        N17             < + INCREMENTATION D(X) ET D(Y)
         WORD        N2001           < , BLANC SI NOIR/NOIR SI BLANC
         WORD        N18             < - DECREMENTATION D(X) ET D(Y)
         WORD        N2000           < . MISE A BLANC EN VIDEO
         WORD        N20             < / DIVISION D(X) ET D(Y)
         WORD        N9410           < 0 APPEL ARGUMENT FORMEL DE
                                     <   L'AUTRE ITEM
         WORD        N9              < 1 DEPLACEMENT EST
         WORD        N10             < 2 DEPLACEMENT NORD
         WORD        N11             < 3 DEPLACEMENT OUEST
         WORD        N12             < 4 DEPLACEMENT SUD
         WORD        N1              < 5 IF5
         WORD        N1              < 6 IF6
         WORD        N1              < 7 IF7
         WORD        N1              < 8 IF8
         WORD        N1              < 9 IF9
         WORD        N940            < : INVERSION DES INHIBITIONS
         WORD        N1              < ; ELEMENT NEUTRE
         WORD        N340            < < COMMENTAIRE OU TEXTE A EDITER
         WORD        N1001           < = DEFINITION ARGUMENT FORMEL
         WORD        N16             < > DEFINITION DE PROGRAMME
         WORD        N860            < ? APPEL DIRECT PROGRAMME BIBLIO.
         WORD        N610            < @
         WORD        N4              < A ORIGINE D'UN SEGMENT
         WORD        N5              < B EXTREMITE SEQUENTIELLE
         WORD        N23             < C RETOUR AU CCI
         WORD        N610            < D
         WORD        N610            < E
         WORD        N22             < F RETOUR A L'APPELANT
         WORD        N610            < G
         WORD        N750            < H MAKE COPY
         WORD        N92             < I PASSAGE EN INTERACTIF
         WORD        N610            < J
         WORD        N31             < K MODIFICATION DE LA CTTE K
         WORD        N610            < L
         WORD        N310            < M OPERATIONS SUR STACK
         WORD        N610            < N
         WORD        N400            < O MISE A L'ORIGINE DE CV
         WORD        N93             < P PASSAGE MODE NON INTERACTIF
         WORD        N600            < Q CHANGEMENT DE PLAN
         WORD        N920            < R RESTAURE CONTEXTE DKS
         WORD        N6              < S EXTREMITE ETOILEE D'UN SEGMENT
         WORD        N13             < T TRANSFORMATION COURANTE
         WORD        N610            < U
         WORD        N610            < V
         WORD        N921            < W SAVE CONTEXTE DKS
         WORD        N2              < X MODIFICATION D(X)
         WORD        N3              < Y MODIFICATION D(Y)
         WORD        N21             < Z EFFACEMENT DE L'ECRAN
         PAGE
<
<
<        P I L E   D E   R E C U R S I V I T E  :
<
<
PIR:     EQU         $
         WORD        0;0             < VALEUR INITIALE DE LA 1ERE
                                     < ENTREE DE PIR.
                                     < (CD=CP=0).
         DZS         X1              < ENTREE SUIVANTES DE PIR.
<
<
<        P I L E   D E S   C O N S T A N T E S  :
<
<
<        NOTA :
<                      CETTE PILE GEREE PAR LES INSTRUCTIONS
<                    PUSH/PULL MICRO-PROGRAMMEES ,
<                    CONTIENT INITIALEMENT LE 1ER MOT
<                    ET LE DERNIER MOT BLOQUES , AFIN
<                    DE DETECTER LES DEBORDEMENTS PAR LE
<                    HAUT ET PAR LE BAS AVANT QU'ILS N'
<                    AIENT DES CONSEQUENCES DESASTREUSES ...
<
<
STACK:   EQU         $
         BYTE        LSTACK-1;1
         DZS         LSTACK
         PAGE
<
<
<        V A L I D A T I O N   I M P L A N T A T I O N  :
<
<
X12:     EQU         ZERO+PILE-LTNI-LTNI
                                     < X12=@ITEM2.
X10:     VAL         X12-$           < CETTE CONSTANTE DOIT ETRE
                                     < POSITIVE OU NULLE.
ZEROV:   EQU         ZERO+X10        < ERREUR D'ASSEMBLAGE SI IL
                                     < Y A MAUVAISE IMPLANTATION.
         DZS         X10+1
         PAGE
<
<
<        C H A R G E M E N T   B I B L I O T H E Q U E  :
<
<
<        FONCTION :
<                      CE MODULE APPELE SUITE A LA COMMANDE
<                    '$' , RECUPERE LE <NOM-BIBLIOTHEQUE> ,
<                    LE CODE SUR 6 CARACTERES SUIVANT LES
<                    NORMES EN VIGUEUR DANS 'GE' , ET ENFIN
<                    TENTE LE CHARGEMENT DE L'ITEM DE <NOMC> ,
<                    DANS L'ITEM QUI N'EST PAS L'ITEM COURANT.
<
<
<        ARGUMENT :
<                    B=0.
<                    IEG=INDEX 1ER CARACTERE <NOM-BIBLIOTHEQUE>.
<
<
<        RESULTAT :
<                    X=0 : LA BIBLIOTHEQUE EST CHAGREE , ET
<                          EST DE TYPE ITEM.
<                    X#0 : LA BIBLIOTHEQUE N'EXISTE PAS , OU N'EST
<                          PAS DE TYPE ITEM.
<
<
RACB:    EQU         IMAG+LIMAG
XWOR%:   VAL         RACB-ZERO*2
XWOR%A:  EQU         ZERO+XWOR%
RACB1:   EQU         $
DEBOV1:  EQU         $
         BYTE        " ";NOMBB
         ASCI        "    "
         BYTE        '04;'D0
X101:    VAL         $-RACB1
LOADB:   EQU         RACB+X101
<
<        C O D A G E   D E   L A   B I B L I O T H E Q U E  :
<
<
< INITIALISATION DES RELAIS :
<
         LA          AIC             < A=@MOT DE L'ITEM COURANT.
         SB          ACCEB           < PASSAGE A L'AUTRE ITEM.
         ADRI        -LTN,A          < A=@MOT DE L'EN-TETE DE L'AUTRE
                                     < ITEM.
         STA         AIR             < AIR SERA LE RELAI DE L'EN-TETE
                                     < DE L'AUTRE ITEM.
         SLLS        1               < A=@OCTET DE L'EN-TETE DE
                                     < L'AUTRE ITEM.
         STA         DEMSGN+1        < MAJ DE L'@OCTET DE DEMSGN.
<
< INITIALISATION DU CODEUR :
<
         STZ         F3              < RAZ DE LA FONCTION F3.
         LYI         3               < 2*3 CARACTERES A METTRE A 'SPACE'
         LXI         0               < INDEX DE MISE A 'SPACE'.
         LAI         '20
         SBT         2               < A='SPACE''SPACE'.
E211:    EQU         $
         STA         &AIR            < MISE DU <NOMC> A 'SPACE'.
         ADRI        1,X             < INDEX DE RAZ.
         CPR         X,Y
         JNE         E211            < NEXT ....
         LYI         -1              < Y=INDEX DE <NOMC> , PUIS
                                     < LONGUEUR COURANTE DE <NOM>.
<        ON A ICI :
<                    B=0 (ARGUMENT) ,
<                    Y=-1 : LONGUEUR COURANTE DE <NOM> ,
<
< RECUPERATION DES 3 PREMIERS CARACTERES DE <NOM> :
<
E500:    EQU         $
         BSR         AGTK            < A=K(SAVE).
         JE          E212            < RENCONTRE DE ';'.
         STBY        &AIR            < C(X)=K(SAVE).
         LR          Y,A
         CPI         2
         JL          E500            < RECUPERATION DE C(1),C(2),C(3).
<
< CODAGE DES CARACTERES K(4),...,K(L) :
<
E213:    EQU         $
         BSR         AGTK            < A=K(I) , I=4,...,L (L DESIGNANT
                                     < LA LONGUEUR DE <NOM>.
         JE          E214            < ARRET DUR LE ';' RENCONTRE.
         ADR         Y,A             < LE CARACTERE COURANT (A) EST
                                     < 'PONDERE' PAR SA POSITION
                                     < (Y) DANS <NOM>.
                                     < (K(I)=K(I)+I).
         EORR        A,B             < CALCUL DE F2 :
                                     < F2=EOR(F2,K(I)).
         ADR         A,B             < F2=F2+K(I).
         EOR         F3              < CALCUL DE F3 :
                                     < F3=EOR(F3,K(I)).
         SCLS        1
         STA         F3              < F3=SCLS(F3,1).
         JMP         E213            < CODAGE DU CARACTERE SUIVANT.
<
< MISE SOUS FORMA ASCI DES FONCTIONS F2 & F3 :
<
E214:    EQU         $
         LBY         F3              < A=OCTET0(F3).
         AD          F3              < A=F3+OCTET0(F3).
         ANDI        '7F             < A=OCTET0(F3)+OCTET1(F3).
                                     < (MODULO 128).
         CPI         "Z"
         JLE         E215
         ADRI        -'30,A          < F3 EST MIS SOUS LA FORME D'UN
                                     < CARACTERE INFERIEUR AU 'Z'.
E215:    EQU         $
         CPI         " "
         JG          E216
         ADRI        '30,A
E216:    EQU         $
<        ON A ICI :
<                    F3=CARACTERE ASCI VARIABLE DE '!' (='21) ,
<                       A 'Z' (='5A) , ET CONTENU DANS A.
         XR          A,B             < B=F3 , A=F2.
         ANDI        '7F             < F2 EST RAMENE A 7 BITS.
         CPI         "Z"
         JLE         E217
         ADRI        -'30,A          < F2 EST RAMENEE A UN CODE
                                     < INFERIEUR A CELUI DU 'Z'.
E217:    EQU         $
         CPI         "0"
         JGE         E218
         ADRI        '20,A           < ON TENTE DE RAMENER F2 A UN
                                     < CODE SUPERIEUR A CELUI DU '0'.
         JMP         E217            < POURSUITE DE LA TENTATIVE.
E218:    EQU         $
<        ON A ICI :
<                    F2=CARACTERE ASCI VARIABLE DE '0' (='30) ,
<                       A 'Z' (='5A).
         SWBR        A,A
         ORR         B,A             < A=F2.F3.
         LXI         2
         STA         &AIR            < STORE : C(5)=F2 ET C(6)=F3.
<
< CODAGE DE LA LONGUEUR DE <NOM> :
<
E212:    EQU         $
<        ON A ICI :
<                    Y=LONGUEUR DE <NOM> (NON COMPRIS ';').
         LR          Y,A
         JANE        E2000           < OK, LONGUEUR#0.
<
<        C A S   L O N G U E U R   N U L L E  :  DANS CES CONDITIONS,
<                    ON INVERSE LES CONDITIONS DE COMPTAGE DES SEGMENTS
<                    TRACES (BIT0(NBSEG)).
<
         LA          NBSEG
         IBT         0               < INVERSION DES CONDITIONS.
         STA         NBSEG
         LXI         0               < POUR FAIRE UN RETOUR OK.
         JMP         E207            < VERS LA SORTIE.
<
< ACS DES LONGUEURS#0 : APPEL D'UNE BIBLIOTHEQUE :
<
E2000:   EQU         $
         ADRI        '30,A           < LA LONGUEUR EST MISE SOUS FORME
                                     < D'UN CARACTERE ASCI (A PARTIR
                                     < DE '0' ,...).
         LXI         3
         STBY        &AIR            < STORE : C4=F1 (LONGUEUR).
         LXI         6
         LAI         '04
         STBY        &AIR            < STORE : C(7)='EOT'.
<
<        C H A R G E M E N T   D E   L A   B I B L I O T H E Q U E  :
<
         LA          ALTNI2          < LONGUEUR MAX EN OCTETS D'UN
                                     < ITEM.
         STA         DEMSGN+2        < MAJ DU COMPTE OCTETS DE DEMSGN.
         LYI         1               < DECOMPTEUR DE TENTATIVES.
         LAI         5               < ON COMMENCE PAR UN 'LOAD VALUE
                                     < SOUS <ACN>'.
<
< BOUCLE DE TENTATIVES :
<
E206:    EQU         $
<        ON A ICI :
<                    A=NVP D'ACCES A SGN ,
<                    Y=DECOMPTEUR DE TENTATIVES.
         STBY        DEMSGN          < MISE EN PLACE DU NVP DE DEMSGN.
         LAD         DEMSGN
         SVC         0               < ENVOI DE LA DEMANDE AU SGN.
         JE          E220            < OK LOAD SUCCESSFUL.
<
< CAS DES RETOURS EN ERREUR :
<
         ADRI        -1,Y            < DECOMPTE DES TENTATIVES.
         CPZR        Y
         JL          E207            < C'ETAIT LA 2EME , ON FAIT
                                     < DONC UN RETOUR EN ERREUR (X#0).
         LAI         6               < SINON , ON VA FAIRE UNE TENTA-
                                     < TIVE AVEC UN 'LOAD SOUS :SYS'.
         JMP         E206            < VERS LA 2EME TENTATIVE.
<
< CAS OU LA BIBLIOTHEQUE A ETE CHAGREE : IL
< FAUT EN VALIDER LE TYPE-ITEM :
<
E220:    EQU         $
         LXI         7
         LBY         &AIR            < A=TYPE DE CE QUE L'ON VIENT
                                     < DE CHARGER.
         LXI         'C9             < X='I'+'80 (TYPE ATTENDU=
                                     < TYPE-ITEM 'I').
         SBR         A,X             < SI LE TYPE EST 'ITEM' , ON
                                     < AURA : X=0 (ET UN RETOUR OK).
<
< SORTIE DE LA ROUTINE :
<
E207:    EQU         $
         RSR
         PAGE
<
<
<        A C C E S   C A R A C T E R E   A   C O D E R  :
<
<
<        FONCTION :
<                      CETTE ROUTINE RECUPERE UN CARACTERE
<                    DU <NOM-BIBLIOTHEQUE> ; ELLE
<                    FAIT PROGRESSER SAVE ET TESTE LA RENCONTRE
<                    DU CARACTERE DE FIN DE NOM ';'.
<                      DE PLUS , ELLE FAIT PROGRESSER LA
<                    LONGUEUR COURANTE DE <NOM>.
<
<
<        ARGUMENT :
<                    Y=LONGUEUR COURANTE DE <NOM> ,
<                    SAVE=INDEX DU CARACTERE COURANT.
<
<
<        RESULTAT :
<                    SAVE<--(SAVE)+1 ,
<                    A=CARACTERE COURANT ,
<                    Y<--(Y)+1 ,
<                    X<--(Y) ,
<                    INDICATEURS POSITIONNES EN FONCTION D'UN
<                    TEST SUR LA PRESENCE DE ';'.
<
<
X101:    VAL         $-RACB1
GTK:     EQU         RACB+X101
         ADRI        1,Y             < PROGRESSION DE LA LONGUEUR
                                     < COURANTE DE <NOM>.
<
< ACCES AU CARACTERE COURANT :
<
         LX          SAVE            < X=INDEX DU CARACTERE COURANT.
         IC          SAVE            < PREPARATION DE L'ACCES AU
                                     < CARACTERE SUIVANT.
         LBY         &AIC            < A=CARACTERE COURANT DE <NOM> ,
                                     < RECUPERE DANS L'ITEM COURANT.
         CPI         ";"             < TEST DE FIN DE NOM.
         LR          Y,X             < X=INDEX DE RANGEMENT DANS LE
                                     < CAS DES 3 PREMIERS CARACTERES.
<
< SORTIE DE LA ROUTINE :
<
         RSR
         PAGE
<
<
<        D E M A N D E S   D E   R E P E T I T I O N S  :
<
<
<        R E C U P E R A T I O N   D U   N O M B R E
<        D E   R E P E T I T I O N S  :
<        O U   D ' U N E   C O N S T A N T E  :
<
<
<        ARGUMENT :
<                    Y=CARACTERE COURANT ; SI Y='@' , LA
<                      CONSTANTE CALCULLE SERA 'CTTE'.
<
<
<        RESULTAT :
<                    SAVE=NBRE DE REPETITIONS , SI X=0 (OK) ,
<                    X#0 : COMPTE ERRONNE.
<
<
X101:    VAL         $-RACB1
REPET1:  EQU         RACB+X101
         LXI         1               < ERREUR A PRIORI.
         LR          Y,A             < A=CARACTERE COURANT.
         ADRI        -'30,A          < CONVERSION EN BINAIRE.
         JALE        E17             < CARACTERE NON RECONNU.
         CPI         9               < EST-CE UN CHIFFRE DE 1 A 9 ???
         JLE         E18             < OUI , OK.
         ADRI        -'41+'39+1,A    < TRANSLATION PAR RAPPORT AU 'A'.
         CPI         9               < EST-CE UN CARACTERE ENTRE '9'
                                     < ET 'A'.
         JL          E17             < OUI , ERREUR.
         JG          E308            < NON , OK.
<
< CAS DU CARACTERE '@' :
<
         LA          CTTE            < LA CONSTANTE RESULTANTE EST CTTE.
E308:    EQU         $
<
< NBRE DE REPETITIONS CORRECT :
<
E18:     EQU         $
         STA         SAVE            < SAVE=NBRE DE REPETITIONS
                                     < DEMANDEES (DE 1 A 35).
         LXI         0               < RETOUR OK.
<
< SORTIE DE LA ROUTINE :
<
E17:     EQU         $
         RSR                         < RETOUR AVEC (X).
<
<
<        T R A N S M I S S I O N   D U   N O M B R E
<        D E   R E P E T I T I O N S  :
<
<
<        ARGUMENT :
<                    SAVE=NBRE DE REPETITIONS DEMANDEES.
<
<
<        RESULTAT :
<                    Y=NBRE DE REPETITIONS DEMANDEES.
<
<
X101:    VAL         $-RACB1
REPET2:  EQU         RACB+X101
         LY          SAVE            < FACILE ???
         RSR                         < X N'EST PAS POSITIONNE , CAR
                                     < CETTE ROUTINE EST APPELEE
                                     < EN MODE SEQUENTIEL.
         PAGE
<
<
<        E D I T I O N   D ' U N   M E S S A G E  :
<
<
<        FONCTION :
<                      CE MODULE EDITE UN MESSAGE
<                    ALPHA-NUMERIQUE DONT LE 1ER
<                    CARACTERE EST A L'INDEX (SAVE) ,
<                    ET LE DERNIER A L'INDEX (IEG)-1.
<
<
X101:    VAL         $-RACB1
TEXTE:   EQU         RACB+X101
         LA          IEG             < INDEX CARACTERE COURANT.
         ADRI        -1,A            < RETOUR SUR LE '!'.
         SB          SAVE            < A=LONGUEUR DU MESSAGE.
         STA         DEMOUT+2        < MAJ DE DEMOUT.
         LA          AIC
         SLLS        1               < A=@OCTET DE L'ITEM COURANT.
         AD          SAVE            < A=@OCTET DU MESSAGE.
         STA         DEMOUT+1        < MAJ DE DEMOUT.
         LAD         CG
         BSR         ASVC            < RETOUR EN ALPHA-NUMERIQUE
                                     < DE LA VISU.
         JNE         ET21            < RETOUR EN ERREUR (CTRL-X-OFF ???)
         LAD         DEMOUT
         BSR         ASVC            < EDITION DU MESSAGE EN ALPHA.
         JNE         ET21            < RETOUR EN ERREUR (CTRL-X-OFF ???)
                                     < OU MESSAGE DE LONGUEUR NULLE).
         LAD         OG
         BSR         ASVC            < MISE EN GRAPHIQUE DE LA VISU.
         JNE         ET21            < RETOUR EN ERREUR (CTRL-X-OFF ???)
         RSR                         < OK, RETOUR...
<
< SORTIES EN ERREUR :
<
ET21:    EQU         $
         ADRI        -1,K            < ANNULATION DU BSR D'APPEL.
         BR          AGOGE
                                     < DE LA VISU.
         PAGE
<
<
<        P R O J E C T I O N   D E   L ' E S P A C E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE PROJETTE L'ESPACE
<                    (X3,Y3,Z3) SUR LE PLAN (X3,Y3)
<                    SUIVANT LA FORMULE :
<                                    X2=X3+R*Z3*COS(ALPHA) ,
<                                    Y2=Y3+R*Z3*SIN(ALPHA) ,
<                    OU R EST UN RAPPORT DE REDUCTION , ET ALPHA ,
<                    UN ANGLE DE PROJECTION.
<
<
<        ARGUMENT :
<                    CV3 CONTIENT (X3,Y3,Z3).
<
<
<        RESULTAT :
<                    X=X2(POINT PROJETE) ,
<                    Y=Y2(POINT PROJETE).
<
<
X101:    VAL         $-RACB1
PROJET:  EQU         RACB+X101
         PSR         B
         LAD         MPROJ
         LR          A,W             < W=@MATRICE DE PROJECTION.
         LA          CV3+Z3          < ACCES A Z3(POINT PROJETE).
         MP          A11,W
         BSR         ADIV            < B=Z3*COS(TETA).
         LR          B,A             < A=Z3*COS(TETA).
         AD          CV3+X3          < A=X3+Z3*COS(TETA).
         BSR         ACHKCV          < VALIDATION DE LA COORDONNEE X2.
         LR          A,X             < X=X2=X3+Z3*COS(TETA).
         LA          CV3+Z3          < ACCES A Z3(POINT PROJETE).
         MP          A21,W
         BSR         ADIV            < B=Z3*SIN(TETA).
         LR          B,A             < A=Z3*SIN(TETA).
         AD          CV3+Y3          < A=Y3+Z3*SIN(TETA).
         BSR         ACHKCV          < VALIDATION DE LA COORDONNEE Y2.
         LR          A,Y             < Y=Y2=Y3+Z3*SIN(TETA).
         PLR         B
         RSR
         PAGE
<
<
<        D E P L A C E M E N T   D U   C U R S E U R
<        V I R T U E L   P A R   L E   C U R S E U R
<        R E E L   E N   I N T E R A C T I F  :
<
<
<        FONCTION :
<                      CETTE ROUTINE PERMET DE CALCULER
<                    SUR L'AXE (SELECTIONNE AU PREALABLE
<                    PAR UN SELDX/SELDY) LE DEPLACEMENT
<                    DU CURSEUR VIRTUEL EXPRIME SOUS LA
<                    FORME '1','2','3','4' , TEL QU'IL
<                    AURAIT DONNE LE MEME RESULTAT QUE
<                    CE DEPLACEMENT PRECISE PAR LE CURSUER
<                    GRAPHIQUE REEL.
<
<
<        NOTATION :
<                    CURSOR : CURSEUR GRAPHIQUE REEL ,
<                    CV : CURSEUR GRAPHIQUE VIRTUEL ,
<                    Z : DESIGNERA UNE COORDONNEE (X OU Y).
<
<
<        ARGUMENT :
<                    A=Z(CURSOR)-Z(CV) ,
<                    ADXDY=@DZ ,
<                    Y="1" SI 'Z'='X' ,
<                     ="2" SI 'Z'='Y'.
<
<
<        RESULTAT :
<                    A=0 SI OK ,
<                    A#0 & X#0 SI ERREUR (HORS-LA PAGE).
<
<
X101:    VAL         $-RACB1
MCVCR:   EQU         RACB+X101
         JAE         E122            < RIEN A FAIRE , LE DEPLACEMENT
                                     < SUR L'AXE Z EST ABSOLUMENT
                                     < NUL.
<
< CAS D'UN DEPLACEMENT (A) NON NUL SUR Z :
<
         JAG         E123            < LE DEPLACEMENT A LIEU DANS LE
                                     < SENS CROISSANT DE Z.
         NGR         A,A             < DANS LE CAS D'UN DEPLACEMENT
                                     < DANS LE SENS DECROISSANT DE Z ,
                                     < ON PREND LA VALEUR ABSOLUE
                                     < DE CELUI-CI.
         ADRI        2,Y             < PASSAGE A Y="3"/"4".
E123:    EQU         $
<        ON A ICI :
<                    A=ABSVAL(Z(CURSOR)-Z(CV)).
<                    Y='1'/'2'/'3'/'4'.
         SARD        16              < (A,B)=ABSVAL(Z(CURSOR)-Z(CV)).
         DV          &ADXDY          < A=ENT(ABSVAL(Z(CURSOR)-Z(CV))/DZ)
<
<        A T T E N T I O N  :
<                      LE RESTE DE CETTE DIVISION
<                    EST IGNOREE ; CELA SIGNIFIE QUE
<                    LE DESSIN INTERACTIF EST PROGRAMME
<                    EN SUPER-QUANTIFIANT (!!?!??!)
<                    L'ECRAN DE LA VISU . ON ETABLIT
<                    SUR CELUI-CI UN QUADRILLAGE DE PAS
<                    DX,DY ; LES SOMMETS DU DESSIN
<                    RESULTANT SE TROUVANT PLACE SUR
<                    LES NOEUDS DE CE QUADRILLAGE.
<
         ADR         B,B             < ON DOUBLE LE RESTE.
         XR          A,B             < A=2*RESTE ; B=QUOTIENT ENTIER.
         CP          &ADXDY          < COMPARAISON DU DIVISEUR AU
                                     < DOUBLE DU RESTE (A).
         JL          E330            < LA DIVISION EST FAITE PAR DEFAUT.
         ADRI        1,B             < LA DIVISION EST FAITE PAR EXCES.
E330:    EQU         $
         LR          B,A             < RESTAURE A=QUOTIENT PAR EXCES
                                     < OU PAR DEFAUT DE LA DIVISION.
         JAE         E122            < LE DEPLACEMENT SUR Z EST ASSIMILE
                                     < A UN DEPLACEMENT NUL , PUISQU'ON
                                     < IGNORE LE RESTE ....
         LR          A,X             < SINON , LE QUOTIENT DE CETTE
                                     < DIVISION (A) EST LE NBRE DE
                                     < CARACTERES DE MOUVEMENT ('1' ,
                                     < '2','3','4') QU'IL FAUT SIMULER.
         LR          Y,A             < CARACTERE DE MOUVEMENT.
         ADRI        -'30+1,A        < POUR DIFFERENCIER '1'/'2' DE
                                     < '3'/'4'.
         SLRD        16+2            < B=0 SI Y='1'/'2' ,
                                     <  =1 SI Y='3'/'4'.
<        ON A ICI :
<                    Y=CARACTERE DE MOUVEMENT ('1','2','3','4') ,
<                    X=NBRE DE REPETITIONS DU CARACTERE (Y) ,
<                    B=0 POUR LES MOUVEMENTS '1'/'2' ,
<                     =1 POUR LES MOUVEMENTS '3'/'4'.
         STB         WORKS           < SAVE B (A NOTER QU'ON NE
                                     < SAUVE PAS (B) DANS LA PILE, CAR
                                     < SINON, EN EFFET ON DETRUIRAIT
                                     < LE 1ER MOT DE L'IMAGE).
<
< BOUCLE DE MOUVEMENT :
<
E124:    EQU         $
         PSR         X,Y
         LR          Y,A             < A=CARACTERE DE MOUVEMENT.
         LX          IEG             < INDEX COURANT GRAPHIQUE.
         STBY        &AIC            < LE CARACTERE DE MOUVEMENT EST
                                     < INSERE EN CARACTERE COURANT DU
                                     < PROGRAMME GRAPHIQUE.
         LR          X,A
         ADRI        1,A             < INDEX DU CARACTERE SUIVANT.
         CP          NCP             < VALIDATION APRES RANGEMENT.
         STA         IEG             < MAJ DE IEG AVANT L'EVENTUELLE
                                     < SORTIE EN ERREUR (!!!).
         JGE         E125            < ERREUR : HORS LA PAGE ; A
                                     < NOTER : A=(NCP)#0 (!!!).
         LR          Y,A             < A=CARACTERE DE MOUVEMENT.
         TBT         15              < DISCRIMINATION DE '1'/'3'
                                     < ET DE '2'/'4'.
         JC          E126            < CAS DES MOUVEMENTS '1'/'3' ,
                                     < C'EST-A-DIRE : 'Z'='X'.
         BSR         AEXE24          < CAS DES MOUVEMENTS '2'/'4' ,
                                     < C'EST-A-DIRE 'Z'='Y'.
         JMP         E127
E126:    EQU         $
         BSR         AEXE13          < CAS 'Z'='X'.
E127:    EQU         $
         PLR         X,Y             < RESTAURE X,Y POUR UN BOUCLAGE
         LB          WORKS           < EVENTUEL, AINSI QUE (B).
         JDX         E124            < REPETITION SUIVANTE.
         LAI         0               < RETOUR OK : A=0.
<
< SORTIE DE LA ROUTINE :
<
E122:    EQU         $
         RSR                         < RETOUR AVEC (A) (ET (X) SI
                                     < ERREUR ....).
<
< SORTIE EN ERREUR :
<
E125:    EQU         $
         PLR         X,Y             < RATTRAPGE DE LA PILE.
         JMP         E122            < VERS LA SORTIE DE LA ROUTINE ; A
                                     < NOTER : X=NBRE DE REPETITIONS#0,
                                     < ET A=(NCP)#0 !!!!
         PAGE
<
<
<        P R I M I T I V E   G E T   C A R A C T E R
<        E N   M O D E   I N T E R A C T I F  :
<
<
<        NOTA :
<                      CE MODULE EST LA SUITE EN
<                    OVERLAY DE LA PRIMITIVE DE GET
<                    CARACTER.
<
<
X101:    VAL         $-RACB1
PRIMGI:  EQU         RACB+X101
<
< ENTREE GRAPHIQUE PAR CURSEUR :
<
         LAD         CU
         BSR         ASVC            < MISE EN FONCTION DU CURSEUR
                                     < GRAPHIQUE REEL.
         LAD         LG
         BSR         ASVC            < INTERACTION AVEC L'UTILISATEUR
                                     < PAR LECTURE DES COORDONNEES DU
                                     < CURSEUR , ET DU CARACTERE DE
                                     < DEBLOCAGE DE LA VISU.
         LAD         OG
         BSR         ASVC            < RETOUR EN GRAPHIQUE DE LA VISU.
GOCU:    EQU         $
<
< ACCES A LA COMMANDE :
<
         LXI         CP
         LBY         &APRC           < ACCES AU COMPTE DE PARENTHESES
                                     < SOUS CE NIVEAU DE RECURSIVITE.
         CPBY        ICALLI          < TEST PAR RAPPORT AU SEUIL ....
         LBY         CURSOR          < A=CARACTERE DE DEBLOCAGE VISU.
         JGE         E120            < ON EST DANS LE MODE D'APPELS
                                     < IMPLICITES , DONC PAS DE
                                     < DISCRIMINATIONS SUR 'A'/'B'/'S'.
<
< CAS DU MODE NORMAL :
<
         CPZR        B               < FAUT-IL TESTER 'A'/'B'/'S' ???
         JE          E120            < NON , CELA SIGNIFIE QU'ON N'EST
                                     < PAS DANS UN 'PG' DE LA BOUCLE
                                     < D'ANALYSE PRINCIPALE (N1).
<
< TEST DES COMMANDES D'EXTREMITE :
<
         CPI         "A"
         JE          E121            < COMMANDE 'ORIGINE'.
         CPI         "S"
         JE          E121            < COMMANDE 'EXTREMITE ETOILEE'.
         CPI         "B"
         JNE         E120            < IL NE S'AGIT PAS D'UNE COMMANDE
                                     < D'EXTEMITE.
<
< CAS DE 'B' : REAFFICHAGE DE L'ORIGINE DU
< SEGMENT COURANT A CAUSE DE L'OG QUI
< VIENT DE PRECEDER :
<
         LAD         WG
         BSR         ASVC            < RE-EXECUTION DU WG PRECEDENT ...
<
< CAS DES COMMANDES 'A'/'B'/'S' :
<
E121:    EQU         $
<
< DEPLACEMENT SUR OX :
<
         BSR         ASELDX          < SELECTION DE DX.
         LA          CURSOR+1+X      < X(CURSOR).
         SB          CV+X            < A=X(CURSOR)-X(CV).
         LYI         "1"             < A PRIORI MOUVEMENT '1'.
         BSR         AMCVCR          < DETERMINATION DES MOUVEMENTS
                                     < '1'/'3'.
         JANE        E980            < RETOUR EN ERREUR : ON A (X)#0.
<
< DEPLACEMENT SUR OY :
<
         BSR         ASELDY          < SELECTION DE DY.
         LA          CURSOR+1+Y      < Y(CURSOR).
         SB          CV+Y            < A=Y(CURSOR)-Y(CV).
         LYI         "2"             < MOUVEMENT '2' A PRIORI.
         BSR         AMCVCR          < DETERMINATION DES MOUVEMENTS
                                     < '2'/'4'.
         JANE        E980            < RETOUR EN ERREUR : ON A (X)#0.
         LBY         CURSOR          < RESTAURE A=CARACTERE DE
                                     < DEBLOCAGE DE LA VISU , QUI EST
                                     < LE CARACTERE A INSERER PRESEN-
                                     < TEMENT DANS LE PROGRAMME
                                     < GRAPHIQUE.
<
< CAS DE TOUTES LES COMMANDES :
<
E120:    EQU         $
<        ON A ICI :
<                    A=CARACTERE DE DEBLOCAGE DE LA VISU.
         CPI         '20             < EST-CE UN CTRL-XXX ???
         JGE         E150            < NON , ON PEUT LE GENERER ...
         LAI         "?"+'80         < LES CTRL-XXX SONT REMPLACES PAR
                                     < '?' , AFIN D'APPARAITRE LORS
                                     < DE L'EDITION DU PROGRAMME (CE
                                     < QUE N'AURAIT PAS FAIT LES CTRL-
                                     < XXX) , ET FAIRE UASSI UNE FAUTE
                                     < DE SYNTAXE.
                                     < ('?' MIS EN EXPOSANT).
E150:    EQU         $
         LX          IEG             < RESTAURE X=INDEX COURANT
                                     < D'EXECUTION GRAPHIQUE.
         STBY        &AIC            < LA COMMANDE LUE EST MISE EN
                                     < COMMANDE COURANTE (IEG) . . A
                                     < NOTER QUE IEG A DEJA ETE VALIDE.
         BR          AE111           < VERS L'EXECUTION PROGRAMMEE.
<
<        R E T O U R S   E N   E R R E U R  :
<
E980:    EQU         $
         LYI         -1              < MISE DANS Y D'UN CARACTERE BIDON
                                     < AFIN DE CREER UNE ERREUR DE
                                     < SYNTAXEE PAR LA SUITE ...!!!
         BR          ALOOPB          < VERS LA BOUCLE DE L'EDITEUR ;
                                     < A NOTER QUE : (X)#0.
         PAGE
<
<
<        A F F I C H A G E   D ' U N   P O I N T  :
<
<
<        ARGUMENT :
<                    X,Y = COORDONNEES DU POINT.
<
<
X101:    VAL         $-RACB1
SET:     EQU         RACB+X101
         PSR         B,X,C
         LR          Y,A             < A=Y(POINT COURANT).
         MP          NMPL
         ADR         B,C
         LR          X,A             < A=X(POINT COURANT).
         SLRS        4               < RECUPERATION D'UN NUMERO DE MOT.
         ADR         A,C             < C=@MOT CONTENANT LE POINT M.
         LAI         'F              < MASQUE DE CALCUL MODULO 16.
         ANDR        A,X             < X=NUMERO DU BIT DANS LE MOT.
         LA          0,C             < A=MOT CONTENANT LE POINT M.
POINTS:  SBT         0,X             < POSITIONNEMENT DU POINT A 0/1.
X101:    VAL         POINTS-RACB1
POINT:   EQU         RACB+X101
                                     < VARIABLE SBT/RBT LORSQUE LA
                                     < BRANCHE 'V' EST RESIDENTE.
         STA         0,C             < MISE A JOUR DE L'IMAGE.
         PLR         B,X,C
         RSR
         IF          ORDI-"T",XWOR%,,XWOR%
<
<
<        S T A B I L I S A T I O N   I M A G E  :
<
<
TIMAG:   WORD        IMAG
X101:    VAL         $-RACB1
SP3:     EQU         RACB+X101
         LRP         L
         LB          TIMAG-$+1,L     < B=@RELATIVE IMAGE.
         LA          10,W            < A=SLO(ESCLAVE).
         ADR         A,B             < B=@ABSOLUE IMAGE.
         LXI         NSPTV
         BSR         ACADCT,C        < L=@DCT-VIDEO.
         STB         ADM,L           < DEMANDE VISUALISATION IMAGE.
         RSR
XWOR%:   VAL         0
<
<
<        S T A B I L I S A T I O N  :
<
<
<        A T T E N T I O N  : DETRUIT LE REGISTRE A !!!
<
<
X101:    VAL         $-RACB1
STAB:    EQU         RACB+X101
         IF          ORDI-"T",XWOR%,,XWOR%
         LA          ASP3
         JAE         STAB1           < ON N'EST PAS SOUS :SYS ...
         WORD        '1EC5           < OK, SOUS :SYS...
STAB1:   EQU         $
XWOR%:   VAL         0
         IF          ORDI-"S",XWOR%,,XWOR%
         LAD         STABIL          < DEMANDE DE STABILISATION.
         SVC         0
XWOR%:   VAL         0
         RSR
         PAGE
<
<        C O N V E R S I O N   G R A P H I Q U E - V I D E O  :
<
<
<        ARGUMENT :
<                    SEG CONTIENT LE SEGMENT COURANT A CONVERTIR.
<                    B=4 : MODE SEQUENTIEL ('B') ,
<                     =8 : MODE ETOILE ('S').
<
<
<        RESULTAT :
<                    X ET Y CONTIENNENT L'X ET L'Y
<                    DE L'EXTREMITE DU SEGMENT COURANT EN
<                    PROJECTION SUR L'ECRAN DE LA VISU.
<
<
COMOV:   EQU         $               < PETIT COMMON PRIVE...
C10:     WORD        10              < CONSTANTE DE CONVERSION BASE 10.
WNBSEG:  WORD        '0B07           < ECRITURE DIRECTE SUR '0B.
         BYTE        0;'08           < CHIFFRE, PUIS BACK-SPACE.
         BYTE        '08;'04         < BACK-SPACE, EOT.
X101:    VAL         $-RACB1
VIDEO:   EQU         RACB+X101
<
< PREPARATION DE L'AFFICHAGE GRAPHIQUE :
<
         CPZ         NBSEG           < COMPTAGE SEGMENTS ???
         JL          NBSEG3          < NON.
<
< CAS OU IL Y A COMPTAGE :
<
         ADRI        -4,B            < B=0 SI 'B', B=4#0 SI 'S'.
         LAI         SEG-ZERO*2
         STA         WG+1            < A=@BUFFER A UTILISER.
         LAI         8
         STA         WG+2            < LORQU'IL Y A COMPTAGE, IL Y A
                                     < ECRITURE ALPHA-NUMERIQUE, ET
                                     < IL NE FAUT PAS ALORS PERDRE DE
                                     < SEGMENTS, D'OU CETTE DESOPTIMI-
                                     < SATION...
         JMP         NBSEG4
<
< CAS OU IL N'Y A PAS COMPTAGE : OPTIMISATION DU TRACE :
<
NBSEG3:  EQU         $
         STB         WG+2            < COMPTE D'OCTETS DE WG.
         ADRI        -4,B            < B=0 SI 'B' , B=4#0 SI 'S'.
         LAI         SEGEXT-ZERO*2
         SBR         B,A             < A=@BUFFER A UTILISER DANS WG.
         STA         WG+1            < MAJ DE L'@OCTET DU BUFFER.
NBSEG4:  EQU         $
         BSR         APROJ           < PROJECTION DU 3-ESPACE SUR
                                     < L'ECRAN DE LA VISU.
         STX         SEGEXT+X        < X(EXTREMITE SEGMENT COURANT).
         STY         SEGEXT+Y        < Y(EXTREMITE SEGMENT COURANT).
<
< INITIALISATION DE LA CONVERSION :
<
         LA          APILD           < A=@PILE DE DICHOTOMIE.
         XR          A,K             < INITIALISATION DE K SUR LA PILE
                                     < DE DICHOTOMIE , ET SAVE LE
                                     < REGISTRE K DE SODOME DANS A.
         PSR         X,Y
         PSR         A,B,C           < SAVE LE TYPE 'B'/'S' DANS B , LE
                                     < REGISTRE K DE SODOME DANS A , ET
                                     < L'INDEX COURANT DE LA GRAMMAIRE
                                     < GRAPHIQUE DANS C.
         LA          AIMAG
         LR          A,C             < C=@IMAGE VIDEO.
<
< CALCUL DES EXTREMITES M1 ET M2 DU SEGMENT VIDEO :
<
         LA          SEGORG+X        < A=X(ORIGINE GRAPHIQUE).
         SLRS        DEDX            < REDUCTION VIDEO.
         STA         DICOX1          < RANGEMENT DE X1.
         LA          SEGORG+Y        < A=Y(ORIGINE GRAPHIQUE).
         SLRS        DEDY            < REDUCTION VIDEO.
         NGR         A,A
         AD          NLIG            < INVERSION DUE AU FAIT QUE LES
                                     < AXES Y VIDEOS ET GRAPHIQUES
                                     < SONT INVERSES.
         STA         DICOY1          < RANGEMENT DE Y1.
         LA          SEGEXT+X        < A=X(EXTREMITE GRAPHIQUE).
         SLRS        DEDX            < REDUCTION VIDEO.
         STA         DICOX2          < RANGEMENT DE X2.
         LA          SEGEXT+Y        < A=Y(EXTREMITE GEAPHIQUE).
         SLRS        DEDY            < REDUCTION VIDEO.
         NGR         A,A
         AD          NLIG            < INVERSION DES AXES Y.
         STA         DICOY2          < RANGEMENT DE Y2.
<
< TRACE DICHOTOMIQUE DU SEGMENT :
<
         LX          DICOX1          < X=X1.
         LY          DICOY1          < Y=Y1.
         BSR         ASET            < AFFICHAGE DU POINT M1.
         BSR         ADICO           < TRACE DES POINTS DE M1 A M2.
         LX          DICOX2          < X=X2.
         LY          DICOY2          < Y=Y2.
         BSR         ASET            < AFFICHAGE DU POINT M2.
<
< RETOUR DE LA CONVERSION :
<
         CPZ         NBSEG           < Y-A-T'IL COMPTAGE DES SEGMENTS ???
         JL          NBSEG2          < NON, SORTIE...
<
< COMPTAGE DES SEGMENTS (BIT0(NBSEG)=0) :
<
         IC          NBSEG           < ET UN SEGMENT DE PLUS...
         LRP         C
         ADRI        COMOV-$+1,C     < C=@DU PETIT COMMON PRIVE...
         LAD         CG
         SVC         0               < RETOUR DE '0B EN ALPHANUMERIQUE.
         LA          NBSEG           < INITIALISATION A=NBSEG.
NBSEG1:  EQU         $
         SARD        16              < EXTENSION 32 BITS.
         DV          C10-COMOV,C     < B=CHIFFRE DES UNITES A EDITER.
         ADRI        '30,B           < CONVERSION ASCI.
         XR          A,B             < A=CHIFFRE A EDITER, ET SAVE
                                     < DANS B LE QUOTIENT COURANT.
         STBY        WNBSEG-COMOV+1,C  < MISE DU CHIFFRE A EDITER DANS
                                     < LE BUFFER D'ECRITURE DIRECTE.
         LAD         WNBSEG-COMOV,C
         SVC         0               < EDITION D'UN CHIFFRE COURANT.
         XR          A,B             < RESTAURE A=QUOTIENT COURANT.
         JANE        NBSEG1          < ENCORE A EDITER...
         LAD         OG              < SINON,
         SVC         0               < RETOUR EN GRAPHIQUE DE '0B.
<
< RESTAURATIONS ET SORTIE :
<
NBSEG2:  EQU         $
         PLR         A,B,C           < RESTAURATION DES REGISTRES ,
         PLR         X,Y             < RESTAURATION DES REGISTRES ,
         LR          A,K             < RESTAURATION DE K DE SODOME.
         BR          ARETV           < VERS L'AFFICHAGE GRAPHIQUE.
         PAGE
<
<
<        P A R C O U R S   D I C H O T O M I Q U E   D ' U N
<                    S E G M E N T   M 1   M 2  :
<
<
X101:    VAL         $-RACB1
DICO:    EQU         RACB+X101
DICOB:   EQU         $
         LA          DICOX1          < A=X1.
         AD          DICOX2          < A=X1+X2.
         SLRS        1               < A=(X1+X2)/2.
         STA         DICOX           < X D U MILIEUR DE M1M2.
         LA          DICOY1          < A=Y1.
         AD          DICOY2          < A=Y1+Y2.
         SLRS        1               < A=(Y1+Y2)/2.
         STA         DICOY           < Y DU MILIEU M DE M1M2.
<
< POSITION DE M PAR RAPPORT A M1 ???
<
         SB          DICOY1          < A=Y-Y1.
         JANE        DICO31          < M#M1.
         LA          DICOX           < A=X.
         SB          DICOX1          < A=X-X1.
         JAE         DICO32          < M=M1.
<
< POSITION DE M PAR RAPPORT A M2 :
<
DICO31:  EQU         $
         LA          DICOY           < A=Y.
         SB          DICOY2          < A=Y-Y2.
         JANE        DICO30          < M#M2 ET M#M1.
         LA          DICOX           < A=X.
         SB          DICOX2          < A=X-X2.
         JANE        DICO30          < M#M2 ET M#M1.
<
< CAS OU M=M1 OU M=M2 :
<
DICO32:  EQU         $
         LX          DICOX
         LY          DICOY
         BSR         ASET            < AFFICHAGE DU POINT M=(M1+M2)/2.
         RSR                         < ARRET PROVISOIRE DE LA DICHOTOMIE
                                     < DESCENDANTE.
<
< CAS OU M#M1 ET M#M2 :
<
DICO30:  EQU         $
         LA          DICOX2          < A=X2.
         LB          DICOY2          < B=Y2.
         PSR         A,B             < SAVE LE POINT M2 COURANT.
         LA          DICOX           < A=X.
         STA         DICOX2          < X2<--X.
         LA          DICOY           < A=Y.
         STA         DICOY2          < Y2<--Y.
         BSR         ADICO           < DICHOTOMIE SUR LE SEGMENT M1M.
         LX          DICOX2          < X=X2.
         LY          DICOY2          < Y=Y2.
         BSR         ASET            < AFFICHAGE DU POINT M2.
         STX         DICOX1          < X1<--X2.
         STY         DICOY1          < Y1<--Y2.
         PLR         A,B             < RESTAURATION DU POINT M2 , APRES
                                     < CHANGEMENT DE POINT M1.
         STA         DICOX2          < RESTAURE X2.
         STB         DICOY2          < RESTAURE Y2.
         JMP         DICOB           < VERS LA POURSUITE DE LA DICHO.
         PAGE
<
<
<        P I L E   D E   R E C U R S I V I T E
<        D I C H O T O M I Q U E  :
<
<
X101:    VAL         $-RACB1
PILD:    EQU         RACB+X101
         DZS         64              < SUPER PILE DE DICHOTOMIE !!!
<
<
<        T A I L L E   D E   L A   B R A N C H E  :
<
<
SBB:     VAL         $-RACB1*2
         PAGE
<
<
<        V A L I D A T I O N   D E   L ' I M P L A N T A T I O N  :
<
<
X101:    VAL         $-RACB1
X13:     EQU         RACB+X101
X10:     VAL         X13-ZERO
X10:     VAL         '27C0-X10
ZEROW:   EQU         ZERO+X10
                                     < DEPASSEMENT DES 10K...
         EOT         #SIP GEN PROCESSEUR#



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