NMPROC:  VAL         "EZ"            < NOM DU PROCESSEUR.
         IDP         "EZ - RELEASE 01/06/1979"
         EOT         #SIP DEFINITION CMS5#
         EOT         #SIP DEF PROCESSEUR#
         PROG
         WORD        IMAGE           < ENTRY POINT DU GENERATEUR.
         WORD        0
PIMAGE:  EQU         $               < P='12 !!!
         LRP         L
         BR          -2,L            < ENTREE DANS LE PROCESSEUR KO.
         EOT         #SIP DEFINITION ITEM#
ITEM1:   EQU         ZERO+PILE-LTNI
ITEM2:   EQU         ZERO+PILE-LTNI-LTNI
         PAGE
<
<
<        I M A G E S   G R A P H I Q U E   E T   V I D E O  :
<
SIZE:    VAL         '528            < TAILLE PRESUMEE DU PROGRAMME.
<
< PILE DU PROGRAMME :
<
SSTACK:  VAL         40              < IL FAUT CE QU'IL FAUT...
STACK:   DZS         SSTACK
         EOT         #SIP IMAGE 256#
NOM:     EQU         ZERO+PILE+5-LNOM-2  < NOM DE L'IMAGE VIDEO.
IMAG:    EQU         NOM+LNOM+2      < IMAGE VIDEO.
<
< VALIDATION DU FORMAT DE L'IMAGE (CARREE) :
<
X20:     VAL         1024/DY         < NBRE DE LIGNES/IMAGE.
X21:     VAL         CNMPL*16        < NBRE DE POINTS/LIGNE.
         IF          X20-X21,,X100,
         IF          ATTENTION : L'IMAGE N'EST PAS CARREE !!!
X100:    VAL         0
<
< BUFFER DES SECTEURS SCRATCHES :
<
SECTOR:  EQU         STACK+SSTACK
         DZS         128             < CELA PEUT TOUJOURS SERVIR !!!
         PAGE
<
<
<        L O C A L  :
<
<
M16:     BYTE        15;'6D
         ASCI        "POINTS ISOLES?"
         LOCAL
LOC:     EQU         $
<
< MESSAGES :
<
M3:      BYTE        20;'6D
         ASCI        "OAB INTERMEDIAIRES? "
M9:      BYTE        5;'6D
         ASCI        "ZDC?"
M14:     BYTE        5;'6D
         ASCI        "PAS="
AM16:    WORD        M16
NOMSEG:  WORD        0               < 0=INVALIDE,
                                     < -1=VALIDE.
SEG:     DZS         4
LONSEG:  VAL         $-NOMSEG*2
SEGORG:  EQU         SEG+0
SEGEXT:  EQU         SEG+2
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
RDK:     WORD        '0C00           < LECTURE SCRATCH DU DISQUE.
         WORD        SECTOR-ZERO*2
         WORD        128*2
         WORD        0               < NUMERO DU SECTEUR.
WDK:     WORD        '0C02           < ECRITURE SCRATCH DU DISQUE.
         WORD        SECTOR-ZERO*2
         WORD        128*2
         WORD        0               < NUMERO DU SECTEUR.
STOGS:   WORD        '000A           < EMISSION SEGMENT COURANT.
         WORD        NOMSEG-ZERO*2
         WORD        LONSEG
         WORD        'FFC0           < VALIDATION DE LA ZDC.
GETGS:   WORD        '0008           < ACCES NOMSEG COURANT.
         WORD        NOMSEG-ZERO*2
         WORD        SEG-NOMSEG*2
         WORD        'C000
<
< CONSTANTES :
<
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=EMETTRE APRES CHAQUE CHAINE
                                     < EXTRAITE UN 'OAB'.
ISOL:    WORD        0               < 0 : ON CONSERVE LES POINTS ISOLES.
NMOTS:   WORD        2*LTNI          < NBRE DE MOTS DE ITEM1+ITEM2.
ALIMAG:  WORD        LIMAG           < NBRE DE MOTS DE L'IMAGE.
NMPL:    WORD        CNMPL           < NBRE MOTS DE 16 BITS PAR LIGNE.
NLIG:    WORD        1024/DY-1       < NBRE DE LIGNES/IMAGE-1.
NPPL:    WORD        CNMPL*16-1      < NBRE DE POINTS/LIGNE-1.
YMIN:    WORD        0               < DERNIERE LIGNE A TESTER LORS
                                     < DES BALAYAGES DE L'IMAGE
                                     < POUR ELIMINER LES POINTS
                                     < 0-ISOLES ET 1-ISOLES.
YMAX:    WORD        0               < DE MEME : PREMIERE LIGNE...
ITEST:   WORD        1               < 0 : TEST SUR LA VALEUR 0 DES POINTS,
                                     < 1 : TEST SUR VALEUR 1 DES POINTS.
X:       VAL         1               < COORDONNEE X D'UN POINT.
Y:       VAL         0               < COORDONNEE Y D'UN POINT.
DEP:     WORD        0;0             < POINT DE DEPART D'UN CONTOUR.
ARRIV:   WORD        0;0             < POINT D'ARRIVEE D'UN CONTOUR.
PTC:     WORD        0;0             < POINT COURANT LORS D'UN PARCOURS.
SUC:     WORD        0;0             < SUCCESSEUR DU POINT COURANT (X,Y).
NREMPL:  WORD        0               < NOMBRE DE REMPLACANTS ATTEN-
                                     < DUS POUR LE POINT COURANT.
REMP:    WORD        0;0             < FUTUR REMPLACANT DU POINT
                                     < COURANT SUR LE CONTOUR LORS DE
                                     < SON PARCOURS.
NPILR:   WORD        0               < NBRE DE POINTS A DEPILER
                                     < DE LA PILE 'PILR'.
APILR:   WORD        0               < REALI COURANT VERS PILR.
PILR:    DZS         4*2             < POUR EMPILER M1, M2, M3, PTC.
SDEP:    WORD        0;0             < POINT DE DEPART POUR LE TOUR
                                     < SUIVANT (FUTUR 'DEP').
POINT1:  WORD        0;0             < CONTIENT UN POINT QUE L'ON SAIT
                                     < SAIT ETRE A 1 LORS DE LA
                                     < RECHERCHE DES VOISINS.
VX:      WORD        1               < COORDONNEES X ET Y DU
VY:      WORD        0               < VECTEUR DEPLACEMENT.
SVX:     WORD        0               < SAVE VX.
SVY:     WORD        0               < SAVE VY.
KOMPT:   WORD        0               < COMPTEUR DES POINTS MIS A 1,
                                     < LORS D'UN PARCOURS DE REM-
                                     < PLISSAGE.
NISOL:   WORD        0               < NOMBRE DE POINTS ISOLES,
                                     < OU SIMPLEMENT RATTACHES
                                     < RECONTRES AVANT CHAQUE
                                     < PARCOURS.
INDIC:   WORD        0               < RESULTAT (0/1) DES TESTS
                                     < VIRTUELS.
ANGLE:   WORD        0               < SOMMATION DES ROTATIONS
                                     < PARTIELLES 'ROT1' ET 'ROT3' :
                                     < +1 : +PI/2 (ROT1),
                                     < -1 : -PI/2 (ROT3).
SANGLE:  WORD        0               < SAUVEGARDE TEMPORAIRE DE
                                     < L'ANGLE COURANT LORS DES
                                     < RECHERCHES DE VOISINS.
PREM:    WORD        1               < 1 : 1ER POINT DE L'IMAGE
                                     < NON ENCORE RENCONTRE,
                                     < 0 SINON.
KSEG:    WORD        0               < COMPTEUR COURANT DES SEGMENTS.
NSEG:    WORD        0               < N'EMETTRE QU'UN SEGMENT SUR 'NSEG'.
SAVEY:   WORD        0               < SAVE Y(DEP) OU Y(ARRIV).
KTOUR:   WORD        1               < 1 : 1ERE FOIS, OU BIEN, ON VIENT
                                     <     DE GENERER UNE NOUVELLE
                                     <     IMAGE RESIDENTE.
<
< 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.
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.
                                     < AVEC MARQUAGE VIRTUEL.
AVOIS:   WORD        VOIS            < 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.
ASOAB:   WORD        SOAB            < EMISSION DE 'OAB'.
AGOGE:   WORD        GOGE            < RETOUR A GE.
APRINT:  WORD        PRINT           < EDITION DES MESSAGES.
AENTER:  WORD        ENTER           < ENTREE REPONSE OUI/NON.
AMESS:   WORD        0               < VARIABLE TEMPORAIRE DE 'ENTER'.
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.
ALOOP:   WORD        LOOP1           < UN TOUR D'EXTRACTION.
<
< 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
<
<
<        E N T R E E   R E P O N S E  :
<
<
<        ARGUMENT :
<                    A=@MESSAGE.
<
<
<        RESULTAT :
<                    B=0 : OUI,
<                      1 : NON,
<                    LES INDICATEURS SONT POSITIONNES PAR 'CPZR B'.
<
<
ENTER1:  EQU         $
         LA          AMESS           < RESTAURE A=@MESSAGE.
ENTER:   EQU         $
         STA         AMESS           < SAVE @MESSAGE.
         BSR         APRINT          < ENVOI DU MESSAGE.
         PSR         X
         LAD         DEMREP
         SVC         0               < ENTREE DE LA REPONSE.
         PLR         X
         LBY         REP             < A=REPONSE.
         LBI         0               < 0 : OUI A PRIORI.
         CPI         "O"
         JE          ENTER2          < OUI.
         CPI         "N"
         JNE         ENTER1          < RIEN COMPRIS...
         LBI         1               < 1 : NON.
ENTER2:  EQU         $
         CPZR        B               < POUR UN TEST EN RETOUR...
         RSR
         PAGE
<
<
<        E M I S S I O N   S E G M E N T   C O U R A N T  :
<
<
<        FONCTION :
<                      CETTE ROUTINE EMET, SI CELA A ETE
<                    DEMANDE PAR L'UTILISATEUR LE SEGMENT
<                    COURANT A L'AIDE DE LA ZDC, ET ATTEND
<                    L'ACCUSE DE RECEPTION...
<
<
<        ARGUMENT :
<                    X,Y=COORDONNEES DU POINT COURANT (SEGEXT).
<
<
SEND:    EQU         $
         CPZ         IGRAPH          < GRAPHIQUE DEMANDE ???
         JNE         SEND1           < NON, RIEN A FAIRE.
         DC          KSEG            < LE MOMENT EST-IL VENU D'EMETTRE ???
         JG          SEND1           < NON...
         LA          NSEG            < OUI, ON REINITIALISE
         STA         KSEG            < LE COMPTEUR.
<
< GENERATION DE LA NOUVELLE SEGEXT :
<
         LA          SEGEXT+X
         STA         SEGORG+X
         LA          SEGEXT+Y
         STA         SEGORG+Y
         LR          Y,A             < Y COURANT,
         SB          NLIG            < LES AXES GRAPHIQUES ET
         NGR         A,A             < VIDEOS SONT INVERSES.
         SLLS        DEDY
         STA         SEGEXT+Y
         LR          X,A             < X COURANT,
         SLLS        DEDX            < ET CADRAGE.
         STA         SEGEXT+X
         OR          SEGEXT+Y
         OR          SEGORG+X
         OR          SEGORG+Y        < EST-CE UN 'OAB' ???
         JAE         SEND3           < OUI, IL FAUT L'EMETTRE...
         LA          SEGEXT+X        < NON, ALORS ORG=EXT ???
         CP          SEGORG+X        < ORG=EXT ??? (PREVU A
                                     < CAUSE DE GOGE, QUI EMET A
                                     < PRIORI 'ARRIV').
         JNE         SEND3           < NON, ON EMET...
         LA          SEGEXT+Y        < ORG=EXT ???
         CP          SEGORG+Y
         JE          SEND4           < CAS SEGMENT REDUIT A UN POINT.
SEND3:   EQU         $
         PSR         X               < A CAUSE DES SVC A SUIVRE.
<
< EMISSION DU SEGMENT COURANT :
<
SEND2:   EQU         $
         LAD         GETGS
         SVC         0               < ACCES A LA VALIDATION COURANTE.
         CPZ         NOMSEG
         JNE         SEND2           < SEGMENT PRECEDENT NON ENCORE
                                     < ACQUITTE, ON ATTEND !!!
         DC          NOMSEG          < OK, NOMSEG=-1.

         LAD         STOGS
         SVC         0               < EMISSION SEGMENT COURANT.
         PLR         X               < RESTAURE X.
SEND1:   EQU         $
         RSR
<
< CAS OU UN SEGMENT EST REDUIT A UN POINT :
<
SEND4:   EQU         $
         CPZ         ISOL            < IGNORE-T'ON L'EMISSION DES POINTS ???
         JNE         SEND1           < OUI, RIEN A FAIRE...
<
< CAS OU LES POINTS ISOLES SONT A EMETTRE : A NOTER ITEST=1
<
         PSR         B,X,Y
         LBI         0               < PAR PURE PROPRETE...
         ADRI        1,X
         BSR         AVOIS           < (X+1,Y)
         JAE         SEND5           < (X,Y) N'EST PAS ISOLE.
         ADRI        -1-1,X
         BSR         AVOIS           < (X-1,Y)
         JAE         SEND5           < (X,Y) N'EST PAS ISOLE.
         ADRI        1,X
         ADRI        -1,Y
         BSR         AVOIS           < (X,Y-1)
         JAE         SEND5           < (X,Y) N'EST PAS ISOLE.
         ADRI        1+1,Y
         BSR         AVOIS           < (X,Y+1)
         JAE         SEND5           < (X,Y) N'EST PAS ISOLE.
<
< CAS OU (X,Y) EST REELLEMENT ISOLE :
<
         PLR         B,X,Y
         JMP         SEND3           < VERS L'EMISSION DU SEGMENT
                                     < REDUIT AU POINT (X,Y).
<
< CAS OU (X,Y) EST FAUSSEMENT ISOLE :
<
SEND5:   EQU         $
         PLR         B,X,Y
         JMP         SEND1           < ON N'EMET RIEN DU TOUT, CAR
                                     < LE POINT (X,Y) DOIT APPARTE-
                                     < NIR A UN SEGMENT DEJA EMIS...
<
<
<        I N S E R T I O N   P O I N T   D E   D E P A R T  :
<
<
SENDO:   EQU         $
         CPZ         IGRAPH          < GRAPHIQUE DEMANDE ???
         JNE         SENDO1          < NON...
         LA          NSEG            < INITIALISATION DU
         STA         KSEG            < DECOMPTEUR.
         LR          Y,A             < OUI, CONVERSION VIDEO
         SB          NLIG            < GRAPHIQUE DES COORDONNEES
         NGR         A,A             < DU POINT DE DEPART (X,Y).
         SLLS        DEDY
         STA         SEGEXT+Y
         LR          X,A
         SLLS        DEDX
         STA         SEGEXT+X
SENDO1:  EQU         $
         RSR
<
<
<        E N V O I   D ' U N   ' O A B '  :
<
<
SOAB:    EQU         $
         STZ         SEGEXT+X
         STZ         SEGEXT+Y
         LXI         0
         LY          NLIG
         STZ         KSEG            < AFIN DE FORCER L'EMISSION.
         BSR         ASEND           < ENVOI, SI ZDC VALIDEE.
         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
<
<
<        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  :
<        E T   M A R Q U A G E   V I R T U E L  :
<
<
<        FONCTION :
<                      CETTE ROUTINE INCREMENT B D'UNE UNITE
<                    SI LE POINT (X,Y) EXISTE ET EST A 1.
<
<
<        ARGUMENT ET RESULTAT : B,X,Y.
<                    A=0 SI UN POINT A ETE MARQUE.
<
<
VOISI:   EQU         $
         BSR         AEXIST          < TEST DU POINT (X,Y)
         JANE        VOISI1          < (X,Y) N'EXISTE PAS OU EST A 0.
         ADRI        1,B             < (X,Y) EXISTE ET EST A 1.
         STX         POINT1+X        < SAUVEGARDE D'UN POINT A 1.
         STY         POINT1+Y        < UTILISE PAR LES CHANGEMENTS
                                     < DE POINT DE DEPART).
         BSR         ASETV           < MARQUAGE DE CE VOISIN A 1.
         LAI         0               < UN POINT A ETE MARQUE.
VOISI1:  EQU         $
         RSR
<
<
<        C O M P T A G E   D ' U N   V O I S I N  :
<
<
VOIS:    EQU         $
         BSR         AEXIST          < TEST DU POINT (X,Y).
         JANE        VOISI1          < N'EXISTE PAS, OU EST A 0.
         ADRI        1,B             < EXISTE ET EST A 1.
         JMP         VOISI1
<
<
<        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
<
<
<        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         $
         BSR         ASOAB           < ENVOI D'UN 'OAB' DE FIN.
GOGEX:   EQU         $               < ENTRY ALT-MODE.
         BSR         AVIRE           < TOUTE L'IMAGE VIRTUELLE EST
                                     < RENVOYEE EN SCRATCH AVANT
                                     < LE RETOUR A 'GE'.
<
< RAZ DES ITEMS 1 ET 2 :
<
         LX          NMOTS           < X=NBRE DE MOTS A RAZER.
GOGE1:   EQU         $
         STZ         &AI2
         JDX         GOGE1
<
< MISE EN PLACE DU NOM DE 'GE' :
<
         LA          NGE
         STA         0,W             < (W)=@BRANCH.
<
< RETOUR A 4K, ET SMC :
<
         LA          APILE
         LR          A,K
         LAD         RELMEM
         SVC         0
GOGE2:   EQU         $
         LAD         DEMSGN          < A=@DEMSGN.
         BSR         AOVL            < CHARGEMENT DE 'GE'.
         LAD         DEMCCI
         SVC         0               < RETOUR AU CCI SI ERREUR.
         JMP         GOGE2
         PAGE
<
<
<        E X T R A C T I O N   D E   C H A I N E S
<        D E   S E G M E N T S   D A N S   U N E
<        I M A G E   V I D E O  :
<
<
         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
<
< EMISSION GRAPHIQUE ???
<
GR1:     EQU         $
         LAD         M9
         BSR         AENTER
         STB         IGRAPH          < 0 : EMISSION.
         JNE         GR2             < ON SAUTE ALORS LA DEMANDE
                                     < DES 'OAB' INTERMEDIAIRES.
GR20:    EQU         $
         LAD         M14
         BSR         ACOORD          < ENTREE DU NBRE DE SEGMENTS A
                                     < REUNIR EN UN SEUL, AFIN DE LISSER
                                     < LA CHAINE GENEREE.
         STA         NSEG            < NSEG>0.
<
< 'OAB' INTERMEDIAIRES ???
<
GR40:    EQU         $
         LAD         M3
         BSR         AENTER
         STB         IOAB
GR2:     EQU         $
<
< DOIT-ON CONSERVER LES POINTS ISOLES ???
<
         LA          AM16
         BSR         AENTER
         STB         ISOL
<
<        R A Z   L A   B O R D U R E   D E   L ' I M A G E  :
<
         LYI         0
         LXI         0
<
< BORDURE SUPERIEURE (Y=0) :
<
RAZE1:   EQU         $
         BSR         ARESET
         ADRI        1,X
         LR          X,A
         CP          NPPL
         JLE         RAZE1
         ADRI        -1,X
<
< BORDURE DROITE (X=NPPL) :
<
RAZE2:   EQU         $
         BSR         ARESET
         ADRI        1,Y
         LR          Y,A
         CP          NLIG
         JLE         RAZE2
         ADRI        -1,Y
<
< BORDURE INFERIEURE (Y=NLIG) :
<
RAZE3:   EQU         $
         BSR         ARESET
         ADRI        -1,X
         CPZR        X
         JGE         RAZE3
         ADRI        1,X
<
< BORDURE GAUCHE (X=0) :
<
RAZE4:   EQU         $
         BSR         ARESET
         ADRI        -1,Y
         CPZR        Y
         JGE         RAZE4
         ADRI        1,Y
<
<        L I M I T E S   V E R T I C A L E S   I M A G E  :
<
         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.
         LR          Y,A             < EST-ON RENDU A LA FIN DE L'IMAGE???
         CP          NLIG
         JLE         LOOK7           < NON - CONTINUER.
         BR          AGOGE           < OUI - IMAGE VIDE - RETOUR A 'GE'.
LOOK7:   EQU         $
         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.
<
<        B O U C L E   D E   P A R C O U R S
<                    I M A G E  :
<
         LXI         0               < COORDONNEE X.
LOOP1:   EQU         $
         LYI         0               < COORDONNEE Y.
<
<        T R A I T E M E N T   P O I N T S   I S O L E S  :
<
         LA          ISOL            < FAUT-IL ELIMINER LES POINTS
                                     < ISOLES ???
         JAE         PISOL1          < NON, ON LES CONSERVE...
         CPZ         KTOUR           < VIENT-ON DE GENERER UNE NOUVELLE
                                     < IMAGE RESIDENTE, OU EST-CE
                                     < LA 1ERE FOIS ???
         JE          PISOL1          < NON, ON EST EN TRAIN DE CHERCHER
                                     < UN POINT DE DEPART...
<
< EFFACEMENT DES POINTS ISOLES :
<
         LB          IGRAPH          < SAVE LE MODE D'EMISSION DES
         PSR         B,X,Y           < 'OAB', AFIN DE
         STA         IGRAPH          < LES INHIBER TEMPORAIREMENT (A=1).
         STZ         ITEST
         IC          ITEST
ISOL8:   EQU         $
         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          ISOL11          < MOT TOUT BLANC...
         JANE        ISOL9           < MOT PARTIELLEMENT BLANC.
ISOL11:  EQU         $
         LR          X,A             < DANS LE CAS D'UN MOT TOUT NOIR
         ANDI        'FFF0           < OU TOU BLANC,
         LR          A,X             < ON 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         AVOIS
         ADRI        -1-1,X          < POINT (X-1,Y).
         BSR         AVOIS
         ADRI        1,X
         ADRI        -1,Y            < POINT (X,Y-1).
         BSR         AVOIS
         ADRI        1+1,Y           < POINT (X,Y+1).
         BSR         AVOIS
         ADRI        -1,Y            < RETOUR AU POINT (X,Y).
         LR          B,A             < A=NBRE DE VOISINS DE (X,Y).
         JAG         ISOL10          < POINT NON ISOLE, OK.
         BSR         ARESET          < EFFACEMENT POINT 0-ISOLE.
ISOL10:  EQU         $
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.
         PLR         B,X,Y
         STB         IGRAPH          < RESTAURE IGRAPH.
         STZ         KTOUR           < KTOUR <-- 0.
PISOL1:  EQU         $
LOOP2:   EQU         $
<
< RECHERCHE D'UN POINT DE DEPART :
<
         STY         SAVEY           < SAVE Y A PRIORI...
         BSR         ATEST           < TEST DE M(X,Y).
         JNC         LOOP4           < M(X,Y)=0 : TEST DU SUIVANT.
         ADRI        1,Y             < M(X,Y)=1, ON PASSE AU SUIVANT.
         LR          Y,A
         CP          NLIG
         JLE         LOOP2           < OK, TEST DE M.
<
< CHANGEMENT DE VERTICALE :
<
LOOP5:   EQU         $
         ADRI        1,X
         LR          X,A
         CP          NPPL            < VALIDATION NOUVEL X.
         JLE         LOOP1           < OK, LA VERTICALE EXISTE...
<
< FIN D'EXTRACTION :
<
         BR          AGOGE           < RETOUR A GE.
<
< POINT SUIVANT SUR LA VERTICALE :
<
LOOP4:   EQU         $
         ADRI        1,Y             < ACCES POINT SUIVANT VERS
                                     < LE BAS.
         LR          Y,A
         CP          NLIG            < VALIDATION DE Y.
         JG          LOOP5           < VERS LE BALAYAGE EN X.
         BSR         ATEST           < TEST DE M(X,SAVEY+1).
         JC          LOOP6           < OK, ON ARRETE AU 1ER
                                     < POINT A 1.
         STY         SAVEY           < ON CONSERVE TOUJOURS LE
                                     < DERNIER POINT A 0
                                     < RENCONTRE.
         JMP         LOOP4           < VERS LE POINT SUIVANT.
<
< CAS OU ON A TROUVE UN POINT A 0 PRECEDANT UN POINT A 1 SUR LA VERTICALE :
<
LOOP6:   EQU         $
         LY          SAVEY           < Y=Y DE CE POINT.
         STX         DEP+X           < POINT
         STY         DEP+Y           <       DE DEPART.
         STX         ARRIV+X         < POINT
         STY         ARRIV+Y         <       D'ARRIVEE.
         PSR         X,Y             < SAVE LE POINT COURANT.
<
<        E X T R A C T I O N   C H A I N E   C O U R A N T E  :
<
<
< INITIALISATION DU DISQUE :
<
         BSR         ARAZDK
<
< DEP EST NOTRE POINT DE DEPART :
<
         LX          DEP+X
         LY          DEP+Y
         ADRI        1,Y             < PASSAGE AU POINT A 1 SUIVANT
                                     < LE POINT DE DEPART A 0.
         BSR         ASENDO          < INSERTION POINT DE DEPART.
         BSR         ASETV           < MARQUAGE DU POINT DE DEPART.
         ADRI        -1,Y            < RETOUR AU POINT DE DEPART.
<
<        R E C H E R C H E   D ' U N E   C H A I N E  :
<
CONT1:   EQU         $
         STX         PTC+X           < SAVE LE POINT COURANT.
         STY         PTC+Y           < SAVE LE POINT COURANT.
         BSR         AROT1           < ROTATION A DROITE PRELIMINAIRE.
CONT3:   EQU         $
         BSR         AMOV            < DEPLACEMENT DU POINT (X,Y).
         STZ         ITEST           < AFIN DE TESTER LES POINTS A 0.
         BSR         AEXIST          < TEST DU POINT (X,Y).
         JAE         CONT2           < OK, (X,Y)=0 ET EXISTE (ITEST=0).
CONT5:   EQU         $
         LX          PTC+X           < RETOUR ARRIERE SUR PTC.
         LY          PTC+Y           < RETOUR ARRIERE SUR PTC.
         BSR         AROT3           < ROTATION DU VECTEUR (VX,VY).
         JMP         CONT3           < ET ON RECOMMENCE...
<
< CAS OU L'ON A TROUVE UN POINT A 0 QUI EXISTE :
<
CONT2:   EQU         $
         LBI         0               < B=COMPTEUR DES VOISINS DU POINT
                                     < TROUVE (X,Y).
         IC          ITEST           < AFIN DE TESTER LES POINTS A 1.
CONT4:   EQU         $
         LA          VX
         STA         SVX             < SAVE VX AVANT LE DECOMPTE.
         LA          VY
         STA         SVY             < SAVE VY AVANT LE DECOMPTE.
         LA          ANGLE
         STA         SANGLE          < SAVE ANGLE AVANT LE DECOMPTE.
         PSR         X,Y             < SAVE LE POINT COURANT (X,Y).
         BSR         AROT1           < ON SE PLACE A DROITE DU
                                     < MOUVEMENT (VX,VY).
         BSR         AMOV
         BSR         AVOISI          < ET ON TESTE LES 3 POINTS
                                     < IMMEDIATEMENT A DROITE DU
                                     < POINT COURANT SUIVANT LE
                                     < MOUVEMENT (VX,VY).
         JAE         TROUVE          < ON A MARQUE UN POINT, ON
                                     < S'ARRETE LA.
         BSR         AROT1
         BSR         AMOV
         BSR         AVOISI
         JAE         TROUVE          < ON A MARQUE UN POINT...
         BSR         AROT1
         BSR         AROT1
         BSR         AMOV
         BSR         AMOV
         BSR         AVOISI
TROUVE:  EQU         $
         PLR         X,Y             < RESTAURE LE POINT COURANT.
         LA          SANGLE
         STA         ANGLE           < RESTAURE ANGLE.
         LA          SVX
         STA         VX              < RESTAURE VX.
         LA          SVY
         STA         VY              < RESTAURE VY.
         CPZR        B               < LE POINT (X,Y) A-T'IL AU
                                     < MOINS 1 VOISIN ???
         JE          CONT5           < NON, ON FAIT DONC UN RETOUR ARRIERE
                                     < SUR PTC, ET ROTATION DE (VX,VY).
<
< MARQUAGE DU POINT (X,Y) :
<
         LR          X,A
         CP          DEP+X           < EST-ON AU POINT DE DEPART ???
         JNE         CONT50          < NON.
         LR          Y,A             < PEUT-ETRE.
         CP          DEP+Y
         JE          CONT7           < POINT DE DEPART.
<
< CAS D'UN POINT#DEPART :
<
CONT50:  EQU         $
         LR          X,A
         CP          ARRIV+X         < EST-ON AU POINT D'ARRIVEE ???
         JNE         CONT1           < NON, AU SUIVANT...
         LR          Y,A
         CP          ARRIV+Y         < EST-ON AU POINT D'ARRIVEE ???
         JNE         CONT1           < NON, AU SUIVANT...
<
< ON A UNE CHAINE DE SEGMENTS :
<
CONT7:   EQU         $
FLOOP:   EQU         $
         LX          ARRIV+X
         LY          ARRIV+Y
         ADRI        1,Y             < POUR AVOIR LE POINT REEL
                                     < D'ARRIVEE.
         STZ         KSEG            < AFIN DE FORCER L'EMISSION.
         BSR         ASEND           < ENVOI ABLIGATOIRE DU
                                     < DERNIER SEGMENT.
<
<        M O D I F I C A T I O N   D E
<        L ' I M A G E   R E S I D E N T E  :
<
         STZ         RDK+3           < DEPART SUR LE SECTEUR 0.
         LA          AIMAG
         STA         AIMAG0          < RELAI DE BALAYAGE DE L'IMAGE
                                     < RESIDENTE.
         LXI         LIMAG/128       < X=NBRE DE SECTEURS A TRAITER.
EOR1:    EQU         $
         PSR         X
         LB          RDK+3           < B=NUMERO SECTEUR COURANT.
         BSR         ARESID          < LE SECTEUR COURANT EST AMENE
                                     < EN MEMOIRE.
         LA          ASECTC          < A=RELAI D'ACCES A CE SECTEUR.
         ADRI        -1,A            < AFIN D'AVOIR
         STA         ASECTC          < UN RELAI PAR RAPPORT A 1.
         LXI         128             < X=NBRE DE MOTS A TRAITER.
EOR2:    EQU         $
         LA          &AIMAG0
         EOR         &ASECTC
         STA         &AIMAG0         < LA CHAINE GENEREE EST SUP-
                                     < PRIMEE DE L'IMAGE RESIDENTE.
         JDX         EOR2            < AU SUIVANT...
         LAI         128
         AD          AIMAG0          < PROGRESSION DANS L'IMAGE
         STA         AIMAG0          < RESIDENTE.
         IC          RDK+3           < PASSAGE AU SECTEUR SUIVANT.
         PLR         X
         JDX         EOR1            < SECTEUR SUIVANT.
         IC          KTOUR           < KTOUR <-- 1 : ON VIENT DE GENERER
                                     < UNE NOUVELLE IMAGE RESIDENTE.
<
< ENVOI D'UNE FIN DE CHAINE :
<
         CPZ         IOAB
         JNE         LOOP7           < NON DEMANDEE.
         BSR         ASOAB           < OUI DEMANDEE, ON ENVOI 'OAB'.
LOOP7:   EQU         $
<
<        E X P L O R A T I O N   I M A G E
<            R E S I D E N T E  :
<
         PLR         X,Y             < RESTAURE LE POINT COURANT.
LOOP3:   EQU         $
         BR          ALOOP           < ET C'EST REPARTI POUR UN
                                     < NOUVEAU TOUR...
         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.