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

   Device name     : Am27S41/27S41A/27PS1
   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:  1. 29. 1991
   Author	   : E. Y. Lee
***************************************************/
declaration
  dataunit : byte;
  functions
	Program
	Read
	Verify
	Blank_check
	Data_compare
	Auto
  ;
  Manufacturers
	AMD
  ;
  Devices
	D27S41
	D27S41A
	D27PS41
  ;
  chips = A8, A7, A6, A5, A4, A3, A2, A1, A0, GND,
	  Q3, Q2, Q1, Q0, G1, G2, A11, A10, A9, 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..3], @W;
  @Out A[0..11], @W;
  @Out       G1, @W;
  @Out       G2, @W;
  @Out      Vcc, @W;
  
  @Out  Q[0..3], @L;
  @Out  A[0..11],@L;
  @Out  G[1..2], @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..3],  @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,     @L;

	@In      Q[0..3], tmp;
        tmp = tmp & 0x0f;
	if( option == 1 )	        @Load  tmp;
	else if( option == 4 )      {
	  @Store tmp2;
	  tmp2 = tmp2 & 0x0f;
	  @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 & 0x0f))        Failf ( 0, 0, i, j, tmp );
	}
	@Inc    SPLIT;
      }
    }
}
/* --------------------------------------------------------------------- */
int  program()
{
  int   failcnt,  i, j, k, mm;
  int   tmp, tmp2;
  int   saddr, eaddr;

  failcnt = 0;
  tmp = tmp2 = 0;
  @Set  B_HADDR, B_LADDR;
  init( 15.0, 20.0, 5.2 );
 
  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 	 G2, @L;
	   @Out	    Q[0..3], @H;
	   @Store      tmp;
	   tmp = tmp & 0x0f;
	   for (k= 0; k<4; k++)
	   {
	 	@Out   G1,  @H;
		@Out Q[0..3],@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..3],  @L;
		  @Out       G1,  @L;
                }
 	    }

	    @Out  Q[0..3],  @Z;
	    @Out  G1,       @L;
	    @Out  G2,       @L;
	    @In   Q[0..3], tmp2;
	    @Out  Q[0..3],  @W;
	    if( tmp != ( tmp2 & 0x0f) )
	    {
		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!";
  }
} 
/* --------------------------------------------------------------------- */

	
		  



 