VERSIO:: VAL         2               < NUMERO DE VERSION, DONNANT LA NATURE
                                     < DES ALGORITHMES UTILISES...
XXV1::   VAL         1               < VERSION 1...
XXV2::   VAL         2               < VERSION 2...
NMTZ:    VAL         "T5"
NMP:     VAL         " H"
         IF          NMPROC-NMTZ,,XWOR%,
         IF          NMPROC-NMP,,XWOR%,
         IF          ATTENTION : 'NMPROC' EST MAUVAIS !!!
XWOR%:   VAL         0
         IF          NMPROC-NMTZ,XWOR%9,,XWOR%9
         IDP         "T5 - VERSION TRANSFORMATION PAR CONTOUR DE TW"
XWOR%9:  VAL         0
         IF          NMPROC-NMP,XWOR%9,,XWOR%9
         IDP         " H - VERSION DE 'T5' INTERPRETATIVE"
XWOR%9:  VAL         0
         IDP         "RELEASE 27/05/1980"
         EOT         #SIP DEFINITION CMS5#
         EOT         #SIP DEF PROCESSEUR#
         PROG
         WORD        TW              < POINT D'ENTREE...
         WORD        0
PTW:     EQU         $               < DOIT VALOIR '12...
         LRP         L
         BR          -2,L            < ENTREE DANS LE PROCESSEUR...
         EOT         #SIP DEFINITION ITEM#
ITEM2:   EQU         ZERO+PILE-LTNI-LTNI
ITEM1:   EQU         ITEM2+LTNI
         EOT         #SIP IMAGE 256#
NBITMO:  VAL         16              < NOMBRE DE BITS PAR MOT.
NOCMO:   VAL         2               < NOMBRE D'OCTETS PAR MOT...
NBITOC:  VAL         NBITMO/NOCMO    < NOMBRE DE BITS PAR OCTET...
NBRHEX:  VAL         4               < NOMBRE DE CHIFFRES HEXAS PAR MOT.
BIT:     VAL         1
NMOTL:   VAL         CNMPL           < NOMBRE DE MOTS PAR LIGNE.
NLIG:    VAL         LIMAG/NMOTL     < NOMBRE DE LIGNES PAR TRAME.
NLIGM1:  VAL         NLIG-1          < ORDONNEE MAXIMALE.
XWOR%1:  VAL         NLIGM1+1
XWOR%2:  VAL         XWOR%1=0
         IF          BIT>XWOR%2-XWOR%1,,XWOR%,
         IF          ATTENTION : 'NLIGM1' DOIT ETRE UN MASQUE !!!
XWOR%:   VAL         0
NPOLM1:  VAL         NMOTL*NBITMO-1  < ABSCISSE MAXIMALE.
XWOR%1:  VAL         NPOLM1+1
XWOR%2:  VAL         XWOR%1=0
         IF          BIT>XWOR%2-XWOR%1,,XWOR%,
         IF          ATTENTION : 'NPOLM1' DOIT ETRE UN MASQUE !!!
XWOR%:   VAL         0
NCOOL:   VAL         3               < NOMBRE DE COULEURS DE BASE.
NIVMAX:  VAL         BIT>NCOOL-BIT   < NIVEAU MAX RECONNU.
MFFFF:   VAL         'FFFF           < MASQUE DU MOT.
EOT:     VAL         '04             < CARACTERE 'EOT'.
SGNDLN:  VAL         3               < FONCTION DE DELETE SGN,
SGNSTN:  VAL         4               < FONCTION DE STORE SGN,
SGNLON:  VAL         5               < FONCTION DE LOAD SOUS ACN SGN,
SGNLNS:  VAL         6               < FONCTION DE LOAD SOUS :SYS SGN.
         PAGE
<
<
<        S E L E C T I O N   D U   M O D E   D ' E N T R E E  :
<
<
NMPROD:  VAL         NMPROC          < SAUVEGARDE DU NOM REEL DU PROCESSEUR,
                                     < ON NE SAIT JAMAIS ??!?!?!?
VISU:    VAL         0               < MODE D'ENTREE PAR LA VISU,
ITEM:    VAL         1               < MODE D'ENTREE PAR L'ITEM1.
MODE:    VAL         VISU            < A PRIORI, 'TW'/'TX' : ENTREE VISU...
         IF          NMPROC-NMP,XWOR%,,XWOR%
NMPROC:  VAL         NMTZ            < SI " 3", ON LE REMPLACE PAR "T3",
MODE:    VAL         ITEM            < AVEC ENTREE PAR L'ITEM1.
XWOR%:   VAL         0
         PAGE
<
<
<        D E F I N I T I O N   D E   L ' I M A G E  :
<
<
NOM:     EQU         ZERO+PILE+5-LNOM
IMAG:    EQU         NOM+LNOM
IMAGE:   EQU         IMAG
IMAGR:   EQU         IMAGE+0
IMAGV:   EQU         IMAGR+LIMAG
IMAGB:   EQU         IMAGV+LIMAG
TV1::    VAL         0               < ADRESSE DE LA MEMOIRE DE VISUALISATION
                                     < EN 'CDAI'.
         IF          TV1-0,,XWOR%,
         IF          TV1 DOIT ETRE NUL, SINON, DE NOMBREUSES
         IF          SEQUENCES DE CODE SONT MAUVAISES !!!
XWOR%:   VAL         0
AMASK::  VAL         NCOOL*LIMAG+TV1 < ADRESSE DU MASQUE DANS LA 'CDA'.
IZBUF::  VAL         AMASK+LIMAG     < DEBUT DU BLOC COURANT DU Z-BUFFER DANS
                                     < LA 'CDA' QUAND ON EST EN '!CDAI'...
LIZBUF:: VAL         '1000           < LE Z-BUFFER EST DECOUPE EN BLOCS DE
                                     < 4K MOTS,
NZBUF::  VAL         16              < CE QUI FAIT DONC 16 BLOCS...
XWOR%1:  VAL         1024
XWOR%2:  VAL         LIZBUF/XWOR%1*NZBUF
XWOR%3:  VAL         LIMAG/XWOR%1*NBITMO
         IF          XWOR%3-XWOR%2,,XWOR%,
         IF          ATTENTION : LIZBUF ET NZBUF INCOMPATIBLES !!!
XWOR%:   VAL         0
LSDKU::  VAL         128
NSDKU::  VAL         LIZBUF/LSDKU    < INCREMENT DE PASSAGE D'UN BLOC DU
                                     < Z-BUFFER AU SUIVANT SUR 'DKU'...
TV2::    VAL         IZBUF+LIZBUF    < ADRESSE DE LA DEUXIEME IMAGE SCRATCH
                                     < UTILISEE EN PARTICULIER POUR LA MODU-
                                     < LATION D'AMPLITUDE SUR LA NORMALE.
LNOMP:   VAL         LNOM-1          < LONGUEUR UTILE DU NOM (A CAUSE DE
                                     < L'EOT A PRIORI...
         PROG
         PAGE
<
<
<        M E S S A G E S  :
<
<
MMCDA:   BYTE        5;'6D
MCDAI:   ASCI        "!CDA"
         BYTE        "I";EOT
REP:     DZS         NBRHEX/NOCMO    < BUFFER DES REPONSES.
MERR:    BYTE        1;"?"
         IF          MODE-VISU,XWOR%7,,XWOR%7
MINT:    BYTE        2;'6D;">";0
MNOM:    BYTE        5;'6D
         ASCI        "NOM="
MORGX:   BYTE        3;'6D
         ASCI        "X="
MORGY:   BYTE        3;'6D
         ASCI        "Y="
MTORE:   BYTE        6;'6D
         ASCI        "TORE? "
MCAD:    BYTE        6;'6D
         ASCI        "NUMC="
MMAX:    BYTE        5;'6D
         ASCI        "MAX?"
MNIVO:   BYTE        5;'6D
         ASCI        "NIV="
MK:      BYTE        3;'6D
         ASCI        "K="
MASKO:   BYTE        9;'6D
         ASCI        "MASK ON?"
MSLAS:   BYTE        1;"/"
MCX:     BYTE        4;'6D
         ASCI        "CX= "
MCY:     BYTE        4;'6D
         ASCI        "CY= "
MIX:     BYTE        4;'6D
         ASCI        "IX= "
MIY:     BYTE        4;'6D
         ASCI        "IY= "
MSENS:   BYTE        6;'6D;"1";" ";"2";'08;'08
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
MOPTC:   BYTE        7;'6D
         ASCI        "CX,CY?"
MECH:    BYTE        9;'6D
         ASCI        "ECH.DYN?"
MPAS:    BYTE        5;'6D
         ASCI        "PAS="
XWOR%8:  VAL         0
MMC:     BYTE        5;'6D
         ASCI        "RVB?"
MMS:     BYTE        6;'6D
         BYTE        "S";" ";"M";'08;'08
XWOR%7:  VAL         0
<
< ZONE EN RECOUVREMENT :
<
BUFIN:   EQU         ITEM2+'518      < BUFFER D'ENTREE DES FONDS.
LBUFIN:  VAL         NBITMO/NOCMO
LBUFMH:  VAL         NPOLM1+1/NBITMO < LONGUEUR DU MASQUE HORIZONTAL,
LBUFMV:  VAL         NLIGM1+1/NBITMO < LONGUEUR DU MASQUE VERTICAL.
BUFMH:   EQU         BUFIN+LBUFIN    < MASQUE HORIZONTAL,
BUFMV:   EQU         BUFMH+LBUFMH    < MASQUE VERTICAL.
LSTACK:: VAL         30              < LONGUEUR DE LA PILE DE TRAVAIL.
STACK:   EQU         BUFMV+LBUFMV    < PILE DE TRAVAIL.
         IF          ITEM1-STACK-LSTACK,,,XWOR%
         IF          ATTENTION : LA ZONE EN RECOUVREMENT DE
         IF          L'ITEM2, RECOUVRE AUSSI L'ITEM1 !!!
XWOR%:   VAL         0
         PAGE
<
<
<        C O M M O N  :
<
<
         COMMON
COMON:   WORD        0               < MOT RESERVE POUR LE BLOC FLOTTANT.
<
< CONSTANTES :
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
NGE:     ASCI        "GE"            < NOM DU PROCESSEUR DE RETOUR.
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
NSD:     ASCI        "SD"            < NOM DE L'OVERLAY D'APPEL.
TCALL:   WORD        "GE";"EI"       < NOM DES OVERLAYS DE RETOUR SI ALT-MODE.
NCALL:   WORD        TCALL,X
NPCALL:  WORD        0               < NOM DU PROCESSEUR DE RETOUR SI ALT-MODE.
XWOR%7:  VAL         0
SAVEK:   WORD        0               < SAUVEGARDE DU REGISTRE 'K'.
KIN:     WORD        -1              < COMPTEUR DES ENTREES...
         IF          MODE-VISU,XWOR%7,,XWOR%7
NMOTS:   WORD        2*LTNI          < LONGUEUR MOTS DES 2 ITEMS.
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
NMOTS:   WORD        LTNI            < POUR NE RAZER QUE L'ITEM2...
XWOR%7:  VAL         0
IMASKO:  WORD        0               < 0 : MASK OFF,
                                     < 1 : MASK ON...
<
< DONNEES DE GESTION DU MASQUE :
<
AEMETT:  WORD        0               < ADRESSE DE L'EMETTEUR,
ARECEP:  WORD        0               < ADRESSE DU RECEPTEUR.
         IF          MODE-ITEM,XWOR%7,,XWOR%7
<
< DONNEES DE SIMULATION DES ENTREES :
<
IEG:     WORD        0               < INDEX COURANT DE L'ITEM1.
NCP:     WORD        NBCAR*NBLIG-LNOM  < LONGUEUR MAX D'UN ITEM,
                                       < ON RETRANCHE LNOM, CAR LE NOM
                                       < D'UNE IMAGE DOIT ETRE IMPERATIVEMENT
                                       < DEVANT L'IMAGE...
AI1:     WORD        ITEM1+LTN,X     < RELAI D'ACCES A L'ITEM1.
ABUFC:   WORD        0               < RELAI D'ACCES AU BUFFER COURANT.
XWOR%7:  VAL         0
<
< RELAIS DE TABLES, D'IMAGES...
<
ACOM:    WORD        KOM,X           < TABLE DES COMMANDES RECONNUES.
AMERR:   EQU         MERR            < MESSAGE D'ERREUR.
         IF          MODE-VISU,XWOR%7,,XWOR%7
AMINT:   EQU         MINT            < MESSAGE D'INVITATION.
AMNOM:   EQU         MNOM            < "NOM="
AMORGX:  EQU         MORGX           < "ORGX="
AMORGY:  EQU         MORGY           < "ORGY="
AMTORE:  EQU         MTORE           < "TORE?"
AMCAD:   EQU         MCAD            < "NUMC="
AMMAX:   EQU         MMAX            < "MAX?"
AMNIVO:  EQU         MNIVO           < "NIVEAUX="
AMASKO:  EQU         MASKO           < "MASK ON?"
AMSLAS:  EQU         MSLAS           < "/"
AMCX:    EQU         MCX             < "CX="
AMCY:    EQU         MCY             < "CY="
AMIX:    EQU         MIX             < "IX="
AMIY:    EQU         MIY             < "IY="
AMSENS:  EQU         MSENS           < "1 2"
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
AMOPTC:  EQU         MOPTC           < "CX,CY?"
AMECH:   EQU         MECH            < "ECHELLE DYNAMIQUE?"
AMPAS:   EQU         MPAS            < "PAS="
XWOR%8:  VAL         0
AMK:     EQU         MK              < "K="
AMMC:    EQU         MMC             < "RVB?"
AMMS:    EQU         MMS             < "S M"
XWOR%7:  VAL         0
AREP:    WORD        REP             < ACCES AU BUFFER DE REPONSE...
AREPX:   WORD        REP,X           < DE MEME EN INDEXE...
ABUFIN:  WORD        BUFIN,X         < ACCES AU BUFFER DE GENERATION DU FOND.
AMCDAI:  EQU         MCDAI           < !CDAI.
AMMCDA:  EQU         MMCDA           < !CDA.
AITEM2:  WORD        ITEM2-1,X       < POUR RAZER LES ITEMS 1 ET 2.
AEOT:    WORD        NOM+LNOMP       < POUR FORCER UN EOT...
<
< RELAIS DE SOUS-PROGRAMMES :
<
AOVL:    WORD        OVL             < CHARGEMENT DES OVERLAYS...
         IF          MODE-VISU,XWOR%7,,XWOR%7
APRINT:  WORD        PRINT           < EDITION D'UN MESSAGE.
XWOR%7:  VAL         0
AENTER:  WORD        ENTER           < ENTREE DE QUELQUE CHOSE SUR LA VISU...
AIN:     WORD        IN              < ENTREE D'UN CARACTERE,
AIHEX:   WORD        IHEX            < ENTREE DE 4 CHIFFRES HEXA-DECIMAUX,
         IF          MODE-VISU,XWOR%7,,XWOR%7
APIN:    WORD        PIN             < EDITION MESSAGE+ENTREE 1 CARACTERE.
APIHEX:  WORD        PIHEX           < EDITION MESSAGE+ENTREE 4 CHIFFRES.
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
APIN:    EQU         AIN
APIHEX:  EQU         AIHEX
XWOR%7:  VAL         0
AIFLOT:  WORD        IFLOT           < ENTREE D'UNE CONSTANTE FLOTTANTE.
AHEX:    WORD        HEX             < CONVERSION DE 4 CHIFFRES HEXAS EN BINAIRE
ACCI:    WORD        CCI             < ACCES AU CCI.
AGOSGN:  WORD        GOSGN           < POUR ACCEDER AU SGN...
ASPSCD:  WORD        SPSCD           < TRANSFERT BRUTAL EN SCRATCH.
ASPACD:  WORD        SPACD           < TRANSFERT EN RESIDENT AVEC MASQUE,
ASPBCD:  WORD        SPBCD           < TRANSFERT EN RESIDENT SANS MASQUE.
APMOV5:  WORD        PMOV5           < TV R --> RESIDENT,
APMOV6:  WORD        PMOV6           < TV V --> RESIDENT,
APMOV7:  WORD        PMOV7           < TV B --> RESIDENT.
ASP:     WORD        0               < RELAI VARIABLE CONTENANT L'ADRESSE DE
                                     < L'UN DES SOUS-PROGRAMMES PRECEDENTS.
ASPOP:   WORD        SPOP            < OPERATIONS INTER-IMAGES...
ALOOP:   WORD        LOOP            < BOUCLE DE L'INTERROGATION.
         IF          MODE-ITEM,XWOR%7,,XWOR%7
AALTM:   WORD        ALTM            < TRAITEMENT DES RETOURS BRUTAUX...
XWOR%7:  VAL         0
<
< DEMANDES A CMS5 :
<
DEMIN:   WORD        '0101           < ENTREE D'UN CARACTERE DE REPONSE.
         WORD        REP-ZERO*NOCMO
         WORD        1
DEMHEX:  WORD        '0101           < ENTREE D'UN NOMBRE HEXA-DECIMAL.
         WORD        REP-ZERO*NOCMO
         WORD        NBRHEX
DEMOUT:  WORD        '0202           < ECRITURE D'UN MESSAGE SUR LA VISU.
         WORD        MERR-ZERO*NOCMO+1
         WORD        1               < MESSAGE D'ERREUR POUR " P"...
DEMMEM:  WORD        4               < DEMANDE DE 16 K MOTS...
RELMEM:  WORD        4               < RETOUR A 4K MOTS...
         WORD        '8000
         WORD        '2000
         IF          MODE-VISU,XWOR%7,,XWOR%7
NOMBB::  VAL         "K"             < NOM DE LA BRANCHE D'OVERLAY.
NOMOV1:: VAL         " ">NBITOC?NOMBB
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
NOMBB::  VAL         "U"             < NOM DE LA BRANCHE D'OVERLAY.
NOMOV1:: VAL         " ">NBITOC?NOMBB
XWOR%7:  VAL         0
DEMCC:   WORD        2               < ACCES AU CCI INTERPRETATIF.
         WORD        0               < ADRESSE DE LA CARTE.
         WORD        80
NOMIN:   WORD        '0101           < ENTREE DU NOM D'UNE IMAGE.
         WORD        NOM-ZERO*NOCMO
         WORD        LNOMP*NOCMO
SGN:     WORD        '0002           < POUR LES ACCES AU SGN.
         WORD        NOM-ZERO*NOCMO
         WORD        LIMAG*NCOOL+LNOM*NOCMO
         WORD        -1              < LA VALEUR SUIT LE NOM...
TVDKU:   VAL         '8A01           < ACCES A 'DKU' POUR LA 'TV'.
DEMTVR:  WORD        TVDKU           < ACCES AU ROUGE.
         WORD        IMAGR-ZERO*NOCMO
         WORD        LIMAG*NOCMO
         WORD        TVPR
DEMTVV:  WORD        TVDKU           < ACCES AU VERT.
         WORD        IMAGV-ZERO*NOCMO
         WORD        LIMAG*NOCMO
         WORD        TVPV
DEMTVB:  WORD        TVDKU           < ACCES AU BLEU.
         WORD        IMAGB-ZERO*NOCMO
         WORD        LIMAG*NOCMO
         WORD        TVPB
DEMOVL:  BYTE        '80?SGNLNS;'02  < CHARGEMENT DE L'OVERLAY DE 'TZ'.
         WORD        OVLTZ2
         WORD        LOVL2
         WORD        -1
DEMLOD:  BYTE        '80?SGNLNS;'02  < DEMANDE DE CHARGEMENT DE "GE".
         WORD        BRANCH-ZERO*NOCMO
         WORD        ZERO-BRANCH+PILE-LTNI-LTNI*NOCMO
         WORD        -1
         IF          MODE-ITEM,XWOR%7,,XWOR%7
SITEM1:  DZS         LNOM/NOCMO      < POUR SAUVEGARDER LA FIN DE L'ITEM1.
XWOR%7:  VAL         0
<
< ACCES AU Z-BUFFER :
<
ZBUF:    WORD        0               < 0 : Z-BUFFER ACTIF (MODE NORMAL)...
                                     < 1 : INACTIF, MAIS DANGEREUX...
RDKU:    BYTE        '8A;'0C         < 'DKU' --> 'MEMTV' EN QUANTA=1.
         WORD        IZBUF*NOCMO
         WORD        LIZBUF*NOCMO
         WORD        0
WDKU:    BYTE        '8A;'0E         < 'MEMTV' --> 'DKU' EN QUANTA=1.
         WORD        IZBUF*NOCMO
         WORD        LIZBUF*NOCMO
         WORD        0
SDKU:    WORD        -1              < NUMERO DU BLOC COURANT, N'EXISTE PAS
                                     < AU CHARGEMENT.
MDKU:    WORD        0               < COMPTAGE DES MODIFS DU BLOC COURANT.
XZMAX::  VAL         '7FFF           < PLUS GRAND NOMBRE ENTIER POSITIF.
ZMAX:    WORD        XZMAX           < PLUS GRAND NOMBRE POSITIF...
ASPDKU:  WORD        SPDKU           < ECRITURE DU BLOC COURANT...
AGZB:    WORD        GZB             < ACCES GENERAL AU Z-BUFFER...
<
< CONSTANTES UTILES :
<
XR:      WORD        0               < COORDONNEE X D'UN POINT RESIDENT,
YR:      WORD        0               < COORDONNEE Y D'UN POINT RESIDENT,
XS:      WORD        0               < COORDONNEE X D'UN POINT SCRATCH,
YS:      WORD        0               < COORDONNEE Y D'UN POINT SCRATCH.
ORGX:    WORD        0               < ORIGINE EN X DE L'IMAGE SCRATCH
                                     < PAR RAPPORT A L'IMAGE RESIDENTE,
ORGY:    WORD        0               < DE MEME, ORIGINE EN Y...
         IF          VERSIO-XXV1,XWOR%8,,XWOR%8
CX:      WORD        0               < COORDONNEES DU CENTRE POLAIRE
CY:      WORD        0               < DES CONTOURS EXTRAITS.
XWOR%8:  VAL         0
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
XICXCY:: VAL         2               < ON UTILISE (CX,CY) JUSQU'AU CONTOUR
                                     < C(XICXCY) INCLUS.
ICXCY:   WORD        0               < 0 : UTILISER (CX,CY),
                                     < 1 : NE PAS UTILISER (CX,CY).
                                     < -1 : MODE AUTOMATIQUE : (CX,CY) EST
                                     <      CALCULE AU MILIEU DU PLUS GRANS
                                     <      SEGMENT CONTENU DANS LE CONTOUR
                                     <      (VOIR 'ECHELLE DYNAMIQUE').
CX:      FLOAT       0               < COORDONNEE DU CENTRE POLAIRE
CY:      FLOAT       0               < ARBITRAIRE DES CONTOURS EXTRAITS.
XWOR%8:  VAL         0
IX:      WORD        0               < COORDONNEES DU CENTRE POLAIRE
IY:      WORD        0               < DE L'IMAGE RESIDENTE.
SENS:    WORD        0               < INDICATEUR DU SENS DES OPERATIONS :
                                     < 0 : 2 --> 1,
                                     < 1 : 1 --> 2. (TV1 ET TV2).
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
XPAS::   VAL         8               < VALEUR MAX DU PAS...
PAS:     WORD        XPAS            < PAS DE MODIFICATION DES QUATRE
                                     < CONSATNTES SUIVANTES :
MINX:    WORD        0
MAXX:    WORD        NPOLM1
MINY:    WORD        0
MAXY:    WORD        NLIGM1
XWOR%8:  VAL         0
<
< DONNEES POUR LA GESTION DES "MATRICES" D'IMAGES :
<
ZNIMA::  VAL         2
XNIMA::  VAL         2*2             < ON DEFINIT UNE MATRICE 2*2...
YNIMA::  VAL         XNIMA=0/ZNIMA
XWOR%1:  VAL         YNIMA*ZNIMA
         IF          BIT>XWOR%1-XNIMA,,XWOR%,
         IF          ATTENTION : 'XNIMA' DOIT ETRE UNE PUISSANCE DE 2 !!!
XWOR%:   VAL         0
CADN:    WORD        XNIMA           < NOMBRE DE POINTS PAR PAVE.
CADX:    WORD        0               < ORIGINE EN X DU CADRE,
CADY:    WORD        0               < ORIGINE EN Y DU CADRE.
CADNIV:  WORD        0               < CUMUL DES NIVEAUX D'UN PAVE.
IMAX:    WORD        0               < 0 : CALCUL PAR MOYENNAGE,
                                     < 1 : PRISE DU MAX SUR LE PAVE.
MAX:     WORD        0               < MAX RENCONTRE DANS UN PAVE.
LNIV:    WORD        0               < LISTE DES NIVEAUX A LAISSER INTACT :
                                     < SI LE BIT DE RANG 'X' EST A 1, LES POINTS
                                     < DE NIVEAU 'X' SERONT INTOUCHES DANS
                                     < L'IMAGE SCRATCH...
                                     < SI LE BIT DE RANG 'X'+NIVMAX+1 EST A 1,
                                     < ON IGNORE LES NIVEAUX CALCULES QUI VALENT
                                     < (X) ; ON PEUT AINSI PAR EXEMPLE EVITER
                                     < DE MARQUER DU NOIR PAR '0080...
<
< POUR ACCEDER AUX IMAGES :
<
SAVER:   WORD        0               < SAUVEGARDE D'UN MOT DE LA TRAME
                                     < RESIDENTE ROUGE,
SAVEV:   WORD        0               < DE MEME POUR LE VERT,
SAVEB:   WORD        0               < DE MEME POUR LE BLEU.
MCDAR:   EQU         SAVER           < SAUVEGARDE D'UN MOT DE LA TRAME
                                     < SCRATCH ROUGE,
MCDAV:   EQU         SAVEV           < DE MEME POUR LE VERT,
MCDAB:   EQU         SAVEB           < DE MEME POUR LE BLEU.
XCTCDA:  WORD        0
CTCDA:   WORD        TV2-TV1         < POUR ATTEINDRE 'TV2'...
MODX:    WORD        1               < 0 : "TORE" SUR LES X,
                                     < 1 : L'IMAGE SCRATCH NE SE REFERME PAS...
MODY:    WORD        1               < DE MEME SUR L'AXE DES Y.
WORK1:   WORD        0               < VARIABLE DE TRAVAIL...
FWORK:   FLOAT       0               < VARIABLE DE TRAVAIL...
MCDAM:   WORD        0               < MOT COURANT DE LA 'CDA'.
AIMAGR:  WORD        IMAGR,X         < RELAI TRAME ROUGE,
AIMAGV:  WORD        IMAGV,X         < RELAI TRAME VERTE,
AIMAGB:  WORD        IMAGB,X         < RELAI TRAME BLEUE.
<
< RELAIS :
<
ASPAPR:  WORD        SPAPR           < ACCES A UN POINT RESIDENT (X,Y).
ASPAPS:  WORD        SPAPS           < ACCES A UN POINT SCRATCH (X,Y).
ASPSPR:  WORD        SPSPR           < RANGEMENT D'UN POINT RESIDENT (X,Y).
ASPSPS:  WORD        SPSPS           < RANGEMENT D'UN POINT SCRATCH (X,Y).
ASPGPR:  EQU         ASPAPR
ASPGPS:  EQU         ASPAPS
ASPRPR:  EQU         ASPSPR
ASPRPS:  EQU         ASPSPS
ARAC:    WORD        RAC             < EXTRACTION D'UNE RACINE CARREE...
<
< SOUS-PROGRAMMES SPECIFIQUES :
<
AROND:   WORD        ROND            < ARRONDI FLOTTANT ET CONVERSION ENTIERE.
<
< DONNEES D'ARRONDI :
<
F05:     FLOAT       0.5
<
< DONNEES POUR LA FONCTION :
<
FK:      FLOAT       1
F0:      FLOAT       0
DELTAX:  FLOAT       0
DELTAY:  FLOAT       0
FIX:     FLOAT       0               < PAS D'INCREMENTATION DES X,
FIY:     FLOAT       0               < PAS D'INCREMENTATION DES Y.
FX:      FLOAT       0               < COORDONNEE X,
FY:      FLOAT       0               < COORDONNEE Y.
         IF          VERSIO-XXV1,XWOR%8,,XWOR%8
GELTAX:  FLOAT       0
GELTAY:  FLOAT       0
XWOR%8:  VAL         0
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
<
< DONNEES DE COMPTAGE ET D'EVALUATION
< DE LA DISTANCE DU CONTOUR COURANT
< C(N) AU CONTOUR INITIAL C(0) :
<
IC0:     WORD        0               < 0 : ON TRAVAILLE SUR C(0),
                                     < N : ON TRAVAILLE SUR C(N).
NPC0:    WORD        0               < NOMBRE DE POINTS DE C(0),
NPCNM1:  WORD        0               < NOMBRE DE POINTS DE C(N-1),
NPCN:    WORD        0               < NOMBRE DE POINTS DE C(N).
SAVEX:   WORD        0               < SAUVEGARDE DE X,
SAVEY:   WORD        0               < SAUVEGARDE DE Y.
FCOREC:  FLOAT       0               < FACTEUR CORRECTIF...
FWORK1:  FLOAT       0
FWORK2:  FLOAT       0
FWORK3:  FLOAT       0
F1:      FLOAT       1
X0Y0:    WORD        0               < NUMERO DU POINT INITIAL CALCULE SUR C(0).
SXY:     WORD        0               < POUR SAUVEGARDER LE NUMERO DU POINT
                                     < COURANT SUR C(0)...
MXY:     WORD        0               < POUR MEMORISER LE NUMERO DU POINT DE C(0)
                                     < DE PLUS FAIBLE LONGUEUR.
FKOREC:  FLOAT       0               < FACTEUR CORRECTIF...
DELTA:   WORD        0               < ABS(MXY-X0Y0).
IXY:     WORD        0               < PAS DE PASSAGE EN ALTERNANCE D'UN
                                     < POINT DE C(0) A UN AUTRE A PARTIR DU
                                     < POINT INITIAL 'X0Y0'.
MIXY::   VAL         64              < VALEUR MAX DE 'IXY'.
AMIXY:   WORD        MIXY
SAMIXY:  WORD        0               < SAUVEGARDE DE 'AMIXY' AU DEBUT DE
                                     < CHAQUE TOUR DE REMPLISSAGE...
LXY:     FLOAT       0               < LONGUEUR MINIMALE RENCONTREE.
IFECH:   WORD        0               < 0 : LE FACTEUR D'ECHELLE SERA 'FK',
                                     < 1 : LE FACTEUR D'ECHELLE SERA CALCULE
                                     <     PAR UN RAPPORT DE PLUS GRANDES
                                     <     LONGUEURS DANS LE CONTOUR C(0).
                                     < -1 : LE FACTEUR D'ECHELLE EST CALCULE
                                     <      POUR CHAQUE POINT DE C(N).
FECH:    FLOAT       0
RLXY0:   FLOAT       0               < MODULE(M(C(N)),M(C(0))),
RLXY0P:  FLOAT       0               < MODULE(M(C(N)),MP(C(0))),
RLXY0S:  FLOAT       0               < MIN(MODULE(M(C(N)),MP(C(0)))),
FMAX:    FLOAT       <NLIGM1?NPOLM1*15/10<0<0
XN0:     FLOAT       0               < X(M(C(N)),M(C(0))),
YN0:     FLOAT       0               < Y(M(C(N)),M(C(0))).
FEPS0:   FLOAT       -0.9995         < SEUIL INITIAL DES COSINUS,
FEPS:    FLOAT       0               < SEUIL COURANT DES COSINUS,
F005:    FLOAT       0.0005          < POUR CALCULER 'FEPS'...
MXYS:    WORD        0               < NUMERO DU POINT MP(C(0)).
LPILEM:: VAL         1               < LONGUEUR DE LA PILE DES POINTS CORRES-
                                     < PONDANT A DES LONGUEURS MINIS MAIS
                                     < IDENTIQUES.
PILEM0:  BYTE        LPILEM;0        < POUR INITIALISER 'PILEM'...
PILEM:   BYTE        LPILEM;0        < POINTEUR DE LA PILE :
         DZS         LPILEM          < PILE...
APILEM:  WORD        PILEM           < ADRESSE DE LA PILE...
AKFECH:  WORD        KFECH           < CALCUL DU FACTEUR D'ECHELLE SI IFECH=-1.
ASPNUM:  WORD        SPNUM           < NUMERO D'UN POINT SUR C(0).
LVOIS::  VAL         3               < AMPLITUDE DU VOISINNAGE QUE L'ON VA
                                     < EXPLORER AUTOUR DU POINT MINI DONT
                                     < LE NUMERO EST (A) ; ON FAIT AINSI POUR
                                     < MINIMISER LES EFFETS DE LA NUMERISATION
                                     < DU CONTOUR, EN L'APPROXIMANT PAR UNE
                                     < DROITE TANGENTE...
NVOIS::  VAL         LVOIS*2+1       < NOMBRE DE POINTS VOISINS...
ANVOIS:  FLOAT       <NVOIS<0<0
AGZBL:   WORD        GZBL            < LOAD UN MOT DU Z-BUFFER, ET DECONCATENA-
                                     < TION DES COORDONNEES X ET Y.
ASPL:    WORD        SPL             < SOUS-PROGRAMME DE CALCUL DU CARRE DE
                                     < LA LONGUEUR DE C(N) A C(0).
ASPLM:   WORD        SPLM            < CALCUL DE LA LONGUEUR MINIMALE NON NULLE.
XWOR%8:  VAL         0
         PAGE
<
<
<        T A B L E   D E S   C O M M A N D E S  :
<
<
REP0:    VAL         "+"             < PREMIERE COMMANDE.
KOM:     EQU         $-REP0          < ELLES COMMENCENT A "+"...
         WORD        STORE           < + : STORE SGN LE RESIDENT
AERROR:  WORD        ERROR           < ,
         WORD        DELETE          < - : DELETE SGN LE RESIDENT
         WORD        ERROR           <.
         WORD        ERROR           < /
         WORD        MOV0            < 0 : TV <-- RESIDENT R+V+B
         WORD        MOV1            < 1 : TV <-- RESIDENT R
         WORD        MOV2            < 2 : TV <-- RESIDENT V
         WORD        MOV3            < 3 : TV <-- RESIDENT B
         WORD        MOV4            < 4 : RESIDENT <-- TV R+V+B
         WORD        MOV5            < 5 : RESIDENT <-- TV R
         WORD        MOV6            < 6 : RESIDENT <-- TV V
         WORD        MOV7            < 7 : RESIDENT <-- TV B
         WORD        STV2            < 8 : TV2 <-- RESIDENT
         WORD        GTV2            < 9 : RESIDENT <-- TV2
         WORD        ERROR           < :
         WORD        ERROR           < ;
         WORD        ERROR           < <
         WORD        CENTRE          < = : DEFINITION DE (CX,CY) ET (IX,IY)
         WORD        ERROR           < >
         WORD        ERROR           < ?
         WORD        ERROR           < @
         WORD        ERROR           < A
         WORD        ERROR           < B
         WORD        CADRE           < C : GENERATION DES MATRICES D'IMAGE
         WORD        DISP            < D : RESIDENT <-- IMAGE SGN
         WORD        ERROR           < E
         WORD        GOGE            < F : FIN
         WORD        ERROR           < G
         WORD        ERROR           < H
         WORD        ERROR           < I
         WORD        ERROR           < J
         WORD        INFK            < K : ENTREE CTTE TRANSFORMATION
         WORD        IMLOAD          < L : RESIDENT <-- (SCRATCH) SANS MASQUE
         WORD        MASK            < M : GET/STORE LE MASQUE
         WORD        NAME            < N : NOMME L'IMAGE RESIDENTE
         WORD        ERROR           < O
         WORD        ERROR           < P
         WORD        ERROR           < Q
         WORD        ERROR           < R
         WORD        IMSAV           < S : SCRATCH <-- (RESIDENT)
         WORD        CONTO           < T : TRANSFORMATION SUIVANT UN CONTOUR
         WORD        IMUP            < U : RESIDENT <-- (SCRATCH) AVEC MASQUE
         WORD        ERROR           < V
         WORD        GOCCI           < W : RETOUR TEMPORAIRE AU CCI
         WORD        GORGX           < X : POSITIONNEMENT DE 'ORGX'
         WORD        GORGY           < Y : POSITIONNEMENT DE 'ORGY'
         WORD        ERROR           < Z
REPZ:    VAL         $-KOM-1         < DERNIERE COMMANDE.
         PAGE
         PROG
         PAGE
<
<
<        E N T R E E   D E   Q U E L Q U E   C H O S E  :
<
<
<        ARGUMENT :
<                    A=ADRESSE DE LA DEMANDE.
<
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
ENTER:   EQU         $
         PSR         X
         SVC         0               < ENVOI DE LA DEMANDE...
         PLR         X
         RSR
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
ENTER:   EQU         $
         PSR         A,X,Y,W
         LR          A,W             < W=ADRESSE DE LA DEMANDE :
         LRM         A
         WORD        '0101
         CP          0,W             < EST-CE BIEN UNE ENTREE AVEC ECHO
                                     < SUR LA VISU UTILISATEUR ???
         JE          ENTER1          < OUI...
         QUIT        1               < NON, ???!???!
ENTER1:  EQU         $
         LA          1,W             < A=ADRESSE OCTET DU BUFFER,
         LYI         0               < Y=INDEX DU BUFFER,
         SLRS        NOCMO=0         < CONVERSION EN UNE ADRESSE MOT,
         ADCR        Y               < Y=INDEX INITIAL DU BUFFER COURANT.
         SBT         0               < MISE EN PLACE DU BIT INDEX,
         STA         ABUFC           < ET GENERATION DU RELAI VERS LE BUFFER.
         LX          2,W             < X=NOMBRE D'OCTETS MAX A DEPLACER...
ENTER2:  EQU         $
         PSR         X
         LA          IEG             < A=INDEX COURANT DE L'ITEM1,
         CP          NCP             < ET VALIDATION ???
         JL          ENTER3          < OK...
         BR          AALTM           < NON, ON FAIT COMME SI UN ALT-MODE
                                     < ETAIT ARRIVE...
ENTER3:  EQU         $
         IC          IEG             < PROGRESSION DE L'INDEX DE L'ITEM1.
         LR          A,X             < X=INDEX D'ACCES A L'ITEM1,
         LBY         &AI1            < A=CARACTERE COURANT DE L'ITEM1,
         CPI         " "             < EST-CE L'ELEMENT NEUTRE ???
         JNE         ENTER6          < NON...
         PLR         X               < OUI,
         LR          X,A
         CP          2,W             < EST-ON EN TETE DU MESSAGE ???
         JE          ENTER2          < OUI, ON IGNORE LE 'SPACE'...
         PSR         X               < NON, ON LE CONSERVE...
         LAI         " "             < RESTAURATION DE 'A'...
ENTER6:  EQU         $
         CPI         ";"             < EST-CE LA FIN DE MESSAGE ???
         JNE         ENTER4          < NON,
         LAI         '04             < OUI, ON LE REMPLACE PAR 'EOT'...
ENTER4:  EQU         $
         LR          Y,X
         STBY        &ABUFC          < ET RANGEMENT DANS LE BUFFER...
         ADRI        1,Y             < PROGRESSION DE L'INDEX BUFFER.
         PLR         X
         CPI         '04             < EST-CE UNE FIN DE MESSAGE ???
         JE          ENTER5          < OUI, ON ARRETE LA...
         JDX         ENTER2          < NON, ON CONTINUE...
ENTER5:  EQU         $
         PLR         A,X,Y,W
         RSR
XWOR%7:  VAL         0
         PAGE
<
<
<        E N V O I   D ' U N E   C A R T E   A U   C C I  :
<
<
<        ARGUMENT :
<                    A=ADRESSE MOT DE LA CARTE.
<
<
CCI:     EQU         $
         ADR         A,A             < CONVERSION EN UNE ADRESSE OCTET.
         STA         DEMCC+1
         LAD         DEMCC
         SVC         0               < ET ENVOI DE LA CARTE...
         RSR
         PAGE
<
<
<        R E T O U R   A   ' G E '  :
<
<
GOGE:    EQU         $
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         LAI         BRANCH-ZERO
         LR          A,W             < W=ADRESSE DE LA BRANCHE...
         LA          NSD
         STA         0,W             < GENERATION DU NOM DE L'OVERALY,
         ACTD        4               < A='IDESC',
         ORI         "0"             < CONVERTI EN ASCI,
         STBY        2,W             < QUI FAIT PARTIE DU NOM...
         LAI         SGNLON
         STBY        DEMLOD          < MISE EN MODE 'LOAD SOUS ACN'...
         STZ         CDRET,W         < RETOUR OK...
GOGE2:   EQU         $
         LRM         A,B,X
         WORD        SITEM1          < A=ZONE DE SAUVEGARDE,
         WORD        NOM             < B=ZONE A RESTAURER,
         WORD        LNOM/NOCMO      < X=NOMBRE DE MOTS A RESTAURER.
         MOVE                        < RESTAURATION DU BOUT DE L'ITEM1...
         LX          NMOTS
GOGE3:   EQU         $
         STZ         &AITEM2         < RAZ DE L'ITEM2...
         JDX         GOGE3
XWOR%7:  VAL         0
         LA          SAVEK
         LR          A,K             < RESTAURATION DE 'K'...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAD         RELMEM
         SVC         0               < RETOUR A 4K MOTS...
         LX          NMOTS           < X=NOMBRE DE MOTS A RAZER...
TW2:     EQU         $
         STZ         &AITEM2         < RAZE DES ITEMS 1 ET 2.
         JDX         TW2
         LAI         BRANCH-ZERO
         LR          A,W             < RESTAURATION DE 'W'.
         STZ         MODCAL,W        < REINITIALISATION DU MODE D'APPEL...
         LA          NGE
         STA         0,W             < MISE EN PLACE DU NOM DE "GE"...
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         LA          IEG
         STA         MODCAL,W        < RENVOI DE L'INDEX COURANT DE ITEM1,
XWOR%7:  VAL         0
<
<        NOTA IMPORTANT :
<                      ON NE REVIENT PLUS A
<                    "!CDA" A CAUSE DE 'PSIMUL'
<                    AFIN QU'IL CONSERVE LA
<                    'CDAG'...
<
GOGE1:   EQU         $
         LAD         DEMLOD
         BSR         AOVL            < ET TENTATIVE DE CHARGEMENT...
         QUIT        1               < EN CAS D'ERREUR,
         JMP         GOGE1           < ET ON RETENTE...
         IF          MODE-ITEM,XWOR%7,,XWOR%7
<
<
<        T R A I T E M E N T   D E S   A L T - M O D E S  :
<
<
ALTM:    EQU         $
         LAI         BRANCH-ZERO
         LR          A,W             < W=ADRESSE DE LA BRANCHE...
         LA          NPCALL
         JANE        ALTM1           < OK...
         LA          MODCAL,W        < MODCAL EST ENCORE A SA VALEUR INITIALE.
         LXI         0               < "GE" A PRIORI...
         TBT         0               < "EI" OU "GE" ???
         ADCR        X
         LA          &NCALL          < A=OVERLAY A APPELER...
ALTM1:   EQU         $
         STA         0,W             < DANS LE CAS D'UN ALT-MODE, ON REVIENT
                                     < DIRECTEMENT A "GE" OU A "EI"...
         LAI         " "             < ON RESTAURE, AU CAS OU LE ALT-MODE
         STBY        2,W             < APPARAITRAIT DANS 'GOGE'...
         LAI         SGNLNS          < IDEM...
         STBY        DEMLOD
         LAI         2
         STA         CDRET,W         < TRANSMISSION DU ALT-MODE...
         JMP         GOGE2
XWOR%7:  VAL         0
         PAGE
<
<
<        E N T R Y  :
<
<
TW:      EQU         $
         LRM         C,L
         WORD        COMON+128       < C=BASE DU COMMON...
         WORD        LOC+128         < L=BASE DU LOCAL...
         LAD         DEMOVL
         SVC         0               < CHARGEMENT DE LA BRANCHE D'OVERLAY...
         STZ         XCTCDA          < AU CAS OU UN MALHEUREUX ALT-MODE...
         IC          KIN             < COMPTAGE DES ENTREES :
         IF          MODE-VISU,XWOR%7,,XWOR%7
         JG          TW1             < CAS DES ALT-MODES...
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         JG          ALTM            < ABORT IMMEDIAT SUR ALT-MODE...
         LA          CDRET,W         < A=RELAI D'ACCES A ITEM1/ITEM2...
         CP          AI1             < SEUL ITEM1 EST AUTORISE...
         JNE         ALTM            < L'ITEM2 PROVOQUE UN ABORT...
         LA          MODCAL,W        < A=INDEX INITIAL DE L'ITEM1...
         LXI         0               < "GE" A PRIORI...
         TBT         0               < "GE" (0) OU "EI" (1) ???
         ADCR        X
         RBT         0
         STA         IEG
         LA          &NCALL
         STA         NPCALL          < NOM DU PROCESSEUR A APPELER SUR LA
                                     < RECEPTION D'UN ALT-MODE.
         LRM         A,B,X
         WORD        NOM             < A=ZONE A SAUVEGARDER,
         WORD        SITEM1          < B=ZONE DE SAUVEGARDE,
         WORD        LNOM/NOCMO      < X=NOMBRE DE MOTS.
         MOVE                        < SAUVEGARDE...
XWOR%7:  VAL         0
         LR          K,A             < CAS DE LA PREMIERE,
         STA         SAVEK           < SAUVEGARDE DE K...
TW1:     EQU         $
         LRM         K
         WORD        STACK-1         < INITIALISATION DE K...
TW20:    EQU         $
         LAI         AMCDAI-ZERO
         BSR         ACCI            < ENVOI DE !CDAI...
         JNE         GOGE            < ET BIEN CELA NE MARCHE PAS...
         STZ         IMASKO          < MISE DU MASQUE OFF A PRIORI...
         LAD         DEMMEM
         SVC         0               < PASSAGE A 16 K...
         LAI         '18
         WORD        '1E15
         LR          B,X             < X=ORIGINE DE LA 'CDAI'.
         LAI         '19
         WORD        '1E15
         SBR         X,B
XWOR%1:  VAL         -4              < B=LONGUEUR UTILE DE LA 'CDAP'/'CDAI',
         LRM         A
         WORD        IZBUF-TV1>XWOR%1 < A=LONGUEUR NECESSAIRE (IMAGE+MASQUE),
         CPR         A,B             < CELA SUFFIT-IL ???
         JL          GOGE            < B<A : INSUFFISANT POUR TRAVAILLER...
TW13:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMASKO-ZERO
XWOR%7:  VAL         0
         BSR         APIN
         STZ         IMASKO          < OFF A PRIORI...
         CPI         "N"
         JE          TW14            < OK, IMASKO=0 ==> OFF...
         IC          IMASKO          < A PRIORI, IMASKO=1 ==> ON...
         CPI         "O"
         JNE         TW13            < ?!??!??!
TW14:    EQU         $
         LRM         W
         WORD        IMAG            < W=BASE DE L'IMAGE ROUGE...
         PAGE
<
<
<        B O U C L E   D ' I N T E R R O G A T I O N  :
<
<
LOOP:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMINT-ZERO
XWOR%7:  VAL         0
         BSR         APIN            < ENTREE DE LA COMMANDE...
         CPI         REP0            < ET VALIDATION...
         JL          TW12            < ERREUR...
         CPI         REPZ            < VALIDATION, SUITE...
         JG          TW12            < ERREUR...
         LR          A,X             < X=COMMANDE DEMANDEE,
         BR          &ACOM           < BRANCHEMENT AU MODULE SPECIFIQUE...
TW12:    EQU         $
<
<
<        T R A I T E M E N T   D E S   E R R E U R S  :
<
<
ERROR:   EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMERR-ZERO
         BSR         APRINT          < ENVOI D'UN MESSAGE D'ERREUR...
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         LAD         DEMOUT
         SVC         0               < EDITION DU MESSAGE D'ERREUR...
XWOR%7:  VAL         0
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        R E C U P E R A T I O N   /   G E N E R A T I O N
<        D U   M A S Q U E   D ' I M A G E  :
<
<
<        FONCTION :
<                      CE MODULE PERMET DE GENERER (COMMANDE
<                    ">") OU DE RECUPERER (COMMANDE
<                    "<") LE MASQUE COURANT D'IMAGE
<                    DE, OU A PARTIR DE L'UNE DES 3 COMPOSANTES
<                    'R', 'V' ET 'B' DE L'IMAGE SCRATCH.
<
<
MASK:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMMC-ZERO
         BSR         APRINT          < MESSAGE "STACK?"...
XWOR%7:  VAL         0
         LAD         DEMIN
         BSR         AENTER
         LBY         &AREP           < A=REPONSE "R"/"V"/"B"...
         LBI         TVPR-1          < B=NUMERO DU STACK DEMANDE...
         CPI         "R"
         JE          MASK1           < "R"...
         LBI         TVPV-1
         CPI         "V"
         JE          MASK1           < "V"...
         LBI         TVPB-1
         CPI         "B"
         JE          MASK1           < "B"...
MASK2:   EQU         $
         BR          AERROR          < TRAITEMENT DES ERREURS...
MASK1:   EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMMS-ZERO
         BSR         APRINT          < MESSAGE "SENS?"...
XWOR%7:  VAL         0
         LAD         DEMIN
         BSR         AENTER
         SLLD        LIMAG=0         < B=ADRESSE DANS LA 'CDA' DU STACK DEMANDE.
         LRM         X,Y
         WORD        LIMAG           < X=NOMBRE DE MOTS A DEPLACER,
         WORD        AMASK           < Y=ADRESSE DU MASQUE DANS LA 'CDA'.
         LBY         &AREP           < A=REPONSE DE "SENS?"...
         CPI         ">"
         JE          MASK3           < ">" : GENERATION...
         CPI         "<"
         JNE         MASK2           < ERREUR...
         XR          B,Y             < "<" : RECUPERATION, ON PERMUTE EMETTEUR
                                     < ET RECPTEUR...
MASK3:   EQU         $
         STB         AEMETT          < EMETTEUR EN CDA,
         STY         ARECEP          < RECEPTEUR EN CDA.
         LRM         B
         WORD        MCDAM           < B=ADRESSE DU MOT DE TRANSIT...
MASK4:   EQU         $
         PSR         X
         LA          AEMETT
         LXI         1
         RCDA
         LA          ARECEP
         LXI         1
         WCDA
         PLR         X
         IC          AEMETT          < PROGRESSION DE L'EMETTEUR,
         IC          ARECEP          < AINSI QUE DU RECEPTEUR...
         JDX         MASK4           < AU MOT SUIVANT DU MASQUE...
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        M O D U L E S   D ' A C C E S   A U   S G N  :
<
<
<        FONCTION :
<                      PERMETTENT L'ACCES AU SGN
<                    POUR LES IMAGES SUIVANT :
<                    N : NOMME L'IMAGE RESIDENTE,
<                        JUSQU'A UNE COMMANDE 'N'
<                        SUIVANTE,
<                    D : AFFICHE L'IMAGE PRECEDEMMENT
<                        NOMMEE PAR 'N'.
<                    + : CREE L'IMAGE PRECEDEMMENT
<                        NOMMEE PAR 'N',
<                    - : DETRUIT L'IMAGE PRECEDEMMENT
<                        NOMMEE PAR 'N'.
<
<
NAME:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMNOM-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         LAD         NOMIN
         BSR         AENTER          < ENTREE DU NOM COURANT,
         LAI         EOT
         STBY        &AEOT           < ET ON FORCE A PRIORI UN 'EOT'...
         BR          ALOOP           < ET C'EST TOUT...
<
< SOUS-PROGRAMME GENERAL D'ACCES AU SGN :
< (LORS DES 'LNS' ET 'LON', IL REGARDE
< SI LA LONGUEUR DE L'IMAGE VAUT EXACTE-
< MENT LIMAG*NCOOL*NOCMO ; SI NON, ELLE
< REITERE L'OPERATION AVEC UN DELTA
< NOM-VALEUR DE -1 CORRESPONDANT A UNE
< ANCIENNE VERSION DU PROGRAMME)
<
GOSGN:   EQU         $               < RESPONSABLE DE TOUS LES ACCES SGN...
         STBY        SGN             < MISE EN PLACE DU 'NVP' ARGUMENT,
         LAI         LNOM*NOCMO
         STA         SGN+3           < A PRIORI...
         LAD         SGN
         SVC         0               < ET ENVOI DE LA DEMANDE...
         LBY         SGN
         CPI         SGNDLN
         JE          GOSGN1          < CAS D'UN DELETE...
         CPI         SGNSTN
         JE          GOSGN1          < CAS D'UN STORE...
         ACTD        3               < CAS D'UN LOAD : B=LONGUEUR DE L'IMAGE,
         LRM         A
         WORD        LIMAG*NCOOL*NOCMO
         CPR         A,B             < S'AGIT-IL D'UNE ANCIENNE OU D'UNE
                                     < NOUVELLE IMAGE ???
         JE          GOSGN1          < NOUVELLE : DELTA=LNOM*NOCMO...
         LAI         -1              < ANCIENNE :
         STA         SGN+3           < IL FAUT LA RECUPERER AVEC DELTA=-1...
         LAD         SGN
         SVC         0               < ON REITERE LE LOAD...
GOSGN1:  EQU         $
         CPZR        X               < TEST DES CONDITIONS DE RETOUR...
         RSR
<
< MODULES SPECIFIQUES :
<
DISP:    EQU         $               < COMMANDE 'D' :
         LAI         SGNLON          < ON COMMENCE PAR L'ACN DU DEMANDEUR,
         BSR         AGOSGN
         JE          DISP1           < OK, IL EXISTE...
         LAI         SGNLNS          < NON, ON TENTE SOUS :SYS...
         BSR         AGOSGN
         JE          DISP1           < OK...
DISP2:   EQU         $
         BR          AERROR          < TRAITEMENT DES ERREURS...
DISP1:   EQU         $
         BR          ALOOP           < VERS LA BOUCLE SI OK...
DELETE:  EQU         $               < COMMANDE '-' :
         LAI         SGNDLN
DELET1:  EQU         $
         BSR         AGOSGN
         JE          DISP1           < OK...
         JMP         DISP2           < ERREUR...
STORE:   EQU         $               < COMMANDE '+' :
         LAI         SGNSTN
         JMP         DELET1
         PAGE
<
<
<        A C C E S   A U   Z - B U F F E R  :
<
<
<        UTILISATION DES REGISTRES :
<                    A=ADRESSE D'UN MOT DANS LE Z-BUFFER (YS/XS),
<                    B=INFORMATION (INT(FZS)) A Y METTRE, OU RESULTAT...
<                    Y=YLOAD/YSTORE SUIVANT LE SENS...
<
<
GZB:     EQU         $
         STB         MCDAR           < AU CAS OU CE SERAIT 'YSTORE'...
         PSR         A,X
         LBI         0
XWOR%1:  VAL         LIZBUF=0
         SCLD        NBITMO-XWOR%1   < B=NUMERO DE BLOC,
         SLRS        NBITMO-XWOR%1   < A=ADRESSE DANS LE BLOC.
         XR          A,B             < A=NUMERO DE BLOC, B=ADRESSE DANS LE BLOC.
         CP          SDKU            < LE BLOC DEMANDE EST-IL LE BLOC COURANT ?
         JE          GZB2            < OUI...
<
< REECRITURE DU BLOC COURANT LORSQU'IL A ETE MODIFIE :
<
         PSR         A               < SAVE LE BLOC DEMANDE,
         BSR         ASPDKU          < ECRITURE DU BLOC COURANT S'IL EXISTE
                                     < ET S'IL A ETE MODIFIE...
         PLR         A               < RESTAURE LE BLOC DEMANDE...
<
< LECTURE DU BLOC DEMANDE :
<
GZB3:    EQU         $
         STA         SDKU            < NOUVEAU BLOC COURANT,
         STZ         MDKU            < PAS ENCORE MODIFIE...
XWOR%1:  VAL         NSDKU=0
         SLLS        XWOR%1          < CONVERSION EN UNE ADRESSE DKU...
         STA         RDKU+3
         LAD         RDKU
         SVC         0               < LECTURE DU BLOC DEMANDE...
<
< ACCES AU MOT DEMANDE :
<
GZB2:    EQU         $
         LRM         A
         WORD        IZBUF
         ADR         A,B             < B=ADRESSE DU MOT DEMANDE DANS LA 'CDAI'.
         LAD         MCDAR
         XR          A,B             < A=ADRESSE DU MOT DANS LA 'CDAI',
                                     < B=ADRESSE DU MOT OU RANGER/PRENDRE
                                     <   L'INFORMATION.
         LXI         1               < X=1 MOT A TRANSFERER...
YLOAD::  VAL         0               < MODE LOAD,
YSTORE:: VAL         1               < MODE STORE.
         CPZR        Y               < QUEL EST LE SENS DE L'OPERATION ???
         JE          GZB4            < LOAD...
         IC          MDKU            < STORE : DANS CE CAS, ON COMPTABILISE
                                     < LA MISE A JOUR...
         WCDA
         JMP         GZB5
GZB4:    EQU         $
         RCDA
GZB5:    EQU         $
         LB          MCDAR           < QUELQUE SOIT LE MODE 'B' EST BON...
         PLR         A,X
         RSR
<
<
<        E C R I T U R E   B L O C   C O U R A N T  :
<
<
SPDKU:   EQU         $
         LA          SDKU            < A=BLOC COURANT...
         JAL         GZB6            < IL N'EXISTE PAS, ON EST DONC A
                                     < L'INITIALISATION, ON NE PEUT
                                     < QUE LIRE LE Z-BUFFER SUR 'DKU'...
         CPZ         MDKU            < IL EXISTE, ALORS A-T'IL ETE MODIFIE ???
         JE          GZB6            < NON, INUTILE D'ECRIRE...
XWOR%1:  VAL         NSDKU=0
         IF          BIT>XWOR%1-NSDKU,,XWOR%,
         IF          ATTENTION : NSDKU DOIT ETRE UNE PUISSANCE DE 2 !!!
XWOR%:   VAL         0
         SLLS        XWOR%1          < CONVERSION EN UNE ADRESSE SUR DKU...
         STA         WDKU+3
         LAD         WDKU
         SVC         0               < REECRITURE DU BLOC COURANT...
         JE          GZB6            < OK...
         QUIT        1               < DKU ?!??!??!!!
GZB6:    EQU         $
         RSR
         PAGE
<
<
<        A C C E S   A   U N   P O I N T   R E S I D E N T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RECONSTITUE
<                    LE NIVEAU ASSOCIE A 3 BITS
<                    PARALLELES.
<
<
<        ARGUMENT :
<                    XR,YR = COORDONNEES DU POINT,
<
<
<        RESULTAT :
<                    A = NIVEAU DE GRIS DU POINT, SOIT R+V*2+B*4.
<
<
SPAPR:   EQU         $
         PSR         B,X,Y
         LX          XR              < X=ABSCISSE,
         LY          YR              < Y=ORDONNEE.
         LR          X,A             < A=COORDONNEE X,
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1   < B=NUMERO DE MOT DANS LA LIGNE,
         SLRS        NBITMO-XWOR%1   < A=NUMERO DE BIT DANS LE MOT,
         LXI         NBITMO-BIT
         SBR         A,X             < X=DECALAGE D'ACCES AU BIT COURANT.
         XR          Y,B             < Y=NUMERO DU MOT DANS LA LIGNE,
         SLLD        NMOTL=0
         IF          NBITMO-NMOTL,,XWOR%,
         IF          ATTENTION : LA CONCATENATION QUI SUIT EST COMPLETEMENT
         IF          STUPIDE !!!
XWOR%:   VAL         0
         ORR         B,Y             < Y=NUMERO DU MOT DANS LA TRAME.
         XR          Y,X
         LA          &AIMAGB         < ACCES A LA TRAME BLEU,
         PSR         A
         LA          &AIMAGV         < ACCES A LA TRAME BLEUE,
         PSR         A
         LA          &AIMAGR         < ACCES A LA TRAME ROUGE.
         XR          X,Y
         SLRS        0,X
         SLRD        BIT             < RECUPERATION D'UN BIT ROUGE,
         PLR         A
         SLRS        0,X
         SLRD        BIT             < RECUPERATION D'UN BIT VERT,
         PLR         A
         SLRS        0,X
         ANDI        BIT             < RECUPERATION D'UN BIT BLEU.
         SLLD        NCOOL-BIT       < A=NIVEAU DE GRIS DU POINT (X,Y).
         PLR         B,X,Y
         RSR
         PAGE
<
<
<        A C C E S   A   U N   P O I N T   S C R A T C H  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RECONSTITUE
<                    LE NIVEAU ASSOCIE A 3 BITS
<                    PARALLELES.
<
<
<        ARGUMENTS :
<                    XS,YS = COORDONNEES DU POINT SCRATCH,
<
<
<        RESULTAT :
<                    A=NIVEAU DE GRIS DU POINT SCRATCH.
<
<
SPAPS:   EQU         $
         PSR         B,X,Y
         LX          XS              < X=ABSCISSE,
         LY          YS              < Y=ORDONNEE.
         LR          X,A
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1   < B=NUMERO DU MOT DANS LA LIGNE,
         SLRS        NBITMO-XWOR%1
         LXI         NBITMO-BIT
         SBR         A,X             < X=DECALAGE D'ACCES AUX BITS,
         PSR         X
         XR          Y,B
         SLLD        NMOTL=0+NBITMO
         ORR         Y,A             < A=NUMERO DU MOT DANS LA TRAME.
         AD          XCTCDA          < POUR PERMETTRE UN ACCES A TV1/TV2...
         LRM         B,X,Y
         WORD        MCDAR
         WORD        1
         WORD        LIMAG           < Y=LONGUEUR EN MOTS D'UNE TRAME.
         RCDA
                                     < ACCES A UN MOT ROUGE,
         LRM         B,X
         WORD        MCDAV
         WORD        1
         ADR         Y,A
         RCDA
                                     < ACCES A UN MOT VERT,
         LRM         B,X
         WORD        MCDAB
         WORD        1
         ADR         Y,A
         RCDA
                                     < ACCES A UN MOT BLEU.
         PLR         X               < RESTAURATION DU DECALAGE,
         LA          MCDAR
         SLRS        0,X
         SLRD        BIT             < RECUPERATION D'UN BIT ROUGE,
         LA          MCDAV
         SLRS        0,X
         SLRD        BIT             < RECUPERATION D'UN BIT VERT,
         LA          MCDAB
         SLRS        0,X
         ANDI        BIT             < RECUPERATION D'UN BIT BLEU,
         SLLD        NCOOL-BIT       < A=NIVEAU DE GRIS DU POINT.
         PLR         B,X,Y
         RSR
         PAGE
<
<
<        R A N G E M E N T   D ' U N   P O I N T   R E S I D E N T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RANGE LE
<                    NIVEAU D'UN POINT SUR 3 BITS
<                    PARALLELES.
<
<
<        ARGUMENTS :
<                    XR,YR = COORDONNEES DU POINT,
<                    A = SON NIVEAU DE GRIS.
<
<
SPSPR:   EQU         $
         PSR         A,B,X,Y
         LX          XR              < X=ABSCISSE,
         LY          YR              < Y=ORDONNEE.
         PSR         A
         LR          X,A
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1
         SLRS        NBITMO-XWOR%1
         LR          A,X             < X=NUMERO DE BITS.
         XR          Y,B
         SLLD        NMOTL=0
         ORR         B,Y             < Y=NUMERO DU MOT DANS LA TRAME.
         PLR         A               < A=NIVEAU DE GRIS DU POINT.
         SLRD        NCOOL           < ET MISE DANS B...
         XR          X,Y
         LA          &AIMAGR         < ACCES A UN MOT ROUGE,
         STA         SAVER
         LA          &AIMAGV         < ACCES A UN MOT VERT,
         STA         SAVEV
         LA          &AIMAGB         < ACCES A UN MOT BLEU.
         XR          X,Y
         SCLS        0,X
         SLLD        BIT             < RECUPERATION DU BIT BLEU,
         SCRS        BIT,X
         STA         SAVEB
         LA          SAVEV
         SCLS        0,X
         SLLD        BIT             < RECUPERATION DU BIT VERT,
         SCRS        BIT,X
         STA         SAVEV
         LA          SAVER
         SCLS        0,X
         SLLD        BIT             < RECUPERATION DU BIT ROUGE,
         SCRS        BIT,X
         XR          X,Y
         STA         &AIMAGR         < RANGEMENT DU MOT ROUGE,
         LA          SAVEV
         STA         &AIMAGV         < RANGEMENT DU MOT VERT,
         LA          SAVEB
         STA         &AIMAGB         < RANGEMENT DU MOT BLEU.
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        R A N G E M E N T   D ' U N   P O I N T   S C R A T C H  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RANGE LE
<                    NIVEAU D'UN POINT SUR 3 BITS
<                    PARALLELES EN SCRATCH.
<
<
<        AGUMENTS :
<                    XS,YS = COORDONNEES DU POINT,
<                    A = SON NIVEAU DE GRIS.
<
<
SPSPS:   EQU         $
         PSR         A,B,X,Y
         PSR         A               < SAUVEGARDE DU NIVEAU,
         LX          XS              < DU POINT
         LY          YS              < SCRATCH (XS,YS).
         LR          X,A
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1
         SLRS        NBITMO-XWOR%1
         LXI         NBITMO-BIT
         SBR         A,X             < X=AMPLITUDE DU DECALAGE...
         PSR         X
         XR          Y,B
         SLLD        NMOTL=0+NBITMO
         ORR         Y,A             < A=ADRESSE DU MOT ROUGE CONTENANT
                                     < (XS,YS) DANS LA 'CDA'...
         AD          XCTCDA          < POUR ATTEINDRE TV1/TV2...
         LRM         B,X,Y
         WORD        MCDAR
         WORD        1
         WORD        LIMAG           < Y=POUR PASSER D'UNE COULEUR A L'AUTRE.
         RCDA
                                     < ACCES AU MOT ROUGE,
         LRM         B,X
         WORD        MCDAV
         WORD        1
         ADR         Y,A
         RCDA
                                     < ACCES AU MOT VERT,
         LRM         B,X
         WORD        MCDAB
         WORD        1
         ADR         Y,A
         RCDA
                                     < ACCES AU MOT BLEU.
         PLR         X               < X=AMPLITUDE DU DECALAGE,
         STA         WORK1           < SAUVEGARDE DE LA DERNIERE ADRESSE...
         PLR         A               < A=NIVEAU DE GRIS DE (XS,YS).
         SLRD        NCOOL           < ET CADRAGE DANS 'B'...
         LA          MCDAB           < MSE A JOUR DU BLEU,
         SCRS        0,X
         SLRS        BIT
         SLLD        BIT
         SCLS        0,X
         STA         MCDAB
         LA          MCDAV           < MISE A JOUR DU VERT,
         SCRS        0,X
         SLRS        BIT
         SLLD        BIT
         SCLS        0,X
         STA         MCDAV
         LA          MCDAR           < MISE A JOUR DU ROUGE.
         SCRS        0,X
         SLRS        BIT
         SLLD        BIT
         SCLS        0,X
         STA         MCDAR
         LA          WORK1           < A=ADRESSE EN 'CDA' DU BLEU...
         LRM         B,X
         WORD        MCDAB
         WORD        1
         WCDA
                                     < MISE A JOUR DU BLEU,
         LRM         B,X
         WORD        MCDAV
         WORD        1
         SBR         Y,A
         WCDA
                                     < MISE A JOUR DU VERT,
         LRM         B,X
         WORD        MCDAR
         WORD        1
         SBR         Y,A
         WCDA
                                     < MISE A JOUR DU ROUGE.
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        C A L C U L   D Y N A M I Q U E   D U   F A C T E U R
<                    D ' E C H E L L E  :
<
<
<        FONCTION :
<                      LORSQUE IFECH=-1, POUR CHAQUE
<                    POINT M(C(N)) DU CONTOUR C(N), ON
<                    CONNAIT DEJA LE VECTEUR (M(C(N)),M(C(0))),
<                    QUI REPRESENTE LA PLUS COURTE DISTANCE
<                    DU POINT M(C(N)) AU CONTOUR C(0) ; ALORS
<                    ON RECHERCHE LE POINT MP(C(0)), TEL QUE
<                    LE VECTEUR (M(C(N)),MP(C(0))) SOIT OPPOSE
<                    AU VECTEUR PRECEDENT, ET DE LONGUEUR
<                    MINIMALE ; LE RAPPORT DES LONGUEURS DE
<                    CES 2 VECTEURS PERMET DE FIXER DYNAMIQUE-
<                    MENT LE CADRE...
<
<
KFECH:   EQU         $
         CPZ         IFECH           < ALORS ???
         JGE         KFECH1          < RIEN DE COMPLIQUE...
<
< CALCUL DE L'ECHELLE DYNAMIQUE POUR CHAQUE POINT DE C(N) :
<
         FST         RLXY0           < LONGUEUR MINIMALE RECONTREE.
         STZ         XN0             < INITIALISATION DE LA SOMME VECTORIELLE
         STZ         YN0             < DES LONGUEURS MINIMALES...
SETV57:  EQU         $
         LY          APILEM
         PULL                        < RECUPERATION D'UN POINT MINI...
         JV          SETV58          < C'EST FINI...
SETV60:  EQU         $
         ADRI        -LVOIS,A
         LXI         NVOIS           < X=NOMBRE DE POINTS DE L'INTERVALLE...
SETV61:  EQU         $
         PSR         A               < SAVE LE NUMERO DU POINT COURANT,
         BSR         ASPNUM          < QUE L'ON TRANSFORME EN UN BON NUMERO
                                     < SUR C(0)...
         BSR         AGZBL           < OK, (B,A)=COORDONNEES (X,Y),
         SB          SAVEY
         AD          YN0
         STA         YN0             < CUMUL DE Y(M(C(N)),M(C(0))),
         LR          B,A
         SB          SAVEX
         AD          XN0
         STA         XN0             < ET DE X(M(C(N)),M(C(0))).
         PLR         A
         ADRI        1,A             < NUMERO DU POINT SUIVANT...
         JDX         SETV61          < S'IL EXISTE...
         JMP         SETV57          < AU VECTEUR MINI SUIVANT...
SETV58:  EQU         $
         LA          XN0
         OR          YN0             < LA SOMME VECTORIELLE EST-ELLE NULLE ???
         JANE        SETV59          < NON, OK...
         IC          PILEM           < OUI, DONC SUREMENT 2 VECTEURS OPPOSES,
         JMP         SETV57          < ON VA REPRENDRE UNIQUEMENT LE PREMIER...
                                     < (LE 2EME CORRESPONDRA A LA DIRECTION
                                     < OPPOSEE...)
KFECH1:  EQU         $
         FMP         FECH
         JMP         KFECH2          < ON EST DANS LE CAS OU IFECH>-1...
SETV59:  EQU         $
         LA          XN0
         FLT
         FDV         ANVOIS
         FST         XN0             < CALCUL DE LA SOMME VECTORIELLE
                                     < NORMALISEE PAR RAPPORT A 'RLXY0'.
         FMP         XN0
         FST         FWORK
         LA          YN0
         FLT
         FDV         ANVOIS
         FST         YN0             < MOYENNE VECTORIELLE...
         FMP         YN0
         FAD         FWORK
         BSR         ARAC
         FST         FWORK3          < ET SON MODULE...
         FLD         XN0
         FDV         FWORK3
         FMP         RLXY0
         FST         XN0
         FLD         YN0
         FDV         FWORK3
         FMP         RLXY0
         FST         YN0
         FLD         FMAX
         FST         RLXY0S          < INITIALISATION DE 'RLXY0S' SUR SA PLUS
                                     < GRANDE VALEUR (C'EST-A-DIRE LA DIAGONALE
                                     < DE L'IMAGE).
         FLD         FEPS0
         FST         FEPS            < INITIALISATION DE 'FEPS'...
SETV53:  EQU         $
<
< BOUCLE DE PARCOUR DE C(0) :
<
         LAI         0               < A=NUMERO DU POINT COURANT DE C(0)...
SETV50:  EQU         $
         PSR         A               < SAUVEGARDE DU NUMERO DE POINT DE C(0).
         BSR         ASPL
         BSR         ARAC            < (A,B)=DISTANCE DU POINT (SAVEX,SAVEY)
                                     < AU POINT COURANT DE C(0) :
         FST         RLXY0P          < MODULE(M(C(N)),MP(C(0))).
         FMP         RLXY0           < *MODULE(M(C(N)),M(C(0))).
         FST         FWORK3          < CE QUI DONNE LE PRODUIT DES MODULES...
         FLD         XN0
         FMP         FWORK1
         FST         FWORK
         FLD         YN0
         FMP         FWORK2
         FAD         FWORK           < CE QUI DONNE LE PRODUIT SCALAIRE DU
                                     < PLUS PETIT VECTEUR DU POINT COURANT
                                     < DE C(N) A C(0) ET DU VECTEUR DU POINT
                                     < COURANT DE C(N) AU POINT COURANT DE C(0).
         FDV         FWORK3          < CE QUI DONNE LE COSINUS DES CES 2
                                     < VECTEURS...
         FCAM        FEPS            < OU EST-ON ???
         JGE         SETV51          < TANT QU'ON EST PAS ASSEZ EN FACE,
                                     < ON IGNORE...
         FLD         RLXY0P
         FCAM        RLXY0S          < CORRESPOND-IL A UNE LONGUEUR MINI ???
         JGE         SETV51          < NON...
         FST         RLXY0S          < OUI, ON LA MEMORISE...
         LA          SXY
         STA         MXYS            < AINSI QUE LE NUMERO DU POINT MP(C(0)).
SETV51:  EQU         $
         PLR         A
         ADRI        1,A             < PASSAGE AU POINT SUIVANT DE C(0),
         CP          NPC0
         JL          SETV50          < QUI EXISTE...
<
< NOTA : ON DISPOSE MAINTENANT DE LA PLUS
< PETITE LONGUEUR DU POINT COURANT DE C(N)
< A C(0), ET DE LA PLUS PETITE LONGUEUR
< DANS LA DIRECTION OPPOSEE :
<
         FLD         RLXY0S
         FCAM        FMAX            < A-T'ON TROUVE 'RLXY0S' ???
         JL          SETV52          < OUI, OK...
         FLD         FEPS            < NON, IL FAUT AUGMENTER LA FENETRE
         FAD         F005            < DE TEST DES COSINUS...
         FST         FEPS
         JMP         SETV53          < ET UN NOUVEAU TOUR...
SETV52:  EQU         $
         FAD         RLXY0
         FST         FWORK
         LRM         A,B
         FLOAT       <NMOTL*NBITMO?NLIG<0<0
         FMP         RLXY0
         FDV         FWORK           < 256*RLXY0/(RLXY0+RLXY0S)...
         FMP         FK
<
< CALCUL DU CADRE :
<
KFECH2:  EQU         $
         FIX
         RSR
         PAGE
<
<
<        A R R O N D I   F L O T T A N T  :
<
<
ROND:    EQU         $
         JAL         ROND1           < NOMBRE NEGATIF...
         FAD         F05             < NOMBRE POSITIF...
         JMP         ROND2
ROND1:   EQU         $
         FSB         F05
ROND2:   EQU         $
         FIX
         RSR
         PAGE
<
<
<        O P E R A T I O N   I N T E R - I M A G E S  :
<
<
<        FONCTION :
<                      CETTE VERSION PROVISOIRE REALISE
<                    L'OPERATION .OP. DE LA FACON
<                    SUIVANTE :
<                    RESIDENT <-- (RESIDENT).OP.(SCRATCH)
<                    CETTE OPERATION N'ETANT EFFECTUEE
<                    QUE POUR LES BITS A 1 DU MASQUE...
<
<
SPOP:    EQU         $
         PSR         A,B,X,Y
         LY          ORGY
         STY         YS              < ORDONNEE SCRATCH.
         LYI         0               < Y=ORDONNEE.
         STY         YR
SPOP1:   EQU         $
         LXI         0
         STX         XR              < X=ABSCISSE.
         LX          ORGX
         STX         XS
SPOP2:   EQU         $
         LX          XS
         LY          YS
         PSR         X,Y             < SAUVEGARDE DE 'XS' ET 'YS'...
         LA          XS
         CPZ         MODX            < EST-ON SUR UN X-TORE ???
         JE          SPOP3           < OUI...
         JAL         SPOP5           < NON, ET XS EST OVERSCREEN...
         CPI         NPOLM1
         JG          SPOP5           < DE MEME...
         JMP         SPOP4           < OK, XS EST DANS L'ECRAN...
SPOP3:   EQU         $               < CAS OU L'ON EST SUR UN X-TORE :
         ANDI        NPOLM1
         STA         XS              < CALCUL MODULO DE XS...
SPOP4:   EQU         $
         LA          YS
         CPZ         MODY            < EST-ON SUR UN Y-TORE ???
         JE          SPOP6           < OUI...
         JAL         SPOP5           < NON, ET YS EST OVERSCREEN...
         CPI         NLIGM1
         JG          SPOP5           < DE MEME...
         JMP         SPOP7
SPOP6:   EQU         $               < CAS OU L'ON EST SUR UN Y-TORE :
         ANDI        NLIGM1
         STA         YS              < CALCUL MODULO DE YS...
SPOP7:   EQU         $
         CPZ         IMASKO
         JE          SPOP8           < LE MASQUE EST OFF...
         PSR         X,Y
         LX          XR              < X=COORDONNEE RESIDENTE,
         LY          YR              < AINSI QUE Y...
         LR          X,A
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1   < B=NUMERO DU MOT SUR LA LIGNE,
         SLRS        NBITMO-XWOR%1   < A=NUMERO DU BIT DANS LE MOT,
         LR          A,X             < X=NUMERO DU BIT DANS LE MOT,
         XR          Y,B
         SLLD        NMOTL=0+NBITMO
         ORR         A,Y             < Y=NUMERO DU MOT DANS LE MASQUE,
         LRM         A
         WORD        AMASK
         ADR         Y,A             < A=ADRESSE DU MOT DANS LA 'CDA'.
         PSR         X
         LRM         B,X
         WORD        MCDAM           < B=ADRESSE DU MOT DE TRANSIT,
         WORD        1               < X=NOMBRE DE MOTS A DEPLACER.
         RCDA
         PLR         X
         LA          MCDAM           < ACCES AU MASQUE,
         TBT         0,X             < ALORS ???
         PLR         X,Y
         JNC         SPOP5           < LE MOT (X,Y) EST MASQUE...
SPOP8:   EQU         $
         BSR         ASP             < EXECUTION DE L'OPERATION VARIABLE .OP.
                                     < SUR LE COUPLE DE POINTS (X,Y).
SPOP5:   EQU         $
         PLR         X,Y             < RESTAURATION DE XS ET YS...
         STX         XS
         STY         YS
         IC          XS              < PROGRESSION DE XS,
         IC          XR              < ET DE XR,
         LA          XR
         CPI         NPOLM1          < EST-ON EN BOUT DE LIGNE ???
         JLE         SPOP2           < NON... BALAYAGE HORIZONTAL...
         IC          YS              < OUI, PROGRESSION DE YS,
         IC          YR              < ET DE YR...
         LA          YR
         CPI         NLIGM1          < EST-ON EN BOUT D'IMAGE ???
         JLE         SPOP1           < NON, BALAYAGE VERTICAL...
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        O P E R A T I O N S   I N T E R - I M A G E S  :
<
<
IMSAV:   EQU         $               < ENVOI DU RESIDENT EN SCRATCH.
XLOAD:   EQU         $
         BR          AERROR          < OUI, SUR LA 'CDA-IMAGE', ET ALORS
                                     < GARE AUX MOVE DE PLUS D'UN MOT !!!
IMSAV1:  EQU         $
         BSR         ASPSCD
         BR          ALOOP
IMUP:    EQU         $               < RAPPEL DU SCRATCH EN RESIDENT AVEC MASK.
         LB          ASPACD
         JMP         IM2
IMLOAD:  EQU         XLOAD           < RAPPEL DU SCRATCH EN RESIDENT SANS MASK.
IM1:     EQU         $
IM2:     EQU         $
         STB         ASP             < RELAI DYNAMIQUE DE SOUS-PROGRAMME.
         BSR         ASPOP
         BR          ALOOP
         PAGE
<
<
<        A C C E S   A U   C C I  :
<
<
GOCCI:   EQU         $
         QUIT        1               < ACCES AU CCI INTERACTIF...
         BR          ALOOP
         PAGE
<
<
<        E N T R E E   D ' U N   C A R A C T E R E  :
<
<
<        ARGUMENT :
<                    A=ADRESSE D'UN MESSAGE SI 'PIN'...
<
<
<        RESULTAT :
<                    A=CARACTERE ENTRE.
<
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
PIN:     EQU         $
         BSR         APRINT
XWOR%7:  VAL         0
IN:      EQU         $
         LAD         DEMIN
         BSR         AENTER
         LBY         &AREP           < A=CARACTERE REPONSE.
         RSR
         PAGE
<
<
<        E N T R E E   D ' U N   N O M B R E   H E X A D E C I M A L
<                    E T   C O N V E R S I O N  :
<
<
<        ARGUMENT :
<                    A=ADRESSE D'UN MESSAGE SI 'PIHEX'...
<
<
<        RESULTAT :
<                    VOIR 'HEX'...
<
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
PIHEX:   EQU         $
         BSR         APRINT
XWOR%7:  VAL         0
IHEX:    EQU         $
         LAD         DEMHEX
         BSR         AENTER
         BSR         AHEX            < A=NOMBRE HEXADECIMAL, ET CODES CONDITION.
         RSR
         PAGE
<
<
<        E N T R E E   D E   L A   C O N S T A N T E   ' K '
<
<
INFK:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMK-ZERO
XWOR%7:  VAL         0
         BSR         AIFLOT          < ENTREE DE FK...
         JLE         INFK            < 'K' DOIT ETRE STRICTEMENT POSITIVE...
         FST         FK              < OK...
         BR          ALOOP
         PAGE
<
<
<        M I S E   D E S   I M A G E S   E N   M A T R I C E  :
<
<
CADRE:   EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMCAD-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DE A=NUMERO DU CADRE CHOISI,
         JNE         CADRE           < ERREUR !!!
         JAL         CADRE           < !???!!
         CPI         XNIMA
         JGE         CADRE           < ?!??!?!
         LBI         0
XWOR%1:  VAL         -YNIMA
         SLRD        YNIMA           < A=NUMERO EN Y, ET B=NUMERO EN X...
XWOR%2:  VAL         NLIGM1?NPOLM1+1>XWOR%1=0
         SLLS        XWOR%2
         STA         CADY            < ORIGINE EN Y DU CADRE,
         SLLD        XWOR%2+YNIMA
         STA         CADX            < ORIGINE EN X DU CADRE.
CADRE4:  EQU         $
         STZ         IMAX            < "N" A PRIORI...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMMAX-ZERO
XWOR%7:  VAL         0
         BSR         APIN            < ENTREE DE LA REPONSE :
         CPI         "N"
         JE          CADRE5          < "N" : IMAX=0...
         IC          IMAX            < "O" : IMAX=1...
         CPI         "O"
         JNE         CADRE4          < ??!??!?!?
CADRE5:  EQU         $
MOYEN5:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMNIVO-ZERO
         BSR         APRINT          < "NIVEAUX="...
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DES NIVEAUX AUTORISES :
         JNE         MOYEN5          < ERROR...
         STA         LNIV            < ET SAUVEGARDE A PRIORI...
XWOR%8:  VAL         0
         DO          NIVMAX+1*2
XWOR%8:  VAL         XWOR%8>BIT?BIT
         IF          XWOR%8-'FFFF,,XWOR%,
         IF          ATTENTION : MANQUE UNE VALIDATION DE
         IF          DE CE QUI EST RENTRE...
XWOR%:   VAL         0
<
< BOUCLE DE REDUCTION :
<
         LXI         0               < X=COORDONNEE REDUITE X,
CADRE1:  EQU         $
         LYI         0               < Y=COORDONNEE REDUITE Y.
CADRE2:  EQU         $
         PSR         X,Y
         LR          X,A
         SLLS        YNIMA
         LR          A,X             < X=COORDONNEE X REELLE,
         LR          Y,A
         SLLS        YNIMA
         LR          A,Y             < Y=COORDONNEE Y REELLE.
         STZ         CADNIV          < RAZ DU CUMUL DES NIVEAUX...
         STZ         MAX
         DC          MAX             < INITIALISATION DU MAX A PRIORI...
CADRE3:  EQU         $
         STX         XR
         STY         YR
         BSR         ASPGPR          < A=NIVEAU(XR,YR),
         CP          MAX             < ALORS ???
         JLE         CADRE6          < (A)<=MAX...
         STA         MAX             < (A) DEVIENT LE NOUVEAU MAX...
CADRE6:  EQU         $
         AD          CADNIV
         STA         CADNIV          < ET CUMUL...
         ADRI        1,X             < PASSAGE AU POINT SUIVANT,
         LR          X,A
         ANDI        BIT>YNIMA-1
         JANE        CADRE3          < QUI EXISTE...
XWOR%1:  VAL         BIT>YNIMA
         ADRI        -XWOR%1,X       < IL N'EXISTE PAS...
         ADRI        1,Y             < ON CHANGE DE LIGNE,
         LR          Y,A
         ANDI        BIT>YNIMA-1
         JANE        CADRE3          < QUI EXISTE...
         PLR         X,Y             < RESTAURATION DES COORDONNEES REDUITES...
         PSR         X,Y
         LA          CADX
         ADR         A,X             < ET TRANSLATION DANS L'ESPACE REEL...
         STX         XS
         LA          CADY
         ADR         A,Y
         STY         YS
         LX          LNIV            < X=LISTE DES NIVEAUX A LAISSER INTACT :
         CPZR        X               < Y EN A-T'IL AU MOINS UN ???
         JE          CADRE8          < NON...
         BSR         ASPGPS          < OUI, A=NIVEAU(XS,YS) :
         XR          A,X
         TBT         0,X             < FAUT-IL LAISSER INTACT (XS,YS) ???
         JC          CADRE9          < OUI...
CADRE8:  EQU         $
         LA          MAX             < A=MAX A PRIORI...
         CPZ         IMAX            < MAX OU MOYENNE ???
         JNE         CADRE7          < MAX...
         LA          CADNIV          < MOYENNE...
         ADRI        XNIMA/ZNIMA,A
         SARD        NBITMO
         DV          CADN            < A=NIVEAU MOYEN DU PAVE...
CADRE7:  EQU         $
         LX          LNIV
         XR          A,X
         TBT         NIVMAX+1,X      < A-T'ON LE DROIT DE MARQUER LE NIVEAU
                                     < QUE L'ON VIENT DE CALCULER ???
         XR          A,X
         JC          CADRE9          < NON, ON L'IGNORE...
         BSR         ASPRPS          < OUI, ON LE FORCE EN (XS,YS)...
CADRE9:  EQU         $
         PLR         X,Y             < RESTAURATION DES COORDONNEES REDUITES...
         ADRI        1,Y
         LR          Y,A
XWOR%1:  VAL         -YNIMA
         CPI         NLIGM1>XWOR%1
         JLE         CADRE2          < PASSAGE A LA LIGNE SUIVANTE...
         ADRI        1,X
         LR          X,A
         CPI         NPOLM1>XWOR%1
         JLE         CADRE1          < PASSAGE AU POINT SUIVANT...
         BR          ALOOP           < ET C'EST FINI...
         PAGE
<
<
<        E N T R E E   D E   ' O R G X '   E T   ' O R G Y '  :
<
<
GORGX:   EQU         $
         STZ         MODX            < TORE A PRIORI...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMORGX-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DE ORGX...
         JE          GORGX1          < OK...
GORGX2:  EQU         $
         BR          AERROR          < ET NON...
GORGX1:  EQU         $
         NGR         A,A
         STA         ORGX
GORGX3:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTORE-ZERO
XWOR%7:  VAL         0
         BSR         APIN            < ENTREE DE LA REPONSE...
         CPI         "O"
         JE          GORGX4          < TORE...
         CPI         "N"
         JNE         GORGX3          < ERREUR...
         IC          MODX            < CE N'EST PAS LE MODE TORE...
GORGX4:  EQU         $
         BR          ALOOP           < OK...
GORGY:   EQU         $
         STZ         MODY            < MODE TORE A PRIORI...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMORGY-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DE ORGY...
         JNE         GORGX2          < ERREUR...
         NGR         A,A
         STA         ORGY
GORGY3:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTORE-ZERO
XWOR%7:  VAL         0
         BSR         APIN            < ENTREE DE LA REPONSE...
         CPI         "O"
         JE          GORGY4          < TORE...
         CPI         "N"
         JNE         GORGY3          < ERREUR...
         IC          MODY            < CE N'EST PAS LE MODE TORE...
GORGY4:  EQU         $
         BR          ALOOP           < OK...
         PAGE
<
<
<        E N T R E E   D E   ( C X , C Y )   E T   ( I X , I Y )  :
<                    E T   D U   P A S  :
<
<
CENTRE:  EQU         $
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
         STZ         IFECH           < PAS D'ECHELLE DYNAMIQUE A PRIORI...
CENTR8:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMOPTC-ZERO
XWOR%7:  VAL         0
         BSR         APIN            < ENTREE DE LA REPONSE O/N/A :
         STZ         ICXCY           < ICXCY=0 A PRIORI...
         CPI         "O"
         JE          CENTRA          < OUI, ON UTILISERA (CX,CY)...
         IC          ICXCY
         CPI         "N"
         JE          CENTRA          < "N" : (CX,CY) NE SERA UTILISE QUE POUR
                                     < LES PREMIERS CONTOURS...
         CPI         "A"             < EST-CE LE MODE AUTOMATIQUE ???
         JNE         CENTR8          < ??!?!!
         STZ         ICXCY
         DC          ICXCY           < ICXCY=-1 (<0) : MODE AUTOMATIQUE...
         STZ         IFECH
         IC          IFECH           < ET ALORS LE MODE 'ECHELLE DYNAMIQUE'
                                     < EST IMPLICITE...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMECH-ZERO
         BSR         APRINT          < CE QUE L'ON DIT...
XWOR%7:  VAL         0
         JMP         CENTR2          < ET L'ON SAUTE L'ENTREE DE (CX,CY)...
CENTRA:  EQU         $
XWOR%8:  VAL         0
CENTR9:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMCX-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX
         JNE         CENTR9
         JAL         CENTR9          < ERREUR...
         CPI         NPOLM1
         JG          CENTR9          < ERREUR...
         IF          VERSIO-XXV1,XWOR%8,,XWOR%8
         STA         CX
XWOR%8:  VAL         0
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
         FLT
         FAD         F05             < AFIN QUE (CX,CY) N'APPARTIENNE A
                                     < AUCUN CONTOUR...
         FST         CX
XWOR%8:  VAL         0
CENTR1:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMCY-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX
         JNE         CENTR1
         JAL         CENTR1          < ERREUR...
         CPI         NLIGM1
         JG          CENTR1          < ERREUR...
         IF          VERSIO-XXV1,XWOR%8,,XWOR%8
         STA         CY
XWOR%8:  VAL         0
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
         FLT
         FAD         F05             < AFIN QUE (CX,CY) N'APPARTIENNE A
                                     < AUCUN CONTOUR...
         FST         CY
XWOR%8:  VAL         0
CENTR2:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMIX-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX
         JNE         CENTR2
         JAL         CENTR2          < ERREUR...
         CPI         NPOLM1
         JG          CENTR2          < ERREUR...
         STA         IX
CENTR3:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMIY-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX
         JNE         CENTR3
         JAL         CENTR3          < ERREUR...
         CPI         NLIGM1
         JG          CENTR3          < ERREUR...
         STA         IY
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
CENTR4:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMPAS-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DU PAS :
         JNE         CENTR4          < ERREUR...
         JAL         CENTR4          < ERREUR...
         CPI         XPAS
         JG          CENTR4          < ERREUR...
         STA         PAS
         JANE        CENTR7          < CAS OU PAS#0...
<
< CAS PAS=0 : VOYONS POUR L'ECHELLE DYNAMIQUE :
<
         CPZ         ICXCY           < EST-CE LE MODE (CX,CY) AUTOMATIQUE ???
         JL          CENTRC          < OUI, L'ECHELLE DYNAMIQUE EST IMPLICITE...
CENTRB:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMECH-ZERO
XWOR%7:  VAL         0
         BSR         APIN            < ENTREE DE LA REPONSE O/N :
         STZ         IFECH           < IFECH=0 : NON A PRIORI...
         CPI         "N"
         JE          CENTRC          < NON, PAS D'ECHELLE DYNAMIQUE...
         IC          IFECH
         CPI         "O"
         JE          CENTRC          < "O" : IFECH=1...
         CPI         "A"
         JNE         CENTRB          < ???!?!!!
         STZ         IFECH
         DC          IFECH           < "A" : IFECH=-1...
CENTRC:  EQU         $
CENTR7:  EQU         $
XWOR%8:  VAL         0
CENTR5:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMSENS-ZERO
XWOR%7:  VAL         0
         STZ         SENS            < 2 -->1 A PRIORI...
         BSR         APIN            < ENTREE DE LA REPONSE :
         CPI         "<"
         JE          CENTR6
         IC          SENS            < 1 --> 2...
         CPI         ">"
         JNE         CENTR5          < ?!????!
CENTR6:  EQU         $
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        M O U V E M E N T S   R E S I D E N T  <-->  T V  :
<
<
DEMTV:   WORD        TVDKU           < DEMANDE D'ENVOI D'UNE IMAGE DE 'TV'
                                     < EN MODE ENTRELACE ; CETTE DEMANDE EST
                                     < MISE ICI, ET NON PAS EN BAS, CAR IL
                                     < N'Y A PAS DE PLACE DANS LA RACINE DE
                                     < L'OVERLAY !!!
         WORD        IMAGE-ZERO*NOCMO
         WORD        LIMAG*NOCMO*NCOOL
         WORD        0
MOV0:    EQU         $               < RESIDENT R+V+B --> TV.
         LRM         A
         WORD        DEMTV
         JMP         MOVX            < VERS L'ENVOI DE L'IMAGE...
MOV3:    EQU         $               < RESIDENT B --> TV.
         LAD         DEMTVB
MOVX:    EQU         $
         SVC         0               < BLEU.
         BR          ALOOP
MOV1:    EQU         $               < RESIDENT R --> TV.
         LAD         DEMTVR
         SVC         0               < ROUGE.
         BR          ALOOP
MOV2:    EQU         $               < RESIDENT V --> TV.
         LAD         DEMTVV
         SVC         0               < VERT.
         BR          ALOOP
PMOV5:   EQU         $               < TV R --> RESIDENT.
         LA          DEMTVR+3
         LR          A,B
         ORI         TVIN            < MISE EN ENTREE,
         STA         DEMTVR+3
         LAD         DEMTVR
         SVC         0               < ENTREE DU ROUGE,
         STB         DEMTVR+3        < ET RESTAURATION...
         RSR
PMOV6:   EQU         $               < TV V --> RESIDENT.
         LA          DEMTVV+3
         LR          A,B
         ORI         TVIN
         STA         DEMTVV+3
         LAD         DEMTVV
         SVC         0               < ENTREE DU VERT...
         STB         DEMTVV+3
         RSR
PMOV7:   EQU         $               < TV B --> RESIDENT.
         LA          DEMTVB+3
         LR          A,B
         ORI         TVIN
         STA         DEMTVB+3
         LAD         DEMTVB
         SVC         0               < ENTREE DU BLEU...
         STB         DEMTVB+3
         RSR
MOV4:    EQU         $               < TV R+V+B --> RESIDENT.
         BSR         APMOV5          < ROUGE,
         BSR         APMOV6          < VERT,
MOV7:    EQU         $               < TV B --> RESIDENT.
         BSR         APMOV7          < BLEU.
         BR          ALOOP
MOV5:    EQU         $               < TV R --> RESIDENT.
         BSR         APMOV5
         BR          ALOOP
MOV6:    EQU         $               < TV V --> RESIDENT.
         BSR         APMOV6
         BR          ALOOP
         PAGE
<
<
<        A C C E S   A   T V 2  :
<
<
STV2:    EQU         $
         LRM         A,B,X
         WORD        TV2
         WORD        IMAGE
         WORD        LIMAG*NCOOL
         WCDA
         BR          ALOOP
GTV2:    EQU         $
         LRM         A,B,X
         WORD        TV2
         WORD        IMAGE
         WORD        LIMAG*NCOOL
         RCDA
         BR          ALOOP
         PAGE
<
<
<        T R A N S F E R T S   R E S I D E N T - S C R A T C H  :
<
<
<        FONCTION :
<                      CE MODULE ASSURE LES TRANSFERTS
<                    BRUTAUX ENTRE LE RESIDENT, ET LE
<                    SCRATCH (QUI EST EN FAIT LA 'CDA').
<
<
SPSCD:   EQU         $
         PSR         A,B,X
         LRM         A,B,X
         WORD        0               < A=ADRESSE EN 'CDA',
         WORD        IMAGE           < B=ADRESSE EN RESIDENT,
         WORD        LIMAG*NCOOL     < X=NOMBRE DE MOTS A TRANSFERER.
         WCDA
                                     < TRANSFERT : RESIDENT --> SCRATCH.
         PLR         A,B,X
         RSR
SPACD:   EQU         $               < TRANSFERT AVEC MASQUE...
         PSR         A
         BSR         ASPGPS          < ACCES AU POINT SCRATCH COURANT,
         BSR         ASPRPR          < ET MISE EN RESIDENT...
         PLR         A
         RSR
SPBCD:   EQU         $               < TRANSFERT SANS MASQUE...
         PSR         A,B,X
         LRM         A,B,X
         WORD        0               < A=ADRESSE EN 'CDA',
         WORD        IMAGE           < B=ADRESSE EN RESIDENT,
         WORD        LIMAG*NCOOL     < X=NOMBRE DE MOTS A TRANSFERER.
         RCDA
                                     < TRANSFERT : SCRATCH --> RESIDENT.
         PLR         A,B,X
         RSR
         PAGE
<
<
<        B R A N C H E   D ' O V E R L A Y  :
<
<
DEBOV1:  EQU         $
XWOR%1:  VAL         DEBOV1-ZERO*NOCMO
OVLTZ2:  EQU         ZERO+XWOR%1     < ADRESSE-OCTET DE LA BRANCHE...
         BYTE        " ";NOMBB
         ASCI        "    "
         BYTE        '04;'D0
XWOR%1:  VAL         ITEM2-ZERO
         IF          $-ZERO-XWOR%1,XWOR%,,
         IF          ATTENTION : LA RACINE DE L'OVERLAY EST TROP LONGUE !!!
XWOR%:   VAL         0
<
< 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
         PAGE
<
<
<        L O C A L  :
<
<
         LOCAL
LOC:     EQU         $
<
< MESSAGES :
<
M1:      BYTE        9;'6D
         ASCI        "ERR.DEP!"
M2:      BYTE        5;'6D
         ASCI        "OPEN"
M3:      BYTE        7;'6D
         ASCI        "P.ISOL"
M4:      BYTE        5;'6D
         ASCI        "INT."
M5:      BYTE        5;'6D
         ASCI        "EXT."
CURSOR:  BYTE        "N";0           < CARACTERE DE DEBLOCAGE DU
                                     < CURSEUR (ERREUR A PRIORI).
         DZS         2               < COORDONNEES Y ET X.
<
< DEMANDES A CMS4 :
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
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.
XWOR%7:  VAL         0
STABIL:  WORD        '8A01           < DEMANDE DE STABILISATION VIDEO.
         WORD        IMAG-ZERO*2
         WORD        LIMAG*2
         WORD        TVPR            < SUR LE PROCESSEUR ROUGE.
<
< CONSTANTES :
<
FIRST:   WORD        0               < POUR DETECTER LE PREMIER CUMUL
                                     < DES CONTOURS...
ALIMAG:  WORD        LIMAG           < NBRE DE MOTS DE L'IMAGE.
NMPL:    WORD        CNMPL           < NBRE MOTS DE 16 BITS PAR LIGNE.
NLIN:    WORD        1024/DY-1       < NBRE DE LIGNES/IMAGE-1.
NPPL:    WORD        CNMPL*16-1      < NBRE DE POINTS/LIGNE-1.
YMIN:    WORD        0               < DERNIERE LIGNE A TESTER LORS
                                     < DES BALAYAGES DE L'IMAGE
                                     < POUR ELIMINER LES POINTS
                                     < 0-ISOLES ET 1-ISOLES.
YMAX:    WORD        0               < DE MEME : PREMIERE LIGNE...
ITEST:   WORD        1               < 0 : TEST SUR LA VALEUR 0 DES POINTS,
                                     < 1 : TEST SUR VALEUR 1 DES POINTS.
X:       VAL         1               < COORDONNEE X D'UN POINT.
Y:       VAL         0               < COORDONNEE Y D'UN POINT.
DEP:     WORD        0;0             < POINT DE DEPART D'UN CONTOUR.
PTC:     WORD        0;0             < POINT COURANT LORS D'UN PARCOURS.
SUC:     WORD        0;0             < SUCCESSEUR DU POINT COURANT (X,Y).
NREMPL:  WORD        0               < NOMBRE DE REMPLACANTS ATTEN-
                                     < DUS POUR LE POINT COURANT.
REMP:    WORD        0;0             < FUTUR REMPLACANT DU POINT
                                     < COURANT SUR LE CONTOUR LORS DE
                                     < SON PARCOURS.
NPILR:   WORD        0               < NBRE DE POINTS A DEPILER
                                     < DE LA PILE 'PILR'.
APILR:   WORD        0               < REALI COURANT VERS PILR.
PILR:    DZS         4*2             < POUR EMPILER M1, M2, M3, PTC.
SDEP:    WORD        0;0             < POINT DE DEPART POUR LE TOUR
                                     < SUIVANT (FUTUR 'DEP').
POINT1:  WORD        0;0             < CONTIENT UN POINT QUE L'ON SAIT
                                     < SAIT ETRE A 1 LORS DE LA
                                     < RECHERCHE DES VOISINS.
VX:      WORD        1               < COORDONNEES X ET Y DU
VY:      WORD        0               < VECTEUR DEPLACEMENT.
SVX:     WORD        0               < SAVE VX.
SVY:     WORD        0               < SAVE VY.
KOMPT:   WORD        0               < COMPTEUR DES POINTS MIS A 1,
                                     < LORS D'UN PARCOURS DE REM-
                                     < PLISSAGE.
PKOMPT:  WORD        -1              < KOMPT DU TOUR PRECEDENT.
OSCIL:   WORD        0               < COMPTEUR DES OSCILLATIONS.
MOSCIL:  WORD        8               < MAX DE OSCIL...
KDIFF:   WORD        0               < COMPTAGE DES DIFFERENCES ENTRE
                                     < L'IMAGE AVANT ET APRES L'AJOUT
                                     < DU NOUVEAU CONTOUR INTERNE.
DOUBLE:  WORD        0               < COMPTEUR DES POINTS DOUBLES
                                     < D'UN PARCOURS.
NISOL:   WORD        0               < NOMBRE DE POINTS ISOLES,
                                     < OU SIMPLEMENT RATTACHES
                                     < RECONTRES AVANT CHAQUE
                                     < PARCOURS.
INDIC:   WORD        0               < RESULTAT (0/1) DES TESTS
                                     < VIRTUELS.
ANGLE:   WORD        0               < SOMMATION DES ROTATIONS
                                     < PARTIELLES 'ROT1' ET 'ROT3' :
                                     < +1 : +PI/2 (ROT1),
                                     < -1 : -PI/2 (ROT3).
SANGLE:  WORD        0               < SAUVEGARDE TEMPORAIRE DE
                                     < L'ANGLE COURANT LORS DES
                                     < RECHERCHES DE VOISINS.
PREM:    WORD        1               < 1 : 1ER POINT DE L'IMAGE
                                     < NON ENCORE RENCONTRE,
                                     < 0 SINON.
<
< RELAIS DIVERS :
<
AIMAG0:  WORD        0               < RELAI VARIABLE...
AIMAG1:  EQU         AIMAGR          < ACCES A L'IMAGE VIDEO COURANTE.
AIMAG:   WORD        IMAG-1,X        < RELAI DE RAZ IMAGE COURANTE.
AARG:    WORD        ARG             < PREPARATION DES ARGUMENTS DES SOUS-
                                     < PROGRAMMES SET, RESET,...
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.
ASETV5:  WORD        SETV5           < RELAI...
ASETV6:  WORD        SETV6           < RELAI...
AT0:     WORD        T0              < TEST DE (A,B)=0.0...
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.
AEXIST:  WORD        EXIST           < EXISTENCE D'UN POINT.
AVOISI:  WORD        VOISI           < TEST ET COMPTAGE D'UN VOISIN.
AI2:     WORD        ITEM2-1,X       < RELAI DE RAZ ITEM1+ITEM2.
ACONT8:  WORD        CONT18          < RELAI VERS 'CONT18'...
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.
         PAGE
         PROG
         PAGE
<
<
<        E N T R E E   D ' U N E   C O N S T A N T E   F L O T T A N T E  :
<
<
<        ARGUMENT :
<                    A=ADRESSE D'UN MESSAGE EN MODE 'VISU'.
<
<
<        RESULTAT :
<                    A,B=CONSTANTE FLOTTANTE.
<                    INDICATEURS POSITIONNES PAR 'FCAZ'.
<
<
IFLOT:   EQU         $
         PSR         X,Y
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LR          A,X             < X=SAUVEGARDE DE L'ADRESSE MESSAGE.
IFLOT1:  EQU         $
         LR          X,A             < A=ADRESSE DU MESSAGE A EDITER...
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
IFLOT1:  EQU         $
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DU NUMERATEUR,
         JNE         IFLOT1          < ERREUR...
         LR          A,Y             < Y=NUMERATEUR.
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMSLAS-ZERO
XWOR%7:  VAL         0
         BSR         APIHEX          < ENTREE DU DENOMINATEUR,
         JNE         IFLOT1          < ERREUR...
         JAE         IFLOT1          < IL NE PEUT ETRE NUL !!!
         FLT
         FST         FWORK           < DENOMINATEUR,
         LR          Y,A
         FLT                         < NUMERATEUR,
         FDV         FWORK           < RESULTAT=NUMERATEUR/DENOMINATEUR.
         FCAZ                        < ????
         PLR         X,Y
         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
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
<
<
<        N U M E R O   D ' U N   P O I N T   S U R   C ( 0 )  :
<
<
<        ARGUMENT :
<                    A=NUMERO QUELCONQUE.
<
<
<        RESULTAT :
<                    A=NUMERO CORRECT DANS L'INTERVALLE (0,NPC0-1).
<
<
SPNUM:   EQU         $
DECXY::  VAL         8               < POUR DECONCATENER X ET Y...
         JAGE        SETV25
         AD          NPC0            < CALCUL MODULO 'NPC0'...
         JMP         SPNUM
SETV25:  EQU         $
         CP          NPC0
         JL          SETV20          < OK...
         SB          NPC0            < CALCUL MODULO 'NPC0'...
         JMP         SPNUM
SETV20:  EQU         $               < A=NUMERO D'UN POINT DE C(0) QUE L'ON
                                     < ASSOCIE AU POINT COURANT DE C(N), PAR
                                     < LA FORMULE :
                                     < P(C(0))=P(C(N))*N(C(0))/N(C(N)) CE QUI
                                     < EST PEU DIFFERENT DE :
                                     <        #P(C(N))*N(C(0))/N(C(N-1)), OU
                                     < 'P' DESIGNE UN NUMERO DE POINT, ET 'N'
                                     < LE NOMBRE DE POINTS D'UN CONTOUR...
         RSR
         PAGE
<
<
<        C A L C U L   D ' U N E   L O N G U E U R  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME CALCULE LE CARRE
<                    DE LA LONGUEUR SEPARANT UN POINT FIXE
<                    (SAVEX,SAVEY) DE C(N) D'UN POINT
<                    VARIABLE DE C(0).
<
<
<        ARGUMENT :
<                    A=NUMERO DU POINT VARIABLE DE C(0).
<
<
<        RESULTAT :
<                    A,B=CARRE DE LA LONGUEUR.
<                    X,Y=COORDONNEES DU POINT DE NUMERO ARGUMENT.
<                    FWORK1=X(M(C(0)))-X(M(C(N))),
<                    FWORK2=Y(M(C(0)))-Y(M(C(N))).
<
<
SPL:     EQU         $
         BSR         ASPNUM          < A=NUMERO DU POINT SUR C(0)...
         STA         SXY             < SAUVEGARDE DU NUMERO DU POINT COURANT.
         BSR         AGZBL           < RECUPERATION DES COORDONNEES DU POINT
                                     < COURANT DE C(0).
         LR          B,X
         LR          A,Y
         SB          SAVEY
         FLT
         FST         FWORK2          < Y(C(0))-Y(C(N)).
         FMP         FWORK2
         FST         FWORK
         LR          X,A
         SB          SAVEX
         FLT
         FST         FWORK1          < X(C(0))-X(C(N)).
         FMP         FWORK1
         FAD         FWORK
         RSR
<
<
<        C A L C U L   D ' U N E   L O N G U E U R
<        M I N I M A L E   N O N   N U L L E  :
<
<
SPLM:    EQU         $
         BSR         ASPL            < CALCUL DE LA LONGUEUR DU POINT COURANT
                                     < DE C(N) AU POINT X0Y0+IXY DE C(0) :
         FCAZ
         JE          SPLM31          < SI LA LONGUEUR EST NULLE, ON L'IGNORE...
         CPZ         IFECH           < MODE DE L'ECHELLE ???
         JGE         SPLM32          < STATIQUE...
<
< CAS DE L'ECHELLE DYNAMIQUE :
<
         FCAM        LXY             < COMMENT EST LA LONGUEUR COURANTE ???
         JG          SPLM31          < PLUS GRANDE, SANS INTERET...
         JE          SPLM33          < IDENTIQUE...
         FST         LXY             < MINIMALE, ON LA MEMORISE,
         LA          PILEM0          < ET ON REINITIALISE
         STA         PILEM           < LA PILE DES POINTS MINIS...
SPLM33:  EQU         $
         LY          APILEM
         LA          SXY
         PUSH                        < EMPILEMENT DU NUMERO D'UN "POINT MINI"...
         JMP         SPLM34
<
< CAS DE L'ECHELLE STATIQUE :
SPLM32:  EQU         $
         FCAM        LXY             < LA LONGUEUR EST-ELLE MINIMALE ???
         JGE         SPLM31          < NON...
         FST         LXY             < OUI, ON LA GARDE...
         LA          SXY
SPLM34:  EQU         $
         STA         MXY             < SAUVEGARDE DU NUMERO DU POINT COURANT
                                     < DE C(0)...
SPLM31:  EQU         $
         RSR
<
<
<        R E C U P E R A T I O N   D E S   C O O R D O N N E E S
<                    D U   P O I N T   C O U R A N T   D E   C ( 0 )  :
<
<
<        ARGUMENT :
<                    A=NUMERO DU POINT.
<
<
<        RESULTAT :
<                    A=COORDONNEE Y,
<                    B=COORDONNEE X.
<
<
GZBL:    EQU         $
         LYI         YLOAD
         BSR         AGZB
         LAI         0
         SCRD        DECXY           < DECONCATENATION
         SLRS        DECXY           < DES COORDONNEES.
         RSR
XWOR%8:  VAL         0
         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         $
         PSR         B,X,Y,W
         LRM         W
         WORD        IMAGB           < AFIN D'ATTEINDRE PAR 'EXIST' L'IMAGE
                                     < BLEUE DU CUMUL DES CONTOURS...
         LB          ITEST           < B=SAUVEGARDE DE 'ITEST',
         STZ         ITEST
         IC          ITEST           < POUR TESTER LES POINTS A 1...
         BSR         ATEST           < TEST DU POINT (X,Y)...
         STB         ITEST           < ET RESTAURE 'ITEST'...
         JNC         SETV4           < LE POINT (X,Y) EST NOIR, ON PEUT
                                     < L'EXPLOITER...
         PLR         B,X,Y,W
SETV55:  EQU         $
         BR          ASETV5          < LE POINT (X,Y) EST DEJA MARQUE
                                     < DANS LE CONTOUR BLEU, IL NE FAUT
                                     < DONC PAS LE REPRENDRE EN COMPTE ;
                                     < ON RESOUD DONC AINSI LE PROBLEME DU
                                     < SQUELETTE DE L'IMAGE QUI REPASSE
                                     < SUR DES CONTOURS ANTERIEURS...
SETV4:   EQU         $
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
         LA          IC0
         CPI         XICXCY          < EN EST-ON AUX PREMIERS CONTOURS ???
         JLE         SETV4Z          < OUI, ON UTILISE (CX,CY)...
         CPZ         ICXCY           < NON, ALORS (CX,CY) SONT-ILS UTILES ???
         JNE         SETV4X          < NON...
SETV4Z:  EQU         $
XWOR%8:  VAL         0
         LR          X,A
         IF          VERSIO-XXV1,XWOR%8,,XWOR%8
         SB          CX
         FLT
XWOR%8:  VAL         0
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
         FLT
         FSB         CX
XWOR%8:  VAL         0
         FST         DELTAX          < DISTANCE AU CENTRE POLAIRE CONTOUR.
         FMP         DELTAX
         FST         FWORK
         LR          Y,A
         IF          VERSIO-XXV1,XWOR%8,,XWOR%8
         SB          CY
         FLT
XWOR%8:  VAL         0
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
         FLT
         FSB         CY
XWOR%8:  VAL         0
         FST         DELTAY          < DISTANCE AU CENTRE POLAIRE CONTOUR.
         FMP         DELTAY
         FAD         FWORK
         BSR         ARAC
         FCAZ                        < L'HYPOTENUSE EST-ELLE NULLE (EST-ON
                                     < AU POINT (CX,CY) ???
         JNE         SETV7           < NON...
         LA          IX
         STA         XS              < ON SE PLACE
         LA          IY              < AU CENTRE (IX,IY)...
         BR          ASETV6          < ET ON VA CHERCHER SON NIVEAU...
SETV7:   EQU         $
         FST         FWORK           < DISTANCE EUCLIDIENNE DU POINT COURANT
                                     < (X,Y) AU CENTRE POLAIRE (CX,CY) DU
                                     < CONTOUR.
         FLD         DELTAX
         FDV         FWORK
         FST         FIX             < CE QUI DONNE UN INCREMENT EN X DE
                                     < PASSAGE D'UN POINT A UN AUTRE DANS
                                     < LE SENS DU VECTEUR (CX,CY) --> (X,Y).
         FLD         DELTAY
         FDV         FWORK
         FST         FIY             < DE MEME, INCREMENT EN Y...
         IF          VERSIO-XXV1,XWOR%8,,XWOR%8
         LR          X,A
         FLT
         FST         FX              < COORDONNEE X,
         LR          Y,A
         FLT
         FST         FY              < COORDONNEE Y.
<
< RECHERCHE DU PREMIER POINT NOIR
< DANS LA DIRECTION DU VECTEUR
< (CX,CY) --> (X,Y) :
<
         LA          ITEST
         PSR         A               < SAUVEGARDE DE 'ITEST' COURANT,
         STZ         ITEST
         IC          ITEST           < ET MISE EN PLACE DES CONDITIONS DE
                                     < TEST NORMAL (1).
SETV1:   EQU         $
         FLD         FX
         FAD         FIX
         FST         FX              < INCREMENTATION DEX X,
         BSR         AROND
         LR          A,X
         FLD         FY
         FAD         FIY
         FST         FY              < ET DES Y...
         BSR         AROND
         LR          A,Y
         BSR         AEXIST          < TEST DU NOUVEAU POINT (X,Y) ???
         JAE         SETV1           < IL EST A 1, ON REBOUCLE...
<
< CAS D'UN POINT NOIR : ON DESIRE QU'IL
< SOIT ISOLE, AFIN DE VRAIMENT SORTIR
< DU CONTOUR CUMULE COURANT :
<
         LBI         8               < IL A 8 VOISINS...
         ADRI        1,X
         BSR         AEXIST
         SBR         A,B
         ADRI        -1,Y
         BSR         AEXIST
         SBR         A,B
         ADRI        -1,X
         BSR         AEXIST
         SBR         A,B
         ADRI        -1,X
         BSR         AEXIST
         SBR         A,B
         ADRI        1,Y
         BSR         AEXIST
         SBR         A,B
         ADRI        1,Y
         BSR         AEXIST
         SBR         A,B
         ADRI        1,X
         BSR         AEXIST
         SBR         A,B
         ADRI        1,X
         BSR         AEXIST
         SBR         A,B
         ADRI        -1,Y
         ADRI        -1,X
         CPZR        B               < ALORS ???
         JNE         SETV1           < IL N'EST PAS ISOLE, ON RECOMMENCE...
         PLR         A
         STA         ITEST           < RESTAURATION DE 'ITEST'...
<
< CAS D'UN POINT NOIR ISOLE : ON
< ADMET QU'ON EST A L'EXTERIEUR
< DU CONTOUR CUMULE COURANT :
<
         LR          X,A
         SB          CX
         FLT
         BSR         AT0             < TEST DE NULLITE...
         FST         GELTAX          < DISTANCE A CX DU X DU PREMIER POINT
                                     < NOIR RENCONTRE DANS LA DIRECTION
                                     < DU VECTEUR ISSU DE (CX,CY).
         LR          Y,A
         SB          CY
         FLT
         BSR         AT0             < TEST DE NULLITE...
         FST         GELTAY          < DE MEME DISTANCE DE CY A Y...
XWOR%8:  VAL         0
<
< RECHERCHE DU POINT QUE L'ON VA
< UTILISER DANS L'IMAGE 'TV2' :
<
         LA          IX
         FLT
         FSB         FIX
         FST         FX              < COORDONNEE A 'FIX' PRES DU CENTRE
                                     < POLAIRE DE L'IMAGE 'TV2'.
         LA          IY
         FLT
         FSB         FIY
         FST         FY              < DE MEME EN Y...
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
SETV4X:  EQU         $
         CPZ         PAS             < MODE ???
         JNE         SETV69          < PAS#0 : ON PREND L'ANCIEN MODE QUI
                                     < CONSISTE A UTILISER DES CADRES SIMPLE-
                                     < MENT CONCENTRIQUES...
         CPZ         IC0             < EST-CE C(0) ???
         JE          SETV69          < OUI, ON PREND LE CADRE EXTERIEUR...
<
< CAS PAS=0 : LES CADRES SONT RECALCULES
< POUR CHAQUE POINT EN FONCTION DE LA
< DISTANCE COURANTE DE C(N) A C(0) :
<
         STX         SAVEX
         STY         SAVEY
         LA          PILEM0
         STA         PILEM           < REINITIALISATION DE LA PILE DES "MINIS".
         LA          NPC0            < A=NOMBRE DE POINTS DE C(0),
         MP          NPCN            < QUE L'ON MULTIPLIE PAR LE NUMERO DU
                                     < POINT COURANT DE C(N),
         DV          NPCNM1          < ET QUE L'ON DIVISE PAR LE NOMBRE DE
                                     < POINTS DE C(N) QUE L'ON NE CONNAIT
                                     < PAS ENCORE, ET QUE L'ON APPROXIME PAR
                                     < CELUI DE C(N-1)...
         FLT
         FDV         FCOREC
         BSR         AROND           < ON APPORTE UNE CORRECTION...
         NGR         A,A             < EN EFFET, C(0) N'EST PAS PARCOURU
                                     < DANS LE MEME SENS QUE LES C(N)...
         AD          NPC0
         FLT
         FMP         FKOREC          < CORRECTION...
         BSR         AROND
SETV35:  EQU         $
         JAGE        SETV36
         AD          NPC0            < CALCUL MODULO 'NPC0'...
         JMP         SETV35
SETV36:  EQU         $
         CP          NPC0
         JL          SETV42          < OK...
         SB          NPC0            < CALCUL MODULO 'NPC0'...
         JMP         SETV35
SETV42:  EQU         $               < A=NUMERO D'UN POINT DE C(0) QUE L'ON
                                     < ASSOCIE AU POINT COURANT DE C(N), PAR
                                     < LA FORMULE :
                                     < P(C(0))=P(C(N))*N(C(0))/N(C(N)) CE QUI
                                     < EST PEU DIFFERENT DE :
                                     <        #P(C(N))*N(C(0))/N(C(N-1)), OU
                                     < 'P' DESIGNE UN NUMERO DE POINT, ET 'N'
                                     < LE NOMBRE DE POINTS D'UN CONTOUR...
         STA         X0Y0            < SAUVEGARDE DU POINT INITIAL DE C(0).
         STA         SXY
         STA         MXY
         LY          APILEM
         PUSH                        < INITIALISATION DE LA PILE DES "MINIS"...
         BSR         ASPL
         FST         LXY             < ET INITIALISATION DE LA DISTANCE DU
                                     < POINT COURANT DE C(N) A C(0).
         STZ         IXY             < INITIALISATION DU PAS D'EXPLORATION
                                     < DE C(0) AU VOISINNAGE DE 'X0Y0'.
SETV30:  EQU         $
         IC          IXY             < PROGRESSION DU PAS D'EXPLORATION :
         LA          IXY
         CP          AMIXY           < EST-CE FINI ???
         JG          SETV33          < OUI...
         AD          X0Y0
         BSR         ASPLM           < CALCUL DE LA LONGUEUR MINIMALE NON NULLE
                                     < DU POINT COURANT DE C(N) AU POINT
                                     < X0Y0 DE C(0).
         LA          X0Y0
         SB          IXY
         BSR         ASPLM           < CALCUL DE LA LONGUEUR MINIMALE NON NULLE
                                     < DU POINT COURANT DE C(N) AU POINT
                                     < X0Y0 DE C(0).
         JMP         SETV30          < VERS LA SUITE DE L'EXPLORATION DU
                                     < VOISINNAGE DE 'X0Y0'...
SETV69:  JMP         SETV21          < RELAI...
SETV33:  EQU         $
         LA          X0Y0
         FLT
         FST         FWORK
         LA          MXY
         FLT
         FDV         FWORK
         FST         FKOREC          < FKOREC=MXY/X0Y0.
         LA          MXY
         SB          X0Y0            < A=MXY-X0Y0,
         JAGE        SETV43          < A=ABS(MXY-X0Y0),
         NGR         A,A             < A=ABS(MXY-X0Y0),
SETV43:  EQU         $
         CP          DELTA           < COMMENT EST LE NOUVEAU 'DELTA' PAR
                                     < RAPPORT AU PRECEDENT ???
         STA         DELTA           < POUR LE COUP SUIVANT...
         JL          SETV37          < NOUVEAU<PRECEDENT : ON PEUT REDUIRE LE
                                     < VOISINNAGE...
SETV39:  EQU         $
         IC          AMIXY           < NOUVEAU>=PRECEDENT : IL FAUT AUGMENTER
                                     < LE VOISINNAGE...
         JGE         SETV38          < OK, PAS DE DEBORDEMENT...
SETV37:  EQU         $
         DC          AMIXY           < NOUVEAU<PRECEDENT : ON PEUT REDUIRE
                                     < LE VOISINNAGE...
         JLE         SETV39          < DEBORDEMENT ?!??!
SETV38:  EQU         $
         LA          AMIXY
         CPI         MIXY            < Y-A-T'IL DEBORDEMENT PAR LE BAS ???
         JGE         SETV41          < NON...
         LAI         MIXY            < OUI, ON BORNE INFERIEUREMENT...
SETV41:  EQU         $
         CP          SAMIXY          < Y-A-T'IL DEBORDEMENT PAR LE HAUT ???
         JLE         SETV40          < NON...
         LA          SAMIXY          < OUI, ON BORNE SUPERIEUREMENT...
SETV40:  EQU         $
         STA         AMIXY           < NOUVELLE DEFINITION DU VOISINNAGE...
         FLD         LXY             < ON ADMET QUE 'LXY' REPRESENTE
                                     < LE MINIMUM ABSOLU ENTRE LE POINT
                                     < COURANT DE C(N) ET LE VOISIN-
                                     < NAGE ASSOCIE DE C(0)...
         BSR         ARAC            < ON A DONC AINSI LA DISTANCE ENTRE LE
                                     < POINT COURANT DE C(N) AU POINT QUI LUI
                                     < EST ASSOCIE SUR C(0)...
         BSR         AKFECH          < DETERMINATION EVENTUELLE DE L'ECHELLE...
XWOR%1:  VAL         -1              < POUR DIVISER PAR 2...
         ANDI        NLIGM1?NPOLM1>XWOR%1
                                     < ET QUE L'ON PREND MODULO LA MOITIE DE
                                     < L'IMAGE...
         STA         MINX            < ET L'ON DEFINIT
         STA         MINY            < AISNI LE CADRE COURANT...
         LBI         NLIGM1?NPOLM1
         IF          NLIGM1-NPOLM1,,XWOR%,
         IF          CA VA MERDER !!!
XWOR%:   VAL         0
         SBR         A,B
         STB         MAXX
         STB         MAXY
         LA          IC0
         CPI         XICXCY          < EN EST-ON AUX PREMIERS CONTOURS ???
         JLE         SETV4Y          < OUI, ON CONNAIT DEJA (FIX,FIY)...
         CPZ         ICXCY           < (CX,CY) SONT-ILS UTILES ???
         JE          SETV4Y          < OUI, DONC ON CONNAIT DEJA (FIX,FIY),
                                     < AINSI QUE LE POINT (FX,FY)...
<
< CAS OU (CX,CY) N'EST PAS UTILISE :
< ON CALCULE LE VECTEUR DEPLACEMENT
< A PARTIR DU VECTEUR JOIGNANT LE
< CENTRE (CX,CY) AU POINT
< COURANT DE C(N) :
<
         LA          SAVEX
         FLT
         FSB         CX
         FST         FWORK1          < FWORK1=SAVEX-CX,
         FMP         FWORK1
         FST         FWORK
         LA          SAVEY
         FLT
         FSB         CY
         FST         FWORK2          < FWORK2=SAVEY-CY.
         FMP         FWORK2
         FAD         FWORK
         BSR         ARAC
         FST         FWORK           < ON DISPOSE DE LA DISTANCE DU CENTRE
                                     < (CX,CY) AU POINT COURANT DE C(N)...
         FLD         FWORK1
         FDV         FWORK
         FST         FIX             < D'OU LE VECTEUR DEPLACEMENT
         FLD         FWORK2
         FDV         FWORK
         FST         FIY             < (FIX,FIY)...
         LA          IX
         FLT
         FSB         FIX
         FST         FX              < POINT DE DEPART DANS TV2,
         LA          IY
         FLT
         FSB         FIY
         FST         FY              < POINT DE DEPART DANS TV2...
SETV4Y:  EQU         $
<
< TENTATIVE DE SORTIE DU CADRE :
<
SETV21:  EQU         $
XWOR%8:  VAL         0
SETV2:   EQU         $
         FLD         FX
         FAD         FIX
         FST         FX              < ON PART DE (IX,IY) DANS LA DIRECTION
                                     < DU VECTEUR (CX,CY) --> (X,Y).
         BSR         AROND
         LR          A,X
         FLD         FY
         FAD         FIY
         FST         FY              < DE MEME SUR Y...
         BSR         AROND
         LR          A,Y
         IF          VERSIO-XXV1,XWOR%8,,XWOR%8
         JALE        SETV3           < SORT DE 'TV2'...
         CPI         NLIGM1
         JGE         SETV3           < ON SORT DE 'TV2'...
         LR          X,A
         JALE        SETV3           < ON SORT DE 'TV2'...
         CPI         NPOLM1
         JL          SETV2           < TANT QU'ON RESTE A L'INTERIEUR
                                     < DE 'TV2', ON TENTE D'EN SORTIR...
XWOR%8:  VAL         0
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
         CP          MINY
         JLE         SETV3           < SORT DU CADRE DE TV2...
         CP          MAXY
         JGE         SETV3           < IDEM...
         LR          X,A
         CP          MINX
         JLE         SETV3           < IDEM...
         CP          MAXX
         JL          SETV2           < TANT QU'ON RESTE DANS LE CADRE, ON
                                     < TENTE D'EN SORTIR...
XWOR%8:  VAL         0
SETV3:   EQU         $
         IF          VERSIO-XXV1,XWOR%8,,XWOR%8
         LR          X,A
         SB          IX
         FLT
         FDV         GELTAX
         FMP         DELTAX          < LES COORDONNEES DU POINT DE LA
                                     < FRONTIERE DE 'TV2' SONT RAMENEES
                                     < VERS (IX,IY) DANS UN RAPPORT EGAL
                                     < A "DISTANCE (CX,CY) A LA FRONTIERE
                                     < EXTERIEURE DU REMPLISSAGE" SUR
                                     < "DISTANCE (CX,CY) AU POINT COURANT
                                     < DU CONTOUR"...
         BSR         AROND
         AD          IX
         STA         XS
         LR          Y,A
         SB          IY
         FLT
         FDV         GELTAY
         FMP         DELTAY          < DE MEME SUR LES Y...
         BSR         AROND
         AD          IY
XWOR%8:  VAL         0
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
         STX         XS              < C'EST LE POINT DE SORTIE
         LR          Y,A             < DU CADRE DE 'TV2' QUI EST LE BON...
XWOR%8:  VAL         0
SETV6:   EQU         $
         STA         YS
         CPZ         SENS            < QUEL SENS ???
         JNE         SETV10          < 1 -->2...
<
< CAS DU SENS TV2 --> TV1 :
<
         LA          CTCDA
         STA         XCTCDA
         BSR         ASPGPS          < A=NIVEAU(X,Y) DANS 'TV2',
         STZ         XCTCDA
         PLR         B,X,Y,W
         STX         XS
         STY         YS
         BSR         ASPRPS          < ET ON GENERE L'IMAGE 'TV1'...
         JMP         SETV11
<
< CAS DU SENS TV1 --> TV2 :
<
SETV10:  EQU         $
         PLR         B,X,Y,W
         LA          XS
         LB          YS
         PSR         A,B             < SAUVEGARDE DES COORDONNEES (XS,YS) DU
                                     < POINT DE L'IMAGE 'TV2'.
         STX         XS              < LE POINT (XS,YS) EST PRIS
         STY         YS              < COMME LE POINT COURANT DU CONTOUR :
         BSR         ASPGPS          < A=NIVEAU DU POINT COURANT DU CONTOUR
                                     < CONTENU DANS 'TV1'...
         PLR         B
         STB         YS              < RESTAURATION DU POINT (XS,YS)
         PLR         B
         STB         XS              < DE L'IMAGE 'TV2'...
         LB          CTCDA
         STB         XCTCDA          < POUR ACCEDER A 'TV2'...
         BSR         ASPRPS          < ET ON TRANSFERE LE NIVEAU DU POINT
                                     < COURANT DU CONTOUR 'TV1' AU POINT
                                     < COURANT DE 'TV2'...
         STZ         XCTCDA
SETV11:  EQU         $
<
< PASSAGE AUX OPERATIONS VIRTUELLES :
<
SETV5:   EQU         $
         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,Y             < Y=INDEX MOT.
         XR          X,Y
         LA          &AIMAGV         < ACCES AU MOT COURANT...
         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         &AIMAGV         < MAJ IMAGE VIRTUELLE.
VIRT3:   EQU         $
         PLR         B,X,Y
         RSR
         PAGE
<
<
<        T E S T   D E   N U L L I T E  :
<
<
T0:      EQU         $
         FCAZ
         JNE         T01             < OK, (A,B)#0...
         FLD         F1              < SI NUL, ON LE REMPLACE PAR 1...
T01:     EQU         $
         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         $
         LRM         A,B,X
         WORD        IMAGV           < ZONE SCRATCH,
         WORD        IMAGR           < ZONE IMAGE,
         WORD        LIMAG           < NOMBRE DE MOTS A DEPLACER.
         MOVE                        < TRANSFERT SCRATCH --> RESIDENT...
         RSR
<
<
<        R A Z   D E   L A   Z O N E   S C R A T C H  :
<
<
RAZDK:   EQU         $
         LX          ALIMAG
RAZ1:    EQU         $
         ADRI        -1,X
         STZ         &AIMAGV         < ET ON CLEAR...
         ADRI        1,X
         JDX         RAZ1
         RSR
         PAGE
<
<
<        I N I T I A L I S A T I O N   P O U R   S E T ,   R E S E T  :
<
<
ARG:     EQU         $
         LR          Y,A
         MP          NMPL            < CONVERSION DE L'Y DU POINT EN
                                     < UN NUMERO DE MOT.
         ADR         B,W
         LR          X,A
         SLRS        4
         ADR         A,W             < W=ADRESSE 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,W             < A=MOT CONTENANT LE POINT (X,Y).
         RSR
<
<
<        M I S E   D ' U N   B I T   A   1  :
<
<
<        ARGUMENTS :
<                    X ET Y CONTIENNENT X ET Y DU POINT.
<                    W=ADRESSE IMAG (IMAGE VIDEO).
<
<
SET:     EQU         $
         PSR         B,X,W
         BSR         AARG            < INITIALISATIONS...
         SBT         0,X             < POSITIONNEMENT DU POINT.
         STA         0,W             < MISE A JOUR DE CE MOT.
         PLR         B,X,W
         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.
<                    W=ADRESSE IMAG (IMAGE VIDEO).
<
<
RESET:   EQU         $
         PSR         B,X,W
         BSR         AARG            < INITIALISATIONS...
         RBT         0,X             < EFFACEMENT DU POINT.
         STA         0,W             < MISE A JOUR DE CE MOT.
         PLR         B,X,W
         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.
<                    W=ADRESSE IMAG (IMAGE VIDEO).
<
<
INVER:   EQU         $
         PSR         B,X,W
         BSR         AARG            < INITIALISATIONS...
         IBT         0,X             < INVERSION VIDEO DU POINT.
         STA         0,W             < MISE A JOUR DE CE MOT.
         PLR         B,X,W
         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
         LBI         5>1             < B=NBRE DE CLIGNOTEMENTS (PAIR !!!).
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 ,
<                    W=ADRESSE IMAG.
<
<
<        RESULTAT :
<                    CARY POISITIONNE PAR LE POINT (0/1) 9
<
<
TEST:    EQU         $
         PSR         B,X,W
         BSR         AARG            < INITIALISATIONS...
         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,W
         RSR
         PAGE
<
<
<        C O M P T A G E   D ' U N   V O I S I N  :
<
<
<        FONCTION :
<                      CETTE ROUTINE INCREMENT B D'UNE UNITE
<                    SI LE POINT (X,Y) EXISTE ET EST A 1.
<
<
<        ARGUMENT ET RESULTAT : B,X,Y.
<
<
VOISI:   EQU         $
         BSR         AEXIST          < TEST DU POINT (X,Y)
         JANE        VOISI1          < (X,Y) N'EXISTE PAS OU EST A 0.
         ADRI        1,B             < (X,Y) EXISTE ET EST A 1.
         STX         POINT1+X        < SAUVEGARDE D'UN POINT A 1.
         STY         POINT1+Y        < UTILISE PAR LES CHANGEMENTS
                                     < DE POINT DE DEPART).
VOISI1:  EQU         $
         RSR
<
<
<        E X I S T E N C E   E T   V A L E U R   P O I N T  :
<
<
<        ARGUMENT :
<                    X ET Y CONTIENNENT L'X ET L'Y D'UN POINT.
<
<
<        RESULTAT :
<                    A#0 : M(X,Y) N'EXISTE PAS , OU
<                          M(X,Y) EXISTE ET M(X,Y)=0.
<
<
EXIST:   EQU         $
         LR          X,A
         JAL         NEXIST          < X INVALIDE (<0).
         CP          NPPL
         JG          NEXIST          < X INVALIDE (>NPPL).
         LR          Y,A
         JAL         NEXIST          < M(X,Y) N'EXISTE PAS : A<0#0 !!!
         CP          NLIN
         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          NLIN
         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         APIHEX          < ENTREE D'UNE COORDONNEE...
         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.
         PAGE
<
<
<        E X T R A C T I O N   D ' U N E   R A C I N E   C A R R E E  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME EXTRAIT LA
<                    RACINE CARREE D'UN NOMBRE PAR
<                    LA METHODE DE NEWTON, C'EST-A-DIRE
<                    A PARTIR DE LA SUITE :
<                    U(N+1)=(U(N)+K/U(N))/2,
<                    OU K DESIGNE LE NOMBRE DONT ON
<                    EXTRAIT LA RACINE...
<
<
<        ARGUMENT :
<                    A,B=NOMBRE DONT ON EXTRAIT LA RACINE.
<
<
<        RESULTAT :
<                    A,B=RACINE DU NOMBRE ARGUMENT.
<
<
RAC:     EQU         $
         FCAZ
         JE          RAC2            < NOMBRE=0 ==> RACINE=0...
         JG          RAC3            < OK, NOMBRE>0...
         QUIT        1               < ??!??!?!
RAC3:    EQU         $
         PSR         X,Y
         LR          A,X             < X ET
         LR          B,Y             < Y MEMORISENT LE NOMBRE ARGUMENT.
RAC1:    EQU         $
         FST         FWORK
         LR          X,A
         LR          Y,B
         FDV         FWORK           < K/U(N),
         FAD         FWORK           < U(N)+K/U(N),
         FMP         F05             < (U(N)+K/U(N))/2.
         FCAM        FWORK           < TEST DE FIN ???
         JNE         RAC1            < NON...
         PLR         X,Y
RAC2:    EQU         $
         RSR
         PAGE
         IF          MODE-VISU,XWOR%7,,XWOR%7
<
<
<        E D I T I O N   D ' U N   M E S S A G E  :
<
<
<        ARGUMENT :
<                    A=ADRESSE MOT DU MESSAGE, DONT LE
<                    PREMIER OCTET EST LA LONGUEUR.
<
<
PRINT:   EQU         $
         PSR         A,X,W
         LR          A,W
         ADR         A,A
         ADRI        1,A             < CALCUL DE L'ADRESSE OCTET DU MESSAGE.
         STA         DEMOUT+1
         LBY         0,W             < ACCES A LA LONGUEUR...
         STA         DEMOUT+2
         LAD         DEMOUT
         SVC         0               < ENVOI DU MESSAGE...
         PLR         A,X,W
         RSR
XWOR%7:  VAL         0
         PAGE
<
<
<        C O N V E R S I O N   H E X A   -->   B I N A I R E  :
<
<
<        ARGUMENT :
<                    LE BUFFER 'REP'.
<
<
<        RESULTAT :
<                    B=0 : (A)=VALEUR BINAIRE,
<                    B#0 : ERREUR DE SYNTAXE HEXA-DECIMALE.
<                    LES INDICATEURS POSITIONNES SUR (B).
<
<
HEX:     EQU         $
BASE10:  VAL         10
BASE16:  VAL         16
         PSR         X,Y
         LYI         NBRHEX
         LXI         0               < INDEX DU BUFFER DE REPONSE.
         LBI         0               < CLEAR LE REGISTRE B.
HEX1:    EQU         $
         LBY         &AREPX          < A=CARACTERE COURANT DU BUFFER.
         ADRI        -"0",A
         JAL         HEX4            < ERREUR : CARACTERE NON RECONNU.
         CPI         BASE10          < EST-CE UN CHIFFRE ???
         JL          HEX2            < OUI , C'EST UN CHIFFRE.
         ADRI        -"A"+"9"+1,A    < NON.
         CPI         BASE10          < VALIDATION.
         JL          HEX4            < ERREUR : CARACTERE NON RECONNU.
         CPI         BASE16          < VALIDATION.
         JGE         HEX4            < ERREUR : CARACTERE NON RECONNU.
HEX2:    EQU         $
         SCRS        NBITMO/NBRHEX   < MISE DES 4 BITS EN TETE DE A.
         SCLD        NBITMO/NBRHEX   < ET CONCATENATION A B.
         ADRI        1,X             < PROGRESSION DE L'INDEX.
         CPR         X,Y             < EST-CE FINI ???
         JNE         HEX1            < NON , ON CONTINUE.
         LR          B,A             < A=VALEUR BINAIRE DE (REP).
         LBI         0               < B=0 : ETOUR OK.
HEX3:    EQU         $
         PLR         X,Y
         CPZR        B               < POSITIONNEMENT DES INDICATEURS.
         RSR
<
< RETOURS EN ERREUR :
<
HEX4:    EQU         $
         LR          B,A             < A=VALEUR COURANTE...
         LBI         1               < B#0.
         JMP         HEX3            < VERS LA SORTIE ...
         PAGE
<
<
<        R E M P L I S S A G E   D ' U N   C O N T O U R  :
<
<
CONTO:   EQU         $
         STZ         FIRST           < POUR DETECTER LE PREMIER CUMUL DES
                                     < CONTOURS...
         STZ         ANGLE           < POUR LA DISCRIMINATION INTERIEUR ET
                                     < EXTERIEUR.
         STZ         ITEST
         IC          ITEST           < RETOUR AUX TESTS DIRECTS (1)...
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
         STZ         NPC0            < POUR LE COMPTAGE DES POINTS DE C(0).
         STZ         IC0             < COMPTAGE DES CONTOURS...
<
< REINITIALISATION DU CADRE DE 'TV2' :
<
         STZ         MINX
         LAI         NPOLM1
         STA         MAXX
         STZ         MINY
         LAI         NLIGM1
         STA         MAXY
XWOR%8:  VAL         0
<
<        C U M U L   D E S   3    C O M P O S A N T E S
<        D E   L ' I M A G E   R E S I D E N T E  :
<
         LX          ALIMAG
SPOR1:   EQU         $
         ADRI        -1,X
         LA          &AIMAGR
         OR          &AIMAGV
         OR          &AIMAGB
         STA         &AIMAGR         < ET ON CUMULE DANS LE ROUGE...
         STZ         &AIMAGV         < ET ON EST
         STZ         &AIMAGB         < TRES PROPRE...
         ADRI        1,X
         JDX         SPOR1
<
<        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          NLIN
         JLE         RAZE2
         ADRI        -1,Y
<
< BORDURE INFERIEURE (Y=NLIN) :
<
RAZE3:   EQU         $
         BSR         ATEST           < TEST DU POINT M(X,NLIN) ???
         JNC         RAZE3X          < NOIR...
         ADRI        -1,Y            < BLANC :
         BSR         ASET            < ON MET A BLANC LE POINT M(X,NLIN-1)...
         ADRI        1,Y
         BSR         ARESET          < ET ON MET A NOIR LE POINT M(X,NLIN).
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         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         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          NLIN            < 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,
<                    H : ENTREE PAR LE CURSEUR, RECHERCHE VERS LE HAUT,
<                    B : ENTREE PAR LE CURSEUR, RECHERCHE VERS LE BAS.
<
         CPI         "C"
         JE          CUR1            < CLIGNOTEMENT SEUL...
         LBI         -1              < VERS LE HAUT A PRIORI...
         STB         FX              < SAVE LA DIRECTION...
         CPI         "H"
         JE          CUR3            < VERS LE HAUT...
         LBI         1               < VERS LE BAS A PRIORI...
         STB         FX              < SAVE LA DIRECTION...
         CPI         "B"
         JNE         CUR1            < RIEN COMPRIS, ON RECOMMENCE.
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         BSR         AIN             < ENTREE D'UN CARACTERE "H" OU "B" :
         LBI         -1
         CPI         "H"
         JE          CUR4            < VERS LE HAUT (-1)...
         LBI         1
         CPI         "B"
         JNE         CUR1            < ????!?!
CUR4:    EQU         $
         STB         FX              < VERS LE HAUT (-1), OU VERS LE BAS (+1).
<
< ENTREE EN HEXA DES COORDONNEES :
<
         BSR         ACOORD          < ENTREE DE X.
         LR          A,X             < X=X(CURSEUR VIDEO).
         BSR         ACOORD          < ENTREE DE Y.
         LR          A,Y             < Y=Y(CURSEUR VIDEO).
XWOR%7:  VAL         0
<
< ON A UN POINT DE DEPART :
<
CUR3:    EQU         $
         STX         DEP+X
         STY         DEP+Y
<
< INITIALISATION DU DISQUE :
<
         BSR         ARAZDK
<
< RECHERCHE D'UN POINT DE DEPART :
<
         LX          DEP+X           < INITIALISATION REGISTRE X SUR DEP,
         LY          DEP+Y           < INITIALISATION DE Y SUR Y(DEP).
         BSR         ATEST           < VALIDATION DE DEP.
         JNC         DEP1            < OK, DEP=0.
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAD         M1              < ERREUR : DEP=1 !!!
         BSR         APRINT
XWOR%7:  VAL         0
         BR          ALOOP           < ABORT.
DEP1:    EQU         $
         LA          FX
         ADR         A,Y             < VERS LE HAUT (-1), OU LE BAS (+1).
         LR          Y,A
         JAL         DEP2X           < HORS DE L'IMAGE...
         CP          NLIN            < VALIDATION DE Y.
         JLE         DEP2            < OK, Y DANS L'IMAGE.
DEP2X:   EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAD         M2              < ERREUR, Y HORS L'IMAGE !!!!
         BSR         APRINT
XWOR%7:  VAL         0
         BR          ALOOP           < 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         $
<
<        M I S E   A U   N O I R   D E   L ' I M A G E
<        V I S U A L I S E E   ' T V 1 '   O U   ' T V 2 '  :
<
         CPZ         SENS            < QUEL SENS ???
         JE          RAZI3           < 2 --> 1, IL FAUT RAZER 'TV1'...
         LA          CTCDA           < 1 --> 2, IL FAUT RAZER 'TV2'...
         STA         XCTCDA          < POUR L'ACCES A 'TV2'.
RAZI3:   EQU         $
         LX          NPPL
RAZI1:   EQU         $
         LY          NLIN
RAZI2:   EQU         $
         LAI         0
         STX         XS
         STY         YS
         BSR         ASPRPS          < MISE AU NOIR (0) DE (XS,YS)...
         ADRI        -1,Y
         CPZR        Y
         JGE         RAZI2
         ADRI        -1,X
         CPZR        X
         JGE         RAZI1
         STZ         XCTCDA
<
< DEP EST NOTRE POINT DE DEPART :
<
         LX          DEP+X
         LY          DEP+Y
         BSR         ASETV           < MARQUAGE DU POINT DE DEPART.
<
<        R E C H E R C H E   D U   C O N T O U R   I N T E R I E U R  :
<
CONT1:   EQU         $
         STX         PTC+X           < SAVE LE POINT COURANT.
         STY         PTC+Y           < SAVE LE POINT COURANT.
         BSR         AROT1           < ROTATION A DROITE PRELIMINAIRE.
CONT3:   EQU         $
         BSR         AMOV            < DEPLACEMENT DU POINT (X,Y).
         STZ         ITEST           < AFIN DE TESTER LES POINTS A 0.
         BSR         AEXIST          < TEST DU POINT (X,Y).
         JAE         CONT2           < OK, (X,Y)=0 ET EXISTE (ITEST=0).
CONT5:   EQU         $
         LX          PTC+X           < RETOUR ARRIERE SUR PTC.
         LY          PTC+Y           < RETOUR ARRIERE SUR PTC.
         BSR         AROT3           < ROTATION DU VECTEUR (VX,VY).
         JMP         CONT3           < ET ON RECOMMENCE...
<
< CAS OU L'ON A TROUVE UN POINT A 0 QUI EXISTE :
<
CONT2:   EQU         $
         LBI         0               < B=COMPTEUR DES VOISINS DU POINT
                                     < TROUVE (X,Y).
         IC          ITEST           < AFIN DE TESTER LES POINTS A 1.
CONT4:   EQU         $
         LA          VX
         STA         SVX             < SAVE VX AVANT LE DECOMPTE.
         LA          VY
         STA         SVY             < SAVE VY AVANT LE DECOMPTE.
         LA          ANGLE
         STA         SANGLE          < SAVE ANGLE AVANT LE DECOMPTE.
         PSR         X,Y             < SAVE LE POINT COURANT (X,Y).
         BSR         AROT1           < ON SE PLACE A DROITE DU
                                     < MOUVEMENT (VX,VY).
         BSR         AMOV
         BSR         AVOISI          < ET ON TESTE LES 3 POINTS
                                     < IMMEDIATEMENT A DROITE DU
                                     < POINT COURANT SUIVANT LE
                                     < MOUVEMENT (VX,VY).
         BSR         AROT1
         BSR         AMOV
         BSR         AVOISI
         BSR         AROT1
         BSR         AROT1
         BSR         AMOV
         BSR         AMOV
         BSR         AVOISI
         PLR         X,Y             < RESTAURE LE POINT COURANT.
         LA          SANGLE
         STA         ANGLE           < RESTAURE ANGLE.
         LA          SVX
         STA         VX              < RESTAURE VX.
         LA          SVY
         STA         VY              < RESTAURE VY.
         CPZR        B               < LE POINT (X,Y) A-T'IL AU
                                     < MOINS 1 VOISIN ???
         JE          CONT5           < NON, ON FAIT DONC UN RETOUR ARRIERE
                                     < SUR PTC, ET ROTATION DE (VX,VY).
<
< MARQUAGE DU POINT (X,Y) :
<
         BSR         ASETV           < MARQUAGE DE (X,Y), MEME
                                     < S'IL EST LE POINT DE DEPART.
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
         CPZ         PAS             < MODE ???
         JNE         SETV22          < CAS DES CADRES SIMPLES...
         PSR         Y               < CADRES ADAPTATIFS :
         SWBR        X,B
         ORR         Y,B             < B=COORDONNEES (X,Y),
         LA          NPC0            < A=NUMERO PAR RAPPORT A 0 DU POINT
                                     < COURANT DE C(0),
         IC          NPC0            < ET COMPTAGE...
         JNE         CONT71          < OK...
         QUIT        1               < PASSAGE PAR 0 ???
CONT71:  EQU         $
         LYI         YSTORE
         BSR         AGZB            < ET AINSI, ON MEMORISE C(0).
         PLR         Y
SETV22:  EQU         $
XWOR%8:  VAL         0
         LR          X,A
         CP          DEP+X           < EST-ON AU POINT DE DEPART ???
         JNE         CONT1           < NON, AU SUIVANT...
         LR          Y,A
         CP          DEP+Y           < EST-ON AU POINT DE DEPART ???
         JNE         CONT1           < NON, AU SUIVANT...
<
< ON A LE CONTOUR INTERIEUR :
<
CONT7:   EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         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.
XWOR%7:  VAL         0
         BSR         ACONTI          < ON AMENE EN MEMOIRE IMAGE
                                     < LE CONTOUR QUE L'ON A
                                     < GENERE, CAR C'EST DE LUI
                                     < QU'ON VEUT LES LIMITES !!!
         LRM         A,B,X
         WORD        IMAGR
         WORD        IMAGB
         WORD        LIMAG
         MOVE                        < INITIALISATION DU REMPLISSAGE...
<
<        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          NLIN
         LR          B,A
         AD          AIMAG
         STA         AIMAG0          < RELAI D'ACCES A LA DERNIERE
                                     < LIGNE DE L'IMAGE.
         LY          NLIN            < 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.
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
<
< DETERMINATION DU FACTEUR D'ECHELLE :
<
         FLD         FK              < 'FK' A PRIORI...
         CPZ         IFECH           < Y-A-T'IL UNE ECHELLE DYNAMIQUE ???
         JLE         LOOK10          < NON, ON PREND BIEN 'FK'...
         FLD         F0              < OUI,
         FST         LXY             < INITIALISATION LA RECHERCHE DE LA PLUS
                                     < GRANDE LONGUEUR DANS LE CONTOUR
                                     < INTERIEUR.
         LAI         0               < A=NUMERO DU PREMIER POINT...
LOOK20:  EQU         $
         PSR         A
         BSR         AGZBL           < (B,A)=(X,Y) DU PREMIER POINT,
         STB         SAVEX           < X DU PREMIER POINT,
         STA         SAVEY           < Y DU PREMIER POINT.
         PLR         A               < A=NUMERO DU POINT DE DEPART COURANT...
         LX          NPC0            < X=NOMBRE DES TESTS A FAIRE A PARTIR DU
                                     < POINT DE DEPART COURANT,
         PSR         A,Y             < QUE L'ON RESAUVEGARDE...
LOOK11:  EQU         $
         PSR         A,X             < SAVE LE NUMERO DU POINT COURANT,
         BSR         ASPL            < ET CALCUL DE SA DISTANCE AU PREMIER
                                     < POINT...
         FCAM        LXY             < ALORS EST-ELLE MAX ???
         JLE         LOOK12          < NON...
         FST         LXY             < OUI, ON LA MEMORISE...
         CPZ         ICXCY           < ET-CE LE MODE (CX,CY) AUTOMATIQUE ???
         JGE         LOOK70          < NON, ON CONNAIT (CX,CY)...
         LR          X,A             < OUI, ON CALCULE (CX,CY),
         AD          SAVEX           < COMME LE MILIEU DE 'LXY'...
         STA         CX              < (UN PETIT PEU APRES...).
         LR          Y,A
         AD          SAVEY
         STA         CY
LOOK70:  EQU         $
LOOK12:  EQU         $
         PLR         A,X             < A=NUMERO DU POINT COURANT...
         ADRI        1,A             < PASSAGE AU POINT SUIVANT...
         CP          NPC0
         JL          LOOK21
         SB          NPC0            < CALCUL MODULO 'NPC0'...
LOOK21:  EQU         $
         JDX         LOOK11          < AU SUIVANT...
         PLR         A,Y             < A=NUMERO DU POINT DE DEPART COURANT,
         ADRI        1,A             < ET PASSAGE AU SUIVANT...
         CP          NPC0            < EXISTE-T'IL ???
         JL          LOOK20          < OUI...
         CPZ         ICXCY           < EST-CE LE MODE (CX,CY) AUTOMATIQUE ???
         JGE         LOOK71          < NON...
XWOR%9:  VAL         2=0             < OUI, POUR DIVISER PAR 2...
         LA          CX
         SLRS        XWOR%9          < ON SE PLACE AU MILIEU DE 'LXY'...
         FLT
         FAD         F05             < AFIN QUE (CX,CY) N'APPARTIENNE A
                                     < AUCUN CONTOUR...
         FST         CX
         LA          CY
         SLRS        XWOR%9
         FLT
         FAD         F05
         FST         CY
LOOK71:  EQU         $
         LAI         NLIGM1?NPOLM1   < NON,
         FLT
         FST         FWORK
         FMP         FWORK
         FST         FWORK
         FAD         FWORK           < ON CALCULE LE CARRE DE LA DIAGONALE DE
                                     < L'IMAGE 'TV2'...
         FDV         LXY             < ON CALCULE LE RAPPORT :
                                     < DIAGONALE 'TV2'/LXY...
         BSR         ARAC            < ET OUI...
LOOK10:  EQU         $
         FST         FECH            < CHOIX DU FACTEUR D'ECHELLE...
<
< INITIALISATION DU COMPTAGE DES POINTS :
<
         LA          NPC0
         STA         NPCN
         STA         NPCNM1
XWOR%8:  VAL         0
<
<
<        R E M P L I S S A G E   D U   C O N T O U R  :
<
<
<        FONCTION DES COULEURS DE L'IMAGE RESIDENTE :
<                    VERT : CONTOUR COURANT,
<                    ROUGE : SQUELETTE,
<                    BLEU : REMPLISSAGE (PAR CUMUL DES CONTOURS).
<
<
CONT18:  EQU         $
         BSR         ACONTI          < CHARGEMENT EN MEMOIRE DU
                                     < CONTOUR GENERE A L'ETAPE
                                     < PRECEDENTE.
         BSR         ARAZDK          < INITIALISATION DU CONTOUR
                                     < SUIVANT.
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
         LA          NPC0
         SLRS        1               < ON DIVISE PAR 2,
         ADRI        1,A             < PAR PRUDENCE...
         STA         AMIXY           < CE QUI DONNE LE VOISINNAGE INITIAL...
         STA         SAMIXY          < ET SAVE...
         FLD         F1
         FST         FKOREC          < FACTEUR CORRECTIF...
         LA          NPCNM1
         FLT
         FST         FWORK
         LA          NPCN
         FLT
         FDV         FWORK
         FST         FCOREC          < FCOREC=FACTEUR CORRECTIF LORSQU'ON
                                     < UTILISE C(N-1) A LA PLACE DE C(N) ;
                                     < EN GENERAL IL EST SUPERIEUR A 1...
         STZ         DELTA
         LA          NPCN
         STA         NPCNM1          < C(N-1) <-- C(N),
         STZ         NPCN            < ET INITIALISATION DE C(N)...
         IC          IC0             < COMPTAGE DES CONTOURS...
XWOR%8:  VAL         0
<
< SUPPRESSION EVENTUELLE DES POINTS 0-ISOLES OU 1-ISOLES :
<
         STZ         ITEST
         IC          ITEST
ISOL8:   EQU         $
         STZ         DOUBLE          < A CHAQUE REEXPLORATION, ON
                                     < REINITIALISE 'DOUBLE'.
         STZ         PREM
         IC          PREM            < AVANT CHAQUE TOUR, ON
                                     < INDIQUE QUE LE 1ER POINT N'A
                                     < PAS ETE RENCONTRE.
         STZ         NISOL           < INITIALISATION DU NBRE DE
                                     < POINTS AINSI ELIMINES.
         LY          YMAX            < Y=1ERE LIGNE A TESTER.
ISOL1:   EQU         $
         LX          NPPL            < INITIALISATION COORDONNE X.
ISOL2:   EQU         $
         PSR         W               < SAVE @IMAGE VIDEO.
         LR          Y,A
         MP          NMPL            < B=@ 1ER MOT DE LA LIGNE (Y).
         ADR         B,W
         LR          X,A
         SLRS        4
         ADR         A,W             < W=ADRESSE MT COURANT.
         LA          0,W             < A=MOT COURANT.
         PLR         W               < RESTAURE @IMAGE.
         CPI         'FFFF
         JE          ISOL20          < CAS D'UN MOT TOUT BLANC.
         JANE        ISOL9           < MOT PARTIELLEMENT BLANC.
ISOL20:  EQU         $
         LR          X,A             < DANS LE CAS D'UN MOT TOUT
         ANDI        'FFF0           < BLANC OU TOUT NOIR, ON
         LR          A,X             < PASSE AU PRECEDENT...
         JMP         ISOL7           < VERS LE CHANGEMENT DE MOT.
ISOL9:   EQU         $
         BSR         AEXIST          < (X,Y) EST-IL A 1 ???
         JANE        ISOL7           < NON, DONC ININTERESSANT...
         LBI         0               < B=NBRE DE VOISINS DU POINT
                                     < COURANT (X,Y).
         ADRI        1,X             < POINT (X+1,Y).
         BSR         AVOISI
         ADRI        -1-1,X          < POINT (X-1,Y).
         BSR         AVOISI
         ADRI        1,X
         ADRI        -1,Y            < POINT (X,Y-1).
         BSR         AVOISI
         ADRI        1+1,Y           < POINT (X,Y+1).
         BSR         AVOISI
         ADRI        -1,Y            < RETOUR AU POINT (X,Y).
         LR          B,A             < A=NBRE DE VOISINS DE (X,Y).
         JANE        ISOL10          < OK POINT 1-ISOLE AU MOINS...
         WORD        '1E16           < E R R E U R   P R O G !!!
ISOL10:  EQU         $
         CPI         4
         JNE         ISOL11
<
< CAS D'UN POINT A 4 VOISINS 'ORTHOGONAUX' :
<
         IC          DOUBLE          < ON LE COMPTE
         IC          DOUBLE          < 2 FOIS...
         JMP         ISOL7           < ET C'EST TOUT.
<
< CAS DES AUTRES POINTS :
<
ISOL11:  EQU         $
         CPI         1               < (X,Y) EST-IL 0-ISOLE OU
                                     < 1-ISOLE ???
         JLE         ISOL12          < OUI, ON L'ELIMINE.
         CPZ         PREM            < NON, ALORS A-T'ON DEJA
                                     < RENCONTRE LE 1ER POINT
                                     < DE L'IMAGE ???
         JE          ISOL7           < OUI, DONC PASSONS AU NEXT.
         STZ         PREM            < NON, ON EST DONC ICI
                                     < EN PRESENCE DU 1ER POINT,
         STX         DEP+X           < QUI RISQUE DE DEVENIR LE
         STY         DEP+Y           < FUTUR POINT DE DEPART...
         JMP         ISOL7           < VERS LE POINT SUIVANT...
ISOL12:  EQU         $
         BSR         ARESET          < OUI, ON L'ELIMINE.
         IC          NISOL           < ET ON COMPTE LES POINTS
                                     < AINSI EFFACES.
         LR          X,A
         CP          DEP+X           < EST-ON AU POINT DE DEPART ???
         JNE         ISOL7           < NON.
         LR          Y,A
         CP          DEP+Y           < EST-ON AU POINT DE DEPART ???
         JNE         ISOL7           < NON.
         LA          POINT1+X        < OUI : ON A DONC EFFACE LE
         STA         DEP+X           < POINT DE DEPART ELU AU TOUR
         LA          POINT1+Y        < PRECEDENT : ON LE REMPLACE
         STA         DEP+Y           < PAR UN POINT QUI EST A 1.
ISOL7:   EQU         $
         ADRI        -1,X            < CHANGEMENT DE POINT COURANT.
         CPZR        X               < EXISTE-T'IL ???
         JGE         ISOL2           < OUI.
         ADRI        -1,Y            < NON, CHANGEMENT DE LIGNE.
         LR          Y,A             < VALIDATION Y.
         CP          YMIN            < LIGNE INTERESSANTE ???
         JGE         ISOL1           < OUI.
         CPZ         NISOL           < NON, ON A FINI, ALORS
                                     < A-T'ON EFFACE AU MOINS
                                     < UN POINT ???
         JG          ISOL8           < OUI, ALORS ON RECOMMENCE,
                                     < CAR CES EFFACEMENTS ONT PU
                                     < ENGENDRES DE NOUVEAUX
                                     < POINTS 0-ISOLES OU 1-ISOLES.
<
< RECALAGE DU POINT DE DEPART POUR CHAQUE TOUR :
<
         LAI         1
         STA         VX              < VX=1,
         STZ         VY              < VY=0.
         LX          DEP+X           < POSITIONNEMENT AU POINT DE
         LY          DEP+Y           < DEPART CHOISI.
                                     < DE DEPART CHOISI.
<
<        NOTA :
<                      LE POINT DE DEPART CHOISI (DEP),
<                    EST CHOISI A UN ANGLE VERS LA
<                    GAUCHE DU CONTOUR POUR EVITER
<                    DES CISAILLEMENTS EVENTELS DE
<                    CELUI-CI.
<
<
< INITIALISATION DU NOUVEAU PARCOURS :
<
         STZ         KOMPT           < RAZ DU COMPTEUR DE REM-
                                     < PLACANTS OBTENUS LORS DU
                                     < PARCOURS AUE L'ON VA FAIRE.
         STZ         SDEP
         DC          SDEP            < SDEP<0 : A PRIORI, ON NE
                                     < CHANGERA PAS DE POINT DE
                                     < DEPART.
<
<        U N   T O U R   D E   R E M P L I S S A G E  :
<
CONT10:  EQU         $
<
< RECHERCHE PRELIMINAIRE DU FUTUR SUCCESSEUR DU POINT COURANT :
<
         STX         PTC+X           < SAUVEGARDE DU POINT
         STY         PTC+Y           < COURANT 'PTC'.
         LAD         PILR
         STA         APILR           < INITIALISATION DU POINTEUR
                                     < DE LA PILE DES REMPLACANTS.
<
< TEST A DROITE DU MOUVEMENT :
<
         BSR         AROT1           < ROTATION A DROITE.
         BSR         AMOV            < DEPLACEMENT VERS LA DROITE.
         STZ         ITEST
         IC          ITEST           < POUR LE TEST DES POINTS A 1.
         BSR         AEXIST          < EXISTENCE DU POINT A
                                     < DROITE DE PTC ???
         JAE         CONT21          < OK, SUCCESSEUR TROUVE A DROITE.
<
< TEST DEVANT LE MOUVEMENT :
<
         BSR         ASUCC           < IL SUFFIT DE TOURNER DE LA
                                     < DROITE VERS LA GAUCHE.
         JAE         CONT22          < OK, SUCCESSEUR TROUVE DEVANT.
<
< TEST A GAUCHE DU MOUVEMENT :
<
         BSR         ASUCC           < ON TOURNE ENCORE DE LA
                                     < DROITE VERS LA GAUCHE.
         JAE         CONT23          < OK, SUCCESSEUR TROUVE A GAUCHE.
<
< TEST EN ARRIERE DU MOUVEMENT :
<
         BSR         ASUCC           < DROITE VERS GAUCHE...
         JAE         CONT24          < OK, SUCCESSEUR TROUVE EN ARRIERE.
<
< CAS OU L'ON RECONTRE UN POINT ISOLE :
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAD         M3
         BSR         APRINT          < ON LE SIGNALE,
XWOR%7:  VAL         0
         BR          ALOOP           < ET ON RETOURNE A L'INTERPRETEUR...
<
< CAS OU L'ON SE DEPLACERA A DROITE :
<
CONT21:  EQU         $
         LAI         4               < AFIN D'ETRE SUR DE REINSERER
                                     < PTC DANS LE CAS D'UN VIRAGE
                                     < A DROITE...
         BSR         ASAVDP          < SAUVEGARDE DU SUCCES-
                                     < SEUR DE PTC, ET B=0.
         BSR         AREMPL          < REMPLACANT M1 (A GAUCHE
                                     < DU SUCCESSEUR 'SUC').
         BSR         AREMPL          < REMPLACANT M2 (EN ARRIERE
                                     < DE M1).
         JMP         CONT25          < VERS LE REMPLACANT M3 (A
                                     < DROITE DE M2).
<
< CAS OU L'ON SE DEPLACERA EN AVANT :
<
CONT22:  EQU         $
         LAI         1               < ON ATTEND 1 REMPLACANT.
         BSR         ASAVDP          < SAUVEGARDE DU SUCCESSEUR
                                     < DE PTC, ET B=0.
CONT25:  EQU         $               < REMPLACANT M3 (A GAUCHE
                                     < DU POINT COURANT 'PTC').
         BSR         AREMPL          < REMPLACANT M3.
         JMP         CONT26
<
< CAS OU L'ON SE DEPLACERA A GAUCHE OU EN ARRIERE :
<
CONT23:  EQU         $
CONT24:  EQU         $
         LAI         1               < ON FAIT COMME SI L'ON ATTEN-
                                     < DAIT 1 POINT, AFIN DE REINSERER
                                     < LE POINT COURANT.
         BSR         ASAVDP          < SAUVEGARDE DU SUCCESSEUR DE
                                     < PTC, ET B=0.
<
<        NOTA :
<                      DANS LE CAS DES DEPLACEMENTS A
<                    GAUCHE, ET EN ARRIERE, ON NE CHERCHE
<                    PAS DE REMPLACANTS, ILS NE SONT
<                    PAS NECESSAIRES, ET ILS RISQUE-
<                    RAIENT DE PERTURBER LA FORME DU CONTOUR !!!
<
CONT26:  EQU         $
         LR          B,A             < A=NBRE DE REMPLACANTS AINSI
                                     < TROUVES POUR PTC.
         CP          NREMPL          < A-T'ON OBTENU CE QU'ON
                                     < ATTENDAIT POUR LUI ???
         JE          CONT27          < OUI, C'EST BOB.
         LX          PTC+X           < NON, ALORS,
         LY          PTC+Y           < ...
         BSR         ASPILR          < PTC EST INSERE DANS PILR.
         ADRI        1,B             < ET ON COMPTE PTC COMME
                                     < UN REMPLACANT.
<
< DEPLACEMENT EFFECTIF SUR LE CONTOUR :
<
CONT27:  EQU         $
         STB         NPILR           < NPILR=NBRE DE POINTS EMPILES
                                     < DANS PILR ET A MARQUER SUR
                                     < LE CONTOUR QUE L'ON GENERE.
CONT50:  EQU         $
         DC          NPILR           < DECPOMPTAGE.
         JL          CONT51          < C'EST FINI...
         DC          APILR           < REGRESSION DU POINTEUR DE PILR.
         LY          &APILR
         DC          APILR           < REGRESSION DU POINTEUR DE PILR.
         LX          &APILR
CONT52:  EQU         $
         BSR         ASETV           < MARQUAGE VIRTUEL DE (X,Y).
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
         IC          NPCN            < COMPTAGE DES POINTS DE C(N)...
         JNE         CONT69          < OK...
         QUIT        1               < PASSAGE PAR 0 !!!
CONT69:  EQU         $
XWOR%8:  VAL         0
         LA          PTC+X
         CP          DEP+X           < EST-ON AU POINT DE DEPART ???
         JNE         CONT50
         LA          PTC+Y
         CP          DEP+Y           < EST-ON AU POINT DE DEPART ???
         JNE         CONT50          < NON....
         STX         SDEP+X          < SAUVEGARDE DU FUTUR
         STY         SDEP+Y          < POINT DE DEPART.
         JMP         CONT50          < AU POINT SUIVANT.
CONT51:  EQU         $
<
< RESTAURATION DU VECTEUR DEPLACEMENT MENANT AU SUCCESSEUR :
<
         LA          SVX
         STA         VX
         LA          SVY
         STA         VY
<
< PASSAGE AU SUCCESSEUR :
<
         LX          SUC+X
         LY          SUC+Y
<
< A-T'ON BOUCLE UN TOUR ????
<
         LR          X,A
         CP          DEP+X
         JNE         CONT10          < NON, TRAITEMENT DU SUCCESSEUR...
         LR          Y,A
         CP          DEP+Y
         JNE         CONT10          < NON, TRAITEMENT DU SUCCESSEUR...
<
< CAS D'UN RETOUR AU POINT DE DEPART :
<
CONT30:  EQU         $
<
<        G E N E R A T I O N   D U   N O U V E A U
<        C O N T O U R   I N T E R I E U R  :
<
         STZ         KDIFF           < PAS DE DIFFERENCE A PRIORI...
         CPZ         FIRST           < EST-CE LE PREMIER CUMUL ???
         JE          EOR1            < OUI, ON CONSERVE 'IMAGR'...
         LRM         A,B,X           < NON, ON RECUPERE LE CUMUL ANTERIEUR :
         WORD        IMAGB           < IL EST DANS LE BLEU,
         WORD        IMAGR           < ET IL VA DANS LE ROUGE...
         WORD        LIMAG
         MOVE
EOR1:    EQU         $
         IC          FIRST           < CE N'EST PLUS LA PREMIERE FOIS...
         LX          ALIMAG
EOR2:    EQU         $
         ADRI        -1,X
         LA          &AIMAGV         < ACCES A L'IMAGE VIRTUELLE...
         LB          &AIMAGR         < ACCES AU CUMUL COURANT,
         ORR         B,A             < ET ON CUMULE...
         STA         &AIMAGR         < DANS L'IMAGE COURANTE,
         STA         &AIMAGB         < ET DANS L'IMAGE DU CUMUL...
         CPR         A,B             < Y-A-T'IL UNE DIFFERENCE ???
         JE          EOR3            < NON...
         IC          KDIFF           < OUI, ON LA COMPTE...
EOR3:    EQU         $
         ADRI        1,X
         JDX         EOR2            < AU MOT SUIVANT...
         LB          SDEP+Y          < EVENTUEL FUTUR Y(DEP),
         LA          SDEP+X          < EVENTUEL FUTUR X(DEP).
         CPZ         SDEP            < SDEP EST-IL VALIDE ???
         JGE         CONT40          < OUI, CHANGEMENT DEP PAR SDEP.
         WORD        '1E16           < E R R E U R   P R O G  !!!
CONT40:  EQU         $
         STA         DEP+X
         STB         DEP+Y
         LA          KOMPT           < AU COURS DE CE TOUR, UN
                                     < REMPLACANT AU MOINS A-T'IL
                                     < ETE TROUVE ???
         JAG         MOOP            < OUI, IL FAUT FAIRE UN
                                     < NOUVEAU PARCOURS.
NLOOP:   EQU         $
         BR          ALOOP           < NON, L'IMAGE RESIDENTE
                                     < ET LE CONTOUR REMPLI ATTEN-
                                     < DU, ALORS QUE LA ZONE SCRATCH
                                     < CONTIENT LE SQUELETTE.
MOOP:    EQU         $
         CPZ         KDIFF           < Y-A-T'IL EU DES DIFFERENCES ???
         JE          NLOOP           < NON, ON ABANDONNE !!!
         CP          PKOMPT          < A-T'ON REMPLACE AUTANT
                                     < DE POINTS QU'AU TOUR
                                     < PRECEDENT ???
         STA         PKOMPT          < MAJ A PRIORI...
         JNE         LOOP1           < NON, ON VA FAIRE UN
                                     < NOUVEAU TOUR...
<
< CAS OU LE SYSTEME PARAIT OSCILLER :
<
         IC          OSCIL           < COMPTAGE DE L'OSCILLATION.
         LA          OSCIL
         CP          MOSCIL          < ABORT OU PAS ???
         JGE         NLOOP           < OUI, RETOUR A GE.
         JMP         CONT19          < NON, ON ATTEND ENCORE...
<
< CAS DU FONCTIONNEMENT NORMAL :
<
LOOP1:   EQU         $
         STZ         OSCIL           < REINITIALISATION DE OSCIL.
CONT19:  EQU         $
         IF          VERSIO-XXV2,XWOR%8,,XWOR%8
         LA          MINX
         AD          PAS
         JAL         ETI1            < 'PAS' DEVIENT MAUVAIS...
         CPI         X20?X21/2
         JL          ETI2            < 'PAS' EST ENCORE BON...
ETI1:    EQU         $
         LA          PAS
         NGR         A,A             < SI 'PAS' EST MAUVAIS, ON L'INVERSE...
         STA         PAS
ETI2:    EQU         $
<
< MODIFICATION DU CADRE DE 'TV2' :
<
         LA          MINX
         AD          PAS
         STA         MINX
         LA          MAXX
         SB          PAS
         STA         MAXX
         LA          MINY
         AD          PAS
         STA         MINY
         LA          MAXY
         SB          PAS
         STA         MAXY
XWOR%8:  VAL         0
         BR          ACONT8          < VERS UN TOUR DE PLUS.
         PAGE
<
<
<        F I N   D E   L ' O V E R L A Y  :
<
<
XWOR%1:  VAL         $-DEBOV1*NOCMO
LOVL2:   EQU         ZERO+XWOR%1
         IF          BUFIN-$,,,XWOR%
         IF          ATTENTION : L'OVERLAY RECOUVRE LA
         IF          ZONE EN RECOUVREMENT DE L'ITEM2 !!!
XWOR%:   VAL         0
         PAGE
<
<
<        G E N E R A T I O N   E T   V A L I D A T I O N  :
<
<
XWOR%1:  VAL         ITEM2-BRANCH
         IF          $-DEBOV1-XWOR%1,XWOR%,,
         IF          ATTENTION : LA BRANCHE D'OVERLAY EST TROP LONGUE !!!
XWOR%:   VAL         0
         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.