/* *****************************************************************
 *    File Name : CY7C261.D
 *    Last Modify Date : 91. 3. 13 
 *
 *    Device 	: CYPRESS  7C261/263/264 (Power switched and PROM)
 *    Pin num	: 24-pin   (A0..A12	D0..D7)
 *    Size	: 64K (1FFF)
 *    LOP	: 10
 *    Vpp	: 12.5		Vcc : 5.0      Dur =200us   LOP=10
 * ***************************************************************** */
declaration
   dataunit : byte;
   functions
      Program
      Read
      Verify
      Blank_Check
      Data_Compare      
      Auto      
   ;
   Manufacturers
      CYPRESS
   ;
   Devices
     D7C261
     D7C263
     D7C264
   ;
   chips = A7, A6, A5, A4:AY12, A3:AY11, A2:AY10, A1:AY9, A0:AY8, D0, D1, D2, GND,
	   D3, D4, D5, D6, D7, A12:NA, A11:Vpp, CS, A10:LATCH, A9:PGM, A8:VFY, Vcc;
   $v2 = Vpp;
   $v3 = Vcc;
endd

/* -----------------------------------------------------------------------
 * Failf () ---> Fail address setting
 * ----------------------------------------------------------------------- */
int Failf (hwhb, hwlb, lwhb, lwlb, tmp)
int hwhb, hwlb, lwhb, lwlb, tmp;
{
int high, low;

   high = (hwhb << 8) | hwlb;
   low  = (lwhb << 8) | lwlb;

   @Fail high, low, tmp;
}
/* ----------------------------------------------------------------------
 * init () ---> Initial processing
 * ----------------------------------------------------------------------- */
int     init (vol2, vol3)
voltage vol2, vol3;
{
   @Vout 1	, vol2;
   @Vout 2	, vol2;            /* Voltage Source #2 */
   @Vout 3	, vol3;            /* Voltage Source #3 */
   @Out GND     , @G;       	   /* Ground output */
   @Delay 10	, @ms;

   @Out D [0..7] , @W;   
   @Out A [0..7] , @W;   
   @Out A [8..12], @W;
   @Out AY[8..12], @W;
   @Out CS	 , @W;
   @Out Vcc	 , @W; 
   
   @Out CS	 , @H;
   @Out Vcc	 , @L;

   @Out Vcc	 , @O;
   @Delay 1	 , @Ms;	   
}
/* -----------------------------------------------------------------------
 * InitProcess () ---> Initial Buffer | Voltage source
 * ----------------------------------------------------------------------- */
int InitProcess ()
{
   if (FUNCTION != Program)     init ( 5.0 , 5.0 );
   else                     	init ( 12.5, 5.0 );
}
/* -----------------------------------------------------------------------
 * read () ---> read processing
 * ----------------------------------------------------------------------- */
int read (row)
int	row;
{
int  hwhb, hwlb, lwhb, lwlb;
int  sll, slh, ell, elh;
int  tmp, tmp2;

   lwlb = lwhb = hwhb = hwlb = 0;
   sll= ell = elh= elh = tmp = tmp2 = 0;
   
   @Set	B_HADDR, B_LADDR;   
   @Inc	__B_START__;
   
   @Out D [0..7], @Z;	/* Data Input  */
   @Out A [8..12], @W;   
   @Out A [8..12], @L;
   
   if ( FUNCTION == Read ) 
   {
      @Display 26, row, "Reading...";
      @CheckSumON;
   }
   else if (FUNCTION == Verify)		@Display 26, row, "Verifying...";
   else if (FUNCTION == Blank_Check)	@Display 26, row, "Blank Checking...";
   else 			        @Display 26, row, "Data Comparing...";
   
   for ( hwhb=0 /* S_HWHB */ ; hwhb<=0 /* E_HWHB */; hwhb++ )
   {
      @Display 64, 9, hwhb;
      for ( hwlb=0 /* S_HWLB */; hwlb<=0 /* E_HWLB */; hwlb++ )
      {
         if (hwlb == S_HWLB) slh = S_LWHB;
         else		     slh = 0;
         if (hwlb == E_HWLB) elh = E_LWHB;
         else                elh = 0xFF;	 
         
         for ( lwhb=slh; lwhb <=elh; lwhb++)
         {
            @Display 68, 9, lwhb;
	    @Out A [8..12], lwhb;   /* Output High word address */
	    
	    if (lwhb == S_LWHB) sll = S_LWLB;
            else                sll = 0;
            if (lwhb == E_LWHB) ell = E_LWLB;
            else                ell = 0xFF;

	    for ( lwlb=sll; lwlb<=ell; lwlb++)
	    {
   	       @Out CS	    , @L;	    	
	       @Out A [0..7], lwlb;
	       @In  D [0..7], tmp;
	       
	       if      (FUNCTION == Read)	   @Load tmp;
	       else if (FUNCTION == Blank_Check)
	       {
		  if (tmp != 0x00) 
		     Failf (hwhb, hwlb, lwhb, lwlb, tmp);
	       }
	       else if (FUNCTION == Verify)
	       {
                  @Store tmp2;
                  if (tmp != tmp2) Failf (hwhb, hwlb, lwhb, lwlb, tmp);
               }
               if (FUNCTION == Data_Compare)
	       {
	          @Store tmp2;
	          @Compare tmp, tmp2;
	       }	       
	       @Inc SPLIT;
            }
	 }
      }
   }
   if 	   (FUNCTION == Read)		@Display 26, row, "Read OK!   ";
   else if (FUNCTION == Verify)		@Display 26, row, "Verification OK!";
   else if (FUNCTION == Blank_Check)	@Display 26, row, "Blank Check OK!  ";
   else 			        @Display 26, row, "Data Comparison OK!";
}
/* -----------------------------------------------------------------------
 * program () ---> Control main
 * ----------------------------------------------------------------------- */
int program (row, kind)
int	row, kind;
{
int  hwhb, hwlb, lwhb, lwlb;
int  sll, ell, slh, elh;
int  tmp , tmp2, failcnt;

   failcnt = lwlb = lwhb = hwhb = hwlb = 0;
   sll = ell = slh = elh = tmp = tmp2 = 0;
   
   @Set	B_HADDR, B_LADDR;
   @Inc	__B_START__;
   
   @Out CS	, @L;
   @Out LATCH	, @L;
   @Out PGM	, @H;
   @Out VFY	, @H;
   @Out Vpp	, @O;   
   
   @Display 26, row, "Programming...";      
   
   for ( hwhb=0 /* S_HWHB */; hwhb<=0 /* E_HWHB */; hwhb++ )
   {
       @Display 64, 9, hwhb;
       for ( hwlb=0 /* S_HWLB */; hwlb<=0 /* E_HWLB */; hwlb++ )
       {
	   @Display 66, 9, hwlb;	       
           if (hwlb == S_HWLB) slh = S_LWHB;
           else		  slh = 0;
           if (hwlb == E_HWLB) elh = E_LWHB;
           else                elh = 0xFF;	 
         
           for ( lwhb=slh; lwhb <=elh; lwhb++)
           {
               @Display 68, 9, lwhb;
               @Out AY[8..12], lwhb;   /* Output High word address */	    
 	       @Out LATCH, @H;
	       @Out LATCH, @L;			 	   
	       
	       if (lwhb == S_LWHB) sll = S_LWLB;
               else                sll = 0;
               if (lwhb == E_LWHB) ell = E_LWLB;
               else                ell = 0xFF;

	       for ( lwlb=sll; lwlb<=ell; lwlb++)
               {
		@Store tmp;
		  
		if (tmp == 0x00)	/*  if data is blank then skip */
		{
		    @Inc  SPLIT;
		    continue;
		}	
	 	@Out A [0..7], lwlb;
		@Out D [0..7], tmp;
		@Out PGM     , @L;
		@Delay 200   , @us;
		@Out PGM     , @H;

  	      /* ----- Verify ------- */
	        @Out D [0..7], @Z;
		@Out VFY     , @L;
		@In  D [0..7], tmp2;
		@Out VFY     , @H;
		@Out D [0..7], @W;
		
		if ( tmp != tmp2 )
                {
		   if ( failcnt > 10 )  Failf (hwhb, hwlb, lwhb, lwlb, tmp2);
		   else
		   {
			++ failcnt;
			lwlb--;
		   }
                }
                else
                {
                    failcnt = 0;
                    @Inc SPLIT;
                }
            }
         }		            
      }
   }
   @Display 26, row, "Program OK!   ";
   if (kind == 0)	row = 7;
   else			row = 8;
   FUNCTION = Verify;
   @Vout  2, 5.0;
   @Vout  3, 5.0;
   @Out Vpp, @F;
   read (row);
}

/* -----------------------------------------------------------------------
 * main () ---> Control main
 * ----------------------------------------------------------------------- */
int main ()
{
   InitProcess();

   if ( FUNCTION == Auto )
   {
	FUNCTION = Blank_Check;
	read (6);

	FUNCTION = Program;
	InitProcess ();
	program(7, 1);
   }
   else if ( FUNCTION == Program ) program(6, 0);
   else 			   read (6);
}
/* ---------------------------- End of program --------------------------- */ 