PAGE
         PROG
         IDP         "SIMULATEUR BOS SUR CMS"
         IDP         "JOHN F. COLONNA"
         IDP         "03 NOVEMBRE 1981"
ZERO:    EQU         $
         DZS         '10             < INTERFACE AVEC 'CMS5'...
         WORD        DEBUT
         WORD        SIMUL           < POINT D'ENTREE...
DEBUT:   EQU         $
         LRP         L
         BR          -1,L            < ET ON RENTRE DANS LE PROGRAMME...
         PAGE
<
<
<        C O N S T A N T E S  :
<
<
ORDI:    VAL         "S"
K::      VAL         0
I::      VAL         1
EOT::    VAL         '04             < CODE DE LA FIN DE MESSAGE.
RCLF::   VAL         '6D
VAR::    VAL         " "             < CARACTERE VARIABLE DE "!ASSIGN".
EGAL::   VAL         "="
SAVE::   VAL         "S"             < POUR DESASSIGNER...
LCARTE:: VAL         80              < LONGUEUR D'UNE CARTE.
NOCMO::  VAL         2               < NOMBRE D'OCTETS PAR MOT.
NBITMO:: VAL         16              < NOMBRE DE BITS PAR MOT.
NBITOC:: VAL         NBITMO/NOCMO    < NOMBRE DE BITS PAR OCTET.
FCONV::  VAL         'FA00           < FONCTION DE CONVERSION BINAIRE-->ASCI.
FMASK::  VAL         'F500           < DEFINITION D'UNE INSTRUCTION,
FCINST:: VAL         'FB00           < EXECUTION D'UNE INSTRUCTION.
SBT:     SBT         0
COSBT::  VAL         '0000000@@@@    < INSTRUCTION 'SBT'...
         $EQU        SBT
FR::     VAL         '00             < FONCTION DE LECTURE SANS ECHO,
FRE::    VAL         '01             < FONCTION DE LECURE AVEC ECHO,
FW::     VAL         '02             < FONCTION D'ECRITURE.
XQ1::    VAL         '08             < POUR ACCES AU DISQUE EN Q=1...
FRQ3::   VAL         FR              < LECTURE DK EN Q=3,
FWQ3::   VAL         FW              < ECRITURE DK EN Q=3.
FRQ1::   VAL         FR?XQ1          < LECTURE DK EN Q=1,
FWQ1::   VAL         FW?XQ1          < ECRITURE DK EN Q=1.
XCAN::   VAL         '08             < POUR ATTEINDRE LE CANAL SUR 'GPI32',
FWCAN::  VAL         FW?XCAN         < ECRITURE EN MODE CANAL SUR 'GPI32'.
FINEX::  VAL         'FF             < FONCTION INEXISTANTE.
FREW::   VAL         '03             < REMBOBINAGE MT.
FTM::    VAL         '04             < ECRITURE TAPE-MARK MT.
FRAD::   VAL         '08             < LECTURE DIRECTE MT,
FWAD::   VAL         '0A             < ECRITURE DIRECTE MT.
FAD::    VAL         '05             < ACCES AU NUMERO DU BLOC COURANT.
NVPIMM:: VAL         '00             < POUR LES ACCES IMMEDIATS A CMS5...
NVPIN::  VAL         '01             < 'NVP' D'ENTREE,
NVPOUT:: VAL         '02             < 'NVP' DE SORTIE.
NVPASI:: VAL         '80             < POUR LES 'NVP' EN ASSIGNATIONS IMPLICITES
BOX::    VAL         3               < POUR RECUPERER DANS 'B' LA BOX D'UNE
                                     < DEMANDE A CMS5...
BINDEX:: VAL         0               < BIT D'INDEXATION...
BITPAR:: VAL         8               < BIT DE PARITE D'UN CARACTERE.
RC::     VAL         '0D             < RETOUR-CHARIOT...
MOCG::   VAL         'FF00           < OCTET GAUCHE,
MOCD::   VAL         '00FF           < ET OCTET DROIT.
MMOT::   VAL         MOCG?MOCD       < MASQUE D'UN MOT...
NSYS::   VAL         2               < NOMBRE DE SYSTEMES SIMULES.
LCDAG::  VAL         32              < LONGUEUR EN K DE LA "CDAG".
LK::     VAL         1024
YY7::    VAL         128             < LONGUEUR MOT D'UN SECTEUR.
Q::      VAL         3               < QUANTA DISQUE...
FONDLN:: VAL         '83             < DELETE NOM SGN,
FONSTN:: VAL         '84             < STORE NOM SGN,
FONLON:: VAL         '85             < LOAD NOM SGN,
FONNXP:: VAL         '88             < RECHERCHE DU SUIVANT PARALLELE D'UN NOM,
FONNXS:: VAL         '89             < ET DU SUIVANT SERIE.
<
< DEFINITION D'UNE IMAGE DE TELEVISION :
<
         EOT         #SIP IMAGE 256#
NCOOL::  VAL         3               < NOMBRE DE COMPOSANTES DE COULEUR.
FTVDKU:: VAL         '01             < FONCTION D'ACCES A LA TELEVISION...
         PAGE
<
<
<        F O R M A T   D E   L A   ' C D A G '  :
<
<
         DSEC
CDA:     EQU         $
VCDA:    WORD        0               < VERROU D'ACCES A LA 'CDAG' DESTINE
                                     < A BOS :
                                     < 0 : 'CDAG' LIBRE,
                                     < 1 : 'CDAG' OCCUPEE.
IOCB:    BYTE        0;0             < IOCB D'ECHANGE (FONCTION,PERIPHERIQUE).
MFIOCB:: VAL         MOCG            < FONCTION BOS,
MPIOCB:: VAL         MOCD            < PERIPHERIQUE BOS.
IOCB1::  MOT         $-IOCB
IOCB2::  MOT         IOCB1+I
IOCB3::  MOT         IOCB2+I
IOCB4::  MOT         IOCB3+I
IOCB5::  MOT         IOCB4+I
IOCB6::  MOT         IOCB5+I
LIOCB::  VAL         IOCB6           < LONGUEUR DU CORPS DE L'IOCB...
         DZS         LIOCB
LIOCB:   VAL         $-IOCB          < ??!?!?!
SCDA:    WORD        0               < MOT DE SYNCHRONISATION CMS--> BOS :
                                     < 0 : OPERATION EN COURS,
                                     < 1 : OPERATION ACHEVEE.
TCODAR:  EQU         $               < LISTE DES CODES D'ARRET UTILISES LORS
                                     < D'UN ECHANGE ; LA FIN DE LISTE EST
                                     < INDIQUEE PAR UN 'NULL'.
         $EQU        CDA+16          < ON SE PLACE A UNE FRONTIERE DE 16
                                     < MOTS PAR COMPATIBILITE AVEC LE
                                     < DRIVER REENTRANT DE 'BOS'...
LBUF::   VAL         4*1024
BUFCDA:  DZS         LBUF            < BUFFER D'ECHANGE BOS<-->CMS...
XVCDA::  MOT         VCDA-CDA        < POUR ATTEINDRE 'VCDA',
XSCDA::  MOT         SCDA-CDA        < 'SCDA',
XIOCB::  MOT         IOCB-CDA        < ET 'IOCB'...
         PAGE
<
<
<        F O N C T I O N S   B O S  :
<
<
FEND::   VAL         '47             < FONCTION DE FIN...
RWDU::   VAL         FEND            < REMBOBINAGE+LOCAL MT,
RWD::    VAL         '48             < REMBOBINAGE MT,
WEOF::   VAL         '49             < ECRITURE TAPE-MARK MT,
WGAP::   VAL         '4A             < EFFACEMENT MT,
BSRCD::  VAL         '4B             < SAUT ARRIERE 1 ENREGISTREMENT MT,
FSRCE::  VAL         '4C             < SAUT AVANT 1 ENREGISTREMENT MT,
BSFILE:: VAL         '4D             < SAUT ARRIERE TAPE-MARK MT,
FSFILE:: VAL         '4E             < SAUT AVANT TAPE-MARK MT,
BSRCDN:: VAL         '4F             < SAUT ARRIERE N ENREGISTREMENTS MT,
FSRCDN:: VAL         '50             < SAUT AVANT N ENREGISTREMENTS MT.
TRL::    VAL         '41             < PERFORATION AVANCE BANDE TTY,
FDP::    VAL         '43             < RECUPERATION DES DEFAUTS TTY,
OFF::    VAL         FEND            < MISE HORS-TENSION CR.
PGPH::   VAL         '40             < SAUT DE PARAGRAPHE LP,
PAGE::   VAL         '42             < SAUT DE PAGE LP.
ROU::    VAL         '50             < READ ONLY UNIT DK,
RWU::    VAL         '51             < READ AND WRITE UNIT DK,
MVHD::   VAL         '52             < MOUVEMENT DES TESTES DK.
FOUT::   VAL         '20             < SORTIE,
FIN::    VAL         '00             < ENTREE.
FINNUL:: VAL         '08             < ENTREE AVEC ELIMINATION DES NULLS (!?!?).
FOUTDK:: VAL         '30             < SORTIE SUR 'DKM',
FOUTDV:: VAL         '28             < SORTIE SANS VERIFICATION SUR 'DKM',
FINDK::  VAL         '10             < ENTREE SUR 'DKM'.
FCLOSE:: VAL         FEND            < CLOSE DE L'ASSIGNATION SUR CMS5...
FNSTN::  VAL         'A8             < DEFINITION DU NOM COURANT,
FNLON::  VAL         '88             < RECUPERATION DU NOM COURANT,
FNDLN::  VAL         FEND            < DESTRUCTION DU NOM COURANT.
FNNEXT:: VAL         '4C             < RECHERCHE DU NOM SUIVANT.
FVSTN::  VAL         'A0             < STORE VALEUR DANS LE SGN,
FVLON::  VAL         '80             < LOAD VALEUR DU SGN,
FVDLN::  VAL         '4A             < DELETE VALEUR DU SGN.
FVSTNI:: VAL         '60             < ENVOI DE L'IMAGE COURANTE DANS LE 'SGN',
FVLONI:: VAL         '40             < VISUALISATION DU NOM COURANT 'SGN'.
READIM:: VAL         '80             < LECTURE D'UN MORCEAU D'IMAGE,
READIN:: VAL         '90             < IDEM...
WRITIM:: VAL         'A0             < ECRITURE D'UN MORCEAU D'IMAGE.
WRITIN:: VAL         'B0             < IDEM...
FNOP::   VAL         '50             < FONCTION 'NOP'...
BCODAR:: VAL         1               < BIT D'ENTREE SUR CODE D'ARRET.
BFONSP:: VAL         0               < BIT 'FONCTION SPECIALE' (SI =0).
BIT5::   VAL         5
BIT6::   VAL         6
BIT7::   VAL         7
TYPRET:: VAL         'F8FF           < POUR ELIMINER LE TYPE DE RETOUR...
         PAGE
<
<
<        D E F I N I T I O N   D U   C O N T E X T E
<                    P E R I P H E R I Q U E  :
<
<
         DSEC
CONTEX:  EQU         $
NVP::    VAL         '03             < PREMIER NVP D'ASSIGNATION DISPONIBLE.
<
< SYSTEME D'ASSIGNATION :
<
ASSIGN:  ASCI        "!ASSIGN "
         BYTE        NVP=FCONV(MOCD;EGAL
ASSNOM:  ASCI        "XY"            < NOM DU PERIPHERIQUE,
ASSNUM:  BYTE        VAR;EOT         < ET SON NUMERO...
DESASS:  ASCI        "!ASSIGN "
         BYTE        NVP=FCONV(MOCD;EGAL;SAVE;EOT
IASS:    WORD        0               < IASS=0 : PERIPHERIQUE NON ASSIGNE,
                                     <     =1 : PERIPHERIQUE ASSIGNE.
<
< DEMANDE D'ECHANGE :
<
DEMPER:  BYTE        NVP;0           < DEMANDE (NVP,FONCTION).
MNVP::   VAL         MOCG            < MASQUE D'ACCES AU NVP.
MFON::   VAL         MOCD            < MASQUE D'ACCES A LA FONCTION.
DEM1::   MOT         $-DEMPER        < PREMIER ARGUMENT,
DEM2::   MOT         DEM1+I          < DEUXIEME ARGUMENT,
DEM3::   MOT         DEM2+I          < TROISIEME ARGUMENT.
LDEM::   VAL         DEM3            < LONGUEUR DU CORPS DE LA DEMANDE (MAX).
         DZS         LDEM
<
< CORRESPONDANCE BOS-->CMS :
<
FU1::    VAL         MOCG            < BORNE INFERIEURE,
FU2::    VAL         MOCD            < BORNE SUPERIEURE.
NFONC:   WORD        0               < NOMBRE DE FONCTIONS RECONNUES :
LFONC::  VAL         10              < NOMBRE MAX DE FONCTIONS RECONNUES,
EFONC::  VAL         2               < CHAQUE FONCTIONS EST DECRITE PAR 2 MOTS.
TFONC:   DZS         LFONC*EFONC     < LISTE DES CORRESPONDANCES...
MFBOS::  VAL         MOCG            < FONCTION BOS,
MFCMS::  VAL         MOCD            < FONCTION CMS ASSOCIEE.
TFONC1:: VAL         0               < FONCTION BOS, FONCTION CMS.
TFONC2:: VAL         TFONC1+I        < ADRESSE DU MODULE SPECIFIQUE ; ON TROUVE
                                     < DANS LE BIT D'INDEX UN INDICATEUR PERMET-
                                     < TANT DE SAVOIR SI LA FONCTION PEUT ETRE
                                     < EN RECOUVREMENT DE LA REPONSE A 'BOS'...
         PAGE
<
<
<        M E S S A G E S  :
<
<
         TABLE
M1:      BYTE        19;RCLF
         ASCI        "CDAG INACCESSIBLE!"
M2:      BYTE        19;RCLF
         ASCI        "ECHANGE TROP LONG !"
M3:      BYTE        29;RCLF
         ASCI        "ERREUR ALLOCATION MEMOIRE !"
M4:      BYTE        21;RCLF
         ASCI        "PERIPHERIQUE INCONNU!"
M6:      BYTE        23;RCLF
         ASCI        "FONCTION NON RECONNUE!"
M7:      BYTE        27;RCLF
         ASCI        "FONCTION NON IMPLEMENTEE !"
M8:      BYTE        21;RCLF
         ASCI        "SIMULATION BOS-->CMS"
M9:      BYTE        19;RCLF
         ASCI        "RESTART SIMULATION"
M10:     BYTE        21;RCLF
         ASCI        "!ASSIGN IMPOSSIBLE !"
M11:     BYTE        21;RCLF
         ASCI        "INITIALISATION CDA ?"
M19:     BYTE        13;RCLF
         ASCI        "DKU ENTIER ?"
M13:     BYTE        27;RCLF
         ASCI        "CMS/1 COUP/4 COUPS(0/1/4)?"
M14:     BYTE        15;RCLF
         ASCI        "RECOUVREMENT ?"
M15:     BYTE        19;RCLF
         ASCI        "DKU INACCESSIBLE !"
M16:     BYTE        11;RCLF
         ASCI        "DKU ERROR!"
M18:     BYTE        13;RCLF
         ASCI        "DK AD ERROR!"
M17:     BYTE        11;RCLF
         ASCI        "CCI ERROR!"
         PAGE
<
<
<        D E F I N I T I O N   D E S   C O N T E X T E S  :
<
<
         PROG
NVP0::   VAL         NVP-I           < PREMIER NVP INACCESSIBLE...
         PAGE
<
<
<        C O N T E X T E   V I S U  :
<
<
VIS:     EQU         $
NVPVIS:: VAL         NVP0+I          < NVP D'ASSIGNATION D'UNE VISU.
         ASCI        "!ASSIGN "
         BYTE        NVPVIS=FCONV(MOCD;EGAL;"V";"I";VAR;EOT
         ASCI        "!ASSIGN "
         BYTE        NVPVIS=FCONV(MOCD;EGAL;SAVE;EOT
         WORD        0               < 'IASS'.
         BYTE        NVPVIS;0
         WORD        BUF2;0;0
         WORD        NFTTY           < NOMBRE DE FONCTIONS TTY :
LFTTY:   EQU         $
         BYTE        FOUT;FW         < ECRITURE,
         WORD        SPVI1,X         < AVEC RECOUVREMENT...
         BYTE        FIN;FRE         < LECTURE.
         WORD        SPVI2
         BYTE        FDP;FINEX       < RECUPERATION DES DEFAUTS.
         WORD        SPVI3
         BYTE        TRL;FINEX       < PERFORATION AVANCE BANDE.
         WORD        SPVI4
         BYTE        FEND;FINEX      < PSEUDO-CLOSE...
         WORD        SPNOP
         BYTE        FNOP;FINEX      < NOP...
         WORD        SPNOP
XWOR%1:  VAL         $-LFTTY/EFONC
NFTTY:   EQU         ZERO+XWOR%1
         PAGE
<
<
<        C O N T E X T E   L E C T E U R   D E   C A R T E S  :
<
<
CR:      EQU         $
NVPCR::  VAL         NVPVIS+I        < NVP D'ASSIGNATION D'UN LECTEUR DE CARTES.
         ASCI        "!ASSIGN "
         BYTE        NVPCR=FCONV(MOCD;EGAL;"C";"R";VAR;EOT
         ASCI        "!ASSIGN "
         BYTE        NVPCR=FCONV(MOCD;EGAL;SAVE;EOT
         WORD        0               < 'IASS'.
         BYTE        NVPCR;0
         WORD        BUF2;0;0
         WORD        NFCR            < NOMBRE DE FONCTIONS CR :
LFCR:    EQU         $
         BYTE        OFF;FINEX       < MISE HORS-TENSION DU MOTEUR.
         WORD        SPCR1
         BYTE        FIN;FR          < LECTURE.
         WORD        SPCR2
         BYTE        FNOP;FINEX      < 'NOP'...
         WORD        SPNOP
XWOR%1:  VAL         $-LFCR/EFONC
NFCR:    EQU         ZERO+XWOR%1
         PAGE
<
<
<        C O N T E X T E   I M P R I M A N T E  :
<
<
LP:      EQU         $
NVPLP::  VAL         NVPCR+I         < NVP D'ASSIGNATION D'UNE IMPRIMANTE.
         ASCI        "!ASSIGN "
         BYTE        NVPLP=FCONV(MOCD;EGAL;"L";"P";VAR;EOT
         ASCI        "!ASSIGN "
         BYTE        NVPLP=FCONV(MOCD;EGAL;SAVE;EOT
         WORD        0               < 'IASS'.
         BYTE        NVPLP;0
         WORD        BUF2;0;0
         WORD        NFLP            < NOMBRE DE FONCTIONS RECONNUES :
LFLP:    EQU         $
         BYTE        PGPH;FINEX      < SAUT DE PARAGRAPHE.
         WORD        SPLP1
         BYTE        PAGE;FINEX      < SAUT DE PAGE.
         WORD        SPLP2
         BYTE        FOUT;FW         < ECRITURE,
         WORD        SPLP3
         BYTE        FCLOSE;FINEX    < CLOSE DE L'ASSIGNATION.
         WORD        SPLP4
XWOR%1:  VAL         $-LFLP/EFONC
NFLP:    EQU         ZERO+XWOR%1
         PAGE
<
<
<        C O N T E X T E   B A N D E S   M A G N E T I Q U E S  :
<
<
MT:      EQU         $
NVPMT::  VAL         NVPLP+I         < NVP D'ASSIGNATION DU DEROULEUR DE
                                     < BANDES MAGNETIQUES.
         ASCI        "!ASSIGN "
         BYTE        NVPMT=FCONV(MOCD;EGAL;"M";"T";VAR;EOT
         ASCI        "!ASSIGN "
         BYTE        NVPMT=FCONV(MOCD;EGAL;SAVE;EOT
         WORD        0               < 'IASS'.
         BYTE        NVPMT;0
         WORD        BUF2;0;0
         WORD        NFMT            < NOMBRE DE FONCTIONS RECONNUES.
LFMT:    EQU         $
         BYTE        RWDU;FREW       < REBOBINAGE ET LOCAL.
         WORD        SPMT1
         BYTE        RWD;FREW        < REBOBINAGE.
         WORD        SPMT2
         BYTE        WEOF;FTM        < ECRITURE D'UN TAPE-MARK
         WORD        SPMT3
         BYTE        WGAP;FINEX      < EFFACEMENT.
         WORD        SPMT4
         BYTE        BSRCD;FINEX     < SAUT ARRIERE 1 ENREGISTREMENT.
         WORD        SPMT5
         BYTE        FSRCE;FINEX     < SAUT AVANT 1 ENREGISTREMENT.
         WORD        SPMT6
         BYTE        BSFILE;FINEX    < SAUT ARRIERE TAPE-MARK.
         WORD        SPMT7
         BYTE        FSFILE;FR       < SAUT AVANT TAPE-MARK.
         WORD        SPMTC
         BYTE        BSRCDN;FINEX    < SAUT ARRIERE N ENREGISTREMENTS.
         WORD        SPMT9
         BYTE        FSRCDN;FINEX    < SAUT AVANT N ENREGISTREMENTS.
         WORD        SPMTA
         BYTE        FOUT;FWAD       < ECRITURE 1 ENREGISTREMENT,
         WORD        SPMTB
         BYTE        FIN;FRAD        < LECTURE 1 ENREGISTREMENT.
         WORD        SPMTC
         BYTE        FINNUL;FRAD     < IDEM A 'FIN' (!?!?!).
         WORD        SPMTC
XWOR%1:  VAL         $-LFMT/EFONC
NFMT:    EQU         ZERO+XWOR%1
         PAGE
<
<
<        C O N T E X T E   D I S Q U E   A M O V I B L E  :
<
<
DKU:     EQU         $
NVPDK::  VAL         NVPMT+I         < NVP D'ASSIGNATION DU DISQUE AMOVIBLE.
NVPDKU:: VAL         NVPASI?'0A      < ON TRICHE AFIN QUE LE DISQUE AMOVIBLE
                                     < SOIT PARTAGEABLE...
         ASCI        "!ASSIGN "
         BYTE        NVPDKU=FCONV(MOCD;EGAL;"D";"K";VAR;EOT
         ASCI        "!ASSIGN "
         BYTE        NVPDKU=FCONV(MOCD;EGAL;SAVE;EOT
         WORD        0               < 'IASS'.
         BYTE        NVPDKU;0
         WORD        BUF2;0;0
         WORD        NFDK            < NOMBRE DE FONCTIONS RECONNUES.
LFDK:    EQU         $
         BYTE        ROU;FINEX       < READ ONLY UNIT.
         WORD        SPDK1
         BYTE        RWU;FINEX       < READ AND WRITE.
         WORD        SPDK2
         BYTE        MVHD;FINEX      < MOUVEMENT DE LA TETE.
         WORD        SPDK3
         BYTE        FOUT;FWQ1       < ECRITURE,
         WORD        SPDK4
         BYTE        FIN;FRQ1        < LECTURE.
         WORD        SPDK5
         BYTE        FOUTDK;FWQ1     < ECRITURE,
         WORD        SPDK4
         BYTE        FOUTDV;FWQ1     < ECRITURE,
         WORD        SPDK4
         BYTE        FINDK;FRQ1      < LECTURE.
         WORD        SPDK5
XWOR%1:  VAL         $-LFDK/EFONC
NFDK:    EQU         ZERO+XWOR%1
         PAGE
<
<
<        C O N T E X T E   G P I 3 2  :
<
<
GPI:     EQU         $
NVPGPI:: VAL         NVPDK+I         < NVP D'ASSIGNATION D'UN GPI32.
         ASCI        "!ASSIGN "
         BYTE        NVPGPI=FCONV(MOCD;EGAL;"C";"U";VAR;EOT
         ASCI        "!ASSIGN "
         BYTE        NVPGPI=FCONV(MOCD;EGAL;SAVE;EOT
         WORD        0               < 'IASS'.
         BYTE        NVPGPI;0
         WORD        BUF2;0;0
         WORD        NFGPI           < NOMBRE DE FONCTIONS GPI :
LFGPI:   EQU         $
         BYTE        FOUT;FWCAN      < ECRITURE EN MODE CANAL,
         WORD        SPCU1
         BYTE        FCLOSE;FINEX    < CLOSE DE L'ASSIGNATION.
         WORD        SPCU2
XWOR%1:  VAL         $-LFGPI/EFONC
NFGPI:   EQU         ZERO+XWOR%1
         PAGE
<
<
<        F I N   D E S   C O N T E X T E S  :
<
<
NVPF::   VAL         NVPGPI+I        < PREMIER 'NVP' INEXISTANT...
         PAGE
<
<
<        P S E U D O - C O N T E X T E   I M A G E  :
<
<
CIMAGE:  EQU         $
         ASCI        "!ASSIGN N=IMAD"
         ASCI        "!ASSIGN N=SD"  < 2 FAUSSES CARTES "!ASSIGN"...
         WORD        0
         BYTE        NVPDKU;FTVDKU   < DEMANDE D'ACCES AUX IMAGES.
         WORD        BUF2;0;0
         WORD        NFIMAG
LFIMAG:  EQU         $               < LISTE DES FONCTIONS RECONNUES :
XIN::    VAL         '40             < MODE : 'TVMEM' --> PROGRAMME,
XOUT::   VAL         '00             < MODE : PROGRAMME --> 'TVMEM'.
XPR::    VAL         1               < PROCESSEUR ROUGE,
XPV::    VAL         2               < PROCESSEUR VERT,
XPB::    VAL         3               < PROCESSEUR BLEU.
         BYTE        READIM;FTVDKU   < TRANSFERT : 'TVMEM' --> 'BOS'.
         WORD        SPIM1
         BYTE        READIN;FTVDKU   < IDEM...
         WORD        SPIM1
         BYTE        WRITIM;FTVDKU   < TRANSFERT : 'BOS' --> 'TVMEM'.
         WORD        SPIM2
         BYTE        WRITIN;FTVDKU   < IDEM...
         WORD        SPIM2
         BYTE        FEND;FINEX      < FONCTION DE CLOSE...
         WORD        SPNOP
XWOR%1:  VAL         $-LFIMAG/EFONC
NFIMAG:  EQU         ZERO+XWOR%1     < NOMBRE DE FONCTIONS IMAGES RECONNUES.
         PAGE
<
<
<        P S E U D O - C O N T E X T E   ' S G N '  :
<
<
CSGN:    EQU         $
         ASCI        "!ASSIGN N=SGND"
         ASCI        "!ASSIGN N=SD"  < 2 FAUSSES CARTES "!ASSIGN"...
         WORD        0
FONSGN:: VAL         '02             < FONCTION GENERALE 'SGN'...
         BYTE        0;FONSGN        < POUR LE 'SGN', C'EST LE 'NVP', ET NON
                                     < PAS LA FONCTION QUI EST VARIABLE...
         WORD        BUF2;0;0
         WORD        NFSGN
LFSGN:   EQU         $               < LISTE DES FONCTIONS 'SGN' :
         BYTE        FVSTN;FONSTN    < STORE VALEUR 'SGN',
         WORD        SPSGN1
         BYTE        FVLON;FONLON    < LOAD VALEUR 'SGN',
         WORD        SPSGN2
         BYTE        FVDLN;FONDLN    < DELETE VALEUR 'SGN',
         WORD        SPSGN3
         BYTE        FVSTNI;FONSTN   < STORE 'SGN' DE L'IMAGE COURANTE,
         WORD        SPSGN8
         BYTE        FVLONI;FONLON   < VISUALISATION DE LA VALEUR 'SGN' COURANTE
         WORD        SPSGN9
         BYTE        FNSTN;FONSTN    < DEFINITION DU NOM COURANT,
         WORD        SPSGN4
         BYTE        FNLON;FONLON    < RECUPERATION DU NOM COURANT,
         WORD        SPSGN5
         BYTE        FNDLN;FONDLN    < DESTRUCTION DU NOM COURANT.
         WORD        SPSGN6
         BYTE        FNNEXT;FONNXP?FONNXS
         WORD        SPSGN7          < RECHERCHE DU NOM SUIVANT.
XWOR%1:  VAL         $-LFSGN/EFONC
NFSGN:   EQU         ZERO+XWOR%1     < NOMBRE DE FONCTIONS 'SGN' RECONNUES.
         PAGE
<
<
<        L I S T E   D E S   C O R R E S P O N D A N C E S
<                    F U   -->   C M S 5  :
<
<
LFUCON:  EQU         $
FUINEX:: VAL         0               < INDICATEUR D'INEXISTENCE...
FUNUTI:: VAL         -1              < INDICATEUR D'IMPOSSIBILITE D'UTILISATION.
         WORD        FUINEX          < 00
         WORD        VIS             < 01
         WORD        VIS             < 02
         WORD        VIS             < 03
         WORD        VIS             < 04
         WORD        FUINEX          < 05
         WORD        FUINEX          < 06
         WORD        CR              < 07
         WORD        LP              < 08
         WORD        MT              < 09
         WORD        FUINEX          < 0A
         WORD        FUINEX          < 0B
         WORD        FUINEX          < 0C
         WORD        DKU             < 0D
         WORD        DKU             < 0E
         WORD        DKU             < 0F
         WORD        DKU             < 10
         WORD        DKU             < 11
         WORD        DKU             < 12
         WORD        DKU             < 13
         WORD        DKU             < 14
         WORD        CIMAGE          < 15
         WORD        GPI             < 16
         WORD        CSGN            < 17
         WORD        FUINEX          < 18
         WORD        FUINEX          < 19
         WORD        FUINEX          < 1A
         WORD        FUINEX          < 1B
         WORD        FUINEX          < 1C
AFUCOM:  WORD        VIS             < 1D
AFUGR:   WORD        VIS             < 1E
AFUTV:   WORD        VIS             < 1F
         WORD        FUNUTI          < 20
         WORD        FUNUTI          < 21
         WORD        FUNUTI          < 22
         WORD        FUNUTI          < 23
         WORD        DKU             < 24
         WORD        DKU             < 25
         WORD        DKU             < 26
         WORD        DKU             < 27
         WORD        DKU             < 28
         WORD        DKU             < 29
         WORD        DKU             < 2A
         WORD        DKU             < 2B
         WORD        DKU             < 2C
         WORD        DKU             < 2D
         WORD        DKU             < 2E
         WORD        DKU             < 2F
         WORD        DKU             < 30
         WORD        DKU             < 31
         WORD        DKU             < 32
         WORD        DKU             < 33
         WORD        DKU             < 34
         WORD        DKU             < 35
         WORD        DKU             < 36
         WORD        DKU             < 37
         WORD        DKU             < 38
         WORD        DKU             < 39
XNFU::   VAL         $-LFUCON        < PREMIERE 'FU' INEXISTANTE...
FUGR::   VAL         AFUGR-LFUCON    < 'FU' SPECIALE GRAPHIQUE VISU,
FUTV::   VAL         AFUTV-LFUCON    < 'FU' SPECIALE GRAPHIQUE TV.
FUCOM::  VAL         AFUCOM-LFUCON   < 'FU' SPECIALE ENVOI CARTES CMS5 "!...".
         PAGE
<
<
<        F O R M A T   D E S   A R G U M E N T S   G R A P H I Q U E S  :
<
<
         DSEC
<
< SORTIE GRAPHIQUE SUR VISU :
<
GVIS:    EQU         $
VALG::   VAL         'FFFF           < DONNEE D'ENCADREMENT DES ORDRES GRAPHI-
                                     < QUES POUR LES DISTINGUER DE L'ALPHA...
VALRAZ:: VAL         'FFFE           < ET CELLE-LA PROVOQUE L'EFFACEMENT DE
                                     < L'ECRAN DE LA VISU OU DE LA TV EN FIN
                                     < DE BUFFER...
VISV1:   WORD        VALG            < VALIDATION 1.
VISSEG:: VAL         $-GVIS          < DEBUT DE LA ZONE A TRANSMETTRE A CMS5.
VISY1:   WORD        0               < Y1 (VECTEUR ARGUMENT),
VISX1:   WORD        0               < X1,
VISY2:   WORD        0               < Y2,
VISX2:   WORD        0               < X2.
LVSEG::  VAL         $-GVIS-VISSEG*NOCMO
                                     < LONGUEUR DE LA ZONE A TRANSMETTRE A CMS5.
VISV2:   WORD        VALG            < VALIDATION 2.
LGVIS::  VAL         $-GVIS*NOCMO
<
< SORTIE GRAPHIQUE SUR TV :
<
         DSEC
GTV:     EQU         $
TVSEG::  VAL         $-GTV           < DEBUT DE LA ZONE A TRANSMETTRE A CMS5.
TVLCO:   WORD        0               < MOT D'INHIBITION DES COULEURS (ET POUR
                                     < LE BLOC FLOTTANT EN TEMPORAIRE...)
TVCOM:   WORD        0               < MOT DE COMMANDE (MODE ET COULEURS).
TVY1:    WORD        0               < Y1 (VECTEUR RESULTAT),
TVX1:    WORD        0               < X1,
TVY2:    WORD        0               < Y2,
TVX2:    WORD        0               < X2.
TVGY1:   WORD        0               < Y1 (VECTEUR ARGUMENT),
TVGX1:   WORD        0               < X1,
TVGY2:   WORD        0               < Y2,
TVGX2:   WORD        0               < X2.
LVTV::   VAL         $-GTV-TVSEG*NOCMO
                                     < LONGUEUR DE LA ZONE A TRANSMETTRE A CMS5.
TVV2:    WORD        VALG            < VALIDATION 2.
LGTV::   VAL         $-GTV*NOCMO
         PROG
         PAGE
<
<
<        L O C A L  :
<
<
         LOCAL
LOC:     EQU         $
<
< CONSTANTES :
<
KIN:     WORD        -1              < COMPTAGE DES ENTREES...
XT800::  VAL         '0800           < 1K,
XT1000:: VAL         '1000           < 2K,
XT0::    VAL         XT1000          < INITIALISATION...
T0:      WORD        XT0             < REINITIALISATION...
T800:    WORD        XT800           < 1K MOTS,
T1000:   WORD        XT1000          < 2K MOTS.
ETAT:    WORD        0               < CONDITIONS DE RETOUR DES MODULES
                                     < SPECIFIQUES.
ETATSV:  WORD        0               < CODE D RETOUR DES 'SVC'.
TRCDA:   WORD        0               < CONSTANTE DE TRANSLATION DE L'ADRESSE
                                     < DE DEBUT DE LA 'CDA'...
BTRANS:  WORD        0               < POUR TRANSLATER L'ADRESSE DE 'BUF'
                                     < A CAUSE DES VALEURS 'SGN' QUI SONT
                                     < PRECEDEES D'UN NOM...
RECOUV:  WORD        0               < 0 : PAS DE RECOUVREMENT AVEC 'BOS',
                                     < 1 : RECOUVREMENT (AVANT SYNCHRO 'BOS'),
                                     < -1: RECOUVREMENT (APRES SYNCHRO 'BOS').
RECOUW:  WORD        0               < POUR INITIALISER 'RECOUV' EN FONCTION
                                     < DE LA REPONSE AU MESSAGE 'M14'...
FUCOUR:  WORD        0               < NUMERO DE LA 'FU' COURANTE.
<
< CARTES CONTROLES AU 'CCI' :
<
ASSVIO:  ASCI        "!ASSIGN "
         BYTE        NVPVIS=FCONV(MOCD;EGAL;"O";EOT
CLOSE:   ASCI        "!CLOSE"
         BYTE        EOT;0
CDAC:    ASCI        "!CDA"
         BYTE        EOT;0
CDAG:    ASCI        "!CDA"
         BYTE        "G";EOT
L0:      ASCI        "!L"
         BYTE        "0";EOT
L1:      ASCI        "!L"
         BYTE        "1";EOT
QC000:   ASCI        "!QFF"
CQC000:  ASCI        "C0"
AQC000:  ASCI        "+0"
         BYTE        EOT;0
XQC0:    WORD        "C0"            < POUR AVOIR LES 2/3 DE DKU,
XQFE:    WORD        "FE"            < ET POUR PRESQUE TOUT DKU...
<
< MESSAGES DIVERS :
<
RETURN:: VAL         '0D             < CARRIAGE-RETURN.
LF:      BYTE        '0C;RETURN
LLF::    VAL         $-LF*NOCMO
VT:      BYTE        '0B;RETURN
LVT::    VAL         $-VT*NOCMO
MNOM:    BYTE        3;RCLF
MNOMX:   ASCI        "XY"
BUFIN:   DZS         1               < BUFFER D'ENTREE DES COMMANDES.
<
< RELAIS DE SOUS-PROGRAMMES :
<
APRINT:  WORD        PRINT           < EDITION D'UN MESSAGE.
ACCI:    WORD        CCI             < ACCES AU CCI INTERPRETATIF.
AEXEC:   WORD        EXEC            < EXECUTION D'UN 'SVC'.
ASERV:   WORD        SERV            < ENVOI D'UN SERVICE SIMPLE...
ASPFON:  WORD        SPFON           < PLACEMENT DUNE FONCTION DANS UNE DEMANDE.
ASPMET:  WORD        SPMEMT          < ALLOCATION MEMOIRE SEULE...
ASPMEM:  WORD        SPMEM           < ALLOCATION ET AJUSTEMENT MEMOIRE ET
                                     < REMISE A "SPACE" DU BUFFER...
ASPME0:  WORD        SPMEM0          < MINIMISATION A 1K MOTS DE L'ESPACE...
ARCDA:   WORD        RCDA            < MOUVEMENT CDA-->BUFFER,
AWCDA:   WORD        WCDA            < MOUVEMENT BUFFER-->CDA.
ASP:     WORD        0               < ADRESSE DU MODULE SPECIFIQUE COURANT...
AGBOX:   WORD        GBOX            < RECUPERATION DE LA 'BOX' D'UNE DEMANDE.
APCLOS:  WORD        PCLOSE          < FERMETURE D'UNE ASSIGNATION.
AWRITR:  WORD        WRITER          < ECRITURE QUELCONQUE...
ATESMT:  WORD        TESTMT          < RELAI VERS LA MISE A JOUR DE L'ADRESSE
                                     < COURANTE POUR 'MT'...
AREAD:   WORD        READ            < LECTURE QUELCONQUE...
AREADP:  WORD        READP           < LECTURE QUELCONQUE AVEC CALCUL DE LA
                                     < PARITE DES CARACTERES.
AREADF:  WORD        READF           < LECTURE DE CARACTERES AVEC TEST DE FIN
                                     < SUR BUFFER PLEIN DE "SPACE", ET REGE-
                                     < NERATION DE LA PARITE...
AREADO:  WORD        READO           < LECTURE AVEC ECLATEMENT (GPI32-BENSON).
ACODAR:  WORD        CODAR           < GESTION DES ENTREES SUR CODE D'ARRET.
ATRANS:  WORD        TRANS           < TRANSLATION DE L'ADRESSE DE DEBUT DE 'CDA
SENBOS:  WORD        SIMUM1          < POUR ENVOI 1 COUP/4 COUPS A 'BOS'...
ASIMUB:  WORD        SIMULB          < RELAI...
<
< DEMANDES A CMS5 :
<
DEMCDA:  WORD        '0005           < DEMANDE DE SYNCHRONISATION SUR
         WORD        0               < LES
         WORD        0               < VALEURS POSITIVES DE 'VCDA'.
DEMIN:   BYTE        NVPIN;FRE       < ENTREE D'UN CARACTERE...
         WORD        BUFIN-ZERO*NOCMO
         WORD        1
DEMOUT:  BYTE        NVPOUT;FW       < EDITION D'UN MESSAGE VARIABLE...
         WORD        0;0
DEMCCI:  BYTE        NVPIMM;'01      < ACCES AU CCI.
DEMAS:   BYTE        NVPIMM;'02      < ENVOI D'UNE CARTE CONTROLE.
         WORD        0
         WORD        LCARTE
DEMMEM:  BYTE        NVPIMM;'04      < AJUSTEMENT DE LA TAILLE MEMOIRE.
         WORD        0
         WORD        XT0             < INITIALISATION...
DEMTEM:  BYTE        NVPIMM;'05      < TEMPORISATION...
         WORD        0
         WORD        1               < DE 1 SECONDE...
DEMLF:   BYTE        NVPLP;FW        < POUR FAIRE UN SAUT DE PAGE.
         WORD        LF-ZERO*NOCMO
         WORD        LLF
DEMVT:   BYTE        NVPLP;FW        < POUR FAIRE UN SAUT DE PARAGRAPHE.
         WORD        VT-ZERO*NOCMO
         WORD        LVT
OG:      BYTE        NVPVIS;'03      < MISE EN GRAPHIQUE DE LA VISU,
CG:      BYTE        NVPVIS;'04      < RETOUR EN ALPHA-NUMERIQUE,
ERASE:   BYTE        NVPVIS;'05      < EFFACEMENT DE L'ECRAN,
WG:      BYTE        NVPVIS;'0A      < ECRITURE GRAPHIQUE D'UN SEGMENT.
         WORD        BUFVIS
         WORD        LVSEG
ABUFVI:  WORD        BUFVIS          < POUR REINITIALISER WG+DEM1...
WGTV:    BYTE        NVPDKU;FTVDKU   < ECRITURE TV D'UN SEGMENT.
         WORD        BUFTV
         WORD        LVTV
         WORD        K
SGN:     BYTE        '86;FW          < POUR LES ACCES AU SGN.
         WORD        NOM2
         WORD        LIMAG*NCOOL+LNOM*NOCMO
         WORD        LNOM*NOCMO
DEMTV:   BYTE        NVPDKU;FTVDKU   < DEMANDE D'ENVOI D'UNE IMAGE DE 'TV'
                                     < EN MODE ENTRELACE.
         WORD        IMAGE2
ALIMA3:  WORD        LIMAG*NOCMO*NCOOL
         WORD        0
<
< RELAIS DE TABLES :
<
LXCDA::  VAL         BUFCDA-CDA      < LONGUEUR DE L'EN-TETE DE 'CDA'.
XCDA:    DZS         LXCDA           < DUPLICATION DE L'EN-TETE DE 'CDA'.
AXCDA:   WORD        XCDA
XWOR%1:  VAL         TCODAR-CDA
ATCODA:  WORD        XCDA+XWOR%1,X   < RELAI D'ACCES A LA LISTE DES CODES
                                     < D'ARRET.
ABUF:    WORD        BUF             < ADRESSE MOT DU BUFFER,
ABUF2:   WORD        BUF2            < ET SON ADRESSE OCTET.
ABUFX:   WORD        BUF,X           < RELAI INDEXE VERS LE BUFFER.
ABUFX1:  WORD        BUF-I,X         < IDEM POUR 'JDX'...
ALFUCO:  WORD        LFUCON,X        < ACCES AUX ASSOCIATIONS 'FU' DE BOS -->
                                     < CONTEXTES DE CMS5...
ALCON:   WORD        LCON,X          < LISTE DES CONTEXTES :
LCON:    EQU         $-I
         WORD        VIS
         WORD        CR
         WORD        LP
         WORD        MT
         WORD        DKU
         WORD        GPI
<
< ENVOI DE COMMANDES PRE-PROGRAMMEES :
<
XLIM::   VAL         2+1             < INDEX DU LIMITEUR JOUANT LE ROLE DU
                                     < CARACTERE "EOT",
                                     < 2 : POUR <R/C><LF>,
                                     < 1 : POUR LE 'SPACE' SUIVANT.
XPE::    VAL         XLIM+I          < INDEX DU "!" DU 'CCI',
KPE::    VAL         "!"             < CARACTERE DU 'CCI'.
XM::     VAL         XPE+I           < INDEX DU "M" DE "!M" DU 'CCI'.
KM::     VAL         "M"
LIMIT:   WORD        0               < CARACTERE JOUANT LE ROLE DE "EOT".
CCINT:   WORD        '0002           < FONCTION D'ENVOI PAR 'BOS' D'UNE COMMAN-
                                     < DE PRE-PROGRAMMEE "!M...".
         WORD        BUF2+XPE
         WORD        LCARTE
<
< POUR L'EXTENSION D'ADRESSAGE 'DKU' :
<
BLKC:    WORD        0               < NUMERO DU GROUPE DE '10000 SECTEURS ;
                                     < CE NUMERO NE PEUT VALOIR QUE 0 OU 1,
                                     < CAR ON ATTRIBUE 250 (='FA) CYLINDRES
                                     < CE QUI FAIT 10 GROUPES (DE 25) :
                                     < 'FA*20*24='1D4C0 SECTEURS<'20000...
<
< DONNEES D'INITIALISATION DU GRAPHWARE :
<
IBUF::   VAL         'FFFF           < DONNEE ATTENDUE 'LGRAPH' FOIS DANS LE
                                     < BUFFER POUR SIGNIFIER UNE DEMANDE
                                     < D'INITIALISATION...
IGRAPH:  WORD        'BFFF;'BF1F;'BFFF;'BF17
LGRAPH:: VAL         $-IGRAPH        < NOMBRE DE DONNEES D'INITIALISATION...
<
< DONNEES DE NETTOYAGE DE L'ECRAN TV :
<
NOIR:    ASCI        "M-NOIR"
         BYTE        EOT;0
LNOIR::  VAL         $-NOIR
<
< DONNEES D'ENTREE GRAPHIQUE :
<
CU:      BYTE        NVPVIS;'06      < PUIS ACTIVATION DU CURSEUR,
         WORD        0               < ET VOILA, CELA MARCHE MIEUX AVEC CE
                                     < 'WORD 0' ; MAIS CE BUG AURA PERMIS DE
                                     < PLANTER LE SYSTEME... ET DE TROUVER
                                     < AINSI CERTAINEMENT LA PLUS ANCIENNE
                                     < ERREUR SYSTEME !!!
LCU::    VAL         '09             < FONCTION DE LECTURE GRAPHIQUE.
<
< DEFINITION DU NOM 'SGN' COURANT :
<
LSGN::   VAL         38              < NOMBRE D'OCTETS MAX AUTORISES...
NOMSGN:  EQU         $
         BYTE        EOT;0           < DEPART SUR LE NOM VIDE...
         DZS         LSGN/NOCMO-1    < NOM 'SGN' COURANT, QUE L'ON PEUT CREER
                                     < DETRUIRE OU LIRE PAR LES FONCTIONS
                                     < DU TYPE 'FN...'.
         BYTE        EOT;0           < FIN DE NOM A PRIORI...
DELTA::  VAL         $-NOMSGN        < DISTANCE NOM-VALEUR...
RAZNOM:  WORD        NOMSGN          < POUR DETRUIRE LE NOM...
ANOMS1:  WORD        NOMSGN-I,X      < RELAI POUR 'JDX',
ANOMS0:  WORD        NOMSGN,X        < ET POUR UN ACCES EN OCTETS...
ASGN1:   WORD        SGN1            < S/P DE PERMUTATION DE LA FONCTION ET
                                     < DU 'NVP' DU 'SGN', CAR EN EFFET LE
                                     < PSEUDO-CONTEXTE DU 'SGN' DONNE DES 'NVP'
                                     < ET NOM PAS DES FONCTIONS...
ASGN2:   WORD        SGN2            < MOUVEMENT : BUFFER --> NOM,
ASGN3:   WORD        SGN3            < MOUVEMENT : BUFFER <-- NOM.
ASGN4:   WORD        SGN4            < ENVOI DE 'NXP'/'NXS' AU SGN...
ASGN5:   WORD        SGN5            < MISE A JOUR DE 'DEM2', PUIS 'GBOX'...
ASPIM1:  WORD        SPIM1           < TRANSFERT : 'MEMTV' --> 'CDA',
ASPIM2:  WORD        SPIMS           < TRANSFERT : 'CDA' --> 'MEMTV'.
APSGN1:  WORD        SPSGN1          < STORE VALEUR 'SGN',
APSGN2:  WORD        SPSGN2          < LOAD VALEUR 'SGN'.
XRAC:    WORD        0               < MEMORISATION DE L'INDEX INITIAL.
SXRAC:   WORD        0               < SAVE LE (X) INITIAL.
LMAX:    WORD        LSGN+1          < NOMBRE MAX DE CARACTERES A EXPLORER.
                                     < (+1 A CAUSE DE 'EOT')
<
< TRANSFERTS : 'BOS' <--> 'TVMEM' :
<
ALIMAG:  WORD        LIMAG*NOCMO     < LONGUEUR D'UNE COMPOSANTE.
AIMA1:   WORD        IMA1            < TRANSFERT GLOBAL : 'TVMEM' --> PROGRAMME.
AIMA2:   WORD        IMA2            < MISE A JOUR DE 'DEMPER' ET ENVOI...
AIMA3:   WORD        IMA3            < VALIDATION DE (IOCB2) ET (IOCB5).
<
< PILE :
<
STACK:   EQU         $-1
         DZS         40
         PROG
         USE         W,CONTEX
         PAGE
<
<
<        A C C E S   C C I   I N T E R P R E T A T I F  :
<
<
<        ARGUMENT :
<                    A=ADRESSE D'UNE CARTE A INTERPRETER.
<
<
CCI:     EQU         $
         PSR         A,X
         SLLS        NOCMO=K
         STA         DEMAS+DEM1      < MISE EN PLCE DE L'ADRESSE OCTET,
         LAD         DEMAS
         SVC         0               < ET ENVOI DE LA CARTE...
         PLR         A,X
         RSR                         < ON PEUT TESTER 'JE'/'JNE' AU RETOUR...
         PAGE
<
<
<        E X E C U T I O N   D ' U N   ' S V C '  :
<
<
<        ARGUMENT :
<                    A=ADRESSE DE LA DEMANDE A CMS5.
<                    W=ADRESSE DU CONTEXTE COURANT.
<
<
EXEC:    EQU         $
         PSR         A,X
<
< SERVICE PROPREMENT DIT :
<
         SVC         0               < EXECUTION DE LA DEMANDE,
         STX         ETATSV          < MEMORISATION DES CONDITIONS DE RETOUR...
<
< ASSIGNATION IMPLICITE EVENTUELLE :
<
         LR          X,A
         CPI         '81             < LE CODE D'ERREUR (EVENTUELLEMENT NUL)
                                     < EST-IL CELUI DU 'NVP' NON ASSIGNE ???
         JNE         EXEC1           < NON, ON SORT...
         LAD         ASSIGN          < OUI,
         BSR         ACCI            < ON TENTE UN "!ASSIGN..." IMPLICITE...
         JNE         EXEC1           < ON SORT, CAR IL EST REFUSE...
         STZ         IASS
         IC          IASS            < (ON MEMORISE L'ASSIGNATION...)
         STZ         DEMPER+DEM3     < ON RAZE 'DEM3', EN PARTICULIER A CAUSE
                                     < DE 'MT' QUI TRAVAILLE EN ACCES DIRECT.
         PLR         A,X             < S'IL EST ACCEPTE,
         JMP         EXEC            < ON RETENTE LE SERVICE...
<
< SORTIE :
<
EXEC1:   EQU         $
         CPZR        X               < POUR LES TESTS EN RETOUR...
         PLR         A,X
         RSR                         < ON PEUT TESTER 'JE'/'JNE' AU RETOUR...
         PAGE
<
<
<        R E N V O I   D E   L A   ' B O X '  :
<
<
<        FONCTION :
<                      PLACE DANS 'IOCB2' DE LA 'CDA'
<                    LA 'BOX' DE LA DEMANDE COURANTE,
<                    CE QUI DONNE EN FAIT LE NOMBRE
<                    D'OCTETS REELLEMENT LUS.
<
<
GBOX:    EQU         $
         PSR         A,B
         LA          DEMPER+DEM2
         STA         ETAT            < A PRIORI...
         ACTD        BOX             < B=(BOX),
         LR          B,A
         CP          DEMPER+DEM2     < ON VA CALCULER MIN(DEM2,BOX), A CAUSE
                                     < DU 'SGN' QUI RENVOIE TOUJOURS LA LON-
                                     < GUEUR TOTALE DE LA VALEUR...
         JGE         GBOX1           < MIN(DEM2,BOX)=DEM2...
         STB         ETAT            < QUE L'ON RENVOIE DANS 'ETAT'...
         STB         DEMPER+DEM2     < POUR LES CODES D'ARRET SUR LA VISU...
                                     < (PREND AINSI 'EOT' ET 'RC' COMME DES
                                     < CODES D'ARRET IMPLICITES...)
GBOX1:   EQU         $
         PLR         A,B
         RSR
         PAGE
<
<
<        G E S T I O N   D E S   C O D E S   D ' A R R E T  :
<
<
<        FONCTION :
<                      CE MODULE SI L'ENTREE EST SUR
<                    CODE D'ARRET BALAYE LE BUFFER A
<                    LA RECHERCHE D'UN CODE D'ARRET
<                    FIGURANT DANS LA LISTE 'TCODAR'...
<
<
CODAR:   EQU         $
         PSR         A,B,X
         LA          XCDA+XIOCB
         TBT         BCODAR          < EST-CE UNE ENTREE SUR CODE D'ARRET ???
         JNC         CODAR1          < NON...
         LXI         0               < OUI, INITIALISATION DE L'INDEX...
CODAR2:  EQU         $
         LBY         &ABUFX          < A=CARACTERE COURANT,
         RBT         BITPAR          < ON ENLEVE LA PARITE,
         LR          A,B             < (B)=CARACTERE COURANT SANS PARITE,
         PSR         X
         LXI         0               < (X)=INDEX DES CODES D'ARRET,
CODAR4:  EQU         $
         LBY         &ATCODA
         RBT         BITPAR          < (A)=CODE D'ARRET COURANT,
         JAE         CODAR5          < ET BIEN C'EST LA FIN DE LISTE : LE
                                     < CARACTERE COURANT (B) N'EST PAS UN
                                     < CODE D'ARRET...
         CPR         A,B             < EST-CE UN CODE D'ARRET ???
         JE          CODAR6          < OUI, ON S'ARRETE LA...
         ADRI        I,X             < NON, AU CODE D'ARRET SUIVANT...
         JMP         CODAR4
CODAR5:  EQU         $
         PLR         X
         ADRI        I,X             < AU CARACTERE SUIVANT DU BUFFER,
         LR          X,A
         CP          DEMPER+DEM2     < S'IL EXISTE ???
         JL          CODAR2          < OUI...
         LAI         COSBT?BITPAR=FMASK(0?RC=FCINST
         STBY        &ABUFX          < NON, ON MET A PRIORI UN R/C AU BOUT...
         ADRI        -I,X
CODAR3:  EQU         $
         ADRI        I,X
         STX         ETAT            < ETAT=NOMBRE D'OCTETS, Y COMPRIS LE
                                     < CODE D'ARRET S'IL EST LA...
         STX         DEMPER+DEM2     < AU CAS OU IL S'AGIRAIT D'UNE SORTIE...
CODAR1:  EQU         $
         PLR         A,B,X
         RSR
CODAR6:  EQU         $               < CAS D'UN CODE D'ARRET RENCONTRE...
         PLR         X
         JMP         CODAR3          < VERS LE CALCUL DU COMPTE D'OCTETS...
         PAGE
<
<
<        E D I T I O N   D ' U N   M E S S A G E  :
<
<
<        ARGUMENT :
<                    A=ADRESSE DU MESSAGE.
<
<
PRINT:   EQU         $
         PSR         A,X,W
         LR          A,W             < W=ADRESSE DU MESSAGE,
         ADR         A,A
         ADRI        I,A
         STA         DEMOUT+DEM1     < ADRESSE-OCTET DU MESSAGE,
         LBY         0,W
         STA         DEMOUT+DEM2     < LONGUEUR-OCTET DU MESSAGE.
         LAD         DEMOUT
         SVC         0               < EDITION DU MESSAGE...
         PLR         A,X,W
         RSR
         PAGE
<
<
<        I N S E R T I O N   F O N C T I O N  :
<
<
<        ARGUMENT :
<                    A=FONCTION A INSERER DANS LA 'DEMPER' COURANTE.
<
<
SPFON:   EQU         $
         PSR         A,B
         LR          A,B
         LAI         MNVP
         AND         DEMPER          < RECUPERATION DU 'NVP',
         ORR         B,A             < CONCATENATION DE LA FONCTION,
         STA         DEMPER          < ET MISE A JOUR DE LA DEMANDE...
         PLR         A,B
         RSR
         PAGE
<
<
<        A L L O C A T I O N   E T   A J U S T E M E N T
<                    E S P A C E   M E M O I R E  :
<
<
<        ARGUMENT :
<                    X=NOMBRE D'OCTETS DE L'ECHANGE COURANT,
<                      ET DONC LONGUEUR MINIMALE NECESSAIRE
<                      AU BUFFER 'BUF'.
<
<
SPMEM0:  EQU         $
         PSR         A,B,X,Y
         LY          T0              < Y=LE MINIMUM...
         JMP         SPMEM1
SPMEM:   EQU         $
         BSR         ASPMET          < ALLOCATION MEMOIRE...
<
< CLEAR DU BUFFER :
<
         PSR         A,X,Y
         LR          X,A             < A=LONGUEUR D'ARRET,
         TBT         NBITMO-I        < LA LONGUEUR EST-ELLE IMPAIRE ???
         ADCR        A               < SI OUI, ON LA REND PAIRE AFIN DE NET-
                                     < TOYER UN NOMBRE ENTIER DE MOTS (PROBLEME
                                     < A CAUSE DU 'MT1'...).
         LR          A,Y             < (Y)=LONGUEUR D'ARRET,
         LXI         0               < X=INDEX DE CLEAR,
         LAI         COSBT?BITPAR=FMASK(0?" "=FCINST
SPMEM4:  EQU         $
         STBY        &ABUFX          < MISE A "SPACE" DU BUFFER...
         ADRI        I,X             < AU CARACTERE SUIVANT,
         CPR         Y,X             < S'IL EXISTE...
         JL          SPMEM4          < OUI...
         LAI         COSBT?BITPAR=FMASK(0?RC=FCINST
         STBY        &ABUFX
         PLR         A,X,Y
         RSR
<
<
<        A L L O C A T I O N   S E U L E  :
<
<
SPMEMT:  EQU         $
         PSR         A,B,X,Y
         LR          X,A
         ADRI        NOCMO-I+'20+2,A < +'20 A CAUSE DE L'EN-TETE...
                                     < ET +2, PARCEQU'ON RAJOUTE UN R/C A
                                     < PRIORI AU BOUT DU BUFFER...
         AD          ABUF2           < A=TAILLE MEMOIRE EN OCTETS NECESSAIRE
                                     < AU BON DEROULEMENT DE L'ECHANGE.
         LY          T800            < Y=1K MOTS A PRIORI...
         CP          T800            < CELA SUFFIT-IL ???
         JLE         SPMEM1          < OUI...
         LY          T1000           < NON, Y=2K MOTS...
         LXI         8               < AFIN D'ESSAYER 8 TAILLES POSSIBLES.
SPMEM2:  EQU         $
         CPR         Y,A             < LA TAILLE (Y) SUFFIT-ELLE ???
         JLE         SPMEM1          < OUI, OK...
         XR          A,Y
         AD          T1000           < NON, ON ALLONGE...
         XR          A,Y
         JDX         SPMEM2          < A LA TAILLE SUIVANTE...
         LAI         M2-ZERO
         BSR         APRINT          < BIZARRE !???!?
         QUIT        1
SPMEM1:  EQU         $
         LR          Y,A
         CP          DEMMEM+DEM2     < LA TAILLE DEMANDEE (Y) N'EST-ELLE
                                     < PAS DEJA POSEDEE ???
         JE          SPMEM3          < OUI, RIEN A FAIRE...
         STA         DEMMEM+DEM2     < NON,
         LAD         DEMMEM
         SVC         0               < ON LA DEMANDE,
         JE          SPMEM3          < ET ON L'A EU...
         LAI         M3-ZERO
         BSR         APRINT          < BIZARRE ?!??!
         QUIT        1
SPMEM3:  EQU         $
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        T R A N S L A T I O N   D E   L A   ' C D A '
<                    E T   D U   B U F F E R  :
<
<
<        ARGUMENT :
<                    A=ADRESSE RELATIVE DANS LA 'CDA',
<                    B=ADRESSE DU BUFFER.
<
<
<        RESULTAT :
<                    A=ADRESSE RELATIVE TRANSLATEE DANS LA 'CDA',
<                    B=ADRESSE TRANSLATEE DU BUFFER.
<
<
TRANS:   EQU         $
         AD          TRCDA           < TRANSLATION DE LA 'CDA',
         XR          A,B
         AD          BTRANS          < PUIS DU BUFFER...
         XR          A,B
         RSR
         PAGE
<
<
<        S I M U L A T I O N   D ' U N E   E C R I T U R E  :
<                    ( C D A --> B U F F E R )
<
<
<        ARGUMENT :
<                    X=NOMBRE D'OCTETS A TRANSFERER.
<
<
RCDA:    EQU         $
         PSR         A,B,X,Y
         LR          X,A
         LR          X,Y             < ET SAVE DANS 'Y'...
         ADRI        NOCMO-I,A
         SLRS        NOCMO=K
         LR          A,X             < X=NOMBRE DE MOTS A DEPLACER,
         LA          XCDA+XIOCB+IOCB1
                                     < (A)=ADRESSE RELATIVE EN 'CDA'...
         LB          ABUF            < B=ADRESSE DU RECEPTEUR,
         BSR         ATRANS          < TRANSLATION DE LA 'CDA'...
         RCDA
                                     < ET SIMULATION DE L'ECRITURE...
         LR          Y,A             < (Y)=(A)=NOMBRE D'OCTETS NECESSAIRES,
         TBT         NBITMO-I        < PAIR OU IMPAIR ???
         JNC         RCDA1           < PAIR, DONC LE 'RCDA' FUT BON...
         LR          Y,X             < IMPAIR, DONC UN OCTET DE TROP A ETE
                                     < TRANSFERE...
         LAI         COSBT?BITPAR=FMASK(0?" "=FCINST
         STBY        &ABUFX          < ON EFFACE CET OCTET EN TROP...
RCDA1:   EQU         $
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        S I M U L A T I O N   D ' U N E   L E C T U R E  :
<                    ( B U F F E R --> C D A )
<
<
<        ARGUMENT :
<                    X=NOMBRE D'OCTETS A DEPLACER.
<
<
WCDA:    EQU         $
         PSR         A,B,X
         LR          X,A
         ADRI        NOCMO-I,A
         SLRS        NOCMO=K
         LR          A,X             < X=NOMBRE DE MOTS A DEPLACER,
         LA          XCDA+XIOCB+IOCB1
                                     < (A)=ADRESSE RELATIVE EN 'CDA'...
         LB          ABUF            < B=ADRESSE DE L'EMETTEUR,
         BSR         ATRANS          < TRANSLATION DE LA 'CDA'...
         WCDA
                                     < ET SIMULATION DE LA LECTURE...
         PLR         A,B,X
         RSR
         PAGE
<
<
<        M O D U L E   D E   S I M U L A T I O N
<        D E S   E N T R E E S - S O R T I E S
<                    D E   B O S - D  :
<
<
SIMUL:   EQU         $
         LRM         L,K
         WORD        LOC+'80
         WORD        STACK
         STZ         BTRANS          < CLEAR A PRIORI DES TRANSLATIONS DU
         STZ         TRCDA           < BUFFER ET DE LA 'CDA'...
         LAI         M8-ZERO
         BSR         APRINT
         IC          KIN             < COMPTAGE DES ENTRIES :
         JE          SIMUL1          < CAS DE LA PREMIERE...
SIMUM2:  EQU         $
         LAI         M13-ZERO
         BSR         APRINT          < "CMS" OU "BOS" ???
         LAD         DEMIN
         BSR         AEXEC
         LBY         BUFIN           < A=REPONSE :
COUP1::  VAL         -1              < BREAK 1 COUP,
COUP4::  VAL         -4              < BREAK 4 COUPS.
         ADRI        -"0",A          < QUE L'ON DECODE,
         NGR         A,A
         JAE         SIMUM3          < C'EST UN RETOUR A "CMS"...
         CPI         COUP1           < NON,
         JE          SIMUM4          < C'EST UN RETOUR A "BOS" 1 COUP...
         CPI         COUP4           < EST-CE LE RETOUR A "BOS" 4 COUPS ???
         JNE         SIMUM2          < NON ?!???!
<
< RETOUR AU "BOS"-U (???) 1 COUP OU 4 COUPS :
<
SIMUM4:  EQU         $
         STZ         ETAT            < RETOUR A "BOS" :
         STA         XCDA+XSCDA      < ON MET DANS 'XSCDA' UN CODE DISCRIMINANT
                                     < 1 COUP OU 4 COUPS...
ERBREK:: VAL         '7D+I           < CODE D'ERREUR DU BREAK (1 DE PLUS QUE
                                     < POUR LE ALT-MODE)...
         LAI         ERBREK          < CODE D'ERREUR A ENVOYER A BOS...
         BR          SENBOS          < ET ON VA LUI ENVOYER...
<
< RETOUR A "CMS5" LE MAGNIFIQUE :
<
SIMUM3:  EQU         $
         LAI         M9-ZERO
         BSR         APRINT
         LAD         L0
         BSR         ACCI            < PRIORITE NORMALE...
         LAD         DEMCCI
         SVC         0               < POUR LES AUTRES, ON ATTEND SOUS CCI...
         JMP         SIMULP          < VERS L'INTERROGATION...
<
< CAS DE LA PREMIERE FOIS :
<
SIMUL1:  EQU         $
         ACTD        BOX             < A=NOMBRE DE MOTS DISPONIBLES,
         ADRI        '10,A           < POUR L'EN-TETE DU PROGRAMME,
         SLLS        NOCMO=K
         STA         DEMMEM+DEM2     < SOIT EN OCTETS...
         STA         T0              < POUR 'SPMEM0'...
         LAD         CLOSE
         BSR         ACCI            < ENVOI DE "!CLOSE",
E101:    EQU         $
         LAI         M19-ZERO
         BSR         APRINT
         LAD         DEMIN
         BSR         AEXEC
         LBY         BUFIN           < VEUT-ON TOUT LE 'DKU' ???
         LB          XQFE            < OUI A PRIORI...
         CPI         RC
         JE          E100            < 'RC' ==> TOUT DKU (OU PRESQUE : "!QFFFE")
         CPI         EOT
         JE          E100            < 'EOT' ==> "!QFFFE"...
         CPI         "O"
         JE          E100            < "O" ==> "!QFFFE"...
         LB          XQC0            < NON A PRIORI...
         CPI         "N"
         JNE         E101            < ???!?!?!?!
E100:    EQU         $
         STB         CQC000          < COMPLETION DE LA CARTE "!Q..." QUI
                                     < DEVIENT "!QFFFE" OU "!QFFC0"...
         LAD         QC000
         BSR         ACCI            < APPROPRIATION DU DEBUT DE 'DKU'...
         LAI         M15-ZERO
         JNE         SIMUN1          < IMPOSSIBLE...
         LAD         CDAC
         BSR         ACCI            < ET DE "!CDA" POUR LIBERER LA "CDAG"...
         LAD         CDAG
         BSR         ACCI            < ENVOI DE "!CDAG",
         JE          SIMUL5          < OK, ON S'EST APPROPRIE LA "CDAG"...
         LAI         M1-ZERO
SIMUN1:  EQU         $
         BSR         APRINT          < ET BIEN NON, ON LE SIGNALE...
         LAD         DEMCCI
         SVC         0               < ET ON ATTEND SOUS LE CCI...
         JMP         SIMUL1          < ET ON RETENTE SUR !GO...
<
< PRIORITE INFERIEURE :
<
SIMULP:  EQU         $
         LAD         L1
         BSR         ACCI            < PRIORITE INFERIEURE...
<
< INITIALISATION DE LA "CDAG" ???
<
SIMUL5:  EQU         $
         LAD         ASSVIO
         BSR         ACCI            < ENVOI DE "!ASSIGN NVPVIS=O" A PRIORI...
         LAI         M11-ZERO
         BSR         APRINT
         LAD         DEMIN
         BSR         AEXEC
         LBY         BUFIN           < A=REPONSE,
         CPI         RC
         JE          SIMULL          < 'RC' EQUIVAUT A "N"...
         CPI         EOT
         JE          SIMULL          < 'EOT' EQUIVAUT A "N"...
         CPI         "N"
         JE          SIMULL          < "N" : ON NE REINITIALISE PAS LA 'CDA'...
         CPI         "O"
         JNE         SIMUL5          < ?!??!??!
         STZ         XCDA+XVCDA      < "O" :
         STZ         XCDA+XSCDA      < ON REINITIALISE LA 'CDA'...
         LAI         CDA-CDA
         LB          AXCDA
         BSR         ATRANS          < TRANSLATION DE LA 'CDA'...
         LXI         LXCDA
         WCDA
SIMULL:: EQU         $
<
< RECOUVREMENT DES ECRITURES ???
<
SIMULU:  EQU         $
         STZ         RECOUW          < RECOUW=0 A PRIORI, PAS DE RECOUVREMENT...
         LAI         M14-ZERO
         BSR         APRINT          < "RECOUVREMENT ?" :
         LAD         DEMIN
         BSR         AEXEC
         LBY         BUFIN           < A=REPONSE ("O"/"N") :
         CPI         "N"
         JE          SIMULV          < PAS DE RECOUVREMENT (RECOUW=0)...
         IC          RECOUW          < PEUT-ETRE (RECOUW=1)...
         CPI         "O"
         JNE         SIMULU          < ??!??!?!?!
SIMULV:  EQU         $
<
< ASSIGNATION EVENTUELLE DES PERIPHERIQUES :
<
         LXI         NVPF-NVP0-I     < X=INDEX D'ACCES A LA LISTE DES
                                     < CONTEXTES :
SIMUL2:  EQU         $
         PSR         X
         LA          &ALCON
         LR          A,W             < W=ADRESSE DU CONTEXTE COURANT...
         LA          ASSNOM
         STA         MNOMX           < RECUPERATION DE SON NOM,
SIMUL3:  EQU         $
         LAD         MNOM
         BSR         APRINT          < ET ENVOI...
         LAD         DEMIN
         SVC         0               < ENTREE DE LA REPONSE...
         LBY         BUFIN           < A=OCTET RENVOYE PAR L'UTILISATEUR...
         CPI         EOT
         JE          SIMUL4          < 'NVP' INCHANGE...
         CPI         '0D
         JE          SIMUL4          < 'NVP' INCHANGE...
         BSR         APCLOS          < DESASSIGNATION PRELIMINAIRE...
         CPI         "-"             < EST-CE UNE DECONNEXION ???
         JE          SIMUL4          < OUI, C'EST FAIT...
         STBY        ASSNUM          < ON ADMET QUE LE CARACTERE INTRODUIT
                                     < EST LE NUMERO DU PERIPHERIQUE...
         LAD         ASSIGN
         BSR         ACCI            < TENTATIVE D'ASSIGNATION...
         JE          SIMULK          < OK...
         LAI         M10-ZERO
         BSR         APRINT          < IMPOSSIBLE (DEJA ASSIGNE, OU BIEN
                                     < PERIPHERIQUE N'EXISTANT PAS...).
         JMP         SIMUL3          < IMPOSSIBLE ???
SIMULK:  EQU         $
         STZ         IASS
         IC          IASS            < MEMORISATION DE L'ASSIGNATION...
         STZ         DEMPER+DEM3     < ON RAZE 'DEM3' A CAUSE DE 'MT' QUI
                                     < TRAVAILLE EN ACCES DIRECT...
         BSR         APCLOS          < ET ON REDESASSIGNE TOUT DE SUITE ;
                                     < AINSI, LES CARTES "!ASSIGN" SONT
                                     < INITIALISEES, ET PRETES POUR LES
                                     < ASSIGNATIONS IMPLICITES...
<
< PASSAGE AU PERIPHERIQUE SUIVANT :
<
SIMUL4:  EQU         $
         PLR         X
         JDX         SIMUL2          < AU SUIVANT...
         PAGE
<
<
<        B O U C L E   D ' E X P L O R A T I O N  :
<
<
SIMULB:  EQU         $
         LAD         DEMCDA
         SVC         0               < SYNCHRONISATION SUR LES VALEURS
                                     < POSITIVES DE 'VCDA'.
         LAI         CDA-CDA
         LB          AXCDA
         BSR         ATRANS          < TRANSLATION DE LA 'CDA'...
         LXI         LXCDA
         RCDA
                                     < LECTURE DE L'EN-TETE DE 'CDA'.
         CPZ         XCDA+XVCDA      < Y-A-T'IL UNE DEMANDE ???
         JLE         SIMULB          < NON, ON ATTEND...
<
< CAS D'UNE DEMANDE DE SERVICE :
<
SIMULA:  EQU         $
         CPZ         XCDA+XSCDA      < VALIDATION DE 'SCDA' ???
         JNE         SIMULB          < MAUVAIS, ON RECOMMENCE LE 'RCDA'...
SIMULE:  EQU         $
         STZ         ETATSV          < A PRIORI...
         STZ         ETAT
<
< RECHERCHE DU PERIPHERIQUE DEMANDE :
<
         LA          XCDA+XIOCB
         ANDI        MPIOCB
         SLRS        MPIOCB=K
         STA         FUCOUR          < MEMORISATION DE LA 'FU' COURANTE...
         CPI         XNFU            < VALIDATION :
         JGE         SIMUN2          < ERREUR, INEXISTANTE !!!
         LR          A,X
         LA          &ALFUCO         < (A)=ADRESSE DU CONTEXTE ASSOCIE,
         JAG         SIMULD          < OK, ON L'A TROUVE...
         IF          FUINEX,XWOR%,XWOR%,
         IF          ATTENTION : LE TEST PRECEDENT EST MAUVAIS !!!
XWOR%:   VAL         0
         IF          FUNUTI,XWOR%,XWOR%,
         IF          ATTENTION : LE TEST PRECEDENT EST MAUVAIS !!!
XWOR%:   VAL         0
SIMUN2:  EQU         $
         LAI         M4-ZERO
         BSR         APRINT          < ?!?!?!
         QUIT        1
<
< RETOURS EN ERREUR DU PROGRAMME DE SIMULATION :
<
SIMULI:  EQU         $
         JMP         SIMULJ          < ET ON VA AVERTIR LE BOS...
                                     < (SALE GAFTEUR ??!??!)
<
< CAS OU ON A TROUVE LE PERIPHERIQUE :
<
SIMULD:  EQU         $
         LR          A,W             < (W)=ADRESSE DU CONTEXTE ASSOCIE A LA
                                     <     'FU' COURANTE...
         LX          NFONC           < X=NOMBRE DE FONCTIONS RECONNUES SUR
                                     <   LE PERIPHERIQUE COURANT.
         PSR         W               < SAVE L'ADRESSE DU CONTEXTE COURANT.
         ADRI        TFONC-CONTEX,W  < W=ADRESSE DE LA PREMIERE ENTREE DE
                                     <   LA LISTE DES FONCTIONS RECONNUES.
         LA          XCDA+XIOCB
         TBT         BFONSP          < EST-CE UNE FONCTION SPECIALE ???
         JNC         SIMULO          < OUI...
         RBT         BFONSP          < NON, UNE E/S REELLE...
         RBT         BCODAR          < ON SUPPRIME LE CODE D'ARRET.
         RBT         BIT5
         RBT         BIT6
         RBT         BIT7            < ?!??!
SIMULO:  EQU         $
         ANDI        MFIOCB
XWOR%1:  VAL         MFIOCB=K
         SLRS        XWOR%1
XWOR%1:  VAL         -XWOR%1
         LYI         TYPRET>XWOR%1
         ANDR        A,Y             < Y=FONCTION DEMANDEE PAR BOS, SANS LE
                                     <   TYPE DE RETOUR.
         LR          A,B             < B=FONCTION DEMANDEE PAR BOS...
SIMULG:  EQU         $
         LA          TFONC1,W
         ANDI        MFBOS
         RBT         BFONSP          < ON RAZE LE BIT 'FONCTION SPECIALE'...
         SLRS        MFBOS=K
         CPR         A,B             < A-T'ON TROUVE LA FONCTION DEMANDEE ???
         JE          SIMULH          < OUI...
         ADRI        EFONC,W         < NON,
         JDX         SIMULG          < ALLONS VOIR LA SUIVANTE...
         PLR         W
         PSR         W
         LX          NFONC           < X=NOMBRE DE FONCTIONS RECONNUES,
         ADRI        TFONC-CONTEX,W  < W=BASE DES FONCTIONS...
SIMULQ:  EQU         $
         LA          TFONC1,W
         ANDI        MFBOS
         SLRS        MFBOS=K         < A=FONCTION BOS COURANTE,
         CPR         A,Y             < EST-CE LA FONCTION DEMANDEE ???
         JE          SIMULH          < OUI...
         ADRI        EFONC,W         < NON, A LA SUIVANTE,
         JDX         SIMULQ          < SI ELLE EXISTE...
         PLR         W
ERINEX:: VAL         ERBREK+I        < ERREUR 'FONCTION INEXISTANTE'...
         LAI         ERINEX
         STA         ETATSV          < ON LA TRANSMET...
         LAI         M6-ZERO
ERRDK:   EQU         $               < CAS DES ERREURS D'ADRESSAGE 'DKU'...
         BSR         APRINT
         QUIT        1               < BIZARRE ???!??!
<
< SORTIE "BRUTALE" :
<
EXECER:  EQU         $
         LAI         COUP4           < ET ON SIMULE UN BREAK
         STA         XCDA+XSCDA      < 4 COUPS...
         LA          ETATSV          < (A)=CONDITIONS DE RETOUR DE CMS5,
         JMP         SIMUM1          < VERS LA TRANSMISSION A 'BOS'...
<
< EXECUTION DE LA FONCTION COURANTE :
<
SIMULH:  EQU         $
         STZ         RECOUV          < PAS DE RECOUVREMENT A PRIORI...
         LA          TFONC2,W
         TBT         BINDEX          < ALORS FAUT-IL RECOUVRIR ???
         RBT         BINDEX
         STA         ASP             < MISE EN PLACE DU MODULE SPECIFIQUE.
         JNC         SIMULT          < NON...
         LA          RECOUW
         STA         RECOUV          < OUI, ON INITIALISE AVEC 'RECOUW'...
SIMULT:  EQU         $
         LA          TFONC1,W
         ANDI        MFCMS
         SLRS        MFCMS=K
         PLR         W               < RESTAURATION DE L'ADRESSE DU CONTEXTE
                                     < COURANT (W),
         BSR         ASPFON          < ET MISE EN PLACE DE LA FONCTION CMS,
                                     < OU BIEN DE 'FINEX'...
         LR          A,B             < (B)=FONCTION DEMANDEE...
         LBY         DEMPER
         CPI         NVPDKU          < EST-CE LE DISQUE ???
         JNE         PASDKU          < NON...
         LA          XCDA+XIOCB+IOCB5
         STA         DEMPER+DEM3     < OUI, MISE EN PLACE DE L'ADRESSE...
                                     < (POIDS FAIBLE)
         LR          B,A             < (A)=FONCTION DEMANDEE,
         CPI         FINEX           < EST-CE LA FONCTION INEXISTANTE ???
         JE          PASDKU          < OUI (DONC EQUIVALENT A !CLOSE)...
         CPI         FTVDKU          < EST-CE LA 'CDAI' EN FAIT ???
         JE          PASDKU          < OUI, CE N'EST PAS LE DISQUE EN FAIT...
         LA          XCDA+XIOCB+IOCB6
         CP          BLKC            < EST-CE LES POIDS FORTS PRECEDENTS ???
         JE          PASDKU          < OUI, RIEN A FAIRE...
         JAL         ERRDKU          < ??!!?!?!
         CPI         2
         JGE         ERRDKU          < ??!?!?!?
         STA         BLKC            < NON, ON VA SE POSITIONNER SUR LE
                                     < GROUPE DE '10000 SECTEURS CORRESPONDANT.
         ADRI        "0",A           < CONVERSION ASCI,
         STA         AQC000
         LAI         "+"
         STBY        AQC000
         LAD         QC000
         BSR         ACCI            < ET ON S'Y POSITIONNE...
         JNE         ERRDKU          < !??!?!?!
PASDKU:  EQU         $
         LX          XCDA+XIOCB+IOCB2
         STX         DEMPER+DEM2     < X=COMPTE D'OCTETS PRESUME...
                                     < (QU'IL Y AIT CODE D'ARRET OU PAS)
         CPZ         RECOUV          < PEUT-ON RECOUVRIR LA FONCTION ???
         JNE         SIMULR          < OUI, ON PEUT FAIRE UN RECOUVREMENT...
         STX         ETAT            < ON INITIALISE 'ETAT' SUR UN COMPTE
                                     < D'OCTETS...
SIMULR:  EQU         $
         BSR         ASP             < EXECUTION DE LA DEMANDE COURANTE A
                                     < L'AIDE DU MODULE SPECIFIQUE...
                                     < AVEC : X=COMPTE D'OCTETS PRESUME...
         CPZ         RECOUV          < Y-A-T'IL RECOUVREMENT ???
         JNE         SIMUO1          < OUI, PAS DE TEST EN RETOUR...
         CPZ         ETATSV          < NON, DONC COMMENT CELA S'EST-IL PASSE ???
         JNE         EXECER          < MAL, ON ABORTE !!!
SIMUO1:  EQU         $
         LA          RECOUV
         NGR         A,A             < ON PASSE EVENTUELLEMENT D'AVANT A APRES !
         STA         RECOUV
<
< SYNCHRONISATION DU 'BOS' :
<
SIMULJ:  EQU         $
         STZ         XCDA+XSCDA
         IC          XCDA+XSCDA      < XSCDA=1...
SIMUM5:  EQU         $               < CAS DE LA TRANSMISSION DE 1 COUP/4
                                     < COUPS A "BOS", XSCDA=-1 OU -4...
         LA          ETAT
SIMUM1:  EQU         $               < CAS DES ERREURS EN RETOUR DE CMS5...
         STA         XCDA+XIOCB+IOCB3
                                     < RENVOI DES CONDITIONS DE RETOUR...
         PSR         X
         STZ         XCDA+XVCDA
         DC          XCDA+XVCDA      < XVCDA=-1 (POUR DISTINGUER UN NOUVEAU
                                     < SERVICE EN ATTENTE, DU PRECEDENT NON
                                     < ENCORE ACQUITTE),
         LAI         CDA-CDA
         LB          AXCDA
         BSR         ATRANS          < TRANSLATION DE LA 'CDA'...
         LXI         LXCDA
         WCDA
                                     < ET SYNCHRONISATION DE BOS...
         PLR         X
         CPZ         XCDA+XSCDA      < Y-A-T'IL UN BREAK ???
         JL          SIMULS          < OUI, VERS LA DEMANDE SUIVANTE SANS
                                     < TESTER LE RECOUVREMENT...
         CPZ         RECOUV          < A-T'ON FAIT UN RECOUVREMENT ???
         JE          SIMULS          < NON, ELLE EST DEJA EXECUTEE...
         STX         ETAT            < ???!??!
         BSR         ASP             < LES ECRITURES SONT MISES EN RECOUVREMENT.
         CPZ         ETATSV          < COMMENT CELA S'EST-IL PASSE ???
         JNE         EXECER          < MAL, ON ABORTE !!!
SIMULS:  EQU         $
         BR          ASIMUB          < VERS LA DEMANDE SUIVANTE...
<
< TRAITEMENT DES ERREURS D'EXTENSION
< D'ADDRESSES SUR 'DKU' (ON RESTE OU ON ETAIT) :
<
ERRDKU:  EQU         $
         LAI         M18-ZERO
         JMP         ERRDK           < VERS LA SIGNALISATION DE L'ERREUR...
         PAGE
<
<
<        S O U S - P R O G R A M M E   V I D E  :
<
<
VIDE:    EQU         $
         BSR         ASPME0          < ON VA QUAND MEME MINIMISER L'ESPACE
                                     < MEMOIRE...
         RSR                         < DUR, DUR, DUR...
         PAGE
<
<
<        S E R V I C E   S I M P L E  :
<
<
SERV:    EQU         $
         BSR         ASPME0          < ON MINIMISE LA MEMOIRE,
         LAD         DEMPER
         BSR         AEXEC           < ET ON EXECUTE CE QUI EST DEMANDE...
         RSR
         PAGE
<
<
<        F E R M E T U R E   D ' U N E   A S S I G N A T I O N  :
<
<
PCLOSE:  EQU         $
         PSR         A
         LAD         DESASS
         BSR         ACCI            < ENVOI D'UNE DEMANDE DE DESASSIGNATION...
         STZ         IASS            < ON MEMORISE LA DESASSIGNATION...
         PLR         A
         RSR                         < ET C'EST TOUT...
         PAGE
<
<
<        E C R I T U R E  :
<
<
WRITE:   EQU         $
         BSR         ASPMEM          < AJUSTEMENT DE L'OCCUPATION MEMOIRE.
         BSR         ARCDA           < RECUPERATION DU BUFFER A ECRIRE.
         JMP         WRITES          < VERS L'EXECUTION DE L'ECRITURE...
<
<
<        E C R I T U R E   A V E C   R E C O U V R E M E N T  :
<
<
WRITER:  EQU         $
         CPZ         RECOUV          < AVANT OU APRES LA SYNCHRO 'BOS' ???
         JE          WRITE           < PAS DE RECOUVREMENT ???!??!??!
         JL          WRITES          < APRES...
<
< RECOUV=1 : AVANT LA SYNCHRO 'BOS' :
<
         BSR         ASPMEM          < AJUSTEMENT DE L'OCCUPATION MEMOIRE.
         BSR         ARCDA           < RECUPERATION DU BUFFER A ECRIRE.
         JMP         WRITET          < VERS LA SORTIE...
<
< RECOUV=-1 : APRES LA SYNCHRO 'BOS' :
<
WRITES:  EQU         $
         LAD         DEMPER
         BSR         AEXEC           < EXECUTION DE L'ECRITURE...
<
< TEST SUR 'MT' :
<
TESTMT:  EQU         $
         CPZ         ETATSV          < MAIS COMMENT CELA S'EST-IL PASSE ???
         JNE         NWMT            < MAL, PAS DE POSITION COURANTE...
         LBY         DEMPER
         CPI         NVPMT           < LE 'NVP' COURANT EST-IL CELUI DE 'MT' ???
         JNE         NWMT            < NON, RIEN A FAIRE...
         LA          DEMPER
         PSR         A               < OUI, SAUVEGARDE DE LA FONCTION,
         LAI         FAD
         BSR         ASPFON          < ET MISE EN PLACE DE LA FONCTION D'ACCES
                                     < AU NUMERO DE BLOC COURANT.
         LAD         DEMPER
         BSR         AEXEC           < MISE DU NUMERO DE BLOC COURANT DANS
                                     < LA BOX,
         ACTD        BOX             < ET QUE L'ON RECUPERE...
         STB         DEMPER+DEM3     < ET QUE L'ON MET DANS 'DEM3' EN TANT QUE
                                     < NUMERO DU PROCHAIN BLOC A MANIPULER...
         PLR         A
         STA         DEMPER          < ET ENFIN RESTAURATION DE LA FONCTION...
         STZ         ETATSV          < PAR PRUDENCE...
NWMT:    EQU         $
<
< SORTIE :
<
WRITET:  EQU         $
         RSR
<
<
<        L E C T U R E  :
<
<
READ:    EQU         $
         BSR         ASPMEM          < AJUSTEMENT DE L'OCCUPATION MEMOIRE.
         LAD         DEMPER
         BSR         AEXEC           < EXECUTION DE LA LECTURE.
         BSR         AWCDA           < RENVOI DU BUFFER LU.
         JMP         TESTMT          < VERS LE TEST SUR 'MT'...
<
<
<        L E C T U R E   A V E C   P A R I T E  :
<
<
READP:   EQU         $
         BSR         ASPMEM          < AJUSTEMENT DE L'OCCUPATION MEMOIRE.
         LAD         DEMPER
         BSR         AEXEC           < EXECUTION DE LA LECTURE.
         BSR         AGBOX           < DONNE : ETAT=NOMBRE DE CARACTERES LUS.
         PSR         A,X
         LXI         0
READP1:  EQU         $
         LBY         &ABUFX
         PTY                         < CALCUL DE LA PARITE :
         JNC         READP2          < ELLE EST PAIRE...
         SBT         BITPAR          < ELLE EST IMPAIRE...
         STBY        &ABUFX
READP2:  EQU         $
         ADRI        I,X             < AU CARACTERE SUIVANT...
         LR          X,A
         CP          ETAT            < S'IL EXISTE...
         JL          READP1          < OUI...
         LAI         COSBT?BITPAR=FMASK(0?RC=FCINST
         STBY        &ABUFX
         PLR         A,X
         BSR         AWCDA           < RENVOI DU BUFFER LU.
         RSR
<
<
<        L E C T U R E   A V E C   P A R I T E
<        E T   T E S T   D E   F I N  :
<
<
READF:   EQU         $
         BSR         ASPMEM          < AJUSTEMENT DE LA MMOIRE.
         LAD         DEMPER
         BSR         AEXEC           < LECTURE DES DONNEES...
         BSR         AGBOX           < RECUPERATION DU NOMBRE DE CARACTERES LUS.
<
< TEST DES CARACTERES POUR REGENERATION
< DE LA PARITE, ET TEST DE FIN :
<
         PSR         A,X,Y
         CPZ         ETATSV          < L'OPERATION S'EST BIEN DEROULEE ???
         JNE         READF5          < NON, ON SIMULE UNE FIN...
         LXI         0               < X=INDEX DES CARACTERES,
         LYI         0               < Y=COMPTEUR DES " "...
READF1:  EQU         $
         LBY         &ABUFX          < A=CARACTERE COURANT,
         CPI         " "             < EST-CE LE "SPACE" ???
         JNE         READF3          < NON...
         ADRI        1,Y             < OUI, COMPTAGE DES "SPACE"...
READF3:  EQU         $
         PTY                         < CALCUL DE LA PARITE,
         JNC         READF2          < PAIRE,
         SBT         BITPAR          < IMPAIRE.
         STBY        &ABUFX
READF2:  EQU         $
         ADRI        I,X             < AU CARACTERE SUIVANT...
         LR          X,A
         CP          ETAT            < S'IL EXISTE...
         JL          READF1          < OUI...
         LAI         COSBT?BITPAR=FMASK(0?RC=FCINST
         STBY        &ABUFX
         LR          Y,A             < A=NOMBRE DE "SPACES" :
         CP          ETAT            < EST-CE UN BUFFFER "BLANC" ???
         JNE         READF4          < NON...
READF5:  EQU         $
         LXI         0               < OUI,
         LAI         COSBT?BITPAR=FMASK(0?RC=FCINST
         STBY        &ABUFX          < ON MET UN 'R/C' EN DEBUT DE BUFFER...
         LAI         1
         STA         ETAT            < ET ON NE RENVOIE QU'UN SEUL CARACTERE...
READF4:  EQU         $
         PLR         A,X,Y
         RSR
         PAGE
<
<
<        V I S U   ( O U   T T Y S )  :
<
<
SPVI:    EQU         $
<
<
<        L E C T U R E  :
<
<
SPVI2:   EQU         $
         LA          FUCOUR
         CPI         FUGR            < EST-CE UNE LECTURE SUR LA 'FU' SPECIALE
                                     < GRAPHIQUE ???
         JE          SPGR            < OUI, ON Y VA...
         BSR         AREADP
         BSR         AGBOX
         BSR         ACODAR          < PRISE EN COMPTE DES EVENTUELS CODES
                                     < D'ARRET...
SPGR1:   EQU         $
         RSR
<
<
<        L E C T U R E   G R A P H I Q U E  :
<
<
SPGR:    EQU         $
         LBY         DEMPER          < SAUVEGARDE DU 'NVP',
         LBI         LCU
         STB         DEMPER          < MISE EN PLACE DE LA FONCTION,
         STBY        DEMPER          < ET RESTAURATION DU 'NVP'...
         LAD         OG
         SVC         0               < MISE EN GRAPHIQUE DE LA VISU,
         LAD         CU
         SVC         0               < ACTIVATION DU CURSEUR GRAPHIQUE,
         LX          DEMPER+DEM2     < POUR 'SPMEM' DANS 'READ'...
         BSR         AREAD           < ET LECTURE GRAPHIQUE...
         JMP         SPGR1           < VERS LE RETOUR...
<
<
<        E C R I T U R E  :
<
<
SPVI1:   EQU         $
         CPZ         RECOUV          < AVANT OU APRES LA SYNCHRO 'BOS' ???
         JNE         SPVI1U          < OK...
         BSR         ASPMEM          < PAS DE RECOUVREMENT : AJUSTEMENT DE
                                     < DE L'ESPACE MEMOIRE,
         BSR         ARCDA           < RECUPERATION DU BUFFER A ECRIRE,
         JMP         SPVI1S          < VERS LE TRAITEMENT DES PARITES...
SPVI1U:  EQU         $
         JL          SPVI1S          < APRES...
<
< RECOUV=1 : AVANT LA SYNCHRO 'BOS' :
<
         BSR         ASPMEM          < AJUSTEMENT DE L'OCCUPATION MEMOIRE.
         BSR         ARCDA           < RECUPERATION DU BUFFER A ECRIRE.
         JMP         SPVI1T          < VERS LA SORTIE...
<
< RECOUV=-1 : APRES LA SYNCHRO 'BOS' :
<
SPVI1S:  EQU         $
         PSR         A,X
         LA          ABUFVI
         ADRI        -VISSEG*NOCMO,A
         STA         WG+DEM1         < CAS DE 'FUGR' A PRIORI...
         LA          DEMPER+DEM2
         STA         WG+DEM2         < (IDEM)
         STA         WGTV+DEM2       < CAS DE 'FUTV' A PRIORI...
         LA          FUCOUR          < (A)='FU' COURANTE :
         CPI         FUCOM           < EST-CE LA 'FU' CARTE CMS5 "!..." ???
         JE          SPVI14          < OUI...
         CPI         FUGR            < EST-CE LA 'FU' GRAPHIQUE ???
         JE          SPVI42          < OUI...
         CPI         FUTV            < EST-CE LA 'FU' TELEVISION ???
         JE          SPVI43          < OUI...
         LA          DEMPER+DEM2     < NON, TEST D'UN DEROUTEMENT GRAPHIQUE :
         CPI         LGVIS           < EST-CE UN ACCES GRAPHIQUE VISU :
         JE          SPVI12          < PEUT-ETRE...
         CPI         LGTV            < EST-CE UN ACCES GRAPHIQUE TV :
         JE          SPVI13          < PEUT-ETRE...
SPVI14:  EQU         $               < ET BIEN NON, NI TV, NI VISU...
         LXI         0               < X=INDEX D'ACCES AU BUFFER,
SPVI11:  EQU         $
         LBY         &ABUFX
         RBT         BITPAR          < ON ELIMINE LES PARITES...
         STBY        &ABUFX
         ADRI        I,X
         LR          X,A
         CP          DEMPER+DEM2     < EST-CE FINI ???
         JL          SPVI11          < NON...
<
< OUI, TEST D'UNE COMMANDE PRE-
< PROGRAMMEE ; ON L'IDENTIFIE
< PAR LA PRESENCE DE "!M" EN
< TROISIEME PLACE :
<
         LA          FUCOUR          < (A)='FU' COURANTE :
         CPI         FUCOM           < EST-CE LA 'FU' DES COMMANDES CMS5 ???
         JE          E110            < OUI, ON NE TESTE PAS "!M...", AFIN
                                     < DE NE PAS SE DEROUTER SUR 'SPVI22'...
                                     < SI "!M..." EST ABSENT CELA FERA UNE
                                     < ERREUR 'CCI'...
         LXI         XPE
         LBY         &ABUFX          < (A)=CARACTERE POUVANT ETRE "!",
         CPI         KPE             < EST-CE LUI ???
         JNE         SPVI22          < NON, PEUT-ETRE DU GRAPHIQUE...
         LXI         XM              < OUI,
         LBY         &ABUFX
         CPI         KM              < ALORS, A-T'ON BIEN "!M" ???
         JNE         SPVI22          < NON...
E110:    EQU         $
         LXI         XLIM            < OUI,
         LBY         &ABUFX          < (A)=LIMITEUR JOUANT LE ROLE DE "EOT",
         STA         LIMIT           < QUE L'ON MEMORISE...
         LXI         XPE             < (X)=INDEX D'EXPLORATION DE LA CARTE,
SPVI30:  EQU         $
         LBY         &ABUFX          < (A)=CARACTERE COURANT,
         CP          LIMIT           < EST-CE "EOT" ???
         JE          SPVI31          < OUI...
         ADRI        I,X             < NON, AU SUIVANT...
         LR          X,A
         CPI         XPE+LCARTE      < MAIS EST-ON AU BOUT ???
         JL          SPVI30          < NON...
         ADRI        -I,X            < OUI, ON ECRASE LE DERNIER CARACTERE...
SPVI31:  EQU         $
         LAI         EOT
         STBY        &ABUFX          < ON PLACE UN "EOT" AU BOUT...
         LAD         CCINT
         BSR         AEXEC           < ET ON ENVOIE LA COMMANDE...
         JNE         SPVI33          < ERREUR...
         QUIT        1               < C'EST BON, ON PASSE LA MAIN AU 'CCI'...
         JMP         SPVI32
SPVI33:  EQU         $
         LAI         M17-ZERO
         BSR         APRINT          < MESSAGE D'ERREUR...
SPVI32:  EQU         $
         PLR         A,X
         JMP         SPVI1T          < ET ON SORT...
<
< ECRITURES NORMALES :
<
SPVI22:  EQU         $
         PLR         A,X             < OUI...
         BSR         ACODAR          < TEST DES CODES D'ARRET...
         LAD         DEMPER
         BSR         AEXEC           < EXECUTION DE L'ECRITURE...
<
< SORTIE :
<
SPVI1T:  EQU         $
         RSR
<
< TEST D'UN DEROUTEMENT GRAPHIQUE VISU :
<
SPVI12:  EQU         $
         LXI         VISV1-GVIS
         LA          &ABUFX
         CPI         VALG            < A-T'ON L'ENCADREMENT 'VALG' ???
         JNE         SPVI14          < NON, DONC ALPHA-NUMERIQUE...
         LXI         VISV2-GVIS
         LA          &ABUFX
         CPI         VALRAZ          < EST-CE UN EFFACEMENT ???
         JE          SPVI16          < OUI...
         CPI         VALG            < A-T'ON L'ENCADREMENT 'VALG' ???
         JNE         SPVI14          < NON, DONC ALPHA-NUMERIQUE...
         LA          ABUFVI
         STA         WG+DEM1         < REINITIALISATION
         LAI         LVSEG
         STA         WG+DEM2         <                  DE 'WG'...
SPVI42:  EQU         $               < ENTRY 'FUGR' :
         LA          WG+DEM2
         CPI         NOCMO           < EST-CE UNE DEMANDE D'ERASE ???
         JE          SPVI16          < OUI...
         LAD         OG              < NON, DONC GRAPHIQUE VISU :
         BSR         AEXEC           < OPEN GRAPHIQUE,
         LAD         WG
         BSR         AEXEC           < ECRITURE D'UN SEGMENT,
         LAD         CG
         JMP         SPVI15          < VERS LE CLOSE GRAPHIQUE.
SPVI16:  EQU         $
         LAD         ERASE
         JMP         SPVI15          < VERS L'EFFACEMENT...
<
< TEST D'UN DEROUTEMENT GRAPHIQUE TV :
<
SPVI13:  EQU         $
         LXI         TVV2-GTV
         LA          &ABUFX
         CPI         VALRAZ          < EST-CE UN EFFACEMENT ???
         JE          SPVI17          < OUI...
         CPI         VALG            < A-T'ON L'ENCADREMENT 'VALG' ???
         JNE         SPVI14          < NON, DONC ALPHA-NUMERIQUE...
         LAI         LVTV
         STA         WGTV+DEM2       < REINITIALISATION DE 'WGTV'...
SPVI43:  EQU         $               < ENTRY 'FUTV' :
         LA          WGTV+DEM2
         CPI         NOCMO           < EST-CE UNE DEMANDE DE 'NOIR' ???
         JE          SPVI17          < OUI...
         LAD         WGTV            < NON...
SPVI15:  EQU         $
         BSR         AEXEC           < ECRITURE D'UN SEGMENT TV, OU 'CG'...
         PLR         A,X
         JMP         SPVI1T          < VERS LA SORTIE...
SPVI17:  EQU         $
         LRM         A,B,X
         WORD        NOIR
         WORD        BUF
         WORD        LNOIR
         MOVE                        < GENERATION DU NOM "M-NOIR"...
         LX          SGN+DEM2        < (X)=NOMBRE D'OCTETS POUR "M-NOIR",
         BSR         ASPMET          < AJUSTEMENT DE L'ESPACE MEMOIRE...
         LAD         SGN
         BSR         AEXEC           < APPEL DE L'IMAGE "M-NOIR"...
         LAD         DEMTV
         JMP         SPVI15          < VERS L'ENVOI DE "M-NOIR" EN TV...
         PAGE
<
<
<        L E C T E U R   D E   C A R T E S  :
<
<
SPCR:    EQU         $
<
<
<        C L O S E   A S S I G N A T I O N  :
<
<
SPCR1:   EQU         PCLOSE
<
<
<        L E C T U R E  :
<
<
SPCR2:   EQU         $
         BSR         AREADF
         BSR         ACODAR
         BSR         AWCDA           < TRANSFERT DU BUFFER...
         RSR
         PAGE
<
<
<        S I M U L A T I O N   I M P R I M A N T E  :
<
<
<        ARGUMENT :
<                    X=COMPTE D'OCTETS PRESUME.
<
<
SPLP:    EQU         $
<
<
<        C L O S E   A S S I G N A T I O N  :
<
<
SPLP4:   EQU         PCLOSE
<
<
<        E C R I T U R E  :
<
<
SPLP3:   EQU         $
         CPZ         RECOUV          < AVANT OU APRES LA SYNCHRO 'BOS' ???
         JNE         SPLP3U          < OK...
         BSR         ASPMEM          < PAS DE RECOUVREMENT : AJUSTEMENT DE
                                     < L'ESPACE MEMOIRE,
         BSR         ARCDA           < RECUPERATION DU BUFFER A ECRIRE,
         JMP         SPLP3S          < VERS LE TEST DES CODES D'ARRET...
SPLP3U:  EQU         $
         JL          SPLP3S          < APRES...
<
< RECOUV=1 : AVANT LA SYNCHRO 'BOS' :
<
         BSR         ASPMEM          < AJUSTEMENT DE L'OCCUPATION MEMOIRE.
         BSR         ARCDA           < RECUPERATION DU BUFFER A ECRIRE.
         JMP         SPLP3T          < VERS LA SORTIE...
<
< RECOUV=-1 : APRES LA SYNCHRO 'BOS' :
<
SPLP3S:  EQU         $
         BSR         ACODAR          < TEST DES CODES D'ARRET...
         LAD         DEMPER
         BSR         AEXEC           < EXECUTION DE L'ECRITURE...
<
< SORTIE :
<
SPLP3T:  EQU         $
         RSR
<
<
<        S A U T   D E   P A G E  :
<
<
SPLP2:   EQU         $
         BSR         ASPME0          < MINIMISATION DE L'ESPACE MEMOIRE.
         LAD         DEMLF
         BSR         AEXEC           < EXECUTION DU SAUT DE PAGE.
         RSR
<
<
<        S A U T   D E   P A R A G R A P H E  :
<
<
SPLP1:   EQU         $
         BSR         ASPME0          < MINIMISATION DE L'ESPACE MEMOIRE.
         LAD         DEMVT
         BSR         AEXEC           < EXECUTION DU SAUT DE PARAGRAPHE.
         RSR
         PAGE
<
<
<        S I M U L A T I O N   G P I 3 2   E N   M O D E   C A N A L  :
<
<
<        ARGUMENT :
<                    X=COMPTE D'OCTETS PRESUME.
<
<
SPCU:    EQU         $
<
<
<        C L O S E   A S S I G N A T I O N  :
<
<
SPCU2:   EQU         PCLOSE
<
<
<        E C R I T U R E  :
<
<
SPCU1:   EQU         $
         CPZ         RECOUV          < AVANT OU APRES LA SYNCHRO 'BOS' ???
         JNE         SPCU1U          < OK...
         BSR         AREADO          < PAS DE RECOUVREMENT : AJUSTEMENT DE
                                     < L'ESPACE MEMOIRE,
                                     < RECUPERATION DU BUFFER A ECRIRE,
                                     < ET ECLATEMENT DES MOTS EN 2 MOTS...
         JMP         SPCU1S          < VERS LE TEST DES CODES D'ARRET...
SPCU1U:  EQU         $
         JL          SPCU1S          < APRES...
<
< RECOUV=1 : AVANT LA SYNCHRO 'BOS' :
<
         BSR         AREADO          < AJUSTEMENT DE L'OCCUPATION MEMOIRE,
                                     < RECUPERATION DU BUFFER A ECRIRE,
                                     < ET ECLATEMENT DES MOTS EN 2 MOTS...
         JMP         SPCU1T          < VERS LA SORTIE...
<
< RECOUV=-1 : APRES LA SYNCHRO 'BOS' :
<
SPCU1S:  EQU         $
         BSR         ACODAR          < TEST DES CODES D'ARRET...
         LAD         DEMPER
         BSR         AEXEC           < EXECUTION DE L'ECRITURE...
<
< SORTIE :
<
SPCU1T:  EQU         $
         RSR
<
<
<        E C L A T E M E N T   1   M O T  -->  2   M O T S  :
<
<
<        FONCTION :
<                      CETTE ROUTINE EST DESTINEE A
<                    ACCEDER A L'IMPRIMANTE ELECTRO-
<                    STATIQUE BENSON ; ELLE PRELEVE
<                    LES 2 OCTETS DE CHAQUE MOT, ET
<                    LES DISPOSE DANS 2 MOTS CONSE-
<                    CUTIFS...
<
<
READO:   EQU         $
         BSR         ASPMEM          < PREMIER AJUSTEMENT MEMOIRE,
         BSR         ARCDA           < RECUPERATION DU BUFFER ARGUMENT...
         LR          X,A             < (A)=NOMBRE D'OCTETS ARGUMENTS,
<
< INITIALISATION EVENTUELLE DU GRAPHWARE :
<
         CPI         LGRAPH*NOCMO    < EST-CE UNE DEMANDE D'INITIALISATION ???
         JNE         READO4          < NON...
         SLRS        NOCMO=K
         LR          A,X             < (X)=NOMBRE DE MOTS A TESTER...
READO5:  EQU         $
         ADRI        -I,X            < AU MOT PRECEDENT,
         CPZR        X               < EST-CE FINI ???
         JL          READO8          < OUI, ON INITIALISE...
         LA          &ABUFX          < NON, ON ACCEDE AU MOT PRECEDENT :
         CPI         IBUF            < EST-CE UNE INITIALISATION ???
         JNE         READO6          < NON, UNE SORTIE NORMALE...
         JMP         READO5          < OUI, ALLONS VOIR LE MOT PRECEDENT...
READO8:  EQU         $
         LRM         A,B,X
         WORD        IGRAPH
         WORD        BUF
         WORD        LGRAPH
         MOVE                        < MISE EN PLACE DES DONNEES D'INITIA-
                                     < LISATION DU GRAPHWARE...
         JMP         READO2          < ET C'EST TOUT...
READO6:  EQU         $
         LAI         LGRAPH*NOCMO    < RESTAURE 'A'...
<
< DETECTION DES DEMANDES DE
< PASSAGE EN GRAPHIQUE (PAR
< 4 FOIS LE CODE 'IBUF' A LA
< SUITE ET NON A CHEVAL SUR
< 2 BUFFERS) :
<
READO4:  EQU         $
         PSR         A,X
         SLRS        NOCMO=K
         ADCR        A
         LR          A,X             < (X)=NOMBRE DE MOTS PAR EXCES.
READOA:  EQU         $
         ADRI        -I,X            < PASSAGE AU MOT PRECEDENT,
         CPZR        X               < S'IL EXISTE...
         JL          READOB          < NON, FINI...
         LA          &ABUFX          < (A)=MOT COURANT :
         CPI         IBUF            < EST-CE LE CODE GRAPHIQUE ???
         JNE         READOA          < NON, PASSAGE AU MOT SUIVANT...
         ADRI        -I,X            < PEUT-ETRE, PASSAGE AU MOT PRECEDENT,
         CPZR        X               < S'IL EXISTE...
         JL          READOB          < NON, FINI...
         LA          &ABUFX          < (A)=MOT COURANT :
         CPI         IBUF            < EST-CE LE CODE GRAPHIQUE ???
         JNE         READOA          < NON, PASSAGE AU MOT SUIVANT...
         ADRI        -I,X            < PEUT-ETRE, PASSAGE AU MOT PRECEDENT,
         CPZR        X               < S'IL EXISTE...
         JL          READOB          < NON, FINI...
         LA          &ABUFX          < (A)=MOT COURANT :
         CPI         IBUF            < EST-CE LE CODE GRAPHIQUE ???
         JNE         READOA          < NON, PASSAGE AU MOT SUIVANT...
         ADRI        -I,X            < PEUT-ETRE, PASSAGE AU MOT PRECEDENT,
         CPZR        X               < S'IL EXISTE...
         JL          READOB          < NON, FINI...
         LA          &ABUFX          < (A)=MOT COURANT :
         CPI         IBUF            < EST-CE LE CODE GRAPHIQUE ???
         JNE         READOA          < NON, PASSAGE AU MOT SUIVANT...
         PSR         B,X             < OUI :
         LAD         &ABUFX
         LR          A,B             < (B)=ADRESSE DE LA ZONE RECEPTRICE
                                     <     DANS LE BUFFER ARGUMENT,
         LAD         IGRAPH          < (A)=ADRESSE DE LA LISTE DES CODES
                                     <     DE PASSAGE EN GRAPHIQUE DU
                                     <     GRAPHWARE...
         LXI         LGRAPH          < (X)=NOMBRE DE MOTS A TRANSFERER...
         MOVE                        < MISE DES COMMANDES DANS LE BUFFER...
         PLR         B,X
         JMP         READOA          < ET POURSUIVONS L'EXPLORATION ARRIERE
                                     < DU BUFFER...
<
< PREPARATION DE L'ECLATEMENT DU BUFFER :
<
READOB:  EQU         $
         PLR         A,X
         SLLS        NOCMO=K         < ET ON DOUBLE, CAR ON VA ECLATER UN
                                     < MOT DANS 2...
         STA         DEMPER+DEM2
         TBT         NBITMO-I-I      < LE NOMBRE D'OCTETS INITIAL ETAIT-IL
                                     < IMPAIR ???
         JNC         READO9          < NON, PAIR...
         ADRI        I*NOCMO,A       < OUI, IMPAIR, ON CALCULE LE NOMBRE DE
                                     < MOTS CONTENANT LE NOMBRE IMPAIR D'OCTETS.
READO9:  EQU         $
         LR          A,X             < (X)=NOMBRE D'OCTETS A ECHANGER APRES
                                     < ECLATEMENT...
         BSR         ASPMET          < ET BIEN SUR, IL FAUT REAJUSTER L'OCCU-
                                     < PATION MEMOIRE...
         SLRS        NOCMO*NOCMO=K
         LR          A,X             < (X)=NOMBRE DE MOTS A ECLATER...
<
< BOUCLE D'ECLATEMENT :
<
READO1:  EQU         $
         ADRI        -I,X            < DECOMPTAGE...
         CPZR        X               < EST-CE FINI ???
         JL          READO2          < ET OUI...
         LA          &ABUFX          < ET NON, (A)=MOT COURANT,
         PSR         X
         ADR         X,X             < (X)=INDEX D'ECLATEMENT,
         SLRD        NBITOC          < (A)=OCTET GAUCHE,
         EORI        MOCD            < QUE L'ON INVERSE,
         STA         &ABUFX          < ET QUE L'ON MET DANS LE BUFFER.
         ADRI        I,X             < PROGRESSION DE L'INDEX,
         LAI         K               < CLEAR,
         SLLD        NBITOC          < (A)=OCTET DROIT,
         EORI        MOCD            < QUE L'ON INVERSE,
         STA         &ABUFX          < ET QUE L'ON MET DANS LE BUFFER...
         PLR         X
         JMP         READO1          < AU MOT PRECEDENT...
<
< SORTIE :
<
READO2:  EQU         $
         RSR
         PAGE
<
<
<        B A N D E S   M A G N E T I Q U E S  :
<
<
SPMT:    EQU         $
<
<
<        C L O S E   A S S I G N A T I O N  :
<
<
SPMT1:   EQU         $
         BSR         ASERV           < ON REMBOBINE...
         STZ         DEMPER+DEM3     < ON RAZE LE NUMERO DE BLOC COURANT...
         BSR         APCLOS          < ET ON CLOSE L'ASSIGNATION...
         RSR
<
<
<        R E M B O B I N A G E  :
<
<
SPMT2:   EQU         $
         BSR         ASERV           < EXECUTION,
         STZ         DEMPER+DEM3     < ET RAZ DU NUMERO DU BLOC COURANT...
         RSR
<
<
<        T A P E - M A R K  :
<
<
SPMT3:   EQU         SERV
<
<
<        S A U T   A R R I E R E   U N   B L O C  :
<
<
SPMT5:   EQU         $
         DC          DEMPER+DEM3
         RSR
<
<
<        S A U T   A V A N T   U N   B L O C  :
<
<
SPMT6:   EQU         $
         IC          DEMPER+DEM3
         RSR
<
<
<        L E C T U R E  :
<
<
SPMTC:   EQU         $
         LA          DEMPER+DEM2
         TBT         NBITMO-I        < EST-CE IMPAIR ???
         JNC         SPMTC1          < NON, OK...
         ADCR        A               < OUI, IL FAUT UN NOMBRE ENTIER DE MOTS...
         STA         DEMPER+DEM2
SPMTC1:  EQU         $
         BSR         ASPMEM          < AJUSTEMENT MEMOIRE,
         LAD         DEMPER
         BSR         AEXEC           < EXECUTION DE LA LECTURE,
         BSR         ACODAR
         BSR         AWCDA           < TRANSFERT DU BUFFER...
         BR          ATESMT          < VERS LA MISE A JOUR DU NUMERO DE
                                     < BLOC COURANT...
<
<
<        E C R I T U R E  :
<
<
SPMTB:   EQU         $
         LA          DEMPER+DEM2
         TBT         NBITMO-I        < EST-CE IMPAIR ???
         JNC         SPMTB1          < NON, OK...
         ADCR        A               < OUI, IL FAUT UN NOMBRE ENTIER DE MOTS...
         STA         DEMPER+DEM2
SPMTB1:  EQU         $
         BR          AWRITR          < VERS L'ECRITURE...
         PAGE
<
<
<        D I S Q U E   A M O V I B L E  :
<
<
SPDK:    EQU         $
<
<
<        P R O T E C T I O N  :
<
<
SPDK1:   EQU         VIDE
SPDK2:   EQU         VIDE
<
<
<        L E C T U R E  :
<
<
SPDK5:   EQU         $
         BSR         AREAD
         CPZ         ETATSV          < COMMENT CELA S'EST-IL PASSE ???
         JE          SPDK5A          < BIEN, ET VOUS MEME...
         LAI         M16-ZERO        < MAL,
         BSR         APRINT          < ON LE DIT,
         QUIT        1               < PUIS ON ATTEND,
         JMP         SPDK5           < ET ENFIN, ON ITERE...
SPDK5A:  EQU         $
         BSR         ACODAR
         RSR
<
<
<        E C R I T U R E  :
<
<
SPDK4:   EQU         WRITER
<
<
<        M O U V E M E N T   D E S   T E T E S  :
<
<
SPDK3:   EQU         VIDE
         PAGE
<
<
<        P R E P A R A T I O N   D E   ' D E M P E R '
<        P O U R   L E S   A C C E S   I M A G E S  :
<
<
<        ARGUMENT :
<                    (A)=PERMET LA SELECTION D'UN PROCESSEUR DE COULEUR.
<
<
IMA2:    EQU         $
         STA         DEMPER+DEM3     < MISE A JOUR DE LA SELECTION COULEUR,
         LA          DEMPER+DEM1
         AD          DEMPER+DEM2
         STA         DEMPER+DEM1     < PROGRESSION DE L'ADRESSE DU BUFFER,
         LAD         DEMPER
         BSR         AEXEC           < ET ON RECUPERE UNE COMPOSANTE...
         RSR
         PAGE
<
<
<        T R A N S F E R T   G L O B A L
<        ' T V M E M '   -->   ' S I M U L '  :
<
<
IMA1:    EQU         $
         PSR         A
         LA          ABUF2
         STA         DEMPER+DEM1     < INITIALISATION DE L'ADRESSE BUFFER,
         LA          ALIMAG
         STA         DEMPER+DEM2     < INITIALISATION DE LA LONGEUR DE
                                     < L'ECHANGE,
         LAI         XIN)XPR
         STA         DEMPER+DEM3     < ET MISE EN LECTURE SUR LE ROUGE...
         LAD         DEMPER
         BSR         AEXEC           < LECTURE DU ROUGE,
         LAI         XIN)XPV
         BSR         AIMA2           < LECTURE DU VERT,
         LAI         XIN)XPB
         BSR         AIMA2           < LECTURE DU BLEU.
         PLR         A
         RSR
         PAGE
<
<
<        V A L I D A T I O N   ( I O C B 2 )   E T   ( I O C B 5 )  :
<
<
<        RESULTAT :
<                    (X)=NOMBRE D'OCTETS A DEPLACER.
<
<
IMA3:    EQU         $
         LA          XCDA+XIOCB+IOCB5
         JAL         IMA33           < ERREUR...
         STA         BTRANS          < POUR TRANSLATER LA ZONE DEPLACEE.
         LX          XCDA+XIOCB+IOCB2
         CPZR        X
         JLE         IMA34           < ERREUR...
         SLLS        NOCMO=K         < CONVERSION DE LA TRANSLATION EN OCTETS,
         SB          ALIMA3
         NGR         A,A             < (A)=LONGUEUR MAX DEPLACABLE,
         JAG         IMA32           < (IOCB5) EST CORRECT...
IMA33:   EQU         $
ERIMAG:: VAL         ERINEX+I        < ERREUR 'IOCB5' OU 'IOCB2' MAUVAIS...
         LAI         ERIMAG
         STA         ETATSV          < QUE L'ON TRANSMET...
         JMP         IMA31           < ET ON SORT...
IMA32:   EQU         $
         CPR         A,X             < VALIDATION DE (X)=(IOCB2) :
         JLE         IMA31           < OK, INFERIEUR A CE QUI EST DISPONIBLE...
IMA34:   EQU         $
         LAI         ERIMAG
         STA         ETATSV          < ON TRANSMET L'ERREUR...
IMA31:   EQU         $
         CPZ         ETATSV          < TEST DES CONDITIONS DE RETOUR, AFIN DE
                                     < SAUTER EVENTUELLEMENT SAUTER CE QUI
                                     < SUIT...
         RSR
         PAGE
<
<
<        T R A N S F E R T   ' T V M E M '   -->   ' B O S '  :
<
<
SPIM1:   EQU         $
         LX          ALIMA3
         BSR         ASPMEM          < AJUSTEMENT MEMOIRE POUR UNE IMAGE 12K...
         BSR         AIMA1           < TRANSFERT : 'TVMEM' --> 'SIMUL',
         BSR         AIMA3           < TRAITEMENT DE (IOCB2) ET (IOCB5)...
         JNE         SPIM11          < ERREUR, ON SORT...
         BSR         AWCDA           < TRANSFERT : 'SIMUL' --> 'BOS' D'UN
                                     < MORCEAU D'IMAGE DONT L'ADRESSE RELATIVE
                                     < A L'IMAGE EST (IOCB5), ET LA LONGUEUR
                                     < EN OCTETS (IOCB2)...
SPIM11:  EQU         $
         STZ         BTRANS
         RSR
<
<
<        T R A N S F E R T   ' B O S '   -->   ' T V M E M '  :
<
<
SPIM2:   EQU         $
         LX          ALIMA3
         BSR         ASPMEM          < AJUSTEMENT MEMOIRE POUR UNE IMAGE 12K...
         BSR         AIMA1           < TRANSFERT : 'TVMEM' --> 'SIMUL',
         BSR         AIMA3           < TRAITEMENT DE (IOCB2) ET (IOCB5)...
         JNE         SPIM21          < ERREUR, ON SORT...
         BSR         ARCDA           < TRANSFERT : 'BOS' --> 'SIMUL' D'UN
                                     < MORCEAU D'IMAGE DONT L'ADRESSE RELATIVE
                                     < A L'IMAGE EST (IOCB5), ET LA LONGUEUR
                                     < EN OCTETS (IOCB2)...
         LAI         0
SPIM22:  EQU         $
         AD          ABUF2
         STA         DEMPER+DEM1     < INITIALISATION DE L'ADRESSE DU BUFFER,
         LA          ALIMA3
         STA         DEMPER+DEM2     < ET DE LA LONGUEUR,
         LAI         XOUT
         STA         DEMPER+DEM3     < ET ENFIN DU MODE 'OUT'...
         LAD         DEMPER
         BSR         AEXEC           < TRANSFERT GLOBAL EN MODE ENTRELACE :
                                     < 'SIMUL' --> 'TVMEM'...
SPIM21:  EQU         $
         STZ         BTRANS
         RSR
<
<
<        T R A N S F E R T   B U F F E R   -->   ' T V M E M '  :
<
<
SPIMS:   EQU         $               < ENTRY POUR LE 'SGN'...
         LAI         DELTA*NOCMO     < POUR TRANSLATER LE BUFFER.
         JMP         SPIM22
         PAGE
<
<
<        M I S E - A - J O U R   D E   L A   ' D E M P E R '
<        D U   P S E U D O - C O N T E X T E   ' S G N '  :
<
<
<        FONCTION :
<                      LE PSEUDO-CONTEXTE 'SGN'
<                    DONNE DES CORRESPONDANCES
<                    FONCTIONS 'BOS' --> 'NVP' DE 'CMS5',
<                    (ET NON PAS DES FONCTIONS DE
<                    'CMS5') ; CE MODULE RETABLIT DONC
<                    UN MAUVAIS PLACEMENT FAIT PAR
<                    LA "RACINE" DE "SIMUL"...
<                      ENFIN, IL POSITIONNE LE 'DEM3'
<                    AVEC UN 'DELTA' EGAL A LA LONGUEUR
<                    MAX DES NOMS 'SGN', ET 'DEM2' AVEC
<                    LA LONGUEUR DEMANDEE, PLUS CE 'DELTA'...
<
<
<        RESULTAT :
<                    (X)='DEM2' MODIFIE.
<
<
SGN1:    EQU         $
         PSR         A
         LA          DEMPER          < LE 'NVP' EST MAL CADRE A DROITE,
         SLLS        MOCG=K          < ON LE CADRE A GAUCHE,
         ORI         FONSGN          < ET ON Y CONCATENE LA FONCTION 'SGN',
         STA         DEMPER          < ET C'EST TOUT POUR LE MOT0...
         LAI         DELTA*NOCMO
         STA         DEMPER+DEM3     < MISE EN PLACE DU 'DELTA' DU 'SGN'...
         AD          DEMPER+DEM2
         STA         DEMPER+DEM2     < ET TRANSLATION DE 'DEM2'...
         LR          A,X             < (X)='DEM2' MODIFIE POUR 'SPMEM'...
         PLR         A
         RSR
         PAGE
<
<
<        M O U V E M E N T  :  B U F F E R  -->  N O M  :
<
<
<        FONCTION :
<                      CE MODULE TRANSFERT LE BUFFER
<                    VERS LE NOM 'SGN' COURANT, ET CE
<                    JUSQU'A CONCURRENCE DE 'LSGN'
<                    CARACTERES, OU DU PREMIER 'EOT'
<                    RENCONTRE ; ENFIN, LE NOM COURANT
<                    EST RAZE AVANT TOUT...
<
<
SGN2:    EQU         $
         PSR         A,X,Y
         LXI         LSGN/NOCMO
SGN21:   EQU         $
         STZ         &ANOMS1         < CLEAR DU NOM COURANT.
         JDX         SGN21
         LA          DEMPER+DEM2     < (A)=LONGUEUR COURANTE DEMANDEE :
         CPI         LSGN            < EN FAIT, ON PREND LE
         JLE         SGN22           < MIN(LSGN,(DEMPER+DEM2))...
         LAI         LSGN
SGN22:   EQU         $
         LR          A,Y             < (Y)=NOMBRE DE CARACTERES A DEPLACER,
         LXI         0               < (X)=INDEX DE DEPLACEMENT.
SGN23:   EQU         $
         LBY         &ABUFX          < DEPLACEMENT DE TOUT CARACTERE (D'AILLEURS
                                     < SANS TESTS DU TYPE 'NULL' : CE N'EST PAS
                                     < GRAVE CAR ULTERIEUREMENT, LE 'SGN' REN-
                                     < VERRA UN CODE D'ERREUR...).
         STBY        &ANOMS0
         ADRI        I,X             < (X)=NOMBRE DE CARACTERES DEPLACES A CE
                                     <     NIVEAU.
         CPI         EOT             < EST-CE UNE FIN DE NOM ???
         JE          SGN24           < OUI, ON ARRETE ICI...
         ADRI        -I,Y            < NON, ON DECOMPTE LES CARACTERES DEPLACES,
         CPZR        Y               < ALORS ???
         JG          SGN23           < IL EN RESTE...
SGN24:   EQU         $
         STX         ETAT            < ON MET DANS 'ETAT' LE NOMBRE DE CARACTERE
                                     < DU NOM COURANT (Y COMPRIS OU PAS LE
                                     < CARACTERE DE FIN ; A NOTER QUE S'IL
                                     < N'EST PAS COMPTE, IL EXISTE QUAND MEME
                                     < EN BOUT DE BUFFER PAR INITIALISATION).
         PLR         A,X,Y
         RSR
         PAGE
<
<
<        M O U V E M E N T   :   N O M  -->  B U F F E R  :
<
<
<        FONCTION :
<                      CE MODULE RENVOIE LE NOM
<                    COURANT 'SGN' DANS LE BUFFER,
<                    ET CE A CONCURRENECE DE 'LSGN'
<                    CARACTERES, OU DU PREMIER 'EOT'
<                    RENCONTRE...
<                      ON S'ARRETE AUSSI SUR LE PREMIER
<                    'NULL' RENCONTRE, CE QUI PERMET DE
<                    RENVOYER (ETAT)=0 SI LE NOM COURANT
<                    N'EXISTE PAS...
<
<
SGN3:    EQU         $
         PSR         A,X,Y
         LXI         DELTA
SGN35:   EQU         $
         STZ         &ABUFX1         < ON CLEAR LE DEBUT DU BUFFER...
         JDX         SGN35
         LA          DEMPER+DEM2     < (A)=NOMBRE DE CARACTERES DEMANDES :
         CPI         LSGN            < ON PREND EN FAIT :
         JLE         SGN32           < MIN(LSGN,(DEMPER+DEM2))...
         LAI         LSGN
SGN32:   EQU         $
         LR          A,Y             < (Y)=NOMBRE DE CARACTERES MAX A DEPLACER,
         LXI         0               < (X)=INDEX DE DEPLACEMENT...
SGN33:   EQU         $
         LBY         &ANOMS0         < DEPLACEMENT DU NOM...
         STBY        &ABUFX
         JAE         SGN34           < ON S'ARRETE SUR LE PREMIER 'NULL'
                                     < SANS INCREMENTER 'X', CE QUI FAIT QUE
                                     < (ETAT)=0 SI LE NOM COURANT N'EXISTE
                                     < PAS...
         ADRI        I,X             < (X)=NOMBRE D'OCTETS DEPLACES A CE NIVEAU,
         CPI         EOT             < EST-CE UN FIN DE NOM ???
         JE          SGN34           < OUI, ON ARRETE LA...
         ADRI        -I,Y            < NON, AU SUIVANT,
         CPZR        Y               < S'IL EXISTE ???
         JG          SGN33           < OUI...
SGN34:   EQU         $
         STX         ETAT            < ON RENVOIE PAR 'ETAT' LE NOMBRE DE
                                     < CARACTERES DEPLACES (Y COMPRIS OU
                                     < PAS 'EOT'...).
         PLR         A,X,Y
         RSR
         PAGE
<
<
<        R E C H E R C H E   ' N X P ' / ' N X S '  :
<
<
<        ARGUMENT :
<                    (A)='NVP' A ENVOYER AU 'SGN',
<                    (X)=INDEX COURANT DU NOM.
<
<
<        RESULTAT :
<                    (A)=CONDITIONS DE RETOUR.
<
<
SGN4:    EQU         $
         CPZR        X               < OU EST L'INDEX DU NOM COURANT ???
         JGE         SGN41           < OK...
         PSR         A
         LXI         0               < ON REINITIALISE LE PARCOURS...
         LAI         EOT
         STBY        &ABUFX
         PLR         A
SGN41:   EQU         $
         STBY        DEMPER          < MISE EN PLACE DU 'NVP',
         LR          X,A
         ADRI        I,A
         STA         DEMPER+DEM2     < MISE EN PLACE DE LA LONGUEUR COURANTE...
DELTAF:: VAL         -1
         LAI         DELTAF
         STA         DEMPER+DEM3     < POUR LE 'NEXT', LE 'DELTA' DOIT ETRE
                                     < INFERIEUR A LA LONGUEUR VALEUR+NOM...
         LAD         DEMPER
         BSR         AEXEC           < RECHERCHE DU SUIVANT SERIE/PARALLELE,
         LA          ETATSV          < (A)=CONDITION DE RETOUR...
         RSR
         PAGE
<
<
<        A C C E S   A   L A   ' B O X '   D U   ' S G N '  :
<
<
SGN5:    EQU         $
         PSR         A
         LA          DEMPER+DEM2
         ADRI        -DELTA*NOCMO,A  < ON ENLEVE LE NOM DE LA VALEUR...
         STA         DEMPER+DEM2
         BSR         AGBOX           < ET RECUPERATION DE LA 'BOX'...
         PLR         A
         RSR
         PAGE
<
<
<        S T O R E   N O M   C O U R A N T  :
<
<
SPSGN4:  EQU         $
         BSR         ASPMEM          < AJUSTEMENT MEMOIRE,
         BSR         ARCDA           < TRANSFERT : CDA --> BUFFER,
         BSR         ASGN2           < PUIS : BUFFER --> NOM...
         RSR
<
<
<        L O A D   N O M   C O U R A N T  :
<
<
SPSGN5:  EQU         $
         BSR         ASPMEM          < AJUSTEMENT MEMOIRE,
         BSR         ASGN3           < TRANSFERT : NOM --> BUFFER,
         BSR         AWCDA           < PUIS : BUFFER --> CDA...
         RSR
<
<
<        D E L E T E   N O M   C O U R A N T  :
<
<
SPSGN6:  EQU         $
         STZ         &RAZNOM         < ET C'EST TOUT...
         RSR
<
<
<        A C C E S   A U   N O M   S U I V A N T  :
<
<
SPSGN7:  EQU         $
         BSR         ASGN1           < MISE A JOUR DE 'DEMPER', BIEN QUE LE
                                     < 'NVP' NE SOIT QUE PROVISOIRE PUISQU'ON
                                     < VA BASCULER ENTRE 'NXP' ET 'NXS'...
         LXI         DELTA*NOCMO+1
         BSR         ASPMEM          < AJUSTEMENT MEMOIRE SUR LE PLUS LONG NOM
                                     < POSSIBLE...
         BSR         ASGN3           < TRANSFERT : NOM --> BUFFER.
<
< CALCUL DE LA LONGUEUR DU NOM COURANT :
<
         LXI         0               < INITIALISATION DE L'INDEX.
         STX         XRAC            < "A PARTIR DE"=0...
SGN701:  EQU         $
         LBY         &ABUFX          < ACCES UN CARACTERE DE LA RACINE.
         CPI         EOT             < EST-CE L'EOT ???
         JE          SGN702          < OUI.
         ADRI        I,X             < NON PROGRESSION INDEX.
         JMP         SGN701          < ACCES CARACTERE SUIVANT.
SGN702:  EQU         $
         STX         SXRAC           < SAVE LA VALEUR DU X INITIAL.
         JMP         SGN706          < ON DEMARRE SUR LE NEXT-PARALLELE...
<
< BOUCLE DE RECUPERATION DES CARACTERES :
<
SGN704:  EQU         $
         LAI         FONNXS
         BSR         ASGN4           < DEMANDE DE NEXT-SERIE.
         CPI         5               < TEST DU CODE D'ERREUR.
         JE          SGN707          < IL N'Y A PAS DE NEXT SERIE ...
         JAE         SGN705          < OK , LE NEXT-SERIE EXISTE.
         LR          X,A
         CP          XRAC            < EST-ON DE RETOUR SUR LA RACINE ???
         JL          SGN710          < OUI, ON ARRETE LA RECHERCHE (ETATSV)=0...
         ADRI        -I,X            < DANS LES AUTRES CAS D'ERREURS ,
                                     < ON FAIT UN RETOUR ARRIERE , CAR
                                     < EN EFFET ON NE DOIT PLUS SAVOIR
                                     < OU L'ON EN EST SUITE A UN
                                     < DELETE SIMULTANE ...
         JMP         SGN704          < N'ETANT PAS DE RETOUR SUR
                                     < LA RACINE , ON CONTINUE.
<
< CAS OU IL Y A UN NEXT-SERIE :
<
SGN705:  EQU         $
         LR          X,A
         CP          LMAX            < EST-CE LE MAX ???
         JGE         SGN711          < OUI, ON ARRETE LA RECHERCHE (ETATSV)=0...
         ADRI        I,X
         LBY         &ABUFX          < RECUPERATION DE CE NEXT-SERIE.
         CPI         EOT             < EST-CE UNE FIN DE NOM ???
         JNE         SGN704          < NON , ON CONTINUE A RECUPERER.
SGN711:  EQU         $
         ADRI        I,X             < POUR PASSER DE LA LONGUEUR A L'INDEX...
         STX         ETAT            < AFIN DE RENVOYER LA LONGUEUR DU NOM
                                     < SUIVANT...
         IC          DEMPER+DEM2     < POUR AVOIR 'EOT' DE FIN DE CHAINE...
         BSR         ASGN2           < TRANSFERT : BUFFER --> NOM...
<
< FIN DE LA RECHERCHE :
<
SGN710:  EQU         $
         RSR                         < AU RETOUR, (ETATSV) EST NUL SI LE NOM
                                     < SUIVANT A ETE TROUVE OU SI LA LONGUEUR
                                     < MAX A ETE ATTEINTE...
<
< RECHERCHE DU NEXT-PARALLELE :
<
SGN706:  EQU         $
SGN707:  EQU         SGN706          < ENTRY DE 1ERE RECHERCHE NEXT-
                                     < SERIE (CF. RACINE D'UN CATALOGUE)
         LAI         FONNXP
         BSR         ASGN4           < RECHERCHE NEXT-PARALLELE.
         CPI         5               < TEST DU CODE D'ERREUR.
         JE          SGN709          < CAS DU NEXT-PARALLELE QUI
                                     < N'EXISTE PAS ...
         JANE        SGN704          < AUTRES CAS DU SUREMENT A UN
                                     < DELETE SIMULTANE QUI DESORIENTE!!!
<
< CAS OU IL Y A UN NEXT-PARALLELE :
<
SGN708:  EQU         $
         ADRI        I,X
         LBY         &ABUFX          < RECUPERATION DE CELUI-CI.
         ADRI        -I,X
         STBY        &ABUFX          < ET ON LE MET A SA BONNE PLACE.
         JMP         SGN704          < ET RETOUR A LA BOUCLE DE
                                     < RECUPERATION.
<
< CAS OU IL N'Y A PAS DE NEXT-PARALLELE :
<
SGN709:  EQU         $
         ADRI        -I,X            < RETOU ARRIERE DANS LE NOM.
         LR          X,A             < POUR VALIDATION.
         CP          XRAC            < EST-ON DE RETOUR SUR LA RACINE ???
         JGE         SGN706          < NON , ON CONTINUE ...
         JMP         SGN710          < ON SORT, A NOTER QUE (ETATSV)#0...
         PAGE
<
<
<        S T O R E   V A L E U R   ' S G N '  :
<
<
SPSGN1:  EQU         $
         BSR         ASGN1           < MISE A JOUR DE LA DEMANDE 'DEMPER',
         BSR         ASPMEM          < AJUSTEMENT MEMOIRE,
         BSR         ASGN3           < DEPLACEMENT : NOM --> BUFFER,
         LAI         DELTA
         STA         BTRANS          < AFIN DE TRANSLATER LA VALEUR DANS LE
                                     < BUFFER.
         BSR         ARCDA           < DEPLACEMENT : CDA --> BUFFER (VALEUR),
         STZ         BTRANS
         LAD         DEMPER
         BSR         AEXEC           < EXECUTION DU 'STN'...
<
< RETOUR DE LA LONGUEUR REELLE :
<
SGN220:  EQU         $
         LA          DEMPER+DEM2
         ADRI        -DELTA*NOCMO,A
         STA         ETAT            < AFIN DE RENVOYER LA LONGUEUR DE LA
                                     < VALEUR...
<
< RETOUR DU 'SGN' :
<
SGN221:  EQU         $
         RSR
<
<
<        L O A D   V A L E U R   ' S G N '  :
<
<
SPSGN2:  EQU         $
         BSR         ASGN1           < MISE A JOUR DE LA DEMANDE 'DEMPER',
         BSR         ASPMEM          < AJUSTEMENT MEMOIRE,
         BSR         ASGN3           < DEPLACEMENT : NOM --> BUFFER,
         LAD         DEMPER
         BSR         AEXEC           < EXECUTION DU 'STN'...
         JNE         SGN201          < ERREUR D'EXECUTION...
         BSR         ASGN5           < RECUPERATION DE LA TAILLE REELEMENT
                                     < CHARGEE,
         LAI         DELTA
         STA         BTRANS          < TRANSLATION DU BUFFER...
         LX          DEMPER+DEM2     < (X)=NOMBRE D'OCTETS RECUPERES...
         BSR         AWCDA           < DEPLACEMENT : BUFFER --> CDA (VALEUR).
         STZ         BTRANS
SGN201:  EQU         $
         JMP         SGN221          < VERS LE RETOUR DU 'SGN'...
<
<
<        D E L E T E   V A L E U R   ' S G N '  :
<
<
SPSGN3:  EQU         $
         BSR         ASGN1           < MISE A JOUR DE LA DEMANDE 'DEMPER',
         BSR         ASPMEM          < AJUSTEMENT MEMOIRE,
         BSR         ASGN3           < DEPLACEMENT : NOM --> BUFFER,
         LAI         DELTAF
         STA         DEMPER+DEM3     < POUR LE 'DELETE', LE 'DELTA' DOIT ETRE
                                     < INFERIEUR A LA LONGUEUR VALEUR+NOM...
         LAD         DEMPER
         BSR         AEXEC           < EXECUTION DU 'DLN'...
         BSR         ASGN5           < CA PEUT TOUJOURS SERVIR...
         JMP         SGN221          < VERS LE RETOUR DU 'SGN'...
         PAGE
<
<
<        S T O R E   I M A G E   C O U R A N T E  :
<
<
SPSGN8:  EQU         $
         STZ         XCDA+XIOCB+IOCB5 < AFIN D'ASSURER UN
         LA          ALIMA3
         STA         XCDA+XIOCB+IOCB2 <  FONCTIONNEMENT CORRECT DE 'IMA3'...
         PSR         W
         LRM         W
         WORD        CIMAGE          < (W)=ADRESSE DU CONTEXTE IMAGE...
         BSR         ASPIM1          < TRANSFERT : 'MEMTV' --> 'CDA',
         PLR         W               < (W)=ADRESSE DU CONTEXTE 'SGN'...
         CPZ         ETATSV          < CELA S'EST-IL BIEN PASSE ???
         JNE         SGN230          < NON, ON ABANDONNE...
         LX          ALIMA3          < OUI, ON CONTINUE, ON FAIT :
         STX         DEMPER+DEM2     < (X)=(DEM2)=LONGUEUR D'UNE IMAGE 12K...
         BSR         APSGN1          < ET ON LA STORE 'SGN'...
SGN230:  EQU         $
         RSR
<
<
<        V I S U A L I S A T I O N   V A L E U R   C O U R A N T E  :
<
<
SPSGN9:  EQU         $
         LX          ALIMA3
         STX         DEMPER+DEM2     < (X)=(DEM2)=LONGUEUR D'UNE IMAGE 12K...
         BSR         APSGN2          < ACCES A LA VALEUR DU NOM COURANT,
         CPZ         ETATSV          < CELA S'EST-IL BIEN PASSE ???
         JNE         SGN231          < NON, ON ABANDONNE...
         LA          ETAT
         CP          ALIMA3          < EST-CE UNE IMAGE 12K ???
         JNE         SGN232          < NON, ERREUR...
         PSR         W
         LRM         W
         WORD        CIMAGE          < (W)=ADRESSE DU CONTEXTE IMAGE...
         BSR         ASPIM2          < OUI, TRANSFERT : 'CDA' --> 'MEMTV'...
         PLR         W               < (W)=ADRESSE DU CONTEXTE 'SGN'...
SGN231:  EQU         $
         RSR
SGN232:  EQU         $
ERIM12:: VAL         ERIMAG+'10
         LAI         ERIM12
         STA         ETATSV          < ON RENVOIE UN CODE D'ERREUR...
         JMP         SGN231          < ET ON SORT...
         PAGE
<
<
<        ' N O P '  :
<
<
SPNOP:   EQU         $
         RSR
         PAGE
<
<
<        M O D U L E S   A B S E N T S  :
<
<
SPVI3:   EQU         $
SPVI4:   EQU         $
SPMT4:   EQU         $
SPMT7:   EQU         $
SPMT8:   EQU         $
SPMT9:   EQU         $
SPMTA:   EQU         $
         LAI         M7-ZERO
         BSR         APRINT
         QUIT        1
         RSR
         PAGE
<
<
<        B U F F E R   D ' E N T R E E S - S O R T I E S  :
<
<
BUF:     EQU         $               < ADRESSE-MOTS DU BUFFER.
XWOR%1:  VAL         BUF-ZERO*NOCMO
BUF2:    EQU         ZERO+XWOR%1     < ET EN ADRESSE-OCTETS...
XWOR%1:  VAL         BUF+VISSEG-ZERO*NOCMO
BUFVIS:  EQU         ZERO+XWOR%1
XWOR%1:  VAL         BUF+TVSEG-ZERO*NOCMO
BUFTV:   EQU         ZERO+XWOR%1
NOM:     EQU         BUF             < NOM D'UNE IMAGE DE TV.
XWOR%1:  VAL         NOM-ZERO*NOCMO
NOM2:    EQU         ZERO+XWOR%1     < ADRESSE-OCTET DU NOM,
IMAGE:   EQU         NOM+LNOM        < ET IMAGE PROPREMENT DIT...
XWOR%1:  VAL         IMAGE-ZERO*NOCMO
IMAGE2:  EQU         ZERO+XWOR%1     < ADRESSE-OCTET DE L'IMAGE...
         END



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.