//**************************************************************************************
//ALU7.TST
//By F. Itami and M. Thomson  							October 6, l978
//Sub Test Program for D0 ALU Module
//**************************************************************************************
get "alu.d"

//Edge pin signal busses used by ALU module:

//{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}

//{aluf: ALUF.0,  ALUF.1,ALUF.2,ALUF.3}

//{clkbus: LT,LR,  Abort',LoadMIR,Cycle0Feed'}

//{CTask: CTask.0,  CTask.1,CTask.2,CTask.3}

//{F1F2: F1.0,F1.1,  F1.2,F1.3,F2.0,  F2.1,F2.2,F2.3}

//{H2: H2.08,H2.09,  H2.10,H2.11,H2.12,  H2.13,H2.14,H2.15}

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

//{MC1SA: BSEL.0,BSEL.1,  F1.0,F1.1,F1.2,  F1.3,LR,LT}

//{mcbus: MC1WriteR,  MC2AllowWrite,MC1NeedsR,MC2WillGetR}

//{mirbus: MemInst/d,MemInst/d',  RMOD/d,RMOD/d',RSEL.0/d',  RSEL.1/d',RSEL.2/d,RSEL.3/d,  RSEL.4/d,RSEL4and5/d,RSEL.5/d}

//{rbus: 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}

//{TA: TA.0,  TA.1,TA.2,TA.3}

//**************************************************************************************
//Test 18: Check the SALUF functions (pages 9,10,15)
//         Check the R and T bypass logic (pages 5,6)

let Test18() be
[
	SpeakTest(18) //set initial conditions (see notes at end of ALU.TST)

	//{jbus: JC.1,JC.2,JA.7}
	//{clkResultbus: FreezeResult,  Breakpoint',Abort',DelayedFault'}

	{Stkp←ALUA'}=1; //keep Stkp=0 during test for RA=0 when RSA,B=3,3

//Test the clkResult' signal qualifying terms (page 15)
//(they initially qualify clkResult' due to SpeakTest initialization)

	EClock() //clkResult' sets SavALUOUT.00 since ALUOUT=#177777 from SpeakTest
	{jbus}=2; //for J-TestResult'←SavALUOUT.00'
	WCompare({J-TestResult'},0,18000) //SavALUOUT.00 =1

	{MASK}=#177777; //for ALUOUT=(ALUA=0)

	for i = 0 to 14 do //disqualify clkResult'
	[
		{clkResultbus} = i xor #10
		ClockCycle1() //clkXCycle1' for d4 flip-flop (page 15)
		EClock() //should be blocked from clkResult'
		WCompare({J-TestResult'},0,18001,i) //SavALUOUT.00 stays=1
	]

	{DelayedFault'}=1; //qualify clkResult
	ClockCycle1() //check that Cycle1 does not yield clkResult'
	WCompare({J-TestResult'},0,18002) //SavALUOUT.00 stays=1

	EClock() //clkResult: SavALUOUT.00←(ALUOUT.00=0)
	WCompare({J-TestResult'},1,18003) //SavALUOUT.00 =0

//Check that the SALUF's (MA',MB,SALUF[0:5]) load and display correctly (pages 9,15)

	{mirbus}=#1557; //MemInst=1, RMOD=1, RSEL=00 01 00
	ClockMIR() //Load MIR: R←SALUF'←0
	{SALUF←H2'}=0; //load SALUF's from H2[8:15] on Cycle1 clocks
	{jbus}=7; //for J-TestResult'←MB'

	for i = 0 to 8 do
	[
		let a = #200 rshift i

		{F1F2}=a
		EClock() //H2[8:15]←(F1F2=a)
		ClockCycle1() //SALUF←(H2[8:15]=F1F2=a)

		WCompare((not {rbus})&#377,a,18100+i) //rbus[8:15]←(MA',MB,SALUF[0:5])'
		WCompare({J-TestResult'},(#775 rshift i)&1,18120+i) //J-TestResult'←(MB' =0 when i=1) 
	]

	//note: SALUF's emerge =0 after above loop

//Check the Restore =1 path (R[0:3] ← i14 ff's ← ALUOUT[0:3]) (page 10)

	{Restore'}=0; //for i14 ff's ← ALUOUT[0:3]
	ClockCycle1() //d4h ff ← 0 (page 10) (i.e. Restore←1)

	{BBFA'}=0; //for ALUB←MASK
	{aluf}=0; //for ALUOUT←ALUB
	EClock() //ALUF()←"T", set EnableMask, (i.e. ALUOUT←ALUB←MASK)

	for i = 0 to 4 do
	[
		let a = #10000 lshift i

		{MASK}=a
		EClock() //clkResult': i14 ff's ← (ALUOUT[0:3] = 1 lshift i), H3P←(ALUOUT=a)
		WCompare((not {rbus})&#170000,a,18200+i) //ALUOUT[0:3] via i14 ff's
	]

//Load T and R files for SALUF tests

	{clkbus}=#37; //LT=1, LR=1, Abort'=1, LoadMIR=1, Cycle0=0
	{mirbus}=#1540; //MemInst=1, RMOD=1, RSEL=00 00 00
	                //for RSA,B←1,0: RA=(CTask[0:3]=0,,RSEL[2:3]=0,,PCF[1:2]=0)=0

	//Write 0's into R and T files, address=0 (H3P=0 from previous loop)
	EClock() //Load MIR, set TComing, TWPending, RComing, RWPending 
	         //RSA,B←1,0: RA=(CTask[0:3]=0,,RSEL[2:3]=0,,PCF[1:2]=0)=0
	RClock() //R(RA=0),T(TA=0 from SpeakTest) ← (R=H3P=0)

	//Set up write data = -1
	{MASK}=#177777
	ClockCycle0() //H3P←(ALUOUT=ALUB=MASK= -1)

	//Write -1 into R and T files, address = 1
	{PCF.2}=1; //for RA=1
	{TA.3}=1;  //for TA=1
	EClock() //RSA,B: RA=(CTask[0:3]=0,,RSEL[2:3]=0,,PCF[1:2]=1)=1
	RClock() //R(RA=1),T(TA=1) ← (R=H3P=-1)

	//Set up SALUF control of ALU
	{clkbus}=#25; //LT=1, LR=0, Abort'=1, LoadMIR=0, Cycle0=0
	{aluf}=15; //for ALUF()←SALUF
	{MASK}=0;  //for ALUA←(H1=R)
	{BBFA'}=1; //for reset EnableMask (i.e. ALUB←H2)

//Test SALUF functions with ALUA=-1 and ALUB=-1 (i.e. H2'=0)

	for i = 0 to 62 by 2 do
	[
		let sb = valof
		[
			if (not i<<w.b10)&1 xor i<<w.b12 then resultis -1
			if (not i<<w.b10) & i<<w.b12 then resultis -2
			resultis 0
		]

		{F1F2}=i
		{BSEL.0}=0; //for H2←F1F2
		ClockCycle0() //H2←F1F2, reset EnableMask
		EClock() //SALUF←H2, RSA,B←1,0 (for RA←1), Restore←0

		{BSEL.0}=1; //for H2←T
		ClockCycle0() //H1←R(RA=1), H2←T(TA=1), ALUF()←SALUF
		ClockCycle0() //H3P←(ALUOUT=sb)
		WCompare({rbus},sb,18300,i) //H3P
	]

//Test SALUF functions with ALUA=-1 and ALUB=0 (H2'=-1)

	{TA.3}=0; //for TA=0

	for i = 0 to 62 by 2 do
	[
		let sb = valof
		[
			if (not i<<w.b10)&1 xor i<<w.b11 then resultis -1
			if (not i<<w.b10) & i<<w.b11 then resultis -2
			resultis 0
		]

		{F1F2}=i
		{BSEL.0}=0; //for H2←F1F2
		ClockCycle0() //H2←F1F2
		EClock() //SALUF←H2, RSA,B←1,0 (for RA←1)

		{BSEL.0}=1; //for H2←T
		ClockCycle0() //H1←R(RA=1), H2←T(TA=0), ALUF()←SALUF
		ClockCycle0() //H3P←(ALUOUT=sb)
		WCompare({rbus},sb,18310,i) //H3P
	]

//Test SALUF functions with ALUA=0 and ALUB=-1 (H2'=0)

	{TA.3}=1;  //for TA=1
	{PCF.2}=0; //for RA=0

	for i = 0 to 62 by 2 do
	[
		let sb = valof
		[
			if i<<w.b10 xor i<<w.b13 then resultis -1
			resultis 0
		]

		{F1F2}=i
		{BSEL.0}=0; //for H2←F1F2
		ClockCycle0() //H2←F1F2
		EClock() //SALUF←H2, RSA,B←1,0 (for RA←0)

		{BSEL.0}=1; //for H2←T
		ClockCycle0() //H1←R(RA=0), H2←T(TA=1), ALUF()←SALUF
		ClockCycle0() //H3P←(ALUOUT=sb)
		WCompare({rbus},sb,18320,i) //H3P
	]

//Test SALUF functions with ALUA=0 and ALUB=0 (H2'=-1)

	{TA.3}=0; //for TA=0

	for i = 0 to 62 by 2 do
	[
		let sb = valof
		[
			if i<<w.b10 xor i<<w.b14 then resultis -1
			resultis 0
		]

		{F1F2}=i
		{BSEL.0}=0; //for H2←F1F2
		ClockCycle0() //H2←F1F2
		EClock() //SALUF←H2, RSA,B←1,0 (for RA←0)

		{BSEL.0}=1; //for H2←T
		ClockCycle0() //H1←R(RA=0), H2←T(TA=0), ALUF()←SALUF
		ClockCycle0() //H3P←(ALUOUT=sb)
		WCompare({rbus},sb,18330,i) //H3P
	]

//Test SALUF display, including Overflow, etc. (Restore=0) (pages 9,10)
//Test the R and T bypass logic (pages 5,6)
//Test the J-TestResult' mux inputs not tested elsewhere (page 10)

	{clkbus}=#36; //LT=1, LR=1, Abort'=1, LoadMIR=1, Cycle0=1
	{Restore'}=1; //for Restore=0 inputs to i14 ff's (page 10)
	{SALUF←H2'}=1; //keep SALUF's=#076 for WCompares
	ClockCycle1() //set TComing, TWPending, RComing, RWPending,
	              //d4h ff ← 1 (page 10) (i.e. Restore←0)

	{aluf}=10; //for "R+T+1" (for first add only)
	EClock() //ALUF()←"R+T+1", H1←(R=0), H2←(T=0)
	{aluf}=9;  //for "R+T" (for after first add, instead of "R+T+1")

	//R and T bypass logic (H1←ALUOUT, H2←ALUOUT):
	//R bypass: RA=WA since RA's have been =0 from all sources
	{CTD=CTask}=1; //activate T bypass

	for i = 0 to 14 do //walk a "1" from ALUOUT.15 to ALUOUT.01
	[
		{mirbus}=#1540; //for EnableR and R bypass logic
		ClockCycle1() //load MIR, RSA,B←1,0
		EClock() //H1,H2,H3P ← H1+H2+(Cin=1 on first pass only), RSA,B←2,5, clkResult'
		         //ALUF()←"R+T"

		let a = 1 lshift i

		WCompare({ALUA},a,18400+i) //H1[0:15]
		WCompare({H2},a&#377,18420+i) //H2[8:15] only (partial check)
		{Cycle0Feed'}=1; //rbus←H3P
		WCompare({rbus},a,18440+i) //H3P[0:15] (if stop, probe H2[0:7])

		{mirbus}=#1557; //for R←SALUF'
		EClock() //load MIR, RSA,B←3,3
		{Cycle0Feed'}=0; //rbus←SALUF

		//rbus' = ALUOUT.00=0,ALUCyOut=0,ALUOUT=0'=1,ALU(OVER)'=1,,0,0,0,0,,SALUF's=#076
		WCompare(not {rbus},#30076,18460+i)
	]

	{mirbus}=#1540; //for EnableR and R bypass logic
	ClockCycle1() //load MIR and RSA,B←1,0
	EClock() //H1,H2,H3P ← H1+H2, RSA,B←2,5, clkResult' (#40000+#40000=#100000)

	WCompare({ALUA},#100000,18500) //H1[0:15]
	{Cycle0Feed'}=1; //rbus←H3P
	WCompare({rbus},#100000,18501) //H3P[0:15] (if stop, probe H2[0:7])

	{mirbus}=#1557; //for R←SALUF
	EClock() //load MIR, RSA,B←3,3
	{Cycle0Feed'}=0; //rbus←SALUF'

	//rbus' = ALUOUT.00=1,ALUCyOut=0,ALUOUT=0'=1,ALU(OVER)'=0,,0,0,0,0,,SALUF's=#076
	WCompare(not {rbus},#120076,18502)

	{jbus}=0
	WCompare({J-TestResult'},0,18503) //SavALUOUT=0' =1 (ALUOUT#0)
	{jbus}=4
	WCompare({J-TestResult'},0,18504) //H1.00 =1

	{mirbus}=#1540; //for EnableR and R bypass logic
	ClockCycle1() //load MIR and RSA,B←1,0
	EClock() //H1,H2,H3P ← H1+H2, RSA,B←2,5, clkResult' (#100000+#100000=0)
	{mirbus}=#1557; //for R←SALUF
	{IOAttn'}=1
	ClockCycle1() //load MIR, c16g ff ← (IOAttn'=1) (page 10)

	//rbus' = ALUOUT.00=0,ALUCyOut=1,ALUOUT=0'=0,ALU(OVER)'=0,,0,0,0,0,,SALUF's=#076
	WCompare(not {rbus},#40076,18510)

	{jbus}=0
	WCompare({J-TestResult'},1,18511) //SavALUOUT=0' =0 (ALUOUT=0)
	{jbus}=4
	WCompare({J-TestResult'},1,18512) //H1.00 =0
	{jbus}=5
	WCompare({J-TestResult'},1,18513) //H1.15 =0
	{jbus}=6
	WCompare({J-TestResult'},0,18514) //IOAttn =0

	{IOAttn'}=0
	EClock(); //H1.15←(R.15=SALUF.5'=1), c16g ff ← (IOAttn'=0) (page 10)
	{jbus}=5
	WCompare({J-TestResult'},0,18520) //H1.15 =1
	{jbus}=6
	WCompare({J-TestResult'},1,18521) //IOAttn =1
]