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$