|
- #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);
|