ASMB,R,L,C,Q
      HED $OPEN 
*     NAME:   $OPEN 
*     SOURCE: 92067-18141 
*     RELOC:  92067-16125 
*     PGMR:   G.A.A.
* 
*  ***************************************************************
*  * (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 92067-16125 REV.1903 790103 
      EXT RWND$ 
      ENT $OPEN 
      SUP 
* 
*  $OPEN   IS A ROUTINE OF THE RTE FILE MANAGEMENT PACKAGE. 
* 
*  $OPEN   IS CALLLED BY OPEN AND CREAT TO SET UP THE 
*          DCB.  IT READS THE DIRECTORY INFORMATION 
*          AND TRANSFERS THE INFORMATION FROM THERE 
*          TO THE DCB.  IT ALSO INITIALIZES THE REST
*          OF THE DCB.
* 
*   CALLING SEQUENCE: 
*        (IT IS ASSUMED THAT WORDS 1 & 2 OF THE DCB ARE SET UP.)
* 
*     A  =  DCB ADDRESS 
*     B  =  BUF ADDRESS WHERE BUF CONTAINS WORDS 4-8
*           OF THE DIRECTORY ENTRY RETURNED FROM D.RTR
*     E  =  1 IF TYPE 1 OVERRIDE
*     O  =  1 IF AN UPDATE OPEN 
* 
*     JSB $OPEN 
*     DEF IBLK      DEF OF LENGTH OF DCB OR ZERO
*     DEF #SECT     DEF OF WORD CONTAINING #SEC/TRACK 
*                   IN THE HIGH HALF (PASSED FROM D.RTR)
*     JMP ERR       ERROR RETURN
*                   NORMAL RETURN 
*     ON A NORMAL RETURN: 
*        A AND B = GARBAGE
* 
*     ON AN ERROR RETURN, EITHER
*       A = -1  DISC ERROR OR 
*       A = -9  TYPE ZERO OVERRIDE ERROR
*         IN EITHER CASE THE DCB IS NOT SET UP. 
* 
* 
$OPEN NOP           ENTRY 
      STB BUF       SAVE THE BUFFER ADDRESS 
      STA DCB       AND THE DCB ADDRESS 
      STA DCB2
      ADA .5        OFFSET TO FILE SIZE WORD
      STA SIZE       AND SAVE 
      CLA           SET UPDATE OPEN BIT 
      SOC            IN OPEN MODE WORD IF 
      LDA =B10        UPDATE OPEN WAS REQUESTED 
      STA OPNMD 
      ISZ DCB       INCREMENT DCB POINTER 
      ISZ DCB        TO TYPE WORD 
      CLB,SEZ,INB      IF TYPE 1 OVERRIDE 
      STB DCB,I         SET TYPE
      SEZ                 AND 
      CCB                  THE
      STB TPFLG             OVERRIDE SKIP FLAG
      CLB           SET DCB 
      LDA DCB        EXTENT 
      ADA .13         WORD
      STB A,I          TO ZERO
      LDA N9
      LDB BUF,I     GET FILE TYPE 
      SZB,RSS       IF ZERO 
      ISZ TPFLG      AND OVERRIDE FLAG SET
      RSS 
      JMP EREX      EXIT - ERROR
* 
      LDB N5        SET TO MOVE 5 
NXT   LDA BUF,I      PARAMETERS 
      ISZ TPFLG     IF OVERRIDE SET SKIP
      STA DCB,I     SET PARAMETER 
      ISZ DCB       STEP ADDRESS
      ISZ BUF       STEP SOURCE 
      INB,SZB       AND COUNT - DONE? 
      JMP NXT       NO; DO NEXT ONE 
      LDB $OPEN,I   GET ADDRESS OF DCB LENGTH 
      ISZ $OPEN     STEP POINTER
      LDA $OPEN,I   GET #SECTORS PER TRACK
      LDA A,I        TO A-REG 
      ALF,ALF         SHIFT TO LOWER BYTE 
      AND =B377        MASK TO BITS 0-8 
      STA SEC/T         AND SAVE. 
      LDB B,I       DCB LENGTH TO B-REG 
      LSR 7         DIVIDE BY 128 TO GET BLOCKS 
      SZB,RSS       IF ZERO THEN
      INB           USE ONE 
      BLS           CONVERT TO SECTORS
NXBUF STB TPFLG     SAVE IT 
      CLB 
      LDA SIZE,I    GET FILE SIZE 
      SSA,RSS       +SECTORS OR -128 BLOCK CHUNKS 
      JMP SEC1      ALREADY SECTORS - SKIP
      CMA,INA       -CHUNKS - CONVERT TO +SECTORS 
      LSL 8          IN B-REG AND A-REG 
SEC1  STA ASAVE     DIVIDE BY DCB SIZE IN SECTORS 
      ASR 15        A REGULAR DIVIDE COULD OVERFLOW ON
      DIV TPFLG      LARGE FILES.  SINCE ALL WE WANT TO 
      LDA ASAVE       KNOW IS IF THERE IS A REMAINDER, JUST 
      RAL              USE THIS ALGORITHM TO AVOID USE OF 
      ASR 1           DOUBLE WORD DIVIDE, MULT, AND SUBTRACT
      DIV TPFLG      COMPLIMENTS OF BILL GIBBONS
      SZB,RSS       IF NO REMAINDER 
      JMP BFOK      THEN THE SIZE IS OK 
      LDB N2         ELSE TRY ONE SMALLER 
      ADB TPFLG       THAN THE CURRENT
      JMP NXBUF        ONE
BFOK  LDA TPFLG     GET THE BUFFER SIZE AND 
      LSL 6          CONVERT SECTORS TO WORDS 
      IOR OPNMD     INCLUDE OPEN MODE FLAG
      STA DCB,I     SET IN DCB
      ISZ DCB       GET NUMBER OF 
      LDB SEC/T      SECTORS PER TRACK
      STB DCB,I     PUT IT IN THE DCB 
      ISZ $OPEN     STEP RETURN ADDRESS 
      CLA           OPEN EXTENT ZERO
      LDB DCB2      GET THE DCB ADDRESS 
      JSB RWND$     SET REST OF DCB 
      JMP $OPEN,I   ERROR EXIT
      ADB N3        GET DOUBLE WORD RECORD
      CLA            NUMBER TO 1
      STA B,I 
      INA 
      INB 
      STA B,I 
      ISZ DCB       STEP TO THE OPEN FLAG ADDRESS 
      LDA XEQT      GET THE CURRENT ID ADDRESS
      STA DCB,I     SET THE OPEN FLAG 
      RSS 
EREX  ISZ $OPEN     STEP TO ERROR RETURN
      ISZ $OPEN     STEP AND
      JMP $OPEN,I   AND RETURN
* 
* 
* 
SIZE  NOP 
DCB   NOP 
DCB2  NOP 
BUF   NOP 
SEC/T NOP 
TPFLG NOP 
OPNMD NOP 
ASAVE NOP 
* 
.5    DEC 5 
.13   DEC 13
N2    DEC -2
N3    DEC -3
N5    DEC -5
N9    DEC -9
* 
XEQT  EQU 1717B 
A     EQU 0 
B     EQU 1 
* 
END   EQU * 
* 
      END 
                                                                                                                                                                                          