PAGE
         IDP         "EDIT - RELEASE 14/08/1974"
         IDP         "JOHN F. COLONNA"
<
<
<        P R O C E S S E U R   D ' E D I T I O N   D E   P A G E  :
<
<
<        FONCTION : CE PROCESSSEUR DANS SA VERSION PROVISOIRE
<        A A SA CHARGE L'EDITION D'UNE PAGE AU SENS DE
<        L'EDITEUR DE TEXTE CLASSIQUE , MAIS OU L'ON A
<        RAJOUTE UNE 2EME DIMENSION : C'EST LA PAGE.
<          IL GERE DONC UNE MATRICE QUI CONTIENT LA PAGE
<        QUE L'ON EDITE.
<
<
<        POSSIBILITES : L'EDITION SE FAIT PAR MOUVEMENT DU
<        CURSEUR DANS LES 4 DIRECTIONS N,S,W,E (!!!!) ,
<        AVEC LES TOUCHES SUIVANTES :
<                    N : CTRL-K ,
<                    S : LF OU CTRL-J ,
<                    W : CTRL-H ,
<                    E : CTRL-I.
<          LES MOUVEMENTS DU CURSEUR N'AFFECTE PAS LES
<        CARACTERES DE LA PAGE ; LORSQU'ENSUITE ON FRAPPE
<        DES CARACTERE STANDARDS , ILS SONT INSERES
<        A LA POSITION COURANTE DU CURSEUR . A NOTER QUE LE
<        MARGIN RIGHT A ETE SUPPRIME.
<          LA SUPPRESSION DE CARACTERES SE FAIT AVEC LA
<        BARRE 'SPACE' (ET C'EST LA SA DIFFERENCE AVEC
<        CTRL-I.....).
<
<
NBCAR:   VAL         74              < NBRE DE CARACTERES PAR LIGNE.
NBLIG:   VAL         35              < NBRE DE LIGNES PAR PAGE.
<
<
         PROG
         DZS         'B
         ASCI        "ED    "        < NOM DU PROCESSEUR : 'ED    '.
         BYTE        '04;'D0         < <EOT>-'P'+'80.
         WORD        '1F00           < TAILLE OCTETS POUR CALLP.
         WORD        PEDIT           < @DE LANCEMENT DE EDIT POUR CALLP.
         WORD        LEDITP+'80      < ADRESSE DU LOCAL DU PROCESSEUR.
<
<        E N T R Y   D U   P R O C E S S E U R  :
<
PEDIT:   EQU         $
         LRP         L
         LA          -1,L
         LR          A,L             < L=@LOCAL DU PROCESSEUR.
         WORD        '8580           < BRANCHEMENT SUR '80,L ...
         PAGE
<
<
<        L O C A L   D E   L ' E D I T E U R  :
<
<
         LOCAL
LEDITP:  EQU         $
         WORD        EDITP           < ADRESSE DU POINT D'ENTREE DU
                                     < PROCESSEUR.
POINTC:  DZS         3               < A T T E N T I O N  : DOIT ETRE
                                     < A UNE ADRESSE IMPAIRE (CF.
                                     < LES INVERSIONS X ET Y EN
                                     < GRAPHIQUE) !!!!!!!!!!!!!
RESTAR:  WORD        -1              < RESTAR=-1 : LE CHARGEMENT
                                     <             A EU LIEUR ;
                                     < RESTAR=0  : APRES CHARGEMENT ,
                                     <             PERMET DONC DE RE-
                                     <             RENTRER SUITE A UN
                                     <             'ALT-MODE'.
<
<        D E M A N D E S   A D R E S S E E S   A   M S P  :
<
CHOME:   WORD        '0202           < ENVOI DU CURSEUR EN 'HOME'.
         WORD        MHOME           < ASTUCE ....!!??9!?
         WORD        1               < 1 CARACTERE (''HOME'').
ERASE:   WORD        '0205           < ERASE SCREEN.
CARTE:   WORD        '0A00           < ENTREE DE LIGNES ENTIERES
                                     < SUR NVP=10.
         WORD        0
         WORD        80              < ET NON PAS 'NBCAR' , ET CECI
                                     < A CAUSE DU MICRO-CANAL ....
MESGI:   WORD        '0100           < ENTREE D'1 CARACTERE SANS ECHO.
         WORD        MESG
         WORD        1
MESGO:   WORD        '0202           < ECHO EVENTUEL DU CARACTERE LU.
         WORD        MESG
         WORD        1
LIGN:    WORD        '0202           < EDITION D'UNE LIGNE DE LA PAGE.
         WORD        0
         WORD        NBCAR
CCI:     WORD        '0001           < RETOUR AU CCI EN FIN D'EDITION.
OG:      WORD        '0203           < OPEN GRAPHIQUE.
CG:      WORD        '0204           < CLOSE GRAPHIQUE.
WG:      WORD        '020A           < ECRITURE GRAPHIQUE.
         WORD        COORD
         WORD        4               < ENVOI DES COORDONEES DU CURSEUR
                                     < ALPHA-NUMERIQUE.
CU:      WORD        '0106           < MISE EN FONCTION DU CURSEUR
                                     < GRAPHIQUE.
         WORD        0;0
LG:      WORD        '0109           < LECTURE DES COORDONNEES DU
                                     < CURSEUR GRAPHIQUE.
         WORD        POINTC
         WORD        6               < 6 OCTETS A LIRE.
LTAGR:   VAL         '140            < NBRE MAX DE SEGMENTS
                                     < AUTORISES LORS D'UNE EDITION
                                     < GRAPHIQUE.
SPAGE:   WORD        '0002           < POUR OPERATIONS SUR L'ARBRE
                                     < DU SYSTEME.
         WORD        PAGE
X40:     VAL         8*LTAGR
X40:     VAL         80-NBCAR+X40    < A CAUSE DE 'CARTE' QUI LIT 80
                                     < CARACTERES PAR LIGNE DE PAGE ?!!!
         WORD        NBCAR*NBLIG+X40
X40:     VAL         X40-80+NBCAR    < RESTAURE X40=8*LTAGR.
         WORD        -1              < VALEUR SUIT IMMEDIATEMENT NOM.
SCATAL:  WORD        '0002           < POUR DEMANDE CATALOGUE DES NOMS.
         WORD        0               < @OCTET DU NOM.
         WORD        0               < LONGUEUR DU NOM.
         WORD        -1              < VALEUR SUIT IMMEDIATEMENT NOM.
PUNCH:   WORD        '0B02           < ECRITURE SUR NVP=11 (CU COUPLE
                                     < A LA PERFORATRICE.
         WORD        0               < @-OCTET DE BPUNCH.
         WORD        2               < 1 MOT D'INFORMATION A ENVOYER.
SLEEP:   WORD        '0005           < FONCTION DE MISE EN SOMMEIL
                                     < EDIT LORS DU PUNCH DES CARTES.
         WORD        0
         WORD        4               < 4 SECONDES DE SOMMEIL.
<
<        C O N S T A N T E S   D E   L ' E D I T E U R  :
<
AFEDIT:  WORD        FEDIT,X         < RELAI VERS LA TABLE DE COMMANDE
                                     < DE L'EDITEUR.
COG:     WORD        TCOG,X          < RELAI DE LA TABLE DES FONCTIONS
                                     < GRAPHIQUES.
ATCOD:   WORD        TCOD,X          < TABLE DE CODAGE ASCI EN CODE
                                     < CARTE (COMPATIBLE LECTEUR DE
                                     < DE CARTES).
ADPAGE:  WORD        PAGE            < @PAGE ALPHA-NUMERIQUE.
APAGE:   WORD        0               < RELAI DE TRAVAIL SUR UNE LIGNE
                                     < DE LA PAGE.
ATAGR:   WORD        TAGR            < @TABLE DES SEGMENTS.
ALTAGR:  WORD        LTAGR           < NBRE D'ENTREES DE TAGR.
<
REPEAT:  BYTE        0;"?"           < VALEUR INITIALE.
DOG:     WORD        0               < COMPTEUR DE REPEATS EN ALPHA-
                                     < NUMERIQUE DANS LE MODE CTRL-A.
                                     < DOG=0 : PAS DE REPEAT EN COURS ,
                                     < DOG<0 : REPEAT A L'INFINI.
                                     < DOG>0 : REPEAT 'DOG' FOIS.
PKC:     WORD        0               < RANG 1ER CARACTERE DE LA CHAINE
                                     < COURANTE.
DKC:     WORD        0               < RANG DU DERNIER CARACTERE DE
                                     < LA CHAINE COURANTE.
IMOV:    WORD        0               < INCREMENT/DECREMENT LORS DU MOVE
                                     < D'UNE CHAINE .(+1/-1).
VAR:     WORD        0               < DESTINE AUX EFFACEMENTS SEGMENT.
BPUNCH:  EQU         VAR             < BUFFER DE PUNCH.
VARY:    WORD        0               < CTTE DE TRANSLATION DE Y.
LASTP:   EQU         VARY            < DERNIER CARACTERE PUNCHE.
VARX:    WORD        0               < CTTE DE TRANSLATION DE X.
GRAFP:   WORD        -1              < SI <0 : GRAPHIQUE INTERACTIF ,
                                     < SI >=0 : DONNE L'INDEX DE LA
                                     <           COMMANDE COURANTE
                                     <           GRAPHIQUE DANS 'PAGE'.
LGRAFP:  VAL         10              < LONGUEUR DE LA PILE DES GRAFP.
SGRAFP:  BYTE        LGRAFP;0
         DZS         LGRAFP+1        < ZONE D'EMPILEMENT DES GRAFP.
CTRL:    WORD        0               < CTRL=0 : CAS GENERAL ,
                                     < CTRL=-'40 : LA COMMANDE GRAPHIQUE
                                     <             SUIVANTE SERA
                                     <             CONSIDEREE COMME
                                     <             UN CTRL-XXX.
SCALE:   WORD        2               < FACTEUR D'ECHELLE INITIAL.
SCAL13:  WORD        0               < SI #0 : INVERSION DE '1' ET '3'.
SCAL24:  WORD        0               < SI #0 : INVERSION DE '2' ET '4'.
SCAL56:  WORD        0               < SI #0 : 2NVERSION DE '5' ET '6'.
SCALXY:  WORD        0               < SI #0 : INVERSION DE X ET DE Y.
FIS:     BYTE        0;'3E           < '>' IMPLICITE.
KNUMER:  WORD        '1000           < NUMERATEUR D'UN RAPPORT.
KDENOM:  WORD        '1000           < DENOMINATEUR D'UN RAPPORT.
SUP:     WORD        0               < INDICATEUR DE POSITION HAUTE
                                     < SUR UNE LIGNE :
                                     < SUP=0 : LE CARACTERE SUIVANT
                                     <         SERA SUR LA LIGNE ,
                                     < SUP='80 : LE CARACTERE SUIVANT
                                     <           SERA 10 POINTS AU-
                                     <           DESSUS DE LA LIGNE.
MEMO:    WORD        0               < LE BIT0 INDIQUE S'IL FAUT
                                     < MEMORISER UN SEGEMENT (0) ,
                                     < OU PAS (1).
YC:      WORD        0               < Y DU CENTRE DU CERCLE.
XC:      WORD        0               < X DU CENTRE DU CERCLE.
YK:      WORD        0
XK:      WORD        0
<
ASVC:    WORD        ESVC            < APPEL DE MSP.
ABELL:   WORD        BELL            < ENVOI D'UNE 'BELL' A L'UTILISATEUR
ASAVEK:  WORD        SAVEK           < SAVE CARACTERE EN VUE DES REPEAT.
ASP1:    WORD        SP1             < ROUTINE DE RAZ DE LA PAGE ALPHA.
ASP2:    WORD        SP2             < ROUTINE DE MAJ DE SCATAL.
ADIV:    WORD        DIV             < UTILISE POUR LES CERCLES.
AINIP:   WORD        INIP            < INITIALISATION DE LA PAGE.
AE40:    WORD        E40             < ERREUR EDITEUR GRAPHIQUE.
AE42:    WORD        E42             < BOUCLE DE L'EDITEUR GRAPHIQUE.
ACTAGR:  WORD        CTAGR           < CLEAR TABLE DES SEGMENTS.
AGRAFP:  WORD        PGRAFP          < ROUTINE DE CALCUL DE Y=@SGRAFP.
ASEEKS:  WORD        SEEKS           < RECHERCHE SEGMENT DANS TAGR.
AMPC:    WORD        MPC
AROTAT:  WORD        ROTAT           < ROTATION D'UN POINT.
ATRANS:  WORD        TRANS           < TRANSLATION D'UN POINT.
AHOMOT:  WORD        HOMOT           < @ROUTINE HOMOTHETIE 1 POINT.
ASP:     WORD        0               < ROTATION OU TRANSLATION 1 POINT.
ATSE:    WORD        TSE             < TEST DE SORTIE DE L'ECRAN.
ALOOP:   WORD        LOOP            < RETOUR A LA BOUCLE DE L'EDITEUR.
<
C37:     WORD        NBCAR/2         < CONSTANTE MULTIPLICATIVE.
C74:     WORD        NBCAR           < CONSTANTE DE DIVISION.
N3574:   WORD        NBCAR*NBLIG     < NBRE DE CARACTERES PAR ECRAN.
X41:     VAL         NBCAR*NBLIG/2
NMPP:    WORD        X41-1           < NBRE DEMOTS D'UNE PAGE-1.
C1024:   WORD        1024
R:       WORD        61*524
RS2:     WORD        61*524/2
COS:     WORD        60*524          < COS(DTETA)=COS/R.
SIN:     WORD        11*524          < SIN(DTETA)=SIN/R.
DIF:     WORD        1*524           < DIF=R-COS.
<
<        B U F F E R S   E T   M E S S A G E S  :
<
MESG:    BYTE        '00;'07         < CARACTERE UTILISATEUR-'BELL'.
MHOME:   BYTE        '60;0           < PSEUDO-CARACTERE 'HOME'.
COORD:   DZS         4               < ENVOI DES COORDONNEES
                                     < DU CURSEUR ALPHA-NUMERIQUE OU
                                     < OU DES COORDONNEES
                                     < D'UN SEGMENT.
SEGC:    EQU         COORD           < 4 MOTS CONTENANT LES COOR-
                                     < DONNEES DU SEGMENT COURANT.
SEGV:    DZS         2
MRCLF:   BYTE        '0D;'0A
PILE:    DZS         20              < PILE DE L'EDITEUR.
         PAGE
<
<        T A B L E   D E   C O M M A N D E  :
<
FEDIT:   EQU         $
         WORD        EERR            < 0 ,
         WORD        AC              < CTRL-A : REPEAT DU CARACTERE
                                     < PRECEDENT UN NBRE DE FOIS EGAL
                                     < A LA VALEUR REPRESENTEE PAR LE
                                     < CARACTERE QUI SUIVRA MOINS 1.
         WORD        CACN            < CTRL-B : CATALOGUE DES ACNS.
         WORD        CATAL           < CTRL-C : CATALOGUE DES NOMS.
         WORD        STK             < CTRL-D : <EON> , INSERE DANS
                                     < LA PAGE , COMME UN AUTRE CARACTERE
         WORD        EDIT            < CTRL-E : EDITION DE LA PAGE
                                     < COURANTE.
         WORD        FIN             < CTRL-F : RETOUR AU CCI ,
         WORD        GRAPH           < '7 : CTRL-G : PASSAGE EN MODE
                                     < GRAPHIQUE.
         WORD        HC              < CTRL-H : CURSEUR W ,
         WORD        IC              < CTRL-I : CURSEUR E ,
         WORD        LF              < LF : CURSEUR S ,
         WORD        KC              < CTRL-K : CURSEUR N ,
         WORD        LC              < 'C : CTRL-L : DESIGNATION DU
                                     <               1ER CARACTERE DE
                                     <               CHAINE COURANTE.
         WORD        RC              < RETOUR-CHARRIOT ,
         WORD        NC              < 'E : CTRL-N : DESIGNATION DE
                                     <               LA NOUVELLE ORIGINE
                                     <               DE LA CHAINE
                                     <               COURANTE.
         WORD        OC              < 'F : CTRL-O : POSITION HAUTE.
         WORD        PC              < ENTREE CARTES SUR NVP=10.
         WORD        QC              < '11 : CTRL-Q : QULEQUE-SOIT.
         WORD        INIP            < CTRL-R : REINITIALISATION DE LA
                                     < PAGE ,
         WORD        EERR            < '13 : USAGE INTERDIT , CF. LE
                                     < CTRL-X-OFF.
         WORD        TPAGE           < TC : APPEL PAGE SOUS <ACNESC>.
         WORD        SYSPAG          < UC : APPEL PAGE SOUS :SYS.
         WORD        EERR            < CTRL-V : CF. TABULATION CMS4.
         WORD        WPAGE           < WC : SAUVEGARDE PAGE SUR DK.
         WORD        DPAGE           < XC : DELETE PAGE SUR DK.
         WORD        YCD             < '19 : CTRL-Y : SIGNE DIFFERENT.
         WORD        ZC              < '1A : CTRL-Z : REPEAT CARACTERE.
         WORD        KCS             < '1B : CTRL-SHIFT-K : IL N'EXISTE
                                     < PAS.
         WORD        LCS             < '1C : CTRL-SHIFT-L : DESIGNATION
                                     <                      DU DERNIER
                                     <                      CARACTERE DE
                                     <                      LA CHAINE
                                     <                      COURANTE.
         WORD        MCS             < '1D : CTRL-SHIFT-M : IL EXISTE.
         WORD        NCS             < '1E : CTRL-SHIFT-N : FLECHE
                                     <                      DROITE.
         WORD        OCS             < CTRL-SHIFT-O : PERFORATION
                                     < DE LA PAGE COURANTE SUR NVP=11.
         WORD        STK             < TOUS LES AUTRES CARACTERES SONT
                                     < RANGES A L'EMPLACEMENT DU CURSEUR
                                     < DANS  LA PAGE COURANTE.
         WORD        EERR            < '21 : FAUX CARACTERE D'ERREUR.
         PAGE
<
<        T A B L E   D E   C O M M A N D E   G R A P H I Q U E  :
<
TCOG:    EQU         $
         WORD        F13             < MODE NORMAL '1' ET '3'.
                                     < ('!').
         WORD        F24             < MODE NORMAL DE '2' ET '4'.
                                     < ('"').
         WORD        F31             < INVERSION DE '1' ET '3'.
                                     < ('#').
         WORD        F42             < INVERSION DE '2' ET '4'.
                                     < ('$').
         WORD        F56             < MODE NORMAL DE '5' ET '6'.
                                     < ('%').
         WORD        F65             < INVERSION DE '5' ET '6'.
                                     < ('&').
         WORD        E40
         WORD        FOUVR           < SCALE<--(SCALE)+6.
                                     < ('(').
         WORD        FFERM           < SCALE<--(SCALE)-6.
                                     < (')').
         WORD        FSTAR           < RETOURS AUX MODES NORMAUX : CF.
                                     < F13 & F24 & F56 & FXY.
         WORD        FPLUS           < SCALE<--(SCALE)+1 , 1 SI >128.
                                     < ('+').
         WORD        E40
         WORD        FMOINS          < SCALE<--(SCALE)-1 , 128 SI =0.
                                     < ('-').
         WORD        E40
         WORD        FCTRL           < TRANSFORMATION DE LA COMMANDE
                                     < GRAPHIQUE SUIVANTE EN UN CTRL-XXX.
                                     < ('/').
         WORD        F0              < X<--0 ; Y<--0.
         WORD        F1              < X<--(X)+SCALE.
         WORD        F2              < Y<--(Y)+SCALE.
         WORD        F3              < X<--(X)-SCALE.
         WORD        F4              < Y<--(Y)-SCALE.
         WORD        F5              < X<--(X)+3*SCALE/4 ,
                                     < Y<--(Y)+SCALE/4.
         WORD        F6              < X<--(X)-3*SCALE/4 ,
                                     < Y<--(Y)-SCALE/4.
         WORD        F7              < SCALE<--4.
         WORD        F8              < SCALE<--8.
         WORD        F9              < SCALE<--16.
         WORD        F2P             < DESIGNATION D'UN PROGRAMME
                                     < GRAPHIQUE.
         WORD        E40
         WORD        FINF            < MISE EN MODE '<'.
         WORD        E40
         WORD        FSUP            < MISE EN MODE '>'.
         WORD        FYX             < INVERSION DE X ET DE Y.
                                     < ('?').
         WORD        FXY             < MODE NORMAL DE X ET DE Y.
                                     < ('@').
         WORD        FA              < DESIGNATION 1ER POINT SEGMENT.
         WORD        FB              < DESIGNATION 2EME POINT SEGMENT.
         WORD        FC              < TRACE DU CERCLE COURANT.
         WORD        FD              < AFFICHAGE TOUS SEGMENTS (DESSIN).
         WORD        FE              < EFFACEMENT SEGMENT DESIGNE.
         WORD        FF              < RETOUR A L'ALPHA-NUMERIQUE.
         WORD        FG              < EDITION DE LA GRILLE.
         WORD        FH              < HOMOTETHIE TABLE DES SEGMENTS.
         WORD        FI              < RAPPORT D'HOMOTETHIE<1.
         WORD        FJ              < MISE EN MODE GRAPHIQUE PROGRAMME.
         WORD        FK              < 2EME POINT D'UN SEGMENT (ETOILE).
         WORD        FL              < TRACER CERCLE DANS LE SENS TRIGO.
         WORD        FM              < MODE MEMORISATION DES SEGMENTS.
         WORD        FN              < MODE NON MEMORISATION SEGMENTS.
         WORD        FO              < DESIGNATION CENTRE DU CERCLE.
         WORD        FP              < RAPPORT D'HOMOTHETIE=-1 (SYM.).
         WORD        FQ              < ROTATION TABLE DES SEGMENTS.
         WORD        FR              < TRACER ANTI-TRIGO D'UN CERCLE.
         WORD        FS              < DESIGNATION DU SEGMENT COURANT.
         WORD        FT              < TRANSLATION DU SEGMENT COURANT.
         WORD        FU              < RAPPORT D'HOMOTETHIE>1.
         WORD        FV              < TRANSLATION TABLE DES SEGMENTS.
         WORD        FW              < DESSIN COUBE !?!?!?!?!
         WORD        FX              < EFFACEMENT DE L'ECRAN.
         WORD        FY              < FIN DU MODE GRAPHIQUE PROGRAMME.
         WORD        FZ              < RAZ DE LA TABLE DES SEGMENTS.
NCOG:    VAL         $-TCOG          < NBRE DE FONCTIONS GRAPHIQUES.
         PAGE
<
<
<        T A B L E   D E   C O D A G E   C A R T E S  :
<
<
<        FORMAT :
<                    BIT0-11=CODE 12 BITS DE PERFORATION ,
<                    BIT14=1 : CARACTERE NUMERIQUE ,
<                    BIT15=1 : CARACTERE ALPHA-BETIQUE.
<
<
TCOD:    EQU         $-'20+1
         WORD        '2121           < EOT       4 (TRANSPOSE EN 1F)
         WORD        '0000           < 'SPACE    20
         WORD        '4821           < !         21
         WORD        '0061           < "         22
         WORD        '0421           < #         23
         WORD        '4421           < $         24
         WORD        '2222           < %         25
         WORD        '8001           < &         26
         WORD        '0121           < '         27
         WORD        '8121           < (         28
         WORD        '4121           < )         29
         WORD        '4222           < *         2A
         WORD        '80A1           < +         2B
         WORD        '2421           < ,         2C
         WORD        '4002           < -         2D
         WORD        '8421           < .         2E
         WORD        '3002           < /         2F
         WORD        '2001           < 0         30
         WORD        '1001           < 1         31
         WORD        '0801           < 2         32
         WORD        '0401           < 3         33
         WORD        '0201           < 4         34
         WORD        '0101           < 5         35
         WORD        '0081           < 6         36
         WORD        '0041           < 7         37
         WORD        '0021           < 8         38
         WORD        '0011           < 9         39
         WORD        '0821           < :         3A
         WORD        '40A1           < ;         3B
         WORD        '8222           < <         3C
         WORD        '00A1           < =         3D
         WORD        '20A1           < >         3E
         WORD        '2061           < ?         3F
         WORD        '0222           < @         40
         WORD        '9002           < A         41
         WORD        '8802           < B         42
         WORD        '8402           < C         43
         WORD        '8202           < D         44
         WORD        '8102           < E         45
         WORD        '8082           < F         46
         WORD        '8042           < G         47
         WORD        '8022           < H         48
         WORD        '8012           < I         49
         WORD        '5002           < J         4A
         WORD        '4802           < K         4B
         WORD        '4402           < L         4C
         WORD        '4202           < M         4D
         WORD        '4102           < N         4E
         WORD        '4082           < O         4F
         WORD        '4042           < P         50
         WORD        '4022           < Q         51
         WORD        '4012           < R         52
         WORD        '2802           < S         53
         WORD        '2402           < T         54
         WORD        '2202           < U         55
         WORD        '2102           < V         56
         WORD        '2082           < W         57
         WORD        '2042           < X         58
         WORD        '2022           < Y         59
         WORD        '2012           < Z         5A
         PAGE
<
<
<        R O U T I N E S   D E   L ' E D I T E U R  :
<
<
         PROG
         PAGE
<
<
<        S A U V E G A R D E   D E S   C A R A C T E R E S
<        E N   V U E   D ' E V E N T U E L S   R E P E A T S  :
<
<
<        ARGUMENT :
<                    A=CARACTERE.
<
<
SAVEK:   EQU         $
         STA         REPEAT          < SAVE CARACTERE COURANT EN VUE
                                     < D'UN EVENTUEL REPEAT.
         RSR
         PAGE
<
<
<        P E R F O R A T I O N   D E   L A   P A G E
<        C O U R A N T E   S U R   N V P = 1 1  :
<
<
<        FONCTION :
<                      AYANT HABILEMENT CONNECTE LA PERFO
<                    HONEYWELL BULL SUR LE T1600 PAR
<                    L'INTERMEDIAIRE D'UN COUPLEUR
<                    UNIVERSEL , ON A LA POSSIBILITE DE
<                    SAUVEGARDER LA PAGE COURANTE SUR
<                    CARTES (QUEL PROGRES...).
<                      ON PUNCHE 35 LIGNES , OU BIEN ON
<                    S'ARRETE LORS DE LA RENCONTRE D'UN
<                    'EOT' EN COLONNE 74.
<
<
OCS:     EQU         $
         LA          ADPAGE
         SBT         0
         STA         APAGE           < GENERATION D'UN RELAI VERS LA
                                     < PAGE COURANTE.
         LXI         0               < INDEX CARACTERE COURANT DANS
                                     < LA PAGE.
         LBI         NBLIG           < B=NBRE DE CARTES MAX A PUNCHER.
E410:    EQU         $
         LYI         NBCAR           < Y=NBRE DE CARACTERES D'UNE
                                     < LIGNE DE PAGE.
E411:    EQU         $
         LBY         &APAGE          < A=CARACTERE COURANT A PUNCHER.
         STA         LASTP           < ET SAVE IT IN LASTP.
         CPI         "Z"
         JLE         E408            < OK , CODE RECONNU.
         LAI         '20             < NON : REMPLCE PAR 'SPACE'.
E408:    EQU         $
         CPI         4               < EST-CE 'EOT' ?????
         JNE         E409            < NON.
<
< TRAITEMENT SPECIAL DE L''EOT' :
<
         LAI         '20-1           < L''EOT' EST CONVERTI EN '1F.
         STZ         LASTP           < MEMORISONS 'EOT' PAR LASTP=0.
E409:    EQU         $
         PSR         X
         LR          A,X             < X=CODE ASCI DU CARACTERE.
         LA          &ATCOD          < A=CODE DE PERFORATION.
         PLR         X
         STA         BPUNCH          < MISE DU CARACTERE DANS LE
                                     < BUFFER DE PERFORATION.
         LAD         PUNCH
         BSR         ASVC            < ENVOI D'UN CARACTERE A LA PERFO.
         JANE        E291            < RETOUR EN ERREUR : NVP NON
                                     < ASSIGNE , ....
         ADRI        1,X             < CARACTERE SUIVANT.
         ADRI        -1,Y            < DECOMPTE DES CARACTERES SUR
                                     < LA LIGNE COURANTE.
         CPZR        Y
         JNE         E411            < LA LIGNE EST INCOMPLETE.
<
< CAS OU UNE LIGNE COMPLETE A ETE ENVOYEE ,
< COMPLETONS LA CARTE PAR 6 CARACTERES 'SPACE' :
< (A NOTER QUE L'ON ENVOIE SYSTEMATIQUEMENT
< 80 CARACTERES POUR EVITER LES PROBLEMES
< DE SATURATION DE LA PERFO)
<
         LYI         80-NBCAR        < NBRE DE 'SPACE' A ENVOYER.
         STZ         BPUNCH          < BPUNCH='0000=CODE DU 'SPACE'.
E412:    EQU         $
         LAD         PUNCH
         BSR         ASVC            < ENVOI D'UN 'SPACE'.
         ADRI        -1,Y
         CPZR        Y
         JNE         E412            < TOUS LES 'SPACE' N'ONT PAS
                                     < ETE ENVOYES.
<
< LA CARTE A ETE EJECTEE AU CARACTERE 80 ,
< PASSONS A LA LIGNE SUIVANTE :
<
         CPZ         LASTP           < TEST DU DERNIER CARACTERE CODE.
         JE          E291            < C'ETAIT UN 'EOT' EN COLONNE 74.
                                     < ON ARRETE DONC LA LA PERFO.
         ADRI        -1,B            < SINON , DECOMPTE DES LIGNES
                                     < RESTANT A PUNCHER.
         LAD         SLEEP
         BSR         ASVC            < MISE EN SOMMEIL POUR
                                     < 4 SECONDES (TEMPS DE PUNCH D'UNE
                                     < CARTE ...
         CPZR        B
         JNE         E410            < IL EN RESTE.
         JMP         E291            < 35 LIGNES ONT ETE PUNCHEES.
         PAGE
<
<
<        C R E A T I O N   D ' U N E   L I G N E
<        A L P H A - N U M E R I Q U E   A   P A R T I R
<                    D U   N V P = 1 0  :
<
<
<        FONCTION :
<                      CE MODULE LIT UN PAQUET DE CARTES
<                    SUR NVP=10 , ET L'IMPLANTE DANS LA PAGE
<                    ALPHA-NUMERIQUE COURANTE ; L'OPERATION
<                    SE TERMINE A LA 35EME CARTE OU SUR
<                    LA 1ERE CARTE CONTENANT UN 'EOT'
<                    EN COLONNE 74.
<
<
PC:      EQU         $
         LY          ADPAGE
         LR          Y,B
         ADRI        -1,Y            < Y CONTIENT UNE ADRESSE MOT
                                     < QUI PERMETTRA D'ATTEINDRE LE
                                     < DERNIER CAREACTERE DE CHAQUE
                                     < LIGNE.
         ADR         B,B             < B=@OCTET DU BUFFER INITIAL.
         LXI         NBLIG           < NBRE MAX DE CARTES A LIRE.
E290:    EQU         $
         STB         CARTE+1         < MAJ DE LA DEMANDE AVEC L'@
                                     < OCTET DU BUFFER COURANT.
         LAD         CARTE
         BSR         ASVC
         JANE        E291            < ABANDON SUR ERREUR.
         ADRI        NBCAR,B         < PROGRESSION DE L'@OCTET DU
                                     < BUFFER COURANT.
         ADRI        NBCAR/2,Y       < Y=@MOT DES 2 DERNIERS CARACTERES
                                     < DE LA LIGNE QUE L'ON VIENT
                                     < DE CREER.
         STY         APAGE           < GENERATION DU RELAI.
         LA          &APAGE
         ANDI        'FF             < ACCES AU DERNIER CARACTERE DE
                                     < LA LIGNE QUE L'ON VIENT DE CREER.
         CPI         '04             < EST-CE 'EOT' ????
         JE          E291            < OUI , ARRET DE L'OPERATION ,
                                     < ET RENVOI HOME DU CURSEUR.
         JDX         E290            < CARTE SUIVANTE ....
E291:    EQU         $
         BSR         ABELL           < AVERTISSEMENT DE FIN D'OPERATION.
         JMP         E72             < ARRET SUR LA 35EME CARTE ET
                                     < RENVOI HOME DU CURSEUR.
         PAGE
<
<        T R A I T E M E N T   D U   C T R L - K :
<
<        FONCTION : CETTE ROUTINE TRAITE LES
<        DEPLACEMENTS 'N' DU CURSEUR (LIGNE UP).
<
KC:      EQU         $
         BSR         ASAVEK          < EN VUE D'UN EVENTUEL REPEAT.
         LAI         0               < PAS D'ECHO A PRIORI.
         CPZR        Y               < LE CURSEUR EST-IL DEJA SUR
                                     < LA 1ERE LIGNE DE L'ECRAN ???
         JE          E280            < OUI , IL Y RESTE (CF. LE HARD).
                                     < (ET SUPPRESSION D'UN EVENTUEL
                                     < REPEAT EN COURS ?!?!?!)
         ADRI        -1,Y            < LE CURSEUR REMONTE D'UNE LIGNE
                                     < DANS LA PAGE DANS LE CAS OU IL
                                     < N'ETAIT PAS SUR LA 1ERE LIGNE.
E1:      EQU         $
         LAD         MESGO           < DEMANDE DU CARACTERE CTRL-K.
E2:      EQU         $
         BR          ALOOP           < RETOUR A LA BOUCLE DE L'EDITEUR.
<
<        T R A I T E M E N T    D U   R E T O U R - C H A R R I O T  :
<
RC:      EQU         $
         LXI         0               < RETOUR EN TETE DE LIGNE.
         JMP         E1              < ALLONS DEMANDER L'ECHO DU CR.
<
<        T R A I T E M E N T   D U   C T R L - H  :
<
<        FONCTION : CETTE ROUTINE TRAITE LES DEPLACEMENTS 'W'
<        DU CURSEUR.
<
HC:      EQU         $
         CPZR        X               < EST-ON DEJA EN DEBUT DE
                                     < LIGNE ???? SI OUI , IL FAUT
                                     < INTERDIRE LE CTRL-H , CAR UNE
                                     < ERREUR
                                     < HARD SUR LES TEKTRO FAIT QU'UN
                                     < CTRL-H EN DEBUT DE LIGNE RAMENE
                                     < SUR L'AVANT-DERNIER CARACTERE
                                     < DE LA LIGNE , LE DERNIER
                                     < DEVENANT INACCESSIBLE !!!
         JE          E280            < ENVOI D'UNE 'BELL' SANS ECHO.
                                     < (ET SUPPRESSION D'UN EVENTUEL
                                     < REPEAT EN COURS !!!).
         ADRI        -1,X            < SINON , LE CURSEUR RECULE D'UNE
                                     < POSITION.
         BSR         ASAVEK          < EN VUE D'UN EVENTUEL REPEAT.
         JMP         E1              < VERS L'ECHO DU CTRL-H.
<
<        T R A I T E M E N T   D U   C T R L - I  :
<
<        FONCTION : CETTE ROUTINE GERE LES DEPLACEMENTS
<        'E' DU CURSEUR.
<
IC:      EQU         $
         BSR         ASAVEK          < EN VUE D'UN EVENTUEL REPEAT.
IC1:     EQU         $               < ENTREE POUR 'STK'.
         ADRI        1,X             < DEPLACEMENT D'UNE POSITION A
                                     < DROITE DU CURSEUR.
         LR          X,A
         CPI         NBCAR           < LE CURSEUR ETAIT-IL DEJA EN
                                     < BOUT DE LIGNE ??
         JL          E1              < NON , ALLONS REDEMANDER L'ECHO
                                     < DU CTRL-I.
         LXI         0               < DANS LE CAS OU LE CURSEUR ETAIT
                                     < DEJA EN BOUT DE LIGNE , ON FAIT
                                     < COMME LE HARD : RC+LF.
         JMP         LF1             < APRES LE R/C (X=0) , LE LF ....
<
<
<        M I S E   E N   P O S I T I O N   H A U T E  :
<
<
OC:      EQU         $
         LAI         '80             < POUR FAIRE MONTER LE BIT0
                                     < DU CARACTERE SUIVANT.
         STA         SUP
         JMP         E24             < VERS LA BOUCLE DE L'EDITEUR
                                     < SANS ECHO.
<
<        T R A I T E M E N T   D E S   L I N E - F E E D  :
<
<        FONCTION : CETTE ROUTINE TRAITE LES CARACTERES
<        'LF' ET A A SA CHARGE D'EVITER QUE LA VISU NE
<        FASSE UN MARGIN RIGHT , PUISQU'ALORS REGNE UNE
<        VERITABLE PANIQUE AU  AU POINT DE VUE GESTION DE LA
<        POSITION DU CURSEUR ....
<
LF:      EQU         $
         BSR         ASAVEK          < EN VUE D'UN EVENTUEL REPEAT.
LF1:     EQU         $               < ENTREE POUR 'IC'.
         ADRI        1,Y             < PASSAGE A LA LIGNE SUIVANTE.
         LR          Y,A
         CPI         NBLIG           < LE CURSEUR ETAIT-IL DEJA SUR LA
                                     < DERNIERE LIGNE DE LA PAGE ??
         JL          E1              < NON , ALLONS DEMANDER L'ECHO
                                     < DU LF , ON NE RISQUE RIEN ....
         LBY         MESG            < ACCES AU CARACTERE ENVOYE
                                     < PAR L'UTILISATEUR.
         CPI         'A              < EST-CE LE LINE-FEED ????
         JE          E72             < OUI , RIEN A FAIRE ...
<
< CAS OU ON SIMULE UN LF EN BOUT DE PAGE :
<
         LAD         MESGO
         BSR         ASVC            < ECHO DU CARACTERE , AVANT DE
                                     < REVENIR HOME ......
E72:     EQU         $
         LAD         CHOME           < DANS LE CAS OU ON ETAIT DEJA EN
                                     < BAS DE PAGE , ON VA REPOSITIONNER
                                     < LE CURSEUR DANS LA POSITION HOME.
         JMP         E14             < ALLONS REINITIALISER LES COOR-
                                     < DONNEES DU CURSEUR.
         PAGE
<
<
<        R A N G E M E N T   D E S   C A R A C T E R E S  :
<
<
<        FONCTION : CETTE ROUTINE RANGE DANS LA MATRICE
<        REPRESENTANT LA PAGE COURANTE LES
<        CARACTERES QUI NE SONT PAS DES CARACTERES
<        DE CONTROLE DE L'EDITEUR . LES CARACTERES DE CODE
<        SUPERIEURS SUPERIEURS A '1F SONT RANGES DONC
<        A LA POSITION COURANTE DU CURSEUR.
<
STK:     EQU         $
         LR          Y,A
         MP          C37             < B=NUMERO DE LIGNE(Y)*37.
         LA          ADPAGE          < A=@PAGE ALPHA-NUMERIQUE.
         ADR         B,A             < A=@LIGNE COURANTE DE LA PAGE.
         SBT         0               < BIT D'INDEXATION.
         STA         APAGE           < GENERATION DU RELAI D'ACCES A
                                     < LA LIGNE COURANTE.
         LBY         MESG            < A=CARACTERE STANDARD DE
                                     < L'UTILISATEUR.
         TBT         9               < EST-CE UN CARACTERE COMPOSITE ???
         JNC         E30             < NON ,OK ....
         TBT         10              < EST-CE UN CARACTERE COMPOSITE ???
         JC          E29             < OUI , IL FAUT DONC TESTER LE X
                                     < DU CURSEUR.
E30:     EQU         $
         OR          SUP             < MISE EN PLACE DE L+ POSITION
                                     < HAUTE EVENTUELLEMENT.
         STZ         SUP             < RAZ DE L'INDICATEUR DE POSITION
                                     < HAUTE.
         STBY        &APAGE          < QUE L'ON RANGE DANS LA MATRICE
                                     < DANS LA POSITION (X,Y) SOIT
                                     < CELLE DU CURSEUR.
         BSR         ASAVEK          < EN VUE D'UN EVENTUEL REPEAT.
         JMP         IC1             < PUIS ENSUITE TOUT SE PASSE COMME
                                     < SI L'ON TRAITAIT UN CTRL-I .....
<
< CAS DES CARACTERES COMPOSITES :
< UNE ANOMALIE DU CTRL-H , ET LE FAIT
< QU'IL NE FASSE PAS REMONTER A LA LIGNE
< PRECEDENTE LORSQU'ON L'EXECUTE ALORS QU'ON
< EST EN DEBUT DE LIGNE , OBLIGE A INTERDIRE
< LES CARACTERES COMPOSITES DANS LA CASE
< 73 (DERNIER CARACTERE) DE CHAQUE LIGNE.
<
E29:     EQU         $
         XR          A,X
         CPI         NBCAR-1         < TEST DU X DU CURSEUR.
         XR          A,X
         JNE         E30             < ON N'EST PAS EN BOUT DE LIGNE ,
                                     < LE CARACTERE COMPOSITE EST DONC
                                     < ACCEPTABLE.
<
< CAS D'UN CARACTERE COMPOSITE EN BOUT DE LIGNE :
<
E280:    EQU         $               < ENTRY 'CTRL-H' ERRONNES.
         STZ         DOG             < SUPPRESSION DE L'EVENTUEL
                                     < REPEAT EN COURS.
         BSR         ABELL           < MESSAGE ERREUR A L'UTILISATEUR.
         JMP         E24             < BOUCLE DE L'EDITEUR SANS ECHO.
         PAGE
<
<
<        R E P E A T   C A R A C T E R E  :
<
<
<        FONCTION :
<                      CTRL-Z PERMET DE REPETER LE DERNIER
<                    CARACTERE STANDARD ENTRE DANS L'EDITEUR.
<                    LA REPETITION SE POURSUIT JUSQU'A CE QUE
<                    L'UTILISATEUR ENVOIE UN CTRL-X-OFF.
<                      CTRL-A PERMET LA REPETITION DU CARACTERE
<                    PRECEDENT UN NBRE DE FOIS EGAL A LA VALEUR
<                    REPRESENTEE PAR LE CARACTERE QUI SUIT LE CTRL-A
<                    (SOIT '1'=1,'2'=2,...'A'=10,'B'=11,...) MOINS 1 ,
<                    AINSI :
<                                    '*<CTRL-A>3'='***'.
<
<
ZC:      EQU         $               < ENTRY 'REPEAT A L'INFINI'.
         LAI         -1              < AFIN DE METTRE DOG<0.
         JMP         E400
AC:      EQU         $               < ENTRY 'REPEAT 'DOG' FOIS'.
                                     < A NOTER : AU PASSAGE DE 'LOOP' ,
                                     < ON FAIT -1 SUR DOG ....(OK).
         LAD         MESGI           < AFIN DE LIRE UN CARACTERE.
         BSR         ASVC            < LECTURE D'UN CARACTERE.
         LBY         MESG            < A=CARACTERE LU , DONT LE CODE
                                     < EST LE NBRE DE REPETITIONS
                                     < A FAIRE +1.
         ADRI        -'30,A          < CONVERSION BINAIRE.
         JALE        EERR            < VALIDATION.
         CPI         9               < DISCRMINATION CHIFFRES/LETTRES.
         JLE         E402            < C'EST UN CHIFFRE , OK.
         ADRI        -'41+'39+1,A    < CAS DES LETTRES.
E402:    EQU         $
E400:    EQU         $               < TRONC COMMUN A AC ET ZC.
         STA         DOG             < MISE EN PLACE DE DOG.
         LA          REPEAT          < A=CARACTERE A REPETER.
         STBY        MESG            < QUE L'ON MET DANS MESG COMME
                                     < SI ON L'AVAIT LU ....
         JMP         E24             < VERS LA BOUCLE DE EDIT SANS
                                     < ECHO EVIDEMMENT.
         PAGE
<
<
<        E R R E U R S   U T I L I S A T E U R  :
<
<
EERR:    EQU         $
         BSR         ABELL           < ENVOI D'UNE 'BELL' SUPPLEMENTAIRE
E24:     EQU         $
         LAI         0               < SUPPRESSION DE L'ECHO.
         BR          ALOOP           < RETOUR A LA BOUCLE DE L'EDITEUR.
<
<
<        E N V O I   D ' U N E   B E L L  :
<
<
<
<
<        RESULTAT :
<                    A=CONDITION DE RETOUR DU MSP ('13 SI CTRL-X-OFF).
BELL:    EQU         $
         LAD         MESGO
         IC          MESGO+1         < L'ADRESSE BUFFER DE MESG
                                     < PROGRESSS DE 1 POUR ACCEDER
                                     < A LA 'BELL'.
         BSR         ASVC            < ENVOI DE LA 'BELL'.
         DC          MESGO+1         < RETOUR SUR LE CARACTERE
                                     < DE L'UTILISATEUR.
         RSR
         PAGE
<
<
<        M O U V E M E N T   D E   C H A I N E S
<        D E   C A R A C T E R E S  :
<
<
<        PHILOSOPHIE :
<                      ON DISPOSE D'UNE CHAINE COURANTE DONT LE 1ER
<                    CARACTERE EST DESIGNE PAR CTRL-L , ET LE
<                    DERNIER PAR CTRL-SHIFT-L . ENSUITE LA COMMANDE
<                    CTRL-N PERMET DE DEPLACER CETTE CHAINE
<                    EN PRECISANT SA NOUVELLE ORIGINE . LES POSITIONS
<                    DES CARACTERES SONT TOUJOURS DONNEES PAR LA
<                    POSITION COURANTE DU CURSEUR . A NOTER QUE
<                    LES DEPLACEMENTS DE CHAINES PEUVENT ETRE
<                    EN RECOUVREMENT AVANT/ARRIERE.
<
<
<
<        T R A I T E M E N T   D E   C T R L - L  :
<
LC:      EQU         $
         LR          Y,A             < A=Y DU CURSEUR.
         MP          C74
         ADR         X,B             < B=RANG DU 1ER CARACTERE DE LA
                                     < CHAINE COURANTE.
         STB         PKC             < ET SAVE IT.
         JMP         E24             < GO BACK TO EDITOR LOOP ET CECI
                                     < SANS ECHO.
<
<        T R A I T E M E N T   D E   C T R L - S H I F T - L  :
<
LCS:     EQU         $
         LR          Y,A             < A=Y DU CURSEUR.
         MP          C74
         ADR         X,B             < B=RANG DU DERNIER CARACTERE DE
                                     < LA CHAINE COURANTE.
         STB         DKC             < ET SAVE IT.
         JMP         E24             < VERS LA BOUCLE DE L'EDITEUR
                                     < SANS ECHO.
<
<        T R A I T E M E N T   D E   C T R L - N  :
<
NC:      EQU         $
         LA          DKC
         SB          PKC             < A=LONGUEUR-1 DE LA CHIANE
                                     < COURANTE.
         JAGE        E25             < OK , LE 1ER CARACTERE PRECEDE
                                     < OU RECOUVRE LE DERNIER CARACTERE.
<
< CAS DES DEMANDES ERRONNEES :
<
         BSR         ABELL           < ENVOI D'1NE 'BELL' D'ERREUR.
         JMP         E24             < BOUCLE EDITEUR , SANS ECHO.
<
< CAS DES DEMANDES CORRECTES :
<
E25:     EQU         $
         PSR         X,Y             < SAVE COORDONNEE DU CURSEUR.
<        ON A ICI :
<                    A=LONGUEUR-1 DE LA CHAINE COURANTE ,
<                    (X,Y)=COORDONNEE DU CURSEUR.
         XR          A,Y             < Y=LONGUEUR-1 ; A=Y DU CURSEUR.
         MP          C74
         ADR         B,X             < X=RANG DE LA NOUVELLE ORIGINE
                                     < DE LA CHAINE COURANTE.
         LR          Y,B             < B=LONGUEUR-1.
         LY          PKC             < Y=RANG DU 1ER CARACTERE.
<        ON A ICI :
<                    B=LONGUEUR-1 DE LA CHAINE SOURCE ,
<                    X=RANG 1ER CARACTERE DE LA CHAINE DESTINATION ,
<                    Y=RANG 1ER CARACTERE DE LA CHAINE SOURCE.
<
< CHOIX DU SENS DE DEPLACEMENT :
<
         LAI         1               < SENS CROISSANT A PRIORI.
         CPR         X,Y             < TEST DE LA POSITION RELATIVE
                                     < DES CHAINES SOURCES ET DESTINA-
                                     < TION.
         JE          E27             < ELLES SONT CONFONDUES : RIEN
                                     < A FAIRE.
         JG          E26             < LA CHAINE DESTINATION EST AVANT
                                     < LA CHAINE SOURCE.
<
< CAS OU LA CHAINE DESTINATION EST APRES LA CHAINE SOURCE :
< DANS CE CAS , IL FAUT PROCEDER A L'ENVERS ,
< EN COMMENCANT PAR LE DERNIER CARACTERE.
<
         ADR         B,X             < X=RANG DERNIER CARACTERE DE LA
                                     < CHAINE DE DESTINATION.
         ADR         B,Y             < Y=RANG DERNIER CARACTERE
                                     < DE LA CHAINE SOURCE.
         LAI         -1              < ON SE DEPLACERA PAR VALEUR
                                     < DECROISSANTE D'INDEX.
E26:     EQU         $
         STA         IMOV            < SAVE INCREMENT/DECREMENT DES
                                     < INDEX X & Y (+1/-1).
         LA          ADPAGE
         SBT         0
         STA         APAGE           < GENERATION D'UN RELAI INDEXE
                                     < INDIRECT VERS LA PAGE COURANTE.
<
< BOUCLE DE MOUVEMENT :
<
E28:     EQU         $
         XR          X,Y             < X=INDEX SOURCE.
         LBY         &APAGE          < ACCES A LA CHAINE SOURCE.
         XR          X,Y             < X=INDEX DESTINATION.
         TBT         9
         JNC         E33             < CARACTERE STANDARD.
         TBT         10
         JNC         E33             < CARACTERE STANDARD.
<
< CAS DES CARACTERES COMPOSITES :
<
         PSR         A,B
         LAI         0
         LR          X,B             < INDEX COURANT DANS LA PAGE.
         DV          C74             < LE RESTE (B) DONNE L'INDEX
                                     < DU CARACTERE COMPOSITE DANS LA
                                     < LIGNE COURANTE.
         LR          B,A
         CPI         NBCAR-1         < EST-ON EN BOUT DE LIGNE ???
         PLR         A,B
         JNE         E33             < NON , OK LE CARACTERE COMPOSITE
                                     < EST DEPLACER COMME LES AUTRES.
<
< CAS D'UN CARACTERE COMPOSITE ARRIVANT EN
< BOUT DE LIGNE (73) , ON LE REMPLACE PAR '?' :
<
         LAI         '3F             < MISE DE '?' A LA PLACE.
E33:     EQU         $
         STBY        &APAGE          < RANGEMENT DE LA CHAINE DESTINATION.
         LA          IMOV            < ACCES A L'INCREMENT/DECREMENT.
         ADR         A,X             < X=X+-1.
         ADR         A,Y             < Y=Y+-1.
         LR          X,A
         CP          N3574           < TEST DE L'INDEX DE DESTINATION :
                                     < EVITER DE TOMBER HORS DE LA
                                     < PAGE PAR VALEUR SUPERIEURES.
         JGE         E27             < DEBORDEMENT : LES CARACTERES
                                     < SUIVANTS SONT IGNORES.
         ADRI        -1,B            < DECREMENTATION DE LA LONGUEUR.
         CPZR        B
         JGE         E28             < IL EN RESTE A DEPLACER.
<
< C'EST LA FIN :
<
E27:     EQU         $
         PLR         X,Y             < RESTAURE LES COORDONNEES
                                     < DU CURSEUR.
         JMP         E24             < RETOUR A LA BOUCLE D'EDITION
                                     < SANS ECHO EVIDEMMENT ......
         PAGE
<
<
<        I N I T I A L I S A T I O   D E   L A   P A G E  :
<
<
INIP:    EQU         $
         BSR         ASP1            < RAZ DE LA PAGE ALPHA.
<
< ERASE DE L'ECRAN DE LA VISU :
<
         LAD         ERASE
         BSR         ASVC            < ERASE.
         LAI         0               < ON NE DEMANDE EVIDEMMENT PAS
                                     < D'ECHO.
<
<        R E I N I T I A L I S A T I O N   D E S
<        C O O R D O N N E E S   D U   C U R S E U R  :
<
E14:     EQU         $
         LXI         0               < CORRDONNEE X DU CURSEUR=0 ,
         LYI         0               < CORRDONNEE Y DU CURSEUR=0.
         BR          ALOOP           < RETOUR A LA BOUCLE DE L'EDITEUR.
         PAGE
<
<
<        S O R T I E   D E   L ' E D I T E U R  :
<
<
FIN:     EQU         $
         LAD         CCI
         BSR         ASVC            < RETOUR AU CCI.
         LAD         CHOME           < ET RENVOI DU CURSEUR HOME.
         JMP         E14
         PAGE
<
<
<        E D I T I O N   D E   L A   P A G E   C O U R A N T E  :
<
<
EDIT:    EQU         $
         LAD         ERASE
         BSR         ASVC            < EFFACEMENT DE L'ECRAN.
         LYI         NBLIG           < Y=NBRE DE LIGNES A EDITER.
         LA          ADPAGE
         SBT         0
E12:     EQU         $
         STA         APAGE           < GENERATION DU RELAI D'ACCES
                                     < A LALIGNE COURANTE DANS LA
                                     < PAGE.
         SLLS        1               < A=@OCTET DE A LIGNE COURANTE.
         STA         LIGN+1          < MAJ DE LA DEMANDE A MSP.
         LXI         NBCAR-1         < NBRE DE CARACTERES MOINS 1
                                     < DANS LA LIGNE.
E57:     EQU         $
         LBY         &APAGE          < ON PARCOURS LA LIGNE A L'ENVERS
                                     < DE FACON A TROUVER LE 1ER
                                     < CARACTERE QUI NE SOIT PAS
                                     < UN 'SPACE'.
         CPI         '20             < EST-CE 'SPACE' ...???
         JNE         E58             < NON , ON ARRETE L'EXPLORATION
                                     < DE LA LIGNE A REBROUSSE POLI
                                     < AU 1ER CARACTERE NON BLANC.
         ADRI        -1,X            < DANS LE CAS DU 'SPACE' , ON
                                     < CONTINUE A REMONTER LA LIGNE.
         CPZR        X
         JGE         E57             < OK , IL Y A ENCORE DES
                                     < CARACTERES DANS LA LIGNE COURANTE
<
< CAS D'UNE LIGNE VIDE :
<
         JMP         E59             < ON NE VA QU'ENVOYER RC+LF.
<
< CAS D'UNE LIGNE NON VIDE :
<
E58:     EQU         $
<        ON A ICI :
<                    X=RANG DU 1ER CARACTERE NON BLANC.
         ADRI        1,X             < X=NBRE DE CARACTERES UTILES
                                     < SUR LA LIGNE COURANTE.
         STX         LIGN+2          < GENERATION DU COMPTE D'OCTETS
                                     < DANS LA DEMANDE A MSP ..
         STX         VAR             < AU CAS OU UNE EDITION PAR
                                     < CARACTERES SUIVRAIT ...
<
< CHOIX ENTRE L'EDITION HAUTE ET L'EDITION BASSE :
<
E63:     EQU         $
         ADRI        -1,X
         LBY         &APAGE
         TBT         8               < ON REGARDE SI LA LIGNE
                                     < CONTIENT AU MOINS UN CARACTERE
                                     < EN POSITION HAUTE ????
         JC          EDITK           < OUI , ON S'ARRETE SUR LUI , ET
                                     < ON VA EDITER LA LIGNE CARACTERE
                                     < PAR CARACTERE.
         CPZR        X
         JG          E63             < CARACTERE PRECEDENT.
<
< EDITION DE LA LIGNE :
<
         LAD         LIGN
         BSR         ASVC            < ECRITURE DE LA LIGNE.
         JGE         E22             < DANS LE CAS OU L'UTILISATEUR
                                     < ENVOIE UN CTRL-X-OFF , ON
                                     < ABANDONNE L'EDITION.
         LA          LIGN+2          < A=COMPTE D'OCTETS.
E64:     EQU         $
         CPI         NBCAR           < LA LIGNE ETAIT-ELLE PLEINE ????
         JE          E60             < OUI , RIEN A FAIRE.
<
< CAS D'UNE LIGNE INCOMPLETE , ON
< ENVOIE UN RC+LF POUR PASSER A LA LIGNE
< SUIVANTE :
<
E59:     EQU         $
         LAD         MRCLF           < A=@MOT DU MESSAGE RC+LF.
         SLLS        1
         STA         LIGN+1          < MISE EN PLACE DE L'ADRESSE OCTE
                                     < DU MESSAGE RC+LF.
         LAI         2
         STA         LIGN+2          < MISE EN PLACE DU COMPTE OCTETS.
         LAD         LIGN
         BSR         ASVC            < ENVOI DU RC+LF.
         JGE         E22             < ABANDON SI CTRL-X-OFF RECU.
<
< PASSAGE A LA LIGNE SUIVANTE :
<
E60:     EQU         $
         LA          APAGE
         ADRI        NBCAR/2,A       < @MOT DE LA LIGNE SUIVANTE.
         ADRI        -1,Y            < NBRE DE LIGNES RESTANTES.
         CPZR        Y
         JG          E12             < PASSAGE A LA SUIVANTE.
E22:     EQU         $
         LAD         CHOME           < POUR L'ENVOI HOME DU CURSEUR.
         JMP         E14             < ALLONS ENVOYER HOME LE CURSEUR
                                     < ALPHA-NUMERIQUE , ET RE-INITIA-
                                     < LISER SES COORDONNEES.
         PAGE
<
<
<        E D I T I O N   D E   L A   L I G N E   C O U R A N T E
<        P A R   C A R A C T E R E S  E N   T E N A N T
<        C O M P T E   D E   L A   P O S I T I O N   H A U T E  :
<
<
EDITK:   EQU         $
<
< INITIALISATION DE L'EDITION :
<
         PSR         Y
         STY         COORD           < FUTUR Y DU CURSEUR.
         LA          APAGE           < RECUPERATION DE L'ADRESSE MOT
                                     < DE LA LIGNE COURANTE DANS
                                     < LA PAGE.
         SLLS        1               < CONVERSION DE L'ADRESSE DE LA
                                     < PAGE EN UNE ADRESSE D'OCTETS.
         STA         LIGN+1
         LAI         1
         STA         LIGN+2          < ON VA EDITER LA PAGE CARACTERE
                                     < PAR CARACTERE !!!!!!
         LAI         " "
         STBY        MESG
         LXI         0               < INDEX DU 1ER CARACTERE.
<
< BOUCLE DE L'EDITION :
<
E19:     EQU         $
         LBY         &APAGE          < ACCES A 1 CARACTERE.
         TBT         8               < TEST DU BIT DE POSITION HAUTE.
         JC          E20             < LE CARACTERE DOIT ETRE EDITE
                                     < EN POSITION HAUTE.
<
< CAS D'UN CARACTERE SUR LA LIGNE :
<
         LAD         LIGN
         BSR         ASVC            < ENVOI DU CARACTERE.
                                     < UN CTRL-X-OFF A-T'IL ETE RECU
                                     < PENDANT L'EDITION DE LA PAGE ???
         JGE         E65             < OUI , ABANDON DE L'EDITION.
E21:     EQU         $
<
< PASSAGE AU CARACTERE SUIVANT :
<
         IC          LIGN+1          < PROGRESSION DE L'ADDRESSE
                                     < OCTET DU BUFFER.
         ADRI        1,X             < INDEX DU CARACTERE SUIVANT.
         LR          X,A
         CP          VAR             < A-T'ON ATTEINT LE DERNIER CARAC-
                                     < TERE SIGNIFICATIF DE LA LIGNE
                                     < COURANTE ????
         JL          E19             < NON , CONTINUONS ....
         PLR         Y
         JMP         E64             < OK , PASSAGE A LA LIGNE
                                     < SUIVANTE SANS OUBLIER L'EVENTUEL
                                     < RC+LF.
<
< ABANDON D'UNE EDITION SUITE A UN CTRL-X-OFF :
<
E65:     EQU         $
         PLR         Y
         JMP         E22             < VERS L'ABANDON DE L'EDITION DE
                                     < LA PAGE.
<
< CAS D'UN CARACTERE EN POSITION HAUTE :
<
E20:     EQU         $
         LR          A,Y             < SAVE LE CODE DU CARACTERE.
         ANDI        '7F             < RAZ DU BIT0 DU CARACTERE.
         STBY        &APAGE          < POUR PLAIRE AUX VISUS.
         STX         COORD+1         < FUTUR X DU CURSEUR.
         LAI         14              < UN CARACTERE OCCUPE 14 POINTS
                                     < EN LARGEUR.
         MP          COORD+1
         STB         COORD+1         < B=X GRAPHIQUE DU CURSEUR.
         LAI         22              < UN CARACTERE OCCUPE 22 POINTS
                                     < EN HAUTEUR.
         MP          COORD
         ADRI        10,B            < B=Y GRAPHIQUE DU CURSEUR ,
                                     < AUGMENTE DE 10 POUR PASSER EN
                                     < POSITION HAUTE.
         LA          COORD
         XR          A,B             < SAVE COORD DANS B.
         STA         COORD
<        ON A DONC ICI :
<                    COORD=Y GRAPHIQUE DU CURSEUR ,
<                    COORD+1=X GRAPHIQUE DU CURSEUR EN POSITION HAUTE.
         LAD         OG
         BSR         ASVC            < MISE EN GRAPHIQUE DE LA VISU.
         LAD         WG
         BSR         ASVC            < ENVOI DES COORDONNEES HAUTES
                                     < DU CURSEUR , POUR LE REPOSITIONNER
         LAD         CG
         BSR         ASVC            < RETOUR EN ALPHA-NUMERIQUE , LE
                                     < CURSEUR EST MAINTENANT EN
                                     < POSITION HAUTE.
         LAD         LIGN
         BSR         ASVC            < ECRITURE DU CARACTERE EN
                                     < POSITION HAUTE.
         LR          Y,A
         STBY        &APAGE          < RESTAURE LE CARACTERE DANS LA
                                     < PAGE COURANTE.
         LA          COORD
         ADRI        -10,A           < RESTAURATION DE LA POSITION
                                     < NORMALE DU CURSEUR AVANT
                                     < ECRITURE DU CARACTERE.
         STA         COORD
         LAD         OG
         BSR         ASVC            < RETOUR EN GRAPHIQUE.
         LAD         WG
         BSR         ASVC            < RESTAURE CURSEUR AVANT ECRITURE
                                     < DU CARACTERE.
         LAD         CG
         BSR         ASVC            < RETOUR EN ALPHANUMERIQUE.
         LAD         MESGO
         BSR         ASVC            < POUR REPOSITIONNEMENT CORRECT
                                     < DU CURSEUR DERRIERE LE CARACTERE.
         STB         COORD           < RESTAURE LE NUMERO DE LIGNE (+35)
         JMP         E21             < AU SUIVANT .....
         PAGE
<
<
<        T R A I T E M E N T   D E S   C A R A C T E R E S
<        E X T E N S I O N   C O M P O S I T E S  :
<
<
MCS:     EQU         $               < IL EXISTE.
         LAI         '62
         JMP         E17
QC:      EQU         $               < QUELQUE-SOIT.
         LAI         '63
         JMP         E17
NCS:     EQU         $               < FLECHE DROITE.
         LAI         '67
         JMP         E17
KCS:     EQU         $               < IL N'EXISTE PAS.
         LAI         '6A
         JMP         E17
YCD:     EQU         $               < SIGNE DIFFERENT.
         LAI         '6C
E17:     EQU         $
         STBY        MESG            < LE CARACTERE EXTENSION EST MIS
                                     < DANS MESG COMME SI L'UTILISATEUR
                                     < L'AVAIT ENVOYE.
         JMP         E18             < FAISONS COMME SI L'ON AVAIT
                                     < RECU CE CODE ETENDU DE
                                     < L'UTILISATEUR.
         PAGE
<
<
<        A P P E L   D E   C M S 4  :
<
<
<        ARGUMENT :
<                    A=@TABLE DES ARGUMENTS.
<
<
<        RESULTAT :
<                    A=CONDITIONS D'EXECUTION ET DE RETOUR.
<                      (EN PARTICULIER SI A='13 OU '93 , UN CTRL-X-OFF
<                      A ETE RECU PENDANT L'OPERATION).
<                    CARY=POSITIONNE EN FONCTION DE LA POSITION DE (A)
<                         PAR RAPPORT A '13 POUR TEST EN RETOUR.
<
ESVC:    EQU         $
         PSR         X               < SAVE COORDONNEE X DU CURSEUR.
         SVC         0               < APPEL DE MSP
         LR          X,A             < RENVOI DES CONDITIONS DANS A.
         PLR         X
         CPI         '13             < UN CTRL-X-OFF A-T'IL ETE RECU
                                     < PENDANT L'EXECUTION DU SVC.
         RSR
         PAGE
<
<
<        E D I T E U R   D E   P A G E  :
<
<
<        CONVENTIONS DE L'EDITEUR :
<                    1- MARGIN RIGHT EST SUPPRIME ,
<                    2- COORDONNEE DU CURSEUR :
<                        X=COORDONNEE X DU CURSEUR ,
<                        Y=COORDONNEE Y DU CURSEUR.
<
<
EDITP:   EQU         $
<
< INITIALISATION DE LA PILE DE L'EDITEUR :
<
         LAD         PILE
         LR          A,K
<
< MISE EN ADRESSE OCTET DES ADRESSES DE BUFFERS :
<
         LAD         POINTC
         SLLS        1
         STA         LG+1
         LAD         COORD
         SLLS        1
         STA         WG+1
         LAD         MESG
         SLLS        1
         STA         MESGI+1
         STA         MESGO+1
         LAD         MHOME
         SLLS        1
         STA         CHOME+1
         LA          ADPAGE
         SLLS        1
         STA         SPAGE+1
         LAD         BPUNCH
         SLLS        1
         STA         PUNCH+1
<
< INITIALISATION GRAPHIQUE :
<
         LA          ATAGR
         LR          A,W             < W=@TAGR.
<
< TEST DE LA NATURE DE L'ENTREE :
< (CHARGEMENT OU RESTART SUITE A 'ALT-MODE')
<
         LA          RESTAR
         JAE         E16             < C'EST UNE RE-RENTREE : A=0=UNE
                                     < COMMANDE INTERDITE ; ON NE VA
                                     < DONC PAS RAZER NI LA PAGE , NI
                                     < LA TABLE DES SEGMENTS.
         IC          RESTAR          < APRES LE CHARGEMENT ON FAIT :
                                     < RESTAR=0.
<
< ENTREE SUITE AU CHARGEMENT :
<
         BSR         ACTAGR          < CLEAR TABLE DES SEGMENTS.
         LAI         '12             < ON COMMENCE , PAR UN FAUX CTRL-R ,
                                     < QUI PERMET UNE INITIALISATION
                                     < DE LA PAGE ET DE L'ECRAN.
         JMP         E16             < ALLONS EXECUTER LE 'RAZ' ...
<
<        B O U C L E   D E   L ' E D I T E U R  :
<
E10:     EQU         $
         CPZ         DOG             < Y-AT'IL UN REPEAT EN COURS ???
         JNE         E31             < OUI , CAR DOG#0.
                                     < REPEAT EN COURS , ON NE VA DONC
                                     < PAS LIRE UN CARACTERE UTILISATEUR
                                     < MAIS FAIRE COMME SI ON AVAIT
                                     < RECU LE CARACTERE STANDARD
                                     < COURANT.
         LAD         MESGI
         BSR         ASVC            < ENTREE D'UN CARACTERE UTILISATEUR.
E31:     EQU         $
E34:     EQU         $
         LBY         MESG            < ACCES AU CARACTERE ENVOYE PAR
                                     < L'UTILISATEUR.
         CPI         '20
         JL          E16             < C'EST UN CARACTERE DE CONTROLE
                                     < DE L'EDITEUR , SA VALEUR EST
                                     < L'INDEX D'ACCES A LA TABLE DE
                                     < COMMANDE DE L'EDITEUR.
E18:     EQU         $
         LAI         '20             < CAS DES CARACTERES STANDARDS.
E16:     EQU         $
         XR          A,X             < SAVE COORDONNEE X DU CURSEUR DANS
                                     < LE REGISTRE A.
         LB          &AFEDIT         < B=@ROUTINE SPECIFIQUE(X).
         XR          A,X             < RESTAURE X=COORDONNEE X DU
                                     < CURSEUR.
         PSR         B               < EMPILEMENT DE L'ADRESSE DE LA ROU-
                                     < TINE SPECIFIQUE EN VUE DU RSR.
         RSR                         < EXECUTION DE LA FONCTION.
<
<        R E T O U R   D E   L A   B O U C L E  :
<
LOOP:    EQU         $
         CPZ         DOG             < Y-A-T'IL UN REPEAT 'DOG'
                                     < FOIS EN COURS ???
         JLE         E401            < NON.
<
< CAS D'UN REPEAT 'DOG' FOIS :
<
         DC          DOG             < DECOMPTE DES REPEAT RESTANT
                                     < A FAIRE.
E401:    EQU         $
         JAE         E10             < SI A=0 , BOUCLE IMMEDIATE.
         LR          A,B             < SAVE @TABLE DES ARGUMENTS
                                     < A MSP DANS B.
         BSR         ASVC            < SINON , ENVOI DE L'ECHO OU
                                     < DE LA POSITION 'HOME'.
<
< TEST DE FIN DE REPEAT :
<
                                     < L'UTILISATEUR A-T'IL ENVOYE
                                     < UN CTRL-X-OFF ?????
         JL          E10             < NON , BOUCLE DE L'EDITEUR.
         JE          E32             < OUI PENDANT L'ECHO.
<
< CAS D'UN CTRL-X-OFF : ON ABORTE LE REPEAT EN COURS :
< (MEME S'IL N'Y EN A PAS .... AUCUNE IMPORTANCE....)
<
         LR          B,A             < RESTAURE A=@TABLE ARGUMENTS A MSP
         BSR         ASVC            < ENVOI DE L'ECHO DU DERNIER
                                     < CARACTERE DANS LE CAS OU LE CTRL-
                                     < X-OFF ETAIT APPARU HORS-ECHANGE.
E32:     EQU         $
         STZ         DOG             < RAZ DU REPEAT EN COURS.
         JMP         E10             < BOUCLE DE L'EDITEUR.
         PAGE
<
<
<        S A U V E G A R D E   D ' U N E   P A G E
<        A L P H A - N U M E R I Q U E   E T
<        G R A P H I Q U E   S U R   D I S Q U E  :
<
<
<        PHILOSOPHIE PROVISOIRE :
<                      LORSQU'ON VEUT REALISER UNE OPERATION AVEC
<                    LE DISQUE DE MANIERE SYMBOLIQUE , PAR
<                    L'2NTERMEDIAIRE DE L'ARBRE DU SYSTEME ,
<                    ON MET EN TETE DE LA PAGE ALPHA-NUMERIQUE UN
<                    <NOM> SUIVIT DE <EON> ('EOT') , ET ENSUITE
<                    ON TAPE LA COMMANDE :
<                                    CTRL-U : LOAD-VALUE(:SYS<NOM>) ,
<                                    CTRL-T : LOAD-VALUE(<ACNESC><NOM>),
<                                    CTRL-W : STORE-VALUE(<ACNESC><NOM>)
<                                    CTRL-X : DELET-VALUE(<ACNESC><NOM>)
<                                    CTRL-D : <EON>.
<
<
SYSPAG:  EQU         $               < LOAD-VALUE SOUS :SYS : CTRL-U.
         LAI         6               < NVP D'ACCES AU NSP 'LOAD-VALUE'
                                     < SOUS :SYS.
         JMP         E90
TPAGE:   EQU         $               < LOAD VALEUR : CTRL-T.
         LAI         5               < NVP 'LOAD VALUE'.
         JMP         E90
WPAGE:   EQU         $               < STORE VALUE : CTRL-W.
         LAI         4               < NVP DE 'STORE VALUE'.
         JMP         E90
DPAGE:   EQU         $               < DELETE PAGE : CTRL-X.
         LAI         3               < NVP DE 'DELETE VALUE'.
<
< REALISATION DE L'OPERATION DEMANDEE :
<
E90:     EQU         $
         STBY        SPAGE           < MISE EN PLACE DU NVP DE LA
                                     < FONCTION DEMANDEE DANS 'SPAGE'.
         LAD         SPAGE
         BSR         ASVC            < REALISATION.
         JAE         E91             < OK , FONCTION REALISEE.
<
< CAS D'ERREUR :
<
         BSR         ABELL           < ENVOI D'UNE BELL D'ERREUR.
         JMP         E10             < BOUCLE DE L'EDITEUR.
<
< OK , RENVOI HOME DU CURSEUR :
<
E91:     EQU         $
         LAD         CHOME
         BSR         ASVC            < ENVOI EN 'HOME' DU CURSEUR
         BSR         ABELL           < AVERTISSEMENT UTILISATEUR
                                     < DE LA FIN DU TRAVAIL DEMANDE.
         LXI         0               < REINITIALISATION DES COORDONNEES
         LYI         0               < DU CURSEUR ALPHA-NUMERIQUE.
         JMP         E10             < BOUCLE DE L'EDITEUR.
         PAGE
<
<
<        E D I T I O N   D U   C A T A L O G U E
<        D E S   N U M E R O S   D E   C O M P T E  :
<
<
<        FONCTION :
<                      CTRL-B EST UNE COMMANDE RESERVEE A :SYS ,
<                    ELLE DONNE ACCES AU CATALOGUE DES ACN
<                    DANS LA PAGE COURANTE.
<
<
CACN:    EQU         $
         LAI         'A              < FONCTION RESERVEE A :SYS.
         JMP         E99             < VERS LA MAJ DE SCATAL.
<
<
<        E D I T I O N   D U   C A T A L O G U E
<        D E S   N O M S   D E   L ' U T I L I S A T E U R  :
<
<
<        FONCTION :
<                      CE MODULE APPELE PAR CTRL-C , PERMET
<                    LA MISE DANS LA PAGE DU CATALOGUE DES NOMS
<                    DE L'UTILISATEUR . A NOTER QUE CE CATALOGUE
<                    PEUT ENSUITE ETRE LUI-MEME SAUVEGARDE
<                    SOUS UN NOM , PUISQU'IL EST DANS UNE
<                    PAGE ....
<
<
CATAL:   EQU         $
         LAI         2               < FONCTION DESTINEE A HDLSAV.
E99:     EQU         $
         STA         SCATAL          < MAJ DE SCATAL AVEC LA FONCTION
                                     < DEMANDEE.
         BSR         ASP1            < RAZ DE LA PAGE.
<        ON A ICI :
<                    X=0 (INDEX NOM) ,
<                    APAGE=RELAI VERS LE 1ER NOM.
         LAI         4               < CARACTERE <EON>.
         STBY        &APAGE          < INITIALISATION DU CATALOGUE PAR
                                     < UN <EON> (MIS A BLANC A LA FIN).
         LYI         0               < NUMERO DU NOM COURANT.
<
< BOUCLE DE RECUPERATION DES NOMS :
<
E93:     EQU         $
         LAI         9               < NVP DE NEXT-SERIE.
         BSR         ASP2            < RECHERCHE DU SUIVANT EN SERIE.
         JANE        E94             < LE NXS N'EXISTE PAS.
<
< CAS OU IL Y A UN SUIVANT SERIE :
<
         ADRI        1,X             < ACCES A CE CARACTERE SUIVANT
                                     < EN SERIE.
         LBY         &APAGE
         CPI         4               < EST-CE <EON> ????
         JNE         E93             < NON.
<
< CAS DE LA RENCONTRE D'UNE FIN DE NOM <EON> :
<
<
< CAS D'UN <EON> OU D'UN NXS N'EXISTANT PAS :
<
E94:     EQU         $
         PSR         X               < SAVE INDEX CARACTERE.
<
< BOUCLE DE DUPLICATION DU NOM COURANT :
<
E95:     EQU         $
         LBY         &APAGE          < RECUPERATION DU NOM COURANT
                                     < PAR CARACTERE.
         ADRI        NBCAR,X         < PASSAGE AU NOM SUIVANT . <<<<<<<
         STBY        &APAGE          < COPIE.
         ADRI        -NBCAR-1,X      < RETOUR SUR LE NOM COURANT<<<<<<<
         CPZR        X
         JGE         E95             < AU SUIVANT.
<
< FIN DE DUPLICATION DU NOM COURANT :
<
         PLR         X               < RESTAURE L'INDEX CARACTERE.
         LAI         '20
         STBY        &APAGE          < ON REMPLACE <EON> PAR UN
                                     < BLANC , QUESTION DE MISE EN
                                     < PAGE (<EON> N'APPARAISSANT PAS).
         ADRI        1,Y             < Y=NUMERO DU NOM SUIVANT.
         LR          Y,A
         CPI         NBLIG-1         < VALIDATION NUMERO DE NOM <<<<<<<
         JGE         E96             < LA PAGE EST SATUREE , ABANDON !!!!
<
< CAS OU IL Y A ENCORE DE LA PLACE DANS LA PAGE D
<
         LA          APAGE           < RELAI VERS LE NOM PRECEDENT.
         ADRI        NBCAR/2,A       < RELAI VERS LE NOUVEAU NOM<<<<<<<
         STA         APAGE           < MAJ RELAI NOM.
<
< RECUPERATION DES SUIVANTS PARALLELES :
<
E98:     EQU         $
         LAI         8               < NVP DE NEXT-PARALLELE.
         BSR         ASP2            < TENTATIVE DE RECUPERATION NSP.
         JANE        E97             < LE NXP N'EXISTE PAS.
<
< CAS OU LE NXP EXISTE :
<
         ADRI        1,X
         LBY         &APAGE          < RECUPERATION DU CARACTERE NXP.
         ADRI        -1,X
         STBY        &APAGE          < CE CARACTERE NXP DEVIENT LE
                                     < DERNIER CARACTERE DU NOM.
         ADRI        1,X
         LAI         '20
         STBY        &APAGE          < LE NXP RECUPERE EST MIS A BLANC.
         ADRI        -1,X            < RETOUR SUR LE DERNIER CARACTERE
                                     < DU NOM.
         JMP         E93             < ALLONS FAIRE UNE TENTATIVE SERIE.
<
< CAS OU IL N'Y A PAS DE NXP :
<
E97:     EQU         $
         LAI         '20
         STBY        &APAGE          < RECUL DANS LE MOT COURANT.
         ADRI        -1,X
         CPZR        X               < LE CATALOGUE ARBORESCENT A-T'
                                     < IL ETE ENTIEREMENT EXPLORE ????
         JGE         E98             < NON , TENTATIVE PARALLELE.
<
< FIN D'EXPLORATION DU CATALOGUE , OU
< PAGE PLEINE (SATURATION) :
<
E96:     EQU         $
<        ON A ICI :
<                    A='BLANC'.
         STBY        &ADPAGE         < LE 1ER CARACTERE DE LA PAGE
                                     < EST REMIS A BLANC (IL CONTENAIT
                                     < UN <EON>).
         JMP         E91             < VERS L'ENVOI HOME DU CURSEUR.
         PAGE
<
<
<        R A Z   D E   L A   P A G E   A L P H A  :
<
<
<        RESULTATS :
<                    APAGE=RELAI INDEX VERS LA PAGE ,
<                    X=0.
<
<
SP1:     EQU         $
         LA          ADPAGE          < A=@DE LA PAGE.
         SBT         0               < GENERATION DU RELAI INDEXE.
         STA         APAGE           < MISE EN PLACE DU RELAI.
         LAI         '20
         SWBR        A,A
         ORI         '20             < A='BLANC-BLANC'.
         LX          NMPP            < RANG DU DERNIER MOT DE LA PAGE.
E92:     EQU         $
         STA         &APAGE          < MISE A BLANC DE LA PAGE PAR MOTS.
         JDX         E92             < SUIVANT ....
         STA         &APAGE          < MISE A BLANC DU 1ER MOT.
         RSR
<
<
<        M A J   D E   S C A T A L   E T   E N V O I
<        D E   L A   D E M A N D E   A   M S P  :
<
<
<        ARGUMENT :
<                    A=NVP DEMANDE ,
<                    X=INDEX LIGNE COURANT.
<
<
<        RESULTAT :
<                    A=CONDITION DE RETOUR DE MSP.
<
<
SP2:     EQU         $
         STBY        SCATAL          < MISE EN PLACE DU NVP DANS
                                     < LE BLOC DE DEMANDE SCATAL.
         LA          APAGE           < A=@MOT DU NOM COURANT.
         SLLS        1
         STA         SCATAL+1        < MISE EN PLACE DE L'@OCTET
                                     < DU NOM COURANT.
         LR          X,A
         ADRI        1,A             < A=LONGUEUR DU NOM COURANT.
         STA         SCATAL+2        < MISE EN PLACE DU COMPTE OCTETS
                                     < DE SCATAL.
         LAD         SCATAL          < AVEC LUI C'EST QUAND MEME MIEUX !
         BSR         ASVC            < ENVOI DE LA DEMANDE A MSP.
         JAE         E100            < OK.
         CPI         5               < EST-CE LE CODE-ERREUR 'NXP/NXS'
                                     < INEXISTANT ????
         JE          E100            < C'EST 'NXS/NXP' INEXISTANT ,
                                     < RETOUR OK.
<
< AUTRE CODE-ERREUR : C'EST SUREMENT FONCTION INTERDITE :
< ABORT LA COMMANDE ET ENVOI D'UNE BELL :
<
         ADRI        -1,K            < ON SAUTE LE RSR.
         BSR         ABELL           < ERREUR.
         LAI         '20             < 'BLANC' A METTRE EN TETE DE PAGE.
         JMP         E96             < RETOUR EN ABORT.
E100:    EQU         $
         RSR                         < RETOUR OK.
         PAGE
<
<
<        T R A N S L A T I O N   D ' U N   P O I N T  :
<
<
<        FONCTION :
<                      CETTE ROUTINE TRANSLATE LES COORDONNEES DU
<                    POINT COURANT DE VARY,VARX.
<
<
<        ARGUMENTS :
<                    SEGC+0=YM ,
<                    SEGC+1=XM . (POINT COURANT).
<
<
<        RESULTATS :
<                    A=Y(M+DM) ,
<                    B=X(M+DM).
<
<
TRANS:   EQU         $
         LA          SEGC+1          < XM.
         AD          VARX
         LR          A,B             < B=X(M+DM).
         LA          SEGC+0          < YM.
         AD          VARY            < A=Y(M+DM).
         RSR
         PAGE
<
<
<        H O M O T H E T I E   D ' U N   P O I N T  :
<
<
<
<        ARGUMENTS :
<                    SEGC+0=YM (POINT A TRAITER) ,
<                    SEGC+1=XM ,
<                    POINTC+1=Y(CENTRE D'HOMOTHETIE) ,
<                    POINTC+2=X(CENTRE D'HOMOTHETIE).
<
<
<        RESULTAT :
<                    A=Y(M+DM) ,
<                    B=X(M+DM).
<
<
HOMOT:   EQU         $
         LA          SEGC+1          < XM.
         SB          POINTC+2        < X(CENTRE).
         MP          KNUMER
         BSR         ADIV            < DIVISION PAR KDENOM.
         AD          POINTC+2        < X(M+DM)=XC+K*(XM-XC).
         STA         VAR             < SAVE X(M+DM).
         LA          SEGC+0          < YM.
         SB          POINTC+1        < Y(CENTRE).
         MP          KNUMER
         BSR         ADIV
         AD          POINTC+1        < A=Y(M+DM)=YC+K*(YM-YC).
         LB          VAR             < B=X(M+DM).
         RSR
         PAGE
<
<
<        R O T A T I O N   D ' U N   P O I N T  :
<
<
<        FONCTION :
<                      CETTE ROUTINE FAIT TOURNER LE
<                    POINT (SEGC+0,SEGC+1) AUTOUR DU
<                    CENTRE DU CERCLE COURANT , SUIVANT
<                    LE RAYON DEFINI PAR UNE COMMANDE
<                    'R'/'L' PRECEDENTE ....
<        ON MONTRE EN FAISANT SUBIR UNE ROTATION A UN
<        VECTEUR DANS LE PLAN COMPLEXE QUE :
<        (XC ET YC DESIGNANT LES COORDONNEES DU CENTRE)
<                    X(M+DM)=XC*DIF/R+YC*SIN/R+XM*COS/R-YM*SIN/R ,
<                    Y(M+DM)=YC*DIF/R-XC*SIN/R+YM*COS/R+XM*SIN/R.
<          AVEC DE PLUS :
<                    COS(DTETA)=60/61 ,
<                    SIN(DTETA)=11/61 ,
<                    (RAPPORTS DE NBRES ENTIERS ...)
<
<
<
<        ARGUMENT :
<                    SEGC+0=YM ,
<                    SEGC+1=XM.
<
<
<        RESULTAT :
<                    A=Y(M+DM) ,
<                    B=X(M+DM).
<
<
ROTAT:   EQU         $
         LA          SEGC+0          < YM.
         MP          SIN             < YM*SIN.
         BSR         ADIV            < YM*SIN/R.
         NGR         A,Y             < Y=-YM*SIN/R.
         LA          SEGC+1          < XM.
         MP          COS             < XM*COS.
         BSR         ADIV            < XM*COS/R.
         AD          XK              < XK+XM*COS/R.
         ADR         Y,A
         AD          VARX            < TRANSLATION EVENTUELLE DE X.
         STA         VAR             < VAR=X(M+DM).
         LA          SEGC+1          < XM.
         MP          SIN             < XM*SIN.
         BSR         ADIV            < XM*SIN/R.
         LR          A,Y             < Y=XM*SIN/R.
         LA          SEGC+0          < YM.
         MP          COS             < YM*COS.
         BSR         ADIV            < YM*COS/R.
         ADR         Y,A
         AD          YK              < A=Y(M+DM).
         AD          VARY            < TRANSLATION EVENTUELLE DE Y.
         LB          VAR             < B=X(M+DM).
         RSR
         PAGE
<
<
<        T E S T   D ' O V E R S C R E E N  :
<
<
<        FONCTION :
<                      CETTE ROUTINE INDIQUE SI LE POINT
<                    ARGUMENT EST OU N'EST PAS AFFICHABLE
<                    SUR L'ECRAN.
<
<
<        ARGUMENT :
<                    A=YM ,
<                    B=XM.
<
<
<        RESULTAT :
<                    A=-1 , SI OVERSCREEN ,
<                    A>=0 SI OK.
<
<
TSE:     EQU         $
         JAL         E200            < OVERSCREEN.
         CP          C1024
         JGE         E200            < OVERSCREEN.
         LR          B,A             < TEST DE XM.
         JAL         E200            < OVERSCREEN.
         CP          C1024
         JL          E201            < OK.
<
< RETOUR EN ERREUR :
<
E200:    EQU         $
         LAI         -1              < RENVOI DE A NEGATIF SI OVERSCREEN.
E201:    EQU         $
         RSR
         PAGE
<
<
<        H O M O T H E T I E   D E   L A
<        T A B L E   D E S   S E G M E N T S  :
<
<
<        CENTRE D'HOMOTHETIE : C'EST LE POINT
<                    (POINTC+1,POINTC+2) OBTENU
<                    LORS DE LA COMMANDE 'H'.
<
<
FH:      EQU         $
         LA          AHOMOT          < A=@ROUTINE D'HOMOTETHIE 1 POINT.
         STA         ASP
         JMP         E210            < VERS LE TRONC COMMUN DES
                                     < OPERATIONS GEOMETRIQUES.
         PAGE
<
<
<        T R A N S L A T I O N   D E   L A
<        T A B L E   D E S   S E G M E N T S  :
<
<
FV:      EQU         $
         LA          ATRANS          < A=@ROUTINE DE TRANSLATION
                                     < D'UN POINT.
         JMP         E208            < VERS LE TRONC COMMUN DE LA
                                     < ROTATION ET DE LA TRANSLATION.
         PAGE
<
<
<        R O T A T I O N   D E   L A   T A B L E   D E S   S E G M E N T S  :
<
<
FQ:      EQU         $
         LA          AROTAT          < A=@ROUTINE DE ROTATION 1 POINT.
         JMP         E208            < VERS LA TRANSFORMATION.
         PAGE
<
<
<        O P E R A T I O N S   G E O M E T R I Q U E S
<        S U R   L A   T A B L E   D E S   S E G M E N T S  :
<                    T R A N S L A T I O N  ,
<                    R O T A T I O N   ( & T R A N S L A T I O N )  ,
<                    H O M O T H E T I E  ,
<                    S Y M E T R I E   P O N C T U E L L E  ,
<
<
<        FONCTION :
<                    ON PEUT FAIRE SUR LA TABLE DES SEGMENTS DES
<                    TRANSFORMATIONS GEOMETRIQUES :
<                    1- TRANSLATION DE VECTEUR 'O'-->'V' ,
<                    2- ROTATION DE CENTRE 'O' AVEC TRANSLATION
<                       DE VECTEUR 'O'-->'Q' ,
<                    3- HOMOTHETIE DE CENTRE 'H' , ET DE
<                       RAPPORT 'I' , 'U' , OU 'P'.
<                    CE SONT LES COMMANDES 'Q' , 'V' ET 'H' QUI
<                    FONT LA TRANSFORMATION ; DE PLUS UNE TRANSFORMATION
<                    PEUT SE FAIRE EN MODE RECOUVREMENT DE L'OBJET
<                    PAR L'IMAGE ('N') OU EN MODE SUPERPOSITION
<                    DE L'OBJET DE DE L'IMAGE ('M').
<
<
<
< TRONC COMMUN ROTATION/TRANSLATION DE
< LA TABLE DES SEGMENTS :
<
E208:    EQU         $
         STA         ASP             < MISE EN PLACE DE L'@ROUTINE
                                     < DE ROTATION/TRANSLATION.
<
< CALCUL DE LA CONSTANTE DE TRANSLATION :
<
         LA          POINTC+1        < Y DE LA COMMANDE COURANTE.
         SB          YC              < Y DU CENTRE DE ROTATION.
         STA         VARY            < VARY=Y(COMMANDE COURANTE)-YC.
         LA          POINTC+2        < X DE LA COMMANDE COURANTE.
         SB          XC              < X DU CENTRE DE ROTATION.
         STA         VARX            < VARX=X(COMMANDE COURANTE)-XC.
<
< TRONC COMMUN ROTATION/TRANSLATION/HOMOTHETIE :
<
E210:    EQU         $               < ENTRY POUR L'HOMOTHETIE.
<
< MARQUAGE DES SEGMENTS OBJETS :
<
         LR          W,C             < C=@TAGR.
         LX          ALTAGR          < X=LONGUEUR TAGR.
E214:    EQU         $
         LA          0,C             < ACCES SEGMENT COURANT.
         JAL         E215            < IL EST LIBRE , RIEN A FAIRE.
         SBT         1               < MEMORISONS QUE C'EST UN SEGMENT
                                     < OBJET PAR SON BIT1.
         STA         0,C             < MAJ DE TAGR.
E215:    EQU         $
         ADRI        4,C
         JDX         E214            < AU SUIVANT.
         LR          W,C             < C=@TABLE DES SEGMENTS.
         LX          ALTAGR          < X=LONGUEUR TAGR.
<
< BOUCLE DE TRANSFORMATION GEOMETRIQUE DES POINTS :
<
E202:    EQU         $
         LA          0,C
         JAL         E203            < LE SEGMENT COURANT EST LIBRE ,
                                     < DONC PAS DE TRANSFORMATION.
<
< TEST SUR LA NATURE IMAGE/OBJET DU SEGMENT COURANT :
<
         TBT         1               < EST-CE UN OBJET (BIT1=1).
         RBT         1               < REGENERATION DE TAGR.
         STA         0,C
         JNC         E203            < C'EST UN SEGMENT IMAGE , IL N'EST
                                     < DONC PAS CONCERNE PAS LA TRANS-
                                     < FORMATION GEOMETRIQUE.
<
< TRANSFORMATION D'UN SEGMENT OBJET :
<
         STA         SEGC+0          < YM (POINT COURANT).
         LA          1,C
         STA         SEGC+1          < XM (POINT COURANT).
         BSR         ASP             < TRANSFORMATION DE L'ORIGINE DU
                                     < SEGMENT COURANT.
         STA         SEGV+0          < Y(M+DM)
         STB         SEGV+1          < X(M+DM).
         BSR         ATSE            < TEST D'OVERSCREEN DU POINT
                                     < COURANT APRES ROTATION.
         JAGE        E204            < OK.
<
< CAS DE L'OVERSCREEN :
<
E205:    EQU         $
         CPZ         MEMO            < TEST DU MODE 'M'/'N'.
         JGE         E203            < MODE 'M' , L'OVERSCREEN EST
                                     < ALORS IGNORE.
         STA         0,C             < LORSQU'IL Y A OVERSCREEN SUR
                                     < L'UN DES POINTS D'UN SEGMENT ,
                                     < ON DESOCCUPE CE SEGMENT ; A
                                     < NOTER QU'ICI : A=-1.
         JMP         E203            < VERS LE SEGMENT SUOVANT.
<
< PASSAGE A L'EXTREMITE DU SEGMENT COURANT :
<
E204:    EQU         $
         LA          2,C
         STA         SEGC+0          < YM (POINT COURANT).
         LA          3,C
         STA         SEGC+1          < XM (POINT COURANT).
         BSR         ASP             < TRANSFORMATION DE L'EXTREMITE DU
                                     < SEGMENT COURANT.
<
< GENERATION DE SEGC :
<
         STA         SEGC+2          < Y2(M+DM).
         STB         SEGC+3          < X2(M+DM).
         BSR         ATSE            < TEST D'OVERSCREEN DE L'EXTRE-
                                     < MITE DU SEGMENT COURANT.
         JAL         E205            < OVERSCREEN.
         LA          SEGV+0
         STA         SEGC+0          < Y1(M+DM).
         LA          SEGV+1
         STA         SEGC+1          < X1(M+DM).
<
< RANGEMENT DU SEGMENT IMAGE :
<        1- SI MODE 'M' : ON L'INSERE DANS UN SEGMENT LIBRE DE TAGR ,
<        2- SI MODE 'N' : ON L'INSERE A LA PLACE DE L'OBJET DONT
<           IL EST L'IMAGE.
<
         PSR         X,C
         LA          MEMO            < TEST DU MODE 'M'/'N'.
         TBT         0
         LR          C,B             < A PRIORI B=@SEGMENT OBJET.
         JC          E222            < CAS DU MODE 'N' , L'IMAGE VA
                                     < RECOUVRIR L'OBJET.
<
< CAS DU MODE 'M' :
<
         LR          W,C             < C=@TAGR.
         LX          ALTAGR          < X=LONGUEUR TAGR.
         LBI         0               < INITIALISATION DE B=0 : PAS
                                     < DE SEGMENTS LIBRES DANS TAGR
                                     < A PRIORI.
<
< PARCOURS DE TAGR , POUR TESTER SI L'IMAGE 'SEGC'
< N'EST PAS DEJA DANS TAGR :
<
E211:    EQU         $
         LA          0,C
         JAGE        E220            < CE SEGMENT EST OCCUPE.
         LR          C,B             < LORSQU'ON RENCONTRE UN SEGMENT
                                     < LIBRE , ON LE MEMORISE EN VUE
                                     < D'Y METTRE PEUT-ETRE LE SEGMENT
                                     < IMAGE (ULTERIEUREMENT).
         JMP         E212            < AU SUIVANT.
E220:    EQU         $
         RBT         1               < RAZ DE L'INDICATEUR OBJET/IMAGE.
         CP          SEGC+0
         JNE         E212            < IMAGE#SEGMENT.
         LA          1,C
         CP          SEGC+1
         JNE         E212            < IMAGE#SEGMENT.
         LA          2,C
         CP          SEGC+2
         JNE         E212            < IMAGE#SEGMENT.
         LA          3,C
         CP          SEGC+3
         JE          E216            < L'IMAGE EST DEJA DANS TAGR ,
                                     < IL EST DONC INUTILE DE L'Y
                                     < REMETTRE.
E212:    EQU         $
         ADRI        4,C
         JDX         E211            < AU SUIVANT.
<
< CAS OU L'IMAGE N'EST PAS ENCORE DANS TAGR :
<
         CPZR        B               < A-T'ON TROUVE UN SEGMENT LIBRE D
                                     < DANS LA TABLE TAGR.
         JE          E217            < TAGR EST PLEINE , ABORT.
<
< INSERTION DE SEGC DANS TAGR , EN RECOUVREMENT
< DE L'OBJET (CAS 'N') , OU DANS UN
< SEGMENT LIBRE (CAS 'M') :
<
E222:    EQU         $
         LAD         SEGC            < A=@EMETTEUR (IMAGE).
                                     < B=@RECEPTEUR.
         LXI         4               < 4 MOTS A DEPLACER.
         MOVE                        < INSERTION DE L'IMAGE DANS TAGR.
E216:    EQU         $
         PLR         X,C
<
< PASSAGE AU SEGMENT SUIVANT :
<
E203:    EQU         $
         ADRI        4,C             < PROGRESSION DANS TAGR.
         JDX         E202
         JMP         E42             < OK , GO BACK TO THE EDITOR LOOP.
<
< SORTIE EN COURS DE TRANSFORMATION :
<
E217:    EQU         $
         LX          ALTAGR          < X=LONGUEUR DE TAGR.
         LR          W,C             < C=@TAGR.
E219:    EQU         $
         LA          0,C
         JAL         E221            < LIBRE , RIEN A FAIRE.
         RBT         1               < REMISE A PRIORI EN MODE OBJET DE
                                     < TOUS LES SEGMENTS DE TAGR.
         STA         0,C
E221:    EQU         $
         ADRI        4,C
         JDX         E219            < AU SUIVANT.
         PLR         X,C
         BR          AE40            < VERS LA 'BELL'.
         PAGE
<
<
<        R A P P O R T   D ' H O M O T H E T I E  :
<
<
<        FONCTION :
<                      ON A ICI 3 ENTRY :
<                    FP : RAPPORT=-1 (HOMOTHETIE=SYMETRIE PONCTUELLE).
<                    FI : RAPPORT=COS/R (<1) ,
<                    FU : RAPPORT=R/COS (>1).
<
<
FI:      EQU         $               < 'I' POUR INF....
         LB          COS             < NUMERATEUR.
         LA          R               < DENOMINATEUR.
         JMP         E209
FU:      EQU         $               < 'U' POUR UP... (SUP..).
         LB          R               < NUMERATEUR.
         LA          COS             < DENOMINATEUR.
E209:    EQU         $
         STB         KNUMER          < NUMERATEUR DU RAPPORT.
         STA         KDENOM          < DENOMINATEUR DU RAPPORT.
         SLRS        1
         STA         RS2             < EN VUE DE L'UTILISATION DE ADIV.
         JMP         E42             < RETOUR OK A LA LOOP DE L'EDITEUR.
FP:      EQU         $
         LAI         -1
         STA         KNUMER          < MULTIPLICATION PAR -1.
         LAI         1               < OPERATION NEUTRE.
         STA         KDENOM
         STA         RS2
         JMP         E42             < VERS L'EDITOR LOOP (GRAPH).
         PAGE
<
<
<        I N V E R S I O N   D E   L A   M E M O R I S A T I O N
<                    D E S   S E G M E N T S  :
<
<
<        FONCTION :
<                    1- EN MODE TRACE DE SEGMENT PAR 'A' & 'B' ,
<                    'M' : PERMET LA MEMORISATION DES SEGMENTS TRACES ,
<                    'N' : FAIT DES SEGMENTS TRACES , DES TRAITS
<                          DE CONSTRUCTION.
<                    2- EN MODE TRANSFORMATION GEOMETRIQUE ,
<                    'N' : L'IMAGE DE LA TRANSFORMATION RECOUVRIRA
<                          L'OBJET (QUI VA DONC DISPARAITRE) ,
<                    'M' : L'IMAGE SE SUPERPOSE A L'OBJET.
<
<
FM:      EQU         $               < MEMORISATION.
         LA          MEMO
         RBT         0               < BIT0(MEMO)=0.
         JMP         E80
FN:      EQU         $               < NON MEMORISATION.
         LA          MEMO
         SBT         0               < BIT0(MEMO)=1.
E80:     EQU         $
         STA         MEMO
         JMP         E42             < RETOUR A LA BOUCLE DE L'EDITEUR.
         PAGE
<
<
<        C L E A R   D E   L A   T A B L E
<        D E S   S E G M E N T S  :
<
<
<        FONCTION : CETTE FONCTION LIBERE TOUS LES
<        SEGMENTS DE LA TABLE GRAPHIQUE , ET CECI
<        EN METTANT LE BIT0 DE CHAQUE ENTREE DE 4
<        MOTS A 1.
<
<
FZ:      EQU         $
         BSR         ACTAGR          < CLEAR TABLE DES SEGMENTS.
         JMP         E42             < RETOUR A LA BOUCLE DE L'EDITEUR
                                     < GRAPHIQUE.
<
<        C L E A R   T A G R  :
<
CTAGR:   EQU         $
         LR          W,C             < C=@TAGR.
         LX          ALTAGR          < NBRE D'ENTREES DE 4 MOTS A
                                     < LIBERER.
         LAI         -1              < POUR METTRE LE BIT0 A 1.
E41:     EQU         $
         STA         0,C             < LIBERATION DE CHAQUE ENTREE.
         ADRI        4,C             < SEGMENT SUIVANT.
         JDX         E41
         RSR
         PAGE
<
<
<        E F F A C E M E N T   D E   L ' E C R A N  :
<
<
FX:      EQU         $
         LAD         ERASE
         BSR         ASVC
         JMP         E42             < RETOUR A LA BOUCLE DE L'EDITEUR.
         PAGE
<
<
<        D E S I G N A T I O N   D U   C E N T R E
<        D U   C E R C L E   C O U R A N T  :
<
<
FO:      EQU         $
         LA          POINTC+1        < Y DU CENTRE DU CERCLE.
         STA         YC
         LA          POINTC+2        < X DU CENTRE DU CERCLE.
         STA         XC
         JMP         E42             < EASY ???
         PAGE
<
<
<        D E S I G N A T I O N   D U   R A Y O N
<        D U   C E R C L E   C O U R A N T  :
<
<
<        FONCTION :
<                      CETTE ROUTINE DESIGNE L'EXTREMITE DU
<                    RAYON DONT LA 1ERE EXTREMITE A ETE
<                    DESIGNEE PAR UNE COMMANDE 'O' ; DE PLUS ON
<                    DEFINIT ICI LE SENS DU TRACE DU CERCLE :
<                    'L' : SENS TRIGONOMETRIQUE ,
<                    'R' : SENS ANTI-TRIGONOMETRIQUE.
<
<
FL:      EQU         $               < LEFT : SENS TRIGONOMETRIQUE.
         LA          SIN
         JAG         E78             < OK , TETA>0.
         JAL         E79             < IL FAUT RENDRE TETA POSITIF.
         ACTD                        < E R R E U R   S Y S T E M E ...
FR:      EQU         $               < RIGHT : SENS ANTI-TRIGONOMETRIQUE.
         LA          SIN
         JAL         E78             < OK , TETA<0.
E79:     EQU         $
         NGR         A,A             < ON CHANGE LE SIGNE DU TETA PAR
                                     < L'INTERMEDIAIRE DE SON SINUS.
         STA         SIN
E78:     EQU         $
         LA          R
         STA         KDENOM          < AFIN DE DIVISER PAR 'R' DANS ADIV
         SLRS        1
         STA         RS2             < CALCUL DE R/2.
<
< TRAITEMENT DU CENTRE DU CERCLE :
<
         LA          YC              < YC.
         MP          SIN             < YC*SIN.
         BSR         ADIV            < YC*SIN/R.
         LR          A,Y             < Y=YC*SIN/R.
         LA          XC              < XC.
         MP          DIF             < XC*DIF.
         BSR         ADIV            < XC*DIF/R.
         ADR         Y,A
         STA         XK              < XK=XC*DIF/R+YC*SIN/R.
         LA          XC              < XC.
         MP          SIN             < XC*SIN.
         BSR         ADIV            < XC*SIN/R.
         NGR         A,Y             < Y=-XC*SIN/R.
         LA          YC              < YC.
         MP          DIF             < YC*DIF.
         BSR         ADIV            < YC*DIF/R.
         ADR         Y,A
         STA         YK              < YK=YC*DIF/R-XC*SIN/R.
         JMP         E42             < C'EST TOUT ....
<
<
<        T R A C E   D U   C E R C L E   C O U R A N T  :
<
<
FC:      EQU         $
         STZ         VARX            < PAS DE TRANSLATION DES X.
         STZ         VARY            < PAS DE TRANSLATION DES Y.
<        NOTATION :
<                    XM=X DU POINT COURANT DE L'ARC DE CERCLE ,
<                    YM=Y DU POINT COURANT DE L'ARC DE CERCLE ,
         LXI         360/10          < NBRE DE POINTS SUR UN CERCLE
                                     < PARCOURU AVEC UN PAS DE 10
                                     < DEGRE (A PEU PRES...).
         LA          POINTC+1        < YM INITIAL.
         LB          POINTC+2        < XM INITIAL.
E73:     EQU         $
         STB         SEGC+1
         STB         SEGC+3          < XM.
         STA         SEGC+0
         STA         SEGC+2          < YM.
<
< TEST DE SORTIE DE L'ECRAN :
<
         BSR         ATSE            < TEST D'OVERSCREEN DU POINT (A,B).
         JAL         E75             < OVERSCREEN , ON SAUTE ...
<
< TRACE DU SEGMENT COURANT :
< (REDUIT AU POINT (YM,XM)).
<
         LAD         OG
         BSR         ASVC
         JGE         E42             < FINI SI CTRL-X-OFF ....
         LAD         WG
         BSR         ASVC
         JGE         E42             < FINI SI CTRL-X-OFF ....
<
< PASSAGE AU POINT COURANT SUIVANT DE L'ARC
< DE CERCLE PAR APPROXIMATION :
<
E75:     EQU         $
         BSR         AROTAT          < ROTATION POINT.
         JDX         E73             < TRACE DU POINT SUIVANT DE L'ARC
                                     < DE CERCLE.
         JMP         E42             < C'EST FINI ....
<
<
<        R O U T I N E   D E   D I V I S I O N   E N T I E R E  :
<
<
DIV:     EQU         $
         DV          KDENOM          < DIVISION DE (A,B) PAR (KDENOM).
         XR          A,B             < A=RESTE DE LA DIVISION ENTIERE.
         CP          RS2             < POSITION DU RESTE PAR RAPPORT
                                     < AU DIVISEUR/2.
         XR          A,B             < RESTAURE A=QUOTIENT ENTIER.
         JL          E77             < RESTE<R/2.
         ADRI        1,A             < DANS LE CAS RESTE>=R/2 , ON
                                     < INCREMENT D'UNE UNITE LE
                                     < QUOTIENT , POUR NE PAS COMMETTRE
                                     < UNE ERREUR TOUJOURS DE
                                     < MEME SENS.
E77:     EQU         $
         RSR
         PAGE
<
<
<        E D I T E U R   G R A P H I Q U E  :
<
<
<        FONCTION : CET EDITEUR EST UN SOUS ENSEMBLE
<        DE L'EDIITEUR ALPHA-NUMERIQUE QUI L'APPELLE
<        PAR L'INTERMEDIAIRE DU CTRL-G . IL A SA
<        CHARGE LA GESTION D'UNE TABLE DES SEGMENTS
<        CONSTRUITES A L'AIDE DES COMMANDES ENVOYEES
<        PAR L'UTILISATEUR A L'AIDE DU CURSEUR
<        GRAPHIQUE.
<
<
GRAPH:   EQU         $
         LR          Y,A             < A=Y(CURSEUR ALPHA-NUMERIQUE).
         MP          C74
         ADR         X,B             < B=INDEX DU CUSEUR ALPHA-NUMERIQUE
                                     < DANS LA PAGE COURANTE.
         SBT         0+16            < POSITIONNEMENT DU MODE INTER-
                                     < ACTIF A PRIORI.
         STB         GRAFP           < ET SAVE L'INDEX DU CURSEUR
                                     < ALPHA-NUMERIQUE.
<
< EMPILEMENT DE GRAFP :
<
         LAI         LGRAFP+1
         SWBR        A,A
         STA         SGRAFP          < REINITIALISATION DE SGRAFP.
         BSR         AGRAFP          < CALCUL DE Y=@SGRAFP.
         LR          B,A             < A=GRAFP A EMPILER.
         PUSH
         LA          ADPAGE
         SBT         0
         STA         APAGE           < RELAI INDIRECT INDEX VERS
                                     < LA PAGE ALPHA-NUMERIQUE.
         LAI         8
         STA         WG+2            < LE COMPTE D'OCTETS DE WG RECOIT
                                     < 8 OCTETS QUI REPRESENTE LE NBRE
                                     < D'OCTETS CONSTITUANT UN
                                     < SEGMENT GRAPHIQUE.
<
< BOUCLE DE L'EDITEUR GRAPHIQUE :
<
E42:     EQU         $
<        ON A ICI :
<                    W=@TAGR.
<
< TEST DU MODE GRAPHIQUE PROGRAMME :
<
         LA          GRAFP
         JAL         E241            < C'EST LE GRAPHIQUE INTERACTIF.
<
< MODE GRAPHIQUE PROGRAMME :
<
         CP          N3574           < VALIDATION DE GRAFP.
         JGE         EE240           < FIN DE LA PAGE ALPHA-NUMERIQUE ,
                                     < ON REVIENT AU MODE INTERACTIF.
         LR          A,X             < OK : X=GRAFP=INDEX DE PAGE.
E267:    EQU         $               < ENTRY APPEL PROGRAMME GRAPHIQUE
                                     < PAR NOM.
         LBY         &APAGE
         STBY        POINTC          < SAVE A=COMMANDE GRAPHIQUE
                                     < COURANTE.
         IC          GRAFP           < PROGRESSION DE L'INDEX DE PAGE.
         JMP         E242            < EXECUTION DE LA COMMANDE
                                     < GRAPHIQUE PROGRAMME.
<
< MODE GRAPHIQUE INTERACTIF :
<
E241:    EQU         $
         LAD         OG
         BSR         ASVC            < MISE DE LA VISU EN MODE GRAPHIQUE
                                     < S'IL N'Y ETAIT PAS DEJA.
         LAD         CU
         BSR         ASVC            < MISE EN FONCTION DU CURSEUR
                                     < GRAPHIQUE.
         LAD         LG
         BSR         ASVC            < LECTURE DES COORDONNEES DU
                                     < CURSEUR GRAPHIQUE AVEC ATTENTE
                                     < DU BON-VOULOIR DE L'UTILISATEUR.
<
< ANALYSE DES DESIDERATA DE L'UTILISATEUR :
<
         LBY         POINTC          < ACCES AU CARACTERE FRAPPE
                                     < PAR L'UTILISATEUR POUR
                                     < DEBLOQUER SA VISU.
E242:    EQU         $               < ENTRY GRAPHIQUE PROGRAMME.
         AD          CTRL            < TRANSFORMATION EVENTUELLE DE
                                     < LA COMMANDE EN UN CTRL-XXX.
         STZ         CTRL            < RAZ A PRIORI DE CTRL APRES CHAQUE
                                     < COMMANDE GRAPHIQUE.
         CPI         '20             < EST-CE 'SPACE' , SOIT LE
                                     < NOP DU LANGAGE GRAPHIQUE . ????
         JE          E42             < OUI : RETOUR IMMEDIAT A LA
                                     < BOUCLE DE L'EDITEUR GRAPHIQUE.
         JG          E263            < CE N'EST PAS UN CTRL-XXX.
<
< CAS DES CTRL-XXX : IL S'AGIT DE L'APPEL
< D'UN PROGRAMME GRAPHIQUE PAR NOM :
<
         ADRI        '40,A           < A='NOM' DU PROGRAMME GRAPHIQUE
         LR          A,B             < B=NOM DU PROGRAMME CHERCHE.
         LX          N3574           < NBRE DE CARACTERES D'UNE PAGE.
         ADRI        -1,X            < X=INDEX DU DERNIER CARACTERE
                                     < DE LA PAGE ALPHA-NUMERIQUE.
                                     < (QUE L'ON SAUTE POUR LA
                                     < RECHERCHE DE 'FIS').
E264:    EQU         $
         ADRI        -1,X
         LBY         &APAGE          < ACCES A UN CARACTERE DE LA PAGE.
         CP          FIS             < EST-CE LE 'FIS' ???
         JNE         E265            < NON , CE N'EST DONC PAS UNE
                                     < DECLARATION DE NOM DE
                                     < PROGRAMME GRAPHIQUE.
<
< CAS DE LA DECLARATION DU NOM D'UN
< PROGRAMME GRAPHIQUE :
<
         ADRI        1,X
         LBY         &APAGE          < ACCES AU CARACTERE SUIVANT DU
                                     < CARACTERE DE DECLARATION.
         CPR         A,B             < EST-CE LE NOM CHERCHE ????
         JE          E266            < OUI , C'EST OK.
         ADRI        -1,X            < RETOUR SUR LE 'FIS'.
E265:    EQU         $
         CPZR        X
         JG          E264            < AU PRECEDENT .....
         JMP         E40             < ERREUR : LE NOM DEMANDE
                                     < N'EXISTE PAS.
<
< CAS OU LE PROGRAMME DEMANDE EXISTE :
<
E266:    EQU         $
<
< SAUVEGARDE DU 'GRAFP' DE RETOUR :
<
         BSR         AGRAFP
         LA          GRAFP
         PUSH
         JNC         E310            < OK , PILE NON SATUREE.
         DC          SGRAFP          < DANS LE CAS OU LA PILE EST
                                     < SATUREE , ON ECRASE LE SOMMET.
E310:    EQU         $
         ADRI        1,X             < X=INDEX DU 1ER CARACTERE DU
                                     < PROGRAMME GRAPHIQUE DEMANDE.
         STX         GRAFP           < MAJ ET MISE EN MODE PROGRAMME.
         JMP         E267            < EXECUTION DU PROGRAMME.
<
< TEST DES COMMANDES GRAPHIQUES :
<
E263:    EQU         $
         ADRI        -'21,A          < DECODAGE DU CARACTERE.
         JAL         E40             < ERREUR , CARACTERE NON RECONNU.
         CPI         NCOG
         JGE         E40             < ERREUR : CARACTERE NON RECONNU.
<
< EXECUTION DE LA COMMANDE :
<
         LR          A,X             < X=FONCTION DEMANDEE.
         BR          &COG            < BRANCHEMENT VERS LE MODULE
                                     < DE TRAITEMENT SPECIFIQUE.
<
<
<        R E T O U R   A   L ' E D I T E U R
<        A L P H A - N U M E R I Q U E  :
<
<
FF:      EQU         $
         LAD         CG              < CLOSE-GRAPHIQUE : CE 'CG' EST
                                     < EN FAIT RESERVE AU 'F' DANS LE
                                     < MODE PROGRAMME , POUR PERMETTRE
                                     < UN RETOUR EN ALPHA-NUMERIQUE
                                     < QUI N'A PAS EU LIEU PUISQU'
                                     < ON NE LIT ALORS PAS LE CURSEUR
                                     < GRAPHIQUE ...
         BSR         ASVC
         LAI         4
         STA         WG+2            < EN VUE DE L'ENVOI DES
                                     < COORDONNEES DU CURSEUR
                                     < ALPHA-NUMERIQUE POUR LES
                                     < POSITIONNEMENTS HAUTS ...
         LXI         0
         LYI         0               < ENVOI HOME DU CURSEUR.
         LAD         CHOME           < ENVOI HOME DU CURSEUR.
         BR          ALOOP           < RETOUR A LA BOUCLE DE L'EDITEUR
                                     < ALPHA-NUMERIQUE AVEC L'ENVOI
                                     < HOME DU CURSEUR.
<
<        E R R E U R   G R A P H I Q U E  :
<
E40:     EQU         $
         BSR         ABELL           < A NOTER QU'ON EST ICI EN
                                     < ALPHA-NUMERIQUE APRE LA LECTURE
                                     < GRAPHIQUE.
         CPI         '13
         JL          E42
<
< CAS OU UN CTRL-X-OFF A ETE ENVOYE
< PENDANT LA CLOCHE :
<
EE240:   EQU         $
<
< DEPILEMENT DE GRAFP :
<
         BSR         AGRAFP          < CALCUL DE Y=@SGRAFP.
         PULL                        < DEPILE A=GRAFP.
         JNC         E311            < OK , PILE NON VIDE.
         IC          SGRAFP          < DANS LE CAS OU LA PILE EST
                                     < VIDE ON RETOURNE SUR SON 1ER
                                     < ELEMENT.
E311:    EQU         $
         STA         GRAFP           < RETOUR AU MODE INTERACTIF.
         JMP         E42
         PAGE
<
<
<        D E S I G N A T I O N   D U   1 E R
<        P O I N T   D U   S E G M E N T   C O U R A N T  :
<
<
FA:      EQU         $
         LA          POINTC+1
         STA         SEGC            < COORDONNEE Y DU 1ER POINT DU
                                     < SEGMENT COURANT.
         LA          POINTC+2
         STA         SEGC+1          < COORDONNEE X DU 1ER POINT DU
                                     < SEGMENT COURANT.
         JMP         E42             < RETOUR A LA BOUCLE DE L'EDITEUR
                                     < GRAPHIQUE.
         PAGE
<
<
<        D E S I G N A T I O N   D U   2 E M E   P O I N T
<        D U   S E G M E N T   C O U R A N T  :
<
<
<        FONCTION :
<        2 ENTRIES :
<                    1- MODE 'B' : ON JOINT AU POINT 'A' PRECEDENT ,
<                                  ET LE POINT 'B' COURANT DEVIENT
<                                  LE POINT 'A' SUIVANT (CHAINAGE
<                                  AUTOMATIQUE DES SEGMENTS).
<                    2- MODE 'K' : ON JOINT LE POINT 'K' AU POINT
<                                  'A' PRECEDENT ET C'EST TOUT : 'A'
<                                  RESTE 'A' (MODE ETOILE).
<
<
FK:      EQU         $
         LAI         1
         JMP         E230
FB:      EQU         $
         LAI         0
E230:    EQU         $
         STA         VAR             < VAR=1 : MODE ETOILE ,
                                     < VAR=0 : MODE CHAINAGE AUTOMATI-
                                     < QUE (B).
         BSR         AMPC            < EN VUE DE L'AFFICAHGE.
<        ON A ICI :
<                    B=X DU 2EME POINT DU SEGMENT COURANT ,
<                    Y=Y DU 2EME POINT DU SEGMENT COURANT.
E67:     EQU         $               < ENTREE RESERVEE A FH.
         LA          MEMO            < FAUT-IL MEMORISER OU PAS LE
                                     < SEGMENT ?????
         TBT         0
         JC          E66             < NON , ALLONS UNIQUEMENT
                                     < L'AFFICHER.
         LR          W,C             < C=@TAGR.
         LX          ALTAGR
<
< RECHERCHE D'UNE ENTREE LIBRE DANS TAGR
< POUR Y METTRE LE SEGMENT COURANT :
<
E46:     EQU         $
         LA          0,C
         JAL         E47             < OK , ENTREE LIBRE (BIT0=1).
         ADRI        4,C             < ACCES A L'ENTREE SUIVANTE.
         JDX         E46
<
< CAS OU TAGR EST PLEINE :
<
         JMP         E40             < ERREUR : ENVOI D'UNE 'BELL'.
<
< CAS OU ON A TROUVE UNE ENTREE
< LIBRE DANS TAGR :
<
E47:     EQU         $
         LAD         SEGC            < SOURCE ,
         XR          B,C             < DESTINATION & SAVE B.
         LXI         4               < 4 MOTS A DEPLACER.
         MOVE
         XR          B,C             < RESTAURE B.
<
< AFFICHAGE DU SEGMENT COURANT SUR L'ECRAN :
<
E66:     EQU         $               < ENTREE DESTINEE A 'FH'.
         LAD         OG
         BSR         ASVC            < REMISE DE LA VISU EN GRAPHIQUE.
         JGE         EE240           < UN CTRL-X-OFF A ETE RECU.
         LAD         WG
         BSR         ASVC            < AFFICHAGE DU SEGMENT COURANT.
         JGE         EE240           < UN CTRL-X-OFF A ETE RECU.
<
< CHOIX ENTRE LE MODE CHAINAGE AUTOMATIQUE
< ET LE MODE ETOILE :
<
         CPZ         VAR
         JNE         E42             < LE MODE ETOILE EST DEMANDE , ON
                                     < RETOURNE A LA BOUCLE DE
                                     < L'EDITEUR GRAPHIQUE.
<
< LE 2EME POINT DU SEGMENT COURANT
< DEVIENT LE 1ER POINT DU PROCHAIN
< SEGMENT COURANT :
<
E51:     EQU         $
         STY         SEGC
         STB         SEGC+1
         STZ         SEGC+2          < A PRIORI.
         STZ         SEGC+3          < A PRIORI.
         JMP         E42             < RETOUR A LA BOUCLE DE L'EDITEUR
                                     < GRAPHIQUE.
         PAGE
<
<
<        T R A N S F E R T   D E   P O I N T C   V E R S   S E G C  :
<
<
<        RESULTATS :
<                    Y=Y DU 2EME POINT DU SEGMENT COURANT ,
<                    B=X DU 2EME POINT DU SEGMENT COURANT ,
<
<
MPC:     EQU         $
         LY          POINTC+1
         LB          POINTC+2
         STY         SEGC+2          < EN VUE DE L'AFFICHAGE.
         STB         SEGC+3
         RSR
         PAGE
<
<
<        E F F A C E M E N T   D U   S E G M E N T   D E S I G N E  :
<
<
FE:      EQU         $
         BSR         ASEEKS          < RECHERCHE DU SEGMENT DESIGNE ,
                                     < DANS TAGR.
         CPZR        X               < A-T'IL ETE TROUVE ????
         JE          E40             < NON , ERREUR ....
<
< CAS OU ON A TROUVE A PEU PRES LE SEGMENT :
<
         LAI         -1
         STA         0,C             < LIBERATION DE SON ENTREE , ON
                                     < L'EFFACE DONC DANS TAGR.
         JMP         E42             < OK.
         PAGE
<
<
<        A F F I C H A G E   D E   L A   T A B L E
<                    D E S   S E G M E N T S  :
<
<
FW:      EQU         $               < ENTRY POUR DESSIN COURBE !?!?!
         LAD         OG
         BSR         ASVC            < MISE EN GRAPHIQUE DE LA VISU ,
                                     < POUR AUTORISER 'CU'.
         LAD         CU
         BSR         ASVC            < MISE EN FONCTION DU CURSEUR
                                     < GRAPHIQUE , ET ON VA VOIR LE
                                     < SURPRENANT RESULTAT ....
FD:      EQU         $               < ENTRY NORMALE.......
         LR          W,C             < C=@TAGR.
         LX          ALTAGR          < NBRE D'ENTREES DE TAGR.
<
< BOUCLE D'AFFICHAGE :
<
E50:     EQU         $
         LA          0,C
         JAL         E48             < CETTE ENTREE EST LIBRE , ELLE
                                     < N'EST DONC PAS A AFFICHER.
<
< AFFICHAGE D'UN SEGMENT :
<
         LR          C,A             < A=@MOT DES COORDONNESS DU
                                     < SEGMENT TROUVE.
         SLLS        1               < CONVERSION EN UNE ADRESSE OCTET.
         STA         WG+1            < MISE A JOUR DE LA DEAMNDE A MSP.
         LAD         OG
         BSR         ASVC            < MISE EN GRAPHIQUE DE LA VISU.
         JGE         E49             < UN CTRL-X-OFF A ETE RECU.
         LAD         WG
         BSR         ASVC            < AFFICHAGE DU SEGMENT TROUVE.
                                     < UN CTRL-X-OFF A-T'IL ETE
                                     < ENVOYE PAR L'UTILISATEUR ????
         JGE         E49             < OUI , ABANDON DE LHAFFICHAGE.
E48:     EQU         $
         ADRI        4,C             < ACCES A L'ENTREE SUIVANTE DE TAGR
         JDX         E50
<
< RESTAURATION DE WG :
<
E49:     EQU         $
         LAD         COORD           < COORD OU SEGC ....
         SLLS        1
         STA         WG+1
         CPZR        X
         JNE         EE240           < SI X#0 , C'EST QU'UN CTRL-X-OFF
                                     < A ETE EMIS PENDANT L'EDITION.
         BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
         PAGE
<
<
<        E D I T I O N   D ' U N E   G R I L L E
<        F A C I L I T A N T   L E   D E S S I N  :
<
<
FG:      EQU         $
<        NOTA :
<                    ON EST EN ALPHA-NUMERIQUE ICI.
         LAD         CHOME
         BSR         ASVC            < ENVOI HOME DU CURSEUR ALPHA.
         LXI         37*5            < NBRE DE BLOCS DE 14 CARACTERES
                                     < CONTENUS DANS UN ECRAN.
                                     < ON A : (37*5)*14=35*74.
         LB          MESG            < SAVE LE CARACTERE COURANT DANS B.
         LAI         '8E             < CODE D'EXPANSION DE 14 ('E)
                                     < CARACTERES.
         SWBR        A,A
         ORI         '2E             < AINSI , ON VA DUPLIQUER 14
                                     < CARACTERES 'POINT' ('2E).
         STA         MESG
         IC          MESGO+2         < ON ENVOI 2 OCTETS AUX VISUS (???).
E56:     EQU         $
         LAD         MESGO
         BSR         ASVC            < ENVOI D'UN POINT SUR LA VISU.
                                     < L'UTILISATEUR A-T'IL ENVOYE
                                     < UN CTRL-X-OFF ????
         JGE         E55             < OUI , ON ABORTE LA GRILLE.
         JDX         E56             < OK , POINT SUIVANT.
E55:     EQU         $
         STB         MESG            < RESTAURE LE CARACTERE COURANT.
         DC          MESGO+2         < RESTAURATION DU COMPTE OCTETS
                                     < DE MESGO.
EE42:    BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
         PAGE
<
<
<        T R A N S L A T I O N   D ' U N   S E G M E N T  :
<
<
<        FONCTION :
<                    CETTE ROUTINE TANSLATE LE SEGMENT
<                    COURANT JUSQU'AU POINT DESIGNE
<                    PAR LA COMMANDE 'T' , SI EVIDEMMENT CELA
<                    EST POSSIBLE.
<
<
FT:      EQU         $
         LA          POINTC+1        < YI (Y DU POINT DESIGNE PAR 'J').
         SB          SEGC+0          < YI-Y1.
         AD          SEGC+2          < TRANSLATION DES Y : Y2+(YI-Y1).
         JAL         E40             < ERREUR.
         CP          C1024
         JGE         E40             < ERREUR , OVERFLOW ...
                                     < (OU OVERSCREEN ?????)
         LR          A,Y             < Y=NOUVEL Y2.
         LA          POINTC+2        < XI.
         SB          SEGC+1          < XI-X1.
         AD          SEGC+3          < TRANSLATION DES X : X2+(XI-X1).
         JAL         E40             < ERREUR.
         CP          C1024
         JGE         E40             < ERREUR : OVERSCREEN ...
         LR          A,B             < B=NOUVEL X2.
<
< TRANSLATION DE SEGC :
<
         STY         SEGC+2          < Y2.
         STB         SEGC+3          < X2.
         LA          POINTC+1
         STA         SEGC+0          < Y1.
         LA          POINTC+2
         STA         SEGC+1          < X1.
         JMP         E67             < TRAITONS LE NOUVEAU SEGC COMME
                                     < AVEC LA COMMANDE FB.
         PAGE
<
<
<        C H A N G E M E N T   D E   S E G M E N T   C O U R A N T  :
<
<
<        FONCTION :
<                      CETTE ROUTINE MET DANS SEGC , LE SEGMENT DESIGNE
<                    PAR LA COMMANDE 'S'.
<
<
FS:      EQU         $
         BSR         ASEEKS          < RECHERCHE DU SEGMENT DESIGNE
                                     < DANS TAGR.
         CPZR        X               < LE SEGMENT DESIGNE EXISTE-T'IL ??
         JE          E40             < NON , ERREUR ....
<
< CAS OU LE SEGMENT DESIGNE EXISTE :
<
         LAD         SEGC
         LR          A,B             < B=@ZONE RECEPTRICE ,
         LR          C,A             < A=@ZONE EMETTRICE (BLOC DE 4
                                     < MOTS CONTENANT LE SEGMENT
                                     < DESIGNE DANS TAGR.
         LXI         4               < 4 MOTS A DEPLACER.
         MOVE                        < TRANSFERT DE TAGR VERS SEGC.
         BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
         PAGE
<
<
<        M O D E   G R A P H I Q U E   P R O G R A M M E  :
<
<
<
< FIN DE MODE PROGRAMME , OU RETOUR D'UN
< SOUS-PROGRAMME GRAPHIQUE :
<
FY:      EQU         $
         CPZ         GRAFP           < VALIDATION DE LA COMMANDE.
         JL          E420            < ERREUR : PAS DE MODE PROGRAMME
                                     < EN COURS.
E240:    EQU         $               < ENTRY : CTRL-X-OFF PENDANT
                                     < LA BELL , OU LA FIN DE LA PAGE
                                     < ALPHA-NUMERIQUE A ETE ATTEINTE.
<
< DEPILEMENT DE GRAFP :
<
         BSR         AGRAFP          < CALCUL DE Y=@SGRAFP.
         PULL                        < A=GRAFP.
         JNC         E312            < OK , PILE NON VIDE.
         IC          SGRAFP          < RETOUR SUR LA TETE SI VIDE.
E312:    EQU         $
         STA         GRAFP           < GRAFP<0.
         BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
<
< MISE EN MODE PROGRAMME :
<
FJ:      EQU         $
         LA          GRAFP           < VALIDATION DE LA COMMANDE.
         JAL         E313            < OK.
E420:    EQU         $               < ENTRY PAS DE MODE PROGRAMME.
         BR          AE40            < ERREUR : MODE PROGRAMME
                                     < DEJA EN COURS.
E313:    EQU         $
         RBT         0               < MISE EN MODE PROGRAMME.
E262:    EQU         $
         STA         GRAFP           < GRAFP=INDEX DU CURSEUR ALPHA-
                                     < NUMERIQUE DANS LA PAGE : DONNE
                                     < L'INDEX DE LA 1ERE COMMANDE
                                     < GRAPHIQUE.
         BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
         PAGE
<
<
<        M I S E   D E   L A   C O M M A N D E
<        S U I V A N T E   E N   M O D E   ' C T R L '  :
<
<
FCTRL:   EQU         $
         LAI         -'40
         STA         CTRL            < CTRL=CONSTANTE DE CONVERSION D'UN
                                     < CARACTERE EN SON 'CTRL' ASSOCIE.
         BR          AE42            < RETOUR A LA BOUCLE DE L'EDITEUR.
         PAGE
<
<
<        M I S E   E N   M O D E   ' > '   O U   ' < '  :
<
<
<        FONCTION :
<                      LES CARACTERES '>' OU '<' PERMETTENT
<                    EN GRAPHIQUE DE DISTINGUER 2
<                    JEUX DE PROGRAMMES GRAPHIQUES DE
<                    MEME NOM MAIS DE CARACTERES DE
<                    DECLARATION ('>' OU '<') DIFFERENTS.
<
<
FINF:    EQU         $
FSUP:    EQU         $
         LBY         POINTC          < RECUPERATION DU CARACTERE DE
                                     < COMMANDE ('>' OU '<').
         STA         FIS             < CHANGEMENT DU MODE 'FIS'.
         BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
         PAGE
<
<
<        D E S I G N A T I O N   D ' U N   P R O G R A M M E
<                    G R P H I Q U E  :
<
<
<        FONCTION :
<                      LA COMMANDE ':' PERMET EN MODE
<                    GRAPHIQUE DE DESIGNER UN PROGRAMME
<                    GRAPHIQUE DANS LA PAGE ALPHA-
<                    NUMERIQUE , ET D'EN FAIRE LE 'GRAFP'
<                    COURANT ...
<
<
F2P:     EQU         $
         LAI         22              < UN CARACTERE OCCUPE 22 POINTS.
         STA         VAR
         LAI         0
         LB          POINTC+1        < B=YG=Y(CURSEUR GRAPHIQUE).
         DV          VAR             < A=ENT(YG/22).
         ADRI        -NBLIG,A
         MP          C74             < B=-74*(NBLIG-ENT(YG/22)).
         LR          B,Y             < Y=-74*(NBLIG-ENT(YG/22)).
         LAI         14              < UN CARACTERE OCCUPE 14 POINTS
                                     < DE LARGEUR.
         STA         VAR
         LAI         0
         LB          POINTC+2        < B=XG=X(CURSEUR GRAPHIQUE).
         DV          VAR             < A=ENT(XG/14).
         SBR         Y,A             < A=74*(NBLIG-ENT(YG/22))+
                                     <   ENT(XG/14)=INDEX DU PROGRAMME
                                     < GRAPHIQUE DANS LA PAGE ALPHA-
                                     < NUMERIQUE COURANTE.
         CPZ         GRAFP           < TEST DU MODE PROGRAMME OUI/NON ?
         JGE         E262            < MODE PROGRAMME : ON Y RESTE.
         SBT         0               < MODE INTERACTIF : ON Y RESTE.
         JMP         E262
         PAGE
<
<
<        M O D I F I C A T I O N S   D E S   C O O R D O N N E E E S
<        D U   P O I N T   C O U R A N T   ( P O I N T C )  :
<
<
<        FONCTION :
<                      CES FONCTIONS PERMETTENT EN MODE
<                    PROGRAMME DE SIMULER DES DEPLACEMENTS
<                    DU CURSEUR GRAPHIQUE (POINTC).
<
<
F1:      EQU         $               < X<--(X)+SCALE.
         CPZ         SCAL13
         JNE         F30             < INVERSION '1' ET '3'.
F10:     EQU         $               < INVERSION '1' ET '3'.
         LAD         POINTC+2        < A=@X(POINTC).
         JMP         E250
F2:      EQU         $               < Y<--(Y)+SCALE.
         CPZ         SCAL24
         JNE         F40             < INVERSION '2' ET '4'.
F20:     EQU         $               < INVERSION '2' ET '4'.
         LAD         POINTC+1        < A=@Y(POINTC).
E250:    EQU         $
         LB          SCALE           < B=INCREMENT.
         JMP         E251
F3:      EQU         $               < X<--(X)-SCALE.
         CPZ         SCAL13
         JNE         F10             < INVERSION '1' ET '3'.
F30:     EQU         $               < INVERSION '1' ET '3'.
         LAD         POINTC+2        < A=@X(POINTC).
         JMP         E252
F4:      EQU         $               < Y<--(Y)-SCALE.
         CPZ         SCAL24
         JNE         F20             < INVERSION '2' ET '4'.
F40:     EQU         $               < INVERSION '2' ET '4'.
         LAD         POINTC+1        < A=@Y(POINTC).
E252:    EQU         $
         LB          SCALE
         NGR         B,B             < B=DECREMENT.
E251:    EQU         $
         CPZ         SCALXY
         JE          E330            < MODE NORMAL DE X ET DE Y.
         IBT         15              < INVERSION DE X ET DE Y ;
                                     < (PAR PERMUTATION DE 'POINTC+1' ,
                                     < ET DE 'POINTC+2') ;
                                     < A T T E N T I O N  : 'POINTC' DOIT
                                     < ETRE A UNE ADRESSE IMPAIRE ,
                                     < AFIN QUE 'POINTC+1' SOIT A
                                     < UNE ADRESSE PAIRE.
E330:    EQU         $
         LR          A,C             < C=@X/Y(POINTC).
E303:    EQU         $               < ENTRY F5 & F6.
         LA          0,C             < A=X/Y(POINTC).
         ADR         B,A             < INCREMENTATION/DECREMENTATION.
         JAGE        E253
         AD          C1024           < DANS LE CAS OU X/Y(POINTC) EST
                                     < NEGATIF , ON LUI DONNE COMME
                                     < VALEUR , SA VALEUR MODULO 1024.
E253:    EQU         $
         CP          C1024
         JL          E254
         SB          C1024           < DANS LE CAS OU X/Y EST SUPERIEUR
                                     < A 1024 ON LE RECALCULE MODULO
                                     < 1024.
E254:    EQU         $
         STA         0,C             < MAJ DE X/Y(POINTC).
         BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
<
<
<        D E P L A C E M E N T S   P E R S P E C T I V E  :
<
<
F5:      EQU         $               < DEPLACEMENT VERS L'ARRIERE.
         CPZ         SCAL56
         JNE         F60             < INVERSION '5' ET '6'.
F50:     EQU         $               < INVERSION '5' ET '6'.
         LA          SCALE
         SARS        2               < DIVISION DE SCALE PAR 4 POUR
                                     < DONNER L'IMPRESSION D'ELOI-
                                     < GNEMENT EN PERSPECTIVE ....
         JMP         E300
F6:      EQU         $               < DEPLACEMENT VERS L'AVANT.
         CPZ         SCAL56
         JNE         F50             < INVERSION '5' ET '6'.
F60:     EQU         $               < INVERSION '5' ET '6'.
         LA          SCALE
         SARS        2               < DIVISION DE SCALE PAR 4.
         NGR         A,A             < INVERSION DE SCALE LORS DES
                                     < DEPLACEMENTS VERS L'AVANT.
E300:    EQU         $
         LR          A,B             < B=INCREMENT/DECREMENT DE X/Y.
         LAD         POINTC+1
         LR          A,C             < C=@Y(POINTC).
         LA          1,C             < A=X(POINTC).
         ADR         B,A
         ADR         B,A
         ADR         B,A
         JAGE        E301
         AD          C1024           < DANS LE CAS OU X(POINTC) EST
                                     < NEGATIF ,ON LUI DONNE COMME
                                     < VALEUR , SA VALEUR MODULO 1024.
E301:    EQU         $
         CP          C1024
         JL          E302
         SB          C1024           < DANS LE CAS OU X EST SUPERIEUR A
                                     < 1024 , ON LE RECALCULE
                                     < MODULO 1024.
E302:    EQU         $
         STA         1,C             < MAJ DE X(POINTC) :
                                     < X<--(X)+-3*SCALE/4.
         JMP         E303            < VERS LE TRAITEMENT DE Y(POINTC).
                                     < Y<--(Y)+-SCALE/4.
<
<
<        P O S I T I O N N E M E N T   E N   B A S
<        A   G A U C H E   D E   L ' E C R A N  :
<
<
F0:      EQU         $
         STZ         POINTC+1        < Y<--0.
         STZ         POINTC+2        < X<--0.
         BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
         PAGE
<
<
<        I N V E R S I O N S
<        ' 1 ' - ' 3 '
<        ' 2 ' - ' 4 '
<        ' 5 ' - ' 6 '  :
<
<
F13:     EQU         $
         STZ         SCAL13          < MODE NORMAL DE '1' ET '3'.
         BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
F24:     EQU         $
         STZ         SCAL24          < MODE NORMAL DE '2' ET '4'.
         BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
F56:     EQU         $
         STZ         SCAL56          < MODE NORMAL DE '5' ET '6'.
         BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
F31:     EQU         $
         IC          SCAL13          < INVERSION DE '1' ET '3'.
         BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
F42:     EQU         $
         IC          SCAL24          < INVERSION DE '2' ET '4'.
         BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
F65:     EQU         $
         IC          SCAL56          < INVERSION DE '5' ET '6'.
         BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
<
<
<        I N V E R S I O N   D E   X   E T   D E   Y  :
<
<
FXY:     EQU         $
         STZ         SCALXY          < MODE NORMAL DE X ET DE Y.
         BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
FYX:     EQU         $
         IC          SCALXY          < INVERSION DE X ET DE Y.
         BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
<
<
<        R E T O U R   A U X   M O D E S   N O R M A U X  :
<
<
FSTAR:   EQU         $
         STZ         SCAL13          < MODE NORMAL DE '1'-'3'.
         STZ         SCAL24          < MODE NORMAL DE '2'-'4'.
         STZ         SCAL56          < MODE NORMAL DE '5'-'6'.
         JMP         FXY             < MODE NORMAL DE 'X'-'Y'.
         PAGE
<
<
<        F A C T E U R   D ' E C H E L L E  :
<
<
F7:      EQU         $
         LAI         4
         JMP         E260
F8:      EQU         $
         LAI         8
         JMP         E260
F9:      EQU         $
         LAI         16
E260:    EQU         $
         STA         SCALE           < SAVE LE NOUVEAU FACTEUR
                                     < D'ECHELLE.
         BR          AE42            < VERS LA BOUCLE DE L'EDITEUR.
FPLUS:   EQU         $
         LAI         1               < POUR FAIRE +1 SUR SCALE.
         JMP         E270
FMOINS:  EQU         $
         LAI         -1              < POUR FAIRE -1 SUR SCALE.
E270:    EQU         $
         AD          SCALE
         JALE        E271            < SCALE=<0 , FAISONS SCALE<--128...
         CP          C1024
         JL          E260            < OK , (A) EST SCALE.
E271:    EQU         $
         ANDI        'FF             < SUPPRESSION DES NBRES NEGATIFS.
         EORI        '80             < SI A=0 : A<--128 ,
                                     < SI A>128 : A<--1.
         JMP         E260            < OK , (A) EST SCALE.
FOUVR:   EQU         $
         LAI         6               < POUR FAIRE +6 SUR SCALE.
         JMP         E270
FFERM:   EQU         $
         LAI         -6              < POUR FAIRE -6 SUR SCALE.
         JMP         E270
         PAGE
<
<
<        C A L C U L   D E   @ S G R A F P  :
<
<
<        RESULTAT :
<                    Y=@SGRAFP.
<                    (DETRUIT A).
<
<
PGRAFP:  EQU         $
         LAD         SGRAFP
         LR          A,Y             < Y=@SGRAFP.
         RSR
         PAGE
<
<
<        R E C H E R C H E   D ' U N   S E G M E N T   D A N S   T A G R
<
<
<        RESULTAT :
<                    X=0 : SEGMENT NON TROUVE ,
<                    X#0 : SEGMENT TROUVE A L'ADRESSE (C) DANS TAGR.
<
<
SEEKS:   EQU         $
         LX          ALTAGR          < NBRE D'ENTREES DE TAGR.
         LR          W,C             < C=@TAGR.
E52:     EQU         $
<        NOTATION :
<                    L'ORIGINE DU SEGMENT CONTENU DANS CETTE
<                    ENTREE DE TAGR EST (Y1,X1) , SON
<                    EXTREMITE EST (Y2,X2).
         LA          0,C             < Y1.
         JAL         E54             < CETTE ENTREE EST LIBRE , ON
                                     < LA SAUTE.
         SB          2,C             < Y1-Y2.
         STA         VAR
         LA          POINTC+2        < X(POINTC).
         SB          1,C             < X(POINTC)-X1.
         MP          VAR             < (Y1-Y2)(X(POINTC)-X1).
         SLRD        'A              < ON ACCEPTE AINSI LES IMPRECISIONS
                                     < DE LA VISEE AVEC LE CURSEUR
                                     < GRAPHIQUE.
         LR          B,Y             < SAVE (Y1-Y2)(X(POINTC)-X1) DANS Y
         LA          POINTC+1        < Y(POINTC).
         SB          0,C             < Y(POINTC)-Y1.
         STA         VAR
         LA          1,C             < X1.
         SB          3,C             < X1-X2.
         MP          VAR             < (Y(POINTC)-Y1)(X1-X2).
         SLRD        'A
         CPR         B,Y             < LE POINT COURANT APPARTIENT-IL
                                     < A PEU PRES AU SEGMENT CONTENU
                                     < DANS L'ENTREE COURANTE DE TAGR????
         JNE         E54             < NON , AU SUIVANT.
<
< CAS OU ON A TROUVE LA DROITE A LA QUELLE
< APPARTIENT LE POINT DESIGNE PAR LA
< COMMANDE 'E' , IL FAUT MAINTENANT VERIFIER
< SI C'EST LE BON SEGMENT :
<
         LA          POINTC+1        < Y(POINTC).
         SB          2,C             < Y(POINTC)-Y2.
         MP          VAR             < (Y(POINTC)-Y2)(Y(POINTC)-Y1).
         JAG         E54             < LE PRODUIT ETANT POSITIF , LE
                                     < POINT N'APPARTIENT PAS AU
                                     < SEGMENT (C).
         JAL         E53             < OK , PRODUIT NEGATIF ,
                                     < CELA SIGNIFIE QUE LE POINT
                                     < DESIGNE PAR 'E' APPARTIENT BIEN
                                     < AU SEGMENT (Y1,Y2).
         CPZR        B
         JNE         E54
<
< CAS OU LE PRODUIT EST NUL : LE SEGMENT
< EST HORIZONTAL , OU LE POINT EST A UNE
< EXTREMITE :
<
         LA          POINTC+2        < X(POINTC).
         SB          3,C             < X(POINTC)-X2.
         STA         VAR
         LA          POINTC+2        < X(POINTC).
         SB          1,C             < X(POINTC)-X1.
         MP          VAR             < (X(POINTC)-X1)(X(POINTC)-X2).
         JAG         E54             < PRODUIT POSITIF.
         JAL         E53             < OK , LE PRODUIT ETANT NEGATIF ,
                                     < LE POINT DESIGNE
                                     < APPARTIENT AU SEGMENT (C).
         CPZR        B
         JE          E53             < OK , LE PRODUIT EST NUL.
E54:     EQU         $
         ADRI        4,C             < ENTREE SUIVANTE DE TAGR.
         JDX         E52             < SEGMENT SUIVANT ....
E53:     EQU         $
         RSR
         PAGE
<
<
<        P A G E   A L P H A - N U M E R I Q U E   E T
<        T A B L E   D E S   S E G M E N T S  :
<
<
PAGE:    EQU         $               < PAGE ALPHA-NUMERIQUE.
X1:      VAL         NBCAR*NBLIG/2
X1:      VAL         80-NBCAR/2+X1   < A CAUSE DE CARTE , QUI LIT
                                     < 80 CARACTERES , MEME SUR LA
                                     < DERNIERE LIGNE DE LA PAGE !!!?!?
TAGR:    EQU         PAGE+X1
X50:     VAL         4*LTAGR         < LONGUEUR MOT DE TAGR.
TOP:     EQU         TAGR+X50        < SOMMET DE EDIT.
         PAGE
<
<
<        G E N E R A T I O N  :
<
<
GENERE:  EQU         $
         WORD        '1E16           < APPEL AU CCI ...
         JMP         GENERE          < ET C'EST DEFINITIF ...
         END         GENERE



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