/* Emulates the behavior of an AT28 EEPROM. When reading, behaves like regular
* RAM. When writing, be in "writing mode" for 10ms. If we assume 8MHz, that
* means 80k t-states tracked from the CPU.
*
* While we're in programming mode, reading the written address will emulate
* the "polling mode" of the AT28, that is, each read toggles IO/6.
*
* If another write happens before we're done writing or if we read from another
* address, writing fails (both the new write and the old one) and nothing is
* written to memory.
*/
typedef struct {
// CPU reference needed to keep track of time
Z80Context *cpu;
// only range startoffset:size is used
byte mem[LEN16BIT];
// offset at which the EEPROM begins
ushort startoffset;
// EEPROM size
ushort size;
// t-state stamp of the active writing operation. 0 means none.
unsigned int wrstamp;
// address being written to
ushort wraddr;
// byte being written
byte wrval;
// last polled value. Next polling will yield this value with 6th bit
// toggled.
byte pollval;
} AT28;