*COMDECK ASYNCTIP 
_$J+
  
  
  
    AAAAAA         SSSSSS      YYY     YY  NNNN       NNNN     CCCCC
  AAAAAAAAAA     SSSSSSSSSS    YYY     YY   NNN        NN    CCCCCCCCC
 AAAA     AAA   SSSS     SSS   YYY     YY   NNNN       NN   CCCC     CC 
 AAA       AA   SSS            YYY     YY   NNNNN      NN   CCC 
 AAA       AA   SSS            YYY     YY   NNN NN     NN   CCC 
 AAA       AA   SSSS            YYY   YY    NNN  NN    NN   CCC 
 AAAAAAAAAAAA    SSSSSSS         YYY YY     NNN   NN   NN   CCC 
 AAAAAAAAAAAA       SSSSSSS       YYYY      NNN    NN  NN   CCC 
 AAA       AA            SSS       YY       NNN     NN NN   CCC 
 AAA       AA             SS       YY       NNN      NNNN   CCC 
 AAA       AA   SSSS     SSS       YY       NNN       NNN   CCCC     CC 
AAAAA     AAAA   SSSSSSSSSS       YYYY     NNNNN       NNN   CCCCCCCCC
AAAAA     AAAA     SSSSSS         YYYY     NNNNN       NNN     CCCCC
  
  
  
  
BBBBBBBBBBB      LLL             OOOOOOO         CCCCC    KKKKK      KK 
 BBBBBBBBBBBB    LLL           OOOOOOOOOOO     CCCCCCCCC   KKK      KK
 BBB       BBB   LLL          OOOO      OOO   CCCC     CC  KKK     KK 
 BBB        BB   LLL          OOO        OO   CCC          KKK    KK
 BBB      BBB    LLL          OOO        OO   CCC          KKK   KK 
 BBBBBBBBBB      LLL          OOO        OO   CCC          KKK  KK
 BBBBBBBBBB      LLL          OOO        OO   CCC          KKK KK 
 BBB      BBB    LLL          OOO        OO   CCC          KKKKKKK
 BBB        BB   LLL          OOO        OO   CCC          KKKK  KK 
 BBB        BB   LLL          OOO        OO   CCC          KKK    KK
 BBB       BBB   LLL       L  OOOO      OOO   CCCC     CC  KKK     KK 
BBBBBBBBBBBBB    LLLLLLLLLLL   OOOOOOOOOOO     CCCCCCCCC  KKKKK     KK
BBBBBBBBBBB      LLLLLLLLLLL     OOOOOOO         CCCCC    KKKKK      KK 
  
  
  
  
MMM             MMM      OOOOOOO     DDDDDDDDDDD      EEEEEEEEEEEE
 MMM           MMM     OOOOOOOOOOO    DDDDDDDDDDDD    EEEEEEEEEEEE
 MMMM         MMMM    OOOO      OOO   DDD       DDD   EEE        E
 MMMMM       MM MM    OOO        OO   DDD        DD   EEE 
 MMM MM     MM  MM    OOO        OO   DDD        DD   EEE 
 MMM  MM   MM   MM    OOO        OO   DDD        DD   EEE 
 MMM   MM MM    MM    OOO        OO   DDD        DD   EEEEEEEEE 
 MMM    MMM     MM    OOO        OO   DDD        DD   EEEEEEEEE 
 MMM     M      MM    OOO        OO   DDD        DD   EEE 
 MMM            MM    OOO        OO   DDD        DD   EEE 
 MMM            MM    OOOO      OOO   DDD       DDD   EEE        E
MMMMM          MMMM    OOOOOOOOOOO   DDDDDDDDDDDDD    EEEEEEEEEEEE  HJB 
MMMMM          MMMM      OOOOOOO     DDDDDDDDDDD      EEEEEEEEEEEE  ACS 
  
  
  
?_$J+ 
* * * * * * * * * * * * * * * * * * * * * * * * 
*                                             * 
*               P T A C H T M R               * 
*                                             * 
*       START/STOP THE CHARACTER TIMER        * 
*                                             * 
* * * * * * * * * * * * * * * * * * * * * * * * 
* 
?_$I+,R-,G-     NON-INTERRUPTABLE, NON-RECURSIVE
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE STARTS OR STOPS THE CHARACTER TIMER. THIS  * 
*             TIMER WILL START AS SOON AS THE FIRST CHARACTER IS      * 
*             RECEIVED AND WILL REPORT A TIME OUT IF TWO CONSECUTIVE  * 
*             CHARACTERS ARE NOT RECEIVED WITHIN A N * 100 MILLI-     * 
*             SECOND PERIOD.                                          * 
*                                                                     * 
** INPUT    - LCB ADDRESS AND TIMER VALUE (0 = OFF)  (PARAMETERS)     * 
*             GLOBAL MSTFRST - BEGIN TIMER CHAIN                      * 
*                                                                     * 
** OUTPUT   - LCB ADDED/DELETED TO/FROM TIMER CHAIN                   * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTTERMIO    - TERMINATE INPUT/OUTPUT                    * 
*             PTINPUT     - START ASYNC INPUT                         * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             NONE                                                    * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTACHTMR (A4LCBP : BZLCBP; A4CHTMR : INTEGER);
  
VAR 
  A4LCBIP   : 'BZLCBP;                      _POINTER TO LCB POINTER    ?
  
BEGIN 
A4LCBP'.BZACTRSET := A4CHTMR;               _SET TIMER VALUE IN LCB    ?
A4LCBP'.BZACTIMR  := A4CHTMR + 1; 
_ 
* * * *  LOCATE CURRENT LCB IN THE TIMER CHAIN
? 
ADDR (MSTFRST, A4LCBIP);                    _SET POINTER TO FIRST PTR  ?
10: 
IF A4LCBIP' " NIL 
THEN                                        _NOT END OF CHAIN          ?
  BEGIN 
  IF A4LCBIP' " A4LCBP                      _AND NOT CURRENT LCB       ?
  THEN
    BEGIN 
    ADDR (A4LCBIP''.BZACTCHN, A4LCBIP);     _SET POINTER TO NEXT ONE   ?
    GOTO 10;                                _GO TEST THE NEXT LCB      ?
    END;
 _ELSE? 
_ 
* * * *  FOUND CURRENT LCB IN THE TIMER CHAIN, TEST FOR REMOVAL 
? 
    IF A4CHTMR = 0                          _WANT TO REMOVE THE LCB    ?
    THEN
      A4LCBIP' := A4LCBP'.BZACTCHN;         _REMOVE IT                 ?
  END  _IF A4LCBIP' " NIL THEN? 
ELSE
_ 
* * * *  CURRENT LCB NOT FOUND IN THE CHAIN, TEST FOR INSERTION 
? 
  IF A4CHTMR " 0                            _WANT TO INSERT THE LCB    ?
  THEN
    BEGIN 
    A4LCBIP'         := A4LCBP;             _INSERT IT                 ?
    A4LCBP'.BZACTCHN := NIL;                _CLEAR CHAIN WORD ADDED LCB?
    END;
END; _PROCEDURE PTACHTMR? 
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * 
*                                             * 
*               P T M S C A N                 * 
*                                             * 
*       SCAN CHARACTER TIMER CHAIN            * 
*                                             * 
* * * * * * * * * * * * * * * * * * * * * * * * 
* 
?_$I-,R-,G-     NON-RECURSIVE, INTERRUPTABLE
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE IS CALLED BY TIMING SERVICES EVERY 100     * 
*             MILLISECONDS, AND SCANS THE TIMER CHAIN FOR EXPIRED     * 
*             CHARACTER TIMERS (STARTED BY PTACHTMR)                  * 
*                                                                     * 
** INPUT    - MSTFRST - BEGIN TIMER CHAIN                             * 
*                                                                     * 
** OUTPUT   - WORKLIST SEND TO ASYNCTIP, TIMER CHAIN UPDATED          * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PB100MS     - 100 MILLISECOND TIMER SERVICES            * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PBLSPUT     - SEND MMCHOUT WORKLIST TO MUX LEVEL TIP    * 
*                                                                     * 
** NOTE     - USER TIPS THAT WANT TO USE THE CHARACTER TIMER LOGIC    * 
*             MUST RESERVE THE FIRST TWO WORDS OF THE TIPS OVERLAY    * 
*             OF THE LINE CONTROL BLOCK.                              * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTMSCAN;
  
VAR 
  A4CURLCB  : BZLCBP; 
  A4LCBIP   : 'BZLCBP;
  A4TMRCNT  : INTEGER;
  
BEGIN 
ADDR (MSTFRST, A4LCBIP);                    _SET PTR TO FIRST LCB PTR  ?
10: 
WHILE A4LCBIP' " NIL DO 
  BEGIN 
  A4CURLCB := A4LCBIP';                     _GET POINTER TO CURRENT LCB?
  A4TMRCNT := A4CURLCB'.BZACTIMR - 1;       _DECREMENT COUNTER         ?
  IF A4TMRCNT = 0 
  THEN                                      _TIMER EXPIRED             ?
    BEGIN 
    WITH NAPORT' [A4CURLCB'.BZLINO.BDPORT]. 
         NALCBP' DO                         _INDEX TO MUX LCB          ?
      IF NCCAREC
      THEN
        BEGIN                               _CHARACTER RECEIVED        ?
        NCCAREC  := FALSE;
        A4TMRCNT := A4CURLCB'.BZACTRSET;    _RESTART TIMER             ?
        END 
      ELSE                                  _NO CHARACTER RECEIVED     ?
        IF NCINPRO                          _AND INPUT IN PROGRESS     ?
        THEN
_ 
* * * *  CHARACTER TIMER TIMED OUT, MAKE WLE TO MUX LEVEL TIP 
? 
          BEGIN 
          A4LCBIP' := A4CURLCB'.BZACTCHN;   _REMOVE ENTRY FROM CHAIN   ?
          WITH BWWLENTRY [RTCLK].B0EWLQ DO  _INTERMEDIATE ARRAY        ?
            BEGIN 
            MMWKCODE  := MMCHOUT;           _INSERT WORKCODE           ?
            MMLINO    := A4CURLCB'. 
                         BZLINO.BDLINO;     _INSERT LINE NUMBER        ?
            END;
          PBLSPUT (BWWLENTRY [RTCLK], 
                   BYWLCB [MMEWLQ]);        _SEND WL TO MUX LEVEL TIP  ?
          INST ($E400,N2P3INTAD,$BA2);      _FORCE MUX INTERRUPT       ?
          GOTO 10;                          _PROCESS NEXT LCB IN CHAIN ?
          END;
    END; _IF A4TMRCNT = 0?
  A4CURLCB'.BZACTIMR := A4TMRCNT;           _INSERT DECREMENTED COUNT  ?
  ADDR (A4CURLCB'.BZACTCHN, A4LCBIP);       _SET PTR TO NEXT LCB PTR   ?
  END; _WHILE A4LCBIP' " NIL DO?
END; _PROCEDURE PTMSCAN?
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * 
*                                             * 
*             P T A T P R E L                 * 
*                                             * 
*      RELEASE TEXT PROCESSING INFORMATION    * 
*                                             * 
* * * * * * * * * * * * * * * * * * * * * * * * 
* 
?_$I-,R-,G-     INTERRUPTABLE, NON-RECURSIVE. 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE RELEASE ALL BUFFERS ASSOCIATED WITH        * 
*             CURRENT TEXT PROCESSING                                 * 
*                                                                     * 
** INPUTS   - TCB POINTER (PARAMETER)                                 * 
*                                                                     * 
** OUTPUT   - BUFFERS RELEASED                                        * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTATOUTPUT  - TERMINATE OUTPUT                          * 
*             PTPREOUT    - PRE OUTPUT PROCESSING                     * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PTTPRSMRK   - RELEASE BUFFER WITH TPMARKS               * 
*             PBRELZRO    - RELEASE BUFFER CHAIN                      * 
*             PBREL1BF    - RELEASE A SINGLE BUFFER                   * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTATPREL (A4TCBP : B0BUFPTR); 
  
VAR 
  A4TPCBP : B0BUFPTR;                       _POINTER TO TPCB           ?
  
BEGIN 
A4TPCBP := A4TCBP'.BSTCB.BSATPCBP;          _PICK UP POINTER TO TPCB   ?
IF A4TPCBP " NIL                            _TPCB ASSIGNED             ?
THEN
  BEGIN 
  PBRELZRO (A4TPCBP'.BGMLCB.NCFSBA,         _RELEASE POSSIBLE SOURCE   ?
            BEDBSIZE);
  IF A4TCBP'.BSTCB.BSAMARK " NIL            _BUFFER WITH TPMARKS       ?
  THEN
    PTTPRSMRK (A4TCBP'.BSTCB.BSAMARK, TRUE);_RELEASE THE BUFFER        ?
  PBREL1BF (A4TCBP'.BSTCB.BSATPCBP,         _RELEASE THE TPCB BUFFER   ?
            BETPSIZE);
  END;
END; _PROCEDURE PTATPREL? 
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * 
*                                             * 
*             P T A T O U T P U T             * 
*                                             * 
*              TERMINATE OUTPUT               * 
*                                             * 
* * * * * * * * * * * * * * * * * * * * * * * * 
* 
?_$I-,R-,G-     INTERRUPTABLE, NON-RECURSIVE. 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE TERMINATES OUTPUT AND RELEASES ALL         * 
*             PENDING OUTPUT BUFFERS                                  * 
*                                                                     * 
** INPUTS   - TCB POINTER (PARAMETER)                                 * 
*                                                                     * 
** OUTPUT   - OUTPUT TERMINATED, DELAY TIMER KILLED,                  * 
*             A2WTOUTP WORKLIST SENT TO OPS LEVEL (IF OUTPUT ACTIVE)  * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTTERMIO    - TERMINATE INPUT/OUTPUT                    * 
*             PTPSTINPUT  - POST INPUT PROCESS (USER BREAK SEEN)      * 
*             PTADLTS     - DOWNLINE TIP SERVICES (D/L ABORT)         * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PMCDRV      - COMMAND DRIVER                            * 
*             PBRELZRO    - RELEASE BUFFER CHAIN                      * 
*              PTATPREL    - RELEASE TEXT PROCESSING BUFFERS          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTATOUTPUT (A4TCBP : B0BUFPTR); 
  
CONST 
*CALL ASYNCON 
  
VAR 
  A4TOCMD : NKINCOM;                        _COMMAND PACKET            ?
  
VALUE 
  A4TOCMD = ($0BC0,0,A2WTOUTP); 
  
BEGIN 
WITH A4TOCMD DO 
  BEGIN 
  NKWLINDX := B0ASYNC;                      _WORKLIST TO OPS LEVEL TIP ?
  WITH A4TCBP'.BSTCB.BSLCBPTR' DO 
    BEGIN 
    BZWTCOUNT := BZWTCOUNT + 1;             _STOP POSSIBLE ACTIVE DELAY?
    NKLINO    := BZLINO.BDLINO;             _INSERT LINE NUMBER        ?
    END;
  END; _WITH A4TOCMD DO?
WITH A4TCBP'.BSTCB DO 
  BEGIN 
  IINT;                                     _INHIBIT INTERRUPTS        ?
  BSACMCTR   := 0;
  BSACMSTACK := 0;                          _EMPTY CANNED MSG STACK    ?
  IF BSAOUSTAT \ A2SOWLACT
  THEN                                      _OUTPUT CURRENTLY ACTIVE   ?
    BEGIN 
    BSAOUSTAT := A2SOTOACT;                 _WAIT FOR TERMINATE OUTPUT ?
    PMCDRV    (A4TOCMD);                    _ISSUE TERMINATE OUTPUT CMD?
    END;
  EINT;                                     _ENABLE INTERRUPTS         ?
  PBRELZRO (BSAOUBUF, BEDBSIZE);            _RELEASE PENDING OUTPUT    ?
  PTATPREL (A4TCBP);                        _RELEASE ALL TP BUFFERS    ?
  END; _WITH A4TCBP'.BSTCB DO?
END; _PROCEDURE PTATOUTPUT? 
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * 
*                                             * 
*               P T A C M S G                 * 
*                                             * 
*       ISSUE COMMEND TO SEND CANNED MESSAGE  * 
*                                             * 
* * * * * * * * * * * * * * * * * * * * * * * * 
* 
?_$I+,R-,G-     NON-INTERRUPTABLE, NON-RECURSIVE. 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE SENDS THE OLDEST CANNED MESSAGE FROM       * 
*             THE TCB STACK (BSACMSTACK) TO THE TERMINAL              * 
*                                                                     * 
** INPUT    - TCB POINTER (PARAMETER)                                 * 
*                                                                     * 
** OUTPUT   - OUTPUT COMMAND ISSUED TO SEND MESSAGE                   * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTASEND     - SEND/QUEUE GIVEN CANNED MESSAGE           * 
*             PTASYNCTIP  - WORKLIST A2WOUBX, OUTPUT BUFFER XMITTED   * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PTAEPLX     - TURN ECHOPLEX OFF                         * 
*             PMCDRV      - COMMAND DRIVER                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTACMSG (A4TCBP : B0BUFPTR);
  
CONST 
*CALL ASYNCON 
_ 
* * * *  LAST CHARACTER DISPLACEMENT FOR CR/LF MESSAGE WITHOUT NULLS
? 
  A2LCD     = 4;                            _LCD FOR CR/LF NO NULLS    ?
  
VAR 
  A4CMDOUT  : NKINCOM;                      _OUTPUT COMMAND PACKET     ?
  A4CMMSG   : INTEGER;                      _CANNED MESSAGE INDEX      ?
  A4IDLES   : INTEGER;                      _CR/LF IDLE NULLS          ?
  
VALUE 
  A4CMDOUT  = ($700); 
  
BEGIN 
WITH A4TCBP'.BSTCB, A4CMDOUT DO             _INDEX TCB AND COMMAND PKT ?
  BEGIN 
_ 
* * * *  SEND OUT CANNED MESSAGE IF OUTPUT CURRENTLY NOT ACTIVE 
? 
  IF NOT (BSABFACT ! BSACMACT)              _IF NOT OUTPUTING          ?
  THEN
    BEGIN 
    A4CMMSG := BSACMMSG;                    _GET CANNED MESSAGE INDEX  ?
    NKOBP   := A4CMAPTR' [BSCODE, A4CMMSG]; _GET POINTER TO CANNED MSG ?
    IF A4CMMSG @ A2MLF
    THEN                                    _CANNED MSG IS CR OR LF    ?
      IF BSTCLASS " N02741                  _AND NOT FOR 2741          ?
      THEN
_ 
* * * *  CALCULATE LCD FOR CANNED CR/LF DEPENDING ON REQUIRED NR IDLES
*        (NOTE: CHANGING THE LCD IN THE CANNED MSG WORKS BECAUSE PMCDRV 
*         MOVES THE LCD INTO THE MUX-LCB, PRIOR TO STARTING THE OUTPUT) 
? 
        BEGIN 
        A4IDLES := BSLFIDLES;               _GET LF IDLE NULLS         ?
        IF A4CMMSG = A2MCR
        THEN
          A4IDLES := BSCRIDLES;             _GET CR IDLE NULLS         ?
        NKOBP'.BFLCD := A4IDLES + A2LCD;    _SET LCD IN CANNED CR/LF   ?
        END;
    NKLINO := BSLCBP'.BZLINO.BDLINO;        _INSERT LINE NUMBER        ?
    BSACMACT := TRUE;                       _OUTPUTTING CANNED MSG     ?
    PMCDRV    (A4CMDOUT);                   _ISSUE OUTPUT COMMAND      ?
    END;
  END; _WITH A4TCBP'.BSTCB, A4CMDOUT DO?
END; _PROCEDURE PTACMSG?
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * 
*                                             * 
*               P T A R T S                   * 
*                                             * 
*       RAISE/DROP RTS FOR FLOW CONTROL       * 
*                                             * 
* * * * * * * * * * * * * * * * * * * * * * * * 
* 
?_$I+,R-,G-     NON-INTERRUPTABLE, NON-RECURSIVE. 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE SENDS A NKCONTROL PACKET TO THE            * 
*             COMMAND DRIVER TO RAISE OR DROP RTS.                    * 
*                                                                     * 
** INPUT    - TCB POINTER, ON/OFF FLAG                                * 
*                                                                     * 
** OUTPUT   - COMMAND DRIVER CALLED AND RTS DROPPED OR RAISED         * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTASYNCTIP  - WORKLIST A2WREGL, INPUT REGULATION        * 
*                           WORKLIST A2WEOP/L/B, SEND XOFF            * 
*             PTMXASYNCT  - WORKLIST A2WINACT, SEND XOFF              * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED - NONE                                   * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTARTS (A4TCBP : B0BUFPTR; A4ONOROFF : BOOLEAN);
  
VAR 
  A4CMDCNTRL: NKINCOM;                      _CONTROL COMMAND PACKET    ?
  
VALUE 
  A4CMDCNTRL= ($E00,$0,$100); 
  
BEGIN 
WITH A4CMDCNTRL DO                          _USING COMMAND PKT         ?
  BEGIN 
  NKSRF1 := A4ONOROFF;                      _SET RAISE OR DROP         ?
  NKLINO := A4TCBP'.BSTCB.BSLCBP' 
                   .BZLINO.BDLINO;          _INSERT LINE NUMBER        ?
  PMCDRV (A4CMDCNTRL);                      _ISSUE OUTPUT COMMAND      ?
  END; _WITH A4CMDCNTRL DO? 
END; _PROCEDURE PTARTS? 
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * 
*                                             * 
*               P T A S E N D                 * 
*                                             * 
*       SEND/QUEUE GIVEN CANNED MESSAGE       * 
*                                             * 
* * * * * * * * * * * * * * * * * * * * * * * * 
* 
?_$I+,R-,G-     NON-INTERRUPTABLE, NON-RECURSIVE. 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE SENDS CANNED MESSAGES TO THE TERMINAL      * 
*             IF OUTPUT IS ACTIVE WHILE CALLING THIS SUBROUTINE,      * 
*             THE CANNED MESSAGE WILL BE QUEUED IN A STACK IN THE     * 
*             TCB (BSACMSTACK), FROM WHICH IT WILL BE SENT AFTER      * 
*             OUTPUT COMLETION                                        * 
*                                                                     * 
** INPUT    - TCB POINTER, CANNED MESSAGE INDEX (PARAMETER)           * 
*                                                                     * 
** OUTPUT   - CANNED MESSAGE SENT OR PUT IN TCB STACK (BSACMSTACK)    * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTCURPOS    - PERFORM CURSOR POSITIONING                * 
*             PTALLOWINP  - ALLOW INPUT FOR PAPERTAPE/2741            * 
*             PTST2741    - SUBTIP FOR 2741                           * 
*             PTSTAUTO    - SUBTIP FOR AUTO RECOGNITION               * 
*             PTSTSTART   - START APPROPRIATE SUBTIP                  * 
*             PTASYNCTIP  - WORKLIST A0TIMEOUT, TIME OUT OCCURRED     * 
*                           WORKLIST A2WREGL, INPUT REGULATION        * 
*                           WORKLIST A2WEOP/L/B, SEND XOFF            * 
*             PTMXASYNCT  - WORKLIST A2WLF, SEND CR                   * 
*                           WORKLIST A2WBSLF, SEND CARET PROMPT       * 
*                           WORKLIST A2WINACT, SEND XOFF              * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PTACMSG     - SEND OUT TOP CANNED MESSAGE IN STACK      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTASEND (A4TCBP : B0BUFPTR; A4MSGINX : INTEGER);
  
VAR 
  A4CMCTR   : INTEGER;                      _CANNED MSG STACK COUNTER  ?
  A4CMMULT  : ARRAY [1..4] OF INTEGER;      _STACK POSITION MULTIPLIER ?
  
VALUE 
  A4CMMULT  = ($1,$10,$100,$1000);
  
BEGIN 
WITH A4TCBP'.BSTCB DO                       _INDEX TCB                 ?
  BEGIN 
_ 
* * * *  PUT CANNED MESSAGE IN CANNED MESSAGE STACK 
? 
  A4CMCTR := BSACMCTR + 1;
  IF A4CMCTR < 5                            _CANNED MSG STACK NOT FULL ?
  THEN
    BEGIN 
    BSACMCTR   := A4CMCTR;
    BSACMSTACK := A4CMMULT [A4CMCTR] *      _PUT CANNED MSG INTO STACK ?
                  A4MSGINX + BSACMSTACK;
_ 
* * * *  SEND OUT TOP STACK ENTRY IF CURRENTLY NO OUTPUT ACTIVE 
? 
    PTACMSG (A4TCBP);                       _START SENDING CANNED MSG  ?
    END; _IF A4CMCTR < 5? 
  END; _WITH A4TCBP'.BSTCB, A4CMDOUT DO?
END; _PROCEDURE PTASEND?
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * 
*                                             * 
*             P T A S Y N C T I P             * 
*                                             * 
*       BLOCK MODE ASYNCTIP (OPS LEVEL)       * 
*                                             * 
* * * * * * * * * * * * * * * * * * * * * * * * 
* 
?_$I-,R-,G-     INTERRUPTABLE, NON-RECURSIVE. 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - OPS LEVEL PASCAL PART OF THE ASYNCHRONOUS BLOCK MODE    * 
*             TIP. ALL OPS LEVEL WORKLIST ENTRIES ARE PROCESSED       * 
*             BY THIS MODULE.                                         * 
*                                                                     * 
** INPUT    - WORKLIST ENTRIES FROM:                                  * 
*                 1) SERVICE MODULE (SVM)                             * 
*                 2) BLOCK INTERFACE PROGRAM (BIP)                    * 
*                 3) TIMING SERVICES                                  * 
*                 4) MUX SUBSYSTEM                                    * 
*                 5) ASYNCTIP INPUT STATES                            * 
*                 6) ASYNCTIP MUX LEVEL PROCESSING                    * 
*                                                                     * 
** OUTPUT   - WORKLIST ENTRIES SEND TO SVM, COMMANDS ISSUED TO        * 
*             COMMAND DRIVER.                                         * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PBMON       - OPS LEVEL MONITOR                         * 
*                                                                     * 
** INTENAL SUBROUTINES (IN ORDER OF DECLARATION) -                    * 
*             PTEWAIT     - WAIT FOR EVENT COMPLETION                 * 
*             PTERETURN   - EVENT RETURN ROUTINE                      * 
*             PTDRETURN   - DELAY RETURN ROUTINE                      * 
*             PTOWAIT     - EXCLUSIVE OUTPUT COMPLETION WAIT          * 
*             PTTSRETURN  - TERMIO/SUBROUTINE RETURN ROUTINE          * 
*             PTCHDELAY   - DELAY LINE FOR GIVEN NR CHARACTER TIMES   * 
*             PTRELOUT    - RELEASE ALL CURRENT TCB OUTPUT            * 
*             PTTERMIO    - TERMINATE INPUT/OUTPUT                    * 
*             PTSTIMER    - START HALF SECOND TIMER                   * 
*             PTLINDOWN   - BRING LINE DOWN                           * 
*             PTCLAINIT   - INITIALIZE SPEED/PARITY/CHARLEN IN CLA    * 
*             PTINPUT     - START INPUT                               * 
*             PTIREGL     - TEST FOR INPUT REGULATION                 * 
*             PTPREOUT    - PRE OUTPUT PROCESSING                     * 
*             PTCURPOS    - PERFORM CURSOR POSITIONING                * 
*             PTPSTINPUT  - POST INPUT PROCESSING                     * 
*             PTALLOWINP  - TEST FOR / ALLOW INPUT FOR PT OR 2741     * 
*             PTSTTTY     - SUBTIP FOR TTY/DISPLAY                    * 
*             PTSTPTTTY   - SUBTIP FOR PAPERTAPE MODE TTY             * 
*             PTST2741    - SUBTIP FOR 2741                           * 
*             PTSTAUTO    - SUBTIP FOR AUTO RECOGNITION               * 
*             PTSTSTART   - (RE)START THE SUBTIP                  ?_$J+ 
*                                                                     * 
** EXTERNAL SUBROUTINES REFERENCED BY MAIN TIP -                      * 
*             PTACHTMR    - START/STOP CHARACTER TIMER                * 
*             PTAEPLX     - TURN ECHOPLEX ON/OFF                      * 
*             PTACMSG     - SEND CANNED MESSAGE                       * 
*             PTASEND     - QUEUE/SEND CANNED MESSAGE                 * 
*             PBLCBP      - GET ADDRESS OF LCB                        * 
*             PBGET1BF    - GET A BUFFER                              * 
*             PBREL1BF    - RELEASE A BUFFER                          * 
*             PBRELCHN    - RELEASE CHAIN OF BUFFERS                  * 
*             PBRELZRO    - RELEASE POSSIBLE CHAIN OF BUFFERS         * 
*             PBCLR       - CLEAR A BUFFER                            * 
*             PBLSPUT     - SEND A WORKLIST ENTRY                     * 
*                                                                     * 
** NAMING CONVENTIONS (PREFIXES)                                      * 
*             PT....   PROCEDURE/FUNCTION NAMES                       * 
*             BZA...   FIELDS IN LCB                                  * 
*             BSA...   FIELDS IN TCB                                  * 
*             A2....   CONSTANTS                                      * 
*             A3....   FIELDS IN TYPES                                * 
*             A4....   VARIABLES                                      * 
*             AS....   STATE PROGRAM TABLES                           * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTASYNCTIP; 
  
LABEL 
  100,                                      _INPUT REGULATION EXIT     ?
  999;                                      _RETURN TO OPS MONITOR     ?
  
CONST 
  FOREVER   = FALSE;                        _REPEAT/UNTIL FOREVER LOOP ?
*CALL ASYNCON 
_ 
* * * *  ASYNC SUBTIP START REASONS (FIELD BSASSRSN IN TCB) 
? 
  A2SRAUTO  = 1;                            _ENABLE LINE AUTO RECOGN.  ?
  A2SRCTCB  = 2;                            _CONFIGURE TCB             ?
  A2SRDIVT  = 3;                            _DOWNLINE IVT COMMAND      ?
  A2SRUIVT  = 4;                            _UPLINE IVT COMMAND        ?
  A2SREOX   = 5;                            _END OF TRANSPARENT INPUT  ?
  A2SRWAIT  = 6;                            _START OF WAIT.. REGULATION?
  A2SRREGL  = 7;                            _END OF REPEAT.. REGULATION?
  A2CFDPX   = 8;                            _CONTINUE FULL DUPLEX MODE ?
_ 
* * * *  LINE DELAY VALUES IN MILLISECONDS (FROM 10 TO 13,000)
*        (ACTUAL DELAY IS IN 9600 BPS CHARACTER TIMES)
? 
  A2DLMINIM = 10;                           _MINIMUM VALID DELAY       ?
  A2DLBREAK = 250;                          _DELAY AFTER BREAK KEY     ?
  A2DL75X   = 100;                          _CLEAR SCREEN DELAY TC=2   ?
  A2DL4014  = 960;                          _CLEAR SCREEN DELAY TC=8   ?
_ 
* * * *  LINE DOWN ERROR REASONS
? 
  A2ERRESET = 1;                            _RESET ERROR REASON        ?
  A2ERAUTO  = 2;                            _AUTO RECOGNITION FAILED   ?
  A2ERHARD  = 3;                            _HARD ERROR OCCURRED       ?
  A2ERDIS   = 4;                            _DISABLE RECEIVED FROM SVM ?
  A2ERDTCB  = 5;                            _DELETE TCB FROM SVM       ?
_ 
* * * *  TERMINATE INPUT/OUTPUT CONSTANTS (PTTERMIO PARAMETERS) 
? 
  A2TINPUT  = FALSE;                        _TERMINATE INPUT ONLY      ?
  A2TINOUT  = TRUE;                         _TERMINATE INPUT AND OUTPUT?
  A2NOTDEL  = $0024;                        _FLAG FOR DELTCB PROCESS   ?
  A2DELT    = $0124;                        _AND A2WTERMIO WORKCODE    ?
_ 
* * * *  INPUT BLOCK STATES (FIELD BSABLSTAT IN TCB)
? 
  A2EOBRCVD = 0;                            _END OF BLOCK RECEIVED     ?
  A2EOLRCVD = 1;                            _END OF LINE RECEIVED      ?
  A2EOPRCVD = 2;                            _END OF PHYS. LINE RECEIVED?
_ 
* * * *  CURSOR POSITIONING CONTROLS (PARAMETER FOR ROUTINE PTCURPOS) 
? 
  A2CPNO    = 0;                            _NO CURSOR POSITIONING     ?
  A2CPCR    = 1;                            _CARRIAGE RETURN           ?
  A2CPLF    = 2;                            _LINE FEED                 ?
  A2CPCL    = 3;                            _CARRIAGE RETURN/LINE FFED ?
_ 
* * * *  UPLINE TIP SERVICES FLAGWORD CONSTANTS 
? 
  A2FWSEND  = $202;                         _SEND AS MSG               ?
  A2FWBLOCK = $1;                           _PROCESS AS BLK            ?
  A2FWBREAK = $292;                         _BREAK DETECTED            ?
  A2FWPTURN = $252;                         _SEND AS MSG, TEST PAGETURN?
  
VAR 
  A4TIPNAME : PACKED ARRAY [0..7] OF CHAR;  _NAME (ASYNCTIP) FOR DUMPS ?
  A4DBGI    : INTEGER;                      _INDEX TO NEXT WORKLIST    ?
  A4DBGA    : ARRAY [0..24] OF BWTIPWLE;    _SAVED WORKLIST ENTRY ARRAY?
  A4WRKCOD  : INTEGER;                      _RECEIVED OPS WORKCODE     ?
  A4LCBP    : BZLCBP;                       _CURRENT LCB POINTER       ?
  A4TCBP    : B0BUFPTR;                     _CURRENT TCB POINTER       ?
  A4BUFP    : B0BUFPTR;                     _CURRENT BUFFER POINTER    ?
  A4EVRETAD : INTEGER;                      _EVENT RETURN ADDRESS      ?
  A4INRCVD  : BOOLEAN;                      _INPUT RECEIVED FLAG       ?
  A4FLGWRD  : KTULTSFLAG;                   _UPLINE TIP SERVICES FLAG  ?
 _A4SRSET   : SET OF 0..15;?                _CURRENT START REASONS     ?
  A4REGLVL  : INTEGER;                      _PREV/CURRENT REGUL. LEVEL ?
  A4CURGLV  : INTEGER;                      _CURRENT REGULATION LEVEL  ?
  A4LCWTCNT : INTEGER;                      _CURRENT WAIT COUNT (LCB)  ?
  A4CMDOPS  : NKINCOM;                      _COMMAND PACKET OPS LEVEL  ?
  A4WORK    : B0OVERLAY;                    _WORK WORD                 ?
  A4CSDELAY : ARRAY [N0713..N0T4014]        _CLEAR SCREEN DELAYS FOR TC?
              OF INTEGER; 
  
VALUE 
  A4TIPNAME = (#ASYNCTIP#); 
  A4CSDELAY = (A2DL75X,0,0,0,0,0,A2DL4014); _CLR SCREEN DELAYS TC=2..8 ?
  
_FORWARD? 
  PROCEDURE PTSTSTART (A4SSRSN : INTEGER);  FORWARD;
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T X W A I T       -   SAVE RETURN ADDRESS, WAIT AND EXIT   * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T X R E T U R N   -   RETURN TO VARIOUS RETURN ADDRESSES   * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THESE ROUTINES SAVE THE VARIOUS RETURN ADDRESSES AND    * 
*             EXIT TO MONITOR (PTXWAIT) OR RETURN TO THE VARIOUS      * 
*             SAVED RETURN ADDRESSES AFTER COMPLETION OF THE AWAITED  * 
*             EVENT (PTXRETURN) WITHOUT LOSING THE CALLERS INDEX      * 
*             REGISTERS TO THE TCB AND THE LCB (WITH A4TCBP'... DO)   * 
*                                                                     * 
** INPUT    - POINTERS TO LCB AND TCB SET UP                          * 
*                                                                     * 
** OUTPUT   - INDEX REGISTERS ARE LEFT UNCHANGED                      * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PBRELZRO    - RELEASE POSSIBLE CHAIN OF BUFFERS         * 
*                                                                     * 
** NOTES    - THESE PROCEDURES DO NOT RETURN TO ITS CALLER. EXCEPT    * 
*             FOR THE PTXRETURNS IF THE RETURN ADDRESS HAS BEEN       * 
*             CANCELLED (SET TO ZERO)                                 * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * *   E V E N T   C O M P L E T I O N   W A I T / R E T U R N 
* 
*         EVENTS ARE: INPUT/OUTPUT COMPLETION, OUTPUT QUEUED, 
*                     AUTO RECOGNITION EVENT, TIMER EVENT,
*                     OUTPUT REGULATION XON RECEIVED. 
? 
PROCEDURE PTEWAIT;
BEGIN 
RETADR (A4LCBP'.BZRET1ADDR);                _SAVE EVENT RETURN ADDRESS ?
GOTO EXIT 999;                              _RETURN TO MONITOR         ?
END; _PROCEDURE PTEWAIT?
  
  
PROCEDURE PTERETURN;
BEGIN 
A4EVRETAD  := A4LCBP'.BZRET1ADDR;           _GET EVENT RETURN ADDRESS  ?
IF A4EVRETAD " 0
THEN
  RETURN (A4EVRETAD);                       _SET TO RETURN ADDRESS 1   ?
A4LCBP'.BZRET1ADDR := 0;                    _CANCEL EVENT RETURN       ?
END; _PROCEDURE PTERETURN?
  
_ 
* * * *   C H A R - D E L A Y   C O M P L E T I O N   R E T U R N 
? 
PROCEDURE PTDRETURN;
BEGIN 
RETURN (A4TCBP'.BSTCB.BSADRETADR);          _SET TO RETURN ADDRESS     ?
END; _PROCEDURE PTDRETURN?
  
_ 
* * * *   E X C L U S I V E   O U T P U T   C O M P L .   W A I T 
* 
*         INPUT EVENTS DURING THIS WAIT ARE IGNORED 
? 
PROCEDURE PTOWAIT;
BEGIN 
RETADR (A4TCBP'.BSTCB.BSAORETADR);          _SET TO OUTPUT RETURN ADDR ?
WHILE A4TCBP'.BSTCB.BSAOUSTAT " 0 DO        _WHILE OUTPUT STILL ACTIVE ?
  BEGIN 
  PTEWAIT;                                  _WAIT FOR ANY EVENT        ?
  IF A4INRCVD 
  THEN
    PBRELZRO (A4BUFP, BEDBSIZE);            _RELEASE POSSIBLE INPUT    ?
  END; _WHILE?
RETURN (A4TCBP'.BSTCB.BSAORETADR);          _RETURN TO ORIGINAL CALLER ?
END; _PROCEDURE PTOWAIT?
  
_ 
* * * *   S U B R / T E R M I O   C O M P L E T I O N   R E T U R N 
? 
PROCEDURE PTTSRETURN; 
BEGIN 
RETURN (A4LCBP'.BZRET2ADDR);                _SET TO SUBR RETURN ADDRESS?
END; _PROCEDURE PTTSRETURN? 
  
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*       P T C H D E L A Y   -   DELAY LINE FOR N CHARACTER TIMES      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE DELAYS LINE ACTIVITY FOR A GIVEN NUMBER    * 
*             OF CHARACTER TIMES, AND RETURNS TO THE CALLER AFTER     * 
*             THE DELAY HAS EXPIRED. THE MAXIMUM NR CHARACTER DELAYS  * 
*             IS 9, IF A NUMBER GREATER THAN 9 IS PASSED, A DELAY     * 
*             OF APPROXIMATELY N MILLISECONS IS ASSUMED               * 
*                                                                     * 
** INPUT    - TIME TO DELAY IN CHARACTER TIME UNITS (PARAMETER)       * 
*                                                                     * 
** OUTPUT   - TIMER STARTED, PACKET PTR STORED IN PACKET              * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTSTAUTO    - SUBTIP FOR AUTO RECOGNITION               * 
*             PTASYNCTIP  - WORKLIST A2WOUBX, OUTPUT BUFFER XMITTED   * 
*                         - WORKLIST A2WTERMIO, I/O TERMINATED        * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PBGET1BF    - GET A BUFFER (FOR TIMER PACKET)           * 
*             PBTMRSRVS   - TIMER SERVICES INTERFACE                  * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTCHDELAY (A4DELAY : INTEGER);
  
VAR 
  A4DLY     : PACKED RECORD 
              CASE A3I : INTEGER OF 
                1: (A3DLY   : INTEGER);     _DELAY IN 5/24 MS UNITS    ?
                2: (A3DLYTM : B012BITS;     _DELAY IN 10/3 MS UNITS    ?
                    A3DLYFL : B04BITS); 
              END;
  A4CHDELAY : ARRAY [N0800..N03200]         _CHAR DELAY FOR BZLNSPD    ?
              OF INTEGER;                   _ IN 5/24 MILLISEC UNITS   ?
  A4CDINX   : INTEGER;                      _CHAR DELAY ARRAY INDEX    ?
  A4BPTP    : RECORD CASE A3I : INTEGER OF
                1: (A3BP : B0BUFPTR); 
                2: (A3TP : B7PKTPTR); 
              END;
  
VALUE 
  A4CHDELAY = (528,     _LO AUTOREC?
               528,     _ 110   BPS?
               320,     _ 134.5 BPS?
               320,     _ 150   BPS?
               160,     _ 300   BPS?
                80,     _ 600   BPS?
                40,     _1200   BPS?
                20,     _2400   BPS?
                10,     _4800   BPS?
                 5,     _19200  BPS?
                 5,     _38400  BPS?
                80);    _HI AUTOREC?
  
BEGIN 
  A4CDINX := A4LCBP'.BZLNSPD;               _GET CHAR DELAY INDEX      ?
  IF A4DELAY \ A2DLMINIM
  THEN                                      _DELAY REQUEST IN MILLISECS?
    A4CDINX := N09600;                      _ USE 9600 BPS INDEX       ?
  A4DLY.A3DLY := A4CHDELAY [A4CDINX] *
                 A4DELAY;                   _GET 3.3 MS BASED DELAY    ?
_ 
* * * *  UPDATE CONTENTION COUNTER IN LCB, SAVE RETURN ADDRESS IN TCB 
? 
  A4LCWTCNT         := A4LCWTCNT + 1;       _BUMP CONTENTION COUNTER   ?
  A4LCBP'.BZWTCOUNT := A4LCWTCNT;           _AND INSERT IT IN THE LCB  ?
  RETADR (A4TCBP'.BSTCB.BSADRETURN);        _SAVE CALLERS RETURN ADDRES?
_ 
* * * *  GET BUFFER FOR PACKET, INITIALIZE IT 
? 
  WITH A4BPTP DO
    BEGIN 
    A3BP            := PBGET1BF (B0S8);     _GET TIMER PACKET BUFFER   ?
    A3TP'.BK2UPTR   := A3BP;                _INSERT PKT PTR IN PACKET  ?
    A3TP'.BKTYPE    := BKSET; 
    A3TP'.BKWKCODE  := A2WDELAY;            _INSERT FUTURE WORKCODE    ?
    A3TP'.BKWLINDX  := B0ASYNC;             _INSERT WORKLIST RECEIVER  ?
    A3TP'.BK1USRWRD := A4CMDOPS.NKLINO;     _INSERT LINE NUMBER        ?
    A3TP'.BKTIME    := A4DLY.A3DLYTM + 3;   _INSERT DELAY (10 MS MINIM)?
    A3TP'.BKUSRBYTE := A4LCWTCNT;           _INSERT WAIT COUNT         ?
_ 
*        START THE TIMER, RETURN TO OPS MONITOR 
? 
    PBTMRSRVS (A3TP);                       _START THE TIMER           ?
    END;
  GOTO EXIT 999;                            _RETURN TO OPS MONITOR     ?
END; _PROCEDURE PTCHDELAY?
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T T E R M I O   -   TERMINATE INPUT AND OUTPUT             * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE TERMINATES INPUT AND OUTPUT ON THE LINE    * 
*             AND RETURNS TO THE CALLER AFTER I/O IS TERMINATED       * 
*                                                                     * 
** INPUT    - LCB AND TCB ADDRESSES, PARAMETER TO SPECIFY IF INPUT    * 
*             ONLY OR BOTH INPUT AND OUTPUT MUST BE TERMINATED        * 
*             PARAMETER TO SPECIFY IF RETURN TO A0SMDLTCB.
*                                                                     * 
** OUTPUT   - I/O TERMINATED.                                         * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTLINDOWN   - BRING ASYNC LINE DOWN                     * 
*             PTSTSTART   - START APPROPRIATE SUBTIP                  * 
*             PTASYNCTIP  - WORKLIST A0SMDLTCB, DELETE TCB            * 
*                           WORKLIST A2WREGL, INPUT REGULATION        * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PTACHTMR    - RESET CHARACTER TIMER                     * 
*             PMCDRV      - COMMAND DRIVER                            * 
*             PTATOUTPUT  - TERMINATE OUTPUT                          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTTERMIO (A4TIO : BOOLEAN; A4DELTCB : INTEGER); 
  
VAR 
  A4CMDTIO : NKINCOM;                       _COMMAND PACKET            ?
  
VALUE 
  A4CMDTIO = ($0AC0,0,A2WTERMIO); 
  
BEGIN 
WITH A4CMDTIO DO
  BEGIN 
  PTACHTMR (A4LCBP, A2CTRESET);             _STOP CHARACTER TIMER      ?
  A4LCBP'.BZRET1ADDR := 0;                  _CANCEL EVENT RETURN       ?
  IF A4TIO
  THEN                                      _TERMINATE OUTPUT REQUESTED?
    PTATOUTPUT (A4TCBP);                    _TERMINATE/RELEASE OUTPUT  ?
 _NKCMD    := NKENDIN;? 
 _NKRELBFS := TRUE;?                        _RELEASE INPUT BUFFERS     ?
 _NKWKFLG  := TRUE;?                        _REQUEST WORKLIST          ?
  NKWLINDX := B0ASYNC;
  NKLINO   := A4CMDOPS.NKLINO;              _INSERT LINE NUMBER        ?
  NKWD2.BAINT := A4DELTCB;                  _PASS WORKCODE AND DEL FLAG?
  PMCDRV (A4CMDTIO);                        _TERMINATE INPUT COMMAND   ?
  END; _WITH A4CMDTIO DO? 
RETADR (A4LCBP'.BZRET2ADDR);                _SAVE CALLERS RETURN ADDR  ?
GOTO EXIT 999;                              _RETURN TO MONITOR         ?
END; _PROCEDURE PTTERMIO? 
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T S T I M E R   -   START/STOP HALF SECOND TIMER           * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE STARTS OR STOPS THE HALF SECOND TIMER      * 
*                                                                     * 
** INPUT    - REASON FOR TIMER (PARAMETER)                            * 
*                                                                     * 
** OUTPUT   - TIMER STARTED/STOPPED, REASON FOR TIMER SET IN LCB      * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTLINDOWN   - BRING ASYNC LINE DOWN                     * 
*             PTALLOWINP  - ALLOW INPUT FOR PAPERTAPE/2741            * 
*             PTSTSTART   - START APPROPRIATE SUBTIP                  * 
*             PTASYNCTIP  - WORKLIST A0SMEN, ENABLE LINE              * 
*                           WORKLIST A0TIMEOUT, TIME OUT OCCURRED     * 
*                           WORKLIST A2WREGL, INPUT REGULATION        * 
*                           WORKLIST A2WEOP/L/B, START XON TIMER      * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             NONE                                                    * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTSTIMER (A4TMRSN : INTEGER); 
  
VAR 
  A4TMVALUE : ARRAY [A2TRRESET..A2TREVENT]  _TIMER VALUE FOR VARIOUS   ?
              OF INTEGER;                   _REASONS                   ?
  
VALUE 
  A4TMVALUE = (A2TMRESET,A2TMAUTO,A2TMIREGL,A2TMEVENT); 
  
BEGIN 
A4LCBP'.BZATMRSN := A4TMRSN;                _INSERT TIMER REASON IN LCB?
BLTIMTBL' [A4CMDOPS.NKPORT].
          BLTIME := A4TMVALUE [A4TMRSN];    _SET/RESET HALF SECOND TIMR?
END; _PROCEDURE PTSTIMER? 
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T L I N D O W N   -   BRING LINE DOWN                      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE BRINGS THE LINE DOWN BECAUSE OF THE        * 
*             OCCURRENCE OF AN ERROR, OR A HOST REQUEST               * 
*                                                                     * 
** INPUT    - LCB, TCB ADDRESSES, LINE NUMBER                         * 
*             REASON FOR BRINGING LINE DOWN (PARAMETERS)              * 
*                                                                     * 
** OUTPUT   - I/O TERMINATED, TIMER STOPPED, I/O BUFFERS RELEASED     * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTASYNCTIP  - WORKLIST A0SMDI, DISABLE LINE             * 
*                           WORKLIST A0HARDERR, HARD ERROR SEEN       * 
*                           WORKLIST AOTIMEOUT, AUTO REC TIME OUT     * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PTSTIMER    - STOP HALF SECOND TIMER                    * 
*             PTTERMIO    - TERMINATE I/O                             * 
*             PBREL1BF    - RELEASE A SINGLE BUFFER                   * 
*             PMCDRV      - COMMAND DRIVER                            * 
*             PBLSPUT     - SEND WORKLIST ENTRY                       * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTLINDOWN (A4ERRSN : INTEGER);
  
BEGIN 
A4LCBP'.BZAERRSN  := A4ERRSN;               _SAVE ERROR REASON IN LCB  ?
PTSTIMER (A2TRRESET);                       _STOP HALF SECOND TIMER    ?
IF A4TCBP " NIL 
THEN                                        _TCB ASSIGNED,             ?
  BEGIN 
  A4TCBP'.BSTCB.BSABRACT := FALSE;          _CLEAR BREAK ACTIVE        ?
  PTTERMIO (A2TINOUT,A2NOTDEL);             _TERMINATE INPUT/OUTPUT    ?
    A4TCBP'.BSTCB.BSAORACT := FALSE;        _CLEAR XOFF SEEN FLAG      ?
  IF A4TCBP'.BSTCB.BSASSRSN = A2SRAUTO
  THEN                                      _DOING AUTO RECOGNITION,   ?
    PBREL1BF (A4LCBP'.BZTCBPTR, BEDBSIZE);  _RELEASE AUTO REC TCB      ?
  END;
_ 
* * * *  ISSUE DISABLE LINE COMMAND, SEND WORKLIST TO SERVICE MODULE
? 
A4CMDOPS.NKCMD := NKDISL;                   _DISABLE LINE COMMAND      ?
PMCDRV (A4CMDOPS);                          _ISSUE DISABLE LINE CMD    ?
WITH BWWLENTRY [OPS].CMSMLEY DO 
  BEGIN 
  CMWKCODE := D0LINE;                       _LINE EVENT WORKCODE       ?
  CMDATA   := D5DISA;                       _PRESET FOR LINE DISABLED  ?
  IF A4LCBP'.BZAERRSN " A2ERDIS 
  THEN
    CMDATA := D5INOP;                       _LINE INOPERATIVE          ?
  END;
PBLSPUT (BWWLENTRY [OPS], 
         BYWLCB [B0SMWL]);                  _SEND WLE TO SVM           ?
GOTO EXIT 999;                              _RETURN TO MONITOR         ?
END; _PROCEDURE PTLINDOWN?
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T C L A I N I T   -   SET SPEED/PARITY/CHARLEN IN CLA      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE ISSUES A CONTROL COMMAND TO THE CLA IN     * 
*             ORDER TO ESTABLISH THE CORRECT LINE SPEED, CHARACTER    * 
*             PARITY AND CHARACTER LENGTH.                            * 
*                                                                     * 
** INPUT    - POINTERS TO LCB, TCB; LINE NUMBER                       * 
*                                                                     * 
** OUTPUT   - CLA CONDITIONED                                         * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTINPUT     - START ASYNC INPUT                         * 
*             PTSTAUTO    - SUBTIP FOR AUTO RECOGNITION               * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PMCDRV      - COMMAND DRIVER                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTCLAINIT;
  
VAR 
  A4CMDCTR  : NKINCOM;                      _CONTROL COMMAND PACKET    ?
  A4WORK    : B0OVERLAY;
  
VALUE 
  A4CMDCTR  = ($E00,0,$D0F,$1011,$1200);
  
BEGIN 
_ 
* * * *  BUILD AND ISSUE CONTROL COMMAND TO SET PARITY AND CHAR LENGTH
? 
WITH A4CMDCTR, A4WORK DO
  BEGIN 
 _NKSRF1 := FALSE;?                         _TURN OFF ECHOPLEX MODE    ?
  BAINT  := A4TCBP'.BSTCB.BSPARITY; 
  NKSRF2 := BA1BOL;                         _STORE LOWER BIT BSPARITY  ?
                                            _PARITY INHIBIT (NO PARITY)?
  NKSRF3 := BABOOL.B0B1;                    _STORE UPPER BIT BSPARITY  ?
                                            _PARITY SET (EVEN=1/ODD=0) ?
  BAINT  := A4TCBP'.BSTCB.BSCHLEN;
  NKSRF4 := BA1BOL;                         _STORE LOWER BIT BSCHLEN   ?
  NKSRF5 := BABOOL.B0B1;                    _STORE UPPER BIT BSCHLEN   ?
  NKLINO := A4CMDOPS.NKLINO;                _INSERT LINE NUMBER        ?
  END; _WITH A4CMDCTR, A4WORK DO? 
PMCDRV (A4CMDCTR);                          _ISSUE CONTROL COMMAND     ?
END; _PROCEDURE PTCLAINIT?
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T I N P U T   -   START INPUT BASED ON IVT SETTINGS        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE BUILDS AND ISSUES AN INPUT COMMAND         * 
*             AND FURTHER INITIALIZES THE MUX LCB BASED ON THE        * 
*             CURRENT IVT PARAMETERIZATION.                           * 
*                                                                     * 
** INPUT    - POINTERS TO LCB, TCB; LINE NUMBER                       * 
*             INPUT STATE PROGRAM ADDRESS, INDEX (PARAMETERS)         * 
*                                                                     * 
** OUTPUT   - CLA CONDITIONED, INPUT COMMAND ISSUED                   * 
*             INPUT STATE PROGRAM FLAG ASSIGNMENT:                    * 
*               NCUOP1 - OUTPUT REGULATION REQUIRED (XON/XOFF)        * 
*               NCUOP2 - PAPERTAPE INPUT DEVICE                       * 
*               NCUOP3 - NON FULL ASCII INPUT MODE                    * 
*               NCUOP4 - LOOK FOR LF AS PHYSICAL LINE (BLK) TERM.     * 
*               NCUOP4 - TRANSPARENT DELIMITER ACTIVE                 * 
*               NCUOP5 - SPECIAL EDIT MODE                            * 
*               NCUOP5 - MULTI MESSAGE TRANSPARENT MODE               * 
*               NCUOP6 - SEND CR AFTER LF IN KEYBOARD MODE            * 
*               NCUOP7 - FULL DUPLEX PLATO INPUT                      * 
*               NCUOP8 - SECURITY CHARACTER DEFINED                   * 
*                                                                     * 
*             INPUT STATE PROGRAM INDEX ASSIGNMENT:                   * 
*               STATE5 - NON TRANSPARENT MODE                         * 
*               STATE6 - TRANSPARENT MODE                             * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTSTSTART   - START APPROPRIATE SUBTIP                  * 
*             PTSTAUTO    - SUBTIP FOR AUTO RECOGNITION               * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PTCLAINIT   - INITIALIZE CLA                            * 
*             PTACHTMR    - START CHARACTER TIMER                     * 
*             PTAEPLX     - TURN ECHOPLEX ON/OFF                      * 
*             PMCDRV      - COMMAND DRIVER                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTINPUT (VAR A4ISPTA : INTEGER; A4ISTAI : INTEGER); 
  
CONST 
  A2MINBSZ  = 100;                          _MINIMUM IVT BLOCKSIZE     ?
  A2FRSTAI  = 6;                            _FIRST IINPUT STATE INDEX  ?
  
VAR 
  A4S2CHR   : CHAR; 
  A4S3CHR   : CHAR; 
  A4WORK    : B0OVERLAY;                    _TEMP WORK VARIABLE        ?
  A4CMDINP  : NKINCOM;                      _INPUT COMMAND PACKET      ?
  A4I       : INTEGER;
  A4PGWIDTH : INTEGER;
  A4PWBSZ   : ARRAY [1..5] OF 
              PACKED RECORD 
                A3UPRPW   : B08BITS;        _UPPER PW LIMIT            ?
                A3PWMULT  : B08BITS;        _AND MULTIPLICATION VALUE  ?
              END;
  A4UOPBF   : PACKED RECORD                 _USER OPTION BITS B-F      ?
              CASE A3I : INTEGER OF         _(LOADED INTO NCCRCS FIELD)?
              1: (A3UOPBF : INTEGER); 
              2: (A3FIL1  : B013BITS; 
                  A3DROP  : BOOLEAN;        _DROP LEADING NULS/DELS/LFS?
                  A3FIL2  : BOOLEAN;
                  A3NPERR : BOOLEAN);       _NO PARITY ERROR DETECTED  ?
              END;
  A4CRCS    : PACKED RECORD                 _INP/OUT REGULATION     ? 
              CASE  A3CRC : INTEGER OF      _LOAD INTO NCCRCS FIELD ? 
              1:(A3CRCS : INTEGER); 
              2:(A3FIL1 : BOOLEAN;          _CANT TEST THIS BIT IN CRCS?
                 A3IPXD : BOOLEAN;          _IGNORE PARITY XPT DELIMTER?
                 A3ICIR : BOOLEAN;          _INPUT  REGULATION         ?
                 A3OCIR : BOOLEAN;          _OUTPUT REGULATION         ?
                 A3FIL2 : B06BITS;          _DUMMY FIELD (6BITS)       ?
                 A3CSINDX : B06BITS);       _CURRENT STATE INDEX       ?
              END;
  
VALUE 
  A4CMDINP  = ($600,0,0,$80,$4000); 
  A4PWBSZ   = ($1605,$1C04,$2503,$3802,$FF01);
  
BEGIN 
WITH A4CMDINP,A4UOPBF,A4CRCS DO 
  BEGIN 
  PTCLAINIT;                                _INITIALIZE THE CLA        ?
_ 
* * * *  BUILD AND ISSUE INPUT COMMAND
? 
  WITH A4TCBP'.BSTCB DO                     _INDEX TO TCB              ?
    BEGIN 
    ADDR (A4ISPTA, NKISPTA);                _INSERT ADDRESS SPT        ?
    NKCXLTA := 0;                           _CLEAR XLATE TABLE ADDRESS ?
    NKRPRT  := FALSE;                       _PARITY STRIP              ?
    NKUOPS  := 0;                           _CLEAR USER OPTION FLAGS   ?
    A3ICIR  := BSRGLINP;                    _SET INPUT  REGULATION  ? 
    A3OCIR  := BSRGLOUT;                    _SET OUTPUT REGULATION  ? 
    A3UOPBF := 5;                           _SET DROP AND NO-PARITY    ?
    IF A4ISTAI = 0                          _NO INPUT STATE PASSED, SET?
    THEN                                    _UP FOR IVT TYPE INPUT     ?
      BEGIN 
      A4ISTAI := A2FRSTAI;                  _FIRST INPUT STATE         ?
      NKCNT1  := A2MINBSZ;                  _SET SUBBLOCK SIZE         ?
      NKUOP1  := BSRGLOUT;                  _OUTPUT REGULATION         ?
      NKUOP2  := BSINDEV = B8IPTAPE;        _SET PT INPUT MODE         ?
      NKUOP8  := BSSECHAR " 0;              _SET SECURITY CHARACTER    ?
      IF BSXPT
      THEN
_ 
* * * *  SET UP FOR FULL TRANSPARENT INPUT
? 
        BEGIN 
        NKUOP7 := BSFLDPLX;                 _ SET FULL DUPLEX (PLATO)  ?
        A4ISTAI := A4ISTAI + 1;             _TRANSPARENT FIRST STATE   ?
        NKRPRT  := (BSPARITY " B7NPAR) &    _STRIP PARITY BIT IF ZERO, ?
                   (BSPARITY " B7IPAR);     _ODD, OR EVEN PARITY       ?
        NKUOP4  := BSXDBCHAR;               _DELIMIT BY CHARACTER      ?
        NKUOP5  := BSMXPT;                  _MULTI MSG TRANSPARENT MODE?
        A4S2CHR := CHR($FF);
        A4S3CHR := CHR($FF);
        IF BSXDBCHAR
        THEN
          WITH A4WORK DO
            BEGIN 
            BAINT       := BSXCHAR;         _XPT FORWARDING CHARACTER  ?
            BABOOL.B0B7 := (BABOOL.B0B7) &  _CLEAR PARITY BIT IF       ?
                           (BSPARITY " B7IPAR); _      PARITY = IGNORE ?
            A4S2CHR     := BA1CHAR;         _STORE XPT FORWARDING CHAR ?
            BAINT       := BSMXCHAR;        _MULTI MSG DELIMITER CHAR  ?
            BABOOL.B0B7 := (BABOOL.B0B7) &  _CLEAR PARITY BIT IF       ?
                           (BSPARITY " B7IPAR); _      PARITY = IGNORE ?
            A4S3CHR     := BA1CHAR;         _STORE MULTI MSG DELIMITER ?
            END; _WITH A4WORK?
        NKBLKL  := BSXCNT;                  _SET TRANSPARENT COUNT     ?
        IF BSXDBTIM 
        THEN                                _DELIMITING BY CHARACTER TO?
          PTACHTMR (A4LCBP, A2CT200);       _START 200 MS CHARACTER TMR?
        BSABLSTAT := A2EOBRCVD;             _ASSUME EOB RECEIVED       ?
        A3DROP    := FALSE;                 _DONT DROP LEADING CHARS   ?
        END _IF BSXPT THEN? 
      ELSE
_ 
* * * *  SET UP FOR NON TRANSPARENT AND/OR FULL ASCII MODE
? 
        BEGIN 
      NKUOP7 := FALSE;                      _ CLEAR FULL DUPLEX FLAG   ?
        NKCXLTA := A4INXLT [BSCODE];        _GET XLATE TABLE ADDRESS   ?
        NKSCHR  := CHR (BSBSCHAR);          _BACKSPACE CHARACTER       ?
        A4S2CHR := CHR (BSEBCHAR);          _END OF BLOCK CHARACTER    ?
        A4S3CHR := CHR (BSELCHAR);          _END OF LINE CHARACTER     ?
        IF NKUOP2 !                         _IF IN PAPERTAPE OR        ?
           (BSINDEV " B8BLKMODE)            _NOT IN BLOCK MODE         ?
        THEN
          A4S2CHR := CHR (BSBSCHAR);        _NO EOB CHARACTER AVAILABLE?
        NKUOP3  := NOT BSFLASCII;           _FULL ASCII INPUT MODE     ?
        NKUOP4  := BSUBZ = 0;               _LOOK FOR PHYSICAL LINES LF?
        IF BSINDEV = B8KEYBOARD 
        THEN                                _KEYBOARD MODE ONLY:       ?
          BEGIN 
          NKUOP5 := BSSPEDIT;               _SPECIAL EDIT MODE         ?
          NKUOP6 := BSCURPOS;               _SEND CR AFTER LF SEEN     ?
          END;
_ 
* * * *  SET UP NON TRANSPARENT BLOCKSIZE TO ALLOW FOR BACKSPACING
*        WITHIN PW BOUNDARIES, WITH REASONABLE BUFFER UTILIZATION 
? 
        A4PGWIDTH := BSPGWIDTH; 
        IF A4PGWIDTH = 0
        THEN                                _FOR PW = 0, ASSUME 100    ?
          A4PGWIDTH := A2MINBSZ;
        A4I := 0; 
        REPEAT
          A4I := A4I + 1;                   _BUMP INDEX INTO PW ARRAY  ?
        UNTIL A4PWBSZ [A4I].                _UNTIL MULTIPLIER FOUND    ?
              A3UPRPW \ A4PGWIDTH;
        NKBLKL := A4PWBSZ [A4I].            _GET IVT BLOCKSIZES TO BE  ?
                  A3PWMULT * A4PGWIDTH;     _PASSED TO PBULTS (BIP)    ?
        END; _IF BSXPT ELSE?
      END; _IF A4ISTAI = 0 THEN?
    NKISTAI := A4ISTAI;                     _INSERT INPUT STATE INDEX  ?
    NKLINO  := A4CMDOPS.NKLINO;             _INSERT LINE NUMBER        ?
    END; _WITH A4TCBP'.BSTCB DO?
_ 
* * * *  INSERT FOLLOWING VALUES DIRECTLY INTO THE MUX LCB
? 
  WITH NAPORT'[A4CMDOPS.NKPORT].NALCBP' DO  _INDEX TO MUX LCB          ?
    BEGIN 
    A3IPXD  := (A4TCBP'.BSTCB.BSXPT) &      _IGNORE PARITY ON          ?
               (A4TCBP'.BSTCB.BSPARITY =    _  TRANSPARENT DELIMITER   ?
                                B7IPAR);
  
    NCCRCP  := A3UOPBF;                     _PASS USER OPTION BITS B-F ?
    NCCRCS  := A3CRCS;                      _SAVE INP/OUT REGULATION? 
    NCS2CHR := A4S2CHR;                     _END OF BLOCK CHARACTER    ?
    NCS3CHR := A4S3CHR;                     _END OF LINE CHARACTER     ?
    NCCXLTA := 0;                           _RESET OLD TRANSLATE TABLE ?
   _NCCNTL  := 0;?
    NCBLKL  := 0;                           _RESET OLD COUNTERS        ?
    NCCNT2  := 0; 
    NCUOPB  := (A4TCBP'.BSTCB.BSXPT) &      _IGNORE PARITY ON          ?
               (A4TCBP'.BSTCB.BSPARITY =    _    TRANSPARENT DELIMITER ?
                                  B7IPAR);
    END; _WITH NAPORT'.. DO?
_ 
* * * *  ISSUE THE INPUT COMMAND
? 
  PMCDRV (A4CMDINP);                        _ISSUE INPUT COMMAND       ?
  END; _WITH A4CMDINP DO? 
END; _PROCEDURE PTINPUT?
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T I R E G L   -   GET INPUT REGULATION LEVEL               * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE FINDS OUT THE REGULATION LEVEL FOR THE     * 
*             CURRENT CONNECTION.                                     * 
*             THERE ARE 4 (INPUT) REGULATION LEVELS DEFINED:          * 
*               0/ NO REGULATION ACTIVE                               * 
*               1/ WAIT TO SEND XON AFTER XOFF HAS BEEN SENT          * 
*               2/ XOFF INPUT REGULATION ACTIVE                       * 
*               3/ SYSTEM REGULATION ACTIVE (WAIT.. / REPEAT..)       * 
*                                                                     * 
** INPUT    - TCB POINTER SET UP                                      * 
*                                                                     * 
** OUTPUT   - A4CURLVL SET TO CURRENT REGULATION LEVEL                * 
*             A4REGLVL SET TO HIGHEST OF CURRENT AND PREVIOUS LEVEL   * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTALLOWINP  - ALLOW INPUT FOR PAPERTAPE/2741            * 
*             PTASYNCTIP  - WORKLIST A0TIMEOUT, TIME OUT OCCURRED     * 
*                           WORKLIST A2WEOP/L/B, INPUT RECEIVED       * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PTREGL      - GET CURRENT CONNECTION REGULATION         * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTIREGL;
  
VAR 
  A4RGCONV  : ARRAY [RGNONE..RGTDIS]        _CONVERT SYSTEM REGULATION ?
              OF INTEGER;                   _TO TIP REGULATION LEVELS  ?
  
VALUE 
  A4RGCONV  = (A2IRNONE,A2IRWXON,A2IRXOFF,A2IRXOFF, 
               A2IRSYS,A2IRSYS,A2IRSYS,A2IRSYS);
  
BEGIN 
A4REGLVL := A4TCBP'.BSTCB.BSAIRSTAT;        _GET PREV. REGULATION LEVEL?
A4CURGLV := A4RGCONV [PTREGL (A4TCBP)];     _GET CURRENT REGULATION LVL?
IF A4CURGLV > A4REGLVL
THEN                                        _SET A4REGLVL TO HIGHEST   ?
  A4REGLVL := A4CURGLV;                     _ONE (PREV. OR CURRENT)    ?
END; _PROCEDURE PTIREGL?
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T P R E O U T   -   PREPARE OUTPUT TO SEND IF AVAILABLE    * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE WILL LOCATE AND TEXTPROCESS THE NEXT       * 
*             AVAILABLE OUTPUT BLOCK IF THE TERMINAL I/O STATE IS     * 
*             CURRENTLY IDLE, FOLLOWED BY AN ATTEMPT TO SEND IT       * 
*                                                                     * 
** INPUT    - LCB AND TCB POINTERS SET UP                             * 
*                                                                     * 
** OUTPUT   - DL COMMANDS PROCESSED, BSAOUBUF WILL POINT TO AVAILABLE * 
*             OUTPUT OR OUTPUT COMMAND WILL BE ISSUED                 * 
*                                                                     * 
*             TEXT PROCESSOR STATE PROGRAM FLAG ASSIGNMENT:           * 
*               NCUOP2 - NO FORMAT EFFECTORS PRESENT                  * 
*               NCUOP3 - PAGE WAITING ENABLED                         * 
*               NCUOP4 - DROP FIRST/NEXT PRE-PRINT LF                 * 
*               NCUOP6 - PAGE WAIT ACTIVE (RETURNED)                  * 
*               NCUOP7 - PAPERTAPE OUTPUT DEVICE                      * 
*               NCUOP8 - DISPLAY OUTPUT DEVICE                        * 
*                                                                     * 
*             TEXT PROCESSOR STATE PROGRAM INDEX ASSIGNMENT:          * 
*               STATE1 - INITIAL TP STATE                             * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTSTTTY     - SUBTIP FOR STANDARD TTY/DISPLAY           * 
*             PTSTPTTTY   - SUBTIP FOR PAPERTAPE INPUT MODE           * 
*             PTST2741    - SUBTIP FOR 2741                           * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PBQUEMAINT  - QUEUE MAINTENANCE                         * 
*             PTDLCMD     - PROCESS D/L IVT COMMAND                   * 
*             PTSTSTART   - (RE) START IVT INPUT AFTER DL COMMAND     * 
*             PBGET1BF    - GET A BUFFER                              * 
*             PTCTCHR     - COUNT CHARACTERS IN BUFFER                * 
*             PTADDCHR    - ADD CHARACTER TO END OF BUFFER CHAIN      * 
*             PBFCOPY     - COPY AUTO INPUT TO ANOTHER BUFFER         * 
*             PTTPINF     - TEXT PROCESSOR INTERFACE ROUTINE          * 
*             PTATPREL    - RELEASE TEXT PROCESSING BUFFERS           * 
*             PTTPSVMRK   - SAVE LAST LEVEL 1/2 MARKS FROM TP         * 
*             PTTPRSMRK   - RESTORE LAST SAVED LEVEL 1/2 MARKS        * 
*             PTTPUSREL   - RELEASE UNMARKED TP SOURCE BUFFERS        * 
*             PMCDRV      - COMMAND DRIVER                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTPREOUT; 
  
CONST 
_ 
* * * *  TEXT PROCESSOR FILE REGISTER CONSTANTS 
? 
  A2LNCNT   = 3;                            _LINE COUNTER              ?
  A2PGLEN   = 4;                            _PAGE LENGTH               ?
  A2CRIDL   = 5;                            _CARRIAGE RETURN IDLE COUNT?
  A2LFIDL   = 6;                            _LINE FEED IDLE COUNT      ?
  A2ECRLF   = 7;                            _EMBEDDED CR/LF CHARACTERS ?
  A2CRLF    = 8;                            _PRE/POST PRINT CR/LF CHARS?
  A2HCLR    = 9;                            _CLEAR/HOME CHARACTERS     ?
  A2XMSZ    = 10;                           _TRANSMISSION BLOCK SIZE   ?
  A2OVXBZ   = 120;                          _DEQUEUE OVER XBZ          ?
  
TYPE
  A3BUFSET  = ARRAY [1..DBUFLEN] OF         _BUFFER DEFINED AS SET TYPE?
              SET OF 0..15; 
  
VAR 
  A4BLTP    : INTEGER;                      _BLOCK TYPE                ?
  A4DBC     : DBDBC;                        _DATA BLOCK CLARIFIER      ?
  A4DEQUEUE : BOOLEAN;                      _CONTINUE DEQUEUING FLAG   ?
  A4FLDPX   : BOOLEAN;                      _FULL DUPLEX FLAG          ?
  A4SOURCE  : B0BUFPTR;                     _DEQUEUED SOURCE BUFFER(S) ?
  A4FCD     : INTEGER;                      _FCD OF DEQUEUED BLOCK     ?
  A4TPCBP   : B0BUFPTR;                     _TPCB POINTER              ?
  A4INT     : INTEGER;
  A4PBFST   : 'A3BUFSET;                    _POINTER TO BUFFER SET     ?
  A4WORK    : B0OVERLAY;                    _WORK VARIABLE             ?
  A4TCCHRS  : ARRAY [N0M33..N0T4014] OF 
              RECORD
                A3TCCT : ARRAY [A2ECRLF..   _EMBEDDED CR/LF, CURSOR-POS?
                         A2HCLR] OF INTEGER;_CR/LF, HOME/CLEAR CHARS   ?
              END;
  
VALUE 
  A4TCCHRS = ($0D0A,$0D0A,0,                _M33:  CR/LF, CR/LF,  0/0  ?
              $0D0A,$0D0A,$1918,            _713:  CR/LF, CR/LF, EM/CAN?
              $0D0A,$0D0A,$0C0C,            _721:  CR/LF, CR/LF, FF/FF ?
              $0D0A,$000D,0,                _2741: NL/LF,  0/NL,  0/0  ?
              $4742,$000A,$4852,            _M40:  -G/-B,  0/NL, -H/-R ?
              $000D,$000D,$121C,            _2000:  0/NL,  0/NL,DC2/FS ?
              $0D0A,$0D0A,$5B5B,            _X364: CR/LF, CR/LF, -[/-[ ?
              $0D0A,$0D0A,$1B1B);           _4014: CR/LF, CR/LF, ESC/..?
  
BEGIN 
WITH A4TCBP'.BSTCB,                         _INDEX TO TCB AND WORK VARS?
     A4DBC, A4WORK DO 
  BEGIN 
  A4BUFP := BSAOUBUF;                       _GET TP-ED DATA            ?
  A4FLDPX := ((BSXPT = TRUE) & (BSFLDPLX = TRUE) &
             (BSAOUSTAT = 0));              _SET FULL DUPLEX FLAG      ?
  IF A4BUFP = NIL 
  THEN                                      _NO TP-ED DATA AVAILABLE   ?
    BEGIN 
20: 
    IF ((BSAIOSTAT = A2STIDLE) !            _IF IDLE                   ?
         A4FLDPX)                           _OR XPARENT FULL DUPLEX    ?
    THEN                                    _AND TERMINAL I/O IDLE     ?
      BEGIN 
      A4SOURCE  := NIL;                     _CLEAR SOURCE POINTER      ?
      A4DEQUEUE := TRUE;                    _DEQUEUE FROM DL DATA QUEUE?
      A4TPCBP   := BSATPCBP;
      IF A4TPCBP " NIL
      THEN
        A4SOURCE := A4TPCBP'.BGMLCB.NCFSBA; _GET LEFT OVER SOURCE      ?
_ 
* * * *  LOOK FOR (MORE) AVAILABLE OUTPUT IN D/L QUEUE
*        AND DECIDE IF IT CAN BE DEQUEUED 
? 
      WHILE (BSQPTR.BABUFPTR " NIL) &       _WHILE MORE IN OUTPUT QUEUE?
            A4DEQUEUE DO                    _AND TO BE DEQUEUED        ?
        BEGIN 
        A4FCD := DBC;                       _PRESET LIKELY FCD         ?
        WITH BSQPTR.BABUFPTR' DO            _INDEX TO TOP ENTRY IN QUEU?
          BEGIN 
          A4BLTP := BIINT  [BTWD];          _GET BLOCK TYPE            ?
          DBCHAR := BFDATAC [DBC];          _AND THE DBC/PFC OF DL BLK ?
          END;
  
        IF A4SOURCE = NIL                   _NO PREVIOUS SOURCE        ?
        THEN                                _(IMPLIES NO TPCB AVAILABL)?
          BEGIN 
          IF A4BLTP = HTCMD                 _TEST FOR DL COMMAND       ?
          THEN
_ 
* * * *  FOUND DOWNLINE IVT COMMAND IN QUEUE
? 
            BEGIN 
            PBQUEMAINT (A4TCBP, A4BUFP, 
                        K4GET);             _DEQUEUE DL IVT COMMAND    ?
            PTDLCMD    (A4TCBP, A4BUFP);    _PROCESS DL IVT COMMAND    ?
            PTSTSTART  (A2SRDIVT);          _RESTART THE SUBTIP        ?
            END; _IF A4BLTP = HTCMD?
  
          IF DBDLXPT = FALSE                _NON-TRANSPARENT OUTPUT    ?
          THEN                              _DEQUEUE IF BFRS AVAILABLE ?
            A4DEQUEUE := PB1BFAVAIL (B0THMUX);
          END _IF A4SOURCE = NIL THEN?
        ELSE
_ 
* * * *  MORE DOWNLINE BLOCKS AVAILABLE WHILE PREVIOUS SOURCE LEFT, 
*        SEE IF WE CAN DEQUEUE THIS BLOCK 
? 
          BEGIN 
          IF (A4BLTP = HTCMD) ! BSAMSG      _NEW BLOCK IS CMD OR       ?
          THEN                              _LAST BLOCK IS MSG THEN    ?
            A4DEQUEUE := FALSE              _DONT DEQUEUE THIS ONE     ?
          ELSE
            BEGIN 
            A4FCD := A4FCD + 1;             _FCD FOR NEXT DL DATA      ?
            BAINT := BSXBZ + A2OVXBZ; 
            IF PTCTCHR (A4SOURCE) \ BAINT   _ENOUGH OLD SOURCE AVAILABL?
            THEN                            _DONT DEQUEUE MORE SOURCE  ?
              A4DEQUEUE := FALSE; 
            IF DBCHAR " BSADBC
            THEN                            _CHANGING DBC, DONT DEQUEUE?
              A4DEQUEUE := FALSE;           _UNTIL OLD DBC ALL DONE    ?
            END; _IF A4BLTP = HTCMD ELSE? 
          IF PB1BFAVAIL (B0THMUX) = FALSE   _BUFFERS CRITICALLY LOW    ?
          THEN
            BEGIN                           _DO NOT TEXT PROCESS       ?
            A4DEQUEUE := FALSE;             _DONT DEQUEUE MORE SOURCE  ?
            A4SOURCE  := NIL;               _DONT TEXT PROCESS CURRENT ?
            END;
          END; _IF A4SOURCE = NIL ELSE? 
_ 
* * * *  DEQUEUE THE NEXT BLOCK FROM D/L QUEUE IF SO REQUESTED
? 
        IF A4DEQUEUE
        THEN
          BEGIN 
          PBQUEMAINT (A4TCBP,A4BUFP,K4GET); _DEQUEUE NEXT DL BLOCK     ?
          IF A4BUFP = NIL 
          THEN                              _QUEUE MAINTENANCE DID NOT ?
            A4DEQUEUE := FALSE              _DEQUEUE, STREAM STOPPED   ?
          ELSE
            BEGIN 
            IF A4BLTP = HTMSG 
            THEN                            _DOWNLINE MSG BLOCK RCVD   ?
_ 
* * * *  DEQUEUE A MSG BLOCK
? 
              BEGIN 
              BSAMSG := TRUE;               _SET MSG SEEN FLAG         ?
              END; _IF A4BLTP = HTMSG?
            BSADBC := DBCHAR;               _SAVE DEQUEUED DBC IN TCB  ?
            IF (BSPACER = 0) &              _IF NOT PACER              ?
               (DBC = A4BUFP'.BFLCD)
            THEN
              PBRELCHN (A4BUFP, BEDBSIZE) 
            ELSE
            BEGIN 
              IF DBDLXPT
              THEN
                A4FCD := DBC + 1            _SET FCD FOR XPARENT DATA  ?
              ELSE
                PTADDCHR (CHR(I9US),A4BUFP);_FORCE TERMINATING $1F (US)?
_ 
* * * *  INSERT JUST DEQUEUED BLOCK AT END OF POSSIBLE PROVIOUS SOURCE
? 
              A4BUFP'.BFFCD := A4FCD;       _REMOVE NETWORK HEADER     ?
              PTCHAIN (A4BUFP, A4SOURCE); 
            END;
            END; _IF A4BUFP = NIL ELSE? 
          END; _IF A4DEQUEUE? 
        END; _WHILE (BSQPTR " NIL) & A4DEQUEUE DO?
  
      IF A4SOURCE " NIL 
      THEN                                  _NEW/OLD SOURCE AVAILABLE  ?
        BEGIN 
_ 
* * * *  SOURCE DATA AVAILABLE, TEXT-PROCESS IT (NON-TRANSPARENT ONLY)
? 
        DBCHAR := BSADBC;                   _GET LAST DEQUEUED DBC     ?
        IF BSANECHO = FALSE                 _ CHECK DBC/ECHO,IF SET    ?
        THEN                                _ NO CONTINUE              ?
          BSANECHO := DBDLNECHO;            _ STORE NEW DBC VALUE      ?
        IF BSNINCP = FALSE                  _CHECK CP IN DBC, AND      ?
        THEN
          BSNINCP := DBDLNCP;               _STORE NEW DBC VALUE       ?
        IF DBDLXPT
        THEN                                _TRANSPARENT SOURCE        ?
          BEGIN 
          A4BUFP := A4SOURCE; 
          IF BSPARITY = B7ZPAR              _ZERO PARITY BIT REQUIRED  ?
          THEN
            REPEAT                          _GO TRHOUGH ALL BUFFERS IN ?
            A4PBFST := A4SOURCE;            _THE CHAIN TO CLEAR THE    ?
            A4INT   := 5;                   _PARITY BITS               ?
              REPEAT
              BASETN := A4PBFST' [A4INT]; 
              A4PBFST' [A4INT] := BASETN &  _LOGICAL AND ALL DATA WORDS?
                [0,1,2,3,4,5,6,             _IN BUFFER WITH $7F7F      ?
                 8,9,10,11,12,13,14]; 
              A4INT := A4INT + 1;           _GET INDEX NEXT WORD IN BUF?
              UNTIL A4INT = DBUFLEN;        _UNTIL ALL WORDS DONE      ?
            A4SOURCE := A4SOURCE'.
                        BCCHAINS [DBUFLEN]; _GET POINTER TO NEXT BUFFER?
            UNTIL A4PBFST = NIL;            _UNTIL ALL BUFFERS DONE    ?
          END _IF DBDLXPT THEN? 
        ELSE
          BEGIN                             _NON-TRANSPARENT SOURCE    ?
          IF A4TPCBP = NIL
          THEN                              _NO TPCB ASSIGNED          ?
            BEGIN 
_ 
* * * *  NON-TRANSPARENT SOURCE AVAILABLE, ASSIGN/INITIALIZE TPCB 
? 
            A4TPCBP := PBGET1BF (BETPSIZE); 
            BSATPCBP := A4TPCBP;            _SAVE TPCB POINTER IN TCB  ?
            WITH A4TPCBP'.BGMLCB DO         _INDEX TO TPCB             ?
              BEGIN 
              ADDR (ASPTTP, NCSPTA);        _INSERT STATE PROGRAM TABLE?
              IF BSTCLASS = N02741
              THEN                          _DEALING WITH 2741 DEVICE  ?
                ADDR (ASPT2P, NCSPTA);
              NCDBP      := NIL;            _CLEAR WORK DESTINATION    ?
              NCSBP      := NIL;            _AND SOURCE BUFFER PTRS    ?
              NCTPML [3] := 1;              _INSERT FIRST TP STATE     ?
              NCTPML [8] := 4;              _FCD OF FIRST BUFFER       ?
              NCUOPS     := BSOUTDEV;       _NCUOP7=PT, NCUOP8=DP DEV. ?
              IF BSTCLASS = N0X364          _TERMINAL CLASS 7 DISPLAYS ?
              THEN                          _SET BOTH NCUOP7 AND NCUOP8?
                IF BSOUTDEV = B8DISPLAY     _TO ENABLE SPECIAL LINE    ?
                THEN                        _FOLDING THAT THE VT100    ?
                  NCUOPS := B8VTDISPLAY;    _NEEDS                     ?
              NCCXLTA    := A4OUXLT[BSCODE];_GET OUTPUT TRANSLATE TABLE?
              NCUOP2     := DBDLFE;         _GET FORMAT EFFECTOR FLAG  ?
              NCBLKL     := BSPGWIDTH;      _SET PAGE WIDTH            ?
              NCTPF1 [A2PGLEN]
                         := BSPGLENGTH;     _SET PAGE LENGTH           ?
              IF NCTPF1 [A2PGLEN] " 0 
              THEN                          _PAGEING REQUESTED IF      ?
                BEGIN                       _NON ZERO PAGE LENGTH      ?
                NCUOP3 := BSPGWAIT;         _GET PAGE WAIT FLAG        ?
                IF BSPGWAIT = FALSE 
                THEN                        _PAGE WAIT OFF,            ?
                  NCTPF1 [A2PGLEN] :=       _ALLOW FOR ONE MORE LINE   ?
                  NCTPF1 [A2PGLEN] + 1;     _ON PAGE (IN CASE OF PRNTR)?
                END;
              NCTPF1 [A2CRIDL] := BSCRIDLES;
              NCTPF1 [A2LFIDL] := BSLFIDLES;_SET CR/LF IDLES           ?
              END; _WITH A4TPCBP'.BGMLCB DO?
            WITH A4TCCHRS [BSTCLASS] DO 
              BEGIN 
              A4TPCBP'.BGMLCB.NCTPF1        _GET EMBEDDED CR/LF        ?
              [A2ECRLF] := A3TCCT [A2ECRLF];
              A4TPCBP'.BGMLCB.NCTPF1        _GET CURSOR POSITION CR/LF ?
              [A2CRLF]  := A3TCCT [A2CRLF]; 
              A4TPCBP'.BGMLCB.NCTPF1        _GET HOME/CLEAR SCREEN CHRS?
              [A2HCLR]  := A3TCCT [A2HCLR]; 
              END;
            END _IF A4TPCBP = NIL?
          ELSE
            PTTPRSMRK (BSAMARK, FALSE);     _RESTORE SAVED MARKS FOR TP?
_ 
* * * *  SET UP TO TEXT-PROCESS NEXT NON-TRANSPARENT SOURCE 
? 
          WITH A4TPCBP'.BGMLCB DO           _YES, CREATE XMIT BLOCK    ?
            BEGIN 
            NCFSBA           := A4SOURCE;   _INSERT SOURCE BUFFER      ?
            NCFDBA           := NIL;        _CLEAR DESTINATION PTR     ?
            NCUOP6           := FALSE;      _RESET PAGE WAIT FLAG      ?
            NCTPF1 [A2LNCNT] := BSALNCNT;   _SET CURRENT LINE COUNT    ?
            IF BSALNCNT = 0 
            THEN                            _JUST RECEIVED INPUT       ?
              BEGIN 
              BSACHCNT         := NCBLKL;   _RESET CHAR POSITION COUNT ?
              BSADRLF          := TRUE;     _DROP LEADING LFS IF NO CP ?
              BSATEND          := FALSE;    _CLEAR VT100 EOL PROCCESS  ?
              NCTPF1 [A2LNCNT] := 1;
              END;
            NCCNT2          := BSACHCNT;    _SET CHAR POSITION COUNTER ?
            NCUOP4          := BSADRLF; 
            NCUOP5          := BSATEND;     _SPECIAL VT100 EOL PROCCESS?
            NCTPF1 [A2XMSZ] := BSXBZ;       _TRANSMISSION BLOCK SIZE   ?
  
            PTTPINF (A4TPCBP');             _CALL TEXTPROCESSOR        ?
  
            BSALNCNT := NCTPF1 [A2LNCNT];   _GET NR LINES LEFT ON PAGE ?
            BSACHCNT := NCCNT2;             _GET CHAR POSITION COUNTER ?
            BSADRLF  := NCUOP4;             _GET DROP LEADING LF FLAG  ?
            BSATEND  := NCUOP5;             _SPECIAL VT100 EOL PROCCESS?
            BSAPWACT := NCUOP6;             _GET PAGE WAIT CONDITION   ?
            BSAXMSG  := NCUOP6;             _ALLOW INPUT IF IN PAGEWAIT?
_ 
* * * *  WE HAVE THE NEXT TRANSMISSION BLOCK, RELEASE THE TP-ED SOURCE
? 
            A4BUFP := NCFDBA;               _GET NON-XPT XMISSION BLOCK?
            IF A4BUFP " NIL 
            THEN
              BSADELAY := A4BUFP'.BFADELAY; _CLEAR-SCREEN DELAY REQUEST?
  
            BABUFPTR := NCSBP;              _GET CURRENT SOURCE PTR    ?
            BASET    := BASET - BEDBSIZE'.
                        BEMSK.BASET;        _GET BASE CURRENT SOURCE   ?
  
            IF NCEOSR &                     _END OF CURRENT SOURCE BUFR?
              (BABUFPTR'.                   _AND LAST SOURCE BUFFER    ?
               BCCHAINS [DBUFLEN] = NIL)
            THEN
              BEGIN                         _YES RELEASE ALL TP INFO   ?
              PTATPREL (A4TCBP);            _RELEASE ALL TP BUFFERS    ?
              A4TPCBP := NIL;               _CLEAR TPCB POINTER        ?
              END 
            ELSE
              BEGIN                         _NO RELEASE UP TO LAST MARK?
              PTTPSVMRK (BSAMARK);          _SAVE TP MARKS             ?
              PTTPUSREL (A4TPCBP,BSAMARK,1);_RELEASE UNMARKED LVL 1 SRC?
              END;
            END; _WITH A4TPCBP'.BGMLCB DO?
          END; _IF DBDLXPT ELSE?
  
        IF A4TPCBP = NIL
        THEN                                _NO MORE SOURCE LEFT,      ?
_ 
* * * *  ALL AVAILABLE SOURCE PROCESSED (OR XPT), PERFORM MSG LOGIC 
? 
          IF BSAMSG 
          THEN                              _JUST PROCESSED A MSG BLOCK?
            BEGIN 
            BSAMSG   := FALSE;
            BSAXMSG  := TRUE;               _MSG FULLY TEXT-PROCESSED  ?
            IF BSPACER " 0
            THEN                            _ADD PACER PROMPT AT END   ?
              PTADDCHR (CHR (BSPACER),      _OF TRANSMISSION BLOCK     ?
                        A4BUFP);
            END; _IF BSAMSG?
_ 
* * * *  IF SOURCE DID NOT RESULT IN XMIT BLOCK, LOOK FOR MORE SOURCE 
? 
        BSAOUBUF := A4BUFP;                 _PUT XMIT BLOCK PTR IN TCB ?
        IF A4BUFP = NIL 
        THEN                                _NO XMIT BLOCK GENERATED,  ?
          GOTO 20;                          _LOOK FOR MORE D/L DATA    ?
        END; _IF A4SOURCE " NIL THEN? 
  
      END; _IF BSAIOSTAT = A2STIDLE?
    END; _IF A4BUFP = NIL?
  
  IF A4BUFP " NIL                           _OLD/NEW XMIT BLOCK AVAIL  ?
  THEN
_ 
* * * *  TRANSMISSION BLOCK AVAILABLE, SEND IT IF TERMINAL STILL IDLE 
*        LOCK OUT MUX LEVEL TIP DURING TEST AND SET OF BSAIOSTAT
? 
    BEGIN 
    LOCK;                                   _LOCK INTERRUPTS           ?
    IF ((BSAWOSTAT = A2STIDLE) ! A4FLDPX)   _IDLE OR FULL DUPLEX       ?
  
  
  
    THEN
      BEGIN 
      A4LCBP'.BZLBTOMUX := A4BUFP;          _PUT CURRENT OUTPUT IN LCB ?
      A4CMDOPS.NKOBP    := A4BUFP;          _AND IN COMMAND PACKET     ?
      A4CMDOPS.NKCMD    := NKDOUT;
      PMCDRV            (A4CMDOPS);         _ISSUE OUTPUT COMMAND      ?
      BSABFACT          := TRUE;            _BUFFERED OUTPUT ACTIVE    ?
      BSAOUBUF          := NIL;             _CLEAR TCB OUTPUT POINTER  ?
      END; _IF BSAWOSTAT = A2STIDLE?
    UNLOCK;                                 _UNLOCK INTERRUPTS         ?
    END; _IF A4BUFP " NIL?
  END; _WITH A4TCBP'.BSTCB, .. DO?
END; _PROCEDURE PTPREOUT? 
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T C U R P O S   -   PERFORM CURSOR POSITIONING             * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE INITIATES CURSOR POSITIONING. THE REQUIRED * 
*             CR/LF IDLES WILL BE INSERTED BY DELAYING THE LINE       * 
*             AFTER THE CR OR LF IS SENT                              * 
*                                                                     * 
** INPUT    - TCB POINTER, CURSOR POSITIONING TYPE (PARAMETER)        * 
*                                                                     * 
** OUTPUT   - CURSOR POSITIONING STARTED, AFTER THE CANNED MESSAGE    * 
*             THE OBT WORKLIST WILL START CR/LF IDLE DELAY AND IF     * 
*             NEEDED, SEND THE LF AFTER THE CR                        * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTPSTINPUT  - POST INPUT PROCESSING                     * 
*             PTSTTTY     - SUBTIP FOR STANDARD TTY/DISPLAY           * 
*             PTASYNCTIP  - WORKLIST A0TIMEOUT, END REGULATION        * 
*                           WORKLIST A2WREGL, START REGULATION        * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PTASEND     - SEND CANNED MESSAGE                       * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTCURPOS (A4CURPOS : INTEGER);
  
BEGIN 
IF A4TCBP'.BSTCB.BSNINCP = FALSE            _IF OK TO MOVE CURSOR      ?
THEN
  BEGIN 
  IF A4TCBP'.BSTCB.BSCURPOS                 _CURSOR POSITIONING ENABLED?
  THEN
    IF A4CURPOS " A2CPNO                    _AND NOT -NO-              ?
    THEN
      BEGIN 
_ 
* * * *  SEND CARRIAGE RETURN CURSOR POSITIONING
? 
      IF A4CURPOS " A2CPLF
      THEN
        PTASEND (A4TCBP, A2MCR);            _SEND CR FOR -CR- OR -CL-  ?
_ 
* * * *  SEND LINE FEED CURSOR POSITIONING
? 
        IF A4CURPOS " A2CPCR
        THEN
          PTASEND (A4TCBP, A2MLF);          _SEND LF FOR -LF- OR -CL-  ?
      END; _IF A4CURPOS " A2CPNO? 
  END; _IF BSNINCP? 
END; _PROCEDURE PTCURPOS? 
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T P S T I N P U T   -   POST INPUT PROCESSING              * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE PERFORMS POST INPUT PROCESSING FOR THE     * 
*             SUBTIPS, IF ANY INPUT HAS BEEN RECEIVED                 * 
*                                                                     * 
** INPUT    - TCB POINTER, (INPUT) BUFFER POINTER, A4WRKCOD           * 
*                                                                     * 
** OUTPUT   - INPUT PASSED UPLINE TO BIP, IVT COMMANDS PROCESSED      * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTSTTTY     - SUBTIP FOR STANDARD TTY/DISPLAY           * 
*             PTSTPTTTY   - SUBTIP FOR PAPERTAPE INPUT MODE           * 
*             PTST2741    - SUBTIP FOR 2741                           * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PBGET1BF    - GET A BUFFER                              * 
*             PTCURPOS    - POSITION CURSOR AFTER IVT CMD             * 
*             PBULTS      - UPLINE TIP SERVICES (BIP)                 * 
*             PTATOUTPUT  - TERMINATE OUTPUT (USER BREAK SEEN)        * 
*             PTCHDELAY   - DELAY I/O AFTER BREAK KEY                 * 
*             PTSTSTART   - RESTART SUBTIP (IVT CMD / END XPT)        * 
*             PBRELZRO    - RELEASE POSSIBLE CHAIN OF BUFFERS         * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTPSTINPUT; 
  
CONST 
  A2STX     = $02;                          _STX CHARACTER             ?
  
VAR 
  A4NOEOX   : BOOLEAN;                      _NO END OF XPT INPUT FLAG  ?
  A4CHAR    : CHAR;                         _WORK CHARACTER            ?
  A4LCD     : INTEGER;                      _LCD OF POSSIBLE IVT CMD   ?
  A4I       : INTEGER;                      _WORK CHARACTER INDEX      ?
  A4WCHAR   : CHAR;                         _WORK CHARACTER            ?
  A4CALLBIP : BOOLEAN;                      _CALL BIP REQUEST FLAG     ?
  
BEGIN 
WITH A4TCBP'.BSTCB DO                       _INDEX TO TCB              ?
  BEGIN 
  A4NOEOX   := FALSE;                       _PRESET TO END OF XPT INPUT?
  A4CALLBIP := A4FLGWRD.KTUBREAK;           _CALL BIP ON BREAK KEY     ?
  IF A4CALLBIP = FALSE
  THEN                                      _NOT A BREAK DETECTED      ?
    BEGIN 
    BSALNCNT := 0;                          _RESET LINES ON PAGE       ?
    BSAXMSG  := FALSE;                      _RESET MSG SENT            ?
    END;
  IF A4BUFP " NIL 
  THEN  WITH A4BUFP' DO 
    BEGIN 
    A4CALLBIP := TRUE;                      _CALL PBULTS (BIP) ON INPUT?
    A4NOEOX   := BFEOI;                     _GET END OF XPT CONDITION  ?
    IF A4FLGWRD.KTCKSPEC
    THEN                                    _LOOKING FOR AN IVT COMMAND?
      IF BSBLKUP = FALSE
      THEN                                  _NO PREVIOUS BLK BLOCK     ?
      IF BSWORKQUE = NIL
      THEN                                  _NO PREVIOUS DATA AT ALL   ?
      IF A4FLGWRD.KTUBREAK = FALSE
      THEN                                  _NOT TERMINATED BY A BREAK ?
_ 
* * * *  TEST FOR IVT COMMAND, REMOVE STX/EOL/EOB FOR FULL ASCII IVT CMD
*        NOTE THAT IVT COMMAND CANNOT BE MORE THAN ONE BUFFER LONG
? 
      BEGIN 
      A4LCD  := BFLCD - ORD (BSFLASCII);    _STRIP EOL/B IN CASE OF FA ?
      IF A4LCD \ (DATA + 1) 
      THEN                                  _AT LEAST ONE CHAR RECEIVED?
        BEGIN 
        A4CHAR := BFDATAC [DATA + 1]; 
        IF A4CHAR = CHR (A2STX)             _FIRST CHARACTER IS STX    ?
        THEN                                _(THIS IMPLIES FULL ASCII) ?
          IF A4LCD \ (DATA + 2) 
          THEN                              _AT LEAST TWO CHRS RECEIVED?
            BEGIN 
            A4CHAR := BFDATAC [DATA + 2];   _GET SECOND CHARACTER      ?
            IF A4CHAR = CHR (BSCNTRLCHAR) 
            THEN                            _WE DO HAVE AN IVT COMMAND ?
              BEGIN                         _ENTERED IN FULL ASCII MODE?
              A4I := DATA;
              REPEAT                        _REMOVE THE STX CHARACTER  ?
                A4I     := A4I + 1;         _BY MOVING ALL CHARACTERS  ?
                A4WCHAR := BFDATAC [A4I+1]; _ONE DOWN (THIS IS DONE SO ?
                BFDATAC [A4I]               _BIP CAN COUNT PROPERLY    ?
                        := A4WCHAR; 
              UNTIL A4I \ A4LCD;
              A4LCD := A4LCD - 1;           _ADJUST LCD FOR REMOVED STX?
              END;
            END; _IF A4LCD \ (DATA + 2)?
_ 
* * * *  LOOK FOR IVT COMMAND ENTERED BY THE TERMINAL USER
? 
        IF A4CHAR = CHR (BSCNTRLCHAR) 
        THEN                                _CONTROL CHARACTER FOUND   ?
          BEGIN 
          BFLCD := A4LCD;                   _INSERT (UPDATED) LCD      ?
          PBULTS (A4TCBP, A4BUFP, A4FLGWRD);_PASS IVT COMMAND TO BIP   ?
          PTSTSTART (A2SRUIVT);             _RESTART THE SUBTIP        ?
          END; _IF A4CHAR = CHR (BSCNTRLCHAR)?
_ 
* * * *  LOOK FOR ABORT OUTPUT BLOCK / CANCEL AUTO INPUT / TRUSTED PATH 
? 
        IF BFLCD = (DATA + 1) 
        THEN                                _SINGLE CHARACTER RECEIVED ?
          BEGIN 
          IF A4CHAR = CHR (BSABTBLK)
          THEN                              _ABORT OUTPUT BLOCK FOUND  ?
            PTATOUTPUT(A4TCBP);             _TERMINATE OUTPUT          ?
          IF A4CHAR = CHR (BSSECHAR)        _SECURITY CHARACTER FOUND  ?
          THEN
            IF BSSECHAR " 0                 _AND ONE IS DEFINED        ?
            THEN                            _CHECK ONLY IF TRUSTED PATH?
              A4FLGWRD.KTCKSPEC := BFATRUST;
          END; _IF BFLCD = (DATA + 1)?
        END; _IF A4LCD \ (DATA + 1)?
      END; _IF A4FLGWRD.KTCKSPEC? 
    IF A4REGLVL = A2IRSYS                   _IN SYSTEM REGULATION      ?
    THEN                                    _WE CANNOT ACCEPT INPUT    ?
      GOTO EXIT 100;                        _GO INTO REGULATION        ?
    END; _IF A4BUFP " NIL?
_ 
* * * *  SEND RECEIVED INPUT / BREAK TO UPLINE TIP SERVICES (BIP) 
? 
  IF A4CALLBIP                              _INPUT RECEIVED OR BREAK   ?
  THEN                                      _DETECTED, CALL ULTS (BIP) ?
    BEGIN 
    PBULTS (A4TCBP, A4BUFP, A4FLGWRD);      _PASS INPUT ALONG TO BIP   ?
    BSACAN  := A4FLGWRD.KTCAN;             _ SAVE CURRENT CANCEL FLAG  ?
    BSAWIFLGS := 0;                         _CLEAR WAITING FOR INPUTS  ?
    IF A4FLGWRD.KTUBS " 0                   _USER BREAK 1/2 SEEN (BIP) ?
    THEN                                    _USER BREAK 1/2 SEEN       ?
      BEGIN 
      PTATOUTPUT (A4TCBP);                  _TERMINATE/RELEASE OUTPUT  ?
      BSAXMSG  := FALSE;                    _WAIT FOR DL MSG BLOCK     ?
      END;
    IF A4FLGWRD.KTBRKSEEN 
    THEN                                    _BREAK KEY RECOGNIZED      ?
      IF BSBRUSR1                           _THAT IS CANCEL OR UB1     ?
      THEN
        PTSTSTART (A2SRUIVT);               _RESTART THE SUBTIP        ?
    END; _IF A4CALLBIP? 
  IF BSXPT
  THEN                                      _EXPECTING TRANSPARENT INP ?
_ 
* * * *  TRANSPARENT INPUT RECEIVED 
? 
    IF A4NOEOX = FALSE
    THEN                                    _END OF XPT INPUT DETECTED ?
      BEGIN 
      BSXPT     := FALSE;                   _TAKE OUT OF XPT INPUT MODE?
      PTSTSTART (A2SREOX);                  _RESTART THE SUBTIP        ?
      END 
    ELSE
      BEGIN 
      IF BSFLDPLX = TRUE                    _IF FULL DUPLEX MODE       ?
      THEN                                  _RESTART SUB-TIP           ?
        PTSTSTART(A2CFDPX)
      END;
  END; _WITH A4TCBP'.BSTCB DO?
END; _PROCEDURE PTPSTINPUT? 
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T A L L O W I N P   -   ALLOW INPUT FOR PAPERTAPE / 2741   * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE TEST FOR CONDITIONS THAT ALLOW US TO SEND  * 
*             A XON/UNLOCK TO THE PAPERTAPE INPUT DEVICE OR 2741      * 
*             IF CONDITIONS PERMIT, THE XON/UNLOCK CANNED MESSAGE     * 
*             IS SEND, OTHERWISE A TIMER EVENT IS REQUESTED           * 
*                                                                     * 
** INPUT    - TCB ADDRESS                                             * 
*                                                                     * 
** OUTPUT   - CANNED MESSAGE SEND OR TIMER EVENT REQUESTED            * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTSTPTTTY   - SUBTIP FOR PAPERTAPE INPUT MODE           * 
*             PTST2741    - SUBTIP FOR 2741                           * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PTIREGL     - GET CURRENT REGULATION LEVEL              * 
*             PTASEND     - SEND CANNED MESSAGE (XON/UNLOCK)          * 
*             PTSTIMER    - START TIMER EVENT                         * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTALLOWINP; 
  
CONST 
  A2MULXON  = A2MXON;                       _2741: UNLOCK; PT: XON     ?
  A2MXNUNLK = A2MUNLK;                      _FORCE XREF ENTRY          ?
  
BEGIN 
IF A4TCBP'.BSTCB.BSAXMSG
THEN                                        _JUST TRANSMITTED MSG BLOCK?
  IF A4TCBP'.BSTCB.BSAWOSTAT = A2STIDLE     _AND NO I/O ACTIVE ANYMORE ?
  THEN
    IF A4TCBP'.BSTCB.BSAIRSTAT = A2IRNONE   _AND NOT IN REGULATION     ?
    THEN
      BEGIN 
      PTIREGL;                              _GET REGULATION LEVEL      ?
      IF A4CURGLV = A2IRNONE
      THEN                                  _NO REGULATION REQUIRED    ?
        BEGIN 
        PTSTIMER (A2TRRESET); 
        PTASEND  (A4TCBP, A2MULXON);        _SEND XON/UNLOCK           ?
        A4TCBP'.BSTCB.BSAWIACT := TRUE;     _SET WAITING FOR INPUT     ?
        END 
      ELSE                                  _REGULATION REQUIRED       ?
        PTSTIMER (A2TREVENT);               _REQUEST TIMER EVENT       ?
      END;
END; _PROCEDURE PTALLOWINP? 
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T S T T T Y   -   SUBTIP FOR STANDARD TTY/DISPLAY          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE CONTROLS I/O WITH THE NORMAL KEYBOARD,     * 
*             DISPLAY AND/OR PRINTER DEVICES. CONTROL IS PASSED       * 
*             AFTER A TCB HAS BEEN (RE)CONFIGURED, AND EVERY TIME     * 
*             AN IVT COMMAND IS PROCESSED                             * 
*                                                                     * 
** INPUT    - LCB AND TCB ADDRESSES                                   * 
*                                                                     * 
** OUTPUT   - INPUT/OUTPUT DONE WITH THE ASCII TTY/DEISPLAY DEVICES   * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTSTSTART   - START APPROPRIATE SUBTIP                  * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PTPREOUT    - PRE OUTPUT PROCESSING                     * 
*             PTEWAIT     - WAIT FOR EVENT (INPUT, DL DATA)           * 
*             PTPSTINPUT  - POST INPUT PROCESSING                     * 
*             PTASEND     - SEND CANNED MESSAGE (CURSOR POSITIONING)  * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTSTTTY;
  
BEGIN 
WITH A4TCBP'.BSTCB DO                       _INDEX TO TCB              ?
  
  REPEAT
_ 
* * * *  SEND OUTPUT TO TERMINAL IF AVAILABLE AND OK TO DO SO 
? 
    PTPREOUT;                               _LOCATE/SEND AVAILABLE OUTP?
_ 
* * * *  WAIT FOR OUTPUT QUEUED / OUTPUT XMITTED / INPUT RECEIVED 
? 
    PTEWAIT;
_ 
* * * *  PASS POSSIBLY RECEIVED INPUT UPLINE
? 
    IF A4INRCVD 
    THEN
      BEGIN 
      PTPSTINPUT;                           _PASS ANY INPUT UPLINE     ?
_ 
* * * *  INPUT RECEIVED, PERFORM CURSOR POSITIONING 
? 
      IF BSXPT = FALSE
      THEN                                  _NOT RECEIVING XPARENT INP ?
        IF BSAWOSTAT = A2STIDLE             _AND INPUT IDLE, NO BREAK, ?
        THEN                                _NOT WAITING FOR EOB       ?
          BEGIN 
          IF A4WRKCOD = A2WEOL
          THEN
            PTCURPOS (BSCPEL);              _END OF LINE POSITIONING   ?
          IF A4WRKCOD = A2WEOB
          THEN
            PTCURPOS (BSCPEB);              _END OF BLOCK POSITIONING  ?
          END; _IF BSAWOSTAT = A2STIDLE?
        BSNINCP := BSNINCP & BSACAN;        _CLEAR NINCP IF NOT CANCEL ?
        IF BSACAN = FALSE                  _ TEST MSG/CANCEL FLAG      ?
        THEN                               _ GO CHECK DBC FLAG         ?
          BEGIN 
          IF BSANECHO                      _ CHECK DBC FLAG            ?
          THEN                             _ DBC SET, CONTINUE         ?
            BEGIN 
            IF A4WRKCOD " A2WEOP           _  CHECK IF NOT E.O.P.      ?
            THEN                           _ NOT E.O.P. CONTINUE       ?
              BEGIN 
              BSANECHO := FALSE;            _ RESET TCB NO ECHO FLAG   ?
              IF BSECHOPLEX                 _ CHECK ECHOPLEX FLAG      ?
              THEN
                BEGIN                      _ GO START CORRECT TIP      ?
                  PTSTSTART (A2SRDIVT);    _ GET CORRECT STATE ADR PTR ?
                END; _IF BSECHOPEX? 
              END; _IF A4WRKCOD?
            END; _IF BSANECHO?
          END  _END BSACAN FALSE? 
        ELSE
          BSACAN := FALSE;                 _ CLEAR MSG/CANCEL FLAG     ?
      END; _IF A4INRCVD?
  
  UNTIL FOREVER;
  
END; _PROCEDURE PTSTTTY?
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T S T P T T T Y   -   SUBTIP FOR PAPERTAPE INPUT MODE      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE CONTROLS I/O WITH AN ASCII TTY IN          * 
*             PAPERTAPE MODE. CONTROL IS PASSED AFTER A TCB HAS       * 
*             BEEN (RE)CONFIGURED, AND EVERY TIME AN IVT COMMAND      * 
*             IS PROCESSED                                            * 
*                                                                     * 
** INPUT    - LCB AND TCB ADDRESSES                                   * 
*                                                                     * 
** OUTPUT   - INPUT/OUTPUT DONE WITH THE ASCII TTY PAPERTAPE DEVICES  * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTSTSTART   - START APPROPRIATE SUBTIP                  * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PTPREOUT    - PRE OUTPUT PROCESSING                     * 
*             PTALLOWINP  - SEND XON TO ALLOW FOR INPUT               * 
*             PTEWAIT     - WAIT FOR EVENT (INPUT, DL DATA)           * 
*             PTPSTINPUT  - POST INPUT PROCESSING                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTSTPTTTY;
  
BEGIN 
  
REPEAT
_ 
* * * *  SEND OUTPUT TO TERMINAL IF AVAILABLE AND OK TO DO SO 
? 
  PTPREOUT;                                 _LOCATE/SEND AVAILABLE OUTP?
_ 
* * * *  SEND XON TO TERMINAL AFTER A MSG BLOCK IS DELIVERED TO TERMINAL
? 
  PTALLOWINP;                               _TRY SENDING XON           ?
_ 
* * * *  WAIT FOR OUTPUT QUEUED / OUTPUT XMIT / INPUT RCVD / TIMER EXP
? 
  PTEWAIT;
_ 
* * * *  PASS POSSIBLY RECEIVED INPUT UPLINE AND WAIT FOR DL MSG BLOCK
? 
  IF A4INRCVD 
  THEN
    PTPSTINPUT;                             _PASS RCVD INPUT UPLINE    ?
  
UNTIL FOREVER;
  
END; _PROCEDURE PTSTPTTTY?
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T S T 2 7 4 1   -   SUBTIP FOR IBM 2741 TERMINALS          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE CONTROLS I/O WITH THE IBM 2741 DEVICES     * 
*             CONTROL IS PASSED AFTER A TCB HAS BEEN (RE)CONFIGURED,  * 
*             AND EVERY TIME AN IVT COMMAND IS PROCESSED              * 
*                                                                     * 
** INPUT    - LCB AND TCB ADDRESSES                                   * 
*                                                                     * 
** OUTPUT   - INPUT/OUTPUT DONE WITH THE IBM 2741 DEVICES             * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTSTSTART   - START APPROPRIATE SUBTIP                  * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PTPREOUT    - PRE OUTPUT PROCESSING                     * 
*             PTALLOWINP  - SEND UNLOCK TO ALLOW FOR INPUT            * 
*             PTEWAIT     - WAIT FOR EVENT (INPUT, DL DATA)           * 
*             PTASEND     - SEND LOCK KB / 2741 RECEIVE MODE          * 
*             PTPSTINPUT  - POST INPUT PROCESSING                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTST2741; 
  
BEGIN 
_ 
* * * *  DISCARD INITIAL INPUT ON NON AUTO RECOGNITION LINE 
? 
IF A4TCBP'.BSTCB.BSASSRSN = A2SRCTCB
THEN                                        _JUST CONFIGURED THE TCB   ?
  IF A4LCBP'.BZAUTO = FALSE                 _FOR NON AUTOREC LINE      ?
  THEN
    BEGIN 
    REPEAT
      PTEWAIT;                              _WAIT UNTIL FIRST INPUT    ?
    UNTIL A4INRCVD;                         _RECEIVED                  ?
    PBRELZRO (A4BUFP, BEDBSIZE);            _IGNORE FIRST INPUT        ?
    PTASEND  (A4TCBP, A2MLOCK);             _PUT TERM IN RECEIVE MODE  ?
    END;
  
REPEAT
_ 
* * * *  SEND OUTPUT TO TERMINAL IF AVAILABLE AND OK TO DO SO 
? 
  PTPREOUT;                                 _LOCATE/SEND AVAILABLE OUTP?
_ 
* * * *  SEND UNLOCK KEYBOARD AFTER A MSG BLOCK IS DELIVERED TO TERMINAL
? 
  PTALLOWINP;                               _TRY SENDING UNLOCK        ?
_ 
* * * *  WAIT FOR OUTPUT QUEUED / OUTPUT XMIT / INPUT RCVD / TIMER EXP
? 
  PTEWAIT;
_ 
* * * *  PASS POSSIBLE INPUT UPLINE, LOCK KEYBOARD, WAIT FOR DL DATA
? 
  IF A4INRCVD 
  THEN
    BEGIN 
    IF A4WRKCOD = A2WEOL
    THEN                                    _END OF BLOCK SEEN         ?
      PTASEND (A4TCBP, A2MLOCK);            _PUT TERM IN RECEIVE MODE  ?
    IF A4WRKCOD = A2WBREAK
    THEN                                    _ATTENTION DURING OUTPUT   ?
      PTASEND (A4TCBP, A2MUNLK);            _UNLOCK KEYBOARD           ?
    PTPSTINPUT;                             _PASS RCVD INPUT UPLINE    ?
    END;
  
UNTIL FOREVER;
  
END; _PROCEDURE PTST2741? 
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T S T A U T O   -   SUBTIP FOR AUTO RECOGNITION            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE PERFORMS AUTO RECOGNITION OF LINE SPEED    * 
*             AND TERMINAL CODE SET.                                  * 
*                                                                     * 
** INPUT    - LCB ADDRESS                                             * 
*                                                                     * 
** OUTPUT   - LCB UPDATED WITH LINE SPEED AND CODE SET.               * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTSTSTART   - START APPROPRIATE SUBTIP                  * 
*             PTASYNCTIP  - WORKLIST A0SMEN, ENABLE LINE              * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PTCHDELAY   - DELAY NUMBER OF CHARACTER TIMES           * 
*             PTCLAINIT   - INITIALIZE CLA                            * 
*             PTINPUT     - SET CLA TO ALLOW FOR INPUT                * 
*             PTASEND     - SEND A CANNED MESSAGE                     * 
*             PTEWAIT     - WAIT FOR AUTOREC WLE                      * 
*             PTOWAIT     - WAIT FOR OUTPUT COMPLETION                * 
*             PBGET1BF    - GET A BUFFER                              * 
*             PBLSPUT     - SEND A WORKLIST ENTRY                     * 
*             PTTSRETURN  - RETURN TO SUBROUTINE CALLER               * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTSTAUTO; 
  
CONST 
  A2ARSPEED = 4;                            _INPUT STATE FOR SPEED AR  ?
  A2ARASCII = 5;                            _INPUT STATE FOR ASCII AR  ?
  A2AR2741  = 6;                            _INPUT STATE FOR 2741 AR   ?
  
VAR 
  A4LNSPD   : INTEGER;                      _RECOGNIZED LINE SPEED     ?
  A4SMPLSPD : ARRAY [BOOLEAN] OF INTEGER;   _AR SAMPLE SPEED (LOW/HIGH)?
  A4SPEEDS  : ARRAY [BOOLEAN,A2W110..A2W2400] 
              OF INTEGER;                   _BZLNSPD LINE SPEEDS       ?
  A4SUBTIP  : ARRAY [A2W110..A2W2400] 
              OF INTEGER;                   _BZSUBTIP TYPES            ?
  
VALUE 
  A4SMPLSPD = (N0800,N03200); 
  A4SPEEDS  = (N0110,N0134,N0150, N0300,N0300, N0600,N01200,N02400, 
                   0,    0,N0600,N01200,    0,N02400,N04800,N09600);
  A4SUBTIP  = (N0ASYASC,N0IBM2741,N0ASYASC,N0ASYASC,
               N0IBM2741,N0ASYASC,N0ASYASC,N0ASYASC); 
  
BEGIN 
WITH A4TCBP'.BSTCB, A4LCBP' DO              _INDEX TO TCB AND LCB      ?
  BEGIN 
  RETADR (BZRET2ADDR);                      _SAVE CALLERS RETURN ADDRES?
  BSAARACT := TRUE;                         _SET AUTORECOGNITION ACTIVE?
  BZASVSPD := BZLNSPD;                      _SAVE OLD LINE SPEED       ?
  IF BSASSRSN " A2SRAUTO
  THEN                                      _DURING RE-AUTOREC         ?
    BEGIN 
    BSASVPAR := BSPARITY;                   _SAVE CURRENT PARITY       ?
    BSASVLEN := BSCHLEN;                    _     AND CHARACTER LENGTH ?
    END;
  REPEAT
    PTCHDELAY (2);                          _DELAY 2 CHARACTER TIMES   ?
_ 
* * * *   SET SAMPLE SPEED TO 800/3200 BPS FOR LOW/HIGH RANGE AUTOREC 
? 
    BZLNSPD  := A4SMPLSPD [BZHIAUTO];       _SELECT SAMPLE SPEED       ?
    BSPARITY := B7NPAR;                     _NO PARITY CHECK OR STRIP  ?
    BSCHLEN  := 3;                          _CHARACTER LENGTH 8 BITS   ?
    BSCODE   := N0ASCII;                    _SET DEFAULT CODE SET      ?
    PTINPUT (ASPTAR, A2ARSPEED);            _START INPUT SPEED RECOGN. ?
    PTEWAIT;                                _WAIT FOR SPEED CHARACTER  ?
    A4LNSPD := A4SPEEDS [BZHIAUTO,
                         A4WRKCOD];         _GET RECOGNIZED LINE SPEED ?
    IF A4LNSPD = 0
    THEN
      A4WRKCOD := A2WFAILAR;                _INVALID SPEED RECOGNIZED  ?
    IF BSASSRSN " A2SRAUTO
    THEN                                    _DURING RE-AUTOREC         ?
      BEGIN 
      IF A4SUBTIP [A4WRKCOD] " BZSUBTIP 
      THEN                                  _CHANGE OF SUBTIP NOT      ?
        A4WRKCOD := A2WFAILAR;              _ ALLOWED                  ?
      IF BZARSPD = FALSE
      THEN                                  _CHANGE OF SPEED NOT       ?
        IF A4LNSPD " BZASVSPD               _ALLOWED, MAKE SURE        ?
        THEN                                _ IT HAS NOT CHANGED       ?
          A4WRKCOD := A2WFAILAR;
        END;
    IF A4WRKCOD > A2WFAILAR 
    THEN                                    _SUCCESSFULL AUTO RECOGNIT.?
      BEGIN 
      BZSUBTIP := A4SUBTIP [A4WRKCOD];      _SET SUBTIP IN LCB         ?
      BZLNSPD  := A4LNSPD;                  _ SET LINE SPEED INLCB     ?
      IF BZSUBTIP = N0IBM2741 
      THEN                                  _SET CODE/PAR/CHARLEN      ?
        BEGIN                               _(FOR PTASEND ROUTINE)     ?
        BSCODE   := N0EBCDAPL;
        BSPARITY := B7OPAR;                 _ENSURE PARITY EXISTS FOR  ?
                                            _          CODE SET DETECT ?
        BSCHLEN  := 2;                      _CHARACTER LENGTH 7 BITS   ?
       _BSTCLASS := N02741;?
        PTCHDELAY (3);                      _ALLOW FOR CONTROL-C (PLUS)?
        END 
      ELSE
        BEGIN 
        BSPARITY := B7EPAR;                 _ENSURE PARITY EXISTS FOR  ?
                                            _          CODE SET DETECT ?
        BSCHLEN  := 1;                      _CHARACTER LENGTH 8 BITS   ?
        PTCHDELAY (1);                      _DROP TRAILING JUNK        ?
        END;
_ 
* * * *  SET CLA TO DETECTED SPEED, SEND DOUBLE LF, RECEIVE CODESET CHAR
? 
      PTCLAINIT;                            _SET DETECTED LINE SPEED   ?
      PTASEND   (A4TCBP, A2MLFLF);          _SEND TWO LINE FEEDS       ?
      PTOWAIT;                              _WAIT FOR COMPLETION       ?
      IF BZSUBTIP = N0IBM2741 
      THEN
        PTINPUT (ASPTAR, A2AR2741)          _SET INPUT FOR CODE SET AR ?
      ELSE
        PTINPUT (ASPTAR, A2ARASCII);
      PTEWAIT;                              _WAIT FOR CODE CHARACTER   ?
      END; _IF A4WRKCOD > A2WFAILAR?
  UNTIL A4WRKCOD > A2WFAILAR;               _UNTIL GOOD CODESET RECOGN.?
_ 
* * * *  PROCESS GOOD RECOGNITION OF CODE SET 
? 
  BSCODE := A4WRKCOD - A2WASCII + N0ASCII;  _SET CODESET IN TCB        ?
  PTASEND (A4TCBP, A2MLF);                  _SEND OUT SINGLE LINE FEED ?
  PTOWAIT;                                  _WAIT FOR LF SENT          ?
  IF BSASSRSN = A2SRAUTO
  THEN                                      _AUTO REC DURING ENABLE LIN?
    WITH BWWLENTRY [OPS].CMSMLEY DO 
_ 
* * * *  BUILD AND SEND UNSOLICITED LINE STATUS MESSAGE 
? 
      BEGIN 
      CMPTR    := PBGET1BF (BEDBSIZE);      _GET A BUFFER FOR LINE     ?
      CMPTR'.BIINT [1] := $0B05;            _INSERT LCD / FCD          ?
      CMPTR'.BIINT [3] := BZLNSPD;          _INSERT LINE SPEED         ?
      CMPTR'.BIINT [4] := BSCODE * $100 +   _INSERT CODE SET           ?
                          BZSUBTIP;         _INSERT SUBTIP TYPE        ?
      CMPTR'.BIINT [5] := 1;                _INSERT CA AND NR TERMINALS?
      CMPTR'.BIINT [6] := 0;                _INSERT TA AND DEVICE TYPE ?
      END  _WITH BWWLENTRY[OPS].CMSMLEY?
  ELSE                                      _DURING RE-AUTOREC         ?
    BEGIN 
    BSPARITY := BSASVPAR;                   _RESTORE CORRECT PARITY    ?
    BSCHLEN  := BSASVLEN;                   _     AND CHARACTER LENGTH ?
    END;  _ELSE (BSASSRSN NE A2SRAUTO)? 
_ 
* * * *  AUTO RECOGNITION COMPLETE, RETURN TO CALLER
? 
 _BSAARACT := FALSE;?                       _AUTORECOGNITION COMPLETE  ?
  BSAUREC  := FALSE;                        _RESET AUTO REC IVT FLAG   ?
  END; _WITH A4TCBP'.BSTCB,A4LCBP' DO?
PTTSRETURN;                                 _RETURN TO ORIGINAL CALLER ?
END; _PROCEDURE PTSTAUTO? 
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T S T S T A R T   -   START THE APPROPRIATE SUBTIP         * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE SELECTS WHICH SUBTIP TO START BASED ON     * 
*             THE CURRENT IVT SETTING OF THE TERMINAL.                * 
*             THIS ROUTINE WILL BE CALLED FOR THE FOLLOWING REASONS:  * 
*                 1) TCB CONFIGURED                                   * 
*                 2) DOWNLINE IVT COMMAND RECEIVED                    * 
*                 3) UPLINE IVT COMMAND RECOGNIZED                    * 
*                 4) END OF TRANSPARENT INPUT                         * 
*                 5) START OF REGULATION (WAIT..)                     * 
*                 6) END OF REGULATION (REPEAT..)                     * 
*                                                                     * 
** INPUT    - LCB, TCB ADDRESSES, REASON FOR STARTING SUBTIP (PARM)   * 
*                                                                     * 
** OUTPUT   - NONE                                                    * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTPREOUT    - PRE OUTPUT PROCESSING                     * 
*             PTPSTINPUT  - POST INPUT PROCESSING                     * 
*             PTASYNCTIP  - WORKLIST A0SMTCB, TCB CONFIGURED          * 
*                           WORKLIST A0TIMEOUT, END REGULATION        * 
*                           WORKLIST A2WREGL, START REGULATION        * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PTTERMIO    - TERMINATE INPUT AND OUTPUT                * 
*             PTCURPOS    - POSITION CURSOR AFTER IVT COMMAND         * 
*             PTASEND     - SEND CANNED MESSAGE TO TERMINAL           * 
*             PTOWAIT     - WAIT FOR OUTPUT COMPLETION                * 
*             PTSTAUTO    - SUBTIP FOR AUTO RECOGNITION               * 
*             PTINPUT     - START IVT INPUT                           * 
*             PTST2741    - SUBTIP FOR 2741                           * 
*             PTSTPTTTY   - SUBTIP FOR PAPERTAPE MODE TTY             * 
*             PTSTTTY     - SUBTIP FOR TTY/DISPLAY                    * 
*                                                                     * 
** NOTE     - THIS ROUTINE WILL NOT RETURN TO ITS CALLER, NOR WILL    * 
*             THE SUBTIPS RETURN (EXCEPT PTSTAUTO)                    * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTSTSTART (A4SSRSN : INTEGER);
  
BEGIN 
WITH A4TCBP'.BSTCB DO                       _INDEX TO TCB              ?
  BEGIN 
  BSASSRSN := A4SSRSN;                      _SUBTIP START REASON IN TCB?
  IF A4SSRSN = A2CFDPX                      _IF FULL DUPLEX, RETURN    ?
  THEN PTSTTTY                              _RESTART SUB-TIP           ?
  ELSE
  BEGIN 
  PTTERMIO (A2TINPUT,A2NOTDEL);             _TERMINATE INPUT           ?
    BSAORACT := BSAORACT & BSRGLOUT;        _CLEAR XOFF SEEN FLAG      ?
  IF BSASSRSN = A2SRUIVT
  THEN                                      _POSITION CURSOR AFTER     ?
    PTCURPOS (A2CPCL);                      _IVT COMMAND OR HOT BREAK  ?
_ 
* * * *  PERFORM AUTORECOGNITION IF REQUESTED BY AN IVT COMMAND 
? 
  IF BSAUREC
  THEN
    BEGIN 
   _IF BSTCLASS = N02741? 
   _THEN? 
      PTASEND (A4TCBP, A2MUNLK);            _UNLOCK 2741 KEYBOARD      ?
    PTOWAIT;                                _WAIT FOR OUTPUT COMPLETION?
    PTSTAUTO;                               _RESTART AUTO RECOGNITION  ?
    PTTERMIO (A2TINPUT,A2NOTDEL);           _TERMINATE INPUT           ?
    END;
_ 
* * * *  (RE)START THE REGULATION TIMER IF WE ARE IN REGULATION 
? 
  IF BSAIRSTAT " A2IRNONE 
  THEN                                      _WE ARE IN REGULATION,     ?
    PTSTIMER (A2TRIREGL);                   _(RE)START THE TIMER       ?
_ 
* * * *  START THE PROPER SUBTIP
? 
 _A4SRSET := [BSASSRSN];?                   _SET SUBTIP START REASON   ?
  IF BSTCLASS = N02741
  THEN                                      _START 2741 SUBTIP         ?
    BEGIN 
    PTINPUT (ASPT2I,0);                     _TURN INPUT ON FOR 2741    ?
    PTST2741; 
    END;
 _ELSE? 
     BEGIN
     IF BSINDEV = B8IPTAPE
     THEN 
       BEGIN
       PTINPUT (ASPTAI,0);                  _USE ECHO/OFF TABLE        ?
       PTSTPTTY;                            _START PAPER TAPE SUBTIP   ?
       END; _IF BSINDEV?
     IF BSECHOPEX                           _CHECK IF ECHOPTEX ON      ?
     THEN 
       BEGIN
       IF BSANECHO = FALSE                  _CHECK IF DBC IS SET       ?
       THEN 
         BEGIN
         PTINPUT (ASPTEP,0);                _NO, USE ECHO/ON TABLE     ?
         END
       ELSE                                 _ECHO = TRUE               ?
         BEGIN
         PTINPUT (ASPTAI,0);                _USE ECHO/OFF TABLE        ?
         END; _IF BSANECHO? 
       END
     ELSE                                   _ECHOPLEX IS SET TO OFF    ?
       PTINPUT (ASPTAI,0);                  _USE  ECHO/OFF  TABLE      ?
       END; _IF BSECHOPEX?
   PTSTTTY;                                 _START TTY/DISPLAY SUBTIP  ?
  END; _ ELSE IF A4SSRSN = A2CFDPX ?
  END; _WITH A4TCBP'.BSTCB DO?
END; _PROCEDURE PTSTSTART?
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*               S T A R T   O F   P T A S Y N C T I P                 * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
BEGIN 
A4DBGA [A4DBGI] := BWWLENTRY[OPS].B0TIPWLE; _SAVE WORKLIST ENTRY       ?
A4DBGI          := (A4DBGI + 1) MOD 25;     _UPDATE INDEX INTO ARRAY   ?
WITH BWWLENTRY [OPS].B0EWLQ DO              _INDEX EVENT WL ENTRY      ?
  BEGIN 
  A4INRCVD := FALSE;                        _INITIALIZE INPUT RECEIVED ?
  A4WRKCOD        := MMWKCODE;              _GET WORKCODE              ?
  A4BUFP          := MMIBP;                 _GET BUFFER ADDRESS        ?
  A4CMDOPS.NKLINO := MMLINO;                _GET LINE NUMBER           ?
  PBLCBP (MMLINO, A4LCBP);                  _GET THE LCB ADDRESS       ?
  END;
  
A4LCWTCNT := A4LCBP'.BZWTCOUNT;             _GET CONTENTION CNTR FM LCB?
A4TCBP    := A4LCBP'.BZTCBPTR;              _GET THE TCB ADDRESS       ?
  
IF A4LCBP'.BZAERRSN " A2ERRESET             _LINE NOT ACTIVE, ALLOW    ?
THEN                                        _FOLLOWING WRKCODES TO PASS?
  IF A4WRKCOD " A0SMEN
  THEN                                      _ENABLE LINE               ?
    IF A4WRKCOD " A0SMDA
    THEN                                    _DISABLE LINE              ?
      IF A4WRKCOD " A0SMDLTCB 
      THEN                                  _DELETE TCB                ?
        IF A4WRKCOD " A2WDELAY
        THEN                                _DELAY EXPIRED             ?
          IF A4WRKCOD " A2WTERMIO 
          THEN                              _TERMINATE I/O COMPLETE    ?
            IF A4WRKCOD " A0SMTCB 
            THEN                            _INITIALIZE NEW TCB        ?
              BEGIN 
              IF A4WRKCOD \ A2WBREAK
              THEN
                IF A4WRKCOD @ A2WEOP        _WORKCODE WITH POSSIBLE    ?
                THEN                        _BUFFER(S)                 ?
                  PBRELZRO (A4BUFP, BEDBSIZE);_RELEASE THEM            ?
              GOTO 999;                     _IGNORE THIS WORKCODE      ?
              END;
  
WITH A4TCBP'.BSTCB, A4LCBP' DO              _INDEX TO THE TCB AND LCB  ?
  
  CASE A4WRKCOD OF                          _CASE OUT THE RCVD WORKCODE?
  
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*          P R O C E S S   W O R K L I S T S   F R O M   S V M        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * *   E N A B L E   L I N E 
? 
  A0SMEN: 
    BEGIN 
    NAPORT'[A4CMDOPS.NKPORT].NARTSCON :=    _ASYNC LINES USE MAY USE   ?
                                      TRUE; _RTS FOR INPUT FLOW CONTROL?
    BZAERRSN := A2ERRESET;                  _CLEAR ERROR REASON FIELD  ?
    BZALNSPD := BZLNSPD;                    _SAVE ORIGINAL LINE SPEED  ?
    IF BZAUTO                               _AUTO RECOGNITION REQUESTED?
    THEN
      BEGIN 
      A4TCBP   := PBGET1BF (BEDBSIZE);      _GET TEMPORARY TCB BUFFER  ?
      BZTCBPTR := A4TCBP;                   _INSERT TCB PTR IN LCB     ?
      PBCLR  (A4TCBP, DBUFLEN);             _CLEAR THE TEMPORARY TCB   ?
_ 
* * * *  (NOTE: THE INDEX TO THE TCB IS NOT SET AT THIS POINT)
? 
      A4TCBP'.BSTCB.BSLCBP   := A4LCBP;     _INSERT LCB PTR IN TCB     ?
      A4TCBP'.BSTCB.BSASSRSN := A2SRAUTO;   _SET SUBTIP START REASON   ?
      IF BZLTYP = N0L6
      THEN                                  _DIAL UP LINE TYPE,        ?
        PTSTIMER (A2TRAUTO);                _START TIMER               ?
      PTSTAUTO;                             _PERFORM AUTO RECOGNITION  ?
_ 
* * * *  (NOTE: TCB INDEX NOW SET)
? 
      PTSTIMER (A2TRRESET);                 _RESET THE TIMER           ?
      PBREL1BF (BZTCBPTR, BEDBSIZE);        _RELEASE TEMP TCB          ?
      END _IF BZAUTO THEN?
    ELSE                                    _NO AUTO RECOGNITION LINE  ?
      BZHIAUTO := BZLNSPD \ N02400;         _SET RANGE FOR RE-AUTOREC  ?
    WITH BWWLENTRY [OPS].CMSMLEY DO 
      BEGIN 
      CMWKCODE := D0LINE;                   _LINE EVENT WORKCODE       ?
      CMDATA   := D5OPER;                   _LINE OPERATIONAL          ?
      END;
    PBLSPUT (BWWLENTRY [OPS],               _SEND WLE TO SVM           ?
             BYWLCB [B0SMWL]);
    END;
_ 
* * * *   D I S A B L E   L I N E 
? 
  A0SMDA: 
    BEGIN 
    BZLNSPD    := BZALNSPD;                 _RESTORE LINE SPEED        ?
    PTLINDOWN (A2ERDIS);                    _DISABLE THE LINE          ?
    END;
_ 
* * * *   I N I T I A L I Z E   N E W   T C B 
? 
  A0SMTCB:  
    BEGIN 
    IF BZAERRSN = A2ERDTCB                  _IF LINE IS DOWN BECAUSE   ?
    THEN                                    _TCB WAS DELETED           ?
      BZAERRSN := A2ERRESET;                _CLEAR ERROR REASON FIELD  ?
    IF BZAERRSN = A2ERRESET                 _IF LINE IS NOT DOWN       ?
    THEN                                    _THEN                      ?
      PTSTSTART (A2SRCTCB);                 _RESTART THE PROPER SUBTIP ?
    END;
_ 
* * * *   D E L E T E   T C B 
? 
  A0SMDLTCB:  
    BEGIN 
    BZAERRSN := A2ERDTCB;                   _SET ERROR REASON IN LCB   ?
    BSABRACT := FALSE;                      _CLEAR BREAK ACTIVE        ?
    PTTERMIO (A2TINOUT,A2DELT);             _TERMINATE INPUT/OUTPUT    ?
    IF BWWLENTRY [OPS].B0EWLQ.MMWD0.BAINT = A2NOTDEL
    THEN                                    _ONLY PROCESS CORRECT WORK ?
      GOTO 999;                             _LIST ENTRY ELSE EXIT PDQ  ?
    BSAORACT := FALSE;                      _CLEAR XOFF SEEN FLAG      ?
    WITH BWWLENTRY [OPS].CMSMLEY DO 
      BEGIN 
      CMWKCODE := D0TCB;                    _TCB EVENT WORKCODE        ?
      CMDATA   := D5DELE;                   _DELETE TCB                ?
      CMPTR    := A4TCBP;                   _PASS TCB POINTER          ?
      END;
    PBLSPUT (BWWLENTRY [OPS],               _SEND TERM RECONFIGURED    ?
             BYWLCB [B0SMWL]);              _TO SVM                    ?
    BZTCBPTR := NIL;                        _REMOVE TCB PTR FROM LCB   ?
    END;
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*      P R O C E S S   W O R K L I S T S   F R O M   S Y S T E M      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * *   H A R D   E R R O R   R E C O G N I Z E D 
? 
  A0HARDERR:  
    BEGIN 
    PTLINDOWN (A2ERHARD);                   _BRING LINE DOWN           ?
    END;
_ 
* * * *   T I M E O U T   E V E N T   O C C U R R E D 
? 
  A0TIMEOUT:  
    BEGIN 
    IF BZATMRSN = A2TRIREGL 
    THEN                                    _INPUT REGL TIMER EXPIRED  ?
      BEGIN 
      PTIREGL;                              _GET INPUT REGULATION LEVEL?
      IF BSAOUSTAT + A4CURGLV = A2IRNONE
      THEN                                  _OUT OF INPUT REGULATION   ?
        BEGIN                               _AND OUTPUT NOT ACTIVE     ?
  
        IF BSARTSFC                         _IF RTS DROPPED THEN       ?
        THEN                                _RAISE IT AND END RTS      ?
          PTARTS (A4TCBP,TRUE);             _FLOW CONTROL              ?
  
        IF A4REGLVL = A2IRSYS 
        THEN                                _HAVE SENT WAIT..          ?
          BEGIN 
          PTASEND   (A4TCBP, A2MREPEAT);    _SEND REPEAT..             ?
          PTASEND   (A4TCBP, A2MCR);        _SEND CARRIAGE RETURN      ?
          PTASEND   (A4TCBP, A2MLF);        _AND LINE FEED             ?
          IF BSRGLIN                        _IF XOFF SENT              ?
          THEN                              _THEN                      ?
            PTASEND (A4TCBP, A2MXON);       _SEND XON TO TERMINAL      ?
          BSAIRSTAT := A2IRNONE;            _END OF REGULATION         ?
          PTSTSTART (A2SRREGL);             _RESTART THE SUBTIP        ?
          END;
        PTASEND (A4TCBP, A2MXON);           _SEND XON TO TERMINAL      ?
        BSAIRSTAT := A2IRNONE;              _END OF REGULATION         ?
        END 
      ELSE                                  _REMAIN IN INPUT REGULATION?
        BEGIN 
        PTSTIMER (A2TRIREGL);               _RESTART THE TIMER         ?
        BSAWBACT  := FALSE;                 _CLEAR WAIT FOR EOB FLAG   ?
        BSAINSTAT := 0;                     _CLEAR INPUT ACTIVE FLAG   ?
        IF BSAPWACT                         _IF PAGE WAIT ACTIVE       ?
        THEN
          BEGIN                             _BUMP THE PAGE WAIT TIMER  ?
          BSAPWTMR := BSAPWTMR + 1;         _AND                       ?
          IF BSAPWTMR \ A2TMPW              _IF 30 SECONDS HAVE EXPIRED?
          THEN                              _THEN                      ?
            BEGIN 
            BSAPWTMR := 0;                  _CLEAR THE TIMER           ?
            BSAPWACT := FALSE;              _CLEAR PAGE WAIT AND       ?
            PTERETURN;                      _GO DO MORE OUTPUT         ?
            END;                            _ELSE                      ?
          GOTO 10                           _SAVE THE TIMER            ?
          END;                              _IF PAGE WAIT CLEARED      ?
        BSAPWTMT := 0;                      _                          ?
        PTERETURN;                          _RETURN TO REQUESTOR AND   ?
10:     END;                                _RESET THE PAGE WAIT TIMER ?
      END; _IF BZATMRSN = A2TRIREGL?
  
    IF BZATMRSN = A2TRAUTO
    THEN                                    _AUTO RECOGN. TIMER EXPIRED?
      PTLINDOWN (A2ERAUTO);                 _AUTO RECOGNITION FAILED   ?
  
    IF BZATMRSN = A2TREVENT 
    THEN                                    _EVENT TIMER EXPIRED       ?
      PTERETURN;                            _RETURN TO REQUESTOR       ?
    END;
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*          P R O C E S S   R E G U L A T I O N   E V E N T S          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * *   ( M U X )   B U F F E R   R E G U L A T I O N 
? 
  A2WREGL:  
    BEGIN 
    A4BUFP := NIL;                          _BUFFERS ALREADY RELESED   ?
_ 
* * * *  ENTRY POINT FOR SYSTEM REGULATION DETECTED BY PTPSTINPUT 
*        (NOTE: UPON ENTRY, THE INDEX TO THE LCB IS NOT SET)
? 
100:  
    PBRELZRO  (A4BUFP, BEDBSIZE);           _RELEASE INPUT BUFFERS     ?
    BSAIRSTAT := A2IRSYS;                   _SYSTEM REGULATION ACTIVE  ?
    PTSTIMER  (A2TRRESET);                  _TERMINATE OLD TIMER       ?
    PTTERMIO  (A2TINOUT,A2NOTDEL);          _TERMINATE INPUT/OUTPUT    ?
    BSAORACT := FALSE;                      _CLEAR XOFF SEEN FLAG      ?
    IF BSRGLIN                              _IF INPUT REGULATION IS ON ?
    THEN
      PTASEND (A4TCBP,A2MXOFF);             _SEND X-OFF OR LOCK 2741   ?
    IF BSARTSFC 
    THEN
      PTARTS (A4TCBP, FALSE);               _START RTS FLOW CONTROL    ?
    PTCURPOS  (A2CPCL);                     _POSITION CURSOR           ?
    PTASEND   (A4TCBP, A2MWAIT);            _SEND WAIT..               ?
    PTOWAIT;                                _WAIT FOR OUTPUT COMPLETE  ?
    PTCURPOS  (A2CPCL);                     _CR/LF (NOT FOR 2741)      ?
    PTSTSTART (A2SRWAIT);                   _CONTINUE OUTPUT           ?
    END;
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*      P R O C E S S   I / O   C O M P L E T I O N   E V E N T S      * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * *   E N D   O F   P H Y S I C A L   L I N E   S E E N 
? 
  A2WEOP: 
    BEGIN 
    BSAWBACT        := TRUE;                _WAITING FOR EOB ACTIVE    ?
    A4FLGWRD.KTWORD := A2FWBLOCK;           _SET BIPS SILLY FLAGWORD   ?
    IF BSUBZ = 0                            _UPLINE BLOCKING FACTOR    ?
    THEN
      BEGIN 
      A4FLGWRD.KTSEND := NOT A4BUFP'.BFEOR; _SEND IF TERMINATED BY LF  ?
      END;
_ 
* * * *  CONTINUATION POINT FOR ALL INPUT TYPES (EOP/EOL/EOB) 
? 
200:  
    BSABLSTAT := A4WRKCOD - A2WEOB;         _BLOCK STATE EOB/EOL/EOP   ?
    IINT;                                   _INHIBIT INTERRUPTS WHILE  ?
    IF BSAINACNT " 0                        _IF INPUT ACTIVE COUNT     ?
    THEN
    BEGIN 
      BSAINACNT := BSAINACNT - 1;           _DECREMENT COUNT           ?
      IF BSAINACNT = 0                      _IF COUNT GOES TO ZERO     ?
      THEN
        BSAINSTAT := 0;                     _CLEAR INPUT ACTIVE STATE  ?
    END;
    EINT; 
_ 
* * * *  TEST FOR INPUT REGULATION, SEND A XOFF IF LOW ON BUFFERS 
? 
    PTIREGL;                                _GET INPUT REGULATION LEVEL?
    IF (BSRGLIN ! BSARTSFC) 
    THEN                                    _INPUT REGULATION ACTIVE   ?
      IF A4REGLVL = A2IRXOFF
      THEN
        IF NOT (BSAIRSTAT = A2IRXOFF)       _IF NOT ALREADY SENT       ?
        THEN                                _SEND XOFF                 ?
        BEGIN                               _WE ARE IN INPUT REGULATION?
        IF BSRGLIN
        THEN
          PTASEND (A4TCBP, A2MXOFF);        _SEND XOFF TO TERMINAL     ?
        IF BSARTSFC 
        THEN
          PTARTS (A4TCBP, FALSE);           _START RTS FLOW CONTROL    ?
        PTSTIMER (A2TRIREGL);               _START INPUT REGUL. TIMER  ?
        BSAIRSTAT := A2IRXOFF;
        END;
_ 
* * * *  RETURN TO SUBTIP WITH INPUT RECEIVED FLAG SET
? 
300:  
    A4INRCVD := TRUE; 
    PTERETURN;                              _RETURN TO CALLER PTEWAIT  ?
_ 
* * * *  IF RETURN IS CANCELLED, FALL THROUGH, RELEASE INPUT BUFFERS
? 
    PBRELZRO (A4BUFP, BEDBSIZE);            _RELEASE INPUT BUFFERS     ?
    END;
_ 
* * * *   E N D   O F   L O G I C A L   L I N E   S E E N 
? 
  A2WEOL: 
    BEGIN 
    BSAWBACT := BSINDEV " B8KEYBOARD;       _AWAIT EOB IF NOT KEYBOARD ?
_ 
* * * *  CONTINUATION POINT FOR INPUT TYPES EOL AND EOB 
? 
400:  
    A4FLGWRD.KTWORD   := A2FWSEND;          _PRESET BIPS FLAGWORD      ?
    A4FLGWRD.KTCKSPEC := A4BUFP'.BFAIVT;    _GET POSSIBLE IVT CMD FLAG ?
    IF BSAPWACT ! BSABRACT
    THEN                                    _PAGE WAIT OR BREAK SEEN   ?
      BEGIN 
      A4FLGWRD.KTWORD := A2FWPTURN;         _SET FLAGWORD FOR PAGE TURN?
      BSABRACT        := FALSE;             _CLEAR BREAK SEEN FLAG     ?
      END;
    GOTO 200; 
    END;
_ 
* * * *   E N D   O F   B L O C K   ( S C R E E N )   S E E N 
*                       (OR XOFF AFTER EOL IN PAPERTAPE MODE) 
? 
  A2WCHOUT,                                 _XPARENT CHARACTER TIME OUT?
  A2WEOB: 
    BEGIN 
    IF A4WRKCOD = A2WCHOUT                  _IF CHARACTER TIME OUT     ?
    THEN
      BEGIN 
      IF A4BUFP = NIL                       _IF NO INPUT BUFFER        ?
      THEN
        BEGIN 
        A4BUFP := PBGET1BUF (BEDBSIZE);     _ALLOCATE A DUMMY BUFFER   ?
        A4BUFP'.BIINT[LFCD]  := DBC * $100  _SET LCD AND FCD TO        ?
                                + DBC;
        A4BUFP'.BFDATAC[DBC] := CHR (0);    _SET DBC                   ?
        A4BUFP'.BFXPT        := BSXPT;      _GET XPARENT FLAG FROM TCB ?
        END;
      A4WRKCOD := A2WEOB;                   _PROCESS AS END OF BLOCK   ?
      END;
    BSAXTACT := FALSE;                      _CLEAR XPT INPUT TIMER FLAG?
    BSAWBACT := FALSE;
    IF BSABLSTAT = A2EOLRCVD
    THEN                                    _PREVIOUS INPUT WAS EOL    ?
      IF A4BUFP'.BFLCD = DATA               _AND THIS EOB IS EMPTY     ?
      THEN                                  _THEN RELEASE INPUT        ?
        PBRELZRO (A4BUFP, BEDBSIZE);
    GOTO 400;                               _PROCESS AS EOL IN KB MODE ?
    END;
_ 
* * * *   S E C U R I T Y   C H A R A C T E R   D E T E C T E D 
? 
  A2WSCHAR: 
    BEGIN 
    BSAWBACT := FALSE;                      _DO NOT AWAIT EOB          ?
    PBRELZRO (A4BUFP, BEDBSIZE);            _RELEASE POSSIBLE INPUT    ?
    A4BUFP   := PBGET1BF (BEDBSIZE);        _GET A NEW BUFFER          ?
    IF BSTCLASS = N02741
    THEN                                    _STORE 2741 SECURITY CHAR  ?
      A4BUFP'.BIINT [DBC/2+1] := SCA2741
    ELSE                                    _STORE ASCII SECURITY CHAR ?
      A4BUFP'.BIINT [DBC/2+1] := SCAN2741;
    A4BUFP'.BIINT [LFCD] := (DATA + 1)      _SET LCD AND FCD           ?
                            * $100 + DATA;
    A4BUFP'.BFAIVT       := TRUE;           _SET FLAG TO CHECK SPECIAL ?
    A4BUFP'.BFATRUST     := TRUE;           _SET TRUSTED PATH DETECTED ?
    A4WRKCOD             := A2WEOB;         _ENSURE VALID BLOCK STATE  ?
    GOTO 400;                               _PROCESS AS EOL IN KB MODE ?
    END;
_ 
* * * *   B R E A K   C O N D I T I O N   D E T E C T E D 
? 
  A2WBREAK: 
    BEGIN 
    A4FLGWRD.KTWORD := A2FWBREAK;           _BREAK DETECTED (FOR BIP)  ?
    BSABRACT        := TRUE;                _SET BREAK ACTIVE          ?
    GOTO 300; 
    END;
_ 
* * * *   O U T P U T   B U F F E R   T R A N S M I T T E D 
? 
  A2WOUBX:  
    IF BSAWLACT 
    THEN                                    _THIS WORKLIST EXPECTED    ?
      BEGIN 
      IF NOT BSACMACT                       _IF OUTPUT NOT ACTIVE      ?
      THEN
_ 
* * * *  PERFORM DELAY AFTER CLEAR SCREEN SEQUENCE SENT 
? 
        IF BSADELAY 
        THEN                                _DELAY REQUESTED AFTER     ?
          BEGIN 
          A4WORK.BAINT := A4CSDELAY         _GET REQUIRED DELAY        ?
                          [BSTCLASS]; 
          IF A4WORK.BAINT " 0 
          THEN
            PTCHDELAY (A4WORK.BAINT);       _PERFORM CLEAR SCREEN DELAY?
          BSADELAY := FALSE;                _RESET DELAY REQUEST       ?
          END;
_ 
* * * *  RETURN TO CALLER AFTER ALL PENDING CANNED MESSAGES ARE SENT
? 
500:  
      IF BSABRACT 
      THEN                                  _AFTER BREAK KEY, DELAY    ?
        PTCHDELAY (A2DLBREAK);              _UNTIL BREAK COMPLETE      ?
      BSAWLACT := FALSE;                    _RESET WORKLIST EXPECTED   ?
      IF BSANECHO                           _CHECK DBC FLAG            ?
      THEN
        BEGIN 
        IF BSECHOPEX                        _CHECK ECHOPLEX FLAG       ?
        THEN
          PTSTSTART (A2SRDIVT);             _GET CORRECT STATE ADR PTR ?
      END; _IF BSANECHO?
      PTERETURN;                            _RETURN TO PTEWAIT CALLER  ?
      END; _IF BSAWLACT?
_ 
* * * *   T E R M I N A T E   O U T P U T   C O M P L E T E D 
? 
  A2WTOUTP: 
    BEGIN 
   _IF BSATOACT?
   _THEN? 
      BEGIN 
      BSAWLACT := TRUE;                     _EXPECTING WORK LIST       ?
      BSATOACT := FALSE;                    _RESET TERMINATE OUTPUT    ?
   GOTO 500;                                _RETURN                    ?
      END;
    END;
_ 
* * * *   R E G U L A T I O N   X O N   R E C E I V E D 
? 
  A2WXON: 
    BEGIN 
    PTERETURN;                              _RETURN TO CALLER PTEWAIT  ?
    END;
_ 
* * * *   O U T P U T   I N   Q U E U E 
? 
  A0QUEOUT: 
    BEGIN 
   _IF BSAIOSTAT = A2STIDLE?
   _THEN?                                   _TERMINAL CURRENTLY IDLE   ?
      PTERETURN;                            _RETURN TO PTEWAIT CALLER  ?
    END;
_ 
* * * *   C H A R A C T E R   D E L A Y   E X P I R E D 
? 
  A2WDELAY: 
    BEGIN 
    PBREL1BF (A4BUFP, B0S8);                _RELEASE TIMER PACKET BUFR ?
    IF A4LCWTCNT = BWWLENTRY [OPS]. 
       B0EWLQ.MMWTCOUNT 
    THEN                                    _MATCHING WAIT COUNTS,     ?
      PTDRETURN;                            _RETURN TO CALLER PTCHDELAY?
    END;
_ 
* * * *   T E R M I N A T E   I / O   C O M P L E T E D 
? 
  A2WTERMIO:  
    BEGIN 
    IF BSABRACT 
    THEN                                    _HOT BREAK KEY RECOGNIZED  ?
      IF BSAOUSTAT = A2STIDLE 
      THEN                                  _IF OUTPUT WAS NOT ACTIVE  ?
        PTCHDELAY (A2DLBREAK)               _DELAY UNTIL BREAK COMPLETE?
      ELSE                                  _OUTPUT ACTIVE (TERMOUT)   ?
        PTOWAIT;                            _WAIT FOR ITS COMPLETION   ?
    BSATIFLGS := 0;                         _CLEAR INACT,BRK,WEOB,XPTMR?
    BSAINACNT := 0;                         _ZERO INPUT ACTIVE COUNT   ?
    BSAWIFLGS := 0;                         _CLEAR AWAIT INPUT FLAGS   ?
    PTTSRETURN;                             _RETURN TO CALLER PTTERMIO ?
    END;
_ 
* * * *   A U T O   R E C O G N I T I O N   W O R K C O D E S 
? 
  A2W110,   _A2WASCII,? 
  A2W134,   _A2WTPAPL,? 
  A2W150,   _A2WBPAPL,? 
  A2W300,   _A2WEBCD, ? 
  A2W301,   _A2WEAPL, ? 
  A2W600,   _A2WCORR, ? 
  A2W1200,  _A2WCAPL, ? 
  A2W2400,
  A2WFAILAR:  
    BEGIN 
    PTERETURN;
    END;
_ 
* * * *   D O W N L I N E   B R E A K   R E C E I V E D 
? 
  A0BREAK:  
    BEGIN                                   _IF A DL BREAK OCCURS      ?
    A4FLGWRD.KTWORD := HTRESET;             _SET FLAG WORD FOR RESET   ?
    PBULTS (A4TCBP,NIL,A4FLGWRD);           _SHIP A RESET BLOCK        ?
    PTATOUTPUT (A4TCBP);                    _TERMINATE OUTPUT          ?
    PTSTSTART (A2SRDIVT);                   _RESTART TIP AS DL IVT CMD ?
    END;
  
  END; _WITH A4TCBP'.BSTCB, A4LCBP' DO / CASE A4WRKCOD OF?
_ 
* * * *   R E T U R N   T O   O P S   M O N I T O R   (GOTO EXIT 999) 
? 
999:                                        _EXIT TO OPS MONITOR       ?
A4INRCVD := FALSE;                          _AFTER CLEARING LOCAL FLAG ?
END; _PROCEDURE PTASYNCTIP? 
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * 
*                                             * 
*                P T A D L T S                * 
*                                             * 
*        DOWNLINE TIP SERVICES ROUTINE        * 
*                                             * 
* * * * * * * * * * * * * * * * * * * * * * * * 
* 
?_$I-,R-,G-     INTERRUPTABLE, NON-RECURSIVE. 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE IS CALLED BY BIPS DOWNLINE TIP SERVICES    * 
*             ROUTINE PRIOR TO OUTPUT BEING PLACED IN THE DOWNLINE    * 
*             QUEUE. THE MAIN PURPOSE OF THIS ROUTINE IS TO LOOK      * 
*             FOR DOWNLINE ICMDS OF THE TYPE ABORT OUTPUT.            * 
*                                                                     * 
** INPUT    - TCB POINTER AND BUFFER POINTER (PARAMETERS)             * 
*                                                                     * 
** OUTPUT   - WORKLIST ENTRY SEND TO OPS LEVEL TIP UPON RECOGNITION   * 
*             OF THE DOWNLINE ABORT I-COMMAND                         * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PBDLTS      - DOWNLINE TIP SERVICES (BIP)               * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PBRELCHN    - RELEASE CHAIN OF BUFFERS                  * 
*             PTATOUTPUT  - TERMINATE OUTPUT                          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTADLTS (A4DLTCB : B0BUFPTR; VAR A4DLBUF : B0BUFPTR); 
  
BEGIN 
IF A4DLBUF'.BIINT [BTWD] = HTICMD 
THEN                                        _RECOGNIZED D/L I-COMMAND  ?
_ 
* * * *  I-COMMAND, RELEASE D/L BLOCK AND TERMINATE/RELEASE OUTPUT
? 
  BEGIN 
  PBRELCHN   (A4DLBUF, BEDBSIZE);           _RELEASE I-CMD BLOCK       ?
  PTATOUTPUT (A4DLTCB);                     _TERMINATE/RELEASE OUTPUT  ?
  END;
END; _PROCEDURE PTADLTS?
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * 
*                                             * 
*           P T M X A S Y N C T I P           * 
*                                             * 
*       BLOCK MODE ASYNCTIP (MUX LEVEL)       * 
*                                             * 
* * * * * * * * * * * * * * * * * * * * * * * * 
* 
?_$I-,R-,G-     INTERRUPTABLE, NON-RECURSIVE. 
* 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - MUX LEVEL PASCAL PART OF THE ASYNCHRONOUS BLOCK MODE    * 
*             TIP. ALL MUX LEVEL WORKLIST ENTRIES ARE PROCESSED       * 
*             BY THIS MODULE.                                         * 
*                                                                     * 
** INPUT    - WORKLIST ENTRIES FROM:                                  * 
*                 1) MUX SUBSYSTEM                                    * 
*                 2) ASYNCTIP INPUT STATES                            * 
*                                                                     * 
** OUTPUT   - WORKLIST ENTRIES SEND TO OPS LEVEL TIP, COMMAND         * 
*             ISSUED TO COMMAND DRIVER.                               * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PMWOLP      - MUX LEVEL WORKLIST PROCESSOR              * 
*                                                                     * 
** INTENAL SUBROUTINES (IN ORDER OF DECLARATION) -                    * 
*             PTMSNDWLE   - SEND WORKLIST ENTRY TO OPS LEVEL TIP      * 
*             PTMTISNDW   - TERMINATE INPUT, SEND WLE TO OPS          * 
*             PTMSTOPOUT  - STOP OUTPUT                               * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PTASEND     - SEND A CANNED MESSAGE                     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTMXASYNCTIP; 
  
CONST 
*CALL ASYNCON 
  
VAR 
  A4LINENO  : INTEGER;                      _LINE NUMBER               ?
  A4MWKCOD  : INTEGER;                      _RECEIVED MUX WORKCODE     ?
  A4LCMP    : BZLCBP;                       _CURRENT LCB POINTER       ?
  A4TCMP    : B0BUFPTR;                     _CURRENT TCB POINTER       ?
  A4CMDMUX  : NKINCOM;                      _MUX COMMAND PACKET        ?
  A4INACTC  : INTEGER;                      _LOCAL INPUT ACTIVE COUNTER?
  A4WRK1    : B0OVERLAY;                    _LOCAL WORK VARIABLE       ?
  A4WRK2    : B0OVERLAY;                    _LOCAL WORK VARIABLE       ?
  
VALUE 
  A4CMDMUX  = (B0ASYNC);
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T M S N D W L E   -   SEND WORKLIST ENTRY TO OPS LEVEL     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE BUILDS AND SENDS A WORKLIST ENTRY OF A     * 
*             GIVEN WORKCODE TO THE OPS LEVEL ASYNC BLOCK MODE TIP.   * 
*                                                                     * 
** INPUT    - WORKCODE TO SEND TO OPS LEVEL TIP (PARAMETER)           * 
*                                                                     * 
** OUTPUT   - WORKLIST ENTRY BUILD AND SEND                           * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTMXASYNCT  - WORKLIST MMOBUX, OUTPUT BUFFER XMITTED    * 
*                           WORKLIST A2WXON, XON RECEIVED             * 
*                           WORKLIST MMBREAK, BREAK RECOGNIZED        * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PBLSPUT     - SEND WORKLIST ENTRY                       * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTMSNDWLE (A4OPSWK : INTEGER);
  
BEGIN 
WITH BWWLENTRY [MUX2].B0EWLQ DO             _INDEX MUX EVENT WLE       ?
  BEGIN 
  MMWKCODE := A4OPSWK;                      _INSERT WORKCODE           ?
  MMIBP    := NIL;                          _CLEAR PASSED BUFFER PTR   ?
  PBLSPUT (BWWLENTRY [MUX2],
           BYWLCB [B0ASYNC]);               _SEND WLE TO OPS LEVEL TIP ?
  END;
END; _PROCEDURE PTMSNDWLE?
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T M T I S N D W   -   TERMINATE INPUT, SEND WLE TO OPS     * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE TERMINATES INPUT AND SENDS A WORKLIST      * 
*             TO THE OPS LEVEL TIP AFTER INPUT IS TERMINATED          * 
*                                                                     * 
** INPUT    - WORKCODE TO SEND TO OPS LEVEL TIP (PARAMETER)           * 
*                                                                     * 
** OUTPUT   - INPUT TERMINATED, WORKLIST SEND TO OPS LEVEL TIP        * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTMXASYNCT  - WORKLIST A2WINACT, INPUT ACTIVE           * 
*                           WORKLIST MMCHOUT, INPUT CHAR TIME OUT     * 
*                           WORKLIST MMBREAK, BREAK RECOGNIZED        * 
*             PMCDRV      - COMMAND DRIVER                            * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTMTISNDW (A4OPSWK : INTEGER);
  
BEGIN 
A4CMDMUX.NKCMD   := NKENDIN;                _TERMINATE INPUT COMMAND   ?
A4CMDMUX.NKWKCOD := A4OPSWK;                _WORKCODE FOR OPS LEVEL TIP?
A4CMDMUX.NKWKFLG := TRUE;                   _SEND WORKLIST TO OPS LEVEL?
PMCDRV (A4CMDMUX);                          _ISSUE COMMAND             ?
END; _PROCEDURE PTMTISNDW?
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P T M S T O P O U T   -   STOP OUTPUT, SAVE NOT XMITTED TEXT * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
** OVERVIEW - THIS ROUTINE TERMINATES CURRENT OUTPUT, CALCULATES THE  * 
*             FIRST CHARACTER THAT HAS NOT BEEN SENT OUT AND          * 
*             RELEASES THE BUFFERS WITH COMPLETELY TRANSMITTED TEXT   * 
*                                                                     * 
** INPUT    - A4LCMP, A4TCMP                                          * 
*                                                                     * 
** OUTPUT   - NOT TRANSMITTED TEXT SAVED IN BZLBTOMUX (LCB)           * 
*                                                                     * 
** CALLING SUBROUTINES -                                              * 
*             PTMXASYNCT  - WORKLIST A2WXOFF, XOFF RECEIVED           * 
*                           WORKLIST A2WINACT, INPUT ACTIVE           * 
*                           WORKLIST MMBREAK, BREAK RECOGNIZED        * 
*                                                                     * 
** EXTERNAL SUBROUTINES USED -                                        * 
*             PBREL1BF    - RELEASE A BUFFER                          * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
PROCEDURE PTMSTOPOUT; 
  
VAR 
  A4PTP     : 'NAPORY;                      _PORT TABLE POINTER        ?
  
BEGIN 
IF A4TCMP'.BSTCB.BSABFACT                   _BUFFERED OUTPUT ACTIVE    ?
THEN
  BEGIN 
  ADDR (NAPORT' [A4CMDMUX.NKPORT], A4PTP);  _GET PORT TABLE POINTER    ?
  A4PTP'.NASTOUT  := TRUE;
  A4PTP'.NAOON    := FALSE;                 _MAKE SURE OUTP IS STOPPED ?
  END; _IF BSABFACT?
END; _PROCEDURE PTMSTOPOUT? 
_$J+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*             S T A R T   O F   P T M X A S Y N C T I P               * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
BEGIN 
WITH BWWLENTRY [MUX2].B0EWLQ DO             _INDEX EVENT WL ENTRY      ?
  BEGIN 
  A4MWKCOD        := MMWKCODE;              _GET WORKCODE              ?
  A4CMDMUX.NKLINO := MMLINO;                _GET LINE NUMBER IN CMDPKT ?
  A4LINENO        := MMLINO;                _GET LINE NUMBER LOCAL     ?
  PBLCBP (MMLINO, A4LCMP);                  _GET THE LCB ADDRESS       ?
  END;
  
A4TCMP := A4LCMP'.BZTCBPTR;                 _GET TCB TCB ADDRESS       ?
  
IF A4TCMP " NIL                             _TCB STILL ALLOCATED       ?
THEN
  BEGIN 
  WITH A4TCMP'.BSTCB, 
       BWWLENTRY [MUX2].B0EWLQ DO 
  
    CASE A4MWKCOD OF                        _CASE OUT THE WORKCODE     ?
  
_$J+? 
_ 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
*                                                                     * 
*        P R O C E S S   M U X   L E V E L   W O R K L I S T S        * 
*                                                                     * 
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
? 
_ 
* * * *   O U T P U T   B U F F E R S   T R A N S M I T T E D 
? 
    MMOBUX: 
      BEGIN 
      IF BSAOUSTAT \ A2SOCMACT
      THEN                                  _OUTPUT WAS STILL ACTIVE   ?
        BEGIN 
        PBRELZRO  (A4LCMP'.BZLBTOMUX, 
                   BEDBSIZE);               _RELEASE XMITTED BUFFERS   ?
      BSABFACT := FALSE;                    _RESET BUFFERED OUTPUT     ?
      IF BSACMACT                           _IF CANNED MSG ACTIVE      ?
      THEN
_ 
* * * *  REMOVE CANNED MESSAGE FROM STACK 
? 
      BEGIN 
        BSACMACT := FALSE;                  _RESET CANNED MESSAGE FLAG ?
        BSACMCTR := BSACMCTR -1;            _DECREMENT CANNED COUNT    ?
        BSACMSTACK := BSACMUP3;             _REMOVE CM INDEX           ?
      END;
      IF BSACMCTR " 0                       _IF MORE CANNED MESSAGES   ?
      THEN
        PTACMSG (A4TCMP)                    _OUTPUT NEXT CANNED MESSAGE?
      ELSE
10: 
        IF BSAWLACT = FALSE 
        THEN                                _FIRST WORKLIST            ?
          BEGIN 
          PTMSNDWLE (A2WOUBX);              _PASS WL TO OPS LEVEL TIP  ?
          BSAWLACT  := TRUE;                _OPS WAITING FOR OUBX WLE  ?
          BSABFACT  := FALSE;               _END OF BUFFERED OUTPUT    ?
          END;
        END;
      END;
_ 
* * * *   O U T P U T   S T O P P E D   B Y   I N P U T   S T A T E S 
*                                       (INPUT ACTIVE OR XOFF SEEN) 
? 
    MMSTPOUT: 
      BEGIN 
      IF BSABFACT                           _BUFFERED OUTPUT ACTIVE    ?
      THEN                                  _ACTIVE OUTPUT STOPPED     ?
        BEGIN 
        WITH  A4WRK1  DO
          BEGIN 
_ 
* * * *  CALCULATE NEXT FCD,  RELEASE TRANSMITTED BUFFER(S) 
? 
          A4WRK2.BABUFPTR :=                _RAW OUTPUT POINTER        ?
                             NAPORT'[A4CMDMUX.NKPORT].NALCBP'.NCOBP;
          BASET := A4WRK2.BASET -           _MASK TO FWA OF BUFFER     ?
                   BEDBSIZE'.BEMSK.BASET; 
          BABUFPTR'.BFFCD := (A4WRK2.BAINT -
                             BAINT) * 2;    _SET NEW FCD IN BUFFER     ?
          A4WRK2.BABUFPTR :=                _GET FIRST BUFFER POINTER  ?
                             A4LCMP'.BZLBTOMUX; 
          WHILE A4WRK2.BABUFPTR " BABUFPTR  _RELEASE ALL XMITTED BUFRS ?
          DO
            PBREL1BF(A4WRK2.BABUFPTR, 
                     BEDBSIZE); 
_?
          BSAOUBUF   :=  BABUFPTR;          _SET BUFFER POINTER IN LCB ?
          A4LCMP'.BZLBTOMUX  :=  NIL; 
          END;  _ WITH A4WRK1 DO ?
        BSABFACT := FALSE;                  _OUTPUT HAS BEEN STOPPED   ?
        IF NOT BSAORACT                     _IF NOT OUTPUT REGULATION  ?
        THEN                                _BUILD WL OBT              ?
        GOTO 10;                            _SEND A2WOUBX TO OPS LEVEL ?
        END;
      END;
_ 
* * * *   L F   S E E N   ( W I T H   B F = 0 ) 
? 
    A2WLF:  
      BEGIN 
      PTASEND (A4TCMP, A2MCR);              _SEND CR TO POSITION CURSOR?
      END;
_ 
* * * *   R E G U L A T I O N   X O F F   R E C E I V E D 
? 
    A2WXOFF:  
      BEGIN 
      BSAORACT := TRUE;                     _SET OUTPUT REGULATION ACT.?
      PTMSTOPOUT;                           _STOP CURRENT OUTPUT       ?
      END;
_ 
* * * *   R E G U L A T I O N   X O N   R E C E I V E D 
? 
    A2WXON: 
      BEGIN 
      BSAORACT := FALSE;                    _RESET OUTPUT REGULATION   ?
      IF BSAWOSTAT = 0                      _OK TO SEND TP-ED OUTPUT   ?
      THEN
        PTMSNDWLE (A2WXON);                 _PASS WLE TO OPS LEVEL TIP ?
      END;
_ 
* * * *   I N P U T   A C T I V E   ( F I R S T   C H A R A C T E R ) 
? 
    A2WINACT: 
      BEGIN 
      PTMSTOPOUT;                           _STOP CURRENT OUTPUT       ?
      A4INACTC := BSAINACNT + 1;            _INCREMENT ACTIVE COUNT    ?
      BSAINSTAT := 1;                       _SET INPUT ACTIVE INTEGER  ?
_ 
* * * *  SEND XOFF TO TERMINAL IF INPUT ACTIVE COUNT MEDIUM HIGH
? 
      IF A4INACTC \ (BSUBL - BSOBCNT)       _EOL PROCESSING BEHIND     ?
      THEN                                  _MEDIUM NR OF INPUT ACTIVES?
        BEGIN 
        IF (BSRGLIN ! BSARTSFC) 
        THEN                                _INPUT REGULATION ON       ?
          IF BSAIRSTAT " A2IRSYS            _AND NOT SENT A WAIT..     ?
          THEN
            BEGIN 
            IF BSRGLIN
            THEN
              PTASEND (A4TCMP, A2MXOFF);    _SEND XOFF                 ?
            IF BSARTSFC 
            THEN
              PTARTS (A4TCMP, FALSE);       _START RTS FLOW CONTROL    ?
            BSAINSTAT := 0;                 _CLEAR INPUT ACTIVE        ?
            BSAWBACT := FALSE;              _CLEAR WAIT FOR EOB FLAG   ?
            BSAIRSTAT        := A2IRXOFF;   _SET XOFF REGULATION ACTIVE?
            A4LCMP'.BZATMRSN := A2TRIREGL;  _SET TIMER REASON IN LCB   ?
            BLTIMTBL' [A4CMDMUX.NKPORT].
                      BLTIME := A2TMIREGL+1;_START INPUT REGL TIMER    ?
            END;
_ 
* * * *  SEND WAIT.. TO TERMINAL IF INPUT ACTIVE COUNT GETS TOO HIGH
*        (PROTECTION FROM USER HOLDING REPEAT-CR KEYS)
? 
        IF A4INACTC \ A2SICWAIT 
        THEN
          BEGIN                             _INPUT ACTIVE TOO HIGH,    ?
          IF A4INACTC = A2SICWAIT           _STOP TERMINAL WITH WAIT.. ?
          THEN                              _BEFORE WHOLE NPU IN REGL  ?
            PTMTISNDW (A2WREGL);
          A4INACTC := A2SICWAIT;            _PREVENT COUNTER OVERFLOW  ?
          END; _IF A4INACTC \ A2SICWAIT?
        END; _IF A4INACTC \ A2SICXOFF?
      BSAINACNT := A4INACTC;                _UPDATE COUNT IN TCB       ?
      IF BSXPT
      THEN                                  _DONT ALLOW OUTPUT DURING  ?
        BSAXTACT := BSXDBTIM;               _XPT INPUT WITH TO OPTION  ?
      END;
_ 
* * * *   C H A R A C T E R   T I M E O U T   D E T E C T E D 
? 
    MMCHOUT:  
      BEGIN 
      IF BSXSTIME                           _IF IN STICKY TIMEOUT MODE ?
      THEN
        BEGIN 
        BSAXTACT := FALSE;                  _CLEAR XPT INPUT TIMER FLAG?
        PTACHTMR (A4LCMP, A2CT200);         _START 200 MS CHAR TIMER   ?
        INST     ($C400, A4LINENO,          _LINE NUMBER TO A          ?
                  $E400, N2CHARTO,          _TIMEOUT ADDRESS TO Q      ?
                  $0BA2);                   _ESCAPE TO FIRMWARE        ?
        END 
      ELSE
        PTMTISDNW(A2WCHOUT);                _TERM.INPUT, PROCESS AS EOB?
      END;
_ 
* * * *   B R E A K   C O N D I T I O N   D E T E C T E D 
? 
    MMBREAK:  
      BEGIN 
      PTMSTOPOUT;                           _STOP CURRENT OUTPUT       ?
      IF BSXPT = FALSE
      THEN                                  _NOT IN TRANSPARENT MODE   ?
        IF BSBRUSR1                         _IVT CMD #BR=Y# SPECIFIED  ?
        THEN
          PTMTISNDW (A2WBREAK)              _TREAT AS CANCEL INPUT     ?
        ELSE
          IF BSAINSTAT = A2STIDLE           _#BR=N#, PASS BREAK TO OPS ?
          THEN                              _LEVEL ONLY WHEN INPUT IDLE?
            PTMSNDWLE (A2WBREAK); 
      END;
  
    END; _WITH A4TCMP'.BSTCB DO / CASE A4MWKCOD OF? 
  END; _IF A4TCMP " NIL?
END; _PROCEDURE PTMXASYNCTIP? 
