*COMDECK PB1SNAP
_$J+? 
_*****************************
*                            *
*          PB1SNAP           *
*       SNAPSHOT CORE        *
*                            *
*****************************?
_$R+,G+,I-     RECURSIVE
               INTERRUPTABLE ?
_***********************************************************************
*                                                                      *
**OVERVIEW- PB1SNAP FORMATS  USER SPECIFIED SNAP LOCATIONS INTO        *
*           BUFFERS AND PASSES THESE BUFFERS TO THE DESIRED            *
*           OUTPUT DEVICE USING I/O SERVICES.  IF BUFFERS ARE          *
*           NOT AVAILABLE FOR THE SNAPSHOT, PB1SNAP DOES NOTHING.      *
*                                                                      *
**INPUT- A SNAPSHOT TABLE (TYPE JFSNAPTABLE) SET UP BY THE CALLER.     *
*                                                                      *
**OUTPUT- THE DESIRED SNAP LOCATIONS FORMATTED IN BUFFERS.             *
*                                                                      *
**EXTERNAL SUBROUTINES-                                                *
*                1) PBMIN          RETURN THE MIN OF 2 NUMBERS         *
*                2) PBBFAVAIL      CHECK FOR AVAILABILITY OF BFRS      *
*                3) PBGET1BF       GET A BUFFER                        *
*                4) PBREL1BF       RELEASE A BUFFER                    *
*                5) PBTOAH         CONVERT TO ASCII HEX                *
*                6) PBIOSERV       I/O SERVICES                        *
*                7) PBLOAD         LOAD A CANNED MSG                   *
***********************************************************************?
PROCEDURE PB1SNAP(VAR SFSNPTABLE : JFSNAPTABLE);
CONST LSTCHAR = J1LST32;                    _LAST CHAR IN BUFFER       ?
VAR BFR : B0BUFPTR; 
    NUM,
    I : INTEGER;
    CHN : INTEGER;                          _BUFFER CHAIN INDEX        ?
    TEMP : B0OVERLAY; 
    ADDR : B018BITS;
BEGIN 
  I := 1; 
  NUM := 0; 
  CHN := S0BUFSZE'.BEMSK.BAINT + 1;         _SET UP CHAIN INDEX        ?
  REPEAT
    WITH SFSNPTABLE[I] DO 
    TEMP.BAINT := JFENDADDR.B0WORD.BA11BITS-
                  JFBEGINADDR.B0WORD.BA11BITS+1;
    NUM := NUM + TEMP.BAINT/8 +             _CALC NUM OF BUFFERS       ?
           PBMIN(1,TEMP.BAINT MOD 8); 
    I:=I+1; 
  UNTIL (DELIM = SFSNPTABLE[I].JFBEGINADDR.B0DELIM) ! 
        (J1SNAPMAX < I);
  IF PBNBFAVAIL (NUM, B0T1) THEN            _ENOUGH BUFFERS AVAILABLE  ?
  SCLRP.JCPOINTER := PBGET1BF(S0BUFSZE)     _YES                       ?
  ELSE GOTO 20;                             _NO                        ?
  BFR := SCLRP.JCPOINTER; 
  IF 1 < NUM THEN 
  FOR I := NUM-1 DOWNTO 1 DO
  BEGIN 
    BFR'.BCCHAIN[CHN] := PBGET1BF(S0BUFSZE);_FORM BUFFER CHAIN         ?
    BFR := BFR'.BCCHAIN[CHN]; 
  END;
  I := 1; 
  NUM := J1FRSTCHAR;
  BFR := SCLRP.JCPOINTER; 
  REPEAT
    ADDR := SFSNPTABLE[I].JFBEGINADDR;      _GET START OF SNAP         ?
    REPEAT
      PBLOAD(BFR,J0SETUP,NUM,LSTCHAR);      _FORMAT START ADDRESS      ?
      P1TOAH(ADDR,BFR,NUM+3,LSTCHAR); 
      NUM := NUM+9; 
      REPEAT
      PB18BITS(ADDR,TEMP.BAINT,J0GET);
        PBTOAH(TEMP.BAHEX,BFR,NUM,LSTCHAR); _FORMAT ONE WORD OF SNAP   ?
        NUM := NUM+5; 
        PB18ADD(ONE,ADDR);
      UNTIL PB18COMP(ADDR,J0GR,SFSNPTABLE[I].JFENDADDR) ! 
            (49+J1FRSTCHAR @ NUM);
      BFR'.BFLCD := NUM-1;                  _SET LCD                   ?
      NUM := J1FRSTCHAR;
      BFR := BFR'.BCCHAIN[CHN]; 
    UNTIL PB18COMP(ADDR,J0GR,SFSNPTABLE[I].JFENDADDR);
    I:= I+1;                                _GET NEXT SNAP ENTRY       ?
  UNTIL (DELIM = SFSNPTABLE[I].JFBEGINADDR.B0DELIM) ! 
        (J1SNAPMAX < I);                    _TEST FOR END OF SNAPSHOT  ?
  IF PB1BFAVAIL (B0T2)                      _CHECK IF PRP AVAILABLE    ?
  THEN PBIOSERV(SCLRP,TEMP.BA1BOL)          _YES- PASS BUFFERS TO I/O  ?
  ELSE
 10:REPEAT
    PBREL1BF(SCLRP.JCPOINTER,S0BUFSFZE);    _NO- RELEASE ALL BUFFERS   ?
    UNTIL NIL = SCLRP.JCPOINTER;
20:;                                        _BUFFERS NOT AVAILABLE     ?
END; _PB1SNAP?
