NMTD:    VAL         "TU"
NMG:     VAL         " ="
         IF          NMPROC-NMTD,,XWOR%,
         IF          NMPROC-NMG,,XWOR%,
         IF          ATTENTION : 'NMPROC' EST MAUVAIS !!!
XWOR%:   VAL         0
         IF          NMPROC-NMTD,XWOR%9,,XWOR%9
         IDP         "TU - VERSION EXTENSION VOLUME DE TW"
XWOR%9:  VAL         0
         IF          NMPROC-NMG,XWOR%9,,XWOR%9
         IDP         " = - VERSION DE 'TU' INTERPRETATIVE"
XWOR%9:  VAL         0
         IDP         "RELEASE 27/05/1980"
         EOT         #SIP DEFINITION CMS5#
         EOT         #SIP DEF PROCESSEUR#
         PROG
         WORD        TW              < POINT D'ENTREE...
         WORD        0
PTW:     EQU         $               < DOIT VALOIR '12...
         LRP         L
         BR          -2,L            < ENTREE DANS LE PROCESSEUR...
         EOT         #SIP DEFINITION ITEM#
ITEM2:   EQU         ZERO+PILE-LTNI-LTNI
ITEM1:   EQU         ITEM2+LTNI
         EOT         #SIP IMAGE 256#
NBITMO:  VAL         16              < NOMBRE DE BITS PAR MOT.
NOCMO:   VAL         2               < NOMBRE D'OCTETS PAR MOT...
NBITOC:  VAL         NBITMO/NOCMO    < NOMBRE DE BITS PAR OCTET...
NBRHEX:  VAL         4               < NOMBRE DE CHIFFRES HEXAS PAR MOT.
BIT:     VAL         1
NMOTL:   VAL         CNMPL           < NOMBRE DE MOTS PAR LIGNE.
NLIG:    VAL         LIMAG/NMOTL     < NOMBRE DE LIGNES PAR TRAME.
NLIGM1:  VAL         NLIG-1          < ORDONNEE MAXIMALE.
XWOR%1:  VAL         NLIGM1+1
XWOR%2:  VAL         XWOR%1=0
         IF          BIT>XWOR%2-XWOR%1,,XWOR%,
         IF          ATTENTION : 'NLIGM1' DOIT ETRE UN MASQUE !!!
XWOR%:   VAL         0
NPOLM1:  VAL         NMOTL*NBITMO-1  < ABSCISSE MAXIMALE.
XWOR%1:  VAL         NPOLM1+1
XWOR%2:  VAL         XWOR%1=0
         IF          BIT>XWOR%2-XWOR%1,,XWOR%,
         IF          ATTENTION : 'NPOLM1' DOIT ETRE UN MASQUE !!!
XWOR%:   VAL         0
NCOOL:   VAL         3               < NOMBRE DE COULEURS DE BASE.
NIVMAX:  VAL         BIT>NCOOL-BIT   < NIVEAU MAX RECONNU.
MFFFF:   VAL         'FFFF           < MASQUE DU MOT.
EOT:     VAL         '04             < CARACTERE 'EOT'.
SGNDLN:  VAL         3               < FONCTION DE DELETE SGN,
SGNSTN:  VAL         4               < FONCTION DE STORE SGN,
SGNLON:  VAL         5               < FONCTION DE LOAD SOUS ACN SGN,
SGNLNS:  VAL         6               < FONCTION DE LOAD SOUS :SYS SGN.
         PAGE
<
<
<        S E L E C T I O N   D U   M O D E   D ' E N T R E E  :
<
<
NMPROD:  VAL         NMPROC          < SAUVEGARDE DU NOM REEL DU PROCESSEUR,
                                     < ON NE SAIT JAMAIS ??!?!?!?
VISU:    VAL         0               < MODE D'ENTREE PAR LA VISU,
ITEM:    VAL         1               < MODE D'ENTREE PAR L'ITEM1.
MODE:    VAL         VISU            < A PRIORI, 'TW'/'TX' : ENTREE VISU...
         IF          NMPROC-NMG,XWOR%,,XWOR%
NMPROC:  VAL         NMTD            < SI " =", ON LE REMPLACE PAR "TU",
MODE:    VAL         ITEM            < AVEC ENTREE PAR L'ITEM1.
XWOR%:   VAL         0
         PAGE
<
<
<        D E F I N I T I O N   D E   L ' I M A G E  :
<
<
NOM:     EQU         ZERO+PILE+5-LNOM
IMAG:    EQU         NOM+LNOM
IMAGE:   EQU         IMAG
IMAGR:   EQU         IMAGE+0
IMAGV:   EQU         IMAGR+LIMAG
IMAGB:   EQU         IMAGV+LIMAG
TV1::    VAL         0               < ZONE DE VISUALISATION TELEVISION.
         IF          TV1,,XWOR%,
         IF          ATTENTION : DE NOMBREUSES CHOSES VONT MERDER !!!
XWOR%:   VAL         0
AMASK::  VAL         NCOOL*LIMAG+TV1 < ADRESSE DU MASQUE DANS LA 'CDA'.
IZBUF::  VAL         AMASK+LIMAG     < DEBUT DU BLOC COURANT DU Z-BUFFER DANS
                                     < LA 'CDA' QUAND ON EST EN '!CDAI'...
LIZBUF:: VAL         '1000           < LE Z-BUFFER EST DECOUPE EN BLOCS DE
                                     < 16K MOTS.
NZBUF::  VAL         16              < CE QUI FAIT DONC 16 BLOCS...
LEZBUF:: VAL         2               < MAIS, OH SURPRISE, LE Z-BUFFER PEUT
                                     < AVOIR DES ENTREES DE 2 MOTS (CF. " +") !!
LK::     VAL         1024
XWOR%1:  VAL         LK
XWOR%2:  VAL         LIZBUF/XWOR%1*NZBUF
XWOR%3:  VAL         LIMAG/XWOR%1*NBITMO
         IF          XWOR%3-XWOR%2,,XWOR%,
         IF          ATTENTION : LIZBUF ET NZBUF INCOMPATIBLES !!!
XWOR%:   VAL         0
LSDKU::  VAL         128
NSDKU::  VAL         LIZBUF/LSDKU    < INCREMENT DE PASSAGE D'UN BLOC DU
                                     < Z-BUFFER AU SUIVANT SUR 'DKU'...
TV2::    VAL         IZBUF+LIZBUF    < ZONE DE SAUVEGARDE DE L'IMAGE RESIDENTE
                                     < LORS DES INTERPOLATIONS DE COULEURS.
LNOMP:   VAL         LNOM-1          < LONGUEUR UTILE DU NOM (A CAUSE DE
                                     < L'EOT A PRIORI...
         PAGE
<
<
<        D E S C R I P T E U R   D ' U N   P O I N T
<        D A N S   U N E   I M A G E   H A U T E - D E F I N I T I O N  :
<
<
         DSEC
POINT:   BYTE        1;2;3;4         < 1 : NIVEAU DE ROUGE BITS 1-8,
                                     < 2 : NIVEAU DE VERT BITS 1-8,
                                     < 3 : NIVEAU DE BLEU BITS 1-8,
                                     < 4 : CONTIENT EN TETE LES BITS 0
                                     <     DES NIVEAUX DE ROUGE, DE VERT,
                                     <     ET DE BLEU DANS L'ORDRE :
BR::     VAL         NBITMO+NBITOC+0 < POIDS FORT DU NIVEAU DE ROUGE,
BV::     VAL         BR+1            < DE MEME POUR LE VERT,
BB::     VAL         BV+1            < ET ENFIN POUR LE BLEU...
LPOINT:: VAL         $-POINT
         PROG
         PAGE
<
<
<        M E S S A G E S  :
<
<
MMCDA:   BYTE        5;'6D
MCDAP:   ASCI        "!CDA"
PI:      BYTE        "P";EOT
MCDA:    ASCI        "!CDA"
         BYTE        EOT;0
MDKS:    ASCI        "!DK "
         BYTE        "S";EOT
MDKF:    ASCI        "!DK "
         BYTE        "F";EOT
MDKON:   ASCI        "!DK S0 O"
         BYTE        "N";EOT
MDKOFF:  ASCI        "!DK S0 OFF"
         BYTE        EOT;0
REP:     DZS         NBRHEX/NOCMO    < BUFFER DES REPONSES.
MERR:    BYTE        1;"?"
         IF          MODE-VISU,XWOR%7,,XWOR%7
MOK:     BYTE        4;'6D
         ASCI        "OK?"
MSAV:    BYTE        5;'6D
         ASCI        "SAVE"
MREST:   BYTE        8;'6D
         ASCI        "RESTORE"
MINT:    BYTE        2;'6D;">";0
MNOM:    BYTE        5;'6D
         ASCI        "NOM="
MORGX:   BYTE        3;'6D
         ASCI        "X="
MORGY:   BYTE        3;'6D
         ASCI        "Y="
MTORE:   BYTE        5;'6D
         ASCI        "TOR?"
MDK:     BYTE        4;'6D
         ASCI        "DK? "
MAD:     BYTE        3;'6D
         ASCI        "@="
MMEM:    BYTE        5;'6D
         ASCI        "MEM="
MLON:    BYTE        3;'6D
         ASCI        "L="
MTRAN:   BYTE        3;'6D
         ASCI        "T="
MASKO:   BYTE        9;'6D
         ASCI        "MASK ON?"
MSLAS:   BYTE        1;"/"
MVOL:    BYTE        6;"O"
         ASCI        "LUME="
MVIDEO:  BYTE        10;'6D
         ASCI        "DK VIDEO="
MINIVO:  BYTE        5;'6D
         ASCI        "INC="
MMODUL:  BYTE        5;'6D
         ASCI        "MOD?"
XWOR%7:  VAL         0
<
< ZONE EN RECOUVREMENT :
<
BUFIN:   EQU         ITEM2+'518      < BUFFER D'ENTREE DES FONDS.
LBUFIN:  VAL         NBITMO/NOCMO
LSTACK:: VAL         30              < LONGUEUR DE LA PILE DE TRAVAIL.
STACK:   EQU         BUFIN+LBUFIN    < PILE DE TRAVAIL.
LMC::    VAL         NIVMAX+1
MC:      EQU         STACK+LSTACK    < MEMOIRE DES COULEURS.
         IF          ITEM1-MC-LMC,,,XWOR%
         IF          ATTENTION : LA ZONE EN RECOUVREMENT DE
         IF          L'ITEM2, RECOUVRE AUSSI L'ITEM1 !!!
XWOR%:   VAL         0
         PAGE
<
<
<        L O C A L  :
<
<
         LOCAL
LOC:     EQU         $
<
< CONSTANTES :
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
NGE:     ASCI        "GE"            < NOM DU PROCESSEUR DE RETOUR.
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
NSD:     ASCI        "SD"            < NOM DE L'OVERLAY D'APPEL.
TCALL:   WORD        "GE";"EI"       < NOM DES OVERLAYS DE RETOUR SI ALT-MODE.
NCALL:   WORD        TCALL,X
NPCALL:  WORD        0               < NOM DU PROCESSEUR DE RETOUR SI ALT-MODE.
XWOR%7:  VAL         0
SAVER:   WORD        0               < SAUVEGARDE D'UN MOT DE LA TRAME
                                     < RESIDENTE ROUGE,
SAVEV:   WORD        0               < DE MEME POUR LE VERT,
SAVEB:   WORD        0               < DE MEME POUR LE BLEU.
MCDAR:   EQU         SAVER           < SAUVEGARDE D'UN MOT DE LA TRAME
                                     < SCRATCH ROUGE,
MCDAV:   EQU         SAVEV           < DE MEME POUR LE VERT,
MCDAB:   EQU         SAVEB           < DE MEME POUR LE BLEU.
SAVEK:   WORD        0               < SAUVEGARDE DU REGISTRE 'K'.
KIN:     WORD        -1              < COMPTEUR DES ENTREES...
         IF          MODE-VISU,XWOR%7,,XWOR%7
NMOTS:   WORD        2*LTNI          < LONGUEUR MOTS DES 2 ITEMS.
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
NMOTS:   WORD        LTNI            < POUR NE RAZER QUE L'ITEM2...
XWOR%7:  VAL         0
XR:      WORD        0               < COORDONNEE X D'UN POINT RESIDENT,
YR:      WORD        0               < COORDONNEE Y D'UN POINT RESIDENT,
XS:      WORD        0               < COORDONNEE X D'UN POINT SCRATCH,
YS:      WORD        0               < COORDONNEE Y D'UN POINT SCRATCH.
ORGX:    WORD        0               < ORIGINE EN X DE L'IMAGE SCRATCH
                                     < PAR RAPPORT A L'IMAGE RESIDENTE,
ORGY:    WORD        0               < DE MEME, ORIGINE EN Y...
MODX:    WORD        0               < 0 : "TORE" SUR LES X,
                                     < 1 : L'IMAGE SCRATCH NE SE REFERME PAS...
MODY:    WORD        0               < DE MEME SUR L'AXE DES Y.
WORK1:   WORD        0               < VARIABLE DE TRAVAIL...
MCDAM:   WORD        0               < MOT COURANT DE LA 'CDA'.
IMASKO:  WORD        0               < 0 : MASK OFF,
                                     < 1 : MASK ON...
         IF          MODE-ITEM,XWOR%7,,XWOR%7
<
< DONNEES DE SIMULATION DES ENTREES :
<
IEG:     WORD        0               < INDEX COURANT DE L'ITEM1.
NCP:     WORD        NBCAR*NBLIG-LNOM  < LONGUEUR MAX D'UN ITEM,
                                       < ON RETRANCHE LNOM, CAR LE NOM
                                       < D'UNE IMAGE DOIT ETRE IMPERATIVEMENT
                                       < DEVANT L'IMAGE...
AI1:     WORD        ITEM1+LTN,X     < RELAI D'ACCES A L'ITEM1.
ABUFC:   WORD        0               < RELAI D'ACCES AU BUFFER COURANT.
XWOR%7:  VAL         0
<
< RELAIS DE TABLES, D'IMAGES...
<
ACOM:    WORD        KOM,X           < TABLE DES COMMANDES RECONNUES.
AMERR:   EQU         MERR            < MESSAGE D'ERREUR.
         IF          MODE-VISU,XWOR%7,,XWOR%7
AMINT:   EQU         MINT            < MESSAGE D'INVITATION.
AMNOM:   EQU         MNOM            < "NOM="
AMORGX:  EQU         MORGX           < "ORGX="
AMORGY:  EQU         MORGY           < "ORGY="
AMTORE:  EQU         MTORE           < "TORE?"
AMASKO:  EQU         MASKO           < "MASK ON?"
AMSLAS:  EQU         MSLAS           < "/"
AMDK:    EQU         MDK             < "DK?"
AMAD:    EQU         MAD             < "@="
AMMEM:   EQU         MMEM            < "MEM="
AMLON:   EQU         MLON            < "L="
AMTRAN:  EQU         MTRAN           < "T="
XWOR%7:  VAL         0
AREP:    WORD        REP             < ACCES AU BUFFER DE REPONSE...
AREPX:   WORD        REP,X           < DE MEME EN INDEXE...
ABUFIN:  WORD        BUFIN,X         < ACCES AU BUFFER DE GENERATION DU FOND.
AMCDAP:  EQU         MCDAP           < !CDAP.
AMCDA:   EQU         MCDA            < !CDA.
AMMCDA:  EQU         MMCDA           < !CDA.
API:     WORD        PI              < RELAI POUR RANGER "P" OU "I"...
AIMAGR:  WORD        IMAGR,X         < RELAI TRAME ROUGE,
AIMAGV:  WORD        IMAGV,X         < RELAI TRAME VERTE,
AIMAGB:  WORD        IMAGB,X         < RELAI TRAME BLEUE.
AITEM2:  WORD        ITEM2-1,X       < POUR RAZER LES ITEMS 1 ET 2.
AEOT:    WORD        NOM+LNOMP       < POUR FORCER UN EOT...
<
< RELAIS DE SOUS-PROGRAMMES :
<
AOVL:    WORD        OVL             < CHARGEMENT DES OVERLAYS...
         IF          MODE-VISU,XWOR%7,,XWOR%7
APRINT:  WORD        PRINT           < EDITION D'UN MESSAGE.
XWOR%7:  VAL         0
AENTER:  WORD        ENTER           < ENTREE DE QUELQUE CHOSE SUR LA VISU...
AHEX:    WORD        HEX             < CONVERSION DE 4 CHIFFRES HEXAS EN BINAIRE
AIN:     WORD        IN              < ENTREE D'UN CARACTERE REPONSE.
AIHEX:   WORD        IHEX            < ENTREE D'UN NOMBRE HEXA-DECIMAL.
ACCI:    WORD        CCI             < ACCES AU CCI.
AGOSGN:  WORD        GOSGN           < POUR ACCEDER AU SGN...
ASPAPR:  WORD        SPAPR           < ACCES A UN POINT RESIDENT (X,Y).
ASPAPS:  WORD        SPAPS           < ACCES A UN POINT SCRATCH (X,Y).
ASPSPR:  WORD        SPSPR           < RANGEMENT D'UN POINT RESIDENT (X,Y).
ASPSPS:  WORD        SPSPS           < RANGEMENT D'UN POINT SCRATCH (X,Y).
ASPGPR:  EQU         ASPAPR
ASPGPS:  EQU         ASPAPS
ASPRPR:  EQU         ASPSPR
ASPRPS:  EQU         ASPSPS
ASPACD:  WORD        SPACD           < TRANSFERT EN RESIDENT AVEC MASQUE,
AINVER:  WORD        INVER           < MODULE DE "PERMUTATION" DES COULEURS.
APCHNI:  WORD        PCHNI           < MODULO DE TRANSLATION DES NIVEAUX.
APMOV5:  WORD        PMOV5           < TV R --> RESIDENT,
APMOV6:  WORD        PMOV6           < TV V --> RESIDENT,
APMOV7:  WORD        PMOV7           < TV B --> RESIDENT.
ASP:     WORD        0               < RELAI VARIABLE CONTENANT L'ADRESSE DE
                                     < L'UN DES SOUS-PROGRAMMES PRECEDENTS.
ASPOP:   WORD        SPOP            < OPERATIONS INTER-IMAGES...
ALOOP:   WORD        LOOP            < BOUCLE DE L'INTERROGATION.
         IF          MODE-ITEM,XWOR%7,,XWOR%7
AALTM:   WORD        ALTM            < TRAITEMENT DES RETOURS BRUTAUX...
XWOR%7:  VAL         0
<
< DEMANDES A CMS5 :
<
DEMIN:   WORD        '0101           < ENTREE D'UN CARACTERE DE REPONSE.
         WORD        REP-ZERO*NOCMO
         WORD        1
DEMHEX:  WORD        '0101           < ENTREE D'UN NOMBRE HEXA-DECIMAL.
         WORD        REP-ZERO*NOCMO
         WORD        NBRHEX
DEMOUT:  WORD        '0202           < ECRITURE D'UN MESSAGE SUR LA VISU.
         WORD        MERR-ZERO*NOCMO+1
         WORD        1               < MESSAGE D'ERREUR POUR " P"...
DEMMEM:  WORD        4               < DEMANDE DE 16 K MOTS...
RELMEM:  WORD        4               < RETOUR A 4K MOTS...
         WORD        '8000
         WORD        '2000
DEMCC:   WORD        2               < ACCES AU CCI INTERPRETATIF.
         WORD        0               < ADRESSE DE LA CARTE.
         WORD        80
NOMIN:   WORD        '0101           < ENTREE DU NOM D'UNE IMAGE.
         WORD        NOM-ZERO*NOCMO
         WORD        LNOMP*NOCMO
SGN:     WORD        '0002           < POUR LES ACCES AU SGN.
         WORD        NOM-ZERO*NOCMO
         WORD        LIMAG*NCOOL+LNOM*NOCMO
         WORD        -1              < LA VALEUR SUIT LE NOM...
NDKU::   VAL         '8A             < 'NVP' D'ACCES A 'DKU'...
TVDKU:   VAL         NDKU>NBITOC?'01  < ACCES A 'DKU' POUR LA 'TV'.
DEMTVR:  WORD        TVDKU           < ACCES AU ROUGE.
         WORD        IMAGR-ZERO*NOCMO
         WORD        LIMAG*NOCMO
         WORD        TVPR
         IF          MODE-ITEM,XWOR%7,,XWOR%7
NITER:   WORD        1               < NITER=NOMBRE D'ITERATIONS DES LECTURES
                                     <       'DKU' AFIN DE RALENTIR LE DEBIT.
XWOR%7:  VAL         0
DEMTVV:  WORD        TVDKU           < ACCES AU VERT.
         WORD        IMAGV-ZERO*NOCMO
         WORD        LIMAG*NOCMO
         WORD        TVPV
DEMTVB:  WORD        TVDKU           < ACCES AU BLEU.
         WORD        IMAGB-ZERO*NOCMO
         WORD        LIMAG*NOCMO
         WORD        TVPB
DEMLOD:  BYTE        '80?SGNLNS;'02  < DEMANDE DE CHARGEMENT DE "GE".
         WORD        BRANCH-ZERO*NOCMO
         WORD        ZERO-BRANCH+PILE-LTNI-LTNI*NOCMO
         WORD        -1
<
< DONNEES DE SAUVEGARDE DE LA 'CDAI' :
<
NBDKU::  VAL         4               < NOMBRE D'OPERATIONS ELEMENTAIRES...
XWOR%1:  VAL         NBDKU=0
         IF          1>XWOR%1-NBDKU,,XWOR%,
         IF          ATTENTION : 'NBDKU' N'EST PAS UNE PUISSANCE DE 2 !!!
XWOR%:   VAL         0
XWOR%1:  VAL         XWOR%1+1        < +1 CAR LA SAUVEGARDE/RESTAURATION
                                     < SE FAIT EN 2 ETAPES...
TSDKU::  VAL         '2000
                                     < TAILLE MOTS DE CHACUN DES BLOCS QUE
                                     < L'ON SAUVEGARDE...
         IF          TSDKU>XWOR%1,,XWOR%,
         IF          ATTENTION : LA 'CDAI' EST INCOMPLETEMENT SAUVEGARDEE !!!
XWOR%:   VAL         0
MAXDKU:  WORD        NZBUF*NSDKU*LEZBUF
                                     < PREMIERE ADRESSE DKU DERRIERE LE
                                     < Z-BUFFER DISPONIBLE...
INCDKU:  WORD        TSDKU/LSDKU     < POUR PASSER D'UN BLOC 'DKU' A L'AUTRE.
RWDKU:   BYTE        NDKU;'00        < DEMANDE DE LECTURE/ECRITURE DE 'CDAI'.
         WORD        TV1*NOCMO
         WORD        TSDKU*NOCMO
         WORD        NZBUF*NSDKU*LEZBUF
         IF          MODE-ITEM,XWOR%7,,XWOR%7
SITEM1:  DZS         LNOM/NOCMO      < POUR SAUVEGARDER LA FIN DE L'ITEM1.
XWOR%7:  VAL         0
<
< BUFFER DE TRANSFERT ENTRE
< LES ADRESSES HAUTES ET BASSES
< DE LA 'CDAI' :
<
LBTRAN:: VAL         64
BTRAN:   EQU         $
         DZS         LBTRAN
         PAGE
<
<
<        C O M M O N  :
<
<
         COMMON
COMON:   WORD        0               < LE PREMIER MOT DU COMMON EST RESERVE
                                     < A L'OPERATEUR FLOTTANT !!!
<
< DONNEES DE PASSAGE DE 'MEMTV' A 'DKU' :
<
SDKUR::  VAL         '04             < 'DKU' --> 'MEMTV'.
SDKUW::  VAL         '06             < 'MEMTV' --> 'DKU'.
ROUGE::  VAL         0               < PREMIER MOT DE 'MEMTV'.
SDKU:    BYTE        NDKU;0          < DEMANDE D'ECHANGE 'MEMTV'-'DKU'.
AMDKU:   WORD        ROUGE
LODKU:   WORD        LIMAG*NOCMO*NCOOL
ASDKU:   WORD        0               < ADRESSE COURANTE SUR 'DKU'.
XASDKU:: VAL         ZERO-BRANCH     < PAR OU TRANSMETTRE L'ADRESSE 'DKU'
                                     < COURANTE... (MOT0)
TDKU:    WORD        '23             < CONSTANTE DE PASSAGE D'UNE IMAGE A
                                     < UNE AUTRE, EN LAISSANT UN "GAP" ENTRE 2.
ASPDK1:  WORD        SPDK1           < CHOIX ENTRE 'DKU' ET...
         IF          MODE-VISU,XWOR%7,,XWOR%7
EOM::    VAL         '0D             < SI VISU : LIMITEUR=R/C...
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
EOM::    VAL         '04             < SI ITEM : LIMITEUR=EOT...
XWOR%7:  VAL         0
DKURP:   BYTE        "+";EOM         < INCREMENTATION AUTOMATIQUE,
DKURM:   BYTE        "-";EOM         < DECREMENTATION AUTOMATIQUE.
<
< ACCES AU VOLUME EXTENSION :
<
MQFFFF:  ASCI        "!QFFFF"
         BYTE        EOT;0
AASDKU:  ASCI        "!ASSIGN A=DK"
         BYTE        "U";'04
MVDKU:   ASCI        "!DKU M A"
NAVOL:   BYTE        "=";"X";"Y";"Z";"T";'04
ANAVOL:  WORD        NAVOL,X         < POUR GENERER LE NUMERO DE VOLUME.
MDVDKU:  ASCI        "!DKU D A"
         BYTE        '04;0
MCLOSE:  ASCI        "!ASSIGN A="
         BYTE        "S";'04
VOLNUM:  WORD        0               < NUMERO DU VOLUME COURANT (0=ABSENT)...
<
< GESTION DU DISQUE VIDEO :
<
LMDKV::  VAL         20              < LONGUEUR MAX DES MESSAGES VERS LE
                                     < DISQUE VIDEO...
MBDKV:   BYTE        '6D;"*"         < POUR FAIRE L'ECHO DES MESSAGES REN-
                                     < VOYES PAR LE DISQUE VIDEO.
LMBDKV:: VAL         $-MBDKV*NOCMO   < ET LONGUEUR...
BDKV:    DZS         LMDKV/NOCMO     < BUFFER DES MESSAGES DISQUE VIDEO...
ABDKV:   WORD        BDKV,X          < RELAI D'ACCES AU BUFFER...
DMDKV:   WORD        '0101           < ENTREE DES MESSAGES DESTINES AU DISQUE
         WORD        BDKV-ZERO*NOCMO < VIDEO.
         WORD        LMDKV
SDKV:    WORD        '8C02           < ENVOI DES MESSAGES AU DISQUE VIDEO :
         WORD        BDKV-ZERO*NOCMO
LMIN:    WORD        0               < LONGUEUR COURANTE DU MESSAGE (DEFINIE
                                     < PAR 'ENTER').
DMDKVC:  WORD        '8C07           < POUR CLEARER LE BUFFER D'ANTICIPATION
         BYTE        '04;0           < DE LA VISU8...
IREADV:  WORD        1               < +1 >0 : LIRE LE COMPTE-RENDU DU DISQUE,
                                     < -1 <0 : NE PAS LE LIRE, CE QUI PERMET
                                     <         DES OPERATIONS PARALLELES...
DMDKVR:  WORD        '8C00           < LECTURE DES REPONSES DU DSQIE VIDEO.
         WORD        BDKV-ZERO*NOCMO
         WORD        LMDKV
IREPDV:  WORD        1               < +1 >0 : EDITER LES REPONSES DU DISQUE,
                                     < -1 <0 : NE PAS LES EDITER (VOIR LA COM-
                                     <         MANDE EN BASCULE "H").
DMDKVW:  WORD        '0202           < EDITION DES REPONSES.
         WORD        MBDKV-ZERO*NOCMO
         WORD        0               < LONGUEUR VARIABLE...
<
< ENVOI EN ZDC :
<
VALZDC:  WORD        0               < MOT DE SYNCHRONISATION...
LONZDC:: VAL         $-VALZDC*2
DEMZDC:  WORD        '0008           < ACCES A LA SYNCHRONISATION...
         WORD        VALZDC-ZERO*2
         WORD        LONZDC
         WORD        'C001
DELZDC:  WORD        '000A           < ENVOI DE L'ACQUITTEMENT ZDC.
         WORD        VALZDC-ZERO*2
         WORD        LONZDC
         WORD        'C000
<
< DONNEES DE TRANSLATION DES NIVEAUX :
<
INIVO:   WORD        0               < AMPLITUDE DE LA TRANSLATION DES NIVEAUX,
TNIVO:   WORD        0               < =0 : LES NIVEAUX SERONT CALCULES MODULO,
                                     < #0 : LES NIVEAUX DEBORDANTS SERONT MIS
                                     <      AU NOIR.
         PAGE
<
<
<        T A B L E   D E S   C O M M A N D E S  :
<
<
REP0:    VAL         "+"             < PREMIERE COMMANDE.
KOM:     EQU         $-REP0          < ELLES COMMENCENT A "+"...
         WORD        STORE           < + : STORE SGN LE RESIDENT
AERROR:  WORD        ERROR           < ,
         WORD        DELETE          < - : DELETE SGN LE RESIDENT
         WORD        ERROR           <.
         WORD        ERROR           < /
         WORD        MOV0            < 0 : TV <-- RESIDENT R+V+B
         WORD        MOV1            < 1 : TV <-- RESIDENT R
         WORD        MOV2            < 2 : TV <-- RESIDENT V
         WORD        MOV3            < 3 : TV <-- RESIDENT B
         WORD        MOV4            < 4 : RESIDENT <-- TV R+V+B
         WORD        MOV5            < 5 : RESIDENT <-- TV R
         WORD        MOV6            < 6 : RESIDENT <-- TV V
         WORD        MOV7            < 7 : RESIDENT <-- TV B
         WORD        RESTOR          < 8 : RESTAURATION 'DKU' --> 'CDAI'
         WORD        SAVE            < 9 : SAUVEGARDE 'CDAI' --> 'DKU'
         WORD        ERROR           < :
         WORD        ERROR           < ;
         WORD        ERROR           < <
         WORD        DEFDKU          < = : DEFINITION DES ECHANGES 'DKU'
         WORD        ERROR           < >
         WORD        ERROR           < ?
         WORD        ERROR           < @
         WORD        ERROR           < A
         WORD        BON             < B : "!DK S0 ON"
         WORD        DKUS            < C : "!DK S" : MISE DE DKU EN MODE 'SLOW'
         WORD        DISP            < D : RESIDENT <-- IMAGE SGN
         WORD        ERROR           < E
         WORD        GOGE            < F : FIN
         WORD        VIDEO           < G : COMMANDE DU DISQUE VIDEO
         WORD        INVREP          < H : EDITER OUI/NON LES REPONSES 'DKV'
         WORD        COMPL           < I : "PERMUTATION" DES COULEURS
         WORD        GETZDC          < J : SYNCHRONISATION SUR LA 'ZDC'
         WORD        PNITER          < K : RALENTISSEMENT DU DEBIT DE " ="
         WORD        IMLOAD          < L : RESIDENT <-- (SCRATCH) SANS MASQUE
         WORD        MAUVAI          < M : "!DK S0 OFF"
         WORD        NAME            < N : NOMME L'IMAGE RESIDENTE
         WORD        ERROR           < O
         WORD        CHNIV           < P : TRANSLATION DES NIVEAUX
         WORD        CRDKV           < Q : LIRE OUI/NON LE COMPTE-RENDU 'DKV'
         WORD        DKUF            < R : "!DK F" : MISE DE DKU EN MODE 'FAST'
         WORD        IMSAV           < S : SCRATCH <-- (RESIDENT)
         WORD        ERROR           < T
         WORD        IMUP            < U : RESIDENT <-- (SCRATCH) AVEC MASQUE
         WORD        VOLUME          < V : ENTREE DU VOLUME COURANT
         WORD        GOCCI           < W : RETOUR TEMPORAIRE AU CCI
         WORD        GORGX           < X : POSITIONNEMENT DE 'ORGX'
         WORD        GORGY           < Y : POSITIONNEMENT DE 'ORGY'
REPZ:    VAL         $-KOM-1         < DERNIERE COMMANDE.
         PAGE
         PROG
         IF          MODE-VISU,XWOR%7,,XWOR%7
<
<
<        E D I T I O N   D ' U N   M E S S A G E  :
<
<
<        ARGUMENT :
<                    A=ADRESSE MOT DU MESSAGE, DONT LE
<                    PREMIER OCTET EST LA LONGUEUR.
<
<
PRINT:   EQU         $
         PSR         A,X,C
         LR          A,C
         ADR         A,A
         ADRI        1,A             < CALCUL DE L'ADRESSE OCTET DU MESSAGE.
         STA         DEMOUT+1
         LBY         0,C             < ACCES A LA LONGUEUR...
         STA         DEMOUT+2
         LAD         DEMOUT
         SVC         0               < ENVOI DU MESSAGE...
         PLR         A,X,C
         RSR
XWOR%7:  VAL         0
         PAGE
<
<
<        E N T R E E   D E   Q U E L Q U E   C H O S E  :
<
<
<        ARGUMENT :
<                    A=ADRESSE DE LA DEMANDE.
<
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
ENTER:   EQU         $
         PSR         A,B,X
         SVC         0               < ENVOI DE LA DEMANDE...
         ACTD        3               < ENTREE DE LA 'BOX',
         STB         LMIN            < ON MEMORISE DONC LE NOMBRE DE CARACTERES
                                     < LUS LORS DES ENTREES VISUS...
         CPZR        X               < AU CAS OU...
         PLR         A,B,X
         RSR
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
ENTER:   EQU         $
         PSR         A,X,Y,W
         LR          A,W             < W=ADRESSE DE LA DEMANDE :
         LRM         A
         WORD        '0101
         CP          0,W             < EST-CE BIEN UNE ENTREE AVEC ECHO
                                     < SUR LA VISU UTILISATEUR ???
         JE          ENTER1          < OUI...
         QUIT        1               < NON, ???!???!
ENTER1:  EQU         $
         LA          1,W             < A=ADRESSE OCTET DU BUFFER,
         LYI         0               < Y=INDEX DU BUFFER,
         SLRS        NOCMO=0         < CONVERSION EN UNE ADRESSE MOT,
         ADCR        Y               < Y=INDEX INITIAL DU BUFFER COURANT.
         SBT         0               < MISE EN PLACE DU BIT INDEX,
         STA         ABUFC           < ET GENERATION DU RELAI VERS LE BUFFER.
         LX          2,W             < X=NOMBRE D'OCTETS MAX A DEPLACER...
ENTER2:  EQU         $
         PSR         X
         LA          IEG             < A=INDEX COURANT DE L'ITEM1,
         CP          NCP             < ET VALIDATION ???
         JL          ENTER3          < OK...
         BR          AALTM           < NON, ON FAIT COMME SI UN ALT-MODE
                                     < ETAIT ARRIVE...
ENTER3:  EQU         $
         IC          IEG             < PROGRESSION DE L'INDEX DE L'ITEM1.
         LR          A,X             < X=INDEX D'ACCES A L'ITEM1,
         LBY         &AI1            < A=CARACTERE COURANT DE L'ITEM1,
         CPI         " "             < EST-CE L'ELEMENT NEUTRE ???
         JNE         ENTER6          < NON...
         PLR         X               < OUI,
         LR          X,A
         CP          2,W             < EST-ON EN TETE DU MESSAGE ???
         JE          ENTER2          < OUI, ON IGNORE LE 'SPACE'...
         PSR         X               < NON, ON LE CONSERVE...
         LAI         " "             < RESTAURATION DE 'A'...
ENTER6:  EQU         $
         CPI         ";"             < EST-CE LA FIN DE MESSAGE ???
         JNE         ENTER4          < NON,
         LAI         '04             < OUI, ON LE REMPLACE PAR 'EOT'...
ENTER4:  EQU         $
         LR          Y,X
         STBY        &ABUFC          < ET RANGEMENT DANS LE BUFFER...
         ADRI        1,Y             < PROGRESSION DE L'INDEX BUFFER.
         PLR         X
         CPI         '04             < EST-CE UNE FIN DE MESSAGE ???
         JE          ENTER5          < OUI, ON ARRETE LA...
         JDX         ENTER2          < NON, ON CONTINUE...
ENTER5:  EQU         $
         STY         LMIN            < SIMULATION DE LA 'BOX'...
         PLR         A,X,Y,W
         RSR
XWOR%7:  VAL         0
         PAGE
<
<
<        C O N V E R S I O N   H E X A   -->   B I N A I R E  :
<
<
<        ARGUMENT :
<                    LE BUFFER 'REP'.
<
<
<        RESULTAT :
<                    B=0 : (A)=VALEUR BINAIRE,
<                    B#0 : ERREUR DE SYNTAXE HEXA-DECIMALE.
<                    LES INDICATEURS POSITIONNES SUR (B).
<
<
HEX:     EQU         $
BASE10:  VAL         10
BASE16:  VAL         16
         PSR         X,Y
         LYI         NBRHEX
         LXI         0               < INDEX DU BUFFER DE REPONSE.
         LBI         0               < CLEAR LE REGISTRE B.
HEX1:    EQU         $
         LBY         &AREPX          < A=CARACTERE COURANT DU BUFFER.
         ADRI        -"0",A
         JAL         HEX4            < ERREUR : CARACTERE NON RECONNU.
         CPI         BASE10          < EST-CE UN CHIFFRE ???
         JL          HEX2            < OUI , C'EST UN CHIFFRE.
         ADRI        -"A"+"9"+1,A    < NON.
         CPI         BASE10          < VALIDATION.
         JL          HEX4            < ERREUR : CARACTERE NON RECONNU.
         CPI         BASE16          < VALIDATION.
         JGE         HEX4            < ERREUR : CARACTERE NON RECONNU.
HEX2:    EQU         $
         SCRS        NBITMO/NBRHEX   < MISE DES 4 BITS EN TETE DE A.
         SCLD        NBITMO/NBRHEX   < ET CONCATENATION A B.
         ADRI        1,X             < PROGRESSION DE L'INDEX.
         CPR         X,Y             < EST-CE FINI ???
         JNE         HEX1            < NON , ON CONTINUE.
         LR          B,A             < A=VALEUR BINAIRE DE (REP).
         LBI         0               < B=0 : RETOUR OK.
HEX3:    EQU         $
         PLR         X,Y
         CPZR        B               < POSITIONNEMENT DES INDICATEURS.
         RSR
<
< RETOURS EN ERREUR :
<
HEX4:    EQU         $
         LR          B,A             < A=VALEUR COURANTE...
         LBI         1               < B#0.
         JMP         HEX3            < VERS LA SORTIE ...
         PAGE
<
<
<        E N T R E E   U N   C A R A C T E R E  :
<
<
IN:      EQU         $
         LAD         DEMIN
         BSR         AENTER
         LBY         &AREP           < A=CARACTERE REPONSE.
         RSR
         PAGE
<
<
<        E N T R E E   U N   N O M B R E   H E X A - D E C I M A L  :
<
<
IHEX:    EQU         $
         LAD         DEMHEX
         BSR         AENTER
         BSR         AHEX            < DONC MEMES RESULTATS QUE 'HEX'...
         RSR
         PAGE
<
<
<        E N V O I   D ' U N E   C A R T E   A U   C C I  :
<
<
<        ARGUMENT :
<                    A=ADRESSE MOT DE LA CARTE.
<
<
CCI:     EQU         $
         ADR         A,A             < CONVERSION EN UNE ADRESSE OCTET.
         STA         DEMCC+1
         LAD         DEMCC
         SVC         0               < ET ENVOI DE LA CARTE...
         RSR
         PAGE
<
<
<        T R A I T E M E N T   D E S   E R R E U R S  :
<
<
ERROR:   EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMERR-ZERO
         BSR         APRINT          < ENVOI D'UN MESSAGE D'ERREUR...
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         LAD         DEMOUT
         SVC         0               < EDITION DU MESSAGE D'ERREUR...
XWOR%7:  VAL         0
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        R E T O U R   A   ' G E '  :
<
<
GOGE:    EQU         $
         LA          ASDKU
         STA         XASDKU,W        < TRANSMISSION DE L'ADRESSE COURANTE 'DKU'.
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         LAI         BRANCH-ZERO
         LR          A,W             < W=ADRESSE DE LA BRANCHE...
         LA          NSD
         STA         0,W             < GENERATION DU NOM DE L'OVERALY,
         ACTD        4               < A='IDESC',
         ORI         "0"             < CONVERTI EN ASCI,
         STBY        2,W             < QUI FAIT PARTIE DU NOM...
         LAI         SGNLON
         STBY        DEMLOD          < MISE EN MODE 'LOAD SOUS ACN'...
         STZ         CDRET,W         < RETOUR OK...
GOGE2:   EQU         $
         LRM         A,B,X
         WORD        SITEM1          < A=ZONE DE SAUVEGARDE,
         WORD        NOM             < B=ZONE A RESTAURER,
         WORD        LNOM/NOCMO      < X=NOMBRE DE MOTS A RESTAURER.
         MOVE                        < RESTAURATION DU BOUT DE L'ITEM1...
         LX          NMOTS
GOGE3:   EQU         $
         STZ         &AITEM2         < RAZ DE L'ITEM2...
         JDX         GOGE3
XWOR%7:  VAL         0
         LA          SAVEK
         LR          A,K             < RESTAURATION DE 'K'...
         LAI         0
         ACTD        'A              < RESTAURATION DU ALT-MODE...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAD         RELMEM
         SVC         0               < RETOUR A 4K MOTS...
         LX          NMOTS           < X=NOMBRE DE MOTS A RAZER...
TW2:     EQU         $
         STZ         &AITEM2         < RAZE DES ITEMS 1 ET 2.
         JDX         TW2
         LAI         BRANCH-ZERO
         LR          A,W             < RESTAURATION DE 'W'.
         STZ         MODCAL,W        < REINITIALISATION DU MODE D'APPEL...
         LA          NGE
         STA         0,W             < MISE EN PLACE DU NOM DE "GE"...
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         LA          IEG
         STA         MODCAL,W        < RENVOI DE L'INDEX COURANT DE ITEM1,
XWOR%7:  VAL         0
         LAI         AMCDA-ZERO
         BSR         ACCI            < ENVOI DE !CDA.
GOGE1:   EQU         $
         LAD         DEMLOD
         BSR         AOVL            < ET TENTATIVE DE CHARGEMENT...
         QUIT        1               < EN CAS D'ERREUR,
         JMP         GOGE1           < ET ON RETENTE...
         IF          MODE-ITEM,XWOR%7,,XWOR%7
<
<
<        T R A I T E M E N T   D E S   A L T - M O D E S  :
<
<
ALTM:    EQU         $
         LAI         BRANCH-ZERO
         LR          A,W             < W=ADRESSE DE LA BRANCHE...
         LA          NPCALL
         JANE        ALTM1           < OK...
         LA          MODCAL,W        < MODCAL EST ENCORE A SA VALEUR INITIALE.
         LXI         0               < "GE" A PRIORI...
         TBT         0               < "EI" OU "GE" ???
         ADCR        X
         LA          &NCALL          < A=OVERLAY A APPELER...
ALTM1:   EQU         $
         STA         0,W             < DANS LE CAS D'UN ALT-MODE, ON REVIENT
                                     < DIRECTEMENT A "GE" OU A "EI"...
         LAI         " "             < ON RESTAURE, AU CAS OU LE ALT-MODE
         STBY        2,W             < APPARAITRAIT DANS 'GOGE'...
         LAI         SGNLNS          < IDEM...
         STBY        DEMLOD
         LAI         2
         STA         CDRET,W         < TRANSMISSION DU ALT-MODE...
         JMP         GOGE2
XWOR%7:  VAL         0
         PAGE
<
<
<        E N T R Y  :
<
<
TW:      EQU         $
         LRM         C,L
         WORD        COMON+128       < C=BASE DU COMMON...
         WORD        LOC+128         < L=BASE DU LOCAL...
         IC          KIN             < COMPTAGE DES ENTREES :
         IF          MODE-VISU,XWOR%7,,XWOR%7
         JG          TW1             < CAS DES ALT-MODES...
XWOR%7:  VAL         0
         LAD         DMDKVC
         SVC         0               < CLEAR INITIAL DU BUFFER D'ANTICI-
                                     < PATION DU DISQUE VIDEO...
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         JG          ALTM            < ABORT IMMEDIAT SUR ALT-MODE...
         LA          CDRET,W         < A=RELAI D'ACCES A ITEM1/ITEM2...
         CP          AI1             < SEUL ITEM1 EST AUTORISE...
         JNE         ALTM            < L'ITEM2 PROVOQUE UN ABORT...
         LA          MODCAL,W        < A=INDEX INITIAL DE L'ITEM1...
         LXI         0               < "GE" A PRIORI...
         TBT         0               < "GE" (0) OU "EI" (1) ???
         ADCR        X
         RBT         0
         STA         IEG
         LA          &NCALL
         STA         NPCALL          < NOM DU PROCESSEUR A APPELER SUR LA
                                     < RECEPTION D'UN ALT-MODE.
         LRM         A,B,X
         WORD        NOM             < A=ZONE A SAUVEGARDER,
         WORD        SITEM1          < B=ZONE DE SAUVEGARDE,
         WORD        LNOM/NOCMO      < X=NOMBRE DE MOTS.
         MOVE                        < SAUVEGARDE...
XWOR%7:  VAL         0
         LA          XASDKU,W
         STA         ASDKU           < ADRESSE INITIALE SUR 'DKU'...
         LR          K,A             < CAS DE LA PREMIERE,
         STA         SAVEK           < SAUVEGARDE DE K...
TW1:     EQU         $
         LRM         K
         WORD        STACK-1         < INITIALISATION DE K...
TW20:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMMCDA-ZERO
         BSR         APRINT          < EDITION DE "!CDA"...
XWOR%7:  VAL         0
         BSR         AIN             < CHOIX ENTRE !CDAI ET !CDAP...
         CPI         "P"
         JE          TW21            < VERS LA 'CDA-PRIVEE'...
         CPI         "I"
         JNE         TW20            < ?!??!??!
TW21:    EQU         $
         STBY        &API            < MISE EN PLACE DE "P" OU "I"...
         LAI         AMCDAP-ZERO
         BSR         ACCI            < TENTATIVE DE !CDAP OU !CDAI,
         JNE         GOGE            < ET BIEN CELA NE MARCHE PAS...
         LAD         AASDKU
         BSR         ACCI            < TENTATIVE D'APPROPRIATION DE 'DKU' ; A
                                     < NOTER QU'ON NE LE RENDRA JAMAIS !!!
         STZ         IMASKO          < MISE DU MASQUE OFF A PRIORI...
         STZ         VOLNUM          < PAS DE VOLUME A PRIORI...
         LRM         A
         WORD        LIMAG*NCOOL+LNOM*NOCMO
         STA         SGN+2           < A PRIORI...
         LAI         0
         ACTD        'A              < ON RESTAURE LE ALT-MODE A PRIORI...
         LAD         DEMMEM
         SVC         0               < PASSAGE A 16 K...
         LAI         '18
         WORD        '1E15
         LR          B,X             < X=ORIGINE DE LA 'CDAP'/'CDAI',
         LAI         '19
         WORD        '1E15
         SBR         X,B
XWOR%1:  VAL         -4              < B=LONGUEUR UTILE DE LA 'CDAP'/'CDAI',
         LRM         A
         WORD        IZBUF-TV1>XWOR%1 < A=LONGUEUR NECESSAIRE (IMAGE+MASQUE),
         CPR         A,B             < CELA SUFFIT-IL ???
         JL          GOGE            < B<A : INSUFFISANT POUR TRAVAILLER...
TW13:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMASKO-ZERO
         BSR         APRINT          < EDITION DE "MASK ON?"...
XWOR%7:  VAL         0
         BSR         AIN
         STZ         IMASKO          < OFF A PRIORI...
         CPI         "N"
         JE          TW14            < OK, IMASKO=0 ==> OFF...
         IC          IMASKO          < A PRIORI, IMASKO=1 ==> ON...
         CPI         "O"
         JNE         TW13            < ?!??!??!
TW14:    EQU         $
         PAGE
<
<
<        B O U C L E   D ' I N T E R R O G A T I O N  :
<
<
LOOP:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMINT-ZERO
         BSR         APRINT          < ENVOI DU MESSAGE ">",
XWOR%7:  VAL         0
         BSR         AIN
         CPI         REP0            < ET VALIDATION...
         JL          TW12            < ERREUR...
         CPI         REPZ            < VALIDATION, SUITE...
         JG          TW12            < ERREUR...
         LR          A,X             < X=COMMANDE DEMANDEE,
         BR          &ACOM           < BRANCHEMENT AU MODULE SPECIFIQUE...
TW12:    EQU         $
         BR          AERROR          < ERREUR...
         PAGE
<
<
<        A C C E S   A U   C C I  :
<
<
GOCCI:   EQU         $
         QUIT        1               < ACCES AU CCI INTERACTIF...
         BR          ALOOP
         PAGE
<
<
<        S A U V E G A R D E   /   R E S T A U R A T I O N
<                    D E   L A   ' C D A I '  :
<
<
RESTOR:  EQU         $               < ENTRY DE RESTAURATION :
FREST::  VAL         '0C             < FONCTION DE RESTAURATION...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         MREST-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         LAI         FREST           < (A)=FONCTION DE LECTURE.
         LRM         B
         WORD        TSDKU/LSDKU*NBDKU
                                     < POUR COMMENCER PAR LE HAUT DE LA 'CDAI'..
         JMP         RES1
SAVE:    EQU         $               < ENTRY DE SAUVEGARDE :
FSAVE::  VAL         '0E             < FONCTION DE SAUVEGARDE...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         MSAV-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         LAI         FSAVE           < (A)=FONCTION DE SAUVEGARDE.
         LBI         0               < POUR COMMENCER PAR LE BASE DE LA 'CDAI'..
RES1:    EQU         $
<
< INITIALISATION DE LA DEMANDE 'DKU' :
<
         STA         RWDKU           < FONCTION,
         LAI         NDKU
         STBY        RWDKU           < ET NVP.
         LAI         TV1*NOCMO
         STA         RWDKU+1         < ADRESSE MEMOIRE-OCTETS EN 'CDAI'.
         LA          MAXDKU
         ADR         B,A             < POUR COMMENCER SOIT PAR LE HAUT (RESTAU-
                                     < RATION) OU PAR LE BAS (SAUVEGARDE)...
         STA         RWDKU+3         < ADRESSE SUR 'DKU'.
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         MOK-ZERO
         BSR         APRINT          < ENVOI D'UN MESSAGE 'OK?'...
XWOR%7:  VAL         0
         BSR         AIN             < ENTREE D'UNE REPONSE...
         CPI         "O"
         JE          RES2            < SEUL "O" EST ACCEPTE...
RES5:    EQU         $
         BR          AERROR          < TOUT AUTRE REPONSE EST UNE ERREUR...
RES2:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         MOK-ZERO
         BSR         APRINT          < ET ON REDEMANDE...
XWOR%7:  VAL         0
         BSR         AIN             < ENTREE D'UNE DEUXIEME REPONSE...
         CPI         "O"
         JNE         RES5            < IL FAUT 2 "O" DE SUITE !!!
<
< PREMIERE PARTIE DE L'OPERATION :
< (ECRITURE DU BAS DE LA 'CDAI'
< POUR UNE SAUVEGARDE, ET LECTURE
< DU HAUT POUR UNE RESTAURATION)
<
         LXI         NBDKU           < (X)=NOMBRE D'OPERATIONS,
RES3:    EQU         $
         PSR         X
         LAD         RWDKU
         SVC         0               < OPERATION ELEMEMTAIRE...
         PLR         X
         JE          RES4            < OK...
         QUIT        1               < ???!?!?!
         JMP         RES3            < ON ITERE...
RES4:    EQU         $
         LA          RWDKU+1
         AD          RWDKU+2
         STA         RWDKU+1         < PROGRESSION DE L'ADRESSE MEMOIRE...
         LA          RWDKU+3
         AD          INCDKU
         STA         RWDKU+3         < PROGRESSION DE L'ADRESSE SUR 'DKU'.
         JDX         RES3            < AU BLOC SUIVANT...
<
< PHASE INTERMEDIAIRE :
< DEPLACEMENT DU HAUT VERS LE BAS
< POUR UNE SAUVEGARDE, ET DU BAS
< VERS LE HAUT POUR UNE RESTAURATION)
<
XWOR%1:  VAL         LBTRAN=0
         IF          1>XWOR%1-LBTRAN,,XWOR%,
         IF          ATTENTION : 'LBTRAN' DOUIT ETRE UNE PUISSANCE DE 2 !!!
XWOR%:   VAL         0
XWOR%1:  VAL         -XWOR%1
         LRM         X
         WORD        TSDKU*NBDKU>XWOR%1
                                     < (X)=DECOMPTEUR DES MOUVEMENTS DE BUFFER,
         LA          RWDKU
MOCD::   VAL         '00FF
         ANDI        MOCD            < (A)=FONCTION COURANTE :
         CPI         FSAVE           < EST-CE UNE SAUVEGARDE ???
         LRM         A,B,Y           < A PRIORI SAUVEGARDE :
         WORD        TSDKU*NBDKU+TV1 < (A)=ADRESSE DU HAUT DE LA 'CDAI',
         WORD        BTRAN           < (B)=ADRESSE DU BUFFER DE TRANSIT,
         WORD        TSDKU*NBDKU     < (Y)=TRANSLATION DE PASSAGE DU BAS VERS
                                     <     LE HAUT DE LA 'CDAI'...
         JE          RES10           < OUI, C'EST UNE SAUVEGARDE...
         LA          MAXDKU          < NON, C'EST UNE RESTAURATION, IL FAUT
         STA         RWDKU+3         < REPARTIR DU BAS...
         NGR         Y,Y             < ON INVERSE LA TRANSLATION (HAUT-->BAS)...
         LAI         TV1             < (A)=ADRESSE DU BAS DE LA 'CDAI'...
RES10:   EQU         $
RES11:   EQU         $
         PSR         X               < SAUVEGARDE DU DECOMPTEUR,
         LXI         LBTRAN          < (X)=NOMBRE DE MOTS A DEPLACER,
         RCDA
                                     < CDAI --> BTRAN,
         SBR         Y,A             < COMMUTATION HAUT-BAS,
         LXI         LBTRAN          < (X)=NOMBRE DE MOTS A DEPLACER,
         WCDA
                                     < BTRAN --> CDAI...
         ADR         Y,A             < RE-COMMUATION BAS-HAUT,
XWOR%2:  VAL         2
         TRN
XWOR%1:  VAL         LBTRAN/XWOR%2
         NTRN
         DO          XWOR%2
         ADRI        LBTRAN/XWOR%2,A < ET PROGRESSION DE L'ADRESSE COURANTE
                                     < EN 'CDAI'...
         PLR         X
         JDX         RES11           < AU BLOC SUIVANT...
<
< PHASE SECONDAIRE :
< (SAUVEGARDE DU HAUT OU
< RESTAURATION DU BAS)
<
         LXI         NBDKU           < (X)=NOMBRE D'OPERATIONS,
RES20:   EQU         $
         PSR         X
         LAD         RWDKU
         SVC         0               < OPERATION ELEMEMTAIRE...
         PLR         X
         JE          RES31           < OK...
         QUIT        1               < ???!?!?!
         JMP         RES3            < ON ITERE...
RES31:   EQU         $
         LA          RWDKU+1
         AD          RWDKU+2
         STA         RWDKU+1         < PROGRESSION DE L'ADRESSE MEMOIRE...
         LA          RWDKU+3
         AD          INCDKU
         STA         RWDKU+3         < PROGRESSION DE L'ADRESSE SUR 'DKU'.
         JDX         RES20           < AU BLOC SUIVANT...
         BR          ALOOP
         PAGE
<
<
<        D E F I N I T I O N   D U   V O L U M E   C O U R A N T  :
<
<
VOLUME:  EQU         $
         STZ         VOLNUM          < ET PAS DE VOLUME A PRIORI...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         MVOL-ZERO
         BSR         APRINT          < DEMANDE DU NUMERO DE VOLUME :
XWOR%7:  VAL         0
         BSR         AIHEX           < ET CONVERSION BINAIRE :
         JNE         ERRORV          < BERK...
<
< MONTAGE DU VOLUME DEMANDE :
<
         JAE         VOL3            < EN FAIT, IL S'AGIT D'UN DEMONTAGE, OK...
         STA         VOLNUM          < ET NON, MONTAGE : MEMORISATION DU NUMERO
                                     < DE VOLUME,
         LXI         4
VOL1:    EQU         $
         ADRI        -1,X
         LBY         &AREPX          < TRANSFERT DU NOM
         ADRI        1,X
         STBY        &ANAVOL         < DU VOLUME EN ASCI...
         JDX         VOL1
         LAD         MVDKU
         BSR         ACCI            < ET TENTATIVE DE MONTAGE...
         JE          LOOP            < OK, ON VA ACCEDER A DES IMAGES DE TYPE
                                     < EXTENSION SUR VOLUME...
VOL2:    EQU         $
         STZ         VOLNUM          < ET ON DEMONTE SI ERREUR...
ERRORV:  BR          AERROR          < (ET RELAI...)
<
< DEMONTAGE :
<
VOL3:    EQU         $
         LAD         MDVDKU
         BSR         ACCI            < ENVOI DE LA DEMANDE DE DEMONTAGE...
         JMP         LOOP            < VERS LA BOUCLE D'INTERROGATION...
         PAGE
<
<
<        M O D U L E S   D ' A C C E S   A U   S G N  :
<
<
<        FONCTION :
<                      PERMETTENT L'ACCES AU SGN
<                    POUR LES IMAGES SUIVANT :
<                    N : NOMME L'IMAGE RESIDENTE,
<                        JUSQU'A UNE COMMANDE 'N'
<                        SUIVANTE,
<                    D : AFFICHE L'IMAGE PRECEDEMMENT
<                        NOMMEE PAR 'N'.
<                    + : CREE L'IMAGE PRECEDEMMENT
<                        NOMMEE PAR 'N',
<                    - : DETRUIT L'IMAGE PRECEDEMMENT
<                        NOMMEE PAR 'N'.
<
<
<        NOTA :
<                      S'IL Y A UN VOLUME DE MONTE
<                    PAR LA COMMANDE "V", LES IMAGES
<                    SONT OBTENUES PAR L'INTERMEDIAIARE
<                    DU VOLUME EXTENSION...
<
<
NAME:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMNOM-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         LAD         NOMIN
         BSR         AENTER          < ENTREE DU NOM COURANT,
         LAI         EOT
         STBY        &AEOT           < ET ON FORCE A PRIORI UN 'EOT'...
         BR          ALOOP           < ET C'EST TOUT...
<
< SOUS-PROGRAMME GENERAL D'ACCES AU SGN :
< (LORS DES 'LNS' ET 'LON', IL REGARDE
< SI LA LONGUEUR DE L'IMAGE VAUT EXACTE-
< MENT LIMAG*NCOOL*NOCMO ; SI NON, ELLE
< REITERE L'OPERATION AVEC UN DELTA
< NOM-VALEUR DE -1 CORRESPONDANT A UNE
< ANCIENNE VERSION DU PROGRAMME)
<
GOSGN:   EQU         $               < RESPONSABLE DE TOUS LES ACCES SGN...
         STBY        SGN             < MISE EN PLACE DU 'NVP' ARGUMENT,
         LAI         LNOM*NOCMO
         STA         SGN+3           < A PRIORI...
         CPZ         VOLNUM          < Y-A-T'IL UN VOLUME DE MONTE ???
         JE          GOSGN2          < NON...
<
< CAS DES ACCES AU VOLUME :
<
NSPDKU:: VAL         'A3             < DISCRIMINATEUR...
         LAI         NSPDKU
         STBY        SGN+3           < MISE EN PLACE DU DISCRIMINATEUR...
         LAI         '1C
         ACTD        'A              < INHIBITION DU ALT-MODE PARCEQUE ON VA
                                     < MODIFIER LE DEBUT DE L'IMAGE RESIDENTE.
         LA          SGN+2
         PSR         A               < SAUVEGARDE DU COMPTE D'OCTETS...
LIMVO::  VAL         4               < UNE IMAGE EXTENSION FAIT 4 OCTETS...
         LXI         0
         LA          &AIMAGR
         ADRI        1,X
         LB          &AIMAGR
         PSR         A,B             < SAUVEGARDE DU DEBUT DE L'IMAGE...
         STZ         &AIMAGR         < POUR LE NUMERO DE BLOC,
         ADRI        -1,X
         LA          VOLNUM
         STA         &AIMAGR         < NUMERO DE VOLUME...
         LAI         LNOM*NOCMO+LIMVO
         STA         SGN+2           < MISE EN PLACE DE LA LONGUEUR,
         LAD         SGN
         SVC         0               < ET ENVOI AU 'SGN'...
         PLR         A,B
         PSR         X               < SAUVEGARDE DU CODE DE RETOUR...
         LXI         0
         XM          &AIMAGR         < ET RESTAURATION DU
         ADRI        1,X
         STB         &AIMAGR         < DEBUT DE L'IMAGE...
         PLR         X               < RESTAURATION DU CODE DE RETOUR...
         LR          A,Y             < (Y)=NUMERO DE VOLUME DE L'IMAGE QUE L'ON
                                     <     SUPPOSE CHARGEE...
         PLR         A
         STA         SGN+2           < RESTAURATION DE LA LONGUEUR...
         LAI         0
         ACTD        'A              < RESTAURATION DU ALT-MODE...
         LBY         SGN
         CPI         SGNLON          < EST-CE UN 'LOAD' QUE L'ON VIENT DE FAIRE?
         JNE         GOSGN1          < NON, PAS DE VALIDATIONS...
         CPZR        X               < COMMENT CELA S'EST-IL PASSE ???
         JNE         GOSGN3          < MAL, ON SORT...
GOSGN4:  EQU         $
         LR          Y,A
         CP          VOLNUM          < L'IMAGE CHARGEE APPARTIENT-ELLE AU BON
                                     < VOLUME ???
         JNE         GOSGN3          < NON, ERREUR...
         ACTD        3               < (B)='BOX' :
IVALEX:: VAL         0               < BIT DISCRIMINATEUR...
         LR          B,A             < (A)-LONGUEUR OCTETS,
         LYI         0               < ON FORCE UN NUMERO DE NUL, POUR POSITION-
                                     < NER LES INDICATEURS EN CAS D'ERREUR A
                                     < SUIVRE...
         JAGE        GOSGN4          < LONGUEUR INACCEPTABLE, ERREUR...
         RBT         IVALEX
         CPI         LIMVO           < ALORS, EST-CE UNE EXTENSION ???
         JNE         GOSGN3          < NON, ERREUR...
         JMP         GOSGN1          < OUI, VERS LA SORTIE...
<
< CAS DES ACCES NORMAUX AU SGN :
<
GOSGN2:  EQU         $
         LAD         SGN
         SVC         0               < ET ENVOI DE LA DEMANDE...
         LBY         SGN
         CPI         SGNDLN
         JE          GOSGN1          < CAS D'UN DELETE...
         CPI         SGNSTN
         JE          GOSGN1          < CAS D'UN STORE...
         ACTD        3               < CAS D'UN LOAD : B=LONGUEUR DE L'IMAGE,
         LRM         A
         WORD        LIMAG*NCOOL*NOCMO
         CPR         A,B             < S'AGIT-IL D'UNE ANCIENNE OU D'UNE
                                     < NOUVELLE IMAGE ???
         JE          GOSGN1          < NOUVELLE : DELTA=LNOM*NOCMO...
         LAI         -1              < ANCIENNE :
         STA         SGN+3           < IL FAUT LA RECUPERER AVEC DELTA=-1...
         LAD         SGN
         SVC         0               < ON REITERE LE LOAD...
GOSGN1:  EQU         $
         CPZR        X               < TEST DES CONDITIONS DE RETOUR...
GOSGN3:  EQU         $
         RSR
<
< MODULES SPECIFIQUES :
<
DISP:    EQU         $               < COMMANDE 'D' :
         LAI         SGNLON          < ON COMMENCE PAR L'ACN DU DEMANDEUR,
         BSR         AGOSGN
         JE          DISP1           < OK, IL EXISTE...
         LAI         SGNLNS          < NON, ON TENTE SOUS :SYS...
         BSR         AGOSGN
         JE          DISP1           < OK...
DISP2:   EQU         $
         BR          AERROR          < TRAITEMENT DES ERREURS...
DISP1:   EQU         $
         BR          ALOOP           < VERS LA BOUCLE SI OK...
DELETE:  EQU         $               < COMMANDE '-' :
         LAI         SGNDLN
DELET1:  EQU         $
         BSR         AGOSGN
         JE          DISP1           < OK...
         JMP         DISP2           < ERREUR...
STORE:   EQU         $               < COMMANDE '+' :
         LAI         SGNSTN
         JMP         DELET1
         PAGE
<
<
<        A C C E S   A   U N   P O I N T   R E S I D E N T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RECONSTITUE
<                    LE NIVEAU ASSOCIE A 3 BITS
<                    PARALLELES.
<
<
<        ARGUMENT :
<                    XR,YR = COORDONNEES DU POINT,
<
<
<        RESULTAT :
<                    A = NIVEAU DE GRIS DU POINT, SOIT R+V*2+B*4.
<                        -1 SI LE POINT N'EXISTE PAS.
<
<
SPAPR:   EQU         $
         PSR         B,X,Y
         LX          XR              < X=ABSCISSE,
         LY          YR              < Y=ORDONNEE.
         LR          Y,A
         JAL         SPAPR1          < HORS-ECRAN...
         CPI         NLIGM1
         JG          SPAPR1          < HORS-ECRAN...
         LR          X,A             < A=COORDONNEE X,
         JAL         SPAPR1          < HORS-ECRAN...
         CPI         NPOLM1
         JG          SPAPR1          < HORS-ECRAN...
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1   < B=NUMERO DE MOT DANS LA LIGNE,
         SLRS        NBITMO-XWOR%1   < A=NUMERO DE BIT DANS LE MOT,
         LXI         NBITMO-BIT
         SBR         A,X             < X=DECALAGE D'ACCES AU BIT COURANT.
         XR          Y,B             < Y=NUMERO DU MOT DANS LA LIGNE,
         SLLD        NMOTL=0
         IF          NBITMO-NMOTL,,XWOR%,
         IF          ATTENTION : LA CONCATENATION QUI SUIT EST COMPLETEMENT
         IF          STUPIDE !!!
XWOR%:   VAL         0
         ORR         B,Y             < Y=NUMERO DU MOT DANS LA TRAME.
         XR          Y,X
         LA          &AIMAGB         < ACCES A LA TRAME BLEU,
         PSR         A
         LA          &AIMAGV         < ACCES A LA TRAME BLEUE,
         PSR         A
         LA          &AIMAGR         < ACCES A LA TRAME ROUGE.
         XR          X,Y
         SLRS        0,X
         SLRD        BIT             < RECUPERATION D'UN BIT ROUGE,
         PLR         A
         SLRS        0,X
         SLRD        BIT             < RECUPERATION D'UN BIT VERT,
         PLR         A
         SLRS        0,X
         ANDI        BIT             < RECUPERATION D'UN BIT BLEU.
         SLLD        NCOOL-BIT       < A=NIVEAU DE GRIS DU POINT (X,Y).
SPAPR2:  EQU         $
         PLR         B,X,Y
         RSR
<
< CAS DES POINTS HORS-ECRAN :
<
SPAPR1:  EQU         $
         LAI         -1              < ON RENVOIE LE NIVEAU -1...
         JMP         SPAPR2
         PAGE
<
<
<        A C C E S   A   U N   P O I N T   S C R A T C H  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RECONSTITUE
<                    LE NIVEAU ASSOCIE A 3 BITS
<                    PARALLELES.
<
<
<        ARGUMENTS :
<                    XS,YS = COORDONNEES DU POINT SCRATCH,
<
<
<        RESULTAT :
<                    A=NIVEAU DE GRIS DU POINT SCRATCH.
<
<
SPAPS:   EQU         $
         PSR         B,X,Y
         LX          XS              < X=ABSCISSE,
         LY          YS              < Y=ORDONNEE.
         LR          X,A
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1   < B=NUMERO DU MOT DANS LA LIGNE,
         SLRS        NBITMO-XWOR%1
         LXI         NBITMO-BIT
         SBR         A,X             < X=DECALAGE D'ACCES AUX BITS,
         PSR         X
         XR          Y,B
         SLLD        NMOTL=0+NBITMO
         ORR         Y,A             < A=NUMERO DU MOT DANS LA TRAME.
         LRM         B,X,Y
         WORD        MCDAR
         WORD        1
         WORD        LIMAG           < Y=LONGUEUR EN MOTS D'UNE TRAME.
         RCDA
                                     < ACCES A UN MOT ROUGE,
         LRM         B,X
         WORD        MCDAV
         WORD        1
         ADR         Y,A
         RCDA
                                     < ACCES A UN MOT VERT,
         LRM         B,X
         WORD        MCDAB
         WORD        1
         ADR         Y,A
         RCDA
                                     < ACCES A UN MOT BLEU.
         PLR         X               < RESTAURATION DU DECALAGE,
         LA          MCDAR
         SLRS        0,X
         SLRD        BIT             < RECUPERATION D'UN BIT ROUGE,
         LA          MCDAV
         SLRS        0,X
         SLRD        BIT             < RECUPERATION D'UN BIT VERT,
         LA          MCDAB
         SLRS        0,X
         ANDI        BIT             < RECUPERATION D'UN BIT BLEU,
         SLLD        NCOOL-BIT       < A=NIVEAU DE GRIS DU POINT.
         PLR         B,X,Y
         RSR
<
<
<        A C C E S   A   U N   P O I N T   S C R A T C H
<        D E   C O O R D O N N E E S   I D E N T I Q U E S
<        A   C E L L E S   D U   P O I N T   R E S I D E N T  :
<
<
SPGPT:   EQU         $
         PSR         X,Y
         LX          XR
         LY          YR
         STX         XS
         STY         YS
         BSR         ASPGPS          < ACCES AU POINT (XS,YS)=(XR,YR)...
         PLR         X,Y
         RSR
         PAGE
<
<
<        R A N G E M E N T   D ' U N   P O I N T   R E S I D E N T  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RANGE LE
<                    NIVEAU D'UN POINT SUR 3 BITS
<                    PARALLELES.
<
<
<        ARGUMENTS :
<                    XR,YR = COORDONNEES DU POINT,
<                    A = SON NIVEAU DE GRIS.
<
<
SPSPR:   EQU         $
         PSR         A,B,X,Y
         LX          XR              < X=ABSCISSE,
         LY          YR              < Y=ORDONNEE.
         PSR         A
         LR          X,A
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1
         SLRS        NBITMO-XWOR%1
         LR          A,X             < X=NUMERO DE BITS.
         XR          Y,B
         SLLD        NMOTL=0
         ORR         B,Y             < Y=NUMERO DU MOT DANS LA TRAME.
         PLR         A               < A=NIVEAU DE GRIS DU POINT.
         SLRD        NCOOL           < ET MISE DANS B...
         XR          X,Y
         LA          &AIMAGR         < ACCES A UN MOT ROUGE,
         STA         SAVER
         LA          &AIMAGV         < ACCES A UN MOT VERT,
         STA         SAVEV
         LA          &AIMAGB         < ACCES A UN MOT BLEU.
         XR          X,Y
         SCLS        0,X
         SLLD        BIT             < RECUPERATION DU BIT BLEU,
         SCRS        BIT,X
         STA         SAVEB
         LA          SAVEV
         SCLS        0,X
         SLLD        BIT             < RECUPERATION DU BIT VERT,
         SCRS        BIT,X
         STA         SAVEV
         LA          SAVER
         SCLS        0,X
         SLLD        BIT             < RECUPERATION DU BIT ROUGE,
         SCRS        BIT,X
         XR          X,Y
         STA         &AIMAGR         < RANGEMENT DU MOT ROUGE,
         LA          SAVEV
         STA         &AIMAGV         < RANGEMENT DU MOT VERT,
         LA          SAVEB
         STA         &AIMAGB         < RANGEMENT DU MOT BLEU.
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        R A N G E M E N T   D ' U N   P O I N T   S C R A T C H  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RANGE LE
<                    NIVEAU D'UN POINT SUR 3 BITS
<                    PARALLELES EN SCRATCH.
<
<
<        AGUMENTS :
<                    XS,YS = COORDONNEES DU POINT,
<                    A = SON NIVEAU DE GRIS.
<
<
SPSPS:   EQU         $
         PSR         A,B,X,Y
         PSR         A               < SAUVEGARDE DU NIVEAU,
         LX          XS              < DU POINT
         LY          YS              < SCRATCH (XS,YS).
         LR          X,A
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1
         SLRS        NBITMO-XWOR%1
         LXI         NBITMO-BIT
         SBR         A,X             < X=AMPLITUDE DU DECALAGE...
         PSR         X
         XR          Y,B
         SLLD        NMOTL=0+NBITMO
         ORR         Y,A             < A=ADRESSE DU MOT ROUGE CONTENANT
                                     < (XS,YS) DANS LA 'CDA'...
         LRM         B,X,Y
         WORD        MCDAR
         WORD        1
         WORD        LIMAG           < Y=POUR PASSER D'UNE COULEUR A L'AUTRE.
         RCDA
                                     < ACCES AU MOT ROUGE,
         LRM         B,X
         WORD        MCDAV
         WORD        1
         ADR         Y,A
         RCDA
                                     < ACCES AU MOT VERT,
         LRM         B,X
         WORD        MCDAB
         WORD        1
         ADR         Y,A
         RCDA
                                     < ACCES AU MOT BLEU.
         PLR         X               < X=AMPLITUDE DU DECALAGE,
         STA         WORK1           < SAUVEGARDE DE LA DERNIERE ADRESSE...
         PLR         A               < A=NIVEAU DE GRIS DE (XS,YS).
         SLRD        NCOOL           < ET CADRAGE DANS 'B'...
         LA          MCDAB           < MSE A JOUR DU BLEU,
         SCRS        0,X
         SLRS        BIT
         SLLD        BIT
         SCLS        0,X
         STA         MCDAB
         LA          MCDAV           < MISE A JOUR DU VERT,
         SCRS        0,X
         SLRS        BIT
         SLLD        BIT
         SCLS        0,X
         STA         MCDAV
         LA          MCDAR           < MISE A JOUR DU ROUGE.
         SCRS        0,X
         SLRS        BIT
         SLLD        BIT
         SCLS        0,X
         STA         MCDAR
         LA          WORK1           < A=ADRESSE EN 'CDA' DU BLEU...
         LRM         B,X
         WORD        MCDAB
         WORD        1
         WCDA
                                     < MISE A JOUR DU BLEU,
         LRM         B,X
         WORD        MCDAV
         WORD        1
         SBR         Y,A
         WCDA
                                     < MISE A JOUR DU VERT,
         LRM         B,X
         WORD        MCDAR
         WORD        1
         SBR         Y,A
         WCDA
                                     < MISE A JOUR DU ROUGE.
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        O P E R A T I O N   I N T E R - I M A G E S  :
<
<
<        FONCTION :
<                      CETTE VERSION PROVISOIRE REALISE
<                    L'OPERATION .OP. DE LA FACON
<                    SUIVANTE :
<                    RESIDENT <-- (RESIDENT).OP.(SCRATCH)
<                    CETTE OPERATION N'ETANT EFFECTUEE
<                    QUE POUR LES BITS A 1 DU MASQUE...
<
<
SPOP:    EQU         $
         PSR         A,B,X,Y
         LY          ORGY
         STY         YS              < ORDONNEE SCRATCH.
         LYI         0               < Y=ORDONNEE.
         STY         YR
SPOP1:   EQU         $
         LXI         0
         STX         XR              < X=ABSCISSE.
         LX          ORGX
         STX         XS
SPOP2:   EQU         $
         LX          XS
         LY          YS
         PSR         X,Y             < SAUVEGARDE DE 'XS' ET 'YS'...
         LA          XS
         CPZ         MODX            < EST-ON SUR UN X-TORE ???
         JE          SPOP3           < OUI...
         JAL         SPOP5           < NON, ET XS EST OVERSCREEN...
         CPI         NPOLM1
         JG          SPOP5           < DE MEME...
         JMP         SPOP4           < OK, XS EST DANS L'ECRAN...
SPOP3:   EQU         $               < CAS OU L'ON EST SUR UN X-TORE :
         ANDI        NPOLM1
         STA         XS              < CALCUL MODULO DE XS...
SPOP4:   EQU         $
         LA          YS
         CPZ         MODY            < EST-ON SUR UN Y-TORE ???
         JE          SPOP6           < OUI...
         JAL         SPOP5           < NON, ET YS EST OVERSCREEN...
         CPI         NLIGM1
         JG          SPOP5           < DE MEME...
         JMP         SPOP7
SPOP6:   EQU         $               < CAS OU L'ON EST SUR UN Y-TORE :
         ANDI        NLIGM1
         STA         YS              < CALCUL MODULO DE YS...
SPOP7:   EQU         $
         CPZ         IMASKO
         JE          SPOP8           < LE MASQUE EST OFF...
         PSR         X,Y
         LX          XR              < X=COORDONNEE RESIDENTE,
         LY          YR              < AINSI QUE Y...
         LR          X,A
         LBI         0
XWOR%1:  VAL         NBITMO=0
         SCLD        NBITMO-XWOR%1   < B=NUMERO DU MOT SUR LA LIGNE,
         SLRS        NBITMO-XWOR%1   < A=NUMERO DU BIT DANS LE MOT,
         LR          A,X             < X=NUMERO DU BIT DANS LE MOT,
         XR          Y,B
         SLLD        NMOTL=0+NBITMO
         ORR         A,Y             < Y=NUMERO DU MOT DANS LE MASQUE,
         LRM         A
         WORD        AMASK
         ADR         Y,A             < A=ADRESSE DU MOT DANS LA 'CDA'.
         PSR         X
         LRM         B,X
         WORD        MCDAM           < B=ADRESSE DU MOT DE TRANSIT,
         WORD        1               < X=NOMBRE DE MOTS A DEPLACER.
         RCDA
         PLR         X
         LA          MCDAM           < ACCES AU MASQUE,
         TBT         0,X             < ALORS ???
         PLR         X,Y
         JNC         SPOP5           < LE MOT (X,Y) EST MASQUE...
SPOP8:   EQU         $
         BSR         ASP             < EXECUTION DE L'OPERATION VARIABLE .OP.
                                     < SUR LE COUPLE DE POINTS (X,Y).
SPOP5:   EQU         $
         PLR         X,Y             < RESTAURATION DE XS ET YS...
         STX         XS
         STY         YS
         IC          XS              < PROGRESSION DE XS,
         IC          XR              < ET DE XR,
         LA          XR
         CPI         NPOLM1          < EST-ON EN BOUT DE LIGNE ???
         JLE         SPOP2           < NON... BALAYAGE HORIZONTAL...
         IC          YS              < OUI, PROGRESSION DE YS,
         IC          YR              < ET DE YR...
         LA          YR
         CPI         NLIGM1          < EST-ON EN BOUT D'IMAGE ???
         JLE         SPOP1           < NON, BALAYAGE VERTICAL...
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        M O U V E M E N T S   D ' I M A G E S  :
<
<
<        FONCTIONS :
<                      ON DISTINGUE 3 COMMANDES DE
<                    MOUVEMENT D'IMAGES :
<                    "U" : 'SCRATCH' --> 'RESIDENT' AVEC 'MASQUE.
<                    "S" : 1 - 'RESIDENT' --> 'SCRATCH',
<                          2 - 'MEMTV' --> 'DKU'.
<                    "L" : 1 - 'SCRATCH' --> 'RESIDENT' SANS 'MASQUE',
<                          2 - 'DKU' --> 'MEMTV'.
<
<
<        " S "  :
<
<
IMSAV:   EQU         $               < ENVOI DU RESIDENT EN SCRATCH.
         BSR         ASPDK1          < 'DKU' ???
         LBI         SDKUW           < OUI A PRIORI EN 'WRITE'...
         JE          DKUS1           < OUI...
<
< NON, 'RESIDENT' --> 'SCRATCH' :
<
         LRM         A,B,X
         WORD        ROUGE
         WORD        IMAGE
         WORD        LIMAG*NCOOL
         WCDA
         BR          ALOOP
XERROR:  EQU         $
         BR          AERROR
<
<
<        " U "  :
<
<
IMUP:    EQU         $               < RAPPEL DU SCRATCH EN RESIDENT AVEC MASK.
         LB          ASPACD
         JMP         IM2
<
<
<        " L "  :
<
<
IMLOAD:  EQU         $               < RAPPEL DU SCRATCH EN RESIDENT SANS MASK.
         BSR         ASPDK1          < 'DKU' ???
         LBI         SDKUR           < OUI A PRIORI EN 'READ'...
         JE          DKUS1           < OUI...
<
< NON, 'SCRATCH' --> 'RESIDENT' :
<
         LRM         A,B,X
         WORD        ROUGE
         WORD        IMAGE
         WORD        LIMAG*NCOOL
         RCDA
         BR          ALOOP
<
< OPERATIONS MOT A MOT :
<
IM1:     EQU         $
IM2:     EQU         $
         STB         ASP             < RELAI DYNAMIQUE DE SOUS-PROGRAMME.
         BSR         ASPOP
         BR          ALOOP
<
<
<        E C H A N G E S   ' M E M T V ' - ' D K U '  :
<
<
DKUS1:   EQU         $
         STB         SDKU            < SENS DE L'OPERATION...
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         LR          B,X             < ET SAVE DANS 'X'...
XWOR%7:  VAL         0
         LAI         NDKU
         STBY        SDKU            < 'NVP' DU 'DKU'...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMAD-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE L'ADRESSE ABSOLUE EVENTUELLE :
         JE          DKUS2           < OUI, (A)=ADRESSE ABSOLUE...
         LBY         &AREP           < A=PREMIER CARACTERE :
         LBI         0               < A PRIORI, C'EST LE LIMITEUR,
         CPI         EOM             < ALORS ???
         JE          DKUS3           < OUI, PAS DE TRANSLATION : B=0...
         LA          &AREP           < NON :
         LB          TDKU            < B=CONSTANTE DE TRANSLATION,
         CP          DKURP           < EST-CE UNE INCREMENTATION ???
         JE          DKUS3           < OUI...
         NGR         B,B             < B=CONSTANTE DE TRANSLATION,
         CP          DKURM           < EST-CE UNE DECREMENTATION ???
         JNE         XERROR          < NON, ON ABORTE...
DKUS3:   EQU         $
         LA          ASDKU           < A=ADRESSE COURANTE,
         ADR         B,A             < TRANSLATION...
DKUS2:   EQU         $
         STA         ASDKU           < MISE A JOUR DE L'ADRESSE COURANTE...
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         LR          X,A             < (A)=FONCTION LECTURE/ECRITURE.
         LXI         1               < (X)=1 ITERATION A PRIORI...
         CPI         SDKUR           < EST-CE UNE LECTURE ???
         JNE         DKUS4           < NON, (X)=1 ITERATION,
         LX          NITER           < OUI, (X)='NITER' ITERATIONS...
DKUS4:   EQU         $
<
< BOUCLE DE RALENTISSEMENT :
<
DKUS5:   EQU         $
         PSR         X               < SAVE LE NOMBRE D'ITERATIONS...
XWOR%7:  VAL         0
         LAD         SDKU
         SVC         0               < ENVOI DE LA DEMANDE...
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         PLR         X               < RESTAURE LE NOMBRE D'ITERATIONS...
XWOR%7:  VAL         0
         JNE         XERROR          < ERREUR ?!????!?! (PROTECTION,...)
         IF          MODE-ITEM,XWOR%7,,XWOR%7
         JDX         DKUS5           < ET ON ITERE AFIN DE RALENTIR LE DEBIT...
XWOR%7:  VAL         0
         BR          ALOOP           < ET C'EST TOUT...
<
<
<        C H O I X   ' D K U '   E T   ' S C R A T C H '  :
<
<
SPDK1:   EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMDK-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIN             < A=REPONSE...
         CPI         "O"
         JE          SPDK11          < "O"
         CPI         "N"
         JNE         SPDK1           < ??!??!?
         CPI         "O"             < POUR LES CODES DE RETOUR...
SPDK11:  EQU         $
         RSR
         PAGE
<
<
<        D E F I N I T I O N   D E   ' D K U '  :
<
<
DEFDKU:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMMEM-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIHEX
         JNE         DEFDKU
         STA         AMDKU           < ADRESSE DE DEBUT DE L'ECHANGE 'MEMTV'.
DEFDK1:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMLON-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIHEX
         JNE         DEFDK1
         STA         LODKU           < LONGUEUR DE L'ECHANGE EN OCTETS.
DEFDK2:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTRAN-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIHEX
         JNE         DEFDK2
         STA         TDKU            < CONSTANTE DE TRANSLATION DES ADRESSES
                                     < DE Q-SECTEURS.
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        S E L E C T I O N   D E   L A   V I T E S S E
<                    D E   ' D K U '  :
<
<
DKUS:    EQU         $
         LAI         MDKS-ZERO
         JMP         DKU
DKUF:    EQU         $
         LAI         MDKF-ZERO
DKU:     EQU         $
         BSR         ACCI            < ENVOI DE LA CARTE "!DK S"/"!DK F"...
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        C H O I X   D E   L A   V I T E S S E   D E   L E C T U R E  :
<
<
<        FONCTION :
<                      SOUS " =", IL EST POSSIBLE DE
<                    RALENTIR LE DEBIT EN LECTURE EN
<                    ITERANT CELLES-CI...
<
<
         IF          MODE-VISU,XWOR%7,,XWOR%7
PNITER:  EQU         ERROR           < N'EXISTE PAS SOUS "TU", INUTILE...
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
PNITER:  EQU         $
         BSR         AIHEX           < ENTREE DU NOMBRE D'ITERATIONS...
         JNE         PNITER          < ERREUR DE SYNTAXE...
         JALE        PNITER          < ON REFUSE LES NOMBRES NEGATIFS OU NULS...
         STA         NITER           < SAUVEGARDE DU NOMBRE D'ITERATIONS,
         BR          ALOOP           < ET VERS L'INTERROGATION...
XWOR%7:  VAL         0
         PAGE
<
<
<        C O N T R O L E   D E S   E R R E U R S   S U R   D K U  :
<
<
BON:     EQU         $
         LAI         MDKON-ZERO
         JMP         DKS0
MAUVAI:  EQU         $
         LAI         MDKOFF-ZERO
DKS0:    EQU         $
         BSR         ACCI            < ENVOI DE "!DK S0 ON"/"!DK S0 OFF"...
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        G E S T I O N   D U   D I S Q U E   V I D E O  :
<
<
VIDEO:   EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         MVIDEO-ZERO
         BSR         APRINT          < ENVOI D'UN MESSAGE...
XWOR%7:  VAL         0
         LAD         DMDKV
         BSR         AENTER          < ENTREE DES COMMANDES AU DISQUE VIDEO,
         LX          LMIN
         ADRI        -1,X
         LBY         &ABDKV          < (A)=DERNIER CARACTERE DU MESSAGE,
         CPI         '04             < LE CARACTERE COURANT EST-IL UN 'EOT' ???
         JNE         VIDEO2          < NON...
         LAI         '0D             < OUI,
         STBY        &ABDKV          < ON EN FAIT UN 'R/C'...
VIDEO2:  EQU         $
         LAD         SDKV
         SVC         0               < ENVOI DU MESSAGE AU DISQUE VIDEO...
         CPZ         IREADV          < FAUT-IL LIRE LE COMPTE-RENDU ???
         JL          VIDEO4          < NON...
         LAD         DMDKVR          < OUI :
         SVC         0               < LECTURE DE LA REPONSE,
         CPZ         IREPDV          < EDITE-T'ON LES REPONSES ???
         JL          VIDEO3          < NON...
         ACTD        3               < OUI :
                                     < (B)=LONGUEUR DE SA REPONSE,
         ADRI        -1+LMBDKV,B     < -1 POUR SUPPRIMER LE RETOUR-CHARRIOT
                                     < DE FIN DE MESSAGE...
         STB         DMDKVW+2
         LAD         DMDKVW
         SVC         0               < ET EDITION DE SA REPONSE...
VIDEO3:  EQU         $
VIDEO4:  EQU         $
         BR          ALOOP           < ET C'EST TOUT...
<
<
<        I N V E R S I O N   D E S   R E P O N S E S   ( " H " )  :
<
<
INVREP:  EQU         $
         LA          IREPDV
         NGR         A,A             < ON INVERSE L'INDICATEUR...
         STA         IREPDV
         BR          ALOOP           < ET C'EST TOUT...
<
<
<        I N V E R S I O N   C O M P T E - R E N D U   ( " Q " )  :
<
<
CRDKV:   EQU         $
         LA          IREADV
         NGR         A,A             < INVERSION
         STA         IREADV          <           DE 'IREADV' (BASCULE)...
         JAL         CRDKV1          < ON INHIBE LA LECTURE DU COMPTE-RENDU...
         LAD         DMDKVC          < ON AUTORISE LA LECTURE DU COMPTE-RENDU,
         SVC         0               < ON CLEAR DONC LE BUFFER D'ANTICIPATION...
CRDKV1:  EQU         $
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        S Y N C H R O N I S A T I O N   ' Z D C '  :
<
<
GETZDC:  EQU         $
<
< ACCES A LA 'ZDC' :
<
         LAD         DEMZDC
ZDCIN1:  EQU         $
         SVC         0               < ACCES A LA ZDC :
         CPZ         VALZDC          < EST-ELLE VALIDE ???
         JE          ZDCIN1          < NON, ON ATTEND...
         STZ         VALZDC          < OUI, ON L'ACQUITTE...
         LAD         DELZDC
         SVC         0               < ACQUITTEMENT...
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        E N T R E E   D E   ' O R G X '   E T   ' O R G Y '  :
<
<
GORGX:   EQU         $
         STZ         MODX            < TORE A PRIORI...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMORGX-ZERO
         BSR         APRINT          < EDITION DU MESSAGE.
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE ORGX,
         JE          GORGX1          < OK...
GORGX2:  EQU         $
         BR          AERROR          < ET NON...
GORGX1:  EQU         $
         NGR         A,A
         STA         ORGX
GORGX3:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTORE-ZERO
         BSR         APRINT          < "TORE?"
XWOR%7:  VAL         0
         BSR         AIN             < ENTREE DE LA REPONSE...
         CPI         "O"
         JE          GORGX4          < TORE...
         CPI         "N"
         JNE         GORGX3          < ERREUR...
         IC          MODX            < CE N'EST PAS LE MODE TORE...
GORGX4:  EQU         $
         BR          ALOOP           < OK...
GORGY:   EQU         $
         STZ         MODY            < MODE TORE A PRIORI...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMORGY-ZERO
         BSR         APRINT          < EDITION DU MESSAGE...
XWOR%7:  VAL         0
         BSR         AIHEX           < ENTREE DE ORGY,
         JNE         GORGX2          < ERREUR...
         NGR         A,A
         STA         ORGY
GORGY3:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMTORE-ZERO
         BSR         APRINT          < "TORE?"
XWOR%7:  VAL         0
         BSR         AIN             < ENTREE DE LA REPONSE...
         CPI         "O"
         JE          GORGY4          < TORE...
         CPI         "N"
         JNE         GORGY3          < ERREUR...
         IC          MODY            < CE N'EST PAS LE MODE TORE...
GORGY4:  EQU         $
         BR          ALOOP           < OK...
         PAGE
<
<
<        M O U V E M E N T S   R E S I D E N T  <-->  T V  :
<
<
MOV0:    EQU         $               < RESIDENT R+V+B --> TV.
         LAD         DEMTVR
         SVC         0               < ROUGE,
         LAD         DEMTVV
         SVC         0               < VERT,
MOV3:    EQU         $               < RESIDENT B --> TV.
         LAD         DEMTVB
         SVC         0               < BLEU.
         BR          ALOOP
MOV1:    EQU         $               < RESIDENT R --> TV.
         LAD         DEMTVR
         SVC         0               < ROUGE.
         BR          ALOOP
MOV2:    EQU         $               < RESIDENT V --> TV.
         LAD         DEMTVV
         SVC         0               < VERT.
         BR          ALOOP
PMOV5:   EQU         $               < TV R --> RESIDENT.
         LA          DEMTVR+3
         LR          A,B
         ORI         TVIN            < MISE EN ENTREE,
         STA         DEMTVR+3
         LAD         DEMTVR
         SVC         0               < ENTREE DU ROUGE,
         STB         DEMTVR+3        < ET RESTAURATION...
         RSR
PMOV6:   EQU         $               < TV V --> RESIDENT.
         LA          DEMTVV+3
         LR          A,B
         ORI         TVIN
         STA         DEMTVV+3
         LAD         DEMTVV
         SVC         0               < ENTREE DU VERT...
         STB         DEMTVV+3
         RSR
PMOV7:   EQU         $               < TV B --> RESIDENT.
         LA          DEMTVB+3
         LR          A,B
         ORI         TVIN
         STA         DEMTVB+3
         LAD         DEMTVB
         SVC         0               < ENTREE DU BLEU...
         STB         DEMTVB+3
         RSR
MOV4:    EQU         $               < TV R+V+B --> RESIDENT.
         BSR         APMOV5          < ROUGE,
         BSR         APMOV6          < VERT,
MOV7:    EQU         $               < TV B --> RESIDENT.
         BSR         APMOV7          < BLEU.
         BR          ALOOP
MOV5:    EQU         $               < TV R --> RESIDENT.
         BSR         APMOV5
         BR          ALOOP
MOV6:    EQU         $               < TV V --> RESIDENT.
         BSR         APMOV6
         BR          ALOOP
         PAGE
<
<
<        T R A N S F E R T S   R E S I D E N T - S C R A T C H  :
<
<
<        FONCTION :
<                      CE MODULE ASSURE LES TRANSFERTS
<                    BRUTAUX ENTRE LE RESIDENT, ET LE
<                    SCRATCH (QUI EST EN FAIT LA 'CDA').
<
<
SPACD:   EQU         $               < TRANSFERT AVEC MASQUE...
         PSR         A
         BSR         ASPGPS          < ACCES AU POINT SCRATCH COURANT,
         BSR         ASPRPR          < ET MISE EN RESIDENT...
         PLR         A
         RSR
         PAGE
<
<
<        " P E R M U T A T I O N "   D E S   C O U L E U R S  :
<
<
<        FONCTION :
<                      LA COMMANDE "I" PROCEDE AUX
<                    PERMUTATIONS SUIVANTES :
<                                    NOIR --> NOIR,
<                                    ROUGE --> BLANC,
<                                    VERT --> CYAN,
<                                    JAUNE --> MAGENTA,
<                                    BLEU --> BLEU,
<                                    MAGENTA --> JAUNE,
<                                    CYAN --> VERT,
<                                    BLANC --> ROUGE.
<
<
INVER:   EQU         $
         PSR         A
         BSR         ASPGPR          < (A)=NIVEAU(XR,YR),
         ADRI        -NIVMAX-1,A
         NGR         A,A
         ANDI        NIVMAX          < ON PERMUTE,
         BSR         ASPRPS          < CE QUI DONNE NIVEAU(XS,YS)...
         PLR         A
         RSR
<
<
<        C O M M A N D E   " I "  :
<
<
COMPL:   EQU         $
         LB          AINVER
         STB         ASP
         BSR         ASPOP           < PERMUTATION DES COULEURS POINT A POINT...
         BR          ALOOP           < ET C'EST TOUT...
         PAGE
<
<
<        T R A N S L A T I O N   D E S   N I V E A U X  :
<
<
<        FONCTION :
<                      SUITE A LA COMMANDE "P",
<                    ON PEUT TRANSLATER EN + OU EN
<                    - LES NIVEAUX EN FAISANT UN
<                    CALCUL MODULO OU PAS...
<
<
PCHNI:   EQU         $
         PSR         A
         BSR         ASPGPR          < (A)=NIVEAU(XR,YR),
         AD          INIVO           < TRANSLATION,
         CPZ         TNIVO           < MODULO OU PAS ???
         JNE         PCHNI1          < NON, SEUILLAGE AU NOIR...
         ANDI        NIVMAX          < OUI, CALCUL MODULO...
PCHNI1:  EQU         $
         JAL         PCHNI2          < LES NIVEAUX NEGATIFS SONT MIS AU NOIR,
         CPI         NIVMAX
         JLE         PCHNI3          < OK...
PCHNI2:  EQU         $
         LAI         0               < DE MEME QUE LES NIVEAUX TROP BLANCS...
PCHNI3:  EQU         $
         BSR         ASPRPS          < CE QUI DONNE LE NIVEAU DE (XS,YS)...
         PLR         A
         RSR
<
<
<        C O M M A N D E   " P "  :
<
<
CHNIV:   EQU         $
CHNIV1:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         MINIVO-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIHEX
         JNE         CHNIV1          < ERREUR...
         STA         INIVO           < OK, ON A L'AMPLITUDE DE TRANSLATION...
CHNIV3:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         MMODUL-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIN
         STZ         TNIVO           < MODULO A PRIORI...
         CPI         "O"             < ???
         JE          CHNIV2          < MODULO...
         CPI         "N"
         JNE         CHNIV3          < ??!??!
         IC          TNIVO           < SEUILLAGE...
CHNIV2:  EQU         $
         LB          APCHNI
         STB         ASP             < MISE EN PLAC DU MODULE...
         BSR         ASPOP           < ET TRANSLATION DES NIVEAUX...
         BR          ALOOP           < ET RETOUR A L'INTERROGATION...
         PAGE
<
<
<        G E N E R A T I O N   E T   V A L I D A T I O N  :
<
<
XWOR%1:  VAL         ITEM2-ZERO
         IF          $-ZERO-XWOR%1,XWOR%,,
         IF          ATTENTION : TROP LONG !!!
XWOR%:   VAL         0
XWOR%1:  VAL         PILE-LTNI-LTNI
XWOR%2:  VAL         $-ZERO
         DZS         XWOR%1-XWOR%2+1 < NETTOYAGE...
         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.