
/********************************************************
   Device name     : Am27S25/27S25A/27S25SA
   Fuse enable pin : G_ ,   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
    D27S25
  ;
  chips = A7, A6, A5, A4, A3, A2, A1, A0, Q0, Q1, Q2, GND,
	  Q3, Q4, Q5, Q6, Q7, K, GS_, CR_, G_, PS_, A8, 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..7], @W;
  @Out  A[0..8], @W;
  @Out  G_,      @W;
  @Out  GS_,     @W;
  @Out  CR_,     @W;
  @Out  PS_,     @W;
  @Out  K,       @W;
  @Out  Vcc,	 @W;
  
  @Out  Q[0..7], @L;
  @Out  A[0..8], @L;
  @Out  G_,	 @L;
  @Out  GS_,	 @L;
  @Out  CR_,	 @L;
  @OUt  PS_,     @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;

  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  CR_, @H;
       @Out  PS_, @H;
       @Out  GS_, @L;
       @Out  G_,  @L;
       @Out  K,   @H;
       @Out  K,   @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 )     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, m;
  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++)
  {
	@Out  CR_,     @H;
	@Out  PS_,     @H;
	@Out  GS_,     @L;
	@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;
	  @Store  tmp;
	  for(m=0;m<8;m++)
	  {
	     if( (tmp & ( 1 << m) ) > 0 )
	     {
		@Out  Q[0..7],  @H;
		@Out  CR_,      @H;
		@Out  G_,	@H;
		@Out  K,	@H;
		@Out  K,	@L;
		@Out  Q[m],     @O;
		@Out G_,        @O;
		@Delay 50,	@Us;
		@Out  Q[m],	@F;
		@Out  G_,       @F;
		@Out  G_,	@L;
		@Out  Q[0..7],  @L;
	     }
	  }
	  @Out  Q[0..7], @Z;
	  @Out  CR_,	 @H;
	  @Out  PS_,     @H;
	  @Out  GS_,     @L;
	  @Out  G_,	 @L;
          @Out  K,	 @H;
	  @Out  K,       @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!";
  }
} 
/* ---------------------------------------------------------------------- */  