!File last changed on 11/02/83
! *******************************************************************
! * *
! * THE JOURNAL SYSTEM: PACKAGE C *
! * THIS PACKAGE CONTAINS THE ROUTINES THAT GIVE THE ICL *
! * ENGINEERS INTERACTIVE CONTROL OF ERROR CHECKING. *
! * *
! * DESIGNED AND WRITTEN BY JOHN HENSHALL *
! * *
! * JOHN MURISON VERSION: 015 *
! * *
! * *
! *******************************************************************
constinteger kent = 0, ercc = 1
constinteger journalsite = kent
!********** SYSTEM ROUTINE SPECS
recordformat rf(integer conad, filetype, datastart, dataend)
systemroutinespec connect(string (31) file, integer mode,hole,
project, record (rf)name r, integername flag)
systemroutinespec destroy(string (31) s, integername flag)
systemroutinespec disconnect( string (31) file, integername flag)
systemroutinespec modpdfile(integer bp,string (18) pdfile,
string (11) member,string (31) infile,integername flag)
!**********EXTERNAL ROUTINE SPECS.
recordformat f parm(integer dest,srce,p1,p2,p3,p4,p5,p6)
externalintegerfnspec dpon3(string (6) user,record (f parm)name p,
integer invoc,msgtype,outno)
externalintegerfnspec dpermission(string (6) owner,user,
string (8) date,string (11) file,integer fsys,type,adprm)
externalroutinespec copy(string (255) s)
externalroutinespec define(string (255) s)
externalroutinespec deliver(string (255) s)
externalroutinespec list(string (255) s)
externalroutinespec journal analysis(string (255) s)
externalroutinespec journal(string (255) s)
externalroutinespec prompt(string (255) s)
externalstringfnspec date
externalroutinespec send(string (255) s)
!**********ROUTINE AND FUNCTION SPECS.
integerfnspec res str(string (255) a, string (255) b, string (*)name c)
externalroutinespec read prompt reply(stringname reply)
externalintegerfnspec s to i(string (255) s)
externalstringfnspec intostr(integer value)
systemstringfnspec unpack date(integer packed)
systemstringfnspec unpack time(integer packed)
!**********CONSTANT ARRAYS.
conststring (4) array ocps(0:15,0:1) = c
"29??"(2),"2960","2970","2980","2972","2976","29??"(9),
"29??","2950","2956","2966","2988","29??"(*)
!**********CONSTANTS.
constinteger block = 4096
!BYTES IN EPAGE.
constinteger max unit errors = 2000
constinteger terminal lines = 18
!LINES OF OUTPUT ON ENGINEERS TERMINAL
constinteger yes = 1
constinteger no = 0
constinteger P series=0
constinteger S series=1
!**********EXTERNAL ROUTINE LIST
! THE FOLLOWING EXTERNAL ROUTINES EXIST IN THIS MODULE AND ARE IN
! ALPHABETIC ORDER OF APPEARANCE:
! ENGINEER SUMMARY: THIS ROUTINE ALLOWS THE ENGINEER TO LOOK AT A
! TABLE OF HARDWARE ERRORS FOR THE PERIOD OF TIME GOVERNED BY THE PAGE
! SPECIFIED. THE ENGINNER CAN GO ON TO LOOK AT THE ERRORS IN DETAIL
! EITHER AT HIS CONSOLE OR ON PRINTER OUTPUT.
! MAINLOG SUMMARY: THIS ROUTINE ALLOWS THE ENGINEERS TO LOOK BACK AT
! THE ORIGINAL MAINLOGS AND EXTRACT SUMMARY INFORMATION OR FULL DUMPS
! FROM THEM.
! TAPE LIBRARY: THIS ROUTINE IS USED AS AN INTERACTIVE
! LOOK AT TAPE MOUNTS AND FAILURE RATE OVER A FIXED PERIOD.
! IT CAN BE RUN ON DEMAND AT ANY TIME TO PRODUCE A CURRENT(TO DATE)
! REPORT ON EITHER THE TERMINAL OR THE PRINTER(OR BOTH)
! OR IT CAN BE USED TO AMEND THE TAPE LIBRARY, IE REMOVE
! A TAPE ENTRY OR CLEAR DOWN A DECK ENTRY ETC.
! ***********************************************
! ***********************************************
! ***********************************************
externalroutine jef(string (255) s)
routinespec terminal tape
routinespec printer tape
routinespec terminal disc
routinespec printer disc
routinespec translate smac error(integer i)
routinespec terminal smac
routinespec printer smac
routinespec terminal drum
routinespec printer drum
record (f parm)p
string (32) sumfile,tapefile,discfile,drumfile,smacfile,nowfile
string (15) lpdev; lpdev = "LP"
!--------------------------------------------
!THE TAPE ERROR DISPLAY FORMATS AND DECLARATIONS FOLLOW.
recordformat f tape error(string (8) date,time,stream0,
stream1,t0t3,t4t7,t8t11,transfers,fail lbe,failures,
string (6) media,oper,type, string (2) dev,s0, string (8) t12t15)
record (f tape error)arrayformat af tape error(-19:max unit errors)
record (f tape error)arrayname tape error
record (f tape error)name te
recordformat f deck errors(string (2) deck,integerarray ct(0:2,0:1))
record (f deck errors)arrayformat af deck errors(1:20)
record (f deck errors)arrayname deck errors
record (f deck errors)name de
!THIS ARRAY ENABLES THE PROGRAM TO LINK TABLE ENTRIES WITH TAPE DECKS
!ON THE SYSTEM AND TO TOTAL ERRORS FOR EACH DECK.
!CT COUNTS AS FOLLOWS: 0:2-> READ/WRITE/OTHER, 0:1-> RECOVERED/UNRECVRD
!AND EACH ENTRY IS A COUNT OF AN ERROR ON THE SPECIFIC DECK.
recordformat f tsns(string (6) tsn,integer events)
recordformat f track error(integerarray trk(0:8),
record (f tsns)array tsns(1:100))
record (f track error)arrayformat af track error(1:20)
record (f track error)arrayname sterrors,mterrors
record (f track error)name ste, mte
!THIS ARRAY STRUCTURE DEFINES THE REPORTING OF "SINGLE TRACK ERRORS"
!AS FOLLOWS:
!TRK: TOTALS OF THE ERRORS FOR THIS DECK BY TRACK.
!TSNS: DETAILS OF INDIVIDUAL TAPES IN ERROR ON THAT DECK
!MTE DEFINES A SIMULAR STRUCTURE FOR MULTI TRACK ERRORS.
integer single track errors
integerarrayformat af t f l(1:20,0:1,1:16)
integerarrayname tape fail levels
!1:20 TAPE DECK(FROM TAPE CONTROL)
!0:1 READ OR WRITE
!1:16 TOTAL ERRORS AT THIS LEVEL(16=UNRECOVERED.)
!-------------------------------------------------------
!DECLARATIONS FOR DISC ERROR REPORTING.
recordformat f disc error(string (8) date, time,
(string (8) stream0, stream1, cstatus, fail lbe, s0t2, t3t6,
m0m3, tcount, fcount or string (8) tcb response, fail tcb, s0t3,
t4t7, t8ta, m0m1, m2m5, m6m9), string (4) dev, string (6) media, route,
string (10) cyl inf, string (3) ertype)
record (f disc error)arrayformat af disc error(1:max unit errors)
record (f disc error)arrayname disc error
record (rf)r
owninteger printer lines
owninteger printer page
owninteger printer stream = 2
owninteger out lines
conststring (18) icl dlv="ICL_2900_ENGINEERS"
conststring (18) j dlv="Journal_Management"
integer fsys, i, j, m, flag, errors, epage
string (20) current output,current summary
current output="<Terminal>"
string (32) ss, spdev
string (120) st
switch swx(1:6)
!-------------------------------------------------------
!DECLARATIONS FOR SMAC ERROR REPORTING.
recordformat f smac error(string (1) smac, string (8) date,time,
pointer,address,eng state,status,config,sei param,
string (16) data)
record (f smac error)arrayformat af smac error(1:max unit errors)
record (f smac error)arrayname smac error
!::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
!BOARD/DILIC TRANSLATION TABLES AND VARIABLES.
integer ptr,saddr,data,smac,col,sblock,conf,blk 1 in bu,blk 0 in bu
integer chip type,board,word,bit,ocptype,systype,byte,module,row,pos
integer status,previous status,tline,sub block,hwsmac
previous status=0
string (3) dilic,platter; string (2) unit
owninteger p3 postmultisingle bit mask = x'00000280'
owninteger p4 single bit mask = x'00000280'
owninteger p3 smac error mask = x'000EE3BC'
owninteger p3 smac info mask = x'00F00040'
owninteger p4 smac error mask = x'0000FFFA'
owninteger p4 smac info mask = x'00F30001'
string (60) array translation(1:2)
conststring (24) array p3 smac fail(1:24)= c
"","","A.U.ADDR PAR. FAIL","CONTROL PARITY FAIL","HOLDING FAULT",
"'C' TOGGLE SET","READING FAULT","SINGLE BIT HAMM. FAULT",
"MULTIBIT HAMM. FAULT","POST MULTIBIT FAULT","",
"","","BYTE FUNC. PARITY FAULT","ADDRESS PARITY FAIL",
"BYTE PARITY FAIL","","I.S. NACK","HAMM. CORR. FAIL",
"HAMM. GEN FAIL","PORT 3 FAIL","PORT 2 FAIL","PORT 1 FAIL",
"PORT 0 FAIL"
conststring (29) array p4 smac fail(1:24)= c
"PARITY-PARITY FAIL FLD 2","BU POWER SUPPLY STATUS","",
"CONTROL PARITY FAIL","PORT HOLDING",
"FAIL DURING INTER PROC. COMM.","FAIL DURING SMAC IS.",
"CHECK POSN FAIL",
"MULTI BIT FAIL","SINGLE BIT FAIL,DATA MOD.",
"POWER SUPPLY WARNING","POWER SUPPLY FAULT",
"IMAGE STORE ACCESS FAULT","BYTE FUNC. PARITY FAIL",
"ADDRESS PARITY FAIL","DATA PARITY FAIL","PARITY-PARITY FAIL FLD 1",
"PARITY-PARITY FAIL FLD 0","","","PORT 3 ACCESS FAULT",
"PORT 2 ACCESS FAULT","PORT 1 ACCESS FAULT","PORT 0 ACCESS FAULT"
constbyteintegerarray ham p3 smac(1:72)=64,65,0,66,1,2,3,67,4,5,6,7,
8,9,10,68,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
25,69,26,27,28,29,30,31,32,33,34,35,36,37,38,39,
40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,70,57,
58,59,60,61,62,63,71
constbyteintegerarray bu 0 2970(0:71)= c
2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,
2,4,6,8,10,12,2,4,
2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,
2,4,6,8,10,12,2,4,6,8,10,12,6,8,10,12
constbyteintegerarray bu 1 2970(0:71)= c
1,3,5,7,9,11,1,3,5,7,9,11,1,3,5,7,9,11,1,3,5,7,9,11,
1,3,5,7,9,11,1,3,
1,3,5,7,9,11,1,3,5,7,9,11,1,3,5,7,9,11,1,3,5,7,9,11,
1,3,5,7,9,11,1,3,5,7,9,11,5,7,9,11
constbyteintegerarray au odd 2970(0:71)= c
2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,2,4,6,8,10,12,
2,4,6,8,10,12,2,4,
14,16,18,20,22,24,14,16,18,20,22,24,14,16,18,20,22,24,
14,16,18,20,22,24,14,16,18,20,22,24,14,16,
6,8,10,12,18,20,22,24
constbyteintegerarray au even 2970(0:71)= c
3,5,7,9,11,13,3,5,7,9,11,13,3,5,7,9,11,13,3,5,7,9,11,13,
3,5,7,9,11,13,3,5,
15,17,19,21,23,25,15,17,19,21,23,25,15,17,19,21,23,25,
15,17,19,21,23,25,15,17,19,21,23,25,15,17,
7,9,11,13,19,21,23,25
conststring (3) array dilic 8049(0:95)= c
"B29","D29","F29","H29","B28","D28","F28","H28"," B2",
" D2"," F2"," H2"," B1"," D1"," F1"," H1","B27","D27",
"F27","H27","B26","D26","F26","H26"," B4"," D4"," F4",
" H4"," B3"," D3"," F3"," H3","B25","D25","F25","H25",
"B24","D24","F24","H24"," B6"," D6"," F6"," H6"," B5",
" D5"," F5"," H5"," B3","D23","F23","H23","B22","D22",
"F22","H22"," B8"," D8"," F8"," H8"," B7"," D7"," F7",
" H7","B21","D21","F21","H21","B20","D20","F20","H20",
"B10","D10","F10","H10"," B9"," D9"," F9"," H9","B19",
"D19","F19","H19","B18","D18","F18","H18","B12","D12",
"F12","H12","B11","D11","F11","H11"
conststring (3) array dilic t032(0:95)= c
"C13","D13","E13","F13","C14","D14","E14","F14",
"C15","D15","E15","F15","C16","D16","E16","F16",
"C19","D19","E19","F19","C20","D20","E20","F20",
"C21","D21","E21","F21","C22","D22","E22","F22",
"C23","D23","E23","F23","C24","D24","E24","F24",
"C17","D17","E17","F17","C18","D18","E18","F18",
" C1"," D1"," E1"," F1"," C2"," D2"," E2"," F2",
" C5"," D5"," E5"," F5"," C6"," D6"," E6"," F6",
" C7"," D7"," E7"," F7"," C8"," D8"," E8"," F8",
" C9"," D9"," E9"," F9","C10","D10","E10","F10",
"C11","D11","E11","F11","C12","D12","E12","F12",
" C3"," D3"," E3"," F3"," C4"," D4"," E4"," F4"
constintegerarray bu 0 2980 w01(0:5)=15,17,19,22,24,26
constintegerarray bu 0 2980 w23(0:5)=12,10,8,5,3,1
constintegerarray bu 1 2980 w01(0:5)=14,16,18,21,23,25
constintegerarray bu 1 2980 w23(0:5)=13,11,9,6,4,2
constintegerarray au even 2980 w01(0:5)=15,17,19,21,23,25
constintegerarray au even 2980 w23(0:5)=3,5,7,9,11,13
constintegerarray au odd 2980 w01(0:5)=14,16,18,20,22,24
constintegerarray au odd 2980 w23(0:5)=2,4,6,8,10,12
constintegerarray t col(0:7)=1,5,2,6,3,7,4,8
!USED IN P3(2960) SMAC TRANSLATION TO DILIC.
conststring (1) array tohex(0:15)= c
"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"
!----------------------------------------
!DECLARATIONS FOR DRUM ERROR REPORTING.
recordformat f drum sector(string (8) word1,word2,string (32) desc)
recordformat f drum error(string (8) date,time,
string (6) route,string (4) ertype,
string (8)array stream(0:4),
record (f drum sector)array drum sector(1:8))
record (f drum error)arrayformat af drum error(1:max unit errors)
record (f drum error)arrayname drum error
!-------------------------------------------------------
routine display index
recordformat rf e hd(integer from,to,next)
recordformat rf eng hd(integer first,
record (rf e hd)array entry(1:10))
record (rf eng hd)name eng hd
record (rf)r
integer i, flag
!--------------------------------------------------------
!CODE COMMENCES HERE.
connect("JENGPD_JENGHD",0,0,0,r,flag)
if flag#0 start
printstring("Journal: Engineering file lost??")
newline
printstring(" Contact System Management")
newlines(2)
stop
finish
eng hd==record(r_conad+x'20')
systype=integer(r_conad+x'FC')
systype = S series if systype#P series
ocptype=integer(r_conad+x'100')
ocptype = 0 unless 0<=ocptype<=15
select output(0)
newpage
printsymbol('-') for i=1,1,50
newline
printstring("EMAS ".ocps(ocptype,systype).": Index of On")
printstring("line Engineering Summaries")
newline
i=eng hd_first
printstring("PAGE FROM"); spaces(15); printstring("TO")
newline
cycle
write(i,3)
spaces(3)
printstring(unpackdate(eng hd_entry(i)_from)." ")
printstring(unpacktime(eng hd_entry(i)_from)." ")
printstring(unpackdate(eng hd_entry(i)_to)." ")
printstring(unpacktime(eng hd_entry(i)_to))
newline
exit if eng hd_entry(i)_next=0
i=eng hd_entry(i)_next
repeat
newline
printsymbol('-') for i=1,1,50
newline
disconnect("JENGPD_JENGHD",flag)
return
end ; !OF DISPLAY INDEX.
routine hex to bin(stringname s,integername z)
integer l, ch, bb, xx
xx=1; z=0
l=length(s)
unless 0<l<10 start
printstring("Journal: bad hex string(".S."), ignored!!")
newline
return
finish
cycle bb=1,1,l
ch=byteinteger(addr(s)+bb)-'0'
if ch>x'10' then ch=(ch&x'0F')+x'09'
z=z!(ch<<(4*(l-xx)))
xx=xx+1
repeat
end ; !OF HEX TO BIN
integer limited access; limited access = no
!------------------------------------------
!MAIN INTERACTION CONTROL LOOP CODE FOLLOWS.
!------------------------------------------
connect("JENGPD",0,0,0,r,flag)
if flag # 0 start
!WE ARE PROBABLY NOT IN THE MAIN JOURNL PROCESS.
copy("JOURNL.JENGPD,JENGPD")
connect("JENGPD",0,0,0,r,flag)
printstring("No JEF service.") and newline c
and stop if flag # 0
limited access = yes
finish
disconnect("JENGPD",flag)
epage=block//1024
cycle
display index
current summary="?"
cycle
printstring(current output."<Summary: ".current summary.">")
newline
prompt(": ")
read prompt reply(st)
return if st="STOP" or st="S"
if st="NOW" or st="N" start
if limited access = yes then printstring("Not permitted.") C
and newline and stop
current summary="NOW"
exit
finish
if st="NOWLIST" then current summary=st and exit
if length(st)<=2 start
i = s to i(st)
if 1<=i<=10 then current summary=st and exit
finish
if res str(st,"PRINTER",st)=yes or res str(st,"P",st)=yes start
if st # "" start
if res str(st," ",st)=yes then lpdev = st else c
printstring("??") and newline and continue
finish
if lpdev = "LP" then current output = "<Local Printer>" c
else current output = "<Printer ".lpdev.">"
finish
if st="TERMINAL" or st="T" then current output= c
"<Terminal>"
printstring("Please define Summary required."); newline
repeat
new summary:
if current summary="NOW" or current summary="NOWLIST" start
sumfile="JSUM"; tapefile="JTAPE"; discfile="JDISC"
smacfile="JSMAC"; drumfile="JDRUM"
p_dest=x'FFFF0000'!27
j=dpon3("DIRECT",p,0,1,7)
if j#0 start
printstring("Failure in DIRECT call: ".INTOSTR(FLAG))
newline; return
finish
if p_p1#0 start
printstring("Failure in SPOOLR call: ".INTOSTR(P_P1))
newline; return
finish
i=p_p2>>24
nowfile="".intostr(i)
if length(nowfile)=1 then nowfile="0".nowfile
fsys=i
i=(p_p2<<8)>>8
ss=intostr(i)
cycle
exit if length(ss)=4
ss="0".ss
repeat
nowfile=nowfile.ss
i=dpermission("SPOOLR","JOURNL",date,nowfile,fsys,2,1)
if i#0 start
printstring("DPERMISSION fails: ".INTOSTR(I)." ,sorry!")
newline; return
finish
copy("SPOOLR.".nowfile.",JENGSP")
i=dpermission("SPOOLR","JOURNL",date,nowfile,fsys,3,1)
if i#0 start
printstring("DUNPERMISSION fails: ".intostr(i))
newline
finish
if current summary="NOWLIST" then c
send("JENGSP,.".lpdev) and stop
connect("JENGSP",0,0,0,r,flag)
if flag#0 start
printstring("Current log not available, flag: ".INTOSTR(FLAG))
newline; return
finish
newpage
printstring("Engineering Summary follows for the following period")
newline
printstring(unpackdate(integer(r_conad+x'14'))."(")
printstring(unpacktime(integer(r_conad+x'14')).") to the ")
printstring("present time."); newline
journal analysis("ENGSPECIAL")
finish else start
connect("JENGPD_JSUM".current summary,0,0,0,r,flag)
if flag#0 start
printstring("Journal: summary page lost, check your reply")
newline
printstring(" otherwise contact system manager.")
newlines(2)
return
finish
disconnect("JENGPD_JSUM".current summary,flag)
sumfile="JENGPD_JSUM".current summary
tapefile="JENGPD_JTAPE".current summary
discfile="JENGPD_JDISC".current summary
smacfile="JENGPD_JSMAC".current summary
drumfile="JENGPD_JDRUM".current summary
finish
list(sumfile)
cycle
cycle
newline
printstring(current output."<Summary: ".current summary.">")
newline
prompt(": ")
read prompt reply(st)
if st="INDEX" or st="I" then i=1 and exit
if res str(st,"PRINTER",st)=yes or res str(st,"P",st)=yes start
if st # "" start
if res str(st," ",st)=yes then lpdev = st else c
printstring("??") and newline and continue
finish
if lpdev = "LP" then current output = "<Local Printer>" c
else current output = "<Printer ".lpdev.">"
-> round
finish
if st="TERMINAL" or st="T" then current output= c
"<Terminal>" and -> round
if st="STOP" or st="S" then i=6 and exit
if res str(st,"DISC",ss)=yes then i=2 and exit
if res str(st,"DRUM",ss)=yes then i=3 and exit
if res str(st,"TAPE",ss)=yes then i=4 and exit
if res str(st,"SMAC",ss)=yes then i=5 and exit
if st="NOW" or st="N" start
if limited access = no then i=6 and exit
printstring("Not available.")
newline; stop
finish
if length(st)<=2 start
i = s to i(st)
if 1<=i<=10 then i=6 and exit
finish
printstring("Check your reply!!"); newline
round:
repeat
->swx(i)
swx(1): !RETURN TO THE INDEX
exit
swx(2): !DISC REPORTING REQUIRED
if ss#"" start
if res str(ss," ED",spdev)=yes and length(spdev)=2 c
then spdev="ED".spdev else start
printstring("FORMAT: 'DISC EDXX' for specific reporting.")
newline
->next
finish
finish else spdev="ALL"
outlines=terminal lines+1
if current output="<Terminal>" then terminal disc else c
printer disc
->next
swx(3): !DRUM REPORTING REQUIRED
if ss#"" start
unless res str(ss," ",spdev)=yes and length(spdev)=5 start
printstring("FORMAT: 'DRUM P/T/S' for specific reporting.")
newline
->next
finish
finish else spdev="ALL"
outlines=terminal lines+1
if current output="<Terminal>" then terminal drum else c
printer drum
->next
swx(4): !TAPE REPORTING REQUIRED
if ss#"" start
unless res str(ss," M",spdev)=yes and length(spdev)=2 start
printstring("FORMAT: 'TAPE MXX' for specific reporting.")
newline
->next
finish
finish else spdev="ALL"
outlines=terminal lines+1
if current output="<Terminal>" then terminal tape else c
printer tape
->next
swx(5): !SMAC REPORTING REQUIRED
if ss#"" start
unless res str(ss," ",spdev)=yes and length(spdev)=1 start
printstring("FORMAT: 'SMAC X' for specific reporting.")
newline
->next
finish
finish else spdev="ALL"
outlines=terminal lines+1
if current output="<Terminal>" then terminal smac else c
printer smac
->next
swx(6): !STOP OR ANOTHER SUMMARY
if current summary="NOW" start
destroy("JSUM",flag);destroy("JTAPE",flag)
destroy("JDISC",flag);destroy("JSMAC",flag)
destroy("JENGSP",flag);destroy("JDRUM",flag)
finish
return if st="STOP" or st="S"
current summary=st
current summary="NOW" if current summary="N"
->new summary
next:
repeat
repeat
!-------------------------------
!END OF INTERACTION CONTROL LOOP
!-------------------------------
!*******************************************************
! A REPORT ON TAPE ERRORS TO BE GIVEN ON THE TERMINAL.
!*******************************************************
routine terminal tape
integer start, i, j, k
select output(0)
connect(tapefile,0,0,0,r,flag)
if flag#0 start
printstring("Tape summary file lost, sorry")
newlines(2)
return
finish
tape error==array(r_conad+x'cd90',af tape error)
deck errors==array(r_conad+x'40',afdeck errors)
tape fail levels==array(r_conad+x'c390',af tfl)
mterrors==array(r_conad+x'6300',af track error)
sterrors==array(r_conad+x'270',af track error)
errors=integer(r_conad+x'1C')
single track errors=integer(r_conad+x'10')
if errors=0 and single track errors=0 start
printstring("No tape errors recorded in this period.")
newlines(2)
return
finish
if errors=0 then ->skipmtt
start=0
for i=1,1,errors cycle
te == tape error(i)
if spdev="ALL" or spdev=te_dev start
if out lines>=terminal lines start
if start#0 start
cycle
prompt("CONTINUE:")
read prompt reply(st)
exit if res str(st,"Y",ss)=yes or res str(st,"N",ss)=yes
repeat
if res str(st,"N",ss)=yes start
newline
printstring("Chonological summary terminated,")
printstring(" Deck summary follows.")
newline
->skipmtt
finish
finish else start=1
newpage
out lines=4
printstring(" DATE TIME DEV MEDIA OP LVL STREAMR0 STREAMR1")
printstring(" S0T0T1T2T3T4T5T6T7T8T91011121314")
newline
printsymbol('-') for j=1,1,80
newlines(2)
finish
st=te_date
length(st)=length(st)-3
st=st." ".te_time
length(st)=length(st)-3
st=st." M".te_dev." ".te_media." "
j=length(st)
st=st.te_oper
length(st)=j+2
j=length(st)
st=st." ".te_type
length(st)=j+3
st=st." ".te_stream0." ".te_stream1
st=st." ".te_s0.te_t0t3.te_t4t7
st=st.te_t8t11.te_t12t15
length(st)=length(st)-2; ! Omit MG byte (gives deck type) - no space.
printstring(st)
newline
out lines=out lines+1
finish
repeat
printstring("Chronological summary completed, deck summary follows")
newline
skipmtt:
for j=1,1,20 cycle
de == deck errors(j)
ste == st errors(j)
mte == mt errors(j)
exit if de_deck=""
!IE ALL DECKS REPORTED ON
if de_deck=spdev or spdev="ALL" start
cycle
prompt("CONTINUE:")
read prompt reply(st)
exit if res str(st,"Y",ss)=yes or res str(st,"N",ss)=yes
repeat
if res str(st,"N",ss)=yes start
printstring("Summary terminated.")
newlines(2)
return
finish
newpage
printstring("Summary for tape deck: M".de_deck)
spaces(45)
newline
printstring("Total errors(read/write/other)")
printstring(" rcvd(".INTOSTR(DECK ERRORS(J)_CT(0,0)))
printstring("/".intostr(de_ct(1,0)))
printstring("/".intostr(de_ct(2,0)).")")
printstring(" unrcvd(".intostr(de_ct(0,1)))
printstring("/".intostr(de_ct(1,1))."/")
printstring(intostr(de_ct(2,1)).")")
newline
printstring("Level: 1 2 3 4 5 6 7 8 9 10")
printstring(" 11 12 13 14 15 UNR")
newline
printsymbol('-') for k=1,1,71
newline
printstring("Read: ")
for k=1,1,16 cycle
write(tape fail levels(j,0,k),3)
repeat
newline
printstring("Write: ")
for k=1,1,8 cycle
write(tape fail levels(j,1,k),3)
repeat
spaces(28); write(tape fail levels(j,1,16),3)
newline
printstring("Track errors: trk28 trk27 trk26 trk25 trk24 trk23")
printstring(" trk22 trk21 trk20")
newline
printsymbol('-') for i=1,1,67
newline
printstring("Single: ")
for i=8,-1,0 cycle
write(ste_trk(i),5)
repeat
newline
printstring("Multi: ")
for i=8,-1,0 cycle
write(mte_trk(i),5)
repeat
newlines(2)
printstring("MTE tape errors: ")
k=-1
for i=1,1,100 cycle
exit if mte_tsns(i)_tsn=""
if k=0 then newline and spaces(17)
k=0 if k=-1
k=k+1
st=" ".mte_tsns(i)_tsn."("
st=st.intostr(mte_tsns(i)_events).")"
printstring(st); spaces(12-length(st))
if k=4 then k=0
if i=10 start
printstring("**See printer analysis**")
exit
finish
repeat
newline
printstring("STE tape errors: ")
k=-1
for i=1,1,100 cycle
exit if ste_tsns(i)_tsn=""
if k=0 then newline and spaces(17)
k=0 if k=-1
k=k+1
st=" ".ste_tsns(i)_tsn."("
st=st.intostr(ste_tsns(i)_events).")"
printstring(st); spaces(12-length(st))
if k=4 then k=0
if i=10 start
printstring("**See printer analysis**")
exit
finish
repeat
newline
finish
repeat
printstring("Summaries completed."); NEWLINE
return
end ; !OF ROUTINE TERMINAL TAPE
!***************************************************
!A REPORT ON TAPE ERRORS TO BE SENT TO THE PRINTER.
!***************************************************
routine printer tape
integer winteger, j, k, l
string (16) wstring1
connect(tapefile,0,0,0,r,flag)
if flag#0 start
printstring("Tape error report lost, sorry!")
newline
return
finish
tape error==array(r_conad+x'cd90',af tape error)
deck errors==array(r_conad+x'40', af deck errors)
tape fail levels==array(r_conad+x'c390',af tfl)
mterrors==array(r_conad+x'6300',af track error)
sterrors==array(r_conad+x'270',af track error)
errors=integer(r_conad+x'1C')
single track errors=integer(r_conad+x'10')
if errors=0 and single track errors=0 start
printstring("No tape errors recorded")
newline
return
finish
define("STREAM".intostr(printer stream).",JLP")
select output(printer stream)
printer lines=50
printer page=1
if errors=0 then ->skipmtp
for j=1,1,errors cycle
if printer lines=50 start
printer lines=0
newpage
printstring("EMAS ".ocps(ocptype,systype)." Tape Error Report Page:")
write(printer page,2)
printer page=printer page+1
newlines(2)
printstring(" DATE TIME DEV MEDIA OP. FAIL")
printstring(" LVL SINCE LAST IPL STREAM RESPONSE--")
printstring(" STREAM STATUS:"); spaces(17)
printstring("FAILED")
newline; spaces(48)
printstring("TRNSFERS/FAILS WORD 0 WORD 1 S0 ")
printstring("T0T1T2T3 T4T5T6T7 T8T91011 121314MG LBE")
newline
printsymbol('-') for k=1,1,130
newlines(2)
finish
te == tape error(j)
printstring(te_date." ".te_time)
printstring(" M".te_dev." ".te_media)
printstring(" ".te_oper)
if te_oper="READ" then spaces(1)
printstring(" ".te_type)
hex to bin(te_failures,winteger)
winteger=winteger&x'0000FFFF'
write(winteger,3)
hex to bin(te_transfers,winteger)
wstring1=intostr(winteger)
hex to bin(te_failures,winteger)
winteger=winteger>>16
wstring1=wstring1."/".intostr(winteger)
spaces(16-length(wstring1))
printstring(wstring1." ")
printstring(te_stream0." ".te_stream1)
printstring(" ".te_s0." ".te_t0t3)
printstring(" ".te_t4t7." ".te_t8t11)
printstring(" ".te_t12t15." ".te_fail lbe)
newlines(2)
printer lines=printer lines+2
repeat
skipmtp:
for j=1,1,20 cycle
de == deck errors(j)
exit if de_deck=""
!No more decks to report failures on
newpage
printstring("EMAS ".ocps(ocptype,systype).": Error report for tape deck: M")
printstring(de_deck)
newlines(3)
!FIRSTLY REPORT ON SINGLE TRACK ERRORS FOR THIS DECK.
printstring("Single track error summary:")
newline
printstring("Total recoveries per track:")
spaces(32)
printstring("Tapes in error(failure count):")
newline
printstring(" TRK28 TRK27 TRK26 TRK25 TRK24 TRK23 TRK22 ")
printstring("TRK21 TRK20 TAPE(FAILS) TAPE(FAILS) ")
printstring("TAPE(FAILS) TAPE(FAILS) TAPE(FAILS)")
newline
printsymbol('-') for k=1,1,120
newlines(2)
ste == st errors(j)
for l=8,-1,0 cycle
write(ste_trk(l),5)
repeat
m=0; spaces(2)
for l=1,1,100 cycle
exit if ste_tsns(l)_tsn=""
m=m+1
s=" ".ste_tsns(l)_tsn."("
s=s.intostr(ste_tsns(l)_events).")"
printstring(s);spaces(13-length(s))
if m=5 start
m=0; newline
spaces(56)
finish
repeat
newlines(4)
printstring("Multi track error summary:")
newline
printstring("Total failures per track:")
spaces(34)
printstring("Tapes in error(failure count):")
newline
printstring(" TRK28 TRK27 TRK26 TRK25 TRK24 TRK23 TRK22 ")
printstring("TRK21 TRK20 TAPE(FAILS) TAPE(FAILS) ")
printstring("TAPE(FAILS) TAPE(FAILS) TAPE(FAILS)")
newline
printsymbol('-') for k=1,1,120
newlines(2)
mte == mt errors(j)
for l=8,-1,0 cycle
write(mte_trk(l),5)
repeat
m=0; spaces(2)
for l=1,1,100 cycle
exit if mte_tsns(l)_tsn=""
m=m+1
s=" ".mte_tsns(l)_tsn."("
s=s.intostr(mte_tsns(l)_events).")"
printstring(s); spaces(13-length(s))
if m=5 start
m=0; newline
spaces(56)
finish
repeat
newlines(4)
printstring( "Breakdown of errors on this deck:")
newlines(2)
spaces(16)
printstring(" READ WRITE OTHER")
newline; spaces(16)
printstring("----------------------")
newlines(2); printstring("RECOVERED :"); spaces(5)
write(de_ct(0,0),5); spaces(2)
write(de_ct(1,0),5); spaces(2)
write(de_ct(2,0),5)
newlines(2)
printstring("UNRECOVERED :"); spaces(3)
write(de_ct(0,1),5); spaces(2)
write(de_ct(1,1),5); spaces(2)
write(de_ct(2,1),5)
newlines(2)
newlines(3)
printstring(" RECOVERY ")
printstring("LEVEL: 1 2 3 4 5 6 ")
printstring("7 8")
printstring(" 9 10 11 12 13 ")
printstring("14 15 UNRECOVERED")
newline
printsymbol('-') for k=1,1,123
newlines(2)
printstring("Total read fails: ")
for k=1,1,15 cycle
write(tape fail levels(j,0,k),5)
repeat
spaces(7); write(tape fail levels(j,0,16),5)
newlines(2)
printstring("Total write fails: ")
for k=1,1,8 cycle
write(tape fail levels(j,1,k),5)
repeat
spaces(49); write(tape fail levels(j,1,16),5)
newlines(3)
printstring("End of report for deck M".de_deck)
newlines(2)
repeat
newpage
select output(0)
close stream(printer stream)
deliver(icl dlv)
send("JLP,.".lpdev)
deliver(j dlv)
end ; !OF ROUTINE PRINTER TAPE
!****************************************************
!A REPORT ON DISC ERRORS TO BE GIVEN ON THE TERMINAL.
!****************************************************
routine terminal disc
integer i, j
record (f disc error)name de
connect(discfile,0,0,0,r,flag)
if flag#0 start
printstring("Disc error report lost, sorry.")
newlines(2)
return
finish
errors=integer(r_conad+x'1C')
if errors=0 start
printstring("No disc errors recorded.")
newlines(2)
return
finish
disc error==array(r_conad+x'40',af disc error)
for i=1,1,errors cycle
de == disc error(i)
if spdev="ALL" or spdev=de_dev start
if outlines>=terminal lines start
if out lines=terminal lines start
cycle
prompt("Continue:")
read prompt reply(st)
exit if res str(st,"Y",ss)=yes or res str(st,"N",ss)=yes
repeat
if res str(st,"N",ss)=yes start
printstring("Summary terminated.")
newline
return
finish
finish
newpage
if systype=P series start ; ! P Series heading.
printstring("TIME UNIT MEDIA ROUTE STREAMR0 STREAMR1 SEEK INF")
printstring(" S0T0T1T2T3T4T5T6 ")
newline
printsymbol('-') for j=1,1,70
finishelsestart ; ! S Series heading
printstring("Time Unit Media Route Seek Inf S0T1T2T3T4T5T6T7T8T9TA")
printstring(" M0M1M2M3M4M5 M6M7M8M9")
newline
printsymbol('-') for j=1,1,80
finish
newlines(2)
out lines=4
finish
st=de_time
length(st)=length(st)-3
st=st." ".de_dev." ".de_media
printstring(st)
if de_ertype="???" then c
printstring("****Record lost****") else start
if systype=P series start
st=" ".de_route." ".de_stream0." ".de_stream1
if de_cyl inf="" then st=st." " else c
st=st." ".de_cyl inf
if de_ertype="BDS" then st=st."?" else st=st." "
st=st.de_s0t2.de_t3t6
printstring(st)
finishelsestart ; ! S series
printstring(" ".de_route." ".de_cyl inf." ")
printstring(de_s0t3.de_t4t7.de_t8ta." ")
printstring(de_m0m1.de_m2m5." ".de_m6m9)
finish
finish
newline
outlines=out lines+1
finish
repeat
printstring("Summary completed.")
newline
return
end ; !OF ROUTINE TERMINAL DISC
!**************************************************
!A REPORT OF DISC ERRORS TO BE SENT TO THE PRINTER.
!**************************************************
routine printer disc
integer i, j
record (f disc error)name de
connect(discfile,0,0,0,r,flag)
if flag#0 start
printstring("Disc error report lost, sorry!")
newline
return
finish
disc error==array(r_conad+x'40',af disc error)
errors=integer(r_conad+x'1C')
if errors=0 start
printstring("No disc errors recorded.")
newline
return
finish
define("STREAM".intostr(printer stream).",JLP")
select output(printer stream)
printer lines=50
printer page=1
for j=1,1,errors cycle
! Look at each disc error.
de == disc error(j)
if printer lines=50 start
newpage
printstring("EMAS ".ocps(ocptype,systype)." Disc Error Report Page:")
write(printer page,1)
printer page=printer page+1
printer lines=0
newlines(2)
if systype=P series start
printstring(" DATE TIME UNIT MEDIA ROUTE STATI")
printstring("STICS STREAM---RESPONSE CONTROLR STREAM")
printstring(" STATUS: FAILED SEEK INF")
newline
spaces(32)
printstring(" P/T/S TRNSFRS/FAILS 0 1 ")
printstring("STATUS S0T0T1T2 T3T4T5T6 M0M1M2M3")
printstring(" LBE CCCCHHHHRR")
newline
printsymbol('-') for i=1,1,132
finishelsestart ; ! S series heading.
printstring(" Date Time Unit Media Route TCB Device Status")
spaces(39); printstring("Failed Seek info")
newline; spaces(32)
printstring("DCU/SS Response S0T1T2T3 T4T5T6T7 T8T9TA ")
printstring(" M0M1 M2M3M4M5 M6M7M8M9 TCB CCCCHHHHSS")
printsymbol('-') for i=1,1,121
finish
newlines(2)
finish
printstring(de_date." ".de_time)
printstring(" ".de_dev." ".de_media)
if de_ertype="???" then c
printstring(" ******Record lost******") else start
printstring(" ".de_route)
if systype=P series start
st=de_tcount."/".de_fcount
spaces(14-length(st))
printstring(st)
spaces(2)
printstring(de_stream0." ".de_stream1)
printstring(" ".de_cstatus." ")
if de_ertype="BDS" then printstring("?") else printstring(" ")
printstring(de_s0t2)
printstring(" ".de_t3t6." ".de_m0m3)
printstring(" ".de_faillbe." ")
printstring(de_cyl inf)
finishelsestart ; ! S series.
printstring(" ".de_tcb response." ")
printstring(de_s0t3." ".de_t4t7." ".de_t8ta)
printstring(" ".de_m0m1." ".de_m2m5." ".de_m6m9)
printstring(" ".de_fail tcb." ".de_cyl inf)
finish
finish
newline
printer lines=printer lines+1
repeat
newpage
select output(0)
close stream(printer stream)
deliver(icl dlv)
send("JLP,.".lpdev)
deliver(j dlv)
end ; !OF ROUTINE PRINTER DISC
!***********************************************************************
!ROUTINE TO TRANSLATE THE GIVEN SMAC ERROR FOR ALL SMAC/PROCESSOR TYPES.
!***********************************************************************
routine translate smac error(integer i)
!HERE THE ROUTINE TAKES THE SUPPLIED INFORMATION AND TRANSLATES
!IT FOR THE ENGINEERS.
switch ocp(0:15)
integer j,int,count,d bit,d byte,d word,substatus
board=0
dilic=""
platter=" "
unit=" "
return unless 0<=ocptype<=15
->ocp(ocptype)
ocp(0):
ocp(1): return
ocp(2):
ocp(3):
!CODE FOR THE P3 SMAC.
!RELEVANT TO 2970(1/4/16K CHIPS) ,2972(16K) ,2982(16K) ,2960(1/4K)
hex to bin(smac error(i)_pointer,ptr)
ptr=ptr>>25
hex to bin(smac error(i)_address,saddr)
smac=(saddr<<6)>>28
hex to bin(smac error(i)_config,conf)
if chip type=-1 start
!RETURN WITH CHIP TYPE ONLY.
chip type=(conf<<7)>>31
return
finish
if conf=0 then dilic="" and return
chip type=(conf<<7)>>31
hex to bin(smac error(i)_status,status)
substatus=status&p3 smac error mask
translation(1)=""; tline=0
if status=previous status then ->p3 skip tran
tline=1; int=1
for j=1,1,24 cycle
if substatus&int#0 start
if length(translation(tline))+length(p3 smac fail(j))>60 c
start
tline=tline+1
if tline>2 then translation(2)=translation(2)."...etc." c
and exit
translation(tline)=""
finish
translation(tline)=translation(tline)." / " unless c
translation(tline)=""
translation(tline)=translation(tline).p3 smac fail(j)
finish
int=int<<1
repeat
if tline<3 start
substatus=status&p3 smac info mask
int=1
for j=1,1,24 cycle
if substatus &int#0 start
if length(translation(tline))+length(p3 smac fail(j))>60 c
start
tline=tline+1
if tline>2 then translation(2)=translation(2)."...etc." c
and exit
translation(tline)=""
finish
translation(tline)=translation(tline)." / " unless c
translation(tline)=""
translation(tline)=translation(tline).p3 smac fail(j)
finish
int=int<<1
repeat
finish
tline=2 if tline>2
previous status=status
p3 skip tran:
if status & p3 postmultisingle bit mask=0 then return
if ocptype=2 and chip type=0 start
!2960 PROCESSOR WITH 1/4K CHIPS.
sblock=(saddr<<11)>>28
sub block=(saddr<<15)>>31
col=(saddr<<16)>>29
dilic="???"
return if ptr>72
data=ham p3 smac(ptr)
pos=0
if 63<data<68 then pos=6 and board=data-61
if 67<data<72 then pos=6 and board=data-59
if pos=0 start
if data>=32 then data=data-32 and board=6 else board=0
pos=(data//6)+1
board=(board+1+data-(data//6)*6)
finish
if (sblock//2)*2=sblock then board=(board*2)+1 c
else board=board*2
bit=(pos-1)*8 + t col(col)
if sub block=1 then bit=bit+48
dilic=" ".intostr(bit)
if length(dilic)=2 then dilic=" ".dilic
return
finish
!OTHERWISE WE HAVE A 2970(1/4/16K CHIP),2972(16 K) ,2960(16K),2982(16K)SITUATION
if chip type=1 start
!IE 16K CHIPS.
pos=0; module=0
if ptr>71 then dilic="???" and return
data=ham p3 smac(ptr)
module=(saddr<<10)>>29
row=(saddr<<13)>>30
if 0<=data<24 start
pos=0
if 11<data then bit=data-12 else bit=data+12
finish
if 23<data<44 start
pos=1
if 31<data then bit=data-32
if data<32 then bit=data-12
finish
if 63<data<68 start
pos=1
bit=data-44
finish
if 43<data<64 start
pos=2
if 55<data then bit=data-56
if data<56 then bit=data-32
finish
if 67<data<72 start
pos=2
bit=data-60
finish
pos=(2+(pos*8)+module)
dilic=dilic t032((bit*4)+row)
hex to bin(smac error(i)_eng state,hwsmac)
hwsmac=(hwsmac<<8)>>28
return
finish
if chip type=0 start
!1 K AND 4 K CHIPS.
if ptr>72 then dilic="???" and return
sblock=(saddr<<11)>>28
col=(saddr<<15)>>28
blk 1 in bu=(conf&x'02')>>1
blk 0 in bu=conf&x'01'
data=ham p3 smac(ptr)
if (sblock=0 and blk 0 in bu=1) or c
(sblock=1 and blk 1 in bu=1) start
!WE ARE DEALING WITH STORE IN BASIC UNIT.
unit="BU"
if sblock=0 then board=bu 0 2970(data) else c
board=bu 1 2970(data)
finish else start
!DEALING WITH STORE IN ADDITIONAL UNIT
unit="AU"
if (sblock//2)*2=sblock then board=au even 2970(data) c
else board=au odd 2970(data)
finish
if data>=64 then bit=5 else start
if data>31 then data=data-32
bit=data//6
finish
dilic=dilic 8049((bit*16)+col)
finish
return
ocp(4):
!P4 SMAC WITH 1K/4K CHIPS(2980)
if chip type=-1 then chip type=0 and return
!ASSUME NO 16K CHIPS ON P4 SMAC(2980)
hex to bin(smac error(i)_pointer,ptr)
hex to bin(smac error(i)_address,saddr)
hex to bin(smac error(i)_config,conf)
hex to bin(smac error(i)_status,status)
substatus=status&p4 smac error mask
translation(1)=""; tline=0
if status=previous status then ->p4 skip tran
tline=1; int=1
for j=1,1,24 cycle
if substatus&int#0 start
if length(translation(tline))+length(p4 smac fail(j))>60 c
start
tline=tline+1
if tline>2 then translation(2)=translation(2)."...etc." c
and exit
translation(tline)=""
finish
translation(tline)=translation(tline)." / " unless c
translation(tline)=""
translation(tline)=translation(tline).p4 smac fail(j)
finish
int=int<<1
repeat
if tline<3 start
substatus=status&p4 smac info mask
int=1
for j=1,1,24 cycle
if substatus &int#0 start
if length(translation(tline))+length(p4 smac fail(j))>60 c
start
tline=tline+1
if tline>2 then translation(2)=translation(2)."...etc." c
and exit
translation(tline)=""
finish
translation(tline)=translation(tline)." / " unless c
translation(tline)=""
translation(tline)=translation(tline).p4 smac fail(j)
finish
int=int<<1
repeat
finish
tline=2 if tline>2
previous status=status
p4 skip tran:
if status & p4 single bit mask=0 then return
d bit=ptr>>24
d byte=(ptr<<8)>>28
d word=(ptr<<12)>>28
int=ptr>>16
count=0
ptr=1
for j=0,1,15 cycle
if int&ptr#0 then count=count+1
ptr=ptr<<1
repeat
word=0;ptr=1
for j=0,1,3 cycle
if d word&ptr#0 then word =word+(3-j) and exit
ptr=ptr<<1
repeat
byte=0; ptr=1
for j=0,1,3 cycle
if dbyte&ptr#0 then byte=byte+(3-j) and exit
ptr=ptr<<1
repeat
bit=0; ptr=1
for j=0,1,7 cycle
if dbit&ptr#0 then bit=bit+(7-j) and exit
ptr=ptr<<1
repeat
sblock=(saddr<<10)>>28
blk 1 in bu=(conf<<2)>>31
blk 0 in bu=(conf<<1)>>31
if (count=3 and dbit#0 and dbyte#0 and dword#0) start
!WE HAVE A SINGLE BIT FAILURE.
!FOR THE MOMENT ASSUME 1 OR 4K CHIPS
chip type=0
data=byte<<3+bit
bit=data//6; col=data-(6*bit)
if sblock=0 and blk 0 in bu=1 start
unit="BU"
if word<2 then board=bu 0 2980 w01(col) c
else board=bu 0 2980 w23(col)
if word=1 or word=3 then platter="3" else platter="2"
if word=2 or word=3 then platter=" 1".platter else c
platter=" 2".platter
->dlc4
finish
if sblock=1 and blk 1 in bu=1 start
unit="BU"
if word<2 then board=bu 1 2980 w01(col) c
else board=bu 1 2980 w23(col)
if word=1 or word=3 then platter="3" else platter="2"
if word=2 or word=3 then platter=" 1".platter else c
platter=" 2".platter
->dlc4
finish
if (sblock//2)*2=sblock start
if word<2 then board=au even 2980 w01(col) c
else board=au even 2980 w23(col)
finish else start
if word<2 then board=au odd 2980 w01(col) c
else board=au odd 2980 w23(col)
finish
unit="AU"
if word=1 or word=3 then platter="LOW" else platter="UPP"
dlc4:
col=(saddr<<14)>>28
dilic=dilic 8049((bit*16)+col)
return
finish
if count=1 start
!PARITY ERROR.
unit="BU"
sblock=0
if d bit#0 start
if bit<4 then word=2 else word=3 and bit=bit-4
finish
if d byte#0 then word=1
if d word#0 then word=0
col=(2+bit)
bit=5
if word<2 then board=bu 0 2980 w01(col) else c
board=bu 0 2980 w23(col)
if word=1 or word=3 then platter="3" else platter="2"
if word=2 or word=3 then platter=" 1".platter else c
platter=" 2".platter
col=(saddr<<14)>>28
dilic=dilic 8049((bit*16)+col)
return
finish
dilic="???"; !IT MUST BE A STRANGE FAILURE.
return
ocp(5):
ocp(6):
!P3 SMAC AND 16K CHIPS BASIC ON THE 2972.
->ocp(3)
ocp(7):
ocp(8):
ocp(9):
ocp(10):
ocp(11):
ocp(12):
ocp(13):
ocp(14):
ocp(15):
return
end ; !OF ROUTINE TRANSLATE SMAC ERROR.
!*****************************************************************
!A REPORT ON SMAC ERRORS TO BE PRINTED ON THE ENGINEER'S TERMINAL.
!*****************************************************************
routine terminal smac
integer i, j, k
record (f smac error)name sei
connect(smacfile,0,0,0,r,flag)
if flag#0 start
printstring("Smac error report lost, sorry")
newlines(2)
return
finish
smac error==array(r_conad+x'40',af smac error)
errors=integer(r_conad+x'1C')
if errors=0 start
printstring("No smac errors recorded.")
newlines(2)
return
finish
i=1
chip type=-1; translate smac error(i)
for i=1,1,errors cycle
continue unless spdev="ALL" or spdev=sei_smac
sei == smac error(i)
if outlines>=terminal lines start
if out lines=terminal lines start
cycle
prompt("CONTINUE:")
read prompt reply(st)
exit if res str(st,"Y",ss)=yes or res str(st,"N",ss)=yes
repeat
if res str(st,"N",ss)=yes start
printstring("Summary terminated")
newline
return
finish
finish
newpage
printstring("DT TIME SMAC ADDRESS PARITY ")
printstring(" STATUS CONFIG SEIPARAM ")
if chip type=0 then printstring("BLK BD PLT DLC") else c
printstring("MOD POS DLC NS")
newline
printsymbol('-') for j=1,1,72
newlines(2)
out lines=4
previous status=0
finish
translate smac error(i)
st=sei_date; length(st)=length(st)-6
st=st." ".sei_time;length(st)=length(st)-3
st=st." ".sei_smac
st=st." ".sei_address
st=st." ".sei_pointer." "
st=st.sei_status." ".sei_config." "
st=st.sei_sei param
printstring(st)
if dilic#"" start
if chip type=0 start
write(sblock,2); printstring(unit);write(board,2)
printstring(" ".platter); printstring(" ".dilic)
finish else start
!16K CHIPS
write(module,3); write(pos,3)
printstring(" ".dilic." ".tohex(hwsmac))
finish
finish
newline
out lines=out lines+1
for k=1,1,tline cycle
spaces(8)
printstring(translation(k)); newline
outlines=outlines+1
repeat
outlines = terminal lines if outlines>terminal lines
repeat
printstring("Summary completed")
newline
end ; !OF ROUTINE TERMINAL SMAC
!*******************************************************
!A REPORT ON SMAC ERRORS TO BE SENT TO THE LINE PRINTER.
!*******************************************************
routine printer smac
integer i, k
record (f smac error)name sei
connect(smacfile,0,0,0,r,flag)
if flag#0 start
printstring("Smac error report lost, sorry!")
newline
return
finish
smac error==array(r_conad+x'40',af smac error)
errors=integer(r_conad+x'1C')
if errors=0 start
select output(0)
printstring("No smac errors recorded.")
newline
return
finish
define("STREAM".intostr(printer stream).",JLP")
select output(printer stream)
printer lines=50
printer page=1
i=1
chip type=-1; translate smac error(i)
for i=1,1,errors cycle
sei == smac error(i)
if printer lines>=50 start
newpage
printstring("EMAS ".ocps(ocptype,systype)." SMAC error")
printstring(" Page: ")
write(printer page,3)
printer page=printer page+1
printer lines=0
newline
printstring(" DATE TIME SMAC PARITY ")
printstring(" ADDRESS ENG STATE STATUS CONFIG")
printstring(" SEI PARAM DATA")
spaces(11)
if chip type=0 then printstring("BLOCK BRD PLAT DILIC") else c
printstring("MODULE POSITN DILIC NSMAC")
newline
printsymbol('-') for k=1,1,131
newlines(2)
previous status=0
finish
translate smac error(i)
spaces(1)
printstring(sei_date." ".sei_time)
spaces(5)
printstring(sei_smac." ".sei_pointer)
printstring(" ".sei_address." ")
printstring(sei_eng state." ")
printstring(sei_status." ".sei_config)
printstring(" ".sei_sei param)
printstring(" ".sei_data)
if dilic#"" start
if chip type=0 start
write(sblock,3)
printstring(unit); write(board,3)
printstring(" ".platter." ".dilic)
finish else start
write(module,5)
write(pos,6); printstring(" ".dilic." ".tohex(hwsmac))
finish
finish
newline
for k=1,1,tline cycle
spaces(30)
printstring(translation(k))
newline
printer lines=printer lines+1
repeat
newline
printer lines=printer lines+2
repeat
newpage
select output(0)
close stream(printer stream)
deliver(icl dlv)
send("JLP,.".lpdev)
deliver(j dlv)
end ; !OF ROUTINE PRINTER SMAC
!****************************************************
!A REPORT OF DRUM ERRORS TO BE GIVEN ON THE TERMINAL.
!****************************************************
routine terminal drum
integer srnh, i, j
record (f drum error)name dei
outlines=-1
connect(drumfile,0,0,0,r,flag)
if flag#0 start
printstring("Drum error report lost, sorry")
newline
return
finish
errors=integer(r_conad+x'1C')
if errors=0 start
printstring("No drum errors recorded.")
newline
return
finish
drum error==array(r_conad+x'40',af drum error)
for i=1,1,errors cycle
continue unless spdev="ALL" or spdev=drum error(i)_route
dei == drum error(i)
if out lines>terminal lines-epage or outlines=-1 start
if outlines#-1 start
cycle
prompt("CONTINUE:")
read prompt reply(st)
exit if res str(st,"Y",ss)=yes or res str(st,"N",ss)=yes
repeat
if res str(st,"N",ss)=yes start
printstring("Summary terminated.")
newline
return
finish
finish
newpage
printstring("DATE TIME ROUTE ERR STREAM 0 STREAM 1 STREAM 2")
printstring(" STREAM 3 STREAM 4 "); newline
printsymbol('-') for j=1,1,67
newline
out lines=3
finish
st=dei_date; length(st)=length(st)-3
st=st." ".dei_time; length(st)=length(st)-3
st=st." ".dei_route." "
st=st.dei_ertype
srnh=0
for j=1,1,epage cycle
if dei_drum sector(j)_word1="00040008" then c
srnh=1 else start
if dei_drum sector(j)_word1#"00800000" then c
srnh=0 and exit
finish
repeat
if srnh=1 start
printstring(st." Service request not honoured.")
newline
outlines=outlines+1
finish else start
for j=0,1,4 cycle
st=st." ".dei_stream(j)
repeat
printstring(st)
for j=1,1,epage cycle
newline
spaces(12); printstring("Sector: ")
printstring(dei_drum sector(j)_word1)
printstring(" ".dei_drum sector(j)_word2)
printstring(" ".dei_drum sector(j)_desc)
repeat
newlines(2)
out lines=out lines+epage+2
finish
repeat
printstring("Summary completed.")
newline
return
end ; !OF ROUTINE TERMINAL DRUM
!**************************************************
!A REPORT OF DRUM ERRORS TO BE SENT TO THE PRINTER.
!**************************************************
routine printer drum
integer i, j
record (f drum error)name dej
connect(drumfile,0,0,0,r,flag)
if flag#0 start
printstring("Drum error report lost, sorry!")
newline
return
finish
drum error==array(r_conad+x'40',af drum error)
errors=integer(r_conad+x'1C')
if errors=0 start
printstring("No drum errors recorded")
newline
return
finish
define("STREAM".intostr(printer stream).",JLP")
select output(printer stream)
printer lines=57
printer page=1
for j=1,1,errors cycle
dej == drum error(j)
if printer lines>=56 start
newpage
printstring("EMAS ".ocps(ocptype,systype)." Drum error report page:")
write(printer page,3)
printer page=printer page+1
printer lines=0
newlines(2)
spaces(19)
printstring("Port/"); SPACES(55)
printstring("SECTOR DESCRIPTION (one per 1 K byte sector)")
newline
spaces(19)
printstring("Trunk/ Err Controller status")
printsymbol('-') for i=1,1,27
printstring(" -Stream response-"); newline
printstring(" Date Time Mechnsm Type Word 0")
printstring(" Word 1 Word 2 Word 3 Word 4 ")
printstring("Word 0 Word 1 Breakdown")
newline
printsymbol('-') for i=1,1,130
newlines(2)
finish
spaces(1)
if dej_ertype="??" start
printstring("********Record lost*********")
printer lines=printer lines+2
finish else start
printstring(dej_date." ".dej_time)
spaces(9-length(dej_route))
printstring(dej_route." ".dej_ertype)
for i=0,1,4 cycle
printstring(" ".dej_stream(i))
repeat
for i=1,1,epage cycle
if i#1 then newline and spaces(78)
printstring(" ".dej_drum sector(i)_word1)
printstring(" ".dej_drum sector(i)_word2)
printstring(" ".dej_drum sector(i)_desc)
repeat
printer lines=printer lines+epage+2
finish
newlines(2)
repeat
newpage
select output(0)
close stream(printer stream)
deliver(icl dlv)
send("JLP,.".lpdev)
deliver(j dlv)
end ; !OF ROUTINE PRINTER DRUM
end ; !OF EXTERNAL ROUTINE JEF
! ***********************************************
! ***********************************************
externalroutine jefrecall(string (255) st)
st="ENGCALL"
journal analysis(st)
end ; !OF EXTERNAL ROUTINE MAINLOG SUMMARY
!***********************************************
!***************************************************
!***************************************************
externalroutine update jef(string (255) st)
st="EXTERNAL,OVERRIDE"
journal(st)
end
! ******************************************************
! ******************************************************
! ******************************************************
externalroutine tape library(string (255) s)
routinespec s newpage
routinespec s dots(integer i)
routinespec s spaces(integer n)
routinespec s printstring(string (72) s)
routinespec s newlines(integer n)
routinespec s write(integer i,j)
routinespec s print(integer i,j, real r)
constinteger max terminal lines = 18
constinteger max printer lines = 60
constinteger on = 1
constinteger off = 0
owninteger terminal = off
owninteger printer = off
owninteger t print,p print
owninteger terminal lines
owninteger printer lines
owninteger terminal page = 1
owninteger printer page = 1
integerarray sq(1:1000)
!ARRAY USED IN SORT
record (rf)r
!FORMAT DECLARATIONS.
recordformat f deck(integer read rcvrd,read unrcvrd,rrtot,
write rcvrd,write unrcvrd,wrtot,mounts)
recordformat f tape lib(string (6) tsn, byteinteger spare,
integer date,record (f deck)array deck(1:20))
record (f tape lib)arrayformat af tape lib(1:1000)
record (f tape lib)arrayname tape lib
recordformat f deck identity(integer date,string (3) id)
record (f deck identity)arrayformat af deck identity(1:20)
record (f deck identity)arrayname deck identity
integername tl rec count
integer tl addr,i,j,k,flag,start,ocptype,systype
real rl
string (32) ss,s1,st,tape
routine continue
integer flag
string (16) s1,s2
prompt("Continue:")
cycle
read prompt reply(s1)
return if res str(s1,"Y",s2)=yes
exit if res str(s1,"N",s2)=yes
repeat
select output(0)
if printer=on start
printstring("Do you wish the printer report completed?")
newline
prompt("YES OR NO:")
cycle
read prompt reply(s1)
exit if res str(s1,"Y",s2)=yes or res str(s1,"N",s2)=yes
repeat
if res str(s1,"Y",s2)=yes start
terminal = off; t print=off; terminal lines = 0
printstring("Journal: terminal report ended, completing ")
printstring("printer report.")
newline
return
finish
finish
printstring("Journal: run abandoned as requested.")
newline
if printer=on start
close stream(1)
destroy("JTAPELIBL",flag)
finish
stop
end ; !OF CONTINUE
if s#"*" start
printstring("Define the required function.")
newline
cycle
prompt("AMEND/REPORT:")
read prompt reply(st)
exit if res str(st,"A",ss)=yes or res str(st,"R",ss)=yes
repeat
define("STREAM01,CRAPOUT")
if res str(st,"A",ss)=yes start
!THE USER WISHES TO CHANGE CERTAIN REPORT ENTRIES.
printstring("Now define amendment required.")
newline
cycle
prompt("DECK/TAPE/ALL:")
read prompt reply(st)
exit if st="ALL" or st="DECK" or st="TAPE"
repeat
if st="DECK" start
cycle
prompt("DECK IDENTITY:")
read prompt reply(s1)
exit if length(s1)=3 and res str(s1,"M",ss)=yes
repeat
finish
if st="TAPE" start
cycle
prompt("TSN:")
read prompt reply(s1)
exit if length(s1)=6
repeat
finish
if st="ALL" start
modpdfile(2,"JENGPD","JTAPELIB","",flag)
if flag#0 start
printstring("Journal: failed to clear down library!!")
newlines(2)
return
finish
printstring("Journal: tape library cleared.")
newlines(2)
return
finish
select output(1)
copy("JENGPD_JTAPELIB,JTAPELIB")
select output(0)
connect("JTAPELIB",3,0,0,r,flag)
if flag#0 start
printstring("Journal: cannot connect library file, flag=")
printstring(intostr(flag))
newlines(2)
destroy("JTAPELIB",flag)
return
finish
tape lib==array(r_conad+x'100',af tape lib)
deck identity==array(r_conad+x'30',af deck identity)
tl rec count==integer(r_conad+x'20')
if tl rec count=0 start
printstring("Journal: tape library empty!!")
newlines(2)
disconnect("JTAPELIB",flag)
destroy("JTAPELIB",flag)
return
finish
if st="DECK" start
for i=1,1,20 cycle
if deck identity(i)_id=s1 then exit
if i=20 start
printstring("Journal: deck not found!")
newlines(2)
disconnect("JTAPELIB",flag); destroy("JTAPELIB",flag)
return
finish
repeat
if deck identity(i)_date=0 start
printstring("Journal: deck already cleared down.")
newlines(2)
return
finish
deck identity(i)_date=0
tape lib(j)_deck(i) = 0 for j=1,1,tl rec count
disconnect("JTAPELIB",flag)
select output(1)
copy("JTAPELIB,JENGPD_JTAPELIB")
select output(0)
printstring("Journal: deck ".S1." cleared down ok.")
newlines(2)
destroy("JTAPELIB",flag)
return
finish
if st="TAPE" start
for i=1,1,tl rec count cycle
if tape lib(i)_tsn=s1 start
if tape lib(i)_date=0 start
printstring("Journal: tape already cleared.")
newlines(2)
disconnect("JTAPELIB",flag); destroy("JTAPELIB",flag)
return
finish
tape lib(i)_date=0
tape lib(i)_deck(j) = 0 for j = 1,1,20
disconnect("JTAPELIB",flag)
select output(1)
copy("JTAPELIB,JENGPD_JTAPELIB"); destroy("JTAPELIB",flag)
select output(0)
printstring("Journal: tape ".S1." cleared down ok.")
newlines(2); return
finish
repeat
printstring("Journal: tape not found."); NEWLINES(2)
disconnect("JTAPELIB",flag)
destroy("JTAPELIB",flag)
return
finish
finish
!ELSE A REPORT IS REQUIRED.
!UNLESS AUTO REPORT REQUESTED ASK FOR REPORT DESTINATION.
printstring("Terminal, printer or both")
newline
cycle
prompt("WHERE:")
read prompt reply(st)
exit if res str(st,"T",ss)=yes or res str(st,"P",ss)=yes or res str(st,"B",ss)=yes
repeat
if res str(st,"T",ss)=yes then terminal = on
if res str(st,"P",ss)=yes then printer = on
if res str(st,"B",ss)=yes then terminal = on and printer = on
finish else printer = on
connect("JENGPD_JTAPELIB",0,0,0,r,flag)
if flag#0 start
select output(0)
printstring("Journal: tape library file not available!!")
newline; printstring(" flag=".INTOSTR(FLAG))
newline
return
finish
tl addr=r_conad+x'20'
tape lib==array(tl addr+x'E0',af tape lib)
deck identity==array(tl addr+x'10',af deck identity)
tl rec count==integer(tl addr)
if tl rec count=0 start
select output(0)
printstring("Journal: no tape statistics available.")
newline
return
finish
connect("JENGPD_JENGHD",0,0,0,r,flag)
if flag#0 start
printstring("Cannot determine ocptype. P series assumed.")
newline
ocptype=0
systype=0
finish else start
systype=integer(r_conad+x'FC')
ocptype=integer(r_conad+x'100')
finish
!NOW MAKE THE REQUIRED REPORTS.
p print=printer; t print=terminal; !USED IN CONTROL OF 'S' ROUTINES.
if printer = on then define("STREAM01,JTAPELIBL")
printstring("Define the tapes you wish to look at."); NEWLINE
printstring("Reply either 'ALL' or the tsn of the")
printstring(" specific tape required.")
newline
cycle
prompt("Tape:")
read prompt reply(tape)
exit if tape="ALL" or length(tape)<=6
repeat
printstring("Define the decks you wish to look at.")
newline
printstring("Reply either 'ALL' or the identity of the specific")
printstring(" deck required.")
newline
cycle
prompt("Deck:")
read prompt reply(st)
exit if st="ALL"
exit if length(st)=3 and res str(st,"M",ss)=yes
repeat
s newpage
if s="*" start
!IE THIS IS THE AUTOMATIC WEEKLY REPORTING CALL.
select output(1)
printstring("*************************************************")
printstring("* Monthly report to be retained. *")
printstring("*************************************************")
newpage
finish
sq(i)=i for i=1,1,tl rec count
!NOW DO THE SORT
for i=1,1,tl rec count cycle
for j=i,1,tlrec count cycle
if tape lib(sq(j))_tsn<tape lib(sq(i))_tsn start
k=sq(j);sq(j)=sq(i);sq(i)=k
finish
repeat
repeat
start=0
for i=1,1,20 cycle
exit if deck identity(i)_id=""
!IE THE END OF THE LIBRARY REPORTING.
if terminal = on then terminal lines=max terminal lines+1
if printer = on then printer lines =max printer lines+1
terminal page=1; printer page=1
if (st="ALL" or deck identity(i)_id="M".ss) and c
deck identity(i)_date#0 start
!IE WE WANT A REPORT ON THIS DECK
for j=1,1,tl rec count cycle
if tape lib(sq(j))_deck(i)_mounts>0 and c
tape lib(sq(j))_date#0 start
!THERE IS SOMETHING FOR THIS TAPE ON THE DECK
if tape="ALL" or tape=tape lib(sq(j))_tsn start
t print=off; p print=off
if terminal lines>max terminal lines then t print=on
if printer lines>max printer lines then p print=on
if t print+p print>0 start
!IE AT LEAST ONE REPORT REQUIRES A NEWPAGE/HEADING.
if t print=on start
continue unless start=0
start=1
finish
s newpage
sprintstring("EMAS ".ocps(ocptype,systype)." Journal system ")
sprintstring("Tape library rep")
sprintstring("ort for deck ".DECK IDENTITY(I)_ID." Page")
if t print=on then select output(0) and c
write(terminalpage,3) and terminal page=terminal page+1
if p print=on then select output(1) and c
write(printer page,3) and printer page=printer page+1
s newlines(1)
s printstring("For the period: ")
sprintstring(unpackdate(deck identity(i)_date))
sprintstring("(".unpacktime(deck identity(i)_date).")")
sprintstring(" to ".unpackdate(integer(tladdr+8)))
sprintstring("(".unpacktime(integer(tladdr+8)).")")
s newlines(1)
s spaces(8); s printstring("Record ")
s spaces(8)
s printstring("READ ERRORS---------- WRITE ERRORS---")
sprintstring("------"); s newlines(1)
s printstring("MEDIA STARTS MOUNTS RCVRD(AV.LVL)")
s printstring(" UNRCVRD RCVRD(AV.LVL) UNRCVRD")
s newlines(1)
s printstring("-----------------------------------")
s printstring("----------------------------------")
s newlines(1)
if t print=on then terminal lines=7
if p print=on then printer lines=7
finish
t print=terminal; p print=printer
s printstring(tape lib(sq(j))_tsn)
s spaces(7-length(tape lib(sq(j))_tsn))
if tape lib(sq(j))_date>deck identity(i)_date then c
sprintstring(unpackdate(tapelib(sq(j))_date)) else c
s printstring(unpackdate(deck identity(i)_date))
s write(tape lib(sq(j))_deck(i)_mounts,5)
if tape lib(sq(j))_deck(i)_read rcvrd=0 then sspaces(2) c
and s dots(15) else start
s spaces(2); s dots(2)
s write(tape lib(sq(j))_deck(i)_read rcvrd,4)
s printstring("(")
rl=tapelib(sq(j))_deck(i)_rrtot
rl=rl/tapelib(sq(j))_deck(i)_read rcvrd
s print(2,1,rl)
s printstring(" )")
finish
if tape lib(sq(j))_deck(i)_read unrcvrd=0 then sdots(8) c
else s write(tape lib(sq(j))_deck(i)_read unrcvrd,7)
s dots(2)
if tapelib(sq(j))_deck(i)_write rcvrd=0 then sdots(13) c
else start
s write(tape lib(sq(j))_deck(i)_write rcvrd,4)
s printstring("(")
rl=tapelib(sq(j))_deck(i)_wrtot
rl=rl/tapelib(sq(j))_deck(i)_write rcvrd
s print(2,1,rl)
s printstring(" )")
finish
if tapelib(sq(j))_deck(i)_write unrcvrd=0 then sdots(8) c
else s write(tape lib(sq(j))_deck(i)_write unrcvrd,7)
s newlines(1)
finish
finish
repeat
finish
repeat
if printer = on start
select output(0)
close stream(1)
send("JTAPELIBL,.LP")
finish
!THE S ROUTINES.
routine s dots(integer n)
integer i
if t print = on start
select output(0)
printsymbol('.') for i=1,1,n
finish
if p print = on start
select output(1)
printsymbol('.') for i=1,1,n
finish
end ; !OF ROUTINE S DOTS.
routine s spaces(integer n)
if t print=on then select output(0) and spaces(n)
if p print=on then select output(1) and spaces(n)
end ; !OF S SPACES
routine s newpage
if t print=on then select output(0) and newpage
if p print=on then select output(1) and newpage
end ; !OF S NEWPAGE
routine s printstring(string (72) s)
if t print=on then select output(0) and printstring(s)
if p print=on then select output(1) and printstring(s)
end ; !OF S PRINTSTRING
routine s newlines(integer n)
if t print=on start
select output(0)
newlines(n)
terminal lines=terminal lines+n
finish
if p print=on start
select output(1)
newlines(n)
printer lines=printer lines+n
finish
end ; !OF S NEWLINES
routine s write(integer i,j)
if t print=on then select output(0) and write(i,j)
if p print=on then select output(1) and write(i,j)
end ; !OF S WRITE
routine s print(integer i,j, real r)
if t print=on then select output(0) and print(r,i,j)
if p print=on then select output(1) and print(r,i,j)
end ; !OF S PRINT
end ; !OF ROUTINE TAPE LIBRARY REPORT
externalroutine t l(string (255) s)
tape library(s)
end ; !OF ROUTINE TL.
integerfn res str(string (255) a, string (255) b, string (*)name c)
! This function carries out the IMP9 resolution
! a -> (b).c
! if it can and returns the result yes (i.e. 1). If it cannot carry
! out the resolution it returns the result no (i.e.), having left
! c unchanged.
string (255) s1, s2
if a -> s1.(b).s2 and s1="" start
c = s2
result = yes
finishelse result = no
end ; ! Of %integerfn res str.
endoffile