NMTD:    VAL         "TD"
NMG:     VAL         " G"
         IF          NMPROC-NMTD,,XWOR%,
         IF          NMPROC-NMG,,XWOR%,
         IF          ATTENTION : 'NMPROC' EST MAUVAIS !!!
XWOR%:   VAL         0
         IF          NMPROC-NMTD,XWOR%9,,XWOR%9
         IDP         "TD - VERSION SUPER-DETAILS DE TW"
XWOR%9:  VAL         0
         IF          NMPROC-NMG,XWOR%9,,XWOR%9
         IDP         " G - VERSION DE 'TD' 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 " G", ON LE REMPLACE PAR "TD",
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...
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
REP:     DZS         NBRHEX/NOCMO    < BUFFER DES REPONSES.
MERR:    BYTE        1;"?"
         IF          MODE-VISU,XWOR%7,,XWOR%7
MINT:    BYTE        2;'6D;">";0
MNOM:    BYTE        5;'6D
         ASCI        "NOM="
MORGX:   BYTE        3;'6D
         ASCI        "X="
MORGY:   BYTE        3;'6D
         ASCI        "Y="
MTORE:   BYTE        6;'6D
         ASCI        "TORE? "
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;"/"
MMOD:    BYTE        25;'6D
         ASCI        "0=HD/BD 1=BD/HD 2=HD/HD?"
MWDK:    BYTE        10;'6D
         ASCI        "ENVOI DK? "
MNOIR:   BYTE        12;'6D
         ASCI        "ENVOI NOIR? "
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="
AMMOD:   EQU         MMOD            < "0=HD/BD..."
AMWDK:   EQU         MWDK            < "ENVOI DK?"
AMNOIR:  EQU         MNOIR           < "ENVOI NOIR?"
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,
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
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
         IF          MODE-ITEM,XWOR%7,,XWOR%7
SITEM1:  DZS         LNOM/NOCMO      < POUR SAUVEGARDER LA FIN DE L'ITEM1.
XWOR%7:  VAL         0
         PAGE
<
<
<        C O M M O N  :
<
<
         COMMON
COMON:   WORD        0               < LE PREMIER MOT DU COMMON EST RESERVE
                                     < A L'OPERATEUR FLOTTANT !!!
<
< DONNEES POUR LE TRACE VIDEO :
<
CDA:     EQU         $               < BLOC DE DONNEES POUR LA VISUALISATION :
SIGNAL:: VAL         -1              < POUR LA SYNCHRONISATION...
CDAVAL:  WORD        0               < -1 : L'INFORMATION EST VALIDE POUR
                                     <      UN GET ; LE GET LE REMET A 0;
                                     < 0  : INFORMATION NON VALIDE POUR
                                     <      UN GET...
CDABLK:  EQU         $               < BLOC DE DONNEES PROPREMENT DIT...
CDAX:    WORD        0               < COORDONNEE X,
CDAY:    WORD        0               < COORDONNEE Y,
CDANR:   WORD        0               < NIVEAU DE ROUGE DU POINT,
CDANV:   WORD        0               < NIVEAU DE VERT DU POINT,
CDANB:   WORD        0               < NIVEAU DE BLEU DU POINT,
CDAXXX:  WORD        0               < INUTILISE, MAIS PERMET DE FAIRE QUE
                                     < LA LONGUEUR TOTALE SOIT DE 8 MOTS...
LBLOC::  VAL         $-CDABLK
CDAACK:  WORD        0               < -1 : INFORMATION NON ENCORE PRISE
                                     <      EN COMPTE PAR LE GET  ;
                                     < 0  : INFORMATION PRISE EN COMPTE PAR GET.
LCDA::   VAL         $-CDA           < LONGUEUR DU BLOC D'INFORMATION.
         IF          LCDA-8,,XWOR%,
         IF          C'EST MIEUX SI LCDA FAIT 8 MOTS !!!
XWOR%:   VAL         0
CDA1::   VAL         0               < PREMIER BLOC,
CDA2::   VAL         CDA1+LCDA       < DEUXIEME BLOC EN BASCULE AVEC CDA1.
ACDA:    WORD        CDA1            < CDA1 OU CDA2 : ADRESSE DU BLOC ACTIF.
CUMUL:   WORD        0               < NOMBRE DE POINTS EXISTANTS LORS DES
                                     < INTERPOLATIONS.
VMODE:   WORD        0               < -1 : HD --> BD : VISUALISATION EN SCRATCH
                                     <      D'UNE IMAGE HAUTE-DEFINITION,
                                     < 0  : BD --> HD : ENVOI DE L'IMAGE
                                     <      RESIDENTE EN HAUTE-DEFINITION,
                                     < +1 : HD --> HD : ENVOI EN HAUTE DEFINITIO
                                     <      D'UNE IMAGE HAUTE DEFINITION.
INOIR:   WORD        0               < 0 : PAS D'ENVOI DES POINTS NOIRS,
                                     < 1 : DENVOI DE TOUS LES POINTS, MEME
                                     <     LES NORS...
<
< SOUS-PROGRAMMES :
<
ASP1:    WORD        SP1             < CUMUL DES NIVEAUX D'UN POINT.
ASP2:    WORD        SP2             < APPAUVRISSEMENT DES NIVEAUX DE GRIS.
AGCOUL:  WORD        GCOUL           < RECUPERATION DE LA MEMOIRE DE COULEURS.
ADIAP1:  WORD        DIAPO1
ADIAP2:  WORD        DIAPO2
ADIAPD:  WORD        DIAP2
ASPG:    WORD        0               < CONTIENT ASPGPR OU ASPGPT...
ASPGPT:  WORD        SPGPT           < VERSION DE 'SPGPS' AVEC TRANSFERT
                                     < INITIAL (XR,YR) --> (XS,YS).
<
< IMAGE HAUTE-DEFINITION :
<
IHD2::   VAL         2               < RAPPORT ENTRE LA DEFINITION NORMALE
                                     < ET LA HAUTE DEFINITION.
IHDNL::  VAL         NLIG*IHD2       < NOMBRE DE LIGNES,
IHDNP::  VAL         NMOTL*NBITMO*IHD2
                                     < NOMNRE DE POINTS/LIGNE.
MIHDNL:  WORD        IHDNL           < NOMBRE DE LIGNES,
MIHDNP:  WORD        IHDNP           < NOMBRE DE POINTS PAR LIGNE.
IHDNIV:: VAL         512             < NOMBRE DE NIVEAUX DE GRIS PAR COULEUR.
XWOR%1:  VAL         IHDNL=0
         IF          BIT>XWOR%1-IHDNL,,XWOR%,
         IF          ATTENTION : IHDNL DOIT ETRE UNE PUISSANCE DE 2 !!!
XWOR%:   VAL         0
XWOR%2:  VAL         IHDNP=0
         IF          BIT>XWOR%2-IHDNP,,XWOR%,
         IF          ATTENTION : IHDNP DOIT ETRE UNE PUISSANCE DE 2 !!!
XWOR%:   VAL         0
XWOR%3:  VAL         XWOR%1+XWOR%2
XWOR%4:  VAL         LK=0
XWOR%5:  VAL         XWOR%3-XWOR%4
LKIMAG:: VAL         BIT>XWOR%5*LPOINT < LONGUEUR EN K-MOTS D'UNE IMAGE HAUTE-
                                       < DEFINITION.
LKBUF::  VAL         8               < LONGUEUR DU BUFFER DE PAGINATION
                                     < D'UNE IMAGE HAUTE-DEFINITION.
         IF          LKBUF*LK/LPOINT-IHDNL,,XWOR%,XWOR%
         IF          ATTENTION : UNE PAGE DOIT CONTENIR PLUS D'UNE
         IF          COLONNE A CAUSE DE L'ENTRELACEMENT...
XWOR%:   VAL         0
XWOR%6:  VAL         LKBUF=0
         IF          BIT>XWOR%6-LKBUF,,XWOR%,
         IF          ATTENTION : LKBUF DOIT ETRE UNE PUISSANCE DE 2 !!!
XWOR%:   VAL         0
NPAGES:: VAL         LKIMAG/LKBUF    < NOMRE DE PAGES POUR DEFINIR UNE IMAGE
                                     < HAUTE DEFINITION.
BUFI:    EQU         IMAGE           < LE BUFFER DE PAGINATION EST IMPLANTE
                                     < DANS L'IMAGE RESIDENTE...
RDKUI:   BYTE        NDKU;'08        < LECTURE DU DKU EN QUANTA=1.
         WORD        BUFI-ZERO*NOCMO
         WORD        LKBUF*LK*NOCMO
         WORD        0               < ADRESSE SECTEUR DE LA PAGE COURANTE...
WDKUI:   BYTE        NDKU;'0A        < ECRITURE DU DKU EN QUANTA=1.
         WORD        BUFI-ZERO*NOCMO
         WORD        LKBUF*LK*NOCMO
         WORD        -1              < ADRESSE DE LA PAGE EN COURS DE REMPLIS-
                                     < SAGE (-1 LA PREMIERE FOIS INDIQUE QU'
                                     < ELLE N'EXISTE PAS).
INDK:    WORD        0               < LORS DES OPERATION DE TYPE 'BD -->'
                                     < INDIQUE :
                                     < 0 : ENVOI BD --> PROCESSEUR SPECIALISE,
                                     < 1 : ENVOI BD --> DKU.
NSBUF::  VAL         LKBUF*LK/LSDKU  < NOMBRE DE SECTEURS PAR PAGES.
ABUFI:   WORD        BUFI,X          < RELAI D'ACCES A LA PAGE COURANTE.
<
< MEMOIRE INSTANTANEE DES COULEURS :
<
NNIV::   VAL         16              < NOMBRE DE NIVEAUX PAR CANAUX.
AMC:     WORD        MC,X
<
< 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.
         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        ERROR           < 8
         WORD        ERROR           < 9
         WORD        ERROR           < :
         WORD        ERROR           < ;
         WORD        ERROR           < <
         WORD        DEFDKU          < = : DEFINITION DES ECHANGES 'DKU'
         WORD        ERROR           < >
         WORD        ERROR           < ?
         WORD        ERROR           < @
         WORD        ERROR           < A
         WORD        ERROR           < B
         WORD        ERROR           < C
         WORD        DISP            < D : RESIDENT <-- IMAGE SGN
         WORD        ERROR           < E
         WORD        GOGE            < F : FIN
         WORD        RECUP           < G : COMMANDE INVERSE DE 'V'
         WORD        ERROR           < H
         WORD        ERROR           < I
         WORD        ERROR           < J
         WORD        ERROR           < K
         WORD        IMLOAD          < L : RESIDENT <-- (SCRATCH) SANS MASQUE
         WORD        ERROR           < M
         WORD        NAME            < N : NOMME L'IMAGE RESIDENTE
         WORD        ERROR           < O
         WORD        ERROR           < P
         WORD        ERROR           < Q
         WORD        ERROR           < R
         WORD        IMSAV           < S : SCRATCH <-- (RESIDENT)
         WORD        ERROR           < T
         WORD        IMUP            < U : RESIDENT <-- (SCRATCH) AVEC MASQUE
         WORD        DIAPO           < V : EDITION IMAGE EN HAUTE-DEFINITION
         WORD        GOCCI           < W : RETOUR TEMPORAIRE AU CCI
         WORD        GORGX           < X : POSITIONNEMENT DE 'ORGX'
         WORD        GORGY           < Y : POSITIONNEMENT DE 'ORGY'
         WORD        ERROR           < Z
REPZ:    VAL         $-KOM-1         < DERNIERE COMMANDE.
         PAGE
         PROG
         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         X
         SVC         0               < ENVOI DE LA DEMANDE...
         PLR         X
         RSR
XWOR%7:  VAL         0
         IF          MODE-ITEM,XWOR%7,,XWOR%7
ENTER:   EQU         $
         PSR         A,X,Y,W
         LR          A,W             < W=ADRESSE DE LA DEMANDE :
         LRM         A
         WORD        '0101
         CP          0,W             < EST-CE BIEN UNE ENTREE AVEC ECHO
                                     < SUR LA VISU UTILISATEUR ???
         JE          ENTER1          < OUI...
         QUIT        1               < NON, ???!???!
ENTER1:  EQU         $
         LA          1,W             < A=ADRESSE OCTET DU BUFFER,
         LYI         0               < Y=INDEX DU BUFFER,
         SLRS        NOCMO=0         < CONVERSION EN UNE ADRESSE MOT,
         ADCR        Y               < Y=INDEX INITIAL DU BUFFER COURANT.
         SBT         0               < MISE EN PLACE DU BIT INDEX,
         STA         ABUFC           < ET GENERATION DU RELAI VERS LE BUFFER.
         LX          2,W             < X=NOMBRE D'OCTETS MAX A DEPLACER...
ENTER2:  EQU         $
         PSR         X
         LA          IEG             < A=INDEX COURANT DE L'ITEM1,
         CP          NCP             < ET VALIDATION ???
         JL          ENTER3          < OK...
         BR          AALTM           < NON, ON FAIT COMME SI UN ALT-MODE
                                     < ETAIT ARRIVE...
ENTER3:  EQU         $
         IC          IEG             < PROGRESSION DE L'INDEX DE L'ITEM1.
         LR          A,X             < X=INDEX D'ACCES A L'ITEM1,
         LBY         &AI1            < A=CARACTERE COURANT DE L'ITEM1,
         CPI         " "             < EST-CE L'ELEMENT NEUTRE ???
         JNE         ENTER6          < NON...
         PLR         X               < OUI,
         LR          X,A
         CP          2,W             < EST-ON EN TETE DU MESSAGE ???
         JE          ENTER2          < OUI, ON IGNORE LE 'SPACE'...
         PSR         X               < NON, ON LE CONSERVE...
         LAI         " "             < RESTAURATION DE 'A'...
ENTER6:  EQU         $
         CPI         ";"             < EST-CE LA FIN DE MESSAGE ???
         JNE         ENTER4          < NON,
         LAI         '04             < OUI, ON LE REMPLACE PAR 'EOT'...
ENTER4:  EQU         $
         LR          Y,X
         STBY        &ABUFC          < ET RANGEMENT DANS LE BUFFER...
         ADRI        1,Y             < PROGRESSION DE L'INDEX BUFFER.
         PLR         X
         CPI         '04             < EST-CE UNE FIN DE MESSAGE ???
         JE          ENTER5          < OUI, ON ARRETE LA...
         JDX         ENTER2          < NON, ON CONTINUE...
ENTER5:  EQU         $
         PLR         A,X,Y,W
         RSR
XWOR%7:  VAL         0
         PAGE
<
<
<        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'...
         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
         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...
         STZ         IMASKO          < MISE DU MASQUE OFF A PRIORI...
         LAD         DEMMEM
         SVC         0               < PASSAGE A 16 K...
         LAI         '18
         WORD        '1E15
         LR          B,X             < X=ORIGINE DE LA '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
<
<
<        M O D U L E S   D ' A C C E S   A U   S G N  :
<
<
<        FONCTION :
<                      PERMETTENT L'ACCES AU SGN
<                    POUR LES IMAGES SUIVANT :
<                    N : NOMME L'IMAGE RESIDENTE,
<                        JUSQU'A UNE COMMANDE 'N'
<                        SUIVANTE,
<                    D : AFFICHE L'IMAGE PRECEDEMMENT
<                        NOMMEE PAR 'N'.
<                    + : CREE L'IMAGE PRECEDEMMENT
<                        NOMMEE PAR 'N',
<                    - : DETRUIT L'IMAGE PRECEDEMMENT
<                        NOMMEE PAR 'N'.
<
<
NAME:    EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMNOM-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         LAD         NOMIN
         BSR         AENTER          < ENTREE DU NOM COURANT,
         LAI         EOT
         STBY        &AEOT           < ET ON FORCE A PRIORI UN 'EOT'...
         BR          ALOOP           < ET C'EST TOUT...
<
< SOUS-PROGRAMME GENERAL D'ACCES AU SGN :
< (LORS DES 'LNS' ET 'LON', IL REGARDE
< SI LA LONGUEUR DE L'IMAGE VAUT EXACTE-
< MENT LIMAG*NCOOL*NOCMO ; SI NON, ELLE
< REITERE L'OPERATION AVEC UN DELTA
< NOM-VALEUR DE -1 CORRESPONDANT A UNE
< ANCIENNE VERSION DU PROGRAMME)
<
GOSGN:   EQU         $               < RESPONSABLE DE TOUS LES ACCES SGN...
         STBY        SGN             < MISE EN PLACE DU 'NVP' ARGUMENT,
         LAI         LNOM*NOCMO
         STA         SGN+3           < A PRIORI...
         LAD         SGN
         SVC         0               < ET ENVOI DE LA DEMANDE...
         LBY         SGN
         CPI         SGNDLN
         JE          GOSGN1          < CAS D'UN DELETE...
         CPI         SGNSTN
         JE          GOSGN1          < CAS D'UN STORE...
         ACTD        3               < CAS D'UN LOAD : B=LONGUEUR DE L'IMAGE,
         LRM         A
         WORD        LIMAG*NCOOL*NOCMO
         CPR         A,B             < S'AGIT-IL D'UNE ANCIENNE OU D'UNE
                                     < NOUVELLE IMAGE ???
         JE          GOSGN1          < NOUVELLE : DELTA=LNOM*NOCMO...
         LAI         -1              < ANCIENNE :
         STA         SGN+3           < IL FAUT LA RECUPERER AVEC DELTA=-1...
         LAD         SGN
         SVC         0               < ON REITERE LE LOAD...
GOSGN1:  EQU         $
         CPZR        X               < TEST DES CONDITIONS DE RETOUR...
         RSR
<
< MODULES SPECIFIQUES :
<
DISP:    EQU         $               < COMMANDE 'D' :
         LAI         SGNLON          < ON COMMENCE PAR L'ACN DU DEMANDEUR,
         BSR         AGOSGN
         JE          DISP1           < OK, IL EXISTE...
         LAI         SGNLNS          < NON, ON TENTE SOUS :SYS...
         BSR         AGOSGN
         JE          DISP1           < OK...
DISP2:   EQU         $
         BR          AERROR          < TRAITEMENT DES ERREURS...
DISP1:   EQU         $
         BR          ALOOP           < VERS LA BOUCLE SI OK...
DELETE:  EQU         $               < COMMANDE '-' :
         LAI         SGNDLN
DELET1:  EQU         $
         BSR         AGOSGN
         JE          DISP1           < OK...
         JMP         DISP2           < ERREUR...
STORE:   EQU         $               < COMMANDE '+' :
         LAI         SGNSTN
         JMP         DELET1
         PAGE
<
<
<        A C C E S   A   U 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
<
<
<        R E C U P E R A T I O N   D E   L A   M E M O I R E
<                    D E S   C O U L E U R S  :
<
<
GCOUL:   EQU         $
         LAI         NSPCOL
         SBT         0
         ACTD        1
         LR          B,A             < A=ADRESSE DU REGISTRE 0,
         LXI         0               < X=NUMERO DE REGISTRE.
GCOUL1:  EQU         $
         ACTD        1               < B=REGISTRE(X),
         STB         &AMC            < QUE L'ON SAUVEGARDE...
         ADRI        1,A             < REGISTRE
         ADRI        1,X             < SUIVANT...
         XR          A,X
         CPI         NIVMAX          < ON SE LIMITE AU BANK0...
         XR          A,X
         JLE         GCOUL1
         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...
         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...
         LAD         SDKU
         SVC         0               < ENVOI DE LA DEMANDE...
         JNE         XERROR          < ERREUR ?!????!?! (PROTECTION,...)
         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
<
<
<        E N V O I   D ' U N E   I M A G E   N O R M A L E
<        D A N S   L E   S Y S T E M E   H A U T E - D E F I N I T I O N  :
<
<
<        FONCTION :
<                      CETTE COMMANDE ADMET TROIS MODES
<                    DE FONCTIONNEMENT :
<                    -1 : L'IMAGE HAUTE DEFINITION STOCKEE
<                         AU DEBUT DE DKU EST RECUPEREE, ET
<                         PAR APPAUVRISSEMENT EST PLACEE EN
<                         IMAGE SCRATCH.
<                    0  : DEUX MODES DE FONCTIONNEMENT :
<                         1 - SI INDK=0 : L'IMAGE RESIDENTE EST ENVOYEE VERS
<                         LE PROCESSEUR SPECIALISE HAUTE-DEFINITION VIA LA CDA.
<                         2 - SI INDK=1 : L'IMAGE SCRATCH EST ENVOYEE VERS
<                         DKU EN HAUTE DEFINITION...
<                    +1 : L'IMAGE HAUTE-DEFINITION STOCKEE
<                         AU DEBUT DE DKU EST ENVOYEE AU
<                         PROCESSEUR SPECIALISE HAUTE-DEFINITION
<                         VIA LA CDA COMMUNE.
<                      CES MODES SONT APPELES :
<                    -1 : HD --> BD,
<                    0  : BD --> HD,
<                    +1 : HD --> HD.
<                    (H=HAUTE, B=BASSE, D=DEFINITION)
<
<
<        FORMAT D'UNE IMAGE HAUTE-DEFINITION :
<                      CHAQUE POINT EST CODE SUR 2 MOTS
<                    DONT LA DSEC 'POINT' DONNE LE FORMAT ;
<                    L'IMAGE EST RANGEE COLONNE PAR COLONNE :
<                    COLONNE(X=0) : POINTS (0,0), (0,1),..., (0,511),
<                    COLONNE(X=1) : POINTS (1,0), (1,1),..., (1,511),
<                    ...
<                    COLONNE(X=511) : POINTS (511,0), (511,1),..., (511,511).
<                    NOTA : UNE PAGE CONTENANT PLUS D'UNE COLONNE
<                    LES PROBLEMES D'ENTRELACEMENT SONT SIMPLES...
<
<
DIAPO:   EQU         $
         STZ         INDK            < A PRIORI, PAS DE PAGE DKU EN COURS
                                     < DE GENERATION...
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMMOD-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIN             < A=MODE DESIRE :
         ADRI        -"1",A          < CONVERSION BINAIRE,
         CPI         -1
         JL          DIAPO           < ERREUR...
         CPI         1
         JG          DIAPO           < ERREUR...
         STA         VMODE
         JANE        DIAP42          < CAS HD --> BD ET HD --> HD...
<
< CAS D'UN ACCES A L'IMAGE RESIDENTE :
<
DIAP41:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMWDK-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIN             < A=REPONSE OUI/NON...
         LB          ASPGPR          < B=IMAGE RESIDENTE A PRIORI...
         STZ         INDK            < INDK=0 : PAS D'ENVOI DKU A PRIORI...
         CPI         "N"
         JE          DIAP40          < NON, PAS D'ENVOI DKU...
         CPI         "O"
         JNE         DIAP41          < ?!???!?!
         LB          ASPGPT          < B=IMAGE SCRATCH...
         IC          INDK            < INDK=1 : ENVOI A DKU UNIQUEMENT...
         STZ         WDKUI+3
         DC          WDKUI+3         < PAS DE PAGE EN GENERATION INITIALEMENT.
                                     < (ADRESSE NEGATIVE)
DIAP40:  EQU         $
         STB         ASPG            < MISE EN PLACE DU SOUS-PROGRAMME VARIABLE
                                     < D'ACCES A L'IMAGE SCRATCH OU RESIDENTE
                                     < SUIVANT LA VALEUR DE INDK...
DIAP42:  EQU         $
         CPZ         VMODE
         JL          DIAP1           < MODE HD --> BD : LA CDA COMMUNE
                                     < N'EST PAS NECESSAIRE...
         CPZ         INDK            < EST-CE BD --> DKU ???
         JNE         DIAP1           < OUI, LA AUSSI LA CDA N'EST PAS UTILE...
<
< CAS DES ACCES A LA CDA :
<
         LAI         AMCDA-ZERO
         BSR         ACCI            < ACCES A LA CDA COMMUNE.
DIAP10:  EQU         $
         IF          MODE-VISU,XWOR%7,,XWOR%7
         LAI         AMNOIR-ZERO
         BSR         APRINT
XWOR%7:  VAL         0
         BSR         AIN             < A=REPONSE...
         STZ         INOIR           < INOIR=0 : NON A PRIORI...
         CPI         "N"
         JE          DIAP11
         CPI         "O"
         JNE         DIAP10          < ??!?!?!
         IC          INOIR           < INOIR=1 : OUI...
DIAP11:  EQU         $
<
< INITIALISATION DU PROCESSUS :
<
         STZ         CDAX
         STZ         CDAY
         STZ         CDANR
         STZ         CDANV
         STZ         CDANB
         STZ         CDAVAL
         STZ         CDAACK
         LAI         CDA1
         STA         ACDA            < INITIALISATION DE LA BASCULE...
         LRM         B,X             < INITIALISATION DE LA CDA1,
         WORD        CDA
         WORD        LCDA
         WCDA
         LAI         CDA2
         LXI         LCDA            < INITIALISATION DE LA CDA2.
         WCDA
DIAP1:   EQU         $
<
< RECUPERATION DE LA MEMOIRE DE COULEURS :
<
         BSR         AGCOUL
<
< EXPLORATION DE L'IMAGE RESIDENTE :
<
         LXI         0               < X=COORDONNEE X HAUTE-DEFINITION.
<
< BALAYAGE EN X :
<
DIAPO1:  EQU         $
         LYI         0               < Y=COORDONNEE Y HAUTE-DEFINITION.
<
< BALAYAGE EN Y :
<
DIAPO2:  EQU         $
         PSR         X,Y
<
< TRAITEMENT DU POINT COURANT :
<
         STX         CDAX
         STZ         CDANR
         STZ         CDANV
         STZ         CDANB
         LR          X,A
         SLRS        IHD2=0
         STA         XR              < XR=X/2.
         STZ         CUMUL
         IC          CUMUL           < CUMUL=1.
XXMOD::  VAL         2               < CONSTANTE D'ENTRELACEMENT DES Y :
                                     < ON PERMUTE 2*2 BITS...
         LR          Y,A             < A=COORDONNEE Y AVANT ENTRELACEMENT,
         SCRS        IHDNL=0-XXMOD
         SLRD        XXMOD           < ON PERMUTE LES 2 PREMIERS BITS DE LA
                                     < COORDONNEE Y AVEC SES 2 DERNIERS, EN
                                     < SUPPOSANT XXMOD=2...
         SLLS        XXMOD
         SCLS        IHDNL=0-XXMOD
         SLLD        XXMOD
         LR          A,Y             < Y=COORDONNEE Y APRES ENTRELACEMENT...
         STY         CDAY
         CPZ         VMODE
         JE          DIAP60          < CAS DES MODES N'UTILISANT PAS DKU...
         BR          ADIAPD          < CAS DES MODES UTILISANT DKU...
DIAP60:  EQU         $
<
< ENVOI DE L'IMAGE RESIDENTE EN HAUTE-DEFINITION :
<
         SLRS        IHD2=0
         STA         YR              < YR=Y ENTRELACE/2.
         JC          YNP1            < Y ENTRELACE EST IMPAIR...
         LR          X,A
         TBT         NBITMO-1
         JC          YPXNP1          < X EST IMPAIR...
<
< X ET Y ENTRELACE SONT PAIRS :
< (LES POINTS (X,Y) ET (XR,YR) SONT CONFONDUS)
<
         BSR         ASPG            < NIV(X/2,Y/2).
         BSR         ASP1            < CALCUL DES NIVEAUX...
         JMP         DIAPO3
<
< Y ENTRELACE EST PAIR, ET X IMPAIR :
< (ON INTERPOLE SUR L'AXE DES X)
<
YPXNP1:  EQU         $
         BSR         ASPG            < NIV(X/2,Y/2).
         BSR         ASP1            < CUMUL DES NIVEAUX...
         IC          XR
         BSR         ASPG            < NIV((X+2)/2,Y/2).
         JAL         YPXNP2          < POINT INEXISTANT...
         BSR         ASP1            < CUMUL DES NIVEAUX...
         IC          CUMUL
YPXNP2:  EQU         $
         JMP         DIAPO3
YNP1:    EQU         $
         LR          X,A
         TBT         NBITMO-1
         JC          YNPXNP          < X EST IMPAIR...
<
< Y ENTRELACE EST IMPAIR, ET X EST PAIR :
< (ON INTERPOLE SUR L'AXE DES Y)
<
YNPXP:   EQU         $
         BSR         ASPG            < NIV(X/2,Y/2).
         BSR         ASP1            < CUMUL DES NIVEAUX...
         IC          YR
         BSR         ASPG            < NIV(X/2,(Y+2)/2).
         JAL         YNPXP1          < POINT INEXISTANT...
         BSR         ASP1            < CUMUL DES NIVEAUX...
         IC          CUMUL
YNPXP1:  EQU         $
         JMP         DIAPO3
<
< Y ENTRELACE ET X SONT IMPAIRS :
< (INTERPOLATION SUR LES 2 AXES)
<
YNPXNP:  EQU         $
         BSR         ASPG            < NIV(X/2,Y/2).
         BSR         ASP1            < CUMUL DES NIVEAUX...
         IC          XR
         BSR         ASPG            < NIV((X+2)/2,Y/2).
         JAL         XYNP1           < POINT INEXISTANT...
         BSR         ASP1            < CUMUL DES NIVEAUX...
         IC          CUMUL
XYNP1:   EQU         $
         IC          YR
         BSR         ASPG            < NIV((X+2)/2,(Y+2)/2).
         JAL         XYNP2           < POINT INEXISTANT...
         BSR         ASP1            < CUMUL DES NIVEAUX...
         IC          CUMUL
XYNP2:   EQU         $
         DC          XR
         BSR         ASPG            < NIV(X/2,(Y+2)/2).
         JAL         XYNP3           < POINT INEXISTANT...
         BSR         ASP1            < CUMUL DES NIVEAUX...
         IC          CUMUL
XYNP3:   EQU         $
<
< TRAITEMENT DES NIVEAUX DE GRIS :
<
DIAPO3:  EQU         $
XWOR%2:  VAL         IHDNIV/NNIV=0
         LA          CDANR
         SARD        NBITMO-XWOR%2
         DV          CUMUL
         STA         CDANR           < NIVEAU DE ROUGE DE (X,Y ENTRELACE).
         LA          CDANV
         SARD        NBITMO-XWOR%2
         DV          CUMUL
         STA         CDANV           < NIVEAU DE VERT DE (X,Y ENTRELACE).
         LA          CDANB
         SARD        NBITMO-XWOR%2
         DV          CUMUL
         STA         CDANB           < NIVEAU DE BLEU DE (X,Y ENTRELACE)
         CPZ         INDK            < ENVOI AU PROCESSEUR SPECIALISE ???
         JE          SCDA1           < OUI...
<
< ENVOI DE L'IMAGE RESIDENTE A DKU :
<
         LR          X,A
         ANDI        LKBUF*LK/LPOINT/IHDNL-1
         JANE        DIAP21
         CPZR        Y
         JNE         DIAP21
<
< CAS DU PASSAGE A UNE NOUVELLE PAGE :
<
         PSR         A
         CPZ         WDKUI+3         < EST-CE L'INITIALISATION ???
         JL          DIAP22          < OUI...
         PSR         X
         LAD         WDKUI
         SVC         0               < GENERATION DE LA PAGE PRECEDENTE...
         PLR         X
DIAP22:  EQU         $
         LR          X,A
         SLRS        LKBUF*LK/LPOINT/IHDNL=0
         SLLS        NSBUF=0
         STA         WDKUI+3         < INITIALISATION DE L'ADRESSE DE LA
                                     < NOUVELLE PAGE...
         PLR         A
<
< GENERATION DU POINT COURANT :
<
DIAP21:  EQU         $
         MP          MIHDNL
         ADR         Y,B
XWOR%1:  VAL         LPOINT=0
XWOR%2:  VAL         NOCMO=0
         SLLD        XWOR%1+XWOR%2
         LR          B,X             < X=INDEX DE RANGEMENT DES NIVEAUX
                                     < DE COULEUR EN COMMENCANT PAR ROUGE.
         LBI         0               < CLEAR B...
         LA          CDANR           < NIVEAU DE ROUGE SUR 9 BITS :
         SLLS        NBITOC-BIT
         SCLD        BIT
         SLRS        NBITOC
         STBY        &ABUFI          < NIVEAU DE ROUGE (BITS 1-8).
         ADRI        1,X
         LA          CDANV           < NIVEAU DE VERT SUR 9 BITS :
         SLLS        NBITOC-BIT
         SCLD        BIT
         SLRS        NBITOC
         STBY        &ABUFI          < NIVEAU DE VERT (BITS 1-8).
         ADRI        1,X
         LA          CDANB           < NIVEAU DE BLEU SUR 9 BITS :
         SLLS        NBITOC-BIT
         SCLD        BIT
         SLRS        NBITOC
         STBY        &ABUFI          < NIVEAU DE BLEU (BITS 1-8).
         ADRI        1,X
         SLLD        NBITMO+NBITOC-NCOOL
         STBY        &ABUFI          < BITS 0 DES NIVEAUX DE ROUGE, DE
                                     < VERT ET DE BLEU.
         JMP         DIAPO5          < VERS LE POINT SUIVANT...
<
< ENVOI AU PROCESSEUR SPECIALISE :
<
SCDA1:   EQU         $
         LA          CDANR
         OR          CDANV
         OR          CDANB
         OR          INOIR
         JAE         DIAPO5          < ON ELIMINE LES POINTS NOIRS...
         LA          ACDA
         ADRI        CDAACK-CDA,A
SCDA:    EQU         $
         LRM         B,X
         WORD        CDAACK
         WORD        1
         RCDA
         CPZ         CDAACK
         JNE         SCDA            < LE BLOC PHYSIQUE COURANT DE LA CDA
                                     < N'A PAS ENCORE ETE ACQUITTE PAR LE
                                     < GET, IL FAUT ATTENDRE...
         ADRI        CDABLK-CDAACK,A
         LRM         B,X             < OK, ENVOI DU BLOC DE DONNEES...
         WORD        CDABLK
         WORD        LBLOC
         WCDA
         LBI         SIGNAL
         STB         CDAACK
         STB         CDAVAL
         ADRI        CDAACK-CDABLK,A
         LRM         B,X             < POUR LE FUTUR ACQUITTEMENT...
         WORD        CDAACK
         WORD        1
         WCDA
         ADRI        CDAVAL-CDAACK,A
         LRM         B,X             < SIGNALISATION DE DONNEES VALIDES...
         WORD        CDAVAL
         WORD        1
         WCDA
         LA          ACDA
         LBI         CDA1
         CPI         CDA2
         JE          DIAPO4
         LBI         CDA2
DIAPO4:  EQU         $
         STB         ACDA            < BASCULE DE CDA1 ET CDA2...
<
< PASSAGE AU POINT SUIVANT :
<
DIAPO5:  EQU         $
         PLR         X,Y
         ADRI        1,Y
         LR          Y,A
         CP          MIHDNL
         JL          DIAP52          < ON RESTE DANS LA MEME COLONNE...
         ADRI        1,X
         LR          X,A
         CP          MIHDNP
         JL          DIAP51          < CHANGEMENT DE COLONNE...
<
< FIN DU PROCESSUS :
<
         CPZ         INDK            < A-T'ON GENERE UNE IMAGE HAUTE-
                                     < DEFINITION SUR DKU ???
         JE          DIAP30          < NON...
         LAD         WDKUI
         SVC         0               < OUI, ON ECRIT LA DERNIERE PAGE...
DIAP30:  EQU         $
         LAI         AMCDAP-ZERO
         BSR         ACCI            < RETOUR A CDAP/CDAI...
         BR          ALOOP           < ET VERS LA BOUCLE D'INTERROGATION...
DIAP51:  EQU         $
         BR          ADIAP1
DIAP52:  EQU         $
         BR          ADIAP2
<
< ACCES A UNE IMAGE HAUTE-DEFINITION, VIA DKU :
<
DIAP2:   EQU         $
         JG          DIAP4           < CAS HD --> HD...
         LA          CDAX
         SLRS        IHD2=0
         JC          DIAPO5          < DANS LE CAS HD --> BD, ON IGNORE
                                     < LES X IMPAIRS,
         STA         XS              < XS=X/2...
         LA          CDAY
         SLRS        IHD2=0
         JC          DIAPO5          < AINSI QUE LES Y IMPAIRS...
         STA         YS              < YS=Y/2...
DIAP4:   EQU         $
         LR          X,A
         ANDI        LKBUF*LK/LPOINT/IHDNL-1
                                     < EST-CE UNE NOUVELLE PAGE ???
         JANE        DIAP3           < NON...
         CPZR        Y               < EST-CE UNE NOUVELLE COLONNE ???
         JNE         DIAP3           < NON...
<
< CHARGEMENT D'UNE NOUVELLE PAGE :
<
         PSR         A,X
         LR          X,A
         SLRS        LKBUF*LK/LPOINT/IHDNL=0
         SLLS        NSBUF=0
         STA         RDKUI+3
         LAD         RDKUI
         SVC         0               < CHARGEMENT DE LA NOUVELLE PAGE.
         PLR         A,X
<
< TRAITEMENT DU POINT (X,Y) :
<
DIAP3:   EQU         $
         MP          MIHDNL
         ADR         Y,B
XWOR%1:  VAL         LPOINT=0
XWOR%2:  VAL         NOCMO=0
         SLLD        XWOR%1+XWOR%2
         LR          B,X             < X=INDEX OCTET D'ACCES A LA PAGE...
         LBY         &ABUFI          < NIVEAU DE ROUGE BITS 1-8.
         PSR         A
         ADRI        1,X
         LBY         &ABUFI          < NIVEAU DE VERT BITS 1-8.
         PSR         A
         ADRI        1,X
         LBY         &ABUFI          < NIVEAU DE BLEU BITS 1-8.
         PSR         A
         ADRI        1,X
         LBY         &ABUFI
         SLRD        NBITMO+NBITOC-NCOOL < B=BITS 0 DES 3 NIVEAUX.
         PLR         A
         SLLS        NBITOC
         SCRD        BIT
         SLRS        NBITOC-BIT
         STA         CDANB           < NIVEAU DE BLEU.
         PLR         A
         SLLS        NBITOC
         SCRD        BIT
         SLRS        NBITOC-BIT
         STA         CDANV           < NIVEAU DE VERT.
         PLR         A
         SLLS        NBITOC
         SCRD        BIT
         SLRS        NBITOC-BIT
         STA         CDANR           < NIVEAU DE ROUGE.
         CPZ         VMODE           < MODE ???
         JG          SCDA1           < HD --> HD : VERS L'ENVOI AU PROCESSEUR
                                     < SPECIALISE HAUTE-DEFINITION...
<
< MODE HD --> BD :
<
         BSR         ASP2            < VERS L'APPAUVRISSEMENT ET L'ENVOI
         JMP         DIAPO5          < VERS LE POINT SUIVANT...
         PAGE
<
<
<        C U M U L   D E S   N I V E A U X  :
<
<
<        ARGUMENT :
<                    A=NIVEAU D'UN POINT SUR 3 BITS.
<
<
SP1:     EQU         $
         PSR         A,B,X
         LR          A,X             < X=NIVEAU DE GRIS DU POINT,
         LB          &AMC            < B=NIVEAUX DU REGISTRE (X).
         LAI         0
XWOR%1:  VAL         NNIV=0
         SLLD        XWOR%1+XWOR%1
         ADRI        -NNIV+1,A
         NGR         A,A
         AD          CDANB
         STA         CDANB           < NIVEAU DE BLEU...
         LAI         0
         SLLD        XWOR%1
         ADRI        -NNIV+1,A
         NGR         A,A
         AD          CDANV
         STA         CDANV           < NIVEAU DE VERT...
         LAI         0
         SLLD        XWOR%1
         ADRI        -NNIV+1,A
         NGR         A,A
         AD          CDANR
         STA         CDANR           < NIVEAU DE ROUGE...
         PLR         A,B,X
         RSR
         PAGE
<
<
<        C O M M A N D E   I N V E R S E   D E   ' V '  :
<
<
RECUP:   EQU         $
         LAD         RELMEM
         SVC         0               < RETOUR TEMPORAIRE A 4K...
<
< INITIALISATION DU PROCESSUS :
<
         LAI         CDA1
         STA         ACDA            < ON COMMENCE SUR LE PREMIER BLOC.
         BSR         AGCOUL          < RECUPERATION DE LA MEMOIRE DE COULEURS.
<
< RECUPERATION DU BLOC COURANT :
<
RECUP1:  EQU         $
         LAI         AMCDA-ZERO
         BSR         ACCI            < PASSAGE A LA CDA COMMUNE...
RECUP7:  EQU         $
         LA          ACDA
         ADRI        CDAVAL-CDA,A
GCDA:    EQU         $
         LRM         B,X
         WORD        CDAVAL
         WORD        1
         RCDA
         CPZ         CDAVAL
         JE          GCDA            < L'INFORMATION QUI SUIT N'EST
                                     < PAS ENCORE BONNE, ON ATTEND...
         STZ         CDAVAL
         LXI         1               < OK, INDIQUONS QU'ON EST EN TRAIN
                                     < DE PRENDRE EN COMPTE LE BLOC...
         WCDA
         ADRI        CDABLK-CDAVAL,A
         LRM         B,X             < ACCES AU BLOC DE DONNEES...
         WORD        CDABLK
         WORD        LBLOC
         RCDA
         ADRI        CDAACK-CDABLK,A
         STZ         CDAACK
         LRM         B,X             < SIGNAL D'ACQUITTEMENT DU BLOC...
         WORD        CDAACK
         WORD        1
         WCDA
         LA          ACDA
         LBI         CDA1
         CPI         CDA2
         JE          RECUP3
         LBI         CDA2
RECUP3:  EQU         $
         STB         ACDA            < BASCULEMENT CDA1/CDA2.
<
< TRAITEMENT DU BLOC COURANT :
<
         LA          CDAX
         SLRS        IHD2=0
         JC          RECUP7          < ON IGNORE LES X IMPAIRS...
         STA         XS              < OK, XS=X/2.
         LA          CDAY
         CP          MIHDNL          < EST-CE LA DERNIERE LIGNE ???
         JE          RECUP4          < OUI, ON L'IGNORE (IMPAIRE...)...
         SLRS        IHD2=0
         JC          RECUP7          < ON IGNORE LES Y IMPAIRS...
         STA         YS              < OK, YR=Y/2.
<
< TRAITEMENT DU POINT COURANT (XS,YS) :
<
         LAI         AMCDAP-ZERO
         BSR         ACCI            < RETOUR A CDAI/CDAP.
         BSR         ASP2            < DETERMINATION DU NIVEAU DU POINT,
                                     < ET SON ENVOI EN SCRATCH...
         JMP         RECUP1          < AU BLOC SUIVANT...
<
< FIN DU PROCESSUS :
<
RECUP4:  EQU         $
         LAI         AMCDAP-ZERO
         BSR         ACCI            < RETOUR A CDAI/CDAP.
         LAD         DEMMEM
         SVC         0               < ON PASSE A 16K...
         BR          ALOOP           < VERS LA BOUCLE D'INTERROGATION...
         PAGE
<
<
<        A P P A U V R I S S E M E N T   D E S   N I V E A U X   D E
<        G R I S   E T   T R A C E   D U   P O I N T   ( X S , Y S )  :
<
<
SP2:     EQU         $
XWOR%1:  VAL         NNIV=0
XWOR%2:  VAL         IHDNIV/NNIV=0
         LA          CDANR
         SLRS        XWOR%2
         ADRI        -NNIV+1,A
         NGR         A,A
         SLRD        XWOR%1
         LA          CDANV
         SLRS        XWOR%2
         ADRI        -NNIV+1,A
         NGR         A,A
         SLRD        XWOR%1
         LA          CDANB
         SLRS        XWOR%2
         ADRI        -NNIV+1,A
         NGR         A,A
         SLLD        XWOR%1+XWOR%1   < A=3 NIVEAUX ASSOCIES A (XS,YS) EN
                                     < FORMAT MEMOIRE DE COULEURS...
         LXI         0
RECUP5:  EQU         $
         CP          &AMC            < (A) EST-ELLE DANS LA MEMOIRE DES
                                     < COULEURS ???
         JE          RECUP6          < OUI...
         ADRI        1,X
         XR          A,X
         CPI         NIVMAX          < NON, ENTREE SUIVANTE...
         XR          A,X
         JLE         RECUP5          < OK, ELLE EXISTE...
         LXI         NIVMAX          < ELLE N'EXISTE PAS, CELA SIGNIFIE
                                     < QUE LA MEMOIRE DE COULEURS A CHANGE
                                     < ENTRE TEMPS...
RECUP6:  EQU         $
         LR          X,A             < A=NIVEAU SUR 3 BITS DE (XS,YS),
         BSR         ASPRPS          < QUE L'ON TRACE EN SCRATCH...
         RSR
         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
<
<
<        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.