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

   Device name     : Am27S185/27S185A
   Fuse enable pin : G_ ,   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
  	D27S184
	D27S185
	D27S185A
  ;
  chips = A6, A5, A4, A3, A0, A1, A2, A10, GND,
	  G_, Q3, Q2, Q1, Q0, A9, A8, A7,  Vcc;
  $v1 = G_;
  $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..10], @W;
  @Out   G_,       @W;
  @Out   Vcc,      @W;
  
  @Out   Q[0..3],  @L;
  @Out   A[0..10], @L;
  @Out   G_,       @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..3], @Z;

  for( i=S_LWHB; i<=E_LWHB; i++)
  {
     @Display  68, 9, i;
     @Out  A[8..10],   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     G_,     @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;
  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..10], 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	   G_,	   @H;
	   @Out    Q[0..3],@H;
	   @Store tmp;
	   tmp = tmp & 0x0f;
	   
	   for ( k=0; k< 4; k++)
	   {
	     @Out  G_,  @H;
	     if( (tmp & (1 << k) ) > 0 )
	     {	     
	        @Out   Q[k],  @O;
                @Out   G_,  @O;	        		
		@Delay 50, @Us;
		@Out   Q[k],  @F;
		@Out  G_,  @F;
		@Out  G_,  @L;
	     }
           }
	   @Out  Q[0..3] ,  @Z;
	   @Out  G_,	    @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!";
  }
} 
/* --------------------------------------------------------------------- */



 