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

   Device name     : Am27S43/27S43A
   Fuse enable pin : G1_ ,  Volt = 15.0 V
   Data out Volt   : 20.0 V
   Delay time      : 50 Us
   Date		   : 11. 26. 1990
   Last Modify date:  2. 26. 1991
   Author	   : E. Y. Lee
**********************************************************/
declaration
  dataunit : byte;
  functions
	Program
	Read
	Verify
	Blank_check
	Data_compare
	Auto
  ;
  Manufacturers
	AMD
  ;
  Devices
	D27S43
	D27S43A
  ;
  chips = A7, A6, A5, A4, A3, A2, A1, A0, Q0, Q1, Q2, GND,
	  Q3, Q4, Q5, Q6, Q7, G2, A11, G1_, A10, A9, A8, Vcc
  ;
  $v1 = G1_;
  $v2 = Q;
  $v3 = Vcc;
endd
/* --------------------------------------------------------------------- */
int  init( vol1, vol2, vol3)
voltage  vol1, vol2, vol3;
{
   @Vout  1, vol1;
   @Vout  2, vol2;
   @Vout  3, vol3;
   @Out  GND,  @G;
   @Delay 10,  @Ms;
   
   @Out  Q[0..7], @W;
   @Out  A[0..11], @W;
   @Out  G1_,	  @W;
   @Out  G2,	  @W;
   @Out  Vcc,	  @W;
   
   @Out  Q[0..7], @L;
   @Out  A[0..11],@L;
   @Out  G1_,	  @L;
   @Out  G2,	  @H;
   @Out  Vcc,	  @L;
   @Out  Vcc,     @O;
   @Delay 100,	  @Us;
}
/* --------------------------------------------------------------------- */
int  Failf ( hwhb, hwlb, lwhb, lwlb, data )
int  hwhb, hwlb, lwhb, lwlb, data;
{
  int  high, low;

  high = ( hwhb << 8) | hwlb;
  low  = (lwhb << 8) | lwlb;
  @Fail   high, low, data;
}
/* --------------------------------------------------------------------- */
int  read (option)
int  option;
{
  int i,j;
  int tmp, tmp2;
  int saddr, eaddr;

  @Set  B_HADDR, B_LADDR;                         
  init(5.0, 5.0, 5.0);
  tmp = tmp2 = 0;
  @Out Q[0..7], @Z;

  for(i=S_LWHB;i<=E_LWHB;i++)
  {
     @Display  68, 9, i;
     @Out   A[8..11], i;
     if( i == S_LWHB )  saddr = S_LWLB;
     else		saddr = 0;
     if( i == E_LWHB )  eaddr = E_LWLB;
     else		eaddr = 0xff;     
     for (j=saddr;j<=eaddr;j++)
     {
	@Out  A[0..7],  j;
	@Out  G1_,     @L;
	@Out  G2,      @H;
	@In   Q[0..7], tmp;
	if( option == 1 ) 	       @Load  tmp;
	else if( option == 4 )        {
	    @Store tmp2;
	    @Compare tmp, tmp2;
	}
	else if( option == 3 )
	{
	    if( tmp != 0 ) 	Failf ( 0, 0, i, j, tmp);
	}
	else if( option == 2 )
	{
	    @Store  tmp2;
	    if( tmp != tmp2)      Failf( 0, 0, i, j, tmp);
	}
	@Inc   SPLIT;
     }
  }
}
/* --------------------------------------------------------------------- */
int   program()
{
  int  failcnt, i, j, k;
  int  tmp, tmp2;
  int  saddr, eaddr;

  failcnt = 0;
  tmp = tmp2 = 0;
  @Set  B_HADDR,  B_LADDR;
  init( 15.0, 20.0, 5.2 );

  @Out   G2,     @H;  
  for(i=S_LWHB;i<=E_LWHB;i++)
  {
	@Display  68, 9, i;
	@Out    A[8..11], i;
        if( i == S_LWHB )  saddr = S_LWLB;
        else		saddr = 0;
        if( i == E_LWHB )  eaddr = E_LWLB;
        else		eaddr = 0xff;	
	for(j=saddr;j<=eaddr;j++)
	{
	   @Out      A[0..7], j;
	   @Out        G1_,  @H;
	   @Out	    Q[0..7], @H;
	   @Store   tmp;
	   for (k=0;k<8;k++)
	   {
	      @Out  G1_, @H;
	      @Out  Q[0..7], @H;
	      if( (tmp & (1 << k) ) > 0)
	      {
	         @Out  Q[k],  @O;                              
		 @Out   G1_, @O;
		 @Delay  50, @Us;
		 @Out  Q[k],  @F;
		 @Out   G1_,   @F;
		 @Out Q[0..7], @L;
		 @Out   G1_,   @L;
	      }
	   }
	   @Out  Q[0..7],  @Z;
	   @Out  G1_,      @L;
	   @Out  G2,       @H;
	   @In   Q[0..7], tmp2;
	   @Out  Q[0..7],  @W;
	   if( tmp != tmp2 )
	   {
	      if( failcnt > LOP )    Failf ( 0, 0, i, j, tmp2);
	      else 	failcnt ++;
	      j -= 1;
	   }
	   else     
	   {  failcnt = 0;
              @Inc  SPLIT;
           }
	}	/* for j */
     }		/* for i */
}	
/* --------------------------------------------------------------------- */
int  main()
{
  if( FUNCTION == Read)	     {
  	@Display 26, 6, "Reading...";
  	read(1);
  	@Display 26, 6, "Read OK!  ";
  	@CheckSumOn;
  }
  else if( FUNCTION == Program)	 {
  	@Display 26, 6, "Programming...";
  	program();
  	@Display 26, 6, "Program OK!   ";
  	@Display 26, 7, "Verifying...";
  	read(2);
  	@Display 26, 7, "Verification OK!";
  }  	
  else if( FUNCTION == Verify)	 {
  	@Display 26, 6, "Verifying...";
  	read(2);
  	@Display 26, 6, "Verification OK!";
  }
  else if( FUNCTION == Blank_check)  {
  	@Display 26, 6, "Blank checking...";
  	read(3);
  	@Display 26, 6, "Blank check OK!  ";
  }
  else if( FUNCTION == Data_compare)  {
  	@Display 26, 6, "Data comparing...";
  	read(4);
  	@Display 26, 6, "Data comparison OK!";
  }
  else if( FUNCTION == Auto)     {
	@Display 26, 6, "Blank checking...";  
  	read(3);
  	@Display 26, 6, "Blank check OK!  ";
  	@Display 26, 7, "Programming...";
  	program();
  	@Display 26, 7, "Program OK!   ";
  	@Display 26, 8, "Verifying...";
  	read(2);
  	@Display 26, 8, "Verification OK!";
  }
} 
/* --------------------------------------------------------------------- */




 