FTN4,L PROGRAM JVRFY(3,60), JVRFY FROM SSK 24999-16163 REV 1902 C C THIS PROGRAM IS DESIGNED TO COMPARE THE CONTENTS OF C A MAG TAPE FILE AGAINST THE CONTENTS OF A DISK TRACK. C THE MAG TAPE FORMAT SHOULD BE: C N CONSECUTIVE RECORDS EACH 6145 WORDS LONG C WHERE WORD #1 IS THE TRACK #. C TERMINATION WILL OCCUR UPON READING EOF. C THE MAG TAPE MUST BE POSITIONED TO THE FIRST RECORD BEFORE C SCHEDULING THIS PROGRAM. C C FORM OF CALL: C RUN,JVRFY,LUCRT,LUDISK,LUMT C - OR - C CALL EXEC(ICODE,JVRFY,LUCRT,LUDISK,LUMT) C [CALL RMPAR(IPBUF)] C C WHERE: C LUCRT - OPTIONAL IN THE SCHEDULING CALLS (9/23) C IF GIVEN, MESSAGES WILL BE DIRECTED TO THE C SPECIFIED LU # - ELSE - C NO MESSAGES WILL BE OUTPUT. C LUDISK - LU # OF THE DISK SUBCHANNEL C TO BE VERIFIED. C LUMT - LU # OF THE MAG TAPE. C ICODE - 9,10,23 OR 24 C WHEN EITHER 9 OR 23 ARE USED, C THE FOLLOWING INFO CAN BE RETRIEVED C BY THE FATHER UPON RETURN (USING RMPAR). C IPBUF(1) = 0 - COMPARE GOOD. C IPBUF(2) = # OF MAG TAPE RECORDS TESTED. C C IPBUF(1) = -2 - NO DISK LU GIVEN. C C IPBUF(1) = -3 - NO MAG TAPE LU GIVEN C C IPBUF(1) = -4 - MAG TAPE STATUS ERROR C IPBUF(2) = MAG TAPE RECORD NUMBER C IPBUF(3) = EQT #5 STATUS INFO C C IPBUF(1) = -5 - MAG TAPE RECORD LENGTH ERROR C IPBUF(2) = MAG TAPE RECORD NUMBER C IPBUF(3) = LENGTH OF MAG TAPE RECORD. C C IPBUF(1) = -6 - DISK READ ERROR. C IPBUF(2) = MAG TAPE RECORD NUMBER C IPBUF(3) = EQT #5 STATUS INFO. C C IPBUF(1) = -1 MAG TAPE COMPARE ERROR C IPBUF(2) = MAG TAPE RECORD NUMBER C IPBUF(3) = TRACK # C IPBUF(4) = SECTR # C IPBUF(5) = WORD OFFSET C C MCC 6/10/77 DIMENSION IBUFF(6273),IPBUF(5),LENB(6),ISCTRS(6),IREG(2) EQUIVALENCE (REG,IREG),(LUDISK,IPBUF(2)),(LUMT,IPBUF(3)) DATA LENB/128,256,512,1024,2048,2176/ DATA ISCTRS/0,2,6,14,30,62/ C C GET THE PARAMETERS C CALL RMPAR(IPBUF) IF (IPBUF(1).EQ.0) GOTO 2001 LUCRT=IPBUF(1) WRITE(LUCRT,1090) 1090 FORMAT(/"24999-16163 1902 SOFTWARE SERVICE KIT SYSTEM 1000"/) IF(LUDISK .EQ. 0)GO TO 200 IF(LUMT .EQ. 0) GO TO 300 C ICOUNT = 0 C C GET A MAG TAPE RECORD AND TEST FOR EOF C 10 IF(IFBRK(IDMY) .LT. 0) GO TO 100 REG=EXEC(1,LUMT,IBUFF(128),6146) C C FINISHED IF EOF FOUND C IF(IAND(IREG,200B) .NE. 0) GO TO 100 C C ANY OTHER STATUS EXCEPT NO WRITE RING IS AN ABORT CONDITION. C IF(IAND(IREG,373B) .NE. 0) GO TO 400 C C RECORD LENGTH MUST BE 6145 C IF(IREG(2) .NE. 6145) GO TO 500 C C TRACK # IS IN FIRST WORD. C ITRK = IBUFF(128) ICOUNT = ICOUNT + 1 C C NOW GET AND TEST THE CONTENTS OF ONE TRACK (6 READS) C DO 50 I=1,6 LENGTH = LENB(I) INDEX = LENGTH + 1 C C INDEX IS 4097 ON LAST TIME THROUGH. C IF(I .EQ. 6) INDEX = 4097 C REG = EXEC(1,LUDISK,IBUFF,LENGTH,ITRK,ISCTRS(I)) C IF(IAND(IREG,55B) .NE. 0) GO TO 600 C CALL CMPWD(IBUFF,IBUFF(INDEX),LENGTH,IERR) IF(IERR .NE. 0) GO TO 700 C 50 CONTINUE GO TO 10 C C GOOD COMPLETION C 100 IPBUF(1) = 0 GO TO 1000 C C NO DISK LU GIVEN C 200 IPBUF(1) = -2 GO TO 1000 C C NO MAG TAPE LU GIVEN C 300 IPBUF(1) = -3 GO TO 1000 C C MAG TAPE STATUS ERROR. C 400 IPBUF(1) = -4 GO TO 1000 C C MAG TAPE RECORD LENGTH ERROR. C 500 IPBUF(1) = -5 IPBUF(3) = IREG(2) GO TO 1000 C C DISK READ ERROR. C 600 IPBUF(1) = -6 IPBUF(3) = IREG(2) GO TO 1000 C C COMPARE ERROR. C 700 IPBUF(1) = -1 IPBUF(3) = ITRK IPBUF(4) = ISCTRS(I) + IERR/64 IPBUF(5) = MOD(IERR,64) C C FINISHED. C C WRITE A MESG IF LUCRT IS GIVEN C 1000 IPBUF(2) = ICOUNT IF(LUCRT .EQ. 0) GO TO 2000 C IGO = IPBUF(1) + 7 GO TO (1010,1020,1030,1040,1050,1060,1070),IGO C 1010 WRITE(LUCRT,1011)IPBUF(3),IPBUF(2) 1011 FORMAT(" /JVRFY: DISK READ ERROR - STATUS ",K6," RECORD #",I4) GO TO 2000 C 1020 WRITE(LUCRT,1021)IPBUF(3),IPBUF(2) 1021 FORMAT(" /JVRFY: MT RECORD LENGTH ERROR - LENGTH ", + I5," RECORD #",I4) GO TO 2000 C 1030 WRITE(LUCRT,1031)IPBUF(3),IPBUF(2) 1031 FORMAT(" /JVRFY: MT STATUS ERROR - STATUS ",K6," RECORD #",I4) GO TO 2000 C 1040 WRITE(LUCRT,1041) 1041 FORMAT(" /JVRFY: NO MAG TAPE LU# GIVEN") GO TO 2000 C 1050 WRITE(LUCRT,1051) 1051 FORMAT(" /JVRFY: NO DISK LU# GIVEN") GO TO 2000 C 1060 WRITE(LUCRT,1061)(IPBUF(J),J=2,5) 1061 FORMAT(" /JVRFY: COMPARE ERROR RECORD #",I4/, + " /JVRFY: TRACK #",I4," SECTOR #",I4," OFFSET",I4) GO TO 2000 C 1070 WRITE(LUCRT,1071)IPBUF(2) 1071 FORMAT(" /JVRFY: COMPARE GOOD. ",I4," RECORDS") C 2000 CALL PRTN(IPBUF) 2001 CONTINUE END END$ ASMB,R,L,C,Z IFN HED WORD COMPARE FOR 2100 & EARLIER CPU NAM CMPWD,7 WORD COMPARE FOR 2100 & EARLIER CPU 6/10/77 XIF IFZ HED WORD COMPARE FOR 21MX & LATER CPU NAM CMPWD,7 WORD COMPARE FOR 21MX & LATER CPU 6/10/77 XIF ENT CMPWD EXT .ENTR SKP * THIS PROGRAM WILL COMPARE THE CONTENTS OF TWO BUFFERS * AND RETURN: * IERR = 0 - GOOD COMPARE * IERR = +N - ERROR DETECTED. * WHERE N = BUFFER INDEX OF FAILED COMPARISON. * * THIS PROGRAM WILL RETURN AFTER ENCOUNTERING THE FIRST * COMPARE FAILURE. * * THIS PROGRAM IS FORTRAN CALLABLE AS FOLLOWS: * CALL CMPWD(BUF1,BUF2,LENGTH,IERR) * - OR - * REG = CMPWD(BUF1,BUF2,LENGTH,IERR) * WHERE IERR IS RETURNED IN THE 'A' REGISTER. * * CONDITIONAL ASSEMBLY REQUIRED FOR COMPUTER TYPE: * N FOR 2100 OR EARLIER MODELS * Z FOR 21MX OR LATER MODELS * * MCC 6/10/77 * SKP BUFF1 NOP BUFF2 NOP LENTH NOP IERR NOP CMPWD NOP SPC 1 JSB .ENTR DEF BUFF1 SPC 1 IFN LDA LENTH,I GET THE BUFFER LENGTH CMA,INA COMPLEMENT AND SAVE IT STA COUNT SPC 1 LOOP LDA BUFF1,I GET FIRST WORD XOR BUFF2,I XOR WITH SECOND SZA OK IF ZERO RESULTS. JMP ERROR NO - ERROR. SPC 1 ISZ COUNT YES - FINISHED IF COUNT = 0 JMP INCR SPC 1 JMP OUT FINISHED SPC 1 INCR ISZ BUFF1 INCREMENT BOTH BUFFER ADDRESSES ISZ BUFF2 JMP LOOP GO TEST THE NEXT TWO. SPC 1 ERROR ISZ COUNT SET UP THE LDA LENTH,I ERROR COUNT ADA COUNT FOR RETURN JMP BAD THEN RETURN SKP XIF IFZ LDA BUFF1 GET THE TWO ADDRESSES IN 'A' & 'B' LDB BUFF2 CMW LENTH,I GO TEST THESE ARRAYS JMP OUT GOOD RETURN HERE. SPC 1 NOP ERROR RETURN HERE LDB BUFF1 GET THE START ADDRESS CMB,INB AND SUBTRACT FROM ADA B PRESENT ADDRESS FOUND IN 'B' INA JMP BAD RETURN THE ERROR INDEX XIF SKP OUT CLA GOOD RETURN HERE. SPC 1 BAD STA IERR,I JMP CMPWD,I SKP COUNT NOP A EQU 0 B EQU 1 END END$ END$