NMPROC:  VAL         "GL"            < NOM DU PROCESSEUR.
         IDP         "GL - RELEASE 05/03/1980"
         EOT         #SIP DEFINITION CMS5#
         EOT         #SIP DEF PROCESSEUR#
         PROG
         WORD        IMAGE           < ENTRY POINT DU GENERATEUR.
         WORD        0
PIMAGE:  EQU         $               < P='12 !!!
         LRP         L
         BR          -2,L            < ENTREE DANS LE PROCESSEUR.
         EOT         #SIP DEFINITION ITEM#
ITEM1:   EQU         ZERO+PILE-LTNI
ITEM2:   EQU         ZERO+PILE-LTNI-LTNI
         PAGE
<
< PILE DU PROGRAMME :
<
SSTACK:  VAL         60              < IL FAUT CE QU'IL FAUT...
STACK:   DZS         SSTACK
         EOT         #SIP IMAGE 256#
NOM:     EQU         ZERO+PILE+5-LNOM-2  < NOM DE L'IMAGE VIDEO.
IMAG:    EQU         NOM+LNOM+2      < IMAGE VIDEO.
         IF          ORDI-"S",XWOR%,,XWOR%
ENTIM:   EQU         IMAG-LENTIM     < EN-TETE DE L'IMAGE (TRACE VIDEO
                                     < CMS5 SOLAR).
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
<
< BUFFER DES SECTEURS SCRATCHES :
<
SECTOR:  EQU         STACK+SSTACK
         DZS         128             < CELA PEUT TOUJOURS SERVIR !!!
         PAGE
<
<
<        L O C A L  :
<
<
         TABLE
M9:      BYTE        5;'6D
         ASCI        "RAZ?"
M10:     BYTE        35;'6D
         ASCI        "MODE (AD=1/SB=2/OR=3/AND=4/EOR=5)="
M1:      BYTE        10;'6D
         ASCI        "TAILLE X= "
M2:      BYTE        10;'6D
         ASCI        "TAILLE Y= "
M3:      BYTE        10;'6D
         ASCI        "TREILLIS? "
         IF          ORDI-"S",XWOR%,,XWOR%
M31:     BYTE        7;'6D
         ASCI        "VIDEO?"
XWOR%:   VAL         0
M4:      BYTE        15;'6D
         ASCI        "GRAPHIQUE ZDC?"
M5:      BYTE        4;'6D
         ASCI        "NE? "
M6:      BYTE        3;'6D
         ASCI        "N?"
M7:      BYTE        4;'6D
         ASCI        "NW? "
M8:      BYTE        3;'6D
         ASCI        "W?"
M11:     BYTE        15;'6D
         ASCI        "POINTS ISOLES?"
M12:     BYTE        7;'6D
         ASCI        "PAS X="
M13:     BYTE        7;'6D
         ASCI        "PAS Y="
M14:     BYTE        8;'6D
         ASCI        "DELTAX= "
M15:     BYTE        8;'6D
         ASCI        "DELTAY= "
         LOCAL
LOC:     EQU         $
<
< RELAIS A METTRE EN TETE DU LOCAL AFIN
< D'ABSOLUTISER LES DEPLACEMENTS D'ACCES SIMPLIFIANT
< AINSI L'ECRITURE DES SOUS-PROGRAMMES EN OVERLAY
< IMPLEMENTES DANS L'ITEM2 :
<
<        RESET       00 ('80)
ARESET:  WORD        RESET           < MISE D'UN POINT A 0.
<        SET         01 ('81)
ASET:    WORD        SET             < MISE D'UN POINT A 1.
<        INVER       10 ('82)
AINVER:  WORD        INVER           < INVERSION D'UN POINT.
<        TEST        11 ('83)
ATEST:   WORD        TEST            < TEST DE L'ETAT D'UN POINT.
<        EXISTENCE
AVOISE:  WORD        VOISE           < TEST ETAT ET EXISTENCE.
<
< MESSAGES :
<
AM1:     WORD        M1
AM2:     WORD        M2
AM3:     WORD        M3
         IF          ORDI-"S",XWOR%,,XWOR%
AM31:    WORD        M31
XWOR%:   VAL         0
AM4:     WORD        M4
AM5:     WORD        M5
AM6:     WORD        M6
AM7:     WORD        M7
AM8:     WORD        M8
AM11:    WORD        M11
AM9:     WORD        M9
AM10:    WORD        M10
AM12:    WORD        M12
AM13:    WORD        M13
AM14:    WORD        M14
AM15:    WORD        M15
CURSOR:  BYTE        "N";0           < CARACTERE DE DEBLOCAGE DU
                                     < CURSEUR (ERREUR A PRIORI).
         DZS         2               < COORDONNEES Y ET X.
REP:     DZS         2               < ENTREE DE NBRES HEXADECIMAUX.
<
< DEMANDES A CMS4 :
<
DEMSGN:  WORD        '0602           < CHARGEMENT DES OVERLAYS.
         WORD        BRANCH-ZERO*2
         WORD        ZERO-BRANCH+PILE-LTNI-LTNI*2
         WORD        -1
DEMCCI:  WORD        '0001           < APPEL DU CCI INTERACTIF.
DEMMEM:  WORD        '0004           < DEMANDE D'ALOCATION 8K MOTS.
RELMEM:  WORD        '0004           < DEMANDE D'ALLOCATION 4K MOTS.
         WORD        '4000
         WORD        '2000
DEMOUT:  WORD        '0202           < ECRITURE DES MESSAGES.
         WORD        0
         WORD        0
DEMIN:   WORD        '0101           < ENTREE SUR '01.
         WORD        REP-ZERO*2
         WORD        4
DEMREP:  WORD        '0101           < LECTURE 1 CARACTERE REPONSE.
         WORD        REP-ZERO*2
         WORD        1
OG:      WORD        '0103           < OPEN GRAPHIQUE DE '01.
CU:      WORD        '0106           < MISE EN FONCTION DU CURSEUR
         WORD        0               < GRAPHIQUE DE '01 (AMDEM=0).
LCU:     WORD        '0109           < LECTURE CURSEUR GRAPHIQUE
         WORD        CURSOR-ZERO*2   < DE '01.
         WORD        6
CG:      WORD        '0104           < CLOSE GRAPHIQUE DE '01.
RDK:     WORD        '0C00           < LECTURE SCRATCH DU DISQUE.
         WORD        SECTOR-ZERO*2
         WORD        128*2
         WORD        0               < NUMERO DU SECTEUR.
WDK:     WORD        '0C02           < ECRITURE SCRATCH DU DISQUE.
         WORD        SECTOR-ZERO*2
         WORD        128*2
         WORD        0               < NUMERO DU SECTEUR.
LOADI:   WORD        '0502           < RECUPERATION D'UNE IMAGE.
         WORD        NOM-ZERO*2
         WORD        LIMAG+LNOM+2*2
         WORD        2*LNOM
DELI:    WORD        '0302           < DELETE D'UNE IMAGE.
         WORD        NOM-ZERO*2
         WORD        LIMAG+LNOM+2*2
         WORD        2*LNOM
STORI:   WORD        '0402
         WORD        NOM-ZERO*2
         WORD        LIMAG+LNOM+2*2
         WORD        2*LNOM
<
< CONSTANTES :
<
KIN:     WORD        -1              < COMPTEUR DES ENTRIES DANS KO.
NGE:     WORD        "GE"            < NOM DU PROCESSEUR GE.
NMOTS:   WORD        2*LTNI          < NBRE DE MOTS DE ITEM1+ITEM2.
ALIMAG:  WORD        LIMAG           < NBRE DE MOTS DE L'IMAGE.
NMPL:    WORD        CNMPL           < NBRE MOTS DE 16 BITS PAR LIGNE.
NLIG:    WORD        1024/DY-1       < NBRE DE LIGNES/IMAGE-1.
NPPL:    WORD        CNMPL*16-1      < NBRE DE POINTS/LIGNE-1.
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.
INDIC:   WORD        0               < RESULTAT (0/1) DES TESTS
                                     < VIRTUELS.
SAVE:    WORD        0               < VARIABLE TEMPORAIRE DE 'PS'.
SIZEX:   WORD        0               < TAILLE DES RECTANGLES SUR OX,
SIZEY:   WORD        0               < TAILLE DES RECTANGLES SUR OY.
NLIG2:   WORD        0               < NBRE DE RECTANGLES SUR OY,
NPPL2:   WORD        0               < NBRE DE RECTANGLES SUR OX.
KSIZEX:  WORD        0               < 'SIZEX' TEMPORAIRE,
KSIZEY:  WORD        0               < 'SIZEY' TEMPORAIRE.
KPT:     WORD        0               < NBRE DE POINTS DANS UN RECTANGLE.
XC:      DZS         2               < SOMME DES X DES POINTS INTERIEIURS
                                     < A UN RECTANGLE,
YC:      DZS         2               < SOMME DES Y DES POINTS INTERIEURS
                                     < A UN RECTANGLE.
XREC:    WORD        0               < X HAUT GAUCHE RECTANGLE,
YREC:    WORD        0               < Y HAUT GAUCHE RECTANGLE.
INDNE:   WORD        0               < =0 : EXPLORER NE.
INDN:    WORD        0               < =0 : EXPLORER N.
INDNW:   WORD        0               < =0 : EXPLORER NW.
INDW:    WORD        0               < =0 : EXPLORER W.
ISOL:    WORD        0               < =0 : VISUALISER LES CENTRES DE
                                     < GRAVITE ISOLES D'UN TREILLIS.
PASX:    WORD        0               < PAS DE PARCOURS DE RECONSTRUCTION
                                     < DES TREILLIS EXPRIME EN NBRE
                                     < DE RECTANGLES SUR OX.
PASY:    WORD        0               < (DE MEME QUE PASX).
DELTAX:  WORD        0               < PAS DE TEST DES VOISINS LORS
                                     < DE LA RECONSTRUCTION D'UN TREILLIS;
                                     < CELUI-CI EST EXPRIME EN NBRE
                                     < DE RECTANGLES SUR OX.
DELTAY:  WORD        0               < (DE MEME QUE DELTAX).
<
< SEGMENT D'INTERFACE ZDC :
<
NOMSEG:  WORD        0               < MOT DE VALIDATION.
SEG:     DZS         4
SEGORG:  EQU         SEG+0           < ORIGINE D'UN SEGMENT.
SEGEXT:  EQU         SEG+2           < EXTREMITE D'UN SEGMENT.
LONSEG:  VAL         $-NOMSEG*2
AIMAGZ:  WORD        IMAG-1,X        < RELAI POUR RAZER L'IMAGE.
         IF          ORDI-"T",XWOR%,,XWOR%
ADICO:   WORD        DICO            < DICHOTOMIE D'UN SEGMENT.
XWOR%:   VAL         0
ATRACE:  WORD        TRACE           < TRACE DICHOTOMIQUE D'UN
                                     < SEGMENT VIDEO.
IGRAPH:  WORD        0               < 0=EMETTRE PAR LA ZDC 'SEG'.
<
< INTERFACE D'ACCES ZDC :
<
STOGS:   WORD        '000A
         WORD        NOMSEG-ZERO*2
         WORD        LONSEG
         WORD        'FFC0
GETGS:   WORD        '0008
         WORD        NOMSEG-ZERO*2
         WORD        SEG-NOMSEG*2
         WORD        'C000
ASTORE:  WORD        STORE           < ENVOI SEGMENT DANS ZDC.
         IF          ORDI-"S",XWOR%,,XWOR%
DMDIFF:  WORD        '8A01           < DIFFUSION (ET TRACE EVENTUEL) VIDEO.
         WORD        IMAG-ZERO*2
         WORD        LIMAG*2
         WORD        2               < OUT VERT.
XWOR%:   VAL         0
<
< RELAIS DIVERS :
<
ATYP:    WORD        ITEM2+IINDIC    < ACCES AU TYPE DE L'ITEM2.
AITEM2:  WORD        ITEM2+LTN       < POINT D'ENTREE D'UN SOUS-
                                     < PROGRAMME EN OVERLAY
                                     < DANS L'ITEM2.
ASECT:   WORD        SECTOR-1,X      < RELAI DE RAZ BUFFER SECTEUR.
AIMAG1:  WORD        IMAG,X          < ACCES A L'IMAGE VIDEO COURANTE.
AIMAG0:  WORD        0               < POUR METTRE LES SECTEURS
                                     < SCRATCH DANS L'IMAGE COURANTE.
ASECT1:  WORD        SECTOR,X        < ACCES AU SECTEUR COURANT.
AIMAG:   WORD        IMAG-1,X        < RELAI DE RAZ IMAGE COURANTE.
AREP:    WORD        REP,X           < RELAI D'ACCES AUX REPONSES.
ATREC:   WORD        TREC            < TEST RECTANGLE VIDE ???
ASETV:   WORD        SETV            < MISE D'UN POINT VIRTUEL A 1.
ARSETV:  WORD        RSETV           < MISE D'UN POINT VIRTUEL A 0.
AINVEV:  WORD        INVEV           < INVERSION D'UN POINT VIRTUEL.
ATESTV:  WORD        TESTV           < TEST D'UN POINT VIRTUEL.
AXISTV:  WORD        XISTV           < EXISTENCE VIRTUELLE...
APS:     WORD        PS              < SBT.
APR:     WORD        PR              < RBT.
API:     WORD        PI              < IBT.
APT:     WORD        PT              < TBT.
AOP:     WORD        0               < PS/PR/PI/PT SUIVANT LES BESOINS.
AOVL:    WORD        OVL             < CHARGEMENT DES OVERLAYS.
AEXIST:  WORD        EXIST           < EXISTENCE D'UN POINT.
APILE:   WORD        PILE-1          < PILE DE SMC.
ASTACK:  WORD        STACK-1         < PILE DE KO.
AI1:     WORD        ITEM1-1,X       < RELAI DE RAZ ITEM1.
AI2:     WORD        ITEM2-1,X       < RELAI DE RAZ ITEM1+ITEM2.
AGOGE:   WORD        GOGE            < RETOUR A GE.
APRINT:  WORD        PRINT           < EDITION DES MESSAGES.
AINTER:  WORD        INTER           < INTERROGATION OUI/NON.
AHEX:    WORD        HEX             < CONVERSION ASCI --> BINAIRE.
ACOORD:  WORD        COORD           < ENTREE COORDONNE X/Y.
ACOEF:   WORD        COEF            < ENTREE RAPPORT DE ZOOM.
APAS:    WORD        PAS             < ENTREE D'UN PAS (#0).
ACONTI:  WORD        CONTI           < RETOUR DE LA ZONE SCRATCH
                                     < EN MEMOIRE.
ARAZDK:  WORD        RAZDK           < RAZ DE LA ZONE SCRATCH DK.
AINS:    WORD        INS             < INSTRUCTION VARIABLE DE 'PS'.
ACODE:   WORD        CODE,X          < LISTE DES CODES POSSIBLES
                                     < POUR 'INS' (L'OCTET 0
                                     < EN CONTIENT LE NOMBRE).
CODE:    EQU         $
         BYTE        5;'89;'88;'92;'93;'94
<
< CONSTANTES DICHOTOMIQUES :
<
DICOX:   WORD        0               < X DU POINT VIDEO COURANT M.
DICOY:   WORD        0               < Y DU POINT VIDEO COURANT M.
DICOX1:  WORD        0               < X DE L'ORIGINE VIDEO COURANTE M1.
DICOY1:  WORD        0               < Y DE L'ORIGINE VIDEO COURANTE M1.
DICOX2:  WORD        0               < X EXTREMITE VIDEO COURANTE M2.
DICOY2:  WORD        0               < Y EXTREMITE VIDEO COURANTE M2.
<
< TOPOGRAPHIE MEMOIRE :
<
NSEC:    VAL         LIMAG/128       < NRE DE SECTEURS POUR UNE IMAGE.
XSECR:   VAL         2*LTNI-128
NSECR:   VAL         XSECR/128       < NBRE DE SECTEURS RESIDANTS
                                     < SI PAS DE TRANSFORMATION.
XSECRT:  VAL         LTNI-128
NSECRT:  VAL         XSECRT/128      < NBRE DE SECTEURS RESIDANTS
                                     < SI TRANSFORMATION.
ANCIEN:  WORD        1               < EST INCREMENTE DE 1 A CHAQUE
                                     < MODIFICATION DE LA MEMOIRE
                                     < VIRTUELLE (CONSTITUE DONC
                                     < UNE HORLOGE).
ALS:     WORD        LSECT-1,X       < RELAI D'INITIALISATION DE
                                     < LA LISTE LSECT.
ALSECT:  WORD        LSECT,X         < REALI D'ACCES A LSECT.
ATOPO:   WORD        TOPO-1,X        < RELAI D'ACCES A TOPO.
ASECTC:  WORD        0               < RELAI COURANT D'ACCES A UN
                                     < SECTEUR MANIPULE.
AUSE:    WORD        USE-1,X         < RELAI D'ACCES A USE.
INFINI:  WORD        '7FFF
CSECT:   WORD        0               < MEMORISE LE SECTEUR COURANT.
WDKT:    WORD        '0C02           < ECRITURE 1 SECTEUR TOPO.
         WORD        0
         WORD        128*2
         WORD        0
RDKT:    WORD        '0C00           < LECTURE 1 SECTEUR TOPO.
         WORD        0
         WORD        128*2
         WORD        0
ABUF1:   WORD        PILE-XSECR/128*128*2
                                     < @OCTET DU 1ER BUFFER LIBRE.
ABUF:    WORD        PILE-XSECR/128*128*2
                                     < 1ER BUFFER LIBRE SI PAS TRANS.
ABUFT:   WORD        PILE-XSECRT/128*128*2
                                     < 1ER BUFFER LIBRE SI TRANS.
ANSECR:  WORD        NSECR           < NBRE DE SECTEURS RESIDANTS
                                     < INITIALISE SUR 'PAS TRANS'.
AWSE:    WORD        WSE             < ROUTINE DE REECRITURE
                                     < D'UN SECTEUR TOPO.
AVIRE:   WORD        VIRE            < ROUTINE SUPPRIMANT LA TOPO.
ARESID:  WORD        RESID           < REND LE SECTEUR SCRATCH (B)
                                     < RESIDENT EN MEMOIRE.
<
< LISTE DES SECTEURS REELS (DE 0 A NSEC-1) :
<
LSECT:   EQU         $
         DO          NSEC
         WORD        -1              < INITIALEMENT NON RESIDENT.
<
< LISTE D'OCCUPATION DES BUFFERS (DE 1 A NSECR) :
<
TOPO:    EQU         $
         DO          NSECR
         WORD        -1              < INOCCUPE INITIALEMENT.
<
< COMPTEUR D'USAGE DES BUFFERS :
<
USE:     EQU         $
         DO          NSECR
         WORD        0               < INUTILISE INITIALEMENT.
         PAGE
         PROG
<
<
<        E D I T I O N   D ' U N   M E S S A G E  :
<
<
<        ARGUMENT :
<                    A=@MESSAGE.
<
<
PRINT:   EQU         $
         PSR         C,X
         LR          A,C             < C=@MESSAGE.
         ADR         A,A
         ADRI        1,A             < A=@OCTET DU MESSAGE.
         STA         DEMOUT+1
         LBY         0,C             < A=LONGUEUR DU MESSAGE.
         STA         DEMOUT+2
         LAD         DEMOUT
         SVC         0               < EDITION DU MESSAGE.
         PLR         C,X
         RSR
<
<
<        I N T E R R O G A T I O N  :
<
<
<        ARGUMENT :
<                    A=@MESSAGE A EMETTRE.
<
<
<        RESULTAT :
<                    B=0 : REPONSE=OUI,
<                      1 : REPONSE=NON,
<                    CARRY POSITIONNE PAR UN 'CPZR B'.
<
<
INTER1:  EQU         $
         LR          Y,A             < RESTAURE A=@MESSAGE.
INTER:   EQU         $
         LR          A,Y             < SAVE Y=@MESSAGE.
         BSR         APRINT          < EMISSION DU MESSAGE (A).
         LAD         DEMREP
         SVC         0               < ENTREE DE LA REPONSE.
         LBI         0               < B=0 (OUI A PRIORI).
         LBY         REP             < A=CARACTERE REPONDU.
         CPI         "O"
         JE          INTER2          < OUI.
         LBI         1               < B=1 (NON A PRIORI).
         CPI         "N"
         JNE         INTER1          < INCOMPREHENSIBLE...
INTER2:  EQU         $
         CPZR        B               < POSITIONNEMENT CODES CONDITION.
         RSR
         PAGE
         IF          ORDI-"T",XWOR%,,XWOR%
<
<
<        T R A C E   D I C H O T O M I Q U E   D ' U N   S E G M E N T  :
<
<
DICO:    EQU         $
         LA          DICOX1          < A=X1.
         AD          DICOX2          < A=X1+X2.
         SLRS        1               < A=(X1+X2)/2.
         STA         DICOX           < X DU MILIEU DE M1M2.
         LA          DICOY1          < A=Y1.
         AD          DICOY2          < A=Y1+Y2.
         SLRS        1               < A=(Y1+Y2)/2.
         STA         DICOY           < Y DU MILIEU DE M1M2.
<
< POSITION DE M PAR RAPPORT A M1 :
<
         SB          DICOY1          < A=Y-Y1.
         JANE        DICO31          < M#M1.
         LA          DICOX           < A=X.
         SB          DICOX1          < A=X-X1.
         JAE         DICO32          < M=M1.
<
< POSITION DE M PAR RAPPORT A M2 :
<
DICO31:  EQU         $
         LA          DICOY           < A=Y.
         SB          DICOY2          < A=Y-Y2.
         JANE        DICO30          < M#M2 ET M#M1.
         LA          DICOX           < A=X.
         SB          DICOX2          < A=X-X2.
         JANE        DICO30          < M#M2 ET M#M1.
<
< CAS OU M=M1 OU M=M2 :
<
DICO32:  EQU         $
         LX          DICOX
         LY          DICOY
         BSR         ASET            < AFFICHAGE DU POINT M=(M1+M2)/2.
         RSR                         < ARRET PROVISOIRE DE LA DICHOTOMIE
                                     < DESCENDANTE.
<
< CAS OU M#M1 ET M#M2 :
<
DICO30:  EQU         $
         LA          DICOX2          < A=X2.
         LB          DICOY2          < B=Y2.
         PSR         A,B             < SAVE LE POINT M2 COURANT.
         LA          DICOX           < A=X.
         STA         DICOX2          < X2<--X.
         LA          DICOY           < A=Y.
         STA         DICOY2          < Y2<--Y.
         BSR         ADICO           < DICHOTOMIE SUR LE SEGMENT M1M.
         LX          DICOX2          < X=X2.
         LY          DICOY2          < Y=Y2.
         BSR         ASET            < AFFICHAGE DU POINT M2.
         STX         DICOX1          < X1<--X2.
         STY         DICOY1          < Y1<--Y2.
         PLR         A,B             < RESTAURATION DU POINT M2 APRES
                                     < LE CHANGEMENT DU POINT M1.
         STA         DICOX2          < RESTAURE X2.
         STB         DICOY2          < RESTUARE Y2.
         JMP         DICO            < VERS LA POURSUITE DE LA DICHOTOMIE.
<
<
<        T R A C E   D ' U N   S E G M E N T   V I D E O  :
<
<
TRACE:   EQU         $
         PSR         X,Y,C
<
< MODE GRAPHIQUE ???
<
         CPZ         IGRAPH
         JNE         TRACE1          < NON, JUSTE VIDEO.
         LA          DICOX1
         SLLS        DEDX
         STA         SEGORG+X        < X(ORIGINE GRAPHIQUE).
         LA          DICOY1
         SB          NLIG
         NGR         A,A
         SLLS        DEDY
         STA         SEGORG+Y        < Y(ORIGINE GRAPHIQUE).
         LA          DICOX2
         SLLS        DEDX
         STA         SEGEXT+X        < X(EXTREMITE GRAPHIQUE).
         LA          DICOY2
         SB          NLIG
         NGR         A,A
         SLLS        DEDY
         STA         SEGEXT+Y        < Y(EXTREMITE GRAPHIQUE).
         BSR         ASTORE          < ENVOI DU SEGMENT EN ZDC.
TRACE1:  EQU         $
<
< TRACE DICHOTOMIQUE DU SEGMENT :
<
         LX          DICOX1          < X=X1.
         LY          DICOY1          < Y=Y1.
         PSR         X,Y             < SAVE M1.
         BSR         ASET            < AFFICHAGE DU POINT M1.
         BSR         ADICO           < TRACE DU SEGMENT M1M2.
         LX          DICOX2          < X=X2.
         LY          DICOY2          < Y=Y2.
         BSR         ASET            < AFFICHAGE DU POINT M2.
         PLR         X,Y
         STX         DICOX1          < RESTORE M1.
         STY         DICOY1          < RESTORE M1.
         PLR         X,Y,C
         RSR
XWOR%:   VAL         0
<
<
<        E N V O I   E N   Z D C  :
<
<
STORE:   EQU         $
         LAD         GETGS
         SVC         0
         CPZ         NOMSEG          < LE SEGMENT PRECEDENT A-T'IL
                                     < ETE ACQUITTE ???
         JNE         STORE           < NON, ON ATTEND.
         DC          NOMSEG          < OUI, VALIDONS LE SUIVANT.
         LAD         STOGS
         SVC         0               < QUE L'ON ENVOIE.
         RSR
         PAGE
         IF          ORDI-"S",XWOR%,,XWOR%
<
<        T R A C E   V I D E O   D ' U N   S E G M E N T   E N   S O L A R.
<
<        (C'EST LE SYSTEME CMS5 QUI SE CHARGERA DE L'INTERPOLATION !).
<
<
<
TRACE:   EQU         $
<
< PROLOGUE: SAUVEGARDE DES REGISTRES UTILISES ET SAUVEGARDE DANS LA PILE
< (QUI EST GRANDE !) DE LA ZONE QU'ON VA UTILISER POUR CONSTRUIRE L'EN-TETE
< DE L'IMAGE.
<
         PSR         A,B,X,W
<
         LR          K,B
         ADRI        1,B             < ZONE RECEPTRICE.
         LRM         A,X,W
         WORD        ENTIM           < ZONE EMETTRICE (A SAUVER DANS LA PILE).
         WORD        LENTIM          < LONGUEUR EN-TETE IMAGE.
         WORD        ENTIM           < POUR BASER L'EN-TETE.
         MOVE
         ADRI        LENTIM,K        < MISE A JOUR DE 'K'.
<
< ICI, ON A SAUVEGARDE LA ZONE DE CONSTRUCTION DE L'EN-TETE DANS LA PILE,
< ON VA CONSTRUIRE L'EN-TETE ET FAIRE LA DEMANDE D'INTERPOLATION VIDEO.
<
< CONVERSION DES COORDONNEES VIDEO EN COORDONNEES GRAPHIQUES.
<
         LA          DICOX1          < X1 VIDEO.
         SLLS        DEDX
         STA         DEPX1,W         < X1 GRAPHIQUE.
         LA          DICOX2          < X2 VIDEO.
         SLLS        DEDX
         STA         DEPX2,W         < X2 GRAPHIQUE.
         LA          DICOY1          < Y1 VIDEO.
         SB          NLIG
         NGR         A,A
         SLLS        DEDY
         STA         DEPY1,W         < Y1 GRAPHIQUE.
         LA          DICOY2          < Y2 VIDEO.
         SB          NLIG
         NGR         A,A
         SLLS        DEDY
         STA         DEPY2,W         < Y2 GRAPHIQUE.
<
< POSITIONNEMENT DU MODE DE TRACE ('SBT').
<
         STZ         DEPMOD,W
         IC          DEPMOD,W
         LRM         A,X
         WORD        ENTIM-ZERO*2    < ADRESSE OCTET EN-TETE IMAGE.
         WORD        LENTIM+LIMAG*2  < LONGUEUR OCTETS EN-TETE + IMAGE.
         STA         DMDIFF+1
         STX         DMDIFF+2
         LAD         DMDIFF           < DEMANDE INTERPOLATION ET AFFICHAGE.
         SVC         0
         LRM         A,X
         WORD        IMAG-ZERO*2     < RESTAURATION ADRESSE ET
         WORD        LIMAG*2         < LONGUEUR IMAGE DANS LA DEMANDE.
         STA         DMDIFF+1
         STX         DMDIFF+2
<
< EPILOGUE (FAIRE COMME SI ON N'AVAIT RIEN TOUCHE...).
<
         ADRI        -LENTIM,K       < RESTAURATION DE 'K'.
         LR          K,A
         ADRI        1,A             < ZONE EMETTRICE.
         LRM         B,X
         WORD        ENTIM           < ZONE RECEPTRICE (A RESTAURER).
         WORD        LENTIM          < LONGUEUR.
         MOVE
<
         PLR         A,B,X,W
         RSR
XWOR%:   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         $
         STA         SAVE            < SAUVEGARDE TEMPORAIRE DU
                                     < MOT COURANT DE L'IMAGE.
         LAI         0               < GENERATION D'UN
         SBT         0,X             < MASQUE.
INS:     OR          SAVE            < INSTRUCTION VARIABLE (AD,
                                     < SB, OR, AND, EOR) ENTRE
                                     < LE MASQUE ET LE MOT COURANT.
         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         $
         LA          APS             < SBT.
         JMP         VIRT
RSETV:   EQU         $
         LA          APR             < RBT.
         JMP         VIRT
TESTV:   EQU         $
         LA          APT             < TBT.
         JMP         VIRT
INVEV:   EQU         $
         LA          API
VIRT:    EQU         $
         STA         AOP             < MISE EN PLACE DE LA ROUTINE
                                     < VARIABLE...
         PSR         B,X,Y
         LR          Y,A
         MP          NMPL            < B=NUMERO 1ER MOT DE LA LIGNE
                                     < CONTENANT LE POINT ARGUMENT.
         LR          X,A
         SLRS        4
         ADR         A,B             < B=NUMERO DU MOT CONTENANT
                                     < LE POINT ARGUMENT.
         LAI         '0F
         ANDR        A,X             < X=NUMERO DU BIT REPRESENTANT
                                     < LE POINT ARGUMENT DANS LE
                                     < MOT (B).
         LR          B,A
         SLRD        7               < A=NUMERO DU SECTEUR LE CONTENANT.
         XR          A,B             < B=NUMERO DU SECTEUR.
         SLRS        9               < A=NUMERO DU MOT DANS LE SECTEUR.
         LR          A,Y             < Y=NUMERO DU MOT DANS LE SECTEUR.
         BSR         ARESID          < REND LE SECTEUR (B) RESIDENT.
         XR          X,Y             < X=NUMERO MOT, Y=NUMERO BIT.
         LA          &ASECTC         < ACCES MOT.
         XR          X,Y             < X=NUMERO BIT, Y=NUMERO MOT.
         BSR         AOP             < EXECUTION OPERATION SPECIFIQUE.
         XR          X,Y             < X=NUMERO MOT, Y=NUMERO BIT.
         LB          AOP             < ACCES A LA FONCTION DEMANDEE.
         XR          A,B
         CP          APT             < EST-CE LE TEST VIRTUEL ???
         XR          A,B
         JE          VIRT3           < OUI, DONC PAS DE MISE A JOUR
                                     < DE L'IMAGE VIRTUELLE...
         STA         &ASECTC         < MAJ IMAGE VIRTUELLE.
VIRT3:   EQU         $
         PLR         B,X,Y
         RSR
<
<
<        R E S I D E N C E   D ' U N   S E C T E U R  :
<
<
<        ARGUMENT :
<                    B=NUMERO DU SECTEUR A RENDRE RESIDENT.
<
<
RESID:   EQU         $
         PSR         X,Y
         LR          B,X             < X=SECTEUR REFERENCE.
         LA          &ALSECT
         JAG         VIRT1           < LE SECTEUR REFERENCE EST DEJA
                                     < RESIDENT A L'ADRESSE=(A).
<
< CAS OU LE SECTEUR REFERENCE (X) N'EST PAS RESIDENT :
<
         IC          ANCIEN          < MODIFICATION DE LA
                                     < MEMOIRE VIRTUELLE.
         STX         CSECT           < SAUVEGARDE DE (X).
         LX          ANSECR
         LA          INFINI          < RECHERCHE D'UN BUFFER.
VIRT2:   EQU         $
         CPZ         &ATOPO          < LE BUFFER COURANT EST-IL
                                     < LIBRE ???
         JGE         VIRT4           < OUI, PAR LE SECTEUR (A).
         LR          X,Y             < NON, (Y)=BUFFER CHOISI.
         JMP         VIRT5
VIRT4:   EQU         $
         CP          &AUSE           < EST-IL PEU UTILISE ???
         JL          VIRT10          < NON, ON LE LAISSE.
         LA          &AUSE           < NON, IL DEVIENT LE MINI.
         LR          X,Y             < PEUT-ETRE SERA-T'IL ELU..
VIRT6:   EQU         $
         JDX         VIRT2
<
< OK, ON A TROUVE UN BUFFER (Y)PEU OU PAS UTILISE :
<
VIRT5:   EQU         $
         LR          Y,X             < X=NUMERO DE BUFFER/1.
         BSR         AWSE            < REECRITURE DU SECTEUR TOPO
                                     < ASSOCIE PAR 'TOPO' AU
                                     < BUFFER (X).
         LA          ANCIEN
         STA         &AUSE           < ON MEMORISE AINSI LA 'DATE'
                                     < DE MODIFICATION DU
                                     < BUFFER (X).
         LX          CSECT           < X=SECTEUR A CHARGER.
         LA          WDKT+1          < A=@OCTET DU BUFFER LIBERE.
         STA         RDKT+1          < C'EST LA QU'ON VA LIRE (X).
         SLRS        1               < A=@MOT DU BUFFER.
         STA         &ALSECT         < LE SECTEUR (X) SERA RESIDENT
                                     < A L'ADRESSE (A).
         STX         RDKT+3
         XR          X,Y             < Y=SECTEUR A CHARGER,
                                     < X=NUMERO DU BUFFER.
         STY         &ATOPO          < ON MEMORISE LE NUMERO
                                     < DU SECTEUR (Y) ASSOCIE
                                     < AU BUFFER (X).
         XR          X,Y             < X=SECTEUR A CHARGER,
                                     < Y=NUMERO DU BUFFER.
         LAD         RDKT
         SVC         0               < CHARGEMENT DU SECTEUR.
         LX          CSECT
         LA          &ALSECT         < A=@MOT DU BUFFER.
VIRT1:   EQU         $
         SBT         0               < BIT D'INDEX.
         STA         ASECTC          < GENERATION D'UN RELAI D'ACCES
                                     < TEMPORAIRE AU SECTEUR (X).
         SLLS        1               < CONVERSION EN UNE ADRESSE
                                     < D'OCTET.
         SB          ABUF1
         SLRS        8
         ADRI        1,A             < A=NUMERO DU BUFFER LE CONTENANT.
         LR          A,X
         PLR         X,Y
         RSR
<
< CAS DES SECTEURS TRES UTILISES :
<
VIRT10:  EQU         VIRT6
<
<
<        R E E C R I T U R E   D ' U N   B U F F E R  :
<
<
<        ARGUMENT :
<                    X=NUMERO DE CE BUFFER.
<
<
WSE:     EQU         $
         LR          X,A
         ADRI        -1,A
         SLLS        8
         AD          ABUF1
         STA         WDKT+1          < @OCTET DU BUFFER.
         LA          &ATOPO          < A=SECTEUR ASSOCIE.
         JAL         WSE1            < IL N'EXISTE PAS...
         PSR         X
         STA         WDKT+3          < SI EXISTE MAJ DE WDKT.
         LAD         WDKT
         SVC         0               < REECRITURE DU SECTEUR.
         LX          WDKT+3          < X=SECTEUR ASSOCIE.
         LAI         -1
         STA         &ALSECT         < LE SECTEUR ASSOCIE N'EST
                                     < PLUS RESIDENT.
         PLR         X               < RESTAURE : X=NUMERO BUFFER.
         STA         &ATOPO          < LE BUFFER EST LIBRE.
         STZ         &AUSE           < ET NON UTILISE...
WSE1:    EQU         $
         RSR
<
<
<        R E E C R I T U R E   D E   T O U S   L E S
<        B U F F E R S   E N   S C R A T C H  :
<
<
VIRE:    EQU         $
         PSR         X
         LXI         NSECR           < X=NBRE DE BUFFERS.
VIRE1:   EQU         $
         BSR         AWSE            < ECRITURE DU BUFFER (X).
         JDX         VIRE1
         PLR         X
         RSR
         PAGE
<
<
<        R E T O U R   D E   L A   Z O N E   S C R A T C H
<        E N   M E M O I R E   I M A G E  :
<
<
CONTI:   EQU         $
         STZ         RDK+3           < DEPART SUR LE SECTEUR 0.
         LA          AIMAG1
         RBT         0
         STA         AIMAG0          < INITIALISATION SUR @IMAG.
         LXI         LIMAG/128       < X=NBRE DE SECTEURS.
ECH1:    EQU         $
         PSR         X
         LB          RDK+3           < B=NUMERO DU SECTEUR COURANT.
         BSR         ARESID          < QUE L'ON REND RESIDENT.
         LX          RDK+3
         LA          &ALSECT         < A=@BUFFER QUI LE CONTIENT.
         JAG         ECH2            < OK, IL EST OCCUPE...
         WORD        '1E16           < E R R E U R   P R O G  !!!
ECH2:    EQU         $
         LXI         128             < X=NBRE DE MOTS/SECTEUR.
         LB          AIMAG0          < B=@RECEPTEUR=@IMAGE.
         MOVE                        < GENERATION IMAGE.
         LXI         128             < X=NBRE DE MOTS/SECTEUR.
         ADR         X,B             < PROGRESSION @IMAGE.
         STB         AIMAG0
         IC          RDK+3           < PASSAGE AU SECTEUR SUIVANT.
         PLR         X
         JDX         ECH1
         RSR
<
<
<        R A Z   D E   L A   Z O N E   S C R A T C H  :
<
<
RAZDK:   EQU         $
         STZ         WDK+3           < DEPART SUR LE SECTEUR 0.
         LXI         128
RAZ1:    EQU         $
         STZ         &ASECT          < RAZ DU BUFFER SECTOR.
         JDX         RAZ1
         LXI         LIMAG/128       < NBRE DE BUFFERS SCRATCH
                                     < NECESSAIRE POUR 1 IMAGE.
RAZ2:    EQU         $
         PSR         X               < SAVE LE DECOMPTEUR.
         LB          WDK+3           < B=NUMERO DU SECTEUR COURANT.
         BSR         ARESID          < QUE L'ON REND RESIDENT.
         LX          WDK+3
         LB          &ALSECT         < B=RECEPTEUR=@BUFFER ASSOCIE.
         CPZR        B               < VALIDATION...
         JG          RAZ3            < OK, IL EST OCCUPE..
         WORD        '1E16           < E R R E U R   P R O G  !!
RAZ3:    EQU         $
         LA          ASECT1
         RBT         0               < A=@EMETTEUR DES '0000.
         LXI         128             < X=NBRE DE MOTS A RAZER.
         MOVE                        < RAZ DU SECTEUR COURANT.
         PLR         X               < RESTAURE LE DECOMPTEUR.
         IC          WDK+3           < PASSGE AU SECTEUR SUIVANT.
         JDX         RAZ2            < DECOMPTAGE..
         RSR
         PAGE
<
<
<        T E S T   R E C T A N G L E   V I D E  :
<
<
<        ARGUMENT :
<                    X,Y = COORDONNEES DU POINT HAUT GAUCHE
<                          DU RECTANGLE COURANT EXPRIMEES EN
<                          NUMEROS DE RECTANGLES ET NON EN POINT.
<
<
<        RESULTAT :
<                    A = 0 LE RECTANGLE EST VIDE,
<                      # 0 LE RECTANGLE EST NON VIDE, ET
<                          X,Y = COORDONNEES DE SON CENTRE DE
<                                GRAVITE EXPRIMEES EN POINTS.
<
<
TREC:    EQU         $
         LR          X,A
         MP          SIZEX
         LR          B,X             < X=COORDONNEE HAUT GAUCHE.
         LR          Y,A
         MP          SIZEY
         LR          B,Y             < Y=COORDONNEE HAUT GAUCHE.
         LA          SIZEY
         STA         KSIZEY          < NBRE DE LIGNES PAR RECTANGLE.
TREC3:   EQU         $
         LA          SIZEX
         STA         KSIZEX          < NBRE DE COLONNES PAR RECTANGLE.
         PSR         X
TREC2:   EQU         $
         LR          X,A
         JAL         TREC4           < POINT INEXISTANT.
         CP          NPPL
         JG          TREC4           < POINT INEXISTANT.
         LR          Y,A
         JAL         TREC4           < POINT INEXISTANT.
         CP          NLIG
         JG          TREC4           < POINT INEXISTANT.
         BSR         ATESTV          < TEST VIRTUEL DU POINT COURANT.
         CPZ         INDIC           < TEST DU RESULTAT ???
         JE          TREC1           < OK, CENTRE DE GRAVITE TROUVE.
TREC4:   EQU         $
         ADRI        1,X             < PASSGE POINT SUIVANT.
         DC          KSIZEX          < EXISTE-T'IL ???
         JG          TREC2           < OUI, OK.
         PLR         X               < NON, RETOUR ET
         ADRI        1,Y             < CHANGEMENT DE LIGNE.
         DC          KSIZEY          < EXISTET'ELLE ???
         JG          TREC3           < OUI, OK...
         LAI         0               < NON, RECTANGLE VIDE.
TREC5:   EQU         $
         RSR                         < RETOUR...
TREC1:   EQU         $
         ADRI        -1,K            < RATTRAPGE DU 'PSR X'.
         LAI         -1              < RECTANGLE NON VIDE.
         JMP         TREC5           < ET RETOUR.
         PAGE
<
<
<        M I S E   D ' U N   B I T   A   1  :
<
<
<        ARGUMENTS :
<                    X ET Y CONTIENNENT X ET Y DU POINT.
<                    C=@IMAG (IMAGE VIDEO).
<
<
SET:     EQU         $
         PSR         B,X,C
         LR          Y,A
         MP          NMPL            < CONVERSION DE L'Y DU POINT EN
                                     < UN NUMERO DE MOT.
         ADR         B,C
         LR          X,A
         SLRS        4
         ADR         A,C             < C=@MOT CONTENANT LE POINT (X,Y).
         LAI         'F
         ANDR        A,X             < CALCUL DE X MODULO 16 ;
                                     < X=NUMERO DU BIT DANS LE MOT.
         LA          0,C             < A=MOT CONTENANT LE POINT (X,Y).
         SBT         0,X             < POSITIONNEMENT DU POINT.
         STA         0,C             < MISE A JOUR DE CE MOT.
         PLR         B,X,C
         RSR
<
<
<        E F F A C E M E N T   D ' U N   P O I N T  :
<
<
<        ARGUMENTS :
<                    X ET Y CONTIENNENT X ET Y DU POINT.
<                    C=@IMAG (IMAGE VIDEO).
<
<
RESET:   EQU         $
         PSR         B,X,C
         LR          Y,A
         MP          NMPL
         ADR         B,C
         LR          X,A
         SLRS        4
         ADR         A,C             < C=@MOT CONTENANT LE POINT (X,Y).
         LAI         'F
         ANDR        A,X             < X=NUMERO DU BIT REPRESENTANT
                                     < LE POINT DANS LE MOT ((C)).
         LA          0,C             < A=MOT CONTENANT LE POINT (X,Y).
         RBT         0,X             < EFFACEMENT DU POINT.
         STA         0,C             < MISE A JOUR DE CE MOT.
         PLR         B,X,C
         RSR
<
<
<        I N V E R S I O N   V I D E O   U N   P O I N T  :
<
<
<        ARGUMENT :
<                    X ET Y CONTIENNENT X ET Y DU POINT A INVERSER.
<                    C=@IMAG (IMAGE VIDEO).
<
<
INVER:   EQU         $
         PSR         B,X,C
         LR          Y,A
         MP          NMPL
         ADR         B,C
         LR          X,A
         SLRS        4
         ADR         A,C             < C=@MOT CONTENANT LE POINT (X,Y).
         LAI         'F
         ANDR        A,X             < X=NUMERO DU BIT REPRESENTANT
                                     < LE POINT DANS LE MOT ((C)).
         LA          0,C             < A=MOT CONTENANT LE POINT (X,Y).
         IBT         0,X             < INVERSION VIDEO DU POINT.
         STA         0,C             < MISE A JOUR DE CE MOT.
         PLR         B,X,C
         RSR
<
<
<        T E S T   D ' U N   P O I N T  :
<
<
<        FONCTION DE ITEST :
<                    ITEST=0 : CARY=1 SI POINT=0 ,
<                         =1 : CARY=1 SI POINT=1.
<
<
<        ARGUMENTS :
<                    X ET Y CONTIENNENT L'X ET L'Y DU POINT ,
<                    C=@IMAG.
<
<
<        RESULTAT :
<                    CARY POISITIONNE PAR LE POINT (0/1) 9
<
<
TEST:    EQU         $
         PSR         B,X,C
         LR          Y,A             < A=COORDONNEE Y DU POINT.
         MP          NMPL
         ADR         B,C
         LR          X,A             < A=COORDONNEE X DU POINT.
         SLRS        4
         ADR         A,C             < C#MOT CONTENANT LE POINT (X,Y).
         LAI         'F
         ANDR        A,X             < X=NUMERO DU POINT DANS LE MOT (C)
         LA          0,C
         CPZ         ITEST           < TEST DE LA VALEUR LOGIQUE DU
                                     < POINT.
         JNE         E1022           < CONVENTION NORMALE (1).
         IBT         0,X             < CAS DES CONVENTIONS INVERSEES (1)
E1022:   EQU         $
         TBT         0,X             < TEST DU POINT.
         PLR         B,X,C
         RSR
<
<
<        E X I S T E N C E   E T   C O M P T A G E
<                    D E S   V O I S I N S  :
<
<
<        ARGUMENT :
<                    X,Y = COORDONNEE D'UN VOISIN.
<
<
<        RESULTAT :
<                    B EST INCREMENTE DE 1 SI CE POINT EXISTE
<                      ET EST A 1.
<                    LE CARRY EST NON SIGNIFICATIF !!!!
<
<
VOISE:   EQU         $
         LR          X,A
         JAL         NVOISE          < X INVALIDE.
         CP          NPPL
         JG          NVOISE          < X INVALIDE.
         LR          Y,A
         JAL         NVOISE          < Y INVALIDE.
         CP          NLIG
         JG          NVOISE          < Y INVALIDE.
         BSR         ATEST           < TEST DU POINT EXISTANT (X,Y).
         ADCR        B               < B EST INCREMENTE DE 1
                                     < SI (X,Y) EXISTE.
NVOISE:  EQU         $
         RSR
         PAGE
<
<
<        E X I S T E N C E   E T   V A L E U R   P O I N T  :
<
<
<        ARGUMENT :
<                    X ET Y CONTIENNENT L'X ET L'Y D'UN POINT.
<
<
<        RESULTAT :
<                    A#0 : M(X,Y) N'EXISTE PAS , OU
<                          M(X,Y) EXISTE ET M(X,Y)=0.
<
<
EXIST:   EQU         $
         LR          X,A
         JAL         NEXIST          < X INVALIDE (<0).
         CP          NPPL
         JG          NEXIST          < X INVALIDE (>NPPL).
         LR          Y,A
         JAL         NEXIST          < M(X,Y) N'EXISTE PAS : A<0#0 !!!
         CP          NLIG
         JG          NEXIST          < M(X,Y) N'EXISTE PAS : A>0#0 !!!
<
< CAS OU LE POINT M(X,Y) EXISTE :
<
         BSR         ATEST           < TEST DE LA VALEUR DE M(X,Y).
         LAI         1
         SBCR        A               < A=0 SI M(X,Y)=1.
NEXIST:  EQU         $
         RSR
<
<
<        E X I S T E N C E   V I R T U E L L E  :
<
<
XISTV:   EQU         $
         LR          X,A
         JAL         NXISTV          < POINT VIRTUEL INEXISTANT.
         CP          NPPL
         JG          NXISTV          < POINT VIRTUEL INEXISTANT.
         LR          Y,A
         JAL         NXISTV          < POINT VIRTUEL INEXISTANT.
         CP          NLIG
         JG          NXISTV          < POINT VIRTUEL INEXISTANT.
         BSR         ATESTV          < TEST D'UN POINT VIRTUEL.
         LA          INDIC           < A=RESULTAT DU TEST VIRTUEL.
NXISTV:  EQU         $
         RSR                         < VOIR 'EXIST' POUR (A).
         PAGE
<
<
<        E N T R E E   U N E   C O O R D O N N E E  :
<
<
<        ARGUMENT :
<                    A=@MESSAGE A EMETTRE.
<
<
<        RESULTAT :
<                    A=COORDONNEE (X OU Y).
<
<
COORD1:  EQU         $               < RETOUR EN ERREUR.
         LR          B,A             < RESTAURE A=@MESSAGE.
COORD:   EQU         $
         PSR         X,Y
         LR          A,B             < SAVE B=@MESSAGE.
         BSR         APRINT          < ENVOI DU MESSAGE ARGUMENT.
         LAD         DEMIN
         SVC         0               < ENTREE D'UN NBRE HEXADECIMAL.
         LYI         4               < 4 CHIFFRES MAX A CONVERTIR.
         BSR         AHEX            < ESSAI DE CONVERSION...
         PLR         X,Y
         JNE         COORD1          < ERREUR : ON RECOMMENCE.
         JAL         COORD1          < COORDONNEE<0 : ERREUR..
         CPI         X20-1           < DEBORDEMENT : ERREUR...
         JG          COORD1          < ERREUR...
         RSR                         < OK, (A)=VALEUR HEXA.
<
<
<        E N T R E E   C O E F F I C I E N T  :
<
<
<        ARGUMENT :
<                    A=@MESSAGE A EMETTRE.
<
<
<        RESULTAT :
<                    A=COEFFICIENT.
<
<
COEF1:   EQU         $
         LR          B,A             < RESTAURE A=@MESSAGE.
COEF:    EQU         $
         PSR         X,Y
         LR          A,B             < SAVE B=@MESSAGE.
         BSR         APRINT          < ENVOI DU MESSAGE.
         LAD         DEMIN
         SVC         0               < ENTREE DE 4 CARACTERES.
         LYI         4
         BSR         AHEX            < CONVERSION HEXA.
         PLR         X,Y
         JNE         COEF1           < ERREUR SYNTAXE HEXADECIMALE.
         RSR                         < OK...
<
<
<        E N T R E   D ' U N   P A S  :
<
<
<        ARGUMENT :
<                    A=@MESSAGE A EMETTRE.
<
<
<        RESULTAT :
<                    A=PAS#0.
<
<
PAS1:    EQU         $
         LR          B,A             < RESTAURE A=@MESSAGE.
PAS:     EQU         $
         PSR         X,Y
         LR          A,B             < SAVE B=@MESSAGE.
         BSR         APRINT          < ENVOI MESSAGE.
         LAD         DEMIN
         SVC         0               < ENTREE DU PAS.
         LYI         4               < Y=NBRE CARACTERES A DECODER.
         BSR         AHEX            < CONVERSION HEXA-BINAIRE.
         PLR         X,Y
         JNE         PAS1            < ERREUR SYNTAXE.
         JALE        PAS1            < REFUS DE PAS<=0.
         CPI         X20-1           < VALIDATION.
         JG          PAS1            < ERREUR.
         RSR
<
<
<        C O N V E R S I O N   A S C I   -->   B I N A I R E  :
<
<
<        RESULTAT :
<                    A=VALEUR CONVERTIE S'IL N'Y A PAS
<                    D'ERREUR, LES CODES DE CONDITION
<                    L'INDIQUANT.
<
<
HEX:     EQU         $
         PSR         B,X
         LXI         0               < X=INDEX DE 'REP'.
         LBI         0               < B=CUMUL COURANT.
HEX1:    EQU         $
         LBY         &AREP           < A=CARACTERE COURANT DE 'REP'.
         CPI         '04             < EST-CE 'EOT' ???
         JE          HEX5            < OUI, FIN DE CONVERSION.
         CPI         '0D             < EST-CE 'R/C' ???
         JE          HEX5            < OUI, FIN DE CONVERSION.
         ADRI        -'30,A          < CONVERSION BIANIRE.
         JAL         HEX2            < ERREUR.
         CPI         9               < EST-CE UN CHIFFRE DECIMAL ???
         JLE         HEX3            < OUI.
         ADRI        -"A"+"9"+1,A    < NON.
         CPI         'A              < VALIDATION HEXDECIMALE ???
         JL          HEX2            < ERREUR.
         CPI         'F              < VALIDATION HEXADECIMALE ???
         JG          HEX2            < ERREUR.
HEX3:    EQU         $
         SCRS        4               < CUMUL PARTIEL DE LA
         SCLD        4               < VALEUR A CONVERTIR.
         ADRI        1,X             < PASSAGE AU CARACTERE SUIVANT.
         CPR         X,Y             < EST-CE FINI ???
         JNE         HEX1            < NON.
HEX5:    EQU         $
         LR          B,A             < OUI, A=RESULTAT.
         LBI         0               < B=0 : OK.
HEX4:    EQU         $
         CPZR        B               < POSITIONNEMENT DES CODES
                                     < DE CONDITION SUR ERREUR.
         PLR         B,X
         RSR
HEX2:    EQU         $               < CAS DES ERREURS.
         LBI         1               < B=1#0 : ERREUR.
         JMP         HEX4            < VERS LA SORTIE...
         PAGE
<
<
<        R E T O U R   A   ' G E '  :
<
<
GOGE:    EQU         $
GOGEX:   EQU         $               < ENTRY ALT-MODE.
         BSR         AVIRE           < TOUTE L'IMAGE VIRTUELLE EST
                                     < RENVOYEE EN SCRATCH AVANT
                                     < LE RETOUR A 'GE'.
ERR:     EQU         $               < SORTIE EN ERREUR...
         LAI         BRANCH-ZERO
         LR          A,W             < W=@BRANCH.
<
< RAZ DES ITEMS 1 ET 2 :
<
         LX          NMOTS           < X=NBRE DE MOTS A RAZER.
GOGE1:   EQU         $
         STZ         &AI2
         JDX         GOGE1
<
< MISE EN PLACE DU NOM DE 'GE' :
<
         LA          NGE
         STA         0,W             < (W)=@BRANCH.
<
< RETOUR A 4K, ET SMC :
<
         LA          APILE
         LR          A,K
         LAD         RELMEM
         SVC         0
GOGE2:   EQU         $
         LAD         DEMSGN          < A=@DEMSGN.
         BSR         AOVL            < CHARGEMENT DE 'GE'.
         LAD         DEMCCI
         SVC         0               < RETOUR AU CCI SI ERREUR.
         JMP         GOGE2
         PAGE
<
<
<        G R A N D E S   L I G N E S  :
<
<
<        FONCTIONS :
<                    1- DECOUPE L'IMAGE EN RECTANGLES DE
<                    DIMENSIONS DONNEES,
<                    2- CALCUL LES CENTRES DE GRAVITE
<                    DE CHACUN DE CES RECTANGLES POUR LA
<                    MASSE D'IMAGE QU'ILS CONTIENNENT,
<                    3- CONSTRUIT UN TREILLIS JOIGNANT
<                    DEUX A DEUX CES CENTRES DE GRAVITE.
<
<
         WORD        IMAG            < VALEUR BASE C.
         WORD        LOC+'80         < VALEUR BASE L.
         WORD        BRANCH          < VALEUR BASE W.
IMAGE:   EQU         $
         LRP         K
         ADRI        -1,K
         PLR         C,L,W           < INITIALISATION C,L,W.
         LA          ASTACK
         LR          A,K             < INITIALISATION K.
         IC          KIN             < COMPTAGE DES ENTRIES.
         JG          GOGEX           < ABORT SI ALT-MODE.
         LAD         DEMMEM
         SVC         0
<
< MODE DE GENERATION DE L'IMAGE SCRATCH :
<
OPER1:   EQU         $
         LA          AM10
         BSR         APRINT          < EMISSION D'UN MESSAGE.
         LAD         DEMREP
         SVC         0               < ENTREE DU MODE DE GENERATION.
         LBY         REP             < A=MODE CHOISI.
         ADRI        -'30,A          < DECODAGE ASCI-NUMERIQUE.
         JALE        OPER1           < ERREUR.
         LXI         0
         CPBY        &ACODE          < VALIDATION PAR RAPPORT AU
                                     < MODE MAX.
         JG          OPER1           < ERREU.
         LR          A,X             < X=MODE CHOISI.
         LBY         &ACODE          < A=OPERATION ASSOCIEE.
         STBY        &AINS           < QUE L'ON MET DANS 'PS'
                                     < POUR LA ROUTINE 'SETV'.
TR3:     EQU         $
<
< INITIALISATION DU DISQUE :
<
         LA          AM9
         BSR         AINTER          < FAUT-IL RAZER L'IMAGE SCRATCH.
         JNE         RZ1             < NON.
         BSR         ARAZDK
RZ1:     EQU         $
<
< ENTREE DE LA TAILLE DES RECTANGLES :
<
         LA          AM1
         BSR         APAS
         STA         SIZEX
         LA          AM2
         BSR         APAS
         STA         SIZEY
<
< CALCUL DU NBRE DE RECTANGLES :
<
         LAI         0
         LB          NLIG
         DV          SIZEY
         STA         NLIG2
         LAI         0
         LB          NPPL
         DV          SIZEX
         STA         NPPL2
<
<        R E C H E R C H E   D E S   C E N T R E S   D E
<        G R A V I T E   D E S   R E C T A N G L E S  :
<
         LY          NLIG2           < Y=NBRE DE RECTANGLES SUR OY.
ANA1:    EQU         $
         LX          NPPL2           < X=NBRE DE RECTANGLES SUR OX.
ANA5:    EQU         $
         PSR         X,Y
         LR          X,A
         MP          SIZEX
         LR          B,X             < X HAUT GAUCHE RECTANGLE.
         LR          Y,A
         MP          SIZEY
         LR          B,Y             < Y HAUT GAUCHE RECTANGLE.
         STZ         KPT             < RAZ DU NBRE DE POINTS
         STZ         XC              < ET DU SIGMA DES X ET DES
         STZ         YC              < Y DU RECTANGLE COURANT.
         STZ         XC+1
         STZ         YC+1
         LA          SIZEY
         STA         KSIZEY          < NBRE DE POINTS SUR OY.
ANA3:    EQU         $
         LA          SIZEX
         STA         KSIZEX          < NBRE DE POINTS SUR OX.
         PSR         X
ANA2:    EQU         $
         LR          X,A
         JAL         ANA4            < INEXISTANT.
         CP          NPPL
         JG          ANA4            < INEXISTANT.
         LR          Y,A
         JAL         ANA4            < INEXISTANT.
         CP          NLIG
         JG          ANA4            < INEXISTANT.
         BSR         ATEST           < TEST DU POINT (X,Y).
         JNC         ANA4            < POINT A 0.
         IC          KPT             < COMPTAGE DES POINTS A 1.
         LA          XC
         LB          XC+1
         ADR         X,B
         ADCR        A
         STA         XC              < CALCUL DU SIGMA(X).
         STB         XC+1
         LA          YC
         LB          YC+1
         ADR         Y,B
         ADCR        A
         STA         YC              < CALCUL DU SIGMA(Y).
         STB         YC+1
ANA4:    EQU         $
         ADRI        1,X             < POINT SUIVANT SUR OX.
         DC          KSIZEX          < EXISTE-T'IL ???
         JG          ANA2            < OUI.
         PLR         X               < NON, RETOUR ET
         ADRI        1,Y             < POINT SUIVANT SUR OY.
         DC          KSIZEY          < EXISTE-T'IL ???
         JG          ANA3            < OUI.
<
< VISUALISATION DU CENTRE DE GRAVITE :
<
         CPZ         KPT             < LE RECTANGLE EST-IL VIDE ???
         JE          ANA6            < OUI, RIEN A FAIRE...
         LA          XC
         LB          XC+1
         DV          KPT
         LR          A,X             < X=X(CENTRE DE GRAVITE).
         LA          YC
         LB          YC+1
         DV          KPT
         LR          A,Y             < Y=Y(CENTRE DE GRAVITE).
         BSR         ASETV           < AFFICHAGE VIRTUEL.
ANA6:    EQU         $
         PLR         X,Y             < RESTAURE LES COORDONNEES
                                     < DES RECTANGLES.
         ADRI        -1,X            < RECTANGLE PRECEDENT SUR OX.
         CPZR        X               < EXISTE-T'IL ???
         JGE         ANA5            < OUI.
         ADRI        -1,Y            < NON, ALLONS SUR OY.
         CPZR        Y               < EXISTE-T'IL ???
         JGE         ANA1            < OUI.
<
<        C O N S T R U C T I O N   D U   T R E I L L I S  :
<
         LA          AM3
         BSR         AINTER          < INTERROGATION UTILISATEUR ???
         JE          ANA10           < OUI, ON Y VA.
         BR          AGOGE           < NON, C'EST FINI...
ANA10:   EQU         $
         IF          ORDI-"S",XWOR%,,XWOR%
<
< CHOIX DE LA SORTIE VIDEO SOLAR :
<
         STZ         DMDIFF+2        < PAS DE DIFFUSION A PRIORI.
         LA          AM31            < PROPOSITION.
         BSR         APRINT
         LAD         DEMREP          < DEMANDE REPONSE.
         SVC         0
         LBY         REP             < REPONSE.
         CPI         "N"
         JE          ANA13           < PAS DE DIFFUSION.
         CPI         "O"
         JNE         ANA12
         LAI         "2"             < VERT IMPLICITEMENT.
ANA12:   EQU         $
         ADRI        -'30,A
         JAL         ANA10           < REPONSE INCORRECTE.
         CPI         3
         JG          ANA10           < REPONSE INCORRECTE.
         STA         DMDIFF+3        < POSITIONNEMENT COULEUR DIFFUSION.
ANA13:   EQU         $
XWOR%:   VAL         0
<
< DIRECTIONS DE RECONSTRUCTIONS :
<
         LA          AM5
         BSR         AINTER
         STB         INDNE
         LA          AM6
         BSR         AINTER
         STB         INDN
         LA          AM7
         BSR         AINTER
         STB         INDNW
         LA          AM8
         BSR         AINTER
         STB         INDW
<
< PAS DE RECONSTRUCTION (EXPRIMES EN NBRE DE RECTANGLES) :
<
         LA          AM12
         BSR         APAS
         STA         PASX
         LA          AM13
         BSR         APAS
         STA         PASY
<
< PAS DE TEST DES VOISINS :
< (EXPRIMES EN NBRE DE RECTANGLES)
<
         LA          AM14
         BSR         APAS
         STA         DELTAX
         LA          AM15
         BSR         APAS
         STA         DELTAY
<
< DOIT-ON VISUALISER LES CENTRES DE GRAVITE ISOLES ???
<
         LA          AM11
         BSR         AINTER
         STB         ISOL
<
< DOIT-ON EMETTRE PAR ZDC ???
<
         LA          AM4
         BSR         AINTER          < FAUT-IL EMETTRE PAR ZDC ???
         STB         IGRAPH          < SAVE LA REPONSE 0/1.
<
< RAZ DE L'IMAGE COURANTE :
<
         LX          ALIMAG          < X=NBRE DE MOTS A RAZER.
ANA20:   EQU         $
         STZ         &AIMAGZ
         JDX         ANA20
<
< JONCTION 2 A 2 DES CENTRES DE GRAVITE VOISINS :
<
         LY          NLIG2           < Y=NBRE DE RECTANGLES SUR OY-1.
ANA11:   EQU         $
         LX          NPPL2           < X=NBRE DE RECTANGLES SUR OX-1.
ANA15:   EQU         $
         PSR         X,Y
         STX         XREC            < SAVE L'ORIGINE DU RECTANGLE
         STY         YREC            < COURANT.
         BSR         ATREC           < TEST DU RECTANGLE COURANT ???
         JAE         ANA16           < IL EST VIDE...
<
< CAS OU LE RECTANGLE COURANT EST NON VIDE :
<
         STX         DICOX1          < SON CENTRE DE GRAVITE EST
         STY         DICOY1          < ORIGINE DE TOUT SEGMENT.
         CPZ         ISOL
         JNE         ANA31           < PAS DE POINTS ISOLES.
         BSR         ASET            < OUI, ON MARQUE A PRIORI
                                     < LE CENTRE DE GRAVITE COURANT M1.
ANA31:   EQU         $
         CPZ         INDNE
         JNE         ANA17           < PAS DE 'NE'.
<
< EXPLORATION 'NE' :
<
         LX          XREC            < RESTAURE LES COORDONNEES
         LY          YREC            < 'RECTANGLES'.
         LA          DELTAX
         ADR         A,X
         LA          DELTAY
         SBR         A,Y
         BSR         ATREC           < ET TEST...
         JAE         ANA17           < VIDE...
         STX         DICOX2          < SI NON VIDE, ON PREND SON
         STY         DICOY2          < CENTRE DE GRAVITE COMME
                                     < EXTREMITE DU SEGMENT
                                     < VIDEO COURANT.
         BSR         ATRACE          < ET TRACE...
ANA17:   EQU         $
         CPZ         INDN
         JNE         ANA18           < PAS DE 'N'.
<
< EXPLORATION 'N' :
<
         LX          XREC            < RESTAURE LE
         LY          YREC            < RECTANGLE COURANT.
         LA          DELTAY
         SBR         A,Y
         BSR         ATREC           < ET TEST.
         JAE         ANA18           < VIDE.
         STX         DICOX2          < NON VIDE,
         STY         DICOY2          < ON TRACE
         BSR         ATRACE          < LE SEGMENT.
ANA18:   EQU         $
         CPZ         INDNW
         JNE         ANA19           < PAS DE 'NW'.
<
< EXPLORATION 'NW' :
<
         LX          XREC            < RESTAURE LE
         LY          YREC            < RECTANGLE COURANT.
         LA          DELTAX
         SBR         A,X
         LA          DELTAY
         SBR         A,Y
         BSR         ATREC           < ET TEST.
         JAE         ANA19           < VIDE.
         STX         DICOX2          < NON VIDE.
         STY         DICOY2
         BSR         ATRACE          < TRACE DU SEGMENT.
ANA19:   EQU         $
         CPZ         INDW
         JNE         ANA16           < PAS DE 'W'.
<
< EXPLORATION 'W' :
<
         LX          XREC            < RESTAURE LE
         LY          YREC            < RECTANGLE COURANT.
         LA          DELTAX
         SBR         A,X
         BSR         ATREC           < ET TEST.
         JAE         ANA16           < VIDE.
         STX         DICOX2          < NON VIDE.
         STY         DICOY2
         BSR         ATRACE          < TRACE DU SEGMENT.
ANA16:   EQU         $
         PLR         X,Y             < RESTAURE X,Y.
         LA          PASX
         SBR         A,X
         CPZR        X               < EXISTE-T'IL ???
         JG          ANA15           < OUI...
         LA          PASY
         SBR         A,Y
         CPZR        Y               < EXISTE-T''ELLE ???
         JG          ANA11           < OUI...
<
< FIN D'ANALYSE :
<
         CPZ         IGRAPH          < ENVOI EN ZDC ???
         JNE         ANA30           < NON.
         STZ         SEG+0           < OUI, ON ENVOIE 'OAB'.
         STZ         SEG+1
         STZ         SEG+2
         STZ         SEG+3
         BSR         ASTORE          < ENVOI DU 'OAB' DANS ZDC.
ANA30:   EQU         $
         BR          AGOGE           < C'EST FINI...
         PAGE
<
<
<        I M P L A N T A T I O N  :
<
<
X12:     EQU         ZERO+PILE-LTNI-LTNI
X10:     VAL         X12-$
ZEROV:   EQU         ZERO+X10        < ERREUR D'ASSEMBLAGE VOLONTAIRE
                                     < SI MAUVAISE IMPLANTATION...
         DZS         X10+1           < PAR PROPRETE !!!!
         EOT         #SIP GEN PROCESSEUR#



Copyright © Jean-François Colonna, 2022-2022.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2022.