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-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2024.