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 return doc.allocateElement(
"dummy");
217 const uint8_t* data = eeprom.
backdoor();
218 EmuTime time = EmuTime::zero();
222 CHECK(data[addr] == 255);
226 write(eeprom, time, 45, 123);
227 CHECK(!waitIdle(eeprom, time));
229 CHECK(data[addr] == 255);
233 write_enable(eeprom, time);
234 CHECK(!waitIdle(eeprom, time));
235 write(eeprom, time, 45, 123);
236 CHECK(waitIdle(eeprom, time));
238 uint8_t expected = (addr == 45) ? 123 : 255;
239 CHECK(data[addr] == expected);
243 CHECK(
int(read(eeprom, time, 45)) == 123);
244 CHECK(!waitIdle(eeprom, time));
245 CHECK(
int(read(eeprom, time, 46)) == 255);
246 CHECK(!waitIdle(eeprom, time));
251 write(eeprom, time, 45, 20);
252 CHECK(waitIdle(eeprom, time));
254 uint8_t expected = (addr == 45) ? 20 : 255;
255 CHECK(data[addr] == expected);
259 erase(eeprom, time, 99);
260 CHECK(waitIdle(eeprom, time));
262 uint8_t expected = (addr == 45) ? 20 : 255;
263 CHECK(data[addr] == expected);
267 erase(eeprom, time, 45);
268 CHECK(waitIdle(eeprom, time));
270 CHECK(data[addr] == 255);
274 write_all(eeprom, time, 77);
275 CHECK(waitIdle(eeprom, time));
277 CHECK(data[addr] == 77);
282 CHECK(waitIdle(eeprom, time));
284 CHECK(waitIdle(eeprom, time));
285 write(eeprom, time, 0, 22);
286 CHECK(waitIdle(eeprom, time));
289 write_disable(eeprom, time);
290 CHECK(!waitIdle(eeprom, time));
291 write(eeprom, time, 1, 33);
292 CHECK(!waitIdle(eeprom, time));
294 uint8_t expected = (addr == 126) ? 5
298 CHECK(data[addr] == expected);
304 CHECK(!waitIdle(eeprom, time));
313 erase_all(eeprom, time);
314 CHECK(!waitIdle(eeprom, time));
315 CHECK(data[0] == 22);
318 write_enable(eeprom, time);
319 CHECK(!waitIdle(eeprom, time));
320 erase_all(eeprom, time);
321 CHECK(waitIdle(eeprom, time));
323 CHECK(data[addr] == 255);
static constexpr uint8_t ADDRESS_BITS
const uint8_t * backdoor() const
void write_CS(bool value, EmuTime::param time)
static constexpr uint32_t NUM_ADDRESSES
static constexpr uint8_t DATA_BITS
void write_CLK(bool value, EmuTime::param time)
bool read_DO(EmuTime::param time) const
void write_DI(bool value, EmuTime::param time)
static constexpr EmuDuration usec(unsigned x)
static XMLDocument & getStaticDocument()
TEST_CASE("EEPROM_93C46")
This file implemented 3 utility functions:
constexpr auto xrange(T e)