*COMDECK PMCDRV 
_$J+? 
_$R-,G-,I- ?
_ 
************************************************************************
************************************************************************
**                                                                    **
*              * *   P G C D R V   * *                                 *
**                                                                    **
**             C O M M A N D   D R I V E R                            **
**                                                                    **
************************************************************************
************************************************************************
*                                                                      *
** OVERVIEW -  THE COMMAND DRIVER PROVIDES THE LOGICAL INTERFACE       *
*              BETWEEN USER PROGRAMS (TIPS AND LIPS) AND MULTIPLEX     *
*              SUBSYSTEM (HARDWARE AND SOFTWARE).  COMMANDS ARE ISSUED *
*              BY USER WHICH CAUSE HARDWARE COMMANDS TO BE SENT TO THE *
*              CLA.  THE USER PACKET IS NOT ALTERED, NOR IS ANY INFORM-*
*              ATION RETURNED TO THE CALLER.  AS A RESULT OF A USER    *
*              COMMAND A WORKLIST ENTRY TO THE TIP OR LIP IS MADE IF   *
*              SPECIFIED.                                              *
*              THE COMMAND DRIVER CAN BE CALLED FROM OPS LEVEL         *
*              VIA A CALL TO PBCOIN.  THE INTERRUPT LEVEL (3) CALLS    *
*              DIRECTLY.                                               *
*                                                                      *
** INPUTS -    USER COMMAND PACKET OF TYPE - NKINCOM                   *
*              MUX LINE TABLES                                         *
*                                                                      *
** OUTPUTS -   COMMANDS TO THE CLA (BY THE FIRMWARE)                   *
*              WORKLISTS TO THE CALLER SPECIFIED LIST (TERMINATE       *
*              INPUT OR OUTPUT).                                       *
*                                                                      *
** EXTERNAL SUBROUTINES USED                                           *
*              PMCOIN   - COMMON INTERFACE TO FIRMWARE                 *
*              PBGET1BF - GET A BUFFER - MUX LCB                       *
*              PBREL1BF - RELEASE A BUFFER - MUX LCB                   *
*              PBRELZRO - RELEASE A CHAIN OF BUFFERS AND ZERO CHECK    *
*              PBLSPUT  - MAKE A WORKLIST ENTRY                        *
*                                                                      *
************************************************************************
* 
? 
_$J+? 
PROCEDURE PGCDRV; 
VAR 
      TMLOPAK : BWWORKLIST;                 _ LOCAL WORKLIST PACKET    ?
      TDSEQ   : NDSEQE;                     _ CONTROL CMD SEQUENCE     ?
      T1      : B0OVERLAY;                  _ GENERAL PURPOSE          ?
      T2      : B0OVERLAY;                  _ GENERAL PURPOSE          ?
_?
_ 
************************************************************************
*                                                                      *
*              * *   I N P U T   S U B R O U T I N E   * *             *
*                                                                      *
************************************************************************
* 
? 
PROCEDURE PMINPUT;
BEGIN 
  WITH TKLIPAK DO                           _ USER COMMAND PACKET      ?
  BEGIN 
    WITH NAPORT'[NKPORT].NALCBP' DO         _ MUX LCB                  ?
    BEGIN 
      NCISTAI        := NKISTAI;            _ INPUT STATE INDEX        ?
      NCRPRT         := NKRPRT;             _ SET/RESET PARITY STRIP   ?
      IF NKSCENBL                           _ CK SPECIAL CHAR TO CHNG  ?
      THEN NCSCHR    := NKSCHR;             _ CHANGE SPECIAL CHAR      ?
      IF NKISPTA " 0                        _ CHECK FOR NEW INPUT STATS?
      THEN NCISPTA   := NKISPTA;            _ SET NEW INPUT STATES     ?
      IF NKCXLTA " 0                        _ CHECK FOR NEW XLATE TBL  ?
      THEN NCCXLTA   := NKCXLTA;            _ SET NEW CODE XLATE TBL   ?
      IF NKBLKL " 0                         _ CHECK FOR NEW BLOCK LNGTH?
      THEN
      BEGIN 
        NCBLKL       := NKBLKL;             _ SET COUNT 2 LIMIT        ?
        NCCNT2       := NKBLKL;             _ AND INITIAL VALUE        ?
      END;
      IF NKCNT1 " 0                         _ CHECK FOR NEW CHAR CNT 1 ?
      THEN
      BEGIN 
        NCCNTL       := NKCNT1;             _ SET COUNT 1 LIMIT        ?
        NCCNT1       := NKCNT1;             _ AND INITIAL VALUE        ?
      END;
      IF NKMVB                              _ CHECK FOR USER FLAGS     ?
      THEN NCUOPS    := NKUOPS;             _ SET USER FLAGS           ?
    END; _ WITH NALCBP  ? 
  
    WITH NAPORT'[NKPORT] DO                 _ PORT TABLE ENTRY         ?
    BEGIN 
      NAMSI          := MSTINP;             _ MODEM STATE TO INPUT     ?
    END;  _ WITH NAPORT  ?
  
  END;   _ WITH TKLIPAK ? 
  
END;     _ PMINPUT      ? 
_$J+? 
_ 
************************************************************************
*                                                                      *
*              * *   P M O U T P U T   * *                             *
*                                                                      *
************************************************************************
* 
* 
? 
PROCEDURE PMOUTPUT; 
CONST 
      N0MD4I = 1;                           _INITIAL MODE4 CRC STATE   ?
VAR 
      TKVAR  : B0OVERLAY;                   _ FCD, L/R FLAG            ?
BEGIN 
  WITH NAPORT'[NGA.NGPORT],NALCBP' DO 
  BEGIN 
    IF NAOON                                _ IF ALREADY OUTPUTTING    ?
    THEN
      PBHALT(J0ONOUTPT);                    _ HALT NOW                 ?
    NCOBP := TKLIPAK.NKOBP;                 _ SET OUTPUT BUFFER POINTER?
    NCSUPCHAIN := NCOBP'.BFSUPCHAIN;        _ SET SUPRESS CHAIN FLAG   ?
    TKVAR.BARBYT := NCOBP'.BFFCD;           _ GET FCD FROM BUFFER      ?
    NCEOBL := TKVAR.BA1BOL;                 _ FLAG IF RITE CHAR. FIRST ?
    NCOBLCD := (TKLIPAK.NKWD2.BARBYT * 2)   _ SET LAST CHAR. DISPL     ?
               + NCOBP'.BFLCD;
    NCOBP := (TKVAR.BARBYT / 2) + NCOBP;    _ SET OBP TO FIRST WORD    ?
    NASTOUT := FALSE;                       _RESET STOP OUTPUT FLAG    ?
    NAOON := TRUE;                          _ SET OUTPUT ON            ?
    NACRC := 0;                             _ CLEAR INITIAL CRC VALUE  ?
    NCCRST := BJTIPTYPT[CGLCBP'[NGA.NGPORT] _ SET INITIAL CRC STATE    ?
              .BZTIPTZ].BJICRCS;            _ FORM TIP TYPE TABLE      ?
    IF NCCRST = N0MD4I                      _ IF INITIAL STATE IS MODE4?
    THEN
      NACRC := 255;                         _ SET INITIAL CRC TO FF    ?
    NCNXCCA := FALSE;                       _ CLEAR RIGHT CHAR. FLAG   ?
    NCEOS   := FALSE;                       _ CLEAR END OF SOURCE FLAG ?
  END _ WITH ?
END;    _ PMOUTPUT ?
_$J+? 
_ 
*              ---- BEGIN MAIN PROGRAM ---- 
? 
BEGIN 
  WITH NGA DO                               _ FIRMWARE PACKET INTERFACE?
  BEGIN 
    NGPORT := TKLIPAK.NKPORT;               _ PORT ADDRESS             ?
    NGCMD  := TKLIPAK.NKCMD;                _ COMMAND FOR FIRMWARE     ?
  
    CASE TKLIPAK.NKCMD OF 
  
_***********************************************************************
    TURN  AROUND LINE COMMAND          (NKTURN) 
***********************************************************************?
_?
    NKTURN: PMCOIN;                         _GO TO FIRMWARE            ?
_?
_***********************************************************************
    INITIALIZE LINE COMMAND            (NKINIL) 
***********************************************************************?
_?
    NKINIL: 
    WITH TKLIPAK,                           _ LOCAL INPUT PACKET       ?
         NAPORT'[NKPORT] DO                 _ PORT TABLE ENTRY         ?
    BEGIN 
      NAISON  := TRUE;                      _ SET ISON ON              ?
      NALTYP  := NKLTYP;                    _ LINE TYPE                ?
      IF NKCMS " 0                          _IF CHANGE  SPECIFIED      ?
      THEN
        NAMSPTA := NKCMS                    _CHANGE ADDRESS            ?
      ELSE
        NAMSPTA := NBLTYT[NALTYP,2].NBINT1; _OTHERWISE USE LINE TABLE  ?
      IF NKMDMST = N4IDL                    _ IF PACKET PARAMETER      ?
      THEN                                  _ INDICATES IDLE MODEM STAT?
        NAMSI := MSTIDL                     _ SET MODEM STATE INDEX TO ?
      ELSE                                  _ IDLE                     ?
        NAMSI := MSTLNI;                    _ ELSE SET MODEM STATE INDX?
                                            _ TO INITIALIZE            ?
      PMCOIN;                               _ CALL FIRMWARE            ?
    END;   _ NKINIL  ?
_$J+? 
_?
_***********************************************************************
    ENABLE LINE COMMAND                (NKENBL) 
***********************************************************************?
_?
    NKENBL: 
    BEGIN 
      IF NAPORT'[NGPORT].NALCBP = NIL       _ IF LCB NOT ASSIGNED      ?
      THEN                                  _ NO                       ?
      WITH NAPORT'[NGPORT] DO               _ PORT TABLE ENTRY         ?
      BEGIN 
        NABFPTR            := PBGET1BF(B0S16); _ GET MUX LCB BUFFER    ?
        FOR N1             := 1 TO 16 DO    _ CLEAR THE MUX LCB        ?
        NALCBP'.NCARRY[N1] := 0;            _ CLEAR A WORD             ?
        NAMSI              := MSTENB;       _ MODEM STATE INDEX TO ENAB?
      END;
_ 
*              ---- SET UP MUX LCB FIELDS FROM TERMINAL CHAR. TBL. ---- 
? 
      WITH NAPORT'[NGPORT].NALCBP' DO       _ MUX LCB                  ?
      BEGIN 
        WITH NJTECT[TKLIPAK.NKTCLS] DO      _ TERMINAL CLASS TABLE     ?
        BEGIN 
          NCCXLTA := NJCXLTA;               _ CODE TRANSLATE TABLE ADDR?
          NCCNT1  := NJCNT1;                _ CHARACTER COUNTER LIMIT  ?
          NCCNTL  := NJCNT1;                _ SET INITIAL VALUE        ?
          NCISPTA := NJISPTA;               _ INPUT STATES POINTER TBL ?
          IF NCISPTA = 0                    _NO INPUT STATE TABLE      ?
          THEN
            ADDR(MNOTIP, NCISPTA);
          NCMRTO  := FALSE;                 _ CLEAR MODEM RESPONSE T/O ?
          NCBLKL  := NJBLKL;                _ SET UP BLOCK LENGTH      ?
          NCIBFCD := NJIBFCD;               _ FCD OF FIRST BUFFER      ?
          NCCRCP  := NJCRCP;                _ CRC POLYNOMINAL INDEX    ?
        END;
_ 
*              ---- SET UP MUX LCB FIELDS FROM TIP TYPE TABLE ----
? 
        WITH BJTIPTYPT[CGLCBP'[NGPORT].BZSVTIPTYPE] DO
        BEGIN 
          NCBZL   := BJBZL;                 _ RESET LINE TIMER         ?
          NCOBT   := BJOBT;                 _ OBT WORKLIST DESIRED     ?
        END;
_ 
*              ---- SET UP MUX LCB FIELDS FROM USER PACKET ---- 
? 
        WITH TKLIPAK DO 
        BEGIN 
          NCUOPS      := NKUOPS;            _ USER BITS                ?
          NCSCHR      := NKSCHR;            _ SPEICAL CHARACTER        ?
          NCNOXL      := NKNOXL;            _ TRANSLATE FLAG           ?
          IF NKBLKL " 0                     _ NEW BLOCK LENGTH         ?
          THEN NCBLKL := NKBLKL;            _ YES - SET NEW BLOCK LEN. ?
          IF NKIFCD " 0                     _ NEW FCD                  ?
          THEN NCIBFCD := NKIFCD;           _ YES - SET NEW FCD        ?
        END;
_ 
*              ---- SET UP FIELDS FROM LINE TABLE ----
? 
_ 
*              ---- SET UP MISCELEANOUS FIELDS ---- 
? 
        WITH NAPORT'[NGPORT] DO             _ PORT TABLE ENTRY         ?
        BEGIN 
          IF NALTYP = N0LA                  _2563 CLA, ST WD1 BIT 2    ?
          THEN NCBUFCLA :=                  _ CLA STATUS:              ?
               NAOVERAY[7].BABOOL.B0B10     _ 2563 - STATUS WD1, BIT 2 ?
          ELSE NCBUFCLA :=                  _ 2560, 2561 -  WD2, BIT 0 ?
               NAOVERAY[7].BABOOL.B0B0; 
          NAOBTCMD := NBLTYT[NAPORT'[NGPORT]._ SET UP OBT COMMAND BYTE ?
                      NALTYP,NKOBT].NBWD0.
                      BALBYT; 
          NCCNT2   := NCBLKL;               _ INITIALIZE BLOCK COUNT   ?
        END;
  
      END;
      PMCOIN;                               _ ENABLE THE LINE          ?
    END;  _ NKENEL ?
_$J+? 
_?
_***********************************************************************
    INPUT COMMAND                      (NKINPT) 
***********************************************************************?
_?
    NKINPT: 
    BEGIN 
      PMINPUT;                              _ INPUT SUBROUTINE         ?
      PMCOIN;                               _ CALL FIRMWARE            ?
    END;
_?
_***********************************************************************
    DIRECT OUTPUT COMMAND              (NKDOUT) 
***********************************************************************?
_?
    NKDOUT: 
    BEGIN 
      PMOUTPUT;                             _ OUTPUT SUBROUTINE        ?
      NAPORT'[NGPORT].
      NAOVERLAY[3].BABOOL.B0B9 := FALSE;    _ DO NOT INPUT AFTER OUTPUT?
      PMCOIN;                               _ CALL FIRMWARE SUBROUTINE ?
    END;
_?
_***********************************************************************
    INPUT AFTER OUTPUT COMMAND         (NKINOUT)
***********************************************************************?
_?
    NKINOUT:  
    BEGIN 
      PMINPUT;                              _ SET UP INPUT             ?
      PMOUTPUT;                             _ SET UP PUTPUT            ?
      NAPORT'[NGPORT].
      NAOVERLAY[3].BABOOL.B0B9 := TRUE;     _ SET INPUT AFTER OUTPUT   ?
      PMCOIN;                               _ CALL FIRMWARE ROUTINE    ?
      T1.BAINT := NGPORT;                   _ PORT NUMBER FOR FIRMWARE ?
      INST ($C400, T1,                      _ LDA    PORT NUMBER       ?
            $E400, N1INFLG,                 _ LDQ    FIRMWARE ADDRESS  ?
            $0BA2)                          _ EMS    Q - UPDATE NAION  ?
    END;
_$J+? 
_?
_***********************************************************************
    TERMINATE INPUT COMMAND            (NKENDIN)
***********************************************************************?
_?
    NKENDIN:  
    WITH TMLOPAK.B0EWLQ DO                  _ LOCAL WORKLIST AREA      ?
    BEGIN 
      WITH TKLIPAK,                         _ COMMAND PACKET           ?
           NAPORT'[NGPORT] DO               _ PORT TABLE ENTRY         ?
      BEGIN 
        PMCOIN;                             _ STOP INPUT - CALL FIRMW. ?
        NAION   := FALSE;                   _ TURN OFF INPUT ON (ION)  ?
        IF ((CGLCBP'[NGPORT].BZTIPTYPE " N0LINIT) ! 
            (CGLCBP'[NGPORT].BZSTATE > LSTABLE)) _IF NOT PTLINIT       ?
                                            _OR IT IS SYN AUTO REC     ?
                                            _AND DURING AUTO RECOGNITN ?
        THEN
          BEGIN 
          IF NAOON                          _IF OUTPUT ON              ?
          THEN
            NAMSI  := MSTOUT                _SET MODEM STATE TO OUTPUT ?
          ELSE
            NAMSI  := MSTIDL;               _SET MODEM STATE TO IDLE   ?
          END; _ IF CGLCBP'[NGPORT].BZTIPTYPE " N0LINIT ? 
        MMIBP := NIL;                       _ASSUME NO INPUT BUFFER    ?
        IF NALCBP " NIL                     _IF MUXLCB ASSIGNED        ?
        THEN
          WITH NALCBP' DO 
            BEGIN 
            NCINPRO := FALSE;               _RESET INPUT IN PROGRESS   ?
            IF NCSCBA " NIL                 _IF INPUT BUFFER PRESENT   ?
            THEN
              BEGIN 
              MMIBP       := NCSCBA;        _BUFFER ADDRESS FOR WKLST  ?
              NCSCBA      := NIL;           _CLEAR INPUT BUFFER ADDR   ?
              T1.BABUFPTR := NCIBP;         _LAST INPUT BUFFER         ?
              NCIBP       := NIL;           _CLEAR CURRENT BUFFER ADDR ?
              T2.BASET    := T1.BASET -     _MASK TO FWA               ?
                             BEDBSIZE'.BEMSK.BASET; 
              IF NOT NCRINCH
              THEN T1.BAINT      := T1.BAINT - 1; 
              T1.BAINT           := (T1.BAINT - T2.BAINT) * 2;
              T1.BABOOL.B0B0     := NOT NCRINCH;  _LEFT OR RIGHT BYTE  ?
              T2.BABUFPTR'.BFLCD := T1.BAINT;     _PUT LCD IN BUFFER   ?
              END;
            END;
_ 
*              ---- CHECK FOR BUFFER RELEASE AND USER WORKLIST ---- 
? 
        IF NKRELBFS ! (NOT NKWKFLG)         _ RELEASE OR NO WORKLIST   ?
        THEN
          BEGIN 
          PBRELZRO (MMIBP, BEDBSIZE);       _ RELEASE BUFFERS FOR USER ?
          IF NALCBP " NIL                   _ IF MUX LCB EXISTS        ?
          THEN
            NALCBP'.NCBLCNT := 0;           _ RESET BUFFERS USED COUNT ?
          END;
        GOTO 10;                            _ CHECK FOR WORKLIST       ?
      END; _ WITH NAPORT ?
    END;   _ NKENDIN     ?
_$J+? 
_***********************************************************************
    TERMINATE OUTPUT COMMAND           (NKENDOUT) 
***********************************************************************?
_?
    NKENDOUT: 
    WITH TKLIPAK,                           _ COMMAND PACKET           ?
         NAPORT'[NGPORT],                   _ PORT TABLE ENTRY         ?
         TMLOPAK.B0EWLQ DO                  _ LOCAL WORKLIST ENTRY     ?
    BEGIN 
      PMCOIN;                               _ STOP THE OUTPUT - CALL FM?
      NAOON     := FALSE;                   _ SET OUTPUT OFF (OON)     ?
      IF ((CGLCBP'[NGPORT].BZTIPTYPE " N0LINIT) ! 
          (CGLCBP'[NGPORT].BZSTATE > LSTABLE)) _IF NOT PTLINIT         ?
                                            _OR IT IS SYN AUTO REC     ?
                                            _AND DURING AUTO RECOGNITN ?
      THEN
        BEGIN 
        IF NAION                            _IF INPUT ACTIVE           ?
        THEN
          NAMSI := MSTINP                   _SET MODEM STATE TO INPUT  ?
        ELSE
          NAMSI := MSTIDL;                  _SET MODEM STATE TO IDLE   ?
        END; _ IF CGLCBP'[NGPORT].BZTIPTYPE " N0LINIT ? 
_ 
*              ---- CHECK FOR BUFFER RELEASE AND USER WORKLIST ---- 
? 
      IF NKRELBFS                           _ CK FOR BUFFER RELEASE    ?
      THEN
      WITH CGLCBP'[NGPORT] DO               _ SYSTEM LCB               ?
      PBRELZRO (BZLBTOMUX,BEDBSIZE);        _ RELEASE BUFFERS FOR USER ?
10 :  IF NKWKFLG                            _ CK FOR WORKLIST REQUIRED ?
      THEN                                  _ YES                      ?
      BEGIN 
        MMWD0.BAINT := NKWD2.BAINT;         _ PARAMETER AND WORKCODE   ?
        MMLINO := TKLIPAK.NKLINO;           _ LINE NUMBER              ?
        PBLSPUT (TMLOPAK,BYWLCB[NKWLINDX]); _ MAKE WORKLIST ENTRY      ?
        IF NKWLINDX = MMEWLQ                _ CK FOR EVENT W/L QUEUE   ?
        THEN
        BEGIN 
          INST ($E400,N2P3INTAD,            _ LDQ   FIRMWARE ADDRESS   ?
                $0BA2);                     _ EMSQ  ESCAPE TO FIRMWARE ?
        END;
      END;
    END; _ NKENDOUT ? 
_$J+? 
_?
_***********************************************************************
    DISABLE LINE COMMAND               (NKDISL) 
    CLEAR LINE COMMAND                 (NKCLRL) 
***********************************************************************?
  
    NKDISL, 
    NKCLRL :  
    WITH NAPORT'[NGPORT] DO                 _ PORT TABLE ENTRY         ?
    BEGIN 
      PMCOIN;                               _ DISABLE/CLEAR THE LINE   ?
      IF (TKLIPAK.NKCMD = NKDISL) &         _ IS IT A DISABLE CMD      ?
      (NALCBP " NIL)                        _ AND LCB ASSIGNED         ?
      THEN
      BEGIN 
        NALCBP'.NCARRY [16] := 0;           _ CLEAR BUFFER CHAIN WORD  ?
        PBREL1BF (NABFPT, B0S16);           _ AND RELEASE THE MLCB     ?
      END;
      T1.BAINT  := NALTYP;                  _ SAVE LINE TYPE           ?
      NAARRY[1] := 0;                       _ CLEAR ION, OON, ETC      ?
      NAARRY[3] := 0;                       _ CLEAR MISCL FIELDS       ?
      NAARRY[5] := 0;                       _ CLEAR CMD WD 1 AND 2     ?
      NAARRY[6] := 0;                       _ CLEAR CMD WD 3 AND 4     ?
      NAARRY[7] := 0;                       _ CLEAR STATUS             ?
      NALTYP    := T1.BAINT;                _ RESTORE LINE TYPE        ?
      NAMSI     := MSTERR;                  _ MODEM STATE TO ERROR     ?
    END;  _ NKDISL, NKCLRL ?
_$J+? 
_?
_***********************************************************************
    CONTROL COMMAND                    (NKCONTROL)
***********************************************************************?
_?
    NKCONTROL : 
    WITH NAPORT'[NGPORT].NAFCCST DO         _ CLA COMMAND STATUS TABLE ?
    BEGIN 
      T1.BAINT := NBLTYT[NAPORT'[NGPORT]. 
                  NALTYP,1].NBCTYP;         _ CLA TYPE                 ?
_ 
*              ---- SET UP NUMBER OF WORDS AND ASYNC PARAMETERS --- 
? 
      CASE T1.BAINT OF                      _ CLA TYPE                 ?
  
      N0SYNC,                               _ SYNCHRONOUS              ?
      N0NORS232 :                           _ NON RS 232               ?
        NGQ.NGCNT := 3;                     _ 3 WORDS TO OUTPUT        ?
  
      N0ASYNC : 
      WITH NICTCT[CGLCBP'[NGPORT].          _ LINE SPEED TABLE         ?
                                BZLNSPD] DO 
      BEGIN 
        NGQ.NGCNT := 4;                     _ NUMBER OF WORDS TO OUTPUT?
        NFARSR    := NIRSR;                 _ RECEIVE SPEED RANGE      ?
        NFARSPED  := NIRSPED;               _ RECEIVE SPEED            ?
        NFATSR    := NITSR;                 _ TRANSMITT SPEED RANGE    ?
        NFATSPED  := NITSPED;               _ TRANSMITT SPEED          ?
        NFSTOP    := NISTOP;                _ STOP BIT                 ?
      END;  _ N0ASYNC ? 
  
      END;  _ CASE OF CLA TYPE ?
_ 
*              ---- CHECK FOR NEW TERMINAL CLASS ---- 
? 
      IF TKLIPAK.NKTCLS " 0                 _ NEW TERMINAL CLASS       ?
      THEN                                  _ YES                      ?
      WITH NJTECT[TKLIPAK.NKTCLS] DO        _ TERMINAL CLASS DEF       ?
      CASE T1.BAINT OF
  
        N0SYNC,                             _ SYNCHRONOUS              ?
        N0NORS232 :                         _ NON RS 232               ?
        BEGIN 
          NFSPARY  := NJPARITY;             _ THE LOWER 2 BITS ARE THE ?
                                            _ CLA PARITY               ?
          NFSCHLEN := NJCHLEN;              _ CHARACTER LENGTH         ?
          NFSYCAR  := CHR(NJSYNC);          _ SYNC CHARACTER           ?
        END;  _ N0SYNC, N0NONRS232 ?
  
        N0ASYNC : 
        BEGIN 
          NFAPARY  := NJPARITY;             _ THE LOWER 2 BITS ARE THE ?
                                            _ CLA PARITY               ?
          NFACHLEN := NJCHLEN;              _ CHARACTER LENGTH         ?
        END; _ N0ASYNC ?
  
        N0X27,                              _ CLA TYPE = HDLC OR       ?
        N0SDLC :                            _CLA TYPE = SDLC: MOVE     ?
          NFXCNT := NJXCNT;                 _ TRANSMISSION COUNT       ?
  
      END;
_ 
*              ---- SET UP FUNCTIONS AS SPECIFIED 
? 
      N1 := 1;                              _ INDEX CONTROL            ?
      WITH TDSEQ DO                         _ COMMAND CONTROL SEQ      ?
      REPEAT                                _ LOOP ON FUNCTION         ?
        NDCHAR := TKLIPAK.NKCARY[N1];       _ GET THE FUNCTION         ?
        N1     := N1 + 1;                   _ BUMP INDEX TO NEXT FUNCT ?
        CASE  NDCASE OF                     _ FUNCTION                 ?
  
        0 :                                 _ NO MORE FUNTIONS         ?
        BEGIN 
          PMCOIN;                           _ ISSUE COMMAND VIA FIRM   ?
          NGQ.NGCNT := 2;                   _ RESET COUNT FOR OTHER CMD?
        END;
  
_              ---- SET OR CLEAR THE PROPER BIT IN THE
*                   CLA COMMAND STATUS TABLE AS SPECIFIED 
*                   BY EACH CONTROL FUNCTION
? 
        N0RTS   : NFW1B7 := NDSET;          _ RTS        WORD 1 BIT 7  ?
  
        N0SRTS  : NFW1B6 := NDSET;          _ SRTS, RSYN      1     6  ?
  
        N0OM    : NFW1B5 := NDSET;          _ OM              1     5  ?
  
        N0LM    : NFW1B4 := NDSET;          _ LM, NSYN, LT    1     4  ?
  
        N0DTR   : NFW1B3 := NDSET;          _ DTR             1     3  ?
  
        N0TB    : NFW1B2 := NDSET;          _ TB              1     2  ?
  
        N0ION   : NFW1B1 := NDSET;          _ ION             1     1  ?
  
        N0OON   : NFW1B0 := NDSET;          _ 0ON             1     0  ?
  
        N0BREAK : NFW2B7 := NDSET;          _ BREAK           2     7  ?
  
        N0ISR   : 
        BEGIN 
          NFW2B6               := NDSET;    _ ISR             2     6  ?
          NAPORT'[NGPORT].NAISR := TRUE;    _ SET ISR IN PORT TABLE    ?
        END;  _ N0ISR ? 
  
        N0ISON  : NFW2B5 := NDSET;          _ ISON            2     5  ?
  
        N0DLM   : NFW2B4 := NDSET;          _ DLM             2     4  ?
  
        N0ECHO  : NFW3B1 := NDSET;          _ ECHO            3     1  ?
  
        N0LBT   :                           _ LOOPBACK TEST            ?
        BEGIN 
          CASE T1.BAINT OF
            N0SYNC,                         _ SYNC            2     4  ?
            N0NORS232,                      _ NON RS232       2     4  ?
            N0X27,                          _ HDLC                     ?
            N0SDLC    : NFW2B4 := NDSET;    _ SDLC            2     4  ?
            N0ASYNC   : NFW3B0 := NDSET;    _ ASYNC           3     0  ?
          END;  _ CASE  ? 
        END;    _ N0LBT ? 
  
        N0PON   :                           _ PON - PARITY ON          ?
        BEGIN 
          CASE T1.BAINT OF
            N0SYNC,                         _ SYNC            2     2  ?
            N0NORS232 : NFW2B2 := NDSET;    _ NON RS232       2     2  ?
            N0ASYNC   : NFW3B6 := NDSET;    _ ASYNC           3     6  ?
          END;  _ CASE  ? 
        END;    _ N0PON ? 
  
        N0PSET  :                           _ PSET - PARITY SET        ?
        BEGIN 
          CASE T1.BAINT OF
            N0SYNC,                         _ SYNC            2     3  ?
            N0NORS232 : NFW2B3 := NDSET;    _ N0N RS232       2     3  ?
            N0ASYNC   : NFW3B7 := NDSET;    _ ASYNC           3     7  ?
          END;  _ CASE   ?
        END;    _ N0PSET ?
  
        N0CLLS  :                           _ CHARACTER LENGTH - LSB   ?
        BEGIN 
          CASE T1.BAINT OF
            N0SYNC,                         _ SYNC            2     0  ?
            N0NORS232 : NFW2B0 := NDSET;    _ NON RS232       2     0  ?
            N0ASYNC   : NFW3B4 := NDSET;    _ ASYNC           3     4  ?
          END;  _ CASE   ?
        END;    _ N0CLLS ?
  
        N0CLMS  :                           _ CHARACTER LENGTH - MSB   ?
        BEGIN 
          CASE T1.BAINT OF
            N0SYNC,                         _ SYNC            2     1  ?
            N0NORS232 : NFW2B1 := NDSET;    _ NON RS232       2     1  ?
            N0ASYNC   : NFW3B5 := NDSET;    _ ASYNC           3     5  ?
          END;  _ CASE   ?
        END;    _ N0CLMS ?
  
      END;  _ CASE NDCASE OF  ? 
  
      UNTIL NDCASE = 0;                     _ ALL FUNCTIONS PROCESSED  ?
  
    END;  _ CONTROL COMMAND ? 
_***********************************************************************
    SPECIAL CODE FOR USERS NEEDING ACCESS TO MUX TABLES  (NKSPECIAL)
***********************************************************************?
  
    NKSPECIAL:  
    WITH TKLIPAK DO 
    BEGIN 
      CASE NKWD1.BAINT OF 
      0: WITH NBLTYT[N0LDIAG,1] DO
      BEGIN 
        NBINT2 := NKWD2.BAINT;              _ MASK FOR COMMAND STATUS  ?
        NBCTYP := NKWD3.BAINT;              _ CIRCUIT TYPE             ?
      END;
      1: NAPORT'[NKWD2.BAINT].NAISON := TRUE; _SET ISON                ?
      2: NICTCT[N0DIAG] := NKWD2.BACTCT;    _CHARACTER TRANSMISSION TBL?
      END; _CASE NKWD1,BAINT? 
    END; _NKSPECIAL?
  
_?
_***********************************************************************
    STATUS COMMAND
***********************************************************************?
    NKSTATUS:                               _ TURN ISON ON             ?
  
      BEGIN 
      WITH NAPORT'[NGPORT] DO 
        BEGIN 
        NAISON := TRUE;                     _TURN INPUT SUPERVISION ON ?
        PMCOIN; 
        END; _ WITH NAPORT ?
      END; _  NKSTATUS ?
  
_ 
************************************************************************
    INSPUT SUPERVISION REQUEST
***********************************************************************?
    NKISR:                                  _INPUT SUPERVISION REQUEST ?
      BEGIN 
      WITH NAPORT'[NGPORT] DO 
        BEGIN 
        IF TKLIPAK.NKNSTA " 0               _INDEX CHANGE              ?
        THEN
          NAMSI := TKLIPAK.NKNSTA;          _CHANGE INDEX              ?
  
        PMCOIN;                             _ISSUE REQUEST.            ?
        END; _ WITH NAPORT ?
      END; _ NKISR ?
END;  _ CASE NKCMD OF  ?
  
  END;    _ WITH            ? 
END;      _ PMCDRV          ? 
_$J+? 
_$G-,R-,I+? 
_ 
************************************************************************
**                                                                    **
**             * *   P M C D R V   * *                                **
**                                                                    **
**             S W I T C H   T O   P G C D R V   (O N   P A G E)      **
**                                                                    **
************************************************************************
? 
PROCEDURE PMCDRV (VAR TKCOMP : NKINCOM);
  
VAR 
  TKPAGE : INTEGER;                         _CALLERS PAGE NUMBER       ?
  
BEGIN 
TKLIPAK := TKCOMP;                          _GET COMMAND PACKET GLOBAL ?
PBRDPGE   (TKPAGE);                         _SAVE CALLERS PAGE NUMBER  ?
PBPSWITCH (SYSPGE);                         _SWITCH TO MUX SUBSYSTEM PG?
PGCDRV;                                     _CALL COMMAND DRIVER       ?
PBPSWITCH (TKPAGE);                         _SWITCH BACK TO CALLERS PG ?
END;
