1 /* Copyright 2013 Theo Berkau
2
3 This file is part of YabauseUT
4
5 YabauseUT is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9
10 YabauseUT is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with YabauseUT; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19
20 #include <iapetus.h>
21 #include "tests.h"
22 #include "cdb.h"
23 #include "mpeg.h"
24
25 file_struct mpeg_file;
26
27 #define CDWORKBUF ((void *)0x202C0000)
28
mpeg_test()29 void mpeg_test()
30 {
31 int choice;
32
33 menu_item_struct mpeg_menu[] = {
34 { "MPEG Commands", &mpeg_cmd_test, },
35 { "MPEG Play", &mpeg_play_test, },
36 { "\0", NULL }
37 };
38
39 for (;;)
40 {
41 choice = gui_do_menu(mpeg_menu, &test_disp_font, 0, 0, "MPEG Card Tests", MTYPE_CENTER, -1);
42 gui_clear_scr(&test_disp_font);
43 if (choice == -1)
44 break;
45 }
46 }
47
48 //////////////////////////////////////////////////////////////////////////////
49
mpeg_load()50 int mpeg_load()
51 {
52 cd_sh_cond_struct cd_sh_cond;
53 cd_range_struct cd_range;
54 cd_con_struct cd_con;
55 int ret;
56
57 if ((ret = cdfs_init(CDWORKBUF, 4096)) != IAPETUS_ERR_OK)
58 return ret;
59
60 if ((ret = cdfs_open("M2TEST\\MOVIE.MPG", &mpeg_file)) != IAPETUS_ERR_OK)
61 return ret;
62
63 // Setup CD filters
64 cd_range.fad = mpeg_file.lba+150;
65 cd_range.range = mpeg_file.size / 2048;
66
67 cd_sh_cond.channel = 0;
68 cd_sh_cond.file_id = 0;
69 cd_sh_cond.ci_val = 0;
70 cd_sh_cond.ci_mask = 0;
71 cd_sh_cond.sm_val = SM_VIDEO;
72 cd_sh_cond.sm_mask = SM_VIDEO;
73
74 cd_con.connect_flags = CD_CON_TRUE | CD_CON_FALSE;
75 cd_con.true_con = 0;
76 cd_con.false_con = 1;
77
78 if ((ret = cd_set_filter(0, FM_FAD | FM_FN | FM_SM, &cd_sh_cond, &cd_range, &cd_con)) != IAPETUS_ERR_OK)
79 return ret;
80
81 cd_sh_cond.channel = 0;
82 cd_sh_cond.file_id = 0;
83 cd_sh_cond.ci_val = 0;
84 cd_sh_cond.ci_mask = 0;
85 cd_sh_cond.sm_val = SM_AUDIO;
86 cd_sh_cond.sm_mask = SM_AUDIO;
87
88 cd_con.connect_flags = CD_CON_TRUE | CD_CON_FALSE;
89 cd_con.true_con = 1;
90 cd_con.false_con = 0xFF;
91
92 if ((ret = cd_set_filter(1, FM_FAD | FM_FN | FM_SM, &cd_sh_cond, &cd_range, &cd_con)) != IAPETUS_ERR_OK)
93 return ret;
94
95 return IAPETUS_ERR_OK;
96 }
97
98 //////////////////////////////////////////////////////////////////////////////
99
mpeg_get_lsi(u8 cpu,u8 reg,u16 * val)100 int mpeg_get_lsi(u8 cpu, u8 reg, u16 *val)
101 {
102 cd_cmd_struct cd_cmd;
103 cd_cmd_struct cd_cmd_rs;
104 int ret;
105
106 cd_cmd.CR1 = 0xAE00 | cpu;
107 cd_cmd.CR2 = reg;
108 cd_cmd.CR3 = cd_cmd.CR4 = 0x0000;
109
110 if ((ret=cd_exec_command(0, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
111 return ret;
112
113 *val = cd_cmd_rs.CR4;
114 return IAPETUS_ERR_OK;
115 }
116
117 //////////////////////////////////////////////////////////////////////////////
118
lsi_dump()119 void lsi_dump()
120 {
121 int i;
122 int ret;
123 u16 val;
124
125 for (i = 0; i < 0x100; i+=2)
126 {
127 if ((ret = mpeg_get_lsi(0, i, &val)) != IAPETUS_ERR_OK)
128 tests_disp_iapetus_error(ret, __FILE__, __LINE__, "");
129 else
130 tests_log_textf("%08X: %04X\n", 0xA100000+i, val);
131 }
132
133 if ((ret = mpeg_get_lsi(2, i, &val)) != IAPETUS_ERR_OK)
134 tests_disp_iapetus_error(ret, __FILE__, __LINE__, "");
135 else
136 tests_log_textf("%08X: %04X\n", 0xA180000, val);
137 }
138
139 //////////////////////////////////////////////////////////////////////////////
140
mpeg_cmd_test()141 void mpeg_cmd_test()
142 {
143 int ret;
144 screen_settings_struct settings;
145
146 init_cdb_tests();
147
148 if (!is_mpeg_card_present())
149 {
150 tests_log_textf("mpeg card not detected\n");
151 return;
152 }
153
154 if ((ret=mpeg_load()) != IAPETUS_ERR_OK)
155 {
156 tests_disp_iapetus_error(ret, __FILE__, __LINE__, "mpeg load failed");
157 return;
158 }
159
160 // Enable the external audio through SCSP
161 sound_external_audio_enable(7, 7);
162
163 // Setup NBG1 as EXBG
164 settings.is_bitmap = TRUE;
165 settings.bitmap_size = BG_BITMAP512x256;
166 settings.transparent_bit = 0;
167 settings.color = BG_32786COLOR;
168 settings.special_priority = 0;
169 settings.special_color_calc = 0;
170 settings.extra_palette_num = 0;
171 settings.map_offset = 0;
172 if (vdp_exbg_init(&settings) != IAPETUS_ERR_OK)
173 {
174 tests_disp_iapetus_error(ret, __FILE__, __LINE__, "exbg init failed");
175 return;
176 }
177
178 unregister_all_tests();
179
180 register_test(&test_cmd_mpeg_init, "MPEG Init");
181 register_test(&test_cmd_mpeg_get_status, "MPEG Get Status");
182 register_test(&test_cmd_mpeg_get_int, "MPEG Get Interrupt");
183 register_test(&test_cmd_mpeg_set_int_mask, "MPEG Set Interrupt Mask");
184 register_test(&test_cmd_mpeg_set_mode, "MPEG Set Mode");
185 register_test(&test_cmd_mpeg_set_decode_method, "MPEG Set Decoding Method");
186 //register_test(&test_cmd_mpeg_out_decode_sync, "MPEG Out Decoding Sync");
187 //register_test(&test_cmd_mpeg_get_pts, "MPEG Get PTS");
188 register_test(&test_cmd_mpeg_set_stream, "MPEG Set Stream");
189 register_test(&test_cmd_mpeg_get_stream, "MPEG Get Stream");
190 register_test(&test_cmd_mpeg_set_con, "MPEG Set Connection");
191 register_test(&test_cmd_mpeg_get_con, "MPEG Get Connection");
192 //register_test(&test_cmd_mpeg_chg_con, "MPEG Change Connection");
193 //register_test(&test_cmd_mpeg_get_picture_size, "MPEG Get Picture Size");
194 register_test(&test_cmd_mpeg_display, "MPEG Display");
195 register_test(&test_cmd_mpeg_set_window, "MPEG Set Window");
196 register_test(&test_cmd_mpeg_set_border_color, "MPEG Set Border Color");
197 register_test(&test_cmd_mpeg_set_fade, "MPEG Set Fade");
198 register_test(&test_cmd_mpeg_set_video_effects, "MPEG Set Video Effects");
199 register_test(&test_cmd_mpeg_play, "MPEG Play");
200 register_test(&test_cmd_mpeg_get_timecode, "MPEG Get Timecode");
201 //register_test(&test_cmd_mpeg_get_image, "MPEG Get Image");
202 //register_test(&test_cmd_mpeg_set_image, "MPEG Set Image");
203 //register_test(&test_cmd_mpeg_read_image, "MPEG Read Image");
204 //register_test(&test_cmd_mpeg_write_image, "MPEG Write Image");
205 //register_test(&test_cmd_mpeg_read_sector, "MPEG Read Sector");
206 //register_test(&test_cmd_mpeg_write_sector, "MPEG Write Sector");
207 //register_test(&test_cmd_mpeg_get_lsi, "MPEG Get LSI");
208 //register_test(&test_cmd_mpeg_set_lsi, "MPEG Set LSI");
209 do_tests("MPEG Command tests", 0, 0);
210
211 vdp_exbg_deinit();
212 }
213
214 //////////////////////////////////////////////////////////////////////////////
215
test_cmd_mpeg_get_status()216 void test_cmd_mpeg_get_status()
217 {
218 cd_cmd_struct cd_cmd;
219 cd_cmd_struct cd_cmd_rs;
220 int ret;
221
222 cd_cmd.CR1 = 0x9000;
223 cd_cmd.CR2 = cd_cmd.CR3 = cd_cmd.CR4 = 0x0000;
224
225 if ((ret = cd_exec_command(0, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
226 {
227 do_tests_error_noarg(ret);
228 return;
229 }
230
231 // Verify that the data returned is correct
232 if ((cd_cmd_rs.CR1 & 0xFF) != 0x19 ||
233 cd_cmd_rs.CR3 != 0x00C0 ||
234 cd_cmd_rs.CR4 != 0x0001)
235 {
236 do_cdb_tests_unexp_cr_data_error();
237 return;
238 }
239
240 stage_status = STAGESTAT_DONE;
241 }
242
243 //////////////////////////////////////////////////////////////////////////////
244
test_cmd_mpeg_get_int()245 void test_cmd_mpeg_get_int()
246 {
247 cd_cmd_struct cd_cmd;
248 cd_cmd_struct cd_cmd_rs;
249 int ret;
250
251 cd_cmd.CR1 = 0x9100;
252 cd_cmd.CR2 = cd_cmd.CR3 = cd_cmd.CR4 = 0x0000;
253
254 if ((ret = cd_exec_command(0, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
255 {
256 do_tests_error_noarg(ret);
257 return;
258 }
259
260 // Verify that the data returned is correct
261 if ((cd_cmd_rs.CR1 & 0xFF) != 0x00 ||
262 cd_cmd_rs.CR2 != 0x0000 ||
263 cd_cmd_rs.CR3 != 0x0000 ||
264 cd_cmd_rs.CR4 != 0x0000)
265 {
266 do_cdb_tests_unexp_cr_data_error();
267 return;
268 }
269
270 stage_status = STAGESTAT_DONE;
271 }
272
273 //////////////////////////////////////////////////////////////////////////////
274
test_cmd_mpeg_set_int_mask()275 void test_cmd_mpeg_set_int_mask()
276 {
277 cd_cmd_struct cd_cmd;
278 cd_cmd_struct cd_cmd_rs;
279 int ret;
280
281 cd_cmd.CR1 = 0x92FF;
282 cd_cmd.CR2 = 0xFFFF;
283 cd_cmd.CR3 = cd_cmd.CR4 = 0x0000;
284
285 if ((ret = cd_exec_command(0, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
286 {
287 do_tests_error_noarg(ret);
288 return;
289 }
290
291 stage_status = STAGESTAT_DONE;
292 }
293
294 //////////////////////////////////////////////////////////////////////////////
295
test_cmd_mpeg_set_mode()296 void test_cmd_mpeg_set_mode()
297 {
298 cd_cmd_struct cd_cmd;
299 cd_cmd_struct cd_cmd_rs;
300 int ret;
301
302 cd_cmd.CR1 = 0x94FF;
303 cd_cmd.CR2 = 0x0000;
304 cd_cmd.CR3 = 0x0100;
305 cd_cmd.CR4 = 0x0000;
306
307 if ((ret = cd_exec_command(0, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
308 {
309 do_tests_error_noarg(ret);
310 return;
311 }
312
313 stage_status = STAGESTAT_DONE;
314 }
315
316 //////////////////////////////////////////////////////////////////////////////
317
test_cmd_mpeg_play()318 void test_cmd_mpeg_play()
319 {
320 cd_cmd_struct cd_cmd;
321 cd_cmd_struct cd_cmd_rs;
322 int ret;
323
324 // Start CD transfer
325 if ((ret = cd_play_fad(0, mpeg_file.lba+150, mpeg_file.size / 2048)) != IAPETUS_ERR_OK)
326 {
327 do_tests_error_noarg(ret);
328 return;
329 }
330
331 // Clear hirq flags
332 CDB_REG_HIRQ = ~(HIRQ_MPED);
333
334 // Start MPEG decoding
335 cd_cmd.CR1 = 0x9500 | MPPM_SYNC;
336 cd_cmd.CR2 = (MPTM_NO_CHANGE << 8) | MPTM_AUTO;
337 cd_cmd.CR3 = 0x0000;
338 cd_cmd.CR4 = MPCS_NO_CHANGE & 0xFF;
339
340 if ((ret = cd_exec_command(0, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
341 {
342 do_tests_error_noarg(ret);
343 return;
344 }
345
346 stage_status = STAGESTAT_DONE;
347 }
348
349 //////////////////////////////////////////////////////////////////////////////
350
test_cmd_mpeg_set_decode_method()351 void test_cmd_mpeg_set_decode_method()
352 {
353 cd_cmd_struct cd_cmd;
354 cd_cmd_struct cd_cmd_rs;
355 int ret;
356
357 cd_cmd.CR1 = 0x9604; // Unmute both channels
358 cd_cmd.CR2 = 0x0001; // no pause
359 cd_cmd.CR3 = 0x0000;
360 cd_cmd.CR4 = 0x0001; // no freeze
361
362 if ((ret = cd_exec_command(0, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
363 {
364 do_tests_error_noarg(ret);
365 return;
366 }
367
368 stage_status = STAGESTAT_DONE;
369 }
370
371 //////////////////////////////////////////////////////////////////////////////
372
test_cmd_mpeg_out_decode_sync()373 void test_cmd_mpeg_out_decode_sync()
374 {
375 stage_status = STAGESTAT_DONE;
376 }
377
378 //////////////////////////////////////////////////////////////////////////////
379
test_cmd_mpeg_get_timecode()380 void test_cmd_mpeg_get_timecode()
381 {
382 cd_cmd_struct cd_cmd;
383 cd_cmd_struct cd_cmd_rs;
384 int ret;
385 int old_transparent;
386
387 cd_cmd.CR1 = 0x9800;
388 cd_cmd.CR2 = cd_cmd.CR3 = cd_cmd.CR4 = 0x0000;
389
390 while (!(CDB_REG_HIRQ & HIRQ_MPED))
391 {
392 mpeg_status_struct mpeg_status;
393 if ((ret = mpeg_get_status(&mpeg_status)) != IAPETUS_ERR_OK )
394 {
395 do_tests_error_noarg(ret);
396 return;
397 }
398
399 if (mpeg_status.play_status == 0x19)
400 break;
401
402 if ((ret = cd_exec_command(0, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
403 {
404 do_tests_error_noarg(ret);
405 return;
406 }
407
408 old_transparent = test_disp_font.transparent;
409 test_disp_font.transparent = 0;
410 vdp_printf(&test_disp_font, 0 * 8, 27 * 8, 0xF, "%02d:%02d:%02d:%02d", cd_cmd_rs.CR3 >> 8, cd_cmd_rs.CR3 & 0xFF, cd_cmd_rs.CR4 >> 8, cd_cmd_rs.CR4 & 0xFF);
411 test_disp_font.transparent = old_transparent;
412 vdp_vsync();
413 }
414
415 if (cd_cmd_rs.CR3 != 0 ||
416 cd_cmd_rs.CR4 != 0x0E03)
417 {
418 do_cdb_tests_unexp_cr_data_error();
419 return;
420 }
421
422 stage_status = STAGESTAT_DONE;
423 }
424
425 //////////////////////////////////////////////////////////////////////////////
426
test_cmd_mpeg_get_pts()427 void test_cmd_mpeg_get_pts()
428 {
429 stage_status = STAGESTAT_DONE;
430 }
431
432 //////////////////////////////////////////////////////////////////////////////
433
test_cmd_mpeg_set_con()434 void test_cmd_mpeg_set_con()
435 {
436 cd_cmd_struct cd_cmd;
437 cd_cmd_struct cd_cmd_rs;
438 int ret;
439
440 cd_cmd.CR1 = 0x9A00 | (SCCM_SECTOR_DEL | SCCM_SYSTEM_END);
441 cd_cmd.CR2 = (SCLS_SYSTEM << 8) | 1;
442 cd_cmd.CR3 = (STM_SEL_CURRENT << 8) | (SCCM_CLEAR_VBV_WBC | SCCM_SECTOR_DEL | SCCM_SYSTEM_END);
443 cd_cmd.CR4 = ((SCLS_SYSTEM | SCLS_AVSEARCH) << 8) | 0;
444
445 if ((ret = cd_exec_command(0, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
446 {
447 do_tests_error_noarg(ret);
448 return;
449 }
450
451 stage_status = STAGESTAT_DONE;
452 }
453
454 //////////////////////////////////////////////////////////////////////////////
455
test_cmd_mpeg_get_con()456 void test_cmd_mpeg_get_con()
457 {
458 cd_cmd_struct cd_cmd;
459 cd_cmd_struct cd_cmd_rs;
460 int ret;
461
462 cd_cmd.CR1 = 0x9B00;
463 cd_cmd.CR3 = 0x0000;
464 cd_cmd.CR2 = cd_cmd.CR4 = 0x0000;
465
466 if ((ret = cd_exec_command(0, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
467 {
468 do_tests_error_noarg(ret);
469 return;
470 }
471
472 // Verify that the data returned is correct
473 if ((cd_cmd_rs.CR1 & 0xFF) != (SCCM_SECTOR_DEL | SCCM_SYSTEM_END) ||
474 cd_cmd_rs.CR2 != ((SCLS_SYSTEM << 8) | 1) ||
475 cd_cmd_rs.CR3 != (SCCM_CLEAR_VBV_WBC | SCCM_SECTOR_DEL | SCCM_SYSTEM_END) ||
476 cd_cmd_rs.CR4 != (((SCLS_SYSTEM | SCLS_AVSEARCH) << 8) | 0))
477 {
478 do_cdb_tests_unexp_cr_data_error();
479 return;
480 }
481
482 stage_status = STAGESTAT_DONE;
483 }
484
485 //////////////////////////////////////////////////////////////////////////////
486
test_cmd_mpeg_chg_con()487 void test_cmd_mpeg_chg_con()
488 {
489 stage_status = STAGESTAT_DONE;
490 }
491
492 //////////////////////////////////////////////////////////////////////////////
493
test_cmd_mpeg_set_stream()494 void test_cmd_mpeg_set_stream()
495 {
496 cd_cmd_struct cd_cmd;
497 cd_cmd_struct cd_cmd_rs;
498 int ret;
499
500 cd_cmd.CR1 = 0x9D00;
501 cd_cmd.CR2 = 0x0000;
502 cd_cmd.CR3 = 0x0000;
503 cd_cmd.CR4 = 0x0000;
504
505 if ((ret = cd_exec_command(0, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
506 {
507 do_tests_error_noarg(ret);
508 return;
509 }
510
511 stage_status = STAGESTAT_DONE;
512 }
513
514 //////////////////////////////////////////////////////////////////////////////
515
test_cmd_mpeg_get_stream()516 void test_cmd_mpeg_get_stream()
517 {
518 cd_cmd_struct cd_cmd;
519 cd_cmd_struct cd_cmd_rs;
520 int ret;
521
522 cd_cmd.CR1 = 0x9E00;
523 cd_cmd.CR2 = 0x0000;
524 cd_cmd.CR3 = 0x0000;
525 cd_cmd.CR4 = 0x0000;
526
527 if ((ret = cd_exec_command(0, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
528 {
529 do_tests_error_noarg(ret);
530 return;
531 }
532
533 stage_status = STAGESTAT_DONE;
534 }
535
536 //////////////////////////////////////////////////////////////////////////////
537
test_cmd_mpeg_get_picture_size()538 void test_cmd_mpeg_get_picture_size()
539 {
540 stage_status = STAGESTAT_DONE;
541 }
542
543 //////////////////////////////////////////////////////////////////////////////
544
test_cmd_mpeg_display()545 void test_cmd_mpeg_display()
546 {
547 cd_cmd_struct cd_cmd;
548 cd_cmd_struct cd_cmd_rs;
549 int ret;
550
551 cd_cmd.CR1 = 0xA000;
552 cd_cmd.CR2 = 0x0100; // Enable, frame buffer number
553 cd_cmd.CR3 = cd_cmd.CR4 = 0x0000;
554
555 if ((ret = cd_exec_command(0, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
556 {
557 do_tests_error_noarg(ret);
558 return;
559 }
560
561 stage_status = STAGESTAT_DONE;
562 }
563
564 //////////////////////////////////////////////////////////////////////////////
565
test_cmd_mpeg_set_window()566 void test_cmd_mpeg_set_window()
567 {
568 cd_cmd_struct cd_cmd[5] = {
569 { 0xA100, 1, 22, 0 }, // Frame Buffer Window position
570 { 0xA101, 1, 15, 1 }, // Frame Buffer Window zoom rate
571 { 0xA102, 1, 0, 8 }, // Display Window position
572 { 0xA103, 1, 320, 224 }, // Display Window size
573 //{ 0xA104, 1, 0, 0 }, // Display Window offset
574 };
575 cd_cmd_struct cd_cmd_rs;
576 int i, ret;
577
578 for (i = 0; i < 5; i++)
579 {
580 if ((ret = cd_exec_command(0, &cd_cmd[i], &cd_cmd_rs)) != IAPETUS_ERR_OK)
581 {
582 do_tests_error_noarg(ret);
583 return;
584 }
585 }
586
587 stage_status = STAGESTAT_DONE;
588 }
589
590 //////////////////////////////////////////////////////////////////////////////
591
test_cmd_mpeg_set_border_color()592 void test_cmd_mpeg_set_border_color()
593 {
594 cd_cmd_struct cd_cmd;
595 cd_cmd_struct cd_cmd_rs;
596 int ret;
597
598 cd_cmd.CR1 = 0xA200;
599 cd_cmd.CR2 = 0x0000; // Black
600 cd_cmd.CR3 = cd_cmd.CR4 = 0x0000;
601
602 if ((ret = cd_exec_command(0, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
603 {
604 do_tests_error_noarg(ret);
605 return;
606 }
607
608 stage_status = STAGESTAT_DONE;
609 }
610
611 //////////////////////////////////////////////////////////////////////////////
612
test_cmd_mpeg_set_fade()613 void test_cmd_mpeg_set_fade()
614 {
615 cd_cmd_struct cd_cmd;
616 cd_cmd_struct cd_cmd_rs;
617 int ret;
618
619 cd_cmd.CR1 = 0xA300;
620 cd_cmd.CR2 = 0x0000; // Y/C Gain
621 cd_cmd.CR3 = cd_cmd.CR4 = 0x0000;
622
623 if ((ret = cd_exec_command(0, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
624 {
625 do_tests_error_noarg(ret);
626 return;
627 }
628
629 stage_status = STAGESTAT_DONE;
630 }
631
632 //////////////////////////////////////////////////////////////////////////////
633
test_cmd_mpeg_set_video_effects()634 void test_cmd_mpeg_set_video_effects()
635 {
636 cd_cmd_struct cd_cmd;
637 cd_cmd_struct cd_cmd_rs;
638 int ret;
639
640 cd_cmd.CR1 = 0xA400;
641 cd_cmd.CR2 = 0x0F00; // Interpolation, Lumi-Key
642 cd_cmd.CR3 = 0x0000; // Mosaic w/h
643 cd_cmd.CR4 = 0x0000; // Blur w/h
644
645 if ((ret = cd_exec_command(0, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
646 {
647 do_tests_error_noarg(ret);
648 return;
649 }
650
651 stage_status = STAGESTAT_DONE;
652 }
653
654 //////////////////////////////////////////////////////////////////////////////
655
test_cmd_mpeg_get_image()656 void test_cmd_mpeg_get_image()
657 {
658 stage_status = STAGESTAT_DONE;
659 }
660
661 //////////////////////////////////////////////////////////////////////////////
662
test_cmd_mpeg_set_image()663 void test_cmd_mpeg_set_image()
664 {
665 stage_status = STAGESTAT_DONE;
666 }
667
668 //////////////////////////////////////////////////////////////////////////////
669
test_cmd_mpeg_read_image()670 void test_cmd_mpeg_read_image()
671 {
672 stage_status = STAGESTAT_DONE;
673 }
674
675 //////////////////////////////////////////////////////////////////////////////
676
test_cmd_mpeg_write_image()677 void test_cmd_mpeg_write_image()
678 {
679 stage_status = STAGESTAT_DONE;
680 }
681
682 //////////////////////////////////////////////////////////////////////////////
683
test_cmd_mpeg_read_sector()684 void test_cmd_mpeg_read_sector()
685 {
686 stage_status = STAGESTAT_DONE;
687 }
688
689 //////////////////////////////////////////////////////////////////////////////
690
test_cmd_mpeg_write_sector()691 void test_cmd_mpeg_write_sector()
692 {
693 stage_status = STAGESTAT_DONE;
694 }
695
696 //////////////////////////////////////////////////////////////////////////////
697
test_cmd_mpeg_get_lsi()698 void test_cmd_mpeg_get_lsi()
699 {
700 stage_status = STAGESTAT_DONE;
701 }
702
703 //////////////////////////////////////////////////////////////////////////////
704
test_cmd_mpeg_set_lsi()705 void test_cmd_mpeg_set_lsi()
706 {
707 stage_status = STAGESTAT_DONE;
708 }
709
710 //////////////////////////////////////////////////////////////////////////////
711
test_cmd_mpeg_init()712 void test_cmd_mpeg_init()
713 {
714 cd_cmd_struct cd_cmd;
715 cd_cmd_struct cd_cmd_rs;
716 int ret;
717
718 // Software timer off
719 cd_cmd.CR1 = 0x9300;
720 cd_cmd.CR2 = cd_cmd.CR3 = cd_cmd.CR4 = 0x0000;
721
722 if ((ret = cd_exec_command(HIRQ_MPED | HIRQ_MPCM, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
723 {
724 do_tests_error_noarg(ret);
725 return;
726 }
727
728 if (!cd_wait_hirq(HIRQ_MPED))
729 {
730 do_cdb_tests_unexp_cr_data_error();
731 return;
732 }
733
734 tests_log_textf("%04X %04X %04X %04X %04X\n", CDB_REG_HIRQ, cd_cmd_rs.CR1, cd_cmd_rs.CR2, cd_cmd_rs.CR3, cd_cmd_rs.CR4);
735
736 // Verify that the data returned is correct
737 if (cd_cmd_rs.CR1 != (STATUS_PAUSE << 8) ||
738 cd_cmd_rs.CR2 != 0 ||
739 cd_cmd_rs.CR3 != 0x0 ||
740 cd_cmd_rs.CR4 != 0x0)
741 {
742 do_cdb_tests_unexp_cr_data_error();
743 return;
744 }
745
746 // Software timer on
747 cd_cmd.CR2 = 0x0001;
748
749 if ((ret = cd_exec_command(HIRQ_MPED | HIRQ_MPCM, &cd_cmd, &cd_cmd_rs)) != IAPETUS_ERR_OK)
750 {
751 do_tests_error_noarg(ret);
752 return;
753 }
754
755 if (!cd_wait_hirq(HIRQ_MPED | HIRQ_MPCM))
756 {
757 do_cdb_tests_unexp_cr_data_error();
758 return;
759 }
760
761 lsi_dump();
762
763 if (!cd_wait_hirq(HIRQ_MPCM))
764 {
765 do_cdb_tests_unexp_cr_data_error();
766 return;
767 }
768
769 stage_status = STAGESTAT_DONE;
770 }
771
772 //////////////////////////////////////////////////////////////////////////////
773
mpeg_play_test()774 void mpeg_play_test()
775 {
776 init_cdb_tests();
777
778 unregister_all_tests();
779
780 register_test(&test_mpegplay_init, "MPEG Init");
781 register_test(&test_mpegplay_play, "MPEG Play");
782 register_test(&test_mpegplay_pause, "MPEG Pause");
783 register_test(&test_mpegplay_unpause, "MPEG Unpause");
784 register_test(&test_mpegplay_stop, "MPEG Stop");
785 do_tests("MPEG Play tests", 0, 0);
786
787 vdp_exbg_deinit();
788 }
789
790 //////////////////////////////////////////////////////////////////////////////
791
test_mpegplay_init()792 void test_mpegplay_init()
793 {
794 int ret;
795
796 if ((ret = mpeg_init()) != IAPETUS_ERR_OK)
797 {
798 do_tests_error_noarg(ret);
799 }
800 else
801 stage_status = STAGESTAT_DONE;
802 }
803
804 //////////////////////////////////////////////////////////////////////////////
805
test_mpeg_status(test_mpeg_status_struct * settings)806 BOOL test_mpeg_status(test_mpeg_status_struct *settings)
807 {
808 u32 freq;
809 mpeg_status_struct mpeg_status;
810 u16 old_v_counter;
811 int ret;
812
813 timer_setup(TIMER_HBLANK, &freq);
814 timer_delay(freq, settings->delay);
815
816 if ((ret = mpeg_get_status(&mpeg_status)) != IAPETUS_ERR_OK)
817 {
818 do_tests_error_noarg(ret);
819 return FALSE;
820 }
821
822 if (mpeg_status.play_status != (MS_PS_VIDEO_PLAYING | MS_PS_AUDIO_PLAYING) &&
823 mpeg_status.mpeg_audio_status != (MS_AS_DECODE_OP | MS_AS_LEFT_OUTPUT | MS_AS_RIGHT_OUTPUT) &&
824 (mpeg_status.mpeg_video_status & 0xF) != (MS_VS_DECODE_OP | MS_VS_DISPLAYING))
825 {
826 do_tests_unexp_data_error("%X %X %X", mpeg_status.play_status, mpeg_status.mpeg_audio_status, mpeg_status.mpeg_video_status);
827 return FALSE;
828 }
829
830 // Verify that the v_counter is incrementing
831 old_v_counter = mpeg_status.v_counter;
832 vdp_vsync();
833
834 if ((ret = mpeg_get_status(&mpeg_status)) != IAPETUS_ERR_OK)
835 {
836 do_tests_error_noarg(ret);
837 return FALSE;
838 }
839
840 if (old_v_counter+1 != mpeg_status.v_counter)
841 {
842 do_tests_unexp_data_error("%X %X", old_v_counter+1, mpeg_status.v_counter);
843 return FALSE;
844 }
845
846 return TRUE;
847 }
848
test_mpegplay_play()849 void test_mpegplay_play()
850 {
851 int ret;
852 test_mpeg_status_struct tms_settings;
853
854 if ((ret = cdfs_init(CDWORKBUF, 4096)) != IAPETUS_ERR_OK)
855 {
856 do_tests_error_noarg(ret);
857 return;
858 }
859
860 if ((ret = cdfs_open("M2TEST\\MOVIE.MPG", &mpeg_file)) != IAPETUS_ERR_OK)
861 {
862 do_tests_error_noarg(ret);
863 return;
864 }
865
866 if ((ret = mpeg_play(&mpeg_file)) != IAPETUS_ERR_OK)
867 {
868 do_tests_error_noarg(ret);
869 return;
870 }
871
872 tms_settings.delay = 2000;
873 tms_settings.play_status = (MS_PS_VIDEO_PLAYING | MS_PS_AUDIO_PLAYING);
874 tms_settings.play_status = 0xFF;
875 tms_settings.mpeg_audio_status = (MS_AS_DECODE_OP | MS_AS_LEFT_OUTPUT | MS_AS_RIGHT_OUTPUT);
876 tms_settings.mpeg_audio_status = 0xFF;
877 tms_settings.mpeg_video_status = (MS_VS_DECODE_OP | MS_VS_DISPLAYING);
878 tms_settings.mpeg_video_status = 0x000F;
879 tms_settings.v_counter_inc = TRUE;
880
881 if (!test_mpeg_status(&tms_settings))
882 {
883 mpeg_stop(&mpeg_file);
884 return;
885 }
886
887 stage_status = STAGESTAT_DONE;
888 }
889
890 //////////////////////////////////////////////////////////////////////////////
891
test_mpegplay_pause()892 void test_mpegplay_pause()
893 {
894 int ret;
895 test_mpeg_status_struct tms_settings;
896
897 if ((ret = mpeg_pause(&mpeg_file)) != IAPETUS_ERR_OK)
898 {
899 do_tests_error_noarg(ret);
900 return;
901 }
902
903 tms_settings.delay = 2000;
904 tms_settings.play_status = (MS_PS_VIDEO_PLAYING | MS_PS_AUDIO_PLAYING);
905 tms_settings.play_status = 0xFF;
906 tms_settings.mpeg_audio_status = (MS_AS_DECODE_OP | MS_AS_LEFT_OUTPUT | MS_AS_RIGHT_OUTPUT);
907 tms_settings.mpeg_audio_status = 0xFF;
908 tms_settings.mpeg_video_status = (MS_VS_DECODE_OP | MS_VS_DISPLAYING | MS_VS_PAUSED);
909 tms_settings.mpeg_video_status = 0x000F;
910 tms_settings.v_counter_inc = TRUE;
911
912 if (!test_mpeg_status(&tms_settings))
913 {
914 mpeg_stop(&mpeg_file);
915 return;
916 }
917
918 stage_status = STAGESTAT_DONE;
919 }
920
921 //////////////////////////////////////////////////////////////////////////////
922
test_mpegplay_unpause()923 void test_mpegplay_unpause()
924 {
925 int ret;
926 test_mpeg_status_struct tms_settings;
927
928 if ((ret = mpeg_unpause(&mpeg_file)) != IAPETUS_ERR_OK)
929 {
930 do_tests_error_noarg(ret);
931 return;
932 }
933
934 tms_settings.delay = 2000;
935 tms_settings.play_status = (MS_PS_VIDEO_PLAYING | MS_PS_AUDIO_PLAYING);
936 tms_settings.play_status = 0xFF;
937 tms_settings.mpeg_audio_status = (MS_AS_DECODE_OP | MS_AS_LEFT_OUTPUT | MS_AS_RIGHT_OUTPUT);
938 tms_settings.mpeg_audio_status = 0xFF;
939 tms_settings.mpeg_video_status = (MS_VS_DECODE_OP | MS_VS_DISPLAYING);
940 tms_settings.mpeg_video_status = 0x000F;
941 tms_settings.v_counter_inc = TRUE;
942
943 if (!test_mpeg_status(&tms_settings))
944 {
945 mpeg_stop(&mpeg_file);
946 return;
947 }
948
949 stage_status = STAGESTAT_DONE;
950 }
951
952 //////////////////////////////////////////////////////////////////////////////
953
test_mpegplay_stop()954 void test_mpegplay_stop()
955 {
956 int ret;
957 test_mpeg_status_struct tms_settings;
958
959 if ((ret = mpeg_stop(&mpeg_file)) != IAPETUS_ERR_OK)
960 {
961 do_tests_error_noarg(ret);
962 return;
963 }
964
965 tms_settings.delay = 2000;
966 tms_settings.play_status = (MS_PS_VIDEO_RECEIVING | MS_PS_AUDIO_RECEIVING);
967 tms_settings.play_status = 0xFF;
968 tms_settings.mpeg_audio_status = (MS_AS_DECODE_OP | MS_AS_BUFFER_EMPTY | MS_AS_LEFT_OUTPUT | MS_AS_RIGHT_OUTPUT);
969 tms_settings.mpeg_audio_status = 0xFF;
970 tms_settings.mpeg_video_status = (MS_VS_DECODE_OP | MS_VS_DISPLAYING | MS_VS_PAUSED);
971 tms_settings.mpeg_video_status = 0x000F;
972
973 if (!test_mpeg_status(&tms_settings))
974 {
975 mpeg_stop(&mpeg_file);
976 return;
977 }
978
979 stage_status = STAGESTAT_DONE;
980 }
981
982 //////////////////////////////////////////////////////////////////////////////
983