//**************************************************************************************
//MEMC2.TST
//By B. Rosen and M. Thomson December 5, 1978
//Sub Test Program for D0 MEM Module
//**************************************************************************************
get "memc.d"
//Edge pin and test connector signal busses available to this sub-test:
//{Idata: Idata.00, Idata.01,Idata.02,Idata.03, Idata.04,Idata.05,Idata.06, Idata.07,Idata.08,Idata.09, Idata.10,Idata.11,Idata.12, Idata.13,Idata.14,Idata.15}
//{Mapbus: LogSngErr, WriteProtect,Dirty,Referenced, Map.04,Map.05,Map.06, Map.07,Map.08,Map.09, Map.10,Map.11,Map.12, Map.13,Map.14,Map.15}
//{Mapcon1: MapCAS', MapRAS',MapRAS',MapCAS', MC1Ref',MC1Store',MapWrite', MapCAS',MC1Ref',MC1Store', MapWrite',MapRAS',MapCAS', MapCAS',MapCAS',MapRAS'}
//{Mapcon2: EdgeClockFeed', EdgeClockFeed',EdgeClockFeed',EdgeClockFeed', WriteProtect,Dirty,Referenced, MapCAS',MapCAS',MapRAS'}
//{StorA: StorA0, StorA1,StorA2,StorA3, StorA4,StorA5,StorA6}
//{StorOut': StorOut.00', StorOut.01',StorOut.02',StorOut.03', StorOut.04',StorOut.05',StorOut.06', StorOut.07',StorOut.08',StorOut.09', StorOut.10',StorOut.11',StorOut.12', StorOut.13',StorOut.14',StorOut.15'}
//**************************************************************************************
//Test 3: Test the Map Memory
// THIS TEST IS STILL BEING DEVELOPED!
// At present it is functional to a limited extent.
// Addressing integrity cannot be checked due to timing considerations; however,
// the data bits appear to be testable.
// THE TEST HAS BEEN ARRANGED to handle BOTH the S/W and P/C boards; this is
// controllable as per the LEFT-JUSTIFIED notes below (in loop)
let Test3() be
[
SpeakTest(3) //set initial conditions (see notes at end of MEMC.TEST)
//SpeakTest initialized the following signals used by this test:
//MapRAS',MapCAS',MapWrite',MC1Ref',MC1Store' all =1 (Map outputs are at hi-Z)
//EnRowAd'=1 to disable the StorA[0:6]←Map[9:15]' inverters (page 7)
//H4←Imux=1 and IMux←Cdat=0 for H4[0:15]←IMux[0:15]←Idata[0:15]
//ALUF[0:3] = #17 for prom b11 addr = 1111x (ALUF.3 modifies this later)
//MOBounds=0 for prom i7 addr = xx0x xxx1 (other bits are controlled later)
let Mapout,was,sb,Mapxor = 0,0,0,0
//Test Write-Read #125252 and #52525 for i = 000-255 (using all Column/Row sets)
//Test Write-Read #135252 and #72525 for i = 256-259 (i.e. merge StorAccessType=1
//with H4[2:3] for Dirty and Referenced =1 (page 8))
let a = #52525 //Write-Read data
let x = 0 //initialize error counter
let y = 0 //count after which errors will cause stop *********
for i = 0 to 259 do
[
a = not a
{Idata} = a; //for H4[0:15]←IMux[0:15]←(Idata[0:15]=a)
{ALUF.3} = i<<w.b7; //for StorAccessType←i[7] (via proms b11 and i7 (page 15))
{Mapcon2} = #177207; //sequence of action as follows:
//Disable MAP outputs
//WriteProtect,Dirty,Referenced←000 (stabilize prom i7 address lines)
//EClock: H4[0:15]←IMux[0:15]←(Idata[0:15]=a)
// ClockAd': MC1Ftype.0←0 if prom b11 addr = 1110x (ALUF.3=0)
// MC1Ftype.0←1 if prom b11 addr = 1111x (ALUF.3=1)
// MC1Ftype.1←0 since prom b11 addr = 111xx
//EClock: StorAccessType←(prom i7)←(MC1FType.0=i[7])
// (prom i7 addr = 000x y001, where y controls StorAccessType)
{Mapbus} = ###; //Disconnect tester drivers from Map memory outputs
//Check the Map input data (this hardware has been tested previously)
WCompare({StorOut'},not a,3000,i) //verify H4[0:15] data via StorOut[0:15]'
WCompare({StorAccessType},i<<w.b7,3001,i) //verify StorAccessType=i[7]
{StorA} = i rshift 1; //Do all Column/Row sets (with #125252, then with #52525)
//This step "wakes up" the rams; without it the test will fail
{Mapcon1} = #37017; //Write-Read cycle
//The next two steps average 1.4 milliseconds execution time
{Mapcon1} = #37017; //Write-Read cycle
Mapout = {Mapbus}; //grab data quickly to minimize refresh problems
//STITCH-WELD BOARDS ONLY - this option HAS NOT been selected ********
//Mask out the Dirty and Referenced bits since the SloMC1Store' and SloMC1Ref'
//signals are floating in S/W modules (SPLAT i1 is pulled) (page 12)
//was = Mapout & #147777
//sb = a & #147777
//PRINTED-CIRCUIT BOARDS ONLY - this option HAS been selected ********
//No masking is required since SloMC1Store' and SloMC1Ref' are connected
was = Mapout
sb = a % (#30000 & (-i<<w.b7)); //merge 1's with Dirty and Referenced when i>255
//Produce Mapxor and increment error counter if Mapxor not =0
Mapxor = was xor sb; //MAKES POSITION OF ERROR EASY TO SPOT
if Mapxor ne 0 then x=x+1; //ERROR TALLY
//now test the result
//IGNORE OCCASIONAL ERRORS WHICH MAY ARISE FROM REFRESH PROBLEMS
//Will stop if error count > y (y has been set to 0)********
WCompt3(was,sb,3002,i,Mapxor,x,y) //SEE NOTES ABOVE
]
]
//Special Wait-Comparison routine peculiar to this test
and WCompt3(was,sb,testno,drive,Mapxor,x,y) be
[
if was eq sb then return
if x le y then return
Ws(FORMATN("*nTest <D>: Mapbus was <B>, should be <B>, drive = <B>",testno,was,sb,drive))
Ws(FORMATN("*nWAS xor SB = <B>, <D> failures in <D> passes...",Mapxor,x,drive+1))
while Endofs(keys) do [ ]
Gets(keys)
Ws("*nRunning...")
]
//**************************************************************************************
//Test 4: Continue Map Memory Test
and Test4() be
[
SpeakTest(4) //set initial conditions (see notes at end of MEMC.TEST)
Ws("*nTesting Map Memory for 90 seconds...")
//Write and Read 0's and 1's using every cell of the Map Memory
//See Test 3 for initialization notes
for i = 0 to 1 do //Set up Map write data (Test 3 notes apply)
[
let a = -i
{Idata} = a
{ALUF.3} = 0; //for StorAccessType←0
{Mapcon2} = #177207
//H4[0:15] ← 0 if i=0, #177777 if i=1
//StorAccessType←0 (for Dirty,Referenced ← H4[2:3])
{Mapbus} = ###
for j = 0 to 127 do //Set up Row address to =j
[
{StorA} = j
{Mapcon1} = #157777; //Latch Row address (MapRAS' active)
for k = 0 to 127 do //Set up Column address to =k; test Write-Read
[
{StorA} = k
{Mapcon1} = #37017; //Write-Read cycle (MapRAS' inactive) ("wake-up")
{Mapcon1} = #37017; //Write-Read cycle (MapRAS' inactive)
let Mapout = {Mapbus}; //grab data quickly
WCompare(Mapout,a,4000+i,(j lshift 9)%k)
//NOTE: Row and Column addresses are shown in "drive" as follows:
// Row address is in left three octals
// Col address is in right three octals
]
]
]
]