NMPROC:  VAL         "KO"            < NOM DU PROCESSEUR.
         IDP         "KO - 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         16
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  :
<
<
         LOCAL
LOC:     EQU         $
<
< MESSAGES :
<
M1:      BYTE        15;'6D
         ASCI        "ERREUR DEPART!"
M2:      BYTE        11;'6D
         ASCI        "NON FERME!"
M3:      BYTE        13;'6D
         ASCI        "POINT ISOLE!"
M4:      BYTE        10;'6D
         ASCI        "INTERIEUR "
M5:      BYTE        10;'6D
         ASCI        "EXTERIEUR "
M6:      BYTE        3;'6D
         ASCI        "X="
M7:      BYTE        3;'6D
         ASCI        "Y="
M8:      BYTE        9;'6D
         ASCI        "CONTOUR?"
M9:      BYTE        5;'6D
         ASCI        "ZDC?"
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.
LOADI:   WORD        '0502           < RECUPERATION D'UNE IMAGE.
         WORD        NOM-ZERO*2
         WORD        LIMAG+LNOM+2*2
         WORD        2*LNOM
DELI:    WORD        '0302           < DELETE D'UNE IMAGE.
         WORD        NOM-ZERO*2
         WORD        LIMAG+LNOM+2*2
         WORD        2*LNOM
STORI:   WORD        '0402
         WORD        NOM-ZERO*2
         WORD        LIMAG+LNOM+2*2
         WORD        2*LNOM
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           < DEMANDE DE STABILISATION VIDEO.
         WORD        IMAG-ZERO*2
         WORD        LIMAG*2
         WORD        TVPV            < SUR LE PROCESSEUR VERT.
XWOR%:   VAL         0
<
< CONSTANTES :
<
NOM1:    WORD        "-+"            < NOM DE L'IMAGE DE TRAVAIL,
                                     < DANS LAQUELLE ON GENERE
                                     < L'IMAGE FINALE.
                                     < SUIVIS DE L'IDESC).
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.
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.
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.
PKOMPT:  WORD        -1              < KOMPT DU TOUR PRECEDENT.
OSCIL:   WORD        0               < COMPTEUR DES OSCILLATIONS.
MOSCIL:  WORD        8               < MAX DE OSCIL...
KDIFF:   WORD        0               < COMPTAGE DES DIFFERENCES ENTRE
                                     < L'IMAGE AVANT ET APRES L'AJOUT
                                     < DU NOUVEAU CONTOUR INTERNE.
DOUBLE:  WORD        0               < COMPTEUR DES POINTS DOUBLES
                                     < D'UN PARCOURS.
NISOL:   WORD        0               < NOMBRE DE POINTS ISOLES,
                                     < OU SIMPLEMENT RATTACHES
                                     < RECONTRES AVANT CHAQUE
                                     < PARCOURS.
TRAME:   WORD        'FFFF           < POUR EVENTUELLEMENT DONNER
                                     < DU VOLUME A L'IMAGE FINALE...
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.
<
< 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.
ALOOP:   WORD        CONT18          < PARCOURS DU CONTOUR COURANT.
APRINT:  WORD        PRINT           < EDITION DES MESSAGES.
AHEX:    WORD        HEX             < CONVERSION ASCI --> BINAIRE.
ACOORD:  WORD        COORD           < ENTREE COORDONNE X/Y.
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.
<
< 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
         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...
         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 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.
<
<
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).
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%
<
<
<        V I S U A L I S A T I O N   I M A G E  :
<
<
TIMAG:   WORD        IMAG            < ADRESSE RELATIVE IMAGE VIDEO.
SP3:     EQU         $
         LRP         L
         LB          TIMAG-$+1,L     < B=@RELATIVE IMAGE.
         LA          10,W            < A=SLO(ESCLAVE).
         ADR         A,B             < B=@ABSOLUE IMAGE.
         LXI         NSPTV
         BSR         ACADCT,C        < L=@DCT-VIDEO.
         STB         ADM,L           < DEMANDE DE VISUALISATION IMAGE.
         RSR
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.
<
<
<        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         $
         STZ         SEGEXT+X
         STZ         SEGEXT+Y
         LXI         0
         LY          NLIG
         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...
         LAD         DELI
         SVC         0               < DELETE L'IMAGE 'I1'.
         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
<
<
<        R E M P L I S S A G E   D ' U N   C O N T O U R  :
<
<
         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
         WORD        '1E45           < RENVOIE : A=IDESC.
         ADRI        '30,A           < CONVERSION ASCI.
         SWBR        A,A
         ORI         '04             < QUE L'ON FAIT SUIVRE DE EOT.
         STA         &ANOM2          < ET QUE L'ON MET DERRIERE I1/I2.
         LA          NOM1
         STA         &ANOM1          < FIN DE GENERATION DU NOM
                                     < DE L'IMAGE DE TRAVAIL.
         LAD         DELI
         SVC         0               < QUE L'ON DETRUIT AU PREALABLE,
                                     < ON NE SAIT JAMAIS...
<
< 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.
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         ATEST           < TEST DU POINT M(X,0) ???
         JNC         RAZE1X          < NOIR...
         ADRI        1,Y             < BLANC :
         BSR         ASET            < ON MET A BLANC LE POINT M(X,1)...
         ADRI        -1,Y
         BSR         ARESET          < ET ON MET A NOIR LE POINT M(X,0).
RAZE1X:  EQU         $
         ADRI        1,X
         LR          X,A
         CP          NPPL
         JLE         RAZE1
         ADRI        -1,X
<
< BORDURE DROITE (X=NPPL) :
<
RAZE2:   EQU         $
         BSR         ATEST           < TEST DU POINT M(NPPL,Y) ???
         JNC         RAZE2X          < NOIR...
         ADRI        -1,X            < BLANC :
         BSR         ASET            < ON MET A BLANC LE POINT M(NPPL-1,Y)...
         ADRI        1,X
         BSR         ARESET          < ET ON MET A NOIR M(NPPL,Y).
RAZE2X:  EQU         $
         ADRI        1,Y
         LR          Y,A
         CP          NLIG
         JLE         RAZE2
         ADRI        -1,Y
<
< BORDURE INFERIEURE (Y=NLIG) :
<
RAZE3:   EQU         $
         BSR         ATEST           < TEST DU POINT M(X,NLIG) ???
         JNC         RAZE3X          < NOIR...
         ADRI        -1,Y            < BLANC :
         BSR         ASET            < ON MET A BLANC LE POINT M(X,NLIG-1)...
         ADRI        1,Y
         BSR         ARESET          < ET ON MET A NOIR LE POINT M(X,NLIG).
RAZE3X:  EQU         $
         ADRI        -1,X
         CPZR        X
         JGE         RAZE3
         ADRI        1,X
<
< BORDURE GAUCHE (X=0) :
<
RAZE4:   EQU         $
         BSR         ATEST           < TEST DU POINT M(0,Y) ???
         JNC         RAZE4X          < NOIR...
         ADRI        1,X             < BLANC :
         BSR         ASET            < ON MET A BLANC LE POINT M(1,Y)...
         ADRI        -1,X
         BSR         ARESET          < ET ON MET A NOIR LE POINT M(0,Y).
RAZE4X:  EQU         $
         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  :
<
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).
<
< ON A UN POINT DE DEPART :
<
CUR3:    EQU         $
         STX         DEP+X
         STY         DEP+Y
<
< INITIALISATION DU DISQUE :
<
         BSR         ARAZDK
<
< RECHERCHE D'UN POINT DE DEPART :
<
         LX          DEP+X           < INITIALISATION REGISTRE X SUR DEP,
         LY          DEP+Y           < INITIALISATION DE Y SUR Y(DEP).
         BSR         ATEST           < VALIDATION DE DEP.
         JNC         DEP1            < OK, DEP=0.
         LAD         M1              < ERREUR : DEP=1 !!!
         BSR         APRINT
         BR          AGOGE           < ABORT.
DEP1:    EQU         $
         ADRI        1,Y             < ACCES POINT AU-DESSOUS.
         LR          Y,A
         CP          NLIG            < VALIDATION DE Y.
         JLE         DEP2            < OK, Y DANS L'IMAGE.
         LAD         M2              < ERREUR, Y HORS L'IMAGE !!!!
         BSR         APRINT
         BR          AGOGE           < PUIS ABORT...
DEP2:    EQU         $
         BSR         ATEST           < TEST DU POINT (X,Y).
         JC          DEP3            < ON S'ARRETE SUR LE 1ER POINT
                                     < A 1 SUIVANT UN POINT A 0.
         STY         DEP+Y           < SINON, LE POINT (X,Y) DEVIENT
                                     < LE NOUVEAU POINT DEP.
         JMP         DEP1            < ET ON RECOMMENCE...
DEP3:    EQU         $
<
< DEP EST NOTRE POINT DE DEPART :
<
         LX          DEP+X
         LY          DEP+Y
         BSR         ASENDO          < INSERTION POINT DE DEPART.
         BSR         ASETV           < MARQUAGE DU POINT DE DEPART.
<
<        R E C H E R C H E   D U   C O N T O U R   I N T E R I E U R  :
<
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).
         BSR         AROT1
         BSR         AMOV
         BSR         AVOISI
         BSR         AROT1
         BSR         AROT1
         BSR         AMOV
         BSR         AMOV
         BSR         AVOISI
         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) :
<
         BSR         ASETV           < MARQUAGE DE (X,Y), MEME
                                     < S'IL EST LE POINT DE DEPART.
         LR          X,A
         CP          DEP+X           < EST-ON AU POINT DE DEPART ???
         JNE         CONT1           < NON, AU SUIVANT...
         LR          Y,A
         CP          DEP+Y           < EST-ON AU POINT DE DEPART ???
         JNE         CONT1           < NON, AU SUIVANT...
<
< ON A LE CONTOUR INTERIEUR :
<
CONT7:   EQU         $
         LAD         M5              < PARCOURS EXTERIEUR A PRIORI.
         CPZ         ANGLE           < INTERIEUR OU EXTERIEUR ???
         JG          CONT60          < EXTERIEUR.
         JL          CONT70          < INTERIEUR.
         WORD        '1E16           < E R R E U R   P R O G !!!
CONT70:  EQU         $
         LAD         M4              < INTERIEUR.
CONT60:  EQU         $
         BSR         APRINT          < ENVOI DU MESSAGE.
<
< QUE VOULEZ-VOUS : UN CONTOUR, OU BIEN UN REMPLISSAGE ???
<
CONT90:  EQU         $
         LAD         M8
         BSR         APRINT
         LAD         DEMREP
         SVC         0               < LECTURE DE LA REPONSE.
         LBY         REP             < A=CARACTERE REPONSE.
<
<        REPONSES RECONNUES :
<                    O : ON NE CALCULE QUE LE CONTOUR EN SCRATCH,
<                    N : ON REMPLIT L'IMAGE.
<
         CPI         "N"
         JE          CONT91          < REMPLISSAGE.
         CPI         "O"
         JNE         CONT90          < RIEN COMPRIS : REINTERROGATION ???
         BR          AGOGE           < CONTOUR : ON RETOURNE A GE, AVEC
                                     < UN VIDAGE PREALABLE DE L'IMAGE
                                     < VIRTUELLE EN SCRATCH.
CONT91:  EQU         $
         BSR         ACONTI          < ON AMENE EN MEMOIRE IMAGE
                                     < LE CONTOUR QUE L'ON A
                                     < GENERE, CAR C'EST DE LUI
                                     < QU'ON VEUT LES LIMITES !!!
<
<        L I M I T E S   V E R T I C A L E S   C O N T O U R  :
<
         LA          AIMAG
         STA         AIMAG0          < RELAI D'ACCES AUX LIGNES.
         LYI         0               < Y=NUMERO DE LIGNE COURANTE.
LOOK1:   EQU         $
         LXI         CNMPL           < INDEX MOT SUR LA LIGNE.
LOOK2:   EQU         $
         CPZ         &AIMAG0         < NOIR OU PAS ???
         JNE         LOOK3           < PAS NOIR, ON ARRETE...
         JDX         LOOK2           < TANT QUE C'EST NOIR,
                                     < ON CONTINUE.
         ADRI        1,Y             < LIGNE SUIVANTE.
         LA          AIMAG0
         ADRI        CNMPL,A         < PROGRESSION @LIGNE COURANTE.
         STA         AIMAG0
         JMP         LOOK1           < TEST LIGNE SUIVANTE.
LOOK3:   EQU         $
         STY         YMIN            < Y DONNE LA DERNIERE LIGNE
                                     < LORS DES BALAYGES DE BAS
                                     < EN HAUT DE L'IMAGE.
         LAI         CNMPL
         MP          NLIG
         LR          B,A
         AD          AIMAG
         STA         AIMAG0          < RELAI D'ACCES A LA DERNIERE
                                     < LIGNE DE L'IMAGE.
         LY          NLIG            < Y=NUMERO DE LIGNE COURANTE.
LOOK4:   EQU         $
         LXI         CNMPL           < INDEX MOT SUR LA LIGNE.
LOOK5:   EQU         $
         CPZ         &AIMAG0         < NOIR OU PAS ???
         JNE         LOOK6           < ON ARRETE AU 1ER NON NOIR.
         JDX         LOOK5           < TANT QUE C'EST NOIR,
                                     < ON CONTINUE...
         ADRI        -1,Y            < PASSAGE LIGNE PRECEDENTE.
         LA          AIMAG0
         ADRI        -CNMPL,A        < PROGRESION @LIGNE COURANTE.
         STA         AIMAG0
         JMP         LOOK4
LOOK6:   EQU         $
         STY         YMAX            < Y DONNE LA 1ERE LIGNE A TESTER
                                     < LORS DES BALAYAGES DE BAS
                                     < EN HAUT DE L'IMAGE.
<
<        R E M P L I S S A G E   D U   C O N T O U R  :
<
CONT18:  EQU         $
         IF          ORDI-"T",XWOR%,,XWOR%
         LA          ASP3
         JAE         NSTBL           < ON N'EST PAS SOUS :SYS...
         WORD        '1EC5           < EXECUTION MAITRE DE 'SP3'.
NSTBL:   EQU         $
XWOR%:   VAL         0
         BSR         ACONTI          < CHARGEMENT EN MEMOIRE DU
                                     < CONTOUR GENERE A L'ETAPE
                                     < PRECEDENTE.
         BSR         ARAZDK          < INITIALISATION DU CONTOUR
                                     < SUIVANT.
<
< SUPPRESSION EVENTUELLE DES POINTS 0-ISOLES OU 1-ISOLES :
<
         STZ         ITEST
         IC          ITEST
ISOL8:   EQU         $
         STZ         DOUBLE          < A CHAQUE REEXPLORATION, ON
                                     < REINITIALISE 'DOUBLE'.
         STZ         PREM
         IC          PREM            < AVANT CHAQUE TOUR, ON
                                     < INDIQUE QUE LE 1ER POINT N'A
                                     < PAS ETE RENCONTRE.
         STZ         NISOL           < INITIALISATION DU NBRE DE
                                     < POINTS AINSI ELIMINES.
         LY          YMAX            < Y=1ERE LIGNE A TESTER.
ISOL1:   EQU         $
         LX          NPPL            < INITIALISATION COORDONNE X.
ISOL2:   EQU         $
         PSR         C               < SAVE @IMAGE VIDEO.
         LR          Y,A
         MP          NMPL            < B=@ 1ER MOT DE LA LIGNE (Y).
         ADR         B,C
         LR          X,A
         SLRS        4
         ADR         A,C             < C=@MT COURANT.
         LA          0,C             < A=MOT COURANT.
         PLR         C               < RESTAURE @IMAGE.
         CPI         'FFFF
         JE          ISOL20          < CAS D'UN MOT TOUT BLANC.
         JANE        ISOL9           < MOT PARTIELLEMENT BLANC.
ISOL20:  EQU         $
         LR          X,A             < DANS LE CAS D'UN MOT TOUT
         ANDI        'FFF0           < BLANC OU TOUT NOIR, ON
         LR          A,X             < PASSE AU PRECEDENT...
         JMP         ISOL7           < VERS LE CHANGEMENT DE MOT.
ISOL9:   EQU         $
         BSR         AEXIST          < (X,Y) EST-IL A 1 ???
         JANE        ISOL7           < NON, DONC ININTERESSANT...
         LBI         0               < B=NBRE DE VOISINS DU POINT
                                     < COURANT (X,Y).
         ADRI        1,X             < POINT (X+1,Y).
         BSR         AVOISI
         ADRI        -1-1,X          < POINT (X-1,Y).
         BSR         AVOISI
         ADRI        1,X
         ADRI        -1,Y            < POINT (X,Y-1).
         BSR         AVOISI
         ADRI        1+1,Y           < POINT (X,Y+1).
         BSR         AVOISI
         ADRI        -1,Y            < RETOUR AU POINT (X,Y).
         LR          B,A             < A=NBRE DE VOISINS DE (X,Y).
         JANE        ISOL10          < OK POINT 1-ISOLE AU MOINS...
         WORD        '1E16           < E R R E U R   P R O G !!!
ISOL10:  EQU         $
         CPI         4
         JNE         ISOL11
<
< CAS D'UN POINT A 4 VOISINS 'ORTHOGONAUX' :
<
         IC          DOUBLE          < ON LE COMPTE
         IC          DOUBLE          < 2 FOIS...
         JMP         ISOL7           < ET C'EST TOUT.
<
< CAS DES AUTRES POINTS :
<
ISOL11:  EQU         $
         CPI         1               < (X,Y) EST-IL 0-ISOLE OU
                                     < 1-ISOLE ???
         JLE         ISOL12          < OUI, ON L'ELIMINE.
         CPZ         PREM            < NON, ALORS A-T'ON DEJA
                                     < RENCONTRE LE 1ER POINT
                                     < DE L'IMAGE ???
         JE          ISOL7           < OUI, DONC PASSONS AU NEXT.
         STZ         PREM            < NON, ON EST DONC ICI
                                     < EN PRESENCE DU 1ER POINT,
         STX         DEP+X           < QUI RISQUE DE DEVENIR LE
         STY         DEP+Y           < FUTUR POINT DE DEPART...
         JMP         ISOL7           < VERS LE POINT SUIVANT...
ISOL12:  EQU         $
         BSR         ARESET          < OUI, ON L'ELIMINE.
         IC          NISOL           < ET ON COMPTE LES POINTS
                                     < AINSI EFFACES.
         LR          X,A
         CP          DEP+X           < EST-ON AU POINT DE DEPART ???
         JNE         ISOL7           < NON.
         LR          Y,A
         CP          DEP+Y           < EST-ON AU POINT DE DEPART ???
         JNE         ISOL7           < NON.
         LA          POINT1+X        < OUI : ON A DONC EFFACE LE
         STA         DEP+X           < POINT DE DEPART ELU AU TOUR
         LA          POINT1+Y        < PRECEDENT : ON LE REMPLACE
         STA         DEP+Y           < PAR UN POINT QUI EST A 1.
ISOL7:   EQU         $
         ADRI        -1,X            < CHANGEMENT DE POINT COURANT.
         CPZR        X               < EXISTE-T'IL ???
         JGE         ISOL2           < OUI.
         ADRI        -1,Y            < NON, CHANGEMENT DE LIGNE.
         LR          Y,A             < VALIDATION Y.
         CP          YMIN            < LIGNE INTERESSANTE ???
         JGE         ISOL1           < OUI.
         CPZ         NISOL           < NON, ON A FINI, ALORS
                                     < A-T'ON EFFACE AU MOINS
                                     < UN POINT ???
         JG          ISOL8           < OUI, ALORS ON RECOMMENCE,
                                     < CAR CES EFFACEMENTS ONT PU
                                     < ENGENDRES DE NOUVEAUX
                                     < POINTS 0-ISOLES OU 1-ISOLES.
<
< RECALAGE DU POINT DE DEPART POUR CHAQUE TOUR :
<
         LAI         1
         STA         VX              < VX=1,
         STZ         VY              < VY=0.
         LX          DEP+X           < POSITIONNEMENT AU POINT DE
         LY          DEP+Y           < DEPART CHOISI.
                                     < DE DEPART CHOISI.
         BSR         ASENDO          < INSERTION POINT DE DEPART.
<
<        NOTA :
<                      LE POINT DE DEPART CHOISI (DEP),
<                    EST CHOISI A UN ANGLE VERS LA
<                    GAUCHE DU CONTOUR POUR EVITER
<                    DES CISAILLEMENTS EVENTELS DE
<                    CELUI-CI.
<
<
< INITIALISATION DU NOUVEAU PARCOURS :
<
         STZ         KOMPT           < RAZ DU COMPTEUR DE REM-
                                     < PLACANTS OBTENUS LORS DU
                                     < PARCOURS AUE L'ON VA FAIRE.
         STZ         SDEP
         DC          SDEP            < SDEP<0 : A PRIORI, ON NE
                                     < CHANGERA PAS DE POINT DE
                                     < DEPART.
<
<        U N   T O U R   D E   R E M P L I S S A G E  :
<
CONT10:  EQU         $
<
< RECHERCHE PRELIMINAIRE DU FUTUR SUCCESSEUR DU POINT COURANT :
<
         STX         PTC+X           < SAUVEGARDE DU POINT
         STY         PTC+Y           < COURANT 'PTC'.
         LAD         PILR
         STA         APILR           < INITIALISATION DU POINTEUR
                                     < DE LA PILE DES REMPLACANTS.
<
< TEST A DROITE DU MOUVEMENT :
<
         BSR         AROT1           < ROTATION A DROITE.
         BSR         AMOV            < DEPLACEMENT VERS LA DROITE.
         STZ         ITEST
         IC          ITEST           < POUR LE TEST DES POINTS A 1.
         BSR         AEXIST          < EXISTENCE DU POINT A
                                     < DROITE DE PTC ???
         JAE         CONT21          < OK, SUCCESSEUR TROUVE A DROITE.
<
< TEST DEVANT LE MOUVEMENT :
<
         BSR         ASUCC           < IL SUFFIT DE TOURNER DE LA
                                     < DROITE VERS LA GAUCHE.
         JAE         CONT22          < OK, SUCCESSEUR TROUVE DEVANT.
<
< TEST A GAUCHE DU MOUVEMENT :
<
         BSR         ASUCC           < ON TOURNE ENCORE DE LA
                                     < DROITE VERS LA GAUCHE.
         JAE         CONT23          < OK, SUCCESSEUR TROUVE A GAUCHE.
<
< TEST EN ARRIERE DU MOUVEMENT :
<
         BSR         ASUCC           < DROITE VERS GAUCHE...
         JAE         CONT24          < OK, SUCCESSEUR TROUVE EN ARRIERE.
<
< CAS OU L'ON RECONTRE UN POINT ISOLE :
<
         LAD         M3
         BSR         APRINT          < ON LE SIGNALE,
         BR          AGOGE           < ET ON RETOURNE A 'GE'.
<
< CAS OU L'ON SE DEPLACERA A DROITE :
<
CONT21:  EQU         $
         LAI         4               < AFIN D'ETRE SUR DE REINSERER
                                     < PTC DANS LE CAS D'UN VIRAGE
                                     < A DROITE...
         BSR         ASAVDP          < SAUVEGARDE DU SUCCES-
                                     < SEUR DE PTC, ET B=0.
         BSR         AREMPL          < REMPLACANT M1 (A GAUCHE
                                     < DU SUCCESSEUR 'SUC').
         BSR         AREMPL          < REMPLACANT M2 (EN ARRIERE
                                     < DE M1).
         JMP         CONT25          < VERS LE REMPLACANT M3 (A
                                     < DROITE DE M2).
<
< CAS OU L'ON SE DEPLACERA EN AVANT :
<
CONT22:  EQU         $
         LAI         1               < ON ATTEND 1 REMPLACANT.
         BSR         ASAVDP          < SAUVEGARDE DU SUCCESSEUR
                                     < DE PTC, ET B=0.
CONT25:  EQU         $               < REMPLACANT M3 (A GAUCHE
                                     < DU POINT COURANT 'PTC').
         BSR         AREMPL          < REMPLACANT M3.
         JMP         CONT26
<
< CAS OU L'ON SE DEPLACERA A GAUCHE OU EN ARRIERE :
<
CONT23:  EQU         $
CONT24:  EQU         $
         LAI         1               < ON FAIT COMME SI L'ON ATTEN-
                                     < DAIT 1 POINT, AFIN DE REINSERER
                                     < LE POINT COURANT.
         BSR         ASAVDP          < SAUVEGARDE DU SUCCESSEUR DE
                                     < PTC, ET B=0.
<
<        NOTA :
<                      DANS LE CAS DES DEPLACEMENTS A
<                    GAUCHE, ET EN ARRIERE, ON NE CHERCHE
<                    PAS DE REMPLACANTS, ILS NE SONT
<                    PAS NECESSAIRES, ET ILS RISQUE-
<                    RAIENT DE PERTURBER LA FORME DU CONTOUR !!!
<
CONT26:  EQU         $
         LR          B,A             < A=NBRE DE REMPLACANTS AINSI
                                     < TROUVES POUR PTC.
         CP          NREMPL          < A-T'ON OBTENU CE QU'ON
                                     < ATTENDAIT POUR LUI ???
         JE          CONT27          < OUI, C'EST BOB.
         LX          PTC+X           < NON, ALORS,
         LY          PTC+Y           < ...
         BSR         ASPILR          < PTC EST INSERE DANS PILR.
         ADRI        1,B             < ET ON COMPTE PTC COMME
                                     < UN REMPLACANT.
<
< DEPLACEMENT EFFECTIF SUR LE CONTOUR :
<
CONT27:  EQU         $
         STB         NPILR           < NPILR=NBRE DE POINTS EMPILES
                                     < DANS PILR ET A MARQUER SUR
                                     < LE CONTOUR QUE L'ON GENERE.
CONT50:  EQU         $
         DC          NPILR           < DECPOMPTAGE.
         JL          CONT51          < C'EST FINI...
         DC          APILR           < REGRESSION DU POINTEUR DE PILR.
         LY          &APILR
         DC          APILR           < REGRESSION DU POINTEUR DE PILR.
         LX          &APILR
CONT52:  EQU         $
         BSR         ASETV           < MARQUAGE VIRTUEL DE (X,Y).
         LA          PTC+X
         CP          DEP+X           < EST-ON AU POINT DE DEPART ???
         JNE         CONT50
         LA          PTC+Y
         CP          DEP+Y           < EST-ON AU POINT DE DEPART ???
         JNE         CONT50          < NON....
         STX         SDEP+X          < SAUVEGARDE DU FUTUR
         STY         SDEP+Y          < POINT DE DEPART.
         JMP         CONT50          < AU POINT SUIVANT.
CONT51:  EQU         $
<
< RESTAURATION DU VECTEUR DEPLACEMENT MENANT AU SUCCESSEUR :
<
         LA          SVX
         STA         VX
         LA          SVY
         STA         VY
<
< PASSAGE AU SUCCESSEUR :
<
         LX          SUC+X
         LY          SUC+Y
<
< A-T'ON BOUCLE UN TOUR ????
<
         LR          X,A
         CP          DEP+X
         JNE         CONT10          < NON, TRAITEMENT DU SUCCESSEUR...
         LR          Y,A
         CP          DEP+Y
         JNE         CONT10          < NON, TRAITEMENT DU SUCCESSEUR...
<
< CAS D'UN RETOUR AU POINT DE DEPART :
<
CONT30:  EQU         $
<
<        G E N E R A T I O N   D U   N O U V E A U
<        C O N T O U R   I N T E R I E U R  :
<
         LAD         LOADI
         SVC         0               < RAPPEL DE L'IMAGE DE TRAVAIL
                                     < COURANTE; A T T E N T I O N  :
                                     < LA 1ERE FOIS PUISQU'ELLE
                                     < N'EXISTE PAS, ON PREND DONC
                                     < A SA PLACE LE CONTOUR
                                     < INTERIEUR INITIAL..
         STZ         KDIFF           < PAS DE DIFFERENCE A PRIORI.
         STZ         RDK+3           < ON PART SUR LE SECTEUR 0.
         LA          AIMAG
         STA         AIMAG0          < GENERATION D'UN RELAI D'ACCES
                                     < AUX PARTIES DE L'IMAGE PAR JDX.
         LXI         LIMAG/128       < X=NBRE DE SECTEURS.
EOR1:    EQU         $
         PSR         X               < SAVE LE DECOMPTE DES SECTEURS.
         LB          RDK+3           < B=SECTEUR COURANT.
         BSR         ARESID          < QUE L'ON REND RESIDENT.
         LA          ASECTC          < A=RELAI/1 DU SECTEUR (B).
         ADRI        -1,A
         STA         ASECTC          < A=RELAI/1 DU SECTEUR (B).
         LXI         128             < X=NBRE DE MOTS A TRAITER.
EOR2:    EQU         $
         LA          &ASECTC         < A=MOT COURANT DU SECTEUR.
         AND         TRAME           < TRAMAGE EVENTUEL DE L'IMAGE
                                     < FINALE.
         LB          &AIMAG0         < ACCES IMAGE COURANTE DANS B.
         ORR         B,A             < ON RAJOUTE A L'IMAGE COURANTE,
                                     < LE NOUVEAU CONTOUR INTERIEUR.
         STA         &AIMAG0         < MAJ DE L'IMAGE MEMOIRE.
         CPR         A,B             < Y-A-T'IL UNE DIFFERENCE ???
         JE          EOR3            < NON...
         IC          KDIFF           < OUI, ON LA COMPTE.
EOR3:    EQU         $
         JDX         EOR2            < AU MOT PRECEDENT...
         LAI         128
         AD          AIMAG0          < PROGRESSION RELAI
         STA         AIMAG0          < D'ACCES A L'IMAGE.
         IC          RDK+3           < PROGRESION NUMERO SECTEUR.
         PLR         X               < RESTAURE LE DECOMPTE.
         JDX         EOR1            < AU SECTEUR SUIVANT.
         LAD         DELI
         SVC         0               < RAZ DE L'IMAGE DE TRAVAIL.
         LAD         STORI
         SVC         0               < ET NOUVELLE GENERATION.
         LB          SDEP+Y          < EVENTUEL FUTUR Y(DEP),
         LA          SDEP+X          < EVENTUEL FUTUR X(DEP).
         CPZ         SDEP            < SDEP EST-IL VALIDE ???
         JGE         CONT40          < OUI, CHANGEMENT DEP PAR SDEP.
         WORD        '1E16           < E R R E U R   P R O G  !!!
CONT40:  EQU         $
         STA         DEP+X
         STB         DEP+Y
         LA          KOMPT           < AU COURS DE CE TOUR, UN
                                     < REMPLACANT AU MOINS A-T'IL
                                     < ETE TROUVE ???
         JAG         LOOP            < OUI, IL FAUT FAIRE UN
                                     < NOUVEAU PARCOURS.
NLOOP:   EQU         $
         BR          AGOGE           < NON, L'IMAGE RESIDENTE
                                     < ET LE CONTOUR REMPLI ATTEN-
                                     < DU, ALORS QUE LA ZONE SCRATCH
                                     < CONTIENT LE SQUELETTE.
LOOP:    EQU         $
         CPZ         KDIFF           < Y-A-T'IL EU DES DIFFERENCES ???
         JE          NLOOP           < NON, ON ABANDONNE !!!
         CP          PKOMPT          < A-T'ON REMPLACE AUTANT
                                     < DE POINTS QU'AU TOUR
                                     < PRECEDENT ???
         STA         PKOMPT          < MAJ A PRIORI...
         JNE         LOOP1           < NON, ON VA FAIRE UN
                                     < NOUVEAU TOUR...
<
< CAS OU LE SYSTEME PARAIT OSCILLER :
<
         IC          OSCIL           < COMPTAGE DE L'OSCILLATION.
         LA          OSCIL
         CP          MOSCIL          < ABORT OU PAS ???
         JGE         NLOOP           < OUI, RETOUR A GE.
         BR          ALOOP           < NON, ON ATTEND ENCORE...
<
< CAS DU FONCTIONNEMENT NORMAL :
<
LOOP1:   EQU         $
         STZ         OSCIL           < REINITIALISATION DE OSCIL.
         BR          ALOOP           < VERS UN TOUR DE PLUS.
         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-2022.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2022.