//**************************************************************************************
//D0CS08.TST
//By B. Rosen and M. Thomson February 22, 1979
//Sub Test Program for D0 CS Module
//**************************************************************************************
get "d0cs.d"
//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}
//{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'}
//{H2: H2.12, H2.13,H2.14,H2.15}
//{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}
//**************************************************************************************
//Test 13: Test Almost all of Control Store Ram
let Test13() be
[
SpeakTest(13) //set initial conditions (see notes at end of D0CS.TST)
let v = vec 64
let str = v
//This test does an address test of almost the entire control store.
//The test writes data into each address, and then partially
// verifies the contents by reading the most significant 16 bits.
//When all addresses have been written, another pass is made in which all bits are checked.
Ws("*nWriting Page")
let d = #123456 //start random data
RxCSData()
for l = 0 to 15 do //16 pages
[
Ws(FORMATN(" <B>",l))
FORMAT(str,"in dual address test write of Page <B>",l)
for k = (l gr 3? 0,1) to 3 do //64 word quarter pages, don't do first quarter
[
let lk = (l lshift 8) % (k lshift 6) //form address bits [4:9]
for j = 0 to 1 do //first two passes have extra Checks
[
let i = lk % j //form address
d = (d<<w.b1 xor d<<w.b4) % (d lshift 1); //up-date random data
Check("CS-A",{CS-A'} xor #7777,#1402,"before loading CSIN",13000,i)
Check("Cycle0Feed'",{Cycle0Feed'},0,"before loading CSIN",13001,i)
{ALUA} = d; //Data to be loaded
{H2} = d; //extra 4 bit data
TwoClocks() //CSIn← @1402
Check("CS-A",{CS-A'} xor #7777,#1403,"before loading APC",13002,i)
Check("Cycle0Feed'",{Cycle0Feed'},0,"before loading APC",13003,i)
{ALUA} = i; //Address to load
EClock() //APC← @1403
Check("Cycle0Feed'",{Cycle0Feed'},1,"when loading APC",13004,i)
{LoadAPC'xxx} = {LoadAPC'}
EClock()
Check("CS-A",{CS-A'} xor #7777,i,"at start of write",13005,i)
Check("Cycle0Feed'",{Cycle0Feed'},0,"before write",13006,i)
EClock()
Check("CS-A",{CS-A'} xor #7777,i,"middle of write",13007,i)
{LoadAPC'xxx} = {LoadAPC'}
TwoEClocks()
Check("CS-A",{CS-A'} xor #7777,#1422,"middle of fetch",13008,i)
{LoadAPC'xxx} = {LoadAPC'}
EClock()
{H2.15} = 0; //CSData[0:15] ← bits[0:15]
TwoClocks() //APC←
//Test RSEL[4:5]/d logic not completely testable previously:
Check("RSEL.4/d",{RSEL.4/d},d<<w.b12,str,13010,i)
Check("RSEL.5/d",{RSEL.5/d},d<<w.b13,str,13011,i)
Check("RSEL4and5/d",{RSEL4and5/d},d<<w.b12 & d<<w.b13,str,13012,i)
TwoClocks() //ReadCS
Check("Msb Read Data",{R},d,str,13100,i)
{ALUA} = d; //Data to be loaded
TwoClocks() //Read Fetch
{ALUA} = i; //Address to load
FourClocks() //APC←; WriteCS1
TwoClocks() //Write Fetch
//there is a branch instruction at the end of the loop
{J-TestResult'} = (i eq 4095?0,1)
TwoClocks() //Branch Loop
]
for j = 2 to 63 do //remaining passes omit extra Checks for speed
[
let i = lk % j //form address
d = (d<<w.b1 xor d<<w.b4) % (d lshift 1); //up-date random data
{ALUA} = d; //Data to be loaded
{H2} = d; //extra 4 bit data
TwoClocks() //CSIn← @1402
{ALUA} = i; //Address to load
TwoClocks() //APC← @1403
FourClocks() //insert note here ******
{H2.15} = 0; //CSData[0:15] ← bits[0:15]
FourClocks() //APC←; ReadCS
Check("Msb Read Data",{R},d,str,13200,i)
{ALUA} = d; //Data to be loaded
TwoClocks() //Read Fetch
{ALUA} = i; //Address to load
FourClocks() //APC←; WriteCS1
TwoClocks() //Write Fetch
//there is a branch instruction at the end of the loop
{J-TestResult'} = (i eq 4095?0,1)
TwoClocks() //Branch Loop
]
]
]
EClock() //Burp
{J-TestResult'} = 1
TwoClocks() //Branch Noop
Check("CS-A",(not {CS-A'})ṡ,#1412,"between write and read",13300)
Ws("*nReading Page")
let d = #123456 //start random data
for l = 0 to 15 do //16 pages
[
Ws(FORMATN(" <B>",l))
FORMAT(str,"in dual address test read of Page <B>",l)
for k = (l gr 3? 0,1) to 3 do //64 word quarter pages, don't do first quarter
[
let lk = (l lshift 8) % (k lshift 6) //form address bits [4:9]
for j = 0 to 63 do
[
let i = lk % j //form address
d = (d<<w.b1 xor d<<w.b4) % (d lshift 1); //up-date random data
{ALUA} = i; //Address to read
{H2.15} = 0; //CSData[0:15] ← bits[0:15]
FourClocks() //APC←; ReadCS0
Check("Msb Read Data",{R},d,str,13400,i)
TwoClocks() //Read Fetch
{H2.15} = 1; //CSData ← LCSD[0:3],,bits[20:31]
{H2.14} = 0; //LCSD[0:3] ← bits[16:19]
FourClocks() //APC←; ReadCS1
Check("Middle Read Data",{R},d,str,13401,i)
TwoClocks() //Read Fetch
{H2.14} = 1; //LCSD[0:3] ← bits[32:35]
FourClocks() //APC←; ReadCS2
Check("Xtra Read Data",{R}𩠐,d lshift 12,str,13402,i)
TwoClocks() //Read Fetch
{J-TestResult'} = (i eq 4095?0,1)
TwoClocks() //Branch Loop
]
]
]
EClock() //Burp
]