/* ****************************************************************************
 *    File Name : XL46C15.D				InfoCode=42
 *    Vpp	: 13.5		Vcc:6.0		Dur:5.0(Erase)
 *    Device 	: EXEL		46C15
 *    Pin num	: 24-pin   (A0..A10	D0..D7) 
 *    Memory Size :  16K   (7FF)
 *    Last Modify Date : 91. 3. 6
 * *************************************************************************** */
declaration
   dataunit : byte;
   functions
      Program
      Read
      Verify
      Blank_Check
      Data_Compare
      Auto      
   ;
   Manufacturers
      EXEL
   ;
   Devices
      DXL46C15
   ;
  chips =  A7, A6, A5, A4, A3, A2, A1, A0, D0, D1, D2, Vss,
	   D3, D4, D5, D6, D7, CS2, CS3, CS1:Vpp, A10, A9, A8, 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 2,  vol2;
   @Vout 3,  vol3;            /* Voltage Source #3 */
   @Out Vss, @G;       /* Ground output */
   @Delay 10	, @ms;

   @Out D [0..7] , @W;       /* ------------------------ */
   @Out A [0..7] , @W;       /*                          */
   @Out A [8..10], @W;       /*   Initial Direction      */
   @Out CS1      , @W;       /*         Of               */
   @Out CS2	 , @W;       /*        Port              */
   @Out CS3      , @W;       /* ------------------------ */

   @Out CS1      , @H;       /* Chip enable  is High */
   @Out CS2 	 , @H;       /* PGM  disable is High */
   @Out CS3	 , @H;       /* Out  enable  is High */
   
   @Out Vcc      , @O;       /* Vcc Enable */
   @Delay 100	 , @us;
}
/* -----------------------------------------------------------------------
 * InitProcess () ---> Initial Buffer | Voltage source
 * ----------------------------------------------------------------------- */
int InitProcess ()
{
   if (FUNCTION != Program) init ( 5.0 , 5.0 );
   else                     init (13.5 , 6.0 );
}
/* -----------------------------------------------------------------------
 * read () ---> read processing
 * ----------------------------------------------------------------------- */
int read (row)
int	row;
{
int  hwhb, hwlb, lwhb, lwlb;
int  sll, ell, slh, elh;
int  tmp, tmp2;

   hwhb = hwlb = tmp = tmp2 = 0;           
   sll = ell = slh = elh = 0;
   
   @Set B_HADDR, B_LADDR;
   @Inc	__B_START__;
   
   @Out D [0..7], @Z;	/* Data Input  */
   @Out	CS2	, @L;
   @Out	CS3	, @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++ )
      {
         @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 A [8..10], 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 A [0..7], lwlb;    /* Low  byte address output */
	       @Out CS1     , @L;
	       @Out CS2	    , @H;
	       @Out CS3	    , @H;
	       
	       @In  D [0..7], tmp;
	       
	       if (FUNCTION == Read)		  @Load tmp;
	       else if (FUNCTION == Blank_Check)
	       {
		  if (tmp != 0xFF) Failf (hwhb, hwlb, lwhb, lwlb, tmp);
	       }
	       else if (FUNCTION == Verify)
	       {
                  @Store tmp2;
                  if (tmp != tmp2) Failf (hwhb, hwlb, lwhb, lwlb, tmp);
               }
	       else if (FUNCTION == Data_Compare)
	       {
                  @Store tmp2;
                  @Compare tmp, tmp2;
               }               
	       if (FUNCTION != Blank_Check)	@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 () ---> Device program
 * ----------------------------------------------------------------------- */
int program (row, kind)
int	row, kind;
{
int  hwhb, hwlb, lwhb, lwlb;
int  sll, ell, slh, elh;
int  tmp , tmp2, failcnt;

   @Set	B_HADDR, B_LADDR;
   @Inc	__B_START__;
   
   slh = elh = sll = ell = failcnt = tmp = tmp2= 0;
   lwlb = lwhb = hwhb = hwlb = 0;
   @Out	Vpp ,  @O;
   @Display 26, row, "Programming...";      
   
   /* ---------------- Reset Cycle --------------------------------- */
   @Out Vpp	, @O;
   @Delay 50	, @ms;
   
   for ( hwhb=0 /* S_HWHB */; hwhb<=0 /* E_HWHB */; hwhb++ )
   {
      @Display 64, 9, hwhb;
      for ( hwlb= S_HWLB ; hwlb<=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 A [8..10], 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++)
	    {
	       @Store tmp;
	          
	       @Out A [0..7], lwlb;
	       @Out D [0..7], tmp;
	       @Out CS2     , @L;
		  
	       @Out Vpp     , @O;
	       @Delay  5    , @ms;
	       @Out Vpp     , @F;

	       /* -------- One Byte Verify -------------- */			       
	       @Out CS2     , @H;
	       @Out D [0..7], @Z;
	       @In  D [0..7], tmp2;
	       @Out CS1     , @L;
	       @Out D [0..7], @W;

	       if (tmp != tmp2)
               {
               	  if (failcnt > 25)	Failf(hwhb, hwlb, lwhb, lwlb, tmp2);
	          else
	          {
	  	     ++ failcnt;
		     lwlb--;
		  }
 	       }		  
               else
               {
                     failcnt = 0;
                     @Inc SPLIT;
               }
            }		/* end for : lwlb	    */
         }		/* end for : lwhb	    */
      }			/* end for : hwlb	    */
   }      	   	/* end for : hwhb	    */
   @Display 26, row, "Program OK!   ";
   FUNCTION = Verify;
   @Vout 3, 5.0;
   read (6);   
}
/* -----------------------------------------------------------------------
 * 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 --------------------------- */ 