         PCC      0
         SYSTEM   BPM
         SYSTEM   SIG9
         TITLE    'RESQ - Queue restore program'
*
*        REFs and DEFs
*
         DEF      RESQ:P
         DEF      RESQ:D
         DEF      FID
         DEF      FILLFPT
*
         REF      JB:PRIV
         REF      J:JIT
         REF      J:TCB
         REF      J:ABC
         REF      M:LO
         REF      M:DO
         REF      M:OC
         REF      M:UC
         REF      M:EO
         REF      PRINTHDR
         REF      PRINTFPT
         REF      DIDHDR
*
*
*        Register equates
*
R1       EQU      1
R2       EQU      2
R3       EQU      3
R4       EQU      4
R5       EQU      5
R6       EQU      6
R7       EQU      7
R8       EQU      8
R9       EQU      9
R10      EQU      10
R11      EQU      11
R12      EQU      12
R13      EQU      13
R14      EQU      14
R15      EQU      15
SR1      EQU      R8
SR2      EQU      R9
SR3      EQU      R10
SR4      EQU      R11
         PAGE
*
*        PROCS
*
TEXTCR   CNAME
         PROC
         BOUND    4
LF       EQU      %
         DISP     %
         LIST     0
         DATA,1   S:NUMC(S:UT(AF))+1,S:UT(AF),X'0D'
         BOUND    4
         LIST     1
         PEND
         PAGE
***********************************************************************
*                                                                     *
*                                                                     *
*     RESQ is a program designed to run under F00 CP-V.  It makes     *
*     use of the symbiont file spill-fill capability, and may be      *
*    used to fill some or all of the files on a DMPQ tape back        *
*    into the symbiont queues.  RESQ absolutely will *not* run        *
*     properly under any version of CP-V prior to F00!                *
*                                                                     *
*     The following point should be engraved upon your brain in       *
*     six-inch letters of incandescent fire:                          *
*                                                                     *
*       D O   N O T   M E S S   W I T H   T H E   D A T A ! !         *
*                                                                     *
*     This means - use Spill/Fill only for exact, mirror-image        *
*     dumps and restores.  Do NOT try to change *anything* in the     *
*     FPT passed to you by the M:OPEN of the spill stream DCB.        *
*     Do *not* try to hand-code FPTs for fill streams.  Do *not*      *
*     modify the spilled data in any way whatsoever.  Do *not*        *
*     change the workstation definitions of any RBTs that may be      *
*     defined in your system between spill time and fill time.        *
*     Such tampering can have numerous loathsome effects ranging      *
*     from lost data records, through lost data files and missing     *
*     symbiont granules, to the possible destruction of your entire   *
*     batch queue.                                                    *
*                                                                     *
*     Be it therefore known - if you try any such tricks and          *
*     begin having trouble with Spill/Fill - we out here at           *
*     LADC don't want to hear anything about it!!  I unofficially     *
*     assure you that any SIDRs submitted against Spill/Fill          *
*     that show any evidence of such game-playing will be returned    *
*     to the sender via high-speed air mail, wrapped around           *
*     something blunt and heavy, sharp and pointed, or explosive.     *
*                                                                     *
*                                                                     *
*     RESQ was written at Honeywell LADC by Dave Platt on or about    *
*     8/28/78, and was tested on a Sigma 5 system running a           *
*     full-blown production version of CP-V F00 (with the patch       *
*     file current as of that date).  It works.                       *
*                                                                     *
***********************************************************************
         PAGE
RESQ:P   CSECT    1
         M:INT    RETURN
         M:SYS
         BCR,8    SETPRIO
         M:TYPE   (MESS,RESQPRIV)
         M:EXIT
         SPACE    3
SETPRIO  LW,R1    J:ABC
         OR,R1    L(X'00F00000')    Make output priority = F.
         STW,R1   J:ABC
         M:SLAVE
         M:TYPE   (MESS,RESQHERE)
         SPACE    3
GETCMD   LI,R2    PROMPT
GETCOM   M:KEYIN  (MESS,*R2),(REPLY,COMMAND),(SIZE,19)
         LB,R1    COMMAND
         CI,R1    1
         BE       GETCMD
         LI,R1    1
         LB,R1    COMMAND,R1
         LB,R2    CMDCODES
CMDLOOP  CB,R1    CMDCODES,R2
         BE       GOTCMD
         BDR,R2   CMDLOOP
         CLM,R1   DIGITS
         BCS,9    HUH
         B        GETNUM
GOTCMD   B        GOTCMD,R2
         B        HELP
         B        ALL
         B        SCAN
         M:EXIT
         B        WAIT
         SPACE    3
WAIT     M:WAIT   9999
         B        GETCMD
HUH      LI,R2    DUH
         B        GETCOM
HELP     LI,R1    HELPCMD
HELPLOOP LB,R2    *R1
         BEZ      GETCMD
         M:TYPE   (MESS,*R1)
         SLS,R2   -2
         AI,R2    1
         AW,R1    R2
         B        HELPLOOP
ALL      LI,R1    1
         STW,R1   RESTFLAG
         B        RUNALL
SCAN     LI,R1    0
         STW,R1   RESTFLAG
         B        RUNALL
GETNUM   LI,R1    1
         LI,R3    0
         STW,R3   FILENUM
         STW,R3   LASTFILE
NUMLOOP  CB,R1    COMMAND
         BE       GOTNUM
         LB,R2    COMMAND,R1
         CI,R2    '-'
         BE       HYPHEN
         CLM,R2   DIGITS
         BCS,9    HUH
         AI,R2    -'0'
         MI,R3    10
         AW,R3    R2
NEXTDIG  AI,R1    1
         B        NUMLOOP
HYPHEN   STW,R3   FILENUM
         LI,R3    0
         B        NEXTDIG
GOTNUM   MTW,0    FILENUM
         BNEZ     SETLAST
         STW,R3   FILENUM
         STW,R3   LASTFILE
         B        TESTIT
SETLAST  STW,R3   LASTFILE
TESTIT   LW,R3    FILENUM
         CW,R3    CURRFILE
         BE       GOTOIT
         BG       OPENTHIS
         M:OPEN   F:TAPE,(ASN,DEVICE),(VOL,1)
         M:REW    F:TAPE
         M:CLOSE  F:TAPE,(SAVE)
OPENTHIS LW,R3    LASTFILE
         AI,R3    1
         STW,R3   CURRFILE
         LW,R3    FILENUM
         AI,R3    -1
         BEZ      GOTOIT
         BAL,R15  MAKEFID
         STW,R4   NAMEVLP+1
,,NAMEVLP ;
         M:OPEN   F:TAPE,(ASN,LABEL),(LABEL,'NNN'),(IN)
         M:CLOSE  F:TAPE,(SAVE)
GOTOIT   LI,R1    1
         STW,R1   RESTFLAG
         BAL,R15  PRINTHDR
         LW,R3    LASTFILE
         BAL,R15  MAKEFID
         STW,R4   LASTFILE
         B        RUNLOOP
         SPACE    3
RUNALL   RES
         M:OPEN   F:TAPE,(ASN,DEVICE),(VOL,1)
         M:REW    F:TAPE
         M:CLOSE  F:TAPE,(SAVE)
         BAL,R15  PRINTHDR
         LW,R1    L(X'04000000')
         STW,R1   LASTFILE
RUNLOOP  M:OPEN   F:TAPE,(ASN,LABEL),(NXTF),(IN)
         BAL,R15  FILLFILE
         LW,R1    FID               What file is this?
         CW,R1    LASTFILE          Is it beyond the desired range?
         BL       RUNLOOP
RUNEOF   LW,R1    LASTFILE
         CW,R1    L(X'04000000')
         BL       GETCMD
         LC       J:JIT
         BCR,4    RUNEND
         CAL1,9   6
         LI,R1    -1
         STW,R1   DIDHDR
RUNEND   M:OPEN   F:TAPE,(ASN,DEVICE),(IN)
         M:REW    F:TAPE
         M:CLOSE  F:TAPE,(SAVE)
         B        GETCMD
         SPACE    3
FILLFILE PSW,R15  *J:TCB
         M:READ   F:TAPE,(BUF,FILLFPT),(SIZE,56),;
                  (ABN,F:TAPECHK),(ERR,F:TAPECHK)
         BAL,R15  PRINTFPT
         MTW,0    RESTFLAG
         BEZ      ENDFILL
FILLIT   LI,SR1   'FI'              Indicate FILL operation
         M:LDEV,E FILLFPT
         BCS,8    BADFILL
         M:OPEN   M:EO,(DEVICE,'C2'),(OUT),(SAVE)
FILLLOOP M:READ   F:TAPE,(BUF,BUFFER),(SIZE,2048),;
                  (ABN,F:TAPECHK),(ERR,F:TAPECHK)
         LW,R1    F:TAPE+4
         SLS,R1   -17
         M:WRITE  M:EO,(BUF,BUFFER),(SIZE,*R1),(WAIT)
         B        FILLLOOP
FILLEOF  M:CLOSE  M:EO,(SAVE)
         LI,SR1   'FI'
         M:LDEV   'C2',(ASAVE)
         BCS,8    BADFILL
         AND,SR1  L(X'FFFF')
         CI,SR1   'FI'              WAS THE SYSID CHANGED?
         BE       ENDFILL
         LI,R1    BA(SYSIDM)+3
         LI,R2    4
HEXLP1   LI,SR2   0
         SCD,SR1  -4
         SLS,SR2  -28
         AI,SR2   '0'
         CI,SR2   '9'
         BLE      %+2
         AI,SR2   'A'-'9'-1
         STB,SR2  0,R1
         AI,R1    -1
         CI,SR1   0
         BE       %+2
         BDR,R2   HEXLP1
         M:WRITE  M:LO,(BUF,SYSIDX),(SIZE,16),(WAIT)
ENDFILL  M:CLOSE  F:TAPE,(SAVE)
         PLW,R15  *J:TCB
         B        *R15
         SPACE    3
BADFILL  CI,SR1   -1                Did we get a "Queue too full?"
         BE       SLEEP
         M:SNAP   'BAD FILL',(FILLFPT,BUFFER+511)
         M:TYPE   (MESS,RESQFPT)
         M:XXX
SLEEP    M:TYPE   (MESS,NEEDSLOT)
         M:WAIT   25
         B        FILLIT
         SPACE    3
F:TAPECHK LB,R1   SR3
         CI,R1    X'02'             0200 - No more files on tape
         BE       RUNEOF
         CI,R1    X'03'             0300 - No such file
         BE       HUH               Reject user's command
         CI,R1    X'05'             0500 - end of data
         BE       FILLEOF
         CI,R1    X'06'             0600 - end of file
         BE       FILLEOF
         M:SNAP   'TAPE ERR',(FILLFPT,BUFFER+511)
         M:TYPE   (MESS,TAPEERR)
         M:XXX
         SPACE    3
MAKEFID  LI,R1    3
DIGCODE  MI,R2    1
         DW,R2    L(10)
         AI,R2    C'0'
         STB,R2   R4
         SLS,R4   -8
         BDR,R1   DIGCODE
         OR,R4    L(X'03000000')
         B        *R15
         SPACE    3
RETURN   M:TRTN
         PAGE
RESQ:D   CSECT    0                 Data CSECT
FILLFPT  RES      14                FPT RETURNED BY M:OPEN
BUFFER   EQU      %
         LIST     0
         DO1      512
         DATA     0
         LIST     1
*
*        BUFFER is 512 words of zeros.
*
OUTBUF   RES      30
*
*
RESQHERE TEXTCR   'HI.  SAY "HELP" IF YOU NEED IT.'
RESQPRIV TEXTCR   'I NEED C0 PRIVILEGE OR BETTER TO RUN!'
RESQFPT  TEXTCR   'I GOT AN M:LDEV REJECTION FROM RBBAT!  ABORTING!'
DUH      TEXTC    'HUNH?? '
PROMPT   TEXTC    'COMMAND? '
HELPCMD  TEXTCR   ''
         TEXTCR   'THE FOLLOWING COMMANDS ARE AVAILABLE:'
         TEXTCR   ''
         TEXTCR   '  ALL - RESTORE ALL FILES ON TAPE TO QUEUE.'
         TEXTCR   '  LIST - LIST ID''S OF FILES ON TAPE.'
         TEXTCR   '  N (FILE NUMBER) - RESTORE INDICATED FILE'
         TEXTCR   '  M-N (FILE NUMBERS) - RESTORE INDICATED ',;
                  'RANGE OF FILES.'
         TEXTCR   '  WAIT - GO TO SLEEP.  !INT (OR BREAK)',;
                  ' TO WAKE UP'
         TEXTCR   '  END - TERMINATE RESQ.'
         TEXTCR   ''
         DATA     0
TAPEERR  TEXTCR   'I/O ERROR ON TAPE - ABORTING'
NEEDSLOT TEXTCR   'I''M OUT OF SYMFILE SLOTS - SLEEPING....'
SYSIDX   TEXT     'NEW SYSID ='
SYSIDM   TEXT     '    '
TRSPACE  TEXT     'B'
COMMAND  RES      5
RESTFLAG RES      1
CURRFILE DATA     9999
CMDCODES TEXTC    'HALEW'           HELP/ALL/LIST/END/WAIT
FILENUM  RES      1
LASTFILE RES      1
         BOUND    8
DIGITS   DATA     '0','9'
F:TAPE   DSECT    2
F:TAPE   M:DCB    (DEVICE,'9T'),(LABEL),(SYNON),(PASS),;
                  (SN,'DMP0','DMP1','DMP2','DMP3','DMP4',;
                  'DMP5','DMP6','DMP7','DMP8','DMP9'),;
                  (ERR,F:TAPECHK),(ABN,F:TAPECHK)
FID      EQU      F:TAPE+23
         USECT    RESQ:P
         END      RESQ:P
