!***********************************************************************
!*
!* Routines for interrogating an EMAS configuration
!*
!* Copyright R.D. Eager University of Kent MCMLXXIX
!*
!***********************************************************************
!
!
!***********************************************************************
!*
!* Constants
!*
!***********************************************************************
!
CONSTINTEGER COM RECORD = X'80C00000'
CONSTINTEGER SLOTSI = 32
CONSTINTEGER DMNEM = M'ZX'; ! Dummy device
CONSTSTRING (1) SNL = "
"
!
!
!***********************************************************************
!*
!* Record and array formats
!*
!***********************************************************************
!
RECORDFORMAT COMF(INTEGER OCPTYPE,IPLDEV,SBLKS,SEPGS,NDISCS, C
DDTADDR,GPCTABSIZE,GPCA,SFCTABSIZE,SFCA,SFCK,DIRSITE, C
DCODEDA,SUPLVN,WASKLOKCORRECT,DATE0,DATE1,DATE2, C
TIME0,TIME1,TIME2,EPAGESIZE,USERS,CATTAD,DQADDR, C
BYTEINTEGER NSACS,RESV1,SACPORT1,SACPORT0, C
NOCPS,RESV2,OCPPORT1,OCPPORT0, C
INTEGER ITINT,CONTYPEA,GPCCONFA,FPCCONFA,SFCCONFA, C
BLKADDR,DPTADDR,SMACS,TRANS,LONGINTEGER KMON, C
INTEGER DITADDR,SMACPOS,SUPVSN,PSTVA,SECSFRMN,SECSTOCD, C
SYNC1DEST,SYNC2DEST,ASYNCDEST,MAXPROCS,INSPERSEC,ELAPHEAD, C
COMMSRECA,STOREAAD,PROCAAD,SFCCTAD,DRUMTAD,TSLICE,FEPS,SP1, C
SP2,SP3,SP4,SP5,SP6,SP7,SP8, C
LSTL,LSTB,PSTL,PSTB,HKEYS,HOOT,SIM,CLKX,CLKY,CLKZ, C
HBIT,SLAVEOFF,INHSSR,SDR1,SDR2,SDR3, C
SDR4,SESR,HOFFBIT,S2,S3,S4,END); ! As at CHOPSUPE 20K
RECORDFORMAT ESCBF(INTEGER HQ,LQ,SAW0,PAWBS,ADDSTRS)
RECORDFORMAT DDTFORM(INTEGER SER,PTS,PROPADDR,STICK,STATS, C
RQA,LBA,ALA,STATE,IW1,IW2,SENSE1,SENSE2,SENSE3, C
SENSE4,REPSNO,BASE,ID,DLVN,MNEMONIC, C
STRING (6) LAB,BYTEINTEGER MECH)
RECORDFORMAT DIRINFF(STRING (6) USER,STRING (31) BATCHFILE,C
INTEGER MARK,FSYS,PROCNO,ISUFF,REASON,BATCHID,C
SESSICLIM,SCIDENSAD,SCIDENS,OPERNO,AIOSTAT,C
SCDATE,SYNC1DEST,SYNC2DEST,ASYNCDEST,AACTREC,C
AICREVS,STRING (15) BATCHIDEN)
RECORDFORMAT DTENTF(INTEGER NSECS,CONTI,SPTRK,NEXT,STATE,C
INTEGERNAME MARK,PAW,PIW,C
RECORDARRAY ESCBS(0:31)(ESCBF))
RECORDFORMAT GPCTF(BYTEINTEGER FLAGS,DEVTYPE,SPAREB,LINK,C
INTEGER PROPS0,PROPS1,DEV ENT BASE,SPAREI,PTSM,C
MNEMONIC,BYTEINTEGER MECHINDEX,PROPS03,SERVRT,C
STATE)
!
OWNINTEGERARRAYFORMAT GPCF(0:10000)
OWNBYTEINTEGERARRAYFORMAT CONTYPE(0:31)
!
!
!***********************************************************************
!*
!* Subsystem and Director references
!*
!***********************************************************************
!
EXTERNALSTRINGFNSPEC DATE
EXTERNALROUTINESPEC DEFINE(STRING (255) S)
SYSTEMSTRINGFNSPEC ITOS(INTEGER N)
SYSTEMROUTINESPEC OPER(INTEGER OPERNO,STRING (255) S)
EXTERNALSTRINGFNSPEC TIME
EXTERNALINTEGERFNSPEC UINFI(INTEGER N)
EXTERNALSTRINGFNSPEC UINFS(INTEGER N)
!
!
!***********************************************************************
!*
!* Own variables
!*
!***********************************************************************
!
OWNINTEGER REASON = -1
OWNINTEGER OPERNO
OWNINTEGER CHARCOUNT
OWNSTRING (50) OPBUFF
!
!
!***********************************************************************
!*
!* Service routines
!*
!***********************************************************************
!
ROUTINE INITIALISE
RECORDNAME DIRINF(DIRINFF)
!
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
BYTEINTEGER CH
!
IF REASON # 1 THEN PRINTSTRING(S) AND RETURN ; ! Not on OPER
!
L = LENGTH(S)
RETURN IF L = 0
!
CYCLE I = 1,1,L
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)FN MTOS(INTEGER M)
INTEGER I,J,A
STRING (4) S
!
A = ADDR(M)
J = 0
CYCLE I = 0,1,3
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
!
!
STRING (1)FN HTOS(INTEGER N)
INTEGER C
!
IF 0 <= N <= 9 THEN START
C = N + '0'
FINISH ELSE START
C = N - 10 + 'A'
FINISH
RESULT = TOSTRING(C)
END ; ! of HTOS
!
!
!***********************************************************************
!*
!* D I S C S
!*
!***********************************************************************
!
EXTERNALROUTINE DISCS(STRING (255) PARMS)
RECORDNAME COM(COMF)
RECORDNAME DDTENT(DDTFORM)
SWITCH DDTSTATE(0:13)
STRING (255) S
STRING (4) TYPE
STRING (8) LAB
INTEGER I,NDISCS,DITPTR,ALL,CYLS
!
INITIALISE
IF PARMS = ".ALL" THEN ALL = 1 ELSE ALL = 0
COM == RECORD(COM RECORD)
NDISCS = COM_NDISCS; ! Number of disc drives
DITPTR = COM_DITADDR; ! Address of DIT
!
CYCLE I = 1,1,NDISCS
LAB = ""
DDTENT == RECORD(INTEGER(DITPTR))
IF DDTENT_MNEMONIC >> 16 = DMNEM THEN -> NODISC
-> DDTSTATE(DDTENT_STATE)
!
DDTSTATE(0):
DDTSTATE(1):
DDTSTATE(2):
DDTSTATE(3): S = "unloaded"
-> OUT
!
DDTSTATE(4):
DDTSTATE(5):
DDTSTATE(6):
DDTSTATE(10): S = "loaded "
-> LABEL
!
DDTSTATE(7):
DDTSTATE(8): S = "awaiting reload"
-> OUT
!
DDTSTATE(9): S = "?????"
-> OUT
!
DDTSTATE(11):
DDTSTATE(12):
DDTSTATE(13): S = "priv "
-> LABEL
!
LABEL:
IF DDTENT_LAB = "NOLABL" THEN START
LAB = "no label"
TYPE = ""
FINISH ELSE START
LAB = DDTENT_LAB
IF DDTENT_BASE = 0 THEN TYPE = "FRGN" ELSE TYPE = "EMAS"
FINISH
S = S.LAB." ".TYPE
OUT:
PRINT(MTOS(DDTENT_MNEMONIC)." ")
IF ALL = 1 THEN START
CYLS = INTEGER(DDTENT_PROPADDR+4)
IF CYLS = 404 THEN PRINT("[EDS100] ")
IF CYLS = 808 THEN PRINT("[EDS200] ")
FINISH
PRINT(S.SNL)
!
NODISC:
DITPTR = DITPTR + 4
REPEAT
END ; ! of DISCS
!
!
!***********************************************************************
!*
!* S T O R E
!*
!***********************************************************************
!
EXTERNALROUTINE STORE(STRING (255) PARMS)
INTEGER RESIDENT,ALL,I,SMACS
RECORDNAME COM(COMF)
!
INITIALISE
IF PARMS = ".ALL" THEN ALL = 1 ELSE ALL = 0
COM == RECORD(COM RECORD)
!
IF ALL = 1 THEN START
PRINT("SMAC numbers present:")
SMACS = COM_SMACS
CYCLE I = 0,1,31
IF (SMACS >> (31-I)) & 1 # 0 THEN START
PRINT(" ".ITOS(31-I))
FINISH
REPEAT
PRINT(SNL)
FINISH
!
PRINT("Main store = ".ITOS(COM_SBLKS << 7)." Kb".SNL)
RESIDENT = (COM_SBLKS << 7) - (COM_SEPGS*COM_EPAGESIZE)
PRINT("Resident system = ".ITOS(RESIDENT)."Kb".SNL)
END ; ! of STORE
!
!
!***********************************************************************
!*
!* P O R T S
!*
!***********************************************************************
!
EXTERNALROUTINE PORTS(STRING (255) PARMS)
RECORDNAME COM(COMF)
!
INITIALISE
COM == RECORD(COM RECORD)
IF COM_NOCPS = 1 THEN START
PRINT("OCP is on port ".ITOS(COM_OCPPORT0).SNL)
FINISH ELSE START
PRINT("OCP 0 is on port ".ITOS(COM_OCPPORT0)." (IPL)".SNL)
PRINT("OCP 1 is on port ".ITOS(COM_OCPPORT1).SNL)
FINISH
IF COM_NSACS = 1 THEN START
PRINT("SAC is on port ".ITOS(COM_SACPORT0).SNL)
FINISH ELSE START
PRINT("SAC 0 is on port ".ITOS(COM_SACPORT0)." (IPL)".SNL)
PRINT("SAC 1 is on port ".ITOS(COM_SACPORT1).SNL)
FINISH
END ; ! of PORTS
!
!
!***********************************************************************
!*
!* T R U N K S
!*
!***********************************************************************
!
EXTERNALROUTINE TRUNKS(STRING (255) PARMS)
RECORDNAME COM(COMF)
BYTEINTEGERARRAYNAME CONTABLE
SWITCH TYPE(1:3)
STRING (4) MNEM
INTEGER CODE,I,J,ALL,FIRSTSACPORT,LASTSACPORT,SACPORT,NSACS
!
INITIALISE
IF PARMS = ".ALL" THEN ALL = 1 ELSE ALL = 0
COM == RECORD(COM RECORD)
CONTABLE == ARRAY(COM_CONTYPEA,CONTYPE)
NSACS = COM_NSACS
IF NSACS = 1 THEN START
FIRSTSACPORT = COM_SACPORT0
LASTSACPORT = COM_SACPORT0
FINISH ELSE START
FIRSTSACPORT = 0
LASTSACPORT = 1
FINISH
!
CYCLE SACPORT = FIRSTSACPORT,1,LASTSACPORT
PRINT("SAC on port ".ITOS(SACPORT).":".SNL)
CYCLE J = 0,1,15
I = SACPORT*16+J
CODE = CONTABLE(I)
IF 1 <= CODE <= 3 THEN START
IF ALL = 1 THEN START
PRINT(" Trunk ".ITOS(J)." reports ")
FINISH ELSE START
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)
RECORDNAME COM(COMF)
RECORDNAME G(GPCTF)
INTEGERARRAYNAME GPCT
INTEGER I,GPCA,PT,SLOTNO,LASTSLOT,GPCT BASE,STRM,NGPCS
!
INITIALISE
COM == RECORD(COM RECORD)
GPCA = COM_GPCA
GPCT == ARRAY(GPCA,GPCF)
GPCT BASE = ADDR(GPCT(GPCT(1)))
LASTSLOT = GPCT(2)
NGPCS = GPCT(3)
!
CYCLE I = 1,1,NGPCS
PT = GPCT(15+I) & X'FF'
PRINT("GPC on port ".ITOS(PT>>4).", trunk ".ITOS(PT&X'F').":".SNL)
CYCLE SLOTNO = 0,1,LASTSLOT
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)
RECORDNAME COM(COMF)
INTEGER I,FOUNDMAP,AVMAP,ALL
!
INITIALISE
IF PARMS = ".ALL" THEN ALL = 1 ELSE ALL = 0
COM == RECORD(COM RECORD)
!
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 = 1 THEN PRINT("Front end processors:".SNL)
!
CYCLE I = 0,1,9
IF (FOUNDMAP >> I) & 1 = 0 THEN CONTINUE
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
RECORDNAME COM(COMF)
RECORDNAME DTENT(DTENTF)
STRING (255) S
!
INITIALISE
COM == RECORD(COM RECORD)
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)
RECORDNAME COM(COMF)
INTEGER DIRVSN,IPLDEV,I
STRING (7) V
!
INITIALISE
COM == RECORD(COM RECORD)
IF REASON = 1 THEN V = "vsn" ELSE V = "version"
!
PRINT("Supervisor ".V." = ".STRING(ADDR(COM_SUPVSN)).SNL)
PRINT("OCP is a ".UINFS(10).SNL)
IPLDEV = COM_IPLDEV & X'FFF'
PRINT("IPL from ")
CYCLE I = 8,-4,0
PRINT(HTOS((IPLDEV >> I) & X'F'))
REPEAT
PRINT(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)
INITIALISE
!
IF PARMS # "" THEN START
DEFINE("1,".PARMS)
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