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