          IDENT  MLMSMI
          TITLE  MLM$MLMSMI - CYBIL INTERFACE TO MLI (MLI SUBSYS ONLY)
          LIST   F
          SYSCOM B1
          ENTRY  MLPSION
          ENTRY  MLPSIOF
          ENTRY  MLPKILL
          ENTRY  MLPKILA
          ENTRY  MLPFERL
          ENTRY  MLPREME
          ENTRY  MLPSEME
          ENTRY  MLPADSE
          ENTRY  MLPDESE
          ENTRY  MLPCOSE
          ENTRY  INITMLI
          EXT    PXSAVE,ZSMRRET,PARSV
LEAVE     EQU    ZSMRRET
          SKIP   RA.MTR
          ERR    SYSCOM NOT CALLED
          IF     -DEF,RA.ORG,1
OPL XTEXT COMCMAC
          LIST   X
*copy COMSMLI
*copy COMSCVS
*copy COMMMLI
*copy COMMCVS
*copyc dsa$cybil_if_macros
          TITLE  MLI= - INTERFACE TO NOS/VE
MLI=      SUBR               ENTRY/EXIT
          IF     -DEF,MLI=X,1
MLI=X     EQU    MLI=
          SA1    MLIPAR+MLPFN CHECK FOR VALID FUNCTION
          NG     X1,MLI4     IF ILLEGAL FUNCTION
          SX2    X1-MLFKA-1
          PL     X2,MLI4     IF ILLEGAL FUNCTION
          MX6    0
          SA6    MLIB        RESET RETRY COUNT

* IF THE FUNCTION IS SIGNON OR SIGNOFF THEN MOVE THE JSN INTO THE
* PARAMETER BLOCK. (SPECIAL FOR SUBSYSTEM ONLY)

          IFLT   MLFON+MLFOF,2,4
          AX1    1           GETS RID OF A 1
          NZ     X1,MLI0     IF NOT SIGNON AND NOT SIGNOFF
          EQ     MLI7        JSN PROCESSING
          SKIP   6           LEAVE CODE IN JUST IN CASE....
          R=     X2,MLFON
          BX3    X1-X2
          ZR     X3,MLI7     IF SIGNON
          R=     X2,MLFOF
          BX3    X1-X2
          ZR     X3,MLI7     IF SIGNOFF
MLI0      BSS    0
          SA1    MLIA
          ZR     X1,MLI1     IF NOT TO ISSUE DAYFILE TRACE MESSAGE
          RJ     ITB
          SPACE  1
* ENTRY:
*  X1 = NTH REQUEST CODE (CVSMLI).
*  X2 = ADDRESS OF MLI REQUEST BLOCK.
*  X3 = MLI SUB-FUNCTION CODE (MLFSIN, MLFSPL).
*
* EXIT:
*  X0 = 0 IF REQUEST ACCEPTED AND COMPLETED.
*       1 IF QUEUE FULL.
*       2 IF REQUEST ACCEPTED BUT NOT COMPLETE.
*  X1 = 0 IF NOS/VE NOT UP, OTHERWISE UNCHANGED.
*  X4 = NTH SAVE REGISTER.  MUST NOTE BE DESTROYED.
          SPACE  1
MLI1      SX4    0           CLEAR MLI INDEX
MLI11     SX2    MLIPAR
          CALLVS X2,X4,CVSMLIU,0
          ZR     X0,MLI12    IF REQUEST COMPLETE
          LX0    59-30
          NG     X0,MLI5     IF NOS/VE DOWN
          AX0    30
MLI13     RECALL
          ZR     X0,MLI1     IF QUEUE FULL
          EQ     MLI11       IF REQUEST NOT COMPLETE
MLI12     BSS    0
          SPACE  1
* END OF SPECIAL EIE CODE
          SPACE  1
          SA1    MLIPAR+MLPSV GET STATUS RETURNED
          SX2    X1-MLSBI    CHECK FOR BUSY INTERLOCK STATUS
          NZ     X2,MLI3     IF NOT BUSY INTERLOCK

* PROCESS BUSY STATUS.  RETRY SAME OPERATION A MAXIMUM OF MLEMXR TIMES.

          SA1    MLIRTC
          SX2    B1
          SX0    B0
          IX6    X1+X2       INCREASE MLIRTC BY ONE
          SA6    A1
          SA1    MLIB
          SX6    X1+B1
          SA6    A1          UPDATE RETRY COUNT
          SX2    X6-MLEMXR
          MI     X2,MLI13    GO PAUSE AND RETRY

* RETRY LIMIT EXCEEDED.

MLI2      SA1    MLIA
          ZR     X1,MLI=X    IF NOT TO ISSUE DAYFILE TRACE MESSAGE.
          MESSAGE (=C* MLI RETRY LIMIT EXCEEDED. *),MLETDF,R

* RETURN TO CALLER.

MLI3      SA1    MLIA
          ZR     X1,MLI=X    IF NOT TO ISSUE DAYFILE TRACE MESSAGE
          RJ     ITA
          EQ     MLI=X

* PROCESS ILLEGAL MLI FUNCTION.

MLI4      BSS    0
          SX6    MLSIF
          SA6    MLIPAR+MLPSV  RETURN ILLEGAL FUNCTION STATUS
          SA1    MLIA
          ZR     X1,MLI=X    IF NOT TO ISSUE DAYFILE TRACE MESSAGE
          MESSAGE (=C* MLI ILLEGAL FUNCTION.*),MLETDF,R
          EQ     MLI=X
          SPACE  1
* EI RETURNED WITH X1=0 WHICH MEANS THAT NOS/VE IS NOT RUNNING.
          SPACE  1
MLI5      BSS    0
          SX6    MLSND
          SA6    MLIPAR+MLPSV  RETURN NOS/VE DOWN STATUS
          SA1    MLIA
          ZR     X1,MLI=X    IF NOT TO ISSUE DAYFILE TRACE MESSAGE
          MESSAGE (=C* NOS/VE DOWN.*),3,R
          EQ     MLI=X

* ADD JSN TO PARAMETER BLOCK FOR SIGNON/SIGNOFF ONLY.

MLI7      BSS    0
          SA1    =XMLV$JSN
          BX6    X1
          SA6    MLIPAR+MLPJS
          EQ     MLI0

MLIA      VFD    60/MLEITM   DAYFILE TRACE MESSAGE FLAG
MLIB      BSS    1           RETRY COUNT
MLIPAR    BSS    MLEPBS      MLI PARAMETER BLOCK
MLIRTC    DATA   0           BUSY RETRY COUNT CUMULATIVE TOTAL
ITB    SPACE  4
***       ITB - ISSUE DAYFILE TRACE MESSAGE BEFORE MLI REQUEST.
*
*         ENTRY  VALID FUNCTION SET IN THE MLIPAR BLOCK.
*
*         EXIT   DAYFILE MESSAGE OF THE FORMAT-
*                   MLI REQ XXXXX NNNNNN
*                ISSUED.  XXXXX IS A FUNCTION NAME - SIGNON, SIGNOFF,
*                ADDSPL, DELSPL, SEND, RECEIVE, FETCHRL, CONFIRM.
*                NNNNNN IS THE APPLICATION NAME MAKING THE REQUEST
*                DISPLAYED AS 20 OCTAL DIGITS.IF STO OPTION 2 IS ACTIVE,
*                THE MLI PARAMETER BLOCK IS WRITTEN TO FILE MLIDUMP.
*
*         USES   X - 0, 1, 2, 6.
*                B - NONE.
*                A - 1, 2, 6.
*
*         MACROS MESSAGE, SUBR, WRITEW.
*
*         CALLS  CTO.
          SPACE  2
ITB       SUBR               ENTRY/EXIT
          SA1    MLIPAR+MLPFN GET FUNCTION NUMBER
          SA2    X1+ITBA     GET FUNCTION NAME
          BX6    X2
          SA1    MLIPAR+MLPAN GET APPLICATION NAME
          LX1    30
          SA6    ITBC
          RJ     CTO         CONVERT LEFT HALF
          SA6    ITBC+1
          RJ     CTO         CONVERT RIGHT HALF
          SA6    ITBC+2
          MESSAGE ITBB,MLETDF,R
DUMP      IF     DEF,DUMPMLI

* OUTPUT PARAMETER BLOCK IF REQUESTED.

          SA1    MLIA        GET TRACE OPTION
          SX0    2
          BX2    X0-X1
          NZ     X2,ITBX     IF NOT TO DUMP MLIPAR BLOCK
DUMP      ENDIF
          EQ     ITBX        RETURN

ITBA      BSS    0           FUNCTION NAME TABLE
          DATA   10HSIGNON
          DATA   10HSIGNOFF
          DATA   10HADDSPL
          DATA   10HDELSPL
          DATA   10HSEND
          DATA   10HRECEIVE
          DATA   10HFETCHRL
          DATA   10HCONFIRM
          DATA   10HKILL
          DATA   10HKILL ALL
ITBB      DATA   10H MLI REQ
ITBC      BSS    3
          DATA   0
DUMP      IF     DEF,DUMPMLI
DUMP      ENDIF
ITA    SPACE  4
***       ITA - ISSUE DAYFILE TRACE MESSAGE AFTER MLI REQUEST.
*
*         ENTRY  STATUS SET IN MLIPAR BLOCK.
*
*         EXIT   DAYFILE MESSAGE OF THE FORMAT-
*                   MLI STS DDDDDD
*                ISSUED.  DDDDDD IS A 20 DIGIT OCTAL NUMBER REPRESENTING
*                THE STATUS RETURNED BY MLI.
*
*         USES   X - 1, 6.
*                B - NONE.
*                A - 1, 6.
*
*         MACROS MESSAGE, SUBR.
*
*         CALLS  CTO.
          SPACE  2
ITA       SUBR               ENTRY/EXIT
          SA1    MLIPAR+MLPSV GET STATUS
          SA1    X1
          LX1    30          GET UPPER 30 BITS FOR CONVERSION
          RJ     CTO
          SA6    ITAB
          RJ     CTO
          SA6    ITAB+1
          MESSAGE ITAA,MLETDF,R
          EQ     ITAX        RETURN

ITAA      DATA   10H MLI STS
ITAB      BSS    2
          DATA   0
STO    SPACE  4
***       STO - SET TRACE OPTION.
*
*         ENTRY  (X6) = OPTION VALUE.  ZERO MEANS DO NOT ISSUE ANY TRACE
*                       MESSAGES. ONE MEANS ISSUE TRACE MESSAGES TO THE
*                       DAYFILE SPECIFIED BY THE SYMBOL MLETDF.
*                       TWO MEANS ISSUE TRACE MESSAGES (SAME AS ONE)
*                       AND WRITE THE MLIPAR BLOCK TO LOCAL FILE
*                       MLIDUMP. IF THE OLD VALUE IS TWO AND IT IS BEING
*                       CHANGED, A WRITER IS ISSUED TO THE MLIDUMP FILE.
*                       THE DUMP CAPABILITY IS ONLY ASSEMBLED INTO MLI=
*                       IF THE SYMBOL DUMPMLI IS DEFINED.
*
*         USES   X - 0, 1.
*                B - NONE.
*                A - 1, 6.
*
*         MACROS SUBR, MESSAGE, WRITER.
          SPACE  2
STO       SUBR               ENTRY/EXIT
          SA1    MLIA        GET CURRENT VALUE
          R=     X0,2
          BX0    X0-X1
          SA6    A1          STORE NEW OPTION VALUE
DUMP      IF     DEF,DUMPMLI
          NZ     X0,STO1     IF OLD VALUE WAS NOT TWO
          SX0    2
          BX0    X0-X6
          ZR     X0,STO1     IF NEW VALUE IS TWO

* FLUSH MLIDUMP BUFFER

          SA1    MLIA        RESTORE OPTION VALUE
          BX6    X1
STO1      BSS    0
DUMP      ENDIF
          ZR     X6,STOX     IF TURNING OFF (NO MESSAGE)
          MESSAGE (=C* MLI TRACE ON. *),MLETDF,R
          EQ     STOX

          SKIP   2
STO2      MESSAGE (=C* MLI TRACE OFF. *),MLETDF,R
          EQ     STOX
CTO       SPACE  4
***       CTO - CONVERT THE RIGHTMOST 30 BITS FROM X1 TO 10 DISPLAY CODE
*               OCTAL DIGITS IN X6.
*
*         ENTRY  (X1) = VALUE TO CONVERT.
*
*         EXIT   (X6) = 10 DISPLAY CODE DIGITS.  NO ZERO SUPPRESSION.
*
*         USES   X - 1, 2, 3, 6, 7.
*                B - 2.
*                A - NONE.
*
*         MACROS SUBR.
          SPACE  2
CTO       SUBR               ENTRY/EXIT
          MX6    0           INITIALIZE ASSEMBLY
          MX2    -3          DIGIT MASK
          SB2    10          DIGIT COUNTER
CTO1      BX7    -X2*X1      GET DIGIT
          SB2    B2-1        DECREMENT DIGIT COUNT
          SX3    X7+1R0      CONVERT DIGIT TO CHARACTER
          LX6    54          POSITION ASSEMBLY
          AX1    3           SHIFT OFF DIGIT
          BX6    X6+X3       ADD CHARACTER TO ASSEMBLY
          NZ     B2,CTO1     IF MORE DIGITS
          LX6    54
          EQ     CTOX        RETURN
          TITLE  THE MAIN STUFF
*
* D. A. HENSELER  10/25/79.
*
*
* PROCEDURE [XREF] MLPKILL (JSN: INTEGER; VAR STATUS: OST$STATUS);
* MLPKILL - ISSUE MLI FUNCTION 8 - KILL 170 JOB - TO MLI.
*
MLPKILL   BSS    0
          RJ     PXSAVE
          BX6    X1
          BX7    X2
          SA6    MLIPAR+MLPJS JSN
          SA7    MLIPAR+MLPST STATUS
          SX6    MLFKI
          SA6    MLIPAR+MLPFN FUNCTION
          RJ     MLI=
          TRANSFR MLPSV,MLPST
          EQ     LEAVE
*
INITMLI   BSS    0
          RJ     PXSAVE
          BX6    X1
          RJ     STO
          EQ     LEAVE
*
MLPSION   BSS    0
          RJ     PXSAVE
          SIGNON PARSV,PARSV+1,X3,X4
          EQ     LEAVE
*
MLPSIOF   BSS    0
          RJ     PXSAVE
          SIGNOFF PARSV,X2
          EQ     LEAVE
*
MLPADSE   BSS    0
          RJ     PXSAVE
          ADDSPL PARSV,PARSV+1,X3
          EQ     LEAVE
*
MLPDESE   BSS    0
          RJ     PXSAVE
          DELSPL PARSV,PARSV+1,X3
          EQ     LEAVE
*
MLPSEME   BSS    0
          RJ     PXSAVE
          BX3    X1          BECAUSE X1 GETS WRECKED BY MACRO
          SEND   B5,B5+1,X3,X2,PARSV+2,PARSV+3,X5
          EQ     LEAVE
*
MLPREME   BSS    0
          RJ     PXSAVE
          SA3    B5+B1
          SA2    A3+B1       SIGNAL
          SB6    X2
          SA2    A2+B1
          SB4    X2
          BX2    X1          BECAUSE X1 GETS WRECKED BY MACRO
          RECEIVE B5,X3,B6,B4,X2,PARSV+1,PARSV+2,X4,X5
          EQ     LEAVE
*
MLPFERL   BSS    0
          RJ     PXSAVE
          FETCHRL PARSV,PARSV+1,X3,X4,X5
          EQ     LEAVE
*
MLPCOSE   BSS    0
          RJ     PXSAVE
          CONFIRM PARSV,PARSV+1,X3
          EQ     LEAVE
*
MLPKILA   BSS    0
*  RJ TO THIS ROUTINE, NOT EQ (I.E. CYBIL)
          DATA   0
          SX6    MLFKA
          SA6    MLIPAR+MLPFN
          RJ     MLI=
          EQ     MLPKILA
          END
