*COMDECK PIMLIA 
_$J+  PAGE EJECT? 
_$R-,G-,I-  LEVEL 1 SUBROUTINE ?
_*****************************                                              008 
*                            *                                              009 
*           PIMLIA           *
$                            *
*    MLIA INITIALIZATION     *                                              010 
*                            *                                              011 
******************************                                              012 
                                                                            013 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                      *
**OVERVIEW                                                             *
*    THIS PROCEDURE INITIALIZES THE MLIA AND THE CLAS AND CHECKS
* FOR DUPLICATE CLA ADDRESSES AND CLA ADDRESSES OUT OF RANGE.  IF      *
* EITHER CONDITION OCCURS, A WORK EVENT ENTRY IS MADE TO THE           *
* INITIALIZATION ERROR PROCESSOR IN THE SERVICE MODULE.                *
*                                                                      *
**INPUT: NONE                                                          *
*                                                                      *
**OUTPUT                                                               *
*    THE OUTPUT OF THIS ROUTINE CONSISTS OF COMMANDS ISSUED TO THE MLIA*
* AND TO THE CLAS, AS WELL AS WORK EVENT AND WORKLIST ENTRIES TO       *
* THE SERVICE MODULE.                                                  *
*                                                                      *
**EXTERNAL SUBROUTINES USED:                                           *
*    PBLSPUT - PUT AN ENTRY IN A WORKLIST                              *
*                                                                      *
**NOTES                                                                *
*    PIMLIA USES AN INTERNAL LEVEL 2 SUBROUTINE (WNWAIT) WHICH IS A    *
* VARIABLE LENGTH TIME DELAY LOOP,THE DESIRED DELAY IS PASSED TO IT AS *
* A PARAMETER. CORE SPACE USED BY PIMLIA IS OVERWRITEN AFTER INITIALIZ.*
*                                                                      *
************************************************************************
                                                                       ?
PROCEDURE PIMLIA; 
VAR 
  W1TMP,W1COUNT:INTEGER;                    _TEMPORARY AND DELAY COUNT ?
  W2FOAR:INTEGER;                           _FIRST ODD ALREADY RECEIVED?
  T1JFT:INTEGER;                            _SAVE COUPLIER EQU. ADDRESS?
  W1ERR : INTEGER;                          _ INITIALIZATION ERROR CODE?
  W1INIT : INTEGER;                         _ COUNT OF INIT. ERRORS    ?
  LPTR   : B0BUFPTR;
  DUPCLA : 'INTEGER;                        _ ADDRESS OF DUP CLA       ?
VALUE 
  DUPCLA = $2B;                             _ ADDRESS IN LOW CORE      ?
_*                                                                     ?
PROCEDURE PIWAIT(W1TIME:INTEGER);           _TIME DELAY LOOP           ?
BEGIN 
  W1COUNT:=1; 
  REPEAT
    W1COUNT:=W1COUNT+W1COUNT; 
    W1TIME :=W1TIME - 1;
  UNTIL W1TIME @ 0; 
  REPEAT
    W1COUNT:=W1COUNT - 5; 
  UNTIL W1COUNT @ 0;
END;
_**********************************************************************?
BEGIN 
  INST($E000,$0519,$0B04);                  _RESET MLIA                ?
  PIWAIT ($A);                              _WAIT 1 MILLISECOND        ?
  T1JFT := B1ODDT * $1000 + B1CIBSIZ - 1; 
  INST($E000,$0529,$0B04,                   _SET MLIA TO IDLE          ?
       $E000,$050A,$C400,BQCIBPTR,$0B04,    _SET CIB ADDRESS           ?
       $E000,$51A,                          _SET ODD THRESHOLD         ?
       $C400,T1JFT,$B04,                    _AND CIB LENGTH            ?
       $E000,$0578,$C000,$8F02,$0B04,       _SET NULLS=F AND EMPTIES=2 ?
       $E000,$0539,$0B04);                  _START MLIA                ?
  PIWAIT ($A);                              _WAIT 100 MICROSECONDS     ?
  FOR W1TMP:=1 TO 254 DO
  INST($C400,W1TMP,$8000,$0F00,             _SET ISON BIT IN ALL 254   ?
       $E000,$0508,$0B04,                   _POSSIBLE CLAS             ?
       $C000,$0D00,$0B04, 
       $C000,$CD20,$0B04);
  FOR W1TMP:=1 TO 254 DO
  INST($C400,W1TMP,$8000,$0F00,             _CLEAR ALL 254             ?
       $E000,$0508,$0B04,                   _POSSIBLE CLAS             ?
       $C000,$0D00,$0B04, 
       $C000,$CD00,$0B04);
  FOR W1TMP:=1 TO 512 DO                    _READ ODD THRESHOLD        ?
  INST($E000,$0500,$0B04);                  _512  TIMES                ?
  FOR W1TMP:=1 TO 254 DO
  BEGIN 
    W2FOAR:=$0000;                          _CLEAR FIRST ODD FLAG      ?
    INST($C400,W1TMP,$8000,$0F00,           _SEND CLA ADDRESS          ?
         $E000,$0508,$0B04, 
         $C000,$0D81,$0B04,                 _SEND RTS AND OON          ?
         $C000,$0D30,$0B04,                 _SEND ISON AND LIT (SYNC)  ?
         $C000,$CD01,$0B04);                _SEND LIT (ASYNC)          ?
    PIWAIT ($A);                            _WAIT 1 MSEC               ?
     NPINTAB.NPSODD:=0;                     _CLEAR ODD ADDRESS VALUE   ?
    WHILE NPINTAB.NPSODD"$FF DO 
      BEGIN 
        INST($E000,$0500,$0B04,             _READ ODD ADDRESS          ?
             $6400,W1COUNT);
        NPINTAB.NPSODD:=W1COUNT;            _SAVE AT NPSODD            ?
        IF NPINTAB.NPSODD"$FF THEN          _IF ODD ADDRESS "$FF THEN  ?
            IF W2FOAR=1 THEN                _IF 2ND ODD FROM THIS CLA  ?
            BEGIN 
              NHNPUGO := TRUE;              _ SET GO REQUIRED FLAG     ?
              W1ERR := D5DUPCLA;            _ REASON IS DUPLICATE CLA  ?
              DUPCLA' := NPINTAB.NPSODD     _ STORE DUP CLA ADDRESS    ?
            END 
            ELSE                            _OTHERWISE SET 1ST ODD FLAG?
              IF NPINTAB.NPSODD > C4LCBS    _ IF ODD FROM UNCONFIG PORT?
              THEN
                W1ERR  := D5CLAOR           _  SET CLA OUT OF RANGE    ?
              ELSE
                W2FOAR := 1;                _ ELSE SET 1ST ODD FLAG    ?
  
        IF W1ERR " 0                        _ IF LINE ERROR            ?
        THEN
          BEGIN 
          IF W1INIT @ 5                     _ IF LESS THAN ALLOWABLE   ?
          THEN                              _ NUMBER OF ERROR(S)       ?
            BEGIN 
            WITH BWWLENTRY[OPS].CMSMLEY DO  _ OPS LEV INTERMEDIAT ARRAY?
              BEGIN 
              CMDATA   := W1ERR;            _ ENTER REASON             ?
              W1INIT := W1INIT + 1;         _ COUNT OF ERRORS          ?
              CMPRM2 := NPINTAB.NPSODD; 
              PBLSPUT(BWWLENTRY[OPS],       _ MAKE LOCAL WORK EVENT    ?
                      DYLISTCB[D6INITERR]); _  ENTRY TO SVM PROCESS.   ?
              IF W1ERR = D5DUPCLA           _IF DUPLICATE CLA          ?
              THEN
_ 
****  DUPLICATE CLA FOUND - DISABLE LINE AND GENERATE STATUS MSG
? 
                BEGIN 
                ADDR (CGLCBP'[CMPRM2],LPTR);
                LPTR'.BZZLCB.BZCNFST := C7DISABLED; 
                W1ERR := D9LI;              _ASSUME LINE ERROR         ?
*IF DEF,HLIP
                IF LPTR'.BZZLCB.BZTIPTYPE = N0HDLC
                THEN
                  BEGIN 
                  LPTR := LPTR'.BZZLCB.BZTCBPTR;
                  LPTR'.TRKCB.TRCNFST := C7DISABLED;
                  W1ERR := D9TR;
                  END;
*ENDIF
                PNUSSM (C7DISABLED,6,W1ERR,LPTR); 
                END; _ W1ERR = D5DUPCLA ? 
              END; _ WITH BWWLENTRY ? 
            W1ERR := 0;                     _ CLEAR LINE ERROR         ?
            END; _W1INIT @ 5 ?
          END; _ IF W1ERR " 0 ? 
                                            _GO TO NEXT ADDRESS        ?
      END;                                  _AND TEST FOR 2ND ODD      ?
  END;                                      _GO TO NEXT ADDRESS        ?
  IF W1INIT " 0 THEN                        _ IF ERROR(S)              ?
  BEGIN 
    WITH BWWLENTRY[OPS].CMSMLEY DO          _ OPS LEVEL ARRAY          ?
    BEGIN 
      CMWKCODE := D0IACTIVATE;              _ ACTIVATE PNINITERR       ?
      PBLSPUT (BWWLENTRY[OPS],              _ MAKE WLE TO SVM          ?
               BYWLCB[B0SMWL]); 
    END; _ WITH ? 
  END; _ IF W1INIT " 0 ?
  FOR W1TMP:=1 TO 254 DO
  INST($C400,W1TMP,$8000,$0F00,             _CLEAR ALL 254             ?
       $E000,$0508,$0B04,                   _POSSIBLE CLAS             ?
       $C000,$0D00,$0B04, 
       $C000,$CD00,$0B04);
  INST($E000,$0560, $0B04,                  _READ LFP                  ?
       $E000,$0578,$C000,$8F02,$0B04,       _RESET LFP                 ?
       $E000,$0576,$0B04,                   _READ MLIA STATUS          ?
       $E000,$0576,$0B04,                   _READ MLIA STATUS AGAIN    ?
       $6400,W1TMP);                        _SAVE STATUS AT NPBMLS     ?
  NPINTAB.NPBMLS:=W1TMP;
   IF NPINTAB.NPBMLS"9 THEN                 _IF MLIA STATUS NOT =9,    ?
      PBHALT(J0BDMLS);                      _THEN SET SYSTEM HALT      ?
  INST($E000,$8000,$C000,$8400,$0B06,       _DMI ODD                   ?
       $E000,$8002,$C000,$8462,$0B06);      _DMI IDP                   ?
END;
