Nugget
Bare-metal libraries and examples for the original PlayStation
Loading...
Searching...
No Matches
race.c
Go to the documentation of this file.
1/*
2
3MIT License
4
5Copyright (c) 2022 PCSX-Redux authors
6
7Permission is hereby granted, free of charge, to any person obtaining a copy
8of this software and associated documentation files (the "Software"), to deal
9in the Software without restriction, including without limitation the rights
10to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11copies of the Software, and to permit persons to whom the Software is
12furnished to do so, subject to the following conditions:
13
14The above copyright notice and this permission notice shall be included in all
15copies or substantial portions of the Software.
16
17THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23SOFTWARE.
24
25*/
26
27// clang-format off
28
29CESTER_TEST(raceGetLocPAndNop, test_instances,
30 int resetDone = resetCDRom();
31 if (!resetDone) {
33 return;
34 }
35
36 int seekDone = seekPTo(0x70, 0x19, 0x73);
37 if (!seekDone) {
39 return;
40 }
41
43 CDROM_REG0 = 0;
46 uint8_t ctrl0 = CDROM_REG0 & ~3;
47
49 uint8_t cause1 = ackCDRomCause();
50 uint8_t ctrl1 = CDROM_REG0 & ~3;
51 uint8_t response1[16];
53 uint8_t ctrl2 = CDROM_REG0 & ~3;
54 CDROM_REG0 = 1;
55 uint8_t cause1b = CDROM_REG3_UC;
56
58 uint32_t timeout = 150000;
59 int gotIRQ = waitCDRomIRQWithTimeout(&timeout);
60
71 ramsyscall_printf("GetLocP followed by Nop, ack in %ius\n", ackTime);
72)
73
74CESTER_TEST(raceNopAndGetLocP, test_instances,
75 int resetDone = resetCDRom();
76 if (!resetDone) {
78 return;
79 }
80
81 int seekDone = seekPTo(0x70, 0x19, 0x73);
82 if (!seekDone) {
84 return;
85 }
86
91 uint8_t ctrl0 = CDROM_REG0 & ~3;
92
94 uint8_t cause1 = ackCDRomCause();
95 uint8_t ctrl1 = CDROM_REG0 & ~3;
96 uint8_t response1[16];
98 uint8_t ctrl2 = CDROM_REG0 & ~3;
99 CDROM_REG0 = 1;
101
104 int gotIRQ = waitCDRomIRQWithTimeout(&timeout);
105
117 ramsyscall_printf("Nop followed by GetLocP, ack in %ius\n", ackTime);
118)
119
120CESTER_TEST(raceNopAndGetTD1, test_instance,
121 int resetDone = resetCDRom();
122 if (!resetDone) {
124 return;
125 }
126
128
129 CDROM_REG0 = 0;
130 CDROM_REG2 = 1;
133 uint8_t ctrl0 = CDROM_REG0 & ~3;
134
136 uint8_t cause1 = ackCDRomCause();
137 uint8_t ctrl1 = CDROM_REG0 & ~3;
138 uint8_t response1[16];
140 uint8_t ctrl2 = CDROM_REG0 & ~3;
141 CDROM_REG0 = 1;
142 uint8_t cause1b = CDROM_REG3_UC;
143
145 uint32_t timeout = 150000;
146 int gotIRQ = waitCDRomIRQWithTimeout(&timeout);
147
160 ramsyscall_printf("Nop followed by GetTD1: ack in %ius\n", ackTime);
161)
162
163CESTER_TEST(raceGetTD1AndNop, test_instance,
164 int resetDone = resetCDRom();
165 if (!resetDone) {
167 return;
168 }
169
171
172 CDROM_REG0 = 0;
176 uint8_t ctrl0 = CDROM_REG0 & ~3;
177
179 uint8_t cause1 = ackCDRomCause();
180 uint8_t ctrl1 = CDROM_REG0 & ~3;
181 uint8_t response1[16];
183 uint8_t ctrl2 = CDROM_REG0 & ~3;
184 CDROM_REG0 = 1;
185 uint8_t cause1b = CDROM_REG3_UC;
186
188 uint32_t timeout = 150000;
189 int gotIRQ = waitCDRomIRQWithTimeout(&timeout);
190
202 ramsyscall_printf("GetTD1 followed by Nop: ack in %ius\n", ackTime);
203)
204
205CESTER_TEST(raceSeekP2to85AckWaitAndNop, test_instance,
206 int resetDone = resetCDRom();
207 if (!resetDone) {
209 return;
210 }
211
212 int seekDone = seekPTo(0, 2, 0);
213 if (!seekDone) {
215 return;
216 }
217
218 int setLocDone = setLoc(0x85, 0, 0);
219 if (!setLocDone) {
221 return;
222 }
223
225 // wait 50ms for things to settle
226 while (updateTime() < 50000);
228
229 CDROM_REG0 = 0;
231 uint8_t ctrl0 = CDROM_REG0 & ~3;
232
234 uint8_t cause1 = ackCDRomCause();
235 uint8_t ctrl1 = CDROM_REG0 & ~3;
236 uint8_t response1[16];
238 uint8_t ctrl2 = CDROM_REG0 & ~3;
239 CDROM_REG0 = 1;
240 uint8_t cause1b = CDROM_REG3_UC;
241
242 CDROM_REG0 = 0;
244 uint8_t ctrl2b = CDROM_REG0 & ~3;
245
248 uint8_t cause2 = ackCDRomCause();
249 uint8_t ctrl3 = CDROM_REG0 & ~3;
250 uint8_t response2[16];
252 uint8_t ctrl4 = CDROM_REG0 & ~3;
253 CDROM_REG0 = 1;
254 uint8_t cause2b = CDROM_REG3_UC;
255
258 uint8_t cause3 = ackCDRomCause();
259 uint8_t ctrl5 = CDROM_REG0 & ~3;
260 uint8_t response3[16];
262 uint8_t ctrl6 = CDROM_REG0 & ~3;
263 CDROM_REG0 = 1;
264 uint8_t cause3b = CDROM_REG3_UC;
265
290 ramsyscall_printf("SeekP from 00:02:00 to 85:00:00 with Nop in between: ack in %ius, ack2 in %ius, errored in %ius\n", ackTime, ackTime2, errorTime);
291)
292
293CESTER_TEST(raceSeekL2to71WaitAckAndNop, test_instance,
294 int resetDone = resetCDRom();
295 if (!resetDone) {
297 return;
298 }
299
300 int seekDone = seekPTo(0, 2, 0);
301 if (!seekDone) {
303 return;
304 }
305
306 int setLocDone = setLoc(0x71, 0, 0);
307 if (!setLocDone) {
309 return;
310 }
311
313 // wait 50ms for things to settle
314 while (updateTime() < 50000);
316
317 CDROM_REG0 = 0;
319 uint8_t ctrl0 = CDROM_REG0 & ~3;
320
321 while (CDROM_REG0 & 0x80);
322
324 uint8_t ctrl0b = CDROM_REG0 & ~3;
325
327 // Wait 2s...
328 ramsyscall_printf("Waiting 2s...\n");
329 while (updateTime() < 2000000);
330 ramsyscall_printf("Done...\n");
331
334 uint8_t cause1 = ackCDRomCause();
335 uint8_t ctrl1 = CDROM_REG0 & ~3;
336 uint8_t response1[16];
338 uint8_t ctrl2 = CDROM_REG0 & ~3;
339 CDROM_REG0 = 1;
340 uint8_t cause1b = CDROM_REG3_UC;
341
345 uint8_t ctrl3 = CDROM_REG0 & ~3;
346 uint8_t response2[16];
348 uint8_t ctrl4 = CDROM_REG0 & ~3;
349 CDROM_REG0 = 1;
351
352 uint32_t timeout = 1500000;
353 int gotIRQ = waitCDRomIRQWithTimeout(&timeout);
354
370 // This one really should be 0, but just in case.
374 ramsyscall_printf("SeekL from 00:02:00 to 71:00:00 then stall with Nop: ack in %ius, ack2 in %ius\n", ackTime, ackTime2);
375)
376
377CESTER_TEST(raceNopWaitAndNop, test_instances,
378 int resetDone = resetCDRom();
379 if (!resetDone) {
381 return;
382 }
383
385 CDROM_REG0 = 0;
387 uint8_t ctrl0 = CDROM_REG0 & ~3;
388
389 while (updateTime() < 50000);
390 uint8_t ctrl0b = CDROM_REG0 & ~3;
392
395 uint8_t cause1 = ackCDRomCause();
396 uint8_t ctrl1 = CDROM_REG0 & ~3;
397 uint8_t response1[16];
399 uint8_t ctrl2 = CDROM_REG0 & ~3;
400 CDROM_REG0 = 1;
401 uint8_t cause1b = CDROM_REG3_UC;
402
405 uint8_t cause2 = ackCDRomCause();
406 uint8_t ctrl3 = CDROM_REG0 & ~3;
407 uint8_t response2[16];
409 uint8_t ctrl4 = CDROM_REG0 & ~3;
410 CDROM_REG0 = 1;
411 uint8_t cause2b = CDROM_REG3_UC;
412
426 // This one really ought to be 0, but let's give some slack anyway.
428 // The second ack's timing will be affected by the first ack's timing,
429 // so we can't really test it.
430 ramsyscall_printf("Nop followed by Nop, ack in %ius, ack2 in %ius\n", ackTime, ackTime2);
431)
432
434 int resetDone = resetCDRom();
435 if (!resetDone) {
437 return;
438 }
439
440 CDROM_REG0 = 0;
441 for (unsigned i = 0; i < 4; i++) {
444 while (updateTime() < 50000);
445 }
446
447 int gotIRQ = 0;
448 unsigned count = 0;
449 do {
451 uint32_t timeout = 50000;
452 gotIRQ = waitCDRomIRQWithTimeout(&timeout);
454 uint8_t response[16];
456 } while (gotIRQ && ++count);
457
459 ramsyscall_printf("Nop command queue of %i\n", count);
460)
461
463 int resetDone = resetCDRom();
464 if (!resetDone) {
466 return;
467 }
468
469 uint8_t ctrl[2];
470 CDROM_REG0 = 0;
471 for (unsigned i = 0; i < 2; i++) {
474 while (updateTime() < 50000);
475 ctrl[i] = CDROM_REG0 & ~3;
476 }
477
478 for (unsigned i = 0; i < 2; i++) {
479 waitCDRomIRQ();
481 uint8_t response[16];
483 }
484
485 cester_assert_uint_eq(0x38, ctrl[0]);
486 cester_assert_uint_eq(0xb8, ctrl[1]);
487)
488
489CESTER_TEST(readResponseBeforeAck, test_instances,
490 int resetDone = resetCDRom();
491 if (!resetDone) {
493 return;
494 }
495
496 int seekDone = seekPTo(0x70, 0x19, 0x73);
497 if (!seekDone) {
499 return;
500 }
501
503 CDROM_REG0 = 0;
505
506 while (CDROM_REG0 & 0x80);
508
509 while (updateTime() < 50000);
510
512 uint8_t response1[16];
514 uint8_t cause1 = ackCDRomCause();
515 CDROM_REG0 = 1;
516 uint8_t cause1b = CDROM_REG3_UC;
517 waitCDRomIRQ();
518 uint8_t response2[16];
520 uint8_t cause2 = ackCDRomCause();
521 CDROM_REG0 = 1;
522 uint8_t cause2b = CDROM_REG3_UC;
523
532
533)
534
535CESTER_TEST(ackBeforeReadResponse, test_instances,
536 int resetDone = resetCDRom();
537 if (!resetDone) {
539 return;
540 }
541
542 int seekDone = seekPTo(0x70, 0x19, 0x73);
543 if (!seekDone) {
545 return;
546 }
547
549 CDROM_REG0 = 0;
551
552 while (CDROM_REG0 & 0x80);
554
555 while (updateTime() < 50000);
556
557 waitCDRomIRQ();
558 uint8_t cause1 = ackCDRomCause();
559 CDROM_REG0 = 1;
560 uint8_t cause1b = CDROM_REG3_UC;
561 uint8_t response1[16];
563 waitCDRomIRQ();
564 uint8_t cause2 = ackCDRomCause();
565 CDROM_REG0 = 1;
566 uint8_t cause2b = CDROM_REG3_UC;
567 uint8_t response2[16];
569
578
579)
580
581CESTER_TEST(mixedReadAndAck1, test_instances,
582 int resetDone = resetCDRom();
583 if (!resetDone) {
585 return;
586 }
587
588 int seekDone = seekPTo(0x70, 0x19, 0x73);
589 if (!seekDone) {
591 return;
592 }
593
595 CDROM_REG0 = 0;
597
598 while (CDROM_REG0 & 0x80);
600
601 while (updateTime() < 50000);
602
603 waitCDRomIRQ();
604 uint8_t cause1 = ackCDRomCause();
605 CDROM_REG0 = 1;
606 uint8_t cause1b = CDROM_REG3_UC;
607 uint8_t response1[16];
609 waitCDRomIRQ();
610 uint8_t response2[16];
612 uint8_t cause2 = ackCDRomCause();
613 CDROM_REG0 = 1;
614 uint8_t cause2b = CDROM_REG3_UC;
615
624
625)
626
627CESTER_TEST(mixedReadAndAck2, test_instances,
628 int resetDone = resetCDRom();
629 if (!resetDone) {
631 return;
632 }
633
634 int seekDone = seekPTo(0x70, 0x19, 0x73);
635 if (!seekDone) {
637 return;
638 }
639
641 CDROM_REG0 = 0;
643
644 while (CDROM_REG0 & 0x80);
646
647 while (updateTime() < 50000);
648
649 waitCDRomIRQ();
650 uint8_t response1[16];
652 uint8_t cause1 = ackCDRomCause();
653 CDROM_REG0 = 1;
654 uint8_t cause1b = CDROM_REG3_UC;
655 waitCDRomIRQ();
656 uint8_t cause2 = ackCDRomCause();
657 CDROM_REG0 = 1;
658 uint8_t cause2b = CDROM_REG3_UC;
659 uint8_t response2[16];
661
670)
uint32_t errorTime
Definition cdlgetlocl.c:81
uint8_t ctrl5
Definition cdlid.c:219
uint8_t responseSize3
Definition cdlid.c:218
uint8_t cause3b
Definition cdlid.c:221
uint8_t cause3
Definition cdlid.c:216
uint8_t response3[16]
Definition cdlid.c:217
uint8_t ctrl6
Definition cdlreadn.c:203
uint8_t ctrl2b
Definition cdlreads.c:760
@ CDL_GETTD
Definition cdrom.h:62
@ CDL_NOP
Definition cdrom.h:43
@ CDL_SEEKL
Definition cdrom.h:63
@ CDL_SEEKP
Definition cdrom.h:64
@ CDL_GETLOCP
Definition cdrom.h:59
#define CDROM_REG3_UC
Definition cdrom.h:39
ramsyscall_printf("=== e01_kseg1_reads_no_fill ===\n")
int i
Definition gte-regio.c:297
cester_assert_uint_eq(3, cause1)
CDROM_REG0
Definition race.c:88
uint8_t responseSize
Definition race.c:455
uint32_t ackTime
Definition race.c:93
uint8_t response2[16]
Definition race.c:346
uint8_t responseSize2
Definition race.c:347
uint8_t responseSize1
Definition race.c:97
waitCDRomIRQ()
CESTER_TEST(raceGetLocPAndNop, test_instances, int resetDone=resetCDRom();if(!resetDone) { cester_assert_true(resetDone);return;} int seekDone=seekPTo(0x70, 0x19, 0x73);if(!seekDone) { cester_assert_true(seekDone);return;} initializeTime();CDROM_REG0=0;CDROM_REG1=CDL_GETLOCP;CDROM_REG1=CDL_NOP;uint8_t ctrl0=CDROM_REG0 &~3;uint32_t ackTime=waitCDRomIRQ();uint8_t cause1=ackCDRomCause();uint8_t ctrl1=CDROM_REG0 &~3;uint8_t response1[16];uint8_t responseSize1=readResponse(response1);uint8_t ctrl2=CDROM_REG0 &~3;CDROM_REG0=1;uint8_t cause1b=CDROM_REG3_UC;initializeTime();uint32_t timeout=150000;int gotIRQ=waitCDRomIRQWithTimeout(&timeout);cester_assert_uint_eq(3, cause1);cester_assert_uint_eq(0xe0, cause1b);cester_assert_uint_eq(0x98, ctrl0);cester_assert_uint_eq(0x38, ctrl1);cester_assert_uint_eq(0x18, ctrl2);cester_assert_uint_eq(2, response1[0]);cester_assert_uint_eq(1, responseSize1);cester_assert_false(gotIRQ);cester_assert_uint_ge(ackTime, 500);cester_assert_uint_lt(ackTime, 7000);ramsyscall_printf("GetLocP followed by Nop, ack in %ius\n", ackTime);) CESTER_TEST(raceNopAndGetLocP
int setLocDone
Definition race.c:306
uint8_t response[16]
Definition race.c:454
int resetDone
Definition race.c:75
uint8_t ctrl4
Definition race.c:348
unsigned count
Definition race.c:448
uint8_t ctrl0b
Definition race.c:324
uint8_t response1[16]
Definition race.c:96
uint32_t timeout
Definition race.c:103
test_instance
Definition race.c:163
test_instances
Definition race.c:74
uint8_t cause2b
Definition race.c:350
uint8_t ctrl0
Definition race.c:91
int gotIRQ
Definition race.c:104
uint8_t ctrl2
Definition race.c:98
uint8_t cause1
Definition race.c:94
cester_assert_false(gotIRQ)
uint8_t cause2
Definition race.c:344
uint32_t ackTime2
Definition race.c:343
cester_assert_uint_ge(ackTime, 500)
cester_assert_uint_lt(ackTime, 7000)
uint8_t cause1b
Definition race.c:100
uint8_t ctrl1
Definition race.c:95
CDROM_REG2
Definition race.c:173
initializeTime()
CDROM_REG1
Definition race.c:89
int seekDone
Definition race.c:81
uint8_t ctrl3
Definition race.c:345
ackCDRomCause()
cester_assert_true(seekDone)
readResponse(response)
void uint32_t(classId, spec)