< S I S C M S 5 6 PAGE PAGE < < < C A R D C O N T R O L I N T E R P R E T E R : < < < FONCTION : < CE SOUS-PROGRAMME APPELE < PAR LES HANDLERS DE SERVICE, < A A SA CHARGE LE DIALOGUE ENTRE < LES UTILISATEURS ET LE SYSTEME < VIA LE LANGAGE DE COMMANDE (OU < 'CCI') ; POUR CE FAIRE, IL SE < BASE SUR UNE GRAMMAIRE, DITE < "GRAMMAIRE DU CCI", DONT 'RUNCCI' < EST L'INTERPRETEUR... < < < NOTA : < AU NIVEAU DIALOGUE AVEC < L'UTILISATEUR : < < 1 - LES ENTREES SE FONT SUR 'PHIN', < 2 - LES SORTIES SE FONT SUR 'PHOUT'. < < < FORMAT DE LA GRAMMAIRE DU CCI : < LA GRAMMAIRE DU CCI EST FAITE DE NOEUDS DE < FONCTIONS (F0 A F18) DONT LE FORMAT EST < DECRIT CI-DESSOUS : < XCCIM0:: MOT O < MOT0 DECOUPE EN 2 OCTETS... XCCIM1:: MOT XCCIM0+D < MOT 1 D'UN NOEUD DE LA GRAMMAIRE, XCCIM2:: MOT XCCIM1+D < MOT 2 D'UN NOEUD, XCCIM3:: MOT XCCIM2+D < ET MOT 3... XCCINX:: VAL I < INCREMENT PERMETTANT DE PASSER DU < DERNIER MOT D'UN NOEUD AU NOEUD LE < SUIVANT PHYSIQUEMENT... XCCIER:: VAL XCCINX < INCREMENT UTILISE POUR LES RETOURS EN < ERREUR DES ROUTINES DU CCI. < CCIM : < F0 MESSAGE ENVOI D'UN MESSAGE A L'ESCLAVE, < OCTET0=LONGUEUR DU MESSAGE, < OCTET1=K, < MOT1=ADRESSE MOT DU MESSAGE. < CCIR : < F1 ROUTINE EXECUTION D'UNE ROUTINE, < OCTET0=K, OU 'OCTET' ARGUMENT (CF. NSP ASSIGN...), < OCTET1=1, < MOT1=ADRESSE ROUTINE. < MOT2=INDEX DU NOEUD SUIVANT 1, < MOT3=INDEX DU NOEUD SUIVANT 2. < (LE CHOIX EST A LA CHARGE DE LA ROUTINE PAR < ACTION SUR LE REGISTRE X : < X INCHANGE : NOEUD SUIVANT=NOEUD 1, < X<--(X)+1 : NOEUD SUIVANT=NOEUD 2 ). < CCIS : < F2 SUSPENSION SORTIE DU CCI (ET RETOUR AU SVC), < OCTET0=K, < OCTET1=2. < CCID : < F3 DISCONNECT LOG-OUT DE L'ESCLAVE, < OCTET0=K, < OCTET1=3. < CCICT : < F4 CARACTERE TYPE COMPARE LE TYPE DU CARACTERE < COURANT DE BUFESC AVEC L'OCTET0, < OCTET0=TYPE : 4=CARACTERE<"0", < 3=CHIFFRES ("0" A "9"), < 2=CODE ENTRE CHIFFRES ET LETTRES, < 1=LETTRES, < 0=CARACTERE>"Z". CCITCT:: VAL 4 < TOUS LES CODES AVANT LES CHIFFRES, CCITCH:: VAL CCITCT-I < TOUS LES CHIFFRES DECIMAUX, CCITCL:: VAL CCITCH-I < ENTRE LES CHIFFRES ET LES LETTRES, CCITLE:: VAL CCITCL-I < TOUTES LES LETTRES, CCITZZ:: VAL CCITLE-I < AU-DELA DES LETTRES. < OCTET1=4, < MOT1=INDEX DU NOEUD SUIVANT SI LES TYPES COINCIDENT,, < MOT2=INDEX DU NOEUD SUIVANT SI LES TYPE NE < COINCIDENT PAS. < CCIC : < F5 CARACTERE COMPARE LE CARACTERE COURANT DE < BUFESC AVEC L'OCTET0, < OCTET0=CARACTERE DE TEST, < OCTET1=5, < MOT1=INDEX DU NOEUD SUIVANT SI LES CARACTERES < COINCIDENT, < MOT2=INDEX DU NOEUD SUIVANT SI LES 2 CARACTERES < NE COINCIDENT PAS. XCOK:: MOT XCCIM1 < MOT1 DE 'CCIC', XCNK:: MOT XCCIM2 < MOT2 DE 'CCIC'. < CCII : < F6 INTERROGATION INTERROGE L'ESCLAVE : QUESTION- < REPONSE, < OCTET0=K, < OCTET1=6. < CCIJMP : < F7 JUMP CCI CETTE FONCTION PROVOQUE UN SAUT < INCONDITIONNEL DANS LA GRAMMAIRE < DU CCI, < OCTET0=K, < OCTET1=7, < MOT1=INDEX DU NOEUD SUIVANT. < CCILP : < F8 LOAD PROCESSOR CETTE FONCTION A A SA CHARGE < LE CHARGEMENT DES PROCESSEURS < DEMANDES PAR L'UTILISATEUR LORS < DE L'INTERROGATION CCI, < OCTET0=K, < OCTET1=8, < MOT1=ADRESSE DISQUE DU PROCESSEUR. < MOT2=TAILLE OCTET NECESSAIRE AU PROCESSEUR < EN MEMOIRE, < MOT3=ADRESSE DE DEPART DU PROCESSEUR EN < ADRESSE TRANSLATABLE (PAR RAPPORT A SLO). XLPAD:: MOT XCCIM1 < ADRESSE DISQUE D'UN PROCESSEUR, XLPTO:: MOT XCCIM2 < TAILLE OCTET DE CELUI-CI, XLPRUN:: MOT XCCIM3 < ET ADRESSE DE LANCEMENT. < CCIACN : < F9 TEST <ACN> ON TESTE ICI, SI LE NUMERO < DE COMPTE DE L'UTILISATEUR < COINCIDE AVEC CELUI QUI EST < CONTENU DANS LE NOEUD. < OCTET0=K, < OCTET1=9, < MOT1=CARACTERES 0 & 1 DE L'<ACN> CHERCHE, < MOT2=CARACTERES 2 & 3 DE L'<ACN> CHERCHE, < MOT3=INDEX DU NOEUD SUIVANT SI LES 2 <ACN> < COINCIDENT, < MOT4=INDEX DU NOEUD SUIVANT S'ILS DIFFERENT. XACN1:: MOT XCCIM1 < DEBUT DE L'<ACN>, XACN2:: MOT XCCIM2 < FIN DE L'<ACN>, XACNOK:: MOT XCCIM3 < MOT DE COINCIDENCE, XACNNK:: MOT XACNOK+XCCIER < MOT DE NON COINCIDENCE. < CCIEOM : < F10 TEST <EOM> TESTE LA PRESENCE D'UN CARACTERE < FIN DE MESSAGE <EOM> (R/C OU EOT). < OCTET0=K, < OCTET1=10 ('A), < MOT1=INDEX DU NOEUD SUIVANT SI <EOM>, < MOT2=INDEX DU NOEUD SUIVANT SINON. < CCINT : < F11 TEST <MODE CCI> TESTE LE MODE INTERPRETATIF/ < NON-INTERPRETATIF DU CCI. < OCTET0=K, < OCTET1=11 ('B), < MOT1=INDEX DU NOEUD SUIVANT SI CCI NON-INTERPRETATIF, < (DIT AUSSI "INTERACTIF"...) < MOT2=INDEX DU NOEUD SUIVANT SI INTERPRETATIF. < (DIT AUSSI "NON INTERACTIF"...) < CCIUSR : < F12 TEST <ESCLAVE> TESTE LA NATURE INTERACTIVE < DE L'ESCLAVE TRAVAILLANT AVEC < LE CCI (UTILISE LA COMPARAISON DE < DE 'NSPIN' A 'NSPOUT'). < OCTET0=K, < OCTET1=12 ('C), < MOT1=INDEX DU NOEUD SUIVANT SI USER INTERACTIF, < MOT2=INDEX NOEUD SUIVANT SI USER NON INTERACTIF. XUSRUI:: MOT XCCIM1 < MOT INTERACTIF, XUSRNI:: MOT XCCIM2 < MOT NON INTERACTIF. < CCINOP : < F13 NOP NOEUD NOP DU CCI. < OCTET0=K, < OCTET1=13 ('D). < CCIBAC : < F14 GO BACK RESTAURATION DE L'INDEX COURANT < DE LA GRAMMAIRE DU CCI A PARTIR < DE SRCOTO (RETOUR D'UNE SOUS- < GRAMMAIRE). < OCTET0=K, < OCTET1=14 ('E). < CCIBAK : < F15 GO BACK' RESTAURATION DE L'INDEX COURANT < DE LA GRAMMAIRE DU CCI (A PARTIR < DE SRCOTO) ET DE Y (A PARTIR < DE YSER) (RETOUR D'UNE SOUS- < GRAMMAIRE DE TRAPPE PAR EXEMPLE...) < OCTET0=K, < OCTET1=15 ('F). < CCICAL : < F16 CALL S-GRAMM. SAUVEGARDE DE L'INDEX COURANT < DE LA GRAMMAIRE DU CCI DANS SRCOTO < ET APPEL D'UNE SOUS-GRAMMAIRE ; < LES APPELS NE PEUVENT ETRE < EMBOITES. < OCTET0=K, < OCTET1=16 ('10), < MOT1=INDEX DU 1ER NOEUD DE LA SOUS-GRAMMAIRE. < CCINC : < F17 CARACTERE COMPARE LE CARACTERE COURANT < DE BUFESC AVEC L'OCTET0. < OCTET0=CARACTERE DE TEST, < OCTET1=17 ('11) < MOT1=ADRESSE NOEUD SUIVANT SI LES 2 CARACTERES NE < NE COINCIDENT PAS, < MOT2=ADRESSE NOEUD SUIVANT SI LES 2 CARACTERES < COINCIDENT. XNCNK:: MOT XCCIM1 < MOT DE NON COINCIDENCE, XNCOK:: MOT XCCIM2 < MOT DE COINCIDENCE. < CCIDIR : < F18 CARACTERE TEST DIRECT DU CARACTERE COURRANT < A L'AIDE D'UNE TABLE QUE CE < CARACTERE INDEXE (DE 'A' A 'Z'). < OCTET0=K, < OCTET1=18 ('12), < MOT1=ADRESSE NOEUD SUIVANT SI LE CARACTERE COURANT N'EST < PAS DANS L'INTERVALLE 'A'-'Z', OU SI < L'ENTREE QU'IL INDEXE EST VIDE ('0000), < MOT2=ADRESSE NOEUD SUIVANT SI LE CARACTERE COURANT < EST 'A', < MOT3=ADRESSE NOEUD SUIVANT SI 'B',... ET CECI < JUSQU'A 'Z'. <CCISYS : < F19 TEST :SYS TEST SI LE NUMERO <ACNESC> < EST CELUI DU SYSTEME, C'EST-A-DIRE < LE MIEN... < OCTET0=K, < OCTET1=19 ('13), < MOT1=ADRESSE DU NOEUD SUIVANT SI :SYS, < MOT2=ADRESSE DU NOEUD SUIVANT SINON. < < < A U T O - R E L A I : < SI L'ON EST EN PRESENCE D'UN < RELAI DE NOEUD (CHAINAGE-ADRESSE) < DONT LE CONTENU N'EST PAS DU < TYPE '1XXX (TOUTE LA GRAMMAIRE DU < 'CCI' EST DANS LES ADRESSES '1XXX) < ON ADMET QU'ON EST EN PRESENCE < DIRECTE DE L'INFORMATION QUE L'ON < DEVAIT CHAINER... < < < G R A M M A I R E D U ' C C I ' : < LA GRAMMAIRE DU 'CCI' EST UN < GRAPHE ORIENTE QUE L'ESCLAVE < PARCOURS AU COURS DE SA SESSION ; < LES NOEUDS SONT DES ACTIONS, ET < LES ARCS (CHAINAGES) DES TRANSI- < TIONS D'ETAT. < LE MOT 'RECOTO' DE LA 'DCTESC' < DE L'ESCLAVE DONNE L'INDEX COU- < RANT DANS LA GRAMMAIRE ; IL EST < INITIALISE A 0 PAR 'JE', ET MIS < A 'INFINI' LORS D'UNE DEMANDE < DE 'EJ'... < < < ARGUMENT : < (L)=ADRESSE DCT(SERVICE), < (W)=ADRESSE DCT(ESCLAVE). < 'B' A NE PAS DETRUIRE (VOIR 'HDLSER')... < < < RESULTAT : < X(PST-ESCLAVE) : < =0 : MODE INTERACTIF. < =0 : MODE NON INTERACTIF, ET ANALYSE OK. < =1 : MODE NON INTERACTIF, ET ERREUR DE SYNTAXE, < =2 : MODE NON INTERACTIF ET TRONCATION. < < <******************************************************************************* XWOR%9: VAL K < INITIALISATION... ECES:: VAL '0@@@@+I < ERREUR DE SYNTAXE EN NON INTERACTIF, ECT:: VAL '0@@@@+I < TRONCATION EN NON INTERACTIF. <******************************************************************************* < < < T A B L E D E S M O D U L E S C C I : < < CALL #SISP CMS5 DOL1# FCCI: EQU $ WORD CCIM FCCI0:: VAL $-FCCI-D < ENVOI D'UN MESSAGE A L'ESCLAVE. WORD CCIR FCCI1:: VAL $-FCCI-D < EXECUTION D'UN SOUS-PROGRAMME. WORD CCIS FCCI2:: VAL $-FCCI-D < SORTIE DU CCI. WORD CCID FCCI3:: VAL $-FCCI-D < LOG-OUT DE L'ESCLAVE. WORD CCICT FCCI4:: VAL $-FCCI-D < TYPE CARACTERE COURANT. WORD CCIC FCCI5:: VAL $-FCCI-D < TEST CARACTERE COURANT. WORD CCII FCCI6:: VAL $-FCCI-D < INTERROGATION ESCLAVE. WORD CCIJMP FCCI7:: VAL $-FCCI-D < SAUT DANS LA GRAMMAIRE. WORD CCILP FCCI8:: VAL $-FCCI-D < CHARGEMENT D'UN PROCESSEUR. WORD CCIACN FCCI9:: VAL $-FCCI-D < TEST DE L'<ACN>. WORD CCIEOM FCCI10:: VAL $-FCCI-D < TEST DE L'<EOM>. WORD CCINT FCCI11:: VAL $-FCCI-D < TEST DU MODE INTERPRETATIF. WORD CCIUSR FCCI12:: VAL $-FCCI-D < TEST INTERACTIVITE ESCLAVE. WORD CCINOP FCCI13:: VAL $-FCCI-D < NOP. WORD CCIBAC FCCI14:: VAL $-FCCI-D < RETOUR SOUS-GRAMMAIRE, WORD CCIBAK FCCI15:: VAL $-FCCI-D < RETOUR SOUS-GRAMMAIRE. WORD CCICAL FCCI16:: VAL $-FCCI-D < APPEL SOUS-GRAMMAIRE. WORD CCINC FCCI17:: VAL $-FCCI-D < TEST INVERSE DE CARACTERE. WORD CCIDIR FCCI18:: VAL $-FCCI-D < TEST DIRECT CARACTERE. WORD CCISYS FCCI19:: VAL $-FCCI-D < TEST DU NUMERO DE COMPTE :SYS. NFCCI:: VAL $-FCCI-D < NBRE DE FONCTIONS DU CCI -1. < < USE W,DEM0 USE L,DCT0 CALL #SISP CMS5 DOL2# RUNCCI: EQU $ PSR B < SAVE LE B A NE PAS DETRUIRE... LX RECOTO-DCTESC,W < RECUPERATION DE L'INDEX COURANT < DE L'ESCLAVE DANS LA GRAMMAIRE < DU CCI. LY YSER-DCTESC,W < RESTAURATION EVENTUELLE DU < REGISTRE Y DE SERVICE ; PERMET < AINSI A 2 ROUTINES DU CCI DE < COMMUNIQUER PAR Y, MEME S'IL < Y A CHANGEMENT DE NIVEAU < DE SERVICE. < < TEST DU MODE DU CCI : INTERACTIF OU PROGRAMME ???? < LA IDESC-DCTESC,W TBT IDESCI < TEST DU MODE DU CCI ??? JC E784 < CAS DU CCI NON INTERACTIF, OK. < < TEST DE L'INTEARCTIVITE DE L'UTILISATEUR : < BSR ACHKIN < COMPARAISON DE NSPIN ET < DE NSPOUT (AVEC RENVOI DE < NSPIN DANS LE REGISTRE A). JNE Z891 < RIEN A FAIRE : NSPIN#NSPOUT. < < CAS D'UN UTILISATEUR INTERACTIF (NSPIN=NSPOUT) : < (REINITIALISATION DE SON CARACTERE D'ABORT) < (SUPPRESSION DU TIME OUT SUR SA VISU) < (AUTORISATION DES EXPANSIONS/EXTENSIONS) < PSR X,L < SAVE L'INDEX COURANT DE LA < GRAMMAIRE DU CCI, ET < L'@DCT-SERVICE. LR A,X < (X)=NSPIN DE LA CONSOLE. BSR ACADCT < RENVOIE : (L)=@DCT(NSPIN). LAI KALTM < (A)=CODE DU 'ALT-MODE'. STA VAR+CARALT < RE-INITIALISATION SYSTEMATIQUE < ET A PRIORI DU CARACTERE D'ABORT < DE L'UTILISATEUR A CHAQUE PASSAGE < DANS LE CCI INTERACTIF. STZ TESTO < SUPPRESSION DU TEST DU TIME- < OUT SUR LA CONSOLE INTERACTIVE < A CHAQUE INTERROGATION DU CCI. STZ VAR+INEXEX < AUTORISATION A PRIORI DES < EXPANSIONS/EXTENSIONS. PLR X,L < RESTAURE L'INDEX COURANT DE LA < GRAMMAIRE DU CCI ET @DCT-SERVICE. < < TEST DES 'TEST & SET' NON RESETES < LORS DU PASSAGE DANS LE CCI INTERACTIF ; < IL EST DONC INTERDIT D'APPELER LE < CCI INTERACTIF ENTRE UN 'TEST & SET' < ET LE 'RESET' ASSOCIE !!! < (OU PLUTOT CE N'EST PAS RECOMMANDE...) < Z891: EQU $ LA SETRUN-DCTESC,W < ACCES A LA ZONE DE SAUVEGARDE < DES 'TEST & SET' AU NIVEAU DE < L'ESCLAVE. JAE E784 < OK, PAS DE 'TEST & SET' EN < COURS. BSR ASMMK <<<< PHASE ININTERRUPTIBLE EOR SYNCUS < ON FORCE LES 'RESET' NON < ENCORE EFFECTUES. STA SYNCUS < MAJ DE SYNCUS. BSR ASMDK <<<< DEMASQUAGE STZ SETRUN-DCTESC,W < 'RESET' GLOBAL AU NIVEAU DE < L'ESCLAVE. < < B O U C L E D E P A R C O U R S D E < L A G R A M M A I R E D U C C I : < E784: EQU $ LA &AOTCCI < ACCES AU MOT0 DU NOEUD COURANT. XWOR%1: VAL CODBT=FMASK(K?MOCD=FCINST)MOCD RBT BITPAR-XWOR%1 < POUR ASSUER LA COMPATIBILITE < DES CODES LORSQU'IL SAGIT < DE NOEUDS DE CARACTERES. PSR X < SAVE INDEX COURANT DE LA GRAMMAIRE. LBI K SCLD MOCG=K < (B)=OCTET0(MOT0 DU NOEUD), AVEC SON BIT D < PARITE ('BITPAR') A 0. SWBR A,A < (A)=OCTET1=FONCTION. LR A,X < (X)=FONCTION DEMANDEE AU CCI. CPI NFCCI < VALIDATION DE LA FONCTION. JLE SYSR51 < OK. BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < JE NE SAIS PAS, MAIS LA SITUATION < EST DELICATE, CAR ON RISQUE DE S'EMPETRER < DE PLUS EN PLUS ; UNE SOLUTION SERAIT PEUT < ETRE DE PRENDRE L'INDEX DU NOEUD D'INTER- < ROGATION GENERALE (N5-N0), PUIS DE FAIRE < UN 'JMP E784'... < SYSR51: EQU $ LA &AFCCI < (A)=@DU MODULE TRAITANT CETTE < FONCTION (X). PLR X < RESTAURE INDEX COURANT DE < LA GRAMMAIRE. ADRI XCCIM1-XCCIM0,X < PASSAGE AU MOT1 DU NOEUD COURANT < OU AU NOEUD SUIVANT. PSR A < EMPILEMENT DE L'ADRESSE DU < MODULE DE TRAITEMENT. RSR < BRANCHEMENT VERS LE MODULE. < < N O P D U C C I : < CCINOP: EQU E784 < < G O B A C K D U C C I : < CCIBAK: EQU $ LY YSER-DCTESC,W < RESTAURATION DE Y, EN VUE < DE NE PAS PERDRE LE REGISTRE Y < DU DEBUG PAR EXEMPLE... CCIBAC: EQU $ VALBAC:: VAL ME000 LA CE000 CP SRCOTO-DCTESC,W < VALIDATION DU GO BACK. JNE SYSR52 < OK, IL Y A UN APPEL DE SOUS- < GRAMMAIRE EN COURS. BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < PEUT-ETRE COMME INDIQUE CI-DESSUS... < SYSR52: EQU $ LX SRCOTO-DCTESC,W < RESTAURATION DE L'INDEX COURANT < DE LA GRAMMAIRE DU CCI < AVEC SRCOTO. STA SRCOTO-DCTESC,W < MISE DE SRCOTO A 'E000, POUR < INDIQUER QU'IL N'Y A PLUS < D'APPEL DE SOUS-GRAMMAIRE < EN COURS. JMP E784 < VERS LA BOUCLE DU CCI. < < < I N T E R R O G A T I O N E S C L A V E : < < < FONCTION : < CE SOUS-PROGRAMME ENVOIE < UN MESSAGE A L'UTILISATEUR < SUR 'NSPOUT', LIT SA REPONSE < SUR 'NSPIN', PUIS LUI EN < FAIT L'ECHO SUR 'NSPOUT'... < < < ARGUMENT : < (L)=ADRESSE DE 'DCTSER', < (W)=ADRESSE DE 'DCTESC', < (B)=INDICATEUR DE FAIRE DE L'ECHO OU PAS : XEECHO:: VAL EXIST < FAIRE DE L'ECHO, XNECHO:: VAL NEXIST < NE PAS FAIRE DE L'ECHO ; ON NOTERA QUE < DANS LE CAS DU TEMPS PARTAGE, CECI PEUT < ETRE BY-PASSE PAR LA COMMANDE "!ECHO ON", < MAIS QUI BIEN SUR NE PEUT ETRE FRAPPE < AVANT L'ENTREE DU MOT DE PASSE, OUFFF... < < LMES1:: VAL 4 CCII: EQU $ PSR X < SAVE INDEX COURANT GRAMMAIRE. PSR B < ET SAUVEGARDE DE L'INDICATEUR D'ECHO... LBI LMES1 < (B)=LONGUEUR A PRIORI DU MESSAGE, BSR ACHKIN < MAIS EST-ON INTERACTIF ??? < RENVOIE : < (A)='NSPIN' DE L'UTILISATEUR... JNE Z1200Y < NON, DONC (B) EST BON... PSR X,L < OUI, IL S'AGIT D'UN UTILISATEUR INTER- < ACTIF, LE NOMBRE DE "?" QUE L'ON VA < EDITER EST FONCTION DU NIVEAU D'EMPILE- < MENT DE CET 'IDESC'... LR A,X < (X)='NPSIN' DE L'UTILISATEUR, BSR ACADCT < (L)=ADRESSE DE LA 'DCT' DE LA VISU... LA VAR+APILID LR A,L < (L)=ADRESSE DE LA PILE D'EMPILEMENT DES < UTILISATEURS PAR "!U" SUR CETTE VISU, LA O,L < (A)=POINTEUR DE LA PILE : ANDI XLCPIL < (A)=LONGUEUR COURANTE, XWOR%1: VAL XLCPIL=K IF XWOR%1-K,,XEIF%, SLRS XWOR%1 XEIF%: VAL ENDIF ADR A,B < ON AJOUTE AU MESSAGE DE BASE 'MESCCI' < UN NOMBRE DE "?" EGAL AU NIVEAU D'IMBRI- < CATION DES UTILISATEURS PAR "!U" SUR < CETTE VISU... PLR X,L Z1200Y: EQU $ LRM A WORD MESCCI < (A)=ADRESSE DU MESSAGE "<R/C><LF><?>". BSR AMESSO < EMISSION DU MESSAGE VERS < L'ESCLAVE ET ATTENTE. < < LECTURE DE LA REPONSE ESCLAVE SUR NSPIN : < < ON A ICI : < (Y)=NSPTYP SUR NSPOUT, < (A)=W=ADRESSE DCT(ESCLAVE). < ADRI BUFESC-DCTESC,A < (A)=@MOT DU BUFFER ESCLAVE DANS < LA DCT-ESCLAVE. SLLS NOCMO=K < CONVERSION EN UNE ADRESSE OCTET. STA VAR+DEMCCI+T+AMDEM IF FGR-FAVR,,XEIF%, IF ATTENTION : IL Y A UNE INCOHERENCE IF DANS LES CODES DES FONCTIONS DE IF LECTURE !!! XEIF%: VAL ENDIF IF FGR-K,,XEIF%, IF ATTENTION : IL DOIT Y AVOIR DU CODE OU L'ON IF EXPLOITE IMPLICITEMENT LE FAIT QUE 'FGR'=0 !!! XEIF%: VAL ENDIF LA IDDESC-DCTESC,W < (A)=LISTE DES INDICATEURS : RBT IDESCX STA IDDESC-DCTESC,W < A PRIORI ON RAZE 'IDESCX' INDIQUANT < AINSI QU'IL N'Y A PLUS DE TRAPPE EN < COURS... (ON LE FAIT JUSTE AVANT LA < DEMANDE DE LECTURE SUR 'NSPIN') TBT IDESC9 < ALORS UN ECHO IMMEDIAT EST-IL DEMANDE ??? LAI FGR < (A)=FONCTION DE LECTURE SANS ECHO A < PRIORI... JNC Z1200Z < NON, DONC (A) EST BON ; CELA SIGNIFIE < QUE SOIT L'ECHO IMMEDIAT N'EST PAS DE- < MANDE (PAR "!ECHO OFF"), SOIT QU'ON < EST EN BATCH (OU LES COMMANDES "!ECHO" < SONT INTERDITES...). LAI FAVRE < OUI : < DANS LE CAS DU TEMPS PARTAGE, ON MET EN < PLACE UNE FONCTION DE LECTURE AVEC ECHO, < CE QUI PERMET DE VOIR CE QUE L'ON TAPPE < (C'EST PAS TROP TOT...), LA FONCTION < D'ECRITURE QUI SUIVRA PERMETTANT DE VOIR < LA COMMANDE REELLEMENT INTERPRETEE APRES < LES EVENTUELS 'RUBOUT', 'BREAK' ET < 'ALT-MODE'... Z1200Z: EQU $ STA VAR+DEMCCI+T+OPDEM < MISE EN PLACE DE LA FONCTION DE LECTURE < AVEC OU SANS ECHO... LXI PHIN LBY &TASSGN-DCTESC,W < (A)=NSPIN DE L'ESCLAVE. SWBR A,A < GENERATION D'UN 'NSPTYP' VERS LE PERI- < PHERIQUE 'NSPOUT' DE L'ESCLAVE... STA VAR+DEMCCI+XXNSP < MAJ DE NSPTYP DE DEMCCI. LAD VAR+DEMCCI LR W,X < SAVE @DCT-ESCLAVE DANS X. LR A,W < (W)=@DEMCCI. < ON A ICI : < (W)=ADRESSE DEMCCI, < (X)=ADRESSE DCT(ESCLAVE). Z1200: EQU $ < REBOUCALGE EN CAS D'ERREUR < A LA LECTURE DU MESSAGE USER. LAI LCCI < COMPTE D'OCTETS MAX DU CCI. STA ARGDEM+CODEM < INITIALISATION DU CODEM DE < DEMCCI, OU REINITIALISATION DANS < LE CAS D'UN BOUCLAGE POUR < ERREUR A LA LECTURE. BSR ACHAND < ENVOI DE LA DEMANDE DE LECTURE SUR LE < 'NSPIN' DE L'ESCLAVE. WAIT WEIO < ATTENTE DE FIN DE LECTURE < SUR LE NSPIN. < < RAPPEL : < DANS LE CAS DES VISUS, LE CODEM < DE LA DEMANDE CONTIENT LE NBRE < DE CARACTERES REELLEMENT LUS. < YCCITO:: VAL 2 < DUREE D'UNE MISE EN SOMMEIL EVEN- < TUEL DU 'CCI' LORS D'ERREURS D'ENTREE- < SORTIE... LA ARGDEM+ETADEM < COMMENT S'EST PASSE L'ENTREE ??? JAE Z1200X < TRES BIEN... CPI EVINAC < MAL, EST-CE UNE FONCTION INACCESSIBLE ??? < (NOTA : ON NE DISCRIMINE PAS LES VISUS < DU RESTE, CAR CE PHENOMENE NE PEUT < SE RENCONTRER QUE SUR LES VISUS...) JNE Z1200 < NON, ON RECOMMENCE IMMEDIATEMENT... PSR X < ET OUI, SINON CA FAIT DES ALARMES !!! LXI YCCITO < OUI, BSR ADODO < FAIT DODO MON PETIT CCI... CE PHENOMENE < EST LIE AU INTERFERENCES DES TIME-OUT < SUR VISUS ET DU CURSEUR GRAPHIQUE... PLR X JMP Z1200 < ET ON ITERE... Z1200X: EQU $ < < OK, DEMANDE EXECUTEE, IL Y A < PEUT-ETRE DES CONNEXIONS < MATRICIELLES A EXPLOITER : < PLR B < (B)=INDICATEUR D'ECHO, IF XNECHO-K,,XEIF%, IF ATTENTION : LES 3 TESTS SUIVANTS SONT IDIOTS !!! XEIF%: VAL ENDIF CPZR B < ALORS UN ECHO EST-IL DEMANDE ??? JE Z1200T < NON, DONC ON SAUTE LES CONNEXIONS MATRI- < CIELLES... PSR A,X < OUI : LA ARGDEM+OPDEM ANDI MKOPDM < (A)=FONCTION COURANTE, ET < (W)=ADRESSE DE LA DEMANDE COURANTE... SVC SVCM8 < VERS LA DUPLICATION EVENTUELLE DE LA < DEMANDE (W) SUR LES PERIPHERIQUES < CONNECTES AU PERIPHERIQUE COURANT... PLR A,X Z1200T: EQU $ < < ECRITURE DE LA REPONSE ESCLAVE SUR NSPOUT : < LAI FGW < FONCTION D'ECRITURE... STA ARGDEM+OPDEM < DEMANDE D'ECRITURE. STY NSPTYP < MISE EN PLACE DU NSPTYP SUR < NSPOUT A PARTIR DE Y POSITIONNE < PAR 'AMESSO'. CPZR B < ALORS ET L'ECHO ??? JE Z1200S < PAS D'ECHO... BSR ACHAND < ECHO : ENVOI DE LA DEMANDE D'ECRITURE < SUR NSPOUT. Z1200S: EQU $ < < PREPARATION DE L'ANALYSE SYNTAXIQUE : < (PUIS ATTENTE DE FIN D'OPERATION) < LR X,A < (A)=@DCT-ESCLAVE. ADRI BUFESC-DCTESC,A < (A)=@BUFFER ESCLAVE (DCTESC). SBT BITX < POSITIONNEMENT DU BIT D'INDEXATION STA VAR+ABUFGR < GENERATION D'UN RELAI INDIRECT < INDEX VERS LE BUFFER ESCLAVE < A PARTIR DU HANDLER DE SERVICE. STZ VAR+XBUFGR < INDEX INITIAL VERS LE BUFFER < ESCLAVE (DCTESC). CPZR B < ALORS, ET L'ECHO ??? JE Z1200R < PAS D'ECHO, ON SORT... WAIT WEIO < ECHO : ATTENTE DE FIN D'ECRITURE... < < OK, DEMANDE EXECUTEE, IL Y A < PEUT-ETRE DES CONNEXIONS < MATRICIELLES A EXPLOITER : < PSR A,X LA ARGDEM+OPDEM ANDI MKOPDM < (A)=FONCTION COURANTE, ET < (W)=ADRESSE DE LA DEMANDE COURANTE... SVC SVCM8 < VERS LA DUPLICATION EVENTUELLE DE LA < DEMANDE (W) SUR LES PERIPHERIQUES < CONNECTES AU PERIPHERIQUE COURANT... PLR A,X < < PARCOURS DE LA GRAMMAIRE : < Z1200R: EQU $ LR X,W < RESTAURE (W)=@DCT-ESCLAVE. PLR X < RESTAURE INDEX COURANT GRAMMAIRE. LA DEMESC-DCTESC+T+CODEM,W STA VAR+MBUFGR < AFIN DE VALIDER 'XBUFGR' DANS 'CARAC'... STZ FSERV-DCTESC,W < RAZ A PRIORI DE FSERV, AU CAS < OU UN ALT-MODE AURAIT ETE RECU < PENDANT L'ECHANGE DES MESSAGES. JMP E784 < VERS L'ENTREE SUIVANTE DE LA < GRAMMAIRE DU CCI. < < A P P E L D ' U N E R O U T I N E : < CCIR: EQU $ < ON A ICI : < (L)=ADRESSE DCT(SERVICE). < (W)=ADRESSE DCT(ESCLAVE). BSR &AOTCCI < MOT1=@DE LA ROUTINE. ADRI XCCINX,X < ACCES A L'INDEX DE L'UN DES < 2 NOEUDS SUIVANTS. JMP CCIJMP < < E N V O I D ' U N M E S S A G E : < CCIM: EQU $ < < ON A ICI : < (B)=LONGUEUR OCTETS DU MESSAGE. < CPZR B JE E785 < RIEN A FAIRE : LE MESSAGE EST < VIDE (UTILISE PAR LE 'MAIL'). LA &AOTCCI < (A)=MOT1(NOEUD)=@MESSAGE. BSR AMESSO < ENVOI DU MESSAGE ET ATTENTE. E785: EQU $ ADRI XCCINX,X < PASSAGE AU NOEUD SUIVANT DANS LE < CAS OU LE NOEUD COURANT FAIT < 2 MOTS DE LONG. AE784: JMP E784 < ACCES AU NOEUD SUIVANT (ET RELAI 'E784'). < < D I S C O N N E X I O N E S C L A V E : < CCID: EQU $ LX INFINI < EN VUE DU PROCHAIN APPEL AU CCI. < QUI PROVOQUERA UN END-JOB PAR < L'INTERMEDIAIRE DU RUN-SVCC. < < S U S P E N S I O N D U C C I : < CCIS: EQU $ STX RECOTO-DCTESC,W < SAVE INDEX COURANT DE L'ESCLAVE < DANS LA GRAMMAIRE DU CCI. PLR B < < S O R T I E D U C C I : < E953: EQU $ STY YSER-DCTESC,W < SAUVEGARDE A PRIORI DU REGISTRE < Y DE SERVICE. < < RETOUR A PRIORI AU MODE CCI INTERACTIF : < BSR ASMMK <<<< MASK IT LA IDESC-DCTESC,W RBT IDESCI < MODE INTERACTIF A PRIORI. STA IDESC-DCTESC,W BSR ASMDK <<<< DEMASK IT RSR < ET C'EST TOUT... < < R E C O N N A I S S A N C E D I R E C T E : < CCIDIR: EQU $ BSR ACARAC < (A)=CARACTERE COURANT DU BUFESC. CPI KZ < VALIDATION PRELIMINAIRE PAR < RAPPORT AU 'Z'. JG Z720 < ERREUR : HORS L'INTERVALLE A-Z. ADRI -KAROND,A < TRANSLATION PAR RAPPORT AU '@' (='A'-1). JALE Z720 < ERREUR : HORS L'INTERVALLE A-Z. < < CAS OU LE CARACTERE COURANT EST DANS < L'INTERVALLE 'A'-'Z' : < LR X,Y < SAVE X DANS Y. ADR A,X < LE CARACTERE COURANT VA ETRE < UTILISE POUR INDEXER UNE < TABLE DE RELAIS DE NOEUDS. LX &AOTCCI < (X)=@NOEUD SUIVANT OU '0000. CPZR X JNE Z980 < OK, LE NOEUD COURANT EST < RECONNU, ET X CONTIENT L' < ADRESSE DU NOEUD SUIVANT. < < CAS DES CARACTERES NON RECONNUS : < JE SYSR53 < OK, (X)=K. BSR ASYSER < E R R E U R S Y S T E M E ... SYSR53: EQU $ LR Y,X < RESTAURE L'INDEX COURANT DE LA < GRAMMAIRE DU CCI QUI DONNE LE < NOEUD OU ALLER EN CAS DE NON < RECONNAISSANCE. JMP Z720 < VERS LE RETOUR SUR LE CARACTERE < NON RECONNU. < < R E C O N N A I S S A N C E I N V E R S E E : < CCINC: EQU $ BSR ACARAC < ACCES AU CARACTERE COURANT DE < BUFESC. < < ON A ICI : < (A)=CARACTERE COURANT DE BUFESC, < (B)=CARACTERE ATTENDU. < ADRI XNCOK-XNCNK,X < PREPARATION D'UN RETOUR OK < A PRIORI. CPR A,B < Y-A-T'IL COINCIDENCE ??? JE E786 < OK, IL Y A COINCIDENCE. ADRI XNCNK-XNCOK,X < NON COINCIDENCE : ERREUR. JMP Z720 < VERS UN RETOUR ARRIERE DANS < LE BUFESC. < < R E C O N N A I S S A N C E U N C A R A C T E R E : < CCIC: EQU $ BSR ACARAC < ACCES AU CARACTERE COURANT DE < BUFESC. < < ON A ICI : < (B)=CARACTERE ATTENDU, < (A)=CARACTERE COURANT. < CPR A,B < Y-A-T'IL COINCIDENCE... E787: EQU $ JE E786 < OK : CARACTERE RECONNU, OU < COINCIDENCE DE TYPE. E787JN: EQU $ ADRI XCNK-XCOK,X < DANS LE CAS DE LA NON-RECONNAIS- < SANCE OU DE LA NON COINCIDENCE < DE TYPE IL FAUT ACCEDER AU MOT2. Z720: EQU $ < ENTRY NON COINCIDENCE POUR CCINC. DC VAR+XBUFGR < RETOUR ARRIERE SUR LE CARACTERE < NON RECONNU. E786: EQU $ < < S A U T D A N S L A G R A M M A I R E : < CCIJMP: EQU $ < < VALIDATION DE L'ADRESSE DU NOEUD SUIVANT : < LA &AOTCCI < ACCES A CE QUI EST POINTE < PAR LE REGISTRE X. ADGCCI:: VAL 1 < LA GRAMMAIRE DU CCI DOIT ETRE A DES MKCCI:: VAL 'F000 < ADRESSES DU TYPE 1XXX (MASQUE BITS 0-3). XWOR%1: VAL MKCCI=K XWOR%1: VAL -XWOR%1 SLRS -XWOR%1 < ACCES AUX BITS0-3. CPI ADGCCI < EST-CE UNE ADRESSE DE LA < GRAMMAIRE DU CCI ??? JE Z980X1 < OUI, ON VA S'Y BRANCHER... < < TESTS DES SAUTS IMPLICITES A 'N10' < AVEC CODE D'ERREUR UTILISATEUR : < MCCIER:: VAL 'F000 < "RACINE" COMMUNE DES CODES D'ERREURS, < QU'ON NE DOIT PAS RETROUVER SUR AUCUN < AUTRE NOEUD DE LA GRAMMAIRE SOUS PEINE < DE FAUSSES ERREURS... CPI MCCIER>XWOR%1 < ALORS, EST-CE UN BRANCHEMENT IMPLICITE < AU NOEUD D'ERREUR 'N10' ??? JNE AE784 < NON, ON EST DONC EN PRESENCE < D'UN AUTO-RELAI. LA &AOTCCI < OUI : < (A)=CODE D'ERREUR UTILISATEUR, STA BOXESC-DCTESC,W < QUE L'ON RENVOIE PAR 'BOX', ET QUE L'ON < EDITER APRES BRANCHEMENT A 'N10' SI < L'UTILISATEUR N'EST PAS EN MODE INTER- < PRETATIF... LRM X WORD N10 < ET BRANCHEMENT AUTOMATIQUE A 'N10', JMP Z980 < VERS CE BRANCHEMENT EFFECTIF... < < CAS DES BRANCHEMENTS EXPLICITES : < Z980X1: EQU $ < < ACCES A L'ADRESSE DU NOEUD SUIVANT : < LX &AOTCCI < ACCES A L'ADRESSE DU NOEUD < SUIVANT. < < BRANCHEMENT : < Z980: EQU $ < ENTRY 'RECONNAISSANCE DIRECTE'. LA AOTCCI < RELAI VERS LE NOEUD 0 < DE LA GRAMMAIRE DU CCI. RBT BITX < (A)=ADRESSE DU NOEUD 0 PAR RAZ < DU BIT D'INDEX. SBR A,X < (X)=INDEX NOEUD SUIVANT. JMP AE784 < ACCES AU NOEUD SUIVANT. < < A P P E L S O U S - G R A M M A I R E : < CCICAL: EQU $ LA SRCOTO-DCTESC,W CP INFINI < VERIFICATION QUE L'APPEL N'EST < PAS IMBRIQUE DANS UN AUTRE < APPEL. JE SYSR54 < OK. BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < VOIR JE PENSE LA 'SYSER' QUI EST < SITUEE EN 'E784' ENVIRON... < SYSR54: EQU $ STX SRCOTO-DCTESC,W < SAUVEGARDE DE L'INDEX COURANT < DE LA GRAMMAIRE DU CCI DANS < SRCOTO. IC SRCOTO-DCTESC,W < SRCOTO DOIT CONTENIR EN FAIT < L'INDEX DU NOEUD SUIVANT. JMP CCIJMP < LA SUITE DU TRAITEMENT EST < IDENTIQUE AU CCI JUMP. < < T Y P E U N C A R A C T E R E : < CCICT: EQU $ BSR ACARAC < ACCES AU CARACTERE COURANT < DE BUFESC. < < ON A ICI : < (A)=CARACTERE COURANT DE BUFESC, < (B)=TYPE ATTENDU. < LYI CCITZZ < INITIALISATION. CPI HZERO < CARACTERE<"0"... ADCR Y CPI HNEUF+E < CARACTERE=CHIFFRE... ADCR Y CPI KA < CARACTERES ENTRE LES CHIFFRES < ET LES LETTRES... ADCR Y CPI KZ+E < CARACTERE>"Z"... ADCR Y CPR Y,B < COMPARAISON DU TYPE CHERCHE, < AVEC LE TYPE DU CARACTERE COURANT. JMP E787 < VERS LA DETERMINATION DU < NOEUD SUIVANT. < < C H A R G E M E N T D ' U N P R O C E S S E U R : < < < A T T E N T I O N : < ON A ICI : (B)=K. < (CF. LE FORMAT DE LA FONCTION F8 DU CCI) !!! < CCILP: EQU $ LA &AOTCCI < (A)=@DK DU PROCESSEUR SUR LE < DISQUE DE SWAPPING. ADRI XLPTO-XLPAD,X LY &AOTCCI < (Y)=TAILLE OCTET MEMOIRE NECESSAIRE < AU PROCESSEUR. ADRI XLPRUN-XLPTO+XCCINX,X PSR A < SAVE @DK DU PROCESSEUR. < < MISE EN PLACE DE LA ROUTINE DE FIN < DE SERVICE, QUI POSITIONNERA L'ADRESSE < DE LANCEMENT DU PROCESSEUR : < LA ARUNP SBT XFSERV < PAS DE RECOVERY SI FSERV EST < DEJA POSITIONNE. BSR AFSERV < TEST ET RANGEMENT DE FSERV. TBT XFSERV < TEST EN RETOUR DE L'EXECUTION < DE AFSERV. PLR A < RESTAURE (A)=@DK DU PROCESSEUR. JC CCIS < FSERV N'A PAS ETE MODIFIE ; < IL Y A SUREMENT UN ALT-MODE < EN COURS ; ON IGNORE DONC LE < LOAD-PROCESSOR, ET ON FAIT UNE < SUSPENSION DU CCI POUR CETE < ESCLAVE AFIN D'EXECUTER LA < FIN DE SERVICE (D'ABORT !!!). < < OK, LE PROCESSEUR VA ETRE CHARGE : < STA DEMSWP-DCTESC+T+OPDEM,W < CETTE ADRESSE DISQUE EST TRANSMISE < AU SWAPER (IN) PAR L'INTERMEDIAIRE < DE L'OPDEM DE LA DEMANDE DE SWAP. STY DEMSWP-DCTESC+T+CODEM,W < MISE A JOUR DE LA DEMANDE DE < SWAPPING. STX RECOTO-DCTESC,W < SAVE L'INDEX COURANT DE < L'AUTOMATE DU CCI. ADRI -D,K < DESTRUCTION DU REGISTRE B < EMPILE A L'ENTREE DE CCI. < < ON A ICI : < (B)=K (CE QUI EST PARFAIT POUR 'ARGAM1'...) < BSR ARGAM1 < ON EST DANS UNE SITUATION < IDENTIQUE A CELLE DE LA 1ERE < ALLOCATION MEMOIRE D'UN ESCLAVE. < < ON A ICI : < BIT0(B)=1 : POUR FORCER LE SWAPPER, < (B)=RANG DE L'ALLOCATEUR NECESSAIRE. < ADRI DCTESC-DEMSWP,W < RESTAURE (W)=@DCT-ESCLAVE. JMP E953 < VERS LA SUSPENSION DU CCI. < < T E S T N U M E R O D E C O M P T E : < CCIACN: EQU $ LA &AOTCCI < (A)=CARACTERE 0 & 1 DE L'<ACN>. ADRI XACN2-XACN1,X LB &AOTCCI < (B)=CARACTERES 2 & 3 DE L'<ACN>. CCIACP: EQU $ ADRI XACNNK-XACN2,X < RETOUR EN ERREUR AU CCI A PRIORI. < < COMPARAISON DU NUMERO DE L'UTILISATEUR < AVEC CELUI CONTENU DANS (A,B) : < IF XXACN-2,,XEIF%, IF ATTENTION : CE QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF CP ACNESC-DCTESC,W JNE CCIJMP < NON COINCIDENCE. LR B,A < 2EME PARTIE... CP ACNESC-DCTESC+U,W JNE CCIJMP < NON COINCIDENCE. < < CAS OU LE NUMERO DE COMPTE DE L'UTILISATEUR < COINCIDE AVEC CELUI DU NOUED COURANT : < ADRI XACNOK-XACNNK,X < RETOUR OK AU CCI. JMP CCIJMP < < T E S T D U N U M E R O D E C O M P T E : S Y S : < CCISYS: EQU $ LA ACNSYS LB ACNSYS+U < (A,B)=NUMERO DE COMPTE DU SYSTEME. ADRI XCCIM0-XCCIM1,X < RETOUR SUR LA FONCTION... JMP CCIACP < VERS LE TEST DE ":SYS"... < < T E S T < E O M > : < CCIEOM: EQU $ BSR ACARAC < (A)=CARACTERE COURANT DE BUFGR. JE CCIJMP < C'EST UN LIMITEUR (RETOUR-CHARIOT, < 'EON' OU BIEN ENFIN LE POINT...). JMP E787JN < ET BIEN NON, CE N'EST PAS UN CARACTERE < LIMITEUR... < < T E S T I N T E R P R E T A T I F : < CCINT: EQU $ LA IDESC-DCTESC,W TBT IDESCI < TEST DU BIT DE MODE DU CCI. ADCR X < ON FAIT +1 SUR L'INDEX COURANT < DE LA GRAMMAIRE DU CCI (X) SI < LE CCI EST EN MODE NON < NON-INTERPRETATIF POUR CET ESCLAVE. IF XCCINX-BIT,,XEIF%, IF ATTENTION : 'ADCR' NE MARCHERA PAS !!! XEIF%: VAL ENDIF JMP CCIJMP < VERS L'ACCES AU NOEUD SUIVANT. < < T E S T D U M O D E D E L ' U T I L I S A T E U R : < < < DEFINITION : < UN USER EST DIT INTERACTIF SI NSPIN=NSPOUT, < ET NON INTERACTIF DANS LE CAS CONTRAIRE. < CCIUSR: EQU $ BSR ACHKIN < COMPARAISON DE NSPIN ET DE < NSPOUT DE L'UTILISATEUR. JE CCIJMP < NSPIN=NSPOUT : L'UTILISATEUR < EST CONSIDERE COMME ETANT < INTERACTIF. ADRI XUSRNI-XUSRUI,X < NSPIN#NSPOUT : L'UTILISATEUR < EST CONSIDERE NON INTERACTIF. JMP CCIJMP PAGE < < < C O M P A R A I S O N D U N S P I N E T D U < N S P O U T D E L ' U T I L I S A T E U R : < < < ARGUMENT : < (W)=ADRESSE DCT(ESCLAVE). < < < RESULTAT : < (A)=NSPIN DE L'UTILISATEUR. < INDICATEURS POSITIONNES PRES POUR FAIRE UN < 'JE' SI NSPIN=NSPOUT. < < CHKIN: EQU $ PSR X < DANS LE CAS D'UN APPEL PAR LE < CCI : SAVE L'INDEX COURANT DE LA < GRAMMAIRE. LXI PHIN LBY &TASSGN-DCTESC,W LXI PHOUT CPBY &TASSGN-DCTESC,W PLR X < DANS LE CAS D'UN RETOUR AU CCI : < RESTAURE L'INDEX COURANT DE LA < GRAMMAIRE. RSR PAGE CALL #SISP CMS5 DOL1# < < < I N I T I A L I S A T I O N D U P < D ' U N P R O C E S S E U R : < < < FONCTION : < APPELEE EN FIN DE SERVICE UTILISATEUR, < LORSQUE CELUI-CI A DEMANDE UN PROCESSEUR DU < SYSTEME ; ELLE MODIFIE LE REGISTRE K : < K <-- 2 , < ET MET A CETTE ADRESSE (K) L'ADRESSE DE < LANCEMENT DU PROCESSEUR, QUI DEVIENT < L'ADRESSE DE RETOUR DU 'SVC CCI'. < SI L'APPEL A EU LIEU PAR QUIT, LE < REGISTRE K EST RAZE, < ET LE REGISTRE P EST INITIALISE < DIRECTEMENT. < DE PLUS ELLE RAZE LES REGISTRES < A,B,X,Y,C,L,W DU PROCESSEUR DNAS < LA PST UTILISATEUR. < < < A T T E N T I O N : < ON DOIT DONC RESERVER EN TETE DE < CHAQUE PROOCESSEUR UNE ZONE D'AU MOINS < 2 MOTS POUR QU'IL CONSERVE SON < INTEGRITE LORS D'UN 'RUNP'... < < < ARGUMENT : < (W)=ADRESSE DEMSER. < (DESTRUCTIBLE). < < RUNP: EQU $ < < A T T E N T I O N : < QUAND ON EST ICI, LA ZONE < MEMOIRE DE L'UTILISATEUR EST RESIDENTE !!!! < LX RECOTO-DEMSER,W < RECUPERATION DE L'INDEX COURANT < DE LA GRAMMAIRE DU CCI. ADRI -XCCINX,X < PASSAGE SUR L'ADRESSE DE < LANCEMENT DU PROCESSEUR. LX &AOTCCI < (X)=@LANCEMENT DU PROCESSEUR. STX PRESC-DEMSER,W < PRESC RECOIT A PRIORI L'ADRESSE < DE LANCEMENT DU PROCESSEUR DE < < BASE DE CMS4 QUE L'ON LANCE. < < E N T R Y ' G O B P E ' : < < < ON A ICI : < (X)=FUTUR REGISTRE P (OU DE RETOUR), < (W)=ADRESSE DEMSER. < < CPZ PSTESC-DEMSER+RS,W < TEST DU MODE DE L'UTILISATEUR : < MAITRE : APPEL PAR SVC, < ESCLAVE : APPEL PAR QUIT. IF MS-BITSIG,,XEIF%, IF ATTENTION : LE TEST EST IDIOT !!! XEIF%: VAL ENDIF JGE Z870 < L'ESCLAVE ETANT EN MODE ESCLAVE, < ON PEUT INITIALISER DIRECTEMENT < SON REGISTRE P AVEC L'ADRESSE < DE LANCEMENT DU PROCESSEUR. < < CAS D'UN ESCLAVE EN MODE MAITRE : ON NE < PEUT QU'INITIALISER LE P DE RETOUR < DU SVC AVEC L'ADRESSE DE LANCEMENT < DU PROCESSEUR : < LA PSTESC-DEMSER+RSLO,W < (A)=(SLO). BSR APDADR < (A)=SLO*16 (EN MOTS) ADRI XMOT2,A < (A)=(SLO)+2, POUR INITIALISER < LE REGISTRE K (ON PREND < (SLO)+2 AU CAS OU LE PRESC < SERAIT NUL, CE QUI SIGIFIE < UN PASSAGE PAR LE SVC CCI !!!). XR A,W < (W)=ADRESSE ABSOLUE SOMMET PILE < UTILISATEUR STX O,W < ADRESSE DE LANCEMENT DU PROCESSEUR XR A,W LAI XMOT2 STA PSTESC-DEMSER+RK,W < STOCKAGE DU K < TRANSLATABLE DE L'UTILISATEUR LXI RW-RA+Z < POUR RAZ DE : A,B,X,Y,C,L,W. JMP Z871 < VERS L'INITIALISATION DES < REGISTRES DE L'ESCLAVE. < < CAS D'UN ESCLAVE EN MODE ESCLAVE, < ON PEUT INITIALISER DIRECTEMENT < SON REGISTRE P AVEC L'ADRESSE DE < LANCEMENT DU PROCESSEUR (QUIT) : < Z870: EQU $ STX PSTESC-DEMSER+RP,W < INITIALISATION DIRECTE DE 'P'. LXI RK-RA+Z < POUR RAZ DE : A,B,X,Y,C,L,W,K. Z871: EQU $ LA FSERV-DEMSER,W < POUR DISCRIMINER RUNP DE GOBPE. STZ FSERV-DEMSER,W < RAZ DE LA ROUTINE DE FIN DE < SERVICE. CP AGOBPE < ETAIT-CE GOBPE ??? JE Z1140 < OUI, ON NE TOUCHE DONC PAS < AUX REGISTRES DE L'UTILISATEUR. < < CAS DE RUNP : RAZ DES REGISTRES DU PROCESSEUR : < E960: EQU $ STZ PSTESC-DEMSER,W ADRI P,W < REGISTRE SUIVANT DANS LA PST < DE L'UTILISATEUR. JDX E960 < AU SUIVANT... Z1140: EQU $ < ENTRY POUR GOBPE. RSR < GO BACK TO HDLSER. PAGE < < < G E S T I O N D U ' P R E S C ' U T I L I S A T E U R : < < < FONCTION : < !<EOT> : PROVOQUE UNE REMISE A 0 DU PRESC, < !<R/C> : PROVOQUE UN RETOUR AU PROGRAMME < DE L'UTILISATEUR, TEL QUE : < P(ESCLAVE)<--(PRESC). < < < ARGUMENT : < (W)=ADRESSE DCT(ESCLAVE). < < < C O M M A N D E ! < E O T > : < < RPRESC: EQU $ STZ PRESC-DCTESC,W < LA COMMANDE '!<EOT>' REMET < A 0 LE PRESC DE L'ESCLAVE. RSR < ET C'EST TOUT... < < < C O M M A N D E ! < R / C > : < < MPRESC: EQU $ LA AGOBPE < (A)=@ROUTINE DE FIN DE SERVICE < PERMETTANT UN RETOUR AU PROGRAMME < ESCLAVE PAR 'PRESC'. JMP Z932 < VERS LE POSITIONNEMENT DE < 'FSERV'. < < < R E T O U R P R O G R A M M E < E S C L A V E P A R P R E S C : < < < FONCTION : < CETTE ROUTINE DE FIN DE SERVICE PERMET < UN RETOUR AU PROGRAMME ESCLAVE PAR < PRESC ; CE RETOUR EST TRAITE COMME < L'INITIALISATION D'UN PROCESSEUR < DE BASE DE CMS4. < EN FAIT, SI (PRESC)<0 : LE ALT-MODE < SOLITAIRE EST IGNORE. < < < A T T E N T I O N : < DANS LE CAS OU BIT0(DEMSWP)=1, < C'EST-A-DIRE LORSQUE LE SWAPPING < EST BLOQUE POUR UN ESCLAVE, LE < RETOUR A PRESC EST REMPLACE PAR < UN ABORT. C'EST UN CAS QUI SE RENCONTRE < DANS LE DEBUG, LORSQUE L'ON FAIT < PAR EXEMPLE 'S,0', PUIS 'M...' < LE TOUT SUIVI D'UN ALT-MODE... < < < T R E S I M P O R T A N T : < LE MOT D'ADRESSE (SLO)+XMOTX CORRESPOND < AU MOT 'CDRET' DEFINI DANS LE SYSTEME < D'ENSEIGNEMENT 'SMC' ; LES PROCES- < SEURS DE 'SMC' L'UTILISE PARFOIS < POUR SAVOIR SI UN ALT-MODE A ETE RECU ; < IL FAUT DONC QUE CETTE CORRESPONDANCE < SUBSISTE : < < CDRET=(SLO)+XMOTX... < < < ARGUMENT : < (W)=ADRESSE DEMSER. < (DESTRUCTIBLE). < < GOBPE: EQU $ XMOTX:: MOT XMOT2 < MOT UTILISE DANS L'ESPACE UTILISATEUR < POUR INDIQUER LA RECEPTION D'UN ALT- < MODE SOLITAIRE, EN DONNANT LE 'P' ACTIF < A CE MOMENT ; LES AUTRES REGISTRES SONT < INCHANGES... CPZ DEMSWP-DEMSER+XXNSP,W JL Z1500 < BIT0(DEMSWP)=1 : LE SWAPPING < EST BLOQUE POUR CET ESCLAVE, < ON VA DONC EN FAIT ABORTER. < < CAS OU BIT0(DEMSWP)=K : RETOUR A PRESC. < LA RECOTO-DEMSER,W < (A)=INDEX COURANT DE LA GRAMMAIRE < DU CCI DE L'ESCLAVE. CP INFINI < UN LOGOUT EST-IL DEMANDE ??? JE Z871 < OUI, ALORS LE ALT-MODE QUI < PROVOQUE CE RETOUR AU PROGRAMME < UTILISATEUT EST IGNORE... LX PRESC-DEMSER,W < RECUPERATION DANS X DU PRESC < COURANT DE L'ESCLAVE. CPZR X < MAIS EN REALITE, EST-CE BIEN < UN P DE RETOUR ??? JL Z871 < ET BIEN NON, PRESC<0 INDIQUE < QUE LES ALT-MODES SOLITAIRES < DOIVENT ETRE IGNORES... PSR B,Y < PRENONS LE ALT-MODE EN COMPTE : LA PSTESC-DEMSER+RSLO,W BSR APDADR LR A,Y < (A)=Y=(SLOESC) EXPRIME EN MOTS... CPZ PSTESC-DEMSER+RS,W < ALORS QUEL EST LE MODE ??? IF MS-BITSIG,,XEIF%, IF ATTENTION : LE TEST EST IDIOT !!! XEIF%: VAL ENDIF JGE Z930X1 < ESCLAVE... < < CAS DU MODE MAITRE : LE ALT-MODE < SOLITAIRE EST APPARU ALORS QU'UN < 'SVC' ETAIT EN COURS : < AD PSTESC-DEMSER+RK,W XR A,W < 'W' POINTE L'ENTREE COURANTE DE LA < PILE 'K', ET DONNE DONC : LB O,W < (B)=REGISTRE 'P' DE RETOUR DU 'SVC'... STX O,W < QUE L'ON REMPLACE PAR LE 'PRESC' (X). XR A,W ADRI -XMOTX,A CPR A,Y < LE MOT 'XMOTX' CORRESPONDRAIT-IL < AU SOMMET DE LA PILE OU L'ON A RANGE < LE 'PRESC' DE RETOUR ??? JE Z930X3 < OUI, C'EST LE CAS EN PARTICULIER OU < L'ON UTILISE LA COMMANDE 'MPRESC' < A LA SUITE D'UNE TRAPPE... JMP Z930X2 < VERS L'INDICATION DU ALT-MODE... < < CAS DU MODE ESCLAVE : LE ALT-MODE < SOLITAIRE EST APPARU PENDANT LE < RUN DU PROGRAMME, OU ALORS QU'UN < 'QUIT 0' ETAIT EN COURS : < Z930X1: EQU $ LB PSTESC-DEMSER+RP,W < (B)=REGISTRE 'P' COURANT, STX PSTESC-DEMSER+RP,W < QUE L'ON REMPLACE PAR LE 'PRESC' (X). < < INDICATION A L'UTILISATEUR PAR < 'XMOTX' QU'UN ALT-MODE SOLITAIRE < EST APPARU : ON MET DANS 'XMOTX' < LE 'P' COURANT... < Z930X2: EQU $ XR Y,W STB XMOTX,W < ET VOILA... XR Y,W Z930X3: EQU $ PLR B,Y JMP Z871 < VERS LA SORTIE, ET L'ANNULATION < DU 'FSERV' EN COURS... < < CAS OU BIT0(DEMSWP)=1 : ABORT. < Z1500: EQU $ LA AABORT < (A)=@ROUTINE DE FIN DE SERVICE < D'ABORT, STA FSERV-DEMSER,W < QUI REMPLACE LA ROUTINE DE FIN < DE SERVICE DE RETOUR A PRESC < DESTINEE AU HANDLER DE SERVICE. JMP Z1140 < VERS UN RETOUR IMMEDIAT AU < HANDLER DE SERVICE. PAGE < < < E X E C U T I O N D E S D E M A N D E S < D E P R O C E E D : < < < < < P R O C E E D : < < < FONCTION : < CETTE ROUTINE EST APPELEE PAR < L'INTERMEDIARE DE LA GRAMMAIRE DU CCI, < LORS DE LA RENCONTRE DE LA COMMANDE < '!GO'. ELLE POSITIONNE LA DEMANDE D'UNE < ROUTINE DE FIN DE SERVICE. < < < ARGUMENT : < (W)=ADRESSE DCT(ESCLAVE). < < PROCED: EQU $ LA AGOON < @ROUTINE DE FIN DE SERVICE, POUR < EXECUTION DU PROCEED. < < E N T R Y M P R E S C : < Z932: EQU $ < < ON A ICI : < (A)=ADRESSE ROUTINE DE FIN DE SERVICE < A METREE DANS 'FSERV'. < BSR AFSERV < TEST ET RANGEMENT DE FSERV. RSR < IL FAUT EVIDEMMENT QU'UNE < SUSPENSION DU CCI SUIVE (CF. < LA GRAMMAIRE DU CCI). < < < R E T O U R E S C L A V E : < < < FONCTION : < CETTE ROUTINE EST PAPELEE EN FIN DE < SERVICE, ELLE A A SA CHARGE LA < MODIFICATION DU REGISTRE P DE RETOUR < L'ESCLAVE, TEL QUE L'ON DEPASEE < LA SVC CCI. < < < ARGUMENT : < (W)=ADRESSE DEMSER. < < GOON: EQU $ STZ FSERV-DEMSER,W < SUPPRESSION DE LA ROUTINE DE < FIN DE SERVICE. LA PSTESC-DEMSER+RS,W < DISCRIMINATION DE L'APPEL AU 'CCI' : TBT SVCS < PAR UN 'SVC' ??? JC Z842 < SVCS=1 : L'APPEL A EU LIEU PAR 'SVC'... < < CAS D'UN ESCLAVE EN MODE ESCLAVE ; < L'APPEL A EU LIEU PAR QUIT : < CPZ PSTESC-DEMSER+RP,W < TEST DU REGISTRE P(ESCLAVE). JE Z60 < P(ESCLAVE) EST NUL, ON EST < SUREMENT SUR LE QUIT INITIAL < DE L'ESPACE MEMOIRE ESCLAVE. IC PSTESC-DEMSER+RP,W < ON INCREMENTE DIRECTEMENT < LE REGISTRE P DE L'ESCLAVE, < PUISQUE CELUI-CI EST EN < MODE ESCLAVE. JMP Z60 < RETOUR SANS TOUCHER AU REGSITRE < X DE L'ESCLAVE LORS D'UN QUIT. < < CAS D'UN ESCLAVE EN MODE MAITRE ; < L'APPEL A DONC EU LIEU PAR SVC : < Z842: EQU $ PSR A < SAUVEGARDE DE 'RS'... LRM A WORD RETSVC < (A)=VALEUR DU REGISTRE 'P' D'UN UTILI- < SATEUR LORSQUE CELUI-CI A FAIT UN < 'SVC'... CP PSTESC-DEMSER+RP,W < L'UTILISATEUR AYANT SVCS=1, AVANT DE LE < (RE-)METTRE EN MODE MAITRE, VERIFIONS < QU'IL A BIEN LE BON REGISTRE 'P' ??? PLR A < RESTAURE : < (A)=REGISTRE 'S'... JNE Z60 < IL EST DIFFERENT, ON LE LAISSE DONC < INCHANGE, MAIS SURTOUT, ON NE REMET < PAS L'UTILISATEUR EN MODE MAITRE !!! < CELA PEUT SE PRODUIRE DE LA FACON < SUIVANTE : < 1 - L'UTILISATEUR EST SOUS "DEBUG", < 2 - IL A FAIT : "S,0" PUIS A MODIFIE < LE REGISTRE 'P' PAR "P,...", < 3 - ENFIN, IL EST SORTI DU "DEBUG" < PAR LA COMMANDE "!GO" ; < DONC, ARRIVANT ICI SUITE AU "!GO", ON < TROUVE 'SVCS'=1, ON DEDUIT QU'IL Y EU < 'SVC', ET ON REFORCE DONC LE MODE < MAITRE QUI AVAIT ETE ANNULE SOUS LE < "DEBUG" PAR L'UTILISATEUR... MAIS 'RP' < N'EST PLUS BON, ON LAISSE DONC L'UTILI- < SATEUR EN MODE ESCLAVE... SBT MS < DANS LE CAS D'UN APPEL PAR 'SVC', ON STA PSTESC-DEMSER+RS,W < ON REMET A PRIORI L'UTILISATEUR EN < MODE MAITRE (AU CAS OU IL SERAIT < PASSE SOUS "DEBUG"...). LA PSTESC-DEMSER+RSLO,W < (A)=(SLO). BSR APDADR < (A)=SLO*16 AD PSTESC-DEMSER+RK,W < (A)=K ABSOLUTISE XR A,W < (W)=K ABSOLU < (A)=ADRESSE DCTESC CPZ O,W < TEST DU P DE RETOUR JE Z60Z < S'IL EST NUL, ON NE FAIT RIEN < CAR ON EST SUREMENT A LA SUITE < D'UN ALT-MODE OU DU LOGIN IC O,W < SAUTONS LE 'SVC CCI'. EN EFFET < A L'ENTREE DU 'SVC CCI', ON < FAIT -1 SUR LE REGISTRE P DE RETOUR XR A,W < (W)=ADRESSE DCT ESCLAVE < (A)=K ABSOLU <******************************************************************************* BSR ASTXES < EXECUTION DU STORE X(ESCLAVE) SUIVANT : STZ PSTESC-DEMSER+RX,W < RAZ DU REGISTRE X DE L'ESCLAVE <******************************************************************************* Z60: EQU $ RSR < RETOUR A L'ESCLAVE. Z60Z: EQU $ XR A,W < (W)=ADRESSE DCT ESCLAVE < (A)=K ABSOLU JMP Z60 CALL #SISP CMS5 DOL2# PAGE < < < R O U T I N E S D E S E R V I C E D U C C I : < < < < < E M I S S I O N M E S S A G E : < R E C E P T I O N M E S S A G E : < < < ARGUMENTS : < (W)=ADRESSE DE LA DCT-ESCLAVE, < (L)=ADRESSE DE LA DCT-SERVICE, < (A)=ADRESSE MOT MESSAGE : EMISSION DEMANDEE SUR 'PHOUT', < =0 : RECEPTION DEMANDEE SUR PHIN DANS BUFESC, < (B)=LONGUEUR OCTET DU MESSAGE. < (LORS D'UNE EMISSION). < < < RESULTATS : < (A)=ADRESSE DCT(ESCLAVE). < (Y)=NSPTYP SUR NSPIN/OUT DE L'ESCLAVE. < < USE L,DCT0 USE W,DEM0 MESSI: EQU $ < RECEPTION SUR PHIN. LAI FGR < DEMANDE DE LECTURE. MESSO: EQU $ < DEMANDE D'EMISSION SI (A)#0, ET < DE RECEPTION SI (A)=K. PSR X < SAVE INDEX COURANT GRAMMAIRE. JAE E854 < UNE RECEPTION EST DEMANDEE. IF FGR-K,,XEIF%, IF ATTENTION : CE QUI PRECEDE EST IDIOT !!! XEIF%: VAL ENDIF < < PREPARATION DE L'EMISSION VERS NSPOUT : < LXI PHOUT < NVP DU PERIPH.OUT. SLLS NOCMO=K < CONVERSION DE L'ADRESSE-MOT < EN UNE ADRESSE OCTET. STA VAR+DEMCCI+T+AMDEM LAI FGW < OPDEM D'UNE ECRITURE. < < REALISATION DE L'EMISSION/RECEPTION : < E855: EQU $ STB VAR+DEMCCI+T+CODEM STA VAR+DEMCCI+T+OPDEM LBY &TASSGN-DCTESC,W SWBR A,A < (A)='NSPTYP' D'UNE DEMANDE DE LECTURE/ < ECRITURE SUR 'NSPIN'/'NSPOUT' DE < L'ESCLAVE... STA VAR+DEMCCI+XXNSP LR A,Y < SAVE LE NSPTYP DANS Y, UTILISE < LORS DE L'EMISSION DE L'INTERRO- < GATION DU CCI. LAD VAR+DEMCCI XR A,W < < ON A ICI : < (A)=ADRESSE DCT(ESCLAVE). < (W)=ADRESSE DEMCCI. < Z846: EQU $ BSR ACHAND < ENVOI DE LA DEMANDE. WAIT WEIO < ATTENTE IMMEDIATE DE LA FIN < DE L'OPERATION. CPZ ARGDEM+ETADEM < TEST DES CONDITIONS DE RETOUR ??? JNE Z845 < ON EST PROBABLEMENT EN PRESENCE < D'UN TERMINAL DE TYPE VISU < GRAPHIQUE QUI SE TROUVE EN MODE < GRAPHIQUE, OU BIEN UN 'ALT-MODE' < A ETE ENVOYE PAR L'ESCLAVE < PENDANT LA SORTIE DU MESSAGE ; < CE SONT LES SEULS CAS < D'ERREUR POSSIBLE (???). < < OK, DEMANDE EXECUTEE, IL Y A < PEUT-ETRE DES CONNEXIONS < MATRICIELLES A EXPLOITER : < PSR A,X LA ARGDEM+OPDEM ANDI MKOPDM < (A)=FONCTION COURANTE, ET < (W)=ADRESSE DE LA DEMANDE COURANTE... SVC SVCM8 < VERS LA DUPLICATION EVENTUELLE DE LA < DEMANDE (W) SUR LES PERIPHERIQUES < CONNECTES AU PERIPHERIQUE COURANT... PLR A,X < < FIN DE 'MESSI'/'MESSO' : < PLR X < RESTAURE (X)=INDEX COURANT DE LA < GRAMMAIRE DU CCI. LR A,W < RESTAURE (W)=@DCT-ESCLAVE. LA FSERV-DCTESC,W < ACCES AU FSERV DE L'ESCLAVE, < AFIN DE SAVOIR SI UN OU < PLUSIEURS ALT-MODE(S) ONT ETE < EMIS PAR L'UTILISATEUR PENDANT < LE MESSAGE. CP AABORT < UN ABORT A-T'IL ETE DEMANDE ??? < (C'EST-A-DIRE 2 ALT-MODES ONT- < ILS ETE FRAPPES???) ; CE TEST EST < RENDU OBLIGATOIRE PAR LA < POSSIBILITE QU'A UN UN PROGRAMME < ESCLAVE DE BOUCLER SUR UN APPEL < AU CCI NON INTERACTIF ; ET DANS < CES CONDITIONS, IL FAUT QUAND < MEME POUVOIR ABORTER CE < PROGRAMME !!! JE Z1520 < TOUT ABORT DEMANDE EST CONSERVE!!! STZ FSERV-DCTESC,W < ET OUI, IL FAUT ENCORE RAZER < FSERV AU CAS OU UN ALT-MODE < AURAIT ETE FRAPPE PENADANT LA < SORTIE D'UN MESSAGE (CF. !DATE) ; < C'EST PAS POUR DIRE, MAIS < L'INTRODUCTION DES 2 ALT- < MODES D'ABORT N'A PAS SIMPLIFIE < LES CHOSES... Z1520: EQU $ LR W,A < RESTAURE : (A)=@DCT-ESCLAVE. RSR < < TRAITEMENT DES ERREURS D'EXECUTION : < Z845: EQU $ < < NOTA : < LE REGISTRE X EST DESTRUCTIBLE. < LX ARGDEM+OPDEM PSR X < SAUVEGARDE DE L'OPDEM COURANT < DE LA DEMANDE DU CCI. LXI FAVCG < FONCTION 'CLOSE GRAPHIQUE'. STX ARGDEM+OPDEM < GENERATION D'UNE DEMANDE < DE 'CLOSE GRAPHIQUE'. PLR X < POUR EVITER DES DEBORDEMENTS < DE LA PILE DU HDL-SERVICE. < < ON A ICI : < (W)=ADRESSE DEMCCI. < (X)=OPDEM DE LA DEMANDE REELLE. < BSR ACHAND < ENVOI DE LA DEMANDE DE < 'CLOSE GRAPHIQUE'. WAIT WEIO < ATTENTE DE FIN DE 'CLOSE < GRAPHIQUE'. STX ARGDEM+OPDEM < RESTAURE L'OPDEM DE LA DEMANDE. CPZ ARGDEM+ETADEM < ALORS ??? JE Z846 < CELA C'EST BIEN PASSE... LXI YCCITO BSR ADODO < LE 'CCI' EST MIS EN SOMMEIL AFIN DE < PERMETTRE UN EVENTUEL CHANGEMENT DE < L'ETAT DE LA VISU SANS BLOQUER LE < SYSTEME SUR DES RETOURS EN ERREURS < PERPETUELS !!! JMP Z846 < NOUVELLE TENTATIVE D'EXECUTION < DE LA DEMANDE. < < PREPARATION DE LA RECEPTION DE NSPIN : < E854: EQU $ LXI PHIN LA DEMESC-DCTESC+T+CODEM,W STA VAR+MBUFGR < AFIN DE VALIDER 'XBUFGR' DANS 'CARAC'... LR W,A < (A)=@DCT-ESCLAVE. ADRI BUFESC-DCTESC,A < (A)=@MOT DE BUFESC. SBT BITX < CONSTITUTION D'UN RELAI EN < VUE D'UNE EVENTUELLE ANALYSE < SYNTAXIQUE DU MESSAGE RECU. STA VAR+ABUFGR STZ VAR+XBUFGR SLLS NOCMO=K < CONVERSION EN UNE @OCTET DE < L'ADRESSE BUFFER (A NOTER QUE < LE BIT D'INDEXATION A DISPARU...) STA VAR+DEMCCI+T+AMDEM LAI FGR < OPDEM D'UNE LECTURE SANS ECHO. LBI LCCI < COMPTE D'OCTETS MAX. JMP E855 PAGE < < < C A R A C T E R E C O U R A N T D E B U F E S C : < < < FONCTION : < CETTE ROUTINE FOURNIT LE < CARACTERE COURANT DU 'BUFESC' < DANS LE REGISTRE 'A' ; DE PLUS < ELLE ELIMINE LES 'NULLS', ET < CECI A CAUSE DE LA DIRECTIVE < "ASCI" DE L'ASSEMBLEUR QUI EN < GENERE LORSQUE LE NOMBRE DE < CARACTERES EST IMPAIR. ENFIN, < ELLE INDIQUE AU DEMANDEUR SI < LE CARACTERE NON NUL RENVOYE < EST UNE FIN DE MESSAGE ('R/C', < 'EON' OU BIEN "."). < DE PLUS, SAUF LORSQUE LA DEMANDE < VIENT DES COMMANDES DU TYPE "!M..." < (CE QUE L'ON IDENTIFIE PAR UN TEST < DE MASQUAGE DES INTERRUPTIONS), LE < BIT DE PARITE EST SYSTEMATIQUEMENT < EFFACE... < < < RESULTAT : < (A)=CARACTERE COURANT DE BUFESC (NON 'NULL'), < ='EOT' SI ON SE TROUVE EN BOUT DE BUFFER CCI. < XBUFGR : PROGRESSE D'UNE UNITE, < INDICATEURS POSITIONNES SUR UN TEST DE LIMITEUR. < ('R/C', 'EON' OU ".") < < CARAC: EQU $ CARAC0: EQU $ < REBOUCLAGE SUR 'NULL'... < < ACCES AU CARACTERE COURANT : < PSR X < SAVE INDEX COURANT DE LA GRAMMAIRE LXI KEON < 'EOT' A PRIORI. LA VAR+XBUFGR < (A)=INDEX COURANT DU BUFFER CCI. CPI LCCINT < VALIDATION... JLE Z305X2 < OK... BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < COMPRENDRE COMMENT L'INDEX < DU BUFFER 'CCI' PEUT ETRE EN < DEBORDEMENT ; EXAMINER 'ABUFGR' < ET SURTOUT 'MBUFGR' !!! < Z305X2: EQU $ CP VAR+MBUFGR < EST-ON EN BOUT DU BUFFER "VISIBLE" ??? XR A,X < (A)='EOT' A PRIORI, < (X)=INDEX COURANT DU BUFFER CCI. JGE Z305 < LORSQU'ON EST EN BOUT DE < BUFFER CCI, ON RENVOIE DANS < A UN 'EOT' SIMULANT UN <EOM>. LBY &VAR+ABUFGR < (A)=CARACTERE COURANT DE BUFESC. TBT BITPAR < A-T'IL LA PARITE ??? JNC Z305X1 < NON... PSR A < OUI, ON LE SAUVEGARDE, BSR ASMIT < QUEL EST L'ETAT DES INTERRUPTIONS ??? < (C'EST UN TEST PEU ELEGANT DES COMMAN- < DES "!M... ; EN EFFET, ELLES UTILISENT < LE BIT DE PARITE : CF. 'KCRP' ET 'KEOTP') XWOR%1: VAL K XWOR%1: VAL CORBT?IPM=FMASK(K?XWOR%1=FCINST XWOR%1: VAL CORBT?IOM=FMASK(K?XWOR%1=FCINST CPI XWOR%1 < ALORS LES INTERRUPTIONS SONT-ELLES < MASQUEES ??? PLR A < RESTAURE : (A)=CARACTERE COURANT... JNE Z305X1 < OUI, DONC ON NE TOUCHE PAS AU BIT < DE PARITE : C'EST UNE COMMANDE "!M...". RBT BITPAR < NON, ON ELEMINE LA PARITE AFIN D'IGNORER < LA PROVENANCE DU CARACTERE... Z305X1: EQU $ Z305: EQU $ IC VAR+XBUFGR < PROGRESSION DE L'INDEX COURANT < DE BUFESC. PLR X < RESTAURE INDEX GRAMMAIRE. < < TEST DE LIMITEUR : < CPI KCR < EST-CE LE RETOUR-CHARRIOT ??? JE Z305JE < OUI... CPI KEON < EST-CE <EON> ??? JE Z305JE < OUI... CPI KPOINT < EST-CE LE POINT ??? JAE CARAC0 < ON ELIMINE LES 'NULL', AFIN DE FACILI- < TER L'ECRITURE DES PROGRAMMES UTILI- < SATEUR EXPLOITANT LA DIRECTIVE "ASCI" < DE L'ASSEMBLEUR QUI EN GENERE EN BOUT < DE CHAINES EN CAS D'UN NOMBRE IMPAIR < DE CARACTERES. < CE 'JAE' EST MIS APRES LE TEST SUR < 'EON' A CAUSE DES DEBORDEMENTS DE < L'INDEX 'XBUFGR' : AINSI ON NE BOUCLERA < EN CAS D'UNE SUITE DE 'NULLS' EN FIN < FIN DE BUFFER, SANS CARACTERE DE FIN DE < MESSAGE EXPLICITE... Z305JE: EQU $ < < SORTIE : < RSR < < < F I N D E N O M : < < EON:: VAL KEON < CARACTERE DE 'FIN DE NOM'. PAGE < < < D E P L A C E M E N T D A N S ' B U F G R ' : < < < FONCTION : < CE MODULE PERMET D'AVANCER < OU DE RECULER DANS LE BUFFER < UTILISATEUR 'BUFGR'. < DEUX ENTRIES SONT DISPO- < NIBLES : L'UNE POUR AVANCER < ('ICXBUF'), ET L'AUTRE POUR < RECULER ('DCXBUF'). < < < ARGUMENT : < (B)=VALEUR ABSOLUE DU DEPLACEMENT. < < DCXBUF: EQU $ < ENTRY 'RECULER' : NGR B,B < AFIN D'AVOIR UN DEPLACEMENT ARRIERE... ICXBUF: EQU $ < ENTRY 'AVANCER' : LA VAR+XBUFGR < (A)=INDEX COURANT, ADR B,A < ON SE REPOSITIONNE EN RELATIF, STA VAR+XBUFGR < ET ON MET A JOUR... RSR PAGE < < < I N I T I A L I S A T I O N D E ' V A L E S C ' : < < < ARGUMENTS : < (B)=VALEUR POSITIVE A DONNER A 'VALESC', < (W)=ADRESSE DE 'DCTESC'. < < < RESULTAT : < (VALESC)=(B). < < PSTVAL: EQU $ STB VALESC-DCTESK,W < AIN'T IT HARD... RSR PAGE < < < C H A N G E M E N T D E ' C A R A L T ' S U R ! W : < < < FONCTION : < LORS DE LA FRAPPE DE !W, ON REMPLACE < 'CARALT' LORSQU'IL S'AGIT D'UN UTILISATEUR < INTERACTIF, PAR LE DERNIER CARACTERE FRAPPE < ENTRE "!W" ET <EOM> ; S'IL N'EXISTE PAS, < 'CARALT' DEMEURE INCHANGE... < < CCIALT: EQU $ BSR ACHKIN < RENVOIE : (A)=NSPIN, JE CCIAL1 < OK, NSPIN=NSPOUT (UTILISATEUR < INTERACTIF COMME LE PREVOIT LA GRAMMAIRE. BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < VOIR COMMENT ON A PU EN ARRIVER LA !!! < JMP CCIAL2 < ET ON SORT... CCIAL1: EQU $ PSR X,L LR A,X < (X)=NSPIN, BSR ACARAC < (A)=CARACTERE COURANT DU 'BUFESC' ; A < NOTER QUE, VUE LA GRAMMAIRE DU 'CCI', < IL NE PEUT S'AGIR D'UN <EOM>... LR A,B < (B)=CARACTERE COURANT ; A NOTER QUE L'ON < FAIT AINSI, CAR 'CARAC' A BESOIN DE < LA BASE 'L' !!! BSR ACADCT < (L)=ADRESSE DE LA DCT(NSPIN)... STB VAR+CARALT < LE CARACTERE COURANT DEVIENT 'CARALT'... PLR X,L CCIAL2: EQU $ RSR PAGE < < < C A R A C T E R E S D E C O M M A N D E < D U S G N : < < SPLUS:: VAL KPLUS < INSERTION D'UN CHEMIN, SMOINS:: VAL KMOINS < SUPPRESSION D'UN CHEMIN. PAGE < < < I N S E R T / D E L E T E A C N : < < < RESULTAT : < (Y)=7, POUR VALIDATION ACN DANS 'ACNON', < OPDEM(DEMCCI)=2 (FONCTION INSERT/DELETE). < < LOGNEW: EQU $ LA MEMV TBT MEMXXX < INSERT/DELETE ACN AUTORISES ??? JC LOGNW1 < OUI, ON Y VA... ADRI XCCIER,X < NON, RETOUR EN ERREUR... JMP LOGNW2 < ET ON SORT... LOGNW1: EQU $ PSR X < SAVE INDEX COURANT DE LA GRAMMAIRE < DU CCI. LX VAR+DEMCCI+T+CODEM LAI EON < EN EFFET, ON RAJOUTE EN QUEUE < DE L'ACN UN 2EME <EON> POUR < INITIALISER A VIDE LE SOUS- < CATALOGUE DES NOMS DE CE < NUMERO DE COMPTE. STBY &VAR+ABUFGR < STORE IN BUFFER. IC VAR+DEMCCI+T+CODEM < ON FAIT COMME SI CE 2EME < <EON> AVAIT ETE ENVOYE PAR < LE DEMANDEUR. PLR X < RESTAURE L'INDEX DE LA GRAMMAIRE. XVACN7:: VAL XXACN*NOCMO+W+W+W LYI XVACN7 < EN EFFET, DANS LE CAS D'UN < INSERT/DELETE, ON A : < <ACN>::=<+/-><K1><K2><K3> < <K4><EON><EON>. LAI FGID < FONCTION INSERT/DELETE. STA VAR+DEMCCI+T+OPDEM LOGNW2: EQU $ RSR < < < P R E P A R A T I O N D ' U N L O G I N : < < < RESULTAT : < (Y)=5, POUR VALIDATION ACN DANS 'ACNON', < OPDEM(DEMCCI)='A (FONCTION TEST). < < LOGOLD: EQU $ XVACN5:: VAL XXACN*NOCMO+W LYI XVACN5 < DANS LE CAS D'UN LOGIN, ON : < <ACN>::=<K1><K2><K3>K4><EON>. LAI FGT < FONCTION DE TEST. STA VAR+DEMCCI+T+OPDEM RSR < < < C H E C K N U M E R O D E C O M P T E < A U L O G I N : < < < FONCTION : CETTE ROUTINE EST APPELEE PAR < LE CCI LORS DE LA RENCONTRE DE 'LOGIN'. < ELLE RECUPERE L'ACN, ET PAR < L'INTERMEDIAIRE DE HDLTRI, LE VALIDE. < < < ARGUMENTS : < (Y)=5, SI LOGIN NORMAL, < 7, SI OPERATION INSERT/DELETE ACN, < OPDEM(DEMCCI)='A, SI LOGIN NORMAL, < '2, SI OPERATION INSERT/DELETE ACN, < (L)=ADRESSE DCT(SERVICE), < (W)=ADRESSE DCT(ESCLAVE). < < ACNON: EQU $ LA VAR+DEMCCI+T+CODEM SB VAR+XBUFGR < (A)=LONGUEUR DE L'ACN SUPPOSE. CPR A,Y < VALIDATION : RAPPELONS QU'UN < ACN EST : < <ACN>::=<K1><K2><K3><K4><EON>. < (AVEC <+>/<-> DANS LE CAS < INSERT/DELETE). JNE Z42 < ERREUR DE FORMAT. < < CAS OU LA LONGUEUR EST CORRECTE : < STA VAR+DEMCCI+T+CODEM < MAJ CODEM POUR HDLTRI. LA VAR+DEMCCI+T+AMDEM AD VAR+XBUFGR < (A)=@OCTET DE L'ACN SUPPOSE. STA VAR+DEMCCI+T+AMDEM < MAJ AMDEM EN VUE DE HDLTRI. STZ VAR+DEMCCI+T+ASDEM LAI NSPTRI SWBR A,A STA VAR+DEMCCI+XXNSP < GENERATION DU NSPTYP DE DEMANDE < D'HDLTRI. LAD VAR+DEMCCI XR A,W < (W)=@DEMCCI (VERS HDLTRI), < (A)=SAVE W (@DCT-ESCLAVE). BSR ACHAND < ENVOI DE LA DEMANDE A HDLTRI. WAIT WEIO < ATTENTE DE FIN DE TEST DANS < L'ARBRE DU SYSTEME. LR A,W < RESTAURE (W)=@DCT-ESCLAVE. < < TEST DES CONDITIONS DE RETOUR : < LA VAR+DEMCCI+T+ETADEM JANE Z42 < ACN NON RECONNU : ERREUR. < < DISCRIMINATION LOGIN/OPERATION-ACN : < LR Y,A CPI XVACN7 < EST-CE UN INSERT/DELETE 'ACN' ??? JE Z43X < OUI, C'EST TOUT. < < < L O G I N : < < < < OK, ACN RECONNU, L'UTILISATEUR < PEUT RENTRER DANS LE SYSTEME : < DC VAR+DEMCCI+T+CODEM < SUPPRESSION DE <EON> ENN VUE < DU MOVE DE L'ACN VERS LA DCT < DE L'UTILISATEUR. LAI FGW < FONCTION D'ECRITURE. STA VAR+DEMCCI+T+OPDEM LAD ACNESC-DCTESC,W < (A)=@MOT DE L'ACN DANS DCT-ESCLAVE. SLLS NOCMO=K < (A)=@OCTET OU METTRE L'ACN < DANS DCT-ESCLAVE. STA VAR+DEMCCI+T+ASDEM LAI NSPMEM SWBR A,A STA VAR+DEMCCI+XXNSP < GENERATION D'UN NSPTYP VERS < HDLMEM, POUR DEPLACER L'ACN < RECONNU DU BUFFER VERS ACNESC. LAD VAR+DEMCCI XR A,W < (W)=@DEMCCI, < (W)=@DCT-ESCLAVE. BSR ACHAND < ENVOI DE LA DEMANDE DE MOVE. BSR ACHANW < ATTENTE DE FIN DE MOVE. LR A,W < RESTAURE (W)=@DCT-ESCLAVE. < < SORTIE DE LA ROUTINE : < Z43: EQU $ RSR < < RETOUR EN ERREUR DE LA ROUTINE : < Z42: EQU $ ADRI XCCIER,X < PROGRESSION DE L'INDEX COURNAT < DE LA GRAMMAIRE DU CCI (ERREUR). JMP Z43 < VERS LA SORTIE. < < < I N S E R T / D E L E T E A C N : < < Z43X: EQU $ PSR X LX VAR+XBUFGR < (X)=INDEX COURANT DU BUFFER CCI, LBY &VAR+ABUFGR < (A)=CARACTERE COURANT "+" OU "-". CPI SMOINS < EST-CE UN 'DELETE' ??? LAI SPLUS < EN TOUT CAS, STBY &VAR+ABUFGR < ON FORCE UN 'INSERT'... PLR X JNE Z43 < CE N'EST PAS UN 'DELETE', ON SORT... < < CAS DU 'DELETE' D'UN <ACN> : < LAI FGT < (A)=FONCTION DE TEST... STA VAR+DEMCCI+T+OPDEM LAI XVACN5 < (A)=LONGUEUR EN OCTETS POUR UN TEST... STA VAR+DEMCCI+T+CODEM IC VAR+DEMCCI+T+AMDEM < ON SAUTE LE CARACTERE "-"... STZ VAR+DEMCCI+T+ASDEM LAD VAR+DEMCCI XR A,W < (W)=ADRESSE DE LA DEMANDE VERS 'HDLTRI', BSR ACHAND < ENVOI D'UN DEMANDE DE TEST DE <ACN>... WAIT WEIO < ATTENTE DE FIN DE TEST, LR A,W < RESTAURE W... LA VAR+DEMCCI+T+ETADEM < ALORS ??? JANE Z43 < OK, L'<ACN> N'EXISTE PLUS, LE 'DELETE' < S'EST BIEN PASSE : IL N'Y AVAIT PAS < DE CATALOGUE DERRIERE LUI (MIS A PART < LE PREMIER <EON>). < < CAS OU L'<ACN> EXISTE ENCORE : SON < CATALOGUE N'ETAIT PAS VIDE, IL FAUT < DONC RECREER SA RACINE <EON>... < LAI FGID < (A)=FONCTION INSERT/DELETE : NE PAS OUBLI < QU'ON A REMPLACE "-" PAR "+" DANS LE < BUFFER DU CCI ==> 'INSERT'... STA VAR+DEMCCI+T+OPDEM LAI XVACN7 < (A)=LONGUEUR EN OCTETS POUR UN 'INSERT'. STA VAR+DEMCCI+T+CODEM DC VAR+DEMCCI+T+AMDEM < POSITIONNEMENT SUR LE "+"... STZ VAR+DEMCCI+T+ASDEM LAD VAR+DEMCCI XR A,W < (W)=ADRESSE DE LA DEMANDE A 'HDLTRI', BSR ACHAND < ENVOI D'UNE DEMANDE DE REINSERTION < DE L'<ACN> ET SURTOUT DE LA RACINE < <EON> DE SON CATALOGUE NON VIDE... BSR ACHANW < ATTENTE AVEC 'SYSER' SUR DEFAUT... LR A,W < RESTAURE W... JMP Z42 < ET ON FAIT UNE SORTIE EN ERREUR < PUISQUE FINALEMENT ON N'A PAS DELETE... PAGE < < < M E M O R I S A T I O N D ' U N L O G I N < I N I T I A L S O U S : S Y S E T T E S T : < < < FONCTION : < LE BIT 'IDESC2' DE LA 'DCTESC' MEMORISE < SI LE LOGIN INITIAL A EU LIEU SOUS ":SYS" < OU PAS. ON DISPOSE, SI CELA EST LE CAS D'UNE < COMMANDE SPECIALE !L DE CHANGEMENT DE NUMERO < DE COMPTE EN VOL... < DE PLUS, APRES CHAQUE LOGIN < SOUS ":SYS", ON RETABLIT SYSTEMA- < TIQUEMENT L'UTILISATION DU TOM < ED ESSAP, AU CAS OU L'ON EN SERAIT < A UNE PHASE DE REINITIALISATION < GENERALE DU SYSTEME, AU COURS DE < LAQUELLE LE PREMIER LOGIN SOUS ":SYS" < NE NECESSITE PAS LE TOM ED ESSAP, < AU CAS OU JE NE SERAIS PAS LA ??!??! < < < M E M O R I S A T I O N : < < INDSYS: EQU $ LA IDDESC-DCTESC,W SBT IDESC2 < MEMORISATION DE ":SYS" INITIAL... STA IDDESC-DCTESC,W NLS < < RETABLISSEMENT SYSTEMATIQUE DU TOM ED ESSAP : < PSR A,W LRM A,W WORD N335X1 WORD AN335 STA O,W < LORS DU TEST DU NUMERO DE COMPTE, APRES < LE LOGIN, ON SE BRANCHERA SI ":SYS" SUR < LE NOEUD 'N335' D'ENTREE DU TOM ED < ESSAP... PLR A,W LST RSR < < < T E S T : < < TESSYS: EQU $ LA IDDESC-DCTESC,W TBT IDESC2 < ETAIT-ON INITIALEMENT SOUS ":SYS" ??? JC TESSY1 < OUI, OK... ADRI XCCIER,X < NON, ERREUR... TESSY1: EQU $ RSR < ET C'EST TOUT... < < < P O I N T D E N O N R E T O U R : < < < FONCTION : < LA COMMANDE "!L<EOM>" PERMET < LORSQU'ON S'EST LOGUE INITIALE- < MENT SOUS ":SYS", ET QUE L'ON < Y EST PLUS D'INHIBER DEFINITI- < VEMENT LE RETOUR POSSIBLE A < L'<ACN> ":SYS", D'OU LE NOM... < < < ARGUMENT : < (W)=ADRESSE DE 'DCTESC'. < < PNRET: EQU $ LA IDDESC-DCTESC,W TBT IDESC2 < ALORS ETAIT-ON INITIALEMENT SOUS ":SYS" ? RBT IDESC2 < A PRIORI, POINT DE NON RETOUR... STA IDDESC-DCTESC,W JC PNRET1 < OK, ON ETAIT INITIALEMENT SOUS ":SYS" (ON < N'Y EST PLUS D'AILLEURS, C'EST LA GRAM- < MAIRE DU 'CCI' QUI L'A DEJA VERIFIE LORS- < QU'ON ARRIVE ICI...), ON NE POURRA PLUS < Y REVENIR, NI PLUS CHANGER NON PLUS < DYNAMIQUEMENT D'<ACN>... ADRI XCCIER,X < IL N'Y A PAS EU DE LOGIN INITIAL SOUS < ":SYS", OU BIEN UN POINT DE NON RETOUR < A DEJA ETE FRANCHI... PNRET1: EQU $ RSR < ET C'EST TOUT... PAGE < < < G E S T I O N D E S P R I O R I T E S : < < < FONCTION : < ON DISPOSE DE 2 PRIORITES : < 1 - LA PRIORITE NORMALE (ETAT INITIAL, < ET SUITE A LA COMMANDE "!L0"), < 2 - LA PRIORITE INFERIEURE (SUITE A < LA COMMANDE "!L1"). < LA PRIORITE INFERIEURE PROVOQUE < UN SWAPPING OUT A PRIORI, SANS < UTILISER L'"HORLOGE" DE SWAPPING, < ET PEUT PROVOQUER UNE INTERUPTION < DE CET UTILISATEUR, LORSQU'UN < AUTRE EST EN FIN DE SERVICE... < < < ARGUMENT : < (W)=ADRESSE DE LA 'DCT-ESCLAVE'. < < LPRIO: EQU $ < < < P R I O R I T E N O R M A L E : < < LPRIO0: EQU $ LA IDDESC-DCTESC,W RBT IDESC6 < IDESC6=0 : PRIORITE NORMALE... JMP LPRIOA < VERS LA MEMORISATION... < < < P R I O R I T E I N F E R I E U R E : < < LPRIO1: EQU $ LA IDDESC-DCTESC,W SBT IDESC6 < IDESC6=1 : PRIORITE INFERIEURE... < < MEMORISATION DE LA PRIORITE : < LPRIOA: EQU $ STA IDDESC-DCTESC,W RSR PAGE < < < C O M M A N D E D E S C O M M A N D E S : < < < FONCTION : < CETTE COMMANDE PERMET D'ENCHAINER < AUTOMATIQUEMENT UNE SERIE DE COMMANDES < <COM1>, <COM2>,... EN RESPECTANT LA < SYNTAXE SUIVANTE, ET A CONDITION D'ETRE < UN UTILISATEUR TEMPS PARTAGE ('NSPIN'= < 'NSPOUT') : < < !M<LIM><COM1><LIM><COM2><LIM>...<COMN><LIM><EOM>. < < OU <LIM> EST LE PREMIER CARACTERE RENCONTRE < DERRIERE "!M" ET QUI DEFINIT LE SUBSTITUT DE < <EOM> POUR CHACUNE DES COMMANDES <COMI> ; IL < EST ALORS REMPLACE PAR <KEON>... < < < ATTENTION : < LA COMMANDE "!M" EST LA SEULE < POUR LAQUELLE, SAUF IMMEDIATEMENT < DERRIERE LE "M", LE CARACTERE < 'KPOINT' (".") N'EST PAS CONSIDERE < COMME LIMITEUR, AFIN EN PARTICULIER < POUVOIR RENCONTRER DES "!C." DANS < "!M"... < < STBAV: EQU $ BSR ACARAC < ACCES AU CARACTERE COURANT DANS 'A', ET < TEST D'UN LIMITEUR DES LE DEBUT : JE STBAV4 < EFFECTIVEMENT C'EST "!M<EOM>"... LR A,Y < (Y)=LIMITEUR UTILISE POUR LES COMMANDES < INTERMEDIAIRES (<LIM>). BSR ACHKIN < (A)=NSPIN DE L'UTILISATEUR : JE STBAV5 < OK, ON A BIEN : 'NSPIN'='NSPOUT'... BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < VOIR POURQUOI LE TEST SUR L'INTERACTIVITE < EST ICI NEGATIF, ALORS QUE DANS LA GRAMMAIRE < IL FUT POSITIF !!! < JMP STBAV4 < ET ON ABANDONNE... STBAV5: EQU $ PSR B,X,L < SAUVEGARDE DE L'INDEX COURANT DE LA < GRAMMAIRE DU 'CCI' (X) ET L'ADRESSE < DE 'DCTSER' (L). LR L,B < (B)=ADRESSE DE 'DCTSER' (POUR PERMETTRE < L'ACCES AU 'BUFESC'). LR A,X < (X)='NSPIN', BSR ACADCT < (A)=(L)=ADRESSE DE LA 'DCTVIS' DE < L'UTILISATEUR... BSR ABETA2 < (A)=BETA(SIT(VISU(NSPIN))) : IF XXSIT0-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT (AINSI QU'AILLEURS IF DANS LE SYSTEME) EST IDIOT !!! XEIF%: VAL ENDIF JAGE STBAV6 < OK, LA VISU N'EST PAS EN ATTENTE... LXI FIVALT < ALLONS BON, LA VISU EST EN ATTENTE, < MAIS N'EST -CE PAS POUR LE TEST DU < "ALT-MODE" ??? LA &VISOTO < (A)=ETAT SUITE A UN "ALT-MODE", CP ETAT1 < L'ETAT COURANT DE LA VISU NE SERAIT-IL < PAS CELUI QUI SUIT LA RECEPTION D'UN < PREMIER "ALT-MODE" ??? JE STBAV8 < OUI, DONC ON ABANDONNE IMMEDIATEMENT, < EN ERREUR, BIEN QU'EN FAIT CELA SOIT < UN PEU INDIFFERENT... BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < COMPRENDRE COMMENT CETTE VISU PEUT < ETRE EN ATTENTE, ALORS QUE SON UTILISATEUR < EST DANS LE 'CCI' !!! IL SE PEUT QU'ELLE < SOIT ASSIGNEE PAR QUELQU'UN D'AUTRE, QUI < A LANCE UNE ENTREE-SORTIE DESSUS, ALORS < QUE SON POSSESSEUR UTILISE LE 'CCI' < INTERPRETATIF... < JMP STBAV8 < ET ON ABANDONNE... (MAIS EN ERREUR...) STBAV6: EQU $ < < BOUCLE DE RECUPERATION DES CARACTERES : < BSR ASMMK < ON MASQUE LES INTERRUPTIONS AFIN D'ACCE- < DER PROPREMENT AU BUFFER D'ANTICIPATION < DE LA VISU (ON MASQUE GLOBALEMENT, ET NON < PAS AU NIVEAU DE CHAQUE CARACTERE, POUR < DES RAISONS DE PERFORMANCE...). STBAV1: EQU $ < < ON A ICI : < (B)=ADRESSE DE 'DCTSER', < (Y)=LIMITEUR <LIM> DE CHAQUE COMMANDE, < (L)=ADRESSE DE LA 'DCTVIS'. < XR B,L < AFIN D'ACCEDER A 'DCTSER' : BSR ACARAC < (A)=CARACTERE COURANT DU 'BUFESC', ET < TEST DE LIMITEUR... XR B,L < AFIN D'ACCEDER A 'DCTVIS'... JE STBAV2 < C'EST LA FIN DE LA COMMANDE "!M"... STBAVA: EQU $ < RETOUR LORSQUE "." A ETE DETECTE, ET < BETEMENT DECLARE COMME UN LIMITEUR < <EOM> PAR 'CARAC', CE QUI EST FAUX DANS < LA COMMANDE "!M"... CPR A,Y < NON, ALORS EST-ON SUR <LIM> ??? JNE STBAV3 < NON, ON GARDE LE CARACTERE (A)... LAI KEON < OUI, ON LE REMPLACE PAR 'EON'... STBAV3: EQU $ KEOTP:: VAL COSBT?BITPAR=FMASK(K?KEOT=FCINST < 'EOT' AVEC BIT DE PARITE, KCRP:: VAL COSBT?BITPAR=FMASK(K?KCR=FCINST < 'CR' AVEC BIT DE PARITE. CPI KCRP < EST-CE LE 'CR' AVEC BIT DE PARITE ??? JE STBAV9 < OUI, CELA NE CONSTITUE PAS UNE ERREUR, < ET CELA PERMET AUX UTILISATEURS, MAIS < SURTOUT AUX COMMANDES PRE-PROGRAMMEES < DE FORCER DES 'CR' ET DES 'EOT', ET SUR- < TOUT DE LES DISTINGUER (CF. 'DEBUG'...). CPI KEOTP < EST-CE 'EOT' AVEC BIT DE PARITE ??? JE STBAV9 < OUI, MEME REMARQUE... TBT BITPAR < NON, ALORS COMMENT EST LE BIT DE PARITE ? JC STBAWC < POSITIONNE, ERREUR !!! SBT BITPAR < AFIN D'ASSURER LA COMPATIBILITE AVEC < LES VRAIES ENTREES VISUS, ON FORCE < LE BIT DE PARITE ('BITPAR'). < < INSERTION DU CARACTERE (A) < DANS LE BUFFER D'ANTICIPATION : < STBAV9: EQU $ < CAS DE 'KCRP' ET 'KEOTP'... LR A,X < (X)=SAVE LE CARACTERE ENTRE... LA VAR+KCWIO < ACCES AU NOMBRE DE CARACTERES EN ATTENTE, CPI XXVNCM-Z-Z < Y-A-T'IL DEBORDEMENT ??? < NOTA : ON FAIT '-Z-Z' AFIN QU'UN < 'ALT-MODE' TAPPE ENSUITE NE PROVOQUE < PAS UNE 'SYSER' DANS 'ITVIS' POUR < DEBORDEMENT DU BUFFER... JGE STBAWC < OUI : CE CARACTERE EST IGNORE !!! LA VAR+ICWIN < NON, (A)=INDEX D'INSERTION... ADRI I,A < PROGRESSION DE L'INDEX, CPI XXVNCW < DEBORDE-T'IL ??? JL STBAW7 < NON... NTRN LAI XXVIN+I/XXVNCW(K=FCREST < OUI, ON LE REINITIALISE... TRN STBAW7: EQU $ XR A,X < (A)=CARACTERE LU, STBY &VAR+ALVCW < QUE L'ON MET DANS LE BUFFER, IC VAR+KCWIO < ET UN CARACTERE DE PLUS... STX VAR+ICWIN < PUIS MISE A JOUR DE L'INDEX. BSR ARVHDL < ON REVEILLE (ENFIN, ON AGIT SUR 'SIT') < LE 'HDLVIS(IN)' POUR DES RAISONS DE < COMPATIBILITE AVEC 'HDLMUL'... JMP STBAV1 < AU CARACTERE SUIVANT... < < FIN NORMALE : < STBAV2: EQU $ < CAS D'UN LIMITEUR RENCONTRE : CPI KPOINT < LE LIMITEUR RENCONTRE NE SERAIT-IL PAS < PAR MALHEUR LE CARACTERE 'KPOINT' ??? JE STBAVA < OUI, "!M" EST LA SEULE COMMANDE DU 'CCI' < POUR LAQUELLE 'KPOINT' N'EST PAS UN < LIMITEUR AU MEME TITRE QUE <EOT> OU < <R/C>... BSR ASMDK < ON DEMASQUE LES INTERRUPTIONS... PLR B,X,L < RESTAURE : < (X)=INDEX DE LA GRAMMAIRE DU 'CCI', < (L)=ADRESSE DE 'DCTSER'... STBAV4: EQU $ RSR < < SORTIE EN ERREUR : < STBAWC: EQU $ BSR ASMDK < DEMASQUAGE DES INTERRUPTIONS... STBAV8: EQU $ PLR B,X,L < RESTAURE L'INDEX DE LA GRAMMAIRE DU < 'CCI', ET L'ADRESSE DE 'DCTSER'... ADRI XCCIER,X < POUR UN RETOUR EN ERREUR AU 'CCI'... JMP STBAV4 < VERS LA SORTIE... PAGE < < < C O M M A N D E D E C O M M A N D E S < P R E P R O G R A M M E E S : < < < FONCTION : < LA COMMANDE "!N<NUMERO> PERMET < DE REFERENCER DES COMMANDES "!M..." < PRE-PROGRAMMEES DANS LA GRAMMAIRE < DU 'CCI'. < < KLIMS:: VAL KSLASH < CARACTERE LIMITEUR UTILISE COMME SUBSTI- < TUT DE <EOM> ; VOIR <LIM> DANS "!M"... < < < V A L I D A T I O N E T I N I T I A L I S A T I O N : < < < ARGUMENT : < (L)=ADRESSE DE 'DCTSER', < (W)=ADRESSE DE LA 'DCTESC', < VALESC=NUMERO DE LA COMMANDE PREPROGRAMMEE. < < P1COM: EQU $ < < VALIDATION DU NUMERO DE COMMANDE : < LA VALESC-DCTESK,W < (A)=NUMERO DE LA COMMANDE DEMANDEE : WORD CPCOM0 < VALIDATION INFERIEURE ??? JL P1COM1 < ERREUR, N'EXISTE PAS... WORD CPCOMN < VALIDATION SUPERIEURE ??? JGE P1COM1 < ERREUR, N'EXISTE PAS... < < POINTONS SUR LA COMMANDE : < PSR W < SAUVEGARDE DE L'ADRESSE DE 'DCTESC', LRM W WORD LCOMP < (W)=ADRESSE DE LA LISTE DES RELAIS < INDEXES VERS LES DIFFERENTES COMMAN- < COMMANDES, ADR A,W < (W)=ADRESSE DU RELAI VERS LA COMMANDE < DESIREE, LA O,W < (A)=RELAI INDEXE VERS LA COMMANDE... IF BITX-BITSIG,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF JAL P1COM3 < OK, LE RELAI EST BON... BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < VOIR SI LE RELAI EST VRAIMENT < MAUVAIS, OU SI C'EST SON ADRESSE !!! < P1COM3: EQU $ PLR W < RESTAURE : < (W)=ADRESSE DE 'DCTESC'. XM VAR+ABUFGR < MISE DANS LE RELAI COURANT DU BUFFER < DU RELAI VERS LA COMMANDE COURANTE, ET < (A)=SAVE LE RELAI COURANT VERS LE < BUFFER 'BUFESC', STA VALESC-DCTESK,W < QUE L'ON MET EN TEMPORAIRE (JUSQU'A < 'P3COM') DANS 'VALESC'... STZ VAR+XBUFGR < ET ON POINTE SUR LE DEBUT DE LA < COMMANDE DEMANDEE, SUR LA DEFINITION < DE <LIM> ; A NOTER QUE "!M" EST IMPLI- < CITE... LAI LCCINT STA VAR+MBUFGR < AFIN DE VALIDER 'XBUFGR' DANS 'CARAC'... < < SORTIE : < P1COM2: EQU $ RSR < < SORTIE EN ERREUR : < P1COM1: EQU $ ADRI XCCIER,X < RETOUR EN ERREUR AU 'CCI'... JMP P1COM2 < VERS LA SORTIE... < < < E R R E U R S Y S T E M E : < < P2COM: EQU $ BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE : < REPERER LA COMMANDE "!M..." PRE- < PROGRAMMEE COURANTE, ET VOIR COMMENT < ELLE A PU ETRE REFUSEE !!! < RSR < < < F I N D E " ! N " : < < < FONCTION : < CE MODULE RETABLIT LES CONDITIONS < INITIALES D'AVANT "!N" ; MAIS EST-CE < VRAIMENT UTILE : ON NE RETABLIT PAR < 'XBUFGR', NI 'MBUFGR', ET CELA A < L'AIR DE BIEN MARCHER !!! < < P3COM: EQU $ LA VALESC-DCTESK,W < (A)=RELAI INDEXE VERS 'BUFESC', STA VAR+ABUFGR < CE QUI PERMET DE REGENERER LE RELAI < COURANT DU BUFFER POUR LE 'CCI'... RSR < < < C O M M A N D E S P R E - P R O G R A M M E E S < D E < C O M M A N D E S P R E - P R O G R A M M E E S : < < < FONCTION : < CE SOUS-PROGRAMME EST UTILISE < POUR COMMUNIQUER UN NUMERO DE < COMMANDE "!N" IMPLICITE, PERMETTANT < DE COMPACTER EN QUELQUE SORTE PAR < EXEMPLE LES ASSIGNATIONS LES PLUS < FREQUENTES... < < < ARGUMENTS : < (B)=NUMERO DE "!N" IMPLICITE, < (W)=ADRESSE DE 'DCTESC'. < < < RESULTATS : < VALESC(DCTESC)=NUMERO DE "!N" IMPLICITE < COMPATIBLE AVEC 'P1COM'. < < P4COM: EQU PSTVAL PAGE < < < D E S A S S I G N A T I O N G L O B A L E < D E L A T A S S G N : < < < FONCTION : < CES 2 ROUTINES APPELEES PAR L'INTERMEDIAIRE < DE LA COMMANDE !CLOSE, PERMETTENT DE FAIRE < SUR CHAQUE ENTREE DE TASSGN !ASSIGN NVP=S ; < ON PARCOURT TASSGN D'UNE MANIERE INCREMENTALE < DE NVP=PHOUT+1 A NVP=2*LTASGN-1. < < < ARGUMENT : < YSER(DCTESC)=LE NVP COURANT SUR LEQUEL < ON TENTE UN !ASSIGN...=S. < < < I N I T I A L I S A T I O N N V P : < < < RESULTAT : < YSER(DCTESC)=PHOUT. < < INVP2: EQU $ XMAXIO:: VAL PHOUT < MAXIMUM A PRIORI... IF PHIN-PHOUT,XEIF%,XEIF%, XMAXIO: VAL PHIN < ET BIEN NON, C'EST 'PHIN' LE MAX... XEIF%: VAL ENDIF LYI XMAXIO < Y <-- MAX(PHIN,PHOUT). STY YSER-DCTESC,W < INITIALISATION YSER(DCTESC)=2. RSR < C'EST TOUT... < < < P R O G R E S S I O N D U N V P C O U R A N T : < < < RESULTAT : < YSER(DCTESC)<--(YSER(DCTESC))+1, < X<--(X)+1, SI YSER>=2*LTASSGN. < (CF. LA ROUTINE 'NVPAS') < < NVPP1: EQU $ IC YSER-DCTESC,W < +1 SUR LE NVP COURANT. LA YSER-DCTESC,W < (A)=NVP COURANT POUR LES < VALIDATIONS D'USAGE. JMP Z810 < VERS 'NVPAS'. PAGE < < < A S S I G N A T I O N : N V P --> N S P : < < < FONCTION : < CES ROUTINES SONT PAPPELLEES LORS DE < LA RENCONTRE D'UNE COMMANDE D'ASSIGNATION < D'UN NVP A UN NSP ; LA SYNTAXYE EN EST : < < !ASSIGN <NVP>=<NSP>. < < < ARGUMENTS : < (L)=ADRESSE DCT(SERVICE), < (W)=ADRESSE DCT(ESCLAVE). < < < V A L I D A T I O N D ' U N N V P : < < < FONCTIONS : < 'NVPAS' : DETERMINE SI LE 'NVP' EST ASSIGNE, < 'NVPASD' : IDEM, MAIS SANS RECUPERER LE 'NVP' DANS < LE BUFFER D'ANALYSE SYNTAXIQUE (UTILISE < PAR LA COMMANDE DE DELETE FICHIER) AUQUEL < CAS 'Y' EST UN ARGUMENT DONNANT LE 'NVP'... < < < RESULTAT : < (Y)=NVP SI NVP NON ASSIGNE, < NVP.OR.'FF80, SI NVP DEJA ASSIGNE (Y<0). < < NVPAS: EQU $ PSR X < SAVE INDEX COURANT DE LA GRAMMAIRE LX VAR+XBUFGR < (X)=RANG DU 1ER CARACTERE DU < NVP SUPPOSE. LAD VAR+ABUFGR < (A)=@RELAI VERS LE BUFFER. BSR AHEXIN < CONVERSION NUMERIQUE DU NVP < DANS LE REGISTRE A ; CELUI-CI EST < DANS LE BUFFER D'ENTREE CODE < EN HEXA-DECIMAL. STX VAR+XBUFGR < SAVE NOUVEL INDEX COURANT DU < MESSAGE. PLR X < RESTAURE (X)=INDEX GRAMMAIRE. < < VALIDATION DU NVP : < CPI XMAXIO < IL EST INTERDIT D'ASSIGNER < PHIN ET PHOUT. JLE Z72 < ERREUR. Z810: EQU $ < ENTRY POUR 'NVPP1'. CPI NOCMO*LTASGN JGE Z72 < ERREUR. < < OK, NVP RECONNU : < LR A,Y < TRANSMISSION DU NVP PAR Y A < ASSIGN EVENTUELLEMENT. NVPASD: EQU $ XR X,Y < (X)=NVP, (Y)=INDEX GRAMMAIRE CCI. LBY &TASSGN-DCTESC,W JAE Z206 < (A)=K : LE NVP N'EST PAS ASSIGNE. XWOR%1: VAL MSKNSP=K XWOR%1: VAL -XWOR%1 < POUR UN DECALAGE A DROITE... XSKNSP:: VAL MSKNSP>XWOR%1)MFFFF LAI XSKNSP < (A)='FF80 : LE NVP EST ASSIGNE. Z206: EQU $ IF NSPVID-K,,XEIF%, IF ATTENTION: CE QUI SUIT EST MAUVAIS !!! XEIF%: VAL ENDIF ORR A,X < X<0 SI NVP DEJA ASSIGNE. XR X,Y < RESTAURE : < (X)=INDEX GRAMMAIRE CCI, < (Y)=NVP SI PAS ASSIGNE, < NVP.OR.'FF80 SI DEJA ASSIGNE. Z73: EQU $ RSR < < ERREUR : NVP INVALIDE : < Z72: EQU $ ADRI XCCIER,X < RETOUR EN ERREUR AU CCI. JMP Z73 < < < A S S I G N D U M M Y : < < < FONCTION : < CE MODULE IDENTIQUE A 'ASSIGN', < PERMET D'ASSIGNER UN NVP AU NSP < DUMMY (NSPDUM), QUI PERMET DE < FAIRE DES SVC DONT LES DEMANDES SONT < IGNOREES, SANS POUR CELA PROVOQUER < UN RETOUR EN ERREUR. < < < SYNTAXE : < !ASSIGN <NVP>=<EOM> < < < ARGUMENTS : < CF. 'ASSIGN' SAUF POUR LE REGISTRE < B DONT LE CONTENU EST POSITIONNE < ICI-MEME PUISQUE L'INTERPRETEUR < DE LA GRAMMIARE DU CCI RAZE < SYSTEMATIQUEMENT LE BIT0 DE CHQUE < NOEUD !!! < < DUMMY: EQU $ LBI NSPDUM < (B)=NSP DUMMY. < < < A S S I G N D A N S T A S S G N : < < < ARGUMENTS : < (B)=NSP DEMANDE (OCTET0 DU NOEUD COURANT DE < LA GRAMMAIRE DU CCI), < (Y)=NVP DEMANDE SI PAS ASSIGNE, < NVP.OR.'FF80 SI DEJA ASSIGNE, < (TRANSMIS PAS NVPAS), < (W)=ADRESSE DCT-ESCLAVE. < < ASSIGN: EQU $ PSR X < SAVE INDEX COURANT DE LA < GRAMMAIRE DU CCI. LR B,A < (A)=NSP DEMANDE. CPI NSPVID JE Z207 < C'EST UNE DESASSIGNATION, PAR < CONSEQUENT LE SIGNE DE Y EST < INDIFFERENT (NVP DEJA ASSIGNE < OU PAS )... < < CAS D'UNE ASSIGNATION : < CPZR Y JL Z208 < ERREUR : LE NVP EST DEJA ASSIGNE < ALORS QU'UNE ASSIGNATION EST < DEMANDEE SUR LUI. CPI NSPDUM < EST-CE UNE ASSIGNATION DUMMY ??? JE Z207 < OUI, IL N'Y A DONC PAS DE < LOCATION A FAIRE ; ON VA < DIRECTEMENT VERS L'ASSIGNATION < DANS TASSGN. < < TEST ET LOCATION DU NSP : < LR A,X < (X)=NSP DEMANDE. LBI XXNLOC < MODE DE LOCATION SANS ATTENTE < DANS LE CAS OU LE NSP EST < DEJA LOUE. BSR ALODCT < TEST PUIS LOCATION EVENTUELLE. CPZR B < TEST DE LA LOCATION. JNE Z208 < ERREUR : LE NSP EST DEJA LOUE : < A NOTER QUE CE PEUT ETRE POUR < CET ESCLAVE ; EN EFFET, ON < NE PEUT ASSIGNER PLUSIEURS NVP < SUR LE MEME NSP. CPZR Y < RE-TEST DE Y (NVP). Z212: EQU $ JG SYSR55 < OK. BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < PEUT-ETRE UN 'JMP Z208'... < SYSR55: EQU $ < < R E A L I S A T I O N D E L ' A S S I G N : < Z207: EQU $ LXI XSKNSP)MFFFF < MASQUE DE RECUPERATION DU < NVP QUELQUE SOIT SON SIGNE. ANDR Y,X < (X)=NVP DEMANDE. Z214: EQU $ < < ON A ICI : < (X)=NVP DEMANDE. < (A)=NSP DEMANDE. < (OU PHIN/PHOUT POUR !ASSIGN I/O). < STBY &TASSGN-DCTESC,W < ASSIGNATION DANS TASSGN. PLR X < RESTAURE INDEX COURANT DE < LA GRAMMAIRE DU CCI. Z209: EQU $ RSR < < ERREUR : NVP DEJA ASSIGNE LORS D'UNE ASSIGNATION : < Z208: EQU $ PLR X < RESTAURE INDEX GRAMMAIRE CCI. ADRI XCCIER,X < RETOUR EN ERREUR AU CCI. JMP Z209 < < < A S S I G N S U R I N / O U T : < < < I M P O R T A N T : < DANS LE CAS DES !ASSIGN I/O, IL < N'Y A PAS DE LOCATION DES DCT, CE < QUI PERMET PLUSIEURS ASSIGNATIONS < I/O SUMULTANEES, ET DE PLUS CELA < PERMET UN FONCTIONNEMENT CORRECT < DES JOBS BATCH FAISANT DES ASSIGN <NVP>=I < (DONC SUR CR1), ALORS QUE CR1 EST < ASSIGNE A LA CONSOLE QUI A EMIS < LA COMMANDE !X... < < < ARGUMENTS : < (W)=ADRESSE DCT(ESCLAVE). < (B)=NVP (PHIN/PHOUT), < (Y)=NVP DEMANDE. < < ASSIO: EQU $ PSR X < SAVE INDEX COURANT DE LA < GRAMMAIRE DU CCI. LR B,X < (X)=NVP (PHIN/PHOUT). Z208X: EQU $ LBY &TASSGN-DCTESC,W JANE SYSR56 < OK. BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < PEUT-ETRE CORRIGER 'TASSGN' < DE LA 'DCTESC', PUIS FAIRE < UN 'JMP Z208X'... < SYSR56: EQU $ CPZR Y < TEST PRELIMINAIRE D'ASSIGNATION ??? JL Z208 < ERREUR : LE NVP EST DEJA ASSIGNE. LR B,A < OK : (A)=PHIN/PHOUT. JMP Z207 < VERS LA REALISATION DE L'ASSIGN. PAGE < < < A S S I G N A T I O N D U S Y S T E M E < D E G E S T I O N D E S N O M S : < < < FONCTION : < CETTE ROUTINE APPELEE PAR !SGN, < FAIT LES ASSIGNATIONS SUIVANTES : < 3-->NSPDLN, < 4-->NSPSTN, < 5-->NSPLON, < 6-->NSPLNS, < 7-->NSPLNU, < 8-->NSPNXP, < 9-->NSPNXS. < < IF NSPDLN+I-NSPSTN,,XEIF%, IF ATTENTION... XEIF%: VAL ENDIF IF NSPSTN+I-NSPLON,,XEIF%, IF ATTENTION... XEIF%: VAL ENDIF IF NSPLON+I-NSPLNS,,XEIF%, IF ATTENTION... XEIF%: VAL ENDIF IF NSPLNS+I-NSPLNU,,XEIF%, IF ATTENTION... XEIF%: VAL ENDIF IF NSPLNU+I-NSPNXP,,XEIF%, IF ATTENTION... XEIF%: VAL ENDIF IF NSPNXP+I-NSPNXS,,XEIF%, IF ATTENTION... XEIF%: VAL ENDIF SGNAS: EQU $ PSR X < SAVE INDEX COURANT DE LA GRAMMAIRE < DU CCI. < < VERIFICATION QU'AUCUN NVP N'EST ASSIGNE : < LXI NSPSGN-NSPSG0+Z < (X)=NBRE DE VERIF A FAIRE. LYI XMAXIO+E < (Y)=1ER 'NVP' A VERIFIER. IF XMAXIO+E-NVPDLN,,XEIF%, IF ATTENTION : LES 'NVP' DU 'SGN' MERDENT !!! XEIF%: VAL ENDIF Z220: EQU $ XR X,Y LBY &TASSGN-DCTESC,W CPI NSPVID JNE Z208 < ERREUR : LE NVP (X) EST ENCORE < ASSIGNE, ON S'ARRETE SUR LUI, < ET LE ?SGN EST REFUSE. XR X,Y ADRI I,Y < NVP SUIVANT. JDX Z220 < < OK, LE ?SGN EST ACCEPTE : < LAI NSPSG0 < (A)=1ER NSP DE L'ASSIGNATION. Z301: EQU $ < ENTRY DESASSIGN : (A)=NSPVID. LXI NSPSGN-NSPSG0+Z < (X)=NBRE D'ASSIGNATIONS A FAIRE. LYI XMAXIO+E < (Y)=1ER 'NVP' DE L'ASSIGNATION. IF XMAXIO+E-NVPDLN,,XEIF%, IF ATTENTION : LES 'NVP' DU 'SGN' MERDENT !!! XEIF%: VAL ENDIF < < BOUCLE D'ASSIGNATION/DESASSIGNATION : < Z74: EQU $ XR X,Y < (X)=NVP COURANT ; (A)=NSP COURANT. STBY &TASSGN-DCTESC,W JAE Z302 < C'EST UN DESASSIGN DU SGN, < A RESTE A LA VALEUR 0 (NSPVID). ADRI I,A < PASSAGE AU NSP SUIVANT LORS < D'UN ASSIGN DU SGN. Z302: EQU $ XR X,Y < (X)=NBRE D'ASSIGNATIONS+1 < RESTANT A FAIRE. ADRI I,Y < NVP SUIVANT. JDX Z74 < ASSIGNATION SUIVANTE. PLR X < RESTAURE (X)=INDEX COURANT < DE LA GRAMMAIRE CCI. RSR AZ301: JMP Z301 < RELAI... PAGE < < < O P E N N E W F I L E : < < < FONCTION : < CETTE ROUTINE EST APPELEE SUITE < A UN !ASSIGN <NVP>=N,<NOM-FICHIER><EOT>. < ELLE A A SA CHARGE D'OUVRIR UN FICHIER < CLOSE ET INEXISTANT, DE RANGER LE < <NOM-FICHIER> DANS L'ARGBRE DU SYSTEME. < ET DE MEMORISER LA CORRESPONDANCE < <NOM-FICHIER> ET <NOM-DIRECT>. < < < ARGUMENT : < (Y)=NVP DEMANDE SI PAS ASSIGNE, < NVP.OR.'FF80 SI DEJA ASSIGNE. < < XBUFS1:: VAL LBUFES-Z < DERNIER OCTET DU BUFFER ESCLAVE, XBUFS2:: VAL XBUFS1-I < AVANT-DERNIER OCTET... CCINF: EQU $ < < TEST PRELIMINAIRE D'ASSIGNATION DU NVP : < IF XSKNSP,XEIF%,, IF ATTENTION : 'XSKNSP' DOIT ETRE NEGATIF !!! XEIF%: VAL ENDIF CPZR Y JL Z72 < ERREUR : NVP DEJA ASSIGNE, < ASSIGN REFUSE. < < VERIFICATION SIMPLISTE D'UNE POSSIBLE < OUVERTURE DU FICHIER : ON VERIFIE QU'AU < MOINS 'XXFICN' FICHIERS INEXISTANTS, < AINSI QUE 'XXFICD' 'DCT-FICHIERS' SONT < ALLOUABLES ; CETTE VERIFICATION EST < FAITE HORS-PHASE CRITIQUE, ET EST < DONC INTERRUPTIBLE, MAIS LES SEUILS < DE TEST SONT CHOISIS DE TELLE FACON, < QUE LA VALEUR DU RESULTAT DES TESTS < SOIT VALABLE QUELQUE SOIT LE NOMBRE < DE 'HDLSER' LES FAISANT SIMULTANEMENT... < (SAUF EXCEPTION !!!!??????!) < LAI MEFX < (A)='ETAT CLOSE ET INEXISTANT'. XXBKFE:: VAL L < NUMERO DU BIT COMMUNIQUANT A 'LOOKF' < QU'UN COMPTAGE EST DEMANDE... XXFICN:: VAL 20 < SEUIL ARBITRAIRE DU NOMBRE DE FICHIERS < INEXISTANTS EN DECA DUQUEL L'OUVERTURE < NEW EST REFUSEE... IF XXFICN-Z,,,XEIF% IF ATTENTION : 'XXFICN' EST MAUVAIS, SACHANT IF QUE LE FICHIER DE NOM INTERNE 0 N'EST PLUS IF ACCESSIBLE !!! XEIF%: VAL ENDIF IF XXFICN-NDCTF,,,XEIF% IF ATTENTION : LA VALIDATION QUI EST FAITE PEUT IF MALGRE TOUT PERMETTRE A 'OPNFIL' DE SE BLOQUER IF EN ATTENTE DE FICHIER INEXISTANT (VOIR LE IF NIVEAU DE SERVICE SUR LEQUEL ON SE TROUVE, UN IF NIVEAU DE SERVICE PLUS PRIORITAIRE POUVANT IF L'INTERROMPRE !!! XEIF%: VAL ENDIF XXFICD:: VAL 4 < SEUIL ARBITRAIRE DU NOMBRE DE 'DCT < FICHIER' LIBRE EN DECA DUQUEL L'OPEN < EST REFUSE; NOTONS QUE CETTE PROTECTION < N'EST PAS EFFICACE A 100 POUR-CENT, EN < EFFET, ENTRE CE TEST, ET L'ATTRIBUTION < D'UNE 'DCTF', QUELQU'UN DE PLUS PRIO- < RITAIRE PEUT S'EN ETRE EMPARE... IF NDCTF-NESCLA,,,XEIF% IF ATTENTION : IL N'Y A PAS ASSEZ DE 'DCTF' !!! XEIF%: VAL ENDIF SBT XXBKFE BSR ALOOKF < DEMANDE A 'LOOKF' DANS 'A' DU NOMBRE < DE FICHIERS REPONDANT A LA QUESTION... CPI XXFICN < CELA SUFFIT-IL ??? JL Z72 < NON, L'ASSIGN EST REFUSE... LA &ASDCTF < (A)=BETA(SDCTF), BSR ABETA < QUE L'ON ETEND SUR 16 BITS... CPI XXFICD < Y-A-T'IL ASSEZ DE 'DCTF' ??? JL Z72 < NON, L'ASSIGN EST REFUSE... < < OK, TENTATIVE D'OUVERTURE : < LAI MEFX < (A)='ETAT CLOSE ET INEXISTANT'... SBT BITRFE < MODE DE RECHERCHE D'UN FICHIER < D'ETAT DONNE. LBI XEFF < FICHIER QUE L'ON METTRA A L' < ETAT NON PARTAGEABLE & DE < TRAVAIL. PSR X < SAVE INDEX COURANT DE LA < GRAMMAIRE DU CCI. BSR AOPFIL < < ON A ICI : < (X)=NSP ALLOUE AU FICHIER, OU < =0 SI L'OUVERTURE EST IMPOSSIBLE. < CPZR X < TEST DE L'OUVERTURE. JE Z208 < OPEN IMPOSSIBLE : RETOUR < EN ERREUR AU CCI. PSR L < SAVE @DCT-SERVICE. BSR ACADCT < (L)=@DCT ALLOUEE AU FICHIER. LA VAR+FILNOM < (A)=NOM DIRECT DU FICHIER. PLR L < RESTAURE (L)=@DCT-SERVICE. < < MISE DU NOM-DIRECT DU FICHIER < EN QUEUE DU BUFFER : < STA BUFESC-DCTESC+XBUFS1,W LBI NSPSTN+X123X < AFIN D'INSERER LE NOM DANS < L'ARBRE DU SYSTEME. < < MISE DE 'NSPSTN' DEVANT LE NOM-DIRECT < DU FICHIER COMME MOT DE VALIDATION < DU NOM-DIRECT (CF. OPEN OLD) : < STB BUFESC-DCTESC+XBUFS2,W ADRI -X123X,B BSR ACCIF < INSERTION DU NOM DANS L'ARBRE < DU SYSTEME, AVEC LA CORRES- < PONDANCE : <NOM-FICHIER>--- < <NOM-DIRECT>. < < TEST DES CONDITIONS DE RETOUR DE HDLSTN : < JANE Z210 < ERREUR : LE NOM EXISTE SUREMENT < DEJA : ON VA REFERMER LE FICHIER < QUI A ETE OUVERT. < < OK, L'OPEN NEW FILE EST CORRECT : < Z211: EQU $ LR X,A < (A)=NSP DE SGF ALLOUEE AU FICHIER. XWOR%1: VAL XNVPF=K < ACCES AU MASQUE 'NVP DE FICHIER'. SBT NBITMO-B-XWOR%1 < MEMORISATION QUE C'EST UN < NSP DE GESTION DE FICHIERS. < < REALISATION DE L'ASSIGNATION : < CPZR Y < TEST DU NVP DEMANDE. JMP Z212 < VERS UNE RE-VALIDATION DU NVP, < ET L'ASSIGNATION. < < ERREUR A L'OPEN : REFERMETURE DU FICHIER : < Z210: EQU $ LR X,A < (A)=NSPDCTF. SBT BITCFN < FERMETURE PAR NSPF. LBI MCFR < FERMETURE EN MODE RELEASE. BSR ACLFIL < FERMETURE DU FICHIER OUVERT < PAR ERREUR. CPZR Y < TEST DES CONDITIONS DE RETOUR. JE Z208 < VERS UN RETOUR EN ERREUR AU CCI. BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < EXAMINER LES CONDITIONS DE < RETOUR ; EN EFFET PUISQU'ON < A REUSSI A OUVRIR CE FICHIER, < ON DOIT POUVOIR LE FERMER !!! < JMP Z208 PAGE < < < O P E N O L D F I L E : < < < FONCTION : < CETTE ROUTINE EST APPELEE SUITE < A UN : !ASSIGN <NVP>=O,<NOM-FICHIER><EOT>, < OU A : !ASSIGN <NVP>=D-<NOM-FICHIER><EOT>, < ELLE RECUPERE PAR L'INTERMEDIAIRE DE < L'ARBRE DU SYSTEME LE <NOM-DIRECT> < ASSOCIE A <NOM-FICHIER>. < < < ARGUMENT : < (Y)=NVP DEMANDE SI PAS ASSIGNE, < NVP.OR.'FF80 SI DEJA ASSIGNE. < < CCIOF: EQU $ < < VALIDATION PRELIMINAIRE DU NVP : < CPZR Y JL Z72 < ERREUR : NVP DEJA ASSIGNE, < ASSIGN REFUSE. LA &ASDCTF < (A)=BETA(SDCTF), BSR ABETA < QUE L'ON ETEND SUR 16 BITS... CPI XXFICD < Y-A-T'IL ASSEZ DE 'DCTF' ??? JL Z72 < NON, L'ASSIGN EST REFUSE... < < OK, RECUPERATION DU <NOM-DIRECT> : < STZ BUFESC-DCTESC+XBUFS2,W STZ BUFESC-DCTESC+XBUFS1,W < A T T E N T I O N : CE RAZ EST < DESTINE A EVITER DE REPRENDRE < UN <NOM-DIRECT> UTILISE < PRECEDEMMENT AU CAS OU LE < <NOM-FICHIER> DONNE EN ARGUMENT < NE SERAIT EN FAIT QU'UN <NOM> < POUR LEQUE LA VALEUR SERAIT < INFERIEURE A 'LBUFES'. LBI NSPLON BSR ACCIF < APPEL DE HDLLON, QUI RENVERRA < EN QUEUE DE BUFESC LE <NOM- < DIRECT> ASSOCIE A <NOM-FICHIER>. JANE Z72 < ERREUR : LE NOM N'EXISTE PAS, < ASSIGN REFUSE. < < OK, LE <NOM-FICHIER> EXISTE : < LNOMS:: VAL 40 < LONGUEUR MAXIMALE DES NOMS 'SGN'. LA DEMESC-DCTESC+T+CODEM,W SB DEMESC-DCTESC+XBOX,W < NOTA : SI IL S'AGIT BIEN D'UN FICHIER < 'A' DOIT ALORS CONTENIR LA LONGUEUR < DU NOM EXTERNE DU FICHIER... JALE Z72 < CODEM<=BOX : LA VALEUR EST TROP GRANDE < POUR ETRE CELLE D'UN FICHIER... CPI LNOMS AJGZ72: JG Z72 < CODEM-BOX>LNOMS : LA VALEUR PARAIT TROP < PETITE... < (ET RELAI...) < < VALIDATION DU NOM-DIRECT PRESUME PAR < LE MOT LE PRECEDANT : < LAI NSPSTN+X123X < MOT DE VALIDATION ATTENDU CP BUFESC-DCTESC+XBUFS2,W JNE Z72 < FICHIER INVALIDE (NON CREE PAR < UN ASSIGN NEW) ; ERREUR. LA BUFESC-DCTESC+XBUFS1,W < < ON A ICI : < (A)=<NOM-DIRECT> DU FICHIER. < LBI XEFF < ETAT A DONNER A CE FICHIER : < NON PARTAGEABLE ET DE TRAVAIL. PSR X < SAVE INDEX COURANT DE LA < GRAMMAIRE DU CCI. JAL Z208 < ERREUR : NOM DIRECT ERRONE. CP NMFIL < VALIDATION SUPERIEURE, JGE Z208 < ERREUR : NOM DIRECT ERRONE. BSR AOPFIL < OUVERTURE DU FICHIER < DE <NOM-DIRECT> (A) DONNE. CPZR X < TEST DES CONDITIONS DE RETOUR. JE Z208 < L'OPEN EST IMPOSSIBLE , < L'ASSIGN EST REFUSE. JMP Z211 < OK, VERS L'ASSIGNATION. AZ214: JMP Z214 < RELAI... PAGE < < < C L O S E D ' U N E A S S I G N A T I O N : < < < FONCTION : < CETTE ROUTINE EST APPELEE SUITE A < UN ?ASSIGN <NVP>=S/R<EOM>, ET A < A SA CHARGE LA DESSIGNATION DU NVP, < ET LA FERMETURE DU FICHIER SI LE NSP < AUQUEL IL EST ASSIGNE EST UN NSPF. < < < A T T E N T I O N : < ATTENTION DANS LE CAS D'UN RELEASE < SUR UN NSPF LE <NOM-FICHIER> N'EST < PAS DELETE DE L'ARBRE DU SYSTEME. < < < ARGUMENT : < (Y)=NVP SI PAS ASSIGNE, < NVP.OR.'FF80 SI NVP ASSIGNE, < (B)=MODE DE FERMETURE : < ='80 : MODE SAVE, < ='30 : MODE RELEASE. < (W)=ADRESSE DCT(ESCLAVE). < < CCICLF: EQU $ < < TEST PRELIMINAIRE DU NVP : < CPZR Y JG AJGZ72 < ERREUR : NVP NON ASSIGNE, < IL N'Y A DONC RIEN A FAIRE. < < OK, DESASSIGNATION : < PSR X < SAVE INDEX COURANT DE LA GRAMMAIRE < DU CCI. LXI XSKNSP)MFFFF ANDR Y,X < (X)=NVP DEMANDE. LBY &TASSGN-DCTESC,W CPI XMAXIO < EST-CE UNE ASSIGNATION I/O ??? JLE Z215 < OUI, DANS LE CAS I/O, IL < N'Y A PAS DE DELOCATION DE DCT. XWOR%1: VAL XNVPF=K < ACCES AU MASQUE 'NVP DE FICHIER'. TBT NBITMO-B-XWOR%1 < LE NSP ASSIGNE AU NVP ESTIL < UN NSP DE SGF ???? JC Z213 < OUI : NSPF. < OU BIEN C'EST LE NSP 'DUMMY' !!! < < TRAITEMENT DE 'DKU' : < (ENVOI DE "!DK F" ET DE < "!DK S0 OFF" IMPLICITES ET < ENFIN DE "!DK =FFFF") < CPI NSPDKU < EST-CE 'DKU' ??? JNE Z300X3 < NON... PSR A,B,X < OUI : LR A,X < (X)='NSPDKU'... LRM A,B < "!DK S0 OFF" : WORD Z300X4 < (A)=ADRESSE DE RETOUR DE 'PS0OFF', WORD PS0OF1 < (B)=ADRESSE DU SOUS-PROGRAMME DE MISE < DE LA SYNCHRONISATION SUR LE < SECTEUR 0 'OFF'. PSR A,B < EMPILEMENT DE L'ADRESSE DE RETOUR POUR < SIMULER UN 'BSR', ET DE L'ADRESSE DU < SOUS-PROGRAMME, RSR < VERS LEQUEL ON VA EN METTANT (B) DANS < 'P' PAR UN 'PSR'/'RSR'... Z300X4: EQU $ < ADRESSE DE RETOUR... LRM A,B < "!DK F" : WORD Z300X5 < (A)=ADRESSE DE RETOUR DE 'PFAST', WORD PFAST1 < (B)=ADRESSE DU SOUS-PROGRAMME DE MISE < EN MODE 'FAST' DE 'DKU'. PSR A,B < EMPILEMENT DE L'ADRESSE DE RETOUR POUR < SIMULER UN 'BSR', ET DE L'ADRESSE DU < SOUS-PROGRAMME, RSR < VERS LEQUEL ON VA EN METTANT (B) DANS < 'P' PAR UN 'PSR'/'RSR'... Z300X5: EQU $ < ADRESSE DE RETOUR... LRM A,B < "!DK =FFFF" : WORD Z300X6 < (A)=ADRESSE DE RETOUR DE 'PSLOWA', WORD PSLOWA < (B)=ADRESSE DU SOUS-PROGRAMME D'AUTORI- < SATION DES GROUPES DE BLOCS ENTRE- < LACES DE 'DKU'. PSR A,B < EMPILEMENT DE L'ADRESSE DE RETOUR POUR < SIMULER UN 'BSR', ET DE L'ADRESSE DU < SOUS-PROGRAMME, LR X,B < (B)='NSPDKU'... RSR < VERS LEQUEL ON VA EN METTANT (B) DANS < 'P' PAR UN 'PSR'/'RSR'... Z300X6: EQU $ < ADRESSE DE RETOUR... PLR A,B,X Z300X3: EQU $ < < TRAITEMENT DU DISQUE SUPPORT DE < L'EXTENSION D'ADRESSAGE : < MONT0:: VAL NEXIST < NUMERO DE VOLUME DONNE AU NUMERO DE < VOLUME COURANT 'VOLNUM' LORSQU'IL N'Y A < PAS DE VOLUME MONTE PAR LA COMMANDE < "!DKU...". CPI NSPDKG < ALORS, LE 'NSP' (A) EST-IL CELUI DU < DISQUE D'EXTENSION D'ADRESSAGE ??? JNE Z300X1 < NON... PSR A < SAUVEGARDE DU 'NSP'... LA IDDESC-DCTESC,W < (A)=LISTE DES INDICATEURS UTILISATEUR : TBT IDESC8 < ALORS, Y-A-T'IL UN VOLUME MONTE ??? JNC Z300X2 < NON, RIEN A FAIRE... RBT IDESC8 < OUI, STA IDDESC-DCTESC,W < ON LE DEMONTE : PLR A < RESTAURE : (A)='NSP'... PSR A,X,L < OUI, ON SAUVEGARDE... LR A,X < (X)='NSP' DU DISQUE D'EXTENSION, BSR ACADCT < (A)=(L)=ADRESSE DE SA 'DCT'. WORD LAVOLU < CECI EST EN FAIT L'INSTRUCTION SUIVANTE : < 'LA VAR+ABVOLU', QU'ON NE PEUT ENCORE < ECRIRE, PUISQUE 'ABVOLU' N'EST PAS < ENCORE DEFINI... < (A)=ADRESSE DU BUFFER DE DESCRIPTION < DU VOLUME COURANT, LR A,L < (L)=BASE DU BUFFER DE VOLUME... WORD STZNUM < PLUS DE VOLUME COURANT : 'VOLNUM'=K EST < L'INDICATEUR DE "BASE" INDIQUANT QU'IL < N'Y A PAS DE VOLUME MONTE... < (ATTENTION : C'EST UNE INSTRUCTION < "REFERENCEE EN AVANT"...) IF MONT0-K,,XEIF%, IF ATTENTION : LE 'STZ' EST IDIOT !!! XEIF%: VAL ENDIF LAI NSPVID WORD STANSP < PLUS DE 'NSP' SUPPORT D'UN VOLUME, < (ATTENTION : C'EST UNE INSTRUCTION < "REFERENCEE EN AVANT"...) PLR A,X,L JMP Z300 < IL EST INUTILE DE FAIRE LES TESTS SUR < LES 'NSP' DU 'SGN'... < < CAS DES AUTRES 'NSP' : EST-CE LE 'SGN' ??? < Z300X1: EQU $ CPI NSPSG0 JL Z300 < CE N'EST PAS UN NSP DU SGN. CPI NSPSGN JG Z300 < CE N'EST PAS UN NSP DU SGN. < < CAS D'UN NSP DU SGN, ON < VA DESASSIGNER TOUS LES NVP < CONCERNES : < LAI NSPVID < DESASSIGN. JMP AZ301 < VERS LA DESASSIGNATION DU SGN. < < DANS LE CAS D'UN NSP QUI N'EST NI DU SGF, < NI DU SGN, ON DELOUE LA DCT CORRESPONDANTE : < Z300X2: EQU $ PLR A < RESTAURE : (A)='NSP'... Z300: EQU $ XR A,X < (X)=NSP A DELOUER, (A)=SAVE NVP. BSR ADLDCT < DELOCATION DU NSP (X). XR A,X < RESTAURE (X)=NVP, (A)=NSP. Z215: EQU $ LAI NSPVID < EN VUE DU DESASSIGN. JMP AZ214 < VERS LA DESASSIGNATION. < < TRAITEMENT DES NSP DE SGF : < Z213: EQU $ XWOR%1: VAL XNVPF=K < ACCES AU MASQUE 'NVP DE FICHIER'. RBT NBITMO-B-XWOR%1 < (A)=NSP DE SGF. JAE Z215 < NSP=NSPDUM : LE NVP ETAIT < ASSIGNE AU NSP DUMMY ; ON VA < DONC JUSTE LE DESASSIGNER !!! SBT BITCFN < MODE D'APPEL DE 'CLOSE-FILE' < PAR NSP. CMCFSR:: VAL N ADRI CMCFSR,B < (B)='30 OU '80, EN EFFET, < L'INTERPRETEUR DU CCI RAZE < LE BIT0 DE L'OCTET0 DE < CHAQUE NOEUD. < < ON A ICI : < (A)=NSP ALLOUE AU FICHIER A FERMER, < (B)=MODE DE FERMETURE (RELEASE OU SAVE). < (X)=NVP QUE L'ON DESASSIGNE. < (W)=ADRESSE DCT(ESCLAVE). < Z230: EQU $ BSR ACLFIL < TENTATIVE DE FERMETURE DU < FICHIER DANS LE MODE PRECISE (B). < < TEST DES CONDITIONS DE RETOUR : < XR A,Y < (A)=CONDITIONS DE RETOUR, < (Y)=NSPF (BIT0=1). JAE Z215 < OK, LE CLOSE DU FICHIER A ETE < ACCEPTE, ALLONS DESASSIGNER. CPI ECEO < LE CLOSE A-T'IL ETE REFUSE POUR < 'OPEN ENREGISTREMENT EN COURS' ??? JE SYSR57 < OUI, ALLONS FERMER L'ENREGIS- < TREMENT. BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < ET BIEN TOUT DEPEND DU CODE DE RETOUR... < SYSR57: EQU $ < < FERMETURE DE L'ENREGISTREMENT DANS LE < MEME MODE QUE CELUI DEMANDE POUR LE FICHIER : < LAI FOFCR < CODE 'CLOSE RELEASE' A PRIORI. XWOR%1: VAL MCFS=K-NBITMO+B < POUR DISCRIMINER SAVE/RELEASE : XWOR%1: VAL -XWOR%1 < CE BIT=K (RELEASE) =1 (SAVE). TBT NBITMO+XWOR%1 < LE DESASSIGN DU FICHIER EST-IL < SAVE OU RELEASE ??? : < SAVE : BIT8(B)=1 (B='80), < RELEASE : BIT8(B)=K (B='30). ADCR A < (A)=6 SI CLOSE RELEASE, < =7 SI CLOSE SAVE. STA DEMESC-DCTESC+T+OPDEM,W SWBR Y,A < (Y)=NSPF (BIT0=1). RBT NBITOC+BITCFN < (A)=NSPTYP VERS LE HANDLER SGF < ALLOUE AU FICHIER. STA DEMESC-DCTESC+XXNSP,W ADRI DEMESC-DCTESC,W < (W)=@DEMANDE DE CLOSE ENREGIS- < TREMENT. BSR ACHAND < ENVOI DE LA DEMANDE DE CLOSE < ENREGISTREMENT SAVE/RELEASE. WAIT WEIO < ATTENTE DE FIN DE CLOSE. ADRI DCTESC-DEMESC,W < (W)=@DCT-ESCLAVE. < < TEST DES CONDITIONS DE RETOUR < DU CLOSE ENREGISTREMENT : < LA DEMESC-DCTESC+T+ETADEM,W JAE SYSR58 < OK. BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < JE NE SAIS PAS, MAIS SI CETTE 'SYSER' < A LIEU, C'EST QUE PROBABLEMENT, ON EN < A EU UNE LORS DU 'CLFIL' QUI A PRECEDE... < SYSR58: EQU $ < < LE CLOSE ENREGISTREMENT A ETE ACCEPTE : < LR Y,A < RESTAURE (A)=NSPF (BIT0(A)=1). < A NOTER QUE B EST OK ('80 OU '30). JMP Z230 < TRY AGAIN TO CLOSE THE FILE !!!! PAGE < < < D E L E T E U N N O M D E F I C H I E R : < < < FONCTION : < CE MODULE DETRUIT UN NOM DE FICHIER, < APRES QUE CE DERNIER AIT ETE OUVERT < EN 'OLD', PUIS FERMER EN 'RELEASE' ; < IL NE PEUT SE PRODUIRE D'ERREUR, SAUF < ANOMALIE SYSTEME... < < < ARGUMENTS : < (W)=ADRESSE DE LA DCT(ESCLAVE), < (XBUFGR)=INDEX DU PREMIER CARACTERE DU NOM. < < DELFIL: EQU $ LBI NSPDLN BSR ACCIF < DESTRUCTION DU NOM EXTERNE... JAE DELFI1 < OK... BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < COMPRENDRE POURQUOI, ALORS QU'ON < A PU L'OUVRIR EN 'OLD', LE FERMER < EN 'RELEASE', ON NE PEUT DETRUIRE < SON NOM EXTERNE !!! < DELFI1: EQU $ RSR PAGE < < < T E S T A B S E N C E D E S ' N U L L S ' < D A N S U N E C A R T E " ! A S S I G N " : < < < FONCTION : < ETANT DONNE QUE "!ASSIGN <NVP>=N,<NOM-FICHIER><EOT>" < DONNE NAISSANCE A UN ITEM DE NOM < <NOM-FICHIER> ET QUI VA AU BOUT DE < 'BUFESC', LE <NOM-INTERNE> DU < FICHIER SE TROUVE DANS CET ITEM < A UNE DISTANCE DU DEBUT DETERMINEE < UNE FOIS POUR TOUTE LORS DE SA < CREATION (OPEN-NEW) ; SI DONC DES < 'NULLS' SONT INTRODUITS DANS LA < CARTE "!ASSIGN...", LA LONGUEUR DU < DIT ITEM VA CHANGER, ET LE <NOM-INTERNE> < DEVENIR IRRECUPERABLE... < < ABSNUL: EQU $ < < DEFINITION DE LA CARTE "!ASSIGN" (NEW) : < @!ASSIGN N=X, IF KOL1=FCGET-KCCI,,XEIF%, IF ATTENTION : IL FAUT UN "!" EN TETE DE LA CARTE !!! XEIF%: VAL ENDIF XWOR%1: VAL KOLTED=FMASK+KOL1=FVAL XWOR%1: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%1 XWOR%2: VAL KOLF=FMASK+KOLTES=FVAL XWOR%2: VAL KOLC=FMASK+KVIR=FVAL?XWOR%2 XWOR%3: VAL XWOR%1=XWOR%2 < RECHERCHE DU LIMITEUR ","... IF XWOR%3-KOL0-KOLON,XEIF%,, IF ATTENTION : IL MANQUE LE LIMITEUR "," !!! XEIF%: VAL ENDIF XLPASS:: VAL XWOR%3-KOL1+Z < LONGUEUR EN OCTETS DE LA CARTE "!ASSIGN". < < VALIDATION DE LA CARTE : < "!ASSIGN" COURANTE : < LA VAR+XBUFGR < (A)=INDEX DU PREMIER CARACTERE DU < <NOM-FICHIER>, CPI XLPASS+KOL0 < EST-IL BON (+KOL0, CAR 'XLPASS' EST UNE < LONGUEUR, ET NON UN INDEX...) ??? JE ABSNU1 < OUI... ADRI XCCIER,X < NON, IL Y A DES 'NULLS', LA CARTE < "!ASSIGN..." COURANTE EST DONC REFUSEE... ABSNU1: EQU $ RSR < ET ON RETOURNE A LA GRAMMAIRE... PAGE < < < I N T E R F A C E E N T R E C C I E T L E < S Y S T E M E D E G E S T I O N D E S N O M S : < < < ARGUMENT : < (W)=ADRESSE DCT(ESCLAVE). < (B)=NSPLON OU NSPSTN SUIVANT QUE LE MODE < DU FICHIER EST OLD OU NEW... < (XBUFGR) POINTE SUR LE 1ER CARACTERE DU NOM. < < < RESULTAT : < (A)=CONDITIONS DE RETOUR DE HDLLON/HDLSTN. < < CCIFIL: EQU $ SWBR B,A SBT VBOX < AFIN DE RECUPERER LA LONGUEUR DE LA < VALEUR ASSOCIEE AU NOM... STA DEMESC-DCTESC+XXNSP,W < GENERATION D'UN NSPTYP VERS < HDLLON OU HDLSTN. LA VAR+DEMCCI+T+AMDEM AD VAR+XBUFGR < (A)=@OCTET DU NOM ARGUMENT DE < L'ASSIGNATION. STA DEMESC-DCTESC+T+AMDEM,W LAI NOCMO*LBUFES SB VAR+XBUFGR < (A)=NBRE D'OCTETS DE LA ZONE < ALLANT DU 1ER CARACTERE DU < NOM JUSQU'AU BOUT DU BUFESC. STA DEMESC-DCTESC+T+CODEM,W LAI FGSGNN < LA VALEUR SUIT LE NOM. STA DEMESC-DCTESC+T+ASDEM,W LAI FGSGNA < FONCTION AVEC CONCATENATION < DE L'ACN DEVANT LE NOM. XXXSGF:: VAL WAITB < BIT A POSITIONNER DANS L'OPDEM A < DESTINATION DU 'SGN' POUR INDIQUER < QUE L'ITEM EN CAUSE EST UN ITEM DE < TYPE "SGF"... XWOR%1: VAL COSBT?XXXSGF=FMASK(K=FCINST IF XWOR%1(XMDSLO,,XEIF%, IF ATTENTION : RECOUVREMENT ENTRE 'XMDSLO' ET 'XXXSGF' !!! XEIF%: VAL ENDIF IF XWOR%1(MKOPDM,,XEIF%, IF ATTENTION : RECOUVREMENT ENTRE 'MKOPDM' ET 'XXXSGF' !!! XEIF%: VAL ENDIF SBT XXXSGF < INDIQUONS AU "SGN" QU'IL S'AGIT DU "SGF". STA DEMESC-DCTESC+T+OPDEM,W ADRI DEMESC-DCTESC,W < (W)=@DEMANDE DEMESC. BSR ACHAND < ENVOI DE LA DEMANDE. WAIT WEIO < ATTENTE DE LA REPONSE. ADRI DCTESC-DEMESC,W < RESTAURE (W)=@DCT-ESCLAVE. STA DEMESC-DCTESC+T+OPDEM,W < REMISE DE L'OPDEM A 2, CAR LE < SGN L'A MIS A 0, ET IL SE PEUT < QU'UN 'OMOV2' SUIVE CET APPEL < AU CCI !!...!!!. LA DEMESC-DCTESC+T+ETADEM,W RSR < RETOUR AVEC (A)=CONDITIONS. PAGE < < < C H E C K T A S S G N A U L O G O U T : < < < FONCTION : < CETTE ROUTINE EST PAPPELEE SUITE A < ?BYE, ET VERIFIE QUE QUE TOUS LES < NVP A L'EXCEPTION DE PHIN ET PHOUT < SONT DESASSIGNES ; SINON, LE < BYE EST REFUSE. < < CHKASG: EQU $ PSR X < SAVE INDEX COURANT DE LA < GRAMMAIRE DU CCI. LXI NOCMO*LTASGN-Z < INDEX DU DERNIER NVP. Z216: EQU $ LBY &TASSGN-DCTESC,W CPI NSPVID < TEST DU NSP ASSIGNE AU NVP (X). JNE Z217 < LE NVP ETANT ENCORE ASSIGNE, < ON ARRETE L'EXPLORATION DE TASSGN JDX Z216 < AU NVP SUIVANT BSR ASYSER < E R R E U R S Y S T E M E ... Z217: EQU $ LR X,A < (A)=NVP ENCORE ASSIGNE. PLR X < RESTAURE INDEX GRAMMAIRE CCI (X). CPI XMAXIO JGE SYSR59 BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < CERTAINEMENT UN RETOUR EN ERREUR < AU 'CCI' PAR (X)#0, MAIS ATTENTION, < LE 'JE Z218' QUI SUIT NE PEUT FONCTIONNER < CORRECTEMENT, CAR ENTRE LE 'CPI' ET LUI, < IL Y A EU LA 'SYSER'... < SYSR59: EQU $ JE Z218 < C'EST MAX(PHIN,PHOUT), LE ?BYE < EST DONC ACCEPTE, TOUS LES < NVP SONT DESASSIGNES SAAUF < PHIN & PHOUT. ADRI XCCIER,X < RETOUR EN ERREUR AU CCI, AU < MOINS UN NVP (DIFFERENT DE PHIN < ET PHOUT) EST ENCORE ASSIGNE. Z218: EQU $ RSR PAGE < < < C O M M A N D E D E C O N N E X I O N S < M A T R I C I E L L E S : < < < FONCTION : < EN GENERAL, ON DISPOSE DE 2 NSP, SOIENT < NSP1 ET NSP2 DONNES DANS CET ORDRE < DANS UNE COMMANDE '?CM '. LA COMMANDE < CM GERE LES CONNEXIONS DE NSP1 VERS < NSP2, C'EST-A-DIRE QUE TOUT CE QUI < SE PASSERA SUR NSP1 SERA REPRODUIT < SUR NSP2. < < < S A V E N S P 1 : < < < ARGUMENT : < (B)=NSP1. < < < RESULTAT : < (Y)=NSP1, TRANSMIS AUX ROUTINES SUIVANTES. < < CMP1: EQU $ LR B,Y < (Y)=NSP1. RSR < < < N S P I N / O U T D E M A N D E C O M M E N S P 1 : < < < ARGUMENT : < (B)=NVP (PHIN/PHOUT). < < < RESULTAT : < (Y)=+NSPIN/NSPOUT. < < CMP5: EQU $ PSR X < SAVE INDE COURANT DE LA < GRAMMAIRE DU CCI. LR B,X < (X)=NVP (PHIN/PHOUT). Z218X: EQU $ LBY &TASSGN-DCTESC,W JANE SYSR5A BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < PEUT-ETRE CORRIGER 'TASSGN' DE < 'DCTESC', PUIS UN 'JMP Z218X'... < SYSR5A: EQU $ LR A,Y < (Y)=NSP1=+NSPIN/NSPOUT. PLR X < RESTAURE (X)=INDEX GRAMMAIRE CCI. RSR < < < D I S C R I M I N A T I O N C O N N E X I O N < D I S C O N N E X I O N : < < < ARGUMENT : < (Y)=NSP1. < < < RESULTAT : < (Y)=-NSP1. < < CMP4: EQU $ NGR Y,Y RSR < FACILE, N'EST-IL PAS ????? < < < R A Z T O U T E S C O N N E X I O N S < I S S U E S D E N S P 1 : < < < ARGUMENT : < (Y)=NSP1. < < CMP2: EQU $ XR X,Y < (Y)=SAVE INDEX COURANT DE LA < GRAMMAIRE DU CCI, < (X)=NSP1. ADR X,X < EN EFFET, MATX EST UNE TABLE < DE DOUBLE-MOTS. IF UMATCO-2,,XEIF%, IF ATTENTION : CE QUI PRECEDE EST MAUVAIS !!! XEIF%: VAL ENDIF RQST &ASMATX <<<<PHASE CRITIQUE SUR MATX. STZ &AMATX < RAZ TOUTES LES CONNEXIONS ISSUES < DE NSP1. ADRI UMATCO-Z,X STZ &AMATX PSR A LAD &ASMATX BSR ARLSE PLR A LR Y,X < RESTAURE : < (X)=INDEX COURANT DE LA GRAMMAIRE 'CCI'. RSR < < < N S P I N / O U T D E M A N D E C O M M E N S P 2 : < < < ARGUMENT : < (B)=NVP (PHIN/PHOUT). < ABSVAL(Y)=NSP1, < SI Y<0 : DISCONNEXION NSP1-->NSP2, < SI Y>0 : CONNEXION NSP1-->NSP2. < < < RESULTAT : < (B)=NSP2 (NSPIN/NSPOUT). < < CMP6: EQU $ PSR X < SAVE INDEX COURANT DE LA < GRAMMAIRE DU CCI. LR B,X < (X)=NVP DEMANDE (PHIN/PHOUT). Z81XX: EQU $ LBY &TASSGN-DCTESC,W JANE SYSR5B < OK. BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < PEUT-ETRE CORRIGER 'TASSGN' DE < 'DCTESC', PUIS UN 'JMP Z81XX'... < SYSR5B: EQU $ LR A,B < (B)=NSP2 (NSPIN/NSPOUT). PLR X < RESTAURE PROVISOIRE DE L'INDEX < COURANT DE LA GARMMAIRE CCI. JMP CMP3 < VERS LE TRAITEMENT STANDARD. < < < C O N N E X I O N / D I C O N N E X I O N < N S P 1 --> N S P 2 : < < < ARGUMENTS : < ABSVAL(Y)=NSP1, < (B)=NSP2, < SI Y<0 : DISCONNEXION NSP1-->NSP2, < SI Y>0 : CONNEXION NSP1-->NSP2. < < CMP3: EQU $ CPR Y,B JE Z86 < LES AUTO-CONNEXIONS SONT < INTERDITES ; ON NE VERIFIE PAS < LES AUTO-DECONNEXIONS, PUISQU' < IL EST IMPOSSIBLE D'AUTO-CONNECTER. PSR X < SAVE INDEX COURANT DE LA GRAMMAIRE < DU CCI. CPZR Y < DISCRIMINATION CONNEXION / < DISCONNEXION. JGE Z81 < CAS D'UNE CONNEXION. < < CAS D'UNE DISCONNEXION : < NGR B,B < ON MEMORISE DISCONNEXION < PAR B<0. NGR Y,Y < ON REND Y POSITIF, POUR < POUVOIR INDEXER MATX. Z81: EQU $ LR Y,X < (X)=NSP1. ADR X,X < MATX EST UNE TABLE DOUBLE-MOTS. LR B,Y < SAVE (Y)=+-NSP2. RQST &ASMATX <<<<PHASE CRITIQUE SUR MATX. LA &AMATX ADRI UMATCO-Z,X LB &AMATX < (A,B)=TABLE DES CONNEXIONS < ISSUES DE NSP1. XR X,Y < (X)=+-NSP2, (Y)=INDEX MATX. CPZR X < DISCRIMINATION CONNECT/ < DISCONNECT. JGE Z82 < CONNEXION NSP1-->NSP2. < < CAS D'UNE DISCONNEXION NSP1-->NSP2 : < NGR X,X < (X)=NSP2. TBT L,X < ETAT DE LA CONNEXION A DETRUIRE. JNC Z83 < ELLE N'EXISTE PAS, ERREUR. RBT L,X < OK, RAZ. JMP Z84 < SORTIE OK. < < CAS D'UNE CONNEXION NSP1-->NSP2 : < Z82: EQU $ TBT L,X < TEST DE L'ETAT DE LA CONNEXION. JC Z83 < ERREUR : ELLE EXISTE DEJA. SBT 0,X < OK, ON CONNECTE NSP1-->NSP2. < < MISE A JOUR DE MATX : < Z84: EQU $ LR Y,X < RESTAURE (X)=INDEX MATX. STB &AMATX ADRI -UMATCO+E,X STA &AMATX < MAJ DE MATX. PLR X < RESTAURE (X)=INDEX COURANT DE < LA GRAMMAIRE DU CCI. Z85: EQU $ PSR A LAD &ASMATX BSR ARLSE < FIN DE PHASE CRITIQUE PLR A RSR < < SORTIE EN ERREUR : < Z83: EQU $ PLR X < RESTAURE (X)=INDEX COURANT DE < LA GRAMMAIRE DU CCI. Z86: EQU $ ADRI XCCIER,X < RETOUR EN ERREUR AU CCI. JMP Z85 < SORTIE. PAGE < < < G E S T I O N D U ' M A I L ' A U X < U T I L I S A T E U R S : < < < FONCTION : < CE MODULE EST APPELE SUITE < A LA COMMANDE "!VI ..." ; ELLE < MET EN PLACE LE MESSAGE 'MAIL' < COURANT, EVENTUELLEMENT VIDE... < < < ARGUMENTS : < (L)=ADRESSE DE 'DCTSER', < (W)=ADRESSE DE 'DCTESC'. < < PMAIL: EQU $ PSR B,X,Y < SAUVEGARDES... < < DEFINITION DE LA CARTE "!VI " ('MAIL') : < @!VI / IF KOL1=FCGET-KCCI,,XEIF%, IF ATTENTION : IL FAUT UN "!" EN TETE DE LA CARTE !!! XEIF%: VAL ENDIF XWOR%1: VAL KOLTED=FMASK+KOL1=FVAL XWOR%1: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%1 XWOR%2: VAL KOLF=FMASK+KOLTES=FVAL XWOR%2: VAL KOLC=FMASK+KSLASH=FVAL?XWOR%2 XWOR%3: VAL XWOR%1=XWOR%2 < RECHERCHE DU LIMITEUR "/"... IF XWOR%3-KOL0-KOLON,XEIF%,, IF ATTENTION : IL MANQUE LE LIMITEUR "/" !!! XEIF%: VAL ENDIF XLPVI:: VAL XWOR%3-KOL1+Z-W < LONGUEUR EN OCTETS DE LA CARTE "!VI ". < (-W CAR LE LIMITEUR "/" N'EN FAIT PAS < PARTIE...) < < DETERMINATION DE LA LONGUEUR < DU MESSAGE 'MAIL' COURANT : < LA VAR+DEMCCI+T+CODEM < (A)=NOMBRE DE CARACTERES DE LA COMMANDE < "!VI ..." Y COMPRIS <EOM>, ADRI -XLPVI-W,A < (A)=LONGUEUR DU MESSAGE 'MAIL' DEMANDE, < NON COMPRIS <EOM> (-W)... JAL PMAIL3 < ?!??!??! WORD CPMAIL < VALIDATION... JLE PMAIL4 < OK, ELLE TIENT DANS 'MAIL'... PMAIL3: EQU $ BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < COMPRENDRE, CAR TOUT A ETE < DIMENSIONNE CORRECTEMENT !!! < JMP PMAIL5 < ET ON SORT IMMEDIATEMENT... PMAIL4: EQU $ LR A,Y < (Y)=LONGUEUR DU NOUVEAU 'MAIL'... < < ACCES AU 'MAIL' GENERAL : < PSR L < SAUVEGARDE DE L'ADRESSE DE 'DCTSER', LXI NSPTT < (X)='NSP' DU NOEUD DE 'MAIL' DE LA < GRAMMAIRE DU 'CCI', BSR ACADCT < (L)=ADRESSE DU NOEUD DE 'MAIL'... < < MISE EN PLACE DE LA LONGUEUR < DU NOUVEAU 'MAIL' : < BSR ASMMK < MASQUAGE DES INTERRUPTIONS, AFIN QU'UN < AUTRE UTILISATEUR N'HERITE PAS D'UN < MESSAGE 'MAIL' BIZARRE... LR Y,A < (A)=NOUVELLE LONGUEUR, STBY XCCIM0,L < QUE L'ON MET EN PLACE DANS LE NOEUD DE < 'MAIL' DE LA GRAMMAIRE... < < INITIALISATION DU TRANSFERT : < LX XCCIM1,L < (X)=ADRESSE DU MESSAGE 'MAIL', PLR L < ET RESTAURE : < (L)=ADRESSE DE 'DCTSER'... LA VAR+ABUFGR < (A)=RELAI D'ACCES A 'BUFESC' (CETTE < ECRITURE EST PLUS GENERALE QU'UN < 'LAD' SUR 'BUFESC-DCTESC,W'...), RBT BITX < (A)=ADRESSE DU BUFFER COURANT, SBR A,X < (X)=DEPLACEMENT PERMETTANT DE PASSER DE < 'BUFESC' A 'MAIL' AVEC LE MEME < RELAI 'VAR+ABUFGR'... PMAIL6: EQU $ < SAUVEGARDE DU 'DOLLAR'... <******************************************************************************* ADR A,A < DOUBLEMENT DE (A), XWOR%1: VAL '0000000@@@@ < RECUPERATION DU CODE GENERE... <******************************************************************************* $EQU PMAIL6 < ET ANNULATION DU CODE GENERE... IF XWOR%1=FMASK(K?W=FCINST-NOCMO,,XEIF%, IF ATTENTION : LE PASSAGE DE L'INDEX MOT A IF L'INDEX OCTET PAR 'ADR' EST MAUVAIS !!! XEIF%: VAL ENDIF ADR X,X < (X)=INDEX OCTET INITIAL DE RANGEMENT DANS < LA ZONE 'MAIL'... < < BOUCLE DE TRANSFERT DES < CARACTERES DU NOUVEAU < MESSAGE 'MAIL' : < PMAIL1: EQU $ CPZR Y < EN RESTE-T'IL A TRANSFERER ??? JE PMAIL2 < NON... BSR ACARAC < OUI : < (A)=CARACTERE COURANT DE 'BUFES' ; A < NOTER QUE L'ON NE TESTE PAS EN RETOUR < LES <EOM> AFIN D'AUTORISER LES "." < DANS LES 'MAIL', ET DE PLUS CE TEST < SERAIT REDONDANT AVEC CELUI DE 'Y'... STBY &VAR+ABUFGR < ET ON LE MET DANS 'MAIL'... ADRI I,X < PROGRESION DE L'INDEX, ADRI -I,Y < ET DECOMPTE DES CARACTERES RANGES... JMP PMAIL1 < AU SUIVANT, S'IL EXISTE... < < FIN DES OPERATIONS : < PMAIL2: EQU $ BSR ASMDK < ON DEMASQUE LES INTERRUPTIONS... PMAIL5: EQU $ PLR B,X,Y < ON RESTAURE LES REGISTRES, RSR < ET ON FAIT UN RETOUR OK... PAGE < < < A C T I O N S U R L E S T A C H E S < P A R A L L E L E S : < < < FONCTION : < CETTE ROUTINE ACCEDEE PAR LA COMMANDE < !X SOUS :SYS, PERMET LA CREATION DE < JOBS PARALLELES SUR LE PERIPHERIQUE < ASSIGNE AU NVP ARGUMENT ; CE PERIPHERIQUE < EST LE NSPIN DU JOB PARALLELE CREE. < SI LE JOB EXISTE DEJA, L'ACTION DE LA COMMANDE < EST EQUIVALENTE A UN ALT-MODE SUR UNE < VISU. < < < ARGUMENTS : < (W)=ADRESSE DCT(ESCLAVE) DEMANDEUR, < (L)=ADRESSE DCT(SERVICE). < (Y)=NVP SI NON ASSIGNE (>0), < =NVP.OR.'FF80 SI ASSIGNE (< 0). < < TASK: EQU $ CPZR Y < TEST DU NVP ARGUMENT. JGE Z281 < ERREUR : LE NVP N'EST PAS ASSIGNE < < CAS D'UN NVP ASSIGNE : < PSR X,L < SAVE INDEX GRAMMAIRE CCI, < ET @DCT-SERVICE. LXI XSKNSP)MFFFF ANDR Y,X < (X)=NVP DEMANDE (ET DEJA ASSIGNE). LBY &TASSGN-DCTESC,W < (A)=NSP DU PERIPHERIQUE IN < DEMANDE. LR A,Y < (Y)=NSP PERIPHERIQUE IN DEMANDE. LXI PHIN CPBY &TASSGN-DCTESC,W < LE PERIPHERIQUE DEMANDE NE < SERAIT-IL PAS LE NSPIN DU < DEMANDEUR ??? JE Z282 < OUI, ERREUR. < < ACCES A LA DCT DU PERIPHERIQUE IN DEMANDE : < ANDI XNVPF)MOCD LR A,X < (X)=NSP DU PERIPHERIQUE IN DEMANDE. BSR ACADCT < (L)=@DCT PERIPH. IN DEMANDE. LBY IOID < (A)=NSP DU PERIPHERIQUE OUT < ASSOCIE AU PERIPHERIQUE < IN DEMANDE. ANDI IOIDM < EN RAZANT LE BIT0 DE IOID, ON < EXCLUE L'ACCES AUX FICHIERS !!! JAE Z282 < ERREUR : CE PERIPHERIQUE OUT < ASSOCIE N'EXISTE PAS. < < CAS OU LE PERIPHERIQUE IN DEMANDE < EST ACCEPTABLE : < LR X,A < (A)='NSP' DU PERIPHERIQUE DEMANDE : CPI NSPVI0 < EST-CE UNE VISU ??? JL TASK01 < NON... CPI NSPVIN < ??? JG TASK01 < NON... < < CAS D'UNE VISU : IL FAUT < REINITIALISER A PRIORI < LE BUFFER D'ANTICIPATION : < PSR X SVC SVCM10 < DANS LE CAS DE "!X..", ON ANNULE TOUS < LES CARACTERES EN ATTENTE, EN REINITIA- < LISANT 'KCWIO'... PLR X < < TEST D'UN UTILISATEUR DEJA LOGUE : < TASK01: EQU $ RQST SPHEX <<<<PHASE CRITIQUE SUR LE < PERIPHERIQUE IN DEMANDE (A CAUSE < DE LA POSSIBILITE DE SIMULTANEITE < DE DEMANDES DE LANCEMENT DE JOBS < PARALLELES. LA IOID TBT IOIDX < UN ESCLAVE EST-IL DEJA ATTACHE < AU PERIPHERIQUE IN DEMANDE ???? JNC Z283 < NON, C'EST DONC LE LANCEMENT < D'UN JOB PARALLELE. LAD SPHEX < ECRASE A... BSR ARLSE LA IOID < ...QU'ON RESTAURE. < < ACCTION D'ABORT EQUIVALENTE < AU 'ALT-MODE' DES VISUS : < LXI IOIDM ANDR A,X < (X)=ID DE L'ESCLAVE ATTACHE AU < PERIPHERIQUE IN DEMANDE. LA &ATBU < (A)=@DCT-ESCLAVE ATTACHE. JAG SYSR5C < OK. BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < JE NE SAIS PAS, MAIS PRUDENCE, < CAR LA BASE 'L' RISQUE D'ETRE < FOLKLORIQUE... < SYSR5C: EQU $ LR A,L < (L)=@DCT-ESCLAVE ATTACHE SUR < LE PERIPHERIQUE (LE PAUVRE...). < < ON A ICI : < (W)=ADRESSE DCT(ESCLAVE) DEMANDEUR, < (L)=ADRESSE DCT(ESCLAVE) ATTACHE. < CPR L,W < COMPARAISON ESCLAVE DEMANDEUR < ET ESCLAVE ATTACHE. JNE SYSR5D < OK. BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < MEME REMARQUE QU'A LA 'SYSER' < PRECEDENTE... < SYSR5D: EQU $ < < < R E V E I L O U < A B O R T D E L ' E S C L A V E A T T A C H E : < < BSR ASMMK < MASQUAGE DES INTERRUPTIONS... LA IDESC-DCTESC,L TBT IDESCW < L'ESCLAVE EST-IL SUSPENDU PAR "!W" ??? JNC Z285X < NON, ON VA L'ABORTER... RBT IDESCW < OUI, ON VA LE "DE-SUSPENDRE"... STA IDESC-DCTESC,L BSR ASMDK < ET DEMASQUAGE DES INTERRUPTIONS... LBY DEMSER-DCTESC+XXNSP,L XWOR%1: VAL MOCG=K XWOR%1: VAL -XWOR%1 XWOR%1: VAL MSKNSP>XWOR%1 ANDI XWOR%1 < (A)=NSP DU HANDLER DE SERVICE ASSOCIE, JANE Z285Y < OK... BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < PEUT-ETRE LE MIEUX SERAIT-IL DE NE PAS < REVEILLER L'ESCLAVE, EN FAISANT UN 'JMP Z285'... < Z285Y: EQU $ PSR X,L LR A,X < (X)='NSP' DU HANDLER DE SERVICE, BSR ACADCT < (A)=L=ADRESSE DE SA 'DCT', BSR ARIT < ON LE REVEILLE... PLR X,L JMP Z285 < ET ON SORT EN SAUTANT LA MISE EN < PLACE DE LA ROUTINE D'ABORT... Z285X: EQU $ BSR ASMDK < DEMASQUAGE DES INTERRUPTIONS... LA AABORT < (A)=@ROUTINE D'ABORT DE FIN DE < SERVICE. SBT XFSERV < AFIN QUE FSERV NE LANCE PAS LE < RECOVERY SI LE FSERV EST DEJA < POSITIONNE POUR L'ESCLAVE < ATTACHE. XR W,L < (W)=@DCT-ESCLAVE ATTACHE. BSR AFSERV < MISE EN PLACE D'UNE ROUTINE < DE FIN DE SERVICE POUR L'ESCLAVE < ATTACHE. < < NOTA : < ON NE FAIT PAS 'ADOWN', CAR < EN EFFET D'UNE PART CELA COMPLIQUE < LES CHOSES (INTERFERENCES AVEC < L'HORLOGE), MAIS SURTOUT ON FAIT < UN 'FSERV' QUI EST EXPLOITE PAR < L'AUTOMATE DE SERVICE QUI SERA < AUTOMATIQUEMENT DECLENCHE LORS DE < LA PROCHAINE INTERRUPTIOON D'HORLOGE... < XR W,L < (W)=@DCT-ESCLAVE DEMANDEUR. TBT XFSERV < LA MISE EN PLACE DE LA ROUTINE < D'ABORT A-T'ELLE EU LIEU ????? JC Z282 < NON, ERREUR. < < RETOUR : < Z285: EQU $ PLR X,L < RESTAURE L'INDEX DE LA GRAMMAIRE < DU CCI, ET @DCT-SERVICE. Z286: EQU $ RSR < GO BACK. < < < J O B P A R A L L E L E E N T R Y : < < Z283: EQU $ < < ON A ICI : < (Y)=NSP DU PERIPHERIQUE IN DEMANDE, < (W)=ADRESSE DCT(ESCLAVE) DEMANDEUR. < SBT IOIDX < MEMORISATION DE L'ATTACHEMENT < D'UN ESCLAVE SUR LE PERIPHERIQUE < IN DEMANDE. STA IOID LAD SPHEX BSR ARLSE < < PREPARATION DU JOB-ENTRY : < LAI NSPJE SWBR A,A STA DEMESC-DCTESC+XXNSP,W < NSPTYP VERS HDLJE. STY DEMESC-DCTESC+T+AMDEM,W < LE NSP DU PERIPHERIQUE IN < DEMANDE (Y) EST MIS EN AMDEM < DE LA DEMANDE. LAI K XWOR%1: VAL PLK*NOCMO=K < PLK*NOCMO=TAILLE INITIALE DE L'ESPACE. XWOR%1: VAL NBITMO-B-XWOR%1 < NUMERO DU BIT A POSITIONNER... SBT XWOR%1 < POUR UNE DEMANDE DE '800 OCTETS. STA DEMESC-DCTESC+T+CODEM,W ADRI DEMESC-DCTESC,W < (W)=@DEMANDE DE JOB ENTRY. BSR ACHAND < ENVOI DE LA DEMANDE DE JOB-ENTRY. BSR ACHANW < ATTENTE DE FIN DE JOB-ENTRY. ADRI DCTESC-DEMESC,W < RESTAURE (W)=@DCT-ESCLAVE < DEMANDEUR. JMP Z285 < VERS LE RETOUR. < < SORTIES EN ERREUR : < Z282: EQU $ PLR X,L < RESTAURE L'INDEX COURANT DE < LA GRAMMAIRE DU CCI, ET < @DCT-SERVICE. Z281: EQU $ ADRI XCCIER,X < RETOUR EN ERREUR AU CCI. JMP Z286 < VERS LE RETOUR. PAGE < < < C O N T R O L E D E L A T R A C E : < < < FONCTION : < CE MODULE 'CCI' PERMET DE METTRE < 'ON' OU 'OFF' LA TRACE SUIVANT LA < COMMANDE "!TRACE...". < < < NOTA : < PAS DE MASQUAGE DES INTERRUPTIONS, < POUR L'ACCES A 'SAVEX', CE SERAIT < VRAIMENT SE COMPLIQUER POUR RIEN... < < PTRAON: EQU $ < COMMANDE "!TRACE C ON" : LA SAVEX < ACCES A L'INDICATEUR DE CONTROLE, RBT XBTROF < ET ON AUTORISE LA TRACE... JMP PTRA1 < VERS LA MISE EN PLACE... PTRAOF: EQU $ < COMMANDE "!TRACE C OFF" : LA MEMV < (A)=LISTE DES INDICATEURS 'MEMV' : TBT MEMXXX < LA FONCTION EST-ELLE AUTORISEE ??? JNC PTRA2 < NON, ERREUR... LA SAVEX < ACCES A L'INDICATEUR DE CONTROLE, SBT XBTROF < ET INHIBITION DE LA TRACE... < < CONTROLE DE LA TRACE : < PTRA1: EQU $ STA SAVEX < < RETOUR : < PTRA3: EQU $ RSR < < SORTIE EN ERREUR : < PTRA2: EQU $ ADRI XCCIER,X < RETOUR EN ERREUR AU 'CCI'... JMP PTRA3 < ET ON SORT... PAGE IF OACTIV-EXIST,XEIF%8,,XEIF%8 < < < V I S U A L I S A T I O N D E L ' A C T I V I T E D U < S Y S T E M E E N M O Y E N N E D E F I N I T I O N : < < < FONCTION : < LES COMMANDES "!ACTIVITE ON" ET < "!ACTIVITE OFF" PERMETTENT D'ACTIVER < OU INHIBER LE DISPOSITIF DE VISUALI- < SATION DE L'ACTIVITE DU SYSTEME SOUS < LA FORME D'UNE MATRICE (RECEPTEUR/EMETTEUR) < SUR LE SYSTEME DE TELEVISION NUMERIQUE < MOYENNE DEFINITION. < < < D E S A C T I V A T I O N D U D I S P O S I T I F : < < PACOFF: EQU $ LA AACTIV RBT XACTIV < IL SUFFIT DE RENDRE PAIRE L'ADRESSE < DU SOUS-PROGRAMME 'ACTIV'... < < MISE EN PLACE DE L'INDICATEUR < D'ACTIVATION/INHIBITION : < PACTI2: EQU $ STA AACTIV < MISE A JOUR DU RELAI DU SOUS-PROGRAMME < 'ACTIV'... < < FAUT-IL LIBERER LA 'CDAJ' ??? < XCDAGL:: VAL K < VALEUR DU MOT 'ACDAG' LORSQU'AUCUNE < COMMANDE "!CDAG" N'A ETE FRAPPEE, XCDAGO:: VAL XCDAGL)MFFFF < VALEUR DU MOT 'ACDAG' LORSQU'UNE COMMAN- < DE "!CDAG" A ETE FRAPPEE, ET QUE DONC < UN UTILISATEUR S'EST ATTRIBUE LA 'CDA- < COMMUNE', QUI NE L'EST DONC PLUS ???!!!? XCDAJL:: VAL XCDAGL < INDICATEUR 'CDAJ' LIBRE, XCDAJO:: VAL XCDAGO < INDICATEUR 'CDAJ' OCCUPEE. TBT XACTIV < EST-CE "ON" OU "OFF" ??? JC PACTI4 < "ON", ON VIENT DONC DE S'APPROPRIER < LA 'CDAJ' POUR LE COMPTE DU SYSTEME... PSR W < "OFF", LRM W WORD ACDAJ5 < (W)=BASE LE VERROU D'ACCES A LA 'CDAJ', STZ O,W < ET ON LA LIBERE... IF XCDAJO-K,XEIF%,,XEIF% IF ATTENTION : LE 'STZ' EST IDIOT !!! XEIF%: VAL ENDIF PLR W < RESTAURATION DE : < (W)=ADRESSE DE 'DCTESC'... PACTI4: EQU $ < < RETOUR AU 'CCI' : < PACTI3: EQU $ RSR < < < A C T I V A T I O N D U D I S P O S I T I F : < < PACON: EQU $ < < TEST D'AUTORISATION : < LA MEMV TBT MEMXXX < LES FONCTIONS DANGEREUSES SONT-ELLES < AUTORISEES ??? JNC PACTI1 < NON, L'ACTIVATION EST REFUSEE... < < TEST DE L'ETAT DU 'CBMJ' : < BSR ASMMK < ON MASQUE LES INTERRUPTIONS, CAR EN < EFFET ON VA LIRE LE REGISTRE 'IM' PAR < UN 'XIMR' ; A NOTER QU'ON NE PEUT UTILI- < SER 'PIMMST' GENERE PAR 'PR1', CAR LE < BIT 'NIVCBJ' DE 'IM' A PU ETRE MODIFIE < A LA MAIN... LAI MMOT < AFIN DE TOUT MASQUER... XIMR A < LECTURE DE 'IM', PSR A < SAUVEGARDE, XIMR A < ET RESTAURATION... BSR ASMDK < ET ON PEUT ALORS DEMASQUER. PLR A < (A)=CONTENU DU REGISTRE 'IM' COURANT, TBT NIVCBJ < ALORS LE SYSTEME DE TELEVISION NUMERI- < QUE MOYENNE DEFINITION EST-IL ACCES- < SIBLE ??? JC PACTI1 < NON, IL EST MASQUE... < < ESSAYONS DE S'APPROPRIER LA 'CDAJ' : < PSR W LRM W WORD ACDAJ4 < (W)=BASE LE VERROU D'ACCES A LA 'CDAJ', LAI XCDAJO XM O,W < ET ON TENTE DE S'APPROPRIER LA 'CDAJ' : PLR W < RESTAURE : < (W)=ADRESSE DE LA 'DCTESC'... IF XCDAJO-K,XEIF%,,XEIF% IF ATTENTION : LE 'JANE' QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF JANE PACTI1 < ET BIEN, LA 'CDAJ' EST DEJA OCCUPEE, < DONC "!ACTIVITE ON" EST REFUSE... < < ACTIVATION DU DISPOSITIF : < LA AACTIV < OUI, SBT XACTIV < IL SUFFIT DE RENDRE IMPAIRE L'ADRESSE < DU SOUS-PROGRAMME 'ACTIV'... JMP PACTI2 < VERS LA MISE A JOUR, ET LA SORTIE... < < SORTIE EN ERREUR : < PACTI1: EQU $ ADRI XCCIER,X < POUR UN RETOUR EN ERREUR AU 'CCI'... JMP PACTI3 < VERS LA SORTIE... XEIF%8: VAL ENDIF PAGE < < < V I S U A L I S A T I O N D E L ' A C T I V I T E D U < S Y S T E M E E N B A S S E D E F I N I T I O N : < < < FONCTION : < LES COMMANDES "!ACTIVITE H", < "!ACTIVITE R/V/B<CHAINE-HEXADECIMALE>" < PERMETTENT SOIT D'INHIBER ("H") LE < DISPOSITIF, SOIT D'ACTIVER LA VISUALI- < SATION DE PAGE DE 4K DE LA MEMOIRE < "MAITRE" (0-64K) SUR LE SYSTEME DE < TELEVISION NUMERIQUE SUR L'UN DES < 3 CANAUX "R"/"V"/"B" AU CHOIX... < ATTENTION : EN ADRESSANT LE < DERNIER MOT DE LA MEMOIRE MAITRE, < ON REFERENCE EN FAIT 'BMEMQ' (VOIR < 'IDLE')... < < < ARGUMENTS : < (B)=NUMERO DU PROCESSEUR DE VISUALISATION ('TVPOFF', < 'TVPR', 'TVPV' OU 'TVPB'), < (W)=ADRESSE DE 'DCTESC', < (VALESC)=ADRESSE DE LA PAGE A VISUALISER. < SI CELLE-CI REFERENCE LE DERNIER MOT < DE LA MEMOIRE, ELLE EST REMPLACEE PAR < 'BMEMQ', PERMETTANT AINSI INDIRECTEMENT < LA VISUALISATION D'UNE ZONE DE MEMOIRE < QUELCONQUE... < < PACTV: EQU $ IF NSPDKU-NSPSER,XEIF%,, IF ATTENTION : IL FAUT QUE 'DKU' SOIT ININTERRUPTIBLE IF PAR LES NIVEAUX DE SERVICE, AFIN QUE CE DISPOSITIF IF FONCTIONNE CORRECTEMENT !!! XEIF%: VAL ENDIF < < TEST D'AUTORISATION : < LA MEMV TBT MEMXXX < LES FONCTIONS DANGEREUSES SONT-ELLES < AUTORISEES ??? JNC PACTV1 < NON, L'ACTIVATION EST REFUSEE... < < TEST DE L'ACCESSIBILITE : < LA ETASYS TBT TVEXIS < LE SYSTEME BASSE-DEFINITION EST-IL < OPERATIONNEL ??? JNC PACTV1 < NON, ERREUR... < < MISE EN PLACE DE LA FONCTION : < LA VALESC-DCTESK,W < (A)=ADRESSE DE LA PAGE MEMOIRE A VISUA- < LISER... XWOR%1: VAL -DADR XWOR%2: VAL LK>DADR*LSPACE=XWOR%1 CPI BIT>XWOR%2-Z < EST-CE LE DERNIER MOT DE LA MEMOIRE < MAITRE ??? JNE PACTV2 < NON... LRM A < OUI : WORD BMEMQ < ON PREND ALORS COMME ADRESSE CELLE DU < BUFFER DE COPIE DE 'IDLE'... PACTV2: EQU $ XR A,B < (A)=NUMERO DU PROCESSEUR DE VISUALI- < TION, < (B)=ADRESSE DE LA PAGE A VISUALISER. XWOR%1: VAL TVSIMU=K IF XWOR%1-K,,XEIF%, SLLS XWOR%1 < CADRAGE DU NUMERO DE PROCESSEUR, XEIF%: VAL ENDIF PSR W < SAUVEGARDE DE L'ADRESSE DE 'DCTESC'. CALL #SISP CMS5 W ZERO# BSR ASMMK < MASQUAGE DES INTERRUPTIONS... STA TVCTRL-ZERO,W < MISE EN PLACE DU NUMERO DU PROCESSEUR < DE VISUALISATION (SI "R", "V" OU "B"), < OU DESACTIVATION DU DISPOSITIF (SI < 'TVPOFF'), STB TVMEME-ZERO,W < ET MISE EN PLACE DE L'ADRESSE DE LA < PAGE A VISUALISER... BSR ASMDK < DEMASQUAGE DES INTERRUPTIONS, PLR W < RESTAURE : < (W)=ADRESSE DE 'DCTESC'. < < RETOUR : < PACTV3: EQU $ RSR < < RETOURS EN ERREUR AU 'CCI' : < PACTV1: EQU $ ADRI XCCIER,X < POUR UN RETOUR EN ERREUR AU 'CCI', JMP PACTV3 < VERS LA SORTIE... < REFUSEE... PAGE < < < M O D I F I C A T I O N D E L A Z O N E D E M E M O I R E < Q U E L C O N Q U E C O P I E E P A R L ' I D L E : < < < FONCTION : < 'IDLE' COPIE EN PERMANENCE < UNE ZONE DE MEMOIRE QUELCONQUE < DANS UN BUFFER RESIDENT 'BMEMQ'. < LA COMMANDE "!ACTIVITE M<CHAINE < HEXADECIMALE><EOM>" PERMET DE < MODIFIER LA DADR-ADRESSE DE LA < ZONE DE MEMOIRE QUELCONQUE... < < < ARGUMENT : < (W)=ADRESSE DE LA 'DCTESC'. < < PACTM: EQU $ < < VALIDATION : < LA MEMV TBT MEMXXX < LES FONCTIONS DANGEREUSES SONT-ELLES < AUTORISEES ??? JNC PACTM1 < NON, LA COMMANDE EST REFUSEE !!! < < EXECUTION : < LA VALESC-DCTESK,W < OUI, < (A)=DADR-ADRESSE DE LA ZONE MEMOIRE < QUE L'ON SOUHAITE ATTEINDRE, PSR W LRM W WORD AMEMQ < (W)=ADRESSE OU METTRE LA DADR-ADRESSE, STA O,W < ET ON MODIFIE AINSI 'IDLE'... PLR W < < RETOUR AU 'CCI' : < PACTM2: EQU $ RSR < < RETOUR EN ERREUR : < PACTM1: EQU $ ADRI XCCIER,X < POUR PROVOQUER UN RETOUR EN ERREUR... JMP PACTM2 < ET VERS LA SORTIE... PAGE < < < M A J D E L A T A B L E D E T A B U L A T I O N : < < < ARGUMENT : < (B)=CONSTANTE DE TRANSLATION POUR < L'UNE DES 2 TABLES D'INITIALI- < SATION DE 'HDLSUR'. < (W)=ADRESSE DCT(ESCLAVE). < < < R A Z D E A T A B U L : < < INITAB: EQU $ PSR X,L,W < SAVE INDEX COURANT DE LA < GRAMMAIRE DU CCI, L'ADRESSE DE LA 'DCT' < DE SERVICE ET CELLE DE 'DCTESC'... < < RECUPERATION DE LA DCT DE LA VISU : < LXI PHIN LBY &TASSGN-DCTESC,W ANDI XNVPF)MOCD LR A,X < (X)=NSPIN. BSR ACADCT < RENVOIE (A)=@DCTIN. LAD VAR+ATABUL STA VALESC-DCTESK,W < SAVE @ATABUL DANS 'VALESC', < POUR USAGE ULTERIEUR. < < INITIALISATION DE LA TABLE < DE TABULATION DE 'PHIN' : < LRM W WORD VARSUR+TABSUR < (W)=ADRESSE DE LA LISTE D'INITIALISATION < DE LA TABULATION STANDARD, ADR B,W < ON PEUT AINSI ATTEINDRE UNE LISTE DE < REMISE A 0 SI : < (B)=TABSU0-TABSUR... LXI LCCI/NBITMO IF LCCI/NBITMO-LTATAB,,XEIF%, IF ATTENTION : LA LONGUEUR DES LISTES DE IF TABULATION EST MAUVAISE !!! XEIF%: VAL ENDIF Z306: EQU $ LA LTATAB-D,W < (A)=VALEUR COURANTE D'INITIALISATION, STA &VAR+ATABUL < ON INITIALISE (AVEC LA TABULATION STAN- < DARD, OU LA REMISE A 0), ADRI -D,W < ET PASSAGE A L'ENTREE SUIVANTE... JDX Z306 PLR X,L,W RSR < < < D E F I N I T I O N D ' U N < D E B U T D E Z O N E : < < < DEBUT DE ZONE : < IL EST PRECISE PAR UN "1" OU UN "/" < TAPE PAR L'UTILISATEUR ; ALORS QUE < LE CONTENU DE LA ZONE EST DEFINI PAR < DES "0" OU DES " ". < < ZONTAB: EQU $ PSR X < SAVE INDEX GRAMMAIRE CCI. LA VALESC-DCTESK,W < RESTAURE (A)=@ATABUL. LX VAR+XBUFGR < (X)=INDEX COURANT DU BUFFER CCI ADRI -D,X < CAR CCI A DEJA FAIT +1 SUR < L'INDEX DU BUFFER CCI ; ON A : < (X)=INDEX DU DEBUT DE LA ZONE. LYI FONSB1 < FONCTION SET BIT A 1. BSR ATMOBT < MISE A 1 DU BIT DE DEBUT < DE ZONE. PLR X < RESTAURE INDEX GRAMMAIRE CCI. RSR PAGE < < < C O M M A N D E D ' A U T O R I S A T I O N < E T D ' I N H I B I T I O N D E < L ' E C H O I M M E D I A T E N < T E M P S P A R T A G E : < < < FONCTION : < CES 2 MODULES SONT REFERENCES < PAR LA GRAMMAIRE DU 'CCI' POUR < AUTORISER/INHIBER (ETAT INITIAL) < L'ECHO IMMEDIAT DES COMMANDES < DU 'CCI' (VOIR "!ECHO"). < < < ARGUMENT : < (W)=ADRESSE DE 'DCTESC'. < < PECHO: EQU $ LA IDDESC-DCTESC,W SBT IDESC9 < AUTORISATION... PECHO1: EQU $ STA IDDESC-DCTESC,W RSR PECHON: EQU $ LA IDDESC-DCTESC,W RBT IDESC9 < INHIBITION... JMP PECHO1 < ET C'EST TOUT (JE FATIGUE POUR LES < COMMENTAIRES...). NLS PAGE < < < M O D I F I C A T I O N D U T O M E D E S S A P : < < < FONCTION : < LA COMMANDE !Z<CHAINE HEXA-DECIMALE><EOM> < PERMET DE MODIFIER LE CARACTERE 'CTRLC' DU < TOM ED ESSAP, ET AINSI MODIFIER CELUI-CI < DYNAMIQUEMENT, ET MEME BLOQUER CARREMENT < L'ACCES A ":SYS" ET ":JFC" EN METTANT UN < CODE INEXISTANT... < < < ARGUMENT : < (W)=ADRESSE DE 'DCTESC', < VALESC=CODE CHOISI... < < ZPASS: EQU $ LA VALESC,W < (A)=CODE CHOISI POUR 'CTRLC', JAL ZPASS1 < ERREUR... CPI MOCD < TIENT-IL SUR UN OCTET ??? JG ZPASS1 < NON, ERREUR... PSR X,L LXI NSPASS BSR ACADCT < (L)=ADRESSE MOT DE 'CTRLC'... LA VALESC,W < (A)=CODE CHOISI QUE L'ON SAIT ETRE < VALIDE MAINTENANT... STBY O,L < ET ON L'INSERE DANS LE TOM ED ESSAP ; < ON NOTERA QUE LE CODE '03 RESTAURE LE < TOM ED ESSAP INITIAL ('KETX')... PLR X,L ZPASS2: EQU $ RSR < ET C'EST TOUT... < < SORTIES EN ERREUR : < ZPASS1: EQU $ ADRI XCCIER,X < ACCES AU NOEUD D'ERREUR... JMP ZPASS2 < ET ON SORT... PAGE < < < C H E V A L D E T R O I E : < < < FONCTION : < CE MODULE TRANSCODE SUIVANT < LA CONSTANTE MAGIQUE LE MESSAGE < ENTRE PAR "!CMS" ENTRE "!L :SYS" < ET LE TOM ED ESSAP ; CETTE METHODE < PERMET DE VERIFIER ASSEZ SUREMENT < QUE C'EST BIEN DIRECTEMENT AVEC < LE 'CCI' QUE L'ON DIALOGUE, ET NON < PAS AVEC UN PROGRAMME UTILISATEUR < QUI SIMULERAIT SUR CETTE VISU < TOUTE LA PROCEDURE DE DIALOGUE AFIN < DE PRELEVER LE TOM ED ESSAP !!! < < < ARGUMENTS : < (L)=ADRESSE DE LA 'DCT' DE SERVICE. < (XBUFGR)=INDEX COURANT DU BUFFER APRES "!CMS". < < HORSE: EQU $ PSR B,X,W < SAUVEGARDES ESSENTIELLES... < < BOUCLE DE CHIFFRAGE : < HORSE2: EQU $ BSR ACARAC < (A)=CARACTERE COURANT DE 'BUFESC' : JE HORSE1 < C'EST UN <EOM>, ALLONS RE-EMETTRE LE < MESSAGE TRANSCODE... LX VAR+XBUFGR < NON, C'EST UN CARACTERE NORMAL, ADRI -I,X < REVENONS DESSUS, AFIN DE LE CODER... < (X)=INDEX DU CARACTERE A CODER... LBI K < PAR PURE HYGIENE... SCLD NBITMO-NBITCX < SAUVEGARDE DU PREMIER CHIFFRE HEXA- < DECIMAL DU CARACTERE DANS 'B', BSR ACHIFR < ET CHIFFRAGE DU DEUXIEME CHIFFRE HEXA- < DECIMAL DU CARACTERE COURANT, SCRD NBITMO-NBITCX < ET RECONSTITUTION D'UN CARACTERE CODE < QUI NE DIFFERE QUE PAR SON DEUXIEME < CHIFFRE HEXA-DECIMAL DU CARACTERE ENTRE.. STBY &VAR+ABUFGR < ET RE-INSERTION DU CARACTERE COURANT < CHIFFRE DANS LE BUFFER, JMP HORSE2 < VERS LE CARACTERE SUIVANT... < < EDITION DU MESSAGE CODE : < HORSE1: EQU $ LAD VAR+DEMCCI LR A,W < (W)=ADRESSE DE LA DEMANDE D'EMISSION. < (ELLE A ETE CORRECTEMENT POSITIONNEE < LORS DE L'ECHO DE "!CMS") BSR ACHAND < ENVOI DE "!CMS" CODEE... BSR ACHANW < ET ATTENTE DE FIN D'OPERATION... < < GESTION DES CONNEXIONS MATRICIELLES : < LA ARGDEM+OPDEM ANDI MKOPDM < (A)=FONCTION COURANTE, ET < (W)=ADRESSE DE LA DEMANDE COURANTE... SVC SVCM8 < VERS LA DUPLICATION EVENTUELLE DE LA < DEMANDE (W) SUR LES PERIPHERIQUES < CONNECTES AU PERIPHERIQUE COURANT... < < SORTIE : < PLR B,X,W < RESTAURATIONS, RSR < ET RETOUR SANS TOUCHER A L'INDEX < DE LA GRAMMAIRE 'CCI' (X)... LST PAGE < < < A U T O R I S A T I O N E T < I N H I B I T I O N D E S F O N C T I O N S < D A N G E R E U S E S : < < < FONCTION : < CE MODULE REFERENCE PAR "!R" < SOUS 'CCI', PERMET QUELQUE SOIT < LE MODE, QUELQUE SOIT L'<ACN>,... < D'INHIBER LES FONCTIONS DANGEREUSES... < ET DEPUIS PEU (SOUS ":SYS" UNIQUE- < MENT) DE LES AUTORISER PAR LA < COMMANDE "!R DANGER<CTRL-C><EOM>" ; < BIEN SUR C'EST DANGEREUX, MAIS < FINALEMENT MOINS QUE D'ALLER < BRICOLER AU PUPITRE... < < PDANGE: EQU $ < ENTRY D'AUTORISATION : BSR ASMMK < M A S Q U A G E I N T E R R U P T S... LA MEMV SBT MEMXXX < ON PREPARE L'AUTORISATION... JMP PDANG1 < VERS LA MISE A JOUR... PINHIB: EQU $ < ENTRY D'INHIBITION : BSR ASMMK < M A S Q U A G E I N T E R R U P T S... LA MEMV RBT MEMXXX < ON PREPARE L'INHIBITION... PDANG1: EQU $ < MISE A JOUR DE 'MEMV' : STA MEMV < ON MET A JOUR 'MEMV', ET : BSR ASMDK < D E M A S Q U A G E... RSR < PAS MECHANT... PAGE < < < G E S T I O N D E L A ' C D A ' : < < < PHILOSOPHIE : < LA 'CDA' EST ATTACHEE A CHAQUE UTILISATEUR < PAR L'INTERMEDIAIRE DE SA 'DCTESC' ET DU < SCHEDULER QUI POSITIONNE 'OCDA' ET 'ECDA'. < ON DISTINGUE 3 TYPE DE 'CDA' : < 1 - LA 'CDA-COMMUNE' : DONNEE PAR 'AOCDA' ET < 'AECDA' ET QUI EST COMMUNE A TOUS, < OU PRIVEE (?!???!?!) SI LA COMMANDE < "!CDAG" EST UTILISEE, AUQUEL CAS < TOUT AUTRE ACCES A LA 'CDA-COMMUNE' < PAR UN AUTRE UTILISATEUR SE SOLDERA < PAR UNE TRAPPE (VOIR 'HDLSCH')... < 2 - LA 'CDA-PRIVEE' : EST UNE EXTENSION DE < L'ESPACE MEMOIRE UTILISATEUR, ET CORRESPOND < LORSQUE LE SWAPPING A LIEU SUR 'DKS' AU ZONE < DE SIMULATION DU SWAPPING EN MEMOIRE ; A NOTER < QUE SUIVANT L'IDESC, DES TRAPPES DE VIOLATION < MEMOIRE POURRONT AVOIR LIEU SUIVANT QUE LA < ZONE ADRESSEE EXISTE OU NON... < 3 - LA 'CDA-TELEVISION' : QUI CORRESPOND A < LA MEMOIRE DE RAFRAICHISSEMENT DE LA TELEVISION ; < ON PEUT AINSI MODIFIER MOT A MOT UNE IMAGE... < ELLE EST APPELEE AUSSI 'CDA' 'BASSE- < DEFINITION'... < 4 - LA 'CDA-TELEVISION' DE MOYENNE < DEFINITION QUI PERMET D'ATTEINDRE < LE NOUVEL IMAGEUR 512*512... < < < FONCTION : < CINQ COMMANDES SONT DISPONIBLES : < !CDA POUR LA 'CDA-COMMUNE' ET "PARTAGEABLE" (!!??!), < !CDAG POUR LA 'CDA-COMMUNE' MAIS "PRIVEE" (!??!?!), < !CDAP POUR LA 'CDA-PRIVEE', < !CDAI POUR LA 'CDA-IMAGE' BASSE-DEFINITION, < !CDAJ POUR LA 'CDA-IMAGE' MOYENNE-DEFINITION. < < < ACCES A LA 'CDA' COURANTE : < L'UTILISATEUR PEUT A TOUT MOMENT < CONNAITRE L'ADRESSE DE SA 'CDA', ET < DONC SA LONGUEUR A L'AIDE DE LA < FONCTION '1E15, UTILISEE 2 FOIS, < LA PREMIERE AVEC (A)=AOCDA ('18), < LA SECONDE AVEC (A)=AECDA ('19), LE < RESULTAT ETANT RETOURNE DANS 'B'... < < < EXCLUSION DES 'CDA' : < EN REGLE GENERALE, IL EST < IMPOSSIBLE DE POSSEDER SIMUL- < TANEMENT PLUSIEURS 'CDA' (PAR < EXEMPLE 'CDAI' ET 'CDAJ') ; < IL Y A CEPENDANT UNE EXCEPTION < A CETTE REGLE : EN EFFET, LA < COMMANDE "!CDAG" NE PEUT ETRE < ANNULEE QUE PAR "!CDA", "!CDAP" < OU ENFIN "!F" ; CECI A ETE IN- < TRODUIT AFIN QUE LORSQU'ON < POSSEDE LA 'CDAG', ON PUISSE < MALGRE TOUT ATTEINDRE LES IMA- < GEURS SANS POUR CELA RISQUER DE < PERDRE LES INFORMATIONS CONTE- < NUES DANS LA 'CDAG', DE PLUS IL < EST NECESSAIRE DE LE FAIRE POUR < 'CDAI' ET 'CDAJ' A CAUSE DE LA < COMMANDE "!CDAI=I/J"... < < PCDA: EQU $ < < < ' C D A - C O M M U N E P R I V E E ' : < < PCDAG: EQU $ LA IDDESC-DCTESC,W TBT IDESC5 < N'A-T'ON PAS DEJA LA 'CDAG' ??? JC PCDA20 < OUI, DONC ON VA LA GARDER, MAIS EN < REPOSITIONNANT LES ADRESSES 'CDESCO' < ET 'CDESCE', AU CAS OU LA 'CDAI' OU < LA 'CDAJ' FUSSENT UTILISEES AU PREA- < LABLE... PSR W LRM W WORD ACDAG1 < (W)=PERMET D'ATTEINDRE LE MOT 'ACDAG' < DE LA 'DCTSCH', LAI XCDAGO XM O,W < ALORS, LA 'DCA-COMMUNE' EST-ELLE DEJA < OCCUPEE PAR UNE COMMANDE "!CDAG" ??? PLR W JANE APCDA2 < OUI, DONC LA COMMANDE "!CDAG" NE PEUT < ETRE ACCEPTEE... < < OK, MAINTENANT : (ACDAG)=XCDAGO, < ET L'UTILISATEUR COURANT POSSEDE < LA 'CDA-COMMUNE' JUSQU'A CE QU'IL < LA RENDE PAR UNE COMMANDE "!CDA", < "!CDAP", OU BIEN EN FAISANT < UN LOG-OUT... < IF XCDAGO-K,XEIF%,,XEIF% IF ATTENTION : LE TEST 'JANE' CI-DESSUS EST IDIOT !!! XEIF%: VAL ENDIF LA IDDESC-DCTESC,W SBT IDESC5 < ET ON MEMORISE DANS 'DCTESC' CETTE < ATTRIBUTION PAR "!CDAG"... STA IDDESC-DCTESC,W PCDA20: EQU $ < CAS OU L'ON POSSEDE DEJA LA 'CDAG'... LRM A,B WORD AOCDA3 < SUR LA WORD AECDA3 < 'CDA-COMMUNE'... JMP PCDA5 < VERS LA MISE EN PLACE DES ADRESSES... < < < ' C D A - C O M M U N E P A R T A G E A B L E ' : < < PCDAIN: EQU $ LRM A,B WORD AOCDA2 < SUR LA WORD AECDA2 < 'CDA-COMMUNE'... < < MISE EN PLACE DES ADRESSES, ET RETOURS : < PCDA1: EQU $ < CAS DE "!CDA" ET "!CDAP"... < < ON A ICI : < (A)=ADRESSE DE DEBUT DE LA 'CDA', < (B)=SON ADRESSE DE FIN. < PSR A,W LA IDDESC-DCTESC,W TBT IDESC5 < MAIS CET UTILISATEUR QUI A FRAPPE "!CDA", < "!CDAI" OU "!CDAP" N'AVAIT-IL PAS FRAPPE < "!CDAG" AU PREALABLE ??? RBT IDESC5 < DE TOUTE FACON, ON EFFACE CET APPEL... STA IDDESC-DCTESC,W JNC PCDA6 < NON, PAS DE "!CDAG" ANTERIEUR... LRM W < OUI, WORD ACDAG2 < (W)=ADRESSE DU MOT 'ACDAG' DE 'DCTSCH', IF XCDAGL-K,,XEIF%, IF ATTENTION : CE QUI VA SUIVRE EST IDIOT !!! XEIF%: VAL ENDIF STZ O,W < LIBERONS LA 'CDAG'... PCDA6: EQU $ PLR A,W PCDA5: EQU $ < CAS DE "!CDAG", "!CDAI" ET "!CDAJ"... PSR A,W TBT BMCDAJ < EST-CE LA 'CDAJ' QUI EST DEMANDEE ??? JC PCDA8 < OUI, ON NE REGARDE PAS SI ON L'AVAIT < DEJA, AFIN DE NE PAS LA RENDRE... LA CDESCO-DCTESC,W < ACCES A LA 'CDA' COURANTE DE CET < UTILISATEUR : TBT BMCDAJ < NE SERAIT-CE PAS LA 'CDAJ' ??? < (CARACTERISEE PAR LE BIT 'BMCDAJ' DANS < DANS TOUTES SES DADR-ADRESSES) JNC PCDA8 < NON, RIEN A FAIRE... LRM W < OUI, WORD ACDAJ2 < (W)=ADRESSE DU MOT 'ACDAJ' DE 'DCTSCH', < QUI PERMET L'APPROPRIATION... IF XCDAJL-K,,XEIF%, IF ATTENTION : LE 'STZ' QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF STZ O,W < LIBERONS LA 'CDAJ'... PCDA8: EQU $ < CAS OU L'ON N'A PAS LA 'CDAJ', OU BIEN < OU ON LA DEMANDE PRESENTEMENT... PLR A,W < < MISE EN PLACE DE 'CDESCO'/'CDESCE' : < STA CDESCO-DCTESC,W < MISE EN PLACE STB CDESCE-DCTESC,W < DANS LA 'DCTESC', PCDA3: EQU $ < RETOUR EN ERREUR... RSR < RETOUR... < < < ' C D A - I M A G E ' B A S S E - D E F I N I T I O N : < < PCDAIM: EQU $ LRM A,B WORD MEMTV0 < SUR LA WORD MEMTVR-Z < 'CDA-TELEVISION'... JMP PCDA5 < VERS LA MISE EN PLACE DES ADRESSES... < (EN CONSERVANT LA 'CDAG' SI ON LA < POSSEDE DEJA...) < < < ' C D A - I M A G E ' M O Y E N N E - D E F I N I T I O N : < < PCDAJM: EQU $ < < TEST DE L'ETAT DU 'CBMJ' : < BSR ASMMK < ON MASQUE LES INTERRUPTIONS, CAR EN < EFFET ON VA LIRE LE REGISTRE 'IM' PAR < UN 'XIMR' ; A NOTER QU'ON NE PEUT UTILI- < SER 'PIMMST' GENERE PAR 'PR1', CAR LE < BIT 'NIVCBJ' DE 'IM' A PU ETRE MODIFIE < A LA MAIN... LAI MMOT < AFIN DE TOUT MASQUER... XIMR A < LECTURE DE 'IM', PSR A < SAUVEGARDE, XIMR A < ET RESTAURATION... BSR ASMDK < ET ON PEUT ALORS DEMASQUER. PLR A < (A)=CONTENU DU REGISTRE 'IM' COURANT, TBT NIVCBJ < ALORS LE SYSTEME DE TELEVISION NUMERI- < QUE MOYENNE DEFINITION EST-IL ACCES- < SIBLE ??? JC PCDA2 < NON, IL EST MASQUE, DONC "!CDAJ..." < EST REFUSEE... < < CALCUL DE LA TRANSLATION < DE LA PREMIERE PAGE VERS < LA PAGE DEMANDEE : < LA VALESC-DCTESK,W < (A)=NUMERO DE LA PAGE DEMANDEE, SLLS LK>DADR*IMCDAJ=K LR A,Y < (Y)=TRANSLATION EN 'DADR'-MOTS DE LA < PAGE DEMANDEE PAR RAPPORT A LA < PREMIERE, LA VALESC-DCTESK,W SCLS LK>DADR*IMCDAJ=K CPR A,Y < LE 'SLLS' ET LE 'SCLS' DOIVENT DONNER < LE MEME RESULTAT S'IL N'Y A PAS DE- < BORDEMENT, C'EST-A-DIRE SI L'ARGUMENT < 'VALESC' EST BON... JNE PCDA2 < ET BIEN NON, IL EST TROP GRAND... < < TENTATIVE D'APPROPRIATION DE LA 'CDAJ' : < LA CDESCO-DCTESC,W < ACCES A LA 'CDA' COURANTE DE CET < UTILISATEUR : TBT BMCDAJ < NE SERAIT-CE PAS DEJA LA 'CDAJ' ??? < (CARACTERISEE PAR LE BIT 'BMCDAJ' DANS < DANS TOUTES SES DADR-ADRESSES) JC PCDA11 < OUI, ON NE SE LA REAPPROPRIE PAS... PSR W < NON, ON VA TENTER : LRM W WORD ACDAJ1 < (W)=PERMET D'ATTEINDRE LE MOT 'ACDAJ' < DE 'DCTSCH' QUI PERMET L'ALLOCATION < UNIQUE DE 'CDAJ'... LAI XCDAJO < (A)=ETAT D'OCCUPATION DE 'CDAJ', XM O,W < ET L'ON TENTE DE S'APPROPRIER 'CDAJ' : PLR W APCDA2: JANE PCDA2 < ET BIEN C'EST IMPOSSIBLE, ELLE EST DEJA < OCCUPEE ; ON LA LAISSE A CELUI QUI L'A... < (NOTONS QUE 'XM' N'A PAS CHANGE LA < VALEUR DU CONTENU DE 'ACDAJ'...) < (ET RELAI...) IF XCDAJO-K,XEIF%,,XEIF% IF ATTENTION : LE 'JANE' QUI PRECEDE EST IDIOT !!! XEIF%: VAL ENDIF PCDA11: EQU $ < < OK, ON A LA 'CDAJ', < CALCULONS L'ADRESSE < DE LA PAGE DESIREE : < LRM A,B WORD MCDAJO < (A)=ADRESSE DE DEBUT DE LA PREMIERE < PAGE, WORD MCDAJE < (B)=ADRESSE DE FIN DE LA PREMIERE PAGE. ADR Y,A < TRANSLATION SUR ADR Y,B < LA PAGE DEMANDEE, IF BMCDAJ-BITSIG,,XEIF%, IF ATTENTION : LES TESTS SUIVANTS SONT MAUVAIS !!! XEIF%: VAL ENDIF CPZR B < VALIDONS LA TRANSLATION (Y) PAR LE TEST < DE L'ADRESSE DE FIN : JGE PCDA10 < ERREUR, L'ADRESSE REPASSE PAR 0 ; L'AR- < GUMENT 'VALESC' EST TROP GRAND... JAL PCDA5 < OK, VERS LA MISE EN PLACE DES ADRESSES... < (EN CONSERVANT LA 'CDAG' SI ON LA < POSSEDE DEJA...) < (L'ADRESSE DE DEBUT EST BONNE, PUISQUE < NEGATIVE, CF. 'BMCDAJ'...) BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < COMPRENDRE COMMENT L'ADRESSE DE < DEBUT PEUT ETRE BONNE, ALORS QUE < CELLE DE FIN EST MAUVAISE !!! < PCDA10: EQU $ < SORTIE EN ERREUR, ALORS QUE LA 'CDAJ' < A ETE ALLOUEE A CET UTILISATEUR... PSR W LRM W < OUI, WORD ACDAJ3 < (W)=ADRESSE DU MOT 'ACDAJ' DE 'DCTSCH', < QUI PERMET L'APPROPRIATION... IF XCDAJL-K,,XEIF%, IF ATTENTION : LE 'STZ' QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF STZ O,W < ET ON LIBERE LA 'CDAJ'... PLR W JMP PCDA2 < ET ENFIN, SORTIE EN ERREUR... < < < ' C D A - P R I V E E ' : < < PCDAP: EQU $ LA IDESC-DCTESC,W ANDI MKIDES < (A)='IDESC' DE L'UTILISATEUR... CP NUSEP1 < AUTORISE ??? JGE PCDA2 < NON, IL N'A PAS DE 'CDAP' !!! < < NOTA : < DORENAVANT, LA COMMANDE "!CDAP" < EST COMPATIBLE AVEC UN SWAPPING < SUR 'PR1' ; EN EFFET LORS DE LA < SELECTION DE L'ORGANE DE SWAPPING < LORS DE L'INITIALISATION DU SWAPPING < OUT, SI LA 'CDA' COURANTE DE L'UTI- < LISATEUR EST LA "!CDAP", ON FORCE A < PRIORI 'DKS'. < DE PLUS, CELA N'EST PAS DANGEREUX < DE FAIRE CELA ICI, CAR EN EFFET < LORSQU'ON EXECUTE CE CODE ON EST < SWAPPE OUT ET CE QUI VA SUIVRE EST < UN SWAPPING IN QUI UTILISE OBLIGA- < TOIREMENT L'ORGANE DE SWAPPING OUT < PRECEDENT... < LA DEMSWP-DCTESC+T+ASDEM,W SB ASYS < OUI, ACCES AU DEPLACEMENT DE L'UTILI- < SATEUR DANS LES ZONES DE SWAPPING, XWOR%2: VAL XXXMOY XWOR%1: VAL TZSWAP/XWOR%2 < PARCEQUE TROP GRAND POUR UN 'ADRI'... IF XWOR%1*XWOR%2-TZSWAP,,XEIF%, IF ATTENTION : 'TZSWAP' N'EST PAS DIVISIBLE PAR 2 !!! XEIF%: VAL ENDIF DO XWOR%2*M ADRI -XWOR%1,A < (A)=PREMIERE ADRESSE ACCESSIBLE. LR A,B < ET SAUVEGARDE DANS 'B'... PSR X,L LXI NSPPR1 BSR ACADCT < (A)=(L)=ADRESSE DE 'DCTPR1', CAR EN EFFET < ELLE CONTIENT 2 CONSTANTES VACHEMENT < UTILES... LR B,A < (A)=PREMIERE ADRESSE ACCESSIBLE (EXPRI- < PRIMEE EN SECTEURS PAR RAPPORT AU '0 < DU PREMIER UTILISATEUR... MP VAR+TAPROG < PAR CE CALCUL ON PASSE D'UNE ZONE DE DV VAR+TASWAP < SWAPPING A ZONE SCRATCH ('DKS') A UNE < ZONE DE SWAPPING SANS ('PR1')... CPZR B < LE RESTE DOIT ETRE NUL... JE PCDA7 < OUI, OK... BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < COMPRENDRE COMMENT LE RESTE DE < CETTE DIVISION PEUT ETRE NON NUL !!! < PCDA7: EQU $ PLR X,L LR A,B < (A)=(B)=PREMIERE ADRESSE ACCESSIBLE < DANS L'ESPACE DE SWAPPING SUR 'PR1'... XWOR%2: VAL YY7 < PREMIERE CONSTANTE INACCESSIBLE DANS < UNE INSTRUCTION 'ADRI'... XWOR%2: VAL TCPROG*XXXMOY/XWOR%2 XWOR%1: VAL TCPROG/XWOR%2 DO XWOR%2*M ADRI XWOR%1,B < (B)=PREMIERE ADRESSE INACCESSIBLE... SLLD YY7>DADR=K < CONVERSION EN DES ADRESSES RELATIVES < EN 16-MOTS... LRM Y WORD KSIMS>DADR*LK < (Y)=ADRESSE 16-MOTS DU PREMIER MOT < DISPONIBLE A CET USAGE... ADR Y,A < (A)=ADRESSE DE DEBUT DE LA 'CDA-PRIVEE', ADR Y,B < (B)=ADRESSE DE FIN DE ADRI -Z,B < LA 'CDA-PRIVEE'. < < TEST DES CHANGEMENTS DE PAGE (DE 64K) : (A)=DEBUT, (B)=FIN : < PSR A,B LR B,Y < (Y)=FIN, (A)=DEBUT. SLRD NBITMO+DADR+NBITMO < (B)=CHIFFRE0(DEBUT). LR Y,A < (A)=FIN, SLRS NBITMO+DADR < (A)=CHIFFRE0(FIN). CPR A,B < Y-A-T'IL CHANGEMENT DE PAGE ??? LR A,Y < (Y)=CHIFFRE0(FIN)... PLR A,B JE PCDA1 < IL N'Y A PAS DE CHANGEMENT DE PAGE, < ET 'A' ET 'B' SONT BONS : < (A)=DEBUT, (B)=FIN... < < CAS DES CHANGEMENTS DE PAGE : < XR A,Y < (Y)=DEBUT, (B)=FIN, (A)=CHIFFRE0(FIN). SLLS NBITMO+DADR < (A)=PSEUDO-MILIEU (DIT "MILIEU"). SBR A,Y NGR Y,Y < (Y)=MILIEU-DEBUT. SBR A,B < (B)=FIN-MILIEU. CPR Y,B < EST-CE LA PARTITION HAUTE OU BASSE PAR < RAPPORT AU "MILIEU" QUI EST LA PLUS < GRANDE ??? JL PCDA4 < (B)<(Y) : C'EST LA PARTITION BASSE QUI < EST LA PLUS INTERESSANTE... < < (B)>=(Y) : C'EST LA PARTITION HAUTE : < ADR A,B < (B)=FIN-MILIEU+MILIEU=FIN, ET < (A)=MILIEU=NOUVEAU DEBUT... JMP PCDA1 < VERS LE RANGEMENT DE 'A' ET 'B' (B EST < EN FAIT INCHANGE...). < < (B)<(Y) : C'EST LA PARTITION BASSE : < PCDA4: EQU $ LR A,B ADRI -Z,B < (B)=MILIEU-E=NOUVELLE FIN, ET SBR Y,A < (A)=MILIEU-(MILIEU-DEBUT)=DEBUT. JMP PCDA1 < VERS LE RANGEMENT DE 'A' ET 'B' (A EST < EN FAIT INCHANGE...). < < ERREURS : < PCDA2: EQU $ ADRI XCCIER,X < RETOUR EN ERREUR A LA GRAMMAIRE... JMP PCDA3 < VERS LE RETOUR SANS MISE EN PLACE... PAGE < < < C O M M U T A T I O N ' C D A I ' --> ' C D A J ' : < < < FONCTION : < UN NOUVEAU DISPOSITIF A ETE < INTRODUIT AFIN DE PERMETTRE A < DE NOMBREUX PROGRAMMES QUI MANI- < PULENT LA 'CDAI' EXPLICITEMENT < DE TRAVAILLER EN AVEUGLE (ET SANS < LE SAVOIR) SUR LA 'CDAJ+...' ; DEUX < COMMANDES ONT ETE INTRODUITES : < < "!CDAI=I" : ALORS "!CDAI" EST "!CDAI", < "!CDAI=J" : ALORS "!CDAI" EQUIVAUDRA < A "!CDAJ" LORSQU'ELLE SERA < EMISE. < < < ARGUMENT : < (W)=ADRESSE DE 'DCTESC'. < < < RESULTAT : < POUR 'QCDAIJ', LE CONTENU DE 'X' < EST INCHANGE SI "!CDAI=I", ET < INCREMENTE DE 'XCCIER' SI "!CDAI=J". < < PCDAII: EQU $ < TRAITEMENT DE "!CDAI=I" : LA IDDESC-DCTESC,W RBT IDESCJ < IL SUFFIT DE CLEARER 'IDESCJ'... JMP PCDAIK < VERS LA MISE A JOUR... PCDAIJ: EQU $ < TRAITEMENT DE "!CDAI=J" : LA IDDESC-DCTESC,W SBT IDESCJ < IL SUFFIT DE FAIRE MONTER 'IDESCJ'... PCDAIK: EQU $ STA IDDESC-DCTESC,W < ET ON MET A JOUR 'IDDESC' DANS 'DCTESC'. RSR < < < T E S T D E C O M M U T A T I O N : < < QCDAIJ: EQU $ LA IDDESC-DCTESC,W TBT IDESCJ < ALORS : "!DCAI=I" OU "!CDAI=J" ??? ADCR X < ET ON FAIT EN CONSEQUENCE UN RETOUR < NORMAL SI "!CDAI=I" (IDESCJ=0) OU UN < RETOUR EN ERREUR SI "!CDAI=J" (IDESCJ=1). IF BIT-XCCIER,,XEIF%, IF ATTENTION : LA SORTIE DE 'QCDAIJ' EST MAUVAISE !!! XEIF%: VAL ENDIF RSR < ET ON SORT SUIVANT (X)... PAGE < < < T R A I T E M E N T D U M O D E < N O N I N T E R A C T I F D U C C I < P O U R U N E S C L A V E : < < < FONCTION : < CES ROUTINES SONT APPELEES PAR < LA GRAMMAIRE DU CCI, EN CERTAINS < POINTS 'STRATEGIQUES' LORSQUE LE < CCI EST EN MODE NON INTERACTIF POUR < UN ESCLAVE. < < < M O D I F I C A T I O N D U R E G I S T R E < X D ' U N E S C L A V E : < < < A T T E N T I O N : < CETTE ROUTINE NE FAIT RIEN SI < L'APPEL DU CCI A EU LIEU PAR UN < QUIT, CE DONT ON SE REND COMPTE < EN TESTANT LE MODE DE L'ESCLAVE. < < < ARGUMENT : < (B)=VALEUR A DONNER AU REGISTRE X. (CONDITION < DE RETOUR DU CCI EN MODE NON INTERACTIF). < (W)=ADRESSE DCT(ESCLAVE). < < CCIXE: EQU $ CPZ PSTESC-DCTESC+RS,W < TEST DU REGISTRE 'S' DE < L'ESCLAVE. IF MS-BITSIG,,XEIF%, IF ATTENTION : LE TEST EST IDIOT !!! XEIF%: VAL ENDIF JGE Z862 < L'ESCLAVE EST EN MODE MAITRE, < L'APPEL A EU LIEU PAR QUIT, < ON FAIT UN RETOUR IMMEDIAT. < < CAS DES APPELS PAR SVC : < <******************************************************************************* BSR ASTXES < EXECUTION DU STORE X(ESCLAVE) SUIVANT : STB PSTESC-DCTESC+RX,W < REGISTRE 'X' DANS PST(ESCLAVE). <******************************************************************************* Z862: EQU $ < SORTIE IMMEDIATE DES APPELS < PAR QUIT. RSR < ET C'EST TOUT... < < I N I T I A L I S A T I O N D E L ' A N A L Y S E < S Y N T A X I Q U E D U C C I : < < < ARGUMENT : < (W)=ADRESSE DCT(ESCLAVE), < (L)=ADRESSE DCT(SERVICE). < < INIBES: EQU $ < < INITIALISATION ANALYSE SYNTAXIQUE : < LAD BUFESC-DCTESC,W < (A)=@BUFESC. SBT BITX < POSITIONNEMENT DU BIT D'INDEX. STA VAR+ABUFGR < GENERATION DU RELAI INDIRECT < INDEXE VERS BUFESC. STZ VAR+XBUFGR < INDEX INITIAL. < < INITIALISATION DE DEMCCI : < IF NOCMO=K-BIT,,XEIF%, IF ATTENTION : LE 'BITX' EST RESTE DANS 'A' !!! XEIF%: VAL ENDIF SLLS NOCMO=K < (A)=@OCTET DE BUFESC. STA VAR+DEMCCI+T+AMDEM < INITIALISATION DE AMDEM DE < DEMCCI AVEC @BUFESC ; EN EFFET < PUISQU'ON EST EN NON INTERACTIF, < DEMCCI N'EST PAS INITIALISEE < CORRECTEMENT (EN GENERAL), < OR SON CONTENU EST UTILISE < LORS DES !ASSIGN SUR LE SGF !!! LA DEMESC-DCTESC+T+CODEM,W STA VAR+DEMCCI+T+CODEM < TRANSMISSION DE LA LONGUEUR DU MESSAGE, < EN PARTICULIER UTILISE PAR LA COMMANDE < !L <ACN> "ON-LINE"... STA VAR+MBUFGR < AFIN DE VALIDER 'XBUFGR' DANS 'CARAC'... BSR ACHKIN < RENVOI : (A)=NSPIN. STBY VAR+DEMCCI < MISE EN PLACE DE NSPIN, ON < NE SAIT JAMAIS... RSR < RETOUR. PAGE < < < D E B U G U T I L I S A T E U R : < < < FONCTION : < CES ROUTINES SONT APPELEES PAR < L'INTERMEDIAIRE DE LA GRAMMAIRE < PRIVEE DU DEBUG (!DEBUG). < < < SYNTAXE : < ?<R/C> (+1 AUTOMATIQUE SUR A-ROND), < ?<EOT> (A-ROND RECOIT LA DERNIERE VALEUR DISPLAYEE, < OU LA DERNIERE VALEUR ENTREE), < ?'+'/'-'<VALEUR><EOM>, < ?<OPERANDE>(T)'<'/'>'(<VALEUR>)<EOM>. < AVEC <OPERANDE>::=A,B,X,Y,C,L,W,K,P,S,@,M. < <OPERANDE>::=';' (SORTIE DU DEBUG), < <OPERANDE>::='G' (SORTIE DU DEBUG ET RETOUR D'ABORT). < < < RETOUR AU PROGRAMME UTILISATEUR APRES < UNE TRAPPE OU UN ALT-MODE : < ON MODIFIE DANS L'ORDRE ET SANS FAIRE < DE COMMANDES <OPERANDE>'T', QUI FONT < UN RETOUR AU SVC CCI : < A<--(AT) OU AUTRE VALEUR, < X<--(XT) OU AUTRE VALEUR, < S<--MODE-ESCLAVE, < K<--(KT) OU AUTRE VALEUR, < P<--(PT) OU AUTRE VALEUR, < ; QUI PROVOQUE LE RETOUR AU PROGRAMME INTERROMPU. < OU PAR : < "G" QUI EST EQUIVALENTE A CE QUI PRECEDE... < < < CAS DU ALT-MODE : < A-ROND DONNE (AVANT QU'ON NE L'AIT MODIFIE !!!) < LE SOMMET DE LA PILE POINTEE PAR < K AU MOMENT DU ALT-MODE ; SI < ST=<MODE-MAITRE>, L'ESCLAVE < FAISAIT UN SVC, ET @ DONNE ALORS < LE P DE RETOUR DU SVC ; POUR RELANCER < LE PROGRAMME, ON FERA DONC : < (K)<--(A-ROND), OU (A-ROND)-1 POUR REITERER LE 'SVC', < X<--(XT), < A<--(AT), < ; QUI PROVOQUE LE RETOUR (ON NE TOUCHE < NI A S NI A P). < < PAGE < < < R E T O U R S U I T E A U N E T R A P P E : < < < FONCTION : < CE MODULE APPELE EN FIN DE < SERVICE PAR "G" SOUS 'DEBUG' < PERMET DE RESTAURER LES CONDI- < TIONS D'AVANT LA TRAPPE, ET DE < RELANCER LE PROGRAMME. < LORSQU'UNE TRAPPE APPARAIT, < LE REGISTRE 'P' PEUT TRES BIEN < POINTER SUR L'INSTRUCTION EN < CAUSE, COMME SUR LA SUIVANTE; < C'EST POURQUOI, DERRIERE "G", < ON PEUT PRECISER UNE CONSTANTE < DE TRANSLATION DE 'P' (EVENTUEL- < LEMENT ABSENTE, DONC NULLE...). < < < ARGUMENT : < (W)=ADRESSE DE 'DEMSER', < (VALESC)=CONSTANTE DE TRANSLATION DE 'RP'. < < CALL #SISP CMS5 DOL1# MOVERU: EQU $ STZ FSERV-DEMSER,W < SUPPRESSION DE LA ROUTINE DE FIN DE < SERVICE... PSR B,X < SAUVEGARDES ESSENTIELLES... CALL #SISP CMS5 PSRSLO# < < PREPARATION DE (SLO,SLE) < ENCADRANT L'ESPACE UTILISATEUR < Y COMPRIS L'EN-TETE : < LA PSTESC-DEMSER+RSLO,W < (A)='SLO' DE L'ESCLAVE, XWOR%1: VAL SLOESC>DADR ADRI -XWOR%1,A < (A)=ADRESSE DE L'ESPACE UTILISATEUR, LB PSTESC-DEMSER+RSLE,W < (B)='SLE' DE L'ESCLAVE, WOE < ENCADREMENT DE L'ESPACE UTILISATEUR... PSR Y < < TEST D'UN REDEMARRAGE SUITE < A UN DOUBLE ALT-MODE LORS < D'UNE ECRITURE : < LYI RST LAR < (A)=REGISTRE 'ST' DE L'UTILISATEUR, TBT BALT2 < ALORS, DOUBLE ALT-MODE LORS D'UNE ECRI- < TURE ALPHA-NUMERIQUE OU GRAPHIQUE ??? JNC MOVER1 < NON, ON NE TOUCHE A RIEN... SBT V < OUI, DANS CES CONDITIONS, ON ANNULE LE < CODE D'ERREUR ('RXT'), ET LES INDICATEURS < 'V' ET 'C' DE 'RST' QUI AVAIENT ETE < POSITIONNES PAR UN TEST DE (RXT)... RBT C < (V)=1 ET (C)=0 SIMULENT UN 'CPZR' < SUR UNE VALEUR NULLE... RBT BALT2 < ENFIN, ON ANNULE L'INDICATEUR DE DOUBLE < ALT-MODE... STAR < ET ON MET AINSI A JOUR 'RST'... LYI RXT LAR < (A)=REGISTRE 'X' SUITE AU DOUBLE ALT- < MODE... CPI EVALT < ON LE VALIDE, CELA NE MANGE PAS DE < PAIN... JE MOVER2 < OK... BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < LA GESTION DU BIT 'BALT2' NE < DOIT PAS ETRE CORRECT, PEUT-ETRE < EST-IL DE TEMPS EN TEMPS REMANENT !!! < MOVER2: EQU $ LAI K STAR < ET ON CLEAR 'RXT', AFIN DE FAIRE UN < RETOUR SANS ERREUR AU PROGRAMME... MOVER1: EQU $ < < REGENERATION DES PREMIERS < MOTS DE L'ESPACE MEMOIRE DE < L'UTILISATEUR ECRASE PAR < 'IMEMY' : < LYI RMOT0 LAR LYI SLOESC+XMOT0 STAR < RESTAURATION DU MOT0, LYI RMOT1 LAR LYI SLOESC+XMOT1 STAR < DU MOT1, LYI RMOT2 LAR LYI SLOESC+XMOT2 STAR < ET DU MOT2... PLR Y < < RESTAURATION DES REGISTRES : < LAD PSTESC-DEMSER+RA,W LR A,B < (B)=ADRESSE DU RECEPTEUR (ZONE DES < REGISTRES DANS 'DCTESC'), LAI RAT < (A)=ADRESSE DE L'EMETTEUR (ZONE DES < REGISTRES DE TRAPPE DANS L'ESPACE < UTILISATEUR ENTIER), LXI RS-RA+Z < (X)=NOMBRE DE REGSITRES A RESTAURER... MVTM < ET ON RETABLIT LES CONDITIONS D'AVANT < L'ABORT... < < TRANSLATION EVENTUELLE DE 'RP' : < (VOIR LE PROBLEME DES TRAPPES...) < LA PSTESC-DEMSER+RP,W AD DCTESC+VALESC-DEMSER,W STA PSTESC-DEMSER+RP,W < < ET RETOUR : < CALL #SISP CMS5 PLRSLO# PLR B,X < RESTAURATIONS... RSR CALL #SISP CMS5 DOL2# < < < D E M A N D E D E F I N D E S E R V I C E < D E R E T O U R S U I T E A U N E T R A P P E : < < < FONCTION : < CE MODULE APPELE PAR LA GRAMMAIRE < DU 'DEBUG' POSITIONNE UNE ROUTINE < DE FIN DE SERVICE QUI RETABLIRA < LES CONDITIONS D'AVANT LA TRAPPE... < < < ARGUMENT : < (W)=ADRESSE DE 'DCTESC'. < < MOVER: EQU $ LRM A WORD MOVERU < (A)=ADRESSE DE LA ROUTINE DE FIN DE < SERVICE EN ESPACE BAS, BSR AFSERV < QUE L'ON MET EN ROUTINE DE FIN DE < SERVICE POUR CET UTILISATEUR... RSR < ET C'EST TOUT... < < < O P E R A N D E D U D E B U G : < < < FONCTION : < CETTE ROUTINE RECUPERE LA PARTIE < <OPERANDE> DE LA COMMANDE ENVOYEE < PAR L'UTILISATEUR AU DEBUG. < < < ARGUMENT : < (B)=NUMERO DE L'OPERANDE : < 0 : A, < 1 : B, < 2 : X, < 3 : Y, < 4 : C, < 5 : L, < 6 : W, < 7 : K, < 8 : P, < 9 : S, < 10 : @ (ADRESSE COURANTE), < 11 : M (CONTENU MEMOIRE @), < 12 : O (TRANSLATION DE '@' SOUS 'DEBUG' < ABSOLU), < 13 : 0 (CONTENU DU MOT0), < 14 : 1 (CONTENU DU MOT1), < 15 : 2 (CONTENU DU MOT2 DE L'ESPACE MEMOIRE < UTILISATEUR AU MOMENT D'UNE TRAPPE). < < < RESULTAT : < (Y)=B. < < SADBG: EQU $ LR B,Y < AIN'T IT HARD ?!?!?!? RSR < < < O P E R A N D E D E T R A P P E : < < < FONCTION : < CETTE ROUTINE EST APPELEE SUITE < A L'OPTION 'T' SUIVANT LA < PRECISION DE <OPERANDE> ; IL EST < AUSSI APPELE POUR "@" ET "M"... < < < ARGUMENT : < (Y)=<OPERANDE> < (W)=ADRESSE DE 'DCTESC'. < < < RESULTAT : < (Y)=(Y)-SLOESC. < < SADTBG: EQU $ < < MEMORISATION DU TYPE DE <VALEUR> : < ADRI -SLOESC,Y < < < M O D E M A I T R E P O U R U N < U T I L I S A T E U R S O U S ' S V C ' : < < < FONCTION : < LORSQUE LE 'CCI' VA ETRE < SUSPENDU, IL EST NECESSAIRE < DE FORCER LE MODE MAITRE POUR < UN UTILISATEUR SOUS 'SVC', ET EN < RESTAURANT 'P' SUR 'RETSVC' ; DE < PLUS, CELA PROVOQUE ALORS UN RETOUR < EN ERREUR AU 'CCI', AFIN DE POUVOIR < EDITER UN MESSAGE... < < < ARGUMENT : < (W)=ADRESSE DE 'DCTESC'. < < MASTER: EQU $ < < FAISONS EN SORTE QUE L'ESCLAVE < PUISSE FAIRE CE QU'IL A DEMANDE : < LA PSTESC-DCTESC+RS,W TBT SVCS < L'UTILISATEUR EST-IL ARRIVE ICI PAR < UN 'SVC' ??? JNC SADTB1 < NON, OK... TBT MS < OUI, ALORS EST-ON BIEN EN MODE MAITRE ??? JC SADTB1 < OUI, OK... SBT MS < NON, ALORS ON LE REMET A PRIORI EN MODE < MAITRE AFIN D'ASSURER CORRECTEMENT LA < SUSPENSION DU 'CCI' INHERENTE AUX COM- < MANDES "@", "M" ET DE TYPE "T"... STA PSTESC-DCTESC+RS,W LRM A WORD RETSVC STA PSTESC-DCTESC+RP,W < ON REFAIT POINTER LE P(ESCLAVE) SUR LE < RETOUR DES INSTRUCTIONS 'SVC'... ADRI XCCIER,X < ET ENFIN, ON PROVOQUE UN RETOUR EN ERREUR < AU 'CCI', AFIN D'EDITER UN MESSAGE... SADTB1: EQU $ < < SORTIE (COMMUNE A 'MASTER' ET 'SADTBG') : < RSR < < < R E C U P E R A T I O N D ' U N E V A L E U R : < < < FONCTION : < CETTE ROUTINE EST APPELEE LORS < DES DEMANDES DE <MODIFY> ('<'). ELLE < RECUPERE LA <VALEUR> SUIVANT '<'. < < < ARGUMENT : < (W)=ADRESSE DCT(ESCLAVE). < < < RESULTAT : < VALESC(DCTESC)=<VALEUR>. < < SVDBG: EQU $ PSR X < SAVE INDEX DE LA GRAMMAIRE DU < CCI (GRAMMAIRE DU DEBUG). LX VAR+XBUFGR < (X)=INDEX 1ER CARACTERE PRESUME < DE <VALEUR>. LAD VAR+ABUFGR < (A)=@RELAI VERS LE BUFFER. BSR AHEXIN < CONVERSION DE LA CHAINE < HEXADECIMALE <VALEUR> EN < BIANIRE. STX VAR+XBUFGR < MAJ DE L'INDEX DE BUFGR. STA VALESC-DCTESK,W < SAVE LA <VALEUR> (A) DANS < LE DEMESC DE DCTESC. PLR X < RESTAURE L'INDEX DE LA < GRAMMAIRE DU CCI. RSR < < < T E S T D E R E S I D E N C E < D E < O P E R A N D E > : < < < FONCTION : < CETTE ROUTINE EST APPELEE POUR < SAVOIR SI L'<OPERANDE> EST RESIDENTE (CAS < DES REGISTRES DU CONTEXTE DANS DCTESC), < NON RESIDENT (CAS DES REGISTRES DE < TRAPPE, OU DU CONTENU DE L'ESPACE < MEMOIRE DE L'UTILISATEUR). < < < ARGUMENT : < (Y)=<OPERANDE>. < < < RESULTAT : < INDEX DE LA GRAMMAIRE DU CCI : < X : INCHANGE SI RESIDENT, < X::=(X)+1 SI NON RESIDENT. < < TRDBG: EQU $ CPZR Y IF XCCINX-BIT,,XEIF%, IF ATTENTION : LE 'ADCR' SUIVANT VA MERDER !!! XEIF%: VAL ENDIF ADCR X < ON AJOUTE LE CARY A X, SOIT < 1 SI (Y)<0, ET 0 SI (Y)>=K. RSR PAGE < < < M O D I F Y < O P E R A N D E > : < < < FONCTION : < CETTE ROUTINE EST APPELEE LORS < QU'ON EST SUR DE LA RESIDENCE < DE <OPERANDE>. ELLE RECUPERE LA VALEUR, ET < APRES DIVERSES VERIFICATIONS (LIMITATION < SUR LES MODIFICATIONS DU REGISTRE S, < IMPOSSIBILITE DE TOUCHER A P EN MODE < MAITRE), < DONNE CETTE <VALEUR> A <OPERANDE>. < < < A T T E N T I O N : < LORSQUE CELA EST NECESSAIRE (Y<0), < L'ESPACE MEMOIRE DE L'UTILISATEUR < EST RESIDENT. < < < ARGUMENT : < VALESC(DCTESC)=<VALEUR>, < (W)=ADRESSE DCT(ESCLAVE), < (L)=ADRESSE DCT(SERVICE). < (Y)=<OPERANDE>. < < MODBG: EQU $ PSR L < SAVE @DCT-SERVICE. LB VALESC-DCTESK,W < (B)=<VALEUR>. < < CALCUL DE L'ADRESSE ABSOLUE DE <OPERANDE> : < CPZR Y JL Z350 < <OPERANDE> N'ETAIT PAS RESIDENTE. < < CAS <OPERANDE> RESIDENTE : < LR W,L < (L)=@DCT-ESCLAVE. < < VALIDATION DU <MODIFY> : < LR Y,A < (A)=<OPERANDE>. CPI RK < EST-CE K ????? JE Z351 < OUI, ALLONS TESTER S(DCTESC). CPI RP < EST-CE P ???? JNE Z326 < NON, NI P(DCTESC), NI K(DCTESC) < < <MODIFY> DEMANDE SUR P(DCTESC) OU K(DCTESC) : < Z351: EQU $ CPZ PSTESC-DCTESC+RS,W < TEST DU REGISTRE S(DCTESC). IF MS-BITSIG,,XEIF%, IF ATTENTION : LE TEST EST IDIOT !!! XEIF%: VAL ENDIF JGE Z327 < OK, L'UTILISATEUR EST EN < MODE ESCLAVE, IL PEUT MODIFIER < SON REGISTRE P(DCTESC) COURANT. < < RETOUR EN ERREUR DE MODBG ET DE DISDBG : < Z328: EQU $ ADRI XCCIER,X < RETOUR EN ERREUR AU CCI. < < SORTIE DE MODBG ET DE DISDBG : < Z329: EQU $ PLR L < RESTAURE (L)=@DCT-SERVICE. Z340: EQU $ RSR Z326: EQU $ CPI RS < EST-CE UN <MODIFY> DE S ????? JNE Z327 < NON, C'EST BON ON PEUT MODIFIER. < < <MODIFY> REGISTRE S(DCTESC) : < LR B,A < (A)=<VALEUR>. RBT V < RAZ INDICATEUR V. RBT C < RAZ INDICATEUR C. JANE Z328 < DANS LE CAS OU CE QUI RESTE DE S < EST DIFFERENT DE 0, LA < DEMANDE DE <MODIFY> EST REFUSEE. LA PSTESC-DCTESC+RS,W < (A)=REGISTRE 'S' AVANT : TBT SVCS < L'UTILISATEUR EST-IL ARRIVE ICI PAR < UN 'SVC' ??? JNC Z327X1 < NON, OK... SBT NBITMO+SVCS < OUI, ON MEMORISE CE FAIT ; LE BIT 'SVCS' < SERA RAZE PAR LE 'SCHEDULER' A PRIORI < S'IL TROUVE LE BIT 'MS' A 0 (MODE < ESCLAVE)... Z327X1: EQU $ < < CAS DES <MODIFY> ACCEPTES : < Z327: EQU $ < ON A ICI : < (L)=BASE VERS LA ZONE CONTENANT <OPERANDE>. < (Y)=<OPERANDE>, < (B)=<VALEUR>. ADR Y,L < (L)=@<OPERANDE>. STB O,L < <MODIFY> DE <OPERANDE> < AVEC <VALEUR>. < < EST-CE EN FAIT UN <MODIFY> < DE L'ESPACE MEMOIRE UTILISATEUR : < LR Y,A < (A)=<OPERANDE>. CPI -SLOESC+RM < EST-CE 'M' ???? JNE Z329 < NON, C'EST TOUT. < < <MODIFY> DE L'ESPACE MEMOIRE < UTILISATEUR : VALIDATION DE A-ROND : < LA IDDESC-DCTESC,W TBT IDESC1 < TEST DU BIT IDESC1, < POUR SAVOIR SI LE DEBUG EST < EN MODE TRANSLATABLE (K) OU < EN MODE ABSOLU (1). LA RAD-RM,L < (A)=@ RELATIVE A (SLO). JNC Z381X4 < CAS DU 'DEBUG' TRANSLATABLE... IF O>DADR-K,,XEIF%, IF ATTENTION : LE TEST QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF CPZ RSLOT-RM,L < CAS DU 'DEBUG' ABSOLU : UNE DADR-TRANS- < LATION DE '@' EST-ELLE DEMANDEE ??? JE Z381 < NON (DU MOINS, ELLE EST NULLE...), DONC < ON FAIT QUELQUES VALIDATIONS... < < CAS DU 'DEBUG' ABSOLU AVEC < DADR-TRANSLATION DE '@' : < PSR A,B,X,Y < SAUVEGARDES... LR B,X < (X)=VALEUR A DONNER AU MOT MEMOIRE QUE < L'ON MODIFIE, LR A,Y < (Y)=ADRESSE DE CE MOT MEMOIRE RELATIVE- < MENT A LA DADR-TRANSLATION 'RSLOT'. CALL #SISP CMS5 PSRSLO# LR Y,A < ON VA ECLATER L'ADRESSE DU MOT MEMOIRE, < EN UNE DADR-ADRESSE (A), ET UN RESIDU (B) LBI K < CLEAR... SCRS -DADR SCLD -DADR < (B)=RESIDU (DE O A 'FADR'-D), SLRS -DADR < (A)=DADR-ADRESSE DU MOT, LR B,Y < (Y)=ADRESSE DU MOT MEMOIRE A MODIFIER < RELATIVE A UNE DADR-ADRESSE (A), AD RSLOT-RM,L < (A)='SLO' D'ACCES AU MOT, LR A,B < (B)='SLOE' D'ENCADREMENT, WOE < ET POSITIONNEMENT DE (SLO,SLE)... LR X,A < (A)=VALEUR A DONNER AU MOT D'ADRESSE < RELATIVE : < (Y)=ADRESSE RELATIVE, STAR < ET ON MODIFIE LE MOT... CALL #SISP CMS5 PLRSLO# PLR A,B,X,Y < RESTAURATIONS... JMP Z329 < VERS LA SORTIE... AZ340: JMP Z340 < RELAI... < < CAS DU DEBUG TRANSLATABLE : < (ET EN 'Z381' DU DEBUG < ABSOLU AVEC (RSLOT)=0...) < Z381X4: EQU $ PSR B LA PSTESC-DCTESC+RSLO,W < (A)=(SLO). BSR APDADR < (A)=SLO*16(EN MOTS) LR A,B AD RAD-RM,L < (A)=ADR "ABSOLUTISEE" CPR B,A PLR B JL Z328 < ERREUR : @<(SLO). PSR B LR A,B LA PSTESC-DCTESC+RSLE,W < (A)=SLE BSR APDADR < (A)=SLE*16(EN MOTS) ADRI FADR-Z,A < (A)=FIN DE LA ZONE UTILISATEUR. XR A,B < (A)=ADR "ABSOLUTISEE" CPR B,A PLR B JG Z328 < ERREUR : @>(SLE). Z381: EQU $ LR A,L < (L)=@ ABSOLUE. IF MS-BITSIG,,XEIF%, IF ATTENTION : CE QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF PSR X,Y PSR B,L LB PSTESC-DCTESC+RSLO,W SLLD -DADR < (B)=(SLO) EN ADRESSE DE MOTS. < (ON NE VALIDE PAR 'APDADR' CAR CELA < A DEJA ETE FAIT CI-DESSUS) LA PSTESC-DCTESC+RS,W TBT SVCS < QUEL EST LE MODE D'APPEL ??? JC Z381X1 < PAR 'SVC'... LA PSTESC-DCTESC+RP,W < ESCLAVE ('QUIT') : ALORS : < (A)=ADRESSE RELATIVE DU 'QUIT'... JMP Z381X2 Z381X1: EQU $ LA PSTESC-DCTESC+RK,W ADR B,A < ABSOLUTISATION DU REGISTRE 'K', LR A,L < QUE L'ON MET DANS 'L', LR A,X < (X)=SAUVEGARDE DE L'ADRESSE ABSOLUE DU < MOT POINTE PAR 'K', LY PSTESC-DCTESC+RA,W ADR B,Y < (Y)=SAUVEGARDE DE L'ADRESSE ABSOLUE DU < MOT POINTE PAR 'A'. LA O,L < (A)=ADRESSE RELATIVE DU 'SVC'... Z381X2: EQU $ ADR B,A < (A)=ADRESSE ABSOLUE DU 'QUIT'/'SVC'... PLR B,L CPR A,L < L'ADRESSE QUE L'ON VEUT MODIFIER ('L') < NE SERAIT-ELLE PAS L'ADRESSE DU 'QUIT'/ < 'SVC' D'APPEL DU 'CCI' ??? JE Z328X1 < OUI, LE 'MODIFY' EST REFUSE !!! < EN EFFET, SINON, A CAUSE DES FONCTIONS < DE SUSPENSION DU 'CCI' CONTENUES DANS < LE 'DEBUG', LA RE-RENTREE DANS LE 'CCI' < SE FERAIT MAL !!! LA PSTESC-DCTESC+RS,W TBT SVCS < QUEL EST LE MODE D'APPEL ??? JNC Z381X3 < CAS DES 'QUIT'... CPR X,L < CAS DES 'SVC', NE MODIFIE-T'ON PAS LE < MOT POINTE PAR 'K' ??? JE Z328X1 < OUI, QUELLE HONTE... CPR Y,L < NE MODIFIE-T'ON PAS LE MOT POINTE PAR < LE REGISTRE 'A' ??? JE Z328X1 < OUI, QUELLE TRAITRISE... Z381X3: EQU $ PLR X,Y STB O,L < <MODIFY> DE L'ESPACE MEMOIRE < DE L'UTILISATEUR. JMP Z329 < RETOUR. Z328X1: EQU $ PLR X,Y < ON RETABLIT LA PILE, AZ328: JMP Z328 < ET ON SORT EN ERREUR !!! < (ET RELAI...) < < CAS D'UN <MODIFY> SUR DE L'INFORMATION < QUI N'ETAIT PAS RESIDENTE : < Z350: EQU $ LA PSTESC-DCTESC+RSLO,W BSR APDADR LR A,L < (L)=SLO*16 (EN MOTS) JMP Z327 < VERS LE <MODIFY>. PAGE < < < < D I S P L A Y > D E L A < V A L E U R D E < O P E R A N D E > : < < < FONCTION : < CETTE ROUTINE EST APPELEE LORSQUE < <OPERANDE> EST RESIDENTE. ELLE FAIT < UN <DISPLAY> DE LA VALEUR EN < HEXADECIMAL. < < < A T T E N T I O N : < LOSQUE CELA EST NECESSAIRE (Y<0), < L'ESPACE MEMOIRE DE L'UTILISATEUR < EST RESIDENT. < < < ARGUMENT : < (Y)=<OPERANDE>. < (W)=ADRESSE DCT(ESCLAVE). < < < RESULTAT : < VALESC=<VALEUR>, EN VUE D'UNE COMMANDE < D'ADRESSAGE INDIRECT (<EOT>), < QUI SUIVRAIT EVENTUELLEMENT. < < DISDBG: EQU $ PSR L < SAVE @DCT-SERVICE. LR W,L < (L)=@DCT-ESCLAVE A PRIORI. < < TEST DE RESIDENCE : < CPZR Y JGE Z330 < <OPERANDE> ETAIT RESIDENTE. < < CAS DU <DISPLAY> DE <OPERANDE> NON RESIDENTE : < LA PSTESC-DCTESC+RSLO,W BSR APDADR LR A,L < (L)=SLO*16 (EN MOTS) Z330: EQU $ ADR Y,L < (L)=@<VALEUR>. < < EST-CE EN FAIT UN <DISPLAY> DE L'ESPACE < MEMOIRE DE L'UTILISATEUR ???? < LR Y,A CPI -SLOESC+RST < EST-CE LE REGISTRE 'ST' ??? JE Z331X1 < OUI, ON LE TRAITE A PART A CAUSE DU < BIT 'BALT2' DESTINE A "G" SOUS 'DEBUG'... CPI -SLOESC+RM < EST-CE 'M' ??? JNE Z331 < NON, B EST CORRECT. < < CAS D'UN <DISPLAY> MEMOIRE : < LA IDDESC-DCTESC,W TBT IDESC1 < TEST DU MODE DU DEBUG : < ABSOLU (1) OU TRANSLATABLE (K). LA RAD-RM,L < (A)=@ RELATIVE A (SLO). JC Z380X1 < LE DEBUG EST EN MODE ABSOLU, < DONC PAS DE TRANSLATION DE @. PSR B LA PSTESC-DCTESC+RSLO,W < (A)=(SLO). BSR APDADR < (A)=SLO*16 (EN MOTS) LR A,B AD RAD-RM,L < (A)=ADR "ABSOLUTISEE" CPR B,A PLR B JL AZ328 < ERREUR : @<(SLO). PSR B LR A,B LA PSTESC-DCTESC+RSLE,W < (A)=(SLE). BSR APDADR < (A)=SLE*16 (EN MOTS) ADRI FADR-Z,A < (A)=FIN DE LA ZONE UTILISATEUR. XR A,B CPR B,A PLR B JG AZ328 < ERREUR : @>(SLE). Z380: EQU $ LR A,L < (L)=@ ABSOLUE DE <OPERANDE>. < < <DISPLAY> DE <VALEUR> : < Z331: EQU $ LB O,L < (B)=<VALEUR> A DISPLAYER. < < ON A ICI : < (A)=<OPERANDE> SI <OPERANDE>#M, < =ADRESSE ABSOLUE DE <OPERANDE>, SOIT A>>RK... < SI <OPERANDE>=M. < Z352: EQU $ STB VALESC-DCTESK,W < SAVE <VALEUR> DANS DEMESC, < EN VUE D'1NE EVENTUELLE < COMMANDE <EOT>. PLR L < RESTAURE (L)=@DCT-SERVICE. < < ENTRY DE 'DISPLA' : < DISPL1: EQU $ PSR X < SAVE INDEX COURANT DE LA GRAMMAIRE < DU CCI (DEBUG). LXI K < INDEX INITIAL DE LA <VALEUR> < CONVERTRIE EN ASCI. LAD VAR+ABUFGR < (A)=@RELAI VERS LE BUFFER DE SORTIE. BSR AHEXEX < CONVERSION BINAIRE-->ASCI. PLR X < RESTAURE (X)=INDEX GRAMMAIRE CCI. LBI NBITMO/NBITCX < LONGUEUR DU MESSAGE A EMETTRE < VERS PHOUT. LR W,A < (A)=@DCT-ESCLAVE. ADRI BUFESC-DCTESC,A < (A)=@MOT DE BUFESC. PSR Y < SAVE <OPERANDE>. BSR AMESSO < <DISPALY> DE <VALEUR>. PLR Y < RESTAURE <OPERANDE>. JMP AZ340 < RETOUR, C'EST FINI... < < CAS PARTICULIER DE 'ST' : < Z331X1: EQU $ LB O,L < RECUPERATION DE 'ST', RBT NBITMO+BALT2 < ET EFFACEMENT A PRIORI DE 'BALT2' < QUI NE DOIT PAS APPARAITRE AUX < YEUX DE L'UTILISATEUR... JMP Z352 < VERS LA VISUALISATION... < < CAS DU 'DEBUG' ABSOLU < AVEC UNE TRANSLATION 'RSLOT' : < Z380X1: EQU $ PSR A,Y < SAUVEGARDES... LR A,Y < (Y)=ADRESSE RELATIVE A 'RSLOT' DU MOT < A EDITER... CALL #SISP CMS5 PSRSLO# LR Y,A < ON VA ECLATER L'ADRESSE DU MOT A EDITER < EN UNE DADR-ADRESSE (A), ET UN RESIDU (B) LBI K < CLEAR... SCRS -DADR SCLD -DADR < (B)=RESIDU (ENTRE O ET 'FADR'-D), SLRS -DADR < (A)=DADR-ADRESSE DU MOT, LR B,Y < (Y)=ADRESSE DU MOT A EDITER RELATIVE- < MENT AU FUTUR (SLO,SLE), AD RSLOT-RM,L < (A)='SLO' D'ACCES AU MOT, LR A,B < (B)='SLE' D'ENCADREMENT, WOE < AFIN D'ENCADRER LE MOT A EDITER, LAR < (A)=CONTENU DU MOT D'ADRESSE RELATIVE (Y) LR A,Y < QUE L'ON SAUVEGARDE DANS 'Y'... CALL #SISP CMS5 PLRSLO# LR Y,B < (B)=VALEUR CHERCHEE... PLR A,Y < RESTAURATIONS, JMP Z352 < ET VERS LA VISUALISATION... PAGE < < < E D I T I O N D ' U N C O D E D ' E R R E U R < C O N T E N U D A N S ' B O X ' : < < < FONCTION : < CE MODULE A POUR ROLE D'EDITER < LA 'BOX' UTILISATEUR, SUPPOSEE < CONTENIR UN CODE D'ERREUR SUITE < A UN BRANCHEMENT IMPLICITE A 'N10'. < LE CODE D'ERREUR EST VALIDE < SEULEMENT ICI, POUR EVITER DES < SAUTS SUPERIEURS A 128 MOTS AU < NIVEAU DE L'INTERPRETEUR DU 'CCI' < EN 'CCIJMP'... < < < ARGUMENTS : < (W)=ADRESSE DE 'DCTESC', < (L)=ADRESSE DE 'DCTSER', < (BOX)=VALEUR A EDITER. < < DISPER: EQU $ < < VALIDATION (TARDIVE) DU CODE D'ERREUR : < LRM A WORD MCCIER)MMOT < (A)=MASQUE D'EXTRACTION DU CODE-ERREUR, AND BOXESC-DCTESC,W < (A)=CODE D'ERREUR, WORD CPIMIN < VALIDATION INFERIEURE ??? JLE DISPL2 < QUELLE HORREUR... WORD CPIMAX < VALIDATION SUPERIEURE ??? JL DISPL3 < OK, LA 'BOX' EST VALIDE POUR UN CODE < D'ERREUR TYPE 'N10'... DISPL2: EQU $ BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < RECHERCHER DANS LA GRAMMAIRE DU < 'CCI', IL Y A SUREMENT UN NOEUD < COMMENCANT PAR 'MCCIER' MAIS < QUI N'EST PAS UN CODE D'ERREUR !!! < SI TEL EST LE CAS, IL FAUT TROUVER < UNE VALEUR DE 'MCCIER' NON AMBIGUE... < DISPL3: EQU $ < < EDITION DU CODE D'ERREUR : < LB BOXESC-DCTESC,W < (B)=VALEUR A EDITER... JMP DISPL1 < VERS L'EDITION... PAGE < < < D I S P L A Y P A R T I E L D ' U N E C A R T E : < < < FONCTION : < CE MODULE DISPLAY PARTIELLEMENT < UNE CARTE ; IL EST APPELE DANS 2 < CAS DIFFERENTS : < < 1 - LORS D'UNE ERREUR DE SYNTAXE : < LE DERNIER CARACTERE EDITE EST ALORS < LE CARACTERE NON RECONNU (SAUF CAS < PARTICULIERS OU EN BOUT DE CARTE < ON TROUVE UN NOM 'SGN' : LOGIN, OU < ASSIGNATION FICHIER...) ; < < 2 - LORS DE LA "TRONCATION" D'UNE < CARTE : LA PARTIE EDITEE EST LA PARTIE < QUI A ETE PRISE EN COMPTE ET EXPLOITEE. < < < ARGUMENTS : < (B)=DECREMENT A APPORTER A LA LONGUEUR CALCULEE < DE LA CARTE A DISPLAYEE PARTIELLEMENT. < (L)=ADRESSE DE 'DCTSER', < (W)=ADRESSE DE 'DCTESC'. < < DISPCA: EQU $ < < ENVOI DU MESSAGE DE BASE < DU 'CCI' POUR UN CADRAGE < CORRECT DE LA CARTE PARTIELLE : < PSR B < ET SAUVEGARDE DU DECREMENT DE LONGUEUR... LBI LMES1 < (B)=LONGUEUR A PRIORI DU MESSAGE, BSR ACHKIN < MAIS EST-ON INTERACTIF ??? < RENVOIE : < (A)='NSPIN' DE L'UTILISATEUR... JNE DISPC3 < NON, DONC (B) EST BON... PSR X,L < OUI, IL S'AGIT D'UN UTILISATEUR INTER- < ACTIF, LE NOMBRE DE "?" QUE L'ON VA < EDITER EST FONCTION DU NIVEAU D'EMPILE- < MENT DE CET 'IDESC'... LR A,X < (X)='NPSIN' DE L'UTILISATEUR, BSR ACADCT < (L)=ADRESSE DE LA 'DCT' DE LA VISU... LA VAR+APILID LR A,L < (L)=ADRESSE DE LA PILE D'EMPILEMENT DES < UTILISATEURS PAR "!U" SUR CETTE VISU, LA O,L < (A)=POINTEUR DE LA PILE : ANDI XLCPIL < (A)=LONGUEUR COURANTE, XWOR%1: VAL XLCPIL=K IF XWOR%1-K,,XEIF%, SLRS XWOR%1 XEIF%: VAL ENDIF ADR A,B < ON AJOUTE AU MESSAGE DE BASE 'MESCCI' < UN NOMBRE DE "?" EGAL AU NIVEAU D'IMBRI- < CATION DES UTILISATEURS PAR "!U" SUR < CETTE VISU... PLR X,L DISPC3: EQU $ LRM A WORD MESCCJ < (A)=ADRESSE DU MESSAGE "<R/C><LF><?>". BSR AMESSO < EMISSION DU MESSAGE VERS L'ESCLAVE POUR < UN CADRAGE CORRECT DE LA CARTE PARTIELLE. PLR B < RESTAURE : < (B)=DECREMENT DE LA LONGUEUR DE LA < CARTE PARTIELLE. < < EDITION DE LA CARTE PARTIELLE : < LA VAR+XBUFGR < (A)=INDEX COURANT DE LA CARTE ANALYSEE ; < IL POINTE TOUJOURS SUR LE PROCHAIN < CARACTERE A ANALYSER... IF Z-I,,XEIF%, IF ATTENTION : IL Y A INCOHERENCE ENTRE LE 'IC' IF SUR 'XBUFGR' ET LE FAIT QUE LES INDEXES IF COMMENCENT A 0 !!! XEIF%: VAL ENDIF ADRI Z-I+I,A < POUR COMPENSER LE 'DC' SUR 'XBUFGR' QUI < EST FAIT LORS DES CARACTERES NON RECON- < NUS ; A NOTER QUE DANS LES AUTRES CAS < D'ERREUR, CELA MERDERA PEUT-ETRE... SBR B,A < CALCUL DE LA LONGUEUR REELLE DE LA < CARTE PARTIELLE ; CECI EST LIE EN FAIT < A LA "TRONCATION", OU L'ON IDENTIFIE UN < CARACTERE ININTERESSANT, 'XBUFGR' POIN- < TANT DERRIERE... JAG DISPC1 < OK... BSR ASYSER < E R R E U R S Y S T E M E ... < < QUE FAIRE ??? < COMPRENDRE COMMENT LA LONGUEUR < CALCULEE PEUT ETRE NEGATIVE OU < NULLE !!! < JMP DISPC2 < ET ON SORT... DISPC1: EQU $ LR A,B < (B)=LONGUEUR DU MESSAGE A EDITER, CPZ VAR+XBUFGR < ETAIT-ON EN DEBUT DE BUFFER ??? JE DISPC4 < OUI, RIEN A FAIRE... DC VAR+XBUFGR < NON, REVENONS D'UN CRAN EN ARRIERE, BSR ACARAC < ET TESTONS LE CARACTERE PRECEDENT ; A < NOTER QUE 'CARAC' REFAIT UN 'IC' SUR < 'XBUFGR'... JNE DISPC4 < ET BIEN LE CARACTERE PRECEDENT N'EST < PAS UN LIMITEUR, ALLONS EDITER LA CARTE < SUR UNE LONGUEUR (B)... ADRI -I,B < ET OUI, LE CARACTERE PRECEDENT EST UN < LIMITEUR : CELA PEUT SE PRODUIRE ALORS < QUE LA CARTE ETAIT BONNE SYNTAXIQUEMENT, < MAIS MAUVAISE SEMANTIQUEMENT (PAR < EXEMPLE UN "!QFFFF", ALORS QU'AU MOINS < UN GROUPE DE CYLINDRES EST DEJA ATTRI- < BUE A QUELQU'UN D'AUTRE...) ; DONC IL < FAUT ANNULER LE 'ADRI''Z-I+I,A', LUI- < MEME DESTINE A COMPENSER UN 'DC' SUR < 'XBUFGR' QUI DANS CE CAS PRECIS N'A PAS < EU LIEU (OUF...). DISPC4: EQU $ LAD BUFESC-DCTESC,W < (A)=ADRESSE-MOT DU MESSAGE A EDITER, BSR AMESSO < EDITION PARTIELLE DE LA CARTE ERRONNEE < OU TRONQUEE... < < SORTIE DU MODULE : < DISPC2: EQU $ RSR < ET C'EST TOUT... PAGE < < < A D R E S S A G E I N D I R E C T E T < I N C R E M E N T A T I O N / D E C R E M E N T A T I O N < D E L ' A D R E S S E C O U R A N T E @ : < < < FONCTION : < CETTE ROUTINE GERE LES INCREMENTATIONS < DECREMENTATIONS DE L'ADRESSE COURANTE @. < CES 2 OPERATIONS SONT FAITES SANS < VERIFICATION DE VALIDITE DE @ APRES < CALCUL. < DE PLUS, ELLE PERMET SI ON LE < DESIRE, DE METTRE DANS @, LA DERNIERE < VALEUR DISPLAYEE, OU ENTREE (DEMESC). < < < ARGUMENT : < VALESC(DCTESC)=<VALEUR> D'INCREMENTATION/DECRE- < -MENTATION/MODIFICATION, < (W)=ADRESSE DCT(ESCLAVE). < (Y)=K SI +, < =1 SI -, < =-1 SI ADRESSAGE INDIRECT SUR @, < < <******************************************************************************* YCCIAI:: VAL K-I < CODE DE L'ADRESSAGE INDIRECT, YCCIP:: VAL '0@@@@+I < CODE DU "+", YCCIM:: VAL '0@@@@+I < CODE DU "-". XCCIP1:: VAL I < POUR INCREMENTER DE 1... <******************************************************************************* PMDBG: EQU $ PSR L < SAVE @DCT-SERVICE. LA RSLO+XXPSTD,W < (A)=(SLO). BSR APDADR < (A)=SLO*16 (EN MOTS) LR A,L < (L)=(SLO). LA VALESC-DCTESK,W < (A)=<VALEUR>. CPZR Y < DISCRIMINATION +/-. JL Z1220 < CAS D'1NE DEMANDE D'ADRESSAGE < INDIRECT ; A CONTIENT LA < VALEUR A DONNER A @... JE Z341 < OK, C'EST UNE INCREMENTATION. NGR A,A < CAS D'UNE DECREMENTATION : < <VALEUR>=-<VALEUR>. Z341: EQU $ < < A T T E N T I O N : < L'ESPACE MEMOIRE ESCLAVE EST < RESIDENT LORSQU'ON EST ICI. < AD -SLOESC+RAD,L < ON AJOUTE @ A LA NOUVELLE < <VALEUR>. Z1220: EQU $ < ENTRY 'ADRESSAGE INDIRECT'. STA -SLOESC+RAD,L < MAJ DE @ DANS L'ESPACE MEMOIRE. PLR L < RESTAURE (L)=@DCT-SERVICE. RSR < < < + 1 A U T O M A T I Q U E S U R @ : < < < FONCTION : < CETTE ROUTINE EST CHARGEE DE PREPARER < L'INCREMENTATION AUTOMATIQUE (+1) DE @ ; < ELLE EST APPELEE LORS DES LIGNES VIDES < ENVOYEES AU DEBUG. < < < ARGUMENTS : < (B)=1, < (W)=ADRESSE DCT(ESCLAVE). < < < RESULTATS : < (Y)=K ('+'), < VALESC(DCTESC)=1. < < PLUS1: EQU $ LYI YCCIP < POUR DEMANDER '+'. STB VALESC-DCTESK,W < MISE DE +1 DANS DEMESC. RSR < < < A D R E S S A G E I N D I R E C T S U R @ : < < < FONCTION : < CETTE ROUTINE PERMET DE PREPARER < LES OPERATIONS D'ADRESSAGE INDIRECT < SUR A-ROND. < < < RESULTAT : < (Y)=-1. < < AINDIR: EQU $ LYI YCCIAI < Y<0. RSR < AIN'T IT HARD ??? PAGE < < < D E B U G A B S O L U / T R A N S L A T A B L E : < < < FONCTION : < NORMALEMENT, LE DEBUG EST UN DEBUG UTILISATEUR < C'EST-A-DIRE QUE LES ADRESSES SONT TRANSLATABLES < ET RELATIVES A SLO ; SOUS :SYS, ON PEUT < DEMANDER A TRAVAILLER EN ABSOLU, DE FACON A < POUVOIR PATCHER LE SYSTEME ON-LINE (!?!!!?!!?). < < < M O D E D E B U G A B S O L U : < < < NOTA : < LE BIT 'MEMXXX' DE 'MEMV' LORSQU'IL < EST A '0 INTERDIT, MEME DONC A ":SYS" < L'ACCES AU 'DEBUG ABSOLU' !!! < < < ARGUMENT : < (W)=ADRESSE DCT(ESCLAVE). < < < RESULTAT : < BIT1(S(PSTESC))=1. < < ABSAD: EQU $ LA MEMV TBT MEMXXX < LES CHOSES DANGEREUSES SONT-ELLES < AUTORISEES A ":SYS" ??? JC Z382X < ET OUI... ADRI XCCIER,X < ET NON, DONC UNE ERREUR 'CCI'... JMP Z382Y < ET C'EST TOUT... Z382X: EQU $ LA IDDESC-DCTESC,W SBT IDESC1 < MISE DU DEBUG EN MODE ABSOLU. Z382: EQU $ STA IDDESC-DCTESC,W Z382Y: EQU $ RSR < < < M O D E D E B U G T R A N S L A T A B L E : < < < ARGUMENT : < (W)=ADRESSE DCT(ESCLAVE). < < < RESULTAT : < BIT1(S(PSTESC))=K. < < TRAD: EQU $ LA IDDESC-DCTESC,W RBT IDESC1 < MISE DU DEBUG EN MODE TRANSLATABLE. < TRANSALTABLE. JMP Z382 < VERS LA MAJ DE S(PSTESC). < < < T E S T D U M O D E D U ' D E B U G ' : < < < ARGUMENT : < (W)=ADRESSE DE 'DCTESC'. < < < RESULTAT : < RETOUR OK SI 'DEBUG' TRANSLATABLE, < RETOUR EN ERREUR SI 'DEBUG' ABSOLU. < < TDEBAB: EQU $ LA IDDESC-DCTESC,W TBT IDESC1 < TEST DU MODE DU DEBUG : TRANSLATABLE (0), < OU ABSOLU (1) : ADCR X < ET L'INDEX DE LA GRAMMAIRE EST CALCULE < EN FONCTION DU MODE, D'OU UN RETOUR : < OK, SI TRANSLATABLE (0), ET < EN ERREUR, SI ABSOLU (1)... RSR < VERS LA GRAMMAIRE DU 'CCI'...