*DECK,MCCOMP
      PROGRAM MCCOMP(OUTPUT,TAPE1,TAPE2,TAPE3=OUTPUT) 
C 
C 
C     MCCOMP PROVIDES ONE SPECIFIC FUNCTION..  IT COMPARES TWO LIST FILES 
C     THAT WERE PREVIOUSLY GENERATED BY PROGRAM 'MCDUMP'. 
C 
C     'MCDUMP' IS RUN TWICE, ONCE TO CONVERT A KNOWN GOOD MICROCODE 
C     FILE TO HEX, A SECOND TIME TO CONVERT A SUSPECT MICROCODE FILE
C     TO HEX.  THESE TWO OUTPUT FILES ARE THEN COMPARED BY 'MCCOMP' 
C     AND ALL MISCOMPARES WRITTEN TO A LIST FILE. 
C 
C     A TYPICAL SEQUENCE WOULD BE:  
C 
C       ATTACH,MCDUMPS,MCCOMPS.                      ATTACH AND COMPILE 
C       FTN5,I=MCDUMPS,B=MCDUMP,L=LIST,EL,PL.         MCDUMP AND
C       FTN5,I=MCCOMPS,B=MCCOMP,L=LIST,EL,PL.           MCCOMP. 
C       REQUEST,CIP,NT,PE,F=SI,PO=R,LB=KU,VSN=CIP.   ASSIGN CIP TAPE
C       COPYBR,CIP,DISCARD,XX.                       SKIP TO MICROCODE RECORD 
C       COPYBR,CIP,GOOD.                             COPY MICROCODE TO GOOD 
C       MCDUMP,I=GOOD,L=GOODMC.                      CREATE GOOD MC LIST FILE 
C       REQUEST,BAD,NT,PE,PO=R,F=S,LB=KU,VSN=BAD.    ASSIGN PROBLEM EDD TAPE
C       MCDUMP,I=BAD,L=BADMC.                        CREATE SUSPECT MC LIST FILE
C       MCCOMP,I1=GOODMC,I2=BADMC,L=OUT.             COMPARE, WRITE TO OUT
C       ROUTE,OUT,DC=LP.                             LIST MISCOMPARES.
C 
C 
C     PROGRAM CALL FORMAT IS: 
C 
C        MCCOMP,P1,P2,P3,P4.
C 
C           PI = ANY OF THE FOLLOWING IN ANY ORDER: 
C 
C              I1 = LFN1   ONE TO SEVEN ALPHANUMERIC CHARACTERS 
C                          (FIRST CHARACTER MUST BE ALPHA) NAMING 
C                          EITHER ONE OF THE LIST FILES CREATED BY
C                          'MCDUMP'. (DEFAULT IS TAPE1).
C 
C              I2 = LFN2   ONE TO SEVEN ALPHANUMERIC CHARACTERS 
C                          (FIRST CHARACTER MUST BE ALPHA) NAMING 
C                          THE OTHER LIST FILE CREATED BY 'MCDUMP'. 
C                          (DEFAULT IS TAPE2).
C 
C              L = LFN3    ONE TO SEVEN ALPHANUMERIC CHARACTERS 
C                          (FIRST CHARACTER MUST BE ALPHA) NAMING THE 
C                          LOCAL FILE TO WHICH THE OUTPUT IS WRITTEN. 
C                          THIS FILE WILL SHOW ANY DIFFERENCES BETWEEN
C                          LFN1 AND LFN2. (DEFAULT IS OUTPUT). IF LFN3
C                          IS NOT A LOCAL FILE, MCCOMP CREATES IT.  THE 
C                          FILE IS NOT REWOUND BEFORE OR AFTER THE COMPARE. 
C 
C              NR          DO NOT REWIND FILES LFN1 AND LFN2 BEFORE 
C                          COMPARE (DEFAULT IS TO REWIND BOTH LFN1 AND
C                          LFN2). 
C 
C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
C 
C 
C     THE MICROCODE VERIFICATION PROCESS DESCRIPTION IS PLACED HERE TO
C     KEEP ALL RELATED SUBJECTS IN ONE PLACE. 
C 
C 
C     THE MICROCODE VERIFICATION PROCESS. 
C 
C     THE VERIFICATION OF MICROCODE IS A PROCESS THAT COMPARES A SUSPECTED
C     BAD IMAGE OF CONTROL STORE TO A KNOWN GOOD IMAGE.  THIS IS ACHIEVED 
C     BY COMPARING THE CONTROL STORE DUMP RECORD ON A EDD TAPE TO THE BINARY
C     MICROCODE LOAD MODULE USED DURING SYSTEM INITIALIZATION.
C 
C     WHEN AN UNDEFINED SYSTEM PROBLEM OCCURS, A SYSTEM DUMP (EDD) IS NORMALLY
C     TAKEN.  CONTAINED ON THE EDD TAPE IS A DUMP OF CONTROL STORE (MICROCODE 
C     MEMORY).  PROGRAM 'MCDUMP' WILL READ THE CONTROL STORE DUMP FROM THE EDD
C     TAPE AND CONVERT IT TO LISTABLE (READABLE) HEX.  'MCDUMP' IS THEN USED
C     TO CONVERT THE MICROCODE LOAD MODULE FROM BINARY TO HEX.  BOTH OF THESE 
C     LIST FILES ARE NOW USED AS INPUT TO PROGRAM 'MCCOMP'.  IF ANY DIFFERENCES 
C     ARE DETECTED THE GOOD AND BAD CONTROL STORE ADDRESS AND DATA ARE WRITTEN
C     TO THE OUTPUT FILE. 
C 
C     ANOTHER SOURCE OF A GOOD CONTROL STORE IMAGE WOULD BE A EDD TAPE CREATED
C     SHORTLY AFTER SYSTEM INITIALIZATION.
C 
C     A TYPICAL VERIFICATION PROCESS IS AS FOLLOWS: 
C 
C     1. CONVERT GOOD CONTROL STORE BINARY. 
C 
C        REQUEST,CIP,NT,PE,F=SI,PO=R,LB=KU,VSN=CIP. 
C        COPYBR,CIP,DISCARD,XX.                      SKIP TO MICROCODE RECORD 
C        COPYBR,CIP,CIPGOOD.                         COPY MICROCODE TO 'CIPGOOD'
C        MCDUMP,I=CIPGOOD,L=GOODMC. 
C 
C     2. CONVERT SUSPECT CONTROL STORE DUMP.
C 
C        REQUEST,EDDBAD,NT,PE,F=S,PO=R,LB=KU,VSN=EDDBAD.
C        MCDUMP,I=EDDBAD,L=BADMC. 
C 
C     3. COMPARE THE TWO CONVERTED FILES AND LIST ALL DIFFERENCES.
C 
C        MCCOMP,I1=GOODMC,I2=BADMC,L=OUT. 
C        ROUTE,OUT,DC=LP. 
C 
C     NOTE: IF THERE ARE NO MISCOMPARES, 'MCCOMP' DOES NOT GENERATE 
C           AN OUTPUT FILE. THE MESSAGE 'COMPARE GOOD' IS WRITTEN 
C           TO THE DAYFILE. 
C 
C 
C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
      IMPLICIT INTEGER (A-Z)
      DIMENSION HEX1(32),HEX2(32),CSA(4)
      CHARACTER FILE1*7, FILE2*7, NAME*3, VALUE*7, TIME*10, DATE*10 
  
C     REWIND DEFAULT, LFN1 AND LFN2 ARE REWOUND BY DEFAULT. 
      RWD = 1 
  
C     COMPARE ERROR FLAG, SET TO 1 AFTER FIRST MISCOMPARE.
      MCERR = 0 
  
C     LENERR SIGNIFIES THE DATA FILES ARE UNEQUAL IN LENGTH.
      LENERR = 0
  
C     EOF1 INDICATES WHEN A END OF FILE HAS BEEN READ FROM FILE 1.
      EOF1 = 0
  
C     EOF2 INDICATES AN END OF FILE HAS BEEN READ FROM FILE 2.
      EOF2 = 0
  
C     SET DEFAULT FILE NAMES FOR OUTPUT HEADER LIST.
      FILE1 = 'TAPE1' 
      FILE2 = 'TAPE2' 
  
  
C***  CRACK PROGRAM CALL STATEMENT
  
 100  CALL GETPARM(NAME,VALUE,RET)
      IF(RET.LT.0)GO TO 125 
      IF(NAME.NE.'NR')GO TO 105 
      RWD = 0 
      GO TO 100 
 105  IF(NAME.NE.'I1')GO TO 110 
      OPEN(1,FILE = VALUE)
      FILE1 = VALUE 
      GO TO 100 
 110  IF(NAME.NE.'I2')GO TO 120 
      OPEN(2,FILE = VALUE)
      FILE2 = VALUE 
      GO TO 100 
 120  IF(NAME.NE.'L') STOP 'ILLEGAL PARAMETER'
      OPEN(3,FILE = VALUE)
      GO TO 100 
  
C***  REWIND BOTH INPUT FILES UNLESS 'NR' IS SELECTED.
  
 125  IF(RWD.EQ.0)GO TO 200 
      REWIND 1
      REWIND 2
  
C***  READ BOTH FILES AND COMPARE TEXT. 
  
 200  IF(EOF1.EQ.1) GO TO 920 
      READ(1,1000,END=920,ERR=900) TOP,CSA,HEX1 
 205  IF(EOF2.EQ.1) GO TO 930 
      READ(2,1000,END=930,ERR=910) TOP,CSA,HEX2 
      IF(TOP.EQ."1") GO TO 200
      IF(CSA(1).EQ." ") GO TO 200 
      IF(EOF1.EQ.0) GO TO 207 
      IF(MCERR + LENERR.GE.1) GO TO 206 
      LENERR = 1
      WRITE(3,3000) FILE1,FILE2,DATE(),TIME() 
 206  WRITE(3,4000)CSA,FILE1,HEX2 
      GO TO 200 
 207  DO 220 I = 1,32 
      IF(HEX1(I).EQ.HEX2(I)) GO TO 220
      IF(LENERR + MCERR.GE.1) GO TO 210 
      MCERR = 1 
      WRITE(3,3000) FILE1,FILE2,DATE(),TIME() 
 210  WRITE(3,2000) CSA,HEX1,HEX2 
      GO TO 200 
 220  CONTINUE
      GO TO 200 
  
  
  
 900  WRITE(3,9000) FILE1 
      GO TO 980 
 910  WRITE(3,9000) FILE2 
      GO TO 980 
 920  EOF1 = 1
      GO TO 205 
 930  EOF2 = 1
      IF(EOF1.EQ.1) GO TO 990 
      IF(TOP.EQ."1") GO TO 200
      IF(CSA(1).EQ." ") GO TO 200 
      IF(MCERR + LENERR.GE.1) GO TO 940 
      LENERR = 1
      WRITE(3,3000) FILE1,FILE2,DATE(),TIME() 
 940  WRITE(3,5000) CSA,HEX1,FILE2
      GO TO 200 
  
 980  STOP 'I/O ERROR'
 990  IF((MCERR + LENERR).GE.1) STOP 'COMPARE ERRORS' 
      STOP 'COMPARE GOOD' 
  
  
  
 1000 FORMAT(1A1,9X,4A1,3X,16A1,1X,16A1)
 2000 FORMAT(10X,4A1,3X,16A1,1X,16A1,10X,16A1,1X,16A1)
 3000 FORMAT(1H1,21X,'DATA FROM FILE ',A7,21X,'DATA FROM FILE ',A7, 
     +12X,A10,2X,A10,/) 
 4000 FORMAT(10X,4A1,3X,'   END OF FILE ON ',A,16X,16A1,1X,16A1)
 5000 FORMAT(10X,4A1,3X,16A1,1X,16A1,10X,'   END OF FILE ON ',A)
 9000 FORMAT(/,10X,'I/O ERROR ON',1X,A) 
 9020 FORMAT(/,10X,'END OF FILE ON',1X,A) 
  
  
      END 
