!***********************************************************************
!*
!* Routines for interrogating an EMAS configuration
!*
!* Copyright R.D. Eager University of Kent MCMLXXIX
!*
!***********************************************************************
!
!
!***********************************************************************
!*
!* Record and array formats
!*
!***********************************************************************
!
recordformat comf(integer ocptype,ipldev,sblks,sepgs,ndiscs,
dlvnaddr,gpctabsize,gpca,sfctabsize,sfca,sfck,dirsite,
dcodeda,suplvn,tojday,date0,date1,date2,
time0,time1,time2,epagesize,users,cattad,servaad,
byteinteger nsacs,resv1,sacport1,sacport0,
nocps,resv2,ocpport1,ocpport0,
integer itint,contypea,gpcconfa,fpcconfa,sfcconfa,
blkaddr,ration,smacs,trans,longinteger kmon,
integer ditaddr,smacpos,supvsn,pstva,secsfrmn,secstocd,
sync1dest,sync2dest,asyncdest,maxprocs,inspersec,elaphead,
commsreca,storeaad,procaad,sfcctad,drumtad,tslice,feps,
maxcbt,performad,sp1,sp2,sp3,sp4,sp5,sp6,
lstl,lstb,pstl,pstb,hkeys,hoot,sim,clkx,clky,clkz,
hbit,slaveoff,inhssr,sdr1,sdr2,sdr3,
sdr4,sesr,hoffbit,blockzbit,blkshift,blksize,end)
! As at CHOPSUPE 21C
recordformat escbf(integer hq,lq,saw0,pawbs,addstrs)
recordformat ddtform(integer ser,pts,propaddr,stick,caa,rqa,
lba,ala,state,iw1,concount,sense1,sense2,sense3,
sense4,repsno,base,id,dlvn,mnemonic,
string (6) lab,byteinteger mech,
integer props,stats1,stats2,
byteinteger qstate,prio,sp1,sp2,
integer lqlink,uqlink,curcyl,sema,trlink,chfisa)
recordformat dirinff(string (6) user,string (31) batchfile,
integer mark,fsys,procno,isuff,reason,batchid,
sessiclim,scidensad,scidens,operno,aiostat,
scdate,sync1dest,sync2dest,asyncdest,aactrec,
aicrevs,string (15) batchiden)
recordformat dtentf(integer nsecs,conti,sptrk,next,state,
integername mark,paw,piw,
record (escbf)array escbs(0:31))
recordformat gpctf(byteinteger flags,devtype,spareb,link,
integer props0,props1,dev ent base,sparei,ptsm,
mnemonic,byteinteger mechindex,props03,servrt,
state)
recordformat fdf(integer link,dsnum,byteinteger status,accessroute,
valid action,cur state,mode of use,mode,file org,
dev code,rec type,flags,lm,rm,integer asvar,arec,
recsize,minrec,maxrec,maxsize,lastrec,conad,currec,
cur,end,transfers,darecnum,cursize,datastart,
string (31) iden,integer keydesc0,keydesc1,
recsizedesc0,recsizedesc1,byteinteger f77flag,
f77form,f77access,f77status,integer f77recl,f77nrec,
idaddr,byteinteger f77blank,f77ufd,spare1,spare2)
!
ownintegerarrayformat gpcf(0:10000)
ownbyteintegerarrayformat contype(0:31)
!
!
!***********************************************************************
!*
!* Constants
!*
!***********************************************************************
!
constantinteger no = 0, yes = 1
constantinteger slotsi = 32
constantinteger dmnem = m'ZX'; ! Dummy device
constantstring (1) snl = "
"
constantrecord (comf)name com = x'80c00000'
!
!
!***********************************************************************
!*
!* Subsystem and Director references
!*
!***********************************************************************
!
externalstringfunctionspec date
systemroutinespec define(integer chan,string (31) iden,
integername afd,flag)
systemstringfunctionspec htos(integer value,places)
systemstringfunctionspec itos(integer n)
systemroutinespec oper(integer operno,string (255) s)
externalstringfunctionspec time
externalintegerfunctionspec uinfi(integer n)
externalstringfunctionspec uinfs(integer n)
!
!
!***********************************************************************
!*
!* Own variables
!*
!***********************************************************************
!
owninteger reason = -1
owninteger operno
owninteger charcount
ownstring (50) opbuff
!
!
!***********************************************************************
!*
!* Service routines
!*
!***********************************************************************
!
routine initialise
record (dirinff)name dirinf
!
return if reason >= 0; ! Already initialised
!
dirinf == record(uinfi(10)); ! Director information record
reason = dirinf_reason; ! Says whether started from OPER
charcount = 0
operno = dirinf_operno
opbuff = ""
end ; ! of initialise
!
!-----------------------------------------------------------------------
!
routine print(string (255) s)
integer i,l,ch
!
if reason # 1 then printstring(s) and return
! Not on OPER
!
l = length(s)
return if l = 0
!
for i = 1,1,l cycle
ch = charno(s,i)
opbuff = opbuff.tostring(ch)
charcount = charcount + 1
if ch = nl then start
if charcount > 23 then length(opbuff) = length(opbuff) - 1
oper(operno,opbuff)
charcount = 0
opbuff = ""
finish
repeat
end ; ! of print
!
!-----------------------------------------------------------------------
!
string (4)function mtos(integer m)
integer i,j,a
string (4) s
!
a = addr(m)
j = 0
for i = 0,1,3 cycle
unless byteinteger(a+i) = 0 then start
j = j + 1
charno(s,j) = byteinteger(a+i)
finish
repeat
length(s) = j
result = s
end ; ! of mtos
!
!
!***********************************************************************
!*
!* D I S C S
!*
!***********************************************************************
!
externalroutine discs(string (255) parms)
record (ddtform)name ddtent
switch ddtstate(0:15)
string (255) s
string (4) type
string (8) lab
integer i,ndiscs,ditptr,all,cyls
!
initialise
if parms = ".ALL" then all = yes else all = no
ndiscs = com_ndiscs; ! Number of disc drives
ditptr = com_ditaddr; ! Address of DIT
!
for i = 1,1,ndiscs cycle
lab = ""
ddtent == record(integer(ditptr))
ditptr = ditptr + 4
continue if ddtent_mnemonic >> 16 = dmnem
!
-> ddtstate(ddtent_state)
!
ddtstate(0):
ddtstate(1):
ddtstate(2):
ddtstate(3):
ddtstate(15): s = "unloaded"
-> out
!
ddtstate(4):
ddtstate(5):
ddtstate(6):
ddtstate(9):
ddtstate(10): s = "loaded "
-> label
!
ddtstate(7):
ddtstate(8): s = "awt rld"
-> out
!
ddtstate(11):
ddtstate(12):
ddtstate(13):
ddtstate(14): s = "priv "
-> label
!
label:
if ddtent_lab = "nolabl" then start
lab = "no label"
type = ""
else
lab = ddtent_lab
if ddtent_base = 0 then type = "frgn" else type = "EMAS"
finish
s = s.lab." ".type
if all = yes and ddtent_base = x'800' then s = s." (IPL volume)"
!
out:
print(mtos(ddtent_mnemonic)." ")
if all = yes then start
cyls = integer(ddtent_propaddr+4)
if cyls = 404 then print("[EDS100] ")
if cyls = 808 then print("[EDS200] ")
print("on ".htos(ddtent_pts,3)." ")
finish
print(s.snl)
repeat
end ; ! of discs
!
!
!***********************************************************************
!*
!* S T O R E
!*
!***********************************************************************
!
externalroutine store(string (255) parms)
integer all,i,smacs,usmacs
!
initialise
if parms = ".ALL" then all = yes else all = no
!
if all = yes then start
print("SMAC numbers present:".snl)
smacs = com_smacs & x'ffff'
usmacs = com_smacs >> 16
for i = 0,1,15 cycle
if (smacs >> (15-i)) & 1 # 0 then start
print(" ".itos(15-i))
if (usmacs >> (15-i)) & 1 # 0 then print(" (in perm use)")
print(snl)
finish
repeat
finish
!
print("Main store = ".itos(com_sblks << 7)." Kb".snl)
end ; ! of store
!
!
!***********************************************************************
!*
!* P O R T S
!*
!***********************************************************************
!
externalroutine ports(string (255) parms)
integer i
!
initialise
if com_nsacs = 1 then start
print("SAC on port ".itos(com_sacport0).snl)
finish else start
i = com_ipldev>>8&15
print("SAC on port ".itos(i)." (IPL)".snl)
print("SAC on port ".itos(i!!1).snl)
finish
if com_nocps = 1 then start
print("OCP on port ".itos(com_ocpport0).snl)
finish else start
print("OCP on port ".itos(com_ocpport0)." (IPL)".snl)
print("OCP on port ".itos(com_ocpport1).snl)
finish
end ; ! of ports
!
!
!***********************************************************************
!*
!* T R U N K S
!*
!***********************************************************************
!
externalroutine trunks(string (255) parms)
byteintegerarrayname contable
switch type(1:3)
string (4) mnem
integer code,i,j,all,firstsacport,lastsacport,sacport,nsacs
!
initialise
if parms = ".ALL" then all = yes else all = no
contable == array(com_contypea,contype)
nsacs = com_nsacs
if nsacs = 1 then start
firstsacport = com_sacport0
lastsacport = com_sacport0
else
firstsacport = 0
lastsacport = 1
finish
!
for sacport = firstsacport,1,lastsacport cycle
print("SAC on port ".itos(sacport).":".snl)
for j = 0,1,15 cycle
i = sacport*16+j
code = contable(i)
if 1 <= code <= 3 then start
if all = yes then start
print(" Trunk ".itos(j)." reports ")
else
print(" ".itos(j)." - ")
finish
-> type(code)
!
type(1): mnem = "SFC1"
-> out
type(2): mnem = "FPC2"
-> out
type(3): mnem = "GPC1"
-> out
!
out:
print(mnem.snl)
finish
repeat
repeat
end ; ! of trunks
!
!
!***********************************************************************
!*
!* G P C S
!*
!***********************************************************************
!
externalroutine gpcs(string (255) parms)
record (gpctf)name g
integerarrayname gpct
integer i,gpca,pt,slotno,lastslot,gpct base,strm,ngpcs
!
initialise
gpca = com_gpca
gpct == array(gpca,gpcf)
gpct base = addr(gpct(gpct(1)))
lastslot = gpct(2)
ngpcs = gpct(3)
!
for i = 1,1,ngpcs cycle
pt = gpct(15+i) & x'ff'
print("GPC on port ".itos(pt>>4).", trunk ".itos(pt&x'f').":".snl)
for slotno = 0,1,lastslot cycle
g == record(gpct base + slotno*slotsi)
if g_mnemonic >> 8 = dmnem then continue
if (g_ptsm >> 8) & x'ff' = pt then start
! On this GPC
strm = (g_ptsm >> 4) & x'f'
print(" ".mtos(g_mnemonic)." on stream ".itos(strm).snl)
finish
repeat
repeat
end ; ! of gpcs
!
!
!***********************************************************************
!*
!* F E P S
!*
!***********************************************************************
!
externalroutine feps(string (255) parms)
integer i,foundmap,avmap,all
!
initialise
if parms = ".ALL" then all = yes else all = no
!
if com_feps = 0 then start
print("No front end processors".snl)
return
finish
!
foundmap = com_feps >> 16
avmap = com_feps & x'ffff'
!
if all = yes then print("Front end processors:".snl)
!
for i = 0,1,9 cycle
continue if (foundmap >> i) & 1 = 0
print(" FE".itos(i).": ")
! %if (avmap >> i) & 1 = 0 %then print("not ")
! Un-comment when Director actually sets this
print("available".snl)
repeat
end ; ! of feps
!
!
!***********************************************************************
!*
!* D R U M S
!*
!***********************************************************************
!
externalroutine drums(string (255) parms)
integer sfca,sfctabsize,i
record (dtentf)name dtent
string (255) s
!
initialise
sfctabsize = com_sfctabsize
!
if sfctabsize = 0 then start
print("No drums in system".snl)
return
finish
!
sfca = com_sfca
dtent == record(sfca+4)
!
print("Drums:".snl)
i = 0
cycle
s = "Drum ".itos(i).": ".itos(dtent_nsecs)
i = i + 1
while length(s) < 6 cycle
s = s." "
repeat
s = s." sectors - "
if dtent_state < 0 then s = s."in"
print(s."operable".snl)
exit if dtent_next = 0
dtent == record(dtent_next)
repeat
end ; ! of drums
!
!
!***********************************************************************
!*
!* C O N F I G
!*
!***********************************************************************
!
externalroutine config(string (255) parms)
integer dirvsn,ipldev
string (7) v
!
initialise
if reason = 1 then v = "vsn" else v = "version"
!
print("Supervisor ".v." = ".string(addr(com_supvsn)).snl)
print("OCP type is ".uinfs(10).snl)
ipldev = com_ipldev & x'fff'
print("IPL from ")
print(htos(ipldev&x'fff',3).snl)
print("SLOAD from ".itos(com_suplvn).snl)
dirvsn = (((com_dcodeda) & x'ffffff') - x'200')//x'40'
print("DIRVSN = ".itos(dirvsn).snl)
end ; ! of config
!
!
!***********************************************************************
!*
!* S T A T U S
!*
!***********************************************************************
!
externalroutine status(string (255) parms)
integer afd,flag
!
initialise
!
if parms # "" then start
define(1,parms,afd,flag)
selectoutput(1)
reason = 0; ! Force non-OPER format
finish
!
print("Machine status on ".date." at ".time.snl)
print(snl)
config("")
store(".ALL")
print(snl)
discs(".ALL")
print(snl)
drums("")
print(snl)
ports("")
print(snl)
trunks(".ALL")
print(snl)
gpcs(".ALL")
print(snl)
feps(".ALL")
end ; ! of status
endoffile