//**************************************************************************************
//UTVFCa.TST
//*** Rev.H                                                    May30,1979
//***Rev. B                                                     June 19.1978
//V.Vysin                                                      
//Main Test Program and Subroutines for UTVFC Controller Module
//**************************************************************************************


//**************************************************************************************
//To include the following definition files in the compilation
get "tester.d"
get "UTVFC.d"


//**************************************************************************************
//To define bus structure
//{CTask: CTask.0, CTask.1, CTask.2, CTask.3}
//{IAddr: Iaddr.0, Iaddr.1, Iaddr.2, Iaddr.3, Iaddr.4, Iaddr.5, Iaddr.6, Iaddr.7}
//{IDataM: Idata.00, Idata.01, Idata.02, Idata.03, Idata.04, Idata.05, Idata.06, Idata.07}
//{IDataL:  Idata.08, Idata.09, Idata.10, Idata.11, Idata.12, Idata.13, Idata.14, Idata.15}
//{IData0: Idata.00, Idata.01, Idata.02, Idata.03}
//{IData1: Idata.04, Idata.05, Idata.06, Idata.07}
//{IData2: Idata.08, Idata.09, Idata.10, Idata.11}
//{IData3: Idata.12, Idata.13, Idata.14, Idata.15}
//{ODataM: Odata.00, Odata.01, Odata.02, Odata.03, Odata.04, Odata.05, Odata.06, Odata.07}
//{ODataL:  Odata.08, Odata.09, Odata.10, Odata.11, Odata.12, Odata.13, Odata.14, Odata.15}
//{OData0: Odata.00, Odata.01, Odata.02, Odata.03}
//{OData1: Odata.04, Odata.05, Odata.06, Odata.07}
//{OData2: Odata.08, Odata.09, Odata.10, Odata.11}
//{OData3: Odata.12, Odata.13, Odata.14, Odata.15}
//{Clocks: ClkCR', ClkStart', ClkIAR', WriteHorCont', WriteOddBuf', WriteEvenBuf'}
//{WakeP' : WakeP1', WakeP2', WakeP3'}


//**************************************************************************************
//Clocking routines defined on p. 5

let RClock() be  		
[
	 SetPinValue(8,0 );        //RamClkFeed' is normally high
	 SetPinValue(8,1)
]

and EClock() be  
[
	 SetPinValue(7,0 );        //EdgeClkFeed' is normally high
	 SetPinValue(7,1)
]

and Clocks() be
[
	RClock()
	EClock()
]

and SetOaddr(g) be
[
    SetBusValue(8,141,205,142,206,144,208,145,209,g)
    SetPinValue(16,0)
   EClock()
    SetPinValue(16,1)
    SetPinValue(41,1)
   EClock()
    SetPinValue(41,0)
]

and  InputSequ() be
[
      SetPinValue(16,0)
     EClock()                   //OCompare should become 1
      SetPinValue(16,1)
      SetPinValue(41,1)
     EClock()                      //OCompr =1
      SetPinValue(41,0)
]
and NClk(k;numargs na) be
[
   DefaultArgs(lv na, -1, 0)
   unless k eq 0 do
   [
       SetBusValue(8,139,138,137,136,135,134,133,129,#1 );    //OutD.15 to reset Gray Counter,Allow WU=0        
      SetOaddr(0)          //to prepare ClkCR
       SetPinValue(231,0)
      EClock()        //first after OValid' sets OMeF,loads outD.15 
       SetBusValue(8,139,138,137,136,135,134,133,129,#200);      //OutD.08 to enable clocking of NClk, 
   
      EClock()            //first CR loads CR ,resets NClk,loads OutD.8
      for i=1 to 4*(k-1) do
      [
         EClock()                    
      ]
      EClock()     // first CR into NClk
      EClock()
      EClock()
       SetPinValue(231,1)
       SetBusValue(8,139,138,137,136,135,134,133,129,0 );  //0 is the  final contents of Cont.Reg    
      EClock()        //last ClkCR,also resets OMeF,removes OutD.8       
   ]                        
]

and  NClko(cr) be 
[
   
    SetBusValue(8,139,138,137,136,135,134,133,129,#1 );   //OutD.15 to reset Gray Counter,Allow WU =0

   SetOaddr(0)          //to prepare ClkCR
    SetPinValue(231,0)
   EClock()        //first  after OValid' sets OMeF,loads OutD.15
    SetBusValue(8,139,138,137,136,135,134,133,129,#200+cr);      //OutD.08 to enable clocking of NClk,cr is the (even)  contents of Control Reg. during the Nclk 
   
   EClock()          //first CR loads CR ,resets NClk,loads OutD.8
   EClock()         // first into NClk
   EClock()
   EClock()
    SetPinValue(231,1)
    SetBusValue(8,139,138,137,136,135,134,133,129,cr   )
   EClock()        //last ClkCR,also resets OMeF ,removes OutD.8      
]
and SRClock() be  		
[
	 SetPinValue(96,0 );    //SRClock is normally high
	 SetPinValue(96,1)
]

and Reset() be         
[
    SetPinValue(153,0 );         //Run is normally high for Controller in operation
    SetPinValue(153,1 );           //will make a negative pulse in Rst'
]

and ClkCR() be
[
   SetOaddr(0) 
    SetPinValue(231,0)
   EClock()          //sets OMeF since OCompr=1 from prev.tests
    SetPinValue(231,1)
   EClock()          //this makes the ClkCR' and resets OMeF
]

and ClkStart() be
[
   SetOaddr(1)
    SetPinValue(231,0)
   EClock()          //sets OMeF since OCompr=1 from prev.tests
    SetPinValue(231,1)
   EClock()          //this makes the ClkStart' and resets OMeF
]

and ClkIAR() be
[
   SetOaddr(3)
    SetPinValue(231,0)
   EClock()          //sets OMeF since OCompr=1 from prev.tests
    SetPinValue(231,1)
   EClock()          //this makes the ClkIAR' and resets OMeF
]

and ClkCur() be
[
   SetOaddr(4)
    SetPinValue(231,0)
   EClock()           // sets OMeF
    SetPinValue(231,1)
   EClock()            // makes the pulse,resets OMeF
   SetOaddr(5);     // the other one too
    SetPinValue(231,0)
   EClock()           // sets OMeF
    SetPinValue(231,1)
   EClock()            // makes the pulse,resets OMeF
]

and CurWri() be
[
   SetOaddr(6)
    SetPinValue(231,0)
   EClock()           // sets OMeF
   RClock()            // the write pulse proper
    SetPinValue(231,1)
   EClock()            // resets OMeF
   SetOaddr(7);   // the other one too
    SetPinValue(231,0)
   EClock()           // sets OMeF
   RClock()            // the write pulse proper
    SetPinValue(231,1)
   EClock()            // resets OMeF
]

and WriteHorCont() be
[
   SetOaddr(2)
    SetPinValue(231,0)
   EClock()          //sets OMeF since OCompr=1 from prev.tests
    SetPinValue(231,1)
   RClock()          //this makes the WriteHorCont' pulse
   EClock()          //this  resets OMeF
]

and WriteBuf(i) be
[
   //EvenLine()      //cant be here,would destroy set OData!
   //OddLine()     //cant be here,would destroy set OData!
   SetOaddr(#10 + i)
    SetPinValue(231,0)
   EClock()          //sets OMeF since OCompr=1 from prev.tests
    SetPinValue(231,1)
   RClock()          //this makes the WriteHorCont' pulse
   EClock()          //this generates ClkIAR' and  resets OMeF
]

and WriteAll() be
[
   WriteBuf(0)
   WriteBuf(1)
   WriteBuf(2)
   WriteBuf(3)
]

and XeroData() be
[
    SetBusValue(8,139,138,137,136,135,134,133,129,0)
    SetBusValue(8,167,165,164,163,162,159,156,155,0)
]

and EvenLine() be
[
   let eli=GetPinValue(122)
   if eli eq 0 do
   [
      Switch()
      NClk(1)
   ]
]

and OddLine() be
[
   let eli=GetPinValue(122)
   if eli eq 1 do
   [
      Switch()
      NClk(1)
   ]
]

and Switch() be
[
    SetBusValue(8,167,165,164,163,162,159,156,155,#200 );   //OutD.0 =1 to keep IAR from loading
   ClkStart()
   NClk(1)                 // 0 into AAR,AAR left in loading state

    SetBusValue(4,135,134,133,129,#12 );      // SetCPhase,PSwitch
   WriteHorCont()
   NClk(1)                  // sets SetCPhase
   NClk(1)                  // sets ControlPhase 

    SetBusValue(4,135,134,133,129,2 );           // Switch only,we must drop setCPhase
   WriteHorCont()           // writes into HeRAM
   NClk(1)                     // Switch =1 now,SetCPhase=0

    SetBusValue(4,135,134,133,129,0 );        // housekeeping
   WriteHorCont()        // adddress 0 cleared again
   // M U S T  be followed by a NClk,which will put Switch =0,ControlPhase=0
]

and HSpulse() be
[
    SetBusValue(8,167,165,164,163,162,159,156,155,#200 );   //OutD.0 =1 to keep IAR from loading
   ClkStart()
   NClk(1)                 // 0 into AAR;AAR left in loading state

    SetBusValue(4,135,134,133,129,#16 );      // PSwitch=1,PHS=1,SetCPhase=1
   WriteHorCont()
   NClk(1)                  // sets SetCPhase;PHS,PSwitch=1
   NClk(1)                  // sets ControlPhase
   NClk(1)                  // sets HS =1, Switch =1

    SetBusValue(4,135,134,133,129,0 );        // housekeeping
   WriteHorCont()       // adddress 0 cleared again
   // M U S T  be followed by a NClk,which will put HS=0, Switch=0, ControlPhase=0
]

and MLpulse() be
[
    SetBusValue(8,167,165,164,163,162,159,156,155,#200 );   //OutD.0 =1 to keep IAR from loading
   ClkStart()
   NClk(1)                 // 0 into AAR;AAR left in loading state

    SetBusValue(4,135,134,133,129,#1);      // ML =1
   WriteHorCont()
   NClk(1)                  // sets ML=1

    SetBusValue(4,135,134,133,129,0 );        // housekeeping
   WriteHorCont()       // adddress 0 cleared again
   // M U S T  be followed by a NClk,which will put  ML=0 
]

and LoadAAR(a) be
[
	 SetBusValue(8,167,165,164,163,162,159,156,155,#200 + a );  //a limited to 6 bits-starting address
	ClkStart()
	NClk(1)

	 SetBusValue(8,167,165,164,163,162,159,156,155,#300 );      // enables counting by Nclk
	ClkStart()
]

and LoadIAR(a) be
[
	 SetBusValue(8,167,165,164,163,162,159,156,155,#100 + a );  //a limited to 6 bits-starting address
	ClkStart()
	ClkIAR()

	 SetBusValue(8,167,165,164,163,162,159,156,155,#300 );      // enables counting by Nclk
	ClkStart()
]

and PrepareTSR() be
[
    SetPinValue(140,0)
   EClock()            // sets IMeF
    SetBusValue(8,141,205,142,206,144,208,145,209,4)
   EClock()             // loads IReg
    SetBusValue(8,141,205,142,206,144,208,145,209,0);         // enables shifting now
]
// EClock(n) now must follow .Without any pulse,output =VS

and EndTSR() be
[
    SetPinValue(140,1)
   EClock()           // resets IMeF
]

and SetIMeF() be
[
      SetPinValue(140,0)
     EClock()
]

and SetOMeF() be
[
      SetPinValue(231,0)
     EClock()
]

and ResetIMeF() be
[
      SetPinValue(140,1)
     EClock()
]

and ResetOMeF() be
[
      SetPinValue(231,1)
     EClock()
]

and SetControlPhase() be
[
    SetBusValue(8,167,165,164,163,162,159,156,155,#200)
   ClkStart()
   NClk(1)
    SetBusValue(4,135,134,133,129,#10)
   WriteHorCont()
   NClk(1)
   NClk(1)
    SetBusValue(4,135,134,133,129,0)
   WriteHorCont()
   NClk(1)
]

//Left Cycle-shift routine
and LCyc(wrd,amount)= valof
[
	resultis((wrd lshift amount) % (wrd rshift (16-amount)))
]

//Odd-parity checking routine
and Parity(x) = valof
[
	let parity = 0 
	for i = 0 to 15 do 
	[
		parity = parity+x 		;	//"+" is faster than "XOR"
		x = x rshift 1
	]
	resultis (parity & 1)
]


//UNKNOWN SIGNALS REQUIRED: