ASMB,R,L,C
*     NAME:   OPEN
*     SOURCE: 92070-18047 
*     RELOC:  92070-16047 
*     PGMR:   G.A.A.
*     MOD:    M.L.K.
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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 OPEN,7  92070-1X047 REV.2009  800225
      SUP 
* 
      HED OPEN
      ENT OPEN
      EXT LURQ,CLOSE,IFTTY,$OPEN
      EXT .ENTR,.P1,.P2,.P3,.P4,CLD.R 
      EXT .R1,.R2,.R5 
* 
*  OPEN    IS THE FILE OPEN ROUTINE OF THE REAL TIME
*          FILE MANAGEMENT PACKAGE
* 
*       THE FORTRAN CALLING SEQUENCE IS:
* 
*     CALL OPEN(IDCB,IERR,NAME,IOP,IS,ILU,IBLK) 
* 
*  W H E R E: 
* 
*     IDCB          IS A 144-WORD DATA CONTROL BLOCK (ARRAY)
*                   TO BE USED WITH ALL ACCESS TO THE FILE
*                   UNDER THIS OPEN.
* 
*     IERR          IS THE RETURN ERROR CODE (ALSO RETURNED IN A) 
* 
*     NAME          IS THE 6-CHARACTER (3 WORD) NAME ARRAY. 
* 
*     IOP           (OPTIONAL); IS THE OPEN OPTION FLAG WORD
*                    OPTIONS ARE: 
*                     BIT   MEANING IF SET
*                     0     NON-EXCLUSIVE OPEN
*                     1     UPDATE OPEN 
*                     2     FORCE TO TYPE 1 OPEN
*                     3     USE SUB FUNCTION IN BITS 6-11 
*                           IF TYPE 0.
* 
*     IS            (OPTIONAL); IS THE EXPECTED SECURITY CODE.
* 
*     ILU           (OPTIONAL); IS THE DISC SPECIFIED.
*                     IF ILU >0 THEN USE DISC LABELED ILU 
*                     IF ILU <0 THEN USE DISC AT LOGICAL UNIT (-ILU)
* 
*  IBLK        (OPTIONAL); SPECIFIES A DCB BUFFER AREA OF 
*              IBLK WORDS.  (NORMALLY 128 IS USED.)  MUST BE A
*              MULTIPLE OF 128.  THE BUFFER MUST BE AN EVEN 
*              DIVISOR OF THE FILE SIZE SO ONLY PART OF 
*              THE SPECIFIED SIZE MAY BE USED.  THE USED SIZE IS: 
*              USED SIZE=FILE SIZE/N  WHERE 
*              N=(FILE SIZE/IBLK)+(IF REMAINDER THEN 1,ELSE 0)
* 
*       OPEN ERRORS ARE AS FOLLOWS: 
* 
*     -1    DISC ERROR
*     -6    FILE NOT FOUND
*     -7    WRONG SECURITY CODE 
*     -8    FILE IS CURRENTLY OPEN (IF EXCLUSIVE REQUEST) OR
*                IS CURRENTLY OPEN TO 7 OTHER PROGRAMS
*     -9    ATTEMPT TO OPEN TYPE 0 AS TYPE 1
*     -10   NOT ENOUGH PARAMETERS 
*     -13   DISC LOCKED 
*     -36   LOCK ERROR
      SKP 
* 
* 
OPEN  NOP 
      LDA DZERO      PRESET ENTRY PARMS 
      STA NAME
      STA OP
      STA SC
      STA LU
      STA IBLK
      CLA           RESET ZERO WORD 
      STA ZERO
      LDA OPEN
      STA DPEN
      JMP DPEN+1
* 
*    MIGHT NEED TO CLEAR ZERO 
* 
DCB   NOP 
ERR   NOP 
NAME  DEF ZERO
OP    DEF ZERO
SC    DEF ZERO
LU    DEF ZERO
IBLK  DEF ZERO
      SPC 1 
DPEN  NOP           ENTRY POINT 
      JSB .ENTR     TRANSFER PARAMETERS 
      DEF DCB       TO LOCAL AREA 
      LDA N10 
      LDB NAME      DID WE GET
      CPB DZERO      ENOUGH PARAMETERS? 
      JMP EXIT        NO; ERROR - EXIT
      SPC 1 
      JSB CLOSE     CLOSE 
      DEF *+2        IF 
      DEF DCB,I      OPEN 
      SZA           SKIP IF NO ERRORS 
      CPA N11        OR IF NOT OPEN 
      CLE,RSS 
      JMP EXIT      ELSE TAKE ERR EXIT
* 
      LDA NAME,I
      LDB OP,I       AND OPTION 
      ERB             EXCLUSIVE BIT TO E
      CME              INVERT AND 
      RAL,ERA           SET IN SIGN OF A
      STA .P3       SET FOR CALL TO D.RTR 
      STA LOCK      STORE FOR LOCK TEST 
      ISZ NAME      GET 
      DLD NAME,I     REST OF
      SZA,RSS       CHECK FOR NULL FROM ON PROCESSOR
      LDA BLK       FILL WITH BLANK 
      SZB,RSS       SAME CHECK
      LDB BLK       FILL WITH BLANKS
      DST .P4 
      LDA .9        FETCH OPEN CODE 
      STA .P1       SET IN CALL 
      LDA LU,I      FETCH CR\LU 
      STA .P2       SET IN CALL 
      JSB CLD.R     GO GET D.RTR
* 
      LDA .R1       GET ERROR WORD
      STA TMP       SAVE FILE LENGTH OR 0 IF TYPE 0 
      SSA            IF ERROR 
      JMP EXIT        EXIT
      DLD .R2       ELSE SET
      DST DCB,I      THE DCB FOR $OPEN
      CLO           SET O 
      LDA OP,I       TO 
      RAR,SLA,RAR     INDICATE
      STO              UPDATE OPTION
      ERA               AND E FOR TYPE 1 OVER-RIDE
      STA LU        SAVE FLAG 
      LDA DCB       GET DCB ADDRESS 
      LDB SC,I       AND SECURITY CODE
      JSB $OPEN       AND GO SET UP THE DCB 
      DEF IBLK,I    ADDRESS OF BLOCK SIZE 
      DEF .R5       ADDRESS OF NO OF SECTORS PER TRACK
      JMP OPEN1     ERROR - CLOSE AND EXIT
      SSA           IF OPEN PROTECT 
      SSB            AND CODE MISMATCH THEN SKIP
      JMP OPEN2       ELSE GO EXIT - GOOD OPEN
      SPC 2 
      LDA N7        SET EXIT CODE 
OPEN1 STA TMP       IN TEMP 
      JSB CLOSE     ILLEGAL OPEN SO CLOSE 
      DEF *+2        THE
      DEF DCB,I       FILE
OPEN2 LDA TMP       GET FILE LENGTH, ERROR CODE OR 0 IF TYPE 0
      SZA           IF NOT TYPE ZERO
      JMP EXIT      THEN EXIT 
      SPC 1 
      LDB LU        GET SUB FUNCTION FLAG AND 
      ERB            SET E AS SUB FUNCTION FLAG 
      LDB DCB       CACULATE DCB SUB FUNCTION 
      ADB .3        ADDRESS 
      STB SC        SAVE IT 
      LDA OP,I      GET THE OPTIN SUB FUNCTION
      AND B477K     MASK IT OFF 
      STA B         AND SAVE IT 
      LDA SC,I      GET THE CURRENT WORD
      AND B77       SAVE THE LU 
      STA LU        SAVE FOR LOCK 
      ADA B         ADD IN THE NEW SUB FUNCTION 
      SEZ           IF SUB FUNTION NOT SET USE FROM FILE
      STA SC,I      SET IT IN THE DCB 
      LDB DCB       GET DCB ADDRESS 
      ADB .15       POINT TO WORD 15
      STB SC        AND SAVE
      CLA,INA       DEFAULT TO DON'T
      STB SC,I        UNLOCK THE LU 
      LDA LOCK      LOCK THE LU?
      SSA,RSS       TEST SIGN 
      JMP LUEX      DON'T LOCK, EXIT
      JSB IFTTY     TEST IF LU IS 
      DEF *+2         INTERACTIVE 
      DEF LU
      SZA           INTERACTIVE?
      JMP LUEX      YES, DON'T LOCK!
* 
      JSB LURQ
      DEF *+4 
      DEF OPTN      OPTION WORD 
      DEF LU        LU WORD 
      DEF .1        ONE LU
      JMP ER18      ERROR ON LOCK 
      SSA           NO RN?
      JMP LCKER     RIGHT, ERROR
      STA SC,I      STORE LOCK WORD IN DCB15
LUEX  CLA           CLEAR A AND EXIT
      SPC 1 
EXIT  LDB DCB       IF NO ERRORS, 
      ADB .2        THEN REPLACE THE SIZE 
      SSA,RSS       WITH THE TYPE 
      LDA B,I       IF NO ERRORS
EXIT2 STA ERR,I     SET THE ERROR CODE
      JMP DPEN,I     AND RETURN 
* 
* 
LCKER LDB DCB       CLEAR THE OPEN
      ADB .9         FLAG  (GET ADDRESS)
      CLA 
      STA B,I        FILE NOT OPEN
      LDA N36       COULDN'T LOCK ERROR 
      JMP EXIT2 
* 
* 
ER18  LDA N18       ILLEGAL LU
      JMP EXIT2 
      SKP 
DZERO DEF ZERO
N10   DEC -10 
N11   DEC -11 
N7    DEC -7
ZERO  NOP 
.1    OCT 1 
.2    DEC 2 
.3    DEC 3 
.9    DEC 9 
B77   OCT 77
BLK   ASC 1,
.15   DEC 15
N18   DEC -18 
N36   DEC -36 
TMP   NOP 
LOCK  NOP 
OPTN  OCT 140001
B477K OCT 47700 
      SPC 3 
A     EQU 0 
B     EQU 1 
      SPC 3 
END   EQU * 
      END 
                                                                    