C MTNFS.FTN I/O PACKAGE FOR DOING NON-FILE STRUCTURED OPERATIONS C ON 800-BPI MAGNETIC TAPE WITH RSX11M. C REV. 8010.201 C INTEGER FUNCTION MTOPLU (MTSN,LU) C C OPENS AN RSX11M LOGICAL UNIT AND ASSOCIATES IT WITH THE SELECTED C MAG-TAPE DRIVE, 0, 1, 2 OR 3. C LOGICAL*1 ISBB(4) COMMON /MTIO/ ICHAN(4),IOPEN(4),IBLOCK(4),IDPB(6),ISB(2) 1 ,IEFN(4) EQUIVALENCE (ISB,ISBB) DATA IOPEN/0,0,0,0/ DATA IOSEC/"2520/, IOSTC/"2500/, IOATT/"1400/ DATA IRDMSK/"000400/ C MTOPLU = -9 !DEVICE NOT ATTACHABLE (ILLEGAL) IF (MTSN.LT.0.OR.MTSN.GT.3) RETURN C COMPUTE CHANNEL NUMBER AND SEE IF IT IS ALREADY OPEN MX = MTSN + 1 IF (IOPEN(MX).NE.0) RETURN C C *** ASSIGN LOGICAL UNIT NUMBER TO TAPE DRIVE *** C USE THE EXECUTIVE ROUTINE "ASNLUN". ARGUMENTS ARE: C LOGICAL UNIT NUMBER (MX) C ALPHA DEVICE NAME IN A2 FORMAT ('MT') C DEVICE NUMBER, EG. TAPE 0-3 (MTSN) C STATUS RETURN (ISB ARRAY) C CALL ASNLUN (MX,'MT',MTSN,ISB) MTOPLU = ISBB(1) IF(MTOPLU .LE. 0)RETURN C C *** ATTACH THE MAG-TAPE UNIT TO THIS TASK (EXCLUDE ANY OTHER) *** C MTOPLU = MTSPFN (MTSN,IOATT,0) IF(MTOPLU .LE. 0) GO TO 990 !COULD NOT ATTACH C C SET THE OPEN FLAGS C ICHAN(MX) = LU IOPEN(MX) = LU IBLOCK(MX) = 0 C C *** MAKE SURE THE DRIVE IS ON LINE AND READY *** C IF((MTSTAT(MTSN).AND.IRDMSK) .EQ. 0)RETURN !EVERYTHING OK C C SET DEVICE NOT READY FLAG AND CLOSE (DETATCH) DEVICE C MTOPLU = -3 !DEVICE NOT READY 990 CALL MTCLOS(MTSN) RETURN END INTEGER FUNCTION MTOPEN(MTSN) C C OPENS AN RSX11M LOGICAL UNIT AND ASSOCIATES IT WITH THE SELECTED C MAG-TAPE DRIVE, 0, 1, 2 OR 3. C COMMON /MTIO/ ICHAN(4),IOPEN(4),IBLOCK(4),IDPB(6),ISB(2) 1 ,IEFN(4) DATA MTUNOF/1/ !1ST LOGICAL UNIT C LU = MTSN + MTUNOF MTOPEN = MTOPLU (MTSN,LU) RETURN END FUNCTION MTCLOS(MTSN) C C RELEASES RSX11M CHANNEL ASSOCIATED WITH MAG-TAPE UNIT SPECIFIED. C COMMON /MTIO/ ICHAN(4),IOPEN(4),IBLOCK(4) DATA IODET/"2000/ !"DETACH" CODE FOR QIO C MX = MTSN + 1 J = MTSPFN(MTSN,IODET,0) IOPEN(MX) = 0 ICHAN(MX) = 0 RETURN END FUNCTION MTEOF(MTSN) C C WRITES END-OF-FILE MARK ON MAG-TAPE C COMMON /MTIO/ ICHAN(4),IOPEN(4),IBLOCK(4) DATA ICODE/"3000/ MX = MTSN + 1 IF(IOPEN(MX) .GT. 0)GOTO 100 MTEOF = -37 !FILE NOT OPEN RETURN 100 CONTINUE MTEOF = MTSPFN (MTSN,ICODE,1) IBLOCK(MX) = 0 RETURN END FUNCTION MTREW(MTSN) C C REWINDS SELECTED MAG-TAPE UNIT C COMMON /MTIO/ ICHAN(4),IOPEN(4),IBLOCK(4) DATA ICODE/"2400/ C MX = MTSN + 1 IF(IOPEN(MX) .GT. 0)GOTO 100 MTREW = -37 !FILE NOT OPEN RETURN 100 MTREW = MTSPFN (MTSN,ICODE,1) IBLOCK(MX) = 0 RETURN END FUNCTION MTWRIT(MTSN,IARRY,N) C C WRITES ONE RECORD ON UNIT-'MTSN', ARRAY 'IARRY', 'N' WORDS. C DIMENSION IARRY(1),ISBB(4) BYTE ISBB COMMON /MTIO/ ICHAN(4),IOPEN(4),IBLOCK(4),IDPB(6),ISB(2) 1 ,IEFN(4) EQUIVALENCE (ISBB,ISB) DATA IOSEC/"2520/, IWTMSK/"2520/ !COINCIDENCE C ICOUNT = N*2 !OBTAIN BYTE-COUNT ITIMES = 0 MX = MTSN + 1 IF (MTSTAT(MTSN).AND.IWTMSK) GO TO 990 !NOT READY FOR WRITE 10 J = MTQRW (MTSN,IARRY,ICOUNT,2) MTWRIT = ISBB(1) !SIGN-EXTEND BYTE TO WORD ITIMES = ITIMES + 1 40 IBLOCK(MX) = IBLOCK(MX) + 1 RETURN C 990 MTWRIT = -3 RETURN END FUNCTION MTREAD (MTSN,IARRY,NMAX) C C READS ONE RECORD FROM MAG-TAPE DRIVE UNIT 'MTSN', INTO ARRAY C 'IARRY', WITH A MAXIMUM WORD COUNT VALUE 'NMAX'. C DIMENSION IARRY(1),ISBB(4) BYTE ISBB COMMON /MTIO/ ICHAN(4),IOPEN(4),IBLOCK(4),IDPB(6),ISB(2) 1 ,IEFN(4) EQUIVALENCE (ISBB,ISB) DATA IEEOF/-10/, IEVER/-4/, IRDMSK/"000400/, IOSEC/"2520/ C ICOUNT = NMAX*2 MX = MTSN + 1 MTREAD=MTSPFN (MTSN,IOSEC,0) IF (ISB(2).AND.IRDMSK) GO TO 990 J = MTQRW (MTSN,IARRY,ICOUNT,1) C C ** CHECK FOR ERROR CONDITIONS ** C MTREAD = ISBB(1) !SIGN EXTEND ERROR CODE IBLOCK(MX) = IBLOCK(MX) + 1 IF (MTREAD.LT.0) RETURN MTREAD = ISB(2)/2 !OBTAIN WORD COUNT FROM BYTE COUNT RETURN C 990 MTREAD = -3 !DEVICE NOT READY CODE RETURN END FUNCTION MTBKSP (MTSN,N) C C BACKSPACE MAG-TAPE UNIT SPECIFIED RECORDS. C N = 0 WILL CAUSE ONE BACKSPACE FILE OPERATION. C DATA IOSPB/"2420/, IOSPF/"2440/ C NCODE = N IF (NCODE.GT.0) NCODE= -NCODE IC=IOSPB IF (NCODE.NE.0) GO TO 20 IC=IOSPF NCODE=-1 20 MTBKSP = MTSPFN (MTSN,IC,NCODE) RETURN END FUNCTION MTFRSP (MTSN,N) C C FORWARD SPACE MAG-TAPE UNIT ONE OR MORE RECORDS. C A VALUE OF ZERO FOR N WILL CAUSE A FORWARD SPACE FILE. C COMMON /MTIO/ ICHAN(4),IOPEN(4),IBLOCK(4),IDPB(6),ISB(2) 1 ,IEFN(4) DATA IOSPB/"2420/, IOSPF/"2440/ C C IF N>0 SPACE FORWARD N PHYSICAL RECORDS C IF (N.LE.0) GO TO 100 NCODE = N IC=IOSPB 20 MTFRSP = MTSPFN (MTSN,IC,NCODE) RETURN C C SPACE FORWARD ONE FILE C 100 IC = IOSPF NCODE = 1 GO TO 20 C END FUNCTION MTSPFN (MTSN,ICODE,NCODE) BYTE ISBB(4) COMMON /MTIO/ ICHAN(4),IOPEN(4),IBLOCK(4),IDPB(6),ISB(2) 1 ,IEFN(4) EQUIVALENCE (ISB(1),ISBB(1)) DATA IOSPB/"2420/, IOSPF/"2440/ C C THIS FUNCTION ALLOWS DIRECT CALLING OF THE "SPECIAL FUNCTION" C SUBROUTINE, WHICH CAN BE USED TO PERFORM MAG-TAPE OPERATIONS C SUCH AS REWIND, BACKSPACE, FORWARD SPACE, ETC. C MX = MTSN + 1 IPRI=0 IF (ICODE.EQ.IOSPB.OR.ICODE.EQ.IOSPF) IDPB(1)=NCODE 20 CALL WTQIO (ICODE,ICHAN(MX),IEFN(MX),IPRI,ISB,IDPB,IDS) C C USE THE BYTE EQUIVALENCED ARRAY TO ASSIGN THE FUNCTION VALUE. THIS C EXTENDS THE SIGN BIT SO THE RESULT CORRESPONDS TO THE IO ERROR C CODES IN THE I/O OPERATIONS MANUAL C MTSPFN=ISBB(1) RETURN END INTEGER FUNCTION MTQRW (MTSN,IARRY,ICOUNT,IRW) C C THIS FUNCTION PERFORMS QIO READS AND WRITES THROUGH RSX11M'S C EXECUTIVE. C DIMENSION IFUNC(2) BYTE ISBB(4) EQUIVALENCE (ISB(1),ISBB(1)) COMMON /MTIO/ ICHAN(4),IOPEN(4),IBLOCK(4),IDPB(6),ISB(2) 1 ,IEFN(4) DATA IEFN/33,34,35,36/ !EVENT FLAG ASSIGNMENTS DATA IFUNC/"1000,"400/ !IO.RLB & IO.WLB C MTQRW=-2 IF (IRW.LE.0.OR.IRW.GT.2) GO TO 990 MX=MTSN+1 IF (IOPEN(MX).EQ.0) GO TO 990 C LUN=ICHAN(MX) CALL GETADR (IDPB(1),IARRY) IDPB(2)=ICOUNT CALL WTQIO(IFUNC(IRW),LUN,IEFN(MX),IPRI,ISB,IDPB,IDS) MTQRW=ISBB(1) 990 RETURN END INTEGER FUNCTION MTABOT (MTSN) C C TESTS WHETHER TAPE ON SUBCHANNEL "MTSN" IS AT LOAD POINT. C IT RETURNS A NON ZERO VALUE IF SO, ZERO IF NOT. C DATA IBOT/"20000/ C MTABOT=MTSTAT(MTSN).AND.IBOT RETURN END INTEGER FUNCTION MTSTAT (MTSN) C C RETURNS THE TAPE CHARACTERISTICS WORD OF THE REQUESTED DRIVE. C SEE PAGE 8-5 OF THE RSX11M I/O DRIVERS MANUAL UNDER SECTION C 8.3.2.5 "IO.SEC" FOR FULL EXPLANATION OF THE BIT VALUES RETURNED. C COMMON /MTIO/ ICHAN(4),IOPEN(4),IBLOCK(4),IDPB(6),ISB(2) 1 ,IEFN(4) DATA IOSEC/"2520/ C J = MTSPFN (MTSN,IOSEC,0) MTSTAT = ISB(2) RETURN END