*COMDECK PBSTARTIO
_$J+  PAGE EJECT? 
_*****************************
*                            *
*         PBSTARTIO          *
*         START I/O          *
*                            *
*****************************?
_$R+,G+,I-     RECURSIVE
               INTERRUPTABLE ?
_***********************************************************************
*                                                                      *
**OVERVIEW- PBSTARTIO EITHER STARTS I/O ON A LOCAL PERIPHERAL          *
*           OR QUEUES THE I/O REQUEST (A PRP ADDRESS) IN THE           *
*           PROPER DRIVER WORKLIST.  I/O IS STARTED IF THE             *
*           DEVICE IS READY AND I/O IS NOT IN-PROGRESS.  AN            *
*           IMMEDIATE I/O REQUEST IS REJECTED IF THE I/O               *
*           CANNOT BE STARTED.  I/O IS STARTED BY:                     *
*              1) IF IMMEDIATE I/O IS NOT REQUESTED, QUEUE THE         *
*                 CURRENT REQUEST AND OBTAIN THE NEXT QUEUED           *
*                 REQUEST;                                             *
*              2) SET UP DEVICE CONTROLLER-TABLE PARAMETERS; AND       *
*              3) ISSUE THE FIRST I/O COMMAND.                         *
*           THE INDIVIDUAL DRIVER INTERRUPT HANDLER NOW TAKES          *
*           OVER.                                                      *
*                                                                      *
**INPUT- DEVICE NUMBER AND I/O REQUEST (PRP ADDRESS).                  *
*                                                                      *
**OUTPUT- I/O STARTED, IF POSSIBLE.                                    *
*                                                                      *
**EXTERNAL SUBROUTINES-                                                *
*              1) PBTESTIORDY      TEST I/O READY                      *
*              2) PBWRITE          WRITE CHAR/FUNCTION                 *
*              3) PBLSGET          GET A WL ENTRY                      *
*              4) PBLSPUT          MAKE A WL ENTRY                     *
*              5) PBAMASK          AND INTERRUPT MASK                  *
*              6) PBLMASK          LOAD INTERRUPT MASK                 *
*              7) LOCK             LOCK INTERRUPTS                     *
*              8) UNLOCK           UNLOCK INTERRUPTS                   *
*                                                                      *
***********************************************************************?
PROCEDURE PBSTARTIO;
VAR OKTOSTART : BOOLEAN;
BEGIN 
  WITH JACT[BIODEVICE], BWWLENTRY[LEVELNO] DO 
  BEGIN 
    BIOPRP'.BCPRP.JCRESULT := J3ACCEPTED;   _SET I/O ACCEPTED          ?
    BWPKTPTR  := BIOPRP;                    _SET UP INTERMEDIATE ARRAY ?
    OKTOSTART := PBTESTIORDY(BIODEVICE);    _TEST IF DEVICE READY      ?
    LOCK; 
    OKTOSTART := (OKTOSTART & NOT JAINPROGFLG); 
    IF OKTOSTART
    THEN JAINPROGFLG := TRUE;               _SET I/O IN-PROGRESS       ?
    UNLOCK; 
    IF OKTOSTART THEN 
    BEGIN                                   _START I/O                 ?
      WITH BIOPRP'.BCPRP DO 
      IF NOT JCIMMEDFLG THEN                _CHECK IF NOT IMMEDIATE    ?
      BEGIN 
        PBLSPUT (BWWLENTRY[LEVELNO],
                 BYWLCB[JAIOWL[JCPRIFLG]]); _QUEUE I/O REQUEST         ?
        IF PBLSGET (BWWLENTRY[LEVELNO],     _ GET NEXT PRIORITY IF ANY ?
                    BYWLCB[JAIOWL[J1PRIWL]])
        THEN
        IF PBLSGET (BWWLENTRY[LEVELNO],     _ GET NEXT NON-PRIORITY    ?
                    BYWLCB[JAIOWL[J1REGWL]])
        THEN; 
        BIOPRP := BWPKTPTR;                 _SET UP I/O REQUEST        ?
      END;
      WITH BIOPRP'.BCPRP DO 
      BEGIN 
        JACUREQ  := BIOPRP;                 _CURRENT I/O REQUEST       ?
        JAIOBUF  := JCPOINTER;              _I/O BUFFER                ?
        JACHRCNT := JAIOBUF'.BFFCD;         _FCD OF 1ST CHARACTER      ?
        JABUFSZE := JCBUFSZE;               _I/O BUFFER SIZE           ?
        JATIMER  := J1ONESEC;               _I/O TIMER                 ?
        PBAMASK(JAMASK);                    _AND OFF DEVICE INTERRUPT  ?
        CASE BIODEVICE OF 
_?
        TTY:                                _LOCAL CONSOLE             ?
        BEGIN 
          PBWRITE(TTYIO,                    _WRITE 1ST CHARACTER       ?
                  JAIOBUF'.BFDATAC[JACHRCNT], 
                  TTY); 
          PBWRITE(TTYSTAT,TTYWRITE,TTY);    _ALLOW TTY INTERRUPTS      ?
        END;
_?
        END; _CASE? 
      END; _WITH? 
      PBLMASK;                              _RESTORE INTERRUPT MASK    ?
    END 
    ELSE
    WITH BIOPRP'.BCPRP DO 
    IF JCIMMEDFLG 
    THEN JCRESULT := J3REJECTED             _IMMEDIATE I/O REJECTED    ?
    ELSE PBLSPUT (BWWLENTRY[LEVELNO], 
                  BYWLCB[JAIOWL[JCPRIFLG]]); _QUEUE I/O REQUEST        ?
  END; _WITH? 
END; _PBSTARTIO?
