PAGE
         EOT         #SIP DEFINITION CMS5#
         IF          ORDI-"T",XWOR5,,XWOR5
         IDP         "TASK - VERSION T1600 SOUS CMS4"
XWOR5:   VAL         0
         IF          ORDI-"S",XWOR5,,XWOR5
         IDP         "TASK - VERSION SOLAR SOUS CMS5"
XWOR5:   VAL         0
         IF          ORDI-"S",XWOR5,,XWOR5
SVCM1:   VAL         '01             < CODE DU 'SVC' MAITRE PERMETTANT LE
                                     < RELEASE D'UN SEMAPHORE.
XWOR5:   VAL         0
<
<
<        L O C A L  :
<
<
         TABLE
ZERO:    EQU         $
         DZS         'C
<
< INTERFACE DE '!CALL' :
<
NTASK:   ASCI        "TASK"          < NOM DU MODULE GENERE.
         BYTE        '04;'D0
         WORD        SIZE            < NOMBRE D'OCTETS NECESSAIRES.
ADEBUT:  WORD        DEBUT
         WORD        TASK            < ENTRY POINT DU MODULE.
         PROG
DEBUT:   EQU         $
         LRP         L
         BR          -1,L            < ENTRY DANS LE MODULE.
XDEBUT:  VAL         $-ADEBUT
         DZS         DEBUT-ZERO-XDEBUT
         JMP         DEBUT           < TOUT CECI POUR LA RAISON SUI-
                                     < VANTE : LORSQU'ON ARRIVE DE
                                     < !CALL, ON A : PRESC='10, ET SI
                                     < ON EFFECTUE UN ALT-MODE, ON
                                     < TOMBE SUR LE MOT ADEBUT, ASSIMILE
                                     < A UN 'JMP', QUI NOUS FERA
                                     < RETOMBER GRACE AU DZS QUI
                                     < PRECEDE SUR LE DEBUT DU PROGRAMM.
<
< LOCAL PROPREMENT DIT :
<
         LOCAL
LOC:     EQU         $
<
< MESSAGES DIVERS :
<
MERR:    BYTE        3;'6D
         ASCI        "??"
MRCLF:   BYTE        2;'6D;" ";0
<
< MOT DE PASSE :
<
         NLS
MPASS:   BYTE        '03;'1D
MPASS1:  BYTE        '00;":"
         ASCI        "SYS1470975114380:JFC"
MPASS2:  BYTE        '00;'10;'04;0
MAGIC:   WORD        7               < CONSTANTE MAGIQUE...
         LST
MALT:    BYTE        '7D;'84         < POUR L'ENVOI D'UN ALT-MODE.
<
< CONSTANTES DE L'UTILISATEUR ET DE LA VISU ASSIGNEE A '0B :
<
NSPVIS:  WORD        0               < NSP DE LA VISU ASSIGNE A '0B.
ADCTVI:  WORD        0               < @DCT DE LA VISU ASSIGNEE A '0B.
NOCT:    WORD        0               < NBRE D'OCTETS ARGUMENT D'UNE
                                     < DEMANDE DE LECTURE.
ESC1:    WORD        0               < NSPESC DE CET UTILISATEUR.
NSPIN:   WORD        0               < NSPIN DE CET UTILISATEUR.
<
< MESSAGE COURANT :
<
ABUF:    WORD        0               < RELAI RELATIF MESSAGE COURANT.
ABUFA:   WORD        0               < RELAI ABSOLU MESSAGE COURANT.
XBUF:    WORD        0               < INDEX COURANT MESSAGE COURANT.
BUF:     DZS         80
         BYTE        '04;0           < PAR PRUDENCE : CAS DES MESSAGES
                                     < SANS 'EOT'.
<
< RELAIS DIVERS :
<
ASEND:   WORD        SEND            < ROUTINE MAITRE 'WRITE 1 CAR.'.
APRINT:  WORD        PRINT           < ROUTINE D'EMISSION MESSAGE.
ATASK:   WORD        TASK
<
< CONSTANTES :
<
ATIME:   WORD        0               < @DE LA DATE/HEURE DU SYSTEME.
C10:     WORD        10
C16:     WORD        16
STACK:   DZS         10              < PILE DE TRAVAIL.
<
< DEMANDES A CMS4 :
<
DEMIN:   WORD        '0101           < LECTURE ASCI AVEC ECHO.
         WORD        BUF-ZERO*2
         WORD        80
DEMOUT:  WORD        '0202           < DEMANDE D'EDITION DE MESSAGES.
         WORD        0               < @OCTET DU MESSAGE.
         WORD        0               < NBRE DE CARACTERES DU MESSAGES.
CCI:     WORD        '0001           < ACCES AU CCI.
CCINT:   WORD        '0002           < APPEL CCI NON INTERACTIF.
         WORD        BUF-ZERO*2      < SUR LE MESSAGE COURANT.
         WORD        80
SLEEP:   WORD        '0005;0;0       < DEMANDE DE TEMPORISATION.
SCH:     WORD        '0006           < DEMANDE DE RETOUR AU SCHEDULER.
         PROG
<
<
<        E M I S S I O N   M E S S A G E  :
<
<
<        ARGUMENT :
<                    A=@MOT DU MESSAGE.
<
<
PRINT:   EQU         $
         LR          A,C             < C=@MESSAGE.
         ADR         A,A
         ADRI        1,A             < A=@OCTET DU MESSAGE.
         STA         DEMOUT+1
         LBY         0,C             < A=LONGUEUR DU MESSAGE.
         STA         DEMOUT+2
         LAD         DEMOUT
         SVC         0               < EDITION DU MESSAGE.
         RSR
<
<
<        S I M U L A T I O N   E N T R E E   M E S S A G E  :
<
<
         WORD        LOC+'80
TASK:    EQU         $               < ENTRY POINT DU MODULE.
DEB:     EQU         $
         LRP         L
         LA          -1,L
         LR          A,L
         LAI         DEBUT-ZERO
         WORD        '1EB5           < PRESC(ESCLAVE)<--'DEBUT'.
         LAD         STACK-1
         LR          A,K
         LAD         CCI
         SVC         0               < RETOUR AU CCI.
                                     < (EVENTUELLEMENT SUR UNE AUTRE
                                     < VISU, AU CAS OU UN !ASSIGN B
                                     < AURAIT FAIT...)
<
< ACCES A LA DCT DE CET UTILISATEUR :
<
         WORD        '1E45           < RENVOIE : A=IDESC.
         ADRI        NSPESC,A
         SBT         0               < AFIN D'ACCEDER A DCTSY INDEXEE
                                     < PAR LE NSP DE CET UTILISATEUR.
         WORD        '1E15           < RENVOIE : B=@DCTESC.
         LR          B,A
         STA         ESC1            < SAVE @DCTESC.
         ADRI        YASSGN,A        < POUR ACCES AU NVP='01.
         WORD        '1E15           < RENVOIE : B='00,NSPIN.
         STB         NSPIN           < SAVE LE NSPIN DE CET UTILISATEUR.
<
< ACCES AU NSP DE LA VISU ASSIGNEE :
<
         ADRI        NVP/2,A         < @DE L'ENTREE DE TASSGN DE CETTE
                                     < UTILISATEUR CONTENANT LE NVP
                                     < DE LA VISU ASSIGNEE A '0B.
         WORD        '1E15           < RENVOIE : B=CE MOT.
         LR          B,A
         ANDI        'FF             < A=NVP DE LA VISU ASSIGNEE A '0B.
         JAE         DEB             < ERREUR : NVP='0! NON ASSIGNE !!!
         STA         NSPVIS
         CP          NSPIN           < SERAIT-CE UN AUTO-ASSIGN ???
         JE          DEB             < OUI, REFUSE...
         SBT         0
         WORD        '1E15           < RENVOIE : B=@DCT DE CETTE VISU.
         STB         ADCTVI          < ET SAVE @DCT VISU.
<
< PREPARATION A L'ACCES A LA DATE/HEURE :
<
         LAI         NSPDAT
         SBT         0
         WORD        '1E15           < RENVOIE : B=@LISTE DES COMPOSAN-
                                     < TES DE LA DATE/HEURE.
         STB         ATIME           < ET SAVE CETTE @.
<
<
<        E N V O I   D E S   M E S S A G E S  :
<
<
LOOP2:   EQU         $
         LAD         BUF
         SBT         0
         STA         ABUF            < ABUF RELAYE BUF A PRIORI.
         STZ         XBUF
         IC          XBUF            < XBUF=1 A PRIORI.
<
< ENTREE DU MESSAGE COURANT :
<
LOOP3:   EQU         $
         LAD         MRCLF
         BSR         APRINT          < POSITIONNEMENT EN DEBUT DE LIGNE.
         LAD         DEMIN
         SVC         0               < LECTURE AVEC ECHO SUR IN.
<
< PRE-ANALYSE DU MESSAGE :
<
<        DEFINITION DU PREMIER CARACTERE :
<                    !               CARTE CONTROLE DESTINEE AU CCI
<                                    DE LA VISU LOCALE,
<                    =               MESSAGE CONTENANT UN 'EOT' EN FIN,
<                    '1' A '9'       MESSAGE SANS 'EOT' DE LONGUEUR
<                                    DE 1 A 9 CARACTERES,
<                    *               DEMANDE DU MOT DE PASSE DYNAMIQUE,
<                    X               ENVOI D'UN ALT-MODE,
<                    /               FIN DE LA LISTE DES MESSAGES.
<
         LBY         &ABUF           < X=0 (SVC) : ACCES AU 1ER CARACTERE
         CPI         "/"             < EST-CE LA FIN DE LISTE ???
         JE          LOOPF           < OUI, FIN DE LISTE.
         CPI         "="             < EST-CE UN MESSAGE AVEC 'EOT' ???
         JE          EOT             < OK.
         CPI         "*"             < EST-CE LA DEMANDE DU MOT DE PASSE.
         JE          PPASS           < OUI, DEMANDE DU MOT DE PASSE.
         CPI         "!"             < EST-CE L'APPEL CCI LOCAL ???
         JE          CARTC           < OUI.
         CPI         "X"             < EST-CE L'ENVOI D'UN ALT-MODE ???
         JNE         COMPT           < NON.
<
< ENVOI D'UN ALT-MODE :
<
         LAD         MALT
         SBT         0
         STA         ABUF            < ABUF RELAYE LE ALT-MODE.
         DC          XBUF            < XBUF=0.
         JMP         EOT             < ET C'EST TOUT...
<
< APPEL DU CCI LOCAL :
<
CARTC:   EQU         $
         LAD         CCINT
         SVC         0               < APPEL DU CCI NON INTERACTIF.
         JNE         ERREUR
         JMP         LOOP3           < OK, MESSAGE SUIVANT...
         NLS
<
< DEMANDE DU MOT DE PASSE DYNAMIQUE :
<
PPASS:   EQU         $
         LAD         MPASS
         SBT         0
         STA         ABUF            < ABUF RELAYE LE MOT DE PASSE.
         DC          XBUF            < XBUF=0.
<
< GENERATION DYNAMIQUE DU MOT DE PASSE :
<
PASS:    EQU         $
         LA          ATIME
         ADRI        5,A             < POUR ACCEDER AUX SECONDES.
         WORD        '1E15
         LR          B,A
         ANDI        'FF             < A=NBRE DE SECONDES.
         CPI         50              < A-T'ON LE TEMPS DE L'ENVOYER ???
         JG          PASS            < NON, ON BOUCLE SUR CETTE
                                     < SEQUENCE...
         LA          ATIME           < A=@DE LA DATE/HEURE.
         ADRI        4,A             < POUR ACCEDER AUX MINUTES.
         WORD        '1E15
         LR          B,A
         ANDI        'FF             < A=NBRE DE MINUTES.
         SLRD        16              < OK, A=0 ET B=NBRE DE MINUTES.
         DV          C10
         LR          B,A             < A=CHIFFRE DES UNITES.
HZERO::  VAL         "0"
HA::     VAL         "A"
HNEUF::  VAL         "9"
M0001::  VAL         '0001
         ORI         HZERO           < ??!???!?!
         EORI        HZERO?M0001     < IGNOBLE TRUANDAGE...
         MP          MAGIC           < PERMUTATION DES BITS...
         DV          C16
         LR          B,A
         CP          C10             < CHIFFRE OU LETTRE ???
         JL          PASS9           < CHIFFRE...
         ADRI        HA-HNEUF-1,A    < LETTRE...
PASS9:   EQU         $
         ADRI        HZERO,A         < ET CONVERSION ASCI...
         STBY        MPASS1          < ET MISE DANS LE MOT DE PASSE...
         LAI         NSPUPD
         SBT         0
         WORD        '1E15
         LR          B,A
         WORD        '1E15           < (B)=NUMERO DU RELEASE COURANT.
         LAI         0
         DV          C10
         LR          B,A
         ORI         '30             < (A)=CHIFFRE DES UNITES DU NUMERO DE
         STBY        MPASS2          < RELEASE DE CMS5 MIS DANS LE MOT DE
                                     < PASSE...
         JMP         EOT             < OK, C'EST TOUT.
         LST
<
< TEST DES MESSAGES SANS 'EOT' :
<
COMPT:   EQU         $
         CPI         "1"
         JL          ERREUR          < ERREUR, NON RECONNU.
         CPI         "9"
         JG          ERREUR          < ERREUR, NON RECONNU.
         ADRI        -'30+1,A        < OK, CONVERSION BINAIRE+1.
         LR          A,X             < X INDEXE LE 1ER CARACTERE QUI
                                     < SUIT LE DERNIER CARACTERE
                                     < SIGNIFICATIF.
         LAI         '80+'04         < CODE DE L''EOT' AVEC LE BIT0
                                     < POSITIONNE A 1 AFIN QU'IL NE
                                     < SOIT PAS EMIS PAR SEND.
         STBY        &ABUF           < MISE EN FIN DE MESSAGE.
EOT:     EQU         $
<
< ATTENTE EVENTUELLE : LA VISU DOIT ETRE EN ATTENTE DE LECTURE :
<
WAIT:    EQU         $
         LAD         SCH
         SVC         0               < RETOUR AU SCHEDULER POUR NE PAS
                                     < BLOQUER LE SYSTEME.
         LA          ADCTVI          < A=@DCT VISU.
         ADRI        TETE,A          < A=TETE DE LA FILE D'ATTENTE
                                     < SUR CETTE VISU.
         WORD        '1E15           < RENVOIE : B=@DEMANDE DE TETE
                                     < SUR CETTE VISU.
         LR          B,A
         JAE         WAIT            < PAS DE DEMANDE EN ATTENTE
                                     < SUR CETTE VISU, ON ATTEND...
         LR          A,X             < SAVE X=@DEMANDE DE SERVICE.
         ADRI        OPDEM,A         < A=@DE LA FONCTION DEMANDEE
                                     < DANS LA DEMANDE DE TETE.
         WORD        '1E15           < RENVOIE : B=FONCTIOB DEMANDEE.
         LR          B,A
         ANDI        '07             < MASCAGE DU BIT 12.
         CPI         1               < S'AGIT-IL D'UNE LECTURE???
         JG          WAIT            < NON, ON CONTINUE A ATTENDRE.
<
< LA VISU ATTEND UNE LECTURE, LET'S GO...
<
         LR          X,A             < A=@DEMANDE DE SERVICE,
         ADRI        CODEM,A         < A=@DE SON CODEM.
         WORD        '1E15           < RENVOIE : B=COMPTE D'OCTETS
                                     < DE LA DEMANDE COURANTE LECTURE.
         STB         NOCT            < ET SAVE IT...
<
< BOUCLE DE SIMULATION DE L'ENTREE D'UN MESSAGE SUR CETTE VISU :
<
LOOP:    EQU         $
WIT:     EQU         $
         LA          ADCTVI          < A=@DCTVISU.
         ADRI        SIT,A           < A=@SIT DE LA VISU.
         WORD        '1E15           < DEMANDE DANS B DU SIT-VISU.
         SWBR        B,A             < AFIN DE TESTER SON SIGNE.
         JAL         ITAT            < OK, IT ATTENDUE.
WITNXT:  EQU         $
         LAD         SCH
         SVC         0               < NON, IL FAUT ATTENDRE QUE
                                     < LA TACHE SOIT EN ATTENTE IT.
         JMP         WIT             < VERS UN NOUVEAU TEST.
ITAT:    EQU         $
RX::     VAL         2               < POUR ATTEINDRE LE REGISTRE X(VIS),
ETANXT:: VAL         14              < NUMERO DU BIT SIGNIFIANT 'IN',
JF::     VAL         "JF"            < CODE PERMETTANT DE VALIDER 'X'...
         LA          ADCTVI          < A=ADRESSE(DCT(VIS)),
         ADRI        RX,A            < A=ADRESSE(R(VIS)),
         WORD        '1E15           < B=(X(VISU)),
         LRM         A
         WORD        JF)ETANXT       < A=VALEUR DE 'X' LORSQUE LA VISU ATTEND
                                     < UNE INTERRUPTION 'IN'...
         CPR         A,B             < ALORS EST-CE 'IN' ???
         JNE         WITNXT          < NON, ON REBOUCLE SUR 'SIT'...
         LA          ASEND           < A=@ROUTINE MAITRE.
         WORD        '1EC5           < SIMULATION MAITRE DE LA
                                     < RECEPTION D'UN CARACTERE.
         CPZ         NOCT            < A-T'ON ENVOYE SUFFISAMENT
                                     < D'OCTETS AU HANDLER VISU ???
         JE          LOOP20          < OUI, ON ARRETE LA...
         LX          XBUF
         IC          XBUF            < PROGRESSION INDEX DU BUFFER.
         LBY         &ABUF           < TEST DU DERNIER CARACTERE
                                     < SIMULE SUR CETTE VISU.
         ANDI        '7F             < ON NE CONSERVE QUE 7 BITS.
         CPI         '04             < EST-CE UN EOT ???
         JNE         LOOP            < NON, ON CONTINUE...
<
< FIN DE SIMULATION :
<
LOOP20:  EQU         $
         JMP         LOOP2
<
< FIN DE LA LISTE DES MESSAGES :
<
LOOPF:   EQU         $
         BR          ATASK           < ET ON RECOMMENCE...
<
< EMISSION D'UNE ERREUR :
<
ERREUR:  EQU         $
         LAD         MERR
         BSR         APRINT          < EDITION D'1N MESSAGE D'ERREUR.
         JMP         LOOP2           < VERS L'INTRODUCTION D'UN MESSAGE.
<
<
<        S I M U L A T I O N   M A I T R E   1   C A R A C T E R E  :
<
<
<        FONCTION :
<                      CETTE ROUTINE MAITRE EMET UN CARACTERE
<                    DU MESSAGE COURANT A DESTINATION
<                    DU HANDLER DE LA VISU ASSIGNEE
<                    A '0B SI LE CODE ASCI DE CELUI-CI EST
<                    IBFERIEUR A '80; EN PARTICULIER
<                    LA FIN DE MESSAGE EST L'EOT ('04) : SI CELUI-CI
<                    N'EST PAS A EMETTRE, ON LUI DONNE
<                    LE CODE '80+'04...
<
<
         WORD        LOC+'80         < VALEUR RELATIVE DE L.
SEND:    EQU         $
         LRP         L
         LA          -1,L            < A=@RELATIVE LOCAL.
         AD          10,W            < W=@DCTESC, ET 10,W=SLOESC.
         LR          A,L             < L=@ABSOLUE LOCAL.
         LA          ABUF            < ACCES A ABUF.
         AD          10,W            < ABSOLUTISATION DE ABUF.
         STA         ABUFA
         LA          ADCTVI
         LR          A,W             < W=@DCTVISU.
<
< SIMULATION DE LA RECEPTION D'UN CARACTERE :
<
         LX          XBUF            < X=INDEX COURANT DU BUFFER CARTE.
         LBY         &ABUFA          < A=CARACTERE COURANT.
         CPI         '80             < CODE A EMETTRE ???
         JGE         SEND1           < NON...
         SBT         0               < AFIN D'AVOIR A<0.
         STA         ETAT,W          < QUE L'ON MET DANS L'ETAT DE
                                     < LA VISU ASSIGNEE A '0B.
         DC          NOCT            < ET UN OCTET DE MOINS...
         IF          ORDI-"T",XWOR5,,XWOR5
         RLSE        SIT,W           < ET ON SIMULE UNE PSEUDO-IT VIS.
XWOR5:   VAL         0
         IF          ORDI-"S",XWOR5,,XWOR5
         LAD         SIT,W           < A=ADRESSE DU 'SIT' D'INTERRUPTION, ET
         SVC         SVCM1           < SIMULATION D'UNE PSEUDO-INTERRUPTION
                                     < SUR LA VISU...
XWOR5:   VAL         0
SEND1:   EQU         $
         RSR                         < ET C'EST TOUT...
<
<
<        G E N E R A T I O N   D U   M O D U L E  :
<
<
FTASK:   EQU         $               < 1ER MOT APRES LE MODULE.
LGIT:    VAL         FTASK-ZERO*2
SIZE:    EQU         ZERO+LGIT       < LONGUEUR OCTET DU MODULE EXPRI-
                                     < ME A L'AIDE D'UN SYBOLE TRANSLA-
                                     < TABLE POUR REFERENCE EN AVANT.
         LOCAL
LOC2:    EQU         $
DEMCCI:  WORD        '0001           < APPEL DU CCI.
LONGR:   VAL         FTASK-NTASK     < NBRE DE MOTS DU MODULE.
DEMSGN:  WORD        '0402           < DEMANADE DE STORE SGN.
         WORD        NTASK-ZERO*2
         WORD        LONGR*2
         WORD        6
PILE:    DZS         10
         PROG
         WORD        LOC2+'80
GENERE:  EQU         $
         LRP         L
         LA          -1,L
         LR          A,L
         LAD         PILE-1
         LR          A,K
GEN1:    EQU         $
         LAD         DEMSGN
         SVC         0               < TENTATIVE DE STORE 'TASK'.
         JE          GEN2            < OK, FIN.
         LAD         DEMCCI          < STORE IMPOSSIBLE, IL Y A ERREUR
         SVC         0               < D'ASSIGNATION : RETOUR TEMPORAIRE
         JMP         GEN1            < AU CCI, PUIS ON RETENTE...
GEN2:    EQU         $
         LAD         DEMCCI
         SVC         0               < OK, ON FAIT UN RETOUR DEFINITIF
         JMP         GEN2            < AU CCI.
         END         GENERE



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.