*COMDECK PMWOLP 
_$J+? 
_$R-,G-,I- ?
_ 
************************************************************************
************************************************************************
**                                                                    **
**             * *   P M W O L P   * *                                **
**                                                                    **
**                WORKLIST PROCESSOR                                          **
**                                                                    **
************************************************************************
************************************************************************
*                                                                      *
** OVERVIEW -  THE WORKLIST PROCESSOR PROVIDES THE INTERFACE BETWEEN   *
*              THE FIRMWARE AND THE TIPS/LIPS FOR ALL ABNORMAL COND-   *
*              ITIONS ON A LINE.  A FEW NORMAL CASES ARE PROCESSED,    *
*              OUTPUT BUFFER TRANSMITTED, FRAIMING ERROR STATUS, AND   *
*              LINE BREAK.  LINE ERRORS ARE PROCESSED AS HARD ERRORS   *
*              TO THE TIPS/LIPS AFTER THE LINE HAS BEEN CLEARED AND    *
*              THE INPUT AND OUTPUT TERMINATED.                        *
*              PMWOLP RUNS ON THE PRIORITY 3 INTERRUPT LEVEL WHENEVER  *
*              A WORKLIST ENTRY IS MADE BY THE FIRMWARE TO THE EVENT   *
*              WORKLIST QUEUE (MMEWLQ).                                *
*                                                                      *
** INPUTS -    EVENT WORKLIST QUEUE (MMEWLQ)                           *
*                                                                      *
** OUTPUTS -   COMMANDS TO THE CLA VIA PMCDRV                          *
*              CE ERROR FILE ENTERIES                                  *
*              CONTROL PASSED TO TIP APPENDAGES                        *
*              HARD ERROR WORKLIST TO OPS LEVEL TIP/LIP                *
*                                                                      *
** EXTERNAL SUBROUTINES USED -                                         *
*                                                                      *
*              PBLSGET  - GET A WORKLIST ENTRY                         *
*              PTCLAS   - ANALYZE CLA STATUS                           *
*              PMCOIN   - ISSUE COMMANDS TO THE CLA                    *
*              PBRELCHN - RELEASE A CHAIN OF BUFFERS                   *
*              PBLSPUT  - MAKE A WORKLIST ENTRY TO THE OPS LEVEL       *
*              PMCDRV   - COMMAND DRIVER                               *
*              PNCEFILE - CE ERROR FILE ENTRY                          *
*              PBXFER   - CALL A PAGED PROGRAM                         *
*                                                                      *
************************************************************************
* 
? 
_$J+? 
PROCEDURE PMWOLP; 
CONST 
      CINOP    = 4;                         _ INOP CODE = RE-ENABLE    ?
      CTOINVAL = 2;                         _ TIMEOUT INTERVAL 100 MS  ?
VAR 
      CDBGI    : INTEGER;                   _INDEX TO NEXT WORKLIST    ?
      CDBGA    : ARRAY [0..24] OF BWTIPWLE; _SAVED WORKLIST ENTRY ARRAY?
      M5PASS   : BOOLEAN;                   _ PASS ENTRY TO TIP/LIP    ?
      N1TEM1   : B0OVERLAY;                 _ TEMPORARY SAVE AREA      ?
      CTIMBUF  : B0BUFPTR;                  _ OBT TIMEOUT BUFFER PTR   ?
  
BEGIN 
  INST ($E400,N3P3INTAD,                    _ LDQ   P3 RESET           ?
        $0BA2);                             _ EMSQ  ESCAPE             ?
  
  WHILE NOT PBLSGET (BWWLENTRY[MUX2],BYWLCB _ GET ENTRY FROM EVENT W/L ?
                     [MMEWLQ]) DO           _ AND LOOP UNTIL EMPTY     ?
  WITH BWWLENTRY[MUX2].B0EWLQ,              _ WORKLIST ENTRY           ?
       CNCEOVLY[MUX2],                      _ CE ERROR FILE            ?
       NAPORT'[MMPORT],                     _ PORT TABLE               ?
       CGLCBP'[MMPORT] DO                   _ SYSTEM LCB               ?
  
  BEGIN 
    CDBGA[CDBGI] := BWWLENTRY[MUX2].B0TIPWLE;_SAVE WORKLIST ENTRY      ?
    CDBGI        := (CDBGI + 1) MOD 25;     _UPDATE INDEX INTO ARRAY   ?
    M5PASS := TRUE;                         _ PRIME PASS FLAG          ?
    CASE MMWKCODE OF                        _ PROCESS WORKCODE         ?
_ 
************************************************************************
 C L A   S T A T U S    R E C E I V E D 
***********************************************************************?
    MMCLAS :  
    BEGIN 
      IF NOT BZDIAG                         _ CHECK FOR DIAG. MODE     ?
      THEN M5PASS := PTCLAS (MMLINO);       _ NO - ANALIZE STATUS      ?
    END;  _ MMCLAS  ? 
_ 
************************************************************************
 O U T P U T   B U F F E R   T R A N S M I T T E D
***********************************************************************?
    MMOBUX :  
    WITH NBLTYT[NALTYP,1] DO                _ LINE TYPE TABLE          ?
    BEGIN 
      NAOON := FALSE;                       _ TURN OFF OUTPUT ON       ?
      IF NBDELAY & NBTURN                   _ IS LINE DELAY REQUIRED   ?
      THEN                                  _ YES                      ?
        IF MMDECMPLT                        _ IS DELAY COMPLETE        ?
        THEN
        BEGIN                               _ YES                      ?
          NGA.NGPORT := MMPORT;             _ PORT NUMBER              ?
          NGA.NGCMD  := NKTURN;             _ TURN AROUND COMMAND      ?
          PMCOIN;                           _ ISSUE COMMAND            ?
          IF NOT BZDIAG                     _IF NOT DIAGNOSTICS        ?
          THEN
          NAMSI      := MSTIDL;             _ MODEM STATE TO IDLE      ?
        END 
_ 
*              ---- SET UP DELAY OF 100 TO 200 MS ----
? 
        ELSE
        BEGIN 
          CTIMBUF := PBGET1BF (B0S8);       _ GET A BUFFER FOR TIMING  ?
          WITH CTIMBUF' DO                  _ TIMEOUT BUFFER           ?
          BEGIN 
            BFTREL         := TRUE;         _ RELEASE TIMER BUFF FLAG  ?
            BFTWKCOD       := MMOBUX + $80; _ WORKCODE + DELAY CMPL FLG?
            BFTLINO.BDLINO := MMLINO;       _ LINE NUMBER              ?
            BFTWLIND       := MMEWLQ;       _ EVENT WORKLIST QUEUE     ?
            BFTOVAL        := CTOINVAL;     _ TIMEOUT INTERVAL - 1/200 ?
            PBTOQUE        (CTIMBUF);       _ QUEUE TIMEOUT ENTRY      ?
            M5PASS         := FALSE;        _ DO NOT SEND TO TIP       ?
          END;
        END;  _ DELAY SETUP COMPLETE ?
  
    END;  _ MMOBUX ?
_ 
************************************************************************
 M U X   B U F F E R   T H R E S H O L D   R E A C H E D
***********************************************************************?
  
    MMBUTCH : 
    BEGIN 
      PBRELZRO (MMIBP,BEDBSIZE);            _ RELEASE BUFFERS, IF ANY  ?
      PBCHKREG;                             _CHECK NPU REGULATION LEVEL?
      M5PASS := FALSE;                      _ DO NOT GIVE TO TIP       ?
    END;
  
_ 
************************************************************************
 U N S O L I C I T E D   I N P U T
***********************************************************************?
    MMUNSIN : 
    BEGIN 
      NRCODE := MMWKCOD;                    _ SET UP CE ERROR CODE     ?
      IF NOT BZDIAG                         _ IF NOT DIAGNOSTICS       ?
      THEN
        MMWKCODE := MMHARDERR;              _ PROCESS AS HARD ERROR    ?
    END;  _ MMUNSIN ? 
_ 
************************************************************************
 C L A   O U T   O F   R A N G E
***********************************************************************?
    MMCAOR :  
    BEGIN 
      NRCODE        := MMWKCOD;             _ CE ERROR CODE            ?
      N1TEM1.BARBYT := MMPORT;              _ CLA ADDRESS              ?
      INST ($C400,N1TEM1,                   _ LDA   CLA ADDRESS        ?
            $8000,$0F00,                    _ EOR   CLA ADDR CMD       ?
            $E000,$0508,                    _ LDQ   MLIA ADDRESS       ?
            $0B04,                          _ SIO   OUTPUT CLA ADDRESS ?
            $C000,$0D00,                    _ LDA   CLA STATUS WORD 1  ?
            $0B04,                          _ SIO   OUTPUT STATUS      ?
            $C000,$CD00,                    _ LDA   CLA STATUS WORD 2  ?
            $0B04);                         _ SIO   LAST FRAME         ?
      M5PASS := FALSE;                      _ DO NOT PASS TO USER      ?
    END;  _ MMCAOR ?
_ 
************************************************************************
 I L L E G A L   F R A M E   F O R M A T
***********************************************************************?
    MMIFFO :  
    BEGIN 
      NRCODE := MMWKCOD;                    _ CE ERROR CODE            ?
      M5PASS := FALSE;                      _ DO NOT PASS TO USER      ?
    END;  _ MMIFFO ?
_ 
************************************************************************
 I N P U T   T E R M I N A T E D
***********************************************************************?
  
    NMINEND : 
    BEGIN 
      NAHARDER := FALSE;                    _ TURN OFF ERROR INDICATOR ?
      MMWKCOD  := A0HARDERR;                _ WORKCODE FOR OPS TIP     ?
      IF (BZCNFST > C7DISABLED) ! BZDIAG    _ PAS IF LINE IS ACTIVE    ?
      THEN
      PBLSPUT  (BWWLENTRY[MUX2],BYWLCB      _ SEND TO OPS TIP          ?
               [BJTIPTYPT[BZTIPTYP].BJLISTIX]); 
      GOTO 10;                              _ EXIT FOR THIS ENTRY      ?
    END;
  
    END;  _ CASE OF MMWKCODE  ? 
  
  
  
_********************************************************************** 
 M A I N   S E G M E N T   C O N T I N U E D
***********************************************************************?
_ 
*              ---- PROCESS CE ERROR FILE ENTRY IF NEEDED ----
? 
    IF NRCODE " 0                           _ CE ERROR FOUND           ?
    THEN
    BEGIN 
      IF (NOT BZDIAG) &                     _ IGNORE IF DIAGNOSTIC AND ?
         (BZCNFST > C7DISABLED) &           _   LINE NOT CONFIGURED OR ?
         (BZTIPTYPE " N0LINIT)              _   NOT ENABLED OR LINE    ?
                                            _   INITIALIZER OWNER      ?
      THEN
      BEGIN 
        NRLINO   := MMLINO;                 _ LINE NUMBER              ?
        NRCLAST  := MMCSTS;                 _ CLA STATUS               ?
        CNCECODE := NRCODE;                 _ CE ERROR CODE            ?
        PNCEFILE (5);                       _ MAKE ENTRY TO CE FILE    ?
      END;
      NRCODE := 0;                          _ CLEAR ERROR INDICATOR    ?
    END;  _ CE ERROR  ? 
_ 
*              ---- PROCESS HARD ERRORS IF ANY ---- 
? 
    IF MMWKCOD = MMHARDERR                  _ CHECK FOR HARD ERROR     ?
    THEN
    BEGIN 
      M5PASS := FALSE;                      _ DO NOT GIVE TO TIP       ?
      IF NOT NAHARDER                       _ ARE WE IN ERROR PROCESS  ?
      THEN                                  _ NO - START ERROR PROCESS ?
      WITH TKLIPAK DO                       _GLOBAL COMMAND PACKET     ?
      BEGIN 
        NAHARDER := TRUE;                   _ SET HARD ERROR INDICATOR ?
        NGA.NGPORT := MMPORT;               _ PORT NUMBER              ?
        NGA.NGCMD  := NKCLRL;               _ CLEAR COMMAND            ?
        PMCOIN;                             _ CLEAR THE CLA            ?
        NKLINO   := MMLINO;                 _ LINE NUMBER              ?
        NKCMD    := NKENDOUT;               _ COMMAND = TERM. OUTPUT   ?
        NKRELBFS := FALSE;                  _ DO NOT REL OUT BUFFERS   ?
        NKWKFLG  := FALSE;                  _ WORKLIST NOT REQUIRED    ?
        PGCDRV;                             _ISSUE THE COMMAND         ?
        NKRELBFS := TRUE;                   _ RELEASE INPUT BUFFERS    ?
        NKWKFLG  := TRUE;                   _ WORKLIST REQUIRED FLAG   ?
        NKUSRBY  := MMWTCOUNT;              _ SAVE INOP CODE           ?
        NKWKCOD  := NMINEND;                _ WK = INPUT TERMINATED    ?
        NKWLINDX := MMEWLQ;                 _ RETURN TO MUX LEVEL      ?
        NKCMD    := NKENDIN;                _ COMMAND = TERM. INPUT    ?
        PGCDRV;                             _ISSUE THE COMMAND         ?
        PBTODEL (MMLINO);                   _ DELETE ANY TIMING ENTRIES? CC4
      END;
    END;  _ A0HARDERR ? 
_ 
*              ---- CALL USER ROUTINE IF NECESSARY ---- 
? 
    IF M5PASS THEN
      WITH BJTIPTYPT[BZTIPTYP] DO          _ CALL TIP, BUT SET UP      ?
      IF BZDIAG 
      THEN PBLSPUT(BWWLENTRY[MUX2],         _PASS TO DIAGNOSTIC        ?
                   BYWLCB[B0DGWL]) ELSE 
      PBXFER(BJTEMUX2,BJTPMUX2);            _ CALL TIP                 ?
 10:; 
  END; _ WITH     ? 
  
END;   _ PMWOLP31 ? 
