Nugget
Bare-metal libraries and examples for the original PlayStation
Loading...
Searching...
No Matches
playing.c
Go to the documentation of this file.
1/*
2
3MIT License
4
5Copyright (c) 2024 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(simplePlayingUntilEnd, test_instances,
30 int resetDone = resetCDRom();
31 if (!resetDone) {
33 return;
34 }
35
36 int setModeDone = setMode(0x00);
37 if (!setModeDone) {
39 return;
40 }
41
42 int seekDone = seekPTo(0x71, 0x27, 0);
43
44 if (!seekDone) {
46 return;
47 }
48
49 CDROM_REG0 = 0;
51 uint8_t response1[16];
53 uint8_t cause1 = ackCDRomCause();
55
58 uint8_t cause2 = ackCDRomCause();
59 uint8_t ctrl1 = CDROM_REG0 & ~3;
60 uint8_t response2[16];
62 uint8_t ctrl2 = CDROM_REG0 & ~3;
63 CDROM_REG0 = 1;
64 uint8_t cause2b = CDROM_REG3_UC;
65
75 // Should finish in 1640ms to 1960ms.
78 ramsyscall_printf("Simple Playing until end, finished in %ius\n", time1);
79)
80
81CESTER_TEST(simplePlayingUntilEndDoubleTime, test_instances,
82 int resetDone = resetCDRom();
83 if (!resetDone) {
85 return;
86 }
87
88 int setModeDone = setMode(0x80);
89 if (!setModeDone) {
91 return;
92 }
93
94 int seekDone = seekPTo(0x71, 0x27, 0);
95
96 if (!seekDone) {
98 return;
99 }
100
103 uint8_t response1[16];
107
111 uint8_t ctrl1 = CDROM_REG0 & ~3;
112 uint8_t response2[16];
114 uint8_t ctrl2 = CDROM_REG0 & ~3;
115 CDROM_REG0 = 1;
117
127 // Should finish in 820ms to 980ms.
130 ramsyscall_printf("Simple Playing until end, Double Time, finished in %ius\n", time1);
131)
132
133CESTER_TEST(simplePlayingUntilEndWithReport, test_instances,
134 int resetDone = resetCDRom();
135 if (!resetDone) {
137 return;
138 }
139
140 int setModeDone = setMode(0x04);
141 if (!setModeDone) {
143 return;
144 }
145
146 int seekDone = seekPTo(0x71, 0x26, 0);
147
148 if (!seekDone) {
150 return;
151 }
152
153 CDROM_REG0 = 0;
155 uint8_t response[16];
156 waitCDRomIRQ();
157 uint8_t cause1 = ackCDRomCause();
159
160 uint8_t causes[32];
161 uint8_t responseSizes[32];
162 uint8_t responses[32 * 16];
163
164 __builtin_memset(causes, 0, sizeof(causes));
165 __builtin_memset(responseSizes, 0, sizeof(responseSizes));
166
167 unsigned count;
168
169 for (count = 0; count < 32; count++) {
170 waitCDRomIRQ();
171 uint8_t cause = ackCDRomCause();
172 causes[count] = cause;
173 responseSizes[count] = readResponse(responses + count * 16);
174 if (cause != 1) break;
175 }
176
177 for (unsigned i = 0; i < count; i++) {
179 cester_assert_uint_eq(8, responseSizes[i]);
180 }
181 if (count >= 32) {
183 return;
184 }
186 cester_assert_uint_eq(1, responseSizes[count]);
190 if (count >= 15) {
191 unsigned offset = count - 15;
192 unsigned upCount = 0;
193 for (unsigned i = offset; i < count; i++) {
194 // stat
195 cester_assert_uint_eq(0x82, responses[i * 16 + 0]);
196 // track
197 cester_assert_uint_eq(0x25, responses[i * 16 + 1]);
198 // index
199 cester_assert_uint_eq(0x01, responses[i * 16 + 2]);
200 unsigned index = i - offset;
201 if ((index & 1) == 0) {
202 // absolute minute time
203 cester_assert_uint_eq(0x71, responses[i * 16 + 3]);
204 } else {
205 // relative minute time
206 cester_assert_uint_eq(0, responses[i * 16 + 3]);
207 }
208 static uint8_t seconds[15] = { 0x26, 0x81, 0x27, 0x81, 0x27, 0x82, 0x27, 0x82, 0x27, 0x82, 0x28, 0x82, 0x28, 0x83, 0x28 };
209 cester_assert_uint_eq(seconds[index], responses[i * 16 + 4]);
210 static uint8_t frames[15] = { 0x60, 0x40, 0x00, 0x55, 0x20, 0x00, 0x40, 0x20, 0x60, 0x40, 0x00, 0x55, 0x20, 0x00, 0x40 };
211 // This report might wobble a bit, but the above values ought to be close enough to our most likely values.
212 cester_assert_uint_ge(responses[i * 16 + 5], frames[index]);
213 cester_assert_uint_le(responses[i * 16 + 5], frames[index] + 1);
214 uint16_t peak = (responses[i * 16 + 7] << 8) | responses[i * 16 + 6];
215 uint16_t flag = peak & 0x8000;
216 peak &= 0x7fff;
217 cester_assert_uint_eq(0x619b, peak);
218 if (flag == 0x8000) upCount++;
219 }
220 cester_assert_uint_ge(upCount, 6);
221 cester_assert_uint_le(upCount, 8);
222 }
223 ramsyscall_printf("Simple Playing until end with reports:\n");
224 for (unsigned i = 0; i < count; i++) {
225 ramsyscall_printf(" - Response[%i] = %02x %02x %02x %02x %02x %02x %02x %02x\n", i,
226 responses[i * 16 + 0], responses[i * 16 + 1], responses[i * 16 + 2], responses[i * 16 + 3],
227 responses[i * 16 + 4], responses[i * 16 + 5], responses[i * 16 + 6], responses[i * 16 + 7]);
228 }
229)
uint8_t response[16]
Definition cdlgetlocl.c:84
@ CDL_PLAY
Definition cdrom.h:45
#define CDROM_REG3_UC
Definition cdrom.h:39
ramsyscall_printf("=== e01_kseg1_reads_no_fill ===\n")
uint32_t flag
Definition gte-edgecase.c:36
int i
Definition gte-regio.c:297
cester_assert_uint_eq(3, cause1)
CDROM_REG0
Definition playing.c:101
int setModeDone
Definition playing.c:88
uint8_t response2[16]
Definition playing.c:112
uint8_t responseSize2
Definition playing.c:113
CESTER_TEST(simplePlayingUntilEnd, test_instances, int resetDone=resetCDRom();if(!resetDone) { cester_assert_true(resetDone);return;} int setModeDone=setMode(0x00);if(!setModeDone) { cester_assert_true(setModeDone);return;} int seekDone=seekPTo(0x71, 0x27, 0);if(!seekDone) { cester_assert_true(seekDone);return;} CDROM_REG0=0;CDROM_REG1=CDL_PLAY;uint8_t response1[16];waitCDRomIRQ();uint8_t cause1=ackCDRomCause();uint8_t responseSize1=readResponse(response1);initializeTime();uint32_t time1=waitCDRomIRQ();uint8_t cause2=ackCDRomCause();uint8_t ctrl1=CDROM_REG0 &~3;uint8_t response2[16];uint8_t responseSize2=readResponse(response2);uint8_t ctrl2=CDROM_REG0 &~3;CDROM_REG0=1;uint8_t cause2b=CDROM_REG3_UC;cester_assert_uint_eq(3, cause1);cester_assert_uint_eq(4, cause2);cester_assert_uint_eq(0xe0, cause2b);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_uint_eq(2, response2[0]);cester_assert_uint_eq(1, responseSize2);cester_assert_uint_ge(time1, 1640000);cester_assert_uint_lt(time1, 1960000);ramsyscall_printf("Simple Playing until end, finished in %ius\n", time1);) CESTER_TEST(simplePlayingUntilEndDoubleTime
uint8_t responseSize1
Definition playing.c:106
waitCDRomIRQ()
cester_assert_uint_lt(time1, 980000)
int resetDone
Definition playing.c:82
uint8_t response1[16]
Definition playing.c:103
uint32_t time1
Definition playing.c:109
test_instances
Definition playing.c:81
uint8_t cause2b
Definition playing.c:116
uint8_t ctrl2
Definition playing.c:114
uint8_t cause1
Definition playing.c:105
uint8_t cause2
Definition playing.c:110
uint8_t ctrl1
Definition playing.c:111
initializeTime()
CDROM_REG1
Definition playing.c:102
cester_assert_uint_ge(time1, 820000)
int seekDone
Definition playing.c:94
ackCDRomCause()
cester_assert_true(seekDone)
uint8_t cause
Definition reading.c:707
uint8_t causes[100]
Definition reading.c:142
__builtin_memset(sectorData, 0, sizeof(sectorData))
readResponse(response)
cester_assert_uint_le(readyCount, 2)
static const void size_t count
Definition syscalls.h:146
void uint32_t(classId, spec)