/* ***************************************************************************
 *    File Name : 27CX321.D  (gang not supported !!)
 *    Last Modify Date : 91. 3. 4
 *
 *    Device	: 27CX321/322	 (ICT)
 *    Pin num   : 24-pin	 (A0..A11	D0..D7)
 *    Memory size : FFF
 *    Vpp	  : 12.0   Vcc:6.0   LOP=30   Dur=1ms(OverProgram)
 * ************************************************************************* */
declaration
   dataunit : byte;
   functions
      Program
      Read
      Verify
      Data_Compare
   ;
   Manufacturers
      ICT
   ;
   Devices
      D27CX321
      D27CX322
   ;
   chips = A7, A6, A5, A4, A3, A2, A1, A0, D0, D1, D2, GND,
	   D3, D4, D5, D6, D7, CS2, A11, 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;
  @Out GND,  @G;
  @Delay 10, @ms;

  @Out D [0..7] , @W;
  @Out A [0..7] , @W;
  @Out A [8..11], @W; 
  @Out Vcc	, @W;
  @Out CS1	, @W;
  @Out CS2	, @W;
  
  @Out Vcc     , @O;
  @Delay 100   , @us;
}
/* -----------------------------------------------------------------------
 * InitProcess () ---> Initial Buffer | Voltage source
 * ----------------------------------------------------------------------- */
int InitProcess ()
{
   if (FUNCTION != Program) init ( 5.0 , 5.0 );
   else			    init (12.0 , 6.0 );
}
/* -----------------------------------------------------------------------
 * read () ---> read processing
 * ----------------------------------------------------------------------- */
int read (row)
int	row;
{
int  hwhb, hwlb, lwhb, lwlb;
int  sll, ell, slh, elh;
int  tmp, tmp2;

   lwlb = lwhb = hwhb = hwlb = 0;
   sll = ell = slh = elh = tmp= tmp2 = 0;
   
   @Set B_HADDR, B_LADDR;
   @Inc	__B_START__;
   
   @Out D [0..7], @Z;	/* Data Input  */
   
   if (FUNCTION == Read ) 
   {
      @Display 26, row, "Reading...";
      @CheckSumON;
   }
   else if (FUNCTION == Verify)		@Display 26, row, "Verifying...";
   else 			        @Display 26, row, "Data Comparing...";

   for ( hwhb=S_HWHB; hwhb<=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..11], 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 CS2	    , @H;
   	       @Out CS1	    , @L;	    
	       @Out A [0..7], lwlb;    /* Low  byte address output */
	       @In  D [0..7], tmp;	       
	       @Out CS2	    , @L;	       
	       @Out CS1     , @H;
	       
	       if (FUNCTION == Read)          @Load 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;
	       }       
	       @Inc SPLIT;
            }
	 }
      }
   }
   if 	   (FUNCTION == Read)		@Display 26, row, "Read OK!   ";
   else if (FUNCTION == Verify)		@Display 26, row, "Verification OK!";
   else 			        @Display 26, row, "Data Comparison OK!";   
}
/* -----------------------------------------------------------------------
 * program() ---> Control main
 * ----------------------------------------------------------------------- */
int program ()
{
int  hwhb, hwlb, lwhb, lwlb;
int  sll, slh, ell, elh;
int  tmp , tmp2, failcnt;

   lwlb = lwhb = hwhb = hwlb = failcnt = 0;
   sll = ell = slh = elh = tmp = tmp2 = 0;

   @Set B_HADDR, B_LADDR;   
   @Inc	__B_START__;
   
   @Out  CS1	, @H;
   
   @Display 26, 6, "Programming...";
   
   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..11], 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;
		  
		  if (tmp == 0xFF)
		  {
		      @Inc  SPLIT;
		      continue;
		  }
		  @Out CS2     , @L;	
	          @Out A [0..7], lwlb;
	          @Out D [0..7], tmp;
	          @Out Vpp     , @O;
	          @Delay 50    , @us;
	          @Out Vpp     , @F;
	          
		  /* -------- Verify --------- */
		  @Out D [0..7], @Z;
		  @Out CS1     , @L;
		  @Out CS2     , @H;		  
	          @In  D [0..7], tmp2;
		  @Out D [0..7], @W;		  
		  
		  if (tmp != tmp2)
                  {
		     if (failcnt > 30) Failf (hwhb, hwlb, lwhb, lwlb, tmp2);
                     else 
                     {
                        ++ failcnt;
                     	lwlb--;
                     }
                  }
                  else 
                  {
                      failcnt = 0;
		      @Inc SPLIT;
 		  }
               }
	   }
       }
   }
   @Display  26, 6, "Program OK!  ";
   FUNCTION = Verify;
   @Vout 2, 5.0;
   @Vout 3, 5.0;
   read (7);		/*  Verify  */
}
/* -----------------------------------------------------------------------
 * main () ---> Control main
 * ----------------------------------------------------------------------- */
int main ()
{
   InitProcess();
   
   if ( FUNCTION == Program ) program();
   else 		      read (6);
}
/* ---------------------------- End of program --------------------------- */ 