Nugget
Bare-metal libraries and examples for the original PlayStation
Loading...
Searching...
No Matches
spu-adpcm-edge.c
Go to the documentation of this file.
1// ============================================================================
2// Characterize SPU ADPCM decoder edge cases not covered by the basic waveform
3// tests. Goldens are hardware-owned: first run either with SPU_DUMP=true to
4// collect .test.pcm files, or without goldens to print OBS lines and scalar
5// observations. Once the farm has measured silicon, define
6// SPU_ADPCM_EDGE_GOLDENS_AVAILABLE and include the generated files.
7// ============================================================================
8
9#ifndef SPU_ADPCM_EDGE_GOLDENS_AVAILABLE
10#define SPU_ADPCM_EDGE_GOLDENS_AVAILABLE 0
11#endif
12
13#ifndef SPU_ADPCM_EDGE_EXPECTED_REPEAT_LOOP_START
14#define SPU_ADPCM_EDGE_EXPECTED_REPEAT_LOOP_START 0x212u
15#endif
16#ifndef SPU_ADPCM_EDGE_EXPECTED_REPEAT_END_MUTE
17#define SPU_ADPCM_EDGE_EXPECTED_REPEAT_END_MUTE 0x210u
18#endif
19#ifndef SPU_ADPCM_EDGE_EXPECTED_ENDX_END_MUTE
20#define SPU_ADPCM_EDGE_EXPECTED_ENDX_END_MUTE 0x1u
21#endif
22#ifndef SPU_ADPCM_EDGE_EXPECTED_ENVX_END_MUTE
23#define SPU_ADPCM_EDGE_EXPECTED_ENVX_END_MUTE 0x0u
24#endif
25#ifndef SPU_ADPCM_EDGE_EXPECTED_ENDX_END_REPEAT
26#define SPU_ADPCM_EDGE_EXPECTED_ENDX_END_REPEAT 0x1u
27#endif
28#ifndef SPU_ADPCM_EDGE_EXPECTED_ENVX_END_REPEAT
29#define SPU_ADPCM_EDGE_EXPECTED_ENVX_END_REPEAT 0x3fffu
30#endif
31
32#define SPU_ENDX_LOW HW_U16(0x1f801d9c)
33
34#if SPU_ADPCM_EDGE_GOLDENS_AVAILABLE && !defined(SPU_DUMP)
35#define SPU_ADPCM_EDGE_INCBIN(NAME) \
36 asm( \
37 ".pushsection .rodata\n" \
38 ".global " #NAME "\n" \
39 ".align 2\n" \
40 #NAME ":\n" \
41 ".incbin \"" #NAME ".test.pcm\"\n" \
42 ".popsection")
43
45SPU_ADPCM_EDGE_INCBIN(adpcm_edge_predictor_0);
46SPU_ADPCM_EDGE_INCBIN(adpcm_edge_predictor_1);
47SPU_ADPCM_EDGE_INCBIN(adpcm_edge_predictor_2);
48SPU_ADPCM_EDGE_INCBIN(adpcm_edge_predictor_3);
49SPU_ADPCM_EDGE_INCBIN(adpcm_edge_predictor_4);
50SPU_ADPCM_EDGE_INCBIN(adpcm_edge_shift_00_03);
51SPU_ADPCM_EDGE_INCBIN(adpcm_edge_shift_04_07);
52SPU_ADPCM_EDGE_INCBIN(adpcm_edge_shift_08_11);
53SPU_ADPCM_EDGE_INCBIN(adpcm_edge_shift_12_15);
54SPU_ADPCM_EDGE_INCBIN(adpcm_edge_state_carry);
55SPU_ADPCM_EDGE_INCBIN(adpcm_edge_saturation_positive);
56SPU_ADPCM_EDGE_INCBIN(adpcm_edge_saturation_negative);
57SPU_ADPCM_EDGE_INCBIN(adpcm_edge_flag_code2_ignored);
58SPU_ADPCM_EDGE_INCBIN(adpcm_edge_flag_loop_start_latch);
59SPU_ADPCM_EDGE_INCBIN(adpcm_edge_flag_end_mute);
60SPU_ADPCM_EDGE_INCBIN(adpcm_edge_flag_end_repeat);
61SPU_ADPCM_EDGE_INCBIN(adpcm_edge_invalid_predictor_5_7);
62)
63
64#undef SPU_ADPCM_EDGE_INCBIN
65#endif
66
68static const uint8_t kEdgeZero[14] = {
69 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
70 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71};
72static const uint8_t kEdgePositive[14] = {
73 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
74 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,
75};
76static const uint8_t kEdgeNegative[14] = {
77 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
78 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,
79};
80static const uint8_t kEdgeAlternating[14] = {
81 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
82 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,
83};
84static const uint8_t kEdgeRamp[14] = {
85 0x10, 0x32, 0x54, 0x76, 0x56, 0x34, 0x12,
86 0xe0, 0xcd, 0xab, 0x89, 0xa9, 0xcb, 0xed,
87};
88static const uint8_t kEdgeMixed[14] = {
89 0x17, 0xde, 0x9a, 0xbc, 0x45, 0x23, 0x01,
90 0xfe, 0xdc, 0xba, 0x98, 0x89, 0x67, 0x45,
91};
92
93static void spu_adpcm_edge_block(uint8_t *sample, int block, uint8_t header,
94 uint8_t flags, const uint8_t *payload) {
95 uint8_t *p = sample + block * 16;
96 p[0] = header;
97 p[1] = flags;
98 for (int i = 0; i < 14; i++) p[2 + i] = payload[i];
99}
100
101static uint32_t spu_adpcm_edge_hash_capture(void) {
102 uint32_t h = 2166136261u;
103 for (int i = 0; i < 512; i++) {
104 h ^= (uint16_t)s_capture[i];
105 h *= 16777619u;
106 }
107 return h;
108}
109
110static void spu_adpcm_edge_observe(const char *name) {
111 int16_t min = (int16_t)s_capture[0];
112 int16_t max = (int16_t)s_capture[0];
113 for (int i = 1; i < 512; i++) {
114 int16_t v = (int16_t)s_capture[i];
115 if (v < min) min = v;
116 if (v > max) max = v;
117 }
118 ramsyscall_printf("OBS spu_adpcm_edge golden %s.test.pcm hash=0x%08x first=0x%04x mid=0x%04x last=0x%04x min=0x%04x max=0x%04x\n",
119 name, spu_adpcm_edge_hash_capture(), s_capture[0],
120 s_capture[256], s_capture[511], (uint16_t)min,
121 (uint16_t)max);
122}
123
124static void spu_adpcm_edge_expect_u32(const char *name, uint32_t expected,
125 uint32_t got) {
126 if (expected == 0xffffffffu) {
127 ramsyscall_printf("OBS spu_adpcm_edge expected %s=0x%08x\n", name, got);
128 } else {
129 cester_assert_uint_eq(expected, got);
130 }
131}
132
133static void spu_adpcm_edge_run_capture_keep_on(const uint8_t *sample64,
134 uint16_t pitch) {
136 for (int i = 0; i < 64; i++) s_upload[i] = sample64[i];
137 for (int i = 64; i < 128; i++) s_upload[i] = 0xaa;
138 spu_write_sync(SPU_UPLOAD_ADDR, s_upload, 128);
139 SPU_CTRL = 0x8000 | 0x4000;
140 SPU_VOL_MAIN_LEFT = 0x3fff;
141 SPU_VOL_MAIN_RIGHT = 0x3fff;
142
143 SPU_KEY_OFF_LOW = 0xffff;
144 SPU_KEY_OFF_HIGH = 0xffff;
145 spu_busy_wait(800000);
146
147 spu_wait_status_bit11_flip();
148 spu_voice1_keyon(SPU_UPLOAD_ADDR, pitch);
149 spu_wait_status_bit11_flip();
150 spu_read_sync(0x0800, s_capture, 1024);
151}
152
153static void spu_adpcm_edge_stop(void) {
154 SPU_KEY_OFF_LOW = 0xffff;
155 SPU_KEY_OFF_HIGH = 0xffff;
156 muteSpu();
157}
158)
159
160#ifdef SPU_DUMP
161#define SPU_ADPCM_EDGE_ASSERT_GOLDEN(name) spu_dump_pcm(#name ".test.pcm", s_capture, 1024)
162#elif SPU_ADPCM_EDGE_GOLDENS_AVAILABLE
163#define SPU_ADPCM_EDGE_ASSERT_GOLDEN(name) \
164 do { \
165 extern const uint8_t name[]; \
166 cester_assert_int_eq(0, spu_compare_golden(#name, s_capture, name)); \
167 } while (0)
168#else
169#define SPU_ADPCM_EDGE_ASSERT_GOLDEN(name) spu_adpcm_edge_observe(#name)
170#endif
171
172#define SPU_ADPCM_EDGE_TEST_PREDICTOR(N) \
173CESTER_TEST(adpcm_edge_predictor_##N, spu_tests, \
174 uint8_t sample[64]; \
175 spu_adpcm_edge_block(sample, 0, ((N) << 4) | 4, 0x04, kEdgeMixed); \
176 spu_adpcm_edge_block(sample, 1, ((N) << 4) | 4, 0x00, kEdgeRamp); \
177 spu_adpcm_edge_block(sample, 2, ((N) << 4) | 4, 0x00, kEdgeZero); \
178 spu_adpcm_edge_block(sample, 3, ((N) << 4) | 4, 0x03, kEdgeAlternating); \
179 run_voice1_with_sample(sample, 0x1000); \
180 SPU_ADPCM_EDGE_ASSERT_GOLDEN(adpcm_edge_predictor_##N); \
181)
182
188
189CESTER_TEST(adpcm_edge_shift_00_03, spu_tests,
190 uint8_t sample[64];
191 spu_adpcm_edge_block(sample, 0, 0x00, 0x04, kEdgeAlternating);
192 spu_adpcm_edge_block(sample, 1, 0x01, 0x00, kEdgeAlternating);
193 spu_adpcm_edge_block(sample, 2, 0x02, 0x00, kEdgeAlternating);
194 spu_adpcm_edge_block(sample, 3, 0x03, 0x03, kEdgeAlternating);
196 SPU_ADPCM_EDGE_ASSERT_GOLDEN(adpcm_edge_shift_00_03);
197)
198
199CESTER_TEST(adpcm_edge_shift_04_07, spu_tests,
200 uint8_t sample[64];
201 spu_adpcm_edge_block(sample, 0, 0x04, 0x04, kEdgeAlternating);
202 spu_adpcm_edge_block(sample, 1, 0x05, 0x00, kEdgeAlternating);
203 spu_adpcm_edge_block(sample, 2, 0x06, 0x00, kEdgeAlternating);
204 spu_adpcm_edge_block(sample, 3, 0x07, 0x03, kEdgeAlternating);
206 SPU_ADPCM_EDGE_ASSERT_GOLDEN(adpcm_edge_shift_04_07);
207)
208
209CESTER_TEST(adpcm_edge_shift_08_11, spu_tests,
210 uint8_t sample[64];
211 spu_adpcm_edge_block(sample, 0, 0x08, 0x04, kEdgeAlternating);
212 spu_adpcm_edge_block(sample, 1, 0x09, 0x00, kEdgeAlternating);
213 spu_adpcm_edge_block(sample, 2, 0x0a, 0x00, kEdgeAlternating);
214 spu_adpcm_edge_block(sample, 3, 0x0b, 0x03, kEdgeAlternating);
216 SPU_ADPCM_EDGE_ASSERT_GOLDEN(adpcm_edge_shift_08_11);
217)
218
219CESTER_TEST(adpcm_edge_shift_12_15, spu_tests,
220 uint8_t sample[64];
221 spu_adpcm_edge_block(sample, 0, 0x0c, 0x04, kEdgeAlternating);
222 spu_adpcm_edge_block(sample, 1, 0x0d, 0x00, kEdgeAlternating);
223 spu_adpcm_edge_block(sample, 2, 0x0e, 0x00, kEdgeAlternating);
224 spu_adpcm_edge_block(sample, 3, 0x0f, 0x03, kEdgeAlternating);
226 SPU_ADPCM_EDGE_ASSERT_GOLDEN(adpcm_edge_shift_12_15);
227)
228
229CESTER_TEST(adpcm_edge_state_carry, spu_tests,
230 uint8_t sample[64];
231 spu_adpcm_edge_block(sample, 0, 0x00, 0x04, kEdgePositive);
232 spu_adpcm_edge_block(sample, 1, 0x44, 0x00, kEdgeZero);
233 spu_adpcm_edge_block(sample, 2, 0x44, 0x00, kEdgeZero);
234 spu_adpcm_edge_block(sample, 3, 0x44, 0x03, kEdgeZero);
236 SPU_ADPCM_EDGE_ASSERT_GOLDEN(adpcm_edge_state_carry);
237)
238
239CESTER_TEST(adpcm_edge_saturation_positive, spu_tests,
240 uint8_t sample[64];
241 for (int i = 0; i < 4; i++)
242 spu_adpcm_edge_block(sample, i, 0x40, i == 0 ? 0x04 : (i == 3 ? 0x03 : 0x00), kEdgePositive);
244 SPU_ADPCM_EDGE_ASSERT_GOLDEN(adpcm_edge_saturation_positive);
245)
246
247CESTER_TEST(adpcm_edge_saturation_negative, spu_tests,
248 uint8_t sample[64];
249 for (int i = 0; i < 4; i++)
250 spu_adpcm_edge_block(sample, i, 0x40, i == 0 ? 0x04 : (i == 3 ? 0x03 : 0x00), kEdgeNegative);
252 SPU_ADPCM_EDGE_ASSERT_GOLDEN(adpcm_edge_saturation_negative);
253)
254
255CESTER_TEST(adpcm_edge_flag_code2_ignored, spu_tests,
256 uint8_t sample[64];
257 spu_adpcm_edge_block(sample, 0, 0x04, 0x04, kEdgeRamp);
258 spu_adpcm_edge_block(sample, 1, 0x04, 0x02, kEdgePositive);
259 spu_adpcm_edge_block(sample, 2, 0x04, 0x00, kEdgeNegative);
260 spu_adpcm_edge_block(sample, 3, 0x04, 0x03, kEdgeZero);
262 SPU_ADPCM_EDGE_ASSERT_GOLDEN(adpcm_edge_flag_code2_ignored);
263)
264
265CESTER_TEST(adpcm_edge_flag_loop_start_latch, spu_tests,
266 uint8_t sample[64];
267 spu_adpcm_edge_block(sample, 0, 0x04, 0x00, kEdgePositive);
268 spu_adpcm_edge_block(sample, 1, 0x04, 0x04, kEdgeRamp);
269 spu_adpcm_edge_block(sample, 2, 0x04, 0x00, kEdgeNegative);
270 spu_adpcm_edge_block(sample, 3, 0x04, 0x03, kEdgeZero);
271 spu_adpcm_edge_run_capture_keep_on(sample, 0x1000);
272 SPU_ADPCM_EDGE_ASSERT_GOLDEN(adpcm_edge_flag_loop_start_latch);
273 spu_adpcm_edge_expect_u32("repeat_loop_start",
275 spu_adpcm_edge_stop();
276)
277
278CESTER_MAYBE_TEST(adpcm_edge_flag_end_mute, spu_tests,
279 uint8_t sample[64];
280 spu_adpcm_edge_block(sample, 0, 0x04, 0x04, kEdgePositive);
281 spu_adpcm_edge_block(sample, 1, 0x04, 0x01, kEdgeNegative);
282 spu_adpcm_edge_block(sample, 2, 0x04, 0x00, kEdgePositive);
283 spu_adpcm_edge_block(sample, 3, 0x04, 0x03, kEdgePositive);
284 spu_adpcm_edge_run_capture_keep_on(sample, 0x1000);
285 spu_busy_wait(800000);
286 SPU_ADPCM_EDGE_ASSERT_GOLDEN(adpcm_edge_flag_end_mute);
287 spu_adpcm_edge_expect_u32("repeat_end_mute",
289 spu_adpcm_edge_expect_u32("endx_end_mute",
291 spu_adpcm_edge_expect_u32("envx_end_mute",
293 spu_adpcm_edge_stop();
294)
295
296CESTER_TEST(adpcm_edge_flag_end_repeat, spu_tests,
297 uint8_t sample[64];
298 spu_adpcm_edge_block(sample, 0, 0x04, 0x04, kEdgePositive);
299 spu_adpcm_edge_block(sample, 1, 0x04, 0x03, kEdgeNegative);
300 spu_adpcm_edge_block(sample, 2, 0x04, 0x00, kEdgePositive);
301 spu_adpcm_edge_block(sample, 3, 0x04, 0x03, kEdgePositive);
302 spu_adpcm_edge_run_capture_keep_on(sample, 0x1000);
303 spu_busy_wait(800000);
304 SPU_ADPCM_EDGE_ASSERT_GOLDEN(adpcm_edge_flag_end_repeat);
305 spu_adpcm_edge_expect_u32("endx_end_repeat",
307 spu_adpcm_edge_expect_u32("envx_end_repeat",
309 spu_adpcm_edge_stop();
310)
311
312CESTER_TEST(adpcm_edge_invalid_predictor_5_7, spu_tests,
313 uint8_t sample[64];
314 spu_adpcm_edge_block(sample, 0, 0x54, 0x04, kEdgeMixed);
315 spu_adpcm_edge_block(sample, 1, 0x64, 0x00, kEdgeRamp);
316 spu_adpcm_edge_block(sample, 2, 0x74, 0x00, kEdgeAlternating);
317 spu_adpcm_edge_block(sample, 3, 0xf4, 0x03, kEdgeZero);
319 SPU_ADPCM_EDGE_ASSERT_GOLDEN(adpcm_edge_invalid_predictor_5_7);
320)
CESTER_TEST(cdlGetLocL, test_instances, int resetDone=resetCDRom();if(!resetDone) { cester_assert_true(resetDone);return;} initializeTime();CDROM_REG0=0;CDROM_REG1=CDL_GETLOCL;uint32_t ackTime=waitCDRomIRQ();uint8_t cause1=ackCDRomCause();uint8_t ctrl1=CDROM_REG0 &~3;uint8_t response[16];uint8_t responseSize=readResponse(response);uint8_t ctrl2=CDROM_REG0 &~3;CDROM_REG0=1;uint8_t cause1b=CDROM_REG3_UC;cester_assert_uint_eq(3, cause1);cester_assert_uint_eq(0xe0, cause1b);cester_assert_uint_eq(0x38, ctrl1);cester_assert_uint_eq(0x18, ctrl2);cester_assert_uint_eq(8, responseSize);cester_assert_uint_ge(ackTime, 500);cester_assert_uint_lt(ackTime, 7000);ramsyscall_printf("Basic getlocL, ack in %ius\n", ackTime);) CESTER_TEST(cdlGetLocLafterSeekP
cester_assert_uint_eq(5, cause1)
for(unsigned i=0;i< 17;i++)
Definition cdlid.c:205
#define SPU_VOICES
Definition spu.h:42
#define SPU_VOL_MAIN_LEFT
Definition spu.h:84
#define SPU_KEY_OFF_LOW
Definition spu.h:90
#define SPU_KEY_OFF_HIGH
Definition spu.h:91
#define SPU_CTRL
Definition spu.h:104
#define SPU_VOL_MAIN_RIGHT
Definition spu.h:85
#define CESTER_MAYBE_TEST
Definition cop0.c:34
ramsyscall_printf("=== e01_kseg1_reads_no_fill ===\n")
int i
Definition gte-regio.c:297
header
Definition mkimage.py:60
uint8_t sample[64]
Definition spu-adpcm-edge.c:190
#define SPU_ADPCM_EDGE_EXPECTED_ENDX_END_REPEAT
Definition spu-adpcm-edge.c:26
#define SPU_ADPCM_EDGE_EXPECTED_REPEAT_LOOP_START
Definition spu-adpcm-edge.c:14
#define SPU_ADPCM_EDGE_ASSERT_GOLDEN(name)
spu_tests
Definition spu-adpcm-edge.c:189
#define SPU_ENDX_LOW
Definition spu-adpcm-edge.c:32
#define SPU_ADPCM_EDGE_EXPECTED_ENVX_END_REPEAT
Definition spu-adpcm-edge.c:29
#define SPU_ADPCM_EDGE_EXPECTED_REPEAT_END_MUTE
Definition spu-adpcm-edge.c:17
spu_adpcm_edge_block(sample, 0, 0x00, 0x04, kEdgeAlternating)
#define SPU_ADPCM_EDGE_TEST_PREDICTOR(N)
#define SPU_ADPCM_EDGE_EXPECTED_ENDX_END_MUTE
Definition spu-adpcm-edge.c:20
run_voice1_with_sample(sample, 0x1000)
CESTER_BODY(static const uint8_t kEdgeZero[14]={ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };static const uint8_t kEdgePositive[14]={ 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, };static const uint8_t kEdgeNegative[14]={ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, };static const uint8_t kEdgeAlternating[14]={ 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, };static const uint8_t kEdgeRamp[14]={ 0x10, 0x32, 0x54, 0x76, 0x56, 0x34, 0x12, 0xe0, 0xcd, 0xab, 0x89, 0xa9, 0xcb, 0xed, };static const uint8_t kEdgeMixed[14]={ 0x17, 0xde, 0x9a, 0xbc, 0x45, 0x23, 0x01, 0xfe, 0xdc, 0xba, 0x98, 0x89, 0x67, 0x45, };static void spu_adpcm_edge_block(uint8_t *sample, int block, uint8_t header, uint8_t flags, const uint8_t *payload) { uint8_t *p=sample+block *16;p[0]=header;p[1]=flags;for(int i=0;i< 14;i++) p[2+i]=payload[i];} static uint32_t spu_adpcm_edge_hash_capture(void) { uint32_t h=2166136261u;for(int i=0;i< 512;i++) { h ^=(uint16_t) s_capture[i];h *=16777619u;} return h;} static void spu_adpcm_edge_observe(const char *name) { int16_t min=(int16_t) s_capture[0];int16_t max=(int16_t) s_capture[0];for(int i=1;i< 512;i++) { int16_t v=(int16_t) s_capture[i];if(v< min) min=v;if(v > max) max=v;} ramsyscall_printf("OBS spu_adpcm_edge golden %s.test.pcm hash=0x%08x first=0x%04x mid=0x%04x last=0x%04x min=0x%04x max=0x%04x\n", name, spu_adpcm_edge_hash_capture(), s_capture[0], s_capture[256], s_capture[511],(uint16_t) min,(uint16_t) max);} static void spu_adpcm_edge_expect_u32(const char *name, uint32_t expected, uint32_t got) { if(expected==0xffffffffu) { ramsyscall_printf("OBS spu_adpcm_edge expected %s=0x%08x\n", name, got);} else { cester_assert_uint_eq(expected, got);} } static void spu_adpcm_edge_run_capture_keep_on(const uint8_t *sample64, uint16_t pitch) { spu_reset_quiet();for(int i=0;i< 64;i++) s_upload[i]=sample64[i];for(int i=64;i< 128;i++) s_upload[i]=0xaa;spu_write_sync(SPU_UPLOAD_ADDR, s_upload, 128);SPU_CTRL=0x8000|0x4000;SPU_VOL_MAIN_LEFT=0x3fff;SPU_VOL_MAIN_RIGHT=0x3fff;SPU_KEY_OFF_LOW=0xffff;SPU_KEY_OFF_HIGH=0xffff;spu_busy_wait(800000);spu_wait_status_bit11_flip();spu_voice1_keyon(SPU_UPLOAD_ADDR, pitch);spu_wait_status_bit11_flip();spu_read_sync(0x0800, s_capture, 1024);} static void spu_adpcm_edge_stop(void) { SPU_KEY_OFF_LOW=0xffff;SPU_KEY_OFF_HIGH=0xffff;muteSpu();}) CESTER_TEST(adpcm_edge_shift_00_03
#define SPU_ADPCM_EDGE_EXPECTED_ENVX_END_MUTE
Definition spu-adpcm-edge.c:23
#define SPU_UPLOAD_ADDR
Definition spu-capamp.c:31
muteSpu()
spu_write_sync(0x1000, s_upload, 128)
spu_busy_wait(500000)
spu_reset_quiet()
spu_read_sync(0x1000, s_readback, 0x80)
static uint16_t uint16_t flags
Definition syscalls.h:334
void uint32_t(classId, spec)