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

   Device name     : Am27S33/27S33A
   Fuse enable pin : G1_ ,  Volt = 15.0 V
   Data out volt   : 20.0 V
   Delay time      : 50 Us
   Date		   : 11. 27. 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
	D27S33
   ;
   chips = A6, A5, A4, A3, A0, A1, A2, G1, GND,
    	   G2, Q3, Q2, Q1, Q0, A9, A8, A7, 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,	    @Us;

  @Out    Q [0..3], @W;
  @Out    A [0..9], @W;
  @Out    G1,       @W;
  @Out    G2,       @W;
  @Out	  Vcc,	    @W;

  @Out    Q[0..3],  @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..9], 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;
     
     if( option == 1 )           @Load tmp;             /* Read */
     else if( option == 4 )      {		        /* Checksum */
         @Store  tmp2;
         tmp2 = tmp2 & 0x0f;
         @Compare tmp, tmp2;
     }
     else if( option == 3 )  				/* Blank_check */
     { 
         if( tmp !=  0 /*blankchar*/ )    Failf (0, 0, i, j, tmp );
     }
     else if( option == 2 )     			/* Verify */
     {
    	 @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..9], 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;	/*  G1 bar */
	    @Out G2, @H;
	    @Out Q[0..3], @H;

	    @Store  tmp;
	    tmp = tmp & 0x0f;

	    for ( k=0; k<4; k++)
	    {
	        @Out G2,      @L;
		@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;
	    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!";
  }
} 
/* -------------------------- END of program ------------------------------ */
 