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$