*DECK,MCDUMP
      PROGRAM MCDUMP(OUTPUT,TAPE1,TAPE2=OUTPUT) 
C 
C 
C 
C 
C     THE MCDUMP UTILITY FORMATS AND LISTS CYBER 170/815,825,835,845 OR 855 
C     MICROCODE FROM AN INPUT FILE.  THE INPUT FILE CAN EXIST IN ONE
C     OF TWO FORMATS. 
C 
C     1. MSL OR CIP LOAD MODULE FORMAT. 
C 
C        THE INPUT FILE IS TO CONSIST OF ONE RECORD.  THIS RECORD IS TO 
C        HAVE BEEN PREVIOUSLY COPIED FROM A MSL, CTI/HIVS OR CIP LIBRARY FILE.
C 
C        FOR EXAMPLE: 
C 
C                ATTACH,MCDUMPS.
C                FTN5,I=MCDUMPS,B=MCDUMP,L=LIST,EL,PL. COMPILE MCDUMP.
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,MCODE)                     COPY MICROCODE TO MCODE
C                MCDUMP(I=MCODE,L=OUT)                 EXECUTE MCDUMP 
C                ROUTE(OUT,DC=PR)                      SEND OUTPUT TO PRINTER 
C 
C 
C     2. EXPRESS DEADSTART DUMP (EDD) FORMAT. 
C 
C        WHEN THE MICROCODE YOU WISH TO DUMP IS ON AN 'EDD' FILE IT IS NOT
C        NECESSARY TO EXTRACT THE CONTROL STORE DUMP FROM THE REST OF THE 
C        DATA, MCDUMP DOES IT FOR YOU.  THE FILE IS SEARCHED AND THE CONTROL
C        STORE DATA (PCSX) IS FORMATED AND DUMPED AUTOMATICALLY.
C 
C        FOR EXAMPLE: 
C 
C                REQUEST(EDDTAPE,NT,PE,F=S,PO=R,LB=KU,VSN=EDD)  REQUEST EDD TAPE
C                MCDUMP(I=EDDTAPE,L=OUT)                      EXECUTE MCDUMP
C                ROUTE(OUT,DC=PR)                           SENT OUT TO PRINTER 
C 
C     PROGRAM CALL FORMAT IS: 
C 
C        MCDUMP(P1,P2,P3) 
C 
C           PI = ANY OF THE FOLLOWING IN ANY ORDER: 
C 
C                I=LFN1   ONE TO SEVEN ALPHANUMERIC CHARACTERS
C                          (FIRST CHARACTER MUST BE ALPHA) NAMING 
C                         THE LOCAL FILE TO BE DUMPED(DEFAULT IS TAPE1).
C 
C                            INPUT DATA CAN BE FROM:  
C                            1) MSL OR CIP MICROCODE RECORD.
C                            2) EDD TAPE FILE.
C 
C                            MCDUMP WILL DETERMINE WHICH IT IS. 
C 
C                L=LFN2   ONE TO SEVEN ALPHANUMERIC CHARACTERS
C                          (FIRST CHARACTER MUST BE ALPHA) NAMING THE 
C                         LOCAL FILE TO WHICH THE OUTPUT IS WRITTEN 
C                         (DEFAULT IS OUTPUT). IF LFN2 IS NOT A LOCAL 
C                         FILE, MCDUMP CREATES IT. IT DOES NOT REWIND LFN2
C                         BEFORE OF AFTER THE DUMP. 
C 
C                NR       DO NOT REWIND FILE LFN1 BEFORE DUMP (DEFAULT
C                         IS TO REWIND LFN1). 
C 
C 
C 
C 
C 
      IMPLICIT INTEGER(A-Z) 
      DIMENSION BININ(18000),CONTABL(16),HEX(32),CSA(4),HEADER(4) 
      CHARACTER NAME*2, VALUE*7, TIME*10, DATE*10 
      DATA CONTABL/1H0,1H1,1H2,1H3,1H4,1H5,1H6,1H7,1H8,1H9,1HA, 
     X1HB,1HC,1HD,1HE,1HF/
  
C     WILL BE PLUGGED WITH MACHINE TYPE.  (E.I. 815,825,835,845,855)
      MACHINE = 3H??? 
  
C     LISTING PAGE NUMBER 
      PAGE = 1
  
C     MICROCODE ADDRESS ON LISTING
      ADDR = 0
  
C     CURRENT CHARACTER COUNT IN CONVERTED ARRAY
      CHAR = 1
  
C     DEFAULT IS TO REWIND LFN1 
      RWD = 1 
  
C     LINES LISTED PER PAGE 
      LINES = 58
  
C     NUMBER OF HEX CHARACTERS PER CONTROL STORE ADDRESS
      NCHAR = 32
  
C***  CRACK PROGRAM CALL STATEMENT
  
 100  CALL GETPARM(NAME,VALUE,RET)
      IF (RET.LT.0)GO TO 115
      IF(NAME.NE.'NR')GO TO 105 
      RWD = 0 
      GO TO 100 
 105  IF(NAME.NE.'I')GO TO 110
      OPEN(1,FILE = VALUE,FORM = 'BUFFERED')
      GO TO 100 
 110  IF(NAME.NE.'L')STOP 'ILLEGAL PARAMETER' 
      OPEN(2,FILE = VALUE)
      GO TO 100 
  
 115  IF(RWD.EQ.0)GO TO 120 
      REWIND 1
  
C***  READ FIRST RECORD, EXPECT 77 TABLE IF DATA FROM CIP RECORD. 
C                        EXPECT 4 WORD RECORD IF FROM EDD TAPE FILE.
  
 120  BUFFER IN(1,1)(BININ(1),BININ(18000)) 
      IF(UNIT(1))140,130,999
 130  EOF = 1 
 140  L = LENGTH(1) 
      IF(L.NE.4)GO TO 190 
  
C***  ASSUME EDD TAPE FILE INPUT, 
C     SEARCH FOR PCSX RECORD NAME.
  
 150  N = SHIFT(BININ(1),-42) 
      N = N.AND.O"777777" 
      IF(N.EQ.R"PCS")GO TO 180
  
 160  BUFFER IN(1,1)(BININ(1),BININ(18000)) 
      IF(UNIT(1))170,999,999
 170  L = LENGTH(1) 
      IF(L.NE.4)GO TO 160 
      GO TO 150 
  
C     DETERMINE MACHINE TYPE FROM PCSX, 
C        IF X = 0 = P1
C           X = 1 = P3
C           X = 2 = P2
  
 180  N = SHIFT(BININ(1),-36) 
      N = N.AND.O"77" 
      IF(N.EQ.R"0")MACHINE = 3H825
      IF(N.EQ.R"1")MACHINE = 3H855
      IF(N.EQ.R"2")MACHINE = 3H835
      WORD = 1
      HEADER(1) = 7HEDDTAPE 
      HEADER(2) = BININ(2)
      HEADER(3) = BININ(3)
      HEADER(4) = BININ(4) + R"        "
  
C     READ MICROCODE DATA.
  
      BUFFER IN(1,1)(BININ(1),BININ(18000)) 
      IF(UNIT(1))186,183,999
 183  EOF = 1 
 186  L = LENGTH(1) 
      GO TO 300 
  
C***  ASSUME CIP TYPE FILE FOR INPUT. 
C     CHECK FIRST WORD FOR 77 TABLE.
  
190   N = SHIFT(BININ(1),-54) 
      N = N.AND.O"77" 
      IF(N.NE.O"77")GO TO 999 
  
C     SECOND WORD OF 77 TABLE SHOULD BE MICROCODE NAME, 
C       FOR PRE CIP MICROCODE, THE NAME IS FORMATTED UXALYY, WHERE
C       X DETERMINES MACHINE TYPE.
C         IF X = 1 = P1 
C            X = 2 = P2 
C            X = 3 = P3 
C 
C       FOR POST CIP MICROCODE, THE NAME IS FORMATTED MXXAAYY,WHERE 
C       XX DETERMINES THE MACHINE TYPE. 
C          IF XX = 11 = 815 
C             XX = 12 = 825 
C             XX = 20 = 835 
C             XX = 31 = 845 
C             XX = 30 = 855 
C 
  
      N = SHIFT(BININ(2),-54) 
      IF(N.NE.R"U")GO TO 197
      N = SHIFT(BININ(2),-48) 
      IF(N.EQ.R"U1")MACHINE = 3H825 
      IF(N.EQ.R"U2")MACHINE = 3H835 
      IF(N.EQ.R"U3")MACHINE = 3H855 
      HEADER(3) = BININ(2) + R"    "
      GO TO 199 
 197  IF(N.NE.R"M") GO TO 999 
      N = SHIFT(BININ(2),-42) 
      IF(N.EQ.R"M11") MACHINE = 3H815 
      IF(N.EQ.R"M12") MACHINE = 3H825 
      IF(N.EQ.R"M20") MACHINE = 3H835 
      IF(N.EQ.R"M31") MACHINE = 3H845 
      IF(N.EQ.R"M30") MACHINE = 3H855 
      HEADER(3) = BININ(2) + R"   " 
 199  WORD = 17 
      HEADER(1) = 10HLIBRARY LO 
      HEADER(2) = 10HAD MODULE
      HEADER(4) = 10H 
  
C***  PROCESS INPUT DATA, CONVERT BINARY INPUT TO HEX AND 
C     LIST BY CONTROL STORE ADDRESS.
  
 300  WRITE(2,3000)MACHINE,HEADER,DATE(),TIME(),PAGE
 305  SHFT = -60
  
C     ADVANCE SHIFT COUNT, IF NOT EXHAUSTED GO TO MASK CHARACTER. 
C 
 310  SHFT = SHFT + 4 
      IF(SHFT.LE.0)GO TO 320
  
C     ADVANCE WORD NUMBER, IF END OF RECORD GO READ NEXT RECORD,
C              ELSE CONTINUE TO NEXT WORD.
C 
      WORD = WORD + 1 
      IF(WORD.GT.L)GO TO 500
      GO TO 305 
  
C     SHIFT WORD AND MASK OFF LOWER 4 BITS (ONE HEX DIGIT). 
  
 320  N = SHIFT(BININ(WORD),SHFT) 
      N = N.AND.O"17" 
  
C     CONVERT 4 BINARY BITS TO HEX DIGIT (0 TO F).
  
      HEX(CHAR) = CONTABL(N+1)
  
C     IF HEX LINE IF FULL (16 DIGITS FOR S1, 32 DIGITS FOR S2 OR S3)
C     PRINT LINE, ELSE CONTINUE CONVERSION. 
  
      CHAR = CHAR + 1 
      IF(CHAR.LE.NCHAR)GO TO 310
  
C     CONVERT HEX ADDRESS FOR LISTING.
  
      ADDSHFT = -12 
  
      DO 330 I = 1,4
      N = SHIFT(ADDR,ADDSHFT) 
      N = N.AND.O"17" 
      CSA(I) = CONTABL(N+1) 
 330  ADDSHFT = ADDSHFT+4 
  
      WRITE(2,1000)CSA,HEX
  
C     ADVANCE LISTING ADDRESS AND CHECK FOR LAST ADDRESS PROCESSED. 
  
      ADDR = ADDR + 1 
      IF(ADDR.GT.Z"1FFF".AND.MACHINE.EQ.3H815) GO TO 900
      IF(ADDR.GT.Z"1FFF".AND.MACHINE.EQ.3H825) GO TO 900
      IF(ADDR.GT.Z"BFF".AND.MACHINE.EQ.3H835) GO TO 900 
      IF(ADDR.GT.Z"7FF".AND.MACHINE.EQ.3H845) GO TO 900 
      IF(ADDR.GT.Z"7FF".AND.MACHINE.EQ.3H855) GO TO 900 
      CHAR = 1
  
C     PRINT PAGE HEADER IF CURRENT PAGE DONE. 
  
      IF(ADDR/PAGE.NE.LINES)GO TO 310 
      PAGE = PAGE + 1 
      WRITE(2,3000)MACHINE,HEADER,DATE(),TIME(),PAGE
      GO TO 310 
  
C***   DATA IN CURRENT RECORD IS PROCESSED AND PRINTED, ADDITIONAL RECORDS
C     MAY EXIST IF EDD INPUT WAS NOT DESIGNATED AS STRANGER TAPE INPUT. 
C     ALL ADDITIONAL RECORDS WILL BE GREATER THAN FOUR WORDS LONG.
  
 500  IF(EOF.EQ.1)GO TO 900 
      BUFFER IN(1,1)(BININ(1),BININ(18000)) 
      IF(UNIT(1))510,900,999
 510  L = LENGTH(1) 
      WORD = 1
      IF(L.NE.4)GO TO 305 
  
 900  STOP 'MCDUMP COMPLETE'
  
 999  STOP 'MCDUMP INPUT FILE ERROR'
  
C     FORMAT STATEMENTS FOLLOW
  
 1000 FORMAT(10X,4A1,3X,16A1,1X,16A1) 
 3000 FORMAT(1H1,1X,A3,' MICROCODE DUMP FROM ',4A10,30X,A10,2X, 
     XA10,2X,'PAGE',I3,/) 
  
  
      END 
