NMPROC:  VAL         "ES"            < NOM DU PROCESSEUR.
         IDP         "ES - RELEASE 01/06/1979"
         EOT         #SIP DEFINITION CMS5#
         EOT         #SIP DEF PROCESSEUR#
         PROG
         WORD        IMAGE           < ENTRY POINT DU GENERATEUR.
         WORD        0
PIMAGE:  EQU         $               < P='12 !!!
         LRP         L
         BR          -2,L            < ENTREE DANS LE PROCESSEUR KO.
         EOT         #SIP DEFINITION ITEM#
ITEM1:   EQU         ZERO+PILE-LTNI
ITEM2:   EQU         ZERO+PILE-LTNI-LTNI
         PAGE
<
<
<        I M A G E S   G R A P H I Q U E   E T   V I D E O  :
<
SIZE:    VAL         '528            < TAILLE PRESUMEE DU PROGRAMME.
<
< PILE DU PROGRAMME :
<
SSTACK:  VAL         40              < IL FAUT CE QU'IL FAUT...
STACK:   DZS         SSTACK
         EOT         #SIP IMAGE 256#
NOM:     EQU         ZERO+PILE+5-LNOM-2  < NOM DE L'IMAGE VIDEO.
IMAG:    EQU         NOM+LNOM+2      < IMAGE VIDEO.
<
< VALIDATION DU FORMAT DE L'IMAGE (CARREE) :
<
X20:     VAL         1024/DY         < NBRE DE LIGNES/IMAGE.
X21:     VAL         CNMPL*16        < NBRE DE POINTS/LIGNE.
         IF          X20-X21,,X100,
         IF          ATTENTION : L'IMAGE N'EST PAS CARREE !!!
X100:    VAL         0
<
< BUFFER DES SECTEURS SCRATCHES :
<
SECTOR:  EQU         STACK+SSTACK
         DZS         128             < CELA PEUT TOUJOURS SERVIR !!!
         PAGE
<
<
<        L O C A L  :
<
<
M16:     BYTE        20;'6D
         ASCI        "PARCOURS EXTERIEUR? "
         LOCAL
LOC:     EQU         $
<
< MESSAGES :
<
M1:      BYTE        8;'6D
         ASCI        "ERREUR!"
M2:      BYTE        13;'6D
         ASCI        "DANS LE VIDE"
M3:      BYTE        13;'6D
         ASCI        "POINT ISOLE!"
M4:      BYTE        8;'6D
         ASCI        "CONCAVE "
M5:      BYTE        8;'6D
         ASCI        "CONVEXE "
M6:      BYTE        3;'6D
         ASCI        "X="
M7:      BYTE        3;'6D
         ASCI        "Y="
M9:      BYTE        5;'6D
         ASCI        "ZDC?"
M10:     BYTE        7;'6D
         ASCI        "DEPART"
M11:     BYTE        8;'6D
         ASCI        "ARRIVEE "
M13:     BYTE        19;'6D
         ASCI        "PASSAGE AU DEPART!"
M14:     BYTE        5;'6D
         ASCI        "PAS="
M15:     BYTE        14;'6D
         ASCI        "VERS LE HAUT? "
AM16:    WORD        M16
NOMSEG:  WORD        0               < 0=INVALIDE,
                                     < -1=VALIDE.
SEG:     DZS         4
LONSEG:  VAL         $-NOMSEG*2
SEGORG:  EQU         SEG+0
SEGEXT:  EQU         SEG+2
CURSOR:  BYTE        "N";0           < CARACTERE DE DEBLOCAGE DU
                                     < CURSEUR (ERREUR A PRIORI).
         DZS         2               < COORDONNEES Y ET X.
REP:     DZS         2               < ENTREE DE NBRES HEXADECIMAUX.
<
< DEMANDES A CMS4 :
<
DEMSGN:  WORD        '0602           < CHARGEMENT DES OVERLAYS.
         WORD        BRANCH-ZERO*2
         WORD        ZERO-BRANCH+PILE-LTNI-LTNI*2
         WORD        -1
DEMCCI:  WORD        '0001           < APPEL DU CCI INTERACTIF.
DEMMEM:  WORD        '0004           < DEMANDE D'ALOCATION 8K MOTS.
RELMEM:  WORD        '0004           < DEMANDE D'ALLOCATION 4K MOTS.
         WORD        '4000
         WORD        '2000
DEMOUT:  WORD        '0202           < ECRITURE DES MESSAGES.
         WORD        0
         WORD        0
DEMIN:   WORD        '0101           < ENTREE SUR '01.
         WORD        REP-ZERO*2
         WORD        4
DEMREP:  WORD        '0101           < LECTURE 1 CARACTERE REPONSE.
         WORD        REP-ZERO*2
         WORD        1
OG:      WORD        '0103           < OPEN GRAPHIQUE DE '01.
CU:      WORD        '0106           < MISE EN FONCTION DU CURSEUR
         WORD        0               < GRAPHIQUE DE '01 (AMDEM=0).
LCU:     WORD        '0109           < LECTURE CURSEUR GRAPHIQUE
         WORD        CURSOR-ZERO*2   < DE '01.
         WORD        6
CG:      WORD        '0104           < CLOSE GRAPHIQUE DE '01.
RDK:     WORD        '0C00           < LECTURE SCRATCH DU DISQUE.
         WORD        SECTOR-ZERO*2
         WORD        128*2
         WORD        0               < NUMERO DU SECTEUR.
WDK:     WORD        '0C02           < ECRITURE SCRATCH DU DISQUE.
         WORD        SECTOR-ZERO*2
         WORD        128*2
         WORD        0               < NUMERO DU SECTEUR.
STOGS:   WORD        '000A           < EMISSION SEGMENT COURANT.
         WORD        NOMSEG-ZERO*2
         WORD        LONSEG
         WORD        'FFC0           < VALIDATION DE LA ZDC.
GETGS:   WORD        '0008           < ACCES NOMSEG COURANT.
         WORD        NOMSEG-ZERO*2
         WORD        SEG-NOMSEG*2
         WORD        'C000
         IF          ORDI-"S",XWOR%,,XWOR%
STABIL:  WORD        '8A01           < STABILISATION IMAGE VIDEO.
         WORD        IMAG-ZERO*2
         WORD        LIMAG*2
         WORD        TVPV            < SUR LE PROCESSEUR VERT.
XWOR%:   VAL         0
<
< CONSTANTES :
<
KIN:     WORD        -1              < COMPTEUR DES ENTRIES DANS KO.
NGE:     WORD        "GE"            < NOM DU PROCESSEUR GE.
         IF          ORDI-"T",XWOR%,,XWOR%
ACNSYS:  ASCI        ":SYS"
XWOR%:   VAL         0
IGRAPH:  WORD        1               < 0=EMISSION GRAPHIQUE,
                                     < 1=PAS D'EMISSION GRAPHIQUE.
IEXT:    WORD        0               < 0 : PARCOURS A L'EXTERIEUR DES
                                     <     POINTS DE L'IMAGE,
                                     < 1 : PARCOURS SUR LES POINTS
                                     <     DE LA FRONTIERE (CF. EZ).
BDEP:    WORD        0               < TRANSLATION POINT DE DEPART,
BARRIV:  WORD        0               < TRANSLATION POINT D'ARRIVEE.
NMOTS:   WORD        2*LTNI          < NBRE DE MOTS DE ITEM1+ITEM2.
ALIMAG:  WORD        LIMAG           < NBRE DE MOTS DE L'IMAGE.
NMPL:    WORD        CNMPL           < NBRE MOTS DE 16 BITS PAR LIGNE.
NLIG:    WORD        1024/DY-1       < NBRE DE LIGNES/IMAGE-1.
NPPL:    WORD        CNMPL*16-1      < NBRE DE POINTS/LIGNE-1.
YMIN:    WORD        0               < DERNIERE LIGNE A TESTER LORS
                                     < DES BALAYAGES DE L'IMAGE
                                     < POUR ELIMINER LES POINTS
                                     < 0-ISOLES ET 1-ISOLES.
YMAX:    WORD        0               < DE MEME : PREMIERE LIGNE...
ITEST:   WORD        1               < 0 : TEST SUR LA VALEUR 0 DES POINTS,
                                     < 1 : TEST SUR VALEUR 1 DES POINTS.
X:       VAL         1               < COORDONNEE X D'UN POINT.
Y:       VAL         0               < COORDONNEE Y D'UN POINT.
DEP:     WORD        0;0             < POINT DE DEPART D'UN CONTOUR.
ARRIV:   WORD        0;0             < POINT D'ARRIVEE D'UN CONTOUR.
PTC:     WORD        0;0             < POINT COURANT LORS D'UN PARCOURS.
SUC:     WORD        0;0             < SUCCESSEUR DU POINT COURANT (X,Y).
NREMPL:  WORD        0               < NOMBRE DE REMPLACANTS ATTEN-
                                     < DUS POUR LE POINT COURANT.
REMP:    WORD        0;0             < FUTUR REMPLACANT DU POINT
                                     < COURANT SUR LE CONTOUR LORS DE
                                     < SON PARCOURS.
NPILR:   WORD        0               < NBRE DE POINTS A DEPILER
                                     < DE LA PILE 'PILR'.
APILR:   WORD        0               < REALI COURANT VERS PILR.
PILR:    DZS         4*2             < POUR EMPILER M1, M2, M3, PTC.
SDEP:    WORD        0;0             < POINT DE DEPART POUR LE TOUR
                                     < SUIVANT (FUTUR 'DEP').
POINT1:  WORD        0;0             < CONTIENT UN POINT QUE L'ON SAIT
                                     < SAIT ETRE A 1 LORS DE LA
                                     < RECHERCHE DES VOISINS.
VX:      WORD        1               < COORDONNEES X ET Y DU
VY:      WORD        0               < VECTEUR DEPLACEMENT.
SVX:     WORD        0               < SAVE VX.
SVY:     WORD        0               < SAVE VY.
         IF          ORDI-"T",XWOR%,,XWOR%
TEMPO:   WORD        '400*2          < TEMPO DE CLIGNOTEMENT VIDEO.
XWOR%:   VAL         0
         IF          ORDI-"S",XWOR%,,XWOR%
TEMPO:   WORD        5*2             < NOMBRE DE CLIGNOTEMENTS VIDEO.
XWOR%:   VAL         0
KOMPT:   WORD        0               < COMPTEUR DES POINTS MIS A 1,
                                     < LORS D'UN PARCOURS DE REM-
                                     < PLISSAGE.
NISOL:   WORD        0               < NOMBRE DE POINTS ISOLES,
                                     < OU SIMPLEMENT RATTACHES
                                     < RECONTRES AVANT CHAQUE
                                     < PARCOURS.
INDIC:   WORD        0               < RESULTAT (0/1) DES TESTS
                                     < VIRTUELS.
ANGLE:   WORD        0               < SOMMATION DES ROTATIONS
                                     < PARTIELLES 'ROT1' ET 'ROT3' :
                                     < +1 : +PI/2 (ROT1),
                                     < -1 : -PI/2 (ROT3).
SANGLE:  WORD        0               < SAUVEGARDE TEMPORAIRE DE
                                     < L'ANGLE COURANT LORS DES
                                     < RECHERCHES DE VOISINS.
PREM:    WORD        1               < 1 : 1ER POINT DE L'IMAGE
                                     < NON ENCORE RENCONTRE,
                                     < 0 SINON.
KSEG:    WORD        0               < COMPTEUR COURANT DES SEGMENTS.
NSEG:    WORD        0               < N'EMETTRE QU'UN SEGMENT SUR 'NSEG'.
SAVEY:   WORD        0               < SAVE Y(DEP) OU Y(ARRIV).
<
< RELAIS DIVERS :
<
ANOM1:   WORD        NOM+0           < POUR METTRE LE NOM I1/I2,
ANOM2:   WORD        NOM+1           < POUR METTRE L'IDESC/EOT.
ASECT:   WORD        SECTOR-1,X      < RELAI DE RAZ BUFFER SECTEUR.
AIMAG1:  WORD        IMAG,X          < ACCES A L'IMAGE VIDEO COURANTE.
AIMAG0:  WORD        0               < POUR METTRE LES SECTEURS
                                     < SCRATCH DANS L'IMAGE COURANTE.
ASECT1:  WORD        SECTOR,X        < ACCES AU SECTEUR COURANT.
AIMAG:   WORD        IMAG-1,X        < RELAI DE RAZ IMAGE COURANTE.
AREP:    WORD        REP,X           < RELAI D'ACCES AUX REPONSES.
ASET:    WORD        SET             < MISE D'UN POINT A 1.
ARESET:  WORD        RESET           < MISE D'UN POINT A 0.
AINVER:  WORD        INVER           < INVERSION D'UN POINT.
ACLIGN:  WORD        CLIGN           < CLIGNOTEMENT DES POINTS VIDEO.
ATEST:   WORD        TEST            < TEST DE L'ETAT D'UN POINT.
ASETV:   WORD        SETV            < MISE D'UN POINT VIRTUEL A 1.
ARSETV:  WORD        RSETV           < MISE D'UN POINT VIRTUEL A 0.
AINVEV:  WORD        INVEV           < INVERSION D'UN POINT VIRTUEL.
ATESTV:  WORD        TESTV           < TEST D'UN POINT VIRTUEL.
AXISTV:  WORD        XISTV           < EXISTENCE VIRTUELLE...
APS:     WORD        PS              < SBT.
APR:     WORD        PR              < RBT.
API:     WORD        PI              < IBT.
APT:     WORD        PT              < TBT.
AOP:     WORD        0               < PS/PR/PI/PT SUIVANT LES BESOINS.
AOVL:    WORD        OVL             < CHARGEMENT DES OVERLAYS.
AEXIST:  WORD        EXIST           < EXISTENCE D'UN POINT.
AVOISI:  WORD        VOISI           < TEST ET COMPTAGE D'UN VOISIN.
APILE:   WORD        PILE-1          < PILE DE SMC.
ASTACK:  WORD        STACK-1         < PILE DE KO.
AI2:     WORD        ITEM2-1,X       < RELAI DE RAZ ITEM1+ITEM2.
         IF          ORDI-"T",XWOR%,,XWOR%
ASP3:    WORD        SP3             < STABILISATION IMAGE VIDEO
                                     < SI :SYS, 0 SINON.
XWOR%:   VAL         0
ASEND:   WORD        SEND            < EMISSION SEGMENT COURANT
                                     < ET ATTENTE D'ACQUITTEMENT.
ASENDO:  WORD        SENDO           < INSERTION POINT DE DEPART.
AGOGE:   WORD        GOGE            < RETOUR A GE.
APRINT:  WORD        PRINT           < EDITION DES MESSAGES.
AHEX:    WORD        HEX             < CONVERSION ASCI --> BINAIRE.
ACOORD:  WORD        COORD           < ENTREE COORDONNE X/Y.
ACURS:   WORD        CURS            < ENTREE CURSEUR GRAPHIQUE.
AMOV:    WORD        MOV             < DEPLACEMENT PAR (VX,VY).
AROT1:   WORD        ROT1            < ROTATION DE +PI/2.
AROT3:   WORD        ROT3            < ROTATION DE -PI/2.
ASAVDP:  WORD        SAVDEP          < SAUVEGARDE DU SUCCESSEUR DU
                                     < POINT COURANT.
AREMPL:  WORD        REMPL           < SAUVEGARDE D'UN REMPLACANT
                                     < POSSIBLE DU POINT COURANT.
ASPILR:  WORD        SPILR           < RANGEMENT DE (X,Y) DANS PILR.
ASUCC:   WORD        SUCC            < RECHERCHE D'UN SUCCESSEUR
                                     < POSSIBLE DU POINT COURANT.
ACONTI:  WORD        CONTI           < RETOUR DE LA ZONE SCRATCH
                                     < EN MEMOIRE.
ARAZDK:  WORD        RAZDK           < RAZ DE LA ZONE SCRATCH DK.
<
< TOPOGRAPHIE MEMOIRE :
<
NSEC:    VAL         LIMAG/128       < NRE DE SECTEURS POUR UNE IMAGE.
XSECR:   VAL         2*LTNI-128
NSECR:   VAL         XSECR/128
                                     < NBRE DE SECTEURS RESIDANTS.
ALS:     WORD        LSECT-1,X       < RELAI D'INITIALISATION DE
                                     < LA LISTE LSECT.
ALSECT:  WORD        LSECT,X         < REALI D'ACCES A LSECT.
ATOPO:   WORD        TOPO-1,X        < RELAI D'ACCES A TOPO.
ASECTC:  WORD        0               < RELAI COURANT D'ACCES A UN
                                     < SECTEUR MANIPULE.
AUSE:    WORD        USE-1,X         < RELAI D'ACCES A USE.
INFINI:  WORD        '7FFF
CSECT:   WORD        0               < MEMORISE LE SECTEUR COURANT.
WDKT:    WORD        '0C02           < ECRITURE 1 SECTEUR TOPO.
         WORD        0
         WORD        128*2
         WORD        0
RDKT:    WORD        '0C00           < LECTURE 1 SECTEUR TOPO.
         WORD        0
         WORD        128*2
         WORD        0
ABUF1:   WORD        PILE-XSECR/128*128*2
                                     < @OCTET DU 1ER BUFFER LIBRE.
AWSE:    WORD        WSE             < ROUTINE DE REECRITURE
                                     < D'UN SECTEUR TOPO.
AVIRE:   WORD        VIRE            < ROUTINE SUPPRIMANT LA TOPO.
ARESID:  WORD        RESID           < REND LE SECTEUR SCRATCH (B)
                                     < RESIDENT EN MEMOIRE.
<
< LISTE DES SECTEURS REELS (DE 0 A NSEC-1) :
<
LSECT:   EQU         $
         DO          NSEC
         WORD        -1              < INITIALEMENT NON RESIDENT.
<
< LISTE D'OCCUPATION DES BUFFERS (DE 1 A NSECR) :
<
TOPO:    EQU         $
         DO          NSECR
         WORD        -1              < INOCCUPE INITIALEMENT.
<
< COMPTEUR D'USAGE DES BUFFERS :
<
USE:     EQU         $
         DO          NSECR
         WORD        0               < INUTILISE INITIALEMENT.
         PAGE
         PROG
<
<
<        E D I T I O N   D ' U N   M E S S A G E  :
<
<
<        ARGUMENT :
<                    A=@MESSAGE.
<
<
PRINT:   EQU         $
         PSR         C,X
         LR          A,C             < C=@MESSAGE.
         ADR         A,A
         ADRI        1,A             < A=@OCTET DU MESSAGE.
         STA         DEMOUT+1
         LBY         0,C             < A=LONGUEUR DU MESSAGE.
         STA         DEMOUT+2
         LAD         DEMOUT
         SVC         0               < EDITION DU MESSAGE.
         PLR         C,X
         RSR
         PAGE
<
<
<        E M I S S I O N   S E G M E N T   C O U R A N T  :
<
<
<        FONCTION :
<                      CETTE ROUTINE EMET, SI CELA A ETE
<                    DEMANDE PAR L'UTILISATEUR LE SEGMENT
<                    COURANT A L'AIDE DE LA ZDC, ET ATTEND
<                    L'ACCUSE DE RECEPTION...
<
<
<        ARGUMENT :
<                    X,Y=COORDONNEES DU POINT COURANT (SEGEXT).
<
<
SEND:    EQU         $
         CPZ         IGRAPH          < GRAPHIQUE DEMANDE ???
         JNE         SEND1           < NON, RIEN A FAIRE.
         DC          KSEG            < LE MOMENT EST-IL VENU D'EMETTRE ???
         JG          SEND1           < NON...
         LA          NSEG            < OUI, ON REINITIALISE
         STA         KSEG            < LE COMPTEUR.
<
< GENERATION DE LA NOUVELLE SEGEXT :
<
         LA          SEGEXT+X
         STA         SEGORG+X
         LA          SEGEXT+Y
         STA         SEGORG+Y
         LR          Y,A             < Y COURANT,
         SB          NLIG            < LES AXES GRAPHIQUES ET
         NGR         A,A             < VIDEOS SONT INVERSES.
         SLLS        DEDY
         STA         SEGEXT+Y
         LR          X,A             < X COURANT,
         SLLS        DEDX            < ET CADRAGE.
         STA         SEGEXT+X
         OR          SEGEXT+Y
         OR          SEGORG+X
         OR          SEGORG+Y        < EST-CE UN 'OAB' ???
         JAE         SEND3           < OUI, IL FAUT L'EMETTRE...
         LA          SEGEXT+X        < NON, ALORS ORG=EXT ???
         CP          SEGORG+X        < ORG=EXT ??? (PREVU A
                                     < CAUSE DE GOGE, QUI EMET A
                                     < PRIORI 'ARRIV').
         JNE         SEND3           < NON, ON EMET...
         LA          SEGEXT+Y        < ORG=EXT ???
         CP          SEGORG+Y
         JE          SEND1           < OUI, ON N'EMET PAS...
SEND3:   EQU         $
         PSR         X               < A CAUSE DES SVC A SUIVRE.
<
< EMISSION DU SEGMENT COURANT :
<
SEND2:   EQU         $
         LAD         GETGS
         SVC         0               < ACCES A LA VALIDATION COURANTE.
         CPZ         NOMSEG
         JNE         SEND2           < SEGMENT PRECEDENT NON ENCORE
                                     < ACQUITTE, ON ATTEND !!!
         DC          NOMSEG          < OK, NOMSEG=-1.

         LAD         STOGS
         SVC         0               < EMISSION SEGMENT COURANT.
         PLR         X               < RESTAURE X.
SEND1:   EQU         $
         RSR
<
<
<        I N S E R T I O N   P O I N T   D E   D E P A R T  :
<
<
SENDO:   EQU         $
         CPZ         IGRAPH          < GRAPHIQUE DEMANDE ???
         JNE         SENDO1          < NON...
         LA          NSEG            < INITIALISATION DU
         STA         KSEG            < DECOMPTEUR.
         LR          Y,A             < OUI, CONVERSION VIDEO
         SB          NLIG            < GRAPHIQUE DES COORDONNEES
         NGR         A,A             < DU POINT DE DEPART (X,Y).
         SLLS        DEDY
         STA         SEGEXT+Y
         LR          X,A
         SLLS        DEDX
         STA         SEGEXT+X
SENDO1:  EQU         $
         RSR
         PAGE
<
<
<        R O T A T I O N   D E   ( VX , VY )  :
<
<
<        FONCTION :
<                      CES 2 ROUTINES MULTIPLIENT LE NBRE
<                    COMPLEXE (VX,VY) PAR LES NOMBRES
<                    COMPLEXES I=(0,1) ET -I=(0,-1)
<                    RESPECTIVEMENT.
<
<
ROT1:    EQU         $
         IC          ANGLE           < ROTATION DE +PI/2.
         PSR         A,B
         LA          VX
         LB          VY
         NGR         B,B
ROT:     EQU         $
         STB         VX
         STA         VY
         PLR         A,B
         RSR
ROT3:    EQU         $
         DC          ANGLE           < ROTATION DE -PI/2.
         PSR         A,B
         LA          VX
         LB          VY
         NGR         A,A
         JMP         ROT             < VERS VX<--(B), VY<--(A).
<
<
<        D E P L A C E M E N T   D U   P O I N T   C O U R A N T  :
<
<
<        FONCTION :
<                      CETTE ROUTINE DEPLACE LE POINT
<                    COURANT (X,Y) A L'AIDE DU VECTEUR
<                    DEPLACEMENT (VX,VY).
<
<
<        ARGUMENT :
<                    X ET Y = L'X ET L'Y DU POINT.
<
<
MOV:     EQU         $
         PSR         A,B
         LA          VX
         LB          VY
         ADR         A,X             < X <-- X+VX.
         ADR         B,Y             < Y <-- Y+VY.
         PLR         A,B
         RSR
         PAGE
<
<
<        S A U V E G A R D E   D U   D E P L A C E M E N T
<                    F U T U R  :
<
<
<        FONCTION :
<                      CETTE ROUTINE SAUVEGARDE LE POINT
<                    (X,Y) EN TANT QUE FUTUR DEPLACEMENT,
<                    LE VECTEUR (VX,VY), FAIT UN RETOUR AU
<                    POINT COURANT PTC, ET INITIALISE
<                    UN COMPTEUR DE REMPLACANTS (B).
<
<
<        ARGUMENT :
<                    X,Y = POINT FUTUR.
<                    A=NBRE DE REMPLACANTS ATTENDUS POUR LE PTC.
<
<
<        RESULTAT :
<                    B=0.
<
<
SAVDEP:  EQU         $
         STA         NREMPL          < NOMBRE DE REMPLACANTS
                                     < ATTENDUS POUR LE POINT COURANT.
         STX         SUC+X           < SAUVEGARDE DU SUCCESEUR
         STY         SUC+Y           < DU POINT COURANT.
         LA          VX
         STA         SVX             < SAUVEGARDE DU VECTEUR
         LA          VY              < DEPLACEMENT MENANT AU
         STA         SVY             < SUCCESSEUR 'SUC'.
         LX          PTC+X           < ET RETOUR AU POINT
         LY          PTC+Y           < COURANT.
         LBI         0               < INITIALISATION DU COMPTEUR.
         RSR
<
<
<        M A R Q U A G E   D ' U N   R E M P L A C A N T
<                    A   G A U C H E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE REGARDE A GAUCHE
<                    DU POINT (X,Y) ARGUMENT (SUIVANT
<                    LE SENS DU VECTEUR (VX,VY)); SI
<                    LE POINT AINSI VU EST A 0, IL EST
<                    MARQUE VIRTUELLEMENT A 1.
<
<
<        ARGUMENT :
<                    X,Y = UN POINT.
<
<
<        RESULTAT :
<                    B <-- (B)+1 SI UN REMPLACANT A ETE TROUVE,
<                    DE MEME POUR 'KOMPT'.
<
<
REMPL:   EQU         $
         BSR         AROT3           < ON REGARDE A GAUCHE,
         BSR         AMOV            < ET ON SE DEPLACE DANS CETTE
                                     < DIRECTION.
         STZ         ITEST           < POUR LA RECHERCHE DE POINTS A 0.
         BSR         AXISTV          < TEST VIRTUEL DU POINT VU
                                     < A GAUCHE.
         JANE        REMPL1          < N'EXISTE PAS, OU EST A 1.
<
< CAS OU UN REMPLACANT A GAUCHE A ETE TROUVE :
<
         BSR         AEXIST          < EST-IL A 1 SUR LE CONTOUR
                                     < COURANT ???
         JANE        REMPL2          < OUI, ON NE LE COMPTE DONC PAS !!!
         IC          KOMPT           < COMPTAGE GLOBAL (AU COURS
                                     < DE CE TOUR) DE CELUI-CI,
REMPL2:  EQU         $
         ADRI        1,B             < ET COMPTAGE LOCAL (RELATIVE-
                                     < MENT AU POINT COURANT PTC).
         BSR         ASPILR          < EMPILEMENT DE (X,Y).
         STX         REMP+X          < ET ENFIN, ON LE SAUVEGARDE
         STY         REMP+Y          < NON RECURSIVEMENT.
REMPL1:  EQU         $
         RSR
<
<
<        E M P I L E M E N T   D A N S   P I L R  :
<
<
<        ARGUMENT :
<                    X,Y= POINT A EMPILER.
<
<
SPILR:   EQU         $
         STX         &APILR
         IC          APILR           < PROGRESSION POINTEUR DE PILR.
         STY         &APILR
         IC          APILR           < PROGRESSION POINTEUR DE PILR.
         RSR
<
<
<        R E C H E R C H E   D ' U N   S U C C E S S E U R
<        D E   L A   D R O I T E   V E R S   L A   G A U C H E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE TOURNE DE LA
<                    DROITE VERS LA GAUCHE AUTOUR
<                    DU POINT COURANT, ET TESTE
<                    SI LE POINT AINSI VU EXISTE
<                    ET EST A 1.
<
<
SUCC:    EQU         $
         LX          PTC+X           < ON SE REPLACE SUR LE
         LY          PTC+Y           < POINT COURANT PTC.
         BSR         AROT3           < ROTATION VERS LA GAUCHE.
         BSR         AMOV            < ET DEPLACEMENT VERS LA
                                     < GAUCHE.
         STZ         ITEST
         IC          ITEST           < POUR TESTER DES POINTS A 1.
         BSR         AEXIST          < TEST DU POINT VU A GAUCHE.
         RSR
         PAGE
<
<
<        R O U T I N E   D E   C R E A T I O N
<        D ' I M A G E S   V I R T U E L L E S  :
<
<
<        ARGUMENT :
<                    X=X DU POINT A TRAITER,
<                    Y=Y DU POINT A TRAITER.
<
<
<        RESULTAT :
<                    LE CARY EST POSITIONNE POUR 'TESTV', DE
<                    PLUS, LE SECTEUR COURANT PEUT CHANGER...
<
<
PS:      EQU         $
         SBT         0,X
         RSR
PR:      EQU         $
         RBT         0,X
         RSR
PI:      EQU         $
         IBT         0,X
         RSR
PT:      EQU         $
         CPZ         ITEST           < TEST DU MODE 0/1 DE TEST.
         JNE         PT1             < MODE 1.
         IBT         0,X             < MODE 0.
PT1:     EQU         $
         TBT         0,X
         LAI         1               < A EST DESTRUCTIBLE !!!
         SBCR        A               < CALCUL DU RESULTAT,
         STA         INDIC           < ET TRANSMISSION A 'EXISTV'.
         RSR
<
<        A C C E S   I M A G E   V I R T U E L L E  :
<
SETV:    EQU         $
         BSR         ASEND           < EMISSION POSSIBLE DU
                                     < SEGMENT COURANT.
         LA          APS             < SBT.
         JMP         VIRT
RSETV:   EQU         $
         LA          APR             < RBT.
         JMP         VIRT
TESTV:   EQU         $
         LA          APT             < TBT.
         JMP         VIRT
INVEV:   EQU         $
         LA          API
VIRT:    EQU         $
         STA         AOP             < MISE EN PLACE DE LA ROUTINE
                                     < VARIABLE...
         PSR         B,X,Y
         LR          Y,A
         MP          NMPL            < B=NUMERO 1ER MOT DE LA LIGNE
                                     < CONTENANT LE POINT ARGUMENT.
         LR          X,A
         SLRS        4
         ADR         A,B             < B=NUMERO DU MOT CONTENANT
                                     < LE POINT ARGUMENT.
         LAI         '0F
         ANDR        A,X             < X=NUMERO DU BIT REPRESENTANT
                                     < LE POINT ARGUMENT DANS LE
                                     < MOT (B).
         LR          B,A
         SLRD        7               < A=NUMERO DU SECTEUR LE CONTENANT.
         XR          A,B             < B=NUMERO DU SECTEUR.
         SLRS        9               < A=NUMERO DU MOT DANS LE SECTEUR.
         LR          A,Y             < Y=NUMERO DU MOT DANS LE SECTEUR.
         BSR         ARESID          < REND LE SECTEUR (B) RESIDENT.
         XR          X,Y             < X=NUMERO MOT, Y=NUMERO BIT.
         LA          &ASECTC         < ACCES MOT.
         XR          X,Y             < X=NUMERO BIT, Y=NUMERO MOT.
         BSR         AOP             < EXECUTION OPERATION SPECIFIQUE.
         XR          X,Y             < X=NUMERO MOT, Y=NUMERO BIT.
         LB          AOP             < ACCES A LA FONCTION DEMANDEE.
         XR          A,B
         CP          APT             < EST-CE LE TEST VIRTUEL ???
         XR          A,B
         JE          VIRT3           < OUI, DONC PAS DE MISE A JOUR
                                     < DE L'IMAGE VIRTUELLE...
         STA         &ASECTC         < MAJ IMAGE VIRTUELLE.
VIRT3:   EQU         $
         PLR         B,X,Y
         RSR
<
<
<        R E S I D E N C E   D ' U N   S E C T E U R  :
<
<
<        ARGUMENT :
<                    B=NUMERO DU SECTEUR A RENDRE RESIDENT.
<
<
RESID:   EQU         $
         PSR         X,Y
         LR          B,X             < X=SECTEUR REFERENCE.
         LA          &ALSECT
         JAG         VIRT1           < LE SECTEUR REFERENCE EST DEJA
                                     < RESIDENT A L'ADRESSE=(A).
<
< CAS OU LE SECTEUR REFERENCE (X) N'EST PAS RESIDENT :
<
         STX         CSECT           < SAUVEGARDE DE (X).
         LXI         NSECR
         LA          INFINI          < RECHERCHE D'UN BUFFER.
VIRT2:   EQU         $
         CPZ         &ATOPO          < LE BUFFER COURANT EST-IL
                                     < LIBRE ???
         JGE         VIRT4           < OUI, PAR LE SECTEUR (A).
         LR          X,Y             < NON, (Y)=BUFFER CHOISI.
         JMP         VIRT5
VIRT4:   EQU         $
         CP          &AUSE           < EST-IL PEU UTILISE ???
         JL          VIRT6           < NON, ON LE LAISSE...
         LA          &AUSE           < NON, IL DEVIENT LE MINI.
         LR          X,Y             < PEUT-ETRE SERA-T'IL ELU..
VIRT6:   EQU         $
         JDX         VIRT2
<
< OK, ON A TROUVE UN BUFFER (Y)PEU OU PAS UTILISE :
<
VIRT5:   EQU         $
         LR          Y,X             < X=NUMERO DE BUFFER/1.
         BSR         AWSE            < REECRITURE DU SECTEUR TOPO
                                     < ASSOCIE PAR 'TOPO' AU
                                     < BUFFER (X).
         LX          CSECT           < X=SECTEUR A CHARGER.
         LA          WDKT+1          < A=@OCTET DU BUFFER LIBERE.
         STA         RDKT+1          < C'EST LA QU'ON VA LIRE (X).
         SLRS        1               < A=@MOT DU BUFFER.
         STA         &ALSECT         < LE SECTEUR (X) SERA RESIDENT
                                     < A L'ADRESSE (A).
         STX         RDKT+3
         XR          X,Y             < Y=SECTEUR A CHARGER,
                                     < X=NUMERO DU BUFFER.
         STY         &ATOPO          < ON MEMORISE LE NUMERO
                                     < DU SECTEUR (Y) ASSOCIE
                                     < AU BUFFER (X).
         XR          X,Y             < X=SECTEUR A CHARGER,
                                     < Y=NUMERO DU BUFFER.
         LAD         RDKT
         SVC         0               < CHARGEMENT DU SECTEUR.
         LX          CSECT
         LA          &ALSECT         < A=@MOT DU BUFFER.
VIRT1:   EQU         $
         SBT         0               < BIT D'INDEX.
         STA         ASECTC          < GENERATION D'UN RELAI D'ACCES
                                     < TEMPORAIRE AU SECTEUR (X).
         SLLS        1               < CONVERSION EN UNE ADRESSE
                                     < D'OCTET.
         SB          ABUF1
         SLRS        8
         ADRI        1,A             < A=NUMERO DU BUFFER LE CONTENANT.
         LR          A,X
         IC          &AUSE           < COMPTAGE DES UTILISATIONS.
         PLR         X,Y
         RSR
<
<
<        R E E C R I T U R E   D ' U N   B U F F E R  :
<
<
<        ARGUMENT :
<                    X=NUMERO DE CE BUFFER.
<
<
WSE:     EQU         $
         LR          X,A
         ADRI        -1,A
         SLLS        8
         AD          ABUF1
         STA         WDKT+1          < @OCTET DU BUFFER.
         LA          &ATOPO          < A=SECTEUR ASSOCIE.
         JAL         WSE1            < IL N'EXISTE PAS...
         PSR         X
         STA         WDKT+3          < SI EXISTE MAJ DE WDKT.
         LAD         WDKT
         SVC         0               < REECRITURE DU SECTEUR.
         LX          WDKT+3          < X=SECTEUR ASSOCIE.
         LAI         -1
         STA         &ALSECT         < LE SECTEUR ASSOCIE N'EST
                                     < PLUS RESIDENT.
         PLR         X               < RESTAURE : X=NUMERO BUFFER.
         STA         &ATOPO          < LE BUFFER EST LIBRE.
         STZ         &AUSE           < ET NON UTILISE...
WSE1:    EQU         $
         RSR
<
<
<        R E E C R I T U R E   D E   T O U S   L E S
<        B U F F E R S   E N   S C R A T C H  :
<
<
VIRE:    EQU         $
         PSR         X
         LXI         NSECR           < X=NBRE DE BUFFERS.
VIRE1:   EQU         $
         BSR         AWSE            < ECRITURE DU BUFFER (X).
         JDX         VIRE1
         PLR         X
         RSR
         PAGE
<
<
<        R E T O U R   D E   L A   Z O N E   S C R A T C H
<        E N   M E M O I R E   I M A G E  :
<
<
CONTI:   EQU         $
         STZ         RDK+3           < DEPART SUR LE SECTEUR 0.
         LA          AIMAG1
         RBT         0
         STA         AIMAG0          < INITIALISATION SUR @IMAG.
         LXI         LIMAG/128       < X=NBRE DE SECTEURS.
ECH1:    EQU         $
         PSR         X
         LB          RDK+3           < B=NUMERO DU SECTEUR COURANT.
         BSR         ARESID          < QUE L'ON REND RESIDENT.
         LX          RDK+3
         LA          &ALSECT         < A=@BUFFER QUI LE CONTIENT.
         JAG         ECH2            < OK, IL EST OCCUPE...
         WORD        '1E16           < E R R E U R   P R O G  !!!
ECH2:    EQU         $
         LXI         128             < X=NBRE DE MOTS/SECTEUR.
         LB          AIMAG0          < B=@RECEPTEUR=@IMAGE.
         MOVE                        < GENERATION IMAGE.
         LXI         128             < X=NBRE DE MOTS/SECTEUR.
         ADR         X,B             < PROGRESSION @IMAGE.
         STB         AIMAG0
         IC          RDK+3           < PASSAGE AU SECTEUR SUIVANT.
         PLR         X
         JDX         ECH1
         RSR
<
<
<        R A Z   D E   L A   Z O N E   S C R A T C H  :
<
<
RAZDK:   EQU         $
         STZ         WDK+3           < DEPART SUR LE SECTEUR 0.
         LXI         128
RAZ1:    EQU         $
         STZ         &ASECT          < RAZ DU BUFFER SECTOR.
         JDX         RAZ1
         LXI         LIMAG/128       < NBRE DE BUFFERS SCRATCH
                                     < NECESSAIRE POUR 1 IMAGE.
RAZ2:    EQU         $
         PSR         X               < SAVE LE DECOMPTEUR.
         LB          WDK+3           < B=NUMERO DU SECTEUR COURANT.
         BSR         ARESID          < QUE L'ON REND RESIDENT.
         LX          WDK+3
         LB          &ALSECT         < B=RECEPTEUR=@BUFFER ASSOCIE.
         CPZR        B               < VALIDATION...
         JG          RAZ3            < OK, IL EST OCCUPE..
         WORD        '1E16           < E R R E U R   P R O G  !!
RAZ3:    EQU         $
         LA          ASECT1
         RBT         0               < A=@EMETTEUR DES '0000.
         LXI         128             < X=NBRE DE MOTS A RAZER.
         MOVE                        < RAZ DU SECTEUR COURANT.
         PLR         X               < RESTAURE LE DECOMPTEUR.
         IC          WDK+3           < PASSGE AU SECTEUR SUIVANT.
         JDX         RAZ2            < DECOMPTAGE..
         RSR
         PAGE
<
<
<        M I S E   D ' U N   B I T   A   1  :
<
<
<        ARGUMENTS :
<                    X ET Y CONTIENNENT X ET Y DU POINT.
<                    C=@IMAG (IMAGE VIDEO).
<
<
SET:     EQU         $
         PSR         B,X,C
         LR          Y,A
         MP          NMPL            < CONVERSION DE L'Y DU POINT EN
                                     < UN NUMERO DE MOT.
         ADR         B,C
         LR          X,A
         SLRS        4
         ADR         A,C             < C=@MOT CONTENANT LE POINT (X,Y).
         LAI         'F
         ANDR        A,X             < CALCUL DE X MODULO 16 ;
                                     < X=NUMERO DU BIT DANS LE MOT.
         LA          0,C             < A=MOT CONTENANT LE POINT (X,Y).
         SBT         0,X             < POSITIONNEMENT DU POINT.
         STA         0,C             < MISE A JOUR DE CE MOT.
         PLR         B,X,C
         RSR
<
<
<        E F F A C E M E N T   D ' U N   P O I N T  :
<
<
<        ARGUMENTS :
<                    X ET Y CONTIENNENT X ET Y DU POINT.
<                    C=@IMAG (IMAGE VIDEO).
<
<
RESET:   EQU         $
         PSR         B,X,C
         LR          Y,A
         MP          NMPL
         ADR         B,C
         LR          X,A
         SLRS        4
         ADR         A,C             < C=@MOT CONTENANT LE POINT (X,Y).
         LAI         'F
         ANDR        A,X             < X=NUMERO DU BIT REPRESENTANT
                                     < LE POINT DANS LE MOT ((C)).
         LA          0,C             < A=MOT CONTENANT LE POINT (X,Y).
         RBT         0,X             < EFFACEMENT DU POINT.
         STA         0,C             < MISE A JOUR DE CE MOT.
         PLR         B,X,C
         RSR
<
<
<        I N V E R S I O N   V I D E O   U N   P O I N T  :
<
<
<        ARGUMENT :
<                    X ET Y CONTIENNENT X ET Y DU POINT A INVERSER.
<                    C=@IMAG (IMAGE VIDEO).
<
<
INVER:   EQU         $
         PSR         B,X,C
         LR          Y,A
         MP          NMPL
         ADR         B,C
         LR          X,A
         SLRS        4
         ADR         A,C             < C=@MOT CONTENANT LE POINT (X,Y).
         LAI         'F
         ANDR        A,X             < X=NUMERO DU BIT REPRESENTANT
                                     < LE POINT DANS LE MOT ((C)).
         LA          0,C             < A=MOT CONTENANT LE POINT (X,Y).
         IBT         0,X             < INVERSION VIDEO DU POINT.
         STA         0,C             < MISE A JOUR DE CE MOT.
         PLR         B,X,C
         RSR
<
<
<        C L I G N O T E M E N T   D ' U N   P O I N T  :
<
<
CLIGN:   EQU         $
         IF          ORDI-"T",XWOR%,,XWOR%
         PSR         B
XWOR%:   VAL         0
         IF          ORDI-"S",XWOR%,,XWOR%
         PSR         A,B
XWOR%:   VAL         0
         LB          TEMPO           < B=NBRE DE CLIGNOTEMENTS.
CLIGN1:  EQU         $
         BSR         AINVER          < INVERSION DU POINT (X,Y).
         IF          ORDI-"S",XWOR%,,XWOR%
         PSR         X
         LAD         STABIL          < STABILISATION IMAGE VIDEO.
         SVC         0
         PLR         X
XWOR%:   VAL         0
         ADRI        -1,B            < DECOMPTAGE.
         CPZR        B               < EST-CE FINI ???
         JG          CLIGN1          < NON.
         IF          ORDI-"T",XWOR%,,XWOR%
         PLR         B               < OUI.
XWOR%:   VAL         0
         IF          ORDI-"S",XWOR%,,XWOR%
         PLR         A,B
XWOR%:   VAL         0
         RSR
<
<
<        T E S T   D ' U N   P O I N T  :
<
<
<        FONCTION DE ITEST :
<                    ITEST=0 : CARY=1 SI POINT=0 ,
<                         =1 : CARY=1 SI POINT=1.
<
<
<        ARGUMENTS :
<                    X ET Y CONTIENNENT L'X ET L'Y DU POINT ,
<                    C=@IMAG.
<
<
<        RESULTAT :
<                    CARY POISITIONNE PAR LE POINT (0/1) 9
<
<
TEST:    EQU         $
         PSR         B,X,C
         LR          Y,A             < A=COORDONNEE Y DU POINT.
         MP          NMPL
         ADR         B,C
         LR          X,A             < A=COORDONNEE X DU POINT.
         SLRS        4
         ADR         A,C             < C#MOT CONTENANT LE POINT (X,Y).
         LAI         'F
         ANDR        A,X             < X=NUMERO DU POINT DANS LE MOT (C)
         LA          0,C
         CPZ         ITEST           < TEST DE LA VALEUR LOGIQUE DU
                                     < POINT.
         JNE         E1022           < CONVENTION NORMALE (1).
         IBT         0,X             < CAS DES CONVENTIONS INVERSEES (1)
E1022:   EQU         $
         TBT         0,X             < TEST DU POINT.
         PLR         B,X,C
         RSR
         PAGE
<
<
<        C O M P T A G E   D ' U N   V O I S I N  :
<
<
<        FONCTION :
<                      CETTE ROUTINE INCREMENT B D'UNE UNITE
<                    SI LE POINT (X,Y) EXISTE ET EST A 1.
<
<
<        ARGUMENT ET RESULTAT : B,X,Y.
<                    SI IEXT=0 : A=1,
<                    SI IEXT=1 : A=0 SI UN POINT MARQUE.
<
<
VOISI:   EQU         $
         BSR         AEXIST          < TEST DU POINT (X,Y)
         JANE        VOISI1          < (X,Y) N'EXISTE PAS OU EST A 0.
         ADRI        1,B             < (X,Y) EXISTE ET EST A 1.
         STX         POINT1+X        < SAUVEGARDE D'UN POINT A 1.
         STY         POINT1+Y        < UTILISE PAR LES CHANGEMENTS
                                     < DE POINT DE DEPART).
         LAI         1               < IEXT SUPPOSE NUL A PRIORI.
         CPZ         IEXT            < TEST DU MODE DE PARCOURS.
         JE          VOISI1          < PARCOURS A L'EXTERIEUR.
         BSR         ASETV           < PARCOURS SUR LA FRONTIERE.
         LAI         0               < IEXT=1, ET UN POINT MARQUE.
VOISI1:  EQU         $
         RSR
<
<
<        E X I S T E N C E   E T   V A L E U R   P O I N T  :
<
<
<        ARGUMENT :
<                    X ET Y CONTIENNENT L'X ET L'Y D'UN POINT.
<
<
<        RESULTAT :
<                    A#0 : M(X,Y) N'EXISTE PAS , OU
<                          M(X,Y) EXISTE ET M(X,Y)=0.
<
<
EXIST:   EQU         $
         LR          X,A
         JAL         NEXIST          < X INVALIDE (<0).
         CP          NPPL
         JG          NEXIST          < X INVALIDE (>NPPL).
         LR          Y,A
         JAL         NEXIST          < M(X,Y) N'EXISTE PAS : A<0#0 !!!
         CP          NLIG
         JG          NEXIST          < M(X,Y) N'EXISTE PAS : A>0#0 !!!
<
< CAS OU LE POINT M(X,Y) EXISTE :
<
         BSR         ATEST           < TEST DE LA VALEUR DE M(X,Y).
         LAI         1
         SBCR        A               < A=0 SI M(X,Y)=1.
NEXIST:  EQU         $
         RSR
<
<
<        E X I S T E N C E   V I R T U E L L E  :
<
<
XISTV:   EQU         $
         LR          X,A
         JAL         NXISTV          < POINT VIRTUEL INEXISTANT.
         CP          NPPL
         JG          NXISTV          < POINT VIRTUEL INEXISTANT.
         LR          Y,A
         JAL         NXISTV          < POINT VIRTUEL INEXISTANT.
         CP          NLIG
         JG          NXISTV          < POINT VIRTUEL INEXISTANT.
         BSR         ATESTV          < TEST D'UN POINT VIRTUEL.
         LA          INDIC           < A=RESULTAT DU TEST VIRTUEL.
NXISTV:  EQU         $
         RSR                         < VOIR 'EXIST' POUR (A).
         IF          ORDI-"T",XWOR%,,XWOR%
TIMAG:   WORD        IMAG            < ADRESSE RELATIVE IMAGE VIDEO.
         EOT         #SIP SP3#
XWOR%:   VAL         0
         PAGE
<
<
<        E N T R E E   U N E   C O O R D O N N E E  :
<
<
<        ARGUMENT :
<                    A=@MESSAGE A EMETTRE.
<
<
<        RESULTAT :
<                    A=COORDONNEE (X OU Y).
<
<
COORD1:  EQU         $               < RETOUR EN ERREUR.
         LR          B,A             < RESTAURE A=@MESSAGE.
COORD:   EQU         $
         PSR         X,Y
         LR          A,B             < SAVE B=@MESSAGE.
         BSR         APRINT          < ENVOI DU MESSAGE ARGUMENT.
         LAD         DEMIN
         SVC         0               < ENTREE D'UN NBRE HEXADECIMAL.
         LYI         4               < 4 CHIFFRES MAX A CONVERTIR.
         BSR         AHEX            < ESSAI DE CONVERSION...
         PLR         X,Y
         JNE         COORD1          < ERREUR : ON RECOMMENCE.
         JAL         COORD1          < COORDONNEE<0 : ERREUR..
         CPI         X20-1           < DEBORDEMENT : ERREUR...
         JG          COORD1          < ERREUR...
         RSR                         < OK, (A)=VALEUR HEXA.
<
<
<        E N T R E E   C U R S E U R   G R A P H I Q U E  :
<
<
<        RESULTAT :
<                    X,Y=COORDONNEES VIDEOS DU CURSEUR.
<                    B=0 SI IEXT=0,
<                      +-1 SI IEXT=1.
<
<
CURS:    EQU         $
CUR1:    EQU         $
         LAD         OG
         SVC         0               < OPEN GRAPHIQUE.
         LAD         CU
         SVC         0               < MISE EN FONCTION CURSEUR.
         LAD         LCU
         SVC         0               < LECTURE DU CURSEUR.
<
<        NOTA :
<                      ON NE TESTE PAS LES ERREURS
<                    EN RETOUR (CAS DU PASSAGE EN
<                    BATCH...), CAR 'CURSOR' EST INITIALISE
<                    PAR 'N'.
<
         IF          ORDI-"T",XWOR%,,XWOR%
         LA          ASP3
         JAE         CUR2            < ON N'EST PAS SOUS :SYS.
         WORD        '1EC5           < STABILISATION IMAGE VIDEO.
CUR2:    EQU         $
XWOR%:   VAL         0
         LA          CURSOR+1        < Y(CURSEUR).
         SLRS        DEDY            < REDUCTION VIDEO.
         SB          NLIG            < LES AXES GRAPHIQUES ET
                                     < VIDEOS SONT INVERES.
         NGR         A,Y             < Y=Y(CURSEUR VIDEO).
         LA          CURSOR+2        < X(CURSEUR).
         SLRS        DEDX            < REDUCTION VIDEO.
         LR          A,X             < X=X(CURSEUR VIDEO).
         BSR         ACLIGN          < CLIGNOTEMENT DU POINT (X,Y).
         LBY         CURSOR          < A=COMMANDE ASSOCIEE.
<
<        COMMANDES RECONNUES :
<                    C : CLIGNOTEMENT DU CURSEUR,
<                    N : ENTREE EN HEXA DES COORDONNEES,
<                    O : ENTREE PAR LE CURSEUR.
<
         CPI         "C"
         JE          CUR1            < CLIGNOTEMENT SEUL...
         CPI         "O"
         JE          CUR3            < ENTREE PAR CURSEUR..
         CPI         "N"
         JNE         CUR1            < RIEN COMPRIS, ON RECOMMENCE.
<
< ENTREE EN HEXA DES COORDONNEES :
<
         LAD         M6              < A=@MESSAGE 'X='.
         BSR         ACOORD          < ENTREE DE X.
         LR          A,X             < X=X(CURSEUR VIDEO).
         LAD         M7              < A=@MESSAGE 'Y='.
         BSR         ACOORD          < ENTREE DE Y.
         LR          A,Y             < Y=Y(CURSEUR VIDEO).
CUR3:    EQU         $
<
< RECHERCHE DE L'Y REEL DU POINT :
<
         STY         SAVEY           < SAVE LE 1ER Y.
         BSR         ATEST           < TEST DE (X,Y).
         JNC         CUR4            < OK, (X,Y)=0.
         LAD         M1
         BSR         APRINT          < ERREUR : (X,Y)=1.
         JMP         CUR1            < ON RECOMMENCE TOUT...
CUR4:    EQU         $
         LAD         M15
         BSR         APRINT          < RECHERCHE VERS LE HAUT ???
         PSR         X               < SAVE COORDONNEE X.
         LAD         DEMREP
         SVC         0               < ENTREE DE LA REPONSE.
         PLR         X               < RESTAURE COORDONNEE X.
         LBY         REP             < A=REPONSE (O/N).
         LBI         -1              < OUI A PRIORI : B=DELTA(Y).
         CPI         "O"
         JE          CUR5            < OUI.
         LBI         1               < NON A PRIORI : B=DELTA(Y).
         CPI         "N"
         JNE         CUR4            < RIEN COMPRIS...
CUR5:    EQU         $
         ADR         B,Y             < DEPLACEMENT DE Y.
         LR          Y,A             < VALIDATION DU NOUVEL Y.
         JAL         CUR6            < ERREUR : Y<0.
         CP          NLIG
         JLE         CUR7            < OK.
CUR6:    EQU         $
         LAD         M2              < ON N'A TROUVE AUCUN
         BSR         APRINT          < POINT A 1.
         JMP         CUR1            < ON RECOMMENCE TOUT...
CUR7:    EQU         $
         BSR         ATEST           < TEST DE (X,Y) QUI EXISTE...
         JC          CUR8            < ON S'ARRETE SUR LE 1ER POINT A 1.
         STY         SAVEY           < ON GARDE LE DERNIER POINT A 0,
         JMP         CUR5            < ET ON RETOURNE DEPLACER Y.
CUR8:    EQU         $
         LY          SAVEY           < Y=Y DU DERNIER POINT A 0
                                     < AVANT UN POINT A 1.
         LR          B,A
         MP          IEXT            < B=0,+1,-1.
         RSR
<
<
<        C O N V E R S I O N   A S C I   -->   B I N A I R E  :
<
<
<        RESULTAT :
<                    A=VALEUR CONVERTIE S'IL N'Y A PAS
<                    D'ERREUR, LES CODES DE CONDITION
<                    L'INDIQUANT.
<
<
HEX:     EQU         $
         PSR         B,X
         LXI         0               < X=INDEX DE 'REP'.
         LBI         0               < B=CUMUL COURANT.
HEX1:    EQU         $
         LBY         &AREP           < A=CARACTERE COURANT DE 'REP'.
         CPI         '04             < EST-CE 'EOT' ???
         JE          HEX5            < OUI, FIN DE CONVERSION.
         CPI         '0D             < EST-CE 'R/C' ???
         JE          HEX5            < OUI, FIN DE CONVERSION.
         ADRI        -'30,A          < CONVERSION BIANIRE.
         JAL         HEX2            < ERREUR.
         CPI         9               < EST-CE UN CHIFFRE DECIMAL ???
         JLE         HEX3            < OUI.
         ADRI        -"A"+"9"+1,A    < NON.
         CPI         'A              < VALIDATION HEXDECIMALE ???
         JL          HEX2            < ERREUR.
         CPI         'F              < VALIDATION HEXADECIMALE ???
         JG          HEX2            < ERREUR.
HEX3:    EQU         $
         SCRS        4               < CUMUL PARTIEL DE LA
         SCLD        4               < VALEUR A CONVERTIR.
         ADRI        1,X             < PASSAGE AU CARACTERE SUIVANT.
         CPR         X,Y             < EST-CE FINI ???
         JNE         HEX1            < NON.
HEX5:    EQU         $
         LR          B,A             < OUI, A=RESULTAT.
         LBI         0               < B=0 : OK.
HEX4:    EQU         $
         CPZR        B               < POSITIONNEMENT DES CODES
                                     < DE CONDITION SUR ERREUR.
         PLR         B,X
         RSR
HEX2:    EQU         $               < CAS DES ERREURS.
         LBI         1               < B=1#0 : ERREUR.
         JMP         HEX4            < VERS LA SORTIE...
         PAGE
<
<
<        R E T O U R   A   ' G E '  :
<
<
GOGE:    EQU         $
         LX          ARRIV+X
         LY          ARRIV+Y
         LA          BARRIV
         ADR         A,Y
         STZ         KSEG            < AFIN D'EMETTRE LE DERNIER SEGMENT.
         BSR         ASEND           < EMISSION EVENTUELLE DU DERNIER
                                     < SEGMENT.
         STZ         SEGEXT+X
         STZ         SEGEXT+Y
         LXI         0
         LY          NLIG
         STZ         KSEG            < AFIN D'EMETTRE L''OAB'.
         BSR         ASEND           < EMISSION POSSIBLE D'UN SEGMENT
                                     < REDUIT A UN POINT DOUBLE
                                     < ORIGINE GRAPHIQUE.
GOGEX:   EQU         $               < ENTRY ALT-MODE.
         LAD         CG
         SVC         0               < ON NE SAIT JAMAIS...
         BSR         AVIRE           < TOUTE L'IMAGE VIRTUELLE EST
                                     < RENVOYEE EN SCRATCH AVANT
                                     < LE RETOUR A 'GE'.
<
< RAZ DES ITEMS 1 ET 2 :
<
         LX          NMOTS           < X=NBRE DE MOTS A RAZER.
GOGE1:   EQU         $
         STZ         &AI2
         JDX         GOGE1
<
< MISE EN PLACE DU NOM DE 'GE' :
<
         LA          NGE
         STA         0,W             < (W)=@BRANCH.
<
< RETOUR A 4K, ET SMC :
<
         LA          APILE
         LR          A,K
         LAD         RELMEM
         SVC         0
GOGE2:   EQU         $
         LAD         DEMSGN          < A=@DEMSGN.
         BSR         AOVL            < CHARGEMENT DE 'GE'.
         LAD         DEMCCI
         SVC         0               < RETOUR AU CCI SI ERREUR.
         JMP         GOGE2
         PAGE
<
<
<        E X T R A C T I O N   D ' U N E   C H A I N E
<                    D E   S E G M E N T S  :
<
<
         WORD        IMAG            < VALEUR BASE C.
         WORD        LOC+'80         < VALEUR BASE L.
         WORD        BRANCH          < VALEUR BASE W.
IMAGE:   EQU         $
         LRP         K
         ADRI        -1,K
         PLR         C,L,W           < INITIALISATION C,L,W.
         LA          ASTACK
         LR          A,K             < INITIALISATION K.
         IC          KIN             < COMPTAGE DES ENTRIES.
         JG          GOGEX           < ABORT SI ALT-MODE.
         LAD         DEMMEM
         SVC         0
         IF          ORDI-"T",XWOR%,,XWOR%
<
< TEST DU NUMERO DE COMTE D'APPEL :
<
         WORD        '1E25           < A,B=ACN.
         CP          ACNSYS
         JNE         INIT1           < ON N'EST PAS SOUS :SYS.
         LR          B,A
         CP          ACNSYS+1
         JE          INIT2           < ON EST SOUS :SYS.
INIT1:   EQU         $
         STZ         ASP3            < PAS DE STABILISATION D'IMAGE.
INIT2:   EQU         $
XWOR%:   VAL         0
<
< MODE DE PARCOURS :
<
EXT1:    EQU         $
         LA          AM16
         BSR         APRINT          < ENVOI INTERROGATION.
         LAD         DEMREP
         SVC         0               < ENTREE REPONSE.
         LBY         REP             < ANALYSE REPONSE.
         STZ         IEXT            < 0 : OUI, PARCOURS EXTERIEUR.
         CPI         "O"
         JE          EXT2            < OUI.
         CPI         "N"
         JNE         EXT1            < ???
         IC          IEXT            < 1 : NON, PARCOURS SUR LES
                                     < FRONTIERES (CF. EZ).
EXT2:    EQU         $
<
< EMISSION GRAPHIQUE ???
<
GR1:     EQU         $
         LAD         M9
         BSR         APRINT          < ENVOI MESSAGE.
         LAD         DEMREP
         SVC         0               < LECTURE DE LA REPONSE.
         LBY         REP
<
<        REPONSES RECONNUES :
<                    O : EMISSION GRAPHIQUE,
<                    N : PAS D'EMISSION GRAPHIQUE.
<
         CPI         "N"
         JE          GR2             < IGRAPH=1 : PAS D'EMISSION.
         CPI         "O"
         JNE         GR1             < ERREUR, ON RECOMMENCE.
         STZ         IGRAPH          < IGRAPH=0 : EMISSION.
GR20:    EQU         $
         LAD         M14
         BSR         ACOORD          < ENTREE DU NBRE DE SEGMENTS A
                                     < REUNIR EN UN SEUL, AFIN DE LISSER
                                     < LA CHAINE GENEREE.
         STA         NSEG            < NSEG>0.
GR2:     EQU         $
<
<        R A Z   L A   B O R D U R E   D E   L ' I M A G E  :
<
         LYI         0
         LXI         0
<
< BORDURE SUPERIEURE (Y=0) :
<
RAZE1:   EQU         $
         BSR         ARESET
         ADRI        1,X
         LR          X,A
         CP          NPPL
         JLE         RAZE1
         ADRI        -1,X
<
< BORDURE DROITE (X=NPPL) :
<
RAZE2:   EQU         $
         BSR         ARESET
         ADRI        1,Y
         LR          Y,A
         CP          NLIG
         JLE         RAZE2
         ADRI        -1,Y
<
< BORDURE INFERIEURE (Y=NLIG) :
<
RAZE3:   EQU         $
         BSR         ARESET
         ADRI        -1,X
         CPZR        X
         JGE         RAZE3
         ADRI        1,X
<
< BORDURE GAUCHE (X=0) :
<
RAZE4:   EQU         $
         BSR         ARESET
         ADRI        -1,Y
         CPZR        Y
         JGE         RAZE4
         ADRI        1,Y
<
<        R E C U P E R A T I O N   P O I N T
<                    D E   D E P A R T  :
<
DEP1:    EQU         $
         LAD         M10
         BSR         APRINT          < DEPART ???
         BSR         ACURS           < ENTREE CURSEUR, ET CONVERSION VIDEO.
         STX         DEP+X
         STY         DEP+Y
         STB         BDEP            < SAVE TRANSLATION DEPART.
DEP2:    EQU         $
<
<        R E C U P E R A T I O N   D U
<        P O I N T   D ' A R R I V E E  :
<
ARR1:    EQU         $
         LAD         M11
         BSR         APRINT          < ARRIVEE ???
         BSR         ACURS           < ENTREE CURSEUR, ET CONVERSION VIDEO.
         STX         ARRIV+X
         STY         ARRIV+Y
         STB         BARRIV          < SAVE TRANSLATION ARRIVEE.
ARR2:    EQU         $
<
< INITIALISATION DU DISQUE :
<
         BSR         ARAZDK
<
< DEP EST NOTRE POINT DE DEPART :
<
         LX          DEP+X
         LY          DEP+Y
         LA          BDEP
         ADR         A,Y
         BSR         ASENDO          < INSERTION POINT DE DEPART.
         BSR         ASETV           < MARQUAGE DU POINT DE DEPART.
         LA          IEXT
         LA          BDEP
         SBR         A,Y
<
<        R E C H E R C H E   D ' U N E   C H A I N E  :
<
CONT1:   EQU         $
         STX         PTC+X           < SAVE LE POINT COURANT.
         STY         PTC+Y           < SAVE LE POINT COURANT.
         BSR         AROT1           < ROTATION A DROITE PRELIMINAIRE.
CONT3:   EQU         $
         BSR         AMOV            < DEPLACEMENT DU POINT (X,Y).
         STZ         ITEST           < AFIN DE TESTER LES POINTS A 0.
         BSR         AEXIST          < TEST DU POINT (X,Y).
         JAE         CONT2           < OK, (X,Y)=0 ET EXISTE (ITEST=0).
CONT5:   EQU         $
         LX          PTC+X           < RETOUR ARRIERE SUR PTC.
         LY          PTC+Y           < RETOUR ARRIERE SUR PTC.
         BSR         AROT3           < ROTATION DU VECTEUR (VX,VY).
         JMP         CONT3           < ET ON RECOMMENCE...
<
< CAS OU L'ON A TROUVE UN POINT A 0 QUI EXISTE :
<
CONT2:   EQU         $
         LBI         0               < B=COMPTEUR DES VOISINS DU POINT
                                     < TROUVE (X,Y).
         IC          ITEST           < AFIN DE TESTER LES POINTS A 1.
CONT4:   EQU         $
         LA          VX
         STA         SVX             < SAVE VX AVANT LE DECOMPTE.
         LA          VY
         STA         SVY             < SAVE VY AVANT LE DECOMPTE.
         LA          ANGLE
         STA         SANGLE          < SAVE ANGLE AVANT LE DECOMPTE.
         PSR         X,Y             < SAVE LE POINT COURANT (X,Y).
         BSR         AROT1           < ON SE PLACE A DROITE DU
                                     < MOUVEMENT (VX,VY).
         BSR         AMOV
         BSR         AVOISI          < ET ON TESTE LES 3 POINTS
                                     < IMMEDIATEMENT A DROITE DU
                                     < POINT COURANT SUIVANT LE
                                     < MOUVEMENT (VX,VY).
         JAE         TROUVE          < IEXT=1 ET POINT MARQUE.
         BSR         AROT1
         BSR         AMOV
         BSR         AVOISI
         JAE         TROUVE          < IEXT=1 ET POINT MARQUE.
         BSR         AROT1
         BSR         AROT1
         BSR         AMOV
         BSR         AMOV
         BSR         AVOISI
TROUVE:  EQU         $
         PLR         X,Y             < RESTAURE LE POINT COURANT.
         LA          SANGLE
         STA         ANGLE           < RESTAURE ANGLE.
         LA          SVX
         STA         VX              < RESTAURE VX.
         LA          SVY
         STA         VY              < RESTAURE VY.
         CPZR        B               < LE POINT (X,Y) A-T'IL AU
                                     < MOINS 1 VOISIN ???
         JE          CONT5           < NON, ON FAIT DONC UN RETOUR ARRIERE
                                     < SUR PTC, ET ROTATION DE (VX,VY).
<
< MARQUAGE DU POINT (X,Y) :
<
         CPZ         IEXT            < MODE DE PARCOURS ???
         JNE         EXT3            < CAS DU PARCOURS SUR
                                     < LES FRONTIERES : C'EST 'VOISI'
                                     < QUI FAIT LE MARQUAGE...
         BSR         ASETV           < MARQUAGE DE (X,Y), MEME
                                     < S'IL EST LE POINT DE DEPART.
EXT3:    EQU         $
         LR          X,A
         CP          DEP+X           < EST-ON AU POINT DE DEPART ???
         JNE         CONT50          < NON.
         LR          Y,A             < PEUT-ETRE.
         CP          DEP+Y
         JNE         CONT50          < NON.
<
< CAS OU L'ONREPASSE AU POINT DE DEPART :
<
         LAD         M13
         BSR         APRINT          < ENVOI D'UN MESSAGE...
         LA          DEP+X
         LB          DEP+Y
         STA         ARRIV+X         < CHANGEMENT DE POINT
         STB         ARRIV+Y         < D'ARRIVE (<--DEPART).
         JMP         CONT7           < ET ON ARRETE LA...
<
< CAS D'UN POINT#DEPART :
<
CONT50:  EQU         $
         LR          X,A
         CP          ARRIV+X         < EST-ON AU POINT D'ARRIVEE ???
         JNE         CONT1           < NON, AU SUIVANT...
         LR          Y,A
         CP          ARRIV+Y         < EST-ON AU POINT D'ARRIVEE ???
         JNE         CONT1           < NON, AU SUIVANT...
<
< ON A UNE CHAINE DE SEGMENTS :
<
CONT7:   EQU         $
         LAD         M5              < PARCOURS EXTERIEUR A PRIORI.
         CPZ         ANGLE           < INTERIEUR OU EXTERIEUR ???
         JG          CONT60          < EXTERIEUR.
         JL          CONT70          < INTERIEUR.
         BR          AGOGE           < RETOUR A GE.
CONT70:  EQU         $
         LAD         M4              < INTERIEUR.
CONT60:  EQU         $
         BSR         APRINT          < ENVOI DU MESSAGE.
         BR          AGOGE           < ET C'EST TOUT...
         PAGE
<
<
<        I M P L A N T A T I O N  :
<
<
X12:     EQU         ZERO+PILE-LTNI-LTNI
X10:     VAL         X12-$
ZEROV:   EQU         ZERO+X10        < ERREUR D'ASSEMBLAGE VOLONTAIRE
                                     < SI MAUVAISE IMPLANTATION...
         DZS         X10+1           < PAR PROPRETE !!!!
         EOT         #SIP GEN PROCESSEUR#



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