*COMDECK PBTIMEOUT
_$J+  PAGE EJECT? 
_*****************************
*                            *
*        PBTMEOUT            *
*      I/O TIMEOUT           *
*                            *
*****************************?
_$R-,G-,I-     NON-RECURSIVE
               INTERRUPTABLE ?
_***********************************************************************
*                                                                      *
**OVERVIEW- PBTMEOUT IS ENTERED FROM THE I/O TIMER APPENDAGE           *
*           (PBIOTMR) WHEN A LOCAL PERIPHERAL TIMES OUT.  THE          *
*           DEVICE TIMEOUT COUNT IS INCREMENTED,  THE TIMER            *
*           IS SET TO 1 SECOND AND, IF THE DEVICE IS READY (AND        *
*           NOT THE LOCAL CONSOLE) THE LAST OUTPUT ATTEMPTED           *
*           IS RE-ISSUED.  IF THE CONSOLE TIMES OUT WHILE IN           *
*           READ MODE A CHARACTER HAS NOT BEEN INPUT FOR               *
*           5 MINUTES  THE  CONSOLE IS SET TO WRITE MODE TO            *
*           ALLOW OUTPUT.  IF THE CONSOLE TIMES OUT IN WRITE           *
*           MODE THE WRITE MODE IS RESET.                              *
*                                                                      *
**INPUT- DEVICE NUMBER.                                                *
*                                                                      *
**OUTPUT- SEE OVERVIEW.                                                *
*                                                                      *
**EXTERNAL SUBROUTINES-                                                *
*              1) PBREAD           READ CHAR/STATUS                    *
*              2) PBWRITE          WRITE CHAR/FUNCTION                 *
*              3) PBTTYSETMODE     SET CONSOLE MODE                    *
***********************************************************************?
PROCEDURE PBTMEOUT(DEVICE : INTEGER); 
CONST READ = BIT9;
VAR STATUS : B0OVERLAY; 
BEGIN 
  WITH JACT[DEVICE],STATUS DO 
  BEGIN 
    JATIMOUT := JATIMOUT+1;                 _BUMP TIMEOUT COUNT        ?
    CASE DEVICE OF
_?
    TTY:                                    _LOCAL CONSOLE             ?
    BEGIN 
      BA1CHAR := PBREAD(TTYSTAT,TTY);       _READ STATUS               ?
      IF READ IN BASET THEN                 _CHECK FOR READ MODE       ?
      BEGIN 
        JASTAT := [READ];                   _SET READ MODE             ?
        PBTTYSETMODE;                       _GO TO WRITE MODE          ?
      END 
      ELSE PBWRITE(TTYSTAT,TTYWRITE,TTY);   _RESET WRITE MODE          ?
    END;
_?
    END; _CASE? 
    JATIMER := J1ONESEC;
  END; _WITH? 
END; _PBTMEOUT? 
