Nugget
Bare-metal libraries and examples for the original PlayStation
Loading...
Searching...
No Matches
quad-flat.c
Go to the documentation of this file.
1/*
2
3MIT License
4
5Copyright (c) 2026 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// Phase-8 4-vert flat textured quad tests. Each draw uses the texture
28// fixtures uploaded by uploadAllTextureFixtures(); fixture textures
29// are content-addressed (texel value = f(u, v)) so the test can read
30// back the VRAM pixel and assert it matches the expected texel-CLUT
31// lookup. Vertex/UV layouts target three concerns:
32//
33// - Baseline UV interpolation across non-trivial quad shapes.
34// - Terminal-odd-pixel sampler behavior (audit finding #8: 4-vert
35// paths use posY + difY at the terminal, hardware truth is among
36// what this captures).
37// - Semi-trans opcode (0x2E) path correctness.
38
39// clang-format off
40
42
43// ---- Axis-aligned quads, UV 1:1 with screen ------------------------------
44
45static void drawQFA4(void) {
46 rasterReset();
47 rasterClearTestRegion(0, 0, 32, 16);
48 setTexpage(TEX4_TX, TEX4_TY, 0);
49 setTextureWindow(0, 0, 0, 0);
50 /* 16-wide x 8-tall axis-aligned quad, UV matching screen. */
51 rasterFlatTexQuad(TEX_MOD_NEUTRAL,
52 0, 0, 0, 0,
53 15, 0, 15, 0,
54 0, 7, 0, 7,
55 15, 7, 15, 7,
57 rasterFlushPrimitive();
58}
59
60static void drawQFA8(void) {
61 rasterReset();
62 rasterClearTestRegion(0, 0, 48, 16);
63 setTexpage(TEX8_TX, TEX8_TY, 1);
64 setTextureWindow(0, 0, 0, 0);
65 /* 32-wide x 8-tall - more 8-bit texels per row. */
66 rasterFlatTexQuad(TEX_MOD_NEUTRAL,
67 0, 0, 0, 0,
68 31, 0, 31, 0,
69 0, 7, 0, 7,
70 31, 7, 31, 7,
72 rasterFlushPrimitive();
73}
74
75static void drawQFA15(void) {
76 rasterReset();
77 rasterClearTestRegion(0, 0, 32, 16);
78 setTexpage(TEX15_TX, TEX15_TY, 2);
79 setTextureWindow(0, 0, 0, 0);
80 rasterFlatTexQuad(TEX_MOD_NEUTRAL,
81 0, 0, 0, 0,
82 15, 0, 15, 0,
83 0, 7, 0, 7,
84 15, 7, 15, 7,
86 rasterFlushPrimitive();
87}
88
89// ---- Skewed parallelogram quads (non-rectangular UV interpolation) -------
90
91static void drawQFD4(void) {
92 /* Parallelogram: bottom edge shifted +4 in X. Top vertices at
93 (0,0) and (15,0); bottom at (4,7) and (19,7). UV is still
94 0..15 across the width at each row, so the per-row UV
95 interpolation has to interpolate U from 0 to 15 across a
96 row whose pixel-extent shifts with Y. */
97 rasterReset();
98 rasterClearTestRegion(0, 0, 28, 16);
99 setTexpage(TEX4_TX, TEX4_TY, 0);
100 setTextureWindow(0, 0, 0, 0);
101 rasterFlatTexQuad(TEX_MOD_NEUTRAL,
102 0, 0, 0, 0,
103 15, 0, 15, 0,
104 4, 7, 0, 7,
105 19, 7, 15, 7,
107 rasterFlushPrimitive();
108}
109
110static void drawQFD15(void) {
111 /* Same shape, 15-bit texture - UV reads back as direct pixel. */
112 rasterReset();
113 rasterClearTestRegion(0, 0, 28, 16);
114 setTexpage(TEX15_TX, TEX15_TY, 2);
115 setTextureWindow(0, 0, 0, 0);
116 rasterFlatTexQuad(TEX_MOD_NEUTRAL,
117 0, 0, 0, 0,
118 15, 0, 15, 0,
119 4, 7, 0, 7,
120 19, 7, 15, 7,
122 rasterFlushPrimitive();
123}
124
125// ---- Odd-width row terminal probes (audit finding #8) --------------------
126//
127// 5x4 axis-aligned quad: each row covers 5 pixels (xmin=0..xmax=4),
128// odd width -> terminal sampler fires at j=4. UV matching screen so
129// terminal pixel "should" sample texel (4, row). Capture what
130// hardware actually returns at each terminal pixel.
131
132static void drawQFO4(void) {
133 rasterReset();
134 rasterClearTestRegion(0, 0, 16, 16);
135 setTexpage(TEX4_TX, TEX4_TY, 0);
136 setTextureWindow(0, 0, 0, 0);
137 rasterFlatTexQuad(TEX_MOD_NEUTRAL,
138 0, 0, 0, 0,
139 4, 0, 4, 0,
140 0, 3, 0, 3,
141 4, 3, 4, 3,
143 rasterFlushPrimitive();
144}
145
146static void drawQFO8(void) {
147 /* Same 5x4 shape, 8-bit texture. Terminal pixel samples texel
148 (4, row) -> CLUT8[4] = expectedClut8Color(4). */
149 rasterReset();
150 rasterClearTestRegion(0, 0, 16, 16);
151 setTexpage(TEX8_TX, TEX8_TY, 1);
152 setTextureWindow(0, 0, 0, 0);
153 rasterFlatTexQuad(TEX_MOD_NEUTRAL,
154 0, 0, 0, 0,
155 4, 0, 4, 0,
156 0, 3, 0, 3,
157 4, 3, 4, 3,
159 rasterFlushPrimitive();
160}
161
162static void drawQFO15(void) {
163 rasterReset();
164 rasterClearTestRegion(0, 0, 16, 16);
165 setTexpage(TEX15_TX, TEX15_TY, 2);
166 setTextureWindow(0, 0, 0, 0);
167 rasterFlatTexQuad(TEX_MOD_NEUTRAL,
168 0, 0, 0, 0,
169 4, 0, 4, 0,
170 0, 3, 0, 3,
171 4, 3, 4, 3,
173 rasterFlushPrimitive();
174}
175
176// ---- Semi-trans (GP0(0x2E)) variants -------------------------------------
177//
178// drawPoly4TEx*_S paths. The terminal sampler at j==xmax is the same
179// asymmetry as opaque. Pre-fill the test region with a known opaque
180// color so the semi-trans blend produces a deterministic result we
181// can capture.
182
183static void drawQFS4(void) {
184 rasterReset();
185 /* Pre-fill with VRAM red so semi-trans has a non-sentinel
186 background to blend against. */
187 rasterFillRect(0, 0, 32, 16, RASTER_VRAM_RED);
188 setTexpage(TEX4_TX, TEX4_TY, 0);
189 setTextureWindow(0, 0, 0, 0);
190 rasterFlatTexQuadSemi(TEX_MOD_NEUTRAL,
191 0, 0, 0, 0,
192 15, 0, 15, 0,
193 0, 7, 0, 7,
194 15, 7, 15, 7,
196 rasterFlushPrimitive();
197}
198
199static void drawQFS8(void) {
200 rasterReset();
201 rasterFillRect(0, 0, 48, 16, RASTER_VRAM_RED);
202 setTexpage(TEX8_TX, TEX8_TY, 1);
203 setTextureWindow(0, 0, 0, 0);
204 rasterFlatTexQuadSemi(TEX_MOD_NEUTRAL,
205 0, 0, 0, 0,
206 31, 0, 31, 0,
207 0, 7, 0, 7,
208 31, 7, 31, 7,
210 rasterFlushPrimitive();
211}
212
213// ---- Degenerate quad: v3 coincident with v2 ------------------------------
214//
215// Effective triangle. The 4-vert path should produce identical pixels
216// to a 3-vert path drawn with the first three vertices.
217
218static void drawQFDeg(void) {
219 rasterReset();
220 rasterClearTestRegion(0, 0, 32, 16);
221 setTexpage(TEX4_TX, TEX4_TY, 0);
222 setTextureWindow(0, 0, 0, 0);
223 rasterFlatTexQuad(TEX_MOD_NEUTRAL,
224 0, 0, 0, 0,
225 15, 0, 15, 0,
226 0, 7, 0, 7,
227 0, 7, 0, 7, /* v3 == v2 */
229 rasterFlushPrimitive();
230}
231
232// Reference 3-vert path matching QFDeg's first three vertices.
233static void drawQFDegRef(void) {
234 rasterReset();
235 rasterClearTestRegion(0, 0, 32, 16);
236 setTexpage(TEX4_TX, TEX4_TY, 0);
237 setTextureWindow(0, 0, 0, 0);
238 rasterTexTri(TEX_MOD_NEUTRAL,
239 0, 0, 0, 0,
240 15, 0, 15, 0,
241 0, 7, 0, 7,
243 rasterFlushPrimitive();
244}
245
246) // CESTER_BODY
247
248// ============================================================================
249// QFA4: axis-aligned 16x8 4-bit quad
250// ============================================================================
251
252CESTER_TEST(qfa4_corner_0_0, gpu_raster_phase8,
253 drawQFA4();
254 /* (0,0) samples texel u=0 -> CLUT4[0]. */
256)
257CESTER_TEST(qfa4_corner_14_0, gpu_raster_phase8,
258 drawQFA4();
259 /* (14,0) samples texel u=14 -> CLUT4[14]. */
261)
262CESTER_TEST(qfa4_corner_0_6, gpu_raster_phase8,
263 drawQFA4();
265)
266CESTER_TEST(qfa4_corner_14_6, gpu_raster_phase8,
267 drawQFA4();
269)
270CESTER_TEST(qfa4_interior_7_3, gpu_raster_phase8,
271 drawQFA4();
273)
274CESTER_TEST(qfa4_interior_3_5, gpu_raster_phase8,
275 drawQFA4();
277)
278
279// ============================================================================
280// QFA8: axis-aligned 32x8 8-bit quad
281// ============================================================================
282
283CESTER_TEST(qfa8_corner_0_0, gpu_raster_phase8,
284 drawQFA8();
286)
287CESTER_TEST(qfa8_corner_30_0, gpu_raster_phase8,
288 drawQFA8();
290)
291CESTER_TEST(qfa8_corner_0_6, gpu_raster_phase8,
292 drawQFA8();
294)
295CESTER_TEST(qfa8_corner_30_6, gpu_raster_phase8,
296 drawQFA8();
298)
299CESTER_TEST(qfa8_interior_15_3, gpu_raster_phase8,
300 drawQFA8();
302)
303CESTER_TEST(qfa8_interior_22_5, gpu_raster_phase8,
304 drawQFA8();
306)
307
308// ============================================================================
309// QFA15: axis-aligned 16x8 15-bit quad
310// ============================================================================
311
312CESTER_TEST(qfa15_corner_0_0, gpu_raster_phase8,
313 drawQFA15();
315)
316CESTER_TEST(qfa15_corner_14_0, gpu_raster_phase8,
317 drawQFA15();
319)
320CESTER_TEST(qfa15_corner_0_6, gpu_raster_phase8,
321 drawQFA15();
323)
324CESTER_TEST(qfa15_corner_14_6, gpu_raster_phase8,
325 drawQFA15();
327)
328CESTER_TEST(qfa15_interior_7_3, gpu_raster_phase8,
329 drawQFA15();
331)
332CESTER_TEST(qfa15_interior_3_5, gpu_raster_phase8,
333 drawQFA15();
335)
336
337// ============================================================================
338// QFD4: parallelogram-skewed 4-bit quad. UV per pixel depends on the
339// per-row interpolation across the slanted edges - non-trivial.
340// ============================================================================
341
342CESTER_TEST(qfd4_top_0_0, gpu_raster_phase8,
343 drawQFD4();
345)
346CESTER_TEST(qfd4_top_8_0, gpu_raster_phase8,
347 drawQFD4();
349)
350CESTER_TEST(qfd4_mid_4_3, gpu_raster_phase8,
351 drawQFD4();
352 /* Mid-row interior. */
354)
355CESTER_TEST(qfd4_mid_10_3, gpu_raster_phase8,
356 drawQFD4();
358)
359CESTER_TEST(qfd4_bottom_4_6, gpu_raster_phase8,
360 drawQFD4();
362)
363CESTER_TEST(qfd4_bottom_14_6, gpu_raster_phase8,
364 drawQFD4();
366)
367
368/* Per-row UV drift probes for QFD4 parallelogram. The left edge slope
369 is 4/7 per row, so frac(leftX) cycles 0/0.57/0.14/0.71/0.29/0.86/0.43.
370 Predicted: rows where frac(leftX) lands in (0, 0.5] sample U one LSB
371 higher than rows where it lands in (0.5, 1) - the half-pixel-bias is
372 what the inner loop's posX init currently elides. */
373CESTER_TEST(qfd4_row1_4, gpu_raster_phase8,
374 drawQFD4();
376)
377CESTER_TEST(qfd4_row1_10, gpu_raster_phase8,
378 drawQFD4();
380)
381CESTER_TEST(qfd4_row2_4, gpu_raster_phase8,
382 drawQFD4();
384)
385CESTER_TEST(qfd4_row2_10, gpu_raster_phase8,
386 drawQFD4();
388)
389CESTER_TEST(qfd4_row4_4, gpu_raster_phase8,
390 drawQFD4();
392)
393CESTER_TEST(qfd4_row4_10, gpu_raster_phase8,
394 drawQFD4();
396)
397CESTER_TEST(qfd4_row5_4, gpu_raster_phase8,
398 drawQFD4();
400)
401CESTER_TEST(qfd4_row5_10, gpu_raster_phase8,
402 drawQFD4();
404)
405
406// ============================================================================
407// QFD15: parallelogram-skewed 15-bit quad
408// ============================================================================
409
410CESTER_TEST(qfd15_top_0_0, gpu_raster_phase8,
411 drawQFD15();
413)
414CESTER_TEST(qfd15_top_8_0, gpu_raster_phase8,
415 drawQFD15();
417)
418CESTER_TEST(qfd15_mid_4_3, gpu_raster_phase8,
419 drawQFD15();
421)
422CESTER_TEST(qfd15_mid_10_3, gpu_raster_phase8,
423 drawQFD15();
425)
426CESTER_TEST(qfd15_bottom_4_6, gpu_raster_phase8,
427 drawQFD15();
429)
430CESTER_TEST(qfd15_bottom_14_6, gpu_raster_phase8,
431 drawQFD15();
433)
434
435/* Direct-15 mirror of the QFD4 per-row UV drift probes. Same geometry,
436 same per-row leftX slope, but 15-bit direct texel lookup so the U and
437 V values are both observable in the returned color word. */
438CESTER_TEST(qfd15_row1_4, gpu_raster_phase8,
439 drawQFD15();
441)
442CESTER_TEST(qfd15_row1_10, gpu_raster_phase8,
443 drawQFD15();
445)
446CESTER_TEST(qfd15_row2_4, gpu_raster_phase8,
447 drawQFD15();
449)
450CESTER_TEST(qfd15_row2_10, gpu_raster_phase8,
451 drawQFD15();
453)
454CESTER_TEST(qfd15_row4_4, gpu_raster_phase8,
455 drawQFD15();
457)
458CESTER_TEST(qfd15_row4_10, gpu_raster_phase8,
459 drawQFD15();
461)
462CESTER_TEST(qfd15_row5_4, gpu_raster_phase8,
463 drawQFD15();
465)
466CESTER_TEST(qfd15_row5_10, gpu_raster_phase8,
467 drawQFD15();
469)
470
471// ============================================================================
472// QFO4: 5x4 odd-width-row quad. Terminal pixel of each row reveals
473// the audit-finding-#8 sampler behavior on real hardware.
474// ============================================================================
475
476CESTER_TEST(qfo4_terminal_4_0, gpu_raster_phase8,
477 drawQFO4();
478 /* Top-row terminal pixel. */
480)
481CESTER_TEST(qfo4_terminal_4_1, gpu_raster_phase8,
482 drawQFO4();
484)
485CESTER_TEST(qfo4_terminal_4_2, gpu_raster_phase8,
486 drawQFO4();
488)
489CESTER_TEST(qfo4_interior_2_1, gpu_raster_phase8,
490 drawQFO4();
491 /* Non-terminal interior - paired loop covers it. */
493)
494CESTER_TEST(qfo4_interior_3_2, gpu_raster_phase8,
495 drawQFO4();
497)
498
499// ============================================================================
500// QFO8: 5x4 8-bit odd-width
501// ============================================================================
502
503CESTER_TEST(qfo8_terminal_4_0, gpu_raster_phase8,
504 drawQFO8();
506)
507CESTER_TEST(qfo8_terminal_4_1, gpu_raster_phase8,
508 drawQFO8();
510)
511CESTER_TEST(qfo8_terminal_4_2, gpu_raster_phase8,
512 drawQFO8();
514)
515CESTER_TEST(qfo8_interior_2_1, gpu_raster_phase8,
516 drawQFO8();
518)
519
520// ============================================================================
521// QFO15: 5x4 15-bit odd-width
522// ============================================================================
523
524CESTER_TEST(qfo15_terminal_4_0, gpu_raster_phase8,
525 drawQFO15();
527)
528CESTER_TEST(qfo15_terminal_4_1, gpu_raster_phase8,
529 drawQFO15();
531)
532CESTER_TEST(qfo15_terminal_4_2, gpu_raster_phase8,
533 drawQFO15();
535)
536CESTER_TEST(qfo15_interior_2_1, gpu_raster_phase8,
537 drawQFO15();
539)
540
541// ============================================================================
542// QFS4: semi-trans 4-bit quad (drawPoly4TEx4_S path)
543// Pre-fill background is VRAM red (0x001f).
544// ============================================================================
545
546CESTER_TEST(qfs4_corner_0_0, gpu_raster_phase8,
547 drawQFS4();
549)
550CESTER_TEST(qfs4_interior_7_3, gpu_raster_phase8,
551 drawQFS4();
553)
554CESTER_TEST(qfs4_corner_14_6, gpu_raster_phase8,
555 drawQFS4();
557)
558
559// ============================================================================
560// QFS8: semi-trans 8-bit quad (drawPoly4TEx8_S path)
561// ============================================================================
562
563CESTER_TEST(qfs8_corner_0_0, gpu_raster_phase8,
564 drawQFS8();
566)
567CESTER_TEST(qfs8_interior_15_3, gpu_raster_phase8,
568 drawQFS8();
570)
571CESTER_TEST(qfs8_corner_30_6, gpu_raster_phase8,
572 drawQFS8();
574)
575
576// ============================================================================
577// QFDeg: degenerate quad collapses to triangle. Compare against the
578// 3-vert reference draw via ASSERT_PIXEL_EQ on captured oracle values.
579// ============================================================================
580
581CESTER_TEST(qfdeg_0_0, gpu_raster_phase8,
582 drawQFDeg();
584)
585CESTER_TEST(qfdeg_7_3, gpu_raster_phase8,
586 drawQFDeg();
588)
589CESTER_TEST(qfdeg_3_5, gpu_raster_phase8,
590 drawQFDeg();
592)
593
594CESTER_TEST(qfdeg_ref_0_0, gpu_raster_phase8,
595 drawQFDegRef();
596 /* Same oracle value - 3-vert reference should match the
597 degenerate-quad output at every interior pixel. */
599)
600CESTER_TEST(qfdeg_ref_7_3, gpu_raster_phase8,
601 drawQFDegRef();
603)
604CESTER_TEST(qfdeg_ref_3_5, gpu_raster_phase8,
605 drawQFDegRef();
607)
CESTER_TEST(cddaLevelHalf, test_instances, static const uint8_t atv[4]={0x40, 0x00, 0x40, 0x00};unsigned changes=0;int peak=cddaPeak(atv, 1, &changes);ramsyscall_printf("CD-DA level at half ATV: peak %i, %u sign changes\n", peak, changes);cester_assert_int_ge(peak, 11300);cester_assert_int_le(peak, 11800);cester_assert_uint_ge(changes, 4);) CESTER_TEST(cddaLevelClipped
CESTER_BODY(static uint16_t s_cddaCapture;static int cddaSpuDma(uint32_t spuAddr, void *buf, uint32_t bytes, int isRead) { const uint16_t tsa=spuAddr > > 3;const uint16_t mode=isRead ? 0x30 :0x20;SPU_RAM_DTA=tsa;for(int i=0;i< 0xf01 &&SPU_RAM_DTA !=tsa;i++);SPU_CTRL=(SPU_CTRL &~0x30)|mode;for(volatile int i=0;i< 60;i++);for(int i=0;i< 0xf01 &&(SPU_STATUS &0x30) !=mode;i++);CDDA_SPU_DELAY=(CDDA_SPU_DELAY &0xf0ffffff)|(isRead ? 0x22000000 :0x20000000);DMA_CTRL[DMA_SPU].MADR=(uint32_t) buf &0x1fffffff;DMA_CTRL[DMA_SPU].BCR=((bytes > > 6)<< 16)|0x10;DMA_CTRL[DMA_SPU].CHCR=isRead ? 0x01000200 :0x01000201;int ok=0;for(unsigned t=0;t< 4000000u;t++) { if((DMA_CTRL[DMA_SPU].CHCR &0x01000000)==0) { ok=1;break;} } SPU_CTRL=SPU_CTRL &~0x30;for(volatile int i=0;i< 60;i++);return ok;} static int cddaSimpleCmd(uint8_t cmd) { uint8_t response[16];CDROM_REG0=0;CDROM_REG1=cmd;uint32_t timeout=2000000;int ok=waitCDRomIRQWithTimeout(&timeout);ackCDRomCause();readResponse(response);return ok;} static void cddaWaitPauseComplete() { initializeTime();uint32_t elapsed=0;while(elapsed< 5000000u) { uint32_t budget=200000u;int ok=waitCDRomIRQWithTimeout(&budget);elapsed=budget;if(!ok) continue;uint8_t cause=ackCDRomCause();uint8_t response[16];readResponse(response);if(cause==2) return;} } static int cddaAudioSetup(const uint8_t atv[4], int demute) { if(!resetCDRom()) return 0;DPCR|=0x000b0000;SPU_CTRL=0;for(volatile int i=0;i< 20000;i++);SPU_VOL_MAIN_LEFT=0;SPU_VOL_MAIN_RIGHT=0;SPU_KEY_OFF_LOW=0xffff;SPU_KEY_OFF_HIGH=0xffff;SPU_RAM_DTC=4;SPU_CTRL=0x8001;for(volatile int i=0;i< 20000;i++);for(int i=0;i< 0x400;i++) s_cddaCapture[i]=CDDA_MARKER;if(!cddaSpuDma(0x000, s_cddaCapture, 0x800, 0)) return 0;if(!cddaSimpleCmd(demute ? CDL_DEMUTE :CDL_MUTE)) return 0;CDROM_REG0=2;CDROM_REG2=atv[0];CDROM_REG3=atv[1];CDROM_REG0=3;CDROM_REG1=atv[2];CDROM_REG2=atv[3];CDROM_REG0=3;CDROM_REG3=0x20;CDROM_REG0=0;SPU_VOL_CD_LEFT=0x7fff;SPU_VOL_CD_RIGHT=0x7fff;SPU_CTRL=SPU_CTRL|0x8001;return 1;} static int cddaBufferPeak(unsigned *signChanges) { int peak=0;unsigned changes=0;int prev=0;for(int i=0;i< 0x200;i++) { int v=(int16_t) s_cddaCapture[i];int a=v< 0 ? -v :v;if(a > peak) peak=a;int sign=v >=0 ? 1 :-1;if(i &&sign !=prev) changes++;prev=sign;} *signChanges=changes;return peak;} static int cddaCapturePeak(unsigned *signChanges) { int peak=0;for(unsigned attempt=0;attempt< 8;attempt++) { if(attempt) { initializeTime();while(updateTime()< 250000u);} if(!cddaSpuDma(0x000, s_cddaCapture, 0x800, 1)) return -1;peak=cddaBufferPeak(signChanges);if(peak) { if(attempt) ramsyscall_printf("capture was empty %u time(s) before audio\n", attempt);break;} } return peak;} static int cddaPeak(const uint8_t atv[4], int demute, unsigned *signChanges) { if(!cddaAudioSetup(atv, demute)) return -1;if(!setMode(0)) return -1;CDROM_REG0=0;CDROM_REG2=0x02;if(!cddaSimpleCmd(CDL_PLAY)) return -1;initializeTime();while(updateTime()< 1500000u);int peak=cddaCapturePeak(signChanges);CDROM_REG0=0;CDROM_REG1=CDL_PAUSE;cddaWaitPauseComplete();CDROM_REG0=0;CDROM_REG2=0x00;CDROM_REG2=0x02;CDROM_REG2=0x16;if(cddaSimpleCmd(CDL_SETLOC) &&cddaSimpleCmd(CDL_SEEKL)) cddaWaitPauseComplete();return peak;}[0x400])
Definition cdda.c:37
#define QFDEG_7_3
Definition raster-expected-phase8.h:214
#define QFA8_0_6
Definition raster-expected-phase8.h:105
#define QFO8_TERMINAL_4_0
Definition raster-expected-phase8.h:183
#define QFD15_4_5
Definition raster-expected-phase8.h:162
#define QFO4_TERMINAL_4_0
Definition raster-expected-phase8.h:177
#define QFD15_14_6
Definition raster-expected-phase8.h:153
#define QFD15_0_0
Definition raster-expected-phase8.h:148
#define QFS4_7_3
Definition raster-expected-phase8.h:201
#define QFA8_22_5
Definition raster-expected-phase8.h:108
#define QFA15_0_6
Definition raster-expected-phase8.h:117
#define QFA8_30_6
Definition raster-expected-phase8.h:106
#define QFO4_INTERIOR_2_1
Definition raster-expected-phase8.h:180
#define QFD15_4_2
Definition raster-expected-phase8.h:158
#define QFD4_4_6
Definition raster-expected-phase8.h:131
#define QFA4_0_0
Definition raster-expected-phase8.h:90
#define QFD4_8_0
Definition raster-expected-phase8.h:128
#define QFD15_10_5
Definition raster-expected-phase8.h:163
#define QFD4_0_0
Definition raster-expected-phase8.h:127
#define QFD15_4_3
Definition raster-expected-phase8.h:150
#define QFA4_7_3
Definition raster-expected-phase8.h:94
#define QFD15_4_1
Definition raster-expected-phase8.h:156
#define QFO4_TERMINAL_4_1
Definition raster-expected-phase8.h:178
#define QFS8_30_6
Definition raster-expected-phase8.h:206
#define QFD15_8_0
Definition raster-expected-phase8.h:149
#define QFD4_10_2
Definition raster-expected-phase8.h:142
#define QFDEG_3_5
Definition raster-expected-phase8.h:215
#define QFD4_10_3
Definition raster-expected-phase8.h:130
#define QFO4_TERMINAL_4_2
Definition raster-expected-phase8.h:179
#define QFD15_4_6
Definition raster-expected-phase8.h:152
#define QFS4_14_6
Definition raster-expected-phase8.h:202
#define QFO15_TERMINAL_4_0
Definition raster-expected-phase8.h:188
#define QFA15_0_0
Definition raster-expected-phase8.h:115
#define QFA8_15_3
Definition raster-expected-phase8.h:107
#define QFA4_14_6
Definition raster-expected-phase8.h:93
#define QFD4_4_4
Definition raster-expected-phase8.h:143
#define QFD15_10_2
Definition raster-expected-phase8.h:159
#define QFA15_3_5
Definition raster-expected-phase8.h:120
#define QFD4_4_5
Definition raster-expected-phase8.h:145
#define QFA15_14_6
Definition raster-expected-phase8.h:118
#define QFO15_TERMINAL_4_2
Definition raster-expected-phase8.h:190
#define QFD15_4_4
Definition raster-expected-phase8.h:160
#define QFO15_INTERIOR_2_1
Definition raster-expected-phase8.h:191
#define QFD4_4_2
Definition raster-expected-phase8.h:141
#define QFA15_14_0
Definition raster-expected-phase8.h:116
#define QFD15_10_4
Definition raster-expected-phase8.h:161
#define QFDEG_REF_7_3
Definition raster-expected-phase8.h:218
#define QFDEG_0_0
Definition raster-expected-phase8.h:213
#define QFD4_10_1
Definition raster-expected-phase8.h:140
#define QFD15_10_1
Definition raster-expected-phase8.h:157
#define QFA8_0_0
Definition raster-expected-phase8.h:103
#define QFD4_4_3
Definition raster-expected-phase8.h:129
#define QFA4_14_0
Definition raster-expected-phase8.h:91
#define QFA8_30_0
Definition raster-expected-phase8.h:104
#define QFO8_INTERIOR_2_1
Definition raster-expected-phase8.h:186
#define QFD4_10_5
Definition raster-expected-phase8.h:146
#define QFA4_0_6
Definition raster-expected-phase8.h:92
#define QFS4_0_0
Definition raster-expected-phase8.h:200
#define QFD4_10_4
Definition raster-expected-phase8.h:144
#define QFD4_4_1
Definition raster-expected-phase8.h:139
#define QFS8_0_0
Definition raster-expected-phase8.h:204
#define QFA15_7_3
Definition raster-expected-phase8.h:119
#define QFS8_15_3
Definition raster-expected-phase8.h:205
#define QFD4_14_6
Definition raster-expected-phase8.h:132
#define QFO15_TERMINAL_4_1
Definition raster-expected-phase8.h:189
#define QFDEG_REF_0_0
Definition raster-expected-phase8.h:217
#define QFO4_INTERIOR_3_2
Definition raster-expected-phase8.h:181
#define QFD15_10_3
Definition raster-expected-phase8.h:151
#define QFA4_3_5
Definition raster-expected-phase8.h:95
#define QFDEG_REF_3_5
Definition raster-expected-phase8.h:219
#define QFO8_TERMINAL_4_1
Definition raster-expected-phase8.h:184
#define QFO8_TERMINAL_4_2
Definition raster-expected-phase8.h:185
#define RASTER_VRAM_RED
Definition raster-helpers.h:125
#define ASSERT_PIXEL_EQ(expected, x_, y_)
Definition raster-helpers.h:473
#define CLUT8_FIELD
Definition texture-fixtures.h:84
#define TEX15_TY
Definition texture-fixtures.h:66
#define TEX8_TY
Definition texture-fixtures.h:61
#define CLUT4_FIELD
Definition texture-fixtures.h:83
#define TEX15_TPAGE
Definition texture-fixtures.h:102
#define TEX8_TPAGE
Definition texture-fixtures.h:101
#define CLUT15_FIELD
Definition texture-fixtures.h:85
#define TEX15_TX
Definition texture-fixtures.h:65
#define TEX8_TX
Definition texture-fixtures.h:60
#define TEX_MOD_NEUTRAL
Definition texture-fixtures.h:308
#define TEX4_TY
Definition texture-fixtures.h:56
#define TEX4_TX
Definition texture-fixtures.h:55
#define TEX4_TPAGE
Definition texture-fixtures.h:100