SPL,L,O,M ! NAME: DR.RD ! SOURCE: 92071-18059 ! RELOC: 92071-16059 ! PGMR: E.D.B. ! ! *************************************************************** ! * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. 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 DR.RD(7) "92071-1X059 REV.2041 800623" ! ! EXTERNAL SUBROUTINES LET EXEC BE SUBROUTINE,EXTERNAL LET MSS. BE SUBROUTINE,EXTERNAL ! ! EXTERNAL FUNCTIONS LET CR.LU BE FUNCTION,EXTERNAL LET GTOPN BE FUNCTION,EXTERNAL ! ! EXTERNAL LABELS LET FM.AB BE LABEL,EXTERNAL ! ! EXTERNAL INTEGERS LET O.BUF BE INTEGER,EXTERNAL ! ! GLOBAL INTEGERS LET DS.LU BE INTEGER,GLOBAL !DISC LU LET D.LT BE INTEGER,GLOBAL !DISC LAST TRACK LET D.LB BE INTEGER,GLOBAL !DISC LABEL LET D.LK BE INTEGER,GLOBAL !DISC LOCK LET DISBL BE INTEGER,GLOBAL !DISC CURRENT BLOCK LET DISNT BE INTEGER,GLOBAL !DISC NUMBER DIR TRACKS LET DS.SC BE INTEGER,GLOBAL !DISC SECTORS / TRACK LET DFMT BE INTEGER,GLOBAL !DISC SECTOR SKIP ! ! GLOBAL BUFFERS LET PK.DR(128)BE INTEGER,GLOBAL !DR.RD BUFFER ! ! INTERNAL CONSTANTS LET WRIT BE CONSTANT (2) !WRITE EXEC REQUEST ! DR.RD:SUBROUTINE(RCOD,DISID,BLK) FEXIT,GLOBAL ! ! DR.RD TRANSFERS A DIRECTORY BLOCK (SPECIFIED BY BLK) ! BETWEEN A CARTRIDGE (SPECIFIED BY DISID) AND AN INTERNAL ! BUFFER (DETERMINED BY RCOD). ! FEXIT IS TAKEN IF THE CARTRIDGE CANNOT BE FOUND OR IF THE END ! OF THE DIRECTORY IS REACHED. ! ! DETERMINE WHICH BUFFER TO USE ! IF [RWCD_ RCOD] < 0 THEN [ \IF WRITE FROM O.BUF RWCD_ -RCOD; \THEN FIX RWCD DBUF_ @O.BUF], \USE O.BUF ELSE DBUF_ @PK.DR !ELSE USE PK.DR ! ! IF REQUESTING A BLOCK BEYOND THE FIRST, ASSUME THAT ! DR.RD HAS BEEN CALLED WITH THE DISID BEFORE. ! IFNOT BLK THEN [ \IF BLOCK ZERO, IFNOT CR.LU(DISID,DS.LU,D.LT,D.LB,D.LK) \CONVERT DISID TO LU THEN FRETURN; \AND IF NOT FOUND, ERROR PDSLU_ DS.LU + 7700K; \MAKE PROTECTED DISC LU TR_ D.LT; \USE THE LAST TRACK SC_ 0], \AND SECTOR 0 ELSE [ \IF PAST BLOCK ZERO, TR_ (BLK*DFMT)/DS.SC; SC_.B.; \SET TRACK AND SECTOR TR_ TR/(DFMT->1); \GET RELATIVE TRACK IF (TR+DISNT)> -1 THEN FRETURN; \IF OUT OF RANGE, ERROR TR_ D.LT-TR] !SET THE TRACK ADDRESS ! ! IF WRITE REQUEST, DISC MUST BE LOCKED TO USER ! IF RWCD=WRIT THEN [ \IF WRITE IF D.LK#GTOPN THEN [ \AND NOT LOCKED MSS.(61); \THEN PRINT MESSAGE GOTO FM.AB]] !AND ABORT ! ! DO ACTUAL DISC TRANSFER ! EXEC(RWCD,PDSLU,$DBUF,128,TR,SC) ! ! CHECK FOR ERRORS ! DO [BREG_.B.; \CHECK FOR ERRORS IF BREG#128 THEN [ \IF NOT ALL TRANSFERRED, MSS.(1,DS.LU); \PRINT MESSAGE GOTO FM.AB]] !AND ABORT ! IFNOT BLK THEN [ \IF FIRST BLOCK, DISNT_ $(DBUF+8); \SET # OF DIRECTORY TRACKS DS.SC_ $(DBUF+6) AND 377K; \ISOLATE AND SET # SECTORS DFMT_ ($(DBUF+6)->8) AND 377K; \SAVE SECTOR SKIP INFO IFNOT DFMT THEN DFMT_ 14] \DEFAULTS TO 14 (7 BLOCKS) ! DISBL_ BLK !SET CURRENT BLOCK RETURN !AND RETURN END ! END END$