*COMDECK PBTTYINT 
_$J+  PAGE EJECT? 
_*****************************
*                            *
*        PBTTYINT            *               CHANGED FROM PGTTYINT, 
*   CONSOLE INTERRUPT HNDLR  *               BECAUSE TOPHAT PBTTYINT
*                            *               IS REMOVED.
*****************************?
_$R-,G-,I-     NON-RECURSIVE
               INTERRUPTABLE ?
_***********************************************************************
*                                                                      *
**OVERVIEW- PBTTYINT HANDLES INTERRUPTS FROM THE LOCAL CONSOLE.        *
*           FIRST THE TIMER IS CLEARED AND THEN STATUS IS              *
*           OBTAINED.  THE INTERRUPT CONDITIONS ARE HANDLED IN         *
*           THE FOLLOWING ORDER:                                       *
*                                                                      *
*              1) SPURIOUS (NO FLAGS IN STATUS)   BUMP SPURIOUS COUNT  *
*              2) ALARM                           CLEAR CONSOLE        *
*              3) MANUAL                          CHANGE MODE          *
*              4) DATA (READ MODE)                READ A CHAR          *
*              5) DATA (WRITE MODE)               WRITE A CHAR         *
*              6) OTHER                           CLEAR INTERRUPTS     *
*                                                                      *
**INPUT- NONE                                                          *
*                                                                      *
**OUTPUT- INTERRUPT HANDLED AND CLEARED.                               *
*                                                                      *
**EXTERNAL SUBROUTINES-                                                *
*              1) PBREAD           READ CHAR/STATUS                    *
*              2) PBWRITE          WRITE CHAR/FUNCTION                 *
*              3) PBTTYSETMODE     SET CONSOLE MODE                    *
*                                                                      *
***********************************************************************?
PROCEDURE PBTTYINT; 
CONST LSTCHAR = J1LST32;
_***********************************************************************
*     CONSOLE INTERRUPT BIT ASSIGNMENTS                                *
***********************************************************************?
      MANUAL = BIT11;                       _MANUAL INTERRUPT          ?
      READ   = BIT9;                        _READ MODE                 ?
      ALARM  = BIT5;                        _ALARM INTERRUPT           ?
      EOP    = BIT4;                        _END-OF-OPERATION INTERRUPT?
      DATA   = BIT3;                        _DATA INTERRUPT            ?
      BUSY   = BIT1;                        _BUSY                      ?
_***********************************************************************
*     CONSOLE MESSAGE CODES                                            *
***********************************************************************?
_?
VAR WORK1,                                  _WORK FIELDS               ?
    WORK2 : B0OVERLAY;
    CHN,                                    _BFR CHAIN INDEX           ?
    EOMSTATE : INTEGER;                     _END-OF-MESSAGE STATE      ?
    ERR,
    LISTEMPTY : BOOLEAN;                    _WL EMPTY FLAG             ?
_?
      CNSLEMSG : ARRAY [SUPQ..BADC] OF INTEGER;  _CONSOLE MSG TABLE    ?
      ERRMSG : J0ML6;                            _*ERR                 ?
_?
VALUE EOMSTATE = 1; 
_?
      CNSLEMSG = ($5355,                    _SU                        ?
                  $4F52,                    _OR                        ?
                  $4F4C,                    _OL                        ?
                  $5245,                    _RE                        ?
                  $4341,                    _CA                        ?
                  $4D54,                    _MT                        ?
                   0);                      _BAD MESSAGE               ?
_?
      ERRMSG = (J1CRLF,#*ERR]#);
*CALL PBEDITTY
*CALL PBCHDECOD 
*CALL PBCHEXECU 
*CALL PBTTYEOT
*CALL PBTTYREAD 
*CALL PBTTYWRIT 
_$J+? 
_***********************************************************************
*     LEVEL 1 - PBTTYINT STARTS HERE
***********************************************************************?
BEGIN 
  WITH JACT[TTY],WORK2 DO 
  BEGIN 
    JATIMER := 0;                           _CLEAR TIMER               ?
    BA1CHAR := PBREAD(TTYSTAT,TTY);         _GET STATUS                ?
    JASTATUS := BASET;
    IF [] = [MANUAL,EOP,DATA,ALARM] & JASTATUS
    THEN JABADINT := JABADINT+1             _SPURIOUS INTERRUPT        ?
    ELSE
    IF ALARM IN JASTAT THEN                 _ALARM INTERRUPT           ?
    BEGIN 
      PBWRITE(TTYSTAT,TTYCLR,TTY);          _CLEAR CONSOLE             ?
      IF READ IN JASTATUS 
      THEN BA1CHAR := TTYREAD               _SET READ MODE             ?
      ELSE BA1CHAR := TTYWRITE;             _SET WRITE MODE            ?
      IF JAINPROG                           _IF OUTPUT IS GOING        ?
      THEN PBTTYWRITE                       _ BYPASS ERROR AND CONT.   ?
      ELSE
      PBWRITE(TTYSTAT,BA1CHAR,TTY); 
    END 
    ELSE
    IF [MANUAL,BUSY] @ JASTATUS THEN        _-CHECK FOR MANUAL INT AND ?
    BEGIN                                   _-CONSOLE BUSY             ?
      PBWRITE(TTYSTAT,TTYEOP,TTY);          _SELECT EOP INTERRUPT      ?
      JAMODEFLG := TRUE;                    _SET MODE CHANGE FLAG      ?
    END 
    ELSE
    IF (MANUAL IN JASTATUS) !               _CHECK FOR MANUAL INT      ?
       ((EOP IN JASTATUS) & JAMODEFLG) THEN _CHECK FOR EOP AND MODE FLG?
    BEGIN 
      JAINTFLG := JAINPROGFLG;              _SET OUTPUT INT FLG        ?
_  ******  CAUTION - HIDDEN *IF DEF,TUP  ******  ?
*IF DEF,TUP 
      IF JUTUPTABLE.JUTUPFLG                _CHECK TUP MODE            ?
      THEN JAINPROGFLG := FALSE;            _YES- CLEAR IN-PROGRESS FLG?
*ENDIF
_  ******  CAUTION - HIDDEN *ENDIF FOR TUP CODE  ******  ?
      PBTTYSETMODE;                         _SET CONSOLE MODE          ?
    END 
    ELSE
    IF READ IN JASTATUS                     _CHECK IF READ MODE        ?
    THEN PBTTYREAD                          _READ CHARACTER            ?
    ELSE
    IF JAINPROGFLG                          _CHECK IF OUTPUT IN-PROG   ?
    THEN PBTTYWRITE                         _WRITE CHARACTER           ?
    ELSE PBWRITE(TTYSTAT,TTYCLR,TTY);       _CLEAR INTERRUPTS          ?
  END; _WITH? 
END;  _ PBTTYINT ?
