A fast, reliable programming algorithm for an EPROM looks something like this:
- erase device
- program 1st location with a short write time
- make a note of how much write time has been used in total so far
- read data back
- if it doesn't match, program it again. Keep doing this until it does read back correctly
- program the same location again, with the same value, using a write time equal to the sum of all the write times that have already been applied to that location. (Or half of it, or twice as much, or whatever the device manufacturer recommends).
- go on to the next location.
When you program a location, what you're doing is injecting charge by force (hence the 25V or 12.5V VPP) into an insulated gate. The amount of charge required to turn on the FET underneath it is variable, and depends on how that individual chip (or even, that individual cell) was fabricated.
The longer you maintain a write pulse, in total, the more charge is loaded onto the gate.
There will be some amount of charge which is guaranteed to cause a bit to flip reliably, but it's not a good idea to do this. For one thing, your programming algorithm will be very slow, but you also end up with excessive charge on the device - and I can see how that might allow bits to be influenced (ie. switched) by surrounding bits.
By building up charge a little at a time, you're:
a) determining, on a byte-by-byte basis, how much charge is actually needed to program that byte
b) ensuring that each byte has significantly more charge than the absolute minimum that will cause it to switch. This ensures safety margin to cope with changes over time and temperature.
c) ensuring you don't over-charge any cell, to the point where it might influence adjacent cells, or be hard to erase
d) speeding up the programming of the device considerably
Meanwhile, in other news, UV erasable devices are obsolete. Self-programming Flash is a much better option in every way. (Algorithms like this one are built in!)