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

   Device name     : Am27S31/27S31A
   Fuse enable pin : G1_ ,  Volt = 15.0 V
   Data out Volt   : 20.0 V
   Delay  time     : 50 Us
   Date		   : 12. 10. 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
   	D27S31
  	D27S31A
  ;
  chips = A7, A6, A5, A4, A3, A2, A1, A0, Q0, Q1, Q2, GND,
  	  Q3, Q4, Q5, Q6, Q7, G4, G3, G2_, G1_, NC, 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..8],  @W;
  @Out     NC,       @W;
  @Out     G1_,	     @W;
  @Out     G2_,      @W;
  @Out     G[3..4],  @W;
  @Out     Vcc,	     @W;
  
  @Out	   Q[0..7],  @L;
  @Out     A[0..8],  @L;
  @Out     G1_,	     @L;
  @Out     G2_,	     @L;
  @Out     G[3..4],  @H;
  @Out     NC,       @L;
  @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;
  @Out  G2_,     @L;
  @Out  G3,      @H;
  @Out  G4,      @H;

  for( i=S_LWHB;i<=E_LWHB;i++)
  {
     @Display 68, 9, i;
     @Out  A8,  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;
	
	@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 /* blankchar */ )	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_,     @L;
  @Out  G[3..4], @H;
  for(i=S_LWHB;i<=E_LWHB;i++)
  {
     @Display  68, 9, i;
     @Out   A8,  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_,  @L;
	     @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;
	     }	
	   } /* for k */
	   @Out Q[0..7],   @Z;
	   @Out G1_,       @L;
	   @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!";
  }
} 
/* -------------------------------------------------------------------- */