*DECK DBQRFI
          IDENT  DBQRFI 
  
************************************************************************
  
COPYRITE  DATA   H*COPYRIGHT CONTROL DATA SYSTEMS, INC. 1992* 
  
************************************************************************
  
          IPARAMS 
*#
* *   DBQRFI-- QUICK RECOVERY FILE GENERATOR     PAGE  1
* *   C O GIMBER                                 10/19/76 
* 
* DC  PURPOSE 
* 
*     CREATE THE QUICK RECOVER FILE.  THIS MUST BE DONE BEFORE A
*     SCHEMA WITH QRF LOGGING CAN BE ACCESSED.  THE FOLLOWING JOB CAN 
*     BE RUN TO DO THIS:  
*       REQUEST,QRFFILE,*PF.
*       DBQRFI,QRF-FILE,PRU-COUNT,SCHEMA-ID.
*       CATALOG,QRFFILE,... 
* 
* DC  ENTRY CONDITIONS
* 
*     CONTROL CARD PARAMETERS 
*       LFN OF QRF
*       NUMBER OF PRUS FOR QRF (DECIMAL NUMBER) 
*       SCHDMA-ID (DECIMAL NUMBER). 
* 
* DC  EXIT CONDITIONS 
* 
*     SCOPE TYPE SYSTEMS: 
*       QRF CREATED TO BE THE NUMBER OF PRU S FROM THE CONTROL CARD PLUS
*         A SAFETY FACTOR LONG. 
*       QRF HEADER PRU RECORD REWRITTEN 
* 
*     KRONOS TYPE SYSTEMS:  
*       QRF HEADER PRU RECORD WRITTEN 
* 
*#    LOCAL STRUCTURES
  
FET       FILEB  0,101       FET FOR QRF
MEMWORD   BSSZ   1           PARAMETER FOR MEMORY MACRO CALLS 
PRUCOUNT  BSS    1           PRU COUNT EXTRACTED FROM CONTROL CARD
PRUSIZE   EQU    100B        SIZE OF A PRU
QH        BSSZ   3           QRF HEADER 
                             UPPER 30 BITS OF QH+1 CONTAINS FILE SIZE 
                             IN PRU S 
SAFFACTR  EQU    300D        SAFETY FACTOR FOR QRF SIZE IN PRUS 
                             ***NOTE--IF THIS IS TOO SMALL, THE      ***
                             ***INTEGRITY OF THE QRF COULD BE LOST.  ***
WORDCNT   BSS    1           WORD COUNT LEFT TO WRITE TO QRF
WRITESZ   EQU    50          SIZE OF EACH WRITE TO QRF IN PRU S 
BLOCKSZ   EQU    PRUSIZE*WRITESZ-1
                             BLOCK SIZE IN WORDS TO WRITE TO QRF
          EJECT 
*#
* 
* DC  INTERNAL SUBROUTINES
* 
*     FETWRITE
*     CALLED TO SET FET FIELDS FOR WRITE OPERATIONS.
*       ENTRY CONDITIONS
*       (X1) = WSA OF WRITE 
*       (X2) = SIZE OF WRITE
*#
FETWRITE  EQ   *+1S17 
          SA3    FET+1       STORE FIRST FIELD
          MX0    42D         *
          BX3    X0*X3       *
          IX6    X3+X1       *
          SA6    A3          *
          BX7    X1          STORE OUT FIELD = FIRST
          SA7    FET+3       *
          IX6    X1+X2       STORE IN FIELD = FIRST+SIZE
          SA6    FET+2       *
          SA3    FET+4       STORE LIMIT FIELD = FIRST+SIZE+1 
          SX7    X6+1        *
          BX3    X0*X3       *
          IX7    X3+X7       *
          SA7    A3          *
          EQ   FETWRITE 
  
*#
* 
*     CCCRACK 
*     CRACK DECIMAL NUMBER FROM CONTROL CARD. 
*       ENTRY CONDITIONS
*         (X1) = RA+1 PARAMETER LIST WORD 
*       EXIT CONDITIONS 
*         (X6) = -1 IF ILLEGAL DECIMAL NUMBER 
*         (X6) = PARAMETER IN BINARY
*#
CCCRACK   EQ   *+1S17 
          MX0    54D         (X0) = MASK FOR DIGIT
          SX6    B0          INITIALIZE COUNT TO ZERO 
          LX1    6D          GET 1ST DISPLAY CODE DIGIT 
          BX2    -X0*X1      *
  
CCLOOP    BSS    0
          IX7    X6+X6       COUNT = 10*COUNT 
          LX6    3           *
          IX6    X6+X7       *
          SX3    X2-33B      CHECK FOR LEGAL DIGIT
          MI   X3,ILL        *
          SX4    X2-45B      *
          PL   X4,ILL        *
          IX6    X3+X6       ADD DIGIT VALUE TO COUNT 
          LX1    6           GET NEXT DISPLAY CODE DIGIT
          BX2    -X0*X1      *
          NZ   X2,CCLOOP     IF MORE DIGITS 
          EQ   CCCRACK       *
  
ILL       MX6    59D         ILLEGAL PARAMETER
          EQ   CCCRACK       *
          EJECT 
          ENTRY  DBQRFI 
DBQRFI    BSS    0
*#
* 
* DC  DESCRIPTION 
* 
*     CRACK CONTROL CARD
*       ERROR IF WRONG NUMBER OF PARAMETERS 
*#
          SA1    64B
          SX1    X1-3 
          NZ   X1,ILLPARM 
*#
*     PUT LFN INTO FET
*#
          SA1    2
          SA2    FET
          MX0    42D
          BX6    X0*X1
          BX1    X0*X1
          BX2    -X0*X2 
          IX6    X1+X2
          SA6    A2 
*#
*     DECODE PRU COUNT FROM CONTROL CARD PARAMETER. 
*       ERROR IF ILLEGAL
*       PUT PRU COUNT IN QRF HEADER RECORD
*#
          SA1    3           FET CC PARAMETER 
          RJ   CCCRACK       CRACK IT 
          MI   X6,ILLPRU     IF ILLEGAL 
          SA6    PRUCOUNT    STORE PRUCOUNT 
          SX2    PRUSIZE     PUT QRF SIZE IN WORDS INTO HEADER RECORD 
          IX6    X2*X6       *
          LX6    30D         *
          SA6    QH+1        *
*#
*     DECODE SCHEMA ID FROM CONTROL CARD PARAMETER
*       ERROR IF ILLEGAL
*     PUT SCHEMA ID IN QRF HEADER RECORD. 
*#
          SA1    4
          RJ   CCCRACK
          MI   X6,ILLSCHID
          MX0    48D
          BX6    -X0*X6 
          LX6    42D
          SA6    QH 
*#
*     GUARENTEE SUFFICIENT SPACE FOR I/O OPERATIONS BY MEMORY MACRO 
*       CALLS.
*#
          MEMORY  CM,MEMWORD,RECALL 
          SA1    MEMWORD     GET CURRENT FL 
          AX1    30D         *
          SX2    BLOCKSZ     CHECK IF ENOUGH
          IX3    X1-X2       *
          PL   X3,ENOUGH     *
          SX6    X2+3        REQUEST ENOUGH 
          LX6    30D         *
          SA6    A1          *
          MEMORY  CM,MEMWORD,RECALL 
ENOUGH    BSS    0
*#
*     REWIND QRF
*#
          REWIND  FET,RECALL
*#
*       WRITE QRF HEADER RECORD WHICH IS 1 PRU LONG 
*#
          SX1    QH 
          SX2    PRUSIZE
          RJ   FETWRITE 
          WRITER  FET,RECALL
*#
*     IN KRONOS TYPE SYSTEMS
*       ENDRUN
*#
KRONOS    IFC    EQ,$"OS.NAME"$KRONOS$
          ENDRUN
KRONOS    ENDIF 
*#
*     IN SCOPE TYPE SYSTEMS 
*       WRITE OUT PRUCOUNT PLUS SAFETY FACTOR TO ESTABLISH QRF
*#
SCOPE     IFC    EQ,$"OS.NAME"$SCOPE $
          SA1    PRUCOUNT    WORDCNT=PRUSIZE*(PRUCOUNT+SAFETY FACTOR)-1 
          SX2    SAFFACTR    *
          SX3    PRUSIZE     *
          IX2    X1+X2       *
          MX5    59D
          IX6    X2*X3       *
          IX6    X6-X5
          SA6    WORDCNT     *
  
WRITELP   BSS    0
          SX1    1           WRITE OUT BLOCKSZ WORDS TO QRF 
          SX2    BLOCKSZ     *
          RJ   FETWRITE      *
          WRITER FET,RECALL  *
          SA1    WORDCNT     DECREMENT WORD COUNT BY BLOCKSZ
          SX2    BLOCKSZ     *
          IX6    X1-X2       *
          SA6    A1          *
          PL   X6,WRITELP    IF WORDCNT POSITIVE THEN LOOP
*#
*       ENDRUN
*#
          ENDRUN
SCOPE     ENDIF 
*#
*     ERROR CONDITION CODE
*       ABORT FOR UNDEFINED SYSTEM. 
*#
          ABORT 
*#
*     ABORT FOR ILLEGAL NUMBER OF PARAMETERS
*#
ILLPARM   MESSAGE  ILLPARMM,,RECALL 
          ABORT 
ILLPARMM  DIS    ,$  ILLEGAL NUMBER OF CONTROL CARD PARAMETERS$ 
*#
*       ABORT FOR ILLEGAL PRU SIZE. 
*#
ILLPRU    MESSAGE  ILLPRUM,,RECALL
          ABORT 
ILLPRUM   DIS    ,$  ILLEGAL PRU SIZE CONTROL CARD PARAMETER$ 
*#
*     ABORT FOR ILLEGAL SCHEMA ID.
*#
ILLSCHID  MESSAGE  ILLSCH,,RECALL 
          ABORT 
ILLSCH    DIS    ,$  ILLEGAL SCHEMA ID CONTROL CARD PARAMETER$
          END    DBQRFI 
