SPL,L,O,M 
!     NAME:   FM.UT 
!     SOURCE: 92070-18059 
!     RELOC:  92070-16059 
!     PGMR:   G.A.A.
!     MOD:    G.L.M.
! 
!  ***************************************************************
!  * (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.       *
!  ***************************************************************
! 
! 
      NAME FM.UT(7) " 92070-1X059  REV.1941  790712"
! 
! 
! 
! EXTERNAL SUBROUTINES
      LET EXEC      BE SUBROUTINE,EXTERNAL
      LET MSS.      BE SUBROUTINE,EXTERNAL
! EXTERNAL FUNCTIONS
      LET GTOPN     BE FUNCTION,EXTERNAL
! EXTERNAL LABELS 
      LET FM.AB     BE LABEL,EXTERNAL 
! EXTERNAL INTEGERS 
      LET O.BUF     BE INTEGER,EXTERNAL 
! GLOBAL INTEGERS 
      LET D.LB      BE INTEGER,GLOBAL            !DISC LABEL
      LET D.LK      BE INTEGER,GLOBAL            !DISC LOCK 
      LET D.LT      BE INTEGER,GLOBAL            !DISC LAST TRACK 
      LET D.SDR(128)BE INTEGER,GLOBAL            !DIRECTORY BUFFER
      LET DFMT      BE INTEGER,GLOBAL            !
      LET DS.DF     BE INTEGER,GLOBAL            !
      LET DS.F1     BE INTEGER,GLOBAL            !
      LET DS.LU     BE INTEGER,GLOBAL            !DISC LU 
      LET DS.SC     BE INTEGER,GLOBAL            !DISC SECURITY CODE
      LET PK.DR(128)BE INTEGER,GLOBAL            !DR.RD BUFFER
      LET TBLEN     BE INTEGER,GLOBAL            !
      INITIALIZE DS.DF,DS.F1 TO 0,0 
! CONSTANTS 
      LET A         BE CONSTANT (0)              !A REGISTER
      LET B         BE CONSTANT (1)              !B REGISTER
      LET READI     BE CONSTANT (1)              !EXEC READ 
      LET WRIT      BE CONSTANT (2)              !EXEC WRITE
! 
N1:   ASSEMBLE "OCT -1" 
D124:  ASSEMBLE "DEC 124" 
%DSDR: ASSEMBLE "DEF D.SDR" 
      ASSEMBLE "EXT $CDIR,.MVW,.DRCT,$MDSP" 
! 
D.RIO:SUBROUTINE(RCODE) GLOBAL  !READ MASTER DIRECTORY
! 
! 
      IF DS.DF THEN [DS.DF_0;RETURN]!IF READ INHIBIT FLAG(DS.DF) SET
                                   !USE CURRENT CONTENTS OF D.SDR 
                                   !CLEAR INHIBIT FLAG FOR NEXT TIME
! 
!    FETCH DIRECT ADDRESS OF MASTER DIRECTORY AND 
!    SET ADDRESS OF END OF DIRECTORY IN MDSTP,SET TABLE 
!    LENGTH INTO TBLEN. 
! 
! 
      ASSEMBLE "JSB .DRCT     FETCH DIRECT ADDRESSES" 
      ASSEMBLE "DEF $CDIR"
      ASSEMBLE "LDB $MDSP     FETCH IT" 
      ASSEMBLE "CMA,INA       CALCULATE LEGNTH" 
      ASSEMBLE "ADB 0"
      ASSEMBLE "STB TBLEN     AND SAVE FOR MOVE"
! 
!   CHECK FOR MORE THAN 31 POSSIBLE DISC'S(TBLFP>124) 
! 
      ASSEMBLE "CMB,INB       SET NUMBER NEG" 
      ASSEMBLE "ADB D124      ADD TO MAX LEN" 
      ASSEMBLE "SSB,RSS       SKIP IF BAD   " 
      ASSEMBLE "JMP MVR       GO MOVE HER IN" 
! 
      ASSEMBLE "LDB D124      ELSE MAX=31 DISCS"
      ASSEMBLE "STB TBLEN     SAVE FOR MOVE"
MVR:  ASSEMBLE "CMA,INA       SET FW OF DIRECTORY POSITIVE" 
      ASSEMBLE "LDB %DSDR     FETCH ADDRESS OF D.SDR" 
      ASSEMBLE "JSB .MVW      MOVE MASTER DIRECTORY TO LOCAL BUFFER"
      ASSEMBLE "DEF TBLEN     ADDRESS OF WORD HOLDING LENGTH" 
      ASSEMBLE "NOP         MAKE THE MICRO CODE HAPPY"
! 
      ASSEMBLE "CLA"
      ASSEMBLE "STA 1,I       SET END OF TABLE+1=0" 
DIR02: ASSEMBLE "STA DS.DF     FORCE NEW READ TO PREVENT PROBLEMS IN MTM" 
      RETURN           !RETURN
      END 
! 
! 
! 
DR.RD:SUBROUTINE(RCOD,DISID,BLK)FEXIT,GLOBAL
! 
!     THIS SUBROUTINE READS/WRITES THE DIRECTORY BLOCK
!     SPECIFIED BY BLK FROM THE DISC IDENTIFIED 
!     BY DISID.  FEXIT IS TAKEN IF THE
!     DISC CANNOT BE FOUND OR IF THE END
!     OF THE DIRECTORY IS REACHED.
! 
! 
      IF [RWCD_RCOD] < 0 THEN [\       !CHECK FOR WRITE FROM
          DBUF_@O.BUF;RWCD_-RCOD;GO TO DRRD1],\    !O.BUF--IF NEG RCOD
            ELSE DBUF_@PK.DR           !USE O.BUF--ELSE USE PK.DR 
! 
      IF DISID=DS.F1 THEN[IF RWCD=WRIT THEN[IFNOT BLK THEN\ 
             GOTO DIRR2];GOTO DRRD1]
       D.RIO(READI)                 !READ MASTER DIRECTORY INTO 
                                    !INTO D.SDR 
! 
                                    !DETERMINE IF LU OR DISKETTE
                                    !REFERENCE
      IF DISID<0 THEN[DLU_-DISID;T_0], \
         ELSE[DLU_DISID;T_2]
! 
                                    !SEARCH FOR REQUESTED DISK
                                    !CONTINUE AT DIRR0 IF FOUND 
       FOR I_0 TO   TBLEN-4 BY 4 DO[IF$(@D.SDR+I+T)=DLU\
           THEN GOTO DIRR0] 
! 
!                                   !IF NOT FOUND--EXIT 
EXITF:FRETURN 
! 
!     THE DISID HAS BEEN FOUND SO READ IN BLK0
DIRR0:D.LK_[D.LB_[D.LT_[DS.LU_@D.SDR+I]+1]+1]+1!  SET POINTERS
      PDSLU_ $DS.LU + 7700K                    !PROTECTED DISC LU 
! 
                                    !IF WRITE AND IF  BLOCK 
                                    !ZERO--CONTINUE AT DIRR2
! 
                                    !READ  BLOCK ZERO-
      IF RWCD=WRIT THEN[IFNOT BLK THEN GO TO DIRR2] 
      EXEC(READI,PDSLU,PK.DR,128,$D.LT,0 ) !READ DISK ID INFO 
! 
      DO[BREG_$B;IF BREG#128 THEN[MSS.(1,$DS.LU);GOTO FM.AB]] 
DIRR2:DS.F1_DISID            !SET UP DISC ID
      DISBL_0             !ALSO THE CURRENT BLOCK 
      DISNT_$(@PK.DR+8)  !AND # OF DIRECTORY TRACKS 
      DS.SC_ ($(@PK.DR+6)AND 377K)   !ISOLATE AND SET NO. OF SECTORS
      DFMT_ (($(@PK.DR+6)->8)AND 377K)  !SAVE SECTOR SECTOR SKIP INFO 
      IFNOT DFMT THEN DFMT_14           !DEFAULTS TO 14 (7 BLOCKS)
! 
      IF (BLK=0) AND (RWCD=READI) THEN GO TO EXIT 
!     CALCULATE THE SECTOR ADDRESS
DRRD1:TR_(BLK*DFMT)/DS.SC  !COMPUTE THE SECTOR ADDRESS
      T_$1    !SET IN T 
! 
                        !DIVIDE BY SECTOR SKIP/2
      TR_TR/(DFMT->1)   !RELATIVE TRACK TO TR 
      IF (TR+DISNT)> -1 THEN GO TO EXITF
      TR_$D.LT-TR   !SET THE TRACK ADDRESS IN TR
! 
!     READ/WRITE
! 
!    IF WRITE MUST HAVE LOCKED THE DISK 
! 
      IF RWCD=WRIT THEN[IF $D.LK# GTOPN THEN[MSS.(61);GOTO FM.AB]]
! 
DRRD4:EXEC(RWCD,PDSLU,$DBUF,128,TR,T) 
      BREG_$B       !TEST FOR ERRORS
      IF BREG#128 THEN[MSS.(1,$DS.LU); GOTO FM.AB]
EXIT: RETURN        !RETURN 
      END 
      END 
      END$
                                                                                                                                                                                                                                                        