tests.rsannotatedtests.rssource670 lines · 15.4 KB · raw
1use super::*;
2use test_log::test;
3
4macro_rules! test_op {
5    ($chip:expr, read expect=$sda:literal) => {
6        assert_eq!(
7            $sda != 0,
8            $chip.handle_read(),
9            "Expected SDA {}, got {}",
10            $sda,
11            u8::from($chip.handle_read())
12        );
13    };
14    ($chip:expr, write sda=$sda:literal scl=$scl:literal) => {
15        $chip.handle_dual_write($sda != 0, $scl != 0);
16    };
17}
18
19macro_rules! run_test {
20    ($chip:expr, [$(($($t:tt)* $(,)?)),* $(,)?]) => {
21        $(
22            test_op!($chip, $($t)*);
23        )*
24    };
25}
26
27// Reads in the same style as Wonder Boy in Monster World
28#[test]
29fn x24c01_basic_read() {
30    let mut bytes = vec![0_u8; 128];
31    bytes[0] = 0b0110_1001;
32    bytes[1] = 0b1100_0011;
33    let mut x24c01 = X24C01Chip::new(Some(&bytes));
34
35    run_test!(x24c01, [
36        // Initialize to standby
37        (write sda=1 scl=1),
38        (write sda=0 scl=1),
39        // Send address
40        (write sda=0 scl=0),
41        (write sda=0 scl=0),
42        (write sda=0 scl=0),
43        (write sda=0 scl=1),
44        (write sda=0 scl=0),
45        (write sda=0 scl=0),
46        (write sda=0 scl=1),
47        (write sda=0 scl=0),
48        (write sda=0 scl=0),
49        (write sda=0 scl=1),
50        (write sda=0 scl=0),
51        (write sda=0 scl=0),
52        (write sda=0 scl=1),
53        (write sda=0 scl=0),
54        (write sda=0 scl=0),
55        (write sda=0 scl=1),
56        (write sda=0 scl=0),
57        (write sda=0 scl=0),
58        (write sda=0 scl=1),
59        (write sda=0 scl=0),
60        (write sda=0 scl=0),
61        (write sda=0 scl=1),
62        (write sda=0 scl=0),
63        (write sda=1 scl=0),
64        (write sda=1 scl=1),
65        (write sda=1 scl=0),
66        (write sda=1 scl=0),
67        (write sda=1 scl=1),
68        // Address ACK
69        (read expect=0),
70        // Send data at address 0
71        (write sda=1 scl=0),
72        (write sda=1 scl=1),
73        (read expect=0),
74        (write sda=1 scl=0),
75        (write sda=1 scl=1),
76        (read expect=1),
77        (write sda=1 scl=0),
78        (write sda=1 scl=1),
79        (read expect=1),
80        (write sda=1 scl=0),
81        (write sda=1 scl=1),
82        (read expect=0),
83        (write sda=1 scl=0),
84        (write sda=1 scl=1),
85        (read expect=1),
86        (write sda=1 scl=0),
87        (write sda=1 scl=1),
88        (read expect=0),
89        (write sda=1 scl=0),
90        (write sda=1 scl=1),
91        (read expect=0),
92        (write sda=1 scl=0),
93        (write sda=1 scl=1),
94        (read expect=1),
95        (write sda=1 scl=0),
96        (write sda=0 scl=0),
97        (write sda=0 scl=1),
98        (write sda=0 scl=0),
99        // Send data at address 1
100        (write sda=1 scl=0),
101        (write sda=1 scl=1),
102        (read expect=1),
103        (write sda=1 scl=0),
104        (write sda=1 scl=1),
105        (read expect=1),
106        (write sda=1 scl=0),
107        (write sda=1 scl=1),
108        (read expect=0),
109        (write sda=1 scl=0),
110        (write sda=1 scl=1),
111        (read expect=0),
112        (write sda=1 scl=0),
113        (write sda=1 scl=1),
114        (read expect=0),
115        (write sda=1 scl=0),
116        (write sda=1 scl=1),
117        (read expect=0),
118        (write sda=1 scl=0),
119        (write sda=1 scl=1),
120        (read expect=1),
121        (write sda=1 scl=0),
122        (write sda=1 scl=1),
123        (read expect=1),
124    ]);
125}
126
127// Writes in the same style as Wonder Boy in Monster World
128#[test]
129fn x24c01_basic_write() {
130    let mut x24c01 = X24C01Chip::new(None);
131
132    run_test!(x24c01, [
133        (write sda=1 scl=1),
134        (write sda=0 scl=1),
135        (write sda=0 scl=0),
136
137        // Send address (2)
138        (write sda=0 scl=0),
139        (write sda=0 scl=1),
140        (write sda=0 scl=0),
141
142        (write sda=0 scl=0),
143        (write sda=0 scl=1),
144        (write sda=0 scl=0),
145
146        (write sda=0 scl=0),
147        (write sda=0 scl=1),
148        (write sda=0 scl=0),
149
150        (write sda=0 scl=0),
151        (write sda=0 scl=1),
152        (write sda=0 scl=0),
153
154        (write sda=0 scl=0),
155        (write sda=0 scl=1),
156        (write sda=0 scl=0),
157
158        (write sda=1 scl=0),
159        (write sda=1 scl=1),
160        (write sda=1 scl=0),
161
162        (write sda=0 scl=0),
163        (write sda=0 scl=1),
164        (write sda=0 scl=0),
165
166        (write sda=0 scl=0),
167        (write sda=0 scl=1),
168        (write sda=0 scl=0),
169
170        // Address ACK
171        (write sda=1 scl=0),
172        (write sda=1 scl=1),
173        (read expect=0),
174        (write sda=1 scl=0),
175
176        // Send data (1100 0011)
177        (write sda=1 scl=0),
178        (write sda=1 scl=1),
179        (write sda=1 scl=0),
180
181        (write sda=1 scl=0),
182        (write sda=1 scl=1),
183        (write sda=1 scl=0),
184
185        (write sda=0 scl=0),
186        (write sda=0 scl=1),
187        (write sda=0 scl=0),
188
189        (write sda=0 scl=0),
190        (write sda=0 scl=1),
191        (write sda=0 scl=0),
192
193        (write sda=0 scl=0),
194        (write sda=0 scl=1),
195        (write sda=0 scl=0),
196
197        (write sda=0 scl=0),
198        (write sda=0 scl=1),
199        (write sda=0 scl=0),
200
201        (write sda=1 scl=0),
202        (write sda=1 scl=1),
203        (write sda=1 scl=0),
204
205        (write sda=1 scl=0),
206        (write sda=1 scl=1),
207        (write sda=1 scl=0),
208
209        // Write ACK
210        (write sda=1 scl=0),
211        (write sda=1 scl=1),
212        (read expect=0),
213        (write sda=1 scl=0),
214
215        // Send data (1001 0110)
216        (write sda=1 scl=0),
217        (write sda=1 scl=1),
218        (write sda=1 scl=0),
219
220        (write sda=0 scl=0),
221        (write sda=0 scl=1),
222        (write sda=0 scl=0),
223
224        (write sda=0 scl=0),
225        (write sda=0 scl=1),
226        (write sda=0 scl=0),
227
228        (write sda=1 scl=0),
229        (write sda=1 scl=1),
230        (write sda=1 scl=0),
231
232        (write sda=0 scl=0),
233        (write sda=0 scl=1),
234        (write sda=0 scl=0),
235
236        (write sda=1 scl=0),
237        (write sda=1 scl=1),
238        (write sda=1 scl=0),
239
240        (write sda=1 scl=0),
241        (write sda=1 scl=1),
242        (write sda=1 scl=0),
243
244        (write sda=0 scl=0),
245        (write sda=0 scl=1),
246        (write sda=0 scl=0),
247
248        // Write ACK
249        (write sda=1 scl=0),
250        (write sda=1 scl=1),
251        (read expect=0),
252        (write sda=1 scl=0),
253    ]);
254
255    let memory = x24c01.get_memory();
256    assert_eq!(memory[2], 0b1100_0011, "byte at address 6");
257    assert_eq!(memory[3], 0b1001_0110, "byte at address 7");
258}
259
260// Reads in the same style as NBA Jam
261#[test]
262fn x24c02_read_dual() {
263    let mut bytes = vec![0_u8; 256];
264    bytes[6] = 0b0110_1001;
265    bytes[7] = 0b1100_0011;
266    let mut x24c02 = X24C02Chip::new(Some(&bytes));
267
268    run_test!(x24c02, [
269        (write sda=1 scl=0),
270        (write sda=1 scl=1),
271        (write sda=0 scl=1),
272        (write sda=0 scl=0),
273
274        // Send device address
275        (write sda=1 scl=0),
276        (write sda=1 scl=1),
277        (write sda=1 scl=0),
278
279        (write sda=0 scl=0),
280        (write sda=0 scl=1),
281        (write sda=0 scl=0),
282
283        (write sda=1 scl=0),
284        (write sda=1 scl=1),
285        (write sda=1 scl=0),
286
287        (write sda=0 scl=0),
288        (write sda=0 scl=1),
289        (write sda=0 scl=0),
290
291        (write sda=0 scl=0),
292        (write sda=0 scl=1),
293        (write sda=0 scl=0),
294
295        (write sda=0 scl=0),
296        (write sda=0 scl=1),
297        (write sda=0 scl=0),
298
299        (write sda=0 scl=0),
300        (write sda=0 scl=1),
301        (write sda=0 scl=0),
302
303        (write sda=0 scl=0),
304        (write sda=0 scl=1),
305        (write sda=0 scl=0),
306
307        // Device address ACK
308        (write sda=1 scl=0),
309        (read expect=0),
310        (write sda=1 scl=1),
311
312        // Send write address
313        (write sda=0 scl=0),
314        (write sda=0 scl=1),
315        (write sda=0 scl=0),
316
317        (write sda=0 scl=0),
318        (write sda=0 scl=1),
319        (write sda=0 scl=0),
320
321        (write sda=0 scl=0),
322        (write sda=0 scl=1),
323        (write sda=0 scl=0),
324
325        (write sda=0 scl=0),
326        (write sda=0 scl=1),
327        (write sda=0 scl=0),
328
329        (write sda=0 scl=0),
330        (write sda=0 scl=1),
331        (write sda=0 scl=0),
332
333        (write sda=1 scl=0),
334        (write sda=1 scl=1),
335        (write sda=1 scl=0),
336
337        (write sda=1 scl=0),
338        (write sda=1 scl=1),
339        (write sda=1 scl=0),
340
341        (write sda=0 scl=0),
342        (write sda=0 scl=1),
343        (write sda=0 scl=0),
344
345        // Write address ACK
346        (write sda=1 scl=0),
347        (read expect=0),
348        (write sda=1 scl=1),
349
350        // Restart
351        (write sda=1 scl=0),
352        (write sda=1 scl=1),
353        (write sda=0 scl=1),
354        (write sda=0 scl=0),
355
356        // Send device address (again), but with R flag set
357        (write sda=1 scl=0),
358        (write sda=1 scl=1),
359        (write sda=1 scl=0),
360
361        (write sda=0 scl=0),
362        (write sda=0 scl=1),
363        (write sda=0 scl=0),
364
365        (write sda=1 scl=0),
366        (write sda=1 scl=1),
367        (write sda=1 scl=0),
368
369        (write sda=0 scl=0),
370        (write sda=0 scl=1),
371        (write sda=0 scl=0),
372
373        (write sda=0 scl=0),
374        (write sda=0 scl=1),
375        (write sda=0 scl=0),
376
377        (write sda=0 scl=0),
378        (write sda=0 scl=1),
379        (write sda=0 scl=0),
380
381        (write sda=0 scl=0),
382        (write sda=0 scl=1),
383        (write sda=0 scl=0),
384
385        (write sda=1 scl=0),
386        (write sda=1 scl=1),
387        (write sda=1 scl=0),
388
389        // Device address ACK
390        (write sda=1 scl=0),
391        (read expect=0),
392
393        // Read data (0110 1001)
394        (write sda=1 scl=1),
395        (write sda=1 scl=0),
396        (read expect=0),
397
398        (write sda=1 scl=1),
399        (write sda=1 scl=0),
400        (read expect=1),
401
402        (write sda=1 scl=1),
403        (write sda=1 scl=0),
404        (read expect=1),
405
406        (write sda=1 scl=1),
407        (write sda=1 scl=0),
408        (read expect=0),
409
410        (write sda=1 scl=1),
411        (write sda=1 scl=0),
412        (read expect=1),
413
414        (write sda=1 scl=1),
415        (write sda=1 scl=0),
416        (read expect=0),
417
418        (write sda=1 scl=1),
419        (write sda=1 scl=0),
420        (read expect=0),
421
422        (write sda=1 scl=1),
423        (write sda=1 scl=0),
424        (read expect=1),
425
426        // Begin next send
427        (write sda=1 scl=1),
428        (write sda=1 scl=0),
429        (write sda=0 scl=0),
430
431        // Read data (1100 0011)
432        (write sda=0 scl=1),
433        (write sda=1 scl=0),
434        (read expect=1),
435
436        (write sda=1 scl=1),
437        (write sda=1 scl=0),
438        (read expect=1),
439
440        (write sda=1 scl=1),
441        (write sda=1 scl=0),
442        (read expect=0),
443
444        (write sda=1 scl=1),
445        (write sda=1 scl=0),
446        (read expect=0),
447
448        (write sda=1 scl=1),
449        (write sda=1 scl=0),
450        (read expect=0),
451
452        (write sda=1 scl=1),
453        (write sda=1 scl=0),
454        (read expect=0),
455
456        (write sda=1 scl=1),
457        (write sda=1 scl=0),
458        (read expect=1),
459
460        (write sda=1 scl=1),
461        (write sda=1 scl=0),
462        (read expect=1),
463    ]);
464}
465
466// NBA Jam Tournament Edition and NFL Quarterback Club do this on startup, seemingly to test
467// that the EEPROM chip is present?
468#[test]
469fn x24c02_toggle_read_while_stopped() {
470    let mut x24c02 = X24C02Chip::new(None);
471
472    run_test!(x24c02, [
473        (write sda=0 scl=0),
474        (write sda=1 scl=0),
475        (write sda=0 scl=0),
476        (write sda=0 scl=1),
477        (write sda=1 scl=1),
478        (write sda=1 scl=0),
479        (write sda=0 scl=0),
480        (write sda=0 scl=1),
481        (write sda=1 scl=1),
482        (write sda=1 scl=0),
483        (write sda=1 scl=0),
484        (read expect=1),
485        (write sda=0 scl=0),
486        (read expect=0),
487        (write sda=1 scl=0),
488        (read expect=1),
489        (write sda=0 scl=0),
490        (read expect=0),
491        (write sda=1 scl=0),
492        (read expect=1),
493    ]);
494}
495
496// Reads in the style of NFL Quarterback Club
497#[test]
498fn x24c08_read_individual() {
499    let mut bytes = vec![0_u8; 1024];
500    bytes[512 + 6] = 0b1100_0011;
501    bytes[512 + 7] = 0b0110_1001;
502    let mut x24c08 = X24C08Chip::new(Some(&bytes));
503
504    run_test!(x24c08, [
505        // Initialize
506        (write sda=0 scl=0),
507        (write sda=0 scl=1),
508        (write sda=1 scl=1),
509        (write sda=1 scl=0),
510        (write sda=1 scl=1),
511        (write sda=0 scl=1),
512        (write sda=0 scl=0),
513
514        // Send device address
515        (write sda=1 scl=0),
516        (write sda=1 scl=1),
517        (write sda=1 scl=0),
518
519        (write sda=0 scl=0),
520        (write sda=0 scl=1),
521        (write sda=0 scl=0),
522
523        (write sda=1 scl=0),
524        (write sda=1 scl=1),
525        (write sda=1 scl=0),
526
527        (write sda=0 scl=0),
528        (write sda=0 scl=1),
529        (write sda=0 scl=0),
530
531        (write sda=0 scl=0),
532        (write sda=0 scl=1),
533        (write sda=0 scl=0),
534
535        (write sda=0 scl=0),
536        (write sda=0 scl=1),
537        (write sda=0 scl=0),
538
539        (write sda=0 scl=0),
540        (write sda=0 scl=1),
541        (write sda=0 scl=0),
542
543        (write sda=0 scl=0),
544        (write sda=0 scl=1),
545        (write sda=0 scl=0),
546
547        // Device address ACK
548        (write sda=1 scl=0),
549        (write sda=1 scl=1),
550        (read expect=0),
551        (write sda=1 scl=0),
552
553        // Send write address
554        (write sda=0 scl=0),
555        (write sda=0 scl=1),
556        (write sda=0 scl=0),
557
558        (write sda=0 scl=0),
559        (write sda=0 scl=1),
560        (write sda=0 scl=0),
561
562        (write sda=0 scl=0),
563        (write sda=0 scl=1),
564        (write sda=0 scl=0),
565
566        (write sda=0 scl=0),
567        (write sda=0 scl=1),
568        (write sda=0 scl=0),
569
570        (write sda=0 scl=0),
571        (write sda=0 scl=1),
572        (write sda=0 scl=0),
573
574        (write sda=1 scl=0),
575        (write sda=1 scl=1),
576        (write sda=1 scl=0),
577
578        (write sda=1 scl=0),
579        (write sda=1 scl=1),
580        (write sda=1 scl=0),
581
582        (write sda=0 scl=0),
583        (write sda=0 scl=1),
584        (write sda=0 scl=0),
585
586        // Write address ACK
587        (write sda=1 scl=0),
588        (write sda=1 scl=1),
589        (read expect=0),
590        (write sda=1 scl=0),
591
592        // Restart
593        (write sda=1 scl=0),
594        (write sda=1 scl=1),
595        (write sda=0 scl=1),
596        (write sda=0 scl=0),
597
598        // Send device address (again), with R flag and A9 set
599        (write sda=1 scl=0),
600        (write sda=1 scl=1),
601        (write sda=1 scl=0),
602
603        (write sda=0 scl=0),
604        (write sda=0 scl=1),
605        (write sda=0 scl=0),
606
607        (write sda=1 scl=0),
608        (write sda=1 scl=1),
609        (write sda=1 scl=0),
610
611        (write sda=0 scl=0),
612        (write sda=0 scl=1),
613        (write sda=0 scl=0),
614
615        (write sda=0 scl=0),
616        (write sda=0 scl=1),
617        (write sda=0 scl=0),
618
619        (write sda=1 scl=0),
620        (write sda=1 scl=1),
621        (write sda=1 scl=0),
622
623        (write sda=0 scl=0),
624        (write sda=0 scl=1),
625        (write sda=0 scl=0),
626
627        (write sda=1 scl=0),
628        (write sda=1 scl=1),
629        (write sda=1 scl=0),
630
631        // Device address ACK
632        (write sda=1 scl=0),
633        (write sda=1 scl=1),
634        (read expect=0),
635        (write sda=1 scl=0),
636
637        // Read data at address (1100 0011)
638        (write sda=1 scl=0),
639        (write sda=1 scl=1),
640        (read expect=1),
641
642        (write sda=1 scl=0),
643        (write sda=1 scl=1),
644        (read expect=1),
645
646        (write sda=1 scl=0),
647        (write sda=1 scl=1),
648        (read expect=0),
649
650        (write sda=1 scl=0),
651        (write sda=1 scl=1),
652        (read expect=0),
653
654        (write sda=1 scl=0),
655        (write sda=1 scl=1),
656        (read expect=0),
657
658        (write sda=1 scl=0),
659        (write sda=1 scl=1),
660        (read expect=0),
661
662        (write sda=1 scl=0),
663        (write sda=1 scl=1),
664        (read expect=1),
665
666        (write sda=1 scl=0),
667        (write sda=1 scl=1),
668        (read expect=1),
669    ]);
670}