FTN4,Q,C PROGRAM LSAVE(4,60),92067-16344 REV.2026 800501 C C C C SOURCE PART NO.: 92067-18344 C RELOC. PART NO.: 92067-16344 C NAME : LSAVE C C C PROGRAMMER: J.S.W. C C *************************************************************** C * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS * C * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * C * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* C * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * C *************************************************************** C C C THIS PROGRAM SAVES ALL TRACKS ON AN LU TO MAG TAPE C ACCORDING TO THE TRACK MAP TABLE DEFINITION. THE RUN FORMAT: C C RU,LSAVE,,,,[VE], C WHERE C <LOG LU> IS THE LOG DEVICE FOR ERROR MESSAGES C <DISC-LU> IS THE DISC LU WHERE DATA ARE SAVED C <MT LU> IS THE MAG TAPE LU C <VE> VE MEANS VERIFY, OTHERS MEANS NO VERIFY C <TITLE> IS A 50 CHARACTER LABEL SUPPLIED BY USER C C VERIFY CAN BE SELECTED AS OPTION. C C SEQUENCE OF OPERATIONS: C 1. GETS RUN STRING AND CHECK IF EACH PARATER IS VALID (I.E.DISK LU) C IF NO COMMAS IN RUN STRING, ASK PARATERS INTERACTIVELY C C 2 PUTS CURRENT TIME DATE AND DAY ON MT HEADER (IHDR) C C 3. GETS TRACK MAP TABLES BY MAKING SPECIAL EXEC CALL (SUBFUN=2200B) C AND PUTS IT IN MT HEADER C C 4. REQUEST MT LU LOCK AND CHECK WRITE RING ON MAG TAPE C C 5. WRITE OUT HEADRER RECORD ON MAG TAPE (247 WORDS) C C 6. COMPUTE NO. OF TRACKS IN SUBCHANNEL,SECTOR PER TRACK, AND C NO. OF WORDS PER TRACK ( MAG TAPE RECORD SIZE) C C 7. GO THRU ALL TRACKS IN SUBCHHAL, READ ONE TRACK C BY USING DISC LIBRARY ROUTINES (CALLING FROM RDATK) C WRITE THE TRACK IN MT. C C 8. IF VERIFY IS DESIRED, BACKSPACE ONE FILE AND READ ONE RECORD C THEN COMPARE DATA WITH THE TRACK C C C DIMENSION IBUF(1),IXBUF(8208),IVBUF(256), X ISTR(80),IHDR(247),ITME(15),ITX32(161),ISUBC(5),ITEMP(5), X IPBUF(10),MSG1(10),IPARM(5) C C C C EQUIVALENCE X (ITME,IHDR(1)), X (ITX32,IHDR(77)), X (ISUBC(1),IHDR(239)), X (LU2,IHDR(244)), X (ISTR(1),IHDR(17)), X (LSAVEN,IHDR(245)), X (IBUF(1),IXBUF(16)), X (LUSUB,IHDR(246)), X (ITAPE,IHDR(247)) C C DATA MSG1/2H ,2H ,2H ,2H T,2HRA,2HCK,2HS ,2HSA, X 2HVE,2HD / C C**************************************************************************** C C GET PARAMETER AND CURRENT TIME C C CALLING SEQUENCE PARATER C ISTR- TITLE OR RU STRING C N=1 INDICATES LSAVE C LOG LOG LU RETURNED C IDLU DISC LU C MTLU MT LU C IVERFY =1 FOR VERFIFY NOT =1 NO VERIFY C C CALL XGTPM(ISTR,1,LOG,IDLU,MTLU,IVRFY) CALL FTIME(ITME) ITAPE=1 IPARM=2H C ITTY=LOGLU(ISES) C MT LU THE VALUE IS 23 C C C GET SUBCHANNEL NO. FROM EQT4 FOR THE DISK C C C/ CALL EXEC(13,IDLU,IEQT5,IEQT4,ISTA3) LUSUB=IAND(IEQT4,3700B)/100B C C C UNBUFFER THE MAG TAPE , REMEMBER TO PUT IT BACK LATER C IFLAG = 0 CALL XMTBU(MTLU,IFLAG) C C CALL EXEC(13,MTLU,IEQT5) IF(IAND(IEQT5,37000B)-11000B) 910,1000,910 1000 CONTINUE C C CALL EXEC(13,IDLU,IEQT5) IF (IAND(IEQT5,37400B)-15000B) 980,1010,980 1010 CONTINUE C C GO GET TRACK MAP TABLE ,FIRST THE ENTIRE TABLE AND THEN C THE SUBCHANNEL ENTRY (5 WORDS) FOR THIS LU C C CALL EXEC(1,IDLU+2200B,ITX32, 161,0,5) CALL EXEC(1,IDLU+2200B,ISUBC, 5,0,5) C C IF(ITX32(1).GT.0) CALL EXEC(2,LOG,17HINVALID TRACK MAP,-17) C C INDICATES LSAVE AND SET LU 2 OR LU 3 FLAG IF IDLU IS 2 OR 3 C LSAVEN=1 IF(IDLU.EQ.2.OR.IDLU.EQ.3) LU2=1 C C C CHECK WRITE RING C 25 CALL EXEC(3,600B+MTLU) CALL ABREG(IA,IB) IF(IAND(IA,4B).EQ.4) GO TO 920 C C WRITE MT HEADER C CALL EXEC(2,MTLU,IHDR,247) C C NOW SET UP SECTORS PER TRACK, NO. OF TRACKS AND TRACK SIZE MXSEC=ISUBC(1) MXTRK=ISUBC(4) ISIZE=MXSEC*64+1 C C FOR TRACK NO. ZERO TO LAST TRACK, READ ONE TRACK C SET UP TRACK NO. IN IBUF(1), AND WRITE IT ON MAG TAPE C IF END OF TAPE CALL WREOT TO HANDLE IT C WHEN DONE WRITE END OF FILE MARK C C C C LOCK THE PROGRAM IN CORE TO PREVENT DEADLOCKS C CALL EXEC(22+100000B,1) GO TO 30 29 GO TO 40 30 CALL EXEC(2,LOG,33H UNABLE TO LOCK PROGRAM IN MEMORY,-33) CALL EXEC(2,LOG,32H WARNING: DEADLOCKS MAY OCCUR!,-32) 40 CONTINUE C C CLEAR END-OF-TAPE FLAG C IEOT=0 DO 100 LTRK=0,MXTRK-1 C SAVE TRK # IBUF(1)=LTRK CALL RDATK(IDLU,LTRK,0,ISIZE-1,ISUBC,IXBUF,IBT,LOG) C C IF BAD TRACK SET IPARM TO -1 FOR 10 G RETURN C IF(IBT.EQ.1) IPARM(1)=2H-1 CALL EXEC(2,MTLU,IBUF,ISIZE) CALL ABREG(IS1,LEN) IF(LEN.EQ.0) GO TO 960 IF(IAND(IS1,2).EQ.2) GO TO 970 IF(IAND(IS1,40B).EQ.40B) IEOT=1 IF(IAND(IS1,40B).EQ.40B) CALL WREOT(ITTY,MTLU,IHDR,IBUF,ISIZE) 100 CONTINUE C ENDFILE MTLU C C PRINT MESSAGE: XXX TRACKS SAVED C CALL PRTN TO RETURN -1 OF 0 IN 10G C CALL CNUMD(MXTRK,MSG1) CALL EXEC(2,LOG+200B,MSG1,-19) C C C C C IF VERIFY, BACKSPACE FILE AND READ ONE TRACK, COMPARE DATA UNTIL C LAST TRACK C C IF(IVRFY.NEQ.1) GO TO 777 C C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C VERIFY C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C CHECK EOF FLAG, IF SET ASK TO REMOUNT TAPE ONE C C C IF(IEOT.EQ.0) GO TO 199 C C ASK USER TO RE-MOUNT TAPE 1 AND ENTER FILE # C 177 CALL EXEC(2,ITTY, X 26HRE-MOUNT TAPE #1 FOR VERFY,-26) CALL EXEC(2,ITTY, X 26HTHEN TYPE "GO" TO CONTINUE,-26) CALL EXEC(1,ITTY+400B,I,-2) IF(I.NEQ.2HGO) GO TO 177 C C CHECK IF MT IS ON LINE C CALL EXEC(3,600B+MTLU) CALL ABREG(IA,IB) IF(IAND(IA,1).EQ.0) GO TO 188 CALL EXEC(2,ITTY,17HMAG TAPE OFF-LINE,-17) GO TO 177 C C C ASK FOR FILE #, PARSE INPUT AND CONVERT INTO BINARY C THEN FORWARD SPACE N FILES C 188 CALL EXEC(2,ITTY,7HFILE #?,-7) CALL EXEC(1,ITTY+400B,ITEMP,-6) CALL ABREG(IA,IB) LEN=IB IPTR=1 IF (NAMR(IPBUF,ITEMP,LEN,IPTR)) 188,190 190 IF(IAND(IPBUF(4),3).NEQ.1) GO TO 188 NFILE=IPBUF(1)-1 IF(NFILE.EQ.0) GO TO 250 DO 220 I=1,NFILE CALL EXEC(3,MTLU+1300B) 220 CONTINUE C C SKIP THE BACK SPACE FILE C GO TO 250 C C C 199 DO 200 I=1,247 200 IHDR(I)=2H C BACKSPACE 1 FILE - BF AND BR C THEN CHECK IF MT IS STILL BUSY BY DOING DYNAMIC STATUS C C CALL EXEC(3,MTLU+0200B) CALL EXEC(3,MTLU+1400B) 201 CALL EXEC(13,MTLU,IST) IF(IAND(IST,100000B).NEQ.0) GO TO 201 IF(IAND(IST,200B).NEQ.0)CALL EXEC(3,MTLU+300B) C C VERIFYING C 250 CALL EXEC(2,ITTY,9HVERIFYING,-9) C C READ HEADER FORM TAPE C CALL EXEC(1,MTLU,IHDR,247) C C PRINT HEADER C CALL EXEC(2,LOG+200B,IHDR,-75) C C SET UP SECTOR PER TRACK, TRACK SIZE C MXSEC=ISUBC(1) ISIZE=MXSEC*64+1 MXSEC=MXSEC-1 MXTRK=ISUBC(4) IERROR=0 C C C NOW VERIFY ALL TRACKS C DO 300 LTRK=0,MXTRK-1 C READ 1 BLOCK,INIT ERROR FLAG IERFG=0 K=2 CALL EXEC(1,MTLU,IBUF,ISIZE) CALL ABREG(IA,IB) IF(IAND(IA,40B).EQ.40B) CALL EOTAP(ITTY,MTLU,IHDR,IBUF,ISIZE) C C VERIFY 2 SECTORS C DO 350 ISEC=0,MXSEC,4 CALL EXEC(1+100000B,IDLU,IVBUF,256,LTRK,ISEC) GO TO 360 340 CALL COMPR(IBUF(K),IVBUF,256,IER) IF(IER.NEQ.0) IERFG=1 K=K+256 350 CONTINUE C D WRITE(1,8000) LTRK D8000 FORMAT("TRK ",I8) C C IF(IERFG.EQ.0) GO TO 300 360 IERROR=1 CALL CNUMD(LTRK,ITEMP) CALL EXEC(2,LOG,21HVERIFY DATA ERROR-TRK,-21) CALL EXEC(2,LOG,ITEMP,-6) 300 CONTINUE C C IF(IERROR.EQ.0) CALL EXEC(2,LOG,9HVERIFY OK,-9) IF(IERROR.EQ.1) CALL EXEC(2,LOG,12HVERIFY ERROR,-12) C FORWARD SPACE 1 RECORD CALL EXEC(3,MTLU+300B) C 777 CALL LURQ(0,MTLU,1) CALL EXEC(22+100000B,0) GO TO 779 778 CALL PRTN(IPARM) 779 CALL XMTBU(MTLU,IFLAG) STOP 77 910 CALL EXEC(2,LOG,12HINVALID MTLU,-12) STOP 920 CALL EXEC(2,LOG,18HWRITE RING MISSING,-18) GO TO 990 930 CALL EXEC(2,LOG,15HINVALID DISK LU,-15) GO TO 990 960 CALL EXEC(2,LOG,14H MT XMIT ERROR,-14) GO TO 990 970 CALL EXEC(2,LOG+200B,16H MT PARITY ERROR,-16) GO TO 990 980 CALL EXEC(2,LOG+200B,17H UNSUPPORTED DISC,-17) 990 CALL XMTBU(MTLU,IFLAG) STOP 66 END ����������������������������������������������������������������������������������������������������������������������������������������������