ASMB,R,L,C
      HED (FMP) CLOSE: CLOSE A FILE 
*     NAME:   CLOSE 
*     SOURCE: 92071-18039 
*     RELOC:  92071-16039 
*     PGMR:   G.A.A.
*     MOD:    M.L.K., E.D.B.
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
*  ***************************************************************
* 
     NAM CLOSE,7 92071-1X039 REV.2041 800811
* 
      ENT CLOSE,ECLOS 
* 
      EXT GTOPN, R/W$, $DBLX
      EXT CLD.R, .P1, .P2, .P4, .R1 
      EXT .ENTR, LURQ, $SETP
* 
      EXT F.DCB, F.LU, F.TYP, F.ST1, F.FLG
      EXT F.EXN, F.DLU
      SUP 
      SKP 
* 
*     DESCRIPTION 
* 
*     THIS IS THE CLOSE SUBROUTINE--A PART OF THE 
*     REAL-TIME FILE MANAGEMENT PACKAGE 
* 
*     THE FORTRAN CALLING SEQUENCE IS:
* 
*     CALL CLOSE(IDCB,IERR,ITRUN) 
*     CALL ECLOS(IDCB,IERR,ITRUN) 
* 
*     WHERE:
* 
*     IDCB   IS THE USER DATA CONTROL BLOCK.
* 
*     IERR   WILL BE THE ERROR RETURN CODE (OPTIONAL).
*            ALSO RETURNED IN A-REG.
* 
*     ITRUN  IS THE NUMBER OF 128-WORD BLOCKS 
*            TO BE DELETED FROM THE FILE (OPTIONAL).
* 
*     POSSIBLE ERRORS ARE:
* 
*      0      NONE
*     -10     NOT ENOUGH PARAMETERS 
*     -11     FILE NOT OPEN 
*     -17     ILLEGAL LU REQUEST
      SKP 
* 
*     ENTRY 
* 
ECLOS NOP           DOUBLE WORD ENTRY 
      CCA           SET DBL FLAG
      LDB ECLOS     SET UP RETURN ADDRESS 
      JMP SETUP     FINISH SET UP 
* 
CLOSE NOP 
      CLA           SET DBL FLAG FALSE
      LDB CLOSE     GET RETURN ADDRESS
* 
SETUP STA DBLWD     SAVE DBL FLAG 
      STB DLOSE     SAVE RETURN ADDRESS 
      LDA DZERO 
      STA IDCB
      STA ITRUN 
      LDA DDMER 
      STA IERR
      JMP DLOSE+1 
* 
IDCB  DEF ZERO      DCB ADDRESS 
IERR  DEF DUMER     ERROR CODE ADDRESS
ITRUN DEF ZERO      TRUNCATE CODE ADDRESS 
* 
DLOSE NOP           ENTRY POINT 
      JSB .ENTR     TRANSFER THE ADDRESSES
      DEF IDCB
* 
      LDA IDCB      CHECK FOR ENOUGH PARAMS 
      CPA DZERO      ENOUGH?
      JMP ER10        NO, TAKE ERROR EXIT 
* 
      LDA IDCB      SET UP POINTERS INTO DCB
      LDB F.DCB 
      JSB $SETP 
      DEF .16 
      NOP 
* 
      JSB GTOPN     GET PROGRAM'S OPEN FLAG 
      DEF *+1 
      CPA F.FLG,I   IS THE SAME AS IN DCB?
      RSS           YES, CONTINUE 
      JMP ER11
      SKP 
* 
*     PROCESS REQUEST 
* 
      ISZ DBLWD     TEST DBL FLAG 
      JMP SINGL      GO DO 16-BIT THING 
      DLD ITRUN,I   GET 32-BIT TRUNC CODE 
      JSB $DBLX 
      JMP EREX
      JMP SAVTR 
* 
SINGL LDB ITRUN,I   GET 16-BIT TRUNC CODE 
* 
SAVTR STB ITRUN     SAVE TRUNCATION CODE
* 
      LDA F.LU,I    GET FILE LU 
      AND B77        ISOLATE LU 
      CLE,SZA,RSS   IF ZERO (DUMMY),
      JMP TYPE0      THEN DON'T CALL D.RTR
* 
      LDB IDCB      GET DCB ADDRESS 
      JSB R/W$      CALL TO FLUSH THE BUFFER
      JMP EREX      DISC ERROR EXIT 
      SKP 
* 
*     SET UP D.RTR REQUEST
* 
      CLA           GET FUNCTION CODE 
      STA .P1        SAVE FOR D.RTR 
* 
      DLD F.LU,I    GET FILE ENTRY LU AND ENTRY NUMBER
      DST .P2 
* 
      CLA           ASSUME ZERO FOR TRUNCATION CODE 
      LDB F.TYP,I   GET FILE TYPE 
      SZB,RSS       IF TYPE ZERO, 
      JMP CLOS1      THEN FORGET TRUNCATION 
* 
      LDB F.EXN,I   GET EXTENT NUMBER 
      SZB           IF NOT MAIN EXTENT, 
      JMP CLOS1      THEN FORGET TRUNCATION 
* 
      LDB F.ST1,I   GET FIRST STATUS WORD 
      SSB,RSS       IF SECCD DOESN'T MATCH, 
      JMP CLOS1      THEN FORGET TRUNCATION 
* 
      LDA ITRUN     GET TRUNCATION CODE 
      ALS            CONVERT TO SECTORS 
* 
CLOS1 CMA,INA       NEGATE TRUNCATION CODE
      STA .P4        AND SAVE FOR D.RTR 
* 
      JSB CLD.R     SCHEDULE D.RTR
* 
      LDA .R1       GET D.RTR ERROR 
      SZA           IF ERROR OCCURRED,
      JMP EREX1      THEN EXIT
* 
      LDA F.TYP,I   GET FILE TYPE AGAIN 
      SZA           IF NOT TYPE 0,
      JMP EXIT       THEN EXIT
      SKP 
* 
*     UNLOCK DEVICE 
* 
TYPE0 LDA F.ST1,I   GET FIRST STATUS WORD 
      AND .2         ISOLATE LU LOCK FLAG 
      SZA,RSS       IF NOT LOCKED,
      JMP EXIT       THEN EXIT
* 
      LDA F.DLU,I   GET DEVICE LU 
      AND B77        ISOLATE LU 
      STA NLU         SAVE FOR LURQ 
* 
      JSB LURQ      CALL TO UNLOCK DEVICE 
      DEF *+4 
      DEF B40K      UNLOCK NO ABORT 
      DEF NLU 
      DEF .1
      JMP ER17      ERROR RETURN
      SKP 
* 
*     EXIT
* 
EXIT  CLA           NO ERROR INTENDED 
      JMP EREX1 
* 
ER10  LDA N10       NOT ENOUGH PARAMETERS 
      JMP EREX
* 
ER11  LDA N11       FILE NOT OPEN 
      JMP EREX
* 
ER17  LDA N17       ILLEGAL EXEC REQUEST
* 
EREX1 CLB           CLEAR OPEN FLAG 
      STB F.FLG,I 
* 
EREX  STA IERR,I    SAVE ERROR CODE 
      JMP DLOSE,I    AND RETURN 
      SKP 
* 
*     STORAGE AREA
* 
ZERO  NOP 
      NOP 
* 
N10   DEC -10 
N11   DEC -11 
N17   DEC -17 
* 
.1    DEC 1 
.2    DEC 2 
.16   DEC 16
* 
B77   OCT 77
B40K  OCT 40000 
* 
DZERO DEF ZERO
DDMER DEF DUMER 
* 
DBLWD NOP           DOUBLE WORD FLAG
DUMER NOP           DUMMY ERROR WORD
NLU   NOP           TEMP LU WORD
* 
A     EQU 0 
B     EQU 1 
* 
END   EQU * 
* 
      END 
                          