9static constexpr auto step = EmuDuration::usec(10);
11static 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);
24static void write(
EEPROM_93C46& eeprom, EmuTime& time,
unsigned addr, uint8_t value)
26 assert(addr < EEPROM_93C46::NUM_ADDRESSES);
31 uint32_t pattern = 0b101;
32 pattern <<= EEPROM_93C46::ADDRESS_BITS;
34 pattern <<= EEPROM_93C46::DATA_BITS;
36 unsigned len = 3 + EEPROM_93C46::ADDRESS_BITS + EEPROM_93C46::DATA_BITS;
37 input_pattern(eeprom, time, pattern, len);
43static void write_all(
EEPROM_93C46& eeprom, EmuTime& time, uint8_t value)
48 uint32_t pattern = 0b100;
49 pattern <<= EEPROM_93C46::ADDRESS_BITS;
51 pattern <<= EEPROM_93C46::DATA_BITS;
53 unsigned len = 3 + EEPROM_93C46::ADDRESS_BITS + EEPROM_93C46::DATA_BITS;
54 input_pattern(eeprom, time, pattern, len);
60static void write_enable(
EEPROM_93C46& eeprom, EmuTime& time)
65 uint32_t pattern = 0b100;
66 pattern <<= EEPROM_93C46::ADDRESS_BITS;
68 unsigned len = 3 + EEPROM_93C46::ADDRESS_BITS;
69 input_pattern(eeprom, time, pattern, len);
75static void write_disable(
EEPROM_93C46& eeprom, EmuTime& time)
80 uint32_t pattern = 0b100;
81 pattern <<= EEPROM_93C46::ADDRESS_BITS;
83 unsigned len = 3 + EEPROM_93C46::ADDRESS_BITS;
84 input_pattern(eeprom, time, pattern, len);
98 bool ready = eeprom.
read_DO(time);
111static uint8_t read(
EEPROM_93C46& eeprom, EmuTime& time,
unsigned addr)
113 assert(addr < EEPROM_93C46::NUM_ADDRESSES);
118 uint32_t pattern = 0b110;
119 pattern <<= EEPROM_93C46::ADDRESS_BITS;
121 unsigned len = 3 + EEPROM_93C46::ADDRESS_BITS;
122 input_pattern(eeprom, time, pattern, len);
126 for (
auto i :
xrange(EEPROM_93C46::DATA_BITS)) {
131 result |= eeprom.
read_DO(time);
143static void read_block(
EEPROM_93C46& eeprom, EmuTime& time,
unsigned addr,
144 unsigned num, uint8_t* output)
146 assert(addr < EEPROM_93C46::NUM_ADDRESSES);
151 uint32_t pattern = 0b110;
152 pattern <<= EEPROM_93C46::ADDRESS_BITS;
154 unsigned len = 3 + EEPROM_93C46::ADDRESS_BITS;
155 input_pattern(eeprom, time, pattern, len);
158 for (
auto j :
xrange(num)) {
161 for (
auto i :
xrange(EEPROM_93C46::DATA_BITS)) {
166 *output |= eeprom.
read_DO(time);
178static void erase(
EEPROM_93C46& eeprom, EmuTime& time,
unsigned addr)
180 assert(addr < EEPROM_93C46::NUM_ADDRESSES);
185 uint32_t pattern = 0b111;
186 pattern <<= EEPROM_93C46::ADDRESS_BITS;
188 unsigned len = 3 + EEPROM_93C46::ADDRESS_BITS;
189 input_pattern(eeprom, time, pattern, len);
195static void erase_all(
EEPROM_93C46& eeprom, EmuTime& time)
200 uint32_t pattern = 0b100;
201 pattern <<= EEPROM_93C46::ADDRESS_BITS;
202 pattern |= 0b1000000;
203 unsigned len = 3 + EEPROM_93C46::ADDRESS_BITS;
204 input_pattern(eeprom, time, pattern, len);
213 auto& doc = XMLDocument::getStaticDocument();
214 return doc.allocateElement(
"dummy");
217 const uint8_t* data = eeprom.
backdoor();
218 EmuTime time = EmuTime::zero();
221 for (
auto addr :
xrange(EEPROM_93C46::NUM_ADDRESSES)) {
222 CHECK(data[addr] == 255);
226 write(eeprom, time, 45, 123);
227 CHECK(!waitIdle(eeprom, time));
228 for (
auto addr :
xrange(EEPROM_93C46::NUM_ADDRESSES)) {
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));
237 for (
auto addr :
xrange(EEPROM_93C46::NUM_ADDRESSES)) {
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));
253 for (
auto addr :
xrange(EEPROM_93C46::NUM_ADDRESSES)) {
254 uint8_t expected = (addr == 45) ? 20 : 255;
255 CHECK(data[addr] == expected);
259 erase(eeprom, time, 99);
260 CHECK(waitIdle(eeprom, time));
261 for (
auto addr :
xrange(EEPROM_93C46::NUM_ADDRESSES)) {
262 uint8_t expected = (addr == 45) ? 20 : 255;
263 CHECK(data[addr] == expected);
267 erase(eeprom, time, 45);
268 CHECK(waitIdle(eeprom, time));
269 for (
auto addr :
xrange(EEPROM_93C46::NUM_ADDRESSES)) {
270 CHECK(data[addr] == 255);
274 write_all(eeprom, time, 77);
275 CHECK(waitIdle(eeprom, time));
276 for (
auto addr :
xrange(EEPROM_93C46::NUM_ADDRESSES)) {
277 CHECK(data[addr] == 77);
281 write(eeprom, time, EEPROM_93C46::NUM_ADDRESSES - 2, 5);
282 CHECK(waitIdle(eeprom, time));
283 write(eeprom, time, EEPROM_93C46::NUM_ADDRESSES - 1, 11);
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));
293 for (
auto addr :
xrange(EEPROM_93C46::NUM_ADDRESSES)) {
294 uint8_t expected = (addr == 126) ? 5
298 CHECK(data[addr] == expected);
303 read_block(eeprom, time, EEPROM_93C46::NUM_ADDRESSES - 3, 6, buf);
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));
322 for (
auto addr :
xrange(EEPROM_93C46::NUM_ADDRESSES)) {
323 CHECK(data[addr] == 255);
const uint8_t * backdoor() const
void write_CS(bool value, EmuTime::param time)
void write_CLK(bool value, EmuTime::param time)
bool read_DO(EmuTime::param time) const
void write_DI(bool value, EmuTime::param time)
TEST_CASE("EEPROM_93C46")
This file implemented 3 utility functions:
constexpr auto xrange(T e)