NMPROC:  VAL         "KQ"            < NOM DU PROCESSEUR.
XXXEXT:  VAL         0               < PARCOURS EXTERIEUR (SUR LE NOIR, LE
                                     < LONG DU BLANC) ; SI 1, LE CONTRAIRE.
         IDP         "KQ - RELEASE 20/11/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:   EQU         ITEM2
         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
         PAGE
<
<
<        L O C A L  :
<
<
         LOCAL
LOC:     EQU         $
<
< MESSAGES :
<
M3:      BYTE        13;'6D
         ASCI        "POINT ISOLE!"
M8:      BYTE        9;'6D
         ASCI        "CONTOUR?"
M9:      BYTE        5;'6D
         ASCI        "ZDC?"
M10:     BYTE        20;'6D
         ASCI        "OAB INTERMEDIAIRES?"
M11:     BYTE        10;'6D
         ASCI        "MARQUAGE? "
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        '8000
         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
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
STABIL:  WORD        '8A01           < DEMANDE DE STABILISATION VIDEO.
         WORD        IMAG-ZERO*2
         WORD        LIMAG*2
         WORD        TVPV            < SUR LE PROCESSEUR VERT.
<
< CONSTANTES :
<
TROIS:   WORD        3
MASK1:   WORD        '7F7F           < MASQUE DE RECHERCHE DE CERTAINES
MASK2:   WORD        'DDFF           < PATTERNS DANS LES CARRES 3*3 :
VAL11:   WORD        '6400
VAL12:   WORD        '1300
VAL21:   WORD        'D000
VAL22:   WORD        '0580
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.
IGRAPH:  WORD        1               < 0=EMISSION GRAPHIQUE,
                                     < 1=PAS D'EMISSION GRAPHIQUE.
IOAB:    WORD        1               < 0 : OAB INTERMEDIAIRES,
                                     < 1 : OAB A LA FIN...
IMARK:   WORD        1               < 0 : MARQUAGE SUCCESIF DES POINTS DE
                                     <     CHAQUE CONTOUR EN VERT,
                                     < 1 : PAS DE MARQUAGE...
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:    EQU         $               < POUR EMPILER M1, M2, M3, PTC.
CDAP:    ASCI        "!CDA"
         BYTE        "P";'04
DCDAP:   WORD        2               < DEMANDE D'ENVOI DE "!CDAP".
         WORD        CDAP-ZERO*2
         WORD        80
         DZS         4*2+PILR-$      < SUITE ET FIN DE 'PILR' QUI EST EN
                                     < RECOUVREMENT DE CE QUI PRECEDE...
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.
         IF          XXXEXT,XWOR%,,XWOR%
POINTD:  WORD        0;0             < POINT NOIR PRECEDENT.
XWOR%:   VAL         0
VX:      WORD        1               < COORDONNEES X ET Y DU
VY:      WORD        0               < VECTEUR DEPLACEMENT.
SVX:     WORD        0               < SAVE VX.
SVY:     WORD        0               < SAVE VY.
TEMPO:   WORD        5*2             < NOMBRE DE CLIGNOTEMENTS VIDEO.
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.
ICONTO:  WORD        0               < 0 : JUSTE LES CONTOURS,
                                     < 1 : DE PLUS, LES REMPLIR...
WORK:    WORD        0               < VARIABLE DE TRAVAIL POUR 'CDA'.
         IF          XXXEXT,,XWOR%,
IEXT:    WORD        0               < 0 : 'VOISI' TRACE LE POINT (X,Y).
XWOR%:   VAL         0
<
< 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.
ASETM:   WORD        SETM            < MISE A 1 ET VISUALISATION VERT.
ARESET:  WORD        RESET           < MISE D'UN POINT A 0.
AINVER:  WORD        INVER           < INVERSION D'UN POINT.
ATEST:   WORD        TEST            < TEST DE L'ETAT D'UN POINT.
ATESTS:  WORD        TESTS           < TEST UN POINT ET MEMORISE,
ATEST3:  WORD        TEST3           < TEST 3 POINTS ALIGNES ET MEMORISE.
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.
AOSR:    WORD        OSR             < OPERATION SCRATCH-RESIDENT...
AVOSR:   WORD        VOSR            < INSTRUCTION VARIABLE...
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.
ASEND:   WORD        SEND            < EMISSION SEGMENT COURANT
                                     < ET ATTENTE D'ACQUITTEMENT.
ASENDO:  WORD        SENDO           < INSERTION POINT DE DEPART.
AGOGE:   WORD        GOGE            < RETOUR A GE.
ASUP1:   WORD        SUP1            < BOUCLE GENERALE...
ALOOP:   WORD        CONT18          < PARCOURS DU CONTOUR COURANT.
APRINT:  WORD        PRINT           < EDITION DES MESSAGES.
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.
ACONTO:  WORD        CONTO           < INVERSE DE 'CONTI'.
ARCDA:   WORD        RCDA            < RESIDENT <-- CDA,
AWCDA:   WORD        WCDA            < CDA <-- RESIDENT.
ARAZDK:  WORD        RAZDK           < RAZ DE LA ZONE SCRATCH DK.
AVTV:    WORD        VTV             < ACCES MEMOIRES TV...
<
< TOPOGRAPHIE MEMOIRE :
<
NSEC:    VAL         LIMAG/128       < NRE DE SECTEURS POUR UNE IMAGE.
XSECR:   VAL         2*LTNI-128-128  < A CAUSE DE 'SECTOR'...
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
XWOR%1:  VAL         '0000000@@@@
XWOR%2:  VAL         -1
XXXBUF:  VAL         XWOR%1>XWOR%2   < ADRESSE DU PREMIER BUFFER.
         IF          SECTOR-ZERO+128-XXXBUF,XWOR%,XWOR%,
         IF          ATTENTION : ERREUR DANS LES BUFFERS !!!
XWOR%:   VAL         0
                                     < @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         SECTOR+128
<
< LISTE D'OCCUPATION DES BUFFERS (DE 1 A NSECR) :
<
TOPO:    EQU         LSECT+NSEC
<
< COMPTEUR D'USAGE DES BUFFERS :
<
USE:     EQU         TOPO+NSECR
<
< VALIDATION IMPLANTATION :
<
         IF          USE-ZERO+NSECR-XXXBUF,XWOR%,XWOR%
         IF          ATTENTION : RECOUVREMENT !!!
XWOR%:   VAL         0
         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
<
<
<        A C C E S   M E M O I R E S   T V  :
<
<
<        ARGUMENT :
<                    A=COULEUR, ET SENS...
<
<
VTV:     EQU         $
         PSR         A,X
         STA         STABIL+3
         LAD         STABIL
         SVC         0               < EXECUTION DE L'ORDRE...
         PLR         A,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, PAS DE MISE A JOUR...
         STA         &ASECTC         < NON, 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
<
<
<        O P E R A T I O N   S C R A T C H - R E S I D E N T  :
<
<
<        ARGUMENT :
<                    A=OPERATION VARIABLE...
<
<
OSR:     EQU         $
         PSR         A,B,X
         STA         &AVOSR          < OPERATION VARIABLE...
         STZ         RDK+3           < ON COMMENCE SUR LE 0...
         LA          AIMAG
         STA         AIMAG0          < INITIALISATION DU POINTEUR 'RESIDENT'.
         LXI         LIMAG/128       < NOMBRE DE SECTEURS...
XEOR1:   EQU         $
         PSR         X
         LB          RDK+3
         BSR         ARESID          < ACCES AU SECTEUR (B).
         LA          ASECTC
         ADRI        -1,A            < CALCUL DU RELAI D'ACCES AU SECTEUR
         STA         ASECTC          < COURANT (B) PAR 'JDX'.
         LXI         128             < NOMBRE DE MOTS/SECTEURS.
XEOR2:   EQU         $
         LA          &ASECTC
VOSR:    JMP         $               < INSTRUCTION VARIABLE
         STA         &AIMAG0
         JDX         XEOR2
         LAI         128
         AD          AIMAG0
         STA         AIMAG0
         IC          RDK+3           < AU SECTEUR SUIVANT...
         PLR         X
         JDX         XEOR1
         PLR         A,B,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 E S I D E N T   -->   S C R A T C H  :
<
<
CONTO:   EQU         $
         PSR         A,B,X,Y
         STZ         WDK+3           < DEPART SUR LE SECTEUR 0.
         LRM         Y               < Y EST LA BASE COURANTE DE L'IMAGE.
         WORD        IMAG
         LXI         LIMAG/128       < X=NOMBRE DE SECTEURS...
CONTO1:  EQU         $
         PSR         X
         LB          WDK+3           < B=NUMERO DU SECTEUR COURANT,
         BSR         ARESID          < QUE L'ON REND RESIDENT...
         LX          WDK+3
         LB          &ALSECT         < B=ADRESSE DE SON BUFFER (RECEPTEUR),
         LR          Y,A             < A=EMETTEUR (MORCEAU D'IMAGE),
         LXI         128             < X=NOMBRE DE MOTS A DEPLACER,
         ADR         X,Y             < Y=MORCEAU D'IMAGE SUIVANT...
         MOVE                        < ENVOI DE L'IMAGE EN SCRATCH...
         PLR         X
         IC          WDK+3           < SECTEUR SUIVANT...
         JDX         CONTO1
         PLR         A,B,X,Y
         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
<
<
<        A C C E S   A   L A   C D A  :
<
<
RCDA:    EQU         $               < RESIDENT <-- CDA.
         PSR         A,B,X
         LRM         A,B,X
         WORD        0               < A=EMETTEUR EN CDA,
         WORD        IMAG            < B=RECEPTEUR RESIDENT,
         WORD        LIMAG           < X=LONGUEUR DE L'IMAGE.
         RCDA
         PLR         A,B,X
         RSR
WCDA:    EQU         $               < CDA <-- RESIDENT.
         PSR         A,B,X
         LRM         A,B,X
         WORD        0               < A=RECEPTEUR EN CDA,
         WORD        IMAG            < B=EMETTEUR RESIDENT,
         WORD        LIMAG           < X=LONGUEUR DE L'IMAGE.
         WCDA
         PLR         A,B,X
         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
<
<
<        M I S E   A   1   E T   M A R Q U A G E   B L E U  :
<
<
SETM:    EQU         $
         CPZ         IMARK           < MARQUAGE ???
         JNE         SETM1           < NON...
         PSR         A
         BSR         AINVER          < MARQUAGE...
         LAI         TVPB
         BSR         AVTV            < VISUALISATION BLEU...
         BSR         AINVER          < ET EFFACEMENT...
         LAI         TVPB
         BSR         AVTV
         PLR         A
SETM1:   EQU         $
         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
<
<
<        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
<
<
<        T E S T   E T   M E M O R I S E  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME TESTE LE POINT
<                    COURANT (X,Y) ; SI CE DERNIER EST
<                    A 1, ALORS, IL MARQUE DANS LE REGISTRE
<                    'B' LE BIT DE RANG 'W' ; ENFIN IL
<                    INCREMENTE 'W'.
<
<
TESTS:   EQU         $
         BSR         ATEST           < TEST DE M(X,Y).
         JNC         TESTS1          < POINT A 0...
         XR          X,W
         SBT         16,X            < MARQUAGE...
         XR          X,W
TESTS1:  EQU         $
         ADRI        1,W             < PROGRESSION DE L'INDEX...
         RSR
<
<
<        T E S T   3   P O I N T S   A L I G N E S  :
<
<
<        FONCTION :
<                      IDEM A 'TESTS' MAIS SUR 3
<                    POINTS ALIGNES HORIZONTALEMENT
<                    ET CONSECUTIFS...
<
<
TEST3:   EQU         $
         BSR         ATESTS          < M(X,Y).
         ADRI        1,X
         BSR         ATESTS          < M(X+1,Y).
         ADRI        1,X
         BSR         ATESTS          < M(X+2,Y).
         ADRI        -2,X            < RETOUR EN PREMIERE COLONNE,
         ADRI        1,Y             < ET CHANGEMENT DE LIGNE..
         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 ET A=0 SI UN POINT TRACE.
<
<
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).
         IF          XXXEXT,,XWOR%,
         LAI         1               < PAS DE TRACE A PRIORI...
         CPZ         IEXT            < ???
         JNE         VOISI1          < PAS DE TRACE.
         BSR         ASETV           < ON TRACE (X,Y)...
         LAI         0               < ET ON LE MEMORISE...
XWOR%:   VAL         0
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).
         PAGE
<
<
<        R E T O U R   A   ' G E '  :
<
<
GOGE:    EQU         $
         BSR         ARCDA           < RESIDENT <-- CDA.
<
< NOTA : SI IOAB=0, ON ENVOIE MALGRE
< TOUT UN OAB BIEN QU'AUCUN SEGMENT
< N'AIT ETE TRANSMIS DEPUIS LE DER-
< NIER OAB INTERMEDIARE :
<
         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         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  :
<
<
<
<        FONCTION :
<                      CE PROCESSEUR, EXTRAIT TOUS LES
<                    CONTOURS DE L'IMAGE RESIDENTE, ET
<                    EVENTUELLEMENT LES REMPLIT ; DE PLUS
<                    ROUGE --> IMAGE ARGUMENT,
<                    VERT --> IMAGE REMPLIE,
<                    BLEU --> CONTOURS.
<                    RESIDENT --> CONTOURS REMPLIS EVENTUELLEMENT, OU NOIR.
<
<
         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         DCDAP
         SVC         0               < ENVOI DE "!CDAP"...
         LAD         DEMMEM
         SVC         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...
<
< INITIALISATION DES TABLES :
<
         LXI         NSEC
         LAI         -1
INIT1:   EQU         $
         STA         &ALS            < 'LSECT'.
         JDX         INIT1
         LXI         NSECR
INIT2:   EQU         $
         STZ         &ATOPO          < 'TOPO'.
         STZ         &AUSE           < 'USE'.
         JDX         INIT2
         BSR         ARAZDK          < NOIR --> SCRATCH...
<
<        S U P P R E S S I O N   D E S   C O U L O I R S
<        N O I R S   L A R G E   D ' U N   P O I N T  :
<
SUPP40:  EQU         $
         STZ         KOMPT           < RAZ DU COMPTEUR DES POINTS RAJOUTES.
         LYI         1
SUPP4:   EQU         $
         LXI         1
SUPP1:   EQU         $
         BSR         ATEST           < TEST M(X,Y).
         JNC         SUPP20          < NOIR...
         BSR         ASETV           < BLANC, ON LE MARQUE...
         JMP         SUPP2
SUPP20:  EQU         $
         PSR         X,Y,W
         LBI         0               < CLEAR LA LISTE DE POINTS A 1.
         EORR        W,W             < W=0, INDEX DES POINTS DANS 'B'.
         ADRI        -1,X            < POSITIONNEMENT SUR
         ADRI        -1,Y            < M(X-1,Y-1).
         STX         PTC+X           < QUE L'ON SAUVEGARDE...
         STY         PTC+Y
         BSR         ATEST3          < M(X-1,Y-1), M(X,Y-1), M(X+1,Y-1).
         BSR         ATEST3          < M(X-1,Y), M(X,Y), M(X+1,Y).
         BSR         ATEST3          < M(X-1,Y+1), M(X,Y+1), M(X+1,Y+1).
         LR          B,A             < A=LISTE DES POINTS A 1...
         AND         MASK1
         CP          VAL11           < EST-CE UN COIN ???
         JE          SUPP11          < OUI, RIEN...
         CP          VAL12           < COIN ???
         JE          SUPP11          < OUI, RIEN...
         LR          B,A             < A=LISTE DES POINTS A 1...
         AND         MASK2
         CP          VAL21           < COIN ???
         JE          SUPP11          < OUI, RIEN...
         CP          VAL22           < COIN ???
         JE          SUPP11          < OUI, RIEN...
         LR          B,A
         LBI         0               < A,B=LISTE DES POINTS A 1...
SUPP10:  EQU         $
         DBT                         < RECHERCHE DU PREMIER POINT A 1 :
         JC          SUPP11          < IL N'EXISTE PAS, OU FINI...
         RBT         0,X             < OK, ON L'AFFACE DE LA LISTE...
         JAE         SUPP11          < PLUS DE POINT A 1 DERRIERE LUI,
                                     < RIEN A FAIRE...
         LR          X,W             < W=INDEX DU PREMIER POINT A 1
                                     < COURANT DANS LE CARRE 3*3...
SUPP13:  EQU         $
         ADRI        1,X
         TBT         0,X             < RECHERCHE D'UN SUIVANT DE 'W' A 1...
         JC          SUPP12          < OK...
SUPP17:  EQU         $
         XR          A,X
         CPI         9-1
         XR          A,X
         JL          SUPP13          < IL REST D'AUTRE POINT A TESTER
                                     < DERRIERE 'W'...
         JMP         SUPP10          < NON, CHANGEMENT DU PREMIER POINT
                                     < A 1 COURANT...
SUPP12:  EQU         $
         PSR         A,B,X,Y
         LR          W,A             < A=INDEX DU PREMIER POINT BLANC.
         SARD        16
         DV          TROIS
         PSR         A,B             < SAVE LE PREMIER POINT BLANC...
         LR          A,Y             < Y=DELTA(Y) PREMIER POINT BLANC,
         LR          X,A             < A=INDEX DU POINT BLANC COURANT...
         LR          B,X             < X=DELTA(X) PREMIER POINT BLANC.
         SARD        16
         DV          TROIS           < A=DELTA(Y) POINT BLANC COURANT,
                                     < B=DELTA(X) POINT BLANC COURANT.
         SBR         X,B             < DISTANCE EN X ET EN Y ENTRE LES 2
         SBR         Y,A             < POINTS BLANCS CONSIDERES...
         PSR         A,B             < SAVE CETTE DISTANCE...
         JAGE        SUPP30
         NGR         A,A             < EN VALEUR ABSOLUE...
SUPP30:  EQU         $
         CPZR        B
         JGE         SUPP31
         NGR         B,B             < EN VALEUR ABSOLUE...
SUPP31:  EQU         $
         CPI         2
         JE          SUPP32          < OK, ELOIGNES DE 2 EN Y...
         LR          B,A
         CPI         2
         JE          SUPP32          < OK, ELOIGNES DE 2 EN X...
         ADRI        -4,K            < A CAUSE DES PSR...
         JMP         SUPP15          < RIEN A FAIRE...
SUPP32:  EQU         $
         PLR         A
         SARS        1
         LR          A,X             < X=ELOIGNEMENT/2 EN X...
         PLR         A
         SARS        1
         LR          A,Y             < Y=ELOIGNEMENT/2 EN Y.
         PLR         A,B
         ADR         A,Y             < CALCUL D'UN POINT A MI-CHEMIN
         ADR         B,X             < DES 2 POINTS BLANCS...
         LA          PTC+X
         LB          PTC+Y
         ADR         A,X
         ADR         B,Y
         BSR         ATEST           < DEJA A 1 ???
         JC          SUPP15          < OUI, ON NE LE REMET PAS...
         BSR         ASETV           < MARQUAGE DE M(X,Y).
         IC          KOMPT           < COMPTAGE DES POINTS RAJOUTES...
SUPP15:  EQU         $
         PLR         A,B,X,Y
         JMP         SUPP17          < VERS LE CHANGEMENT DE POINT
                                     < BLANC COURANT...
SUPP11:  EQU         $
         PLR         X,Y,W
SUPP2:   EQU         $
         ADRI        1,X
         LR          X,A
         CP          NPPL
         JL          SUPP1
         ADRI        1,Y
         LR          Y,A
         CP          NLIG
         JL          SUPP4
         BSR         ACONTI          < RECUPERATION DE L'IMAGE COMPLETEE,
         LAI         TVPR
         BSR         AVTV            < QUE L'ON ENVOIE SUR LE ROUGE...
         BSR         ARAZDK          < PUIS ON RAZE LE SCRATCH...
         CPZ         KOMPT           < A-T'ON RAJOUTE DES POINTS ???
         JNE         SUPP40          < OUI, ALORS ON REMET CELA...
<
<        E X T R A C T I O N   D E S   C O N T O U R S  :
<
<
< MARQUAGE ???
<
GR1Y:    EQU         $
         LAD         M11
         BSR         APRINT
         LAD         DEMREP
         SVC         0
         LBY         REP
         CPI         "N"
         JE          GR2Y            < "N" : IMARK=1.
         CPI         "O"
         JNE         GR1Y            < ???
         STZ         IMARK           < "O" : IMARK=0.
GR2Y:    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.
GR1X:    EQU         $
         LAD         M10
         BSR         APRINT
         LAD         DEMREP
         SVC         0
         LBY         REP
         CPI         "N"
         JE          GR2X            < "N" : IOAB=1.
         CPI         "O"
         JNE         GR1X            < ???
         STZ         IOAB            < "O" : IOAB=0.
GR2X:    EQU         $
GR2:     EQU         $
CONT90:  EQU         $
         STZ         ICONTO          < OUI A PRIORI (0)...
         CPZ         IMARK           < MARQUAGE ???
         JE          CONT60          < OUI, JUSTE LES CONTOURS...
         LAD         M8
         BSR         APRINT
         LAD         DEMREP
         SVC         0
         LBY         REP             < A=REPONSE DE "CONTOUR" ???
         CPI         "O"
         JE          CONT60          < OUI...
         IC          ICONTO          < NON A PRIORI (1)...
         CPI         "N"
         JNE         CONT90          < ERREUR !!!
CONT60:  EQU         $
<
< INITIALISATION TV :
<
         BSR         ACONTI          < NOIR --> RESIDENT.
         LAI         TVPB
         BSR         AVTV            < NOIR --> BLEU (FUTUR CUMUL DES CONTOURS).
         LAI         TVPV
         BSR         AVTV            < NOIR --> VERT (FUTURS SQUELETTES).
         BSR         AWCDA           < CDA <-- NOIR.
<
<
<        B O U C L E   G E N E R A L E  :
<
<
         LXI         0               < POINT COURANT
         LYI         0               < A L'ORIGINE...
SUP1:    EQU         $
         STZ         ITEST
         IC          ITEST
         LAI         TVPR?TVIN
         BSR         AVTV            < ARGUMENT --> RESIDENT.
SUP5:    EQU         $
         BSR         ATEST
         JNC         SUP3            < ON S'ARRETE SUR LE PREMIER 0...
SUP6:    EQU         $
         ADRI        1,Y             < ON ELEMINE LES CHAINES
         LR          Y,A             < VERTICALES DE 1...
         CP          NLIG
         JLE         SUP5
         LYI         0
         ADRI        1,X
         LR          X,A
         CP          NPPL
         JLE         SUP5
         BR          AGOGE           < C'EST FINI...
SUP4:    EQU         $
         BSR         ATEST           < TEST DU POINT (X,Y) ???
         JC          SUP2            < A 1...
SUP3:    EQU         $               < A 0, ON EN CHANGE...
         IF          XXXEXT,XWOR%,,XWOR%
         STX         POINTD+X        < MEMORISATION DU DERNIER POINT
         STY         POINTD+Y        < NOIR RENCONTRE...
XWOR%:   VAL         0
         ADRI        1,Y             < CHANGEMENT DE LIGNE,
         LR          Y,A
         CP          NLIG            < ???
         JLE         SUP4
         LYI         0               < CHANGEMENT DE COLONNE...
         ADRI        1,X
         LR          X,A
         CP          NPPL            < ???
         JLE         SUP4
         BR          AGOGE           < FIN D'EXPLORATION...
SUP2:    EQU         $
         IF          XXXEXT,,XWOR%,
         BSR         ATESTV          < LE POINT A 1 TROUVE DANS L'IMAGE
                                     < ARGUMENT N'AURAIT-IL PAS DEJA ETE
                                     < PRIS DANS UN CONTOUR ANTERIEUR ???
         CPZ         INDIC
         JE          SUP6            < OUI, ON L'IGNORE...
XWOR%:   VAL         0
         IF          XXXEXT,XWOR%,,XWOR%
         LX          POINTD+X        < ON SE PLACE SUR LE DERNIER
         LY          POINTD+Y        < POINT NOIR RENCONTRE.
         BSR         ATESTV          < EST-CE SUR CONTOUR ANTERIEUR ???
         CPZ         INDIC
         JE          SUP6            < OUI, ON L'IGNORE...
XWOR%:   VAL         0
         PSR         X,Y             < SAVE LE POINT COURANT,
         STX         DEP+X           < QUI EST LE NOUVEAU
         STY         DEP+Y           < POINT DE DEPART...
         STZ         VX
         IC          VX              < VX=+1,
         STZ         VY              < VY=0...
         BSR         ASENDO          < INSERTION POINT DE DEPART.
         BSR         ASETV           < MARQUAGE DU POINT DE DEPART.
         LBI         0               < INITIALISATION DU COMPTAGE...
         ADRI        1,X
         BSR         AVOISI          < M(X+1,Y).
         ADRI        -2,X
         BSR         AVOISI          < M(X-1,Y).
         ADRI        1,Y
         ADRI        1,X
         BSR         AVOISI          < M(X,Y+1).
         ADRI        -2,Y
         BSR         AVOISI          < M(X,Y-1).
         ADRI        1,Y
         LR          B,A
         CPI         4               < 4 VOISINS A 1 OU INEXISTANTS ???
         JE          CONT7           < OUI, POINT NOIR ISOLE...
<
<        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
         IF          XXXEXT,,XWOR%,
         STZ         IEXT            < TRACE DANS 'MOVI'...
XWOR%:   VAL         0
         BSR         AVOISI          < ET ON TESTE LES 3 POINTS
                                     < IMMEDIATEMENT A DROITE DU
                                     < POINT COURANT SUIVANT LE
                                     < MOUVEMENT (VX,VY).
         IF          XXXEXT,,XWOR%,
         JAE         TROUVE          < ON A TROUVE UN POINT...
XWOR%:   VAL         0
         BSR         AROT1
         BSR         AMOV
         BSR         AVOISI
         IF          XXXEXT,,XWOR%,
         JAE         TROUVE          < ON A TROUVE UN POINT...
XWOR%:   VAL         0
         BSR         AROT1
         BSR         AROT1
         BSR         AMOV
         BSR         AMOV
         BSR         AVOISI
         IF          XXXEXT,,XWOR%,
TROUVE:  EQU         $
         IC          IEXT            < IEXT#0.
XWOR%:   VAL         0
         PLR         X,Y             < RESTAURE LE POINT COURANT.
         PSR         A               < SAVE LES CONDITIONS DE 'VOISI'.
         LA          SANGLE
         STA         ANGLE           < RESTAURE ANGLE.
         LA          SVX
         STA         VX              < RESTAURE VX.
         LA          SVY
         STA         VY              < RESTAURE VY.
         PLR         A               < A=CONDITIONS DE 'VOISI'.
         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).
         IF          XXXEXT,,XWOR%,
         JANE        CONT1           < 'VOISI' N'A RIEN FAIT...
         LA          POINT1+X        < LE POINT TRACE EST-IL
         CP          DEP+X           < LE POINT DE DEPART ???
         JNE         CONT1           < NON...
         LA          POINT1+Y        < MEME QUESTION...
         CP          DEP+Y
         JNE         CONT1           < NON...
XWOR%:   VAL         0
         IF          XXXEXT,XWOR%,,XWOR%
         BSR         ASETM
         BSR         ASETV           < MARQUAGE VIRTUEL DU POINT COURANT.
         LR          X,A
         CP          DEP+X
         JNE         CONT1           < CONTOUR PAS ENCORE FERME...
         LR          Y,A
         CP          DEP+Y
         JNE         CONT1           < CONTOUR PAS ENCORE FERME...
XWOR%:   VAL         0
         CPZ         IOAB            < OAB INTERMEDIAIRES ???
         JNE         CONT7           < NON...
         STZ         SEGEXT+X        < OUI...
         STZ         SEGEXT+Y
         LXI         0
         LY          NLIG
         BSR         ASEND           < OAB DE FIN DE CONTOUR COURANT...
<
< ON A LE CONTOUR INTERIEUR :
<
CONT7:   EQU         $
         CPZ         ICONTO          < CONTOUR OU REMPLISSAGE ???
         JNE         CONT91          < REMPLISSAGE...
         BSR         ACONTI          < ACCES AU CONTOUR GENERE...
         LAI         TVPB
         BSR         AVTV            < DIFFUSION DU CONTOUR GENERE --> BLEU.
         PLR         X,Y             < RESTAURE LE POINT COURANT...
         BR          ASUP1           < CONTOUR...
CONT91:  EQU         $
<
<        I S O L A T I O N   D E R N I E R   C O N T O U R  :
<
         BSR         AVIRE           < MISE DES CONTOURS EN SCRATCH.
         LAI         TVPB?TVIN
         BSR         AVTV            < BLEU --> RESIDENT.
         LRM         A
         EOR         &AIMAG0         < POUR EXTRACTION DU DERNIER CONTOUR...
         BSR         AOSR            < RESIDENT <-- RESIDENT.EOR.SCRACTH.
         LRM         A,B,X
         WORD        IMAG
         WORD        IMAG+LIMAG
         WORD        LIMAG
         MOVE                        < SAUVEGARDE DU CONTOUR COURANT.
         BSR         ACONTI          < (CONTOUR(0),... CONTOUR(N)) --> RESIDENT.
         LAI         TVPB
         BSR         AVTV            < RESIDENT --> BLEU.
         LAI         TVPV?TVIN       < SQUELETTE --> RESIDENT.
         BSR         AVTV
         BSR         ACONTO          < SQUELETTES --> SCRATCH.
         LRM         A,B,X
         WORD        IMAG+LIMAG
         WORD        IMAG
         WORD        LIMAG
         MOVE                        < RESTAURATION DU CONTOUR COURANT.
         LAD         DELI
         SVC         0               < DELETE IMAGE DE TRAVAIL...
<
<        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.
         JMP         CONT1X          < LA PREMIERE FOIS...
<
<        R E M P L I S S A G E   D U   C O N T O U R  :
<
CONT18:  EQU         $
         BSR         ACONTI          < RECUPERATION DU SQUELETTE...
CONT1X:  EQU         $
         BSR         ARAZDK
<
< 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         $
         LRM         A,B,X
         WORD        LIMAG-1         < A=EMETTEUR CDA,
         WORD        WORK            < B=RECEPTEUR RESIDENT,
         WORD        LIMAG           < X=NOMBRE DE MOTS DE L'IMAGE.
CDA1:    EQU         $
         PSR         A,X
         LXI         1
         RCDA
         PLR         X
         LA          &AIMAG          < ACCES AU REMPLISSAGE COURANT,
         OR          WORK            < CUMUL DU REMPLISSAGE COURANT...
         STA         &AIMAG
         PLR         A
         ADRI        -1,A            < CHANGEMENT DE L'EMETTEUR.
         JDX         CDA1
         BSR         AWCDA           < CDA <-- RESIDENT (REMPLISSAGES).
         LAI         TVPV?TVIN
         BSR         AVTV            < SQUELETTE --> RESIDENT,
         LRM         A
         OR          &AIMAG0
         BSR         AOSR            < CUMUL DES SQUELETTES...
         LAI         TVPV
         BSR         AVTV            < SQUELETTE --> VERT.
         LAI         TVPB?TVIN
         BSR         AVTV            < BLEU --> RESIDENT,
         BSR         ACONTO          < CONTOURS 0 A N --> SCRATCH.
         CPZ         IOAB            < OAB INTERMEDIAIRES ???
         JNE         FINSQ           < NON...
         STZ         SEGEXT+X        < OUI...
         STZ         SEGEXT+Y
         LXI         0
         LY          NLIG
         BSR         ASEND           < OAB DE FIN DE CONTOUR COURANT...
FINSQ:   EQU         $
         PLR         X,Y             < RESTAURATION DU POINT COURANT...
         BR          ASUP1           < AU SUIVANT...
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-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2024.