Nugget
Bare-metal libraries and examples for the original PlayStation
Loading...
Searching...
No Matches
cdlid.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
30 int resetDone = resetCDRom();
31 if (!resetDone) {
33 return;
34 }
35
37
38 CDROM_REG0 = 0;
40
42 uint8_t cause1 = ackCDRomCause();
43 uint8_t ctrl1 = CDROM_REG0 & ~3;
44 uint8_t response1[16];
46 uint8_t ctrl2 = CDROM_REG0 & ~3;
47 CDROM_REG0 = 1;
48 uint8_t cause1b = CDROM_REG3_UC;
49
51 uint8_t cause2 = ackCDRomCause();
52 uint8_t ctrl3 = CDROM_REG0 & ~3;
53 uint8_t response2[16];
55 uint8_t ctrl4 = CDROM_REG0 & ~3;
56 CDROM_REG0 = 1;
57 uint8_t cause2b = CDROM_REG3_UC;
58
72 ramsyscall_printf("Basic cdlId, ack in %ius, complete in %ius\n", ackTime, completeTime);
73 ramsyscall_printf("Full response: %02x %02x %02x %02x %02x %02x %02x %02x\n",
75 response2[4], response2[5], response2[6], response2[7]);
76)
77
78CESTER_TEST(cdlIdTooManyArgs, test_instance,
79 int resetDone = resetCDRom();
80 if (!resetDone) {
82 return;
83 }
84
86
89 CDROM_REG2 = 0;
90 CDROM_REG2 = 0;
91 CDROM_REG2 = 0;
93
95 uint8_t cause1 = ackCDRomCause();
96 uint8_t ctrl1 = CDROM_REG0 & ~3;
97 uint8_t response1[16];
99 uint8_t ctrl2 = CDROM_REG0 & ~3;
100 CDROM_REG0 = 1;
102
112 ramsyscall_printf("Basic cdlId with too many args, errored in %ius\n", errorTime);
113)
114
115CESTER_TEST(cdlIdReads12BytesThenGetTN, test_instance,
116 int resetDone = resetCDRom();
117 if (!resetDone) {
119 return;
120 }
121
123
124 CDROM_REG0 = 0;
126
128 uint8_t cause1 = ackCDRomCause();
129 uint8_t ctrl1 = CDROM_REG0 & ~3;
130 uint8_t response1[16];
132 uint8_t ctrl2 = CDROM_REG0 & ~3;
133 CDROM_REG0 = 1;
134 uint8_t cause1b = CDROM_REG3_UC;
135
137 uint8_t cause2 = ackCDRomCause();
138 uint8_t ctrl3 = CDROM_REG0 & ~3;
139 uint8_t response2[12];
140 for (unsigned i = 0; i < 12; i++) {
142 }
143 uint8_t ctrl4 = CDROM_REG0 & ~3;
144 CDROM_REG0 = 1;
145 uint8_t cause2b = CDROM_REG3_UC;
146
147 CDROM_REG0 = 0;
149
150 waitCDRomIRQ();
151 uint8_t cause3 = ackCDRomCause();
152 uint8_t response3[16];
154 uint8_t ctrl5 = CDROM_REG0 & ~3;
155 CDROM_REG0 = 1;
156 uint8_t cause3b = CDROM_REG3_UC;
157
177 ramsyscall_printf("cdlId reading 12 bytes then cdlGetTN, ack in %ius, complete in %ius\n", ackTime, completeTime);
178)
179
180CESTER_TEST(cdlIdReads17BytesThenGetTN, test_instance,
181 int resetDone = resetCDRom();
182 if (!resetDone) {
184 return;
185 }
186
188
189 CDROM_REG0 = 0;
191
193 uint8_t cause1 = ackCDRomCause();
194 uint8_t ctrl1 = CDROM_REG0 & ~3;
195 uint8_t response1[16];
197 uint8_t ctrl2 = CDROM_REG0 & ~3;
198 CDROM_REG0 = 1;
199 uint8_t cause1b = CDROM_REG3_UC;
200
203 uint8_t ctrl3 = CDROM_REG0 & ~3;
204 uint8_t response2[17];
205 for (unsigned i = 0; i < 17; i++) {
207 }
208 uint8_t ctrl4 = CDROM_REG0 & ~3;
209 CDROM_REG0 = 1;
211
212 CDROM_REG0 = 0;
214
217 uint8_t response3[16];
219 uint8_t ctrl5 = CDROM_REG0 & ~3;
220 CDROM_REG0 = 1;
222
242 ramsyscall_printf("cdlId reading 17 bytes then cdlGetTN, ack in %ius, complete in %ius\n", ackTime, completeTime);
243)
244
245CESTER_TEST(cdlIdReadsWayTooMuchThencdlGetTN, test_instance,
246 int resetDone = resetCDRom();
247 if (!resetDone) {
249 return;
250 }
251
253
254 CDROM_REG0 = 0;
256
258 uint8_t cause1 = ackCDRomCause();
259 uint8_t ctrl1 = CDROM_REG0 & ~3;
260 uint8_t response1[16];
262 uint8_t ctrl2 = CDROM_REG0 & ~3;
263 CDROM_REG0 = 1;
264 uint8_t cause1b = CDROM_REG3_UC;
265
267 uint8_t cause2 = ackCDRomCause();
268 uint8_t ctrl3 = CDROM_REG0 & ~3;
269 uint8_t response2[32];
270 for (unsigned i = 0; i < 32; i++) {
272 }
273 uint8_t ctrl4 = CDROM_REG0 & ~3;
274 CDROM_REG0 = 1;
275 uint8_t cause2b = CDROM_REG3_UC;
276
277 CDROM_REG0 = 0;
279
280 waitCDRomIRQ();
281 uint8_t cause3 = ackCDRomCause();
282 uint8_t response3[32];
283 for (unsigned i = 0; i < 32; i++) {
285 }
286
299 for (unsigned i = 0; i < 16; i++) {
301 }
302 for (unsigned i = 8; i < 16; i++) {
304 }
305 for (unsigned i = 0; i < 16; i++) {
307 }
311 for (unsigned i = 3; i < 16; i++) {
313 }
314 ramsyscall_printf("cdlId reading way too much data, ack in %ius, complete in %ius\n", ackTime, completeTime);
315 ramsyscall_printf("Full response:\n%02x %02x %02x %02x %02x %02x %02x %02x\n"
316 "%02x %02x %02x %02x %02x %02x %02x %02x\n"
317 "%02x %02x %02x %02x %02x %02x %02x %02x\n"
318 "%02x %02x %02x %02x %02x %02x %02x %02x\n",
319 response2[0], response2[1], response2[2], response2[3],
320 response2[4], response2[5], response2[6], response2[7],
321 response2[8], response2[9], response2[10], response2[11],
322 response2[12], response2[13], response2[14], response2[15],
323 response2[16], response2[17], response2[18], response2[19],
324 response2[20], response2[21], response2[22], response2[23],
325 response2[24], response2[25], response2[26], response2[27],
326 response2[28], response2[29], response2[30], response2[31]);
327 ramsyscall_printf("cdlGetTN reading too much data, full response:\n%02x %02x %02x %02x %02x %02x %02x %02x\n"
328 "%02x %02x %02x %02x %02x %02x %02x %02x\n"
329 "%02x %02x %02x %02x %02x %02x %02x %02x\n"
330 "%02x %02x %02x %02x %02x %02x %02x %02x\n",
331 response3[0], response3[1], response3[2], response3[3],
332 response3[4], response3[5], response3[6], response3[7],
333 response3[8], response3[9], response3[10], response3[11],
334 response3[12], response3[13], response3[14], response3[15],
335 response3[16], response3[17], response3[18], response3[19],
336 response3[20], response3[21], response3[22], response3[23],
337 response3[24], response3[25], response3[26], response3[27],
338 response3[28], response3[29], response3[30], response3[31]);
339)
uint8_t response2[17]
Definition cdlid.c:204
CDROM_REG0
Definition cdlid.c:87
uint32_t ackTime
Definition cdlid.c:192
uint8_t responseSize1
Definition cdlid.c:98
waitCDRomIRQ()
CESTER_TEST(cdlId, test_instance, int resetDone=resetCDRom();if(!resetDone) { cester_assert_true(resetDone);return;} initializeTime();CDROM_REG0=0;CDROM_REG1=CDL_GETID;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;uint32_t completeTime=waitCDRomIRQ();uint8_t cause2=ackCDRomCause();uint8_t ctrl3=CDROM_REG0 &~3;uint8_t response2[16];uint8_t responseSize2=readResponse(response2);uint8_t ctrl4=CDROM_REG0 &~3;CDROM_REG0=1;uint8_t cause2b=CDROM_REG3_UC;cester_assert_uint_eq(3, cause1);cester_assert_uint_eq(2, cause2);cester_assert_uint_eq(0xe0, cause1b);cester_assert_uint_eq(0xe0, cause2b);cester_assert_uint_eq(2, response1[0]);cester_assert_uint_eq(1, responseSize1);cester_assert_uint_eq(8, responseSize2);cester_assert_uint_eq(0x38, ctrl1);cester_assert_uint_eq(0x18, ctrl2);cester_assert_uint_eq(0x38, ctrl3);cester_assert_uint_eq(0x18, ctrl4);cester_assert_uint_ge(ackTime, 500);cester_assert_uint_lt(ackTime, 7000);ramsyscall_printf("Basic cdlId, ack in %ius, complete in %ius\n", ackTime, completeTime);ramsyscall_printf("Full response: %02x %02x %02x %02x %02x %02x %02x %02x\n", response2[0], response2[1], response2[2], response2[3], response2[4], response2[5], response2[6], response2[7]);) CESTER_TEST(cdlIdTooManyArgs
int resetDone
Definition cdlid.c:79
uint8_t ctrl4
Definition cdlid.c:208
uint8_t response1[16]
Definition cdlid.c:97
test_instance
Definition cdlid.c:78
uint8_t cause2b
Definition cdlid.c:210
uint8_t ctrl5
Definition cdlid.c:219
uint32_t completeTime
Definition cdlid.c:201
cester_assert_uint_ge(errorTime, 500)
uint8_t ctrl2
Definition cdlid.c:99
uint8_t cause1
Definition cdlid.c:95
uint8_t cause2
Definition cdlid.c:202
uint32_t errorTime
Definition cdlid.c:94
cester_assert_uint_eq(5, cause1)
uint8_t cause1b
Definition cdlid.c:101
uint8_t ctrl1
Definition cdlid.c:96
uint8_t responseSize3
Definition cdlid.c:218
uint8_t cause3b
Definition cdlid.c:221
CDROM_REG2
Definition cdlid.c:88
initializeTime()
CDROM_REG1
Definition cdlid.c:92
cester_assert_uint_lt(errorTime, 7000)
uint8_t ctrl3
Definition cdlid.c:203
uint8_t cause3
Definition cdlid.c:216
uint8_t response3[16]
Definition cdlid.c:217
uint8_t responseSize2
Definition cdlreadn.c:167
@ CDL_GETID
Definition cdrom.h:68
@ CDL_GETTN
Definition cdrom.h:61
#define CDROM_REG3_UC
Definition cdrom.h:39
ramsyscall_printf("=== e01_kseg1_reads_no_fill ===\n")
int i
Definition gte-regio.c:297
ackCDRomCause()
cester_assert_true(seekDone)
readResponse(response)
void uint32_t(classId, spec)