*DECK FFSCGCR 
          IDENT  FFSCGCR
*CALL COPYRITE
          ENTRY  FFSCGCR
          ENTRY  FFSCSFP
          SYSCOM B1 
          SST 
          TITLE  FFSCGCR - GET CONTROL RECORD FOR BINARY TRANSFER.
          COMMENT  FFSCGCR - GET CONTROL RECORD.
          COMMENT - COPYRIGHT CONTROL DATA SYSTEMS INC. 1994. 
  
  
  
          SPACE  4,10 
***       FFSCGCR - GET CONTROL RECORD FOR BINARY TRANSFER. 
 FFSCGCR  SPACE  4,20 
***       FFSCGCR - GET CONTROL RECORD FOR BINARY TRANSFER. 
* 
*         NOTE - USE ONLY NOSTEXT & PSSTEXT (+ OPL) TO COMPILE. 
*         *FFSCGCR* ATTEMPTS TO READ THE CONTROL RECORD FOR A BINARY
*         FILE TRANSFER. IF IT EXISTS, THE RECORD IS APPENDED TO THE
*         END OF THE BINARY FILE AFTER AN EOF. THE RECORD IS USED TO
*         CALCULATE THE NUMBER OF BITS USED IN THE LAST WORD OF THE 
*         BINARY FILE. IT HAS THE FOLLOWING FORMAT:-
* 
*         WORD 0:  42/*FTPCTRL,18/REC LENGTH
*         WORD 1:  6/VERSION,1/CHECKSUM-IN-USE,5/0,48/FILE BYTE COUNT 
*         WORD 2:  60/FILE CHECKSUM TO LAST BYTE
*         WORD 3:  60/FILE CHECKSUM TO LAST FULL WORD 
* 
*         SYMPL CALL -
* 
*         FFSCGCR(LFN,BUFFER,STAT); 
* 
*         ENTRY  (LFN) = ADDRESS OF FET ALREADY SET UP, 
*                (BUFFER) = ADDRESS OF 4-WORD BUFFER FOR CONTROL RECORD.
*                (STAT) = 0 IF NO I/O ERRORS, <> 0 IF ERRORS. 
* 
*         EXIT   BUFFER = CONTROL RECORD CONTENTS IF RECORD EXISTS, 
*                OR       BUFFER WORD 0 IS ZERO IF NOT FOUND. 
**
  
 CRECLEN  EQU    4
 IFILE    BSS    1           FET ADDRESS
 OBUFAD   BSS    2           SAVED ADDRESS OF OUTPUT BUFFER/STAT
  
 FFSCGCR  BSSZ   1           ENTRY/EXIT 
          SB1    1
          MX0    42 
          BX6    X1 
          SA6    IFILE       SAVE FET ADDRESS 
          SA3    A1+B1       GET BUFFER ADDRESS 
          BX6    X3 
          SA4    A3+B1       GET STAT ADDRESS 
          BX7    X4 
          SA6    OBUFAD      SAVE BUFFER ADDRESS
          SA7    A6+B1
*         SETFET IFILE,(LFN=X2),(BUF=IBUF,IBUFL)
          SKIPEI X1,R 
          SA1    IFILE
          BKSPRU X1,1,R      BACKSPACE 1 PRU
  
 GETREC00 BSS    0
          SA1    IFILE
          READ   X1,R 
          RJ     CHKERR      CHECK FOR ERRORS 
          JP     B2+GETREC0  JUMP BASED ON RETURN VALUE 
  
 GETREC0  EQ     GETREC2     NO ERRORS/EOF/EOI
          EQ     GETREC2     EOI
          EQ     GETREC1     EOF
          SX6    B2          ERRORS 
          EQ     GETREC3     EXIT TO SET STATUS 
  
 GETREC1  BSS    0           EOF DETECTED 
          SA1    IFILE
          BKSPRU X1,2,R      GO BACK 1 MORE 
          SA1    X2          CHECK FOR BOI
          SX0    774B 
          BX1    X0*X1
          SX6    X1-50B 
          NZ     X6,GETREC00 TRY AGAIN (NOT BOI)
          SA1    OBUFAD      GET BUFFER ADDRESS 
          SA2    X1          GET BUFFER WORD 0
          EQ     GETREC21    NO CONTROL RECORD EXISTS 
  
 GETREC2  BSS    0
          SA1    OBUFAD      GET BUFFER ADDRESS 
          SA2    IFILE
          READW  X2,X1,CRECLEN
          SB1    1
          SA1    OBUFAD      GET BUFFER ADDRESS 
          SA2    X1          GET BUFFER WORD 0
          SA3    =0LFTPCTRL 
          MX0    42 
          BX2    X0*X2       EXTRACT POSSIBLE RECORD LABEL
          IX3    X3-X2
          MX6    0
          ZR     X3,GETREC3  EXIT IF CONTROL RECORD EXISTS
 GETREC21 MX7    0
          SA7    A2          ZERO WORD 0 OF WSA 
          SA7    A2+B1       ZERO BYTE COUNT WORD 
  
 GETREC3  BSS    0
          SA1    OBUFAD+1    GET STAT PARAMETER ADDRESS 
          SA6    X1          SET STATUS 
          EQ     FFSCGCR     RETURN 
  
  
          TITLE  FFSCSFP - SET POSITION FOR APPEND COMMAND. 
  
          COMMENT  FFSCSFP - SET POSITION FOR APPEND COMMAND. 
          COMMENT - COPYRIGHT CONTROL DATA SYSTEMS INC. 1994. 
  
  
  
          SPACE  4,10 
***       FFSCSFP - SET POSITION FOR APPEND COMMAND.
 FFSCSFP  SPACE  4,20 
***       FFSCSFP - SET POSITION FOR APPEND COMMAND.
* 
*         FFSCSFP IS USED BY THE APPEND COMMAND IN A BINARY FILE
*         TRANSFER TO SEE IF A CONTROL RECORD IS APPENDED TO THE FILE.
*         IF THERE IS ONE, IT WILL BE READ UP AND THE INFORMATION IN IT 
*         USED IN POSITIONING. EITHER WAY, THE LAST PRU OF THE BINARY 
*         FILE IS READ UP AND PLACED IN THE BUFFER AND THE APPROPRIATE
*         POINTERS ARE SETUP TO ENSURE THAT FURTHER DATA IS ADDED 
*         DIRECTLY AFTER THE LAST BINARY DATA. THE FILE IS LEFT 
*         READY FOR A FURTHER OUTPUT WITH NO REPOSITIONING. 
*         THE FILE CHECKSUM IS SET TO THE LAST FULL WORD FROM THE 
*         CONTROL RECORD IF IT EXISTS - OTHERWISE IT IS DISABLED. 
* 
*         FOR CHARACTER FILE TRANSFERS, THE FILE IS SIMPLY POSITIONED 
*         SO THAT THE LAST PRU IS READ UP AND PLACED IN THE BUFFER. 
*         APPEND DATA IS THEN ADDED IN THE NEXT CONSECUTIVE WORD. NO
*         SEARCH IS DONE FOR A CONTROL RECORD, AND IF ONE IS THERE, THEN
*         DATA WILL SIMPLY BE APPENDED TO IT. 
* 
*         SYMPL CALL -
* 
*         FFSCSFP(LFN, OUBWORD, OUCREC, STATUS);
* 
*         WHERE  LFN = FET ADDRESS (BUFFER ALREADY SET UP), 
*                OUBWORD = WORD OFFSET OF NEXT BYTE (RETURNED), 
*                OUCREC = CONTROL RECORD BUFFER,
*                STATUS = 0 IF BINARY APPEND, <> 0 IF CHARACTER APPEND. 
* 
*         EXIT -
*                OUCREC SET UP APPROPRIATELY. 
*                STATUS = STATUS OF ACTIONS (0 = OK,<>0= FATAL ERROR).
* 
**
  
 IN       BSS    1           IN-POINTER SAVE
 OUT      BSS    1           OUT-POINTER SAVE 
 SAVADD   BSS    3           SAVE AREA FOR OUBWORD/STATUS ADDRESSES 
 STATVAL  BSS    1           STATUS ENTRY VALUE 
  
 FFSCSFP  BSSZ   1           ENTRY/EXIT 
          SB1    1
          BX6    X1          (X1) = FET ADDRESS 
          SA6    IFILE
          SA3    A1+B1       (X3) = WORDS READ ADDRESS (RETURN) 
          SA4    A3+B1       (X4) = OUCREC ADDRESS
          BX7    X3 
          SA7    SAVADD 
          BX6    X4 
          SA5    A4+B1       GET STATUS ADDRESS 
          SA6    A7+B1
          SA2    X5          GET STATUS ENTRY VALUE 
          BX7    X5 
          SA7    A6+B1
          BX6    X2 
          SA6    STATVAL
          SA1    IFILE
          SKIPEI X1,R        GO TO EOI
          SA1    IFILE
          BKSPRU X1,1,R      BACKSPACE 1 PRU
  
 SETPOS0  BSS    0
          SA1    IFILE
          READ   X1,R        READ THIS TO SEE WHATS IN IT 
          RJ     CHKERR      CHECK FOR ERRORS 
          JP     B2+SETPOS00 JUMP BASED ON RETURN VALUE 
  
 SETPOS00 EQ     SETPOS2     NO ERRORS/EOF/EOI
          EQ     SETPOS2     EOI - NULL FILE
          EQ     SETPOS1     EOF
          SX6    B2          ERRORS 
          EQ     SETPOS5     EXIT TO SET STATUS 
  
 SETPOS1  BSS    0           EOF PROCESSING 
          SA1    IFILE
          BKSPRU X1,2,R      GO BACK 1 MORE 
          EQ     SETPOS0     TRY AGAIN
  
 SETPOS2  BSS    0
          SA2    STATVAL     GET APPEND TYPE
          NZ     X2,SETPOS4  EXIT IF CHARACTER APPEND 
          SA1    IFILE
          SA1    X1+3        GET OUT-POINTER
          SA2    X1          GET FIRST WORD OF PRU
          SA3    =0LFTPCTRL 
          MX0    42 
          BX2    X0*X2       EXTRACT POSSIBLE RECORD LABEL
          IX2    X3-X2
          SA1    SAVADD+1    GET OUCREC ADDRESS 
          NZ     X2,SETPOS3  EXIT IF NO CONTROL RECORD EXISTS 
          SA2    IFILE
          READW  X2,X1,CRECLEN PUT CONTROL REC INTO BUFFER
          MX0    42 
          SA1    IFILE
          SB1    1
          SA1    X1+B1       GET FIRST-POINTER
          SA4    A1+B1       GET IN-POINTER 
          BX1    -X0*X1      EXTRACT FIRST-POINTER VALUE
          SA5    A4+B1       GET OUT-POINTER
          BX4    X0*X4       CLEAR IN-POINTER ADDRESS 
          IX7    X1+X4       SET IN=OUT=FIRST 
          BX5    X0*X5       CLEAR OUT-POINTER ADDRESS
          IX6    X1+X5
          SA7    A4 
          SA6    A4+B1
          SA1    IFILE
          BKSPRU X1,3,R      BACKSPACE TO BEGIN OF REC THEN OVER EOF
          SA1    IFILE
          READ   X1,R        READ LAST PRU OF BINARY FILE 
          EQ     SETPOS4
  
 SETPOS3  BSS    0           NO C/REC, BINARY APPE - EMPTY FILE?
          MX0    42 
          SB1    1
          SA2    IFILE
          SA4    X2+2        GET IN-POINTER 
          BX4    -X0*X4 
          SA5    A4+B1       GET OUT-POINTER
          BX5    -X0*X5 
          IX5    X4-X5       GET WORDS IN BUFFER
          MX6    0
          SA6    X1          ZERO OUCREC HEADER 
          ZR     X5,SETPOS3A EXIT IF NO DATA IN BUFFER
          PL     X5,SETPOS3B EXIT IF DATA IN BUFFER 
  
*         X3 = *FTPCTRL* AND X1 = OUCREC ADDRESS
*         CREATE CONTROL RECORD FOR NULL FILE 
  
 SETPOS3A BSS    0
          SX2    CRECLEN
          IX6    X3+X2
          SA6    X1          SET HEADER 
          MX6    0
  
 SETPOS3B BSS    0
          SA6    A6+2        ZERO CHECKSUM
          SA6    A6+B1       ZERO PREVIOUS CHECKSUM 
          MX0    12 
          SA1    X1+B1       GET BYTE COUNT WORD
          BX6    X0*X1       ZERO BYTE COUNT
          SA6    A1 
  
 SETPOS4  BSS    0           LAST PRU IN BUFFER - SET POSITION
          MX0    42 
          SB1    1
          SA1    IFILE
          SA1    X1+2 
          BX6    X1 
          SA2    A1+B1
          BX1    -X0*X1      (X1) = IN-POINTER VALUE
          SA6    IN 
          BX7    X2 
          SA7    OUT
          BX2    -X0*X2      (X2) = OUT-POINTER VALUE 
          IX2    X1-X2       GET WORDS IN BUFFER
          SX6    B1          SET POSSIBLE EXIT STATUS 
          NG     X2,SETPOS5  EXIT IF INCORRECT POINTERS (X6<>0) 
          SA4    SAVADD      GET WORDS-MOVED ADDRESS
          BX7    X2 
          SA7    X4          SET WORDS MOVED
          SA1    IFILE
          BKSPRU X1,1,R      REPOSITION THE FILE
          SA1    IFILE
          SA3    IN 
          BX7    X3 
          SA7    X1+2        RESTORE IN-POINTER 
          SA3    OUT
          BX7    X3 
          SA7    X1+3        RESTORE OUT-POINTER
          MX6    0
  
 SETPOS5  BSS    0
          SA1    SAVADD+2 
          SA6    X1          SET RETURN STATUS
          EQ     FFSCSFP     RETURN 
  
          SPACE  5
**
*         SUBROUTINE CHKERR - CHECK FOR ERRORS IN THE FET.
* 
*         ENTRY:- 
*                (IFILE) = FET ADDRESS. 
* 
*         EXIT:-
*                B2 = 0 IF NO EOF/ERROR,
*                B2 = 1 IF EOI, 
*                B2 = 2 IF EOF, 
*                B2 = 3 IF ERRORS.
* 
**
  
 CHKERR   BSSZ   1           ENTRY/EXIT 
          SB1    1
          MX0    5           MASK FOR *AT* FIELD IN FET 
          SA1    IFILE       (X1) = FET ADDRESS 
          SA1    X1+B0       GET FET+0
          LX1    59-13       POSITION *AT*
          BX2    X0*X1
          ZR     X2,CHKERR1  NO ERRORS - CONTINUE 
          LX2    5
          SB2    X2-1        CHECK EOI
          NE     B2,CHKERR3  EXIT IF NOT EOI - MUST BE ERROR
          SB2    B1          SET EOI
          EQ     CHKERR      EXIT 
  
 CHKERR1  BSS    0
          MX0    4           MASK FOR *LN* FIELD
          LX0    4
          BX2    X0*X1
          SB2    X2-17B      CHECK FOR EOF
          NE     B2,CHKERR2  EXIT IF NOT EOF
          SB2    2           SET EOF
          EQ     CHKERR      EXIT 
  
 CHKERR2  BSS    0
          SB2    B0          SET NO ERRORS/EOF
          EQ     CHKERR      EXIT 
  
 CHKERR3  BSS    0
          SB2    3           SET ERRORS 
          EQ     CHKERR      EXIT 
  
  
 OPL      XTEXT  COMCRDW
  
          END 
