NMPROC:  VAL         "ZO"            < NOM DU PROCESSEUR.
         IDP         "ZO - RELEASE 01/06/1979"
         EOT         #SIP DEFINITION CMS5#
         EOT         #SIP DEF PROCESSEUR#
         PROG
         WORD        IMAGE           < ENTRY POINT DU GENERATEUR.
         WORD        0
PIMAGE:  EQU         $               < P='12 !!!
         LRP         L
         BR          -2,L            < ENTREE DANS LE PROCESSEUR KO.
         EOT         #SIP DEFINITION ITEM#
ITEM1:   EQU         ZERO+PILE-LTNI
ITEM2:   EQU         ZERO+PILE-LTNI-LTNI
         PAGE
<
< PILE DU PROGRAMME :
<
SSTACK:  VAL         40              < IL FAUT CE QU'IL FAUT...
STACK:   DZS         SSTACK
         EOT         #SIP IMAGE 256#
NOM:     EQU         ZERO+PILE+5-LNOM-2  < NOM DE L'IMAGE VIDEO.
IMAG:    EQU         NOM+LNOM+2      < IMAGE VIDEO.
<
< VALIDATION DU FORMAT DE L'IMAGE (CARREE) :
<
X20:     VAL         1024/DY         < NBRE DE LIGNES/IMAGE.
X21:     VAL         CNMPL*16        < NBRE DE POINTS/LIGNE.
         IF          X20-X21,,X100,
         IF          ATTENTION : L'IMAGE N'EST PAS CARREE !!!
X100:    VAL         0
<
< BUFFER DES SECTEURS SCRATCHES :
<
SECTOR:  EQU         STACK+SSTACK
         DZS         128             < CELA PEUT TOUJOURS SERVIR !!!
         PAGE
<
<
<        L O C A L  :
<
<
         TABLE
M10:     BYTE        35;'6D
         ASCI        "MODE (AD=1/SB=2/OR=3/AND=4/EOR=5)="
M41:     BYTE        13;'6D
         ASCI        "EPAISSEUR X="
M42:     BYTE        13;'6D
         ASCI        "EPAISSEUR Y="
M43:     BYTE        10;'6D
         ASCI        "MAILLE X="
M44:     BYTE        10;'6D
         ASCI        "MAILLE Y="
M45:     BYTE        7;'6D
         ASCI        "PAS X="
M46:     BYTE        7;'6D
         ASCI        "PAS Y="
M47:     BYTE        9;'6D
         ASCI        "VOISINS?"
M48:     BYTE        9;'6D
         ASCI        "DELTA X="
M49:     BYTE        9;'6D
         ASCI        "DELTA Y="
M1:      BYTE        15;'6D
         ASCI        "TRANSLATION X="
M2:      BYTE        15;'6D
         ASCI        "TRANSLATION Y="
M50:     BYTE        11;'6D
         ASCI        "8 VOISINS?"
         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 :
<
M11:     BYTE        7;'6D
         ASCI        "MUL11="
M12:     BYTE        7;'6D
         ASCI        "MUL12="
M21:     BYTE        7;'6D
         ASCI        "MUL21="
M22:     BYTE        7;'6D
         ASCI        "MUL22="
D11:     BYTE        7;'6D
         ASCI        "DIV11="
D12:     BYTE        7;'6D
         ASCI        "DIV12="
D21:     BYTE        7;'6D
         ASCI        "DIV21="
D22:     BYTE        7;'6D
         ASCI        "DIV22="
M6:      BYTE        11;'6D
         ASCI        "X(CENTRE)="
M7:      BYTE        11;'6D
         ASCI        "Y(CENTRE)="
M8:      BYTE        16;'6D
         ASCI        "TRANSFORMATION? "
M9:      BYTE        5;'6D
         ASCI        "RAZ?"
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
         IF          ORDI-"S",XWOR%,,XWOR%
STABIL:  WORD        '8A01           < DEMANDE DE STABILISATION IMAGE.
         WORD        IMAG-ZERO*2
         WORD        LIMAG*2
         WORD        TVPV            < SUR LE PROCESSEUR VERT.
XWOR%:   VAL         0
<
< CONSTANTES :
<
KIN:     WORD        -1              < COMPTEUR DES ENTRIES DANS KO.
NGE:     WORD        "GE"            < NOM DU PROCESSEUR GE.
         IF          ORDI-"T",XWOR%,,XWOR%
ACNSYS:  ASCI        ":SYS"
XWOR%:   VAL         0
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.
PASX:    WORD        0               < PAS DE PARCOURS EN X DE L'IMAGE.
PASY:    WORD        0               < PAS DE PARCOURS EN Y DE L'IMAGE.
         IF          ORDI-"T",XWOR%,,XWOR%
TEMPO:   WORD        '400*2          < TEMPO DE CLIGNOTEMENT VIDEO.
XWOR%:   VAL         0
         IF          ORDI-"S",XWOR%,,XWOR%
TEMPO:   WORD        5*2             < NOMBRE DE CLIGNOTEMENTS CURSEUR.
XWOR%:   VAL         0
CENTR:   DZS         2               < CENTRE DE ZPOOMING.
MU11:    WORD        0
MU12:    WORD        0
MU21:    WORD        0
MU22:    WORD        0
DI11:    WORD        0
DI12:    WORD        0
DI21:    WORD        0
DI22:    WORD        0
TRANSX:  WORD        0
TRANSY:  WORD        0
DELX:    WORD        0               < X-X(CENTRE) TEMPORAIRE.
DELY:    WORD        0               < Y-Y(CENTRE) TEMPORAIRE.
INDIC:   WORD        0               < RESULTAT (0/1) DES TESTS
                                     < VIRTUELS.
ANCIEN:  WORD        1               < EST INCREMENTE DE 1 A
                                     < CHAQUE MODIFICATION DE
                                     < LA MEMOIRE VIRTUELLE.
SAVE:    WORD        0               < VARIABLE TEMPORAIRE DE 'PS'.
DIMX:    WORD        0               < EPAISSEUR DEMANDEE POUR X.
DIMY:    WORD        0               < EPAISSEUR DEMANDEE POUR Y.
KDIMX:   WORD        0               < DECOMPTE DE DIMX.
KDIMY:   WORD        0               < DECOMPTE DE DIMY.
MAILX:   WORD        0               < PAS D'EPAISSEMENT EN X.
MAILY:   WORD        0               < PAS D'EPAISSEMENT EN Y.
LVOIS:   WORD        0               < LISTE DES NOMBRES DE VOISIN
                                     < A PRENDRE EN COMPTE : SI
                                     < PAR EXEMPLE BIT5=0 ET BIT3=1,
                                     < LE POINT COURANT SERA IGNORE
                                     < S'IL A 5 VOISINS, ET PRIS EN
                                     < COMPTE S'IL EN A 3.
IVOIS:   WORD        0               < 0 : TESTER LES VOISINS.
DELTAX:  WORD        0               < PAS SUR X DE TEST DES VOISINS.
DELTAY:  WORD        0               < PAS SUR Y DE TEST DES VOISINS.
<
< 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.
ACLIGN:  WORD        CLIGN           < CLIGNOTEMENT DES POINTS VIDEO.
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.
AINCX:   WORD        INCX            < DEPLACEMENT +DELTAX ET 'VOISE',
AINCY:   WORD        INCY            < DEPLACEMENT +DELTAY ET 'VOISE',
ADECX:   WORD        DECX            < DEPLACEMENT -DELTAX ET 'VOISE',
ADECY:   WORD        DECY            < DEPLACEMENT -DELTAY ET 'VOISE'.
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.
         IF          ORDI-"T",XWOR%,,XWOR%
ASP3:    WORD        SP3             < STABILISATION IMAGE VIDEO
                                     < SI :SYS, 0 SINON.
XWOR%:   VAL         0
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
AM1:     WORD        M1
AM2:     WORD        M2
AM10:    WORD        M10
AM41:    WORD        M41
AM42:    WORD        M42
AM43:    WORD        M43
AM44:    WORD        M44
AM45:    WORD        M45
AM46:    WORD        M46
AM47:    WORD        M47
AM48:    WORD        M48
AM49:    WORD        M49
AM50:    WORD        M50
AM50P:   WORD        M50+1           < RELAI DE CHANGEMENT DU NOMBRE
                                     < DE VOISINS DANS LE MESSAGE 'M50'.

<
< 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.
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
<
<
<        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
<
<
<        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
<
<
<        C L I G N O T E M E N T   D ' U N   P O I N T  :
<
<
CLIGN:   EQU         $
         IF          ORDI-"T",XWOR%,,XWOR%
         PSR         B
XWOR%:   VAL         0
         IF          ORDI-"S",XWOR%,,XWOR%
         PSR         A,B
XWOR%:   VAL         0
         LB          TEMPO           < B=NBRE DE CLIGNOTEMENTS.
CLIGN1:  EQU         $
         BSR         AINVER          < INVERSION DU POINT (X,Y).
         IF          ORDI-"S",XWOR%,,XWOR%
         PSR         X
         LAD         STABIL          < STABILISATION IMAGE VIDEO.
         SVC         0
         PLR         X
XWOR%:   VAL         0
         ADRI        -1,B            < DECOMPTAGE.
         CPZR        B               < EST-CE FINI ???
         JG          CLIGN1          < NON.
         IF          ORDI-"T",XWOR%,,XWOR%
         PLR         B               < OUI.
XWOR%:   VAL         0
         IF          ORDI-"S",XWOR%,,XWOR%
         PLR         A,B
XWOR%:   VAL         0
         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
<
<
<        D E P L A C E M E N T S   E T   ' V O I S E '  :
<
<
<        FONCTIONS :
<                      CES 4 ROUTINES GENERENT LES 4
<                    DEPLACEMENTS ELEMENTAIRES SUR LES
<                    AXES OX ET OY, ET TESTE LES POINTS
<                    RESULTANTS.
<
<
INCX:    EQU         $
         LA          DELTAX
         ADR         A,X             < X<--(X)+(DELTAX).
         BSR         AVOISE
         RSR
DECX:    EQU         $
         LA          DELTAX
         SBR         A,X             < X<--(X)-(DELTAX).
         BSR         AVOISE
         RSR
INCY:    EQU         $
         LA          DELTAY
         ADR         A,Y             < Y<--(Y)+(DELTAY).
         BSR         AVOISE
         RSR
DECY:    EQU         $
         LA          DELTAY
         SBR         A,Y             < Y<--(Y)-(DELTAY).
         BSR         AVOISE
         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).
         IF          ORDI-"T",XWOR%,,XWOR%
TIMAG:   WORD        IMAG            < @RELATIVE IMAGE VIDEO.
         EOT         #SIP SP3#
XWOR%:   VAL         0
         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.
         JAE         PAS1            < REFUS DE PAS=0.
         CPI         X20-1           < VALIDATION.
         JG          PAS1            < ERREUR.
         CPI         -X20+1          < VALIDATION.
         JL          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
<
<
<        Z O O M   I M A G E  :
<
<
<        FONCTION :
<                    1- CE PROCESSEUR PERMET D'OBTENIR LA
<                    TRANSFORMATION D'UNE IMAGE VIDEO PAR
<                    UNE MATRICE ARGUMENT, ET DONC EN PARTICULIER
<                    LE ZOOM,
<
<                    2- DE PLUS IL PERMET LA TRANSLATION
<                    DE CETTE MEME IMAGE,
<
<                    3- ET ENFIN, IL FAIT DES OPERATION LOGIQUES
<                    ENTRE IMAGE RESIDANTE ET SCRATCH.
<
<                    4- DE PLUS, IL PERMET DE SUPPRIMER
<                    LES POINTS EN FONCTION DU NOMBRE
<                    DE LEURS VOISINS (0 A 8).
<
<
<        NOTA IMPORTANT :
<                      DANS CE PROCESSEUR, ET CONTRAIREMENT A TV/TI,
<                    LES IMAGES NE SONT PAR CONSIDEREES COMME
<                    SUPPORTEES PAR UN TORE; DONC TOUT CE QUI DEPASSE
<                    EST IGNORE...
<
<
         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
         IF          ORDI-"T",XWOR%,,XWOR%
<
< TEST DU NUMERO DE COMTE D'APPEL :
<
         WORD        '1E25           < A,B=ACN.
         CP          ACNSYS
         JNE         INIT1           < ON N'EST PAS SOUS :SYS.
         LR          B,A
         CP          ACNSYS+1
         JE          INIT2           < ON EST SOUS :SYS.
INIT1:   EQU         $
         STZ         ASP3            < PAS DE STABILISATION D'IMAGE.
INIT2:   EQU         $
XWOR%:   VAL         0
<
< PAS DE PARCOURS DE L'IMAGE :
<
PP1:     EQU         $
         LA          AM45
         BSR         APAS            < ENTREE DU PAS SUR OX.
         JAL         PP1             < REFUS DES PAS<0.
         STA         PASX            < OK.
PP2:     EQU         $
         LA          AM46
         BSR         APAS            < ENTREE DU PAS SUR OY.
         JAL         PP2             < REFUS DES PAS<0.
         STA         PASY            < OK.
<
<        T E S T   D E S   V O I S I N S   ? ?
<
         LA          AM47
         BSR         AINTER          < INTERROGATION UTILISATEUR.
         STB         IVOIS           < SAVE LA REPONSE 0(OUI)/1(NON).
         JNE         VOIS1           < ON NE TESTERA PAS LES VOISINS.
         LA          AM48            < SI OUI, IL FAUT ENTRER LES
         BSR         APAS            < PAS DE RECHERCHE DES VOISINS.
         STA         DELTAX
         LA          AM49
         BSR         APAS
         STA         DELTAY
         LXI         9               < ET LES NOMBRES DE VOISINS
                                     < A PRENDRE EN COMPTE.
VOIS2:   EQU         $
         PSR         X
         LA          AM50
         BSR         AINTER          < S'IL Y A (X)-1 VOISINS, LE
                                     < POINT EST-IL A PRENDRE
                                     < EN COMPTE, C'EST-A-DIRE
                                     < DOIT-ON LE MARQUER ???
         PLR         X
         JNE         VOIS3           < NON.
         LA          LVOIS           < OUI,
         SBT         31,X            < ON LE MEMORISE DANS 'LVOIS'.
         STA         LVOIS
VOIS3:   EQU         $
         LBY         &AM50P
         ADRI        -1,A            < PASSAGE AU NOMBRE DE
                                     < VOISINS INFERIEUR.
         STBY        &AM50P
         JDX         VOIS2
VOIS1:   EQU         $
<
<        R E C U P E R A T I O N   D U   C E N T R E  :
<
CUR1:    EQU         $
         LAD         OG
         SVC         0               < OPEN GRAPHIQUE.
         LAD         CU
         SVC         0               < MISE EN FONCTION CURSEUR.
         LAD         LCU
         SVC         0               < LECTURE DU CURSEUR.
<
<        NOTA :
<                      ON NE TESTE PAS LES ERREURS
<                    EN RETOUR (CAS DU PASSAGE EN
<                    BATCH...), CAR 'CURSOR' EST INITIALISE
<                    PAR 'N'.
<
         IF          ORDI-"T",XWOR%,,XWOR%
         LA          ASP3
         JAE         CUR2            < ON N'EST PAS SOUS :SYS.
         WORD        '1EC5           < STABILISATION IMAGE VIDEO.
CUR2:    EQU         $
XWOR%:   VAL         0
         LA          CURSOR+1        < Y(CURSEUR).
         SLRS        DEDY            < REDUCTION VIDEO.
         SB          NLIG            < LES AXES GRAPHIQUES ET
                                     < VIDEOS SONT INVERES.
         NGR         A,Y             < Y=Y(CURSEUR VIDEO).
         LA          CURSOR+2        < X(CURSEUR).
         SLRS        DEDX            < REDUCTION VIDEO.
         LR          A,X             < X=X(CURSEUR VIDEO).
         BSR         ACLIGN          < CLIGNOTEMENT DU POINT (X,Y).
         LBY         CURSOR          < A=COMMANDE ASSOCIEE.
<
<        COMMANDES RECONNUES :
<                    C : CLIGNOTEMENT DU CURSEUR,
<                    N : ENTREE EN HEXA DES COORDONNEES,
<                    O : ENTREE PAR LE CURSEUR.
<
         CPI         "C"
         JE          CUR1            < CLIGNOTEMENT SEUL...
         CPI         "O"
         JE          CUR3            < ENTREE PAR CURSEUR..
         CPI         "N"
         JNE         CUR1            < RIEN COMPRIS, ON RECOMMENCE.
<
< ENTREE EN HEXA DES COORDONNEES :
<
         LAD         M6              < A=@MESSAGE 'X='.
         BSR         ACOEF           < ENTREE DE X(CENTR).
         LR          A,X             < X=X(CURSEUR VIDEO).
         LAD         M7              < A=@MESSAGE 'Y='.
         BSR         ACOEF           < ENTREE DE Y(CENTR).
         LR          A,Y             < Y=Y(CURSEUR VIDEO).
CUR3:    EQU         $
         STX         CENTR+X
         STY         CENTR+Y
<
<        E N T R E E   D E   L A   M A T R I C E  :
<
         LAD         M11
         BSR         ACOEF
         STA         MU11
         LAD         M12
         BSR         ACOEF
         STA         MU12
         LAD         M21
         BSR         ACOEF
         STA         MU21
         LAD         M22
         BSR         ACOEF
         STA         MU22
         LAD         D11
         BSR         ACOEF
         STA         DI11
         LAD         D12
         BSR         ACOEF
         STA         DI12
         LAD         D21
         BSR         ACOEF
         STA         DI21
         LAD         D22
         BSR         ACOEF
         STA         DI22
         LA          AM1
         BSR         ACOEF
         STA         TRANSX
         LA          AM2
         BSR         ACOEF
         STA         TRANSY
<
< 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'.
<
< DIMENSIONS RECTANGULAIRES DES POINTS :
<
DIM1:    EQU         $
         LA          AM41
         BSR         ACOORD
         JAE         DIM1            < ERREUR DE DIMENSION.
         STA         DIMX            < DIMENSION SUIVANT OX.
DIM2:    EQU         $
         LA          AM42
         BSR         ACOORD
         JAE         DIM2            < ERREUR DE DIMENSION.
         STA         DIMY            < DIMENSION SUIVANT OY.
<
< PAS D'EPAISSEMENT DES POINTS :
<
         LA          AM43
         BSR         APAS
         STA         MAILX           < PEUT ETRE NEGATIF (MAIS #0).
         LA          AM44
         BSR         APAS
         STA         MAILY           < PEUT ETRE NEGATIF (MAIS #0).
<
< FAUT-IL TRANSFORMER L'IMAGE ???
<
TR1:     EQU         $
         LAD         M8
         BSR         AINTER          < INTERROGATION OUI/NON.
<
<        REPONSES RECONNUES :
<                    O : OUI, IL FAUT TRANSFORMER CHAQUE POINT
<                        APRES APPLICATION DE LA MATRICE
<                        <MU,DI> ET DE <TRANSX,TRANSY>.
<                    N : NON...
<
         JE          TR2             < OUI, TRANSFORMATION.
         STZ         AITEM2          < NON, RAZ DE L'ENTRY POINT.
         JMP         TR3
TR2:     EQU         $
         LBY         &ATYP           < OUI, IL FAUT VALIDER LE
                                     < TYPE DE L'ITEM2.
         CPI         "P"             < TYPE PROGRAMME ????
         JNE         TR1             < NON, ON REPOSE LA QUESTION...
         LA          ABUFT           < PASSAGE AU MODE 'TRANS'.
         STA         ABUF1
         LAI         NSECRT
         STA         ANSECR
         LA          NMOTS
         SLRS        1               < AFIN DE NE RAZER
         STA         NMOTS           < QUE L'ITEM1 S'IL
         LA          AI1
         STA         AI2             < Y A TRANS....
TR3:     EQU         $
<
< INITIALISATION DU DISQUE :
<
         LAD         M9
         BSR         AINTER          < FAUT-IL RAZER L'IMAGE SCRATCH.
         JNE         RZ1             < NON.
         BSR         ARAZDK
RZ1:     EQU         $
<
<
<        Z O O M   D E   L ' I M A G E  :
<
<
         LY          NLIG            < COORDONNEE Y.
ZOOM1:   EQU         $
         LX          NPPL            < COORDONNEE X.
ZOOM4:   EQU         $
         BSR         ATEST           < TEST DU POINT (X,Y).
         JNC         ZOOM2           < POINT A 0 : RIEN A FAIRE.
<
< TEST DES VOISINS ??
<
         CPZ         IVOIS           < FAUT-IL TESTER LES VOISINS ???
         JNE         VOIS4           < NON.
         LBI         0               < OUI, INITIALISATION DU
                                     < COMPTEUR DES VOISINS.
         BSR         AINCX
         BSR         ADECY
         BSR         ADECX
         BSR         ADECX
         BSR         AINCY
         BSR         AINCY
         BSR         AINCX
         BSR         AINCX
         LA          DELTAX          < RETOUR AU POINT COURANT.
         SBR         A,X
         LA          DELTAY
         SBR         A,Y
         XR          B,X             < X=NBRE DE VOISINS.
         LA          LVOIS
         TBT         0,X             < CE NBRE EST-IL A PRENDRE
                                     < EN COMPTE ???
         XR          B,X             < RESTAURE X.
         JNC         ZOOM2           < NON, LE POINT (X,Y) EST
                                     < DONC IGNORE...
VOIS4:   EQU         $
<
< ZOOM D'UN POINT A 1 :
<
         PSR         X,Y
         LR          X,A
         SB          CENTR+X         < A=X-X(CENTR).
         STA         DELX            < DELX=X-X(CENTRE).
         LR          Y,A
         SB          CENTR+Y
         STA         DELY            < DELY=Y-Y(CENTRE).
<
< FORMULE DE TRANSFORMATION :
<
<        X=X(CENTRE)+(MU11/DI11)*DELX+(MU12/DI12)*DELY+TRANSX,
<        Y=Y(CENTRE)+(MU21/DI21)*DELX+(MU22/DI22)*DELY+TRANSY.
<
         MP          MU12
         DV          DI12
         PSR         A               < SAVE (MU12/DI12)*DELY.
         LA          DELX
         MP          MU11
         DV          DI11            < (MU11/DI11)*DELX,
         PLR         B               < (MU12/DI12)*DELY.
         ADR         B,A
         AD          TRANSX          < TRANSLATION X.
         LX          CENTR+X
         ADR         A,X             < NOUVEL X.
         LA          DELY
         MP          MU22
         DV          DI22
         PSR         A               < SAVE (MU22/DI22)*DELY.
         LA          DELX
         MP          MU21
         DV          DI21            < (MU21/DI21)*DELX,
         PLR         B               < (MU22/DI22)*DELY.
         ADR         B,A
         AD          TRANSY          < TRANSLATION Y.
         LY          CENTR+Y
         ADR         A,Y             < NOUVEL Y.
         CPZ         AITEM2          < FAUT-IL TRANSFORMER ???
         JE          ZOOM5           < NON...
         PSR         C,L,W           < PAR PRUDENCE...
         LBI         2               < PAR COMPATIBILITE AVEC L'
                                     < IMAGE DE DEPART AVEC 'TA'.
         BSR         &AITEM2         < ARG : X,Y - RESULT : X,Y.
         PLR         C,L,W
ZOOM5:   EQU         $
         LA          DIMX
         STA         KDIMX           < DIMENSION DEMANDEE SUR OX.
ZOOM6:   EQU         $
         LA          DIMY
         STA         KDIMY           < DIMENSION DEMANDEE SUR OY.
         PSR         Y
ZOOM7:   EQU         $
         LR          X,A
         JAL         ZOOM3           < NOUVEL X INVALIDE.
         CP          NPPL
         JG          ZOOM3           < NOUVEL X INVALIDE.
         LR          Y,A
         JAL         ZOOM3           < NOUVEL Y INVALIDE.
         CP          NLIG
         JG          ZOOM3           < NOUVEL Y INVALIDE.
         BSR         ASETV           < MARQUAGE VIRTUEL DU
                                     < NOUVEAU POINT (X,Y).
ZOOM3:   EQU         $
         LA          MAILY
         ADR         A,Y
         DC          KDIMY           < DECOMPTAGE SUR OY.
         JG          ZOOM7           < IL EN RESTE SUR OY.
         PLR         Y               < SINON, RETOUR Y INITIAL,
         LA          MAILX
         ADR         A,X
         DC          KDIMX           < DECOMPTAGE SUR OX.
         JG          ZOOM6
         PLR         X,Y             < RESTAURE LE POINT A 1.
ZOOM2:   EQU         $
         LA          PASX
         SBR         A,X             < PASSAGE COLONNE PRECEDENTE.
         CPZR        X
         JGE         ZOOM4           < ON RESTE SUR CETTE LIGNE.
         LA          PASY
         SBR         A,Y             < PASSAGE LIGNE PRECEDENTE.
         CPZR        Y               < ON A CHANGE DE LIGNE,
         JGE         ZOOM1           < OK, ELLE EXISTE...
         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.