#pragma once #include "emul.h" /* 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; void at28_init(AT28 *at28, Z80Context *cpu, ushort startoffset, ushort size); byte at28_mem_read(AT28 *at28, ushort addr); void at28_mem_write(AT28 *at28, ushort addr, byte val);