NMPROC:  VAL         "KP"            < NOM DU PROCESSEUR.
         IDP         "KP - RELEASE 29/10/1980"
         EOT         #SIP DEFINITION CMS5#
         EOT         #SIP DEF PROCESSEUR#
         PROG
         WORD        IMAGE           < ENTRY POINT DU GENERATEUR.
         WORD        0
PIMAGE:  EQU         $               < P='12 !!!
         LRP         L
         BR          -2,L            < ENTREE DANS LE PROCESSEUR KO.
         EOT         #SIP DEFINITION ITEM#
ITEM1:   EQU         ZERO+PILE-LTNI
ITEM2:   EQU         ZERO+PILE-LTNI-LTNI
         PAGE
<
<
<        I M A G E S   G R A P H I Q U E   E T   V I D E O  :
<
SIZE:    VAL         '528            < TAILLE PRESUMEE DU PROGRAMME.
<
< PILE DU PROGRAMME :
<
SSTACK:  VAL         16
STACK:   DZS         SSTACK
         EOT         #SIP IMAGE 256#
NOM:     EQU         ZERO+PILE+5-LNOM-2  < NOM DE L'IMAGE VIDEO.
IMAG:    EQU         NOM+LNOM+2      < IMAGE VIDEO.
<
< VALIDATION DU FORMAT DE L'IMAGE (CARREE) :
<
X20:     VAL         1024/DY         < NBRE DE LIGNES/IMAGE.
X21:     VAL         CNMPL*16        < NBRE DE POINTS/LIGNE.
         IF          X20-X21,,X100,
         IF          ATTENTION : L'IMAGE N'EST PAS CARREE !!!
X100:    VAL         0
<
< BUFFER DES SECTEURS SCRATCHES :
<
SECTOR:  EQU         STACK+SSTACK
         DZS         128             < CELA PEUT TOUJOURS SERVIR !!!
         PAGE
<
<
<        L O C A L  :
<
<
         LOCAL
LOC:     EQU         $
<
< MESSAGES :
<
M1:      BYTE        15;'6D
         ASCI        "ERREUR DEPART!"
M2:      BYTE        11;'6D
         ASCI        "NON FERME!"
M3:      BYTE        13;'6D
         ASCI        "POINT ISOLE!"
M4:      BYTE        10;'6D
         ASCI        "INTERIEUR "
M5:      BYTE        10;'6D
         ASCI        "EXTERIEUR "
M6:      BYTE        3;'6D
         ASCI        "X="
M7:      BYTE        3;'6D
         ASCI        "Y="
M8:      BYTE        9;'6D
         ASCI        "REMPLIR?"
M9:      BYTE        5;'6D
         ASCI        "ZDC?"
NOMSEG:  WORD        0               < 0=INVALIDE,
                                     < -1=VALIDE.
SEG:     DZS         4
LONSEG:  VAL         $-NOMSEG*2
SEGORG:  EQU         SEG+0
SEGEXT:  EQU         SEG+2
CURSOR:  BYTE        "N";0           < CARACTERE DE DEBLOCAGE DU
                                     < CURSEUR (ERREUR A PRIORI).
         DZS         2               < COORDONNEES Y ET X.
REP:     DZS         2               < ENTREE DE NBRES HEXADECIMAUX.
<
< DEMANDES A CMS4 :
<
DEMSGN:  WORD        '0602           < CHARGEMENT DES OVERLAYS.
         WORD        BRANCH-ZERO*2
         WORD        ZERO-BRANCH+PILE-LTNI-LTNI*2
         WORD        -1
DEMCCI:  WORD        '0001           < APPEL DU CCI INTERACTIF.
DEMMEM:  WORD        '0004           < DEMANDE D'ALOCATION 12 K MOTS.
RELMEM:  WORD        '0004           < DEMANDE D'ALLOCATION 4K MOTS.
         WORD        '6000
         WORD        '2000
DEMOUT:  WORD        '0202           < ECRITURE DES MESSAGES.
         WORD        0
         WORD        0
DEMIN:   WORD        '0101           < ENTREE SUR '01.
         WORD        REP-ZERO*2
         WORD        4
DEMREP:  WORD        '0101           < LECTURE 1 CARACTERE REPONSE.
         WORD        REP-ZERO*2
         WORD        1
OG:      WORD        '0103           < OPEN GRAPHIQUE DE '01.
CU:      WORD        '0106           < MISE EN FONCTION DU CURSEUR
         WORD        0               < GRAPHIQUE DE '01 (AMDEM=0).
LCU:     WORD        '0109           < LECTURE CURSEUR GRAPHIQUE
         WORD        CURSOR-ZERO*2   < DE '01.
         WORD        6
CG:      WORD        '0104           < CLOSE GRAPHIQUE DE '01.
RDK:     WORD        '0C00           < LECTURE SCRATCH DU DISQUE.
         WORD        SECTOR-ZERO*2
         WORD        128*2
         WORD        0               < NUMERO DU SECTEUR.
WDK:     WORD        '0C02           < ECRITURE SCRATCH DU DISQUE.
         WORD        SECTOR-ZERO*2
         WORD        128*2
         WORD        0               < NUMERO DU SECTEUR.
STOGS:   WORD        '000A           < EMISSION SEGMENT COURANT.
         WORD        NOMSEG-ZERO*2
         WORD        LONSEG
         WORD        'FFC0           < VALIDATION DE LA ZDC.
GETGS:   WORD        '0008           < ACCES NOMSEG COURANT.
         WORD        NOMSEG-ZERO*2
         WORD        SEG-NOMSEG*2
         WORD        'C000
STABIL:  WORD        '8A01           < DEMANDE DE STABILISATION VIDEO.
         WORD        IMAG-ZERO*2
         WORD        LIMAG*2
         WORD        TVPV            < SUR LE PROCESSEUR VERT.
<
< CONSTANTES :
<
NOM1:    WORD        "-+"            < NOM DE L'IMAGE DE TRAVAIL,
                                     < DANS LAQUELLE ON GENERE
                                     < L'IMAGE FINALE.
                                     < SUIVIS DE L'IDESC).
KIN:     WORD        -1              < COMPTEUR DES ENTRIES DANS KO.
NGE:     WORD        "GE"            < NOM DU PROCESSEUR GE.
IGRAPH:  WORD        1               < 0=EMISSION GRAPHIQUE,
                                     < 1=PAS D'EMISSION GRAPHIQUE.
NMOTS:   WORD        2*LTNI          < NBRE DE MOTS DE ITEM1+ITEM2.
ALIMAG:  WORD        LIMAG           < NBRE DE MOTS DE L'IMAGE.
NMPL:    WORD        CNMPL           < NBRE MOTS DE 16 BITS PAR LIGNE.
NLIG:    WORD        1024/DY-1       < NBRE DE LIGNES/IMAGE-1.
NPPL:    WORD        CNMPL*16-1      < NBRE DE POINTS/LIGNE-1.
YMIN:    WORD        0               < DERNIERE LIGNE A TESTER LORS
                                     < DES BALAYAGES DE L'IMAGE
                                     < POUR ELIMINER LES POINTS
                                     < 0-ISOLES ET 1-ISOLES.
YMAX:    WORD        0               < DE MEME : PREMIERE LIGNE...
ITEST:   WORD        1               < 0 : TEST SUR LA VALEUR 0 DES POINTS,
                                     < 1 : TEST SUR VALEUR 1 DES POINTS.
X:       VAL         1               < COORDONNEE X D'UN POINT.
Y:       VAL         0               < COORDONNEE Y D'UN POINT.
DEP:     WORD        0;0             < POINT DE DEPART D'UN CONTOUR.
PTC:     WORD        0;0             < POINT COURANT LORS D'UN PARCOURS.
KAROT:   WORD        0               < COMPTEUR DES RETOURS A 'PTC'.
MULTI:   WORD        0               < DETECTEUR DE MARQUAGE BOUCLE DU
                                     < TYPE A --> B --> A --> B...
SDEP:    WORD        0;0             < POINT DE DEPART POUR LE TOUR
                                     < SUIVANT (FUTUR 'DEP').
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.
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.
KVOISH:  WORD        0               < COMPTAGE DES VOISINS DE DESSUS.
KVOISB:  WORD        0               < COMPTAGE DES VOISINS DE DESSOUS.
LASTY:   WORD        -1              < Y DU DERNIER POINT TRACE PAR 'SETV',
                                     < N'EXISTE PAS INITIALEMENT...
<
< 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.
AIMAG2:  WORD        IMAG+LIMAG,X    < ACCES A LA MEMOIRE DES (Y+LASTY)/2.
AIMAG0:  WORD        0               < POUR METTRE LES SECTEURS
                                     < SCRATCH DANS L'IMAGE COURANTE.
ASECT1:  WORD        SECTOR,X        < ACCES AU SECTEUR COURANT.
AIMAG:   WORD        IMAG-1,X        < RELAI DE RAZ IMAGE COURANTE.
AREP:    WORD        REP,X           < RELAI D'ACCES AUX REPONSES.
ASET:    WORD        SET             < MISE D'UN POINT A 1.
ARESET:  WORD        RESET           < MISE D'UN POINT A 0.
AINVER:  WORD        INVER           < INVERSION D'UN POINT.
ACLIGN:  WORD        CLIGN           < CLIGNOTEMENT DES POINTS VIDEO.
ATEST:   WORD        TEST            < TEST DE L'ETAT D'UN POINT.
ASETV:   WORD        SETV            < MISE D'UN POINT VIRTUEL A 1.
ASETW:   WORD        SETW            < MARQUAGE DES POINTS (X,(Y+LASTY)/2).
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.
AVOISV:  WORD        VOISV           < TEST DES POINTS (X,(Y+LASTY)/2).
AVOISI:  WORD        VOISI           < TEST ET COMPTAGE D'UN VOISIN.
AVOISY:  WORD        VOISY           < IDEM...
AMASK:   WORD        MASK            < TEST DES CONFIGURATIONS DANGEREUSES.
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.
APRINT:  WORD        PRINT           < EDITION DES MESSAGES.
AHEX:    WORD        HEX             < CONVERSION ASCI --> BINAIRE.
ACOORD:  WORD        COORD           < ENTREE COORDONNE X/Y.
AMOV:    WORD        MOV             < DEPLACEMENT PAR (VX,VY).
AROT1:   WORD        ROT1            < ROTATION DE +PI/2.
AROT3:   WORD        ROT3            < ROTATION DE -PI/2.
ACONTI:  WORD        CONTI           < RETOUR DE LA ZONE SCRATCH
                                     < EN MEMOIRE.
ARAZDK:  WORD        RAZDK           < RAZ DE LA ZONE SCRATCH DK.
ALOOP:   WORD        CONT1           < VERS LE CHANGEMENT DE 'PTC'.
ASP1:    WORD        SP1             < COMPTAGE DES VOISINS DESSUS/DESSOUS.
ASP2:    WORD        SP2             < DISCRIMINATION TANGENCE/INFLEXION.
ADEP4:   WORD        DEP4            < ERREUR DE POINT DE DEPART...
<
< TOPOGRAPHIE MEMOIRE :
<
NSEC:    VAL         LIMAG/128       < NRE DE SECTEURS POUR UNE IMAGE.
XSECR:   VAL         2*LTNI-128
NSECR:   VAL         XSECR/128
                                     < NBRE DE SECTEURS RESIDANTS.
ALS:     WORD        LSECT-1,X       < RELAI D'INITIALISATION DE
                                     < LA LISTE LSECT.
ALSECT:  WORD        LSECT,X         < REALI D'ACCES A LSECT.
ATOPO:   WORD        TOPO-1,X        < RELAI D'ACCES A TOPO.
ASECTC:  WORD        0               < RELAI COURANT D'ACCES A UN
                                     < SECTEUR MANIPULE.
AUSE:    WORD        USE-1,X         < RELAI D'ACCES A USE.
INFINI:  WORD        '7FFF
CSECT:   WORD        0               < MEMORISE LE SECTEUR COURANT.
WDKT:    WORD        '0C02           < ECRITURE 1 SECTEUR TOPO.
         WORD        0
         WORD        128*2
         WORD        0
RDKT:    WORD        '0C00           < LECTURE 1 SECTEUR TOPO.
         WORD        0
         WORD        128*2
         WORD        0
ABUF1:   WORD        PILE-XSECR/128*128*2
                                     < @OCTET DU 1ER BUFFER LIBRE.
AWSE:    WORD        WSE             < ROUTINE DE REECRITURE
                                     < D'UN SECTEUR TOPO.
AVIRE:   WORD        VIRE            < ROUTINE SUPPRIMANT LA TOPO.
ARESID:  WORD        RESID           < REND LE SECTEUR SCRATCH (B)
                                     < RESIDENT EN MEMOIRE.
<
< LISTE DES SECTEURS REELS (DE 0 A NSEC-1) :
<
LSECT:   EQU         $
         DO          NSEC
         WORD        -1              < INITIALEMENT NON RESIDENT.
<
< LISTE D'OCCUPATION DES BUFFERS (DE 1 A NSECR) :
<
TOPO:    EQU         $
         DO          NSECR
         WORD        -1              < INOCCUPE INITIALEMENT.
<
< COMPTEUR D'USAGE DES BUFFERS :
<
USE:     EQU         $
         DO          NSECR
         WORD        0               < INUTILISE INITIALEMENT.
         PAGE
         PROG
<
<
<        E D I T I O N   D ' U N   M E S S A G E  :
<
<
<        ARGUMENT :
<                    A=@MESSAGE.
<
<
PRINT:   EQU         $
         PSR         C,X
         LR          A,C             < C=@MESSAGE.
         ADR         A,A
         ADRI        1,A             < A=@OCTET DU MESSAGE.
         STA         DEMOUT+1
         LBY         0,C             < A=LONGUEUR DU MESSAGE.
         STA         DEMOUT+2
         LAD         DEMOUT
         SVC         0               < EDITION DU MESSAGE.
         PLR         C,X
         RSR
         PAGE
<
<
<        E M I S S I O N   S E G M E N T   C O U R A N T  :
<
<
<        FONCTION :
<                      CETTE ROUTINE EMET, SI CELA A ETE
<                    DEMANDE PAR L'UTILISATEUR LE SEGMENT
<                    COURANT A L'AIDE DE LA ZDC, ET ATTEND
<                    L'ACCUSE DE RECEPTION...
<
<
<        ARGUMENT :
<                    X,Y=COORDONNEES DU POINT COURANT (SEGEXT).
<
<
SEND:    EQU         $
         CPZ         IGRAPH          < GRAPHIQUE DEMANDE ???
         JNE         SEND1           < NON, RIEN A FAIRE.
<
< GENERATION DE LA NOUVELLE SEGEXT :
<
         LA          SEGEXT+X
         STA         SEGORG+X
         LA          SEGEXT+Y
         STA         SEGORG+Y
         LR          Y,A             < Y COURANT,
         SB          NLIG            < LES AXES GRAPHIQUES ET
         NGR         A,A             < VIDEOS SONT INVERSES.
         SLLS        DEDY
         STA         SEGEXT+Y
         LR          X,A             < X COURANT,
         SLLS        DEDX            < ET CADRAGE.
         STA         SEGEXT+X
         PSR         X               < A CAUSE DES SVC A SUIVRE.
<
< EMISSION DU SEGMENT COURANT :
<
SEND2:   EQU         $
         LAD         GETGS
         SVC         0               < ACCES A LA VALIDATION COURANTE.
         CPZ         NOMSEG
         JNE         SEND2           < SEGMENT PRECEDENT NON ENCORE
                                     < ACQUITTE, ON ATTEND !!!
         DC          NOMSEG          < OK, NOMSEG=-1.

         LAD         STOGS
         SVC         0               < EMISSION SEGMENT COURANT.
         PLR         X               < RESTAURE X.
SEND1:   EQU         $
         RSR
<
<
<        I N S E R T I O N   P O I N T   D E   D E P A R T  :
<
<
SENDO:   EQU         $
         CPZ         IGRAPH          < GRAPHIQUE DEMANDE ???
         JNE         SENDO1          < NON...
         LR          Y,A             < OUI, CONVERSION VIDEO
         SB          NLIG            < GRAPHIQUE DES COORDONNEES
         NGR         A,A             < DU POINT DE DEPART (X,Y).
         SLLS        DEDY
         STA         SEGEXT+Y
         LR          X,A
         SLLS        DEDX
         STA         SEGEXT+X
SENDO1:  EQU         $
         RSR
         PAGE
<
<
<        R O T A T I O N   D E   ( VX , VY )  :
<
<
<        FONCTION :
<                      CES 2 ROUTINES MULTIPLIENT LE NBRE
<                    COMPLEXE (VX,VY) PAR LES NOMBRES
<                    COMPLEXES I=(0,1) ET -I=(0,-1)
<                    RESPECTIVEMENT.
<
<
ROT1:    EQU         $
         IC          ANGLE           < ROTATION DE +PI/2.
         PSR         A,B
         LA          VX
         LB          VY
         NGR         B,B
ROT:     EQU         $
         STB         VX
         STA         VY
         PLR         A,B
         RSR
ROT3:    EQU         $
         DC          ANGLE           < ROTATION DE -PI/2.
         PSR         A,B
         LA          VX
         LB          VY
         NGR         A,A
         JMP         ROT             < VERS VX<--(B), VY<--(A).
<
<
<        D E P L A C E M E N T   D U   P O I N T   C O U R A N T  :
<
<
<        FONCTION :
<                      CETTE ROUTINE DEPLACE LE POINT
<                    COURANT (X,Y) A L'AIDE DU VECTEUR
<                    DEPLACEMENT (VX,VY).
<
<
<        ARGUMENT :
<                    X ET Y = L'X ET L'Y DU POINT.
<
<
MOV:     EQU         $
         PSR         A,B
         LA          VX
         LB          VY
         ADR         A,X             < X <-- X+VX.
         ADR         B,Y             < Y <-- Y+VY.
         PLR         A,B
         RSR
         PAGE
<
<
<        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
<
<
<        M A R Q U A G E   D E S   L A S T Y  :
<
<
<        ARGUMENTS : CF 'SET'.
<
<
SETW:    EQU         $
         PSR         Y,C
         LA          ALIMAG
         ADR         A,C             < PASSAGE SUR LA MEMOIRE DES 'LASTY'...
         LA          LASTY
         JAL         SETW1           < CAS DE LA PREMIERE FOIS...
         CPR         A,Y
         JE          SETW1           < ON NE MARQUE PAS SI Y=LSTY...
         JG          SETW2           < Y>LASTY...
         LR          A,Y             < SI Y<LASTY, Y <-- (LASTY)...
SETW2:   EQU         $
         BSR         AINVER          < MARQUAGE DE (X,Y) SI Y#LASTY...
                                     < ON MARQUE PAR INVERSION, AFIN D'ELIMINER
                                     < LES RETOURS ARRIERE SUR SES PROPRES PAS..
SETW1:   EQU         $
         PLR         Y,C
         STY         LASTY           < CHANHGEMENT DE LASTY.
         RSR
<
<
<        E F F A C E M E N T   D ' U N   P O I N T  :
<
<
<        ARGUMENTS :
<                    X ET Y CONTIENNENT X ET Y DU POINT.
<                    C=@IMAG (IMAGE VIDEO).
<
<
RESET:   EQU         $
         PSR         B,X,C
         LR          Y,A
         MP          NMPL
         ADR         B,C
         LR          X,A
         SLRS        4
         ADR         A,C             < C=@MOT CONTENANT LE POINT (X,Y).
         LAI         'F
         ANDR        A,X             < X=NUMERO DU BIT REPRESENTANT
                                     < LE POINT DANS LE MOT ((C)).
         LA          0,C             < A=MOT CONTENANT LE POINT (X,Y).
         RBT         0,X             < EFFACEMENT DU POINT.
         STA         0,C             < MISE A JOUR DE CE MOT.
         PLR         B,X,C
         RSR
<
<
<        I N V E R S I O N   V I D E O   U N   P O I N T  :
<
<
<        ARGUMENT :
<                    X ET Y CONTIENNENT X ET Y DU POINT A INVERSER.
<                    C=@IMAG (IMAGE VIDEO).
<
<
INVER:   EQU         $
         PSR         B,X,C
         LR          Y,A
         MP          NMPL
         ADR         B,C
         LR          X,A
         SLRS        4
         ADR         A,C             < C=@MOT CONTENANT LE POINT (X,Y).
         LAI         'F
         ANDR        A,X             < X=NUMERO DU BIT REPRESENTANT
                                     < LE POINT DANS LE MOT ((C)).
         LA          0,C             < A=MOT CONTENANT LE POINT (X,Y).
         IBT         0,X             < INVERSION VIDEO DU POINT.
         STA         0,C             < MISE A JOUR DE CE MOT.
         PLR         B,X,C
         RSR
<
<
<        C L I G N O T E M E N T   D ' U N   P O I N T  :
<
<
CLIGN:   EQU         $
         PSR         A,B
         LB          TEMPO           < B=NBRE DE CLIGNOTEMENTS.
CLIGN1:  EQU         $
         BSR         AINVER          < INVERSION DU POINT (X,Y).
         PSR         X
         LAD         STABIL          < STABILISATION VIDEO.
         SVC         0
         PLR         X
         ADRI        -1,B            < DECOMPTAGE.
         CPZR        B               < EST-CE FINI ???
         JG          CLIGN1          < NON.
         PLR         A,B
         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 E S   V O I S I N S
<        D E S S U S / D E S S O U S  :
<
<
SP1:     EQU         $
         BSR         AVOISV          < VOISIN DE DESSUS M(X,Y-1).
         JANE        SP11            < IL EST NOIR... IL NE COMPTE PAS ?!?!
         IC          KVOISH          < IL N'Y A QUE LES BLANCS QUI COMPTENT !!!
SP11:    EQU         $
         ADRI        1,Y
         BSR         AVOISV          < VOISIN DE DESSOUS M(X,Y+1).
         JANE        SP12            < NOIR...
         IC          KVOISB          < BLANC...
SP12:    EQU         $
         ADRI        -1,Y
         RSR
<
<
<        D I S C R I M I N A T I O N
<        T A N G E N C E / I N F L E X I O N  :
<
<
<        RESULTAT :
<                    A=0 TANGENCE HORIZONTALE,
<                     =1 INFLEXION.
<
<
SP2:     EQU         $
         LA          KVOISH
         CPI         1
         JE          SP21            < INFLEXION : A=KVOISH=1.
         LA          KVOISB
         CPI         1
         JE          SP21            < INFLEXION : A=KVOISB=1.
         LA          KVOISH
         CP          KVOISB
         JNE         SP22            < TANGENCE...
         TBT         15
         JNC         SP22            < TANGENCE...
         LAI         1               < KVOISH=KVOISB IMPAIRS : INFLEXION...
         JMP         SP21
SP22:    EQU         $
         LAI         0               < TANGENCE HORIZONTALE : AUTRES CAS (A=0).
SP21:    EQU         $
         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.
<                               A DONNE POUR 'VOISY' LE RANG+1 D'UN
<                                 BIT A METTRE A 1 DANS B...
<
<
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.
VOISI1:  EQU         $
         RSR
<
< ENTRY AVEC COMPTAGE UNIQUEMENT :
<
VOISY:   EQU         $
         ADRI        -1,A
         PSR         A
         BSR         AEXIST          < TEST DU POINT (X,Y)...
         CPI         0               < A CAUSE DU PLR...
         PLR         A
         JNE         VOISI1          < N'EXISTE PAS OU EST A 0...
         XR          A,X
         SBT         16,X            < MEMORISATION DANS B...
         XR          A,X
         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   D E   ( X , L A S T Y )  :
<
<
VOISV:   EQU         $
         PSR         C
         LA          ALIMAG
         ADR         A,C
         BSR         AEXIST          < EXISTENCE SUR LA MEMOIRE DES LASTY...
         PLR         C
         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         $
         STZ         SEGEXT+X
         STZ         SEGEXT+Y
         LXI         0
         LY          NLIG
         BSR         ASEND           < EMISSION POSSIBLE D'UN SEGMENT
                                     < REDUIT A UN POINT DOUBLE
                                     < ORIGINE GRAPHIQUE.
GOGEX:   EQU         $               < ENTRY ALT-MODE.
         LAD         CG
         SVC         0               < ON NE SAIT JAMAIS...
         BSR         AVIRE           < TOUTE L'IMAGE VIRTUELLE EST
                                     < RENVOYEE EN SCRATCH AVANT
                                     < LE RETOUR A 'GE'.
<
< RAZ DES ITEMS 1 ET 2 :
<
         LX          NMOTS           < X=NBRE DE MOTS A RAZER.
GOGE1:   EQU         $
         STZ         &AI2
         JDX         GOGE1
<
< MISE EN PLACE DU NOM DE 'GE' :
<
         LA          NGE
         STA         0,W             < (W)=@BRANCH.
<
< RETOUR A 4K, ET SMC :
<
         LA          APILE
         LR          A,K
         LAD         RELMEM
         SVC         0
GOGE2:   EQU         $
         LAD         DEMSGN          < A=@DEMSGN.
         BSR         AOVL            < CHARGEMENT DE 'GE'.
         LAD         DEMCCI
         SVC         0               < RETOUR AU CCI SI ERREUR.
         JMP         GOGE2
         PAGE
<
<
<        R E M P L I S S A G E   D ' U N   C O N T O U R  :
<
<
         WORD        IMAG            < VALEUR BASE C.
         WORD        LOC+'80         < VALEUR BASE L.
         WORD        BRANCH          < VALEUR BASE W.
IMAGE:   EQU         $
         LRP         K
         ADRI        -1,K
         PLR         C,L,W           < INITIALISATION C,L,W.
         LA          ASTACK
         LR          A,K             < INITIALISATION K.
         IC          KIN             < COMPTAGE DES ENTRIES.
         JG          GOGEX           < ABORT SI ALT-MODE.
         LAD         DEMMEM
         SVC         0
         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.
<
< EMISSION GRAPHIQUE ???
<
GR1:     EQU         $
         LAD         M9
         BSR         APRINT          < ENVOI MESSAGE.
         LAD         DEMREP
         SVC         0               < LECTURE DE LA REPONSE.
         LBY         REP
<
<        REPONSES RECONNUES :
<                    O : EMISSION GRAPHIQUE,
<                    N : PAS D'EMISSION GRAPHIQUE.
<
         CPI         "N"
         JE          GR2             < IGRAPH=1 : PAS D'EMISSION.
         CPI         "O"
         JNE         GR1             < ERREUR, ON RECOMMENCE.
         STZ         IGRAPH          < IGRAPH=0 : EMISSION.
GR2:     EQU         $
<
<        R A Z   L A   B O R D U R E   D E   L ' I M A G E  :
<
         LYI         0
         LXI         0
<
< BORDURE SUPERIEURE (Y=0) :
<
RAZE1:   EQU         $
         BSR         ATEST           < TEST DU POINT M(X,0) ???
         JNC         RAZE1X          < NOIR...
         ADRI        1,Y             < BLANC :
         BSR         ASET            < ON MET A BLANC LE POINT M(X,1)...
         ADRI        -1,Y
         BSR         ARESET          < ET ON MET A NOIR LE POINT M(X,0).
RAZE1X:  EQU         $
         ADRI        1,X
         LR          X,A
         CP          NPPL
         JLE         RAZE1
         ADRI        -1,X
<
< BORDURE DROITE (X=NPPL) :
<
RAZE2:   EQU         $
         BSR         ATEST           < TEST DU POINT M(NPPL,Y) ???
         JNC         RAZE2X          < NOIR...
         ADRI        -1,X            < BLANC :
         BSR         ASET            < ON MET A BLANC LE POINT M(NPPL-1,Y)...
         ADRI        1,X
         BSR         ARESET          < ET ON MET A NOIR M(NPPL,Y).
RAZE2X:  EQU         $
         ADRI        1,Y
         LR          Y,A
         CP          NLIG
         JLE         RAZE2
         ADRI        -1,Y
<
< BORDURE INFERIEURE (Y=NLIG) :
<
RAZE3:   EQU         $
         BSR         ATEST           < TEST DU POINT M(X,NLIG) ???
         JNC         RAZE3X          < NOIR...
         ADRI        -1,Y            < BLANC :
         BSR         ASET            < ON MET A BLANC LE POINT M(X,NLIG-1)...
         ADRI        1,Y
         BSR         ARESET          < ET ON MET A NOIR LE POINT M(X,NLIG).
RAZE3X:  EQU         $
         ADRI        -1,X
         CPZR        X
         JGE         RAZE3
         ADRI        1,X
<
< BORDURE GAUCHE (X=0) :
<
RAZE4:   EQU         $
         BSR         ATEST           < TEST DU POINT M(0,Y) ???
         JNC         RAZE4X          < NOIR...
         ADRI        1,X             < BLANC :
         BSR         ASET            < ON MET A BLANC LE POINT M(1,Y)...
         ADRI        -1,X
         BSR         ARESET          < ET ON MET A NOIR LE POINT M(0,Y).
RAZE4X:  EQU         $
         ADRI        -1,Y
         CPZR        Y
         JGE         RAZE4
         ADRI        1,Y
<
<        R E C U P E R A T I O N   P O I N T
<                    D E   D E P A R T  :
<
CUR1:    EQU         $
         LAD         OG
         SVC         0               < OPEN GRAPHIQUE.
         LAD         CU
         SVC         0               < MISE EN FONCTION CURSEUR.
         LAD         LCU
         SVC         0               < LECTURE DU CURSEUR.
<
<        NOTA :
<                      ON NE TESTE PAS LES ERREURS
<                    EN RETOUR (CAS DU PASSAGE EN
<                    BATCH...), CAR 'CURSOR' EST INITIALISE
<                    PAR 'N'.
<
         LA          CURSOR+1        < Y(CURSEUR).
         SLRS        DEDY            < REDUCTION VIDEO.
         SB          NLIG            < LES AXES GRAPHIQUES ET
                                     < VIDEOS SONT INVERES.
         NGR         A,Y             < Y=Y(CURSEUR VIDEO).
         LA          CURSOR+2        < X(CURSEUR).
         SLRS        DEDX            < REDUCTION VIDEO.
         LR          A,X             < X=X(CURSEUR VIDEO).
         BSR         ACLIGN          < CLIGNOTEMENT DU POINT (X,Y).
         LBY         CURSOR          < A=COMMANDE ASSOCIEE.
<
<        COMMANDES RECONNUES :
<                    C : CLIGNOTEMENT DU CURSEUR,
<                    N : ENTREE EN HEXA DES COORDONNEES,
<                    H : ENTREE PAR LE CURSEUR VERS LE HAUT,
<                    B : ENTREE PAR LE CURSEUR VERS LE BAS.
<
         CPI         "C"
         JE          CUR1            < CLIGNOTEMENT SEUL...
         LBI         1               < B=1 : VERS LE BAS A PRIORI...
         CPI         "B"
         JE          CUR3            < CURSEUR VERS LE BAS...
         LBI         -1              < B=-1 : VERS LE HAUT A PRIORI...
         CPI         "H"
         JE          CUR3            < CURSEUR VERS LE HAUT...
         CPI         "N"
         JNE         CUR1            < RIEN COMPRIS, ON RECOMMENCE.
<
< ENTREE EN HEXA DES COORDONNEES :
<
         LAD         M6              < A=@MESSAGE 'X='.
         BSR         ACOORD          < ENTREE DE X.
         LR          A,X             < X=X(CURSEUR VIDEO).
         LAD         M7              < A=@MESSAGE 'Y='.
         BSR         ACOORD          < ENTREE DE Y.
         LR          A,Y             < Y=Y(CURSEUR VIDEO).
<
< ON A UN POINT DE DEPART :
<
CUR3:    EQU         $
         PSR         B               < SAVE LE SENS DE RECHERCHE DE 'DEP'.
         STX         DEP+X
         STY         DEP+Y
<
< INITIALISATION DU DISQUE :
<
         BSR         ARAZDK
<
< RAZ DE LA MEMOIRE DES LASTY :
<
         LYI         0               < INDEX DE LA MEMOIRE,
         LX          ALIMAG          < NOMBRE DE MOTS A RAZER...
RAZ4:    EQU         $
         XR          X,Y
         STZ         &AIMAG2         < RAZ...
         ADRI        1,X
         XR          X,Y
         JDX         RAZ4
<
< RECHERCHE D'UN POINT DE DEPART :
<
         PLR         B               < B=+1/-1 : SENS DE RECHERCHE DE 'DEP'.
         LX          DEP+X           < INITIALISATION REGISTRE X SUR DEP,
         LY          DEP+Y           < INITIALISATION DE Y SUR Y(DEP).
         BSR         ATEST           < VALIDATION DE DEP.
         JNC         DEP1            < OK, DEP=0.
DEP4:    EQU         $
         LAD         M1              < ERREUR : DEP=1 !!!
         BSR         APRINT
         BR          AGOGE           < ABORT.
DEP1:    EQU         $
         ADR         B,Y             < ACCES POINT AU-DESSOUS/AU-DESSUS.
         LR          Y,A
         CP          NLIG            < VALIDATION DE Y.
         JLE         DEP2            < OK, Y DANS L'IMAGE.
         LAD         M2              < ERREUR, Y HORS L'IMAGE !!!!
         BSR         APRINT
         BR          AGOGE           < PUIS ABORT...
DEP2:    EQU         $
         BSR         ATEST           < TEST DU POINT (X,Y).
         JC          DEP3            < ON S'ARRETE SUR LE 1ER POINT
                                     < A 1 SUIVANT UN POINT A 0.
         STY         DEP+Y           < SINON, LE POINT (X,Y) DEVIENT
                                     < LE NOUVEAU POINT DEP.
         JMP         DEP1            < ET ON RECOMMENCE...
DEP3:    EQU         $
<
< DEP EST NOTRE POINT DE DEPART :
<
         LX          DEP+X
         LY          DEP+Y
         BSR         ASENDO          < INSERTION POINT DE DEPART.
         BSR         ASETV           < MARQUAGE DU POINT DE DEPART.
         BSR         ASETW           < MEMORISATION DES LASTY...
<
<        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         $
         STZ         KAROT           < RAZ DU COMPTEUR DES RETOURS A 'PTC'...
         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         $
         IC          KAROT           < ET UN RETOUR DE PLUS !!!
XKAROT:: VAL         4               < SEUIL DE TEST DE 'KAROT'...
         LA          KAROT
         CPI         XKAROT*4        < ???
         JGE         DEP4            < LE POINT DE DEPART EST SUREMENT DANS
                                     < UN COULOIR !!!
         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         $
         IC          ITEST           < AFIN DE TESTER LES POINTS A 1...
<
< ELIMINATION DE L'ENTREE DANS UN COULOIR :
< (SOURCE DE LIGNE ET DE POINTS DOUBLES)
<
         LA          ANGLE
         STA         SANGLE
         PSR         X,Y
         LAI         16
         LBI         0
         BSR         AROT1
         BSR         AMOV
         BSR         AVOISY          < "1ER DROITE"...
         BSR         AMOV
         BSR         AVOISY          < "2EME DROITE"...
         BSR         AROT1
         BSR         AMOV
         BSR         AVOISY          < "2EME ARRIERE-DROITE"...
         BSR         AROT1
         BSR         AMOV
         BSR         AVOISY          < "1ER ARRIERE-DROITE"...
         BSR         AMOV
         BSR         AMOV
         BSR         AVOISY          < "1ER ARRIERE-GAUCHE"...
         BSR         AMOV
         BSR         AVOISY          < "2EME ARRIERE-GAUCHE"...
         BSR         AROT1
         BSR         AMOV
         BSR         AVOISY          < "2EME GAUCHE"...
         BSR         AROT1
         BSR         AMOV
         BSR         AVOISY          < "1ER GAUCHE"...
         BSR         AROT3
         PLR         X,Y
         LA          SANGLE
         STA         ANGLE
<
< DETECTION DES CONFIGURATIONS DANGEREUSES :
< ("A" SIGNIFIE "ARRIERE",
<  "D" SIGNIFIE "DROITE",
<  "G" SIGNIFIE "GAUCHE",
<  "1" ET "2" SIGNIFIENT "1ER" ET "2EME")
<
         LAI         '81
         BSR         AMASK           < D1 G1,
         LAI         '11
         BSR         AMASK           < D1 AG1,
         LAI         '88
         BSR         AMASK           < AD1 G1,
         LAI         '41
         BSR         AMASK           < D1 G2,
         LAI         '21
         BSR         AMASK           < D1 AG2,
         LAI         '82
         BSR         AMASK           < D2 G1,
         LAI         '84
         BSR         AMASK           < AD2 G1,
         LAI         '12
         BSR         AMASK           < D2 AG1,
         LAI         '48
         BSR         AMASK           < AD1 G2.
         JMP         CONT30
<
< SOUS-PROGRAMME DE DETECTION D'UNE CONFIGURATION DANGEREUSE :
< (DANS 'A' ON TROUVE LA FORME DE LA
< CONFIGURATION DANGEREUSE ; SI ELLE
< EST PRESENTE, ON VA BRUTALEMENT EN
< 'CONT5')
<
MASK:    EQU         $
         PSR         B               < SAVE L'ETAT DES VOISINS...
         ANDR        A,B
         CPR         A,B             < ???
         JNE         MASK1           < L'ETAT 'A' N'EST PAS PRESENT, OK...
         ADRI        -2,K            < IL EST LA, ON EST DANS UN COULOIR !!!
         JMP         CONT5
MASK1:   EQU         $
         PLR         B
         RSR
<
< CAS D'UN POINT NOIR QUI N'ENTRE PAS DANS UN COULOIR :
<
CONT30:  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).
         LA          KAROT           < EST-ON EN TRAIN DE BOUCLER ???
         CPI         XKAROT*1
         JL          CONT32
CONT38:  EQU         $
         BSR         AROT3           < OUI, ON TOURNE NOS RECHERCHES...
         CPI         XKAROT*2
         JL          CONT32
         BSR         AROT3           < OUI, ENCORE !!!
         CPI         XKAROT*3
         JGE         DEP4            < ERREUR SUR LE POINT DE DEPART, IL EST
                                     < SUREMENT DANS UN COULOIR...
CONT32:  EQU         $
         BSR         AROT1           < ON SE PLACE A DROITE DU
                                     < MOUVEMENT (VX,VY).
         BSR         AMOV
         BSR         AVOISI          < ET ON TESTE LES 3 POINTS
                                     < IMMEDIATEMENT A DROITE DU
                                     < POINT COURANT SUIVANT LE
                                     < MOUVEMENT (VX,VY).
         BSR         AROT1
         BSR         AMOV
         BSR         AVOISI
         BSR         AROT1
         BSR         AROT1
         BSR         AMOV
         BSR         AMOV
         BSR         AVOISI
         PLR         X,Y             < RESTAURE LE POINT COURANT.
         LA          SANGLE
         STA         ANGLE           < RESTAURE ANGLE.
         LA          SVX
         STA         VX              < RESTAURE VX.
         LA          SVY
         STA         VY              < RESTAURE VY.
         CPZR        B               < LE POINT (X,Y) A-T'IL AU
                                     < MOINS 1 VOISIN ???
         JE          CONT5           < NON, ON FAIT DONC UN RETOUR ARRIERE
                                     < SUR PTC, ET ROTATION DE (VX,VY).
<
< MARQUAGE DU POINT (X,Y) :
<
         BSR         AXISTV          < LE POINT (X,Y) N'AURAIT-IL PAS ETE
                                     < DEJA MARQUE ???
         CPZ         INDIC
         JNE         CONT34          < NON, ON LE MARQUE...
         IC          MULTI           < OUI, ON MEMORISE LE FAIT QUE L'ON
                                     < FAIT UN MARQUAGE BOUCLE !!!
         LA          MULTI
         CPI         2
         JG          CONT5           < ET OUI...
         JMP         CONT35          < VERS LE MARQUAGE...
CONT37:  EQU         $
         BR          ALOOP           < VERS 'CONT1'...
CONT34:  EQU         $
         STZ         MULTI           < REINITIALISATION...
CONT35:  EQU         $
         BSR         ASETV           < MARQUAGE DE (X,Y) S'IL EST NOIR...
         BSR         ASETW           < MEMORISATION DES LASTY...
         LR          X,A
         CP          DEP+X           < EST-ON AU POINT DE DEPART ???
         JNE         CONT37          < NON, AU SUIVANT...
         LR          Y,A
         CP          DEP+Y           < EST-ON AU POINT DE DEPART ???
         JNE         CONT37          < NON, AU SUIVANT...
<
< ON A LE CONTOUR INTERIEUR :
<
CONT7:   EQU         $
         LAD         M5              < PARCOURS EXTERIEUR A PRIORI.
         CPZ         ANGLE           < INTERIEUR OU EXTERIEUR ???
         JG          CONT60          < EXTERIEUR.
         JL          CONT70          < INTERIEUR.
         WORD        '1E16           < E R R E U R   P R O G !!!
CONT70:  EQU         $
         LAD         M4              < INTERIEUR.
CONT60:  EQU         $
         BSR         APRINT          < ENVOI DU MESSAGE.
<
< QUE VOULEZ-VOUS : UN CONTOUR, OU BIEN UN REMPLISSAGE ???
<
CONT90:  EQU         $
         LAD         M8
         BSR         APRINT
         LAD         DEMREP
         SVC         0               < LECTURE DE LA REPONSE.
         LBY         REP             < A=CARACTERE REPONSE.
<
<        REPONSES RECONNUES :
<                    N : ON NE CALCULE QUE LE CONTOUR EN SCRATCH,
<                    O : ON REMPLIT L'IMAGE.
<
         CPI         "O"
         JE          CONT91          < REMPLISSAGE.
         CPI         "N"
         JNE         CONT90          < RIEN COMPRIS : REINTERROGATION ???
         BR          AGOGE           < CONTOUR : ON RETOURNE A GE, AVEC
                                     < UN VIDAGE PREALABLE DE L'IMAGE
                                     < VIRTUELLE EN SCRATCH.
CONT91:  EQU         $
         BSR         ACONTI          < ON AMENE EN MEMOIRE IMAGE
                                     < LE CONTOUR QUE L'ON A
                                     < GENERE, CAR C'EST DE LUI
                                     < QU'ON VEUT LES LIMITES !!!
<
<        L I M I T E S   V E R T I C A L E S   C O N T O U R  :
<
         LA          AIMAG
         STA         AIMAG0          < RELAI D'ACCES AUX LIGNES.
         LYI         0               < Y=NUMERO DE LIGNE COURANTE.
LOOK1:   EQU         $
         LXI         CNMPL           < INDEX MOT SUR LA LIGNE.
LOOK2:   EQU         $
         CPZ         &AIMAG0         < NOIR OU PAS ???
         JNE         LOOK3           < PAS NOIR, ON ARRETE...
         JDX         LOOK2           < TANT QUE C'EST NOIR,
                                     < ON CONTINUE.
         ADRI        1,Y             < LIGNE SUIVANTE.
         LA          AIMAG0
         ADRI        CNMPL,A         < PROGRESSION @LIGNE COURANTE.
         STA         AIMAG0
         JMP         LOOK1           < TEST LIGNE SUIVANTE.
LOOK3:   EQU         $
         STY         YMIN            < Y DONNE LA DERNIERE LIGNE
                                     < LORS DES BALAYGES DE BAS
                                     < EN HAUT DE L'IMAGE.
         LAI         CNMPL
         MP          NLIG
         LR          B,A
         AD          AIMAG
         STA         AIMAG0          < RELAI D'ACCES A LA DERNIERE
                                     < LIGNE DE L'IMAGE.
         LY          NLIG            < Y=NUMERO DE LIGNE COURANTE.
LOOK4:   EQU         $
         LXI         CNMPL           < INDEX MOT SUR LA LIGNE.
LOOK5:   EQU         $
         CPZ         &AIMAG0         < NOIR OU PAS ???
         JNE         LOOK6           < ON ARRETE AU 1ER NON NOIR.
         JDX         LOOK5           < TANT QUE C'EST NOIR,
                                     < ON CONTINUE...
         ADRI        -1,Y            < PASSAGE LIGNE PRECEDENTE.
         LA          AIMAG0
         ADRI        -CNMPL,A        < PROGRESION @LIGNE COURANTE.
         STA         AIMAG0
         JMP         LOOK4
LOOK6:   EQU         $
         STY         YMAX            < Y DONNE LA 1ERE LIGNE A TESTER
                                     < LORS DES BALAYAGES DE BAS
                                     < EN HAUT DE L'IMAGE.
<
<        R E M P L I S S A G E   D U   C O N T O U R  :
<
CONT18:  EQU         $
         BSR         ARAZDK          < CLEAR DE L'IMAGE VIRTUELLE.
<
< SUPPRESSION EVENTUELLE DES POINTS 0-ISOLES OU 1-ISOLES :
<
         STZ         ITEST
         IC          ITEST
ISOL8:   EQU         $
         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         $
         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).
         PSR         B               < SAVE LE NOMBRE AVANT LES VERTICAUX...
         BSR         AVOISI
         ADRI        1+1,Y           < POINT (X,Y+1).
         BSR         AVOISI
         ADRI        -1,Y            < RETOUR AU POINT (X,Y).
         PLR         A               < A=NOMBRE DE VOISINS AVANT LES VERTICAUX.
         SBR         B,A
         NGR         A,A
         CPR         A,B
         JNE         ISOL93          < IL N'Y A PAS QUE DES VERTICAUX...
         CPI         2
         JNE         ISOL93          < LE POINT N'A PAS 2 VOISINS VERTICAUX...
         PSR         C
         LA          ALIMAG
         ADR         A,C
         BSR         ATEST           < LORSQU'UN POINT A 2 VOISINS VERTICAUX,
                                     < ON REGARDE S'IL EST EN MEMOIRE LASTY...
         PLR         C
         JC          ISOL93          < OUI, ON LE GARDE...
         BSR         ARESET          < NON, ON L'EFFACE...
ISOL93:  EQU         $
         LR          B,A             < A=NBRE DE VOISINS DE (X,Y).
         JANE        ISOL10          < OK POINT 1-ISOLE AU MOINS...
         BR          ADEP4           < ERREUR SUR LE POINT DE DEPART, IL
                                     < S'AGISSAIT SUREMENT D'UN POINT NOIR
                                     < SEUL ENTRE PLEIN DE POINTS BLANCS...
ISOL10:  EQU         $
         CPI         1
         JG          ISOL7           < ON LE GARDE...
<
< ELIMINATION DES POINTS 0-ISOLES ET 1-ISOLES :
<
ISOL12:  EQU         $
         BSR         ARESET          < OUI, ON L'ELIMINE.
         PSR         Y,C
         LA          ALIMAG
         ADR         A,C
         BSR         ARESET          < MAJ DE LA MEMOIRE DES LASTY.
         ADRI        1,Y
         BSR         ARESET
         PLR         Y,C
         IC          NISOL           < ET ON COMPTE LES POINTS
                                     < AINSI EFFACES.
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.
<
<
<        R E M P L I S S A G E   D U   C O N T O U R  :
<
<
         LY          YMAX            < Y=NUMERO DE LIGNE.
CONT20:  EQU         $
         LXI         0               < X=NUMERO DE POINT SUR LA LIGNE.
CONT21:  EQU         $
         BSR         AEXIST          < TEST DU POINT M(X,Y)...
         JANE        CONT22          < IL EST NOIR, OU IL N'EXISTE PAS !!!
<
< CAS OU ON TROUVE UN PREMIER POINT BLANC :
<
         STZ         KVOISH          < COMPTAGE DES VOISINS DE DESSUS,
         STZ         KVOISB          < COMPTAGE DES VOISINS DE DESSOUS.
<
< RECHERCHE DU PREMIER POINT NOIR SUIVANT LE PREMIER POINT BLANC :
<
CONT25:  EQU         $
         BSR         ASP1            < COMPTAGE DES VOISINS DESSUS/DESSOUS...
         ADRI        1,X
         LR          X,A
         CP          NPPL
         JG          CONT23          < ON EST EN BOUT DE LIGNE, ON EN CHANGE.
         BSR         ATEST           < TEST DU POINT (X,Y) ???
         JC          CONT25          < ENCORE UN BLANC...
         BSR         ASP2            < INFLEXION OU TANGENCE ???
         JAE         CONT21          < IL S'AGIT D'UNE TANGENCE HORIZONTALE,
                                     < IL NE FAUT PAS REMPLIR...
<
< CAS D'UN POINT D'INFLEXION :
<
<
< MEMORISATION DE L'ORIGINE DU SEGMENT DE REMPLISSAGE :
<
CONT40:  EQU         $
         LR          Y,A
         SB          NLIG
         NGR         A,A
         SLLS        DEDY
         STA         SEGORG+Y
         LR          X,A
         SLLS        DEDX
         STA         SEGORG+X
<
< REMPLISSAGE D'UN SEGMENT NOIR :
<
CONT27:  EQU         $
         BSR         ATEST
         JC          CONT28          < ARRET SUR LE PREMIER POINT BLANC...
         BSR         ASETV           < MARQUAGE DES POINT NOIRS...
         ADRI        1,X             < AU SUIVANT...
         LR          X,A
         CP          NPPL
         JLE         CONT27
CONT28:  EQU         $
         STZ         KVOISH          < COMPTAGE DES VOISINS DE DESSUS,
         STZ         KVOISB          < COMPTAGE DES VOISINS DE DESSOUS.
         ADRI        -1,X
<
< MEMORISATION DE L'EXTREMITE DU SEGMENT DE REMPLISSAGE :
<
         LR          Y,A
         SB          NLIG
         NGR         A,A
         SLLS        DEDY
         STA         SEGEXT+Y
         LR          X,A
         SLLS        DEDX
         STA         SEGEXT+X
         BSR         ASEND           < ENVOI EVENTUEL EN 'ZDC'...
<
< ELIMINATION DES POINTS BLANCS A LA SUITE DU REMPLISSAGE :
<
CONT29:  EQU         $
         ADRI        1,X
         LR          X,A
         CP          NPPL
         JG          CONT23          < CHANGEMENT DE LIGNE...
         BSR         ATEST           < TEST DU POINT M(X,Y)...
         JNC         CONT47          < POINT NOIR, FIN DU SEGMENT BLANC...
         BSR         ASP1            < COMPTAGE DES VOISINS DESSUS/DESSOUS...
         JMP         CONT29          < VERS LE BLANC SUIVANT...
CONT47:  EQU         $
         BSR         ASP2            < INFLEXION OU TANGENCE ???
         JAE         CONT40          < IL FAUT REPRENDRE LE REMPLISSAGE CAR
                                     < CE SEGMENT BLANC N'ETAIT PAS UN
                                     < SEGMENT D'INFLEXION...
         JMP         CONT21          < DES QU'UN NOIR EST TROUVE, ON RECOMMENCE
                                     < LE PROCESSUS...
<
< RECHERCHE D'UN POINT SUIVANT SUR LA LIGNE :
<
CONT22:  EQU         $
         ADRI        1,X
         LR          X,A
         CP          NPPL
         JLE         CONT21          < ON RESTE SUR LA MEME LIGNE...
<
< CHANGEMENT DE LIGNE :
<
CONT23:  EQU         $
         ADRI        -1,Y
         LR          Y,A
         CP          YMIN
         JGE         CONT20          < VERS LA NOUVELLE LIGNE...
         BR          AGOGE           < C'EST FINI...
         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.