SPL,L,O,M,C 
!     NAME:   FM.UT 
!     SOURCE: 92064-18169 
!     RELOC:  92064-16055 
!     PGMR:   G.A.A.
!     MOD:    G.L.M.
! 
!  ***************************************************************
!  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1977.  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) " 92064-16055  REV.1709  770314"
! 
! 
! 
      LET EXEC,MSS.      BE SUBROUTINE,EXTERNAL 
      LET IDCB1              BE INTEGER,EXTERNAL
      LET D.RIO,DR.RD         BE SUBROUTINE 
      LET FM.AB     BE LABEL,EXTERNAL 
      LET PK.DR        BE INTEGER(128),GLOBAL 
      LET D.SDR        BE INTEGER(128),GLOBAL 
      LET DS.LU,D.LT,D.LB,D.LK   BE INTEGER,GLOBAL
      LET DS.SC,DFMT,TBLEN       BE INTEGER,GLOBAL
      LET DS.DF,DS.F1     BE INTEGER,GLOBAL 
      INITIALIZE DS.DF,DS.F1  TO 0,0
      LET READI              BE CONSTANT(1     )
      LET XEQT     BE CONSTANT(1717K) 
      LET WRIT      BE CONSTANT(2  )
      LET A         BE CONSTANT (0) 
      LET B         BE CONSTANT (1) 
! 
N1:   ASSEMBLE "OCT -1" 
D124:  ASSEMBLE "DEC 124" 
%DSDR: ASSEMBLE "DEF D.SDR" 
      ASSEMBLE "EXT $CDIR,.MVW,.DRCT" 
! 
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 "ADA N1        BACK UP TO STOP WORD" 
      ASSEMBLE "LDB 0,I       FETCH IT" 
      ASSEMBLE "INA           ADVANCE A TO FW OF DIR" 
      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_@IDCB1;RWCD_-RCOD;GO TO DRRD1],\    !IDCB1--IF NEG RCOD
            ELSE DBUF_@PK.DR           !USE IDCB1--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
! 
                                    !IF WRITE AND IF  BLOCK 
                                    !ZERO--CONTINUE AT DIRR2
! 
                                    !READ  BLOCK ZERO-
! 
! 
      IF RWCD=WRIT THEN[IFNOT BLK THEN GO TO DIRR2] 
! 
      EXEC(READI,$DS.LU ,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# $XEQT THEN[MSS.(101);GOTO FM.AB]] 
! 
DRRD4:EXEC(RWCD,$DS.LU,$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$
                                  