//**************************************************************************************
//D0CS.TST
//By B. Rosen and M. Thomson
February 21, 1979
//Main Test Program for UTFP Controller Module
//**************************************************************************************

//NOTE: This test is for rev. I boards (see below for prom revisions)

//Change History:
//
!4 2/22/79: Up-dated d0cs.tst; improved d0cs08.tst and d0cs09.tst.
//
!3 2/16/79: Dump-file reorganization only (moved .cm’s to .dmtests).
//
!2 2/09/79: Edited !1 to conform to present format; corrected Test 2 error.
//
!1 1/??/79: Slightly revised [ivy]<thacker>d0cs-I.dmtest of 11/27/78.

//**************************************************************************************

//CURRENT PROM REVISION (for 8G systems):
//
Rev. F thru B: d4(u107) (HM7603 on page 11)
//
Rev. F: c12(u117) and g12(u118) (i2716 EPROMS on page 11)

//CURRENT PROM REVISION (for systems earlier than 8G):
//
Rev. E thru B: d4(u107) (HM7603 on page 11)
//
Rev. E: c12(u117) and g12(u118) (i2716 EPROMS on page 11)

//This test can be used with either prom configuration since the EPROMS are unplugged.

//**************************************************************************************

//DUMP FILES in ifs-2 under <Thomson>:

//D0CS-I.DMTESTS contains
//
d0cs*.tst, d0cs.d, d0cs.bp, d0cs.run, d0cs*.cm, d0csall.cm1, d0csall.cm2

//The next two dump files permit modification of the tests

//D0CSTESTAUX-I.DM contains
//
d0cs*.br, d0cs*.bt, d0cs.bs, d0cs.syms, readd0mb.br

//TEST.DM contains
//
BCPL.RUN, BLDR.RUN, TC.RUN, format.br, testfns,br, SYS.BK, STREAMS.D
//
(tester.d and testdefs.d are not used; d0cs.d contains their information)

//**************************************************************************************

//INSTALL THE FOLLOWING TEST CLIPS:

//Remove EPROMS from locations c12(u117) and g12(u118)

//Connect Prom Simulator cables:
//
Tester socket "E8" to location c12(u117)
//
Tester socket "E6" to location g12(u118)

//Tester socket "B" to location b11(u24) - page 5 (20-pin clip on 18-pin component)
//
TrmCS-A.00’a: b11.1,1
//
TrmCS-A.01’a: b11.2,2
//
TrmCS-A.02’a: b11.3,3
//
TrmCS-A.03’a: b11.4,4
//
TrmCS-A.04’a: b11.5,5
//
TrmCS-A.05’a: b11.6,6
//
TrmCS-A.06’a: b11.17,16
//
TrmCS-A.07’a: b11.16,15
//
TrmCS-A.08’a: b11.15,14
//
TrmCS-A.09’a: b11.14,13
//
TrmCS-A.10’a: b11.13,12
//
TrmCS-A.11’a: b11.12,11

//Tester socket "C" to location e13(u67) - page 13 (16-pin clip on 14-pin component)
//
JA.0: e13.4,4
//
JA.1: e13.2,2
//
JA.2: e13.13,15
//
JA.3: e13.12,14
//
JA.4: e13.11,13
//
JA.5: e13.10,12
//
JA.6: e13.9,11
// (JA.7 is available on edge-pin E048)

//Clip pre-fabricated test connector to location b1(u123)
//
This applies a resistor network to the ExtClock signal (page 12)

//**************************************************************************************
get "D0cs.d"
get "streams.d"

external //O.S.
[
Puts
Closes
OpenFile
AnnounceFirstWrite
]

static
[
pass = 0
otime = 0
exectime = 0
looping = false
AnnounceFirstWrite = false
]

//**************************************************************************************
//Edge pin and test connector signal busses available to this sub-test:

//{ALUA: ALUA.00, ALUA.01,ALUA.02,ALUA.03, ALUA.04,ALUA.05,ALUA.06, ALUA.07,ALUA.08,ALUA.09, ALUA.10,ALUA.11,ALUA.12, ALUA.13,ALUA.14,ALUA.15}

//{Clock: ExtClock, ExtClock,ExtClock,ExtClock, ExtClock,ExtClock,ExtClock, ExtClock,ExtClock,ExtClock, ExtClock,ExtClock,ExtClock, ExtClock,ExtClock,ExtClock}

//{CS-A’: TrmCS-A.00’a,TrmCS-A.01’a,TrmCS-A.02’a, TrmCS-A.03’a,TrmCS-A.04’a,TrmCS-A.05’a, TrmCS-A.06’a,TrmCS-A.07’a,TrmCS-A.08’a, TrmCS-A.09’a,TrmCS-A.10’a,CS-A.11’}

//{JA: JA.0,JA.1, JA.2,JA.3,JA.4, JA.5,JA.6,JA.7}

//{JC: JC.0,JC.1,JC.2}

//{R: R.00, R.01,R.02,R.03, R.04,R.05,R.06, R.07,R.08,R.09, R.10,R.11,R.12, R.13,R.14,R.15}

//**************************************************************************************
//Main program for D0CS module test

let main() be
[
Ws("*nControl Board Test, board level: Rev I")
Ws("*n*nShall I wait before I write the Control store the first time? Y or N:")

LoadBootROM()
while Endofs(keys) do [ ]
let char = Gets(keys)
if (char eq $y) % (char eq $Y) then AnnounceFirstWrite = true
[
pass = pass + 1

Test1()
Test2()
Test3()
Test4()
Test5()
Test6()
Test7()
Test8()
Test9()
Test10()
Test11()
Test12()
Test13()
Test14()
] repeat
]

//**************************************************************************************
//Routines available for D0CS module tests:

and normalize() be
//bring clock gen to first click of cycle0
[
while ({EdgeClockFeed’} eq 1) % ({Cycle0Feed’} eq 0) do ExtClock()
ExtClock()
if {EdgeClockFeed’} ne 1 then ExtClock()
if {RamClockFeed’} ne 1 then Ws("*nSomehow, normalize isn’t working")
]

and WaitForKey(msg) be
[
Ws(msg)
Ws(" Waiting...")
while Endofs(keys) do [ ]
Gets(keys)
Ws("*nRunning...")
]

and WCompare(was,sb,testno,drive; numargs na) be
//Wait-Comparison routine
[
if was eq sb then return

Ws(FORMATN("*nTest <D>: Was = <B>, Should be = <B>",testno,was,sb))
if na gr 3 then Ws(FORMATN(", drive = <B>",drive))

while Endofs(keys) do [ ]
Gets(keys)
Ws("*nRunning...")
]

and Check(ini,was,sb,fin,testno,drive; numargs na) be
//verify that "was" = "sb", complain if not, allow single step
[
if was eq sb then return

Ws(FORMATN("*nTest <D>: <S> was=<B>, should be=<B> <S>",testno,ini,was,sb,fin))
if na gr 5 then Ws(FORMATN(", drive=<B>",drive))

let csa = (not {CS-A’}) & #7777
let ja = {JA}
let jc = {JC}

Ws(FORMATN("*n CS-A=<B>, JA=<B>, JC=<B>",
csa,ja,jc))

if {Cycle0Feed’} eq 0 do //can’t read from R bus mux’s during Cycle1
[
let oc2 = {RSEL.2/bxxx}
let oc3 = {RSEL.3/bxxx}

RxCIA()
let cia = {R} xor #7777

RxAPC()
let apc = {R}

RxCSData()
let csd = {R}

Ws(FORMATN(", CIA/CTsk=<B>, APC/APCTsk=<B>, CSData=<B>",
cia,apc,csd))

{RSEL.2/bxxx} = oc2
{RSEL.3/bxxx} = oc3
]

[
while Endofs(keys) do [ ]
let char = Gets(keys)
switchon char into
[
case $c: case $C: EClock();endcase
case $t: case $T: ExtClock();endcase
case $q: case $Q: finish
case $*s: [ Ws("..Running");return ]
case $h: case $H:

let s = OpenFile("csHelp.msg",ksTypeReadOnly,charItem)
if s eq 0 then [ Ws("*n can’t open csHelp.msg");endcase ]
[
let c = Gets(s)
if c eq $! then
[
let n = GetNum(s)

if n eq testno then
[
until c eq $! do [ c = Gets(s); Puts(s,c) ]
Closes(s)
endcase
]
]
] repeatuntil Endofs(s)

Ws("*n I’m sorry, I can’t help you with this one")
endcase
]
] repeat
]

and GetNum(s) = valof
//This procedure supports the "Check(...)" procedure (directly above)
[
let n = 0
let char = 0
[
if Endofs(s) then resultis -1
char = Gets(s)
if (char ls $0) % (char gr $9) then resultis n
n = (n*10) + char - $0
] repeat
]

//**************************************************************************************
//Clocking routines defined on pages 2 and 12:

and ExtClock() be
[
//"External Clock" (input to module - page 12)
{ExtClock} = 1
{ExtClock} = 0
]

and EClock() be
//"Edge Clock" - consists of 4 ExtClocks
[
{Clock} = #125
]

and TwoEClocks() be
//"Two Edge Clocks" - consists of 8 ExtClocks
[
{Clock} = #52525
]

and TwoClocks() be
//"Special Two Edge Clocks" - consists of 8 ExtClocks with LoadAPC’xxx up-date
[
{Clock} = #125
{LoadAPC’xxx} = {LoadAPC’}
{Clock} = #125
]

and FourClocks() be
//"Special Four Edge Clocks" - consists of 16 ExtClocks with LoadAPC’xxx up-date
//(i.e., this is a pair of TwoClocks() (above) for improved speed)
[
{Clock} = #125
{LoadAPC’xxx} = {LoadAPC’}
{Clock} = #52525
{LoadAPC’xxx} = {LoadAPC’}
{Clock} = #125
]

//**************************************************************************************
//R bus display control (page 3)

and RxAPC() be
//R[0:3] ← APCTask[0:3], R[4:15] ← APC[0:11]
[
{RSEL.2/bxxx} = 0
{RSEL.3/bxxx} = 0
]

and RxCIA() be
//R[0:3] ← InCTsk[0:3], R[4:15] ← CIA[0:11]’
[
{RSEL.2/bxxx} = 0
{RSEL.3/bxxx} = 1
]

and RxCSData() be
//R[0:15] ← CS-Data[0:15]
[
{RSEL.2/bxxx} = 1
{RSEL.3/bxxx} = 0
]

and RxPage() be
//R[0:3] ← Page[0:3], R.04 ← gnd
//R[5:7] ← CS-ParErr,,R-ParErr,,MemErr
//R[8:9] ← gnd, R[10:15] ← RFB[0:5]
[
{RSEL.2/bxxx} = 1
{RSEL.3/bxxx} = 1
]

//**************************************************************************************
and SpeakTest(testno) be
[

//Calculate the execution time for each test
let tv = vec 2
Timer(tv)
exectime = tv!1 - otime
otime = tv!1
Ws(FORMATN("*nExection Time for this test is <D> msec.",exectime))

//Set up the title display
Ws("*n")
Ws("*n")
Ws(FORMATN("*nD0CS TEST (rev. I): Pass <D>, Test <D>...",pass,testno))

//Set up misc. initial conditions:

{R} = ###
{ALUA} = 0

//{D0CSbus1: BBDisp.0,BBDisp.1,BBDisp.2, EnCtrlAuxRa,EnCtrlAuxRb,H2.12, H2.13,H2.14,H2.15, WakeP1’,WakeP2’,WakeP3’}
{D0CSbus1} = #600

//{D0CSbus2: ExtClockEnab’,InstReadingR, MemSetFault,NextInstOpTrp,PCF.0, RSEL-Parity,StackEmpty,Suspend-a}
{D0CSbus2} = 0

//{D0CSbus3: Abort’, BBFA’,BootOkxxx,BranchShift’, CPar’xxx,J-TestResult’,LoadAPC’xxx, NextInst’,Overflow’,PnlBoot’, PwrBoot’,RParityError’,ShortFldDisp’, StackBadNow’,TesterBoot’,UseTPC’xxx}
{D0CSbus3} = #177777

{D0cs12.sil+3} = 1; //delay line input for RamClockFeed’ (page 12)
]