EXTERNALROUTINE  PRINT PHOTOGRAPH (INTEGER  PHOTO ADDR, SLAVE ADDR, SEIP, C 
 OCP TYPE,ADATE, ATIME, MODE, INTEGERFN  MAP FILE ADDRESS, ROUTINE  SETLST)
!
!  MODE = 0  IF CALLED FROM DUMP PROGRAM
!  MODE = 1  IF CALLED FROM JOURNAL ANALYSIS
!
INTEGERFNSPEC  MAP FILE ADDRESS (INTEGER  VIRTUAL ADDRESS)
ROUTINESPEC  SETLST (INTEGER  OCP PORT)
ROUTINESPEC  PRINT OCP PHOTO (INTEGER  START ADDR)
ROUTINESPEC  PRINT SAC PHOTO (INTEGER  START ADDR,PORT)
ROUTINESPEC  PRINT SMAC PHOTO (INTEGER  START ADDR)
ROUTINESPEC  PRINT REGISTERS (INTEGER  START ADDR)
ROUTINESPEC  ANALYSE SEIP (INTEGER  START ADDR)
ROUTINESPEC  PRINT SLAVES (INTEGER  START ADDR, SLAVE ADDR)
ROUTINESPEC  PRINT FRAME (INTEGER  START ADDR)
STRING (22) FNSPEC  UNDERLINE (INTEGER  LEN)
INTEGERFNSPEC  GET REGISTER (INTEGER  FROM)
SYSTEMROUTINESPEC  PHEX(INTEGER  N)
!
INTEGER  I,START,OCP,MULTISAC,HWPHOTO,HWFAIL,SETIMEOUT,RETRY
INTEGER  RA0,PSTBA,LSTBA,MULTIOCP,PHOTOREGDUMP
!
CONSTINTEGER  YES=1,NO=0
CONSTINTEGER  TOP14BITS =X'FFFC0000'
CONSTINTEGER  TOP17BITS = X'FFFF8000'
CONSTSTRING (17) VSN="PHOTO 4C 17/12/80"
CONSTSTRING (4) ARRAY  OCP TYPES(1:6)=C 
"2950","2960","2970","2980","2972","2976"
CONSTSTRING (11) ISONPORT=" IS ON PORT"
CONSTSTRING (10) PHOTO="PHOTOGRAPH"
!
SETIMEOUT=NO
PHOTOREGDUMP=NO
RETRY=-1
IF  SEIP<0 THEN  OCP=-SEIP AND  HWFAIL=NO ELSE  HWFAIL=SEIP>>27&3 C 
      AND  OCP=SEIP>>29; ! FAILING OCP AND FAILURE CODE
!
IF  OCP TYPE>3 START ;            ! PHOTODUMP SUCCESSFUL?
PHOTOREGDUMP=SEIP>>17&1
HWPHOTO=YES
IF  HWFAIL#NO START 
IF  SEIP>>3&3=3 THEN  SETIMEOUT=YES;         ! SYSTEM ERROR TIMEOUT?
IF  HWFAIL=2 THEN  RETRY=SEIP>>18&1;            !  RETRY ATTEMPTED IF SET
FINISH 
HWFAIL=(X'1320'>>(4*HWFAIL))&15
FINISHELSE  HWPHOTO=SEIP>>18&1!!1
HWPHOTO=NO IF  SEIP<0 OR  (HWFAIL=NO AND  SEIP>>7&1=1)
!
START=PHOTO ADDR;  ! START OF PHOTOGRAPH
I=INTEGER(START+144)>>28; ! EXT INT PORTS (0-3) IN CONFIG REG
MULTIOCP=(I&1+I>>1&1)
I=I>>2
MULTISAC=(I&1+I>>1)-1
!
PRINTSTRING(OCP TYPES(OCP TYPE)." ".PHOTO." ANALYSIS")
SPACES(60)
PRINTSTRING(VSN.UNDERLINE(24))
!
ANALYSE SEIP (START)
!
UNLESS  SEIP<0 OR  OCP TYPE<4 START ;   ! PHOTO ONLY CODED FOR P4'S
PRINT REGISTERS (START) UNLESS  PHOTOREGDUMP=NO
NEWPAGE
UNLESS  HWPHOTO=NO START 
PRINT OCP PHOTO (START)
START=START+2048; ! OCP PHOTO SIZE
!
IF  OCP TYPE=4 START ;          ! 2980 ONLY
CYCLE  I=0,1,MULTISAC
PRINT SAC PHOTO (START,I)
START=START+1024; ! SAC PHOTO SIZE
REPEAT 
!
START=START+1024 UNLESS  MULTISAC=YES
PRINT SMAC PHOTO (START)
FINISH 
!
! PRINT CONTENTS OF SLAVES
!
IF  MULTIOCP=YES THEN  SETLST(OCP)
IF  MODE=0 THEN  RA0=X'81000000'
PRINT SLAVES (PHOTO ADDR, SLAVE ADDR)
NEWPAGE
!
FINISH 
FINISH 
!
!
ROUTINE  ANALYSE SEIP (INTEGER  START ADDR)
INTEGER  I,J,TIMEOUT
OWNSTRING (22) ARRAY  HWFAILS(0:3)="SOFTWARE ","IRRECOVERABLE ",""(2)
CONSTSTRING (10) REC="RECOVERED "
CONSTSTRING (7) FORCED="FORCED "
CONSTSTRING (8) RET="RETRIED "
CONSTSTRING (5) ERR="ERROR"
CONSTSTRING (12) SUC="SUCCESSFULLY"
CONSTSTRING (3) SNO="NO "
CONSTSTRING (5) ARRAY  P2PHOTO(0:1)="MINI ","FULL "
CONSTSTRING (25) ARRAY  SWERR(6:15)="ACS=0","SW GENERATED SYSTEM ERROR",
    "SEG TABLE FORMAT ERROR","SSN ODD","MASKED EXTRACODE","MASKED OUT",
    "MASKED SYSTEM CALL INT","MASKED PROGRAM ERROR INT",
    "MASKED VIRTUAL STORE INT","ILLEGAL VIRTUAL STORE INT"
! THE FOLLOWING HW ERRORS ARE DIVIDED AMONGST THE MACHINE RANGE SUCH AS
! (2:15) = P4 , (16:29) = P3 , (30:34) = P2
CONSTSTRING (25) ARRAY  HWERR(3:34)= C 
      "SYSTEM ERROR TIMEOUT","STORE TIMEOUT","WRITE BUFFER FAIL",
      "STRING","ARITHMETIC","OPERAND","MODIFY","STACK","DISPLACEMENT",
      "FETCH","TRANSLATOR","SMAC 0 FAIL","STORE FAIL",
      "INSTRUCTION SLAVE FAIL","STACK SLAVE FAIL","AGU FUNCTION FAIL",
      "INSTRUCTION BUFFER FAIL","ARU CONTROL SYSTEM","ARU DATA SYSTEM",
      "AGU CONTROL SYSTEM","AGU DATA SYSTEM","PORT ACTIVATE TIMEOUT",
      "ANY TIMEOUT","OCP TIMEOUT","SMAC IMAGE STORE TIMEOUT",
      "SMAC SINGLE BIT FAIL","SMAC MULTIBIT FAIL","MICROPROGRAM DETECTED ERR",
      "DATA PARITY","MICROPROGRAM PARITY","SAV PARITY","DECODER PARITY"
CONSTSTRING (10) UFAIL=" UNIT FAIL"
STRINGNAME  DATE,TIME
!
HWFAILS(2)=REC
HWFAILS(3)="UN".REC
DATE==STRING(ADATE)
TIME==STRING(ATIME)
PRINTSTRING("

".OCP TYPES(OCP TYPE)." SYSTEM ".ERR)
SPACES(20)
PRINTSTRING("DATE  ".DATE."  TIME  ".TIME.UNDERLINE(17)."PARAMETER = ")
IF  SEIP<0 START ;         ! SOFTWARE FORCED
WRITE(SEIP,1)
PRINTSTRING("

".FORCED.HWFAILS(0).ERR."
".SNO.PHOTO."
FAILING OCP".ISONPORT)
WRITE(OCP,1)
FINISHELSESTART ;         ! SOFTWARE OR HARDWARE
PHEX(SEIP)
PRINTSTRING("

OCP DETECTED ")
PRINTSTRING(FORCED) IF  HWFAIL=NO AND  SEIP>>7&1=1
PRINTSTRING(HWFAILS(HWFAIL))
PRINTSTRING("HARDWARE ") IF  HWFAIL#NO
PRINTSTRING(ERR.ISONPORT);         ! FAILING PORT
WRITE(OCP,1)
PRINTSTRING(" AT ACR")
UNLESS  SETIMEOUT=YES THEN  I=SEIP ELSE  I=INTEGER(START ADDR +X'48')
! IF SYSTEM ERROR TIMEOUT ON P4 - GET ACR FROM PHOTO
WRITE(I>>20&15,2);         ! ACR LEVEL
!
!                                     TYPE OF FAILURE
PRINTSTRING("

FAILURE CODE IS")
WRITE(HWFAIL,1)
PRINTSTRING(" - ")
HWFAILS(2)=RET.SUC
UNLESS  RETRY=NO THEN  HWFAILS(3)=RET."UN".SUC C 
      ELSE  HWFAILS(3)="RETRY IS POSSIBLE"
PRINTSTRING(HWFAILS(HWFAIL))
IF  RETRY=YES THEN  PRINTSTRING(" (BIT 13 SET)")
!
!                                     PHOTOGRAPH AREA
I=SEIP>>16&1
IF  HWPHOTO=NO THEN  PRINTSTRING("
".SNO) ELSESTART 
NEWLINE
IF  OCP TYPE=2 THEN  PRINTSTRING(P2PHOTO(I)) ELSESTART 
PRINTSTRING("SMAC")
IF  OCP TYPE>3 AND  PHOTOREGDUMP=NO THEN  PRINTSTRING(" 0") ELSE  WRITE(I,1)
SPACE
FINISH 
FINISH 
PRINTSTRING(PHOTO)
!
!                                     REG DUMP AREA
UNLESS  OCP TYPE>3 AND  PHOTOREGDUMP=YES START 
IF  OCP TYPE<4 THEN  I=SEIP>>17&1!!1
NEWLINE
PRINTSTRING(SNO) IF  I=0
PRINTSTRING("SSN+1 DUMP")
FINISH 
!
PRINTSTRING("
PC IN REG DUMP IS INVALID") IF  OCP TYPE>3 AND  SEIP>>19&1=1
!
TIMEOUT=NO
!
!                                     REASON FOR FAIL
CYCLE  I=15,-1,3
J=SEIP>>I&1;                          ! J=1 IF BIT SET FROM FAIL BITS 16-29
IF  J=1 OR  TIMEOUT=YES START 
!
NEWLINE
IF  HWFAIL=NO START ;            ! SOFTWARE ERROR
EXITIF  I<6;            ! ONLY BITS 16-25 APPLY
PRINTSTRING(SWERR(I))
!
IF  I=13 AND  HWPHOTO=YES START ;      ! PROGRAM ERROR - GET (CLASS,SUBCLASS) FROM PHOTO
J=INTEGER(START ADDR +X'440')>>22&X'FF'
PRINTSTRING("    PROGRAM ".ERR." IS (")
WRITE(J>>4&15,2)
PRINTSTRING(" ,")
WRITE(J&15,2)
PRINTSTRING(" )")
FINISH 
!
FINISHELSESTART ;            ! HARDWARE ERROR
!
UNLESS  OCP TYPE>2 START ;         ! P2 ONLY
EXITIF  I<7;         ! ONLY BITS 16-24 APPLY
IF  I=14 OR  I=15 THEN  PRINTSTRING(HWERR(I+14))
UNLESS  I=10 OR  I=11 THEN  PRINTSTRING(HWERR(I+23)) ELSESTART 
IF  I=11 THEN  PRINTSTRING(HWERR(4)) ELSE  PRINTSTRING(HWERR(26))
FINISH 
!
FINISHELSESTART 
IF  OCP TYPE<4 THEN  PRINTSTRING(HWERR(I+14)) ELSESTART ;      ! P3 ONLY
!
!                                     P4 ONLY
IF  I=4 THEN  TIMEOUT=YES ELSESTART ;      ! TIMEOUT
IF  I=3 AND  J=0 THEN  PRINTSTRING(HWERR(4)) ELSESTART ;      ! STORE TIMEOUT
PRINTSTRING(HWERR(I));            ! SYSTEM ERROR TIMEOUT
PRINTSTRING(UFAIL) IF  6<=I<=13
FINISH 
FINISH 
FINISH 
FINISH 
FINISH 
FINISH 
REPEAT 
FINISH 
!
END ;                                   ! OF ANALYSE SEIP
!
!
ROUTINE  PRINT REGISTERS (INTEGER  START ADDR)
INTEGERARRAYFORMAT  RF(0:15)
INTEGERARRAYNAME  VREGISTER
INTEGERARRAY  REGISTER(0:15)
INTEGER  I
CONSTINTEGERARRAY  DISP(9:15)=X'108',X'138',X'140',X'700',X'708',X'710',X'718'
!
VREGISTER==ARRAY(START ADDR +X'580',RF);  ! VISIBLE REGISTER DUMP IN FRAME 11
CYCLE  I=0,1,15
REGISTER(I)=VREGISTER(I)
REPEAT 
!
! OBTAIN REGISTERS FROM PHOTO DUMP AFTER TIMEOUT ON P4'S
!
IF  SETIMEOUT=YES START 
REGISTER(0)=GET REGISTER(START ADDR +X'200');                        ! SSN/LNB           
REGISTER(1)=REGISTER(1)!INTEGER(START ADDR +X'48');                  ! PSR
REGISTER(2)=(INTEGER(START ADDR +X'248')&TOP17BITS)>>14!C          
      (INTEGER(START ADDR +X'250')&TOP14BITS);                       ! PC
REGISTER(3)=INTEGER(START ADDR +X'50');                              ! SSR
REGISTER(4)=GET REGISTER(START ADDR +X'210');                        ! SSN/SF
REGISTER(5)=INTEGER(START ADDR +X'80');                              ! IT
REGISTER(6)=INTEGER(START ADDR +X'88');                              ! IC
REGISTER(7)=GET REGISTER(START ADDR +X'218');                        ! CTB
REGISTER(8)=GET REGISTER(START ADDR +X'208');                        ! XNB
CYCLE  I=9,1,15
REGISTER(I)=INTEGER(START ADDR +DISP(I));                            ! B,DR0,DR1,A0-A3
REPEAT 
FINISH 
!
PRINTSTRING("


".OCP TYPES(OCP TYPE)." OCP REGISTERS (".PHOTO.")".UNDERLINE(18).C 
"SSN/LNB     PSR        PC       SSR      SSN/SF      IT        IC".C 
"       CTB                LSTB0     LSTB1
")
CYCLE  I=0,1,7
PHEX(REGISTER(I))
SPACES(2)
REPEAT 
SPACES(10)
PHEX(INTEGER(START ADDR +X'160'));                                   ! LSTB0
SPACES(2)
LSTBA=INTEGER(START ADDR +X'150');                                   ! LSTB1
PHEX(LSTBA)
PRINTSTRING("


  XNB        B        DR0       DR1        A0        A1        A2".C 
"        A3                PSTB0     PSTB1
")
CYCLE  I=8,1,15
PHEX(REGISTER(I))
SPACES(2)
REPEAT 
SPACES(10)
PHEX(INTEGER(START ADDR +X'158'));                                   ! PSTB0
SPACES(2)
PSTBA=INTEGER(START ADDR +X'148');                                   ! PSTB1
PHEX(PSTBA)
END ;                                   ! OF PRINT REGISTERS
!
!
ROUTINE  PRINT OCP PHOTO (INTEGER  START ADDR)
INTEGER  I
CONSTSTRING (8) ARRAY  OCP PHOTO FRAME TITLE(0:15)= C 
"STACK SL","CRITIC  ","MOD DATA","INST.SL.","DISPLAC.",
"TRANS.  ","TRANS.EX","OP.SLAVE","OP.BUFF.","WR.BUFF.",
"MOD. MP.","NOT USED","AU MULT.","STRING U","AU DATA ","AU MPROG"
PRINTSTRING(OCP TYPES(OCP TYPE)." OCP ".PHOTO."    OCP".ISONPORT)
WRITE(OCP,1)
PRINTSTRING(UNDERLINE(19))
CYCLE  I=0,1,15
UNLESS  I=11 START 
PRINTSTRING(OCP PHOTO FRAME TITLE(I))
PRINT FRAME(START ADDR +I<<7);  ! FRAME SIZE = 128
FINISH 
REPEAT 
END ;                  ! OF PRINT OCP PHOTO
!
!
ROUTINE  PRINT SAC PHOTO (INTEGER  START ADDR, PORT)
INTEGER  I
CONSTSTRING (8) ARRAY  SAC PHOTO FRAME TITLE(0:7)= C 
"SAC 0   ","SAC 1   ","SAC 2   ","D.C.U.  ",
"TRUNK AD","TRUNK EH","TRUNK JM","TRUNK NR"
PRINTSTRING("SAC ".PHOTO."    SAC".ISONPORT)
WRITE(PORT,1)
PRINTSTRING(UNDERLINE(14))
CYCLE  I=0,1,7
UNLESS  I>3 AND  INTEGER(START ADDR +I<<7)=-1 START 
PRINTSTRING(SAC PHOTO FRAME TITLE(I))
PRINT FRAME(START ADDR +I<<7); ! FRAME SIZE = 128
FINISH 
REPEAT 
END ;                    ! OF PRINT SAC PHOTO
!
!
ROUTINE  PRINT SMAC PHOTO (INTEGER  START ADDR)
INTEGER  I,J,START
OWNSTRING (1) SMAC ID="A"
CONSTSTRING (6) ARRAY  SMAC PHOTO FRAME TITLE(0:1)="SMAC 0","SMAC 1"
IF  SMAC ID="E" THEN  SMAC ID="A"
START=START ADDR
CYCLE  J=1,1,4;  ! 4 SMACS
PRINTSTRING("SMAC ".SMAC ID." ".PHOTO)
PRINTSTRING(UNDERLINE(17))
CYCLE  I=0,1,1
PRINTSTRING(SMAC PHOTO FRAME TITLE(I))
PRINT FRAME(START )
START=START+128;  ! FRAME SIZE = 128
REPEAT 
CHARNO(SMAC ID,1)=CHARNO(SMAC ID,1)+1
REPEAT 
END ;                     ! OF PRINT SMAC PHOTO
!
!
ROUTINE  PRINT SLAVES (INTEGER  START ADDR, SLAVE ADDR)
INTEGERFNSPEC  GET SLAVE (INTEGER  FROM)
LONGINTEGERFNSPEC  GET ATU SLAVE (INTEGER  FROM)
STRING  (47) FNSPEC  SLAVE TITLE (INTEGER  TYPE)
ROUTINESPEC  PRINT BLOCK SLAVE (INTEGER  TYPE)
ROUTINESPEC  PHEX CONTENTS (INTEGER  N)
ROUTINESPEC  GET AGES
INTEGERNAME  LW,RW
LONGINTEGER  L
INTEGERARRAY  STACK VALIDS,STACK CAMS(0:7)
INTEGERARRAY  AGE(0:7)
INTEGER  SEG,CAMAD,CAM,LINE,START,I,J,K,VALIDS,FLAG,POS,REJ
STRING (19) HEADING
!
CONSTINTEGER  UNASSIGNED=X'80808080'
CONSTSTRING (8) ADDRESS="ADDRESS "
CONSTSTRING (6) SVALID="VALID "
CONSTSTRING (4) SAGE="AGE "
CONSTSTRING (5) SLINE="LINE "
CONSTSTRING (25) CONTENTS="               CONTENTS

"
CONSTSTRING (5) ARRAY  VALID(0:1) ="  N  ","  Y  "
CONSTSTRING (11) STABLE=" TABLE ENTR"
CONSTSTRING (4) PAGE="PAGE"
CONSTSTRING (3) SEQ=" = "
CONSTSTRING (4) SP4="    "
!
HEADING=" CAM ".ADDRESS.SVALID
IF  MODE=0 START 
PSTBA=PSTBA+RA0;  ! VA OF PSTB
LSTBA=LSTBA+RA0;  ! VA OF LSTB
FINISHELSE  POS=SLAVE ADDR;           ! START OF  SLAVES
I=ADDR(L)
LW==INTEGER(I)
RW==INTEGER(I+4)
!
! INSTRUCTION SLAVE
!
SEG=INTEGER(START ADDR +X'190')&TOP14BITS; ! PD SEG
START=START ADDR +X'1A0'; ! FRAME 3 (CAMS)
CYCLE  CAM=0,1,3
EXITIF  INTEGER(START +CAM<<3)&X'10000000'#0
REPEAT 
CYCLE  I=0,1,3
J=CAM-I
AGE(I)=J
IF  J=0 THEN  CAM=I+4
REPEAT 
!
PRINT BLOCK SLAVE (0); ! INSTRUCTION SLAVE
!
! STACK SLAVE
!
PRINTSTRING("



".SLAVE TITLE(2)."LNB".SEQ)
I=GET REGISTER(START ADDR +X'200'); ! SSN/LNB
SEG=I&TOP14BITS
PHEX(I)
PRINTSTRING("   SF".SEQ)
PHEX(GET REGISTER(START ADDR +X'210')); ! SSN/SF
PRINTSTRING(SP4.SLINE.CONTENTS.HEADING."REJ ")
CYCLE  LINE=0,1,3
PRINTSTRING(SP4.SVALID)
WRITE(LINE,2)
REPEAT 
NEWLINES(2)
!
I=INTEGER(START ADDR +X'60'); ! CAM VALIDS/REJ PTR
J=I>>12&15; ! REJ PTR
START=START ADDR; ! FRAME 0
CYCLE  K=0,1,7
L=LONGINTEGER(START)>>24; ! LNWN VALIDS/CAMS
STACK VALIDS(K)=LW
STACK CAMS(K)=RW
START=START+8
REPEAT 
K=0
!
CYCLE  CAM=0,1,15
WRITE(CAM,2)
SPACES(2)
IF  CAM<8 START 
VALIDS=STACK VALIDS(K)>>4
CAMAD=STACK CAMS(K)>>14
FINISHELSESTART 
VALIDS=STACK VALIDS(K)&15
CAMAD=STACK CAMS(K)
FINISH 
CAMAD=CAMAD&X'3FFF0'!SEG
PHEX(CAMAD)
PRINTSTRING(VALID(I>>(31-CAM)&1))
IF  CAM=J THEN  PRINTSTRING(" *  ".SP4) ELSE  SPACES(8)
CYCLE  LINE=0,1,3
PRINTSTRING(VALID(VALIDS>>(3-LINE)&1))
PHEX CONTENTS(GET SLAVE(CAMAD))
CAMAD=CAMAD+4
REPEAT 
NEWLINE
IF  CAM=7 THEN  K=0 ELSE  K=K+1
REPEAT 
!
! OPERAND SLAVE
!
NEWPAGE
START=START ADDR +X'380'; ! FRAME 7
I=INTEGER(START ADDR +X'3C8'); ! PEQ (CAM VALIDS)
SEG=INTEGER(START ADDR +X'3D0'); ! SHA/WPE
K=INTEGER(START ADDR +X'3D8'); ! LINE VALIDS
REJ=INTEGER(START ADDR +X'3E0')>>4;   ! REJ PNTR STATS
GET AGES
!
PRINT BLOCK SLAVE (1); ! OPERAND SLAVE
!
! ATU SLAVE
!
NEWPAGE
PRINTSTRING(SLAVE TITLE(3).HEADING.PAGE."D ".SAGE.SP4." SEG.". C 
      STABLE."Y ".SP4.PAGE.STABLE."IES

")
CAM=0
START=START ADDR +X'288'; ! FRAME 5 (CAMS)
L=LONGINTEGER(START ADDR +X'2E0')<<4;     ! REJ PNTR STATS CAMS 0-7
REJ=LW
GET AGES
WHILE  CAM#16 CYCLE 
VALIDS=INTEGER(START+8); ! CAM VALIDS
K=INTEGER(START+16); ! SEGS PAGED
CYCLE  LINE=0,1,7
WRITE(CAM,2)
SPACES(2)
CAM=CAM+1
CAMAD=INTEGER(START)&X'FFFFF800'
PHEX(CAMAD)
I=7-LINE
J=K>>I&1; ! SEG PAGED IF SET
PRINTSTRING(VALID(VALIDS>>I&1)." ".VALID(J))
WRITE(AGE(LINE),2)
SPACES(6)
IF  MODE=0 START 
IF  CAMAD&X'80000000'#0 THEN  SEG=PSTBA ELSE  SEG=LSTBA; ! PUBLIC OR LOCAL SEG
SEG=SEG+CAMAD>>15&X'FFF8'
FINISH 
L=GET ATU SLAVE(SEG)
PHEX CONTENTS(LW); ! 1ST WORD SEGMENT TABLE ENTRY
SPACES(2)
PHEX CONTENTS(RW); ! 2ND WORD SEGMENT TABLE ENTRY
IF  J=1 OR  MODE=1 START ; ! GET PAGE TABLE ENTRIES IF SEGMENT PAGED
SPACES(4)
IF  MODE=0 THEN  I=RA0+RW&X'FFFFFF8'+CAMAD>>8&X'3F8'; ! EVEN/ODD PAIR OF PTE'S
L=GET ATU SLAVE(I)
PHEX CONTENTS(LW); ! EVEN PAGE TABLE ENTRY
SPACES(2)
PHEX CONTENTS(RW); ! ODD PAGE TABLE ENTRY
FINISH 
NEWLINE
START=START+8
REPEAT 
IF  CAM=8 START 
START=START ADDR +X'300'; ! FRAME 6
L=LONGINTEGER(START ADDR +X'2E8')<<4;    ! REJ PNTR STATS CAMS 8-15
REJ=LW
GET AGES
FINISH 
REPEAT 
!
!
ROUTINE  PHEX CONTENTS (INTEGER  N)
IF  FLAG=0 THEN  PHEX(N) ELSE  SPACES(8)
END ;                                   ! OF PHEX CONTENTS
!
!
INTEGERFN  GET SLAVE (INTEGER  FROM)
INTEGER  A
IF  MODE=0 START 
A=MAP FILE ADDRESS(FROM)
IF  A=UNASSIGNED THEN  FLAG=1 ANDRESULT =A ELSE  FLAG=0 ANDRESULT =INTEGER(A)
FINISHELSESTART 
A=INTEGER(POS)
POS=POS+4
IF  A=UNASSIGNED THEN  FLAG=1 ELSE  FLAG=0
RESULT =A
FINISH 
END ;                                   ! OF GET SLAVE
!
!
LONGINTEGERFN  GET ATU SLAVE (INTEGER  FROM)
INTEGER  A
IF  MODE=0 START 
A=MAP FILE ADDRESS(FROM)
IF  A=UNASSIGNED THEN  FLAG=1 ANDRESULT =A ELSE  FLAG=0 ANDRESULT =LONGINTEGER(A)
FINISHELSESTART 
A=INTEGER(POS)
POS=POS+8
IF  A=UNASSIGNED THEN  FLAG=1 ELSE  FLAG=0
RESULT =LONGINTEGER(POS-8)
FINISH 
END ;                                   ! OF GET ATU SLAVE
!
!
STRING (47) FN  SLAVE TITLE (INTEGER  TYPE)
CONSTSTRING (12) ARRAY  NAME(0:3)=" INSTRUCTION"," OPERAND"," STACK"," ATU"
RESULT =OCP TYPES(OCP TYPE).NAME(TYPE)." SLAVE". C 
      UNDERLINE(LENGTH(NAME(TYPE))+10)
END ;                                   ! OF SLAVE TITLE
!
!
ROUTINE  GET AGES
!
! EVALUATES REJECTION POINTER PRIORITY AGEING FOR OPERAND AND ATU SLAVES
!
INTEGER  I,J,K
CONSTINTEGERARRAY  PTR(1:28)= 21,22,23,24,25,26,27,
      14,15,16,17,18,19,7,8,9,10,11,0,1,2,3,4,5,6,12,13,20
CONSTINTEGERARRAY  BASE(0:6)= 0,6,11,15,18,20,21
!
REJ=REJ&X'FFFFFFF'
CYCLE  I=0,1,7
AGE(I)=0
CYCLE  J=0,1,7
IF  I#J START 
IF  I<J THEN  K=REJ>>PTR(BASE(I)+J)&1 ELSE  K=¬REJ>>PTR(BASE(J)+I)&1
AGE(I)=AGE(I)+K
FINISH 
REPEAT 
REPEAT 
END 
!
!
ROUTINE  PRINT BLOCK SLAVE (INTEGER  TYPE)
INTEGER  N,M,CAM,CAMAD,VALIDS,LINE,J
CONSTSTRING (20) ARRAY  HDG(0:1)=""," SHA  WPE   PC   RA "
!
PRINTSTRING(SLAVE TITLE(TYPE))
IF  TYPE=0 START 
PRINTSTRING("PI".SEQ)
PHEX((INTEGER(START ADDR +X'248')&TOP17BITS)>>14! C 
      (INTEGER(START ADDR +X'250')&TOP14BITS))
NEWLINES(2)
FINISH 
PRINTSTRING(HEADING.SAGE.HDG(TYPE).SP4.SLINE.ADDRESS.SVALID.CONTENTS)
!
CYCLE  CAM=0,1,3<<TYPE+TYPE
WRITE(CAM,2)
SPACES(2)
IF  TYPE=0 START 
I=INTEGER(START)
CAMAD=SEG!I&X'3FFC0'
N=18
M=I>>20; ! IV
FINISHELSESTART 
L=LONGINTEGER(START)
CAMAD=LW
N=23-CAM
M=K>>(28-CAM<<2)
FINISH 
PHEX(CAMAD)
PRINTSTRING(VALID(I>>N&1)); ! PEQ (CAM VALID)
WRITE(AGE(CAM),2)
SPACES(2)
IF  TYPE=1 THEN  PRINTSTRING(VALID(SEG>>(31-CAM)&1).VALID(SEG>>(23-CAM)&1). C 
      VALID(RW>>28&1).VALID(RW>>29&1)); ! SHA/WPE/PC/RA
VALIDS=M&15
CYCLE  LINE=0,1,3
WRITE(LINE,5)
SPACES(3)
PHEX(CAMAD)
N=VALIDS>>(3-LINE)&1
PRINTSTRING(VALID(N)." ")
UNLESS  TYPE=0 AND  N=0 START ; ! DON'T PRINT INST. SLAVE IF NON VALID
CYCLE  J=0,1,3
PHEX CONTENTS(GET SLAVE(CAMAD))
SPACES(2)
CAMAD=CAMAD+4
REPEAT 
FINISHELSE  CAMAD=CAMAD+16 AND  POS=POS+16
NEWLINE
SPACES(20*TYPE+23)
REPEAT 
NEWLINE
START=START+8
REPEAT 
!
END ;                                   ! OF PRINT BLOCK SLAVE
!
!
END ;                                   ! OF PRINT SLAVES
!
!
ROUTINE  PRINT FRAME (INTEGER  START ADDR)
LONGINTEGERARRAYFORMAT  FRAME(0:15)
LONGINTEGERARRAYNAME  ROW
INTEGER  I,J,K
LONGINTEGER  L
STRING (133) BUFF
CONSTSTRING (16) HEXDS="0123456789ABCDEF"
CONSTSTRING (3) ARRAY  SET(0:1)="  .","  1"
CONSTSTRING (6) NL3SP3="


   "
!
PRINTSTRING(NL3SP3."          ")
CYCLE  I=0,1,35
IF  I&3=0 THEN  WRITE(I,3) ELSE  WRITE(I,2)
REPEAT 
!
ROW==ARRAY(START ADDR,FRAME)
CYCLE  J=0,1,15
BUFF=NL3SP3
CHARNO(BUFF,4)=CHARNO(HEXDS,J+1);     ! INSERT ROW NO. IN HEX
K=6
L=ROW(J)
!
CYCLE  I=60,-4,28
K=K+1
IF  I=28 THEN  CHARNO(BUFF,K)=' ' AND  K=K+1
CHARNO(BUFF,K)=CHARNO(HEXDS,L>>I&15+1);     ! INSERT CONTENTS IN HEX
REPEAT 
LENGTH(BUFF)=K
!
CYCLE  I=63,-1,28
BUFF=BUFF." " IF  I&3=3
K=L>>I&1
BUFF=BUFF.SET(K);       ! INSERT BIT PATTERN OF CONTENTS
REPEAT 
!
PRINTSTRING(BUFF)
REPEAT 
NEWPAGE
END ;                ! OF PRINT FRAME
!
!
STRING (27) FN  UNDERLINE (INTEGER  LEN)
CONSTSTRING (25) DASH="
------------------------"
CONSTSTRING (2) LINES="

"
STRING (27) S
S=DASH
LENGTH(S)=LEN+1
RESULT =S.LINES
END ;                   ! OF UNDERLINE
!
!
INTEGERFN  GET REGISTER (INTEGER  FROM)
INTEGER  I,J
I=INTEGER(FROM)<<1
J=I<<1&X'3FFFC'
RESULT =I&TOP14BITS!J
END ;                 ! OF GET REGISTER
!
!
END ;     ! OF PRINT PHOTOGRAPH
!
ENDOFFILE