*COMDECK PBDRCOMPL
_$J+  PAGE EJECT? 
_*****************************
*                            *
*         PBDRCOMPL          *
*  COMMON DRIVER COMPLETION  *
*                            *
*****************************?
_$R+,G+,I-     RECURSIVE
               INTERRUPTABLE ?
_***********************************************************************
*                                                                      *
**OVERVIEW- PBDRCOMPL HANDLES COMMON COMPLETION FUNCTIONS              *
*           FOR I/O DRIVERS.  THE DESIRED FUNCTIONS ARE                *
*           REQUESTED BY FLAGS AND FIELDS IN THE USER LRP.             *
*           FIRST, THE SPECIAL COMPLETION FUNCTIONS ARE                *
*           HANDLED BASED ON THE COMPLETION CODE IN THE LRP.           *
*           THEN THE COMMON OPTIONS ARE HANDLED, IF REQUESTED.         *
*                                                                      *
**INPUT- DEVICE INDEX AND PRP ADDRESS.                                 *
*                                                                      *
**OUTPUT- COMPLETION FUNCTIONS PERFORMED.                              *
*                                                                      *
**EXTERNAL SUBROUTINES-                                                *
*              1) PBWRITE          PERFORM OUTPUT TO DEVICE            *
*              2) PBREL1BF         RELEASE A BUFFER                    *
*              3) PBLSGET          GET A WL ENTRY                      *
*              4) PBSTARTIO        START I/O ON A DEVICE               *
*                                                                      *
***********************************************************************?
PROCEDURE PBDRCOMPL(DEVICE : INTEGER; PRP : B0BUFPTR);
VAR LISTEMPTY : BOOLEAN;
BEGIN 
  WITH JACT[DEVICE],PRP'.BCPRP DO 
  BEGIN 
    CASE JCCOMPL OF                         _SPECIAL COMPLETION CODE   ?
_?
    J3NOCOMPL :;                            _NO COMPLETION             ?
_?
_?
    END; _CASE? 
    IF JCRELBUFLG THEN
    REPEAT
      PBREL1BF(JCPOINTER,JCBUFSZE);         _RELEASE OUTPUT BUFFERS    ?
    UNTIL NIL = JCPOINTER;
    IF JCRESETFLG THEN
    JDWAITFLAGS[JCUSRCODE] := FALSE;        _RESET WAIT FOR COMPL FLAG ?
    JACUREQ := NIL;                         _CLEAR CURRENT I/O REQ     ?
    IF JCCHAINFLG THEN                      _START ANOTHER MSG         ?
    BEGIN 
      IF PBLSGET (BWWLENTRY[LEVELNO],       _ PRIORITY DRIVER WL       ?
                  BYWLCB[JAIOWL[J1PRIWL]])
      THEN LISTEMPTY := 
         PBLSGET (BWWLENTRY[LEVELNO],       _ NON-PRIORITY DRIVER WL   ?
                  BYWLCB[JAIOWL[J1REGWL]])
      ELSE LISTEMPTY := FALSE;
      IF NOT LISTEMPTY THEN                 _ANOTHER MSG AVAILABLE     ?
      WITH BWWLENTRY[LEVELNO] DO
      BEGIN 
        BWPKTPTR'.BCPRP.JCIMMEDFLG := TRUE; _SET IMMEDIATE I/O FLAG    ?
        BIODEVICE := DEVICE;                _SET DEVICE TYPE           ?
        BIOPRP    := BWPKTPTR;              _SET IMMEDIATE I/O ADDRESS ?
        PBSTARTIO;                          _START NEXT MESSAGE        ?
      END;
    END;
    IF JCRELPRPFLG THEN 
    PBREL1BF (PRP,B0S16);                   _RELEASE PRP               ?
  END; _WITH? 
END; _PBDRCOMPL?
