11 static void input_pattern(
EEPROM_93C46& eeprom, EmuTime& time, uint32_t pattern,
unsigned len)
14 for (
auto i :
xrange(len)) {
15 eeprom.
write_DI(pattern & (1 << (len - 1 - i)), time);
24 static void write(
EEPROM_93C46& eeprom, EmuTime& time,
unsigned addr, uint8_t value)
31 uint32_t pattern = 0b101;
37 input_pattern(eeprom, time, pattern, len);
43 static void write_all(
EEPROM_93C46& eeprom, EmuTime& time, uint8_t value)
48 uint32_t pattern = 0b100;
54 input_pattern(eeprom, time, pattern, len);
60 static void write_enable(
EEPROM_93C46& eeprom, EmuTime& time)
65 uint32_t pattern = 0b100;
69 input_pattern(eeprom, time, pattern, len);
75 static void write_disable(
EEPROM_93C46& eeprom, EmuTime& time)
80 uint32_t pattern = 0b100;
84 input_pattern(eeprom, time, pattern, len);
90 static bool waitIdle(
EEPROM_93C46& eeprom, EmuTime& time)
98 bool ready = eeprom.read_DO(time);
111 static uint8_t read(
EEPROM_93C46& eeprom, EmuTime& time,
unsigned addr)
118 uint32_t pattern = 0b110;
122 input_pattern(eeprom, time, pattern, len);
131 result |= eeprom.
read_DO(time);
143 static void read_block(
EEPROM_93C46& eeprom, EmuTime& time,
unsigned addr,
144 unsigned num, uint8_t* output)
151 uint32_t pattern = 0b110;
155 input_pattern(eeprom, time, pattern, len);
158 for (
auto j :
xrange(num)) {
166 *output |= eeprom.
read_DO(time);
178 static void erase(
EEPROM_93C46& eeprom, EmuTime& time,
unsigned addr)
185 uint32_t pattern = 0b111;
189 input_pattern(eeprom, time, pattern, len);
195 static void erase_all(
EEPROM_93C46& eeprom, EmuTime& time)
200 uint32_t pattern = 0b100;
202 pattern |= 0b1000000;
204 input_pattern(eeprom, time, pattern, len);
214 const uint8_t* data = eeprom.
backdoor();
215 EmuTime time = EmuTime::zero();
219 CHECK(data[addr] == 255);
223 write(eeprom, time, 45, 123);
224 CHECK(!waitIdle(eeprom, time));
226 CHECK(data[addr] == 255);
230 write_enable(eeprom, time);
231 CHECK(!waitIdle(eeprom, time));
232 write(eeprom, time, 45, 123);
233 CHECK(waitIdle(eeprom, time));
235 uint8_t expected = (addr == 45) ? 123 : 255;
236 CHECK(data[addr] == expected);
240 CHECK(
int(read(eeprom, time, 45)) == 123);
241 CHECK(!waitIdle(eeprom, time));
242 CHECK(
int(read(eeprom, time, 46)) == 255);
243 CHECK(!waitIdle(eeprom, time));
248 write(eeprom, time, 45, 20);
249 CHECK(waitIdle(eeprom, time));
251 uint8_t expected = (addr == 45) ? 20 : 255;
252 CHECK(data[addr] == expected);
256 erase(eeprom, time, 99);
257 CHECK(waitIdle(eeprom, time));
259 uint8_t expected = (addr == 45) ? 20 : 255;
260 CHECK(data[addr] == expected);
264 erase(eeprom, time, 45);
265 CHECK(waitIdle(eeprom, time));
267 CHECK(data[addr] == 255);
271 write_all(eeprom, time, 77);
272 CHECK(waitIdle(eeprom, time));
274 CHECK(data[addr] == 77);
279 CHECK(waitIdle(eeprom, time));
281 CHECK(waitIdle(eeprom, time));
282 write(eeprom, time, 0, 22);
283 CHECK(waitIdle(eeprom, time));
286 write_disable(eeprom, time);
287 CHECK(!waitIdle(eeprom, time));
288 write(eeprom, time, 1, 33);
289 CHECK(!waitIdle(eeprom, time));
291 uint8_t expected = (addr == 126) ? 5
295 CHECK(data[addr] == expected);
301 CHECK(!waitIdle(eeprom, time));
310 erase_all(eeprom, time);
311 CHECK(!waitIdle(eeprom, time));
312 CHECK(data[0] == 22);
315 write_enable(eeprom, time);
316 CHECK(!waitIdle(eeprom, time));
317 erase_all(eeprom, time);
318 CHECK(waitIdle(eeprom, time));
320 CHECK(data[addr] == 255);